From 5785841ead89c506102c236fd57d766b7dde259d Mon Sep 17 00:00:00 2001 From: Jason Etheridge <jason@esilibrary.com> Date: Tue, 20 Mar 2012 16:52:13 -0400 Subject: [PATCH] reworked toolbars for dynamism uses the data from action.toolbar also a Toolbar Configuration UI also added more toolbar buttons, though they need icons Signed-off-by: Jason Etheridge <jason@esilibrary.com> Signed-off-by: Thomas Berezansky <tsbere@mvlc.org> --- Open-ILS/examples/fm_IDL.xml | 2 +- Open-ILS/web/opac/locale/en-US/lang.dtd | 25 +- .../staff_client/chrome/content/OpenILS/data.js | 34 ++ .../staff_client/chrome/content/main/constants.js | 2 + .../xul/staff_client/chrome/content/main/menu.js | 286 +++++++--- .../chrome/content/main/menu_frame_menus.xul | 6 +- .../chrome/content/main/menu_frame_overlay.xul | 342 +++++++----- .../chrome/locale/en-US/offline.properties | 1 + Open-ILS/xul/staff_client/server/admin/toolbar.js | 616 +++++++++++++++++++++ Open-ILS/xul/staff_client/server/admin/toolbar.xul | 109 ++++ .../server/locale/en-US/admin.properties | 6 + 11 files changed, 1213 insertions(+), 216 deletions(-) create mode 100644 Open-ILS/xul/staff_client/server/admin/toolbar.js create mode 100644 Open-ILS/xul/staff_client/server/admin/toolbar.xul diff --git a/Open-ILS/examples/fm_IDL.xml b/Open-ILS/examples/fm_IDL.xml index 28f8ee3e1b..484c1ed7c7 100644 --- a/Open-ILS/examples/fm_IDL.xml +++ b/Open-ILS/examples/fm_IDL.xml @@ -2795,7 +2795,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA </links> <permacrud xmlns="http://open-ils.org/spec/opensrf/IDL/permacrud/v1"> <actions> - <retrieve permission="ADMIN_TOOLBAR VIEW_TOOLBAR" context_field="org"> + <retrieve permission="ADMIN_TOOLBAR STAFF_LOGIN" context_field="org"> <context link="usr" field="home_ou" /> <context link="ws" field="owning_lib" /> </retrieve> diff --git a/Open-ILS/web/opac/locale/en-US/lang.dtd b/Open-ILS/web/opac/locale/en-US/lang.dtd index a20ea1f4aa..7acd10d83e 100644 --- a/Open-ILS/web/opac/locale/en-US/lang.dtd +++ b/Open-ILS/web/opac/locale/en-US/lang.dtd @@ -190,6 +190,26 @@ <!ENTITY staff.admin.survey.save_question.label "Save this Question"> <!ENTITY staff.admin.survey.staff_client.label "Staff Client:"> <!ENTITY staff.admin.survey.start.label "Start:"> +<!ENTITY staff.admin.toolbar.new_toolbar.label "New Toolbar"> +<!ENTITY staff.admin.toolbar.new_toolbar.accesskey "N"> +<!ENTITY staff.admin.toolbar.delete_toolbar.label "Delete Toolbar"> +<!ENTITY staff.admin.toolbar.delete_toolbar.accesskey ""> +<!ENTITY staff.admin.toolbar.add_toolbar_button.label "-->"> +<!ENTITY staff.admin.toolbar.add_toolbar_button.accesskey "a"> +<!ENTITY staff.admin.toolbar.remove_toolbar_button.label "<--"> +<!ENTITY staff.admin.toolbar.remove_toolbar_button.accesskey "r"> +<!ENTITY staff.admin.toolbar.move_toolbar_button_up.label "Up"> +<!ENTITY staff.admin.toolbar.move_toolbar_button_up.accesskey "U"> +<!ENTITY staff.admin.toolbar.move_toolbar_button_down.label "Down"> +<!ENTITY staff.admin.toolbar.move_toolbar_button_down.accesskey "D"> +<!ENTITY staff.admin.toolbar.permission_context.label "Permission Context"> +<!ENTITY staff.admin.toolbar.permission_context.accesskey "P"> +<!ENTITY staff.admin.toolbar.cancel_changes.label "Cancel Changes"> +<!ENTITY staff.admin.toolbar.cancel_changes.accesskey "C"> +<!ENTITY staff.admin.toolbar.save_toolbar.label "Save Toolbar"> +<!ENTITY staff.admin.toolbar.save_toolbar.accesskey "S"> +<!ENTITY staff.admin.toolbar.header.available "Available"> +<!ENTITY staff.admin.toolbar.header.selected "Selected"> <!ENTITY staff.admin.work_log.list1.header "Most Recently Logged Staff Actions"> <!ENTITY staff.admin.work_log.list2.header "Most Recently Affected Patrons for Logged Staff Actions and Last Action for each"> <!ENTITY staff.admin.work_log.refresh_btn.label "Refresh"> @@ -664,9 +684,6 @@ <!ENTITY staff.main.auth.status "Status"> <!ENTITY staff.main.auth.version "Version"> <!ENTITY staff.main.auth.workstation "Workstation"> -<!ENTITY staff.main.button_bar.none "None"> -<!ENTITY staff.main.button_bar.circ "Circulation"> -<!ENTITY staff.main.button_bar.cat "Cataloging"> <!ENTITY staff.main.button_bar.check_out.label "Check Out"> <!ENTITY staff.main.button_bar.check_out.accesskey ""> <!ENTITY staff.main.button_bar.check_in.label "Check In"> @@ -846,6 +863,8 @@ <!ENTITY staff.main.menu.admin.client.hotkeys.clearworkstation.accesskey ""> <!ENTITY staff.main.menu.admin.client.toolbars "Toolbars"> <!ENTITY staff.main.menu.admin.client.toolbars.current "Current"> +<!ENTITY staff.main.menu.admin.client.toolbars.config.label "Configure Toolbars"> +<!ENTITY staff.main.menu.admin.client.toolbars.config.accesskey ""> <!ENTITY staff.main.menu.admin.client.toolbars.setworkstation.label "Set Workstation Default to Current"> <!ENTITY staff.main.menu.admin.client.toolbars.setworkstation.accesskey ""> <!ENTITY staff.main.menu.admin.client.toolbars.clearworkstation.label "Clear Workstation Default"> diff --git a/Open-ILS/xul/staff_client/chrome/content/OpenILS/data.js b/Open-ILS/xul/staff_client/chrome/content/OpenILS/data.js index cf31b799b7..f31ab3e574 100644 --- a/Open-ILS/xul/staff_client/chrome/content/OpenILS/data.js +++ b/Open-ILS/xul/staff_client/chrome/content/OpenILS/data.js @@ -973,6 +973,40 @@ OpenILS.data.prototype = { this.chain.push( function() { var f = gen_fm_retrieval_func( + 'atb', + [ + api.FM_ATB_RETRIEVE_VIA_PCRUD.app, + api.FM_ATB_RETRIEVE_VIA_PCRUD.method, + [ + obj.session.key, + { + "-or": [ + { "ws" : obj.list.au[0].wsid() }, + { "usr" : obj.list.au[0].id() }, + { "org" : util.functional.map_list( obj.list.my_aou, function(o) { return o.id(); } ) } + ] + }, + { + "order_by":{"atb":"label"} + } + ], + false + ] + ); + try { + f(); + } catch(E) { + var error = 'Error: ' + js2JSON(E); + obj.error.sdump('D_ERROR',error); + throw(E); + } + } + ); + + + this.chain.push( + function() { + var f = gen_fm_retrieval_func( 'acnp', [ api.FM_ACNP_RETRIEVE_VIA_PCRUD.app, diff --git a/Open-ILS/xul/staff_client/chrome/content/main/constants.js b/Open-ILS/xul/staff_client/chrome/content/main/constants.js index eea83a4aa4..6bc4d44868 100644 --- a/Open-ILS/xul/staff_client/chrome/content/main/constants.js +++ b/Open-ILS/xul/staff_client/chrome/content/main/constants.js @@ -100,6 +100,7 @@ var api = { 'FM_ACNC_RETRIEVE_VIA_PCRUD' : { 'app' : 'open-ils.pcrud', 'method' : 'open-ils.pcrud.search.acnc.atomic' }, 'FM_ACNP_RETRIEVE_VIA_PCRUD' : { 'app' : 'open-ils.pcrud', 'method' : 'open-ils.pcrud.search.acnp.atomic' }, 'FM_ACNS_RETRIEVE_VIA_PCRUD' : { 'app' : 'open-ils.pcrud', 'method' : 'open-ils.pcrud.search.acns.atomic' }, + 'FM_ATB_RETRIEVE_VIA_PCRUD' : { 'app' : 'open-ils.pcrud', 'method' : 'open-ils.pcrud.search.atb.atomic' }, 'FM_ACP_DETAILS' : { 'app' : 'open-ils.circ', 'method' : 'open-ils.circ.copy_details.retrieve' }, 'FM_ACP_DETAILS_VIA_BARCODE' : { 'app' : 'open-ils.circ', 'method' : 'open-ils.circ.copy_details.retrieve.barcode' }, 'FM_ACP_DETAILS_VIA_BARCODE.authoritative' : { 'app' : 'open-ils.circ', 'method' : 'open-ils.circ.copy_details.retrieve.barcode.authoritative' }, @@ -490,6 +491,7 @@ var urls = { 'XUL_STAT_CAT_EDIT' : '/xul/server/admin/stat_cat_editor.xhtml', 'XUL_SURVEY_WIZARD' : 'chrome://open_ils_staff_client/content/admin/survey_wizard.xul', 'XUL_TIMESTAMP_DIALOG' : '/xul/server/util/timestamp.xul', + 'XUL_TOOLBAR_CONFIG' : '/xul/server/admin/toolbar.xul', 'XUL_TRIGGER_EVENTS' : '/xul/server/patron/trigger_events.xul', 'XUL_USER_BUCKETS' : '/xul/server/patron/user_buckets.xul', 'XUL_VERIFY_CREDENTIALS' : '/xul/server/main/verify_credentials.xul', diff --git a/Open-ILS/xul/staff_client/chrome/content/main/menu.js b/Open-ILS/xul/staff_client/chrome/content/main/menu.js index d541553d91..ac27aec506 100644 --- a/Open-ILS/xul/staff_client/chrome/content/main/menu.js +++ b/Open-ILS/xul/staff_client/chrome/content/main/menu.js @@ -72,73 +72,7 @@ main.menu.prototype = { eval( r.responseText ); } - // Try workstation pref for button bar - var button_bar = xulG.pref.getCharPref('open-ils.menu.toolbar'); - - if (!button_bar) // No workstation pref? Try org unit pref. - button_bar = String( obj.data.hash.aous['ui.general.button_bar'] ); - - if (button_bar) { - var x = document.getElementById('toolbar_' + button_bar); - if (x) x.setAttribute('hidden','false'); - this.toolbar = button_bar; - } - - // Check for alternate Size pref - var toolbar_size = xulG.pref.getCharPref('open-ils.menu.toolbar.iconsize'); - if(toolbar_size) this.toolbar_size = toolbar_size; - // Check for alternate Mode pref - var toolbar_mode = xulG.pref.getCharPref('open-ils.menu.toolbar.mode'); - if(toolbar_mode) this.toolbar_mode = toolbar_mode; - // Check for alternate Label Position pref - var toolbar_labelpos = xulG.pref.getBoolPref('open-ils.menu.toolbar.labelbelow'); - if(toolbar_labelpos) this.toolbar_labelpos = toolbar_labelpos; - - if(button_bar || toolbar_size || toolbar_mode || toolbar_labelpos) { - var toolbox = document.getElementById('main_toolbox'); - var toolbars = toolbox.getElementsByTagName('toolbar'); - for(var i = 0; i < toolbars.length; i++) { - if(toolbars[i].id == 'toolbar_' + button_bar) - toolbars[i].setAttribute('hidden', 'false'); - else - toolbars[i].setAttribute('hidden', 'true'); - if(toolbar_mode) toolbars[i].setAttribute('mode', toolbar_mode); - if(toolbar_size) toolbars[i].setAttribute('iconsize', toolbar_size); - if(toolbar_labelpos) addCSSClass(toolbars[i], 'labelbelow'); - } - } - - if(button_bar) { - var x = document.getElementById('main.menu.admin.client.toolbars.current.popup'); - if (x) { - var selectitems = x.getElementsByAttribute('value',button_bar); - if(selectitems.length > 0) selectitems[0].setAttribute('checked','true'); - } - } - - if(toolbar_size) { - var x = document.getElementById('main.menu.admin.client.toolbars.size.popup'); - if (x) { - var selectitems = x.getElementsByAttribute('value',toolbar_size); - if(selectitems.length > 0) selectitems[0].setAttribute('checked','true'); - } - } - - if(toolbar_mode) { - var x = document.getElementById('main.menu.admin.client.toolbars.mode.popup'); - if (x) { - var selectitems = x.getElementsByAttribute('value',toolbar_mode); - if(selectitems.length > 0) selectitems[0].setAttribute('checked','true'); - } - } - - if(toolbar_labelpos) { - var x = document.getElementById('main.menu.admin.client.toolbars.label_position.popup'); - if (x) { - var selectitems = x.getElementsByAttribute('value',"under"); - if(selectitems.length > 0) selectitems[0].setAttribute('checked','true'); - } - } + this.button_bar_init(); var cl_first = xulG.pref.getBoolPref('oils.copy_editor.copy_location_name_first'); var menuitems = document.getElementsByAttribute('command','cmd_copy_editor_copy_location_first_toggle'); @@ -1564,14 +1498,7 @@ main.menu.prototype = { ['oncommand'], function(event) { var newToolbar = event.explicitOriginalTarget.getAttribute('value'); - var toolbox = document.getElementById('main_toolbox'); - var toolbars = toolbox.getElementsByTagName('toolbar'); - for(var i = 0; i < toolbars.length; i++) { - if(toolbars[i].id == 'toolbar_' + newToolbar) - toolbars[i].setAttribute('hidden', 'false'); - else - toolbars[i].setAttribute('hidden', 'true'); - } + obj.render_toolbar(newToolbar); obj.toolbar = newToolbar; } ], @@ -1612,6 +1539,13 @@ main.menu.prototype = { obj.toolbar_labelpos = (altPosition ? "under" : "side"); } ], + 'cmd_toolbar_configure' : [ + ['oncommand'], + function(event) { + var url = obj.url_prefix( urls.XUL_TOOLBAR_CONFIG ); + obj.command_tab(event,url,{},{}); + } + ], 'cmd_toolbar_setworkstation' : [ ['oncommand'], function() { @@ -1708,6 +1642,130 @@ main.menu.prototype = { } }, + 'button_bar_init' : function() { + try { + + var obj = this; + + JSAN.use('util.widgets'); + + // populate the menu of available toolbars + var x = document.getElementById('main.menu.admin.client.toolbars.current.popup'); + if (x) { + util.widgets.remove_children(x); + + function create_menuitem(label,value,checked) { + var menuitem = document.createElement('menuitem'); + menuitem.setAttribute('name','current_toolbar'); + menuitem.setAttribute('type','radio'); + menuitem.setAttribute('label',label); + menuitem.setAttribute('value',value); + menuitem.setAttribute('command','cmd_toolbar_set'); + if (checked) menuitem.setAttribute('checked','true'); + return menuitem; + } + + x.appendChild( + create_menuitem( + offlineStrings.getString('staff.main.button_bar.none'), + 'none', + true + ) + ); + + for (var i = 0; i < this.data.list.atb.length; i++) { + var def = this.data.list.atb[i]; + x.appendChild( + create_menuitem( + def.label(), + def.id() + ) + ); + } + } + + // Try workstation pref for button bar + var button_bar = xulG.pref.getCharPref('open-ils.menu.toolbar'); + + if (!button_bar) { // No workstation pref? Try org unit pref. + if (obj.data.hash.aous['ui.general.button_bar']) { + button_bar = String( obj.data.hash.aous['ui.general.button_bar'] ); + } + } + + if (button_bar) { + this.render_toolbar(button_bar); + this.toolbar = button_bar; + } + + // Check for alternate Size pref + var toolbar_size = xulG.pref.getCharPref('open-ils.menu.toolbar.iconsize'); + if(toolbar_size) this.toolbar_size = toolbar_size; + // Check for alternate Mode pref + var toolbar_mode = xulG.pref.getCharPref('open-ils.menu.toolbar.mode'); + if(toolbar_mode) this.toolbar_mode = toolbar_mode; + // Check for alternate Label Position pref + var toolbar_labelpos = xulG.pref.getBoolPref('open-ils.menu.toolbar.labelbelow'); + if(toolbar_labelpos) this.toolbar_labelpos = toolbar_labelpos; + + if(button_bar || toolbar_size || toolbar_mode || toolbar_labelpos) { + var toolbar = document.getElementById('toolbar_main'); + if(toolbar_mode) toolbar.setAttribute('mode', toolbar_mode); + if(toolbar_size) toolbar.setAttribute('iconsize', toolbar_size); + if(toolbar_labelpos) addCSSClass(toolbar, 'labelbelow'); + } + + if(button_bar) { + var x = document.getElementById('main.menu.admin.client.toolbars.current.popup'); + if (x) { + var selectitems = x.getElementsByAttribute('value',button_bar); + if(selectitems.length > 0) selectitems[0].setAttribute('checked','true'); + } + } + + if(toolbar_size) { + var x = document.getElementById('main.menu.admin.client.toolbars.size.popup'); + if (x) { + var selectitems = x.getElementsByAttribute('value',toolbar_size); + if(selectitems.length > 0) selectitems[0].setAttribute('checked','true'); + } + } + + if(toolbar_mode) { + var x = document.getElementById('main.menu.admin.client.toolbars.mode.popup'); + if (x) { + var selectitems = x.getElementsByAttribute('value',toolbar_mode); + if(selectitems.length > 0) selectitems[0].setAttribute('checked','true'); + } + } + + if(toolbar_labelpos) { + var x = document.getElementById('main.menu.admin.client.toolbars.label_position.popup'); + if (x) { + var selectitems = x.getElementsByAttribute('value',"under"); + if(selectitems.length > 0) selectitems[0].setAttribute('checked','true'); + } + } + + // stash the available toolbar buttons for later use in the toolbar editing interface + if (typeof this.data.toolbar_buttons == 'undefined') { + this.data.toolbar_buttons = {}; + var nl = $('palette').childNodes; + for (var i = 0; i < nl.length; i++) { + var id = nl[i].getAttribute('templateid'); + var label = nl[i].getAttribute('label'); + if (id && label) { + this.data.toolbar_buttons[ id ] = label; + } + } + this.data.stash('toolbar_buttons'); + } + + } catch(E) { + alert('Error in menu.js, button_bar_init(): ' + E); + } + }, + 'spawn_search' : function(s) { var obj = this; obj.error.sdump('D_TRACE', offlineStrings.getFormattedString('menu.spawn_search.msg', [js2JSON(s)]) ); @@ -2217,6 +2275,7 @@ commands: content_params.network_meter = obj.network_meter; content_params.page_meter = obj.page_meter; content_params.get_barcode = obj.get_barcode; + content_params.render_toolbar_layout = function(layout) { return obj.render_toolbar_layout(layout); }; content_params.set_statusbar = function(slot,text,tooltiptext,click_handler) { var e = document.getElementById('statusbarpanel'+slot); if (e) { @@ -2525,6 +2584,83 @@ commands: 'stop_observing' : function() { xulG.pref.removeObserver('oils.copy_editor.*', this); + }, + + 'render_toolbar' : function(button_bar) { + try { + + this.last_sanctioned_toolbar = button_bar; + + var toolbar = document.getElementById('toolbar_main'); + + if (button_bar == 'none' || typeof button_bar == 'undefined') { + toolbar.setAttribute('hidden','true'); + return; + } + + // find the layout + var layout; + JSAN.use('util.widgets'); JSAN.use('util.functional'); + var def = this.data.hash.atb[ button_bar ]; + if (!def) def = util.functional.find_list( this.data.list.atb, function(e) { return e.label == button_bar; } ); + if (!def) { + dump('Could not find layout for specified toolbar. Defaulting to a stock toolbar.\n'); + layout = [ 'circ_checkin', 'toolbarseparator', 'toolbarspacer', 'hotkeys_toggle' ]; + } else { + layout = JSON2js(def.layout()); + } + + this.render_toolbar_layout(layout); + + } catch(E) { + alert('Error in menu.js, render_toolbar('+button_bar+'): ' + E); + } + }, + + 'render_toolbar_layout' : function(layout) { + try { + + if (!layout) { + this.data.stash_retrieve(); + this.render_toolbar( this.last_sanctioned_toolbar ); + return; + } + + var toolbar = document.getElementById('toolbar_main'); + + // destroy existing toolbar + util.widgets.remove_children(toolbar); + + // create new one + for (var i = 0; i < layout.length; i++) { + var e = layout[i]; + switch(e) { + case 'toolbarseparator': + toolbar.appendChild( document.createElement('toolbarseparator') ); + break; + case 'toolbarspacer': + var spacer = document.createElement('toolbarspacer'); + spacer.setAttribute('flex','1'); + toolbar.appendChild( spacer ); + break; + default: + var templates = $('palette').getElementsByAttribute('templateid',e); + var template = templates.length > 0 ? templates[0] : null; + if (template) { + var clone = template.cloneNode(true); + toolbar.appendChild( clone ); + } else { + var label = document.createElement('label'); + label.setAttribute('value',e); + toolbar.appendChild( label ); + } + } + } + toolbar.setAttribute('hidden','false'); + + } catch(E) { + alert('Error in menu.js, render_toolbar_layout('+layout+'): ' + E); + } } } diff --git a/Open-ILS/xul/staff_client/chrome/content/main/menu_frame_menus.xul b/Open-ILS/xul/staff_client/chrome/content/main/menu_frame_menus.xul index c71f8e1f33..bd98d4bb8d 100644 --- a/Open-ILS/xul/staff_client/chrome/content/main/menu_frame_menus.xul +++ b/Open-ILS/xul/staff_client/chrome/content/main/menu_frame_menus.xul @@ -256,6 +256,7 @@ <command id="cmd_hotkeys_set" /> <command id="cmd_hotkeys_setworkstation" /> <command id="cmd_hotkeys_clearworkstation" /> + <command id="cmd_toolbar_configure" /> <command id="cmd_toolbar_set" /> <command id="cmd_toolbar_setworkstation" /> <command id="cmd_toolbar_clearworkstation" /> @@ -457,9 +458,6 @@ <menupopup id="main.menu.admin.client.toolbars.popup"> <menu id="main.menu.admin.client.toolbars.current" label="&staff.main.menu.admin.client.toolbars.current;"> <menupopup id="main.menu.admin.client.toolbars.current.popup"> - <menuitem name="current_toolbar" type="radio" label="&staff.main.button_bar.none;" value="none" command="cmd_toolbar_set" checked="true"/> - <menuitem name="current_toolbar" type="radio" label="&staff.main.button_bar.circ;" value="circ" command="cmd_toolbar_set"/> - <menuitem name="current_toolbar" type="radio" label="&staff.main.button_bar.cat;" value="cat" command="cmd_toolbar_set"/> </menupopup> </menu> <menu id="main.menu.admin.client.toolbars.mode" label="&staff.main.menu.admin.client.toolbars.mode;"> @@ -482,6 +480,8 @@ </menupopup> </menu> <menuseparator /> + <menuitem label="&staff.main.menu.admin.client.toolbars.config.label;" accesskey="&staff.main.menu.admin.client.toolbars.config.accesskey;" command="cmd_toolbar_configure"/> + <menuseparator /> <menuitem label="&staff.main.menu.admin.client.toolbars.setworkstation.label;" accesskey="&staff.main.menu.admin.client.toolbars.setworkstation.accesskey;" command="cmd_toolbar_setworkstation"/> <menuitem label="&staff.main.menu.admin.client.toolbars.clearworkstation.label;" accesskey="&staff.main.menu.admin.client.toolbars.clearworkstation.accesskey;" command="cmd_toolbar_clearworkstation"/> </menupopup> diff --git a/Open-ILS/xul/staff_client/chrome/content/main/menu_frame_overlay.xul b/Open-ILS/xul/staff_client/chrome/content/main/menu_frame_overlay.xul index ad4686e3c1..eb75d9883a 100644 --- a/Open-ILS/xul/staff_client/chrome/content/main/menu_frame_overlay.xul +++ b/Open-ILS/xul/staff_client/chrome/content/main/menu_frame_overlay.xul @@ -60,6 +60,212 @@ </tooltip> </box> +<toolbarpallete id="palette"> + <toolbarbutton + templateid="circ_checkout" + command="cmd_circ_checkout" + label="&staff.main.button_bar.check_out.label;" + tooltiptext="&staff.main.button_bar.check_out.label;" + type="menu-button"> + <menupopup tooltiptext=""> <!-- Little note on this first one - The blank tooltiptext stops the button's tooltiptext from applying to the menu and items --> + <menuitem label="&staff.main.menu.circ.checkout.label;" accesskey="&staff.main.menu.circ.checkout.accesskey;" command="cmd_circ_checkout"/> + <menuitem label="&staff.main.menu.circ.in_house.label;" accesskey="&staff.main.menu.circ.in_house.accesskey;" command="cmd_in_house_use"/> + </menupopup> + </toolbarbutton> + <toolbarbutton + templateid="circ_checkin" + command="cmd_circ_checkin" + label="&staff.main.button_bar.check_in.label;" + tooltiptext="&staff.main.button_bar.check_in.label;" + type="menu-button"> + <menupopup tooltiptext=""> + <menuitem label="&staff.main.menu.circ.checkin.label;" accesskey="&staff.main.menu.circ.checkin.accesskey;" command="cmd_circ_checkin"/> + <menuitem label="&staff.main.menu.circ.hold_capture.label;" accesskey="&staff.main.menu.circ.hold_capture.accesskey;" command="cmd_circ_hold_capture"/> + </menupopup> + </toolbarbutton> + <toolbarbutton + templateid="search_opac" + command="cmd_search_opac" + label="&staff.main.button_bar.search_opac.label;" + tooltiptext="&staff.main.button_bar.search_opac.label;" + type="menu-button"> + <menupopup tooltiptext=""> + <menuitem label="&staff.main.menu.cat.bib_search.label;" accesskey="&staff.main.menu.cat.bib_search.accesskey;" command="cmd_search_opac"/> + <menuitem label="&staff.main.menu.cat.search_tcn.label;" accesskey="&staff.main.menu.cat.search_tcn.accesskey;" command="cmd_search_tcn" /> + <menuitem label="&staff.main.menu.cat.search_bib_id.label;" accesskey="&staff.main.menu.cat.search_bib_id.accesskey;" command="cmd_search_bib_id" /> + </menupopup> + </toolbarbutton> + <toolbarbutton + templateid="copy_status" + command="cmd_copy_status" + label="&staff.main.button_bar.item_status.label;" + tooltiptext="&staff.main.button_bar.item_status.label;" + type="menu-button"> + <menupopup tooltiptext=""> + <menuitem label="&staff.main.menu.circ.barcode.show_item;" accesskey="&staff.main.menu.circ.barcode.show_item.accesskey;" command="cmd_copy_status"/> + <menuitem label="&staff.main.menu.replace_barcode.label;" command="cmd_replace_barcode"/> + </menupopup> + </toolbarbutton> + <toolbarbutton + templateid="patron_search" + command="cmd_patron_search" + label="&staff.main.button_bar.patron_search.label;" + tooltiptext="&staff.main.button_bar.patron_search.label;" + type="menu-button"> + <menupopup tooltiptext=""> + <menuitem label="&staff.main.menu.search.patrons.label;" accesskey="&staff.main.menu.search.patrons.accesskey;" command="cmd_patron_search" /> + <menuitem label="&staff.main.menu.search.patrons_barcode.label;" accesskey="&staff.main.menu.search.patrons_barcode.accesskey;" command="cmd_circ_checkout"/> + <menuitem label="&staff.main.menu.search.patron_db_id.label;" accesskey="&staff.main.menu.search.patron_db_id.accesskey;" command="cmd_search_usr_id"/> + </menupopup> + </toolbarbutton> + <toolbarbutton + templateid="patron_register" + command="cmd_patron_register" + label="&staff.main.button_bar.patron_registration.label;" + tooltiptext="&staff.main.button_bar.patron_registration.label;" + type="menu-button"> + <menupopup tooltiptext=""> + <menuitem label="&staff.main.menu.circ.patron_registration.label;" accesskey="&staff.main.menu.circ.patron_registration.accesskey;" command="cmd_patron_register"/> + <menuitem label="&staff.main.menu.circ.staged_patrons.label;" accesskey="&staff.main.menu.circ.staged_patrons.accesskey;" command="cmd_staged_patrons"/> + </menupopup> + </toolbarbutton> + <toolbarbutton + templateid="create_marc" + command="cmd_create_marc" + label="&staff.main.button_bar.create_marc;" + tooltiptext="&staff.main.button_bar.create_marc;" + type="menu-button"> + <menupopup tooltiptext=""> + <menuitem label="&staff.main.menu.cat.create_marc.label;" accesskey="&staff.main.menu.cat.create_marc.accesskey;" command="cmd_create_marc"/> + <menuitem label="&staff.main.menu.cat.z39_50_import.label;" accesskey="&staff.main.menu.cat.z39_50_import.accesskey;" command="cmd_z39_50_import"/> + <menuitem label="&staff.main.menu.cat.vandelay.label;" command="cmd_open_vandelay"/> + </menupopup> + </toolbarbutton> + <toolbarbutton + templateid="authority_manage" + command="cmd_authority_manage" + label="&staff.main.button_bar.authority_manage;" + tooltiptext="&staff.main.button_bar.authority_manage;" /> + <toolbarbutton + templateid="retrieve_last_record" + command="cmd_retrieve_last_record" + label="&staff.main.button_bar.retrieve_last_record;" + tooltiptext="&staff.main.button_bar.retrieve_last_record;" /> + <toolbarbutton + templateid="portal" + command="cmd_portal" + label="&staff.main.menu.file.portal.label;" + tooltiptext="&staff.main.menu.file.portal.label;" /> + <toolbarbutton + id="cmd_edit_copy_buckets" + command="cmd_edit_copy_buckets" + label="&staff.main.menu.edit.buckets.copies;" + tooltiptext="&staff.main.menu.edit.buckets.copies;" /> + <toolbarbutton + templateid="edit_record_buckets" + command="cmd_edit_record_buckets" + label="&staff.main.menu.edit.buckets.records;" + tooltiptext="&staff.main.menu.edit.buckets.records;" /> + <toolbarbutton + label="&staff.main.menu.circ.renew.label;" + tooltiptext="&staff.main.menu.circ.renew.label;" + templateid="circ_renew" + command="cmd_circ_renew"/> + <toolbarbutton + label="&staff.main.menu.circ.hold_pull.label;" + tooltiptext="&staff.main.menu.circ.hold_pull.label;" + command="cmd_circ_hold_pull_list" + templateid="circ_hold_pull_list" /> + <toolbarbutton + label="&staff.main.menu.circ.hold_browse.label;" + tooltiptext="&staff.main.menu.circ.hold_browse.label;" + command="cmd_browse_holds_shelf" + templateid="browse_holds_shelf" /> + <toolbarbutton + label="&staff.main.menu.circ.patron_retrieve.label;" + tooltiptext="&staff.main.menu.circ.patron_retrieve.label;" + command="cmd_retrieve_last_patron" + templateid="retrieve_last_patron" /> + <toolbarbutton + label="&staff.main.menu.acq.unified_search.label;" + tooltiptext="&staff.main.menu.acq.unified_search.label;" + command="cmd_acq_unified_search" + templateid="acq_unified_search" /> + <toolbarbutton + label="&staff.main.menu.acq.view_my_pl.label;" + tooltiptext="&staff.main.menu.acq.view_my_pl.label;" + command="cmd_acq_view_my_pl" + templateid="acq_view_my_pl" /> + <toolbarbutton + label="&staff.main.menu.acq.brief_record.label;" + tooltiptext="&staff.main.menu.acq.brief_record.label;" + command="cmd_acq_new_brief_record" + templateid="acq_new_brief_record" /> + <toolbarbutton + label="&staff.main.menu.acq.user_requests.label;" + tooltiptext="&staff.main.menu.acq.user_requests.label;" + command="cmd_acq_user_requests" + templateid="acq_user_requests" /> + <toolbarbutton + label="&staff.main.menu.acq.bib_search.label;" + tooltiptext="&staff.main.menu.acq.bib_search.label;" + command="cmd_acq_bib_search" + templateid="acq_bib_search" /> + <toolbarbutton + label="&staff.main.menu.acq.upload.label;" + tooltiptext="&staff.main.menu.acq.upload.label;" + command="cmd_acq_upload" + templateid="acq_upload" /> + <toolbarbutton + label="&staff.main.menu.acq.create_po.label;" + tooltiptext="&staff.main.menu.acq.create_po.label;" + command="cmd_acq_create_po" + templateid="acq_create_po" /> + <toolbarbutton + label="&staff.main.menu.acq.claim_eligible.label;" + tooltiptext="&staff.main.menu.acq.claim_eligible.label;" + command="cmd_acq_claim_eligible" + templateid="acq_claim_eligible" /> + <toolbarbutton + label="&staff.main.menu.acq.create_invoice.label;" + tooltiptext="&staff.main.menu.acq.create_invoice.label;" + command="cmd_acq_create_invoice" + templateid="acq_create_invoice" /> + <toolbarbutton + label="&staff.main.menu.booking.reservation.label;" + tooltiptext="&staff.main.menu.booking.reservation.label;" + command="cmd_booking_reservation" + templateid="booking_reservation" /> + <toolbarbutton + label="&staff.main.menu.booking.pull_list.label;" + tooltiptext="&staff.main.menu.booking.pull_list.label;" + command="cmd_booking_pull_list" + templateid="booking_pull_list" /> + <toolbarbutton + label="&staff.main.menu.booking.capture.label;" + tooltiptext="&staff.main.menu.booking.capture.label;" + command="cmd_booking_capture" + templateid="booking_capture" /> + <toolbarbutton + label="&staff.main.menu.booking.reservation_pickup.label;" + tooltiptext="&staff.main.menu.booking.reservation_pickup.label;" + command="cmd_booking_reservation_pickup" + templateid="booking_reservation_pickup" /> + <toolbarbutton + label="&staff.main.menu.booking.reservation_return.label;" + tooltiptext="&staff.main.menu.booking.reservation_return.label;" + command="cmd_booking_reservation_return" + templateid="booking_reservation_return" /> + <toolbarspacer flex="1" /> + <toolbarbutton + templateid="hotkeys_toggle" + command="cmd_hotkeys_toggle" + type="checkbox" + autocheck="false" + label="&staff.main.button_bar.hotkeys_toggle;" + tooltiptext="&staff.main.button_bar.hotkeys_toggle;"/> +</toolbarpallete> + <!-- The main top level menubar --> <toolbox id="main_toolbox"> <menubar id="main_menubar"> @@ -74,140 +280,8 @@ <menu id="main.menu.admin" /> <menu id="main.menu.help" /> </menubar> - <toolbar id="toolbar_circ" hidden="true"> - <toolbarbutton - command="cmd_circ_checkout" - label="&staff.main.button_bar.check_out.label;" - tooltiptext="&staff.main.button_bar.check_out.label;" - type="menu-button"> - <menupopup tooltiptext=""> <!-- Little note on this first one - The blank tooltiptext stops the button's tooltiptext from applying to the menu and items --> - <menuitem label="&staff.main.menu.circ.checkout.label;" accesskey="&staff.main.menu.circ.checkout.accesskey;" command="cmd_circ_checkout"/> - <menuitem label="&staff.main.menu.circ.in_house.label;" accesskey="&staff.main.menu.circ.in_house.accesskey;" command="cmd_in_house_use"/> - </menupopup> - </toolbarbutton> - <toolbarbutton - command="cmd_circ_checkin" - label="&staff.main.button_bar.check_in.label;" - tooltiptext="&staff.main.button_bar.check_in.label;" - type="menu-button"> - <menupopup tooltiptext=""> - <menuitem label="&staff.main.menu.circ.checkin.label;" accesskey="&staff.main.menu.circ.checkin.accesskey;" command="cmd_circ_checkin"/> - <menuitem label="&staff.main.menu.circ.hold_capture.label;" accesskey="&staff.main.menu.circ.hold_capture.accesskey;" command="cmd_circ_hold_capture"/> - </menupopup> - </toolbarbutton> - <toolbarseparator /> - <toolbarbutton - command="cmd_search_opac" - label="&staff.main.button_bar.search_opac.label;" - tooltiptext="&staff.main.button_bar.search_opac.label;" - type="menu-button"> - <menupopup tooltiptext=""> - <menuitem label="&staff.main.menu.cat.bib_search.label;" accesskey="&staff.main.menu.cat.bib_search.accesskey;" command="cmd_search_opac"/> - <menuitem label="&staff.main.menu.cat.search_tcn.label;" accesskey="&staff.main.menu.cat.search_tcn.accesskey;" command="cmd_search_tcn" /> - <menuitem label="&staff.main.menu.cat.search_bib_id.label;" accesskey="&staff.main.menu.cat.search_bib_id.accesskey;" command="cmd_search_bib_id" /> - </menupopup> - </toolbarbutton> - <toolbarbutton - command="cmd_copy_status" - label="&staff.main.button_bar.item_status.label;" - tooltiptext="&staff.main.button_bar.item_status.label;" - type="menu-button"> - <menupopup tooltiptext=""> - <menuitem label="&staff.main.menu.circ.barcode.show_item;" accesskey="&staff.main.menu.circ.barcode.show_item.accesskey;" command="cmd_copy_status"/> - <menuitem label="&staff.main.menu.replace_barcode.label;" command="cmd_replace_barcode"/> - </menupopup> - </toolbarbutton> - <toolbarseparator /> - <toolbarbutton - command="cmd_patron_search" - label="&staff.main.button_bar.patron_search.label;" - tooltiptext="&staff.main.button_bar.patron_search.label;" - type="menu-button"> - <menupopup tooltiptext=""> - <menuitem label="&staff.main.menu.search.patrons.label;" accesskey="&staff.main.menu.search.patrons.accesskey;" command="cmd_patron_search" /> - <menuitem label="&staff.main.menu.search.patrons_barcode.label;" accesskey="&staff.main.menu.search.patrons_barcode.accesskey;" command="cmd_circ_checkout"/> - <menuitem label="&staff.main.menu.search.patron_db_id.label;" accesskey="&staff.main.menu.search.patron_db_id.accesskey;" command="cmd_search_usr_id"/> - </menupopup> - </toolbarbutton> - <toolbarbutton - command="cmd_patron_register" - label="&staff.main.button_bar.patron_registration.label;" - tooltiptext="&staff.main.button_bar.patron_registration.label;" - type="menu-button"> - <menupopup tooltiptext=""> - <menuitem label="&staff.main.menu.circ.patron_registration.label;" accesskey="&staff.main.menu.circ.patron_registration.accesskey;" command="cmd_patron_register"/> - <menuitem label="&staff.main.menu.circ.staged_patrons.label;" accesskey="&staff.main.menu.circ.staged_patrons.accesskey;" command="cmd_staged_patrons"/> - </menupopup> - </toolbarbutton> - <toolbarspacer flex="1" /> - <toolbarbutton - command="cmd_hotkeys_toggle" - type="checkbox" - autocheck="false" - label="&staff.main.button_bar.hotkeys_toggle;" - tooltiptext="&staff.main.button_bar.hotkeys_toggle;"/> - </toolbar> - <toolbar id="toolbar_cat" hidden="true"> - <toolbarbutton - command="cmd_circ_checkin" - label="&staff.main.button_bar.check_in.label;" - tooltiptext="&staff.main.button_bar.check_in.label;" - type="menu-button"> - <menupopup tooltiptext=""> - <menuitem label="&staff.main.menu.circ.checkin.label;" accesskey="&staff.main.menu.circ.checkin.accesskey;" command="cmd_circ_checkin"/> - <menuitem label="&staff.main.menu.circ.hold_capture.label;" accesskey="&staff.main.menu.circ.hold_capture.accesskey;" command="cmd_circ_hold_capture"/> - </menupopup> - </toolbarbutton> - <toolbarseparator /> - <toolbarbutton - command="cmd_search_opac" - label="&staff.main.button_bar.search_opac.label;" - tooltiptext="&staff.main.button_bar.search_opac.label;" - type="menu-button"> - <menupopup tooltiptext=""> - <menuitem label="&staff.main.menu.cat.bib_search.label;" accesskey="&staff.main.menu.cat.bib_search.accesskey;" command="cmd_search_opac"/> - <menuitem label="&staff.main.menu.cat.search_tcn.label;" accesskey="&staff.main.menu.cat.search_tcn.accesskey;" command="cmd_search_tcn" /> - <menuitem label="&staff.main.menu.cat.search_bib_id.label;" accesskey="&staff.main.menu.cat.search_bib_id.accesskey;" command="cmd_search_bib_id" /> - </menupopup> - </toolbarbutton> - <toolbarbutton - command="cmd_copy_status" - label="&staff.main.button_bar.item_status.label;" - tooltiptext="&staff.main.button_bar.item_status.label;" - type="menu-button"> - <menupopup tooltiptext=""> - <menuitem label="&staff.main.menu.circ.barcode.show_item;" accesskey="&staff.main.menu.circ.barcode.show_item.accesskey;" command="cmd_copy_status"/> - <menuitem label="&staff.main.menu.replace_barcode.label;" command="cmd_replace_barcode"/> - </menupopup> - </toolbarbutton> - <toolbarseparator /> - <toolbarbutton - command="cmd_create_marc" - label="&staff.main.button_bar.create_marc;" - tooltiptext="&staff.main.button_bar.create_marc;" - type="menu-button"> - <menupopup tooltiptext=""> - <menuitem label="&staff.main.menu.cat.create_marc.label;" accesskey="&staff.main.menu.cat.create_marc.accesskey;" command="cmd_create_marc"/> - <menuitem label="&staff.main.menu.cat.z39_50_import.label;" accesskey="&staff.main.menu.cat.z39_50_import.accesskey;" command="cmd_z39_50_import"/> - <menuitem label="&staff.main.menu.cat.vandelay.label;" command="cmd_open_vandelay"/> - </menupopup> - </toolbarbutton> - <toolbarbutton - command="cmd_authority_manage" - label="&staff.main.button_bar.authority_manage;" - tooltiptext="&staff.main.button_bar.authority_manage;" /> - <toolbarbutton - command="cmd_retrieve_last_record" - label="&staff.main.button_bar.retrieve_last_record;" - tooltiptext="&staff.main.button_bar.retrieve_last_record;" /> - <toolbarspacer flex="1" /> - <toolbarbutton - command="cmd_hotkeys_toggle" - type="checkbox" - autocheck="false" - label="&staff.main.button_bar.hotkeys_toggle;" - tooltiptext="&staff.main.button_bar.hotkeys_toggle;"/> - </toolbar> + <toolbar id="toolbar_main" hidden="true"/> + <toolbarpallete id="palette" hidden="true"/> </toolbox> </overlay> diff --git a/Open-ILS/xul/staff_client/chrome/locale/en-US/offline.properties b/Open-ILS/xul/staff_client/chrome/locale/en-US/offline.properties index 71485fc991..af40f0817b 100644 --- a/Open-ILS/xul/staff_client/chrome/locale/en-US/offline.properties +++ b/Open-ILS/xul/staff_client/chrome/locale/en-US/offline.properties @@ -316,3 +316,4 @@ barcode_choice.actor_label=Patron : %1$s barcode_choice.asset_label=Item : %1$s barcode_choice.serial_label=Serial : %1$s barcode_choice.booking_label=Booking : %1$s +staff.main.button_bar.none=None diff --git a/Open-ILS/xul/staff_client/server/admin/toolbar.js b/Open-ILS/xul/staff_client/server/admin/toolbar.js new file mode 100644 index 0000000000..717a87a737 --- /dev/null +++ b/Open-ILS/xul/staff_client/server/admin/toolbar.js @@ -0,0 +1,616 @@ +var g = {}; + +function my_init() { + try { + netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); + if (typeof JSAN == 'undefined') { throw( "The JSAN library object is missing."); } + JSAN.errorLevel = "die"; // none, warn, or die + JSAN.addRepository('/xul/server/'); + JSAN.use('util.error'); g.error = new util.error(); + g.error.sdump('D_TRACE','my_init() for toolbar.xul'); + + JSAN.use('OpenILS.data'); g.data = new OpenILS.data(); + g.data.stash_retrieve(); + + JSAN.use('util.widgets'); + JSAN.use('util.functional'); + + dojo.require('openils.PermaCrud'); + + g.pcrud = new openils.PermaCrud({ + authtoken :ses() + }); + + if (typeof window.xulG == 'object' && typeof window.xulG.set_tab_name == 'function') { + try { window.xulG.set_tab_name($('adminStrings').getString('staff.admin.toolbar.tab_name')); } catch(E) { alert(E); } + } + + init_lists(); + $('list_actions').appendChild( g.list1.render_list_actions() ); + g.list1.set_list_actions(); + populate_list1(); + render_lib_menu(); + + // toolbutton manipulators + $('Add').addEventListener('command',Add,'false'); + $('Remove').addEventListener('command',Remove,'false'); + $('Up').addEventListener('command',Up,'false'); + $('Down').addEventListener('command',Down,'false'); + + // toolbar manipulators + $('Delete').addEventListener('command',Delete,'false'); + $('New').addEventListener('command',New,'false'); + $('Cancel').addEventListener('command',Cancel,'false'); + $('Save').addEventListener('command',Save,'false'); + + // restore the toolbar selection + window.addEventListener( + 'unload', + function(ev) { + xulG.render_toolbar_layout(); + }, + false + ); + + // i18n + $('context_org').setAttribute('label', fieldmapper.IDL.fmclasses.atb.field_map.org.label); + $('context_usr').setAttribute('label', fieldmapper.IDL.fmclasses.atb.field_map.usr.label); + $('context_ws').setAttribute('label', fieldmapper.IDL.fmclasses.atb.field_map.ws.label); + + } catch(E) { + try { g.error.standard_unexpected_error_alert('admin/toolbar.xul',E); } catch(F) { alert(E); } + } +} + +function init_lists() { + try { + JSAN.use('util.list'); JSAN.use('patron.util'); + + // list1 = main list containing the action.toolbar entries + // list2 = left list containing available toolbar buttons + // list3 = right list containing selected toolbar buttons + + init_list1(); + init_list2(); + init_list3(); + + } catch(E) { + alert('Error in toolbar.js, init_lists(): ' + E); + } +} + +function init_list1() { + try { + g.list1 = new util.list('atb_tree'); + + var list1_columns = g.list1.fm_columns('atb',{ + '*':{'hidden':true, 'flex':0}, + 'atb_usr' : { + 'hidden' : false, + 'render' : function(my) { + if (! my.atb.usr()) return; + return my.atb.usr() == ses('staff_id') + ? ses('staff_usrname') + : patron.util.retrieve_au_via_id(ses(),my.atb.usr()).usrname(); + } + }, + 'atb_org' : { + 'hidden' : false, + 'fleshed_display_field' : 'shortname' + }, + 'atb_ws' : { + 'hidden' : false, + 'render' : function(my) { + if (! my.atb.ws()) return; + return my.atb.ws() == ses('ws_id') + ? ses('ws_name') + : my.atb.ws(); + } + }, + 'atb_label' : { 'hidden' : false, 'flex' : 1 }, + 'atb_layout' : { 'hidden' : false, 'flex' : 2 } + }); + + g.list1.init({ + 'columns' : list1_columns, + 'on_select' : handle_list1_selection + }); + } catch(E) { + alert('Error in toolbar.js, init_list1(): ' + E); + } +} + +function handle_list1_selection(ev) { + try { + if (oils_lock > 0) { + if (g.list1.node.currentIndex != g.list1_last_index) { + alert( $('adminStrings').getString('staff.admin.toolbar.unsaved_changes') ); + g.list1.node.view.selection.select( g.list1_last_index ); + } + return util.widgets.stop_event(ev); + } + g.list1_last_index = g.list1.node.currentIndex; + g.selected_atb = get_atb_from_selection(); + if (!g.selected_atb) { return; } + if (g.selected_atb.org()) { + $('lib_menu').value = g.selected_atb.org(); + $('context').selectedIndex = 0; + } + if (g.selected_atb.ws()) { $('context').selectedIndex = 1; } + if (g.selected_atb.usr()) { $('context').selectedIndex = 2; } + g.layout = JSON2js(g.selected_atb.layout()); + populate_list2_list3(); + xulG.render_toolbar_layout(g.layout); + } catch(E) { + alert('Error in toolbar.js, handle_list1_selection(): ' + E); + } +} + +function get_atb_from_selection() { + try { + + var selected = g.list1.retrieve_selection(); + if (selected.length > 0) { + var treeitem = selected[0]; // seltype="single", so can be only one + return g.list1_map[ treeitem.getAttribute('unique_row_counter') ].row.my.atb; + } else { + return null; + } + + } catch(E) { + alert('Error in toolbar.js, get_atb_id_from_selection(): ' + E); + } +} + +function init_list2() { + try { + g.list2 = new util.list('left'); + + var list2_columns = [ + { + 'id' : 'value', + 'label' : $('adminStrings').getString('staff.admin.toolbar.button_id.header'), + 'render' : function(my) { return my.value; }, + 'flex' : 1 + }, + { + 'id' : 'label', + 'label' : $('adminStrings').getString('staff.admin.toolbar.label.header'), + 'render' : function(my) { return my.label; }, + 'flex' : 1 + } + ]; + + g.list2.init({ + 'columns' : list2_columns + }); + + } catch(E) { + alert('Error in toolbar.js, init_list2(): ' + E); + } +} + +function get_list2_values_from_selection() { + try { + var values = []; + var selected = g.list2.retrieve_selection(); + for (var i = 0; i < selected.length; i++) { + var treeitem = selected[i]; + values.push( g.list2_map[ treeitem.getAttribute('unique_row_counter') ].row.my.value ); + } + return values; + } catch(E) { + alert('Error in toolbar.js, get_list2_values_from_selection(): ' + E); + } +} + +function init_list3() { + try { + g.list3 = new util.list('right'); + + var list3_columns = [ + { + 'id' : 'value', + 'label' : $('adminStrings').getString('staff.admin.toolbar.button_id.header'), + 'render' : function(my) { return my.value; }, + 'flex' : 1 + }, + { + 'id' : 'label', + 'label' : $('adminStrings').getString('staff.admin.toolbar.label.header'), + 'render' : function(my) { return my.label; }, + 'flex' : 1 + } + ]; + + g.list3.init({ + 'columns' : list3_columns + }); + + } catch(E) { + alert('Error in toolbar.js, init_list2(): ' + E); + } +} + +function get_list3_values_from_selection() { + try { + var values = []; + var selected = g.list3.retrieve_selection(); + for (var i = 0; i < selected.length; i++) { + var treeitem = selected[i]; + values.push( g.list3_map[ treeitem.getAttribute('unique_row_counter') ].row.my.value ); + } + return values; + } catch(E) { + alert('Error in toolbar.js, get_list3_values_from_selection(): ' + E); + } +} + +function populate_list1() { + try { + g.list1.clear(); + g.list1_map = {}; + for (var i = 0; i < g.data.list.atb.length; i++) { + var rdata = g.list1.append({ + 'row' : { + 'my' : { + 'atb' : g.data.list.atb[i] + } + } + }); + g.list1_map[ rdata.unique_row_counter ] = rdata; + } + } catch(E) { + alert('Error in toolbar.js, populate_list1(): ' + E); + } +} + +function populate_list2_list3(list3_idx) { + try { + + g.list2.clear(); g.list2_map = {}; + g.list3.clear(); g.list3_map = {}; + + var seen = {}; + + // populate list3, keep track of what to filter from list2 + for (var i = 0; i < g.layout.length; i++) { + + var value = g.layout[i]; + var label; + + switch(value) { + case 'toolbarseparator': + label = $('adminStrings').getString('staff.admin.toolbar.toolbar_separator.list_entry'); + break; + case 'toolbarspacer': + label = $('adminStrings').getString('staff.admin.toolbar.toolbar_spacer.list_entry'); + break; + default: + label = g.data.toolbar_buttons[value]; + seen[value] = true; + break; + } + + var rdata3 = g.list3.append({ + 'row' : { + 'my' : { + 'value' : value, + 'label' : label + } + }, + 'to_bottom' : true, + 'no_auto_select' : typeof list3_idx != 'undefined' ? true : undefined + }); + g.list3_map[ rdata3.unique_row_counter ] = rdata3; + } + + if (list3_idx) { + if (list3_idx < 0) { list3_idx = 0; } + g.list3.node.view.selection.select(list3_idx); + } + + // populate list2 + var list2_data = []; + for (var value in g.data.toolbar_buttons) { + if (seen[value]) { continue; } + list2_data.push( { 'value' : value, 'label' : g.data.toolbar_buttons[value] } ); + } + list2_data.sort( + function(a,b) { + if (a.label < b.label) { return -1; } + if (a.label > b.label) { return 1; } + return 0; + } + ); + list2_data = [ + { 'value' : 'toolbarseparator', 'label' : $('adminStrings').getString('staff.admin.toolbar.toolbar_separator.list_entry') }, + { 'value' : 'toolbarspacer', 'label' : $('adminStrings').getString('staff.admin.toolbar.toolbar_spacer.list_entry') } + //,{ 'value' : null, 'label' : '---' } // if we want to visually separate the spacer/separator from the other actions + ].concat(list2_data); + + for (var i = 0; i < list2_data.length; i++) { + var rdata2 = g.list2.append({ + 'row' : { + 'my' : list2_data[i] + }, + 'to_bottom' : true + }); + g.list2_map[ rdata2.unique_row_counter ] = rdata2; + } + + } catch(E) { + alert('Error in toolbar.js, populate_list2_list3(): ' + E); + } +} + +function render_lib_menu() { + try { + var list = util.functional.map_list( + g.data.list.aou, + function(o) { + var sname = o.shortname(); for (i = sname.length; i < 20; i++) sname += ' '; + return [ + o.name() ? sname + ' ' + o.name() : o.shortname(), + o.id(), + false, + ( g.data.hash.aout[ o.ou_type() ].depth() * 2), + ]; + } + ); + var ml = util.widgets.make_menulist( list, ses('ws_ou') ); + ml.setAttribute('id','lib_menu'); + + var x = $('lib_menu_placeholder'); + if (x) { + util.widgets.remove_children(x); + x.appendChild(ml); + } + + } catch(E) { + alert('Error in toolbar.js, render_lib_menu(): ' + E); + } +} + +function lock_top_buttons() { + try { + oils_lock_page(); + $('New').disabled = true; + $('Delete').disabled = true; + $('Save').disabled = false; + $('Cancel').disabled = false; + } catch(E) { + alert('Error in toolbar.js, lock_top_buttons(): ' + E); + } +} + +function unlock_top_buttons() { + try { + oils_unlock_page(); + $('New').disabled = false; + $('Delete').disabled = false; + $('Save').disabled = true; + $('Cancel').disabled = true; + } catch(E) { + alert('Error in toolbar.js, lock_top_buttons(): ' + E); + } +} + +function Add(ev) { + try { + lock_top_buttons(); + var values_to_add = get_list2_values_from_selection(); + var temp = get_list3_values_from_selection(); + var add_after_this_value = temp[ temp.length - 1 ]; // last selected value from list3 + var add_after_this_position = g.layout.indexOf(add_after_this_value) + 1; + + for (var i = values_to_add.length - 1; i >= 0; i--) { // iterate backwards so that we add them forwards + if (!values_to_add[i]) { continue; } + g.layout.splice(add_after_this_position,0,values_to_add[i]); + } + + populate_list2_list3(); + xulG.render_toolbar_layout(g.layout); + + } catch(E) { + alert('Error in toolbar.js, Add(): ' + E); + } +} + +function Remove(ev) { + try { + lock_top_buttons(); + var values_to_remove = get_list3_values_from_selection(); + for (var i = 0; i < values_to_remove.length; i++) { + var idx = g.layout.indexOf(values_to_remove[i]); + g.layout.splice(idx,1); + } + + populate_list2_list3(); + xulG.render_toolbar_layout(g.layout); + + } catch(E) { + alert('Error in toolbar.js, Remove(): ' + E); + } +} + +function Up(ev) { + try { + lock_top_buttons(); + var values_to_move = get_list3_values_from_selection(); + var idx; + for (var i = 0; i < values_to_move.length; i++) { + idx = g.layout.indexOf(values_to_move[i]); + if (idx == 0) { continue; } + g.layout.splice(idx,1); + g.layout.splice(idx-1,0,values_to_move[i]); + } + + populate_list2_list3(idx-1); + xulG.render_toolbar_layout(g.layout); + + } catch(E) { + alert('Error in toolbar.js, Up(): ' + E); + } +} + +function Down(ev) { + try { + lock_top_buttons(); + var values_to_move = get_list3_values_from_selection(); + var idx; + for (var i = values_to_move.length - 1; i >= 0; i--) { + idx = g.layout.indexOf(values_to_move[i]); + g.layout.splice(idx+2,0,values_to_move[i]); + g.layout.splice(idx,1); + } + + populate_list2_list3(idx+1); + xulG.render_toolbar_layout(g.layout); + + } catch(E) { + alert('Error in toolbar.js, Down(): ' + E); + } +} + +function Delete(ev) { + try { + g.selected_atb.isdeleted(1); + + g.pcrud.apply(g.selected_atb); + + delete g.data.hash.atb[ g.selected_atb.id() ]; + + var idx; + for (var i = 0; i < g.data.list.atb.length; i++) { + if ( g.data.list.atb[i].id() == g.selected_atb.id() ) { idx = i; } + } + g.data.list.atb.splice(idx,1); + + g.data.stash('hash','list'); + + unlock_top_buttons(); + + populate_list1(); + + + } catch(E) { + alert('Error in toolbar.js, Delete(): ' + E); + } +} + +function New(ev) { + try { + var name = window.prompt('Enter label for toolbar:'); + if (!name) { return; } + + var new_atb = new atb(); + new_atb.isnew('1'); + new_atb.label(name); + new_atb.layout('[]'); + new_atb.usr(ses('staff_id')); + + var rdata = g.list1.append({ + 'row' : { + 'my' : { + 'atb' : new_atb + } + } + }); + g.list1_map[ rdata.unique_row_counter ] = rdata; + + setTimeout( + function() { + lock_top_buttons(); + }, 1000 + ); + + } catch(E) { + alert('Error in toolbar.js, New(): ' + E); + } +} + +function Cancel(ev) { + try { + unlock_top_buttons(); + g.selected_atb = get_atb_from_selection(); + if (!g.selected_atb) { return; } + + if (g.selected_atb.id()) { // existing atb + + g.layout = JSON2js(g.selected_atb.layout()); + populate_list2_list3(); + xulG.render_toolbar_layout(g.layout); + + } else { // new atb + + populate_list1(); + populate_list2_list3(); + } + + } catch(E) { + alert('Error in toolbar.js, Cancel(): ' + E); + } +} + +function Save(ev) { + try { + g.selected_atb.layout( js2JSON( g.layout ) ); + switch($('context').selectedIndex) { + case 0: // org + g.selected_atb.org($('lib_menu').value); + g.selected_atb.ws(null); + g.selected_atb.usr(null); + break; + case 1: // ws + g.selected_atb.org(null); + g.selected_atb.ws(ses('ws_id')); + g.selected_atb.usr(null); + break; + case 2: // usr + g.selected_atb.org(null); + g.selected_atb.ws(null); + g.selected_atb.usr(ses('staff_id')); + break; + } + g.selected_atb.ischanged(1); + + g.pcrud.apply(g.selected_atb); + + setTimeout( // is pcrud implicitly authoritative? + function() { + JSAN.use('util.network'); + var net = new util.network; + var r = net.simple_request( + 'FM_ATB_RETRIEVE_VIA_PCRUD', + [ + ses(), + { + "-or": [ + { "ws" : g.data.list.au[0].wsid() }, + { "usr" : g.data.list.au[0].id() }, + { "org" : util.functional.map_list( g.data.list.my_aou, function(o) { return o.id(); } ) } + ] + }, + { + "order_by":{"atb":"label"} + } + ] + ); + g.data.hash.atb = util.functional.convert_object_list_to_hash(r,null); + g.data.list.atb = r; + + g.data.stash('hash','list'); + + unlock_top_buttons(); + + populate_list1(); + }, 1000 + ); + + } catch(E) { + alert('Error in toolbar.js, Save(): ' + E); + } +} + + diff --git a/Open-ILS/xul/staff_client/server/admin/toolbar.xul b/Open-ILS/xul/staff_client/server/admin/toolbar.xul new file mode 100644 index 0000000000..5732674034 --- /dev/null +++ b/Open-ILS/xul/staff_client/server/admin/toolbar.xul @@ -0,0 +1,109 @@ +<?xml version="1.0"?> +<!-- Application: Evergreen Staff Client --> +<!-- Screen: Example Template for remote xul --> + +<!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// --> +<!-- STYLESHEETS --> +<?xml-stylesheet href="chrome://global/skin/" type="text/css"?> +<?xml-stylesheet href="/xul/server/skin/global.css" type="text/css"?> + +<!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// --> +<!-- LOCALIZATION --> +<!DOCTYPE window PUBLIC "" ""[ + <!--#include virtual="/opac/locale/${locale}/lang.dtd"--> +]> + +<!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// --> +<!-- OVERLAYS --> +<?xul-overlay href="/xul/server/OpenILS/util_overlay.xul"?> + +<window id="main_toolbar_win" + onload="try { my_init(); font_helper(); persist_helper(); } catch(E) { alert(E); }" + xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> + + <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// --> + <!-- BEHAVIOR --> + <script type="text/javascript"> + var myPackageDir = 'open_ils_staff_client'; var IAMXUL = true; + </script> + <scripts id="openils_util_scripts"/> + <messagecatalog id="adminStrings" src='/xul/server/locale/<!--#echo var="locale"-->/admin.properties'/> + + <script type="text/javascript" src="/xul/server/main/JSAN.js"/> + <script type="text/javascript" src="toolbar.js"/> + + <vbox flex="1"> + + <hbox> + <spacer flex="1"/> + <button id="Delete" + label="&staff.admin.toolbar.delete_toolbar.label;" + accesskey="&staff.admin.toolbar.delete_toolbar.accesskey;" + /> + <button id="New" + label="&staff.admin.toolbar.new_toolbar.label;" + accesskey="&staff.admin.toolbar.new_toolbar.accesskey;" + /> + </hbox> + <tree id="atb_tree" flex="1" enableColumnDrag="true" seltype="single"/> + <hbox id="list_actions"/> + <splitter><grippy/></splitter> + <hbox flex="1"> + <vbox flex="1"> + <label value="&staff.admin.toolbar.header.available;" /> + <tree id="left" flex="1" enableColumnDrag="true" /> + </vbox> + <splitter/> + <vbox> + <spacer flex="1"/> + <button id="Remove" + label="&staff.admin.toolbar.remove_toolbar_button.label;" + accesskey="&staff.admin.toolbar.remove_toolbar_button.accesskey;" + /> + <button id="Add" + label="&staff.admin.toolbar.add_toolbar_button.label;" + accesskey="&staff.admin.toolbar.add_toolbar_button.accesskey;" + /> + <spacer flex="1"/> + <button id="Up" + label="&staff.admin.toolbar.move_toolbar_button_up.label;" + accesskey="&staff.admin.toolbar.move_toolbar_button_up.accesskey;" + /> + <button id="Down" + label="&staff.admin.toolbar.move_toolbar_button_down.label;" + accesskey="&staff.admin.toolbar.move_toolbar_button_down.accesskey;" + /> + <spacer flex="1"/> + </vbox> + <splitter/> + <vbox flex="1"> + <label value="&staff.admin.toolbar.header.selected;" /> + <tree id="right" flex="1" enableColumnDrag="true" /> + </vbox> + </hbox> + <hbox> + <label control="context" + value="&staff.admin.toolbar.permission_context.label;" + accesskey="&staff.admin.toolbar.permission_context.accesskey;" + /> + <hbox id="lib_menu_placeholder" /> + <radiogroup id="context" orient="horizontal"> + <radio id="context_org" /> + <radio id="context_ws" /> + <radio id="context_usr" /> + </radiogroup> + <spacer flex="1"/> + <button id="Cancel" disabled="true" + label="&staff.admin.toolbar.cancel_changes.label;" + accesskey="&staff.admin.toolbar.cancel_changes.accesskey;" + /> + <button id="Save" disabled="true" + label="&staff.admin.toolbar.save_toolbar.label;" + accesskey="&staff.admin.toolbar.save_toolbar.accesskey;" + /> + </hbox> + + </vbox> + +</window> + diff --git a/Open-ILS/xul/staff_client/server/locale/en-US/admin.properties b/Open-ILS/xul/staff_client/server/locale/en-US/admin.properties index 3f0428a420..5287a5677e 100644 --- a/Open-ILS/xul/staff_client/server/locale/en-US/admin.properties +++ b/Open-ILS/xul/staff_client/server/locale/en-US/admin.properties @@ -28,6 +28,12 @@ staff.admin.font_settings.status_msg.ALL_FONTS_15PT=Global Font set to 15pt staff.admin.font_settings.status_msg.ALL_FONTS_16PT=Global Font set to 16pt staff.admin.font_settings.status_msg.ALL_FONTS_17PT=Global Font set to 17pt staff.admin.font_settings.status_msg.ALL_FONTS_18PT=Global Font set to 18pt +staff.admin.toolbar.unsaved_changes=Unsaved changes. Choose either Save Toolbar or Cancel Changes if you wish to select a different toolbar. +staff.admin.toolbar.tab_name=Toolbars +staff.admin.toolbar.button_id.header=Button ID +staff.admin.toolbar.label.header=Label +staff.admin.toolbar.toolbar_separator.list_entry=Toolbar Separator +staff.admin.toolbar.toolbar_spacer.list_entry=Toolbar Spacer staff.admin.transit_list.missing_list=Missing library list. staff.admin.transit_list.no_match=No matching transits. staff.admin.transit_list.invalid_date=Invalid Date (%1$s), setting to Today -- 2.11.0