custom org tree : admin ui
authorBill Erickson <berick@esilibrary.com>
Wed, 21 Mar 2012 15:14:41 +0000 (11:14 -0400)
committerBill Erickson <berick@esilibrary.com>
Wed, 21 Mar 2012 18:19:37 +0000 (14:19 -0400)
Signed-off-by: Bill Erickson <berick@esilibrary.com>
Open-ILS/web/js/ui/default/conify/global/actor/org_unit_custom_tree.js

index 514f07a..96e004a 100644 (file)
@@ -11,10 +11,13 @@ dojo.require('openils.User');
 dojo.require('openils.Util');
 dojo.require('openils.PermaCrud');
 
-var realTree;
-var magicTree;
+var realTree; // dijit.Tree
+var magicTree; // dijit.Tree
+var magicTreeId; // aouct id
 var pcrud;
 var virtId = -1;
+var realOrgList = [];
+var ctNodes = [];
 
 dojo.declare(
     'openils.actor.OrgUnitCustomTreeSource', dijit._tree.dndSource, {
@@ -33,12 +36,12 @@ dojo.declare(
 function drawPage() {
     pcrud = new openils.PermaCrud({authtoken : openils.User.authtoken});
 
-    // real org unit list
-    var orgList = openils.Util.objectValues(
+    // real org unit list.  Not write-able.  Used only as a source.
+    realOrgList = openils.Util.objectValues(
         fieldmapper.aou.OrgCache).map(function(obj) { return obj.org });
 
     var store = new dojo.data.ItemFileReadStore(
-        {data : fieldmapper.aou.toStoreData(orgList)});
+        {data : fieldmapper.aou.toStoreData(realOrgList)});
             
     var model = new dijit.tree.TreeStoreModel({
         store: store,
@@ -60,41 +63,43 @@ function drawPage() {
 }
 
 
-/**
- * The magicTree is composed of aouctn items and uses the 
- * linked org unit shortname as the tree item label
- */
+// composed of org units.  Write-able.
 function drawMagicTree() {
 
-    var orgList = [];
-    var query = {};
+    var orgList = realOrgList;
+    var query = {_top : 'true'};
 
     var mTree = pcrud.search('aouct', 
-        {active : 't', purpose : treePurposeSelector.attr('value')});
-    
+        {purpose : treePurposeSelector.attr('value')});
+
     if (mTree.length) {
-        nodes = pcrud.search('aouctn', {tree : mTree[0].id()});
-
-        // create an org tree from the custom tree nodes
-        dojo.forEach(nodes, 
-            function(node) {
-                var org = JSON2js(js2JSON( // deep clone
-                    fieldmapper.aou.findOrgUnit(node.org_unit())
-                ));
-                org.parent_ou(null);
-                org.children([]);
-                if (node.parent_node()) {
-                    org.parent_ou(
-                        nodes.filter(
-                            function(n) {return n.id() == node.parent_node()}
-                        )[0].org_unit()
-                    );
+        magicTreeId = mTree[0].id();
+        ctNodes = pcrud.search('aouctn', {tree : magicTreeId});
+        if (ctNodes.length) {
+            orgList = [];
+            // create an org tree from the custom tree nodes
+           
+            dojo.forEach(ctNodes, 
+                function(node) {
+                    // deep clone to avoid globalOrgTree clobbering
+                    var org = JSON2js(js2JSON( 
+                        fieldmapper.aou.findOrgUnit(node.org_unit())
+                    ));
+                    org.parent_ou(null);
+                    org.children([]);
+                    if (node.parent_node()) {
+                        org.parent_ou(
+                            ctNodes.filter(
+                                function(n) {return n.id() == node.parent_node()}
+                            )[0].org_unit()
+                        );
+                    }
+                    orgList.push(org);
                 }
-                orgList.push(org);
-            }
-        );
-        var root = nodes.filter(function(n) {return n.parent_node() == null})[0];
-        query = {id : root.org_unit()+''}
+            );
+            var root = ctNodes.filter(function(n) {return n.parent_node() == null})[0];
+            query = {id : root.org_unit()+''}
+        }
     }
 
     var store = new dojo.data.ItemFileWriteStore(
@@ -120,19 +125,62 @@ function drawMagicTree() {
     magicTree.expandAll();
 }
 
+// 1. translate the dijit.tree nodes into aouctn's
+// 2. delete the existing aouctn's
+// 3. create the new aouctn's
 function applyChanges() {
-    var list = [];
-    function traverse(pnode, node) {
+    if (ctNodes.length) { 
+        console.log('Deleting ' + ctNodes.length + ' nodes');
+        pcrud.eliminate(ctNodes, {oncomplete : applyChanges2});
+    } else {
+        applyChanges2();
+    }
+}
+
+
+function applyChanges2() {
+    ctNodes = [];
+    var newCtNodes = [];
+    var sorder = 0;
+    var prevTn;
+
+    // extract the tree structure creating new aoucnt's as we go
+    function traverseAndCreate(pnode, node) {
         var item = node.item;
-        list.push({
-            name : item.name,
-            org_id : item.id,
-            parent_node : pnode ? pnode.item.id : null
+
+        var tn = new fieldmapper.aouctn();
+        tn.tree(magicTreeId);
+        tn.org_unit(item.id[0])
+        console.log("Traversing node for org unit " + tn.org_unit());
+
+        if (pnode) {
+            // find the newly created parent node and extract the ID 
+            var ptn = ctNodes.filter(function(n) {
+                return n.org_unit() == pnode.item.id[0]})[0];
+            tn.parent_node(ptn.id());
+        }
+
+        // if the last node was our previous sibling
+        if (prevTn && prevTn.parent_node() == tn.parent_node()) {
+            tn.sibling_order(++sorder);
+        } else { sorder = 0; }
+
+        // create the new node, then process the children
+        pcrud.create(tn, {
+            oncomplete : function(r, objs) {
+                var newTn = objs[0];
+                ctNodes.push(newTn);
+                prevTn = newTn;
+                dojo.forEach(node.getChildren(), 
+                    function(child) {
+                        traverseAndCreate(node, child)
+                    }
+                );
+            }
         });
-        dojo.forEach(node.getChildren(), function(child) {traverse(node, child)});
     }
-    traverse(null, magicTree.rootNode);
-    console.log(js2JSON(list));
+
+    traverseAndCreate(null, magicTree.rootNode);
 }