]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/web/js/ui/default/staff/services/org.js
LP#1706107: Offline mode
[working/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 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     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)
115                 .then(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         }
123
124         var deferred = $q.defer();
125         ou_id = ou_id || egAuth.user().ws_ou();
126         var here = (ou_id == egAuth.user().ws_ou());
127
128        
129         if (here) { 
130             // only cache org settings retrieved for the current 
131             // workstation org unit.
132             var newNames = [];
133             angular.forEach(names, function(name) {
134                 if (!angular.isDefined(service.cachedSettings[name]))
135                     newNames.push(name)
136             });
137
138             // only retrieve uncached values
139             names = newNames;
140             if (names.length == 0)
141                 return $q.when(service.cachedSettings);
142         }
143
144         egNet.request(
145             'open-ils.actor',
146             'open-ils.actor.ou_setting.ancestor_default.batch',
147             ou_id, names, egAuth.token()
148         ).then(function(blob) {
149             var settings = {};
150             angular.forEach(blob, function(val, key) {
151                 // val is either null or a structure containing the value
152                 settings[key] = val ? val.value : null;
153                 if (here) service.cachedSettings[key] = settings[key];
154             });
155
156             return egLovefield.setSettingsCache(settings).then(function() {
157                 // resolve with cached settings if 'here', since 'settings'
158                 // will only contain settings we had to retrieve
159                 deferred.resolve(here ? service.cachedSettings : settings);
160             });
161         });
162         return deferred.promise;
163     }
164
165     return service;
166 }]);
167