feat(flow): 添加节点复制粘贴时的应用隔离控制

master
钟良源 3 months ago
parent facbee68c7
commit 7e6d2db561

@ -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;
} }

Loading…
Cancel
Save