5 if (typeof JSAN == 'undefined') { throw( "The JSAN library object is missing."); }
6 JSAN.errorLevel = "die"; // none, warn, or die
7 JSAN.addRepository('/xul/server/');
8 JSAN.use('util.error'); g.error = new util.error();
9 g.error.sdump('D_TRACE','my_init() for toolbar.xul');
11 JSAN.use('OpenILS.data'); g.data = new OpenILS.data();
12 g.data.stash_retrieve();
14 JSAN.use('util.widgets');
15 JSAN.use('util.functional');
17 dojo.require('openils.PermaCrud');
19 g.pcrud = new openils.PermaCrud({
23 if (typeof window.xulG == 'object' && typeof window.xulG.set_tab_name == 'function') {
24 try { window.xulG.set_tab_name($('adminStrings').getString('staff.admin.toolbar.tab_name')); } catch(E) { alert(E); }
28 $('list_actions').appendChild( g.list1.render_list_actions() );
29 g.list1.set_list_actions();
33 // toolbutton manipulators
34 $('Add').addEventListener('command',Add,'false');
35 $('Remove').addEventListener('command',Remove,'false');
36 $('Up').addEventListener('command',Up,'false');
37 $('Down').addEventListener('command',Down,'false');
39 // toolbar manipulators
40 $('Delete').addEventListener('command',Delete,'false');
41 $('New').addEventListener('command',New,'false');
42 $('Cancel').addEventListener('command',Cancel,'false');
43 $('Save').addEventListener('command',Save,'false');
45 // restore the toolbar selection
46 window.addEventListener(
49 xulG.render_toolbar_layout();
55 $('context_org').setAttribute('label', fieldmapper.IDL.fmclasses.atb.field_map.org.label);
56 $('context_usr').setAttribute('label', fieldmapper.IDL.fmclasses.atb.field_map.usr.label);
57 $('context_ws').setAttribute('label', fieldmapper.IDL.fmclasses.atb.field_map.ws.label);
60 var perms_not_had = perm_check();
61 if (perms_not_had.length == 3) { // has none of those perms
62 $('New').disabled = true;
66 try { g.error.standard_unexpected_error_alert('admin/toolbar.xul',E); } catch(F) { alert(E); }
70 function perm_check(use_this_org, use_these_perms) {
72 // poor man's perm check - just a screen door to keep the honest folk out
74 var context_org = use_this_org || ses('ws_ou');
75 var perms_to_check = use_these_perms || [ 'ADMIN_TOOLBAR_FOR_ORG', 'ADMIN_TOOLBAR_FOR_WORKSTATION', 'ADMIN_TOOLBAR_FOR_USER' ];
77 JSAN.use('util.network');
78 var net = new util.network();
79 var robj = net.simple_request(
87 if (typeof robj.ilsevent != 'undefined') {
92 try { g.error.standard_unexpected_error_alert('admin/toolbar.xul',E); } catch(F) { alert(E); }
93 return perms_to_check; // assume failure so return the perms
97 function init_lists() {
99 JSAN.use('util.list'); JSAN.use('patron.util');
101 // list1 = main list containing the action.toolbar entries
102 // list2 = left list containing available toolbar buttons
103 // list3 = right list containing selected toolbar buttons
110 alert('Error in toolbar.js, init_lists(): ' + E);
114 function init_list1() {
116 g.list1 = new util.list('atb_tree');
118 var list1_columns = g.list1.fm_columns('atb',{
119 '*':{'hidden':true, 'flex':0},
122 'render' : function(my) {
123 if (! my.atb.usr()) return;
124 return my.atb.usr() == ses('staff_id')
125 ? ses('staff_usrname')
126 : patron.util.retrieve_au_via_id(ses(),my.atb.usr()).usrname();
131 'fleshed_display_field' : 'shortname'
135 'render' : function(my) {
136 if (! my.atb.ws()) return;
137 return my.atb.ws() == ses('ws_id')
142 'atb_label' : { 'hidden' : false, 'flex' : 1 },
143 'atb_layout' : { 'hidden' : false, 'flex' : 2 }
147 'columns' : list1_columns,
148 'on_select' : handle_list1_selection
151 alert('Error in toolbar.js, init_list1(): ' + E);
155 function handle_list1_selection(ev) {
158 if (g.list1.node.currentIndex != g.list1_last_index) {
159 alert( $('adminStrings').getString('staff.admin.toolbar.unsaved_changes') );
160 g.list1.node.view.selection.select( g.list1_last_index );
162 return util.widgets.stop_event(ev);
164 g.list1_last_index = g.list1.node.currentIndex;
165 g.selected_atb = get_atb_from_selection();
166 if (!g.selected_atb) { return; }
167 if (g.selected_atb.org()) {
168 $('lib_menu').value = g.selected_atb.org();
169 $('context').selectedIndex = 0;
171 if (g.selected_atb.ws()) { $('context').selectedIndex = 1; }
172 if (g.selected_atb.usr()) { $('context').selectedIndex = 2; }
173 g.layout = JSON2js(g.selected_atb.layout());
174 populate_list2_list3();
175 xulG.render_toolbar_layout(g.layout);
179 var perms_not_had = perm_check( g.selected_atb.org() );
180 var disable_editing = false;
181 for (var i = 0; i < perms_not_had.length; i++) {
182 if (perms_not_had[i] == 'ADMIN_TOOLBAR_FOR_ORG' && g.selected_atb.org()) {
183 disable_editing = true;
185 if (perms_not_had[i] == 'ADMIN_TOOLBAR_FOR_WORKSTATION' && g.selected_atb.ws()) {
186 disable_editing = true;
188 if (perms_not_had[i] == 'ADMIN_TOOLBAR_FOR_USER' && g.selected_atb.usr()) {
189 disable_editing = true;
192 if (g.selected_atb.usr() && ( g.selected_atb.usr() != ses('staff_id') ) ) {
193 disable_editing = true; // if a user toolbar, only allow editing of your own toolbars (just in case)
196 if (disable_editing) {
197 ['Add','Remove','Up','Down','Delete','Save','context_org','context_ws','context_usr'].forEach(
199 $(e).disabled = true;
203 ['Add','Remove','Up','Down','Delete','Save','context_org','context_ws','context_usr'].forEach(
205 $(e).disabled = false;
210 // don't allow changing ownership axis without perm
211 for (var i = 0; i < perms_not_had.length; i++) {
212 if (perms_not_had[i] == 'ADMIN_TOOLBAR_FOR_ORG') {
213 $('context_org').disabled = true;
215 if (perms_not_had[i] == 'ADMIN_TOOLBAR_FOR_WORKSTATION') {
216 $('context_ws').disabled = true;
218 if (perms_not_had[i] == 'ADMIN_TOOLBAR_FOR_USER') {
219 $('context_usr').disabled = true;
224 alert('Error in toolbar.js, handle_list1_selection(): ' + E);
228 function get_atb_from_selection() {
231 var selected = g.list1.retrieve_selection();
232 if (selected.length > 0) {
233 var treeitem = selected[0]; // seltype="single", so can be only one
234 return g.list1_map[ treeitem.getAttribute('unique_row_counter') ].row.my.atb;
240 alert('Error in toolbar.js, get_atb_id_from_selection(): ' + E);
244 function init_list2() {
246 g.list2 = new util.list('left');
248 var list2_columns = [
251 'label' : $('adminStrings').getString('staff.admin.toolbar.button_id.header'),
252 'render' : function(my) { return my.value; },
257 'label' : $('adminStrings').getString('staff.admin.toolbar.label.header'),
258 'render' : function(my) { return my.label; },
264 'columns' : list2_columns
268 alert('Error in toolbar.js, init_list2(): ' + E);
272 function get_list2_values_from_selection() {
275 var selected = g.list2.retrieve_selection();
276 for (var i = 0; i < selected.length; i++) {
277 var treeitem = selected[i];
278 values.push( g.list2_map[ treeitem.getAttribute('unique_row_counter') ].row.my.value );
282 alert('Error in toolbar.js, get_list2_values_from_selection(): ' + E);
286 function init_list3() {
288 g.list3 = new util.list('right');
290 var list3_columns = [
293 'label' : $('adminStrings').getString('staff.admin.toolbar.button_id.header'),
294 'render' : function(my) { return my.value; },
299 'label' : $('adminStrings').getString('staff.admin.toolbar.label.header'),
300 'render' : function(my) { return my.label; },
306 'columns' : list3_columns
310 alert('Error in toolbar.js, init_list2(): ' + E);
314 function get_list3_values_from_selection() {
317 var selected = g.list3.retrieve_selection();
318 for (var i = 0; i < selected.length; i++) {
319 var treeitem = selected[i];
320 values.push( g.list3_map[ treeitem.getAttribute('unique_row_counter') ].row.my.value );
324 alert('Error in toolbar.js, get_list3_values_from_selection(): ' + E);
328 function populate_list1() {
332 for (var i = 0; i < g.data.list.atb.length; i++) {
333 var rdata = g.list1.append({
336 'atb' : g.data.list.atb[i]
340 g.list1_map[ rdata.unique_row_counter ] = rdata;
343 alert('Error in toolbar.js, populate_list1(): ' + E);
347 function populate_list2_list3(list3_idx) {
350 g.list2.clear(); g.list2_map = {};
351 g.list3.clear(); g.list3_map = {};
355 // populate list3, keep track of what to filter from list2
356 for (var i = 0; i < g.layout.length; i++) {
358 var value = g.layout[i];
361 if (value.match('toolbarseparator')) {
362 label = $('adminStrings').getString('staff.admin.toolbar.toolbar_separator.list_entry');
363 } else if (value.match('toolbarspacer')) {
364 label = $('adminStrings').getString('staff.admin.toolbar.toolbar_spacer.list_entry');
366 label = g.data.toolbar_buttons[value];
370 var rdata3 = g.list3.append({
378 'no_auto_select' : typeof list3_idx != 'undefined' ? true : undefined
380 g.list3_map[ rdata3.unique_row_counter ] = rdata3;
384 if (list3_idx < 0) { list3_idx = 0; }
385 if (list3_idx >= g.list3.node.view.rowCount) { list3_idx = g.list3.node.view.rowCount - 1; }
386 g.list3.node.view.selection.select(list3_idx);
391 for (var value in g.data.toolbar_buttons) {
392 if (seen[value]) { continue; }
393 list2_data.push( { 'value' : value, 'label' : g.data.toolbar_buttons[value] } );
397 if (a.label < b.label) { return -1; }
398 if (a.label > b.label) { return 1; }
403 { 'value' : 'toolbarseparator', 'label' : $('adminStrings').getString('staff.admin.toolbar.toolbar_separator.list_entry') },
404 { 'value' : 'toolbarspacer', 'label' : $('adminStrings').getString('staff.admin.toolbar.toolbar_spacer.list_entry') }
405 //,{ 'value' : null, 'label' : '---' } // if we want to visually separate the spacer/separator from the other actions
406 ].concat(list2_data);
408 for (var i = 0; i < list2_data.length; i++) {
409 var rdata2 = g.list2.append({
415 g.list2_map[ rdata2.unique_row_counter ] = rdata2;
419 alert('Error in toolbar.js, populate_list2_list3(): ' + E);
423 function render_lib_menu() {
425 var list = util.functional.map_list(
428 var sname = o.shortname(); for (i = sname.length; i < 20; i++) sname += ' ';
430 o.name() ? sname + ' ' + o.name() : o.shortname(),
433 ( g.data.hash.aout[ o.ou_type() ].depth() * 2),
437 var ml = util.widgets.make_menulist( list, ses('ws_ou') );
438 ml.setAttribute('id','lib_menu');
440 var x = $('lib_menu_placeholder');
442 util.widgets.remove_children(x);
447 alert('Error in toolbar.js, render_lib_menu(): ' + E);
451 function lock_top_buttons() {
454 $('New').disabled = true;
455 $('Delete').disabled = true;
456 $('Save').disabled = false;
457 $('Cancel').disabled = false;
459 alert('Error in toolbar.js, lock_top_buttons(): ' + E);
463 function unlock_top_buttons() {
466 $('New').disabled = false;
467 $('Delete').disabled = false;
468 $('Save').disabled = true;
469 $('Cancel').disabled = true;
471 alert('Error in toolbar.js, lock_top_buttons(): ' + E);
478 var values_to_add = get_list2_values_from_selection();
479 var temp = get_list3_values_from_selection();
480 var add_after_this_value = temp[ temp.length - 1 ]; // last selected value from list3
481 var add_after_this_position = g.layout.indexOf(add_after_this_value) + 1;
483 for (var i = values_to_add.length - 1; i >= 0; i--) { // iterate backwards so that we add them forwards
484 if (!values_to_add[i]) { continue; }
485 if (values_to_add[i].match('toolbarseparator') || values_to_add[i].match('toolbarspacer')) {
486 values_to_add[i] = values_to_add[i] + '.' + (new Date()).getTime();
488 g.layout.splice(add_after_this_position,0,values_to_add[i]);
491 populate_list2_list3();
492 xulG.render_toolbar_layout(g.layout);
495 alert('Error in toolbar.js, Add(): ' + E);
499 function Remove(ev) {
502 var values_to_remove = get_list3_values_from_selection();
503 for (var i = 0; i < values_to_remove.length; i++) {
504 var idx = g.layout.indexOf(values_to_remove[i]);
505 g.layout.splice(idx,1);
508 populate_list2_list3();
509 xulG.render_toolbar_layout(g.layout);
512 alert('Error in toolbar.js, Remove(): ' + E);
519 var values_to_move = get_list3_values_from_selection();
521 for (var i = 0; i < values_to_move.length; i++) {
522 idx = g.layout.indexOf(values_to_move[i]);
523 if (idx == 0) { continue; }
524 g.layout.splice(idx,1);
525 g.layout.splice(idx-1,0,values_to_move[i]);
528 populate_list2_list3(idx-1);
529 xulG.render_toolbar_layout(g.layout);
532 alert('Error in toolbar.js, Up(): ' + E);
539 var values_to_move = get_list3_values_from_selection();
541 for (var i = values_to_move.length - 1; i >= 0; i--) {
542 idx = g.layout.indexOf(values_to_move[i]);
543 g.layout.splice(idx+2,0,values_to_move[i]);
544 g.layout.splice(idx,1);
547 populate_list2_list3(idx+1);
548 xulG.render_toolbar_layout(g.layout);
551 alert('Error in toolbar.js, Down(): ' + E);
555 function Delete(ev) {
557 g.selected_atb.isdeleted(1);
559 g.pcrud.apply(g.selected_atb);
561 delete g.data.hash.atb[ g.selected_atb.id() ];
564 for (var i = 0; i < g.data.list.atb.length; i++) {
565 if ( g.data.list.atb[i].id() == g.selected_atb.id() ) { idx = i; }
567 g.data.list.atb.splice(idx,1);
569 g.data.stash('hash','list');
571 unlock_top_buttons();
577 alert('Error in toolbar.js, Delete(): ' + E);
583 var perms_not_had = perm_check();
584 if (perms_not_had.length == 3) {
585 return; // we do disable the New button, but Operator Change can get around that
588 var name = window.prompt('Enter label for toolbar:');
589 if (!name) { return; }
591 var new_atb = new atb();
594 new_atb.layout('[]');
595 if (perms_not_had.indexOf('ADMIN_TOOLBAR_FOR_USER') == -1) {
596 new_atb.usr(ses('staff_id'));
597 } else if (perms_not_had.indexOf('ADMIN_TOOLBAR_FOR_WORKSTATION') == -1) {
598 new_atb.ws(ses('ws_id'));
599 } else if (perms_not_had.indexOf('ADMIN_TOOLBAR_FOR_ORG') == -1) {
600 new_atb.org($('lib_menu').value);
603 var rdata = g.list1.append({
610 g.list1_map[ rdata.unique_row_counter ] = rdata;
619 alert('Error in toolbar.js, New(): ' + E);
623 function Cancel(ev) {
625 unlock_top_buttons();
626 g.selected_atb = get_atb_from_selection();
627 if (!g.selected_atb) { return; }
629 if (g.selected_atb.id()) { // existing atb
631 g.layout = JSON2js(g.selected_atb.layout());
632 populate_list2_list3();
633 xulG.render_toolbar_layout(g.layout);
638 populate_list2_list3();
642 alert('Error in toolbar.js, Cancel(): ' + E);
648 g.selected_atb.layout( js2JSON( g.layout ) );
649 switch($('context').selectedIndex) {
651 g.selected_atb.org($('lib_menu').value);
652 g.selected_atb.ws(null);
653 g.selected_atb.usr(null);
656 g.selected_atb.org(null);
657 g.selected_atb.ws(ses('ws_id'));
658 g.selected_atb.usr(null);
661 g.selected_atb.org(null);
662 g.selected_atb.ws(null);
663 g.selected_atb.usr(ses('staff_id'));
666 g.selected_atb.ischanged(1);
668 g.pcrud.apply(g.selected_atb);
670 setTimeout( // is pcrud implicitly authoritative?
672 JSAN.use('util.network');
673 var net = new util.network;
674 var r = net.simple_request(
675 'FM_ATB_RETRIEVE_VIA_PCRUD',
680 { "ws" : g.data.list.au[0].wsid() },
681 { "usr" : g.data.list.au[0].id() },
682 { "org" : util.functional.map_list( g.data.list.my_aou, function(o) { return o.id(); } ) }
686 "order_by":{"atb":"label"}
690 g.data.hash.atb = util.functional.convert_object_list_to_hash(r,null);
693 g.data.stash('hash','list');
695 unlock_top_buttons();
702 alert('Error in toolbar.js, Save(): ' + E);