1 dump('entering circ.copy_status.js\n');
4 if (typeof circ == 'undefined') { circ = {}; }
5 circ.copy_status = function (params) {
7 JSAN.use('util.error'); this.error = new util.error();
8 JSAN.use('util.network'); this.network = new util.network();
9 JSAN.use('util.barcode');
10 JSAN.use('util.date');
11 JSAN.use('OpenILS.data'); this.data = new OpenILS.data(); this.data.init({'via':'stash'});
12 JSAN.use('util.sound'); this.sound = new util.sound();
17 circ.copy_status.prototype = {
18 'selection_list' : [],
19 'list_copyid_map' : {},
22 'init' : function( params ) {
26 JSAN.use('circ.util');
27 var columns = circ.util.columns(
29 'barcode' : { 'hidden' : false },
30 'title' : { 'hidden' : false },
31 'location' : { 'hidden' : false },
32 'call_number' : { 'hidden' : false },
33 'acp_status' : { 'hidden' : false },
34 'alert_message' : { 'hidden' : false },
35 'due_date' : { 'hidden' : false }
39 'route_to', 'message', 'uses'
44 JSAN.use('util.list'); obj.list = new util.list('copy_status_list');
48 'on_select' : function(ev) {
50 JSAN.use('util.functional');
51 var sel = obj.list.retrieve_selection();
52 obj.selection_list = util.functional.map_list(
54 function(o) { return JSON2js(o.getAttribute('retrieve_id')); }
56 obj.error.sdump('D_TRACE','circ/copy_status: selection list = ' + js2JSON(obj.selection_list) );
57 if (obj.selection_list.length == 0) {
58 obj.controller.view.sel_checkin.setAttribute('disabled','true');
59 obj.controller.view.cmd_replace_barcode.setAttribute('disabled','true');
60 obj.controller.view.sel_edit.setAttribute('disabled','true');
61 obj.controller.view.sel_vol_copy_edit.setAttribute('disabled','true');
62 obj.controller.view.sel_opac.setAttribute('disabled','true');
63 obj.controller.view.sel_opac_holds.setAttribute('disabled','true');
64 obj.controller.view.sel_bucket.setAttribute('disabled','true');
65 obj.controller.view.sel_record_bucket.setAttribute('disabled','true');
66 obj.controller.view.sel_copy_details.setAttribute('disabled','true');
67 obj.controller.view.sel_mark_items_damaged.setAttribute('disabled','true');
68 obj.controller.view.sel_mark_items_missing.setAttribute('disabled','true');
69 obj.controller.view.sel_patron.setAttribute('disabled','true');
70 obj.controller.view.cmd_triggered_events.setAttribute('disabled','true');
71 obj.controller.view.cmd_create_brt.setAttribute('disabled','true');
72 obj.controller.view.cmd_book_item_now.setAttribute('disabled','true');
73 obj.controller.view.cmd_request_items.setAttribute('disabled','true');
74 obj.controller.view.cmd_find_acq_po.setAttribute('disabled','true');
75 obj.controller.view.sel_spine.setAttribute('disabled','true');
76 obj.controller.view.sel_transit_abort.setAttribute('disabled','true');
77 obj.controller.view.sel_clip.setAttribute('disabled','true');
78 obj.controller.view.sel_renew.setAttribute('disabled','true');
79 obj.controller.view.cmd_add_items.setAttribute('disabled','true');
80 obj.controller.view.cmd_delete_items.setAttribute('disabled','true');
81 obj.controller.view.cmd_transfer_items.setAttribute('disabled','true');
82 obj.controller.view.cmd_add_volumes.setAttribute('disabled','true');
83 obj.controller.view.cmd_edit_volumes.setAttribute('disabled','true');
84 obj.controller.view.cmd_delete_volumes.setAttribute('disabled','true');
85 obj.controller.view.cmd_mark_volume.setAttribute('disabled','true');
86 obj.controller.view.cmd_mark_library.setAttribute('disabled','true');
87 obj.controller.view.cmd_transfer_volume.setAttribute('disabled','true');
89 obj.controller.view.sel_checkin.setAttribute('disabled','false');
90 obj.controller.view.cmd_replace_barcode.setAttribute('disabled','false');
91 obj.controller.view.sel_edit.setAttribute('disabled','false');
92 obj.controller.view.sel_vol_copy_edit.setAttribute('disabled','false');
93 obj.controller.view.sel_opac.setAttribute('disabled','false');
94 obj.controller.view.sel_opac_holds.setAttribute('disabled','false');
95 obj.controller.view.sel_patron.setAttribute('disabled','false');
96 obj.controller.view.cmd_triggered_events.setAttribute('disabled','false');
97 obj.controller.view.sel_bucket.setAttribute('disabled','false');
98 obj.controller.view.sel_record_bucket.setAttribute('disabled','false');
99 obj.controller.view.sel_copy_details.setAttribute('disabled','false');
100 obj.controller.view.sel_mark_items_damaged.setAttribute('disabled','false');
101 obj.controller.view.sel_mark_items_missing.setAttribute('disabled','false');
102 if (obj.selected_one_unique_owning_lib()) {
103 obj.controller.view.cmd_book_item_now.setAttribute('disabled','false');
105 obj.controller.view.cmd_book_item_now.setAttribute('disabled','true');
107 obj.controller.view.cmd_request_items.setAttribute('disabled','false');
108 obj.controller.view.cmd_create_brt.setAttribute('disabled','false');
109 obj.controller.view.cmd_find_acq_po.setAttribute("disabled", obj.selection_list.length == 1 ? "false" : "true");
110 obj.controller.view.sel_spine.setAttribute('disabled','false');
111 obj.controller.view.sel_transit_abort.setAttribute('disabled','false');
112 obj.controller.view.sel_clip.setAttribute('disabled','false');
113 obj.controller.view.sel_renew.setAttribute('disabled','false');
114 obj.controller.view.cmd_add_items.setAttribute('disabled','false');
115 obj.controller.view.cmd_delete_items.setAttribute('disabled','false');
116 obj.controller.view.cmd_transfer_items.setAttribute('disabled','false');
117 obj.controller.view.cmd_add_volumes.setAttribute('disabled','false');
118 obj.controller.view.cmd_edit_volumes.setAttribute('disabled','false');
119 obj.controller.view.cmd_delete_volumes.setAttribute('disabled','false');
120 obj.controller.view.cmd_mark_volume.setAttribute('disabled','false');
121 obj.controller.view.cmd_mark_library.setAttribute('disabled','false');
122 obj.controller.view.cmd_transfer_volume.setAttribute('disabled','false');
125 alert('FIXME: ' + E);
131 JSAN.use('util.controller'); obj.controller = new util.controller();
139 e.appendChild( obj.list.render_list_actions() );
140 obj.list.set_list_actions(
142 'on_complete' : function() { obj.controller.view.copy_status_barcode_entry_textbox.focus(); }
148 'sel_clip' : [ ['command'], function() { obj.list.clipboard(); obj.controller.view.copy_status_barcode_entry_textbox.focus(); } ],
149 'save_columns' : [ ['command'], function() { obj.list.save_columns(); obj.controller.view.copy_status_barcode_entry_textbox.focus(); } ],
153 e.setAttribute('label', document.getElementById("circStrings").getString('staff.circ.copy_status.alt_view.label'));
154 e.setAttribute('accesskey', document.getElementById("circStrings").getString('staff.circ.copy_status.alt_view.accesskey'));
161 var n = obj.controller.view.alt_view_btn;
162 if (n.getAttribute('toggle') == '1') {
163 document.getElementById('deck').selectedIndex = 0;
164 n.setAttribute('toggle','0');
165 n.setAttribute('label', document.getElementById("circStrings").getString('staff.circ.copy_status.alt_view.label'));
166 n.setAttribute('accesskey', document.getElementById("circStrings").getString('staff.circ.copy_status.alt_view.accesskey'));
167 obj.controller.view.copy_status_barcode_entry_textbox.focus();
169 document.getElementById('deck').selectedIndex = 1;
170 n.setAttribute('toggle','1');
171 n.setAttribute('label', document.getElementById("circStrings").getString('staff.circ.copy_status.list_view.label'));
172 n.setAttribute('accesskey', document.getElementById("circStrings").getString('staff.circ.copy_status.list_view.accesskey'));
173 obj.controller.view.copy_status_barcode_entry_textbox.focus();
174 if (obj.selection_list.length == 0) return;
175 var f = obj.browser.get_content();
176 xulG.barcode = obj.selection_list[0].barcode;
181 alert('Error in copy_status.js, cmd_alt_view handler: ' + E);
185 'cmd_triggered_events' : [
189 for (var i = 0; i < obj.selection_list.length; i++) {
191 xulG.url_prefix(urls.XUL_REMOTE_BROWSER),
193 'tab_name' : document.getElementById('commonStrings').getFormattedString('tab.label.triggered_events_for_copy',[ obj.selection_list[i].barcode ])
196 'url': urls.EG_TRIGGER_EVENTS + "?copy_id=" + obj.selection_list[i].copy_id,
197 'show_print_button': false,
198 'show_nav_buttons': false
203 alert('Error in copy_status.js, cmd_triggered_events: ' + E);
210 JSAN.use("cat.util");
211 JSAN.use("util.functional");
213 var results = cat.util.make_bookable(
214 util.functional.map_list(
215 obj.selection_list, function (o) {
220 if (results && results["brsrc"]) {
221 cat.util.edit_new_brsrc(results["brsrc"]);
225 'cmd_book_item_now' : [
228 JSAN.use("cat.util");
229 JSAN.use("util.functional");
231 var results = cat.util.make_bookable(
232 util.functional.map_list(
233 obj.selection_list, function (o) {
239 cat.util.edit_new_bresv(results);
243 'cmd_request_items' : [
246 JSAN.use('cat.util'); JSAN.use('util.functional');
248 var list = util.functional.map_list(
249 obj.selection_list, function (o) {
254 cat.util.request_items( list );
257 "cmd_find_acq_po" : [
260 JSAN.use("circ.util");
261 circ.util.find_acq_po(
262 ses(), obj.selection_list[0].copy_id
271 var auto_print = document.getElementById('checkin_auto_print_slips');
272 if (auto_print) auto_print = auto_print.getAttribute('checked') == 'true';
273 JSAN.use('circ.util');
274 for (var i = 0; i < obj.selection_list.length; i++) {
275 var barcode = obj.selection_list[i].barcode;
276 var checkin = circ.util.checkin_via_barcode(
278 { 'barcode' : barcode },
279 false /* backdate */,
282 funcs.push( function(a) { return function() { obj.copy_status( a, true ); }; }(barcode) );
284 for (var i = 0; i < funcs.length; i++) { funcs[i](); }
286 obj.error.standard_unexpected_error_alert(document.getElementById('circStrings').getString('staff.circ.copy_status.sel_checkin.error'),E);
290 'cmd_replace_barcode' : [
295 JSAN.use('cat.util');
296 for (var i = 0; i < obj.selection_list.length; i++) {
298 var barcode = obj.selection_list[i].barcode;
299 var new_bc = cat.util.replace_barcode( barcode );
300 funcs.push( function(a) { return function() { obj.copy_status( a, true ); }; }(new_bc) );
302 obj.error.standard_unexpected_error_alert(document.getElementById('circStrings').getFormattedString('staff.circ.copy_status.cmd_replace_barcode.error', [barcode]), E);
305 for (var i = 0; i < funcs.length; i++) { funcs[i](); }
307 obj.error.standard_unexpected_error_alert(document.getElementById('circStrings').getString('staff.circ.copy_status.cmd_replace_barcodes.error'), E);
316 obj.spawn_copy_editor();
317 for (var i = 0; i < obj.selection_list.length; i++) {
318 var barcode = obj.selection_list[i].barcode;
319 funcs.push( function(a) { return function() { obj.copy_status( a, true ); }; }(barcode) );
321 for (var i = 0; i < funcs.length; i++) { funcs[i](); }
323 obj.error.standard_unexpected_error_alert(document.getElementById('circStrings').getString('staff.circ.copy_status.sel_edit.error'), E);
330 JSAN.use('cat.util');
331 cat.util.spawn_spine_editor(obj.selection_list);
337 JSAN.use('cat.util');
338 cat.util.show_in_opac(obj.selection_list);
344 JSAN.use('cat.util');
345 cat.util.show_in_opac(obj.selection_list,{default_view:'hold_browser'});
348 'sel_transit_abort' : [
352 JSAN.use('circ.util');
353 circ.util.abort_transits(obj.selection_list);
354 for (var i = 0; i < obj.selection_list.length; i++) {
355 var barcode = obj.selection_list[i].barcode;
356 funcs.push( function(a) { return function() { obj.copy_status( a, true ); }; }(barcode) );
358 for (var i = 0; i < funcs.length; i++) { funcs[i](); }
364 JSAN.use('circ.util');
365 circ.util.show_last_few_circs(obj.selection_list);
368 'sel_copy_details' : [
371 JSAN.use('circ.util');
372 circ.util.item_details_new(
373 util.functional.map_list(
375 function(o) { return o.barcode; }
384 JSAN.use('circ.util');
385 for (var i = 0; i < obj.selection_list.length; i++) {
386 var test = obj.selection_list[i].renewable;
387 var barcode = obj.selection_list[i].barcode;
389 circ.util.renew_via_barcode( { 'barcode' : barcode } );
390 funcs.push( function(a) { return function() { obj.copy_status( a, true ); }; }(barcode) );
392 alert(document.getElementById('circStrings').getFormattedString('staff.circ.copy_status.sel_renew.not_circulating', [barcode]));
395 for (var i = 0; i < funcs.length; i++) { funcs[i](); }
399 'sel_mark_items_damaged' : [
403 JSAN.use('cat.util'); JSAN.use('util.functional');
404 cat.util.mark_item_damaged( util.functional.map_list( obj.selection_list, function(o) { return o.copy_id; } ) );
405 for (var i = 0; i < obj.selection_list.length; i++) {
406 var barcode = obj.selection_list[i].barcode;
407 funcs.push( function(a) { return function() { obj.copy_status( a, true ); }; }(barcode) );
409 for (var i = 0; i < funcs.length; i++) { funcs[i](); }
412 'sel_mark_items_missing' : [
416 JSAN.use('cat.util'); JSAN.use('util.functional');
417 cat.util.mark_item_missing( util.functional.map_list( obj.selection_list, function(o) { return o.copy_id; } ) );
418 for (var i = 0; i < obj.selection_list.length; i++) {
419 var barcode = obj.selection_list[i].barcode;
420 funcs.push( function(a) { return function() { obj.copy_status( a, true ); }; }(barcode) );
422 for (var i = 0; i < funcs.length; i++) { funcs[i](); }
428 JSAN.use('cat.util');
429 cat.util.add_copies_to_bucket(obj.selection_list);
432 'sel_record_bucket' : [
435 JSAN.use('cat.util'); JSAN.use('util.functional');
436 cat.util.add_titles_to_bucket(
437 util.functional.map_list(
438 obj.selection_list, function (o) {
445 'copy_status_barcode_entry_textbox' : [
448 if (ev.keyCode && ev.keyCode == 13) {
455 function() { alert(document.getElementById('circStrings').getString('staff.circ.unimplemented')); }
457 'cmd_copy_status_submit_barcode' : [
463 'cmd_copy_status_upload_file' : [
466 JSAN.use('util.file');
467 var f = new util.file('');
468 var content = f.import_file( { 'title' : document.getElementById('circStrings').getString('staff.circ.copy_status.upload_file.title'), 'not_json' : true } );
469 if (!content) { return; }
470 var barcodes = content.split(/[,\s]+/);
471 if (barcodes.length > 0) {
472 JSAN.use('util.exec'); var exec = new util.exec();
474 for (var i = 0; i < barcodes.length; i++) {
483 funcs.push( function() { alert(document.getElementById('circStrings').getString('staff.circ.copy_status.upload_file.complete')); } );
486 alert(document.getElementById('circStrings').getString('staff.circ.copy_status.upload_file.no_barcodes'));
491 'cmd_copy_status_print' : [
496 'template' : 'item_status'
500 obj.error.standard_unexpected_error_alert('print',E);
509 JSAN.use('util.functional');
510 var list = util.functional.map_list( obj.selection_list, function(o) { return o.acn_id; } );
511 if (list.length == 0) { return; }
513 var copy_shortcut = {}; var map_acn = {};
515 for (var i = 0; i < list.length; i++) {
516 var volume_id = list[i];
517 if (volume_id == -1) {
518 continue; /* ignore magic pre-cat volume */
520 if (! map_acn[volume_id]) {
521 map_acn[ volume_id ] = obj.network.simple_request('FM_ACN_RETRIEVE.authoritative',[ volume_id ]);
523 var call_number = map_acn[volume_id];
524 var record_id = call_number.record();
525 var ou_id = call_number.owning_lib();
526 var label = call_number.label();
527 var acnc_id = typeof call_number.label_class() == 'object'
528 ? call_number.label_class().id()
529 : call_number.label_class();
530 var acnp_id = typeof call_number.prefix() == 'object'
531 ? call_number.prefix().id()
532 : call_number.prefix();
533 var acns_id = typeof call_number.suffix() == 'object'
534 ? call_number.suffix().id()
535 : call_number.suffix();
536 var callnumber_composite_key = acnc_id + ':' + acnp_id + ':' + label + ':' + acns_id;
537 if (!copy_shortcut[record_id]) {
538 copy_shortcut[record_id] = {};
540 if (!copy_shortcut[record_id][ou_id]) {
541 copy_shortcut[record_id][ou_id] = {};
543 copy_shortcut[record_id][ou_id][ callnumber_composite_key ] = volume_id;
547 for (var r in copy_shortcut) {
549 /* quick fix */ /* what was this fixing? */
550 list = []; for (var i in copy_shortcut[r]) { list.push( i ); }
554 edit = obj.network.request(
555 api.PERM_MULTI_ORG_CHECK.app,
556 api.PERM_MULTI_ORG_CHECK.method,
559 obj.data.list.au[0].id(),
563 ).length == 0 ? 1 : 0;
565 obj.error.sdump('D_ERROR','batch permission check: ' + E);
569 return; // no read-only view for this interface
572 var title = document.getElementById('circStrings').getFormattedString('staff.circ.copy_status.add_items.title', [r]);
575 var unified_interface = String( obj.data.hash.aous['ui.unified_volume_copy_editor'] ) == 'true';
576 if (unified_interface) {
577 var horizontal_interface = String( obj.data.hash.aous['ui.cat.volume_copy_editor.horizontal'] ) == 'true';
578 url = window.xulG.url_prefix( horizontal_interface ? 'XUL_VOLUME_COPY_CREATOR_HORIZONTAL' : 'XUL_VOLUME_COPY_CREATOR' );
580 url = window.xulG.url_prefix('XUL_VOLUME_COPY_CREATOR_ORIGINAL');
583 var w = xulG.new_tab(
585 { 'tab_name' : title },
586 { 'doc_id' : r, 'ou_ids' : list, 'copy_shortcut' : copy_shortcut[r] }
591 obj.error.standard_unexpected_error_alert('copy status -> add copies',E);
596 'cmd_delete_items' : [
601 JSAN.use('util.functional');
603 var list = util.functional.map_list( obj.selection_list, function(o) { return o.copy_id; } );
605 var copies = util.functional.map_list(
608 return obj.network.simple_request('FM_ACP_RETRIEVE',[acp_id]);
612 for (var i = 0; i < copies.length; i++) {
613 copies[i].ischanged(1);
614 copies[i].isdeleted(1);
617 if (! window.confirm(document.getElementById('circStrings').getFormattedString('staff.circ.copy_status.del_items.confirm', [util.functional.map_list( copies, function(o) { return o.barcode(); }).join(", ")]))) {
621 var robj = obj.network.simple_request('FM_ACP_FLESHED_BATCH_UPDATE',[ ses(), copies, true]);
622 var robj = obj.network.simple_request(
623 'FM_ACP_FLESHED_BATCH_UPDATE',
624 [ ses(), copies, true ],
627 'title' : document.getElementById('circStrings').getString('staff.circ.copy_status.del_items.title'),
628 'overridable_events' : [
629 1208 /* TITLE_LAST_COPY */,
630 1227 /* COPY_DELETE_WARNING */
635 if (typeof robj.ilsevent != 'undefined') {
636 switch(Number(robj.ilsevent)) {
637 case 1208 /* TITLE_LAST_COPY */:
638 case 1227 /* COPY_DELETE_WARNING */:
639 case 5000 /* PERM_DENIED */:
642 obj.error.standard_unexpected_error_alert(document.getElementById('circStrings').getString('staff.circ.copy_status.del_items.success.error'), robj);
645 } else { alert(document.getElementById('circStrings').getString('staff.circ.copy_status.del_items.success')); }
648 obj.error.standard_unexpected_error_alert('copy status -> delete items',E);
652 'cmd_transfer_items' : [
656 obj.data.stash_retrieve();
657 if (!obj.data.marked_volume) {
658 alert(document.getElementById('circStrings').getString('staff.circ.copy_status.transfer_items.mark_destination'));
662 JSAN.use('util.functional');
664 var list = util.functional.map_list( obj.selection_list, function(o) { return o.copy_id; } );
666 var volume = obj.network.simple_request('FM_ACN_RETRIEVE.authoritative',[ obj.data.marked_volume ]);
668 JSAN.use('cat.util'); cat.util.transfer_copies( {
670 'docid' : volume.record(),
671 'volume_label' : volume.label(),
672 'owning_lib' : volume.owning_lib()
676 obj.error.standard_unexpected_error_alert(document.getElementById('circStrings').getString('staff.circ.copy_status.transfer_items.problem'), E);
681 'cmd_add_volumes' : [
685 JSAN.use('util.functional');
686 var list = util.functional.map_list( obj.selection_list, function(o) { return o.acn_id; } );
687 if (list.length == 0) { return; }
689 var aou_hash = {}; var map_acn = {};
691 for (var i = 0; i < list.length; i++) {
692 var volume_id = list[i];
693 if (volume_id == -1) {
694 continue; /* ignore magic pre-cat volume */
696 if (! map_acn[volume_id]) {
697 map_acn[ volume_id ] = obj.network.simple_request('FM_ACN_RETRIEVE.authoritative',[ volume_id ]);
699 var record_id = map_acn[ volume_id ].record();
700 var ou_id = map_acn[ volume_id ].owning_lib();
701 var label = map_acn[ volume_id ].label();
702 if (!aou_hash[record_id]) aou_hash[record_id] = {};
703 aou_hash[record_id][ou_id] = 1;
707 for (var r in aou_hash) {
709 list = []; for (var org in aou_hash[r]) list.push(org);
713 edit = obj.network.request(
714 api.PERM_MULTI_ORG_CHECK.app,
715 api.PERM_MULTI_ORG_CHECK.method,
718 obj.data.list.au[0].id(),
720 [ 'CREATE_VOLUME', 'CREATE_COPY' ]
722 ).length == 0 ? 1 : 0;
724 obj.error.sdump('D_ERROR','batch permission check: ' + E);
728 alert(document.getElementById('circStrings').getString('staff.circ.copy_status.add_volumes.perm_failure'));
729 return; // no read-only view for this interface
732 var title = document.getElementById('circStrings').getFormattedString('staff.circ.copy_status.add_volumes.title', [r]);
735 var unified_interface = String( obj.data.hash.aous['ui.unified_volume_copy_editor'] ) == 'true';
736 if (unified_interface) {
737 var horizontal_interface = String( obj.data.hash.aous['ui.cat.volume_copy_editor.horizontal'] ) == 'true';
738 url = window.xulG.url_prefix( horizontal_interface ? 'XUL_VOLUME_COPY_CREATOR_HORIZONTAL' : 'XUL_VOLUME_COPY_CREATOR' );
740 url = window.xulG.url_prefix('XUL_VOLUME_COPY_CREATOR_ORIGINAL');
743 var w = xulG.new_tab(
745 { 'tab_name' : title },
746 { 'doc_id' : r, 'ou_ids' : list }
752 obj.error.standard_unexpected_error_alert('copy status -> add volumes',E);
758 'sel_vol_copy_edit' : [
762 JSAN.use('util.functional');
764 var list = util.functional.map_list( obj.selection_list, function(o) { return o.copy_id; } );
766 var copies = obj.network.simple_request('FM_ACP_FLESHED_BATCH_RETRIEVE',[list]);
768 if (list.length == 0) { return; }
771 var rec_copy_map = {};
773 for (var i = 0; i < copies.length; i++) {
774 var volume_id = copies[i].call_number();
775 if (! map_acn[volume_id]) {
776 map_acn[ volume_id ] = obj.network.simple_request('FM_ACN_RETRIEVE.authoritative',[ volume_id ]);
778 copies[i].call_number( map_acn[ volume_id ] );
779 var record_id = map_acn[ volume_id ].record();
780 if (!rec_copy_map[record_id]) {
781 rec_copy_map[record_id] = [];
783 rec_copy_map[record_id].push( copies[i] );
786 var timeout = 0; // FIXME: stagger invocation of each tab or they'll break for someone unknown reason
787 var vol_item_creator = function(items) {
790 xulG.volume_item_creator({ 'existing_copies' : items });
795 for (var r in rec_copy_map) {
796 if (r == -1) { /* no unified interface for pre-cats */
797 cat.util.spawn_copy_editor( { 'copy_ids' : rec_copy_map[r], 'edit' : 1 } );
799 vol_item_creator( rec_copy_map[r] );
804 obj.error.standard_unexpected_error_alert('copy status -> edit items/volumes per bib',E);
809 'cmd_edit_volumes' : [
813 JSAN.use('util.functional');
814 var list = util.functional.map_list( obj.selection_list, function(o) { return o.acn_id; } );
815 if (list.length == 0) { return; }
817 var volumes = []; var seen = {};
819 for (var i = 0; i < list.length; i++) {
820 var volume_id = list[i];
821 if (volume_id == -1) {
822 continue; /* ignore magic pre-cat volume */
824 if (! seen[volume_id]) {
826 var volume = obj.network.simple_request('FM_ACN_RETRIEVE.authoritative',[ volume_id ]);
827 if (volume && typeof volume.ilsevent == 'undefined') {
828 volumes.push( volume );
833 JSAN.use('cat.util'); cat.util.batch_edit_volumes( volumes );
835 for (var i = 0; i < obj.selection_list.length; i++) {
836 var barcode = obj.selection_list[i].barcode;
837 funcs.push( function(a) { return function() { obj.copy_status( a, true ); }; }(barcode) );
839 for (var i = 0; i < funcs.length; i++) { funcs[i](); }
843 obj.error.standard_unexpected_error_alert('Copy Status -> Volume Edit',E);
848 'cmd_delete_volumes' : [
852 JSAN.use('util.functional');
853 var list = util.functional.map_list( obj.selection_list, function(o) { return o.acn_id; } );
854 if (list.length == 0) { return; }
858 for (var i = 0; i < list.length; i++) {
859 var volume_id = list[i];
860 if (volume_id == -1) {
861 continue; /* ignore magic pre-cat volume */
863 if (! map_acn[volume_id]) {
864 map_acn[ volume_id ] = obj.network.simple_request('FM_ACN_RETRIEVE.authoritative',[ volume_id ]);
869 for (var v in map_acn) {
870 list.push( map_acn[v] );
874 if (list.length == 1) {
875 confirm_prompt = document.getElementById('circStrings').getString('staff.circ.copy_status.delete_volumes.singular');
877 confirm_prompt = document.getElementById('circStrings').getString('staff.circ.copy_status.delete_volumes.plural');
880 var r = obj.error.yns_alert(
882 document.getElementById('circStrings').getString('staff.circ.copy_status.delete_volumes.title'),
883 document.getElementById('circStrings').getString('staff.circ.copy_status.delete_volumes.delete'),
884 document.getElementById('circStrings').getString('staff.circ.copy_status.delete_volumes.cancel'),
886 document.getElementById('circStrings').getString('staff.circ.confirm')
890 for (var i = 0; i < list.length; i++) {
891 list[i].isdeleted('1');
895 var robj = obj.network.simple_request(
896 'FM_ACN_TREE_UPDATE',
897 [ ses(), list, true, params ],
900 'title' : document.getElementById('circStrings').getString('staff.circ.copy_status.delete_volumes.override'),
901 'overridable_events' : [
902 1208 /* TITLE_LAST_COPY */,
903 1227 /* COPY_DELETE_WARNING */
907 if (robj == null) throw(robj);
908 if (typeof robj.ilsevent != 'undefined') {
909 if (robj.ilsevent == 1206 /* VOLUME_NOT_EMPTY */) {
910 var r2 = obj.error.yns_alert(
911 document.getElementById('circStrings').getString('staff.circ.copy_status.delete_volumes.delete_copies'),
912 document.getElementById('circStrings').getString('staff.circ.copy_status.delete_volumes.title'),
913 document.getElementById('circStrings').getString('staff.circ.copy_status.delete_volumes.delete_copies.confirm'),
914 document.getElementById('circStrings').getString('staff.circ.copy_status.delete_volumes.delete_copies.cancel'),
916 document.getElementById('commonStrings').getString('common.confirm')
918 if (r2 == 0) { // delete vols and copies
919 params.force_delete_copies = true;
923 if (typeof robj.ilsevent != 'undefined') {
926 && (robj.ilsevent != 1227 /* COPY_DELETE_WARNING */)
927 && (robj.ilsevent != 1208 /* TITLE_LAST_COPY */)
928 && (robj.ilsevent != 5000 /* PERM_DENIED */)
939 obj.error.standard_unexpected_error_alert('copy status -> delete volumes',E);
945 'cmd_mark_volume' : [
949 JSAN.use('util.functional');
950 var list = util.functional.map_list( obj.selection_list, function(o) { return o.acn_id; } );
952 if (list.length == 1) {
953 obj.data.marked_volume = list[0];
954 obj.data.stash('marked_volume');
955 alert(document.getElementById('circStrings').getString('staff.circ.copy_status.mark_volume.status'));
958 document.getElementById('circStrings').getString('staff.circ.copy_status.mark_volume.prompt'),
959 document.getElementById('circStrings').getString('staff.circ.copy_status.mark_volume.title'),
960 document.getElementById('circStrings').getString('staff.circ.copy_status.ok'),
963 document.getElementById('circStrings').getString('staff.circ.confirm')
967 obj.error.standard_unexpected_error_alert('copy status -> mark volume',E);
971 'cmd_mark_library' : [
975 JSAN.use('util.functional');
976 var list = util.functional.map_list( obj.selection_list, function(o) { return o.acn_id; } );
978 if (list.length == 1) {
979 var v = obj.network.simple_request('FM_ACN_RETRIEVE.authoritative',[list[0]]);
980 var owning_lib = v.owning_lib();
981 if (typeof owning_lib == 'object') {
982 owning_lib = owning_lib.id();
985 obj.data.marked_library = { 'lib' : owning_lib, 'docid' : v.record() };
986 obj.data.stash('marked_library');
987 alert(document.getElementById('circStrings').getString('staff.circ.copy_status.mark_library'));
990 document.getElementById('circStrings').getString('staff.circ.copy_status.mark_library.limit_one'),
991 document.getElementById('circStrings').getString('staff.circ.copy_status.mark_library.limit_one.title'),
992 document.getElementById('circStrings').getString('staff.circ.copy_status.ok'),
995 document.getElementById('circStrings').getString('staff.circ.confirm')
999 obj.error.standard_unexpected_error_alert('copy status -> mark library',E);
1003 'cmd_transfer_volume' : [
1007 obj.data.stash_retrieve();
1008 if (!obj.data.marked_library) {
1009 alert(document.getElementById('circStrings').getString('staff.circ.copy_status.transfer_volume.none'));
1013 JSAN.use('util.functional');
1015 var list = util.functional.map_list( obj.selection_list, function(o) { return o.acn_id; } );
1016 if (list.length == 0) { return; }
1020 for (var i = 0; i < list.length; i++) {
1021 var volume_id = list[i];
1022 if (volume_id == -1) {
1023 continue; /* ignore magic pre-cat volume */
1025 if (! map_acn[volume_id]) {
1026 map_acn[ volume_id ] = obj.network.simple_request('FM_ACN_RETRIEVE.authoritative',[ volume_id ]);
1031 for (v in map_acn) {
1032 list.push(map_acn[v]);
1035 var xml = '<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" flex="1" style="overflow: auto">';
1036 xml += '<description>';
1038 var vols = util.functional.map_list(list,
1044 var volume_list = document.getElementById('circStrings').getFormattedString('staff.circ.copy_status.transfer_volume.confirm',
1045 [vols, obj.data.hash.aou[ obj.data.marked_library.lib ].shortname()]);
1048 xml += '</description>';
1049 xml += '<hbox><button label="';
1050 xml += document.getElementById('circStrings').getString('staff.circ.copy_status.transfer_volume.transfer.label');
1051 xml += '" name="fancy_submit"/>';
1052 xml += '<button label="';
1053 xml += document.getElementById('circStrings').getString('staff.circ.copy_status.transfer_volume.cancel.label');
1054 xml += '" accesskey="';
1055 xml += document.getElementById('circStrings').getString('staff.circ.copy_status.transfer_volume.cancel.accesskey');
1056 xml += '" name="fancy_cancel"/></hbox>';
1057 xml += '<iframe style="overflow: scroll" flex="1" src="' + urls.XUL_BIB_BRIEF + '?docid=' + obj.data.marked_library.docid + '" oils_force_external="true"/>';
1059 JSAN.use('OpenILS.data');
1060 //var data = new OpenILS.data(); data.init({'via':'stash'});
1061 //data.temp_transfer = xml; data.stash('temp_transfer');
1062 JSAN.use('util.window'); var win = new util.window();
1063 var fancy_prompt_data = win.open(
1064 urls.XUL_FANCY_PROMPT,
1065 'fancy_prompt', 'chrome,resizable,modal,width=500,height=300',
1066 { 'xml' : xml, 'title' : document.getElementById('circStrings').getString('staff.circ.copy_status.transfer_volume.title') }
1069 if (fancy_prompt_data.fancy_status == 'incomplete') {
1070 alert(document.getElementById('circStrings').getString('staff.circ.copy_status.transfer_volume.aborted'));
1074 var robj = obj.network.simple_request(
1076 [ ses(), { 'docid' : obj.data.marked_library.docid, 'lib' : obj.data.marked_library.lib, 'volumes' : util.functional.map_list( list, function(o) { return o.id(); }) } ],
1079 'title' : document.getElementById('circStrings').getString('staff.circ.copy_status.transfer_volume.override_failure'),
1080 'overridable_events' : [
1081 1208 /* TITLE_LAST_COPY */,
1082 1219 /* COPY_REMOTE_CIRC_LIB */
1087 if (typeof robj.ilsevent != 'undefined') {
1088 if (robj.ilsevent == 1221 /* ORG_CANNOT_HAVE_VOLS */) {
1089 alert(document.getElementById('circStrings').getString('staff.circ.copy_status.transfer_volume.cannot_have_vols'));
1094 alert(document.getElementById('circStrings').getString('staff.circ.copy_status.transfer_volume.success'));
1098 obj.error.standard_unexpected_error_alert(document.getElementById('circStrings').getString('staff.circ.copy_status.transfer_volume.error'),E);
1106 this.controller.render();
1107 this.controller.view.copy_status_barcode_entry_textbox.focus();
1109 JSAN.use('util.browser');
1110 obj.browser = new util.browser();
1113 'url' : 'alternate_copy_summary.xul',
1115 'alt_print' : false,
1116 'browser_id' : 'copy_status_frame',
1117 'passthru_content_params' : xulG,
1123 'selected_one_unique_owning_lib': function () {
1124 JSAN.use('util.functional');
1125 var list = util.functional.map_list(
1126 this.selection_list,
1127 function(o) { return o.owning_lib; }
1129 return util.functional.unique_list_values(list).length == 1;
1132 'test_barcode' : function(bc) {
1134 var x = document.getElementById('strict_barcode');
1135 if (x && x.checked != true) { return true; }
1136 var good = util.barcode.check(bc);
1140 if ( 1 == obj.error.yns_alert(
1141 document.getElementById('circStrings').getFormattedString('staff.circ.check_digit.bad', [bc]),
1142 document.getElementById('circStrings').getString('staff.circ.barcode.bad'),
1143 document.getElementById('circStrings').getString('staff.circ.cancel'),
1144 document.getElementById('circStrings').getString('staff.circ.barcode.accept'),
1146 document.getElementById('circStrings').getString('staff.circ.confirm'),
1147 '/xul/server/skin/media/images/bad_barcode.png'
1156 'copy_status' : function(barcode,refresh) {
1159 try { document.getElementById('last_scanned').setAttribute('value',''); } catch(E) {}
1161 // No barcode provided = get barcode
1162 barcode = obj.controller.view.copy_status_barcode_entry_textbox.value;
1163 // Complete the barcode - just items
1164 var barcode_object = xulG.get_barcode(window, 'asset', barcode);
1165 // user_false is user said "None of the above" - Abort before other errors/prompts can result
1166 if(barcode_object == "user_false") return;
1167 // Got a barcode and no error? Use the barcode. Otherwise, fall through with entered barcode.
1168 if(barcode_object && typeof barcode_object.ilsevent == 'undefined')
1169 barcode = barcode_object.barcode;
1171 if (!barcode) { return; }
1173 if ( obj.test_barcode(barcode) ) { /* good */ } else { /* bad */ return; }
1175 JSAN.use('circ.util');
1176 function handle_req(req) {
1178 var details = req.getResultObject();
1179 if (details == null) {
1180 throw(document.getElementById('circStrings').getString('staff.circ.copy_status.status.null_result'));
1181 } else if (details.ilsevent) {
1182 switch(Number(details.ilsevent)) {
1184 obj.error.standard_network_error_alert();
1185 obj.controller.view.copy_status_barcode_entry_textbox.select();
1186 obj.controller.view.copy_status_barcode_entry_textbox.focus();
1189 case 1502 /* ASSET_COPY_NOT_FOUND */ :
1190 try { document.getElementById('last_scanned').setAttribute('value', document.getElementById('circStrings').getFormattedString('staff.circ.copy_status.status.copy_not_found', [barcode])); } catch(E) {}
1191 obj.error.yns_alert(
1192 document.getElementById('circStrings').getFormattedString('staff.circ.copy_status.status.copy_not_found', [barcode]),
1193 document.getElementById('circStrings').getString('staff.circ.copy_status.status.not_cataloged'),
1194 document.getElementById('circStrings').getString('staff.circ.copy_status.ok'),
1197 document.getElementById('circStrings').getString('staff.circ.confirm.msg')
1199 obj.controller.view.copy_status_barcode_entry_textbox.select();
1200 obj.controller.view.copy_status_barcode_entry_textbox.focus();
1208 var msg = details.copy.barcode() + ' -- ';
1209 if (details.copy.call_number() == -1) {
1210 msg += document.getElementById('circStrings').getString('staff.circ.copy_status.status.pre_cat') + ' ';
1213 msg += document.getElementById('circStrings').getString('staff.circ.copy_status.status.hold') + ' ';
1215 if (details.transit) {
1216 msg += document.getElementById('circStrings').getString('staff.circ.copy_status.status.transit') + ' ';
1218 if (details.circ && ! details.circ.checkin_time()) {
1219 msg += document.getElementById('circStrings').getString('staff.circ.copy_status.status.circ') + ' ';
1221 try { document.getElementById('last_scanned').setAttribute('value',msg); } catch(E) {}
1222 if (document.getElementById('trim_list')) {
1223 var x = document.getElementById('trim_list');
1224 if (x.checked) { obj.list.trim_list = 20; } else { obj.list.trim_list = null; }
1227 'retrieve_id' : js2JSON(
1229 'renewable' : details.circ ? 't' : 'f',
1230 'copy_id' : details.copy.id(),
1231 'acn_id' : details.volume ? details.volume.id() : -1,
1232 'owning_lib' : details.volume ? details.volume.owning_lib() : -1,
1233 'barcode' : barcode,
1234 'doc_id' : details.mvr ? details.mvr.doc_id() : null
1239 'mvr' : details.mvr,
1240 'acp' : details.copy,
1241 'acn' : details.volume,
1242 'atc' : details.transit,
1243 'circ' : details.circ,
1244 'ahr' : details.hold
1250 var nparams = obj.list.append(params);
1251 if (!document.getElementById('trim_list').checked) {
1252 if (typeof obj.list_copyid_map[details.copy.id()] == 'undefined') obj.list_copyid_map[details.copy.id()] =[];
1253 obj.list_copyid_map[details.copy.id()].push(nparams);
1256 if (!document.getElementById('trim_list').checked) {
1257 if (typeof obj.list_copyid_map[details.copy.id()] != 'undefined') {
1258 for (var i = 0; i < obj.list_copyid_map[details.copy.id()].length; i++) {
1259 if (typeof obj.list_copyid_map[details.copy.id()][i] == 'undefined') {
1260 obj.list.append(params);
1262 params.treeitem_node = obj.list_copyid_map[details.copy.id()][i].treeitem_node;
1263 obj.list.refresh_row(params);
1267 obj.list.append(params);
1270 obj.list.append(params);
1274 obj.error.standard_unexpected_error_alert('barcode = ' + barcode,E);
1277 var result = obj.network.simple_request('FM_ACP_DETAILS_VIA_BARCODE.authoritative', [ ses(), barcode ]);
1278 handle_req({'getResultObject':function(){return result;}}); // used to be async
1279 if (result.copy && document.getElementById('deck').selectedIndex == 1) {
1280 var f = obj.browser.get_content();
1281 xulG.barcode = result.copy.barcode(); // FIXME: We could pass the already-fetched data, but need to figure out how to manage that and honor Trim List, the whole point of which is to limit memory consumption
1283 if (!xulG.from_item_details_new) {
1284 /* We don't want to call load_item() in this case
1285 * because we're going to call copy_status() later
1286 * (which gets action menus populated, unlike
1295 obj.controller.view.copy_status_barcode_entry_textbox.value = '';
1296 obj.controller.view.copy_status_barcode_entry_textbox.focus();
1297 return result; // In some cases we're going to want to save this
1299 obj.error.standard_unexpected_error_alert('barcode = ' + barcode,E);
1300 obj.controller.view.copy_status_barcode_entry_textbox.select();
1301 obj.controller.view.copy_status_barcode_entry_textbox.focus();
1305 'spawn_copy_editor' : function() {
1309 JSAN.use('util.functional');
1311 var list = obj.selection_list;
1313 list = util.functional.map_list(
1320 JSAN.use('cat.util'); cat.util.spawn_copy_editor( { 'copy_ids' : list, 'edit' : 1 } );
1326 dump('exiting circ.copy_status.js\n');