reworked toolbars for dynamism
authorJason Etheridge <jason@esilibrary.com>
Tue, 20 Mar 2012 20:52:13 +0000 (16:52 -0400)
committerThomas Berezansky <tsbere@mvlc.org>
Wed, 28 Mar 2012 19:32:33 +0000 (15:32 -0400)
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
Open-ILS/web/opac/locale/en-US/lang.dtd
Open-ILS/xul/staff_client/chrome/content/OpenILS/data.js
Open-ILS/xul/staff_client/chrome/content/main/constants.js
Open-ILS/xul/staff_client/chrome/content/main/menu.js
Open-ILS/xul/staff_client/chrome/content/main/menu_frame_menus.xul
Open-ILS/xul/staff_client/chrome/content/main/menu_frame_overlay.xul
Open-ILS/xul/staff_client/chrome/locale/en-US/offline.properties
Open-ILS/xul/staff_client/server/admin/toolbar.js [new file with mode: 0644]
Open-ILS/xul/staff_client/server/admin/toolbar.xul [new file with mode: 0644]
Open-ILS/xul/staff_client/server/locale/en-US/admin.properties

index 28f8ee3..484c1ed 100644 (file)
@@ -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>
index a20ea1f..7acd10d 100644 (file)
 <!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 "--&gt;">
+<!ENTITY staff.admin.toolbar.add_toolbar_button.accesskey "a">
+<!ENTITY staff.admin.toolbar.remove_toolbar_button.label "&lt;--">
+<!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">
 <!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">
 <!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">
index cf31b79..f31ab3e 100644 (file)
@@ -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,
index eea83a4..6bc4d44 100644 (file)
@@ -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',
index d541553..ac27aec 100644 (file)
@@ -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);
+        }
     }
 }
 
index c71f8e1..bd98d4b 100644 (file)
     <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" />
                     <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;">
                             </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>
index ad4686e..eb75d98 100644 (file)
     </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">
         <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>
index 71485fc..af40f08 100644 (file)
@@ -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 (file)
index 0000000..717a87a
--- /dev/null
@@ -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 (file)
index 0000000..5732674
--- /dev/null
@@ -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>
+
index 3f0428a..5287a56 100644 (file)
@@ -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