feat(editor): Show a notice before deleting annotated executions (#10934)

This commit is contained in:
Eugene 2024-09-24 16:48:58 +02:00 committed by GitHub
parent 46beda05f6
commit dcc1c72fc4
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 62 additions and 3 deletions

View file

@ -2,7 +2,11 @@
import { watch, computed, ref, onMounted } from 'vue'; import { watch, computed, ref, onMounted } from 'vue';
import ExecutionsFilter from '@/components/executions/ExecutionsFilter.vue'; import ExecutionsFilter from '@/components/executions/ExecutionsFilter.vue';
import GlobalExecutionsListItem from '@/components/executions/global/GlobalExecutionsListItem.vue'; import GlobalExecutionsListItem from '@/components/executions/global/GlobalExecutionsListItem.vue';
import { MODAL_CONFIRM } from '@/constants'; import {
EnterpriseEditionFeature,
EXECUTION_ANNOTATION_EXPERIMENT,
MODAL_CONFIRM,
} from '@/constants';
import { useToast } from '@/composables/useToast'; import { useToast } from '@/composables/useToast';
import { useMessage } from '@/composables/useMessage'; import { useMessage } from '@/composables/useMessage';
import { useI18n } from '@/composables/useI18n'; import { useI18n } from '@/composables/useI18n';
@ -13,6 +17,8 @@ import { useWorkflowsStore } from '@/stores/workflows.store';
import { useExecutionsStore } from '@/stores/executions.store'; import { useExecutionsStore } from '@/stores/executions.store';
import type { PermissionsRecord } from '@/permissions'; import type { PermissionsRecord } from '@/permissions';
import { getResourcePermissions } from '@/permissions'; import { getResourcePermissions } from '@/permissions';
import { usePostHog } from '@/stores/posthog.store';
import { useSettingsStore } from '@/stores/settings.store';
const props = withDefaults( const props = withDefaults(
defineProps<{ defineProps<{
@ -36,6 +42,8 @@ const i18n = useI18n();
const telemetry = useTelemetry(); const telemetry = useTelemetry();
const workflowsStore = useWorkflowsStore(); const workflowsStore = useWorkflowsStore();
const executionsStore = useExecutionsStore(); const executionsStore = useExecutionsStore();
const posthogStore = usePostHog();
const settingsStore = useSettingsStore();
const isMounted = ref(false); const isMounted = ref(false);
const allVisibleSelected = ref(false); const allVisibleSelected = ref(false);
@ -63,6 +71,12 @@ const workflows = computed<IWorkflowDb[]>(() => {
]; ];
}); });
const isAnnotationEnabled = computed(
() =>
settingsStore.isEnterpriseFeatureEnabled[EnterpriseEditionFeature.AdvancedExecutionFilters] &&
posthogStore.isFeatureEnabled(EXECUTION_ANNOTATION_EXPERIMENT),
);
watch( watch(
() => props.executions, () => props.executions,
() => { () => {
@ -109,10 +123,18 @@ function toggleSelectExecution(execution: ExecutionSummary) {
} }
async function handleDeleteSelected() { async function handleDeleteSelected() {
const deleteExecutions = await message.confirm( // Prepend the message with a note about annotations if the feature is enabled
const confirmationText = [
isAnnotationEnabled.value && i18n.baseText('executionsList.confirmMessage.annotationsNote'),
i18n.baseText('executionsList.confirmMessage.message', { i18n.baseText('executionsList.confirmMessage.message', {
interpolate: { count: selectedCount.value.toString() }, interpolate: { count: selectedCount.value.toString() },
}), }),
]
.filter(Boolean)
.join(' ');
const deleteExecutions = await message.confirm(
confirmationText,
i18n.baseText('executionsList.confirmMessage.headline'), i18n.baseText('executionsList.confirmMessage.headline'),
{ {
type: 'warning', type: 'warning',
@ -258,6 +280,26 @@ async function stopExecution(execution: ExecutionSummary) {
} }
async function deleteExecution(execution: ExecutionSummary) { async function deleteExecution(execution: ExecutionSummary) {
const hasAnnotation =
!!execution.annotation && (execution.annotation.vote || execution.annotation.tags.length > 0);
// Show a confirmation dialog if the execution has an annotation
if (hasAnnotation) {
const deleteConfirmed = await message.confirm(
i18n.baseText('executionsList.confirmMessage.annotatedExecutionMessage'),
i18n.baseText('executionDetails.confirmMessage.headline'),
{
type: 'warning',
confirmButtonText: i18n.baseText('executionDetails.confirmMessage.confirmButtonText'),
cancelButtonText: '',
},
);
if (deleteConfirmed !== MODAL_CONFIRM) {
return;
}
}
try { try {
await executionsStore.deleteExecutions({ ids: [execution.id] }); await executionsStore.deleteExecutions({ ids: [execution.id] });

View file

@ -72,9 +72,23 @@ const isAnnotationEnabled = computed(
posthogStore.isFeatureEnabled(EXECUTION_ANNOTATION_EXPERIMENT), posthogStore.isFeatureEnabled(EXECUTION_ANNOTATION_EXPERIMENT),
); );
const hasAnnotation = computed(
() =>
!!props.execution?.annotation &&
(props.execution?.annotation.vote || props.execution?.annotation.tags.length > 0),
);
async function onDeleteExecution(): Promise<void> { async function onDeleteExecution(): Promise<void> {
const deleteConfirmed = await message.confirm( // Prepend the message with a note about annotations if they exist
const confirmationText = [
hasAnnotation.value && locale.baseText('executionDetails.confirmMessage.annotationsNote'),
locale.baseText('executionDetails.confirmMessage.message'), locale.baseText('executionDetails.confirmMessage.message'),
]
.filter(Boolean)
.join(' ');
const deleteConfirmed = await message.confirm(
confirmationText,
locale.baseText('executionDetails.confirmMessage.headline'), locale.baseText('executionDetails.confirmMessage.headline'),
{ {
type: 'warning', type: 'warning',

View file

@ -649,6 +649,7 @@
"executionDetails.confirmMessage.confirmButtonText": "Yes, delete", "executionDetails.confirmMessage.confirmButtonText": "Yes, delete",
"executionDetails.confirmMessage.headline": "Delete Execution?", "executionDetails.confirmMessage.headline": "Delete Execution?",
"executionDetails.confirmMessage.message": "Are you sure that you want to delete the current execution?", "executionDetails.confirmMessage.message": "Are you sure that you want to delete the current execution?",
"executionDetails.confirmMessage.annotationsNote": "By deleting this you will also remove the associated annotation data.",
"executionDetails.deleteExecution": "Delete this execution", "executionDetails.deleteExecution": "Delete this execution",
"executionDetails.executionFailed": "Execution failed", "executionDetails.executionFailed": "Execution failed",
"executionDetails.executionFailed.recoveredNodeTitle": "Cant show data", "executionDetails.executionFailed.recoveredNodeTitle": "Cant show data",
@ -689,6 +690,8 @@
"executionsList.confirmMessage.confirmButtonText": "Yes, delete", "executionsList.confirmMessage.confirmButtonText": "Yes, delete",
"executionsList.confirmMessage.headline": "Delete Executions?", "executionsList.confirmMessage.headline": "Delete Executions?",
"executionsList.confirmMessage.message": "Are you sure that you want to delete the {count} selected execution(s)?", "executionsList.confirmMessage.message": "Are you sure that you want to delete the {count} selected execution(s)?",
"executionsList.confirmMessage.annotationsNote": "By deleting these executions you will also remove the associated annotation data.",
"executionsList.confirmMessage.annotatedExecutionMessage": "By deleting this you will also remove the associated annotation data. Are you sure that you want to delete the selected execution?",
"executionsList.clearSelection": "Clear selection", "executionsList.clearSelection": "Clear selection",
"executionsList.error": "Error", "executionsList.error": "Error",
"executionsList.filters": "Filters", "executionsList.filters": "Filters",