fix: skip loading drafts when Comfy.Workflow.Persist is disabled (#8851)

## 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 <amp@ampcode.com>
This commit is contained in:
Yourz
2026-02-15 10:01:54 +08:00
committed by GitHub
parent 0f0029ca29
commit 58182ddda7
3 changed files with 51 additions and 8 deletions

View File

@@ -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

View File

@@ -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()
})
})

View File

@@ -53,6 +53,13 @@ export function useWorkflowPersistence() {
const lastSavedJsonByPath = ref<Record<string, string>>({})
watch(workflowPersistenceEnabled, (enabled) => {
if (!enabled) {
workflowDraftStore.reset()
lastSavedJsonByPath.value = {}
}
})
const persistCurrentWorkflow = () => {
if (!workflowPersistenceEnabled.value) return
const activeWorkflow = workflowStore.activeWorkflow