10 var user_work_ous = [];
11 var work_ou_list = [];
13 function set_work_ou(row) {
14 var wid = findNodeByName(row,'a.name').getAttribute('workou_id');
15 var wapply = findNodeByName(row,'p.id').checked;
18 for (var i in user_work_ous) {
19 if (user_work_ous[i].work_ou() == wid) {
26 user_work_ous[i] = null;
42 user_work_ous.push(p);
48 function set_perm(row) {
49 var pid = findNodeByName(row,'p.code').getAttribute('permid');
50 var papply = findNodeByName(row,'p.id').checked;
51 var pdepth = findNodeByName(row,'p.depth').options[findNodeByName(row,'p.depth').selectedIndex].value;
52 var pgrant = findNodeByName(row,'p.grantable').checked;
55 for (var i in user_perms) {
56 if (user_perms[i].perm() == pid) {
62 p.grantable(pgrant ? 1 : 0);
81 p.grantable(pgrant ? 1 : 0);
89 function save_user () {
94 for (var i in user_perms) {
95 // Group based perm? skip it.
96 if (user_perms[i].id() < 0) continue;
98 if (user_perms[i].depth() == null) {
100 for (var j in perm_list) {
101 if (perm_list[j].id() == user_perms[i].perm()) {
106 throw "Depth is required on the " + p.code() + " permission.";
109 save_perms.push( user_perms[i] );
112 var req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.user.permissions.update', ses_id, save_perms );
114 var ok = req.getResultObject();
116 if (ok.ilsevent) throw ok;
119 alert( 'User ' + user.usrname() +
120 ' [' + user.card().barcode() + '] ' +
121 ' successfully updated. ' + ok + ' permissions set!');
128 alert( js2JSON( e ));
137 function apply_adv_mode (root) {
138 adv_items = findNodesByClass(root,'advanced');
139 for (var i in adv_items) {
141 removeCSSClass(adv_items[i], 'hideme') :
142 addCSSClass(adv_items[i], 'hideme');
146 function init_editor (u) {
148 var x = document.getElementById('editor').elements;
151 if (cgi.param('adv')) adv_mode = true;
152 if (xulG) if (xulG.adv) adv_mode = true;
153 if (xulG) if (xulG.params) if (xulG.params.adv) adv_mode = true;
154 apply_adv_mode(document.getElementById('editor'));
156 ses_id = cgi.param('ses');
157 if (xulG) if (xulG.ses) ses_id = xulG.ses;
158 if (xulG) if (xulG.params) if (xulG.params.ses) ses_id = xulG.params.ses;
160 var usr_id = cgi.param('usr');
161 if (xulG) if (xulG.usr_id) usr_id = xulG.usr_id;
162 if (xulG) if (xulG.params) if (xulG.params.usr_id) usr_id = xulG.params.usr_id;
164 var usr_barcode = cgi.param('barcode');
165 if (xulG) if (xulG.usr_barcode) usr_ibarcode = xulG.usr_barcode;
166 if (xulG) if (xulG.params) if (xulG.params.usr_barcode) usr_ibarcode = xulG.params.usr_barcode;
171 req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.user.fleshed.retrieve', ses_id, usr_id );
173 req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.user.fleshed.retrieve_by_barcode', ses_id, usr_barcode );
176 user = req.getResultObject();
181 if (user.usrname()) x['user.usrname'].value = user.usrname();
182 x['user.usrname'].setAttribute('onchange','user.usrname(this.value)');
184 if (user.card() && user.card().barcode()) x['user.card.barcode'].value = user.card().barcode();
185 x['user.card.barcode'].setAttribute('onchange','user.card().barcode(this.value)');
187 if (user.first_given_name()) x['user.first_given_name'].value = user.first_given_name();
188 x['user.first_given_name'].setAttribute('onchange','user.first_given_name(this.value)');
190 if (user.second_given_name()) x['user.second_given_name'].value = user.second_given_name();
191 x['user.second_given_name'].setAttribute('onchange','user.second_given_name(this.value);');
193 if (user.family_name()) x['user.family_name'].value = user.family_name();
194 x['user.family_name'].setAttribute('onchange','user.family_name(this.value)');
196 // grab the editing staff user object
197 req = new RemoteRequest( 'open-ils.auth', 'open-ils.auth.session.retrieve', ses_id );
199 var staff = req.getResultObject();
201 req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.permissions.user_perms.retrieve', ses_id );
203 var staff_perms = req.getResultObject();
205 // Get the top of the staff perm org for ASSIGN_WORK_ORG_UNIT
206 req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.user.perm.highest_org', ses_id, staff.id(), 'ASSIGN_WORK_ORG_UNIT' );
208 var top_work_ou = req.getResultObject();
210 // and now, the orgs where this staff member can apply the perms
211 req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.org_tree.descendants.retrieve', top_work_ou);
213 var work_ou_tree = req.getResultObject();
215 // and now, the orgs where this staff member can apply the perms
216 req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.user.get_work_ous', ses_id, user.id());
218 user_work_ous = req.getResultObject();
220 // and finally, the ou types
221 req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.org_types.retrieve' );
223 ou_type_list = req.getResultObject();
228 req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.permissions.user_perms.retrieve', ses_id, user.id() );
230 user_perms = req.getResultObject();
232 req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.permissions.retrieve' );
234 perm_list = req.getResultObject();
237 f = document.getElementById('permissions');
238 while (f.firstChild) f.removeChild(f.lastChild);
241 for (var i in perm_list.sort(function(a,b){ if (a.code() < b.code()) return -1;return 1; }))
242 display_perm(f,perm_list[i],staff_perms, rcount++);
244 f = document.getElementById('work_ous');
245 while (f.firstChild) f.removeChild(f.lastChild);
247 //flatten the ou tree, keep only those with can_hav_users = true
249 trim_ou_tree( [work_ou_tree], work_ou_list );
252 for (var i in work_ou_list.sort( function(a,b){ if (a.name() < b.name()) return -1;return 1; }) )
253 display_work_ou(f,work_ou_list[i], rcount++);
258 function grep ( code, list ) {
260 for (var i in list) {
261 if (code(list[i])) ret.push(list[i]);
266 function trim_ou_tree (tree, list) {
267 for (var i in tree) {
268 var type = grep( function(x) {return x.id() == tree[i].ou_type()}, ou_type_list )[0];
269 if ( type && type.can_have_users() )
272 if (tree[i].children()) trim_ou_tree(tree[i].children(), list);
276 function display_perm (root,ou_def,r) {
278 var wrow = findNodeByName(document.getElementById('work_ou-tmpl'), 'wrow').cloneNode(true);
279 root.appendChild(prow);
281 var label_cell = findNodeByName(wrow,'label');
282 findNodeByName(label_cell,'a.shortname').appendChild(text(ou_def.name()));
283 findNodeByName(label_cell,'a.shortname').appendChild(text(ou_def.shortname()));
284 if (r % 2) label_cell.className += ' odd';
286 var apply_cell = findNodeByName(wrow,'wapply');
287 findNodeByName(apply_cell,'a.id').setAttribute('ouid', ou_def.id());
288 if (r % 2) apply_cell.className += ' odd';
291 function(x){ return x.work_ou() == ou_def.id() },
295 findNodeByName(apply_cell,'a.id').checked = has_it > 0 ? true : false;
298 function display_perm (root,perm_def,staff_perms, r) {
300 var prow = findNodeByName(document.getElementById('permission-tmpl'), 'prow').cloneNode(true);
301 root.appendChild(prow);
304 for (var i in staff_perms) {
305 if (staff_perms[i].perm() == -1) {
314 for (var i in staff_perms) {
315 if (perm_def.id() == staff_perms[i].perm() || staff_perms[i].perm() == -1) {
322 for (var i in user_perms) {
323 if (perm_def.id() == user_perms[i].perm())
329 if ((up && up.id() < 0) || !sp || !sp.grantable()) dis = true;
330 if (all) dis = false;
332 var label_cell = findNodeByName(prow,'plabel');
333 findNodeByName(label_cell,'p.code').appendChild(text(perm_def.code()));
334 findNodeByName(label_cell,'p.code').setAttribute('title', perm_def.description());
335 findNodeByName(label_cell,'p.code').setAttribute('permid', perm_def.id());
336 if (r % 2) label_cell.className += ' odd';
338 var apply_cell = findNodeByName(prow,'papply');
339 findNodeByName(apply_cell,'p.id').disabled = dis;
340 findNodeByName(apply_cell,'p.id').checked = up ? true : false;
341 if (r % 2) apply_cell.className += ' odd';
343 var depth_cell = findNodeByName(prow,'pdepth');
344 findNodeByName(depth_cell,'p.depth').disabled = dis;
345 findNodeByName(depth_cell,'p.depth').id = 'perm-depth-' + perm_def.id();
346 if (r % 2) depth_cell.className += ' odd';
348 'perm-depth-' + perm_def.id(),
350 (up ? up.depth() : findOrgDepth(user.home_ou())),
351 { label_field : 'name',
352 value_field : 'depth',
353 empty_label : '-- Select One --',
358 var grant_cell = findNodeByName(prow,'pgrant');
359 findNodeByName(grant_cell,'p.grantable').disabled = dis;
360 findNodeByName(grant_cell,'p.grantable').checked = up ? (up.grantable() ? true : false) : false;
361 if (r % 2) grant_cell.className += ' odd';
366 function selectBuilder (id, objects, def, args) {
367 var label_field = args['label_field'];
368 var value_field = args['value_field'];
369 var depth = args['depth'];
371 if (!depth) depth = 0;
373 args['depth'] = parseInt(depth) + 1;
375 var child_field_name = args['child_field_name'];
378 if (typeof sel != 'object')
379 sel = document.getElementById(sel);
382 for (var o in sel.options) {
383 sel.options[o] = null;
385 args['clear'] = false;
386 if (args['empty_label']) {
387 sel.options[0] = new Option( args['empty_label'], args['empty_value'] );
388 sel.selectedIndex = 0;
392 for (var i in objects) {
393 var l = objects[i][label_field];
394 var v = objects[i][value_field];
396 if (typeof l == 'function')
397 l = objects[i][label_field]();
399 if (typeof v == 'function')
400 v = objects[i][value_field]();
402 var opt = new Option( l, v );
406 opt.style.paddingLeft = '' + d + 'px';
409 sel.options[sel.options.length] = opt;
412 if (typeof def == 'object') {
426 if (child_field_name) {
427 var c = objects[i][child_field_name];
428 if (typeof c == 'function')
429 c = objects[i][child_field_name]();
435 { label_field : args['label_field'],
436 value_field : args['value_field'],
437 depth : args['depth'],
438 child_field_name : args['child_field_name'] }
445 function findNodesByClass(root, nodeClass, list) {
447 if( !root || !nodeClass) {
451 if(root.nodeType != 1) {
455 if(root.className.match(nodeClass)) list.push( root );
457 var children = root.childNodes;
459 for( var i = 0; i != children.length; i++ ) {
460 findNodesByClass(children[i], nodeClass, list);