webstaff: add egOrg.root() method
[Evergreen.git] / Open-ILS / web / js / ui / default / staff / services / org.js
1 /**
2  * Core Service - egOrg
3  *
4  * This provides access to the organizational unit tree and
5  * caches it in browser session storage.
6  *
7  * Methods include:
8  *   get()  - retrieve OU based on ID or aou object
9  *   list() - retrieve flattened list of OUs
10  *   tree() - retrieve OU as tree
11  *   root() - get aou object representing root of the OU tree
12  *   ancestors() - get ancestors of supplied OU
13  *   descendants() - get descendants of supplied OU
14  * 
15  * TODO more to document
16  * 
17  */
18 angular.module('egCoreMod')
19
20 .factory('egOrg', 
21        ['$q','egEnv','egAuth','egNet',
22 function($q,  egEnv,  egAuth,  egNet) { 
23
24     var service = {};
25
26     // org unit settings cache.
27     // This allows the caller to avoid local caches
28     service.cachedSettings = {};
29
30     service.get = function(node_or_id) {
31         if (typeof node_or_id == 'object')
32             return node_or_id;
33         return egEnv.aou.map[node_or_id];
34     };
35
36     service.list = function() {
37         return egEnv.aou.list;
38     };
39
40     service.tree = function() {
41         return egEnv.aou.tree;
42     }
43
44     // get the root OU
45     service.root = function() {
46         return egEnv.aou.list[0];
47     }
48
49     // list of org_unit objects or IDs for ancestors + me
50     service.ancestors = function(node_or_id, as_id) {
51         var node = service.get(node_or_id);
52         if (!node) return [];
53         var nodes = [node];
54         while( (node = service.get(node.parent_ou())))
55             nodes.push(node);
56         if (as_id) 
57             return nodes.map(function(n){return n.id()});
58         return nodes;
59     };
60
61     // tests that a node can have users
62     service.CanHaveUsers = function(node_or_id) {
63         return service
64             .get(node_or_id)
65             .ou_type()
66             .can_have_users() == 't';
67     }
68
69     // tests that a node can have volumes
70     service.CanHaveVolumes = function(node_or_id) {
71         return service
72             .get(node_or_id)
73             .ou_type()
74             .can_have_vols() == 't';
75     }
76
77     // list of org_unit objects  or IDs for me + descendants
78     service.descendants = function(node_or_id, as_id) {
79         var node = service.get(node_or_id);
80         if (!node) return [];
81         var nodes = [];
82         function descend(n) {
83             nodes.push(n);
84             angular.forEach(n.children(), descend);
85         }
86         descend(node);
87         if (as_id) 
88             return nodes.map(function(n){return n.id()});
89         return nodes;
90     }
91
92     // list of org_unit objects or IDs for ancestors + me + descendants
93     service.fullPath = function(node_or_id, as_id) {
94         var list = service.ancestors(node_or_id).concat(
95           service.descendants(node_or_id).slice(1));
96         if (as_id) 
97             return list.map(function(n){return n.id()});
98         return list;
99     }
100
101     // returns a promise, resolved with a hash of setting name =>
102     // setting value for the selected org unit.  Org unit defaults to 
103     // auth workstation org unit.
104     service.settings = function(names, ou_id) {
105         var deferred = $q.defer();
106         ou_id = ou_id || egAuth.user().ws_ou();
107         var here = (ou_id == egAuth.user().ws_ou());
108
109         // allow non-array
110         if (!angular.isArray(names)) names = [names];
111         
112         if (here) { 
113             // only cache org settings retrieved for the current 
114             // workstation org unit.
115             var newNames = [];
116             angular.forEach(names, function(name) {
117                 if (!angular.isDefined(service.cachedSettings[name]))
118                     newNames.push(name)
119             });
120
121             // only retrieve uncached values
122             names = newNames;
123             if (names.length == 0)
124                 return $q.when(service.cachedSettings);
125         }
126
127         egNet.request(
128             'open-ils.actor',
129             'open-ils.actor.ou_setting.ancestor_default.batch',
130             ou_id, names, egAuth.token()
131         ).then(function(blob) {
132             var settings = {};
133             angular.forEach(blob, function(val, key) {
134                 // val is either null or a structure containing the value
135                 settings[key] = val ? val.value : null;
136                 if (here) service.cachedSettings[key] = settings[key];
137             });
138
139             // resolve with cached settings if 'here', since 'settings'
140             // will only contain settings we had to retrieve
141             deferred.resolve(here ? service.cachedSettings : settings);
142         });
143         return deferred.promise;
144     }
145
146     return service;
147 }]);
148