1 dojo.require('dijit.form.Button');
2 dojo.require('dijit.form.FilteringSelect');
3 dojo.require('dojo.data.ItemFileReadStore');
4 dojo.require('dojo.data.ItemFileWriteStore');
5 dojo.require('dijit.Tree');
6 dojo.require('dijit.tree.TreeStoreModel');
7 dojo.require("dijit._tree.dndSource");
8 dojo.require('fieldmapper.Fieldmapper');
9 dojo.require('fieldmapper.OrgUtils');
10 dojo.require('openils.User');
11 dojo.require('openils.Util');
12 dojo.require('openils.PermaCrud');
13 dojo.require('openils.widget.ProgressDialog');
15 var realTree; // dijit.Tree
16 var magicTree; // dijit.Tree
17 var mTree; // aouct object
24 'openils.actor.OrgUnitCustomTreeSource', dijit._tree.dndSource, {
25 itemCreator : function(nodes, etc) {
26 var items = this.inherited(arguments);
27 dojo.forEach(items, function(item) {item.shortname = item.name});
33 'openils.actor.OrgUnitCustomTreeStoreModel', dijit.tree.TreeStoreModel, {
34 mayHaveChildren : function(item) { return true },
38 pcrud = new openils.PermaCrud({authtoken : openils.User.authtoken});
40 // real org unit list. Not write-able. Used only as a source.
41 realOrgList = openils.Util.objectValues(
42 fieldmapper.aou.OrgCache).map(function(obj) { return obj.org });
44 var store = new dojo.data.ItemFileReadStore(
45 {data : fieldmapper.aou.toStoreData(realOrgList)});
47 var model = new dijit.tree.TreeStoreModel({
49 query: {_top : 'true'}
52 realTree = new dijit.Tree(
54 expandAll: function() {treeDoAll(this)},
55 collapseAll: function() {treeDoAll(this, true)},
56 dndController : dijit._tree.dndSource,
67 // composed of org units. Write-able.
68 function drawMagicTree() {
69 var orgList = realOrgList;
70 var query = {_top : 'true'};
72 var mTreeRes = pcrud.search('aouct',
73 {purpose : treePurposeSelector.attr('value')});
75 if (mTreeRes.length) {
77 if (openils.Util.isTrue(mTree.active())) {
78 openils.Util.hide(dojo.byId('activate-tree'));
79 openils.Util.show(dojo.byId('deactivate-tree'), 'inline');
81 ctNodes = pcrud.search('aouctn', {tree : mTree.id()});
84 // create an org tree from the custom tree nodes
88 // deep clone to avoid globalOrgTree clobbering
89 var org = JSON2js(js2JSON(
90 fieldmapper.aou.findOrgUnit(node.org_unit())
94 if (node.parent_node()) {
97 function(n) {return n.id() == node.parent_node()}
104 var root = ctNodes.filter(function(n) {return n.parent_node() == null})[0];
105 query = {id : root.org_unit()+''}
109 mTree = new fieldmapper.aouct();
111 mTree.purpose(treePurposeSelector.attr('value'));
115 var store = new dojo.data.ItemFileWriteStore(
116 {data : fieldmapper.aou.toStoreData(orgList)});
118 var model = new openils.actor.OrgUnitCustomTreeStoreModel({
123 magicTree = new dijit.Tree(
125 expandAll: function() {treeDoAll(this)},
126 collapseAll: function() {treeDoAll(this, true)},
127 dndController : openils.actor.OrgUnitCustomTreeSource,
129 betweenThreshold : 5,
135 magicTree.expandAll();
138 // 1. create the tree if necessary
139 // 2. translate the dijit.tree nodes into aouctn's
140 // 3. delete the existing aouctn's
141 // 4. create the new aouctn's
142 function applyChanges() {
143 progressDialog.show();
147 pcrud.create(mTree, {
148 oncomplete : function(r, objs) {
155 if (ctNodes.length) {
156 console.log('Deleting ' + ctNodes.length + ' nodes');
157 pcrud.eliminate(ctNodes, {oncomplete : applyChanges2});
164 function applyChanges2() {
172 function flatten(node) {
174 dojo.forEach(node.getChildren(), flatten);
176 flatten(magicTree.rootNode);
178 // traverse the nodes, creating new aoucnt's as we go
179 function traverseAndCreate(node) {
180 var item = node.item;
182 var tn = new fieldmapper.aouctn();
184 tn.org_unit(item.id[0])
186 var pnode = node.getParent();
188 // find the newly created parent node and extract the ID
189 var ptn = ctNodes.filter(function(n) {
190 return n.org_unit() == pnode.item.id[0]})[0];
191 tn.parent_node(ptn.id());
194 // if the last node was our previous sibling
195 if (prevTn && prevTn.parent_node() == tn.parent_node()) {
196 tn.sibling_order(++sorder);
197 } else { sorder = 0; }
199 console.log("Creating new node for org unit " + tn.org_unit());
201 // create the new node, then process the children
203 oncomplete : function(r, objs) {
207 if (nodeList.length == 0) {
208 progressDialog.hide();
209 location.href = location.href;
211 progressDialog.update({maximum : nodeList.length, progress : ++progress});
212 traverseAndCreate(nodeList.shift());
217 traverseAndCreate(nodeList.shift());
220 function deleteSelected() {
223 function collectChildren(item) {
225 magicTree.model.store.fetch({
226 query : {parent_ou : item.id[0]+''},
227 onComplete : function(list) {
228 dojo.forEach(list, collectChildren)
233 magicTree.dndController.getSelectedItems().forEach(
235 if (item === magicTree.model.root) return
236 collectChildren(item);
237 // delete node plus children, starting at the leaf nodes
238 dojo.forEach(toDelete.reverse(),
240 console.log('Deleting item ' + i.id);
241 magicTree.model.store.deleteItem(i)
248 function activateTree() {
252 // before the tree exists, we can only activate the local copy
253 // the next save event will activate it
254 openils.Util.hide(dojo.byId('activate-tree'));
255 openils.Util.show(dojo.byId('deactivate-tree'), 'inline');
259 pcrud.update(mTree, {
260 oncomplete : function() {
261 openils.Util.hide(dojo.byId('activate-tree'));
262 openils.Util.show(dojo.byId('deactivate-tree'), 'inline');
267 function deactivateTree() {
271 openils.Util.hide(dojo.byId('deactivate-tree'));
272 openils.Util.show(dojo.byId('activate-tree'), 'inline');
276 pcrud.update(mTree, {
277 oncomplete : function() {
278 openils.Util.hide(dojo.byId('deactivate-tree'));
279 openils.Util.show(dojo.byId('activate-tree'), 'inline');
285 // http://stackoverflow.com/questions/2161032/expanding-all-nodes-in-dijit-tree
286 function treeDoAll(tree, collapse) {
287 function expand(node) {
288 if (collapse) tree._collapseNode(node);
289 else tree._expandNode(node);
290 var childBranches = dojo.filter(node.getChildren() || [],
291 function(node) { return node.isExpandable });
292 var def = new dojo.Deferred();
293 defs = dojo.map(childBranches, expand);
295 return expand(tree.rootNode);
298 openils.Util.addOnLoad(drawPage);