|
|
|
@ -427,12 +427,14 @@ export const useFlowCallbacks = (
|
|
|
|
...node,
|
|
|
|
...node,
|
|
|
|
// 清除可能存在的运行时状态
|
|
|
|
// 清除可能存在的运行时状态
|
|
|
|
selected: false,
|
|
|
|
selected: false,
|
|
|
|
dragging: false
|
|
|
|
dragging: false,
|
|
|
|
|
|
|
|
// 添加应用标识信息
|
|
|
|
|
|
|
|
appId: initialData?.appId
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
localStorage.setItem('copiedNode', JSON.stringify(nodeData));
|
|
|
|
localStorage.setItem('copiedNode', JSON.stringify(nodeData));
|
|
|
|
console.log('复制节点:', node);
|
|
|
|
console.log('复制节点:', node);
|
|
|
|
}, []);
|
|
|
|
}, [initialData?.appId]);
|
|
|
|
|
|
|
|
|
|
|
|
// 粘贴节点
|
|
|
|
// 粘贴节点
|
|
|
|
const pasteNode = useCallback((position: { x: number; y: number }) => {
|
|
|
|
const pasteNode = useCallback((position: { x: number; y: number }) => {
|
|
|
|
@ -445,13 +447,22 @@ export const useFlowCallbacks = (
|
|
|
|
try {
|
|
|
|
try {
|
|
|
|
const copiedNode = JSON.parse(copiedNodeStr);
|
|
|
|
const copiedNode = JSON.parse(copiedNodeStr);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 检查是否为同一应用,如果不是则不允许粘贴
|
|
|
|
|
|
|
|
if (copiedNode.appId && initialData?.appId && copiedNode.appId !== initialData.appId) {
|
|
|
|
|
|
|
|
console.warn('不能在不同应用之间粘贴节点');
|
|
|
|
|
|
|
|
// Message.warning('不能在不同应用之间粘贴节点');
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 创建新节点,更新ID和位置
|
|
|
|
// 创建新节点,更新ID和位置
|
|
|
|
const newNode = {
|
|
|
|
const newNode = {
|
|
|
|
...copiedNode,
|
|
|
|
...copiedNode,
|
|
|
|
id: `${copiedNode.type}-${Date.now()}`, // 生成新的唯一ID
|
|
|
|
id: `${copiedNode.type}-${Date.now()}`, // 生成新的唯一ID
|
|
|
|
position, // 使用传入的位置
|
|
|
|
position, // 使用传入的位置
|
|
|
|
selected: false,
|
|
|
|
selected: false,
|
|
|
|
dragging: false
|
|
|
|
dragging: false,
|
|
|
|
|
|
|
|
// 移除应用标识信息,避免存储在节点数据中
|
|
|
|
|
|
|
|
appId: undefined
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
// 特殊处理循环节点
|
|
|
|
// 特殊处理循环节点
|
|
|
|
@ -495,7 +506,7 @@ export const useFlowCallbacks = (
|
|
|
|
} catch (error) {
|
|
|
|
} catch (error) {
|
|
|
|
console.error('粘贴节点时出错:', error);
|
|
|
|
console.error('粘贴节点时出错:', error);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}, [edges]);
|
|
|
|
}, [edges, initialData?.appId]);
|
|
|
|
// endregion
|
|
|
|
// endregion
|
|
|
|
|
|
|
|
|
|
|
|
// region 节点/边操作
|
|
|
|
// region 节点/边操作
|
|
|
|
@ -511,7 +522,7 @@ export const useFlowCallbacks = (
|
|
|
|
if (node.data?.type === 'LOOP_START' || node.data?.type === 'LOOP_END') {
|
|
|
|
if (node.data?.type === 'LOOP_START' || node.data?.type === 'LOOP_END') {
|
|
|
|
// 获取关联的另一个循环节点
|
|
|
|
// 获取关联的另一个循环节点
|
|
|
|
let relatedNodeId = null;
|
|
|
|
let relatedNodeId = null;
|
|
|
|
|
|
|
|
|
|
|
|
// 类型断言,将component从unknown转换为具有customDef属性的对象
|
|
|
|
// 类型断言,将component从unknown转换为具有customDef属性的对象
|
|
|
|
const component = node.data?.component as { customDef?: string } | undefined;
|
|
|
|
const component = node.data?.component as { customDef?: string } | undefined;
|
|
|
|
|
|
|
|
|
|
|
|
@ -522,7 +533,8 @@ export const useFlowCallbacks = (
|
|
|
|
} catch (e) {
|
|
|
|
} catch (e) {
|
|
|
|
console.error('解析循环开始节点数据失败:', e);
|
|
|
|
console.error('解析循环开始节点数据失败:', e);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else if (node.data?.type === 'LOOP_END' && component?.customDef) {
|
|
|
|
}
|
|
|
|
|
|
|
|
else if (node.data?.type === 'LOOP_END' && component?.customDef) {
|
|
|
|
try {
|
|
|
|
try {
|
|
|
|
const customDef = JSON.parse(component.customDef);
|
|
|
|
const customDef = JSON.parse(component.customDef);
|
|
|
|
relatedNodeId = customDef.loopStartNodeId;
|
|
|
|
relatedNodeId = customDef.loopStartNodeId;
|
|
|
|
@ -533,17 +545,17 @@ export const useFlowCallbacks = (
|
|
|
|
|
|
|
|
|
|
|
|
// 删除两个节点及相关边
|
|
|
|
// 删除两个节点及相关边
|
|
|
|
setNodes((nds: Node[]) => {
|
|
|
|
setNodes((nds: Node[]) => {
|
|
|
|
const updatedNodes = nds.filter((n) =>
|
|
|
|
const updatedNodes = nds.filter((n) =>
|
|
|
|
n.id !== node.id && n.id !== relatedNodeId
|
|
|
|
n.id !== node.id && n.id !== relatedNodeId
|
|
|
|
);
|
|
|
|
);
|
|
|
|
return updatedNodes;
|
|
|
|
return updatedNodes;
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
setEdges((eds: Edge[]) => {
|
|
|
|
setEdges((eds: Edge[]) => {
|
|
|
|
const updatedEdges = eds.filter((e) =>
|
|
|
|
const updatedEdges = eds.filter((e) =>
|
|
|
|
e.source !== node.id &&
|
|
|
|
e.source !== node.id &&
|
|
|
|
e.target !== node.id &&
|
|
|
|
e.target !== node.id &&
|
|
|
|
e.source !== relatedNodeId &&
|
|
|
|
e.source !== relatedNodeId &&
|
|
|
|
e.target !== relatedNodeId
|
|
|
|
e.target !== relatedNodeId
|
|
|
|
);
|
|
|
|
);
|
|
|
|
return updatedEdges;
|
|
|
|
return updatedEdges;
|
|
|
|
@ -551,16 +563,16 @@ export const useFlowCallbacks = (
|
|
|
|
|
|
|
|
|
|
|
|
// 删除节点后记录历史
|
|
|
|
// 删除节点后记录历史
|
|
|
|
setTimeout(() => {
|
|
|
|
setTimeout(() => {
|
|
|
|
const updatedNodes = nodes.filter((n) =>
|
|
|
|
const updatedNodes = nodes.filter((n) =>
|
|
|
|
n.id !== node.id && n.id !== relatedNodeId
|
|
|
|
n.id !== node.id && n.id !== relatedNodeId
|
|
|
|
);
|
|
|
|
);
|
|
|
|
const updatedEdges = edges.filter((e) =>
|
|
|
|
const updatedEdges = edges.filter((e) =>
|
|
|
|
e.source !== node.id &&
|
|
|
|
e.source !== node.id &&
|
|
|
|
e.target !== node.id &&
|
|
|
|
e.target !== node.id &&
|
|
|
|
e.source !== relatedNodeId &&
|
|
|
|
e.source !== relatedNodeId &&
|
|
|
|
e.target !== relatedNodeId
|
|
|
|
e.target !== relatedNodeId
|
|
|
|
);
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
const event = new CustomEvent('takeSnapshot', {
|
|
|
|
const event = new CustomEvent('takeSnapshot', {
|
|
|
|
detail: {
|
|
|
|
detail: {
|
|
|
|
nodes: [...updatedNodes],
|
|
|
|
nodes: [...updatedNodes],
|
|
|
|
@ -569,7 +581,7 @@ export const useFlowCallbacks = (
|
|
|
|
});
|
|
|
|
});
|
|
|
|
document.dispatchEvent(event);
|
|
|
|
document.dispatchEvent(event);
|
|
|
|
}, 0);
|
|
|
|
}, 0);
|
|
|
|
|
|
|
|
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|