]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/web/js/ui/default/staff/services/org.js
LP#1789747 SharedWorker sanity checks
[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','$injector',
22 function($q,  egEnv,  egAuth,  egNet , $injector) { 
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 Number(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 Number(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 Number(n.id())});
98         return list;
99     }
100
101     var egLovefield = null;
102     // returns a promise, resolved with a hash of setting name =>
103     // setting value for the selected org unit.  Org unit defaults to 
104     // auth workstation org unit.
105     service.settings = function(names, ou_id) {
106         if (!egLovefield) {
107             egLovefield = $injector.get('egLovefield');
108         }
109
110         // allow non-array
111         if (!angular.isArray(names)) names = [names];
112
113         if (lf.isOffline) {
114             return egLovefield.getSettingsCache(names).then(
115                 function(settings) {
116                     var hash = {};
117                     angular.forEach(settings, function (s) {
118                         hash[s.name] = s.value;
119                     });
120                     return $q.when(hash);
121                 },
122                 function() {return $q.when({})} // Not Supported
123             );
124         }
125
126
127         if (!egAuth.user()) return $q.when();
128
129         var deferred = $q.defer();
130         ou_id = ou_id || egAuth.user().ws_ou();
131         var here = (ou_id == egAuth.user().ws_ou());
132
133        
134         if (here) { 
135             // only cache org settings retrieved for the current 
136             // workstation org unit.
137             var newNames = [];
138             angular.forEach(names, function(name) {
139                 if (!angular.isDefined(service.cachedSettings[name]))
140                     newNames.push(name)
141             });
142
143             // only retrieve uncached values
144             names = newNames;
145             if (names.length == 0)
146                 return $q.when(service.cachedSettings);
147         }
148
149         egNet.request(
150             'open-ils.actor',
151             'open-ils.actor.ou_setting.ancestor_default.batch',
152             ou_id, names, egAuth.token()
153         ).then(function(blob) {
154             var settings = {};
155             angular.forEach(blob, function(val, key) {
156                 // val is either null or a structure containing the value
157                 settings[key] = val ? val.value : null;
158                 if (here) service.cachedSettings[key] = settings[key];
159             });
160
161             return egLovefield.setSettingsCache(settings).then(
162                 function() {
163                     // resolve with cached settings if 'here', since 'settings'
164                     // will only contain settings we had to retrieve
165                     deferred.resolve(here ? service.cachedSettings : settings);
166                 },
167                 function() {
168                     deferred.resolve(here ? service.cachedSettings : settings);
169                 }
170             );
171         });
172         return deferred.promise;
173     }
174
175     return service;
176 }]);
177