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' : [],
17 'init' : function( params ) {
21 JSAN.use('circ.util');
22 var columns = circ.util.columns(
24 'barcode' : { 'hidden' : false },
25 'title' : { 'hidden' : false },
26 'location' : { 'hidden' : false },
27 'call_number' : { 'hidden' : false },
28 'status' : { 'hidden' : false },
29 'alert_message' : { 'hidden' : false },
30 'due_date' : { 'hidden' : false },
34 'checkin_time', 'checkin_time_full', 'route_to', 'message', 'uses', 'xact_finish',
39 JSAN.use('util.list'); obj.list = new util.list('copy_status_list');
43 'map_row_to_columns' : circ.util.std_map_row_to_columns(),
44 'on_select' : function(ev) {
46 JSAN.use('util.functional');
47 var sel = obj.list.retrieve_selection();
48 obj.selection_list = util.functional.map_list(
50 function(o) { return JSON2js(o.getAttribute('retrieve_id')); }
52 obj.error.sdump('D_TRACE','circ/copy_status: selection list = ' + js2JSON(obj.selection_list) );
53 if (obj.selection_list.length == 0) {
54 obj.controller.view.sel_checkin.setAttribute('disabled','true');
55 obj.controller.view.cmd_replace_barcode.setAttribute('disabled','true');
56 obj.controller.view.sel_edit.setAttribute('disabled','true');
57 obj.controller.view.sel_opac.setAttribute('disabled','true');
58 obj.controller.view.sel_bucket.setAttribute('disabled','true');
59 obj.controller.view.sel_copy_details.setAttribute('disabled','true');
60 obj.controller.view.sel_mark_items_damaged.setAttribute('disabled','true');
61 obj.controller.view.sel_mark_items_missing.setAttribute('disabled','true');
62 obj.controller.view.sel_patron.setAttribute('disabled','true');
63 obj.controller.view.sel_spine.setAttribute('disabled','true');
64 obj.controller.view.sel_transit_abort.setAttribute('disabled','true');
65 obj.controller.view.sel_clip.setAttribute('disabled','true');
66 obj.controller.view.sel_renew.setAttribute('disabled','true');
67 obj.controller.view.cmd_add_items.setAttribute('disabled','true');
68 obj.controller.view.cmd_delete_items.setAttribute('disabled','true');
69 obj.controller.view.cmd_transfer_items.setAttribute('disabled','true');
70 obj.controller.view.cmd_add_volumes.setAttribute('disabled','true');
71 obj.controller.view.cmd_edit_volumes.setAttribute('disabled','true');
72 obj.controller.view.cmd_delete_volumes.setAttribute('disabled','true');
73 obj.controller.view.cmd_mark_volume.setAttribute('disabled','true');
74 obj.controller.view.cmd_mark_library.setAttribute('disabled','true');
75 obj.controller.view.cmd_transfer_volume.setAttribute('disabled','true');
77 obj.controller.view.sel_checkin.setAttribute('disabled','false');
78 obj.controller.view.cmd_replace_barcode.setAttribute('disabled','false');
79 obj.controller.view.sel_edit.setAttribute('disabled','false');
80 obj.controller.view.sel_opac.setAttribute('disabled','false');
81 obj.controller.view.sel_patron.setAttribute('disabled','false');
82 obj.controller.view.sel_bucket.setAttribute('disabled','false');
83 obj.controller.view.sel_copy_details.setAttribute('disabled','false');
84 obj.controller.view.sel_mark_items_damaged.setAttribute('disabled','false');
85 obj.controller.view.sel_mark_items_missing.setAttribute('disabled','false');
86 obj.controller.view.sel_spine.setAttribute('disabled','false');
87 obj.controller.view.sel_transit_abort.setAttribute('disabled','false');
88 obj.controller.view.sel_clip.setAttribute('disabled','false');
89 obj.controller.view.sel_renew.setAttribute('disabled','false');
90 obj.controller.view.cmd_add_items.setAttribute('disabled','false');
91 obj.controller.view.cmd_delete_items.setAttribute('disabled','false');
92 obj.controller.view.cmd_transfer_items.setAttribute('disabled','false');
93 obj.controller.view.cmd_add_volumes.setAttribute('disabled','false');
94 obj.controller.view.cmd_edit_volumes.setAttribute('disabled','false');
95 obj.controller.view.cmd_delete_volumes.setAttribute('disabled','false');
96 obj.controller.view.cmd_mark_volume.setAttribute('disabled','false');
97 obj.controller.view.cmd_mark_library.setAttribute('disabled','false');
98 obj.controller.view.cmd_transfer_volume.setAttribute('disabled','false');
101 alert('FIXME: ' + E);
107 JSAN.use('util.controller'); obj.controller = new util.controller();
111 'save_columns' : [ [ 'command' ], function() { obj.list.save_columns(); } ],
114 function() { obj.list.clipboard(); }
121 JSAN.use('circ.util');
122 for (var i = 0; i < obj.selection_list.length; i++) {
123 var barcode = obj.selection_list[i].barcode;
124 var checkin = circ.util.checkin_via_barcode( ses(), { 'barcode' : barcode } );
125 funcs.push( function(a) { return function() { obj.copy_status( a ); }; }(barcode) );
127 for (var i = 0; i < funcs.length; i++) { funcs[i](); }
128 alert('Action complete.');
130 obj.error.standard_unexpected_error_alert('Checkin did not likely happen.',E);
134 'cmd_replace_barcode' : [
139 JSAN.use('cat.util');
140 for (var i = 0; i < obj.selection_list.length; i++) {
142 var barcode = obj.selection_list[i].barcode;
143 var new_bc = cat.util.replace_barcode( barcode );
144 funcs.push( function(a) { return function() { obj.copy_status( a ); }; }(new_bc) );
146 obj.error.standard_unexpected_error_alert('Barcode ' + barcode + ' was not likely replaced.',E);
149 for (var i = 0; i < funcs.length; i++) { funcs[i](); }
150 alert('Action complete.');
152 obj.error.standard_unexpected_error_alert('Barcode replacements did not likely happen.',E);
161 obj.spawn_copy_editor();
162 for (var i = 0; i < obj.selection_list.length; i++) {
163 var barcode = obj.selection_list[i].barcode;
164 funcs.push( function(a) { return function() { obj.copy_status( a ); }; }(barcode) );
166 for (var i = 0; i < funcs.length; i++) { funcs[i](); }
168 obj.error.standard_unexpected_error_alert('with copy editor',E);
175 JSAN.use('cat.util');
176 cat.util.spawn_spine_editor(obj.selection_list);
182 JSAN.use('cat.util');
183 cat.util.show_in_opac(obj.selection_list);
186 'sel_transit_abort' : [
190 JSAN.use('circ.util');
191 circ.util.abort_transits(obj.selection_list);
192 for (var i = 0; i < obj.selection_list.length; i++) {
193 var barcode = obj.selection_list[i].barcode;
194 funcs.push( function(a) { return function() { obj.copy_status( a ); }; }(barcode) );
196 for (var i = 0; i < funcs.length; i++) { funcs[i](); }
197 alert('Action complete.');
203 JSAN.use('circ.util');
204 circ.util.show_last_few_circs(obj.selection_list);
207 'sel_copy_details' : [
210 JSAN.use('circ.util');
211 for (var i = 0; i < obj.selection_list.length; i++) {
212 circ.util.show_copy_details( obj.selection_list[i].copy_id );
220 JSAN.use('circ.util');
221 for (var i = 0; i < obj.selection_list.length; i++) {
222 var test = obj.selection_list[i].renewable;
223 var barcode = obj.selection_list[i].barcode;
225 circ.util.renew_via_barcode( barcode );
226 funcs.push( function(a) { return function() { obj.copy_status( a ); }; }(barcode) );
228 alert('Item with barcode ' + barcode + ' is not circulating.');
231 for (var i = 0; i < funcs.length; i++) { funcs[i](); }
232 alert('Action complete.');
236 'sel_mark_items_damaged' : [
240 JSAN.use('cat.util'); JSAN.use('util.functional');
241 cat.util.mark_item_damaged( util.functional.map_list( obj.selection_list, function(o) { return o.copy_id; } ) );
242 for (var i = 0; i < obj.selection_list.length; i++) {
243 var barcode = obj.selection_list[i].barcode;
244 funcs.push( function(a) { return function() { obj.copy_status( a ); }; }(barcode) );
246 for (var i = 0; i < funcs.length; i++) { funcs[i](); }
249 'sel_mark_items_missing' : [
253 JSAN.use('cat.util'); JSAN.use('util.functional');
254 cat.util.mark_item_missing( util.functional.map_list( obj.selection_list, function(o) { return o.copy_id; } ) );
255 for (var i = 0; i < obj.selection_list.length; i++) {
256 var barcode = obj.selection_list[i].barcode;
257 funcs.push( function(a) { return function() { obj.copy_status( a ); }; }(barcode) );
259 for (var i = 0; i < funcs.length; i++) { funcs[i](); }
265 JSAN.use('cat.util');
266 cat.util.add_copies_to_bucket(obj.selection_list);
269 'copy_status_barcode_entry_textbox' : [
272 if (ev.keyCode && ev.keyCode == 13) {
279 function() { alert('Not Yet Implemented'); }
281 'cmd_copy_status_submit_barcode' : [
287 'cmd_copy_status_upload_file' : [
290 function pick_file(mode) {
291 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
292 var nsIFilePicker = Components.interfaces.nsIFilePicker;
293 var fp = Components.classes["@mozilla.org/filepicker;1"].createInstance( nsIFilePicker );
296 mode == 'open' ? "Import Barcode File" : "Save Barcode File As",
297 mode == 'open' ? nsIFilePicker.modeOpen : nsIFilePicker.modeSave
299 fp.appendFilters( nsIFilePicker.filterAll );
300 if ( fp.show( ) == nsIFilePicker.returnOK && fp.file ) {
306 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
307 JSAN.use('util.file');
308 var f = pick_file('open');
309 var i_file = new util.file(''); i_file._file = f;
310 var content = i_file.get_content();
312 var barcodes = content.split(/\s+/);
313 if (barcodes.length > 0) {
314 JSAN.use('util.exec'); var exec = new util.exec();
316 for (var i = 0; i < barcodes.length; i++) {
325 funcs.push( function() { alert('File uploaded.'); } );
328 alert('No barcodes found in file.');
333 'cmd_copy_status_print' : [
337 obj.list.on_all_fleshed =
340 dump( js2JSON( obj.list.dump_with_keys() ) + '\n' );
341 obj.data.stash_retrieve();
342 var lib = obj.data.hash.aou[ obj.data.list.au[0].ws_ou() ];
346 'staff' : obj.data.list.au[0],
347 'header' : obj.data.print_list_templates.item_status.header,
348 'line_item' : obj.data.print_list_templates.item_status.line_item,
349 'footer' : obj.data.print_list_templates.item_status.footer,
350 'type' : obj.data.print_list_templates.item_status.type,
351 'list' : obj.list.dump_with_keys(),
353 JSAN.use('util.print'); var print = new util.print();
354 print.tree_list( p );
355 setTimeout(function(){ obj.list.on_all_fleshed = null; },0);
357 obj.error.standard_unexpected_error_alert('print',E);
360 obj.list.full_retrieve();
362 obj.error.standard_unexpected_error_alert('print',E);
366 'cmd_copy_status_export' : [
370 obj.list.on_all_fleshed =
373 dump( obj.list.dump_csv() + '\n' );
374 copy_to_clipboard(obj.list.dump_csv());
375 setTimeout(function(){ obj.list.on_all_fleshed = null; },0);
377 obj.error.standard_unexpected_error_alert('export',E);
380 obj.list.full_retrieve();
382 obj.error.standard_unexpected_error_alert('export',E);
386 'cmd_copy_status_print_export' : [
390 obj.list.on_all_fleshed =
393 dump( obj.list.dump_csv() + '\n' );
394 //copy_to_clipboard(obj.list.dump_csv());
395 JSAN.use('util.print'); var print = new util.print();
396 print.simple(obj.list.dump_csv(),{'content_type':'text/plain'});
397 setTimeout(function(){ obj.list.on_all_fleshed = null; },0);
399 obj.error.standard_unexpected_error_alert('export',E);
402 obj.list.full_retrieve();
404 obj.error.standard_unexpected_error_alert('export',E);
414 JSAN.use('util.functional');
415 var list = util.functional.map_list( obj.selection_list, function(o) { return o.acn_id; } );
416 if (list.length == 0) return;
418 var copy_shortcut = {}; var map_acn = {};
420 for (var i = 0; i < list.length; i++) {
421 var volume_id = list[i];
422 if (volume_id == -1) continue; /* ignore magic pre-cat volume */
423 if (! map_acn[volume_id]) {
424 map_acn[ volume_id ] = obj.network.simple_request('FM_ACN_RETRIEVE',[ volume_id ]);
426 var record_id = map_acn[ volume_id ].record();
427 var ou_id = map_acn[ volume_id ].owning_lib();
428 var label = map_acn[ volume_id ].label();
429 if (!copy_shortcut[record_id]) copy_shortcut[record_id] = {};
430 if (!copy_shortcut[record_id][ou_id]) copy_shortcut[record_id][ou_id] = {};
431 copy_shortcut[record_id][ou_id][ label ] = volume_id;
435 for (var r in copy_shortcut) {
437 /* quick fix */ /* what was this fixing? */
438 list = []; for (var i in copy_shortcut[r]) { list.push( i ); }
442 edit = obj.network.request(
443 api.PERM_MULTI_ORG_CHECK.app,
444 api.PERM_MULTI_ORG_CHECK.method,
447 obj.data.list.au[0].id(),
451 ).length == 0 ? 1 : 0;
453 obj.error.sdump('D_ERROR','batch permission check: ' + E);
456 if (edit==0) return; // no read-only view for this interface
458 var title = 'Add Item for record #' + r;
460 JSAN.use('util.window'); var win = new util.window();
462 window.xulG.url_prefix(urls.XUL_VOLUME_COPY_CREATOR),
463 //+'?doc_id=' + window.escape(r)
464 //+'&ou_ids=' + window.escape( js2JSON(list) )
465 //+'©_shortcut=' + window.escape( js2JSON(copy_shortcut[r]) ),
468 { 'doc_id' : r, 'ou_ids' : list, 'copy_shortcut' : copy_shortcut[r] }
473 obj.error.standard_unexpected_error_alert('copy status -> add copies',E);
478 'cmd_delete_items' : [
483 JSAN.use('util.functional');
485 var list = util.functional.map_list( obj.selection_list, function(o) { return o.copy_id; } );
487 var copies = util.functional.map_list(
490 return obj.network.simple_request('FM_ACP_RETRIEVE',[acp_id]);
494 for (var i = 0; i < copies.length; i++) {
495 copies[i].ischanged(1);
496 copies[i].isdeleted(1);
499 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;
501 var robj = obj.network.simple_request('FM_ACP_FLESHED_BATCH_UPDATE',[ ses(), copies, true]);
502 var robj = obj.network.simple_request(
503 'FM_ACP_FLESHED_BATCH_UPDATE',
504 [ ses(), copies, true ],
507 'title' : 'Override Delete Failure?',
508 'overridable_events' : [
509 1208 /* TITLE_LAST_COPY */,
510 1227 /* COPY_DELETE_WARNING */,
515 if (typeof robj.ilsevent != 'undefined') {
516 switch(robj.ilsevent) {
517 case 1208 /* TITLE_LAST_COPY */:
518 case 1227 /* COPY_DELETE_WARNING */:
521 obj.error.standard_unexpected_error_alert('Batch Item Deletion',robj);
524 } else { alert('Items Deleted'); }
527 obj.error.standard_unexpected_error_alert('copy status -> delete items',E);
531 'cmd_transfer_items' : [
535 obj.data.stash_retrieve();
536 if (!obj.data.marked_volume) {
537 alert('Please mark a volume as the destination and then try this again.');
541 JSAN.use('util.functional');
543 var list = util.functional.map_list( obj.selection_list, function(o) { return o.copy_id; } );
545 var volume = obj.network.simple_request('FM_ACN_RETRIEVE',[ obj.data.marked_volume ]);
547 JSAN.use('cat.util'); cat.util.transfer_copies( {
549 'docid' : volume.record(),
550 'volume_label' : volume.label(),
551 'owning_lib' : volume.owning_lib(),
555 obj.error.standard_unexpected_error_alert('All copies not likely transferred.',E);
560 'cmd_add_volumes' : [
564 JSAN.use('util.functional');
565 var list = util.functional.map_list( obj.selection_list, function(o) { return o.acn_id; } );
566 if (list.length == 0) return;
568 var aou_hash = {}; var map_acn = {};
570 for (var i = 0; i < list.length; i++) {
571 var volume_id = list[i];
572 if (volume_id == -1) continue; /* ignore magic pre-cat volume */
573 if (! map_acn[volume_id]) {
574 map_acn[ volume_id ] = obj.network.simple_request('FM_ACN_RETRIEVE',[ volume_id ]);
576 var record_id = map_acn[ volume_id ].record();
577 var ou_id = map_acn[ volume_id ].owning_lib();
578 var label = map_acn[ volume_id ].label();
579 if (!aou_hash[record_id]) aou_hash[record_id] = {};
580 aou_hash[record_id][ou_id] = 1;
584 for (var r in aou_hash) {
586 list = []; for (var org in aou_hash[r]) list.push(org);
590 edit = obj.network.request(
591 api.PERM_MULTI_ORG_CHECK.app,
592 api.PERM_MULTI_ORG_CHECK.method,
595 obj.data.list.au[0].id(),
597 [ 'CREATE_VOLUME', 'CREATE_COPY' ]
599 ).length == 0 ? 1 : 0;
601 obj.error.sdump('D_ERROR','batch permission check: ' + E);
605 alert("You don't have permission to add volumes to that library.");
606 return; // no read-only view for this interface
609 var title = 'Add Volume/Item for Record # ' + r;
611 JSAN.use('util.window'); var win = new util.window();
613 window.xulG.url_prefix(urls.XUL_VOLUME_COPY_CREATOR),
614 //+'?doc_id=' + window.escape(r)
615 //+'&ou_ids=' + window.escape( js2JSON(list) ),
618 { 'doc_id' : r, 'ou_ids' : list }
624 obj.error.standard_unexpected_error_alert('copy status -> add volumes',E);
629 'cmd_edit_volumes' : [
633 JSAN.use('util.functional');
634 var list = util.functional.map_list( obj.selection_list, function(o) { return o.acn_id; } );
635 if (list.length == 0) return;
637 var volume_hash = {}; var map_acn = {};
639 for (var i = 0; i < list.length; i++) {
640 var volume_id = list[i];
641 if (volume_id == -1) continue; /* ignore magic pre-cat volume */
642 if (! map_acn[volume_id]) {
643 map_acn[ volume_id ] = obj.network.simple_request('FM_ACN_RETRIEVE',[ volume_id ]);
644 map_acn[ volume_id ].copies( [] );
646 var record_id = map_acn[ volume_id ].record();
647 if (!volume_hash[record_id]) volume_hash[record_id] = {};
648 volume_hash[record_id][volume_id] = 1;
651 for (var rec in volume_hash) {
653 list = []; for (var v in volume_hash[rec]) list.push( map_acn[v] );
657 edit = obj.network.request(
658 api.PERM_MULTI_ORG_CHECK.app,
659 api.PERM_MULTI_ORG_CHECK.method,
662 obj.data.list.au[0].id(),
663 util.functional.map_list(
666 return o.owning_lib();
671 ).length == 0 ? 1 : 0;
673 obj.error.sdump('D_ERROR','batch permission check: ' + E);
677 alert("You don't have permission to edit this volume.");
678 return; // no read-only view for this interface
681 var title = (list.length == 1 ? 'Volume' : 'Volumes') + ' for record # ' + rec;
683 JSAN.use('util.window'); var win = new util.window();
684 //obj.data.volumes_temp = js2JSON( list );
685 //obj.data.stash('volumes_temp');
686 var my_xulG = win.open(
687 window.xulG.url_prefix(urls.XUL_VOLUME_EDITOR),
689 'chrome,modal,resizable',
693 /* FIXME -- need to unique the temp space, and not rely on modalness of window */
694 //obj.data.stash_retrieve();
695 //var volumes = JSON2js( obj.data.volumes_temp );
696 var volumes = my_xulG.volumes;
697 if (!volumes) return;
699 volumes = util.functional.filter_list(
702 return o.ischanged() == '1';
706 volumes = util.functional.map_list(
709 o.record( rec ); // staff client 2 did not do this. Does it matter?
714 if (volumes.length == 0) return;
717 var r = obj.network.request(
718 api.FM_ACN_TREE_UPDATE.app,
719 api.FM_ACN_TREE_UPDATE.method,
720 [ ses(), volumes, false ]
722 if (typeof r.ilsevent != 'undefined') throw(r);
723 alert('Volumes modified.');
725 obj.error.standard_unexpected_error_alert('volume update error: ',E);
730 obj.error.standard_unexpected_error_alert('Copy Status -> Volume Edit',E);
735 'cmd_delete_volumes' : [
739 JSAN.use('util.functional');
740 var list = util.functional.map_list( obj.selection_list, function(o) { return o.acn_id; } );
741 if (list.length == 0) return;
745 for (var i = 0; i < list.length; i++) {
746 var volume_id = list[i];
747 if (volume_id == -1) continue; /* ignore magic pre-cat volume */
748 if (! map_acn[volume_id]) {
749 map_acn[ volume_id ] = obj.network.simple_request('FM_ACN_RETRIEVE',[ volume_id ]);
753 list = []; for (var v in map_acn) list.push( map_acn[v] );
755 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');
758 for (var i = 0; i < list.length; i++) {
759 list[i].isdeleted('1');
761 var robj = obj.network.simple_request(
762 'FM_ACN_TREE_UPDATE',
763 [ ses(), list, true ],
766 'title' : 'Override Delete Failure?',
767 'overridable_events' : [
771 if (robj == null) throw(robj);
772 if (typeof robj.ilsevent != 'undefined') {
773 if (robj.ilsevent == 1206 /* VOLUME_NOT_EMPTY */) {
774 alert('You must delete all the copies on the volume before you may delete the volume itself.');
777 if (robj.ilsevent != 0) throw(robj);
779 alert('Volumes deleted.');
782 obj.error.standard_unexpected_error_alert('copy status -> delete volumes',E);
788 'cmd_mark_volume' : [
792 JSAN.use('util.functional');
793 var list = util.functional.map_list( obj.selection_list, function(o) { return o.acn_id; } );
795 if (list.length == 1) {
796 obj.data.marked_volume = list[0];
797 obj.data.stash('marked_volume');
798 alert('Volume marked as Item Transfer Destination');
800 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');
803 obj.error.standard_unexpected_error_alert('copy status -> mark volume',E);
807 'cmd_mark_library' : [
811 JSAN.use('util.functional');
812 var list = util.functional.map_list( obj.selection_list, function(o) { return o.acn_id; } );
814 if (list.length == 1) {
815 var v = obj.network.simple_request('FM_ACN_RETRIEVE',[list[0]]);
816 var owning_lib = v.owning_lib(); if (typeof owning_lib == 'object') owning_lib = owning_lib.id();
818 obj.data.marked_library = { 'lib' : owning_lib, 'docid' : v.record() };
819 obj.data.stash('marked_library');
820 alert('Library + Record marked as Volume Transfer Destination');
822 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');
825 obj.error.standard_unexpected_error_alert('copy status -> mark library',E);
829 'cmd_transfer_volume' : [
833 obj.data.stash_retrieve();
834 if (!obj.data.marked_library) {
835 alert('Please mark a library as the destination from within holdings maintenance and then try this again.');
839 JSAN.use('util.functional');
841 var list = util.functional.map_list( obj.selection_list, function(o) { return o.acn_id; } );
842 if (list.length == 0) return;
846 for (var i = 0; i < list.length; i++) {
847 var volume_id = list[i];
848 if (volume_id == -1) continue; /* ignore magic pre-cat volume */
849 if (! map_acn[volume_id]) {
850 map_acn[ volume_id ] = obj.network.simple_request('FM_ACN_RETRIEVE',[ volume_id ]);
854 list = []; for (v in map_acn) list.push(map_acn[v]);
856 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
857 var xml = '<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" flex="1" style="overflow: auto">';
858 xml += '<description>Transfer volumes ';
860 xml += util.functional.map_list(
867 xml += ' to library ' + obj.data.hash.aou[ obj.data.marked_library.lib ].shortname();
868 xml += ' on the following record?</description>';
869 xml += '<hbox><button label="Transfer" name="fancy_submit"/>';
870 xml += '<button label="Cancel" accesskey="C" name="fancy_cancel"/></hbox>';
871 xml += '<iframe style="overflow: scroll" flex="1" src="' + urls.XUL_BIB_BRIEF + '?docid=' + obj.data.marked_library.docid + '"/>';
873 JSAN.use('OpenILS.data');
874 //var data = new OpenILS.data(); data.init({'via':'stash'});
875 //data.temp_transfer = xml; data.stash('temp_transfer');
876 JSAN.use('util.window'); var win = new util.window();
877 var fancy_prompt_data = win.open(
878 urls.XUL_FANCY_PROMPT,
879 //+ '?xml_in_stash=temp_transfer'
880 //+ '&title=' + window.escape('Volume Transfer'),
881 'fancy_prompt', 'chrome,resizable,modal,width=500,height=300',
882 { 'xml' : xml, 'title' : 'Volume Transfer' }
885 if (fancy_prompt_data.fancy_status == 'incomplete') { alert('Transfer Aborted'); return; }
887 var robj = obj.network.simple_request(
889 [ ses(), { 'docid' : obj.data.marked_library.docid, 'lib' : obj.data.marked_library.lib, 'volumes' : util.functional.map_list( list, function(o) { return o.id(); }) } ],
892 'title' : 'Override Volume Transfer Failure?',
893 'overridable_events' : [
894 1208 /* TITLE_LAST_COPY */,
895 1219 /* COPY_REMOTE_CIRC_LIB */,
900 if (typeof robj.ilsevent != 'undefined') {
901 if (robj.ilsevent == 1221 /* ORG_CANNOT_HAVE_VOLS */) {
902 alert('That destination cannot have volumes.');
907 alert('Volumes transferred.');
911 obj.error.standard_unexpected_error_alert('All volumes not likely transferred.',E);
919 this.controller.render();
920 this.controller.view.copy_status_barcode_entry_textbox.focus();
924 'test_barcode' : function(bc) {
926 var good = util.barcode.check(bc);
927 var x = document.getElementById('strict_barcode');
928 if (x && x.checked != true) return true;
932 if ( 1 == obj.error.yns_alert(
933 'Bad checkdigit; possible mis-scan. Use this barcode ("' + bc + '") anyway?',
938 'Check here to confirm this action',
939 '/xul/server/skin/media/images/bad_barcode.png'
948 'copy_status' : function(barcode) {
951 try { document.getElementById('last_scanned').setAttribute('value',''); } catch(E) {}
952 if (!barcode) barcode = obj.controller.view.copy_status_barcode_entry_textbox.value;
953 if (!barcode) return;
955 if ( obj.test_barcode(barcode) ) { /* good */ } else { /* bad */ return; }
957 JSAN.use('circ.util');
958 function handle_req(req) {
960 var details = req.getResultObject();
961 if (details == null) {
962 throw('Something weird happened. null result');
963 } else if (details.ilsevent) {
964 switch(details.ilsevent) {
966 obj.error.standard_network_error_alert();
967 obj.controller.view.copy_status_barcode_entry_textbox.select();
968 obj.controller.view.copy_status_barcode_entry_textbox.focus();
971 case 1502 /* ASSET_COPY_NOT_FOUND */ :
972 try { document.getElementById('last_scanned').setAttribute('value',barcode + ' was either mis-scanned or is not cataloged.'); } catch(E) {}
973 obj.error.yns_alert(barcode + ' was either mis-scanned or is not cataloged.','Not Cataloged','OK',null,null,'Check here to confirm this message');
974 obj.controller.view.copy_status_barcode_entry_textbox.select();
975 obj.controller.view.copy_status_barcode_entry_textbox.focus();
983 var msg = details.copy.barcode() + ' -- ';
984 if (details.copy.call_number() == -1) msg += 'Item is a Pre-Cat. ';
985 if (details.hold) msg += 'Item is captured for a Hold. ';
986 if (details.transit) msg += 'Item is in Transit. ';
987 if (details.circ && ! details.circ.checkin_time()) msg += 'Item is circulating. ';
988 try { document.getElementById('last_scanned').setAttribute('value',msg); } catch(E) {}
989 if (document.getElementById('trim_list')) {
990 var x = document.getElementById('trim_list');
991 if (x.checked) { obj.list.trim_list = 20; } else { obj.list.trim_list = null; }
995 'retrieve_id' : js2JSON(
997 'renewable' : details.circ ? 't' : 'f',
998 'copy_id' : details.copy.id(),
999 'acn_id' : details.volume ? details.volume.id() : -1,
1000 'barcode' : barcode,
1001 'doc_id' : details.mvr ? details.mvr.doc_id() : null
1006 'mvr' : details.mvr,
1007 'acp' : details.copy,
1008 'acn' : details.volume,
1009 'atc' : details.transit,
1010 'circ' : details.circ,
1011 'ahr' : details.hold,
1018 obj.error.standard_unexpected_error_alert('barcode = ' + barcode,E);
1021 var result = obj.network.simple_request('FM_ACP_DETAILS_VIA_BARCODE', [ ses(), barcode ]);
1022 handle_req({'getResultObject':function(){return result;}}); // used to be async
1023 obj.controller.view.copy_status_barcode_entry_textbox.value = '';
1024 obj.controller.view.copy_status_barcode_entry_textbox.focus();
1027 obj.error.standard_unexpected_error_alert('barcode = ' + barcode,E);
1028 obj.controller.view.copy_status_barcode_entry_textbox.select();
1029 obj.controller.view.copy_status_barcode_entry_textbox.focus();
1034 'spawn_copy_editor' : function() {
1036 /* FIXME - a lot of redundant calls here */
1040 JSAN.use('util.widgets'); JSAN.use('util.functional');
1042 var list = obj.selection_list;
1044 list = util.functional.map_list(
1051 var copies = util.functional.map_list(
1054 return obj.network.simple_request('FM_ACP_RETRIEVE',[acp_id]);
1060 edit = obj.network.request(
1061 api.PERM_MULTI_ORG_CHECK.app,
1062 api.PERM_MULTI_ORG_CHECK.method,
1065 obj.data.list.au[0].id(),
1066 util.functional.map_list(
1069 return o.call_number() == -1 ? o.circ_lib() : obj.network.simple_request('FM_ACN_RETRIEVE',[o.call_number()]).owning_lib();
1072 copies.length == 1 ? [ 'UPDATE_COPY' ] : [ 'UPDATE_COPY', 'UPDATE_BATCH_COPY' ]
1074 ).length == 0 ? 1 : 0;
1076 obj.error.sdump('D_ERROR','batch permission check: ' + E);
1079 JSAN.use('cat.util'); cat.util.spawn_copy_editor(list,edit);
1085 dump('exiting circ.copy_status.js\n');