copyNodes while preserving relative positions of selected source nodes
authorJason Etheridge <phasefx@gmail.com>
Mon, 15 May 2023 06:47:18 +0000 (02:47 -0400)
committerJason Etheridge <phasefx@gmail.com>
Thu, 25 May 2023 16:45:32 +0000 (12:45 -0400)
Signed-off-by: Jason Etheridge <phasefx@gmail.com>
Open-ILS/src/eg2/src/app/staff/admin/server/custom-org-unit-trees.component.ts

index b2bba41..3198fac 100644 (file)
@@ -217,18 +217,27 @@ export class CustomOrgUnitTreesComponent implements OnInit {
     }
 
     copyNodes() {
-      const sourceNodes = this.tree.selectedNodes();
-      const targetNode = this.custom_tree.selectedNode();
-      this.copyNodesDisabled = !this.isCopyNodesAllowed();
-      if (this.copyNodesDisabled) {
-          return;
-      }
-      for (let sourceNode of sourceNodes) {
-        // Create a deep copy of sourceNode to prevent reference issues
-        let newNode = JSON.parse(JSON.stringify(sourceNode));
-        newNode.children = [];
-        targetNode.children.push(newNode);
-      }
+        const sourceNodes = this.tree.selectedNodes();
+        const targetNode = this.custom_tree.selectedNode();
+        this.copyNodesDisabled = !this.isCopyNodesAllowed();
+        if (this.copyNodesDisabled) {
+            return;
+        }
+
+        const copySelectedNodes = (sourceNode: TreeNode, targetNode: TreeNode) => {
+            if (sourceNodes.includes(sourceNode)) {
+                let newNode = sourceNode.clone();
+                newNode.children = [];
+                targetNode.children.push(newNode);
+                targetNode = newNode;
+            }
+
+            for (let childNode of sourceNode.children) {
+                copySelectedNodes(childNode, targetNode);
+            }
+        }
+
+        copySelectedNodes(this.tree.rootNode, targetNode);
     }
 
     isDeleteNodesAllowed(): boolean {