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()) {
110 $('staff.patron.user_edit.save_user.depth_required').innerHTML
115 $('staff.patron.user_edit.save_user.depth_required').innerHTML
120 save_perms.push( user_perms[i] );
124 for (var i in user_work_ous) {
125 if (!user_work_ous[i]) continue;
126 save_ous.push( user_work_ous[i] );
129 var req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.user.work_ous.update', ses_id, save_ous );
131 var wok = req.getResultObject();
133 if (wok.ilsevent) throw wok;
135 req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.user.permissions.update', ses_id, save_perms );
137 var pok = req.getResultObject();
139 if (pok.ilsevent) throw pok;
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();
151 alert( js2JSON( e ));
160 function apply_adv_mode (root) {
161 adv_items = findNodesByClass(root,'advanced');
162 for (var i in adv_items) {
164 removeCSSClass(adv_items[i], 'hideme') :
165 addCSSClass(adv_items[i], 'hideme');
169 function init_editor (u) {
171 var x = document.getElementById('editor').elements;
174 if (cgi.param('adv')) adv_mode = true;
176 if (xulG) if (xulG.adv) adv_mode = true;
177 if (xulG) if (xulG.params) if (xulG.params.adv) adv_mode = true;
180 apply_adv_mode(document.getElementById('editor'));
182 ses_id = cgi.param('ses');
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;
188 var usr_id = cgi.param('usr');
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;
194 var usr_barcode = cgi.param('barcode');
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;
203 req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.user.fleshed.retrieve', ses_id, usr_id );
205 req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.user.fleshed.retrieve_by_barcode', ses_id, usr_barcode );
208 user = req.getResultObject();
213 if (user.usrname()) x['user.usrname'].value = user.usrname();
214 x['user.usrname'].setAttribute('onchange','user.usrname(this.value)');
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)');
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)');
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);');
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)');
228 // grab the editing staff user object
229 req = new RemoteRequest( 'open-ils.auth', 'open-ils.auth.session.retrieve', ses_id );
231 var staff = req.getResultObject();
233 req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.permissions.user_perms.retrieve', ses_id );
235 var staff_perms = req.getResultObject();
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' );
240 var top_work_ou = req.getResultObject();
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);
245 var work_ou_tree = req.getResultObject();
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());
250 user_work_ous = req.getResultObject();
252 // and finally, the ou types
253 req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.org_types.retrieve' );
255 ou_type_list = req.getResultObject();
260 req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.permissions.user_perms.retrieve', ses_id, user.id() );
262 user_perms = req.getResultObject();
264 req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.permissions.retrieve' );
266 perm_list = req.getResultObject();
269 f = document.getElementById('permissions');
270 while (f.firstChild) f.removeChild(f.lastChild);
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++);
276 f = document.getElementById('work_ous');
277 while (f.firstChild) f.removeChild(f.lastChild);
279 //flatten the ou tree, keep only those with can_hav_users = true
281 trim_ou_tree( [work_ou_tree], work_ou_list );
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++);
290 function grep ( code, list ) {
292 for (var i in list) {
293 if (code(list[i])) ret.push(list[i]);
298 function trim_ou_tree (tree, list) {
299 for (var i in tree) {
300 if (!tree[i]) continue;
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' )
306 if (tree[i].children()) trim_ou_tree(tree[i].children(), list);
310 function display_work_ou (root,ou_def,r) {
312 var wrow = findNodeByName(document.getElementById('work_ou-tmpl'), 'wrow').cloneNode(true);
313 root.appendChild(wrow);
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';
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';
325 function(x){ return x.work_ou() == ou_def.id() },
329 findNodeByName(apply_cell,'a.id').checked = has_it > 0 ? true : false;
332 function display_perm (root,perm_def,staff_perms, r) {
334 var prow = findNodeByName(document.getElementById('permission-tmpl'), 'prow').cloneNode(true);
335 root.appendChild(prow);
338 for (var i in staff_perms) {
339 if (staff_perms[i].perm() == -1) {
348 for (var i in staff_perms) {
349 if (perm_def.id() == staff_perms[i].perm() || staff_perms[i].perm() == -1) {
356 for (var i in user_perms) {
357 if (perm_def.id() == user_perms[i].perm())
363 if ((up && up.id() < 0) || !sp || !sp.grantable()) dis = true;
364 if (all) dis = false;
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';
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';
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';
382 'perm-depth-' + perm_def.id(),
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,
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';
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'];
405 if (!depth) depth = 0;
407 args['depth'] = parseInt(depth) + 1;
409 var child_field_name = args['child_field_name'];
412 if (typeof sel != 'object')
413 sel = document.getElementById(sel);
416 for (var o in sel.options) {
417 sel.options[o] = null;
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;
426 for (var i in objects) {
427 var l = objects[i][label_field];
428 var v = objects[i][value_field];
430 if (typeof l == 'function')
431 l = objects[i][label_field]();
433 if (typeof v == 'function')
434 v = objects[i][value_field]();
436 var opt = new Option( l, v );
440 opt.style.paddingLeft = '' + d + 'px';
443 sel.options[sel.options.length] = opt;
446 if (typeof def == 'object') {
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]();
469 { label_field : args['label_field'],
470 value_field : args['value_field'],
471 depth : args['depth'],
472 child_field_name : args['child_field_name'] }
479 function findNodesByClass(root, nodeClass, list) {
481 if( !root || !nodeClass) {
485 if(root.nodeType != 1) {
489 if(root.className.match(nodeClass)) list.push( root );
491 var children = root.childNodes;
493 for( var i = 0; i != children.length; i++ ) {
494 findNodesByClass(children[i], nodeClass, list);