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, {
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,
}
-/**
- * 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(
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);
}