Build and flatten a tree, correcting a sorting issue in some OU dropdowns.
authormiker <miker@dcc99617-32d9-48b4-a31d-7c20da2025e4>
Wed, 19 Jan 2011 19:50:47 +0000 (19:50 +0000)
committermiker <miker@dcc99617-32d9-48b4-a31d-7c20da2025e4>
Wed, 19 Jan 2011 19:50:47 +0000 (19:50 +0000)
The previous code assumed that work org units would be delivered in hierarchical order, but alas, they are not.  Thus, we build the hierarchy and then flatten it, sorting at each level.  This will be non-fast with many work OUs, but the common case is a small set, which is not painful.

Further improvement is warranted when the above proves false.

git-svn-id: svn://svn.open-ils.org/ILS/trunk@19208 dcc99617-32d9-48b4-a31d-7c20da2025e4

Open-ILS/xul/staff_client/server/admin/org_unit_settings.js

index a43248c..e7e7243 100644 (file)
@@ -95,30 +95,53 @@ function osDraw(specific_setting) {
     );
 }
 
+function insertTreePath(target,newPath,ifield,cfield) {
+    var newTop = newPath.shift();
+    var child = newPath[0];
+
+    var subtarget = dojo.filter(target[cfield](), function (tc) {return tc[ifield]() == child[ifield]()});
+
+    if (subtarget.length == 0) {
+        target[cfield]().push(child);
+        subtarget = [child];
+    }
+
+    if (newPath.length > 1) insertTreePath(subtarget[0],newPath,ifield,cfield);
+}
+
+function flattenTree(tree,cfield,sort_field,kill_kids,list) {
+    if (!list) list = [];
+    list.push(tree);
+
+    var kids = tree[cfield]();
+    if (sort_field) kids = kids.sort(function (a,b) { return a[sort_field]() > b[sort_field]() });
+
+    dojo.forEach(kids, function (c) { return flattenTree(c,cfield,sort_field,kill_kids,list) });
+
+    if (kill_kids) tree[cfield]([]);
+    return list;
+}
+
 function buildMergedOrgSelector(orgList) {
-    var orgNodeList = [];
+    var orgTree;
     for(var i = 0; i < orgList.length; i++) {
-        // add the work org parents
-        var parents = [];
-        var node = fieldmapper.aou.findOrgUnit(orgList[i]);
+        // add the work org path
+        var node = fieldmapper.aou.findOrgUnit(orgList[i]).clone();
+        node.children([]);
+
+        var path = [node];
         while(node.parent_ou() != null) {
-            node = fieldmapper.aou.findOrgUnit(node.parent_ou());
-            parents.push(node);
+            node = fieldmapper.aou.findOrgUnit(node.parent_ou()).clone();
+            node.children([]);
+            path.push(node);
         }
-        orgNodeList = orgNodeList.concat(parents.reverse());
 
-        // add the work org children
-        orgNodeList = orgNodeList.concat(
-            fieldmapper.aou.descendantNodeList(orgList[i]));
-    }
+        if (!orgTree) orgTree = path[0];
+        insertTreePath(orgTree, path.reverse(), 'id', 'children');
 
-    var list = [];
-    dojo.forEach(orgNodeList, function(item) {
-        if(list.filter(function(i){return (i.id() == item.id())}).length == 0)
-            list.push(item);
-    });
+    }
 
-    var store = new dojo.data.ItemFileReadStore({data:aou.toStoreData(list)});
+    var store = new dojo.data.ItemFileReadStore({data:aou.toStoreData(flattenTree(orgTree, 'children', 'shortname', true))});
     osContextSelector.store = store;
     osContextSelector.startup();
     osContextSelector.setValue(user.user.ws_ou());