diff --git a/src/platform/workflow/core/services/workflowService.ts b/src/platform/workflow/core/services/workflowService.ts index 0cfa979f5a..37c4ef5e5a 100644 --- a/src/platform/workflow/core/services/workflowService.ts +++ b/src/platform/workflow/core/services/workflowService.ts @@ -310,23 +310,29 @@ export const useWorkflowService = () => { value: string | ComfyWorkflow | null, workflowData: ComfyWorkflowJSON ) => { - // Use workspaceStore here as it is patched in unit tests. const workflowStore = useWorkspaceStore().workflow - if (typeof value === 'string') { - const workflow = workflowStore.getWorkflowByPath( - ComfyWorkflow.basePath + appendJsonExt(value) - ) - if (workflow?.isPersisted) { - const loadedWorkflow = await workflowStore.openWorkflow(workflow) - loadedWorkflow.changeTracker.restore() - loadedWorkflow.changeTracker.reset(workflowData) - return - } - } if (value === null || typeof value === 'string') { const path = value as string | null - const tempWorkflow = workflowStore.createTemporary( + + // Check if a persisted workflow with this path exists + if (path) { + const fullPath = ComfyWorkflow.basePath + appendJsonExt(path) + const existingWorkflow = workflowStore.getWorkflowByPath(fullPath) + + // If the workflow exists and is NOT loaded yet (restoration case), + // use the existing workflow instead of creating a new one. + // If it IS loaded, this is a re-import case - create new with suffix. + if (existingWorkflow?.isPersisted && !existingWorkflow.isLoaded) { + const loadedWorkflow = + await workflowStore.openWorkflow(existingWorkflow) + loadedWorkflow.changeTracker.reset(workflowData) + loadedWorkflow.changeTracker.restore() + return + } + } + + const tempWorkflow = workflowStore.createNewTemporary( path ? appendJsonExt(path) : undefined, workflowData ) @@ -334,7 +340,6 @@ export const useWorkflowService = () => { return } - // value is a ComfyWorkflow. const loadedWorkflow = await workflowStore.openWorkflow(value) loadedWorkflow.changeTracker.reset(workflowData) loadedWorkflow.changeTracker.restore() diff --git a/src/platform/workflow/management/stores/workflowStore.ts b/src/platform/workflow/management/stores/workflowStore.ts index 584f496753..e821d9c75e 100644 --- a/src/platform/workflow/management/stores/workflowStore.ts +++ b/src/platform/workflow/management/stores/workflowStore.ts @@ -172,6 +172,10 @@ interface WorkflowStore { path?: string, workflowData?: ComfyWorkflowJSON ) => ComfyWorkflow + createNewTemporary: ( + path?: string, + workflowData?: ComfyWorkflowJSON + ) => ComfyWorkflow renameWorkflow: (workflow: ComfyWorkflow, newPath: string) => Promise deleteWorkflow: (workflow: ComfyWorkflow) => Promise saveWorkflow: (workflow: ComfyWorkflow) => Promise @@ -365,25 +369,15 @@ export const useWorkflowStore = defineStore('workflow', () => { return workflow } - const createTemporary = (path?: string, workflowData?: ComfyWorkflowJSON) => { - const fullPath = getUnconflictedPath( - ComfyWorkflow.basePath + (path ?? 'Unsaved Workflow.json') - ) - const existingWorkflow = workflows.value.find((w) => w.fullFilename == path) - if ( - path && - workflowData && - existingWorkflow?.changeTracker && - !existingWorkflow.directory.startsWith( - ComfyWorkflow.basePath.slice(0, -1) - ) - ) { - existingWorkflow.changeTracker.reset(workflowData) - return existingWorkflow - } - + /** + * Helper to create a new temporary workflow + */ + const createNewWorkflow = ( + path: string, + workflowData?: ComfyWorkflowJSON + ): ComfyWorkflow => { const workflow = new ComfyWorkflow({ - path: fullPath, + path, modified: Date.now(), size: -1 }) @@ -396,6 +390,47 @@ export const useWorkflowStore = defineStore('workflow', () => { return workflow } + /** + * Create a temporary workflow, attempting to reuse an existing workflow if conditions match + */ + const createTemporary = (path?: string, workflowData?: ComfyWorkflowJSON) => { + const fullPath = getUnconflictedPath( + ComfyWorkflow.basePath + (path ?? 'Unsaved Workflow.json') + ) + + // Try to reuse an existing loaded workflow with the same filename + // that is not stored in the workflows directory + if (path && workflowData) { + const existingWorkflow = workflows.value.find( + (w) => w.fullFilename === path + ) + if ( + existingWorkflow?.changeTracker && + !existingWorkflow.directory.startsWith( + ComfyWorkflow.basePath.slice(0, -1) + ) + ) { + existingWorkflow.changeTracker.reset(workflowData) + return existingWorkflow + } + } + + return createNewWorkflow(fullPath, workflowData) + } + + /** + * Create a new temporary workflow without attempting to reuse existing workflows + */ + const createNewTemporary = ( + path?: string, + workflowData?: ComfyWorkflowJSON + ): ComfyWorkflow => { + const fullPath = getUnconflictedPath( + ComfyWorkflow.basePath + (path ?? 'Unsaved Workflow.json') + ) + return createNewWorkflow(fullPath, workflowData) + } + const closeWorkflow = async (workflow: ComfyWorkflow) => { openWorkflowPaths.value = openWorkflowPaths.value.filter( (path) => path !== workflow.path @@ -777,6 +812,7 @@ export const useWorkflowStore = defineStore('workflow', () => { isBusy, closeWorkflow, createTemporary, + createNewTemporary, renameWorkflow, deleteWorkflow, saveAs,