From 73e51572a0c7cc7eed7a45a4806f13dee6c6bc0d Mon Sep 17 00:00:00 2001 From: Comfy Org PR Bot Date: Sat, 14 Feb 2026 19:58:00 +0900 Subject: [PATCH] [backport core/1.38] fix: clear draft on workflow close to prevent stale state on reopen (#8868) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Backport of #8854 to `core/1.38` Automatically created by backport workflow. ┆Issue is synchronized with this [Notion page](https://www.notion.so/PR-8868-backport-core-1-38-fix-clear-draft-on-workflow-close-to-prevent-stale-state-on-reopen-3076d73d36508163a919fdfb66616844) by [Unito](https://www.unito.io) Co-authored-by: Christian Byrne --- .../workflow/core/services/workflowService.ts | 2 + .../management/stores/workflowStore.test.ts | 38 +++++++++++++++++++ .../management/stores/workflowStore.ts | 4 +- 3 files changed, 41 insertions(+), 3 deletions(-) diff --git a/src/platform/workflow/core/services/workflowService.ts b/src/platform/workflow/core/services/workflowService.ts index 971e48ac09..db01f62171 100644 --- a/src/platform/workflow/core/services/workflowService.ts +++ b/src/platform/workflow/core/services/workflowService.ts @@ -215,6 +215,8 @@ export const useWorkflowService = () => { } } + workflowDraftStore.removeDraft(workflow.path) + // If this is the last workflow, create a new default temporary workflow if (workflowStore.openWorkflows.length === 1) { await loadDefaultWorkflow() diff --git a/src/platform/workflow/management/stores/workflowStore.test.ts b/src/platform/workflow/management/stores/workflowStore.test.ts index fad21ccfc4..4e49f01398 100644 --- a/src/platform/workflow/management/stores/workflowStore.test.ts +++ b/src/platform/workflow/management/stores/workflowStore.test.ts @@ -11,6 +11,7 @@ import { useWorkflowBookmarkStore, useWorkflowStore } from '@/platform/workflow/management/stores/workflowStore' +import { useWorkflowDraftStore } from '@/platform/workflow/persistence/stores/workflowDraftStore' import { api } from '@/scripts/api' import { app as comfyApp } from '@/scripts/app' import { defaultGraph, defaultGraphJSON } from '@/scripts/defaultGraph' @@ -910,4 +911,41 @@ describe('useWorkflowStore', () => { expect(mostRecent).toBeNull() }) }) + + describe('closeWorkflow draft cleanup', () => { + it('should remove draft for persisted workflows on close', async () => { + const draftStore = useWorkflowDraftStore() + await syncRemoteWorkflows(['a.json']) + const workflow = store.getWorkflowByPath('workflows/a.json')! + + draftStore.saveDraft('workflows/a.json', { + data: '{"dirty":true}', + updatedAt: Date.now(), + name: 'a.json', + isTemporary: false + }) + expect(draftStore.getDraft('workflows/a.json')).toBeDefined() + + await store.closeWorkflow(workflow) + + expect(draftStore.getDraft('workflows/a.json')).toBeUndefined() + }) + + it('should remove draft for temporary workflows on close', async () => { + const draftStore = useWorkflowDraftStore() + const workflow = store.createTemporary('temp.json') + + draftStore.saveDraft(workflow.path, { + data: '{"dirty":true}', + updatedAt: Date.now(), + name: 'temp.json', + isTemporary: true + }) + expect(draftStore.getDraft(workflow.path)).toBeDefined() + + await store.closeWorkflow(workflow) + + expect(draftStore.getDraft(workflow.path)).toBeUndefined() + }) + }) }) diff --git a/src/platform/workflow/management/stores/workflowStore.ts b/src/platform/workflow/management/stores/workflowStore.ts index 364f952bb8..9d244eb1ad 100644 --- a/src/platform/workflow/management/stores/workflowStore.ts +++ b/src/platform/workflow/management/stores/workflowStore.ts @@ -463,11 +463,9 @@ export const useWorkflowStore = defineStore('workflow', () => { openWorkflowPaths.value = openWorkflowPaths.value.filter( (path) => path !== workflow.path ) + useWorkflowDraftStore().removeDraft(workflow.path) if (workflow.isTemporary) { - // Clear thumbnail when temporary workflow is closed clearThumbnail(workflow.key) - // Clear draft when unsaved workflow tab is closed - useWorkflowDraftStore().removeDraft(workflow.path) delete workflowLookup.value[workflow.path] } else { workflow.unload()