From 8315c61541f989184fc36b65bd9c2c526483fa67 Mon Sep 17 00:00:00 2001 From: stone Date: Tue, 18 Feb 2025 19:22:13 +0800 Subject: [PATCH 01/10] feat: Implement copy/paste functionality for nodes and edges --- .../components/DataStory/DataStoryCanvas.tsx | 34 +++- .../DataStory/controls/useCopyPaste.ts | 164 ++++++++++++++++++ 2 files changed, 194 insertions(+), 4 deletions(-) create mode 100644 packages/ui/src/components/DataStory/controls/useCopyPaste.ts diff --git a/packages/ui/src/components/DataStory/DataStoryCanvas.tsx b/packages/ui/src/components/DataStory/DataStoryCanvas.tsx index f44cb10e..2d437034 100644 --- a/packages/ui/src/components/DataStory/DataStoryCanvas.tsx +++ b/packages/ui/src/components/DataStory/DataStoryCanvas.tsx @@ -27,6 +27,7 @@ import { getNodesWithNewSelection } from './getNodesWithNewSelection'; import { createDataStoryId, LinkCount, LinkId, NodeStatus, RequestObserverType } from '@data-story/core'; import { useDragNode } from './useDragNode'; import { ReactFlowNode } from '../Node/ReactFlowNode'; +import useCopyPaste from './controls/useCopyPaste'; const nodeTypes = { commentNodeComponent: CommentNodeComponent, @@ -53,7 +54,7 @@ export const DataStoryCanvas = React.memo(DataStoryCanvasComponent); const Flow = ({ initDiagram, - controls, + controls = [], onInitialize, setSidebarKey, onSave, @@ -187,7 +188,7 @@ const Flow = ({ edges, }); - const getOnNodesDelete = useCallback((nodesToDelete: ReactFlowNode[]) => { + const getOnNodesDelete = useCallback((nodesToDelete: ReactFlowNode[]) => { nodesToDelete.forEach(node => { const store = reactFlowStore.getState(); const { edges } = store; @@ -214,6 +215,11 @@ const Flow = ({ focusOnFlow(); }, [connect, focusOnFlow, reactFlowStore]); + const { cut, copy, paste, bufferedNodes } = useCopyPaste(); + + const canCopy = nodes.some(({ selected }) => selected); + const canPaste = bufferedNodes.length > 0; + return ( <>