From: Bill Erickson Date: Wed, 21 Mar 2012 15:14:41 +0000 (-0400) Subject: custom org tree : admin ui X-Git-Url: https://old-git.evergreen-ils.org/?a=commitdiff_plain;h=8310c7d28ab1d77b9596ffd45c7c015ca406f890;p=evergreen%2Fequinox.git custom org tree : admin ui Signed-off-by: Bill Erickson --- diff --git a/Open-ILS/web/js/ui/default/conify/global/actor/org_unit_custom_tree.js b/Open-ILS/web/js/ui/default/conify/global/actor/org_unit_custom_tree.js index 514f07a088..96e004a5fc 100644 --- a/Open-ILS/web/js/ui/default/conify/global/actor/org_unit_custom_tree.js +++ b/Open-ILS/web/js/ui/default/conify/global/actor/org_unit_custom_tree.js @@ -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); }