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