]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/xul/staff_client/server/patron/user_edit.js
include (editing disabled) group perms
[Evergreen.git] / Open-ILS / xul / staff_client / server / patron / user_edit.js
1 var cgi;
2 var orgTree;
3 var user;
4 var ses_id;
5 var user_groups = [];
6 var adv_items = [];
7 var user_perms = [];
8 var perm_list = [];
9
10 function set_perm(row) {
11         var pid = findNodeByName(row,'p.code').getAttribute('permid');
12         var papply = findNodeByName(row,'p.id').checked;
13         var pdepth = findNodeByName(row,'p.depth').options[findNodeByName(row,'p.depth').selectedIndex].value;
14         var pgrant = findNodeByName(row,'p.grantable').checked;
15
16         var p;
17         for (var i in user_perms) {
18                 if (user_perms[i].perm() == pid) {
19                         p = user_perms[i];
20                         if (papply) {
21                                 p.isdeleted(0);
22                                 p.ischanged(1);
23                                 p.depth(pdepth);
24                                 p.grantable(pgrant ? 1 : 0);
25                         } else {
26                                 if (p.isnew()) {
27                                         user_perms[i] = null;
28                                 } else {
29                                         p.isdeleted(1);
30                                 }
31                         }
32                         break;
33                 }
34         }
35
36         if (!p) {
37                 if (papply) {
38                         p = new pupm();
39                         p.isnew(1);
40                         p.perm(pid);
41                         p.usr(user.id());
42                         p.depth('' + pdepth);
43                         p.grantable(pgrant ? 1 : 0);
44
45                         user_perms.push(p);
46                 }
47         }
48
49 }
50
51 function save_user () {
52
53         try {
54
55                 for (var i in user_perms) {
56                         if (user_perms[i].depth() == null) {
57                                 var p;
58                                 for (var j in perm_list) {
59                                         if (perm_list[j].id() == user_perms[i].perm()) {
60                                                 p = perm_list[j];
61                                                 break;
62                                         }
63                                 }
64                                 throw "Depth is required on the " + p.code() + " permission.";
65                         }
66                 }
67
68                 var req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.user.permissions.update', ses_id, user_perms );
69                 req.send(true);
70                 var ok = req.getResultObject();
71
72                 if (ok.ilsevent) throw ok;
73
74                 if (ok) {
75                         alert(  'User ' + user.usrname() +
76                                 ' [' + user.card().barcode() + '] ' +
77                                 ' successfully updated.  ' + ok + ' permissions set!');
78                 }
79
80                 init_editor();
81
82         } catch (e) {
83                 dump( js2JSON( e ));
84                 alert( js2JSON( e ));
85         };
86
87
88
89         return false;
90 }
91
92 var adv_mode = true;
93 function apply_adv_mode (root) {
94         adv_items = findNodesByClass(root,'advanced');
95         for (var i in adv_items) {
96                 adv_mode ?
97                         removeCSSClass(adv_items[i], 'hideme') :
98                         addCSSClass(adv_items[i], 'hideme');
99         }
100 }
101
102 function init_editor (u) {
103         
104         var x = document.getElementById('editor').elements;
105         
106         cgi = new CGI();
107         if (cgi.param('adv')) adv_mode = true;
108         apply_adv_mode(document.getElementById('editor'));
109
110         ses_id = cgi.param('ses');
111
112         var usr_id = cgi.param('usr');
113         var usr_barcode = cgi.param('barcode');
114
115         try {
116                 var req;
117                 if (usr_id) {
118                         req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.user.fleshed.retrieve', ses_id, usr_id );
119                 } else {
120                         req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.user.fleshed.retrieve_by_barcode', ses_id, usr_barcode );
121                 }
122                 req.send(true);
123                 user = req.getResultObject();
124         } catch (E) {
125                 alert(E);
126         }
127
128         if (user.usrname()) x['user.usrname'].value = user.usrname();
129         x['user.usrname'].setAttribute('onchange','user.usrname(this.value)');
130
131         if (user.card() && user.card().barcode()) x['user.card.barcode'].value = user.card().barcode();
132         x['user.card.barcode'].setAttribute('onchange','user.card().barcode(this.value)');
133
134         if (user.first_given_name()) x['user.first_given_name'].value = user.first_given_name();
135         x['user.first_given_name'].setAttribute('onchange','user.first_given_name(this.value)');
136
137         if (user.second_given_name()) x['user.second_given_name'].value = user.second_given_name();
138         x['user.second_given_name'].setAttribute('onchange','user.second_given_name(this.value);');
139
140         if (user.family_name()) x['user.family_name'].value = user.family_name();
141         x['user.family_name'].setAttribute('onchange','user.family_name(this.value)');
142
143         req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.permissions.user_perms.retrieve', ses_id );
144         req.send(true);
145         var staff_perms = req.getResultObject();
146
147         user_perms = [];
148         perm_list = [];
149         if (user.id() > 0) {
150                 req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.permissions.user_perms.retrieve', ses_id, user.id() );
151                 req.send(true);
152                 user_perms = req.getResultObject();
153
154                 req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.permissions.retrieve' );
155                 req.send(true);
156                 perm_list = req.getResultObject();
157         }
158
159         f = document.getElementById('permissions');
160         while (f.firstChild) f.removeChild(f.lastChild);
161
162         var rcount = 0;
163         for (var i in perm_list.sort(function(a,b){ if (a.code() < b.code()) return -1;return 1; }))
164                 display_perm(f,perm_list[i],staff_perms, rcount++);
165
166         return true;
167 }
168
169 function display_perm (root,perm_def,staff_perms, r) {
170
171         var prow = findNodeByName(document.getElementById('permission-tmpl'), 'prow').cloneNode(true);
172         root.appendChild(prow);
173
174         var all = false;
175         for (var i in staff_perms) {
176                 if (staff_perms[i].perm() == -1) {
177                         all = true;
178                         break;
179                 }
180         }
181
182
183         var sp,up;
184         if (!all) {
185                 for (var i in staff_perms) {
186                         if (perm_def.id() == staff_perms[i].perm() || staff_perms[i].perm() == -1) {
187                                 sp = staff_perms[i];
188                                 break;
189                         }
190                 }
191         }
192
193         for (var i in user_perms) {
194                 if (perm_def.id() == user_perms[i].perm())
195                         up = user_perms[i];
196         }
197
198
199         var dis = false;
200         if (up.id() < 0 || !sp || !sp.grantable()) dis = true; 
201         if (all) dis = false; 
202
203         var label_cell = findNodeByName(prow,'plabel');
204         findNodeByName(label_cell,'p.code').appendChild(text(perm_def.code()));
205         findNodeByName(label_cell,'p.code').setAttribute('title', perm_def.description());
206         findNodeByName(label_cell,'p.code').setAttribute('permid', perm_def.id());
207         if (r % 2) label_cell.className += ' odd';
208
209         var apply_cell = findNodeByName(prow,'papply');
210         findNodeByName(apply_cell,'p.id').disabled = dis;
211         findNodeByName(apply_cell,'p.id').checked = up ? true : false;
212         if (r % 2) apply_cell.className += ' odd';
213
214         var depth_cell = findNodeByName(prow,'pdepth');
215         findNodeByName(depth_cell,'p.depth').disabled = dis;
216         findNodeByName(depth_cell,'p.depth').id = 'perm-depth-' + perm_def.id();
217         if (r % 2) depth_cell.className += ' odd';
218         selectBuilder(
219                 'perm-depth-' + perm_def.id(),
220                 globalOrgTypes,
221                 (up ? up.depth() : findOrgDepth(user.home_ou())),
222                 { label_field           : 'name',
223                   value_field           : 'depth',
224                   empty_label           : '-- Select One --',
225                   empty_value           : '',
226                   clear                 : true }
227         );
228         
229         var grant_cell = findNodeByName(prow,'pgrant');
230         findNodeByName(grant_cell,'p.grantable').disabled = dis;
231         findNodeByName(grant_cell,'p.grantable').checked = up ? (up.grantable() ? true : false) : false;
232         if (r % 2) grant_cell.className += ' odd';
233
234 }
235
236
237 function selectBuilder (id, objects, def, args) {
238         var label_field = args['label_field'];
239         var value_field = args['value_field'];
240         var depth = args['depth'];
241
242         if (!depth) depth = 0;
243
244         args['depth'] = parseInt(depth) + 1;
245
246         var child_field_name = args['child_field_name'];
247
248         var sel = id;
249         if (typeof sel != 'object')
250                 sel = document.getElementById(sel);
251
252         if (args['clear']) {
253                 for (var o in sel.options) {
254                         sel.options[o] = null;
255                 }
256                 args['clear'] = false;
257                 if (args['empty_label']) {
258                         sel.options[0] = new Option( args['empty_label'], args['empty_value'] );
259                         sel.selectedIndex = 0;
260                 }
261         }
262
263         for (var i in objects) {
264                 var l = objects[i][label_field];
265                 var v = objects[i][value_field];
266
267                 if (typeof l == 'function')
268                         l = objects[i][label_field]();
269
270                 if (typeof v == 'function')
271                         v = objects[i][value_field]();
272
273                 var opt = new Option( l, v );
274
275                 if (depth) {
276                         var d = 10 * depth;
277                         opt.style.paddingLeft = '' + d + 'px';
278                 }
279
280                 sel.options[sel.options.length] = opt;
281
282
283                 if (typeof def == 'object') {
284                         for (var j in def) {
285                                 if (v == def[j]) {
286                                         opt.selected = true;
287                                         sel.value = v;
288                                 }
289                         }
290                 } else {
291                         if (v == def) {
292                                 opt.selected = true;
293                                 sel.value = v;
294                         }
295                 }
296
297                 if (child_field_name) {
298                         var c = objects[i][child_field_name];
299                         if (typeof c == 'function')
300                                 c = objects[i][child_field_name]();
301
302                         selectBuilder(
303                                 id,
304                                 c,
305                                 def,
306                                 { label_field           : args['label_field'],
307                                   value_field           : args['value_field'],
308                                   depth                 : args['depth'],
309                                   child_field_name      : args['child_field_name'] }
310                         );
311                 }
312
313         }
314 }       
315
316 function findNodesByClass(root, nodeClass, list) {
317         if(!list) list = [];
318         if( !root || !nodeClass) {
319                 return null;
320         }
321         
322         if(root.nodeType != 1) {
323                 return null;
324         }
325         
326         if(root.className.match(nodeClass)) list.push( root );
327
328         var children = root.childNodes;
329         
330         for( var i = 0; i != children.length; i++ ) {
331                 findNodesByClass(children[i], nodeClass, list);
332         }                       
333                         
334         return list;            
335 }                                       
336