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