diff --git a/src/renderer/extensions/linearMode/LinearControls.vue b/src/renderer/extensions/linearMode/LinearControls.vue index 8b550a0ef9..d79d40cd91 100644 --- a/src/renderer/extensions/linearMode/LinearControls.vue +++ b/src/renderer/extensions/linearMode/LinearControls.vue @@ -64,6 +64,7 @@ useEventListener( ) const mappedSelections = computed(() => { + void graphNodes.value let unprocessedInputs = appModeStore.selectedInputs.flatMap( ([nodeId, widgetName]) => { const [node, widget] = resolveNodeWidget(nodeId, widgetName) diff --git a/src/stores/appModeStore.test.ts b/src/stores/appModeStore.test.ts index 50db79ee46..c8d4d3e661 100644 --- a/src/stores/appModeStore.test.ts +++ b/src/stores/appModeStore.test.ts @@ -25,7 +25,7 @@ const mockEmptyWorkflowDialog = vi.hoisted(() => { vi.mock('@/scripts/app', () => ({ app: { - rootGraph: { extra: {}, nodes: [{ id: 1 }] } + rootGraph: { extra: {}, nodes: [{ id: 1 }], events: new EventTarget() } } })) @@ -242,6 +242,29 @@ describe('appModeStore', () => { expect(store.selectedOutputs).toEqual([1]) }) + it('reloads selections on configured event', async () => { + const node1 = mockNode(1) + + // Initially nodes are not resolvable — pruning removes them + mockResolveNode.mockReturnValue(undefined) + workflowStore.activeWorkflow = workflowWithLinearData([[1, 'seed']], [1]) + await nextTick() + expect(store.selectedInputs).toEqual([]) + expect(store.selectedOutputs).toEqual([]) + + // After graph configures, nodes become resolvable + mockResolveNode.mockImplementation((id) => + id == 1 ? (node1 as unknown as LGraphNode) : undefined + ) + ;(app.rootGraph.events as EventTarget).dispatchEvent( + new Event('configured') + ) + await nextTick() + + expect(store.selectedInputs).toEqual([[1, 'seed']]) + expect(store.selectedOutputs).toEqual([1]) + }) + it('hasOutputs is false when all output nodes are deleted', async () => { mockResolveNode.mockReturnValue(undefined) diff --git a/src/stores/appModeStore.ts b/src/stores/appModeStore.ts index a2df72e43d..2b820e9fe9 100644 --- a/src/stores/appModeStore.ts +++ b/src/stores/appModeStore.ts @@ -1,5 +1,6 @@ import { defineStore } from 'pinia' import { reactive, computed, watch } from 'vue' +import { useEventListener } from '@vueuse/core' import { useEmptyWorkflowDialog } from '@/components/builder/useEmptyWorkflowDialog' import { useAppMode } from '@/composables/useAppMode' @@ -76,6 +77,12 @@ export const useAppModeStore = defineStore('appMode', () => { { immediate: true } ) + useEventListener( + () => app.rootGraph?.events, + 'configured', + resetSelectedToWorkflow + ) + watch( () => isBuilderMode.value