From 326d7670896babaf7fa0067d1f79f4dcec9a70b2 Mon Sep 17 00:00:00 2001 From: phasefx <phasefx@dcc99617-32d9-48b4-a31d-7c20da2025e4> Date: Fri, 18 Sep 2009 20:29:15 +0000 Subject: [PATCH] Renew Item interface, where you can scan in the item barcodes and a renewal attempt is made automatically. 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 | 37 ++ .../staff_client/chrome/content/main/constants.js | 1 + .../xul/staff_client/chrome/content/main/menu.js | 7 + .../chrome/content/main/menu_frame_menus.xul | 3 + Open-ILS/xul/staff_client/server/circ/renew.js | 378 +++++++++++++++++++++ Open-ILS/xul/staff_client/server/circ/renew.xul | 97 ++++++ .../xul/staff_client/server/circ/renew_overlay.xul | 123 +++++++ .../server/locale/en-US/circ.properties | 2 +- 8 files changed, 647 insertions(+), 1 deletion(-) create mode 100644 Open-ILS/xul/staff_client/server/circ/renew.js create mode 100644 Open-ILS/xul/staff_client/server/circ/renew.xul create mode 100644 Open-ILS/xul/staff_client/server/circ/renew_overlay.xul diff --git a/Open-ILS/web/opac/locale/en-US/lang.dtd b/Open-ILS/web/opac/locale/en-US/lang.dtd index a8c28aa202..d05473735e 100644 --- a/Open-ILS/web/opac/locale/en-US/lang.dtd +++ b/Open-ILS/web/opac/locale/en-US/lang.dtd @@ -350,6 +350,8 @@ <!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"> @@ -418,6 +420,13 @@ <!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"> @@ -744,6 +753,8 @@ <!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"'> @@ -1775,6 +1786,32 @@ <!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"> diff --git a/Open-ILS/xul/staff_client/chrome/content/main/constants.js b/Open-ILS/xul/staff_client/chrome/content/main/constants.js index 6043e55f16..56b672b4d4 100644 --- a/Open-ILS/xul/staff_client/chrome/content/main/constants.js +++ b/Open-ILS/xul/staff_client/chrome/content/main/constants.js @@ -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', diff --git a/Open-ILS/xul/staff_client/chrome/content/main/menu.js b/Open-ILS/xul/staff_client/chrome/content/main/menu.js index c8e3293dc0..297c64ae62 100644 --- a/Open-ILS/xul/staff_client/chrome/content/main/menu.js +++ b/Open-ILS/xul/staff_client/chrome/content/main/menu.js @@ -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() { diff --git a/Open-ILS/xul/staff_client/chrome/content/main/menu_frame_menus.xul b/Open-ILS/xul/staff_client/chrome/content/main/menu_frame_menus.xul index 0599c16499..5de0c1027a 100644 --- a/Open-ILS/xul/staff_client/chrome/content/main/menu_frame_menus.xul +++ b/Open-ILS/xul/staff_client/chrome/content/main/menu_frame_menus.xul @@ -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" /> @@ -132,6 +133,7 @@ <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"/> @@ -179,6 +181,7 @@ <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 index 0000000000..54a07fd6fe --- /dev/null +++ b/Open-ILS/xul/staff_client/server/circ/renew.js @@ -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 index 0000000000..15c10ae98a --- /dev/null +++ b/Open-ILS/xul/staff_client/server/circ/renew.xul @@ -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 index 0000000000..65ca8db471 --- /dev/null +++ b/Open-ILS/xul/staff_client/server/circ/renew_overlay.xul @@ -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> diff --git a/Open-ILS/xul/staff_client/server/locale/en-US/circ.properties b/Open-ILS/xul/staff_client/server/locale/en-US/circ.properties index 3d3c12d853..b121ee3d4c 100644 --- a/Open-ILS/xul/staff_client/server/locale/en-US/circ.properties +++ b/Open-ILS/xul/staff_client/server/locale/en-US/circ.properties @@ -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. - -- 2.11.0