1 dump('entering circ.copy_status.js\n');
3 if (typeof circ == 'undefined') circ = {};
4 circ.copy_status = function (params) {
6 JSAN.use('util.error'); this.error = new util.error();
7 JSAN.use('util.network'); this.network = new util.network();
8 JSAN.use('util.barcode');
10 JSAN.use('OpenILS.data'); this.data = new OpenILS.data(); this.data.init({'via':'stash'});
11 JSAN.use('util.sound'); this.sound = new util.sound();
14 circ.copy_status.prototype = {
15 'selection_list' : [],
16 'list_barcode_map' : {},
18 'init' : function( params ) {
22 JSAN.use('circ.util');
23 var columns = circ.util.columns(
25 'barcode' : { 'hidden' : false },
26 'title' : { 'hidden' : false },
27 'location' : { 'hidden' : false },
28 'call_number' : { 'hidden' : false },
29 'status' : { 'hidden' : false },
30 'alert_message' : { 'hidden' : false },
31 'due_date' : { 'hidden' : false },
35 'checkin_time', 'checkin_time_full', 'route_to', 'message', 'uses', 'xact_finish',
40 JSAN.use('util.list'); obj.list = new util.list('copy_status_list');
44 'map_row_to_columns' : circ.util.std_map_row_to_columns(),
45 'on_select' : function(ev) {
47 JSAN.use('util.functional');
48 var sel = obj.list.retrieve_selection();
49 obj.selection_list = util.functional.map_list(
51 function(o) { return JSON2js(o.getAttribute('retrieve_id')); }
53 obj.error.sdump('D_TRACE','circ/copy_status: selection list = ' + js2JSON(obj.selection_list) );
54 if (obj.selection_list.length == 0) {
55 obj.controller.view.sel_checkin.setAttribute('disabled','true');
56 obj.controller.view.cmd_replace_barcode.setAttribute('disabled','true');
57 obj.controller.view.sel_edit.setAttribute('disabled','true');
58 obj.controller.view.sel_opac.setAttribute('disabled','true');
59 obj.controller.view.sel_bucket.setAttribute('disabled','true');
60 obj.controller.view.sel_copy_details.setAttribute('disabled','true');
61 obj.controller.view.sel_mark_items_damaged.setAttribute('disabled','true');
62 obj.controller.view.sel_mark_items_missing.setAttribute('disabled','true');
63 obj.controller.view.sel_patron.setAttribute('disabled','true');
64 obj.controller.view.sel_spine.setAttribute('disabled','true');
65 obj.controller.view.sel_transit_abort.setAttribute('disabled','true');
66 obj.controller.view.sel_clip.setAttribute('disabled','true');
67 obj.controller.view.sel_renew.setAttribute('disabled','true');
68 obj.controller.view.cmd_add_items.setAttribute('disabled','true');
69 obj.controller.view.cmd_delete_items.setAttribute('disabled','true');
70 obj.controller.view.cmd_transfer_items.setAttribute('disabled','true');
71 obj.controller.view.cmd_add_volumes.setAttribute('disabled','true');
72 obj.controller.view.cmd_edit_volumes.setAttribute('disabled','true');
73 obj.controller.view.cmd_delete_volumes.setAttribute('disabled','true');
74 obj.controller.view.cmd_mark_volume.setAttribute('disabled','true');
75 obj.controller.view.cmd_mark_library.setAttribute('disabled','true');
76 obj.controller.view.cmd_transfer_volume.setAttribute('disabled','true');
78 obj.controller.view.sel_checkin.setAttribute('disabled','false');
79 obj.controller.view.cmd_replace_barcode.setAttribute('disabled','false');
80 obj.controller.view.sel_edit.setAttribute('disabled','false');
81 obj.controller.view.sel_opac.setAttribute('disabled','false');
82 obj.controller.view.sel_patron.setAttribute('disabled','false');
83 obj.controller.view.sel_bucket.setAttribute('disabled','false');
84 obj.controller.view.sel_copy_details.setAttribute('disabled','false');
85 obj.controller.view.sel_mark_items_damaged.setAttribute('disabled','false');
86 obj.controller.view.sel_mark_items_missing.setAttribute('disabled','false');
87 obj.controller.view.sel_spine.setAttribute('disabled','false');
88 obj.controller.view.sel_transit_abort.setAttribute('disabled','false');
89 obj.controller.view.sel_clip.setAttribute('disabled','false');
90 obj.controller.view.sel_renew.setAttribute('disabled','false');
91 obj.controller.view.cmd_add_items.setAttribute('disabled','false');
92 obj.controller.view.cmd_delete_items.setAttribute('disabled','false');
93 obj.controller.view.cmd_transfer_items.setAttribute('disabled','false');
94 obj.controller.view.cmd_add_volumes.setAttribute('disabled','false');
95 obj.controller.view.cmd_edit_volumes.setAttribute('disabled','false');
96 obj.controller.view.cmd_delete_volumes.setAttribute('disabled','false');
97 obj.controller.view.cmd_mark_volume.setAttribute('disabled','false');
98 obj.controller.view.cmd_mark_library.setAttribute('disabled','false');
99 obj.controller.view.cmd_transfer_volume.setAttribute('disabled','false');
102 alert('FIXME: ' + E);
108 JSAN.use('util.controller'); obj.controller = new util.controller();
112 'save_columns' : [ [ 'command' ], function() { obj.list.save_columns(); } ],
115 function() { obj.list.clipboard(); }
122 JSAN.use('circ.util');
123 for (var i = 0; i < obj.selection_list.length; i++) {
124 var barcode = obj.selection_list[i].barcode;
125 var checkin = circ.util.checkin_via_barcode( ses(), { 'barcode' : barcode } );
126 funcs.push( function(a) { return function() { obj.copy_status( a, true ); }; }(barcode) );
128 for (var i = 0; i < funcs.length; i++) { funcs[i](); }
129 alert('Action complete.');
131 obj.error.standard_unexpected_error_alert('Checkin did not likely happen.',E);
135 'cmd_replace_barcode' : [
140 JSAN.use('cat.util');
141 for (var i = 0; i < obj.selection_list.length; i++) {
143 var barcode = obj.selection_list[i].barcode;
144 var new_bc = cat.util.replace_barcode( barcode );
145 funcs.push( function(a) { return function() { obj.copy_status( a, true ); }; }(new_bc) );
147 obj.error.standard_unexpected_error_alert('Barcode ' + barcode + ' was not likely replaced.',E);
150 for (var i = 0; i < funcs.length; i++) { funcs[i](); }
151 alert('Action complete.');
153 obj.error.standard_unexpected_error_alert('Barcode replacements did not likely happen.',E);
162 obj.spawn_copy_editor();
163 for (var i = 0; i < obj.selection_list.length; i++) {
164 var barcode = obj.selection_list[i].barcode;
165 funcs.push( function(a) { return function() { obj.copy_status( a, true ); }; }(barcode) );
167 for (var i = 0; i < funcs.length; i++) { funcs[i](); }
169 obj.error.standard_unexpected_error_alert('with copy editor',E);
176 JSAN.use('cat.util');
177 cat.util.spawn_spine_editor(obj.selection_list);
183 JSAN.use('cat.util');
184 cat.util.show_in_opac(obj.selection_list);
187 'sel_transit_abort' : [
191 JSAN.use('circ.util');
192 circ.util.abort_transits(obj.selection_list);
193 for (var i = 0; i < obj.selection_list.length; i++) {
194 var barcode = obj.selection_list[i].barcode;
195 funcs.push( function(a) { return function() { obj.copy_status( a, true ); }; }(barcode) );
197 for (var i = 0; i < funcs.length; i++) { funcs[i](); }
198 alert('Action complete.');
204 JSAN.use('circ.util');
205 circ.util.show_last_few_circs(obj.selection_list);
208 'sel_copy_details' : [
211 JSAN.use('circ.util');
212 for (var i = 0; i < obj.selection_list.length; i++) {
213 circ.util.show_copy_details( obj.selection_list[i].copy_id );
221 JSAN.use('circ.util');
222 for (var i = 0; i < obj.selection_list.length; i++) {
223 var test = obj.selection_list[i].renewable;
224 var barcode = obj.selection_list[i].barcode;
226 circ.util.renew_via_barcode( barcode );
227 funcs.push( function(a) { return function() { obj.copy_status( a, true ); }; }(barcode) );
229 alert('Item with barcode ' + barcode + ' is not circulating.');
232 for (var i = 0; i < funcs.length; i++) { funcs[i](); }
233 alert('Action complete.');
237 'sel_mark_items_damaged' : [
241 JSAN.use('cat.util'); JSAN.use('util.functional');
242 cat.util.mark_item_damaged( util.functional.map_list( obj.selection_list, function(o) { return o.copy_id; } ) );
243 for (var i = 0; i < obj.selection_list.length; i++) {
244 var barcode = obj.selection_list[i].barcode;
245 funcs.push( function(a) { return function() { obj.copy_status( a, true ); }; }(barcode) );
247 for (var i = 0; i < funcs.length; i++) { funcs[i](); }
250 'sel_mark_items_missing' : [
254 JSAN.use('cat.util'); JSAN.use('util.functional');
255 cat.util.mark_item_missing( util.functional.map_list( obj.selection_list, function(o) { return o.copy_id; } ) );
256 for (var i = 0; i < obj.selection_list.length; i++) {
257 var barcode = obj.selection_list[i].barcode;
258 funcs.push( function(a) { return function() { obj.copy_status( a, true ); }; }(barcode) );
260 for (var i = 0; i < funcs.length; i++) { funcs[i](); }
266 JSAN.use('cat.util');
267 cat.util.add_copies_to_bucket(obj.selection_list);
270 'copy_status_barcode_entry_textbox' : [
273 if (ev.keyCode && ev.keyCode == 13) {
280 function() { alert('Not Yet Implemented'); }
282 'cmd_copy_status_submit_barcode' : [
288 'cmd_copy_status_upload_file' : [
291 function pick_file(mode) {
292 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
293 var nsIFilePicker = Components.interfaces.nsIFilePicker;
294 var fp = Components.classes["@mozilla.org/filepicker;1"].createInstance( nsIFilePicker );
297 mode == 'open' ? "Import Barcode File" : "Save Barcode File As",
298 mode == 'open' ? nsIFilePicker.modeOpen : nsIFilePicker.modeSave
300 fp.appendFilters( nsIFilePicker.filterAll );
301 var fp_result = fp.show();
302 if ( ( fp_result == nsIFilePicker.returnOK || fp_result == nsIFilePicker.returnReplace ) && fp.file ) {
308 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
309 JSAN.use('util.file');
310 var f = pick_file('open');
311 var i_file = new util.file(''); i_file._file = f;
312 var content = i_file.get_content();
314 var barcodes = content.split(/\s+/);
315 if (barcodes.length > 0) {
316 JSAN.use('util.exec'); var exec = new util.exec();
318 for (var i = 0; i < barcodes.length; i++) {
327 funcs.push( function() { alert('File uploaded.'); } );
330 alert('No barcodes found in file.');
335 'cmd_copy_status_print' : [
339 obj.list.on_all_fleshed =
342 dump( js2JSON( obj.list.dump_with_keys() ) + '\n' );
343 obj.data.stash_retrieve();
344 var lib = obj.data.hash.aou[ obj.data.list.au[0].ws_ou() ];
348 'staff' : obj.data.list.au[0],
349 'header' : obj.data.print_list_templates.item_status.header,
350 'line_item' : obj.data.print_list_templates.item_status.line_item,
351 'footer' : obj.data.print_list_templates.item_status.footer,
352 'type' : obj.data.print_list_templates.item_status.type,
353 'list' : obj.list.dump_with_keys(),
355 JSAN.use('util.print'); var print = new util.print();
356 print.tree_list( p );
357 setTimeout(function(){ obj.list.on_all_fleshed = null; },0);
359 obj.error.standard_unexpected_error_alert('print',E);
362 obj.list.full_retrieve();
364 obj.error.standard_unexpected_error_alert('print',E);
368 'cmd_copy_status_export' : [
372 obj.list.on_all_fleshed =
375 dump( obj.list.dump_csv() + '\n' );
376 copy_to_clipboard(obj.list.dump_csv());
377 setTimeout(function(){ obj.list.on_all_fleshed = null; },0);
379 obj.error.standard_unexpected_error_alert('export',E);
382 obj.list.full_retrieve();
384 obj.error.standard_unexpected_error_alert('export',E);
388 'cmd_copy_status_print_export' : [
392 obj.list.on_all_fleshed =
395 dump( obj.list.dump_csv() + '\n' );
396 //copy_to_clipboard(obj.list.dump_csv());
397 JSAN.use('util.print'); var print = new util.print();
398 print.simple(obj.list.dump_csv(),{'content_type':'text/plain'});
399 setTimeout(function(){ obj.list.on_all_fleshed = null; },0);
401 obj.error.standard_unexpected_error_alert('export',E);
404 obj.list.full_retrieve();
406 obj.error.standard_unexpected_error_alert('export',E);
416 JSAN.use('util.functional');
417 var list = util.functional.map_list( obj.selection_list, function(o) { return o.acn_id; } );
418 if (list.length == 0) return;
420 var copy_shortcut = {}; var map_acn = {};
422 for (var i = 0; i < list.length; i++) {
423 var volume_id = list[i];
424 if (volume_id == -1) continue; /* ignore magic pre-cat volume */
425 if (! map_acn[volume_id]) {
426 map_acn[ volume_id ] = obj.network.simple_request('FM_ACN_RETRIEVE',[ volume_id ]);
428 var record_id = map_acn[ volume_id ].record();
429 var ou_id = map_acn[ volume_id ].owning_lib();
430 var label = map_acn[ volume_id ].label();
431 if (!copy_shortcut[record_id]) copy_shortcut[record_id] = {};
432 if (!copy_shortcut[record_id][ou_id]) copy_shortcut[record_id][ou_id] = {};
433 copy_shortcut[record_id][ou_id][ label ] = volume_id;
437 for (var r in copy_shortcut) {
439 /* quick fix */ /* what was this fixing? */
440 list = []; for (var i in copy_shortcut[r]) { list.push( i ); }
444 edit = obj.network.request(
445 api.PERM_MULTI_ORG_CHECK.app,
446 api.PERM_MULTI_ORG_CHECK.method,
449 obj.data.list.au[0].id(),
453 ).length == 0 ? 1 : 0;
455 obj.error.sdump('D_ERROR','batch permission check: ' + E);
458 if (edit==0) return; // no read-only view for this interface
460 var title = 'Add Item for record #' + r;
462 JSAN.use('util.window'); var win = new util.window();
464 window.xulG.url_prefix(urls.XUL_VOLUME_COPY_CREATOR),
465 //+'?doc_id=' + window.escape(r)
466 //+'&ou_ids=' + window.escape( js2JSON(list) )
467 //+'©_shortcut=' + window.escape( js2JSON(copy_shortcut[r]) ),
470 { 'doc_id' : r, 'ou_ids' : list, 'copy_shortcut' : copy_shortcut[r] }
475 obj.error.standard_unexpected_error_alert('copy status -> add copies',E);
480 'cmd_delete_items' : [
485 JSAN.use('util.functional');
487 var list = util.functional.map_list( obj.selection_list, function(o) { return o.copy_id; } );
489 var copies = util.functional.map_list(
492 return obj.network.simple_request('FM_ACP_RETRIEVE',[acp_id]);
496 for (var i = 0; i < copies.length; i++) {
497 copies[i].ischanged(1);
498 copies[i].isdeleted(1);
501 if (! window.confirm('Are you sure sure you want to delete these items? ' + util.functional.map_list( copies, function(o) { return o.barcode(); }).join(", ")) ) return;
503 var robj = obj.network.simple_request('FM_ACP_FLESHED_BATCH_UPDATE',[ ses(), copies, true]);
504 var robj = obj.network.simple_request(
505 'FM_ACP_FLESHED_BATCH_UPDATE',
506 [ ses(), copies, true ],
509 'title' : 'Override Delete Failure?',
510 'overridable_events' : [
511 1208 /* TITLE_LAST_COPY */,
512 1227 /* COPY_DELETE_WARNING */,
517 if (typeof robj.ilsevent != 'undefined') {
518 switch(robj.ilsevent) {
519 case 1208 /* TITLE_LAST_COPY */:
520 case 1227 /* COPY_DELETE_WARNING */:
523 obj.error.standard_unexpected_error_alert('Batch Item Deletion',robj);
526 } else { alert('Items Deleted'); }
529 obj.error.standard_unexpected_error_alert('copy status -> delete items',E);
533 'cmd_transfer_items' : [
537 obj.data.stash_retrieve();
538 if (!obj.data.marked_volume) {
539 alert('Please mark a volume as the destination and then try this again.');
543 JSAN.use('util.functional');
545 var list = util.functional.map_list( obj.selection_list, function(o) { return o.copy_id; } );
547 var volume = obj.network.simple_request('FM_ACN_RETRIEVE',[ obj.data.marked_volume ]);
549 JSAN.use('cat.util'); cat.util.transfer_copies( {
551 'docid' : volume.record(),
552 'volume_label' : volume.label(),
553 'owning_lib' : volume.owning_lib(),
557 obj.error.standard_unexpected_error_alert('All copies not likely transferred.',E);
562 'cmd_add_volumes' : [
566 JSAN.use('util.functional');
567 var list = util.functional.map_list( obj.selection_list, function(o) { return o.acn_id; } );
568 if (list.length == 0) return;
570 var aou_hash = {}; var map_acn = {};
572 for (var i = 0; i < list.length; i++) {
573 var volume_id = list[i];
574 if (volume_id == -1) continue; /* ignore magic pre-cat volume */
575 if (! map_acn[volume_id]) {
576 map_acn[ volume_id ] = obj.network.simple_request('FM_ACN_RETRIEVE',[ volume_id ]);
578 var record_id = map_acn[ volume_id ].record();
579 var ou_id = map_acn[ volume_id ].owning_lib();
580 var label = map_acn[ volume_id ].label();
581 if (!aou_hash[record_id]) aou_hash[record_id] = {};
582 aou_hash[record_id][ou_id] = 1;
586 for (var r in aou_hash) {
588 list = []; for (var org in aou_hash[r]) list.push(org);
592 edit = obj.network.request(
593 api.PERM_MULTI_ORG_CHECK.app,
594 api.PERM_MULTI_ORG_CHECK.method,
597 obj.data.list.au[0].id(),
599 [ 'CREATE_VOLUME', 'CREATE_COPY' ]
601 ).length == 0 ? 1 : 0;
603 obj.error.sdump('D_ERROR','batch permission check: ' + E);
607 alert("You don't have permission to add volumes to that library.");
608 return; // no read-only view for this interface
611 var title = 'Add Volume/Item for Record # ' + r;
613 JSAN.use('util.window'); var win = new util.window();
615 window.xulG.url_prefix(urls.XUL_VOLUME_COPY_CREATOR),
616 //+'?doc_id=' + window.escape(r)
617 //+'&ou_ids=' + window.escape( js2JSON(list) ),
620 { 'doc_id' : r, 'ou_ids' : list }
626 obj.error.standard_unexpected_error_alert('copy status -> add volumes',E);
631 'cmd_edit_volumes' : [
635 JSAN.use('util.functional');
636 var list = util.functional.map_list( obj.selection_list, function(o) { return o.acn_id; } );
637 if (list.length == 0) return;
639 var volume_hash = {}; var map_acn = {};
641 for (var i = 0; i < list.length; i++) {
642 var volume_id = list[i];
643 if (volume_id == -1) continue; /* ignore magic pre-cat volume */
644 if (! map_acn[volume_id]) {
645 map_acn[ volume_id ] = obj.network.simple_request('FM_ACN_RETRIEVE',[ volume_id ]);
646 map_acn[ volume_id ].copies( [] );
648 var record_id = map_acn[ volume_id ].record();
649 if (!volume_hash[record_id]) volume_hash[record_id] = {};
650 volume_hash[record_id][volume_id] = 1;
653 for (var rec in volume_hash) {
655 list = []; for (var v in volume_hash[rec]) list.push( map_acn[v] );
659 edit = obj.network.request(
660 api.PERM_MULTI_ORG_CHECK.app,
661 api.PERM_MULTI_ORG_CHECK.method,
664 obj.data.list.au[0].id(),
665 util.functional.map_list(
668 return o.owning_lib();
673 ).length == 0 ? 1 : 0;
675 obj.error.sdump('D_ERROR','batch permission check: ' + E);
679 alert("You don't have permission to edit this volume.");
680 return; // no read-only view for this interface
683 var title = (list.length == 1 ? 'Volume' : 'Volumes') + ' for record # ' + rec;
685 JSAN.use('util.window'); var win = new util.window();
686 //obj.data.volumes_temp = js2JSON( list );
687 //obj.data.stash('volumes_temp');
688 var my_xulG = win.open(
689 window.xulG.url_prefix(urls.XUL_VOLUME_EDITOR),
691 'chrome,modal,resizable',
695 /* FIXME -- need to unique the temp space, and not rely on modalness of window */
696 //obj.data.stash_retrieve();
697 //var volumes = JSON2js( obj.data.volumes_temp );
698 var volumes = my_xulG.volumes;
699 if (!volumes) return;
701 volumes = util.functional.filter_list(
704 return o.ischanged() == '1';
708 volumes = util.functional.map_list(
711 o.record( rec ); // staff client 2 did not do this. Does it matter?
716 if (volumes.length == 0) return;
719 var r = obj.network.request(
720 api.FM_ACN_TREE_UPDATE.app,
721 api.FM_ACN_TREE_UPDATE.method,
722 [ ses(), volumes, false ]
724 if (typeof r.ilsevent != 'undefined') {
726 case 1705 /* VOLUME_LABEL_EXISTS */ :
727 alert("Edit failed: You tried to change a volume's callnumber to one that is already in use for the given library. You should transfer the items to the desired callnumber instead.");
732 alert('Volumes modified.');
735 obj.error.standard_unexpected_error_alert('volume update error: ',E);
740 obj.error.standard_unexpected_error_alert('Copy Status -> Volume Edit',E);
745 'cmd_delete_volumes' : [
749 JSAN.use('util.functional');
750 var list = util.functional.map_list( obj.selection_list, function(o) { return o.acn_id; } );
751 if (list.length == 0) return;
755 for (var i = 0; i < list.length; i++) {
756 var volume_id = list[i];
757 if (volume_id == -1) continue; /* ignore magic pre-cat volume */
758 if (! map_acn[volume_id]) {
759 map_acn[ volume_id ] = obj.network.simple_request('FM_ACN_RETRIEVE',[ volume_id ]);
763 list = []; for (var v in map_acn) list.push( map_acn[v] );
765 var r = obj.error.yns_alert('Are you sure you would like to delete ' + (list.length != 1 ? 'these ' + list.length + ' volumes' : 'this one volume') + '?', 'Delete Volumes?', 'Delete', 'Cancel', null, 'Check here to confirm this action');
768 for (var i = 0; i < list.length; i++) {
769 list[i].isdeleted('1');
771 var robj = obj.network.simple_request(
772 'FM_ACN_TREE_UPDATE',
773 [ ses(), list, true ],
776 'title' : 'Override Delete Failure?',
777 'overridable_events' : [
781 if (robj == null) throw(robj);
782 if (typeof robj.ilsevent != 'undefined') {
783 if (robj.ilsevent == 1206 /* VOLUME_NOT_EMPTY */) {
784 alert('You must delete all the copies on the volume before you may delete the volume itself.');
787 if (robj.ilsevent != 0) throw(robj);
789 alert('Volumes deleted.');
792 obj.error.standard_unexpected_error_alert('copy status -> delete volumes',E);
798 'cmd_mark_volume' : [
802 JSAN.use('util.functional');
803 var list = util.functional.map_list( obj.selection_list, function(o) { return o.acn_id; } );
805 if (list.length == 1) {
806 obj.data.marked_volume = list[0];
807 obj.data.stash('marked_volume');
808 alert('Volume marked as Item Transfer Destination');
810 obj.error.yns_alert('Choose just one Volume to mark as Item Transfer Destination','Limit Selection','OK',null,null,'Check here to confirm this dialog');
813 obj.error.standard_unexpected_error_alert('copy status -> mark volume',E);
817 'cmd_mark_library' : [
821 JSAN.use('util.functional');
822 var list = util.functional.map_list( obj.selection_list, function(o) { return o.acn_id; } );
824 if (list.length == 1) {
825 var v = obj.network.simple_request('FM_ACN_RETRIEVE',[list[0]]);
826 var owning_lib = v.owning_lib(); if (typeof owning_lib == 'object') owning_lib = owning_lib.id();
828 obj.data.marked_library = { 'lib' : owning_lib, 'docid' : v.record() };
829 obj.data.stash('marked_library');
830 alert('Library + Record marked as Volume Transfer Destination');
832 obj.error.yns_alert('Choose just one Library to mark as Volume Transfer Destination','Limit Selection','OK',null,null,'Check here to confirm this dialog');
835 obj.error.standard_unexpected_error_alert('copy status -> mark library',E);
839 'cmd_transfer_volume' : [
843 obj.data.stash_retrieve();
844 if (!obj.data.marked_library) {
845 alert('Please mark a library as the destination from within holdings maintenance and then try this again.');
849 JSAN.use('util.functional');
851 var list = util.functional.map_list( obj.selection_list, function(o) { return o.acn_id; } );
852 if (list.length == 0) return;
856 for (var i = 0; i < list.length; i++) {
857 var volume_id = list[i];
858 if (volume_id == -1) continue; /* ignore magic pre-cat volume */
859 if (! map_acn[volume_id]) {
860 map_acn[ volume_id ] = obj.network.simple_request('FM_ACN_RETRIEVE',[ volume_id ]);
864 list = []; for (v in map_acn) list.push(map_acn[v]);
866 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
867 var xml = '<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" flex="1" style="overflow: auto">';
868 xml += '<description>Transfer volumes ';
870 xml += util.functional.map_list(
877 xml += ' to library ' + obj.data.hash.aou[ obj.data.marked_library.lib ].shortname();
878 xml += ' on the following record?</description>';
879 xml += '<hbox><button label="Transfer" name="fancy_submit"/>';
880 xml += '<button label="Cancel" accesskey="C" name="fancy_cancel"/></hbox>';
881 xml += '<iframe style="overflow: scroll" flex="1" src="' + urls.XUL_BIB_BRIEF + '?docid=' + obj.data.marked_library.docid + '"/>';
883 JSAN.use('OpenILS.data');
884 //var data = new OpenILS.data(); data.init({'via':'stash'});
885 //data.temp_transfer = xml; data.stash('temp_transfer');
886 JSAN.use('util.window'); var win = new util.window();
887 var fancy_prompt_data = win.open(
888 urls.XUL_FANCY_PROMPT,
889 //+ '?xml_in_stash=temp_transfer'
890 //+ '&title=' + window.escape('Volume Transfer'),
891 'fancy_prompt', 'chrome,resizable,modal,width=500,height=300',
892 { 'xml' : xml, 'title' : 'Volume Transfer' }
895 if (fancy_prompt_data.fancy_status == 'incomplete') { alert('Transfer Aborted'); return; }
897 var robj = obj.network.simple_request(
899 [ ses(), { 'docid' : obj.data.marked_library.docid, 'lib' : obj.data.marked_library.lib, 'volumes' : util.functional.map_list( list, function(o) { return o.id(); }) } ],
902 'title' : 'Override Volume Transfer Failure?',
903 'overridable_events' : [
904 1208 /* TITLE_LAST_COPY */,
905 1219 /* COPY_REMOTE_CIRC_LIB */,
910 if (typeof robj.ilsevent != 'undefined') {
911 if (robj.ilsevent == 1221 /* ORG_CANNOT_HAVE_VOLS */) {
912 alert('That destination cannot have volumes.');
917 alert('Volumes transferred.');
921 obj.error.standard_unexpected_error_alert('All volumes not likely transferred.',E);
929 this.controller.render();
930 this.controller.view.copy_status_barcode_entry_textbox.focus();
934 'test_barcode' : function(bc) {
936 var good = util.barcode.check(bc);
937 var x = document.getElementById('strict_barcode');
938 if (x && x.checked != true) return true;
942 if ( 1 == obj.error.yns_alert(
943 'Bad checkdigit; possible mis-scan. Use this barcode ("' + bc + '") anyway?',
948 'Check here to confirm this action',
949 '/xul/server/skin/media/images/bad_barcode.png'
958 'copy_status' : function(barcode,refresh) {
961 try { document.getElementById('last_scanned').setAttribute('value',''); } catch(E) {}
962 if (!barcode) barcode = obj.controller.view.copy_status_barcode_entry_textbox.value;
963 if (!barcode) return;
965 if ( obj.test_barcode(barcode) ) { /* good */ } else { /* bad */ return; }
967 JSAN.use('circ.util');
968 function handle_req(req) {
970 var details = req.getResultObject();
971 if (details == null) {
972 throw('Something weird happened. null result');
973 } else if (details.ilsevent) {
974 switch(details.ilsevent) {
976 obj.error.standard_network_error_alert();
977 obj.controller.view.copy_status_barcode_entry_textbox.select();
978 obj.controller.view.copy_status_barcode_entry_textbox.focus();
981 case 1502 /* ASSET_COPY_NOT_FOUND */ :
982 try { document.getElementById('last_scanned').setAttribute('value',barcode + ' was either mis-scanned or is not cataloged.'); } catch(E) {}
983 obj.error.yns_alert(barcode + ' was either mis-scanned or is not cataloged.','Not Cataloged','OK',null,null,'Check here to confirm this message');
984 obj.controller.view.copy_status_barcode_entry_textbox.select();
985 obj.controller.view.copy_status_barcode_entry_textbox.focus();
993 var msg = details.copy.barcode() + ' -- ';
994 if (details.copy.call_number() == -1) msg += 'Item is a Pre-Cat. ';
995 if (details.hold) msg += 'Item is captured for a Hold. ';
996 if (details.transit) msg += 'Item is in Transit. ';
997 if (details.circ && ! details.circ.checkin_time()) msg += 'Item is circulating. ';
998 try { document.getElementById('last_scanned').setAttribute('value',msg); } catch(E) {}
999 if (document.getElementById('trim_list')) {
1000 var x = document.getElementById('trim_list');
1001 if (x.checked) { obj.list.trim_list = 20; } else { obj.list.trim_list = null; }
1004 'retrieve_id' : js2JSON(
1006 'renewable' : details.circ ? 't' : 'f',
1007 'copy_id' : details.copy.id(),
1008 'acn_id' : details.volume ? details.volume.id() : -1,
1009 'barcode' : barcode,
1010 'doc_id' : details.mvr ? details.mvr.doc_id() : null
1015 'mvr' : details.mvr,
1016 'acp' : details.copy,
1017 'acn' : details.volume,
1018 'atc' : details.transit,
1019 'circ' : details.circ,
1020 'ahr' : details.hold,
1026 var nparams = obj.list.append(params);
1027 if (!document.getElementById('trim_list').checked) {
1028 if (typeof obj.list_barcode_map[barcode] == 'undefined') obj.list_barcode_map[barcode] =[];
1029 obj.list_barcode_map[barcode].push(nparams);
1032 if (!document.getElementById('trim_list').checked) {
1033 for (var i = 0; i < obj.list_barcode_map[barcode].length; i++) {
1034 params.my_node = obj.list_barcode_map[barcode][i].my_node;
1035 obj.list.refresh_row(params);
1038 obj.list.append(params);
1042 obj.error.standard_unexpected_error_alert('barcode = ' + barcode,E);
1045 var result = obj.network.simple_request('FM_ACP_DETAILS_VIA_BARCODE', [ ses(), barcode ]);
1046 handle_req({'getResultObject':function(){return result;}}); // used to be async
1047 obj.controller.view.copy_status_barcode_entry_textbox.value = '';
1048 obj.controller.view.copy_status_barcode_entry_textbox.focus();
1051 obj.error.standard_unexpected_error_alert('barcode = ' + barcode,E);
1052 obj.controller.view.copy_status_barcode_entry_textbox.select();
1053 obj.controller.view.copy_status_barcode_entry_textbox.focus();
1058 'spawn_copy_editor' : function() {
1060 /* FIXME - a lot of redundant calls here */
1064 JSAN.use('util.widgets'); JSAN.use('util.functional');
1066 var list = obj.selection_list;
1068 list = util.functional.map_list(
1075 var copies = util.functional.map_list(
1078 return obj.network.simple_request('FM_ACP_RETRIEVE',[acp_id]);
1084 edit = obj.network.request(
1085 api.PERM_MULTI_ORG_CHECK.app,
1086 api.PERM_MULTI_ORG_CHECK.method,
1089 obj.data.list.au[0].id(),
1090 util.functional.map_list(
1093 return o.call_number() == -1 ? o.circ_lib() : obj.network.simple_request('FM_ACN_RETRIEVE',[o.call_number()]).owning_lib();
1096 copies.length == 1 ? [ 'UPDATE_COPY' ] : [ 'UPDATE_COPY', 'UPDATE_BATCH_COPY' ]
1098 ).length == 0 ? 1 : 0;
1100 obj.error.sdump('D_ERROR','batch permission check: ' + E);
1103 JSAN.use('cat.util'); cat.util.spawn_copy_editor(list,edit);
1109 dump('exiting circ.copy_status.js\n');