5 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
6 if (typeof JSAN == 'undefined') { throw( "The JSAN library object is missing."); }
7 JSAN.errorLevel = "die"; // none, warn, or die
8 JSAN.addRepository('/xul/server/');
9 JSAN.use('util.error'); g.error = new util.error();
10 g.error.sdump('D_TRACE','my_init() for toolbar.xul');
12 JSAN.use('OpenILS.data'); g.data = new OpenILS.data();
13 g.data.stash_retrieve();
15 JSAN.use('util.widgets');
16 JSAN.use('util.functional');
18 dojo.require('openils.PermaCrud');
20 g.pcrud = new openils.PermaCrud({
24 if (typeof window.xulG == 'object' && typeof window.xulG.set_tab_name == 'function') {
25 try { window.xulG.set_tab_name($('adminStrings').getString('staff.admin.toolbar.tab_name')); } catch(E) { alert(E); }
29 $('list_actions').appendChild( g.list1.render_list_actions() );
30 g.list1.set_list_actions();
34 // toolbutton manipulators
35 $('Add').addEventListener('command',Add,'false');
36 $('Remove').addEventListener('command',Remove,'false');
37 $('Up').addEventListener('command',Up,'false');
38 $('Down').addEventListener('command',Down,'false');
40 // toolbar manipulators
41 $('Delete').addEventListener('command',Delete,'false');
42 $('New').addEventListener('command',New,'false');
43 $('Cancel').addEventListener('command',Cancel,'false');
44 $('Save').addEventListener('command',Save,'false');
46 // restore the toolbar selection
47 window.addEventListener(
50 xulG.render_toolbar_layout();
56 $('context_org').setAttribute('label', fieldmapper.IDL.fmclasses.atb.field_map.org.label);
57 $('context_usr').setAttribute('label', fieldmapper.IDL.fmclasses.atb.field_map.usr.label);
58 $('context_ws').setAttribute('label', fieldmapper.IDL.fmclasses.atb.field_map.ws.label);
61 try { g.error.standard_unexpected_error_alert('admin/toolbar.xul',E); } catch(F) { alert(E); }
65 function init_lists() {
67 JSAN.use('util.list'); JSAN.use('patron.util');
69 // list1 = main list containing the action.toolbar entries
70 // list2 = left list containing available toolbar buttons
71 // list3 = right list containing selected toolbar buttons
78 alert('Error in toolbar.js, init_lists(): ' + E);
82 function init_list1() {
84 g.list1 = new util.list('atb_tree');
86 var list1_columns = g.list1.fm_columns('atb',{
87 '*':{'hidden':true, 'flex':0},
90 'render' : function(my) {
91 if (! my.atb.usr()) return;
92 return my.atb.usr() == ses('staff_id')
93 ? ses('staff_usrname')
94 : patron.util.retrieve_au_via_id(ses(),my.atb.usr()).usrname();
99 'fleshed_display_field' : 'shortname'
103 'render' : function(my) {
104 if (! my.atb.ws()) return;
105 return my.atb.ws() == ses('ws_id')
110 'atb_label' : { 'hidden' : false, 'flex' : 1 },
111 'atb_layout' : { 'hidden' : false, 'flex' : 2 }
115 'columns' : list1_columns,
116 'on_select' : handle_list1_selection
119 alert('Error in toolbar.js, init_list1(): ' + E);
123 function handle_list1_selection(ev) {
126 if (g.list1.node.currentIndex != g.list1_last_index) {
127 alert( $('adminStrings').getString('staff.admin.toolbar.unsaved_changes') );
128 g.list1.node.view.selection.select( g.list1_last_index );
130 return util.widgets.stop_event(ev);
132 g.list1_last_index = g.list1.node.currentIndex;
133 g.selected_atb = get_atb_from_selection();
134 if (!g.selected_atb) { return; }
135 if (g.selected_atb.org()) {
136 $('lib_menu').value = g.selected_atb.org();
137 $('context').selectedIndex = 0;
139 if (g.selected_atb.ws()) { $('context').selectedIndex = 1; }
140 if (g.selected_atb.usr()) { $('context').selectedIndex = 2; }
141 g.layout = JSON2js(g.selected_atb.layout());
142 populate_list2_list3();
143 xulG.render_toolbar_layout(g.layout);
145 alert('Error in toolbar.js, handle_list1_selection(): ' + E);
149 function get_atb_from_selection() {
152 var selected = g.list1.retrieve_selection();
153 if (selected.length > 0) {
154 var treeitem = selected[0]; // seltype="single", so can be only one
155 return g.list1_map[ treeitem.getAttribute('unique_row_counter') ].row.my.atb;
161 alert('Error in toolbar.js, get_atb_id_from_selection(): ' + E);
165 function init_list2() {
167 g.list2 = new util.list('left');
169 var list2_columns = [
172 'label' : $('adminStrings').getString('staff.admin.toolbar.button_id.header'),
173 'render' : function(my) { return my.value; },
178 'label' : $('adminStrings').getString('staff.admin.toolbar.label.header'),
179 'render' : function(my) { return my.label; },
185 'columns' : list2_columns
189 alert('Error in toolbar.js, init_list2(): ' + E);
193 function get_list2_values_from_selection() {
196 var selected = g.list2.retrieve_selection();
197 for (var i = 0; i < selected.length; i++) {
198 var treeitem = selected[i];
199 values.push( g.list2_map[ treeitem.getAttribute('unique_row_counter') ].row.my.value );
203 alert('Error in toolbar.js, get_list2_values_from_selection(): ' + E);
207 function init_list3() {
209 g.list3 = new util.list('right');
211 var list3_columns = [
214 'label' : $('adminStrings').getString('staff.admin.toolbar.button_id.header'),
215 'render' : function(my) { return my.value; },
220 'label' : $('adminStrings').getString('staff.admin.toolbar.label.header'),
221 'render' : function(my) { return my.label; },
227 'columns' : list3_columns
231 alert('Error in toolbar.js, init_list2(): ' + E);
235 function get_list3_values_from_selection() {
238 var selected = g.list3.retrieve_selection();
239 for (var i = 0; i < selected.length; i++) {
240 var treeitem = selected[i];
241 values.push( g.list3_map[ treeitem.getAttribute('unique_row_counter') ].row.my.value );
245 alert('Error in toolbar.js, get_list3_values_from_selection(): ' + E);
249 function populate_list1() {
253 for (var i = 0; i < g.data.list.atb.length; i++) {
254 var rdata = g.list1.append({
257 'atb' : g.data.list.atb[i]
261 g.list1_map[ rdata.unique_row_counter ] = rdata;
264 alert('Error in toolbar.js, populate_list1(): ' + E);
268 function populate_list2_list3(list3_idx) {
271 g.list2.clear(); g.list2_map = {};
272 g.list3.clear(); g.list3_map = {};
276 // populate list3, keep track of what to filter from list2
277 for (var i = 0; i < g.layout.length; i++) {
279 var value = g.layout[i];
282 if (value.match('toolbarseparator')) {
283 label = $('adminStrings').getString('staff.admin.toolbar.toolbar_separator.list_entry');
284 } else if (value.match('toolbarspacer')) {
285 label = $('adminStrings').getString('staff.admin.toolbar.toolbar_spacer.list_entry');
287 label = g.data.toolbar_buttons[value];
291 var rdata3 = g.list3.append({
299 'no_auto_select' : typeof list3_idx != 'undefined' ? true : undefined
301 g.list3_map[ rdata3.unique_row_counter ] = rdata3;
305 if (list3_idx < 0) { list3_idx = 0; }
306 if (list3_idx >= g.list3.node.view.rowCount) { list3_idx = g.list3.node.view.rowCount - 1; }
307 g.list3.node.view.selection.select(list3_idx);
312 for (var value in g.data.toolbar_buttons) {
313 if (seen[value]) { continue; }
314 list2_data.push( { 'value' : value, 'label' : g.data.toolbar_buttons[value] } );
318 if (a.label < b.label) { return -1; }
319 if (a.label > b.label) { return 1; }
324 { 'value' : 'toolbarseparator', 'label' : $('adminStrings').getString('staff.admin.toolbar.toolbar_separator.list_entry') },
325 { 'value' : 'toolbarspacer', 'label' : $('adminStrings').getString('staff.admin.toolbar.toolbar_spacer.list_entry') }
326 //,{ 'value' : null, 'label' : '---' } // if we want to visually separate the spacer/separator from the other actions
327 ].concat(list2_data);
329 for (var i = 0; i < list2_data.length; i++) {
330 var rdata2 = g.list2.append({
336 g.list2_map[ rdata2.unique_row_counter ] = rdata2;
340 alert('Error in toolbar.js, populate_list2_list3(): ' + E);
344 function render_lib_menu() {
346 var list = util.functional.map_list(
349 var sname = o.shortname(); for (i = sname.length; i < 20; i++) sname += ' ';
351 o.name() ? sname + ' ' + o.name() : o.shortname(),
354 ( g.data.hash.aout[ o.ou_type() ].depth() * 2),
358 var ml = util.widgets.make_menulist( list, ses('ws_ou') );
359 ml.setAttribute('id','lib_menu');
361 var x = $('lib_menu_placeholder');
363 util.widgets.remove_children(x);
368 alert('Error in toolbar.js, render_lib_menu(): ' + E);
372 function lock_top_buttons() {
375 $('New').disabled = true;
376 $('Delete').disabled = true;
377 $('Save').disabled = false;
378 $('Cancel').disabled = false;
380 alert('Error in toolbar.js, lock_top_buttons(): ' + E);
384 function unlock_top_buttons() {
387 $('New').disabled = false;
388 $('Delete').disabled = false;
389 $('Save').disabled = true;
390 $('Cancel').disabled = true;
392 alert('Error in toolbar.js, lock_top_buttons(): ' + E);
399 var values_to_add = get_list2_values_from_selection();
400 var temp = get_list3_values_from_selection();
401 var add_after_this_value = temp[ temp.length - 1 ]; // last selected value from list3
402 var add_after_this_position = g.layout.indexOf(add_after_this_value) + 1;
404 for (var i = values_to_add.length - 1; i >= 0; i--) { // iterate backwards so that we add them forwards
405 if (!values_to_add[i]) { continue; }
406 if (values_to_add[i].match('toolbarseparator') || values_to_add[i].match('toolbarspacer')) {
407 values_to_add[i] = values_to_add[i] + '.' + (new Date()).getTime();
409 g.layout.splice(add_after_this_position,0,values_to_add[i]);
412 populate_list2_list3();
413 xulG.render_toolbar_layout(g.layout);
416 alert('Error in toolbar.js, Add(): ' + E);
420 function Remove(ev) {
423 var values_to_remove = get_list3_values_from_selection();
424 for (var i = 0; i < values_to_remove.length; i++) {
425 var idx = g.layout.indexOf(values_to_remove[i]);
426 g.layout.splice(idx,1);
429 populate_list2_list3();
430 xulG.render_toolbar_layout(g.layout);
433 alert('Error in toolbar.js, Remove(): ' + E);
440 var values_to_move = get_list3_values_from_selection();
442 for (var i = 0; i < values_to_move.length; i++) {
443 idx = g.layout.indexOf(values_to_move[i]);
444 if (idx == 0) { continue; }
445 g.layout.splice(idx,1);
446 g.layout.splice(idx-1,0,values_to_move[i]);
449 populate_list2_list3(idx-1);
450 xulG.render_toolbar_layout(g.layout);
453 alert('Error in toolbar.js, Up(): ' + E);
460 var values_to_move = get_list3_values_from_selection();
462 for (var i = values_to_move.length - 1; i >= 0; i--) {
463 idx = g.layout.indexOf(values_to_move[i]);
464 g.layout.splice(idx+2,0,values_to_move[i]);
465 g.layout.splice(idx,1);
468 populate_list2_list3(idx+1);
469 xulG.render_toolbar_layout(g.layout);
472 alert('Error in toolbar.js, Down(): ' + E);
476 function Delete(ev) {
478 g.selected_atb.isdeleted(1);
480 g.pcrud.apply(g.selected_atb);
482 delete g.data.hash.atb[ g.selected_atb.id() ];
485 for (var i = 0; i < g.data.list.atb.length; i++) {
486 if ( g.data.list.atb[i].id() == g.selected_atb.id() ) { idx = i; }
488 g.data.list.atb.splice(idx,1);
490 g.data.stash('hash','list');
492 unlock_top_buttons();
498 alert('Error in toolbar.js, Delete(): ' + E);
504 var name = window.prompt('Enter label for toolbar:');
505 if (!name) { return; }
507 var new_atb = new atb();
510 new_atb.layout('[]');
511 new_atb.usr(ses('staff_id'));
513 var rdata = g.list1.append({
520 g.list1_map[ rdata.unique_row_counter ] = rdata;
529 alert('Error in toolbar.js, New(): ' + E);
533 function Cancel(ev) {
535 unlock_top_buttons();
536 g.selected_atb = get_atb_from_selection();
537 if (!g.selected_atb) { return; }
539 if (g.selected_atb.id()) { // existing atb
541 g.layout = JSON2js(g.selected_atb.layout());
542 populate_list2_list3();
543 xulG.render_toolbar_layout(g.layout);
548 populate_list2_list3();
552 alert('Error in toolbar.js, Cancel(): ' + E);
558 g.selected_atb.layout( js2JSON( g.layout ) );
559 switch($('context').selectedIndex) {
561 g.selected_atb.org($('lib_menu').value);
562 g.selected_atb.ws(null);
563 g.selected_atb.usr(null);
566 g.selected_atb.org(null);
567 g.selected_atb.ws(ses('ws_id'));
568 g.selected_atb.usr(null);
571 g.selected_atb.org(null);
572 g.selected_atb.ws(null);
573 g.selected_atb.usr(ses('staff_id'));
576 g.selected_atb.ischanged(1);
578 g.pcrud.apply(g.selected_atb);
580 setTimeout( // is pcrud implicitly authoritative?
582 JSAN.use('util.network');
583 var net = new util.network;
584 var r = net.simple_request(
585 'FM_ATB_RETRIEVE_VIA_PCRUD',
590 { "ws" : g.data.list.au[0].wsid() },
591 { "usr" : g.data.list.au[0].id() },
592 { "org" : util.functional.map_list( g.data.list.my_aou, function(o) { return o.id(); } ) }
596 "order_by":{"atb":"label"}
600 g.data.hash.atb = util.functional.convert_object_list_to_hash(r,null);
603 g.data.stash('hash','list');
605 unlock_top_buttons();
612 alert('Error in toolbar.js, Save(): ' + E);