diff --git a/web/components/flow/node-handler.tsx b/web/components/flow/node-handler.tsx index a4c8e6673..0db0599e8 100644 --- a/web/components/flow/node-handler.tsx +++ b/web/components/flow/node-handler.tsx @@ -35,9 +35,11 @@ const NodeHandler: React.FC = ({ node, data, type, label, inde const targetIndex = targetHandle?.split('|')[2]; const targetTypeCls = targetNode?.data[targetLabel!][targetIndex!].type_cls; if (sourceFlowType === targetFlowType && sourceFlowType === 'operator') { - // operator to operator, only type_cls matched can be connected + // operator to operator, only type_cls and is_list matched can be connected const sourceTypeCls = sourceNode?.data[sourceLabel!][sourceIndex!].type_cls; - return sourceTypeCls === targetTypeCls; + const sourceIsList = sourceNode?.data[sourceLabel!][sourceIndex!].is_list; + const targetIsList = targetNode?.data[targetLabel!][targetIndex!].is_list; + return sourceTypeCls === targetTypeCls && sourceIsList === targetIsList; } else if (sourceFlowType === 'resource' && (targetFlowType === 'operator' || targetFlowType === 'resource')) { // resource to operator, check operator type_cls and resource parent_cls const sourceParentCls = sourceNode?.data.parent_cls; @@ -60,7 +62,9 @@ const NodeHandler: React.FC = ({ node, data, type, label, inde // find other operators and outputs matching this input type_cls nodes = staticNodes .filter((node: IFlowNode) => node.flow_type === 'operator') - .filter((node: IFlowNode) => node.outputs?.some((output: IFlowNodeOutput) => output.type_cls === typeCls)); + .filter((node: IFlowNode) => + node.outputs?.some((output: IFlowNodeOutput) => output.type_cls === typeCls && output.is_list === data?.is_list), + ); } else if (label === 'parameters') { // fint other resources and parent_cls including this parameter type_cls nodes = staticNodes.filter((node: IFlowNode) => node.flow_type === 'resource').filter((node: IFlowNode) => node.parent_cls?.includes(typeCls)); @@ -69,7 +73,7 @@ const NodeHandler: React.FC = ({ node, data, type, label, inde // find other operators and inputs matching this output type_cls nodes = staticNodes .filter((node: IFlowNode) => node.flow_type === 'operator') - .filter((node: IFlowNode) => node.inputs?.some((input: IFlowNodeInput) => input.type_cls === typeCls)); + .filter((node: IFlowNode) => node.inputs?.some((input: IFlowNodeInput) => input.type_cls === typeCls && input.is_list === data?.is_list)); } else if (node.flow_type === 'resource') { // find other resources or operators that this output parent_cls includes their type_cls nodes = staticNodes.filter( diff --git a/web/types/flow.ts b/web/types/flow.ts index 104f54563..d4ec3b416 100644 --- a/web/types/flow.ts +++ b/web/types/flow.ts @@ -39,6 +39,7 @@ export type IFlowNodeParameter = { description: string; options?: any; value: any; + is_list?: boolean; }; export type IFlowNodeInput = { @@ -50,6 +51,7 @@ export type IFlowNodeInput = { id: string; optional?: boolean | undefined; value: any; + is_list?: boolean; }; export type IFlowNodeOutput = { @@ -60,6 +62,7 @@ export type IFlowNodeOutput = { description: string; id: string; optional?: boolean | undefined; + is_list?: boolean; }; export type IFlowNode = Node & {