|
|
|
@@ -715,6 +715,108 @@ export const useNodesInteractions = () => { |
|
|
|
handleSyncWorkflowDraft() |
|
|
|
}, [store, handleSyncWorkflowDraft, getNodesReadOnly, t]) |
|
|
|
|
|
|
|
const handleNodeCopySelected = useCallback((): undefined | Node[] => { |
|
|
|
if (getNodesReadOnly()) |
|
|
|
return |
|
|
|
|
|
|
|
const { |
|
|
|
setClipboardElements, |
|
|
|
} = workflowStore.getState() |
|
|
|
|
|
|
|
const { |
|
|
|
getNodes, |
|
|
|
} = store.getState() |
|
|
|
|
|
|
|
const nodes = getNodes() |
|
|
|
const nodesToCopy = nodes.filter(node => node.data.selected) |
|
|
|
|
|
|
|
setClipboardElements(nodesToCopy) |
|
|
|
|
|
|
|
return nodesToCopy |
|
|
|
}, [getNodesReadOnly, store, workflowStore]) |
|
|
|
|
|
|
|
const handleNodePaste = useCallback((): undefined | Node[] => { |
|
|
|
if (getNodesReadOnly()) |
|
|
|
return |
|
|
|
|
|
|
|
const { |
|
|
|
clipboardElements, |
|
|
|
} = workflowStore.getState() |
|
|
|
|
|
|
|
const { |
|
|
|
getNodes, |
|
|
|
setNodes, |
|
|
|
} = store.getState() |
|
|
|
|
|
|
|
const nodesToPaste: Node[] = [] |
|
|
|
const nodes = getNodes() |
|
|
|
|
|
|
|
for (const nodeToPaste of clipboardElements) { |
|
|
|
const nodeType = nodeToPaste.data.type |
|
|
|
const nodesWithSameType = nodes.filter(node => node.data.type === nodeType) |
|
|
|
|
|
|
|
const newNode = generateNewNode({ |
|
|
|
data: { |
|
|
|
...NODES_INITIAL_DATA[nodeType], |
|
|
|
...nodeToPaste.data, |
|
|
|
_connectedSourceHandleIds: [], |
|
|
|
_connectedTargetHandleIds: [], |
|
|
|
title: nodesWithSameType.length > 0 ? `${t(`workflow.blocks.${nodeType}`)} ${nodesWithSameType.length + 1}` : t(`workflow.blocks.${nodeType}`), |
|
|
|
selected: true, |
|
|
|
}, |
|
|
|
position: { |
|
|
|
x: nodeToPaste.position.x + 10, |
|
|
|
y: nodeToPaste.position.y + 10, |
|
|
|
}, |
|
|
|
}) |
|
|
|
nodesToPaste.push(newNode) |
|
|
|
} |
|
|
|
|
|
|
|
setNodes([...nodes.map((n: Node) => ({ ...n, selected: false, data: { ...n.data, selected: false } })), ...nodesToPaste]) |
|
|
|
|
|
|
|
handleSyncWorkflowDraft() |
|
|
|
|
|
|
|
return nodesToPaste |
|
|
|
}, [getNodesReadOnly, handleSyncWorkflowDraft, store, t, workflowStore]) |
|
|
|
|
|
|
|
const handleNodeDuplicateSelected = useCallback(() => { |
|
|
|
if (getNodesReadOnly()) |
|
|
|
return |
|
|
|
|
|
|
|
handleNodeCopySelected() |
|
|
|
handleNodePaste() |
|
|
|
}, [getNodesReadOnly, handleNodeCopySelected, handleNodePaste]) |
|
|
|
|
|
|
|
const handleNodeCut = useCallback(() => { |
|
|
|
if (getNodesReadOnly()) |
|
|
|
return |
|
|
|
|
|
|
|
const nodesToCut = handleNodeCopySelected() |
|
|
|
if (!nodesToCut) |
|
|
|
return |
|
|
|
|
|
|
|
for (const node of nodesToCut) |
|
|
|
handleNodeDelete(node.id) |
|
|
|
}, [getNodesReadOnly, handleNodeCopySelected, handleNodeDelete]) |
|
|
|
|
|
|
|
const handleNodeDeleteSelected = useCallback(() => { |
|
|
|
if (getNodesReadOnly()) |
|
|
|
return |
|
|
|
|
|
|
|
const { |
|
|
|
getNodes, |
|
|
|
} = store.getState() |
|
|
|
|
|
|
|
const nodes = getNodes() |
|
|
|
const nodesToDelete = nodes.filter(node => node.data.selected) |
|
|
|
|
|
|
|
if (!nodesToDelete) |
|
|
|
return |
|
|
|
|
|
|
|
for (const node of nodesToDelete) |
|
|
|
handleNodeDelete(node.id) |
|
|
|
}, [getNodesReadOnly, handleNodeDelete, store]) |
|
|
|
|
|
|
|
return { |
|
|
|
handleNodeDragStart, |
|
|
|
handleNodeDrag, |
|
|
|
@@ -729,5 +831,10 @@ export const useNodesInteractions = () => { |
|
|
|
handleNodeDelete, |
|
|
|
handleNodeChange, |
|
|
|
handleNodeAdd, |
|
|
|
handleNodeDuplicateSelected, |
|
|
|
handleNodeCopySelected, |
|
|
|
handleNodeCut, |
|
|
|
handleNodeDeleteSelected, |
|
|
|
handleNodePaste, |
|
|
|
} |
|
|
|
} |