@@ -38,20 +38,28 @@ const workflowStore = useWorkflowStore()
3838const { t } = useI18n ()
3939const canvas: LGraphCanvas = canvasStore .getCanvas ()
4040
41- const { mode , isArrangeMode } = useAppMode ()
41+ const { isSelectMode , isArrangeMode } = useAppMode ()
4242const hoveringSelectable = ref (false )
4343
4444provide (HideLayoutFieldKey , true )
4545
4646workflowStore .activeWorkflow ?.changeTracker ?.reset ()
4747
48+ function resolveNode(nodeId : NodeId ) {
49+ return (
50+ app .rootGraph .getNodeById (nodeId ) ??
51+ [... app .rootGraph .subgraphs .values ()]
52+ .flatMap ((sg ) => sg .nodes )
53+ .find ((n ) => n .id == nodeId )
54+ )
55+ }
56+
4857// Prune stale entries whose node/widget no longer exists, so the
4958// DraggableList model always matches the rendered items.
5059watchEffect (() => {
51- const valid = appModeStore .selectedInputs .filter (([nodeId , widgetName ]) => {
52- const node = app .rootGraph .getNodeById (nodeId )
53- return node ?.widgets ?.some ((w ) => w .name === widgetName )
54- })
60+ const valid = appModeStore .selectedInputs .filter (([nodeId , widgetName ]) =>
61+ resolveNode (nodeId )?.widgets ?.some ((w ) => w .name === widgetName )
62+ )
5563 if (valid .length < appModeStore .selectedInputs .length ) {
5664 appModeStore .selectedInputs = valid
5765 }
@@ -60,7 +68,7 @@ watchEffect(() => {
6068const arrangeInputs = computed (() =>
6169 appModeStore .selectedInputs
6270 .map (([nodeId , widgetName ]) => {
63- const node = app . rootGraph . getNodeById (nodeId )
71+ const node = resolveNode (nodeId )
6472 const widget = node ?.widgets ?.find ((w ) => w .name === widgetName )
6573 if (! node || ! widget ) return null
6674 return { nodeId , widgetName , node , widget }
@@ -70,7 +78,7 @@ const arrangeInputs = computed(() =>
7078
7179const inputsWithState = computed (() =>
7280 appModeStore .selectedInputs .map (([nodeId , widgetName ]) => {
73- const node = app . rootGraph . getNodeById (nodeId )
81+ const node = resolveNode (nodeId )
7482 const widget = node ?.widgets ?.find ((w ) => w .name === widgetName )
7583 if (! node || ! widget ) return { nodeId , widgetName }
7684
@@ -168,14 +176,14 @@ function handleClick(e: MouseEvent) {
168176 if (! widget ) {
169177 if (! node .constructor .nodeData ?.output_node )
170178 return canvasInteractions .forwardEventToCanvas (e )
171- const index = appModeStore .selectedOutputs .findIndex ((id ) => id === node .id )
179+ const index = appModeStore .selectedOutputs .findIndex ((id ) => id == node .id )
172180 if (index === - 1 ) appModeStore .selectedOutputs .push (node .id )
173181 else appModeStore .selectedOutputs .splice (index , 1 )
174182 return
175183 }
176184
177185 const index = appModeStore .selectedInputs .findIndex (
178- ([nodeId , widgetName ]) => node .id === nodeId && widget .name === widgetName
186+ ([nodeId , widgetName ]) => node .id == nodeId && widget .name === widgetName
179187 )
180188 if (index === - 1 ) appModeStore .selectedInputs .push ([node .id , widget .name ])
181189 else appModeStore .selectedInputs .splice (index , 1 )
@@ -239,6 +247,7 @@ const renderedInputs = computed<[string, MaybeRef<BoundStyle> | undefined][]>(
239247 :disabled =" ! appModeStore .selectedInputs .length "
240248 class="border-border-subtle border-b"
241249 :tooltip =" ` ${t (' linearMode.builder.inputsDesc' )}\n ${t (' linearMode.builder.inputsExample' )} ` "
250+ :tooltip-delay =" 100 "
242251 >
243252 <template #label >
244253 <div class =" flex gap-3" >
@@ -274,7 +283,7 @@ const renderedInputs = computed<[string, MaybeRef<BoundStyle> | undefined][]>(
274283 () =>
275284 remove (
276285 appModeStore .selectedInputs ,
277- ([id , name ]) => nodeId === id && widgetName === name
286+ ([id , name ]) => nodeId == id && widgetName === name
278287 )
279288 "
280289 />
@@ -286,6 +295,7 @@ const renderedInputs = computed<[string, MaybeRef<BoundStyle> | undefined][]>(
286295 enable-empty-state
287296 :disabled =" ! appModeStore .selectedOutputs .length "
288297 :tooltip =" ` ${t (' linearMode.builder.outputsDesc' )}\n ${t (' linearMode.builder.outputsExample' )} ` "
298+ :tooltip-delay =" 100 "
289299 >
290300 <template #label >
291301 <div class =" flex gap-3" >
@@ -319,12 +329,15 @@ const renderedInputs = computed<[string, MaybeRef<BoundStyle> | undefined][]>(
319329 "
320330 :title
321331 :sub-title =" String (key )"
322- :remove =" () => remove (appModeStore .selectedOutputs , (k ) => k === key ) "
332+ :remove =" () => remove (appModeStore .selectedOutputs , (k ) => k == key ) "
323333 />
324334 </DraggableList >
325335 </PropertiesAccordionItem >
326336
327- <Teleport v-if =" mode === ' builder:select' " to="body">
337+ <Teleport
338+ v-if =" isSelectMode && ! settingStore .get (' Comfy.VueNodes.Enabled' )"
339+ to="body"
340+ >
328341 <div
329342 :class ="
330343 cn(
@@ -358,13 +371,19 @@ const renderedInputs = computed<[string, MaybeRef<BoundStyle> | undefined][]>(
358371 <div class =" absolute top-0 right-0 size-8" >
359372 <div
360373 v-if =" isSelected"
361- class =" absolute -top-1/2 -right-1/2 size-full p-2 bg-warning-background rounded-lg"
374+ class =" absolute -top-1/2 -right-1/2 size-full p-2 bg-warning-background rounded-lg cursor-pointer pointer-events-auto"
375+ @click.stop ="
376+ remove(appModeStore.selectedOutputs, (k) => k == key)
377+ "
378+ @pointerdown.stop
362379 >
363380 <i class =" icon-[lucide--check] bg-text-foreground size-full" />
364381 </div >
365382 <div
366383 v-else
367- class =" absolute -top-1/2 -right-1/2 size-full ring-warning-background/50 ring-4 ring-inset bg-component-node-background rounded-lg"
384+ class =" absolute -top-1/2 -right-1/2 size-full ring-warning-background/50 ring-4 ring-inset bg-component-node-background rounded-lg cursor-pointer pointer-events-auto"
385+ @click.stop =" appModeStore.selectedOutputs.push(key)"
386+ @pointerdown.stop
368387 />
369388 </div >
370389 </div >
0 commit comments