mirror of
https://github.com/Comfy-Org/ComfyUI_frontend.git
synced 2026-02-19 22:34:15 +00:00
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:
@@ -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
|
||||
|
||||
|
||||
@@ -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()
|
||||
})
|
||||
})
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user