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