]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/xul/staff_client/server/patron/user_edit.js
bah ... no implicit return from javascript function
[working/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 var ou_type_list = [];
10 var user_work_ous = [];
11 var work_ou_list = [];
12
13 function set_work_ou(row) {
14         var wid = findNodeByName(row,'a.name').getAttribute('workou_id');
15         var wapply = findNodeByName(row,'p.id').checked;
16
17         var w;
18         for (var i in user_work_ous) {
19                 if (user_work_ous[i].work_ou() == wid) {
20                         w = user_work_ous[i];
21                         if (wapply) {
22                                 w.isdeleted(0);
23                                 w.ischanged(1);
24                         } else {
25                                 if (w.isnew()) {
26                                         user_work_ous[i] = null;
27                                 } else {
28                                         w.isdeleted(1);
29                                 }
30                         }
31                         break;
32                 }
33         }
34
35         if (!w) {
36                 if (wapply) {
37                         p = new puwoum();
38                         p.isnew(1);
39                         p.work_ou(wid);
40                         p.usr(user.id());
41
42                         user_work_ous.push(p);
43                 }
44         }
45
46 }
47
48 function set_perm(row) {
49         var pid = findNodeByName(row,'p.code').getAttribute('permid');
50         var papply = findNodeByName(row,'p.id').checked;
51         var pdepth = findNodeByName(row,'p.depth').options[findNodeByName(row,'p.depth').selectedIndex].value;
52         var pgrant = findNodeByName(row,'p.grantable').checked;
53
54         var p;
55         for (var i in user_perms) {
56                 if (user_perms[i].perm() == pid) {
57                         p = user_perms[i];
58                         if (papply) {
59                                 p.isdeleted(0);
60                                 p.ischanged(1);
61                                 p.depth(pdepth);
62                                 p.grantable(pgrant ? 1 : 0);
63                         } else {
64                                 if (p.isnew()) {
65                                         user_perms[i] = null;
66                                 } else {
67                                         p.isdeleted(1);
68                                 }
69                         }
70                         break;
71                 }
72         }
73
74         if (!p) {
75                 if (papply) {
76                         p = new pupm();
77                         p.isnew(1);
78                         p.perm(pid);
79                         p.usr(user.id());
80                         p.depth('' + pdepth);
81                         p.grantable(pgrant ? 1 : 0);
82
83                         user_perms.push(p);
84                 }
85         }
86
87 }
88
89 function save_user () {
90
91         try {
92
93                 var save_perms = [];
94                 for (var i in user_perms) {
95                         // Group based perm? skip it.
96                         if (user_perms[i].id() < 0) continue;
97
98                         if (user_perms[i].depth() == null) {
99                                 var p;
100                                 for (var j in perm_list) {
101                                         if (perm_list[j].id() == user_perms[i].perm()) {
102                                                 p = perm_list[j];
103                                                 break;
104                                         }
105                                 }
106                                 throw "Depth is required on the " + p.code() + " permission.";
107                         }
108
109                         save_perms.push( user_perms[i] );
110                 }
111
112                 var req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.user.permissions.update', ses_id, save_perms );
113                 req.send(true);
114                 var ok = req.getResultObject();
115
116                 if (ok.ilsevent) throw ok;
117
118                 if (ok) {
119                         alert(  'User ' + user.usrname() +
120                                 ' [' + user.card().barcode() + '] ' +
121                                 ' successfully updated.  ' + ok + ' permissions set!');
122                 }
123
124                 init_editor();
125
126         } catch (e) {
127                 dump( js2JSON( e ));
128                 alert( js2JSON( e ));
129         };
130
131
132
133         return false;
134 }
135
136 var adv_mode = true;
137 function apply_adv_mode (root) {
138         adv_items = findNodesByClass(root,'advanced');
139         for (var i in adv_items) {
140                 adv_mode ?
141                         removeCSSClass(adv_items[i], 'hideme') :
142                         addCSSClass(adv_items[i], 'hideme');
143         }
144 }
145
146 function init_editor (u) {
147         
148         var x = document.getElementById('editor').elements;
149         
150         cgi = new CGI();
151         if (cgi.param('adv')) adv_mode = true; 
152         if (xulG) if (xulG.adv) adv_mode = true;
153         if (xulG) if (xulG.params) if (xulG.params.adv) adv_mode = true;
154         apply_adv_mode(document.getElementById('editor'));
155
156         ses_id = cgi.param('ses'); 
157         if (xulG) if (xulG.ses) ses_id = xulG.ses;
158         if (xulG) if (xulG.params) if (xulG.params.ses) ses_id = xulG.params.ses;
159
160         var usr_id = cgi.param('usr'); 
161         if (xulG) if (xulG.usr_id) usr_id = xulG.usr_id;
162         if (xulG) if (xulG.params) if (xulG.params.usr_id) usr_id = xulG.params.usr_id;
163
164         var usr_barcode = cgi.param('barcode'); 
165         if (xulG) if (xulG.usr_barcode) usr_ibarcode = xulG.usr_barcode;
166         if (xulG) if (xulG.params) if (xulG.params.usr_barcode) usr_ibarcode = xulG.params.usr_barcode;
167
168         try {
169                 var req;
170                 if (usr_id) {
171                         req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.user.fleshed.retrieve', ses_id, usr_id );
172                 } else {
173                         req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.user.fleshed.retrieve_by_barcode', ses_id, usr_barcode );
174                 }
175                 req.send(true);
176                 user = req.getResultObject();
177         } catch (E) {
178                 alert(E);
179         }
180
181         if (user.usrname()) x['user.usrname'].value = user.usrname();
182         x['user.usrname'].setAttribute('onchange','user.usrname(this.value)');
183
184         if (user.card() && user.card().barcode()) x['user.card.barcode'].value = user.card().barcode();
185         x['user.card.barcode'].setAttribute('onchange','user.card().barcode(this.value)');
186
187         if (user.first_given_name()) x['user.first_given_name'].value = user.first_given_name();
188         x['user.first_given_name'].setAttribute('onchange','user.first_given_name(this.value)');
189
190         if (user.second_given_name()) x['user.second_given_name'].value = user.second_given_name();
191         x['user.second_given_name'].setAttribute('onchange','user.second_given_name(this.value);');
192
193         if (user.family_name()) x['user.family_name'].value = user.family_name();
194         x['user.family_name'].setAttribute('onchange','user.family_name(this.value)');
195
196         // grab the editing staff user object
197         req = new RemoteRequest( 'open-ils.auth', 'open-ils.auth.session.retrieve', ses_id );
198         req.send(true);
199         var staff = req.getResultObject();
200
201         req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.permissions.user_perms.retrieve', ses_id );
202         req.send(true);
203         var staff_perms = req.getResultObject();
204
205         // Get the top of the staff perm org for ASSIGN_WORK_ORG_UNIT
206         req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.user.perm.highest_org', ses_id, staff.id(), 'ASSIGN_WORK_ORG_UNIT' );
207         req.send(true);
208         var top_work_ou = req.getResultObject();
209
210         // and now, the orgs where this staff member can apply the perms
211         req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.org_tree.descendants.retrieve', top_work_ou);
212         req.send(true);
213         var work_ou_tree = req.getResultObject();
214
215         // and now, the orgs where this staff member can apply the perms
216         req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.user.get_work_ous', ses_id, user.id());
217         req.send(true);
218         user_work_ous = req.getResultObject();
219
220         // and finally, the ou types
221         req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.org_types.retrieve' );
222         req.send(true);
223         ou_type_list = req.getResultObject();
224
225         user_perms = [];
226         perm_list = [];
227         if (user.id() > 0) {
228                 req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.permissions.user_perms.retrieve', ses_id, user.id() );
229                 req.send(true);
230                 user_perms = req.getResultObject();
231
232                 req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.permissions.retrieve' );
233                 req.send(true);
234                 perm_list = req.getResultObject();
235         }
236
237         f = document.getElementById('permissions');
238         while (f.firstChild) f.removeChild(f.lastChild);
239
240         var rcount = 0;
241         for (var i in perm_list.sort(function(a,b){ if (a.code() < b.code()) return -1;return 1; }))
242                 display_perm(f,perm_list[i],staff_perms, rcount++);
243
244         f = document.getElementById('work_ous');
245         while (f.firstChild) f.removeChild(f.lastChild);
246
247         //flatten the ou tree, keep only those with can_hav_users = true
248         work_ou_list = [];
249         trim_ou_tree( [work_ou_tree], work_ou_list );
250
251         rcount = 0;
252         for (var i in work_ou_list.sort( function(a,b){ if (a.name() < b.name()) return -1;return 1; }) )
253                 display_work_ou(f,work_ou_list[i], rcount++);
254
255         return true;
256 }
257
258 function grep ( code, list ) {
259         var ret = [];
260         for (var i in list) {
261                 if (code(list[i])) ret.push(list[i]);
262         }
263         return ret;
264 }
265
266 function trim_ou_tree (tree, list) {
267         for (var i in tree) {
268                 var type = grep( function(x) {return x.id() == tree[i].ou_type()}, ou_type_list )[0];
269                 if ( type && type.can_have_users() )
270                         list.push(tree[i]);
271
272                 if (tree[i].children()) trim_ou_tree(tree[i].children(), list);
273         }
274 }
275
276 function display_perm (root,ou_def,r) {
277
278         var wrow = findNodeByName(document.getElementById('work_ou-tmpl'), 'wrow').cloneNode(true);
279         root.appendChild(prow);
280
281         var label_cell = findNodeByName(wrow,'label');
282         findNodeByName(label_cell,'a.shortname').appendChild(text(ou_def.name()));
283         findNodeByName(label_cell,'a.shortname').appendChild(text(ou_def.shortname()));
284         if (r % 2) label_cell.className += ' odd';
285
286         var apply_cell = findNodeByName(wrow,'wapply');
287         findNodeByName(apply_cell,'a.id').setAttribute('ouid', ou_def.id());
288         if (r % 2) apply_cell.className += ' odd';
289
290         var has_it = grep(
291                 function(x){ return x.work_ou() == ou_def.id() },
292                 user_work_ous
293         ).length;
294
295         findNodeByName(apply_cell,'a.id').checked = has_it > 0 ? true : false;
296 }
297
298 function display_perm (root,perm_def,staff_perms, r) {
299
300         var prow = findNodeByName(document.getElementById('permission-tmpl'), 'prow').cloneNode(true);
301         root.appendChild(prow);
302
303         var all = false;
304         for (var i in staff_perms) {
305                 if (staff_perms[i].perm() == -1) {
306                         all = true;
307                         break;
308                 }
309         }
310
311
312         var sp,up;
313         if (!all) {
314                 for (var i in staff_perms) {
315                         if (perm_def.id() == staff_perms[i].perm() || staff_perms[i].perm() == -1) {
316                                 sp = staff_perms[i];
317                                 break;
318                         }
319                 }
320         }
321
322         for (var i in user_perms) {
323                 if (perm_def.id() == user_perms[i].perm())
324                         up = user_perms[i];
325         }
326
327
328         var dis = false;
329         if ((up && up.id() < 0) || !sp || !sp.grantable()) dis = true; 
330         if (all) dis = false; 
331
332         var label_cell = findNodeByName(prow,'plabel');
333         findNodeByName(label_cell,'p.code').appendChild(text(perm_def.code()));
334         findNodeByName(label_cell,'p.code').setAttribute('title', perm_def.description());
335         findNodeByName(label_cell,'p.code').setAttribute('permid', perm_def.id());
336         if (r % 2) label_cell.className += ' odd';
337
338         var apply_cell = findNodeByName(prow,'papply');
339         findNodeByName(apply_cell,'p.id').disabled = dis;
340         findNodeByName(apply_cell,'p.id').checked = up ? true : false;
341         if (r % 2) apply_cell.className += ' odd';
342
343         var depth_cell = findNodeByName(prow,'pdepth');
344         findNodeByName(depth_cell,'p.depth').disabled = dis;
345         findNodeByName(depth_cell,'p.depth').id = 'perm-depth-' + perm_def.id();
346         if (r % 2) depth_cell.className += ' odd';
347         selectBuilder(
348                 'perm-depth-' + perm_def.id(),
349                 globalOrgTypes,
350                 (up ? up.depth() : findOrgDepth(user.home_ou())),
351                 { label_field           : 'name',
352                   value_field           : 'depth',
353                   empty_label           : '-- Select One --',
354                   empty_value           : '',
355                   clear                 : true }
356         );
357         
358         var grant_cell = findNodeByName(prow,'pgrant');
359         findNodeByName(grant_cell,'p.grantable').disabled = dis;
360         findNodeByName(grant_cell,'p.grantable').checked = up ? (up.grantable() ? true : false) : false;
361         if (r % 2) grant_cell.className += ' odd';
362
363 }
364
365
366 function selectBuilder (id, objects, def, args) {
367         var label_field = args['label_field'];
368         var value_field = args['value_field'];
369         var depth = args['depth'];
370
371         if (!depth) depth = 0;
372
373         args['depth'] = parseInt(depth) + 1;
374
375         var child_field_name = args['child_field_name'];
376
377         var sel = id;
378         if (typeof sel != 'object')
379                 sel = document.getElementById(sel);
380
381         if (args['clear']) {
382                 for (var o in sel.options) {
383                         sel.options[o] = null;
384                 }
385                 args['clear'] = false;
386                 if (args['empty_label']) {
387                         sel.options[0] = new Option( args['empty_label'], args['empty_value'] );
388                         sel.selectedIndex = 0;
389                 }
390         }
391
392         for (var i in objects) {
393                 var l = objects[i][label_field];
394                 var v = objects[i][value_field];
395
396                 if (typeof l == 'function')
397                         l = objects[i][label_field]();
398
399                 if (typeof v == 'function')
400                         v = objects[i][value_field]();
401
402                 var opt = new Option( l, v );
403
404                 if (depth) {
405                         var d = 10 * depth;
406                         opt.style.paddingLeft = '' + d + 'px';
407                 }
408
409                 sel.options[sel.options.length] = opt;
410
411
412                 if (typeof def == 'object') {
413                         for (var j in def) {
414                                 if (v == def[j]) {
415                                         opt.selected = true;
416                                         sel.value = v;
417                                 }
418                         }
419                 } else {
420                         if (v == def) {
421                                 opt.selected = true;
422                                 sel.value = v;
423                         }
424                 }
425
426                 if (child_field_name) {
427                         var c = objects[i][child_field_name];
428                         if (typeof c == 'function')
429                                 c = objects[i][child_field_name]();
430
431                         selectBuilder(
432                                 id,
433                                 c,
434                                 def,
435                                 { label_field           : args['label_field'],
436                                   value_field           : args['value_field'],
437                                   depth                 : args['depth'],
438                                   child_field_name      : args['child_field_name'] }
439                         );
440                 }
441
442         }
443 }       
444
445 function findNodesByClass(root, nodeClass, list) {
446         if(!list) list = [];
447         if( !root || !nodeClass) {
448                 return null;
449         }
450         
451         if(root.nodeType != 1) {
452                 return null;
453         }
454         
455         if(root.className.match(nodeClass)) list.push( root );
456
457         var children = root.childNodes;
458         
459         for( var i = 0; i != children.length; i++ ) {
460                 findNodesByClass(children[i], nodeClass, list);
461         }                       
462                         
463         return list;            
464 }                                       
465