Renew Item interface, where you can scan in the item barcodes and a renewal attempt...
authorphasefx <phasefx@dcc99617-32d9-48b4-a31d-7c20da2025e4>
Fri, 18 Sep 2009 20:29:15 +0000 (20:29 +0000)
committerphasefx <phasefx@dcc99617-32d9-48b4-a31d-7c20da2025e4>
Fri, 18 Sep 2009 20:29:15 +0000 (20:29 +0000)
Not as clean as it could be if implemented from scratch; it's a paired down derivative of the checkin interface.

Possible TODO: Provide an Override checkbox so that all subsequent renewal attempts are made with .override

git-svn-id: svn://svn.open-ils.org/ILS/trunk@14060 dcc99617-32d9-48b4-a31d-7c20da2025e4

Open-ILS/web/opac/locale/en-US/lang.dtd
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/server/circ/renew.js [new file with mode: 0644]
Open-ILS/xul/staff_client/server/circ/renew.xul [new file with mode: 0644]
Open-ILS/xul/staff_client/server/circ/renew_overlay.xul [new file with mode: 0644]
Open-ILS/xul/staff_client/server/locale/en-US/circ.properties

index a8c28aa..d054737 100644 (file)
 <!ENTITY staff.checkin.done_label.accesskey 'D'>
 <!ENTITY staff.checkin.print_receipt.label 'Print List'>
 <!ENTITY staff.checkin.print_receipt.accesskey ''>
+<!ENTITY staff.renew.print_receipt.label 'Print List'>
+<!ENTITY staff.renew.print_receipt.accesskey ''>
 <!ENTITY staff.checkin.reprint_receipt_label 'Re-Print Last List'>
 <!ENTITY staff.checkin.reprint_receipt_label.accesskey 'L'>
 <!ENTITY staff.checkin_interface_label "Check In">
 <!ENTITY staff.circ.checkin.scan.accesskey 'a'>
 <!ENTITY staff.circ.checkin.submit.label 'Submit'>
 <!ENTITY staff.circ.checkin.submit.accesskey 'S'>
+
+<!ENTITY staff.circ.renew.caption 'Renew'>
+<!ENTITY staff.circ.renew.scan.label 'Enter Barcode:'>
+<!ENTITY staff.circ.renew.scan.accesskey 'a'>
+<!ENTITY staff.circ.renew.submit.label 'Submit'>
+<!ENTITY staff.circ.renew.submit.accesskey 'S'>
+
 <!ENTITY staff.circ.context_cancel_hold "Cancel Hold">
 <!ENTITY staff.circ.context_checkin "Check In">
 <!ENTITY staff.circ.context_edit "Edit Copy">
 <!ENTITY staff.main.menu.circ.checkin.accesskey "C">
 <!ENTITY staff.main.menu.circ.checkin.label "Check In Items">
 <!ENTITY staff.main.menu.circ.checkout.accesskey "O">
+<!ENTITY staff.main.menu.circ.renew.label "Renew Items">
+<!ENTITY staff.main.menu.circ.renew.accesskey "n">
 <!ENTITY staff.main.menu.circ.checkout.label "Check Out Items">
 <!ENTITY staff.main.menu.circ.claimed_returned.key "C">
 <!ENTITY staff.main.menu.circ.claimed_returned.label 'Mark as "Claimed Returned"'>
 <!ENTITY staff.circ.checkin_overlay.do_not_alert_on_precat.label "Ignore Pre-cataloged Items">
 <!ENTITY staff.circ.checkin_overlay.checkin_auto.label "Auto-Print Hold and Transit Slips">
 <!ENTITY staff.circ.checkin_overlay.checkin_auto.accesskey "P">
+<!ENTITY staff.circ.renew_overlay.background_text "Renew Item">
+<!ENTITY staff.circ.renew_overlay.sel_clip.label "Copy to Clipboard">
+<!ENTITY staff.circ.renew_overlay.sel_clip.accesskey "C">
+<!ENTITY staff.circ.renew_overlay.sel_bucket.label "Add to Item Bucket">
+<!ENTITY staff.circ.renew_overlay.sel_bucket.accesskey "A">
+<!ENTITY staff.circ.renew_overlay.sel_opac.label "Show in Catalog">
+<!ENTITY staff.circ.renew_overlay.sel_opac.accesskey "S">
+<!ENTITY staff.circ.renew_overlay.sel_copy_details.label "Show Item Details">
+<!ENTITY staff.circ.renew_overlay.sel_copy_details.accesskey "I">
+<!ENTITY staff.circ.renew_overlay.sel_patron.label "Show Last Few Circulations">
+<!ENTITY staff.circ.renew_overlay.sel_patron.accesskey "L">
+<!ENTITY staff.circ.renew_overlay.sel_last_patron.label "Retrieve Last Patron who circulated item">
+<!ENTITY staff.circ.renew_overlay.sel_last_patron.accesskey "R">
+<!ENTITY staff.circ.renew_overlay.sel_edit.label "Edit Item Attributes">
+<!ENTITY staff.circ.renew_overlay.sel_edit.accesskey "E">
+<!ENTITY staff.circ.renew_overlay.sel_mark_items_damaged.label "Mark Item Damaged">
+<!ENTITY staff.circ.renew_overlay.sel_mark_items_damaged.accesskey "D">
+<!ENTITY staff.circ.renew_overlay.sel_transit_abort.label "Abort Transit">
+<!ENTITY staff.circ.renew_overlay.sel_spine.label "Print Spine Label">
+<!ENTITY staff.circ.renew_overlay.sel_spine.accesskey "P">
+<!ENTITY staff.circ.renew_overlay.save_columns.label "Save Columns">
+<!ENTITY staff.circ.renew_overlay.actions.label "Actions for Selected Items">
+<!ENTITY staff.circ.renew_overlay.actions.accesskey "S">
+<!ENTITY staff.circ.renew_overlay.renew_export.label "Export">
+<!ENTITY staff.circ.renew_overlay.trim_list.label "Trim List (20 rows)">
+<!ENTITY staff.circ.renew_overlay.strict_barcode.label "Strict Barcode">
 <!ENTITY staff.circ.checkout_overlay.duedate_menu.label "Normal">
 <!ENTITY staff.circ.checkout_overlay.duedate_menu.accesskey "u">
 <!ENTITY staff.circ.checkout_overlay.barcode.accesskey "C">
index 6043e55..56b672b 100644 (file)
@@ -275,6 +275,7 @@ const urls = {
        'XUL_BIB_BRIEF' : '/xul/server/cat/bib_brief.xul',
        'XUL_BROWSER' : 'chrome://open_ils_staff_client/content/util/browser.xul',
        'XUL_CHECKIN' : '/xul/server/circ/checkin.xul',
+       'XUL_RENEW' : '/xul/server/circ/renew.xul',
        'XUL_CHECKOUT' : '/xul/server/circ/checkout.xul',
        'XUL_CIRC_BRIEF' : '/xul/server/circ/circ_brief.xul',
        'XUL_CIRC_SUMMARY' : '/xul/server/circ/circ_summary.xul',
index c8e3293..297c64a 100644 (file)
@@ -394,6 +394,13 @@ main.menu.prototype = {
                                        obj.set_tab(obj.url_prefix(urls.XUL_CHECKIN),{},{});
                                }
                        ],
+                       'cmd_circ_renew' : [
+                               ['oncommand'],
+                               function() { 
+                                       obj.data.stash_retrieve();
+                                       obj.set_tab(obj.url_prefix(urls.XUL_RENEW),{},{});
+                               }
+                       ],
                        'cmd_circ_checkout' : [
                                ['oncommand'],
                                function() { 
index 0599c16..5de0c10 100644 (file)
@@ -25,6 +25,7 @@
        <command id="cmd_circ_checkout" key="circ-checkout-key" />
        <command id="cmd_patron_search" key="patron-search-key" />
        <command id="cmd_circ_checkin" key="circ-checkin-key" />
+       <command id="cmd_circ_renew" key="circ-renew-key" />
        <command id="cmd_circ_hold_capture" key="circ-hold-capture-key" />
        <command id="cmd_circ_hold_pull_list" />
        <command id="cmd_browse_holds" />
        <key id="close-window-key" modifiers="accel" key="Q" command="cmd_close_window"/>
        <key id="circ-checkout-key" keycode="VK_F1" command="cmd_circ_checkout"/>
        <key id="circ-checkin-key" keycode="VK_F2" command="cmd_circ_checkin"/>
+       <key id="circ-renew-key" keycode="VK_F2" modifiers="control" command="cmd_circ_renew"/>
        <key id="reprint-receipt-key" keycode="VK_F9" command="cmd_reprint"/>
        <key id="search-opac-key" keycode="VK_F3" command="cmd_search_opac"/>
        <key id="search-tcn-key" keycode="VK_F3" modifiers="shift" command="cmd_search_tcn"/>
        <menupopup id="main.menu.circ.popup">
                <menuitem label="&staff.main.menu.circ.checkout.label;" accesskey="&staff.main.menu.circ.checkout.accesskey;" key="circ-checkout-key" command="cmd_circ_checkout"/>
                <menuitem label="&staff.main.menu.circ.checkin.label;" accesskey="&staff.main.menu.circ.checkin.accesskey;" key="circ-checkin-key" command="cmd_circ_checkin"/>
+               <menuitem label="&staff.main.menu.circ.renew.label;" accesskey="&staff.main.menu.circ.renew.accesskey;" key="circ-renew-key" command="cmd_circ_renew"/>
                <menuitem label="&staff.main.menu.circ.patron_registration.label;" accesskey="&staff.main.menu.circ.patron_registration.accesskey;" key="patron-register-key" command="cmd_patron_register"/>
                <menuitem label="&staff.main.menu.circ.patron_retrieve.label;" accesskey="&staff.main.menu.circ.patron_retrieve.accesskey;" command="cmd_retrieve_last_patron" key="retrieve_last_patron_key"/>
                <menuseparator />
diff --git a/Open-ILS/xul/staff_client/server/circ/renew.js b/Open-ILS/xul/staff_client/server/circ/renew.js
new file mode 100644 (file)
index 0000000..54a07fd
--- /dev/null
@@ -0,0 +1,378 @@
+dump('entering circ.renew.js\n');
+
+if (typeof circ == 'undefined') circ = {};
+circ.renew = function (params) {
+
+       JSAN.use('util.error'); this.error = new util.error();
+       JSAN.use('util.network'); this.network = new util.network();
+       JSAN.use('util.barcode');
+       JSAN.use('util.date');
+       this.OpenILS = {}; JSAN.use('OpenILS.data'); this.OpenILS.data = new OpenILS.data(); this.OpenILS.data.init({'via':'stash'});
+       this.data = this.OpenILS.data;
+}
+
+circ.renew.prototype = {
+
+       'selection_list' : [],
+
+       'init' : function( params ) {
+
+               var obj = this;
+
+               JSAN.use('circ.util');
+               var columns = circ.util.columns( 
+                       { 
+                               'barcode' : { 'hidden' : false },
+                               'title' : { 'hidden' : false },
+                               'location' : { 'hidden' : false },
+                               'call_number' : { 'hidden' : false },
+                               'status' : { 'hidden' : false },
+                               'alert_message' : { 'hidden' : false },
+                               'due_date' : { 'hidden' : false },
+                               'due_time' : { 'hidden' : false }
+                       },
+                       {
+                               'except_these' : [ 'uses', 'checkin_time_full' ]
+                       }
+               );
+
+               JSAN.use('util.list'); obj.list = new util.list('renew_list');
+               obj.list.init(
+                       {
+                               'columns' : columns,
+                               'map_row_to_columns' : circ.util.std_map_row_to_columns(),
+                               'on_select' : function(ev) {
+                                       try {
+                                               JSAN.use('util.functional');
+                                               var sel = obj.list.retrieve_selection();
+                                               obj.selection_list = util.functional.map_list(
+                                                       sel,
+                                                       function(o) { return JSON2js(o.getAttribute('retrieve_id')); }
+                                               );
+                                               obj.error.sdump('D_TRACE', 'circ/copy_status: selection list = ' + js2JSON(obj.selection_list) );
+                                               if (obj.selection_list.length == 0) {
+                                                       obj.controller.view.sel_edit.setAttribute('disabled','true');
+                                                       obj.controller.view.sel_opac.setAttribute('disabled','true');
+                                                       obj.controller.view.sel_patron.setAttribute('disabled','true');
+                                                       obj.controller.view.sel_last_patron.setAttribute('disabled','true');
+                                                       obj.controller.view.sel_copy_details.setAttribute('disabled','true');
+                                                       obj.controller.view.sel_bucket.setAttribute('disabled','true');
+                                                       obj.controller.view.sel_spine.setAttribute('disabled','true');
+                                                       obj.controller.view.sel_transit_abort.setAttribute('disabled','true');
+                                                       obj.controller.view.sel_clip.setAttribute('disabled','true');
+                                                       obj.controller.view.sel_mark_items_damaged.setAttribute('disabled','true');
+                                               } else {
+                                                       obj.controller.view.sel_edit.setAttribute('disabled','false');
+                                                       obj.controller.view.sel_opac.setAttribute('disabled','false');
+                                                       obj.controller.view.sel_patron.setAttribute('disabled','false');
+                                                       obj.controller.view.sel_last_patron.setAttribute('disabled','false');
+                                                       obj.controller.view.sel_copy_details.setAttribute('disabled','false');
+                                                       obj.controller.view.sel_bucket.setAttribute('disabled','false');
+                                                       obj.controller.view.sel_spine.setAttribute('disabled','false');
+                                                       obj.controller.view.sel_transit_abort.setAttribute('disabled','false');
+                                                       obj.controller.view.sel_clip.setAttribute('disabled','false');
+                                                       obj.controller.view.sel_mark_items_damaged.setAttribute('disabled','false');
+                                               }
+                                       } catch(E) {
+                                               alert('FIXME: ' + E);
+                                       }
+                               }
+                       }
+               );
+               
+               JSAN.use('util.controller'); obj.controller = new util.controller();
+               obj.controller.init(
+                       {
+                               'control_map' : {
+                                       'save_columns' : [ [ 'command' ], function() { obj.list.save_columns(); } ],
+                                       'sel_clip' : [
+                                               ['command'],
+                                               function() { 
+                            obj.list.clipboard(); 
+                            obj.controller.view.renew_barcode_entry_textbox.focus();
+                        }
+                                       ],
+                                       'sel_edit' : [
+                                               ['command'],
+                                               function() {
+                                                       try {
+                                                               obj.spawn_copy_editor();
+                                                       } catch(E) {
+                                                               alert(E);
+                                                       }
+                                               }
+                                       ],
+                                       'sel_spine' : [
+                                               ['command'],
+                                               function() {
+                                                       JSAN.use('cat.util');
+                                                       cat.util.spawn_spine_editor(obj.selection_list);
+                                               }
+                                       ],
+                                       'sel_opac' : [
+                                               ['command'],
+                                               function() {
+                                                       JSAN.use('cat.util');
+                                                       cat.util.show_in_opac(obj.selection_list);
+                                               }
+                                       ],
+                                       'sel_transit_abort' : [
+                                               ['command'],
+                                               function() {
+                                                       JSAN.use('circ.util');
+                                                       circ.util.abort_transits(obj.selection_list);
+                                               }
+                                       ],
+                                       'sel_patron' : [
+                                               ['command'],
+                                               function() {
+                                                       JSAN.use('circ.util');
+                                                       circ.util.show_last_few_circs(obj.selection_list);
+                                               }
+                                       ],
+                                       'sel_last_patron' : [
+                                               ['command'],
+                                               function() {
+                                                       var patrons = {};
+                                                       for (var i = 0; i < obj.selection_list.length; i++) {
+                                                               var circs = obj.network.simple_request('FM_CIRC_RETRIEVE_VIA_COPY',[ses(),obj.selection_list[i].copy_id,1]);
+                                                               if (circs.length > 0) {
+                                                                       patrons[circs[0].usr()] = 1;
+                                                               } else {
+                                                                       alert(document.getElementById('circStrings').getFormattedString('staff.circ.item_no_circs', [obj.selection_list[i].barcode]));
+                                                               }
+                                                       }
+                                                       for (var i in patrons) {
+                                                               xulG.new_patron_tab({},{'id' : i});
+                                                       }
+                                               }
+                                       ],
+                                       'sel_copy_details' : [
+                                               ['command'],
+                                               function() {
+                                                       JSAN.use('circ.util');
+                                                       for (var i = 0; i < obj.selection_list.length; i++) {
+                                                               circ.util.show_copy_details( obj.selection_list[i].copy_id );
+                                                       }
+                                               }
+                                       ],
+                                       'sel_mark_items_damaged' : [
+                                               ['command'],
+                                               function() {
+                                                       var funcs = [];
+                                                       JSAN.use('cat.util'); JSAN.use('util.functional');
+                                                       cat.util.mark_item_damaged( util.functional.map_list( obj.selection_list, function(o) { return o.copy_id; } ) );
+                                               }
+                                       ],
+                                       'sel_bucket' : [
+                                               ['command'],
+                                               function() {
+                                                       JSAN.use('cat.util');
+                                                       cat.util.add_copies_to_bucket(obj.selection_list);
+                                               }
+                                       ],
+                                       'renew_barcode_entry_textbox' : [
+                                               ['keypress'],
+                                               function(ev) {
+                                                       if (ev.keyCode && ev.keyCode == 13) {
+                                                               obj.renew();
+                                                       }
+                                               }
+                                       ],
+                                       'cmd_broken' : [
+                                               ['command'],
+                                               function() { alert(document.getElementById('circStrings').getString('staff.circ.unimplemented')); }
+                                       ],
+                                       'cmd_renew_submit_barcode' : [
+                                               ['command'],
+                                               function() {
+                                                       obj.renew();
+                                               }
+                                       ],
+                                       'cmd_renew_print' : [
+                                               ['command'],
+                                               function() {
+                                                       var p = { 
+                                                               'template' : 'renew'
+                                                       };
+                                                       obj.list.print(p);
+                                               }
+                                       ],
+                                       'cmd_csv_to_clipboard' : [ ['command'], function() { 
+                        obj.list.dump_csv_to_clipboard(); 
+                        obj.controller.view.renew_barcode_entry_textbox.focus();
+                    } ],
+                                       'cmd_csv_to_printer' : [ ['command'], function() { 
+                        obj.list.dump_csv_to_printer(); 
+                        obj.controller.view.renew_barcode_entry_textbox.focus();
+                    } ],
+                                       'cmd_csv_to_file' : [ ['command'], function() { 
+                        obj.list.dump_csv_to_file( { 'defaultFileName' : 'checked_in.txt' } ); 
+                        obj.controller.view.renew_barcode_entry_textbox.focus();
+                    } ]
+                               }
+                       }
+               );
+               this.controller.render();
+               this.controller.view.renew_barcode_entry_textbox.focus();
+
+       },
+
+       'test_barcode' : function(bc) {
+               var obj = this;
+               var x = document.getElementById('strict_barcode');
+               if (x && x.checked != true) return true;
+               var good = util.barcode.check(bc);
+               if (good) {
+                       return true;
+               } else {
+                       if ( 1 == obj.error.yns_alert(
+                                               document.getElementById('circStrings').getFormattedString('staff.circ.check_digit.bad', [bc]),
+                                               document.getElementById('circStrings').getString('staff.circ.barcode.bad'),
+                                               document.getElementById('circStrings').getString('staff.circ.cancel'),
+                                               document.getElementById('circStrings').getString('staff.circ.barcode.accept'),
+                                               null,
+                                               document.getElementById('circStrings').getString('staff.circ.confirm'),
+                                               '/xul/server/skin/media/images/bad_barcode.png'
+                       ) ) {
+                               return true;
+                       } else {
+                               return false;
+                       }
+               }
+       },
+
+       'renew' : function() {
+               var obj = this;
+               try {
+                       var barcode = obj.controller.view.renew_barcode_entry_textbox.value;
+                       if (!barcode) return;
+                       if (barcode) {
+                               if ( obj.test_barcode(barcode) ) { /* good */ } else { /* bad */ return; }
+                       }
+                       var auto_print = document.getElementById('renew_auto');
+                       if (auto_print) auto_print = auto_print.checked;
+                       JSAN.use('circ.util');
+                       var renew = circ.util.renew_via_barcode(
+                barcode,
+                null,
+                function( r ) {
+                    obj.renew_followup( r, barcode );
+                }
+                       );
+               } catch(E) {
+                       obj.error.standard_unexpected_error_alert('Error in circ/renew.js, renew():', E);
+                       if (typeof obj.on_failure == 'function') {
+                               obj.on_failure(E);
+                       }
+                       if (typeof window.xulG == 'object' && typeof window.xulG.on_failure == 'function') {
+                               window.xulG.on_failure(E);
+                       }
+               }
+       },
+
+       'renew_followup' : function(r,bc) {
+               var obj = this;
+               try {
+                       if (!r) return obj.on_failure(); /* circ.util.renew handles errors and returns null currently */
+            if ( (typeof r[0].ilsevent != 'undefined' && r[0].ilsevent == 0) ) {
+                // SUCCESS
+                var x = document.getElementById('no_change_label');
+                if (x) {
+                    x.hidden = true;
+                    x.setAttribute('value','');
+                }
+            } else {
+                // FAILURE
+                var msg = document.getElementById("patronStrings").getFormattedString('staff.patron.items.items_renew.not_renewed',[bc, r[0].textcode + r[0].desc]);
+                var x = document.getElementById('no_change_label');
+                if (x) {
+                    x.hidden = false;
+                    x.setAttribute('value',msg);
+                }
+                       obj.controller.view.renew_barcode_entry_textbox.focus();
+                       obj.controller.view.renew_barcode_entry_textbox.select();
+                return;
+            }
+            var renew = r[0].payload;
+                       var retrieve_id = js2JSON( { 'copy_id' : renew.copy.id(), 'barcode' : renew.copy.barcode(), 'doc_id' : (renew.record == null ? null : renew.record.doc_id() ) } );
+                       if (document.getElementById('trim_list')) {
+                               var x = document.getElementById('trim_list');
+                               if (x.checked) { obj.list.trim_list = 20; } else { obj.list.trim_list = null; }
+                       }
+                       obj.list.append(
+                               {
+                                       'retrieve_id' : retrieve_id,
+                                       'row' : {
+                                               'my' : {
+                                                       'circ' : renew.circ,
+                                                       'mvr' : renew.record,
+                                                       'acp' : renew.copy,
+                                                       'status' : renew.status,
+                                                       'route_to' : renew.route_to,
+                                                       'message' : renew.message
+                                               }
+                                       },
+                                       'to_top' : true
+                               }
+                       );
+                       obj.list.node.view.selection.select(0);
+
+                       JSAN.use('util.sound'); var sound = new util.sound(); sound.circ_good();
+
+                       if (typeof obj.on_renew == 'function') {
+                               obj.on_renew(renew);
+                       }
+                       if (typeof window.xulG == 'object' && typeof window.xulG.on_renew == 'function') {
+                               window.xulG.on_renew(renew);
+                       }
+
+                       return true;
+
+               } catch(E) {
+                       obj.error.standard_unexpected_error_alert('Error in circ/renew.js, renew_followup():', E);
+                       if (typeof obj.on_failure == 'function') {
+                               obj.on_failure(E);
+                       }
+                       if (typeof window.xulG == 'object' && typeof window.xulG.on_failure == 'function') {
+                               window.xulG.on_failure(E);
+                       }
+               }
+
+       },
+
+       'on_renew' : function() {
+               this.controller.view.renew_barcode_entry_textbox.disabled = false;
+               this.controller.view.renew_barcode_entry_textbox.select();
+               this.controller.view.renew_barcode_entry_textbox.value = '';
+               this.controller.view.renew_barcode_entry_textbox.focus();
+       },
+
+       'on_failure' : function() {
+               this.controller.view.renew_barcode_entry_textbox.disabled = false;
+               this.controller.view.renew_barcode_entry_textbox.select();
+               this.controller.view.renew_barcode_entry_textbox.focus();
+       },
+       
+       'spawn_copy_editor' : function() {
+
+               var obj = this;
+
+               JSAN.use('util.functional');
+
+               var list = obj.selection_list;
+
+               list = util.functional.map_list(
+                       list,
+                       function (o) {
+                               return o.copy_id;
+                       }
+               );
+
+               JSAN.use('cat.util'); cat.util.spawn_copy_editor( { 'copy_ids' : list, 'edit' : 1 } );
+
+       }
+
+}
+
+dump('exiting circ.renew.js\n');
diff --git a/Open-ILS/xul/staff_client/server/circ/renew.xul b/Open-ILS/xul/staff_client/server/circ/renew.xul
new file mode 100644 (file)
index 0000000..15c10ae
--- /dev/null
@@ -0,0 +1,97 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Application: Evergreen Staff Client -->
+<!-- Screen: Patron Display -->
+
+<!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
+<!-- STYLESHEETS -->
+<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
+<?xml-stylesheet href="chrome://open_ils_staff_client/skin/global.css" type="text/css"?>
+<?xml-stylesheet href="/xul/server/skin/global.css" type="text/css"?>
+<?xml-stylesheet href="/xul/server/skin/circ.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"?>
+<?xul-overlay href="/xul/server/circ/renew_overlay.xul"?>
+
+<window id="renew_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; var g = {};</script>
+        <scripts id="openils_util_scripts"/>
+
+       <script type="text/javascript" src="/xul/server/main/JSAN.js"/>
+       <script>
+       <![CDATA[
+               function my_init() {
+                       try {
+                               netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
+                               if (typeof JSAN == 'undefined') { throw( document.getElementById("commonStrings").getString('common.jsan.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 renew.xul');
+
+                var tab_name = document.getElementById('circStrings').getString('staff.circ.renew.tab.label');
+
+                               JSAN.use('circ.renew'); g.renew = new circ.renew();
+                               g.renew.init( 
+                                       { 
+                                       } 
+                               );
+       
+                               if (typeof window.xulG == 'object' && typeof window.xulG.set_tab_name == 'function') {
+                                       try { window.xulG.set_tab_name(tab_name); } catch(E) { alert(E); }
+                               }
+
+                       } catch(E) {
+                               var err_msg = document.getElementById("commonStrings").getFormattedString('common.exception', ['circ.renew.xul', E]);
+                               try { g.error.sdump('D_ERROR',err_msg); } catch(E) { dump(err_msg); }
+                               alert(err_msg);
+                       }
+               }
+
+               function default_focus() { try { setTimeout( function() { document.getElementById('renew_barcode_entry_textbox').focus(); }, 0); } catch(E) {} }
+       ]]>
+       </script>
+
+       <popupset id="copy_status_popupset"/>
+
+       <commandset id="renew_cmds">
+               <command id="cmd_renew_submit_barcode" />
+               <command id="cmd_renew_print" />
+               <command id="cmd_csv_to_clipboard" />
+               <command id="cmd_csv_to_printer" />
+               <command id="cmd_csv_to_file" />
+               <command id="save_columns" />
+               
+               <command id="sel_clip" disabled="true"/>
+               <command id="sel_edit" disabled="true"/>
+               <command id="sel_opac" disabled="true"/>
+               <command id="sel_patron" disabled="true"/>
+               <command id="sel_last_patron" disabled="true"/>
+               <command id="sel_copy_details" disabled="true"/>
+               <command id="sel_bucket" disabled="true"/>
+               <command id="sel_spine" disabled="true"/>
+               <command id="sel_transit_abort" disabled="true"/>
+               <command id="sel_mark_items_damaged" disabled="true"/>
+
+       </commandset>
+
+    <messagecatalog id="circStrings" src="/xul/server/locale/<!--#echo var='locale'-->/circ.properties"/>
+    <messagecatalog id="catStrings" src="/xul/server/locale/<!--#echo var='locale'-->/cat.properties"/>
+    <messagecatalog id="patronStrings" src="/xul/server/locale/<!--#echo var='locale'-->/patron.properties"/>
+
+       <box id="renew_main" />
+
+</window>
+
diff --git a/Open-ILS/xul/staff_client/server/circ/renew_overlay.xul b/Open-ILS/xul/staff_client/server/circ/renew_overlay.xul
new file mode 100644 (file)
index 0000000..65ca8db
--- /dev/null
@@ -0,0 +1,123 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!-- LOCALIZATION -->
+<!DOCTYPE overlay PUBLIC "" ""[
+       <!--#include virtual="/opac/locale/${locale}/lang.dtd"-->
+]>
+
+<overlay id="renew_overlay" 
+       xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
+
+<script>dump('loading renew_overlay.xul\n');</script>
+
+<commandset id="renew_cmds" />
+
+<popupset id="copy_status_popupset">
+       <popup id="copy_status_actions" position="at_pointer"> 
+               <menuitem command="sel_clip" label="&staff.circ.renew_overlay.sel_clip.label;" accesskey="&staff.circ.renew_overlay.sel_clip.accesskey;" />
+               <menuitem command="sel_bucket" label="&staff.circ.renew_overlay.sel_bucket.label;" accesskey="&staff.circ.renew_overlay.sel_bucket.accesskey;"/>
+               <menuitem command="sel_opac" label="&staff.circ.renew_overlay.sel_opac.label;" accesskey="&staff.circ.renew_overlay.sel_opac.accesskey;" />
+               <menuitem command="sel_copy_details" label="&staff.circ.renew_overlay.sel_copy_details.label;" accesskey="&staff.circ.renew_overlay.sel_copy_details.accesskey;" />
+               <menuitem command="sel_patron" label="&staff.circ.renew_overlay.sel_patron.label;" accesskey="&staff.circ.renew_overlay.sel_patron.accesskey;"/>
+               <menuitem command="sel_last_patron" label="&staff.circ.renew_overlay.sel_last_patron.label;" accesskey="&staff.circ.renew_overlay.sel_last_patron.accesskey;"/>
+               <menuseparator/>
+               <menuitem command="sel_edit" label="&staff.circ.renew_overlay.sel_edit.label;" accesskey="&staff.circ.renew_overlay.sel_edit.accesskey;" />
+               <menuseparator />
+               <menuitem command="sel_mark_items_damaged" label="&staff.circ.renew_overlay.sel_mark_items_damaged.label;" accesskey="&staff.circ.renew_overlay.sel_mark_items_damaged.accesskey;"/>
+               <menuseparator />
+               <menuitem command="sel_transit_abort" label="&staff.circ.renew_overlay.sel_transit_abort.label;" />
+               <menuseparator />
+               <menuitem command="sel_spine" label="&staff.circ.renew_overlay.sel_spine.label;" accesskey="&staff.circ.renew_overlay.sel_spine.accesskey;"/>
+               <menuitem command="save_columns" label="&staff.circ.renew_overlay.save_columns.label;"/>
+       </popup>
+</popupset>
+
+<box id="renew_main" flex="1" orient="vertical" class="my_overflow">
+       <vbox id="cmvb1" flex="1"/>
+</box>
+
+<vbox id="cmvb1" flex="1">
+       <hbox id="background" style="background-color: orange;">
+               <spacer flex="1"/>
+               <vbox>
+                       <label id="background-text" value="&staff.circ.renew_overlay.background_text;" style="font-size: x-large; font-weight: bold;"/>
+               </vbox>
+               <spacer flex="1"/>
+       </hbox>
+       <groupbox id="cmgb1" flex="2">
+               <caption id="caption" label="&staff.circ.renew.caption;" />
+               <hbox id="renew_top_ui" />
+               <tree id="renew_list" flex="1" enableColumnDrag="true" context="copy_status_actions" />
+               <hbox id="renew_bottom_ui" />
+       </groupbox>
+</vbox>
+
+<hbox id="renew_top_ui">
+       <vbox>
+               <hbox>
+                       <label id="renew_scan_barcode_label" 
+                               value="&staff.circ.renew.scan.label;" 
+                               accesskey="&staff.circ.renew.scan.accesskey;" 
+                               control="renew_barcode_entry_textbox"/>
+                       <textbox id="renew_barcode_entry_textbox" context="clipboard"/>
+                       <button id="renew_submit_barcode_button" 
+                               label="&staff.circ.renew.submit.label;" 
+                               command="cmd_renew_submit_barcode"
+                               oldaccesskey="&staff.circ.renew.submit.accesskey;"/>
+               </hbox>
+               <label id="no_change_label" value="" style="color: red" hidden="true"/>
+       </vbox>
+       <spacer flex="1"/>
+       <vbox>
+               <hbox>
+                       <menubar>
+                       <menu label="&staff.circ.renew_overlay.actions.label;" accesskey="&staff.circ.renew_overlay.actions.accesskey;">
+                               <menupopup>
+                                       <menuitem command="sel_clip" label="&staff.circ.renew_overlay.sel_clip.label;" accesskey="&staff.circ.renew_overlay.sel_clip.accesskey;" />
+                                       <menuitem command="sel_bucket" label="&staff.circ.renew_overlay.sel_bucket.label;" accesskey="&staff.circ.renew_overlay.sel_bucket.accesskey;"/>
+                                       <menuitem command="sel_opac" label="&staff.circ.renew_overlay.sel_opac.label;" accesskey="&staff.circ.renew_overlay.sel_opac.accesskey;" />
+                                       <menuitem command="sel_copy_details" label="&staff.circ.renew_overlay.sel_copy_details.label;" accesskey="&staff.circ.renew_overlay.sel_copy_details.accesskey;" />
+                                       <menuitem command="sel_patron" label="&staff.circ.renew_overlay.sel_patron.label;" accesskey="&staff.circ.renew_overlay.sel_patron.accesskey;"/>
+                                       <menuitem command="sel_last_patron" label="&staff.circ.renew_overlay.sel_last_patron.label;" accesskey="&staff.circ.renew_overlay.sel_last_patron.accesskey;"/>
+                                       <menuseparator/>
+                                       <menuitem command="sel_edit" label="&staff.circ.renew_overlay.sel_edit.label;" accesskey="&staff.circ.renew_overlay.sel_edit.accesskey;" />
+                                       <menuseparator />
+                                       <menuitem command="sel_mark_items_damaged" label="&staff.circ.renew_overlay.sel_mark_items_damaged.label;" accesskey="&staff.circ.renew_overlay.sel_mark_items_damaged.accesskey;"/>
+                                       <menuseparator />
+                                       <menuitem command="sel_transit_abort" label="&staff.circ.renew_overlay.sel_transit_abort.label;" />
+                                       <menuseparator />
+                                       <menuitem command="sel_spine" label="&staff.circ.renew_overlay.sel_spine.label;" accesskey="&staff.circ.renew_overlay.sel_spine.accesskey;"/>
+                                       <menuitem command="save_columns" label="&staff.circ.renew_overlay.save_columns.label;"/>
+                               </menupopup>
+                       </menu>
+                       </menubar>
+               </hbox>
+        <label id="fine_tally" value="" amount="0.00" style="color: red" hidden="true" />
+       </vbox>
+
+</hbox>
+
+<hbox id="renew_bottom_ui">
+    <button id="list_actions" oncommand="this.firstChild.showPopup();"
+        label="&staff.generic.list_actions.label;" 
+        accesskey="&staff.generic.list_actions.accesskey;" 
+        type="menu" allowevents="true">
+        <menupopup id="list_actions_popup">
+               <menuitem command="sel_clip" label="&staff.generic.list_actions.sel_clip.label;" accesskey="&staff.generic.list_actions.sel_clip.accesskey;" disabled="true" />
+           <menuitem command="cmd_csv_to_printer" label="&staff.generic.list_actions.csv_to_printer.label;" accesskey="&staff.generic.list_actions.csv_to_printer.accesskey;" />
+               <menuitem command="cmd_csv_to_clipboard" label="&staff.generic.list_actions.csv_to_clipboard.label;" accesskey="&staff.generic.list_actions.csv_to_clipboard.accesskey;" />
+               <menuitem command="cmd_csv_to_file" label="&staff.generic.list_actions.csv_to_file.label;" accesskey="&staff.generic.list_actions.csv_to_file.accesskey;" />
+               <menuitem command="save_columns" label="&staff.generic.list_actions.save_columns.label;" accesskey="&staff.generic.list_actions.save_columns.accesskey;" />
+        </menupopup>
+    </button>
+
+       <button id="renew_print" 
+               label="&staff.renew.print_receipt.label;" 
+               command="cmd_renew_print"
+               accesskey="&staff.renew.print_receipt.accesskey;"/>
+       <checkbox id="trim_list" label="&staff.circ.renew_overlay.trim_list.label;" checked="true" oils_persist="checked"/> 
+       <checkbox id="strict_barcode" label="&staff.circ.renew_overlay.strict_barcode.label;" checked="false" oils_persist="checked"/> 
+       <spacer id="pcii3s" flex="1"/>
+</hbox>
+
+</overlay>
index 3d3c12d..b121ee3 100644 (file)
@@ -331,6 +331,7 @@ staff.circ.work_log_column.when=When
 staff.circ.work_log_checkout.message=%1$s circulated %4$s to %3$s (%2$s)
 staff.circ.checkin.hold_capture=Hold Capture
 staff.circ.checkin.check_in.tab=Item Check In
+staff.circ.renew.tab.label=Renew Items
 staff.circ.checkin.error=Check In Failed (in circ.util.checkin) (%1$s): 
 # "Circulation" - check &staff.main.menu.circ.label; in lang.dtd
 # "Offline Interface" - check &staff.main.menu.circ.offline.label; in lang.dtd
@@ -366,4 +367,3 @@ staff.circ.holds.unexpected_error.not_likely_modified=Holds not likely modified.
 staff.circ.holds.unexpected_error.not_likely_activated=Holds not likely activated.
 staff.circ.holds.unexpected_error.not_likely_suspended=Holds not likely suspended.
 staff.circ.holds.error.may_not_edit_pickup_lib_for_hold_intransit=You may not edit the pickup library for holds that are in-transit or ready for pickup.
-