From 38e62c4eebb08ba452ce76cea56e6d9891902305 Mon Sep 17 00:00:00 2001 From: majiayu000 <1835304752@qq.com> Date: Mon, 22 Dec 2025 15:17:13 +0800 Subject: [PATCH] fix(workflow): clear loop/iteration metadata when pasting node outside container When copying a node from inside a Loop/Iteration and pasting it outside, the node was retaining loop-specific metadata (isInLoop, loop_id, isInIteration, iteration_id, parentId), causing it to still be treated as a loop child with restricted connections. This fix clears these metadata fields when pasting a single node outside of Loop/Iteration containers, ensuring the node behaves as an independent workflow node. Fixes #29835 --- .../workflow/hooks/use-nodes-interactions.ts | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/web/app/components/workflow/hooks/use-nodes-interactions.ts b/web/app/components/workflow/hooks/use-nodes-interactions.ts index d56b85893e..1154790a43 100644 --- a/web/app/components/workflow/hooks/use-nodes-interactions.ts +++ b/web/app/components/workflow/hooks/use-nodes-interactions.ts @@ -1609,6 +1609,8 @@ export const useNodesInteractions = () => { else { // single node paste const selectedNode = nodes.find(node => node.selected) + let pastedToNestedBlock = false + if (selectedNode) { const commonNestedDisallowPasteNodes = [ // end node only can be placed outermost layer @@ -1630,6 +1632,7 @@ export const useNodesInteractions = () => { } // set position base on parent node newNode.position = getNestedNodePosition(newNode, selectedNode) + pastedToNestedBlock = true } else if (selectedNode.data.type === BlockEnum.Loop) { newNode.data.isInLoop = true @@ -1641,8 +1644,20 @@ export const useNodesInteractions = () => { } // set position base on parent node newNode.position = getNestedNodePosition(newNode, selectedNode) + pastedToNestedBlock = true } } + + // Clear loop/iteration metadata when pasting outside nested blocks (fixes #29835) + // This ensures nodes copied from inside Loop/Iteration are properly independent + // when pasted outside + if (!pastedToNestedBlock) { + newNode.data.isInLoop = false + newNode.data.loop_id = undefined + newNode.data.isInIteration = false + newNode.data.iteration_id = undefined + newNode.parentId = undefined + } } nodesToPaste.push(newNode)