|
|
|
@ -39,6 +39,7 @@ import { localNodeData } from '@/pages/flowEditor/sideBar/config/localNodeData';
|
|
|
|
import { useAlignmentGuidelines } from '@/hooks/useAlignmentGuidelines';
|
|
|
|
import { useAlignmentGuidelines } from '@/hooks/useAlignmentGuidelines';
|
|
|
|
import { setMainFlow } from '@/api/appRes';
|
|
|
|
import { setMainFlow } from '@/api/appRes';
|
|
|
|
import { Message } from '@arco-design/web-react';
|
|
|
|
import { Message } from '@arco-design/web-react';
|
|
|
|
|
|
|
|
import BasicNode from '@/components/FlowEditor/node/basicNode/BasicNode';
|
|
|
|
|
|
|
|
|
|
|
|
const edgeTypes: EdgeTypes = {
|
|
|
|
const edgeTypes: EdgeTypes = {
|
|
|
|
custom: CustomEdge
|
|
|
|
custom: CustomEdge
|
|
|
|
@ -97,8 +98,8 @@ const FlowEditor: React.FC<{ initialData?: any, useDefault?: boolean }> = ({ ini
|
|
|
|
const apiOuts = nodeParams.apiOuts || [];
|
|
|
|
const apiOuts = nodeParams.apiOuts || [];
|
|
|
|
const apiIns = nodeParams.apiIns || [];
|
|
|
|
const apiIns = nodeParams.apiIns || [];
|
|
|
|
|
|
|
|
|
|
|
|
if (apiOuts.some((api: any) => api.name === handleId) ||
|
|
|
|
if (apiOuts.some((api: any) => (api.name || api.id) === handleId) ||
|
|
|
|
apiIns.some((api: any) => api.name === handleId)) {
|
|
|
|
apiIns.some((api: any) => (api.name || api.id) === handleId)) {
|
|
|
|
return 'api';
|
|
|
|
return 'api';
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@ -106,8 +107,8 @@ const FlowEditor: React.FC<{ initialData?: any, useDefault?: boolean }> = ({ ini
|
|
|
|
const dataOuts = nodeParams.dataOuts || [];
|
|
|
|
const dataOuts = nodeParams.dataOuts || [];
|
|
|
|
const dataIns = nodeParams.dataIns || [];
|
|
|
|
const dataIns = nodeParams.dataIns || [];
|
|
|
|
|
|
|
|
|
|
|
|
if (dataOuts.some((data: any) => data.name === handleId) ||
|
|
|
|
if (dataOuts.some((data: any) => (data.name || data.id) === handleId) ||
|
|
|
|
dataIns.some((data: any) => data.name === handleId)) {
|
|
|
|
dataIns.some((data: any) => (data.name || data.id) === handleId)) {
|
|
|
|
return 'data';
|
|
|
|
return 'data';
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@ -200,6 +201,7 @@ const FlowEditor: React.FC<{ initialData?: any, useDefault?: boolean }> = ({ ini
|
|
|
|
// 获取源节点和目标节点的参数信息
|
|
|
|
// 获取源节点和目标节点的参数信息
|
|
|
|
const sourceParams = sourceNode.data?.parameters || {};
|
|
|
|
const sourceParams = sourceNode.data?.parameters || {};
|
|
|
|
const targetParams = targetNode.data?.parameters || {};
|
|
|
|
const targetParams = targetNode.data?.parameters || {};
|
|
|
|
|
|
|
|
console.log(sourceParams, targetParams, params);
|
|
|
|
|
|
|
|
|
|
|
|
// 获取源handle和目标handle的类型 (api或data)
|
|
|
|
// 获取源handle和目标handle的类型 (api或data)
|
|
|
|
const sourceHandleType = getHandleType(params.sourceHandle, sourceParams);
|
|
|
|
const sourceHandleType = getHandleType(params.sourceHandle, sourceParams);
|
|
|
|
@ -526,11 +528,11 @@ const FlowEditor: React.FC<{ initialData?: any, useDefault?: boolean }> = ({ ini
|
|
|
|
}, []);
|
|
|
|
}, []);
|
|
|
|
|
|
|
|
|
|
|
|
// 在边上添加节点的具体实现
|
|
|
|
// 在边上添加节点的具体实现
|
|
|
|
const addNodeOnEdge = useCallback((nodeType: string) => {
|
|
|
|
const addNodeOnEdge = useCallback((nodeType: string, node: any) => {
|
|
|
|
if (!edgeForNodeAdd || !reactFlowInstance) return;
|
|
|
|
if (!edgeForNodeAdd || !reactFlowInstance) return;
|
|
|
|
|
|
|
|
|
|
|
|
// 查找节点定义
|
|
|
|
// 查找节点定义
|
|
|
|
const nodeDefinition = localNodeData.find(n => n.nodeType === nodeType);
|
|
|
|
const nodeDefinition = localNodeData.find(n => n.nodeType === nodeType) || node;
|
|
|
|
if (!nodeDefinition) return;
|
|
|
|
if (!nodeDefinition) return;
|
|
|
|
|
|
|
|
|
|
|
|
// 获取源节点和目标节点
|
|
|
|
// 获取源节点和目标节点
|
|
|
|
@ -559,7 +561,7 @@ const FlowEditor: React.FC<{ initialData?: any, useDefault?: boolean }> = ({ ini
|
|
|
|
|
|
|
|
|
|
|
|
// 将未定义的节点动态追加进nodeTypes
|
|
|
|
// 将未定义的节点动态追加进nodeTypes
|
|
|
|
const nodeMap = Array.from(Object.values(nodeTypeMap).map(key => key));
|
|
|
|
const nodeMap = Array.from(Object.values(nodeTypeMap).map(key => key));
|
|
|
|
if (!nodeMap.includes(nodeType)) registerNodeType(nodeType, LocalNode, nodeDefinition.nodeName);
|
|
|
|
if (!nodeMap.includes(nodeType)) registerNodeType(nodeType, nodeType === 'BASIC' ? BasicNode : LocalNode, nodeDefinition.nodeName);
|
|
|
|
|
|
|
|
|
|
|
|
// 添加新节点
|
|
|
|
// 添加新节点
|
|
|
|
setNodes((nds) => [...nds, newNode]);
|
|
|
|
setNodes((nds) => [...nds, newNode]);
|
|
|
|
@ -590,13 +592,13 @@ const FlowEditor: React.FC<{ initialData?: any, useDefault?: boolean }> = ({ ini
|
|
|
|
}, [edgeForNodeAdd, nodes, reactFlowInstance]);
|
|
|
|
}, [edgeForNodeAdd, nodes, reactFlowInstance]);
|
|
|
|
|
|
|
|
|
|
|
|
// 在画布上添加节点
|
|
|
|
// 在画布上添加节点
|
|
|
|
const addNodeOnPane = useCallback((nodeType: string, position: { x: number; y: number }) => {
|
|
|
|
const addNodeOnPane = useCallback((nodeType: string, position: { x: number; y: number }, node?: any) => {
|
|
|
|
setMenu(null);
|
|
|
|
setMenu(null);
|
|
|
|
|
|
|
|
|
|
|
|
if (!reactFlowInstance) return;
|
|
|
|
if (!reactFlowInstance) return;
|
|
|
|
|
|
|
|
|
|
|
|
// 查找节点定义
|
|
|
|
// 查找节点定义
|
|
|
|
const nodeDefinition = localNodeData.find(n => n.nodeType === nodeType);
|
|
|
|
const nodeDefinition = localNodeData.find(n => n.nodeType === nodeType) || node;
|
|
|
|
if (!nodeDefinition) return;
|
|
|
|
if (!nodeDefinition) return;
|
|
|
|
|
|
|
|
|
|
|
|
// 创建新节点
|
|
|
|
// 创建新节点
|
|
|
|
@ -614,20 +616,20 @@ const FlowEditor: React.FC<{ initialData?: any, useDefault?: boolean }> = ({ ini
|
|
|
|
// 将未定义的节点动态追加进nodeTypes
|
|
|
|
// 将未定义的节点动态追加进nodeTypes
|
|
|
|
const nodeMap = Array.from(Object.values(nodeTypeMap).map(key => key));
|
|
|
|
const nodeMap = Array.from(Object.values(nodeTypeMap).map(key => key));
|
|
|
|
// 目前默认添加的都是系统组件/本地组件
|
|
|
|
// 目前默认添加的都是系统组件/本地组件
|
|
|
|
if (!nodeMap.includes(nodeType)) registerNodeType(nodeType, LocalNode, nodeDefinition.nodeName);
|
|
|
|
if (!nodeMap.includes(nodeType)) registerNodeType(nodeType, nodeType === 'BASIC' ? BasicNode : LocalNode, nodeDefinition.nodeName);
|
|
|
|
|
|
|
|
|
|
|
|
setNodes((nds) => [...nds, newNode]);
|
|
|
|
setNodes((nds) => [...nds, newNode]);
|
|
|
|
}, [reactFlowInstance]);
|
|
|
|
}, [reactFlowInstance]);
|
|
|
|
|
|
|
|
|
|
|
|
// 处理添加节点的统一方法
|
|
|
|
// 处理添加节点的统一方法
|
|
|
|
const handleAddNode = useCallback((nodeType: string) => {
|
|
|
|
const handleAddNode = useCallback((nodeType: string, node) => {
|
|
|
|
// 如果是通过边添加节点
|
|
|
|
// 如果是通过边添加节点
|
|
|
|
if (edgeForNodeAdd) {
|
|
|
|
if (edgeForNodeAdd) {
|
|
|
|
addNodeOnEdge(nodeType);
|
|
|
|
addNodeOnEdge(nodeType, node);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// 如果是通过画布添加节点
|
|
|
|
// 如果是通过画布添加节点
|
|
|
|
else if (positionForNodeAdd) {
|
|
|
|
else if (positionForNodeAdd) {
|
|
|
|
addNodeOnPane(nodeType, positionForNodeAdd);
|
|
|
|
addNodeOnPane(nodeType, positionForNodeAdd, node);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 清除状态
|
|
|
|
// 清除状态
|
|
|
|
@ -767,8 +769,8 @@ const FlowEditor: React.FC<{ initialData?: any, useDefault?: boolean }> = ({ ini
|
|
|
|
>
|
|
|
|
>
|
|
|
|
<PaneContextMenu
|
|
|
|
<PaneContextMenu
|
|
|
|
position={menu.position!}
|
|
|
|
position={menu.position!}
|
|
|
|
onAddNode={(nodeType: string, position: { x: number, y: number }) => {
|
|
|
|
onAddNode={(nodeType: string, position: { x: number, y: number }, node) => {
|
|
|
|
addNodeOnPane(nodeType, position);
|
|
|
|
addNodeOnPane(nodeType, position, node);
|
|
|
|
setMenu(null); // 关闭上下文菜单
|
|
|
|
setMenu(null); // 关闭上下文菜单
|
|
|
|
}}
|
|
|
|
}}
|
|
|
|
/>
|
|
|
|
/>
|
|
|
|
@ -797,8 +799,8 @@ const FlowEditor: React.FC<{ initialData?: any, useDefault?: boolean }> = ({ ini
|
|
|
|
}}
|
|
|
|
}}
|
|
|
|
>
|
|
|
|
>
|
|
|
|
<AddNodeMenu
|
|
|
|
<AddNodeMenu
|
|
|
|
onAddNode={(nodeType) => {
|
|
|
|
onAddNode={(nodeType, node) => {
|
|
|
|
handleAddNode(nodeType);
|
|
|
|
handleAddNode(nodeType, node);
|
|
|
|
// 关闭菜单
|
|
|
|
// 关闭菜单
|
|
|
|
setEdgeForNodeAdd(null);
|
|
|
|
setEdgeForNodeAdd(null);
|
|
|
|
setPositionForNodeAdd(null);
|
|
|
|
setPositionForNodeAdd(null);
|
|
|
|
|