entry points for Transfer Title Holds functionality
authorphasefx <phasefx@dcc99617-32d9-48b4-a31d-7c20da2025e4>
Tue, 9 Feb 2010 22:11:51 +0000 (22:11 +0000)
committerphasefx <phasefx@dcc99617-32d9-48b4-a31d-7c20da2025e4>
Tue, 9 Feb 2010 22:11:51 +0000 (22:11 +0000)
git-svn-id: svn://svn.open-ils.org/ILS/trunk@15487 dcc99617-32d9-48b4-a31d-7c20da2025e4

14 files changed:
Open-ILS/web/opac/locale/en-US/lang.dtd
Open-ILS/xul/staff_client/chrome/content/cat/opac.js
Open-ILS/xul/staff_client/chrome/content/cat/opac.xul
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_overlay.xul
Open-ILS/xul/staff_client/chrome/locale/en-US/offline.properties
Open-ILS/xul/staff_client/server/cat/record_buckets.js
Open-ILS/xul/staff_client/server/cat/record_buckets.xul
Open-ILS/xul/staff_client/server/cat/record_buckets_overlay.xul
Open-ILS/xul/staff_client/server/cat/util.js
Open-ILS/xul/staff_client/server/locale/en-US/cat.properties
Open-ILS/xul/staff_client/server/patron/holds.js
Open-ILS/xul/staff_client/server/patron/holds_overlay.xul

index e977178..64df98f 100644 (file)
 <!ENTITY staff.cat.opac.marc_view.label "MARC View">
 <!ENTITY staff.cat.opac.mark_for_overlay.accesskey "M">
 <!ENTITY staff.cat.opac.mark_for_overlay.label "Mark for Overlay">
+<!ENTITY staff.cat.opac.mark_for_hold_transfer.accesskey "">
+<!ENTITY staff.cat.opac.mark_for_hold_transfer.label "Mark as Title Hold Transfer Destination">
+<!ENTITY staff.cat.opac.transfer_title_holds.accesskey "">
+<!ENTITY staff.cat.opac.transfer_title_holds.label "Transfer Title Holds">
 <!ENTITY staff.cat.opac.delete_record.accesskey "D">
 <!ENTITY staff.cat.opac.delete_record.label "Delete Record">
 <!ENTITY staff.cat.opac.undelete_record.accesskey "U">
 <!ENTITY staff.circ.holds.edit_desire_mint_condition.accesskey "Q">
 <!ENTITY staff.circ.holds.set_top_of_queue "Set Top of Queue">
 <!ENTITY staff.circ.holds.set_top_of_queue.accesskey "Q">
+<!ENTITY staff.circ.holds.title_transfer.label "Transfer to Marked Title">
+<!ENTITY staff.circ.holds.title_transfer.accesskey "">
 <!ENTITY staff.circ.holds.mark_item_damaged "Mark Item Damaged">
 <!ENTITY staff.circ.holds.mark_item_damaged.accesskey "D">
 <!ENTITY staff.circ.holds.mark_item_missing "Mark Item Missing">
 <!ENTITY staff.cat.record_buckets_overlay.menuitem.save_columns2.label "Save List Configuration">
 <!ENTITY staff.cat.record_buckets_overlay.box.label "Batch:">
 <!ENTITY staff.cat.record_buckets_overlay.sel_opac.label "Show All in Catalog">
+<!ENTITY staff.cat.record_buckets_overlay.transfer_title_holds.label "Transfer Title Holds">
+<!ENTITY staff.cat.record_buckets_overlay.transfer_title_holds.accesskey "Transfer Title Holds">
 <!ENTITY staff.cat.record_buckets_overlay.del_records.label "Delete All Records">
 <!ENTITY staff.cat.record_buckets_overlay.merge_records.label "Merge All Records">
 <!ENTITY staff.cat.record_buckets_overlay.export_records.label "Export All Records">
index 3035ceb..a2518cf 100644 (file)
@@ -348,11 +348,53 @@ function mark_for_overlay() {
     g.data.stash('marked_record_mvr');
     if (g.data.marked_record_mvr) {
         alert(document.getElementById('offlineStrings').getFormattedString('cat.opac.record_marked_for_overlay.tcn.alert',[ g.data.marked_record_mvr.tcn() ]));
+        xulG.set_statusbar(1, $("offlineStrings").getFormattedString('staff.cat.z3950.marked_record_for_overlay_indicator.tcn.label',[g.data.marked_record_mvr.tcn()]) );
     } else {
         alert(document.getElementById('offlineStrings').getFormattedString('cat.opac.record_marked_for_overlay.record_id.alert',[ g.data.marked_record  ]));
+        xulG.set_statusbar(1, $("offlineStrings").getFormattedString('staff.cat.z3950.marked_record_for_overlay_indicator.record_id.label',[g.data.marked_record]) );
     }
 }
 
+function mark_for_hold_transfer() {
+    g.data.marked_record_for_hold_transfer = docid;
+    g.data.stash('marked_record_for_hold_transfer');
+    var robj = g.network.simple_request('MODS_SLIM_RECORD_RETRIEVE.authoritative',[docid]);
+    if (typeof robj.ilsevent == 'undefined') {
+        g.data.marked_record_for_hold_transfer_mvr = robj;
+    } else {
+        g.data.marked_record_for_hold_transfer_mvr = null;
+        g.error.standard_unexpected_error_alert('in mark_for_hold_transfer',robj);
+    }
+    g.data.stash('marked_record_for_hold_transfer_mvr');
+    if (g.data.marked_record_mvr) {
+        var m = $("offlineStrings").getFormattedString('staff.cat.opac.marked_record_for_hold_transfer_indicator.tcn.label',[g.data.marked_record_for_hold_transfer_mvr.tcn()]);
+        alert(m); xulG.set_statusbar(1, m );
+    } else {
+        var m = $("offlineStrings").getFormattedString('staff.cat.opac.marked_record_for_hold_transfer_indicator.record_id.label',[g.data.marked_record_for_hold_transfer]);
+        alert(m); xulG.set_statusbar(1, m );
+    }
+}
+
+function transfer_title_holds() {
+    g.data.stash_retrieve();
+    var target = g.data.marked_record_for_hold_transfer;
+    if (!target) {
+        var m = $("offlineStrings").getString('staff.cat.opac.title_for_hold_transfer.destination_needed.label');
+        alert(m);
+        return;
+    }
+    var robj = g.network.simple_request('TRANSFER_TITLE_HOLDS',[ ses(), target, [ docid ] ]);
+    if (robj == 1) {
+        var m = $("offlineStrings").getString('staff.cat.opac.title_for_hold_transfer.success.label');
+        alert(m);
+    } else {
+        var m = $("offlineStrings").getString('staff.cat.opac.title_for_hold_transfer.failure.label');
+        alert(m);
+    }
+    hold_browser_reset = true;
+    if (g.view == 'hold_browser') { set_hold_browser(); };
+}
+
 function delete_record() {
     if (g.error.yns_alert(
         document.getElementById('offlineStrings').getFormattedString('cat.opac.delete_record.confirm', [docid]),
index d03f7a6..7f0fdbb 100644 (file)
@@ -56,6 +56,8 @@
                 <menuitem label="&staff.cat.opac.undelete_record.label;" accesskey="&staff.cat.opac.undelete_record.accesskey;" id="undelete_record" oncommand="undelete_record();"/>
                 <menuseparator/>
                 <menuitem label="&staff.cat.copy_browser.holdings_maintenance.cmd_add_volumes.label;" accesskey="&staff.cat.copy_browser.holdings_maintenance.cmd_add_volumes.accesskey;" id="add_volumes" oncommand="add_volumes();"/>
+                <menuitem label="&staff.cat.opac.mark_for_hold_transfer.label;" accesskey="&staff.cat.opac.mark_for_hold_transfer.accesskey;" id="mark_for_hold_transfer" oncommand="mark_for_hold_transfer();"/>
+                <menuitem label="&staff.cat.opac.transfer_title_holds.label;" accesskey="&staff.cat.opac.transfer_title_holds.accesskey;" id="transfer_title_holds" oncommand="transfer_title_holds();"/>
                 <menuseparator/>
                 <menuitem label="&staff.cat.opac.bib_in_new_tab.label;" id="bib_in_new_tab" oncommand="bib_in_new_tab();"/>
                 <menuitem label="&staff.cat.opac.remove_me.label;" id="remove_me" oncommand="remove_me();"/>
index 4e541a2..33f4a81 100644 (file)
@@ -123,6 +123,7 @@ const api = {
     'FM_AHR_UPDATE_BATCH' : { 'app' : 'open-ils.circ', 'method' : 'open-ils.circ.hold.update.batch' },
     'FM_AHR_RESET' : { 'app' : 'open-ils.circ', 'method' : 'open-ils.circ.hold.reset' },
     'FM_AHR_STATUS' : { 'app' : 'open-ils.circ', 'method' : 'open-ils.circ.hold.status.retrieve' },
+    'TRANSFER_TITLE_HOLDS' : { 'app' : 'open-ils.circ', 'method' : 'open-ils.circ.hold.change_title' },
     'FM_AHRCC_PCRUD_SEARCH' : { 'app' : 'open-ils.pcrud', 'method' : 'open-ils.pcrud.search.ahrcc.atomic', 'secure' : false },
     'FM_AIHU_CREATE' : { 'app' : 'open-ils.circ', 'method' : 'open-ils.circ.in_house_use.create' },
     'FM_ANCC_RETRIEVE_VIA_ID' : { 'app' : 'open-ils.circ', 'method' : 'open-ils.circ.non_cataloged_circulation.retrieve' },
index e34b18c..9085913 100644 (file)
@@ -1339,6 +1339,10 @@ main.menu.prototype = {
         content_params.open_chrome_window = function(a,b,c) { return xulG.window.open(a,b,c); };
         content_params.url_prefix = function(url) { return obj.url_prefix(url); };
         content_params.network_meter = obj.network_meter;
+        content_params.set_statusbar = function(slot,text) {
+            var e = document.getElementById('statusbarpanel'+slot);
+            if (e) { e.setAttribute('label',text); }
+        };
         content_params.chrome_xulG = xulG;
         if (params && params.tab_name) content_params.set_tab_name( params.tab_name );
         
index 4723b60..795d6d2 100644 (file)
     </tabbox>
     <statusbar>
         <statusbarpanel />
+        <statusbarpanel id="statusbarpanel1"/>
+        <statusbarpanel id="statusbarpanel2"/>
+        <statusbarpanel id="statusbarpanel3"/>
+        <statusbarpanel id="statusbarpanel4"/>
+        <statusbarpanel id="statusbarpanel5"/>
         <spacer flex="1" />
         <progressmeter id="network_progress" flex="1" mode="determined" value="0" tooltip="network_progress_tip"/>
         <statusbarpanel />
index fd9b5b9..42df113 100644 (file)
@@ -250,3 +250,11 @@ staff.cat.util.copy_editor.edit=Edit
 staff.cat.util.copy_editor.view=View
 staff.circ.copy_status.add_volumes.perm_failure=You do not have permission to add volumes to the workstation library.
 staff.circ.copy_status.add_volumes.title=Add Volume/Item for Record # %1$s
+staff.cat.z3950.marked_record_for_overlay_indicator.tcn.label=Record with TCN %1$s marked for overlay.
+staff.cat.z3950.marked_record_for_overlay_indicator.record_id.label=Record with ID %1$s marked for overlay.
+staff.cat.opac.marked_record_for_hold_transfer_indicator.tcn.label=Record with TCN %1$s marked for title hold transfer.
+staff.cat.opac.marked_record_for_hold_transfer_indicator.record_id.label=Record with ID %1$s marked for title hold transfer.
+staff.cat.opac.title_for_hold_transfer.destination_needed.label=Need to mark a record as a Title Hold Transfer Destination first.
+staff.cat.opac.title_for_hold_transfer.success.label=Holds transferred.
+staff.cat.opac.title_for_hold_transfer.failure.label=Holds not transferred.
+
index 21abc2a..814f8af 100644 (file)
@@ -341,6 +341,7 @@ cat.record_buckets.prototype = {
                                     obj.controller.view.cmd_merge_records.setAttribute('disabled','true');
                                     obj.controller.view.cmd_delete_records.setAttribute('disabled','true');
                                     obj.controller.view.cmd_sel_opac.setAttribute('disabled','true');
+                                    obj.controller.view.cmd_transfer_title_holds.setAttribute('disabled','true');
                                     obj.controller.view.record_buckets_list_actions.disabled = true;
                                     var bucket = obj.network.simple_request(
                                         'BUCKET_FLESH',
@@ -361,6 +362,7 @@ cat.record_buckets.prototype = {
                                         obj.controller.view.cmd_merge_records.setAttribute('disabled','false');
                                         obj.controller.view.cmd_delete_records.setAttribute('disabled','false');
                                         obj.controller.view.cmd_sel_opac.setAttribute('disabled','false');
+                                        obj.controller.view.cmd_transfer_title_holds.setAttribute('disabled','false');
                                         obj.controller.view.record_buckets_list_actions.disabled = false;
 
                                         var x = document.getElementById('info_box');
@@ -550,6 +552,7 @@ cat.record_buckets.prototype = {
                                 obj.controller.view.cmd_merge_records.setAttribute('disabled','true');
                                 obj.controller.view.cmd_delete_records.setAttribute('disabled','true');
                                 obj.controller.view.cmd_sel_opac.setAttribute('disabled','true');
+                                obj.controller.view.cmd_transfer_title_holds.setAttribute('disabled','true');
                                 obj.controller.view.record_buckets_list_actions.disabled = true;
                                 obj.controller.render('record_buckets_menulist_placeholder');
                                 setTimeout(
@@ -846,6 +849,26 @@ cat.record_buckets.prototype = {
                             }
                         }
                     ],
+                    'cmd_transfer_title_holds' : [
+                        ['command'],
+                        function() {
+                            try {
+                                obj.list2.select_all();
+                                JSAN.use('util.functional');
+                                var docids = util.functional.map_list(
+                                    obj.list2.dump_retrieve_ids(),
+                                    function (o) {
+                                        return JSON2js(o).docid; // docid
+                                    }
+                                );
+                                JSAN.use('cat.util');
+                                cat.util.transfer_title_holds(docids);
+                            } catch(E) {
+                                alert('Error in record_buckets.js, cmd_transfer_title_holds: ' + E);
+                            }
+                        }
+                    ],
+
                     'record_buckets_export_records' : [ ['render'], function(){} ],
                     'record_buckets_list_actions' : [ ['render'], function(){} ]
                 }
index 6d50985..18454f2 100644 (file)
     <messagecatalog id="circStrings" src="/xul/server/locale/<!--#echo var='locale' -->/circ.properties"/>
     <messagecatalog id="catStrings" src="/xul/server/locale/<!--#echo var='locale' -->/cat.properties"/>
 
-    <commandset id="record_buckets_cmds">
-        <command id="sel_clip0" disabled="true"/>
-        <command id="sel_clip1" disabled="true"/>
-        <command id="sel_clip2" disabled="true"/>
-        <command id="save_columns0" />
-        <command id="save_columns1" />
-        <command id="save_columns2" />
-
-        <command id="cmd_record_query_csv_to_printer" />
-        <command id="cmd_record_query_csv_to_clipboard" />
-        <command id="cmd_record_query_csv_to_file" />
-
-        <command id="cmd_pending_buckets_csv_to_printer" />
-        <command id="cmd_pending_buckets_csv_to_clipboard" />
-        <command id="cmd_pending_buckets_csv_to_file" />
-
-        <command id="cmd_record_buckets_new_bucket" />
-        <command id="cmd_record_buckets_delete_bucket" disabled="true"/>
-        <command id="cmd_record_buckets_refresh" disabled="true"/>
-
-        <command id="cmd_record_buckets_delete_item" />
-        <command id="cmd_record_buckets_to_pending_buckets" />
-
-        <command id="cmd_record_buckets_csv_to_printer" />
-        <command id="cmd_record_buckets_csv_to_clipboard" />
-        <command id="cmd_record_buckets_csv_to_file" />
-        
-        <command id="cmd_add_all_query_to_pending" />
-        <command id="cmd_add_sel_query_to_pending" />
-
-        <command id="cmd_add_all_pending_to_record_bucket" />
-        <command id="cmd_add_sel_pending_to_record_bucket" />
-
-        <command id="cmd_merge_records" disabled="true" />
-        <command id="cmd_export_records_usmarc" />
-        <command id="cmd_export_records_unimarc" />
-        <command id="cmd_export_records_xml" />
-        <command id="cmd_export_records_bre" />
-        <command id="cmd_delete_records" disabled="true" />
-        <command id="cmd_sel_opac" disabled="true" />
-        
-        <command id="cmd_submit_query" />
-    </commandset>
+    <commandset id="record_buckets_cmds" />
 
     <box id="record_buckets_main" />
 
index 22d966d..3f564f6 100644 (file)
 <messagecatalog id="catStrings" src="/xul/server/locale/<!--#echo var='locale'-->/cat.properties" />
 <messagecatalog id="circStrings" src="/xul/server/locale/<!--#echo var='locale'-->/circ.properties" />
 
-<commandset id="record_buckets_cmds" />
+<commandset id="record_buckets_cmds">
+    <command id="sel_clip0" disabled="true"/>
+    <command id="sel_clip1" disabled="true"/>
+    <command id="sel_clip2" disabled="true"/>
+    <command id="save_columns0" />
+    <command id="save_columns1" />
+    <command id="save_columns2" />
+
+    <command id="cmd_record_query_csv_to_printer" />
+    <command id="cmd_record_query_csv_to_clipboard" />
+    <command id="cmd_record_query_csv_to_file" />
+
+    <command id="cmd_pending_buckets_csv_to_printer" />
+    <command id="cmd_pending_buckets_csv_to_clipboard" />
+    <command id="cmd_pending_buckets_csv_to_file" />
+
+    <command id="cmd_record_buckets_new_bucket" />
+    <command id="cmd_record_buckets_delete_bucket" disabled="true"/>
+    <command id="cmd_record_buckets_refresh" disabled="true"/>
+
+    <command id="cmd_record_buckets_delete_item" />
+    <command id="cmd_record_buckets_to_pending_buckets" />
+
+    <command id="cmd_record_buckets_csv_to_printer" />
+    <command id="cmd_record_buckets_csv_to_clipboard" />
+    <command id="cmd_record_buckets_csv_to_file" />
+    
+    <command id="cmd_add_all_query_to_pending" />
+    <command id="cmd_add_sel_query_to_pending" />
+
+    <command id="cmd_add_all_pending_to_record_bucket" />
+    <command id="cmd_add_sel_pending_to_record_bucket" />
+
+    <command id="cmd_merge_records" disabled="true" />
+    <command id="cmd_transfer_title_holds" 
+        label="&staff.cat.record_buckets_overlay.transfer_title_holds.label;" 
+        accesskey="&staff.cat.record_buckets_overlay.transfer_title_holds.accesskey;" 
+        disabled="true" />
+    <command id="cmd_export_records_usmarc" />
+    <command id="cmd_export_records_unimarc" />
+    <command id="cmd_export_records_xml" />
+    <command id="cmd_export_records_bre" />
+    <command id="cmd_delete_records" disabled="true" />
+    <command id="cmd_sel_opac" disabled="true" />
+    
+    <command id="cmd_submit_query" />
+</commandset>
+
 
 <box id="record_buckets_main" flex="1" orient="vertical" class="my_overflow">
     <vbox id="cmvb1" flex="1"/>
     <hbox style="background: grey">
         <vbox><spacer flex="1"/><label value="&staff.cat.record_buckets_overlay.box.label;" style="font-weight: bold"/><spacer flex="1"/></vbox>
         <button command="cmd_sel_opac" label="&staff.cat.record_buckets_overlay.sel_opac.label;" accesskey=""/>
+        <button command="cmd_transfer_title_holds" />
         <button command="cmd_delete_records" label="&staff.cat.record_buckets_overlay.del_records.label;"/>
         <button command="cmd_merge_records" label="&staff.cat.record_buckets_overlay.merge_records.label;"/>
         <button id="record_buckets_export_records" label="&staff.cat.record_buckets_overlay.export_records.label;" type="menu" allowevents="true" disabled="true">
index 4fb5e10..1e76954 100644 (file)
@@ -7,7 +7,8 @@ cat.util = {};
 
 cat.util.EXPORT_OK    = [ 
     'spawn_copy_editor', 'add_copies_to_bucket', 'show_in_opac', 'spawn_spine_editor', 'transfer_copies', 
-    'mark_item_missing', 'mark_item_damaged', 'replace_barcode', 'fast_item_add'
+    'transfer_title_holds', 'mark_item_missing', 'mark_item_damaged', 'replace_barcode', 'fast_item_add', 
+    'make_bookable', 'edit_new_brsrc', 'edit_new_bresv'
 ];
 cat.util.EXPORT_TAGS    = { ':all' : cat.util.EXPORT_OK };
 
@@ -89,6 +90,30 @@ cat.util.replace_barcode = function(old_bc) {
     }
 }
 
+cat.util.transfer_title_holds = function(old_targets) {
+    JSAN.use('OpenILS.data'); var data = new OpenILS.data();
+    JSAN.use('util.network'); var network = new util.network();
+    try {
+        data.stash_retrieve();
+        var target = data.marked_record_for_hold_transfer;
+        if (!target) {
+            var m = $("catStrings").getString('staff.cat.opac.title_for_hold_transfer.destination_needed.label');
+            alert(m);
+            return;
+        }
+        var robj = network.simple_request('TRANSFER_TITLE_HOLDS',[ ses(), target, old_targets ]);
+        if (robj == 1) {
+            var m = $("catStrings").getString('staff.cat.opac.title_for_hold_transfer.success.label');
+            alert(m);
+        } else {
+            var m = $("catStrings").getString('staff.cat.opac.title_for_hold_transfer.failure.label');
+            alert(m);
+        }
+    } catch(E) {
+        alert('Error in cat.util.transfer_title.holds(): ' + E);
+    }
+}
+
 cat.util.transfer_copies = function(params) {
     JSAN.use('util.error'); var error = new util.error();
     JSAN.use('OpenILS.data'); var data = new OpenILS.data();
index 9e4da1d..473afa8 100644 (file)
@@ -253,6 +253,9 @@ staff.cat.opac.set_marc_edit.alert=Record successfully saved.
 staff.cat.opac.set_marc_edit.std_unexpected_error=Record not likely updated.
 staff.cat.opac.refresh.function_not_implemented.alert=Not yet implemented.  Work around: Choose Duplicate in New Tab option
 staff.cat.opac.set_tab_name=Record: %1$s
+staff.cat.opac.title_for_hold_transfer.destination_needed.label=Need to mark a record as a Title Hold Transfer Destination first.
+staff.cat.opac.title_for_hold_transfer.success.label=Holds transferred.
+staff.cat.opac.title_for_hold_transfer.failure.label=Holds not transferred.
 staff.cat.record_buckets.tab_name=Record Buckets
 staff.cat.record_buckets.save_file_as=Save File As
 staff.cat.record_buckets.export_records.alert=File not downloaded.
index cca056b..5158603 100644 (file)
@@ -1106,6 +1106,41 @@ patron.holds.prototype = {
                             }
                         }
                     ],
+                    'cmd_holds_title_transfer' : [
+                        ['command'],
+                        function() {
+                            try {
+                                var targets = [];
+                                for (var i = 0; i < obj.retrieve_ids.length; i++) {
+                                    var htarget = obj.retrieve_ids[i].target;
+                                    var htype = obj.retrieve_ids[i].type;
+                                    switch(htype) {
+                                        case 'M' :
+                                            continue; // not supported
+                                        break;
+                                        case 'T' :
+                                            targets.push( htarget );
+                                        break;
+                                        case 'V' :
+                                            continue; // not supported
+                                        break;
+                                        case 'C' :
+                                            continue; // not supported
+                                        break;
+                                        default:
+                                            continue; // not supported
+                                        break;
+                                    }
+                                }
+                                JSAN.use('cat.util');
+                                cat.util.transfer_title_holds(targets);
+                                obj.clear_and_retrieve();
+                            } catch(E) {
+                                obj.error.standard_unexpected_error_alert('',E);
+                            }
+                        }
+                    ],
+
                     'fetch_more' : [
                         ['command'],
                         function() {
index 967d63d..0c8fac2 100644 (file)
@@ -36,6 +36,9 @@
         <command id="cmd_holds_retarget"/>
         <command id="cmd_holds_cancel" />
         <command id="cmd_holds_uncancel" />
+        <command id="cmd_holds_title_transfer" 
+            label="&staff.circ.holds.title_transfer.label;" 
+            accesskey="&staff.circ.holds.title_transfer.accesskey;" />
         <command id="cmd_search_opac" />
         <command id="save_columns" />
         <command id="cmd_alt_view" />
@@ -65,6 +68,7 @@
             <menuitem label="&staff.circ.holds.edit_hold_range;" class="edit_hold_range" command="cmd_holds_edit_selection_depth" accesskey="&staff.circ.holds.edit_hold_range.accesskey;"/>
             <menuitem label="&staff.circ.holds.edit_hold_focus;" class="edit_hold_focus" command="cmd_broken" accesskey="&staff.circ.holds.edit_hold_focus.accesskey;"/>
             <menuitem label="&staff.circ.holds.set_top_of_queue;" command="cmd_holds_cut_in_line" accesskey="&staff.circ.holds.set_top_of_queue.accesskey;"/>
+            <menuitem command="cmd_holds_title_transfer" />
             <menuseparator />
             <menuitem command="sel_mark_items_damaged" label="&staff.circ.holds.mark_item_damaged;" accesskey="&staff.circ.holds.mark_item_damaged.accesskey;"/>
             <menuitem command="sel_mark_items_missing" label="&staff.circ.holds.mark_item_missing;" accesskey="&staff.circ.holds.mark_item_missing.accesskey;"/>
                     <menuitem label="&staff.circ.holds.edit_hold_range;" class="edit_hold_range" command="cmd_holds_edit_selection_depth" accesskey="&staff.circ.holds.edit_hold_range.accesskey;"/>
                     <menuitem label="&staff.circ.holds.edit_hold_focus;" class="edit_hold_focus" command="cmd_broken" accesskey="&staff.circ.holds.edit_hold_focus.accesskey;"/>
                     <menuitem label="&staff.circ.holds.set_top_of_queue;" command="cmd_holds_cut_in_line" accesskey="&staff.circ.holds.set_top_of_queue.accesskey;"/>
+                    <menuitem command="cmd_holds_title_transfer" />
                     <menuseparator />
                     <menuitem command="sel_mark_items_damaged" label="&staff.circ.holds.mark_item_damaged;" accesskey="&staff.circ.holds.mark_item_damaged.accesskey;"/>
                     <menuitem command="sel_mark_items_missing" label="&staff.circ.holds.mark_item_missing;" accesskey="&staff.circ.holds.mark_item_missing.accesskey;"/>