From 990d8000fde2975f955d854b0e569f13e69c3f55 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Thu, 4 Sep 2025 10:01:53 -0700 Subject: [PATCH] improvements --- models/project/workflows.go | 2 +- .../components/projects/ProjectWorkflow.vue | 97 +++++++++++++------ 2 files changed, 69 insertions(+), 30 deletions(-) diff --git a/models/project/workflows.go b/models/project/workflows.go index f7d717286f..35d923afdf 100644 --- a/models/project/workflows.go +++ b/models/project/workflows.go @@ -221,7 +221,7 @@ func CreateWorkflow(ctx context.Context, wf *Workflow) error { } func UpdateWorkflow(ctx context.Context, wf *Workflow) error { - _, err := db.GetEngine(ctx).ID(wf.ID).Update(wf) + _, err := db.GetEngine(ctx).ID(wf.ID).Cols("workflow_filters", "workflow_actions").Update(wf) return err } diff --git a/web_src/js/components/projects/ProjectWorkflow.vue b/web_src/js/components/projects/ProjectWorkflow.vue index ef67897590..f76b67a9d2 100644 --- a/web_src/js/components/projects/ProjectWorkflow.vue +++ b/web_src/js/components/projects/ProjectWorkflow.vue @@ -12,11 +12,37 @@ const props = defineProps({ const store = createWorkflowStore(props); -const editMode = ref(false); -const previousSelection = ref(null); // Store previous selection for cancel functionality +// Track edit state directly on workflow objects +const previousSelection = ref(null); + +// Helper to check if current workflow is in edit mode +const isInEditMode = computed(() => { + if (!store.selectedWorkflow) return false; + + // Unconfigured workflows (id === 0) are always in edit mode + if (store.selectedWorkflow.id === 0) { + return true; + } + + // Configured workflows use the _isEditing flag + return store.selectedWorkflow._isEditing || false; +}); + +// Helper to set edit mode for current workflow +const setEditMode = (enabled) => { + if (store.selectedWorkflow) { + if (enabled) { + store.selectedWorkflow._isEditing = true; + } else { + delete store.selectedWorkflow._isEditing; + } + } +}; + + // Store previous selection for cancel functionality const toggleEditMode = () => { - if (editMode.value) { + if (isInEditMode.value) { // Canceling edit mode if (previousSelection.value) { // If there was a previous selection, return to it @@ -38,15 +64,15 @@ const toggleEditMode = () => { } previousSelection.value = null; } + setEditMode(false); } else { // Entering edit mode - store current selection previousSelection.value = { selectedItem: store.selectedItem, selectedWorkflow: store.selectedWorkflow ? {...store.selectedWorkflow} : null }; + setEditMode(true); } - - editMode.value = !editMode.value; }; const toggleWorkflowStatus = async () => { @@ -101,7 +127,7 @@ const deleteWorkflow = async () => { // Clear previous selection and exit edit mode previousSelection.value = null; - editMode.value = false; + setEditMode(false); }; const selectWorkflowEvent = async (event) => { @@ -141,7 +167,7 @@ const saveWorkflow = async () => { // Clear previous selection after successful save previousSelection.value = null; - editMode.value = false; + setEditMode(false); }; const isWorkflowConfigured = (event) => { @@ -197,7 +223,7 @@ const workflowList = computed(() => { const createNewWorkflow = (baseEventType, capabilities, displayName) => { // Store current selection before creating new workflow - if (!editMode.value) { + if (!isInEditMode.value) { previousSelection.value = { selectedItem: store.selectedItem, selectedWorkflow: store.selectedWorkflow ? {...store.selectedWorkflow} : null @@ -222,7 +248,7 @@ const createNewWorkflow = (baseEventType, capabilities, displayName) => { // For unconfigured events, use the base event type as selected item for UI consistency store.selectedItem = baseEventType; store.resetWorkflowData(); - editMode.value = true; // Auto-enter edit mode for new workflows + // Unconfigured workflows are always in edit mode by default }; const cloneWorkflow = (sourceWorkflow) => { @@ -263,7 +289,7 @@ const cloneWorkflow = (sourceWorkflow) => { // Load the source workflow's data into the form store.loadWorkflowData(sourceWorkflow.event_id); - editMode.value = true; // Auto-enter edit mode for cloned workflows + // Cloned workflows (id: 0) are always in edit mode by default // Update URL for cloned workflow const newUrl = `${props.projectLink}/workflows/${tempId}`; @@ -281,8 +307,8 @@ const selectWorkflowItem = async (item) => { selectTimeout = null; }, 300); - editMode.value = false; // Reset edit mode when switching workflows previousSelection.value = null; // Clear previous selection when manually selecting + // Don't reset edit mode when switching - each workflow keeps its own state // Wait for DOM update to prevent conflicts await nextTick(); @@ -291,9 +317,21 @@ const selectWorkflowItem = async (item) => { // This is a configured workflow, select it await selectWorkflowEvent(item); } else { - // This is an unconfigured event, create new workflow - createNewWorkflow(item.base_event_type, item.capabilities, item.display_name); - // Update URL for new workflow + // This is an unconfigured event - check if we already have a workflow object for it + const existingWorkflow = store.workflowEvents.find(w => + w.id === 0 && + (w.base_event_type === item.base_event_type || w.workflow_event === item.base_event_type) + ); + + if (existingWorkflow) { + // We already have an unconfigured workflow for this event type, select it + await selectWorkflowEvent(existingWorkflow); + } else { + // This is truly a new unconfigured event, create new workflow + createNewWorkflow(item.base_event_type, item.capabilities, item.display_name); + } + + // Update URL for workflow const newUrl = `${props.projectLink}/workflows/${item.base_event_type}`; window.history.pushState({eventId: item.base_event_type}, '', newUrl); } @@ -404,7 +442,6 @@ onMounted(async () => { store.selectedItem = props.eventID; store.selectedWorkflow = selectedEvent; await store.loadWorkflowData(props.eventID); - editMode.value = false; } else { // Check if eventID matches a base event type (unconfigured workflow) const items = workflowList.value; @@ -541,29 +578,31 @@ onUnmounted(() => {

{{ store.selectedWorkflow.display_name }} - {{ store.selectedWorkflow.enabled ? 'Enabled' : 'Disabled' }}

-

Configure automated actions for this workflow

+

Configure automated actions for this workflow

+

Configure automated actions for this workflow

View workflow configuration

- +
-
+
@@ -604,7 +643,7 @@ onUnmounted(() => {
@@ -645,7 +684,7 @@ onUnmounted(() => {
@@ -677,7 +716,7 @@ onUnmounted(() => {
-
+