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