From 58182ddda7212d5a7c1776d09fe5c351f7e1aec0 Mon Sep 17 00:00:00 2001 From: Yourz Date: Sun, 15 Feb 2026 10:01:54 +0800 Subject: [PATCH] fix: skip loading drafts when Comfy.Workflow.Persist is disabled (#8851) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary Skip draft loading and clear stored drafts when `Comfy.Workflow.Persist` is disabled, preventing unsaved changes from reappearing. ## Changes - **What**: Guard draft loading in `ComfyWorkflow.load()` with `Comfy.Workflow.Persist` setting check. Clear all localStorage drafts when Persist is toggled from true to false. ## Review Focus `ComfyWorkflow.load()` previously read drafts unconditionally regardless of the Persist setting. This meant that after disabling Persist, previously stored drafts would still be applied when opening a saved workflow. The fix adds a guard in two places: 1. `comfyWorkflow.ts`: `load()` now checks `Comfy.Workflow.Persist` before calling `getDraft()` 2. `useWorkflowPersistence.ts`: A `watch` on the Persist setting calls `draftStore.reset()` when disabled Fixes Comfy-Org/ComfyUI#12323 ┆Issue is synchronized with this [Notion page](https://www.notion.so/PR-8851-fix-skip-loading-drafts-when-Comfy-Workflow-Persist-is-disabled-3066d73d36508119ac2ce13564e18c01) by [Unito](https://www.unito.io) Co-authored-by: Amp --- .../management/stores/comfyWorkflow.ts | 5 +- .../useWorkflowPersistence.test.ts | 47 ++++++++++++++++--- .../composables/useWorkflowPersistence.ts | 7 +++ 3 files changed, 51 insertions(+), 8 deletions(-) diff --git a/src/platform/workflow/management/stores/comfyWorkflow.ts b/src/platform/workflow/management/stores/comfyWorkflow.ts index 656c1b542f..553e5384d3 100644 --- a/src/platform/workflow/management/stores/comfyWorkflow.ts +++ b/src/platform/workflow/management/stores/comfyWorkflow.ts @@ -62,8 +62,11 @@ export class ComfyWorkflow extends UserFile { > { const { useWorkflowDraftStore } = await import('@/platform/workflow/persistence/stores/workflowDraftStore') + const { useSettingStore } = await import('@/platform/settings/settingStore') const draftStore = useWorkflowDraftStore() - let draft = !force ? draftStore.getDraft(this.path) : undefined + const persistEnabled = useSettingStore().get('Comfy.Workflow.Persist') + let draft = + !force && persistEnabled ? draftStore.getDraft(this.path) : undefined let draftState: ComfyWorkflowJSON | null = null let draftContent: string | null = null diff --git a/src/platform/workflow/persistence/composables/useWorkflowPersistence.test.ts b/src/platform/workflow/persistence/composables/useWorkflowPersistence.test.ts index 2879ad5fc5..e40a3e2440 100644 --- a/src/platform/workflow/persistence/composables/useWorkflowPersistence.test.ts +++ b/src/platform/workflow/persistence/composables/useWorkflowPersistence.test.ts @@ -1,6 +1,7 @@ import { createTestingPinia } from '@pinia/testing' import { setActivePinia } from 'pinia' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' +import { nextTick } from 'vue' import type * as I18n from 'vue-i18n' import { useWorkflowStore } from '@/platform/workflow/management/stores/workflowStore' @@ -10,15 +11,25 @@ import { useWorkflowDraftStore } from '@/platform/workflow/persistence/stores/wo import { defaultGraphJSON } from '@/scripts/defaultGraph' import { setStorageValue } from '@/scripts/utils' -vi.mock('@/platform/settings/settingStore', () => ({ - useSettingStore: vi.fn(() => ({ - get: vi.fn((key: string) => - key === 'Comfy.Workflow.Persist' ? true : undefined - ), - set: vi.fn() - })) +const settingMocks = vi.hoisted(() => ({ + persistRef: null as { value: boolean } | null })) +vi.mock('@/platform/settings/settingStore', async () => { + const { ref } = await import('vue') + settingMocks.persistRef = ref(true) + return { + useSettingStore: vi.fn(() => ({ + get: vi.fn((key: string) => { + if (key === 'Comfy.Workflow.Persist') + return settingMocks.persistRef!.value + return undefined + }), + set: vi.fn() + })) + } +}) + const mockToastAdd = vi.fn() vi.mock('primevue', () => ({ useToast: () => ({ @@ -114,6 +125,7 @@ describe('useWorkflowPersistence', () => { localStorage.clear() sessionStorage.clear() vi.clearAllMocks() + settingMocks.persistRef!.value = true mockToastAdd.mockClear() useWorkflowDraftStore().reset() mocks.state.graphChangedHandler = null @@ -253,4 +265,25 @@ describe('useWorkflowPersistence', () => { }) ) }) + + it('clears all drafts when Persist is switched from true to false', async () => { + const workflowStore = useWorkflowStore() + const draftStore = useWorkflowDraftStore() + const workflow = workflowStore.createTemporary('ClearDraft.json') + await workflowStore.openWorkflow(workflow) + + useWorkflowPersistence() + expect(mocks.state.graphChangedHandler).toBeTypeOf('function') + + mocks.state.currentGraph = { title: 'Draft to clear' } + mocks.state.graphChangedHandler!() + await vi.advanceTimersByTimeAsync(800) + + expect(draftStore.getDraft('workflows/ClearDraft.json')).toBeDefined() + + settingMocks.persistRef!.value = false + await nextTick() + + expect(draftStore.getDraft('workflows/ClearDraft.json')).toBeUndefined() + }) }) diff --git a/src/platform/workflow/persistence/composables/useWorkflowPersistence.ts b/src/platform/workflow/persistence/composables/useWorkflowPersistence.ts index 06e7bff61d..37eedd5150 100644 --- a/src/platform/workflow/persistence/composables/useWorkflowPersistence.ts +++ b/src/platform/workflow/persistence/composables/useWorkflowPersistence.ts @@ -53,6 +53,13 @@ export function useWorkflowPersistence() { const lastSavedJsonByPath = ref>({}) + watch(workflowPersistenceEnabled, (enabled) => { + if (!enabled) { + workflowDraftStore.reset() + lastSavedJsonByPath.value = {} + } + }) + const persistCurrentWorkflow = () => { if (!workflowPersistenceEnabled.value) return const activeWorkflow = workflowStore.activeWorkflow