mirror of
https://github.com/Comfy-Org/ComfyUI_frontend.git
synced 2026-02-09 01:20:09 +00:00
fix: preserve subgraph widget overrides when pruning invalid entries
This commit is contained in:
@@ -2,7 +2,7 @@ import { createPinia, setActivePinia } from 'pinia'
|
||||
import { nextTick } from 'vue'
|
||||
import { beforeEach, describe, expect, it, vi } from 'vitest'
|
||||
|
||||
import type { LGraphNode } from '@/lib/litegraph/src/litegraph'
|
||||
import type { LGraphNode, Subgraph } from '@/lib/litegraph/src/litegraph'
|
||||
import type { IWidgetOptions } from '@/lib/litegraph/src/types/widgets'
|
||||
import { useAdvancedWidgetOverridesStore } from '@/stores/workspace/advancedWidgetOverridesStore'
|
||||
|
||||
@@ -22,7 +22,8 @@ vi.mock('@/scripts/app', () => ({
|
||||
vi.mock('@/platform/workflow/management/stores/workflowStore', () => ({
|
||||
useWorkflowStore: () => ({
|
||||
activeWorkflow: { path: 'test-workflow' },
|
||||
nodeToNodeLocatorId: (node: { id: number }) => `node-${node.id}`
|
||||
nodeToNodeLocatorId: (node: { id: number; locatorId?: string }) =>
|
||||
node.locatorId ?? `node-${node.id}`
|
||||
})
|
||||
}))
|
||||
|
||||
@@ -34,9 +35,10 @@ vi.mock('@/renderer/core/canvas/canvasStore', () => ({
|
||||
|
||||
function makeNode(
|
||||
id: number,
|
||||
widgets: Array<{ name: string; options?: IWidgetOptions<unknown> }>
|
||||
widgets: Array<{ name: string; options?: IWidgetOptions<unknown> }>,
|
||||
locatorId?: string
|
||||
) {
|
||||
return { id, widgets } as Partial<LGraphNode> as LGraphNode
|
||||
return { id, widgets, locatorId } as unknown as LGraphNode
|
||||
}
|
||||
|
||||
describe('useAdvancedWidgetOverridesStore', () => {
|
||||
@@ -185,4 +187,37 @@ describe('useAdvancedWidgetOverridesStore', () => {
|
||||
advanced: true
|
||||
})
|
||||
})
|
||||
|
||||
it('pruneInvalidOverrides preserves overrides for nodes inside subgraphs', () => {
|
||||
const store = useAdvancedWidgetOverridesStore()
|
||||
|
||||
const innerNode = makeNode(1, [{ name: 'cfg' }], 'node-subgraph-10:node-1')
|
||||
store.setAdvanced(innerNode, 'cfg', true)
|
||||
|
||||
const subgraph = { nodes: [innerNode] } as unknown as Subgraph
|
||||
const subgraphNode = {
|
||||
id: 10,
|
||||
widgets: [],
|
||||
subgraph,
|
||||
isSubgraphNode: () => true
|
||||
} as unknown as LGraphNode
|
||||
|
||||
mockGraph.nodes = [subgraphNode]
|
||||
store.pruneInvalidOverrides()
|
||||
|
||||
expect(store.isOverridden(innerNode, 'cfg')).toBe(true)
|
||||
|
||||
const stored = mockGraph.extra.advancedWidgetOverrides as {
|
||||
overrides: Array<{
|
||||
nodeLocatorId: string
|
||||
widgetName: string
|
||||
advanced: boolean
|
||||
}>
|
||||
}
|
||||
expect(stored.overrides).toContainEqual({
|
||||
nodeLocatorId: 'node-subgraph-10:node-1',
|
||||
widgetName: 'cfg',
|
||||
advanced: true
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
@@ -7,6 +7,7 @@ import { useWorkflowStore } from '@/platform/workflow/management/stores/workflow
|
||||
import { useCanvasStore } from '@/renderer/core/canvas/canvasStore'
|
||||
import { app } from '@/scripts/app'
|
||||
import type { NodeLocatorId } from '@/types/nodeIdentification'
|
||||
import { forEachNode } from '@/utils/graphTraversalUtil'
|
||||
|
||||
interface AdvancedWidgetOverrideEntry {
|
||||
nodeLocatorId: NodeLocatorId
|
||||
@@ -197,15 +198,12 @@ export const useAdvancedWidgetOverridesStore = defineStore(
|
||||
if (!graph) return
|
||||
|
||||
const validKeys = new Set<string>()
|
||||
for (const node of graph.nodes ?? []) {
|
||||
forEachNode(graph, (node) => {
|
||||
for (const widget of node.widgets ?? []) {
|
||||
const key = getOverrideKey(
|
||||
getNodeLocatorId(node as LGraphNode),
|
||||
widget.name
|
||||
)
|
||||
const key = getOverrideKey(getNodeLocatorId(node), widget.name)
|
||||
validKeys.add(key)
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
const next = new Map<string, boolean>()
|
||||
for (const [key, advanced] of overrides.value) {
|
||||
|
||||
Reference in New Issue
Block a user