10 var user_work_ous = [];
11 var work_ou_list = [];
13 function $(id) { return document.getElementById(id); }
15 function set_work_ou(row) {
16 var wid = findNodeByName(row,'a.id').getAttribute('workou_id');
17 var wapply = findNodeByName(row,'a.id').checked;
20 for (var i in user_work_ous) {
21 if (!user_work_ous[i]) continue;
22 if (user_work_ous[i].work_ou() == wid) {
29 user_work_ous[i] = null;
45 user_work_ous.push(p);
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;
57 for (var i in user_perms) {
58 if (user_perms[i].perm() == pid) {
64 p.grantable(pgrant ? 1 : 0);
83 p.grantable(pgrant ? 1 : 0);
91 function save_user () {
96 for (var i in user_perms) {
97 // Group based perm? skip it.
98 if (user_perms[i].id() < 0) continue;
100 if (user_perms[i].depth() == null) {
102 for (var j in perm_list) {
103 if (perm_list[j].id() == user_perms[i].perm()) {
108 throw $("patronStrings").getFormattedString('staff.patron.user_edit.save_user.depth_required', [p.code()]);
111 save_perms.push( user_perms[i] );
115 for (var i in user_work_ous) {
116 if (!user_work_ous[i]) continue;
117 save_ous.push( user_work_ous[i] );
120 var req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.user.work_ous.update', ses_id, save_ous );
122 var wok = req.getResultObject();
124 if (wok.ilsevent) throw wok;
126 req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.user.permissions.update', ses_id, save_perms );
128 var pok = req.getResultObject();
130 if (pok.ilsevent) throw pok;
133 alert($("patronStrings").getFormattedString('staff.patron.user_edit.save_user.user_modified_successfully', [user.usrname(), user.card().barcode(), pok, wok]));
140 alert( js2JSON( e ));
149 function apply_adv_mode (root) {
150 adv_items = findNodesByClass(root,'advanced');
151 for (var i in adv_items) {
153 removeCSSClass(adv_items[i], 'hideme') :
154 addCSSClass(adv_items[i], 'hideme');
158 function init_editor (u) {
160 var x = document.getElementById('editor').elements;
163 if (cgi.param('adv')) adv_mode = true;
165 if (xulG) if (xulG.adv) adv_mode = true;
166 if (xulG) if (xulG.params) if (xulG.params.adv) adv_mode = true;
169 apply_adv_mode(document.getElementById('editor'));
171 ses_id = cgi.param('ses');
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;
177 var usr_id = cgi.param('usr');
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;
183 var usr_barcode = cgi.param('barcode');
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;
192 req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.user.fleshed.retrieve', ses_id, usr_id );
194 req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.user.fleshed.retrieve_by_barcode', ses_id, usr_barcode );
197 user = req.getResultObject();
202 if (user.usrname()) x['user.usrname'].value = user.usrname();
203 x['user.usrname'].setAttribute('onchange','user.usrname(this.value)');
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)');
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)');
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);');
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)');
217 // grab the editing staff user object
218 req = new RemoteRequest( 'open-ils.auth', 'open-ils.auth.session.retrieve', ses_id );
220 var staff = req.getResultObject();
222 req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.permissions.user_perms.retrieve', ses_id );
224 var staff_perms = req.getResultObject();
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' );
229 var top_work_ou = req.getResultObject();
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);
234 var work_ou_tree = req.getResultObject();
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());
239 user_work_ous = req.getResultObject();
241 // and finally, the ou types
242 req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.org_types.retrieve' );
244 ou_type_list = req.getResultObject();
249 req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.permissions.user_perms.retrieve', ses_id, user.id() );
251 user_perms = req.getResultObject();
253 req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.permissions.retrieve' );
255 perm_list = req.getResultObject();
258 f = document.getElementById('permissions');
259 while (f.firstChild) f.removeChild(f.lastChild);
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++);
265 f = document.getElementById('work_ous');
266 while (f.firstChild) f.removeChild(f.lastChild);
268 //flatten the ou tree, keep only those with can_hav_users = true
270 trim_ou_tree( [work_ou_tree], work_ou_list );
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++);
279 function grep ( code, list ) {
281 for (var i in list) {
282 if (code(list[i])) ret.push(list[i]);
287 function trim_ou_tree (tree, list) {
288 for (var i in tree) {
289 if (!tree[i]) continue;
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' )
295 if (tree[i].children()) trim_ou_tree(tree[i].children(), list);
299 function display_work_ou (root,ou_def,r) {
301 var wrow = findNodeByName(document.getElementById('work_ou-tmpl'), 'wrow').cloneNode(true);
302 root.appendChild(wrow);
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';
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';
314 function(x){ return x.work_ou() == ou_def.id() },
318 findNodeByName(apply_cell,'a.id').checked = has_it > 0 ? true : false;
321 function display_perm (root,perm_def,staff_perms, r) {
323 var prow = findNodeByName(document.getElementById('permission-tmpl'), 'prow').cloneNode(true);
324 root.appendChild(prow);
327 for (var i in staff_perms) {
328 if (staff_perms[i].perm() == -1) {
337 for (var i in staff_perms) {
338 if (perm_def.id() == staff_perms[i].perm() || staff_perms[i].perm() == -1) {
345 for (var i in user_perms) {
346 if (perm_def.id() == user_perms[i].perm())
352 if ((up && up.id() < 0) || !sp || !sp.grantable()) dis = true;
353 if (all) dis = false;
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';
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';
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';
371 'perm-depth-' + perm_def.id(),
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'),
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';
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'];
394 if (!depth) depth = 0;
396 args['depth'] = parseInt(depth) + 1;
398 var child_field_name = args['child_field_name'];
401 if (typeof sel != 'object')
402 sel = document.getElementById(sel);
405 for (var o in sel.options) {
406 sel.options[o] = null;
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;
415 for (var i in objects) {
416 var l = objects[i][label_field];
417 var v = objects[i][value_field];
419 if (typeof l == 'function')
420 l = objects[i][label_field]();
422 if (typeof v == 'function')
423 v = objects[i][value_field]();
425 var opt = new Option( l, v );
429 opt.style.paddingLeft = '' + d + 'px';
432 sel.options[sel.options.length] = opt;
435 if (typeof def == 'object') {
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]();
458 { label_field : args['label_field'],
459 value_field : args['value_field'],
460 depth : args['depth'],
461 child_field_name : args['child_field_name'] }
468 function findNodesByClass(root, nodeClass, list) {
470 if( !root || !nodeClass) {
474 if(root.nodeType != 1) {
478 if(root.className.match(nodeClass)) list.push( root );
480 var children = root.childNodes;
482 for( var i = 0; i != children.length; i++ ) {
483 findNodesByClass(children[i], nodeClass, list);