]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/xul/staff_client/server/patron/user_edit.js
LP2045292 Color contrast for AngularJS patron bills
[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').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 function init_editor (u) {
149     
150     cgi = new CGI();
151
152     ses_id = cgi.param('ses'); 
153     try {
154         if (xulG) if (xulG.ses) ses_id = xulG.ses;
155         if (xulG) if (xulG.params) if (xulG.params.ses) ses_id = xulG.params.ses;
156     } catch (e) {}
157
158     var usr_id = cgi.param('usr'); 
159     try {
160         if (xulG) if (xulG.usr_id) usr_id = xulG.usr_id;
161         if (xulG) if (xulG.params) if (xulG.params.usr_id) usr_id = xulG.params.usr_id;
162     } catch (e) {}
163
164     var usr_barcode = cgi.param('barcode'); 
165     try {
166         if (xulG) if (xulG.usr_barcode) usr_ibarcode = xulG.usr_barcode;
167         if (xulG) if (xulG.params) if (xulG.params.usr_barcode) usr_ibarcode = xulG.params.usr_barcode;
168     } catch (e) {}
169
170     try {
171         var req;
172         if (usr_id) {
173             req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.user.fleshed.retrieve', ses_id, usr_id );
174         } else {
175             req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.user.fleshed.retrieve_by_barcode', ses_id, usr_barcode );
176         }
177         req.send(true);
178         user = req.getResultObject();
179     } catch (E) {
180         alert(E);
181     }
182
183     if (user.usrname()) $('user.usrname').value = user.usrname();
184     if (user.card() && user.card().barcode()) $('user.card.barcode').value = user.card().barcode();
185     if (user.first_given_name()) $('user.first_given_name').value = user.first_given_name();
186     if (user.second_given_name()) $('user.second_given_name').value = user.second_given_name();
187     if (user.family_name()) $('user.family_name').value = user.family_name();
188
189     // grab the editing staff user object
190     req = new RemoteRequest( 'open-ils.auth', 'open-ils.auth.session.retrieve', ses_id );
191     req.send(true);
192     var staff = req.getResultObject();
193
194     req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.permissions.user_perms.retrieve', ses_id );
195     req.send(true);
196     var staff_perms = req.getResultObject();
197
198     // Get the top of the staff perm org for ASSIGN_WORK_ORG_UNIT
199     req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.user.perm.highest_org', ses_id, staff.id(), 'ASSIGN_WORK_ORG_UNIT' );
200     req.send(true);
201     var top_work_ou = req.getResultObject();
202
203     // and now, the orgs where this staff member can apply the perms
204     req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.org_tree.descendants.retrieve', top_work_ou);
205     req.send(true);
206     var work_ou_tree = req.getResultObject();
207
208     // and now, the orgs where this staff member can apply the perms
209     req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.user.get_work_ous', ses_id, user.id());
210     req.send(true);
211     user_work_ous = req.getResultObject();
212
213     // and finally, the ou types
214     req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.org_types.retrieve' );
215     req.send(true);
216     ou_type_list = req.getResultObject();
217
218     user_perms = [];
219     perm_list = [];
220     if (user.id() > 0) {
221         req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.permissions.user_perms.retrieve', ses_id, user.id() );
222         req.send(true);
223         user_perms = req.getResultObject();
224
225         req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.permissions.retrieve' );
226         req.send(true);
227         perm_list = req.getResultObject();
228     }
229
230     f = $('permissions');
231     while (f.firstChild) f.removeChild(f.lastChild);
232
233     var rcount = 0;
234     for (var i in perm_list.sort(function(a,b){ if (a.code() < b.code()) return -1;return 1; }))
235         display_perm(f,perm_list[i],staff_perms, rcount++);
236
237     f = $('work_ous');
238     while (f.firstChild) f.removeChild(f.lastChild);
239
240     //flatten the ou tree, keep only those with can_hav_users = true
241     work_ou_list = [];
242     trim_ou_tree( [work_ou_tree], work_ou_list );
243
244     rcount = 0;
245     for (var i in work_ou_list.sort( function(a,b){ if (a.shortname() < b.shortname()) return -1;return 1; }) )
246         display_work_ou(f,work_ou_list[i], rcount++);
247
248     return true;
249 }
250
251 function grep ( code, list ) {
252     var ret = [];
253     for (var i in list) {
254         if (code(list[i])) ret.push(list[i]);
255     }
256     return ret;
257 }
258
259 function trim_ou_tree (tree, list) {
260     for (var i in tree) {
261         if (!tree[i]) continue;
262
263         var type = grep( function(x) {return x.id() == tree[i].ou_type()}, ou_type_list )[0];
264         if ( type && type.can_have_users() == 't' )
265             list.push(tree[i]);
266
267         if (tree[i].children()) trim_ou_tree(tree[i].children(), list);
268     }
269 }
270
271 function display_work_ou (root,ou_def,r) {
272
273     var wrow = $('work_tmpl').cloneNode(true);
274     wrow.id = null;
275     if (r % 2) wrow.setAttribute('class', 'odd');
276     root.appendChild(wrow);
277
278     findNodeByName(wrow,'a.name').value = ou_def.name();
279     findNodeByName(wrow,'a.shortname').value = ou_def.shortname();
280
281     findNodeByName(wrow,'a.id').setAttribute('workou_id', ou_def.id());
282
283     var has_it = grep(
284         function(x){ return x.work_ou() == ou_def.id() },
285         user_work_ous
286     ).length;
287
288     findNodeByName(wrow,'a.id').checked = has_it > 0 ? true : false;
289 }
290
291 function display_perm (root,perm_def,staff_perms, r) {
292
293     var prow = $('perm_tmpl').cloneNode(true);
294     prow.id = null;
295     if (r % 2) prow.setAttribute('class', 'odd');
296     root.appendChild(prow);
297
298     var all = false;
299     for (var i in staff_perms) {
300         if (staff_perms[i].perm() == -1) {
301             all = true;
302             break;
303         }
304     }
305
306     var sp,up;
307     if (!all) {
308         for (var i in staff_perms) {
309             if (perm_def.id() == staff_perms[i].perm() || staff_perms[i].perm() == -1) {
310                 sp = staff_perms[i];
311                 break;
312             }
313         }
314     }
315
316     for (var i in user_perms) {
317         if (perm_def.id() == user_perms[i].perm())
318             up = user_perms[i];
319     }
320
321     var dis = false;
322     if ((up && up.id() < 0) || !sp || !sp.grantable()) dis = true; 
323     if (all) dis = false; 
324
325     findNodeByName(prow,'p.code').value = perm_def.code();
326     findNodeByName(prow,'p.code').setAttribute('title', perm_def.description());
327     findNodeByName(prow,'p.code').setAttribute('permid', perm_def.id());
328
329     findNodeByName(prow,'p.id').disabled = dis;
330     findNodeByName(prow,'p.id').checked = up ? true : false;
331
332     findNodeByName(prow,'p.depth').disabled = dis;
333     findNodeByName(prow,'p.depth').id = 'perm-depth-' + perm_def.id();
334     selectBuilder(
335         'perm-depth-' + perm_def.id(),
336         globalOrgTypes,
337         (up ? up.depth() : findOrgDepth(user.home_ou())),
338         { label_field        : 'name',
339           value_field        : 'depth',
340           empty_label        : $("patronStrings").getString('staff.patron.user_edit.display_perm.select_one'),
341           empty_value        : '',
342           clear            : true }
343     );
344
345     findNodeByName(prow,'p.grantable').disabled = dis;
346     findNodeByName(prow,'p.grantable').checked = up ? (up.grantable() != 0 ? true : false) : false;
347
348 }
349
350 function selectBuilder (id, objects, def, args) {
351     var label_field = args['label_field'];
352     var value_field = args['value_field'];
353     var depth = args['depth'];
354     var newOpt;
355
356     if (!depth) depth = 0;
357
358     args['depth'] = parseInt(depth) + 1;
359
360     var child_field_name = args['child_field_name'];
361
362     var sel = id;
363     if (typeof sel != 'object')
364         sel = $(sel);
365     if (args['clear']) {
366         sel.removeAllItems()
367         args['clear'] = false;
368         if (args['empty_label']) {
369             newOpt = sel.appendItem(args['empty_label'], args['empty_value']);
370             sel.selectedItem = newOpt;
371         }
372     }
373
374     for (var i in objects) {
375         var l = objects[i][label_field];
376         var v = objects[i][value_field];
377
378         if (typeof l == 'function')
379             l = objects[i][label_field]();
380
381         if (typeof v == 'function')
382             v = objects[i][value_field]();
383
384         newOpt = sel.appendItem(l,v);
385
386         if (depth) {
387             var d = 10 * depth;
388             newOpt.style.paddingLeft = '' + d + 'px';
389         }
390
391         if (typeof def == 'object') {
392             for (var j in def) {
393                 if (v == def[j]) {
394                     sel.selectedItem = newOpt;
395                 }
396             }
397         } else {
398             if (v == def) {
399                 sel.selectedItem = newOpt;
400             }
401         }
402
403         if (child_field_name) {
404             var c = objects[i][child_field_name];
405             if (typeof c == 'function')
406                 c = objects[i][child_field_name]();
407
408             selectBuilder(
409                 id,
410                 c,
411                 def,
412                 { label_field        : args['label_field'],
413                   value_field        : args['value_field'],
414                   depth            : args['depth'],
415                   child_field_name    : args['child_field_name'] }
416             );
417         }
418
419     }
420 }    
421
422 function findNodesByClass(root, nodeClass, list) {
423     if(!list) list = [];
424         if( !root || !nodeClass) {
425         return null;
426     }
427         
428         if(root.nodeType != 1) {
429         return null;
430     }
431         
432         if(root.className.match(nodeClass)) list.push( root );
433
434         var children = root.childNodes;
435         
436         for( var i = 0; i != children.length; i++ ) {
437                 findNodesByClass(children[i], nodeClass, list);
438         }                       
439                         
440         return list;            
441 }                                       
442