diff --git a/web/app/components/workflow/hooks/use-nodes-interactions.ts b/web/app/components/workflow/hooks/use-nodes-interactions.ts index 523a8e9a6e..191bd7af0a 100644 --- a/web/app/components/workflow/hooks/use-nodes-interactions.ts +++ b/web/app/components/workflow/hooks/use-nodes-interactions.ts @@ -43,7 +43,10 @@ export const useNodesInteractions = () => { const workflowStore = useWorkflowStore() const nodesExtraData = useNodesExtraData() const { handleSyncWorkflowDraft } = useNodesSyncDraft() - const { getAfterNodesInSameBranch } = useWorkflow() + const { + getAfterNodesInSameBranch, + getTreeLeafNodes, + } = useWorkflow() const { getNodesReadOnly } = useNodesReadOnly() const dragNodeStartPosition = useRef({ x: 0, y: 0 } as { x: number; y: number }) const connectingNodeRef = useRef<{ nodeId: string; handleType: HandleType } | null>(null) @@ -313,6 +316,13 @@ export const useNodesInteractions = () => { setEdges, } = store.getState() const nodes = getNodes() + const targetNode = nodes.find(node => node.id === target!) + if (targetNode && targetNode?.data.type === BlockEnum.VariableAssigner) { + const treeNodes = getTreeLeafNodes(target!) + + if (!treeNodes.find(treeNode => treeNode.id === source)) + return + } const needDeleteEdges = edges.filter((edge) => { if (edge.source === source) { if (edge.sourceHandle) @@ -368,7 +378,7 @@ export const useNodesInteractions = () => { }) setEdges(newEdges) handleSyncWorkflowDraft() - }, [store, handleSyncWorkflowDraft, getNodesReadOnly]) + }, [store, handleSyncWorkflowDraft, getNodesReadOnly, getTreeLeafNodes]) const handleNodeConnectStart = useCallback((_, { nodeId, handleType }) => { if (nodeId && handleType) { diff --git a/web/app/components/workflow/nodes/variable-assigner/components/var-list/index.tsx b/web/app/components/workflow/nodes/variable-assigner/components/var-list/index.tsx index 668a9fd012..36a34003fe 100644 --- a/web/app/components/workflow/nodes/variable-assigner/components/var-list/index.tsx +++ b/web/app/components/workflow/nodes/variable-assigner/components/var-list/index.tsx @@ -6,6 +6,7 @@ import produce from 'immer' import RemoveButton from '../../../_base/components/remove-button' import VarReferencePicker from '@/app/components/workflow/nodes/_base/components/variable/var-reference-picker' import type { ValueSelector, Var } from '@/app/components/workflow/types' +import { VarType as VarKindType } from '@/app/components/workflow/nodes/tool/types' type Props = { readonly: boolean @@ -71,6 +72,7 @@ const VarList: FC = ({ onOpen={handleOpen(index)} onlyLeafNodeVar={onlyLeafNodeVar} filterVar={filterVar} + defaultVarKindType={VarKindType.variable} /> {!readonly && ( { } for (const edge of edges) - adjaList[edge.source].push(edge.target) + adjaList[edge.source]?.push(edge.target) for (let i = 0; i < nodes.length; i++) { if (color[nodes[i].id] === WHITE) @@ -143,14 +143,14 @@ export const initialEdges = (edges: Edge[], nodes: Node[]) => { if (!edge.targetHandle) edge.targetHandle = 'target' - if (!edge.data?.sourceType) { + if (!edge.data?.sourceType && edge.source) { edge.data = { ...edge.data, sourceType: nodesMap[edge.source].data.type!, } as any } - if (!edge.data?.targetType) { + if (!edge.data?.targetType && edge.target) { edge.data = { ...edge.data, targetType: nodesMap[edge.target].data.type!,