Browse Source

feat: copy and paste block

Ahmad Kholid 3 years ago
parent
commit
2fec9f0b97
2 changed files with 30 additions and 8 deletions
  1. 29 8
      src/components/newtab/workflow/WorkflowBuilder.vue
  2. 1 0
      src/store/index.js

+ 29 - 8
src/components/newtab/workflow/WorkflowBuilder.vue

@@ -322,7 +322,7 @@ export default {
       selectedElements = [];
       activeNode = null;
     }
-    function duplicateBlock(nodeId) {
+    function duplicateBlock(nodeId, isPaste = false) {
       const nodes = new Map();
       const addNode = (id) => {
         const node = editor.value.getNodeFromId(id);
@@ -332,14 +332,20 @@ export default {
         nodes.set(node.id, node);
       };
 
-      if (nodeId) addNode(nodeId);
-      else if (activeNode) addNode(activeNode.id);
+      if (isPaste) {
+        store.state.copiedNodes.forEach((node) => {
+          nodes.set(node.id, node);
+        });
+      } else {
+        if (nodeId) addNode(nodeId);
+        else if (activeNode) addNode(activeNode.id);
 
-      selectedElements.forEach((node) => {
-        if (activeNode?.id === node.id || nodeId === node.id) return;
+        selectedElements.forEach((node) => {
+          if (activeNode?.id === node.id || nodeId === node.id) return;
 
-        addNode(node.id);
-      });
+          addNode(node.id);
+        });
+      }
 
       const nodesOutputs = [];
 
@@ -545,7 +551,22 @@ export default {
         selectedElements.push(nodeProperties);
       }
     }
-    function onKeyup({ key, target }) {
+    function onKeyup({ key, target, ctrlKey }) {
+      if (ctrlKey) {
+        if (key === 'c') {
+          const nodes = selectedElements.map((node) =>
+            editor.value.getNodeFromId(node.id)
+          );
+
+          store.commit('updateState', {
+            key: 'copiedNodes',
+            value: nodes,
+          });
+        } else if (key === 'v') {
+          duplicateBlock(null, true);
+        }
+      }
+
       const isAnInput =
         ['INPUT', 'TEXTAREA'].includes(target.tagName) ||
         target.isContentEditable;

+ 1 - 0
src/store/index.js

@@ -19,6 +19,7 @@ const store = createStore({
     hostWorkflows: {},
     sharedWorkflows: {},
     workflowHosts: {},
+    copiedNodes: [],
     settings: {
       locale: 'en',
       deleteLogAfter: 30,