fix: preserve subgraph widget overrides when pruning invalid entries

This commit is contained in:
Rizumu Ayaka
2026-01-27 21:24:09 +08:00
parent 633da6bf60
commit 1cc5823f37
2 changed files with 43 additions and 10 deletions

View File

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

View File

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