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').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 ));
148 function init_editor (u) {
152 ses_id = cgi.param('ses');
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;
158 var usr_id = cgi.param('usr');
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;
164 var usr_barcode = cgi.param('barcode');
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;
173 req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.user.fleshed.retrieve', ses_id, usr_id );
175 req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.user.fleshed.retrieve_by_barcode', ses_id, usr_barcode );
178 user = req.getResultObject();
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();
189 // grab the editing staff user object
190 req = new RemoteRequest( 'open-ils.auth', 'open-ils.auth.session.retrieve', ses_id );
192 var staff = req.getResultObject();
194 req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.permissions.user_perms.retrieve', ses_id );
196 var staff_perms = req.getResultObject();
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' );
201 var top_work_ou = req.getResultObject();
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);
206 var work_ou_tree = req.getResultObject();
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());
211 user_work_ous = req.getResultObject();
213 // and finally, the ou types
214 req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.org_types.retrieve' );
216 ou_type_list = req.getResultObject();
221 req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.permissions.user_perms.retrieve', ses_id, user.id() );
223 user_perms = req.getResultObject();
225 req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.permissions.retrieve' );
227 perm_list = req.getResultObject();
230 f = $('permissions');
231 while (f.firstChild) f.removeChild(f.lastChild);
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++);
238 while (f.firstChild) f.removeChild(f.lastChild);
240 //flatten the ou tree, keep only those with can_hav_users = true
242 trim_ou_tree( [work_ou_tree], work_ou_list );
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++);
251 function grep ( code, list ) {
253 for (var i in list) {
254 if (code(list[i])) ret.push(list[i]);
259 function trim_ou_tree (tree, list) {
260 for (var i in tree) {
261 if (!tree[i]) continue;
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' )
267 if (tree[i].children()) trim_ou_tree(tree[i].children(), list);
271 function display_work_ou (root,ou_def,r) {
273 var wrow = $('work_tmpl').cloneNode(true);
275 if (r % 2) wrow.setAttribute('class', 'odd');
276 root.appendChild(wrow);
278 findNodeByName(wrow,'a.name').value = ou_def.name();
279 findNodeByName(wrow,'a.shortname').value = ou_def.shortname();
281 findNodeByName(wrow,'a.id').setAttribute('workou_id', ou_def.id());
284 function(x){ return x.work_ou() == ou_def.id() },
288 findNodeByName(wrow,'a.id').checked = has_it > 0 ? true : false;
291 function display_perm (root,perm_def,staff_perms, r) {
293 var prow = $('perm_tmpl').cloneNode(true);
295 if (r % 2) prow.setAttribute('class', 'odd');
296 root.appendChild(prow);
299 for (var i in staff_perms) {
300 if (staff_perms[i].perm() == -1) {
308 for (var i in staff_perms) {
309 if (perm_def.id() == staff_perms[i].perm() || staff_perms[i].perm() == -1) {
316 for (var i in user_perms) {
317 if (perm_def.id() == user_perms[i].perm())
322 if ((up && up.id() < 0) || !sp || !sp.grantable()) dis = true;
323 if (all) dis = false;
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());
329 findNodeByName(prow,'p.id').disabled = dis;
330 findNodeByName(prow,'p.id').checked = up ? true : false;
332 findNodeByName(prow,'p.depth').disabled = dis;
333 findNodeByName(prow,'p.depth').id = 'perm-depth-' + perm_def.id();
335 'perm-depth-' + perm_def.id(),
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'),
345 findNodeByName(prow,'p.grantable').disabled = dis;
346 findNodeByName(prow,'p.grantable').checked = up ? (up.grantable() != 0 ? true : false) : false;
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'];
356 if (!depth) depth = 0;
358 args['depth'] = parseInt(depth) + 1;
360 var child_field_name = args['child_field_name'];
363 if (typeof sel != 'object')
367 args['clear'] = false;
368 if (args['empty_label']) {
369 newOpt = sel.appendItem(args['empty_label'], args['empty_value']);
370 sel.selectedItem = newOpt;
374 for (var i in objects) {
375 var l = objects[i][label_field];
376 var v = objects[i][value_field];
378 if (typeof l == 'function')
379 l = objects[i][label_field]();
381 if (typeof v == 'function')
382 v = objects[i][value_field]();
384 newOpt = sel.appendItem(l,v);
388 newOpt.style.paddingLeft = '' + d + 'px';
391 if (typeof def == 'object') {
394 sel.selectedItem = newOpt;
399 sel.selectedItem = newOpt;
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]();
412 { label_field : args['label_field'],
413 value_field : args['value_field'],
414 depth : args['depth'],
415 child_field_name : args['child_field_name'] }
422 function findNodesByClass(root, nodeClass, list) {
424 if( !root || !nodeClass) {
428 if(root.nodeType != 1) {
432 if(root.className.match(nodeClass)) list.push( root );
434 var children = root.childNodes;
436 for( var i = 0; i != children.length; i++ ) {
437 findNodesByClass(children[i], nodeClass, list);