2 dump('entering cat.copy_buckets.js\n');
4 if (typeof cat == 'undefined') cat = {};
5 cat.copy_buckets = function (params) {
7 JSAN.use('util.error'); this.error = new util.error();
8 JSAN.use('util.network'); this.network = new util.network();
10 JSAN.use('OpenILS.data'); this.data = new OpenILS.data(); this.data.init({'via':'stash'});
13 cat.copy_buckets.prototype = {
14 'selection_list1' : [],
15 'selection_list2' : [],
16 'bucket_id_name_map' : {},
19 'render_pending_copies' : function() {
22 for (var i = 0; i < obj.copy_ids.length; i++) {
23 var item = obj.prep_item_for_list( obj.copy_ids[i] );
24 if (item) obj.list1.append( item );
28 'init' : function( params ) {
32 obj.copy_ids = params['copy_ids'] || [];
34 JSAN.use('circ.util');
35 var columns = circ.util.columns(
37 'barcode' : { 'hidden' : false },
38 'title' : { 'hidden' : false },
39 'location' : { 'hidden' : false },
40 'call_number' : { 'hidden' : false },
41 'status' : { 'hidden' : false },
42 'deleted' : { 'hidden' : false },
46 JSAN.use('util.list');
48 function retrieve_row(params) {
51 function handle_details(blob_req) {
53 var blob = blob_req.getResultObject();
54 if (typeof blob.ilsevent != 'undefined') throw(blob);
55 row.my.acp = blob.copy;
56 row.my.mvr = blob.mvr;
57 row.my.acn = blob.volume;
58 row.my.ahr = blob.hold;
59 row.my.circ = blob.circ;
60 params.treeitem_node.setAttribute('retrieve_id', js2JSON( [ blob.copy.id(), blob.copy.barcode(), row.my.bucket_item_id ] ));
61 if (typeof params.on_retrieve == 'function') { params.on_retrieve(row); }
64 obj.error.standard_unexpected_error_alert($('catStrings').getFormattedString('staff.cat.copy_buckets.retrieve_row.error', [row.my.acp_id]), E);
67 if (obj.copy_hash[ row.my.copy_id ]) {
68 handle_details( { 'getResultObject' : function() { var copy_obj = obj.copy_hash[ row.my.copy_id ]; delete obj.copy_hash[ row.my.copy_id ]; return copy_obj; } } );
70 obj.network.simple_request( 'FM_ACP_DETAILS', [ ses(), row.my.copy_id ], handle_details );
73 obj.error.sdump('D_ERROR','retrieve_row: ' + E );
78 obj.list1 = new util.list('pending_copies_list');
82 'retrieve_row' : retrieve_row,
83 'on_select' : function(ev) {
85 JSAN.use('util.functional');
86 var sel = obj.list1.retrieve_selection();
87 obj.selection_list1 = util.functional.map_list(
89 function(o) { return JSON2js(o.getAttribute('retrieve_id')); }
91 obj.error.sdump('D_TRACE','circ/copy_buckets: selection list 1 = ' + js2JSON(obj.selection_list1) );
92 if (obj.selection_list1.length == 0) {
93 obj.controller.view.copy_buckets_sel_add.disabled = true;
95 obj.controller.view.copy_buckets_sel_add.disabled = false;
105 obj.render_pending_copies();
107 obj.list2 = new util.list('copies_in_bucket_list');
111 'retrieve_row' : retrieve_row,
112 'on_select' : function(ev) {
114 JSAN.use('util.functional');
115 var sel = obj.list2.retrieve_selection();
116 obj.selection_list2 = util.functional.map_list(
118 function(o) { return JSON2js(o.getAttribute('retrieve_id')); }
120 obj.error.sdump('D_TRACE','circ/copy_buckets: selection list 2 = ' + js2JSON(obj.selection_list2) );
121 if (obj.selection_list2.length == 0) {
122 obj.controller.view.copy_buckets_delete_item.disabled = true;
123 obj.controller.view.copy_buckets_delete_item.setAttribute('disabled','true');
124 obj.controller.view.copy_buckets_export.disabled = true;
125 obj.controller.view.copy_buckets_export.setAttribute('disabled','true');
127 obj.controller.view.copy_buckets_delete_item.disabled = false;
128 obj.controller.view.copy_buckets_delete_item.setAttribute('disabled','false');
129 obj.controller.view.copy_buckets_export.disabled = false;
130 obj.controller.view.copy_buckets_export.setAttribute('disabled','false');
133 alert('FIXME: ' + E);
139 JSAN.use('util.controller'); obj.controller = new util.controller();
147 e.appendChild( obj.list1.render_list_actions() );
148 obj.list1.set_list_actions(
150 'on_complete' : function() { }
160 e.appendChild( obj.list2.render_list_actions() );
161 obj.list2.set_list_actions(
163 'on_complete' : function() { }
169 'copy_bucket_barcode_entry_textbox' : [
172 if (ev.keyCode && ev.keyCode == 13) {
177 'cmd_copy_bucket_submit_barcode' : [
183 'copy_buckets_menulist_placeholder' : [
187 JSAN.use('util.widgets'); JSAN.use('util.functional');
189 [$('catStrings').getString('staff.cat.copy_buckets.menulist.render.choose_bucket'),''],
190 [$('catStrings').getString('staff.cat.copy_buckets.menulist.render.retrieve_bucket'),-1]
192 util.functional.map_list(
193 obj.network.simple_request(
194 'BUCKET_RETRIEVE_VIA_USER',
195 [ ses(), obj.data.list.au[0].id() ]
198 obj.bucket_id_name_map[ o.id() ] = o.name();
199 return [ o.name(), o.id() ];
203 if (a[0] < b[0]) return -1;
204 if (a[0] > b[0]) return 1;
209 obj.error.sdump('D_TRACE','items = ' + js2JSON(items));
210 util.widgets.remove_children( e );
211 var ml = util.widgets.make_menulist(
215 ml.setAttribute('id','bucket_menulist');
216 ml.setAttribute('accesskey','');
218 function change_bucket(ev) {
219 var bucket_id = ev.target.value;
220 if (bucket_id < 0 ) {
221 bucket_id = window.prompt($('catStrings').getString('staff.cat.copy_buckets.menulist.change_bucket.prompt'));
222 ev.target.value = bucket_id;
223 ev.target.setAttribute('value',bucket_id);
225 if (!bucket_id) return;
226 var bucket = obj.network.simple_request(
228 [ ses(), 'copy', bucket_id ]
230 if (typeof bucket.ilsevent != 'undefined') {
231 if (bucket.ilsevent == 1506 /* CONTAINER_NOT_FOUND */) {
232 alert($('catStrings').getFormattedString('staff.cat.copy_buckets.menulist.change_bucket.undefined', [bucket_id]));
234 obj.error.standard_unexpected_error_alert($('catStrings').getString('staff.cat.copy_buckets.menulist.change_bucket.error'),bucket);
239 var x = document.getElementById('info_box');
240 x.setAttribute('hidden','false');
241 x = document.getElementById('bucket_number');
242 x.setAttribute('value',bucket.id());
243 x = document.getElementById('bucket_name');
244 x.setAttribute('value',bucket.name());
245 x = document.getElementById('bucket_owner');
246 var s = bucket.owner(); JSAN.use('patron.util');
247 if (s && typeof s != "object") s = patron.util.retrieve_fleshed_au_via_id(ses(),s);
248 x.setAttribute('value',s.card().barcode() + " @ " + obj.data.hash.aou[ s.home_ou() ].shortname());
253 var items = bucket.items() || [];
255 for (var i = 0; i < items.length; i++) {
256 var item = obj.prep_item_for_list(
257 items[i].target_copy(),
260 if (item) obj.list2.append( item );
264 ml.addEventListener( 'change_bucket', change_bucket , false);
265 ml.addEventListener( 'command', function() {
266 JSAN.use('util.widgets'); util.widgets.dispatch('change_bucket',ml);
268 obj.controller.view.bucket_menulist = ml;
269 JSAN.use('util.widgets'); util.widgets.dispatch('change_bucket',ml);
270 document.getElementById('refresh').addEventListener( 'command', function() {
271 JSAN.use('util.widgets'); util.widgets.dispatch('change_bucket',ml);
277 'copy_buckets_add' : [
281 var bucket_id = obj.controller.view.bucket_menulist.value;
282 if (!bucket_id) return;
283 for (var i = 0; i < obj.copy_ids.length; i++) {
284 var bucket_item = new ccbi();
285 bucket_item.isnew('1');
286 bucket_item.bucket(bucket_id);
287 bucket_item.target_copy( obj.copy_ids[i] );
289 var robj = obj.network.simple_request('BUCKET_ITEM_CREATE',
290 [ ses(), 'copy', bucket_item ]);
292 if (typeof robj == 'object') throw robj;
294 var item = obj.prep_item_for_list( obj.copy_ids[i], robj );
297 obj.list2.append( item );
299 obj.error.standard_unexpected_error_alert($('catStrings').getString('staff.cat.copy_buckets.copy_buckets_add.error'), E);
307 'copy_buckets_sel_add' : [
310 var bucket_id = obj.controller.view.bucket_menulist.value;
311 if (!bucket_id) return;
312 for (var i = 0; i < obj.selection_list1.length; i++) {
313 var acp_id = obj.selection_list1[i][0];
314 //var barcode = obj.selection_list1[i][1];
315 var bucket_item = new ccbi();
316 bucket_item.isnew('1');
317 bucket_item.bucket(bucket_id);
318 bucket_item.target_copy( acp_id );
320 var robj = obj.network.simple_request('BUCKET_ITEM_CREATE',
321 [ ses(), 'copy', bucket_item ]);
323 if (typeof robj == 'object') throw robj;
325 var item = obj.prep_item_for_list( acp_id, robj );
328 obj.list2.append( item );
330 obj.error.standard_unexpected_error_alert($('catStrings').getString('staff.cat.copy_buckets.copy_buckets_sel_add.error'), E);
336 'copy_buckets_export' : [
339 for (var i = 0; i < obj.selection_list2.length; i++) {
340 var acp_id = obj.selection_list2[i][0];
341 //var barcode = obj.selection_list1[i][1];
342 //var bucket_item_id = obj.selection_list1[i][2];
343 var item = obj.prep_item_for_list( acp_id );
345 obj.list1.append( item );
346 obj.copy_ids.push( acp_id );
352 'copy_buckets_delete_item' : [
355 for (var i = 0; i < obj.selection_list2.length; i++) {
357 //var acp_id = obj.selection_list2[i][0];
358 //var barcode = obj.selection_list2[i][1];
359 var bucket_item_id = obj.selection_list2[i][2];
360 var robj = obj.network.simple_request('BUCKET_ITEM_DELETE',
361 [ ses(), 'copy', bucket_item_id ]);
362 if (typeof robj == 'object') throw robj;
364 obj.error.standard_unexpected_error_alert($('catStrings').getString('staff.cat.copy_buckets.copy_buckets_delete_item.error'), E);
369 JSAN.use('util.widgets');
370 util.widgets.dispatch('change_bucket',obj.controller.view.bucket_menulist);
375 'copy_buckets_delete_bucket' : [
379 var bucket = obj.controller.view.bucket_menulist.value;
380 var name = obj.bucket_id_name_map[ bucket ];
381 var conf = window.confirm($('catStrings').getFormattedString('staff.cat.copy_buckets.copy_buckets_delete_bucket.confirm', [name]));
384 var robj = obj.network.simple_request('BUCKET_DELETE',[ses(),'copy',bucket]);
385 if (typeof robj == 'object') throw robj;
386 obj.controller.render('copy_buckets_menulist_placeholder');
388 obj.error.standard_unexpected_error_alert($('catStrings').getString('staff.cat.copy_buckets.copy_buckets_delete_bucket.error'),E);
392 'copy_buckets_new_bucket' : [
397 $('catStrings').getString('staff.cat.copy_buckets.copy_buckets_new_bucket.prompt'),
399 $('catStrings').getString('staff.cat.copy_buckets.copy_buckets_new_bucket.title')
403 var bucket = new ccb();
404 bucket.btype('staff_client');
405 bucket.owner( obj.data.list.au[0].id() );
408 var robj = obj.network.simple_request('BUCKET_CREATE',[ses(),'copy',bucket]);
410 if (typeof robj == 'object') {
411 if (robj.ilsevent == 1710 /* CONTAINER_EXISTS */) {
412 alert($('catStrings').getString('staff.cat.copy_buckets.copy_buckets_new_bucket.container_exists'));
418 obj.controller.render('copy_buckets_menulist_placeholder');
419 obj.controller.view.bucket_menulist.value = robj;
422 JSAN.use('util.widgets');
423 util.widgets.dispatch('change_bucket',obj.controller.view.bucket_menulist);
428 obj.error.standard_unexpected_error_alert($('catStrings').getString('staff.cat.copy_buckets.copy_buckets_new_bucket.error'),E);
432 'copy_buckets_batch_copy_edit' : [
437 obj.list2.select_all();
439 JSAN.use('util.widgets'); JSAN.use('util.functional');
441 var list = util.functional.map_list(
442 obj.list2.dump_retrieve_ids(),
444 return JSON2js(o)[0]; // acp_id
448 JSAN.use('cat.util'); cat.util.spawn_copy_editor( { 'copy_ids' : list, 'edit' : 1 } );
450 obj.render_pending_copies(); // FIXME -- need a generic refresh for lists
453 util.widgets.dispatch('change_bucket',obj.controller.view.bucket_menulist);
461 'copy_buckets_batch_copy_delete' : [
466 obj.list2.select_all();
468 JSAN.use('util.widgets'); JSAN.use('util.functional');
470 var list = util.functional.map_list(
471 obj.list2.dump_retrieve_ids(),
473 return JSON2js(o)[0]; // acp_id
477 var copies = util.functional.map_list(
480 return obj.network.simple_request('FM_ACP_RETRIEVE',[acp_id]);
484 for (var i = 0; i < copies.length; i++) {
485 copies[i].ischanged(1);
486 copies[i].isdeleted(1);
489 var robj = obj.network.simple_request(
490 'FM_ACP_FLESHED_BATCH_UPDATE',
491 [ ses(), copies, true],
494 'title' : document.getElementById('catStrings').getString('staff.cat.copy_buckets.batch.error'),
495 'overridable_events' : [
496 1208 /* TITLE_LAST_COPY */,
497 1227 /* COPY_DELETE_WARNING */
501 if (typeof robj.ilsevent != 'undefined') {
502 switch(Number(robj.ilsevent)) {
503 case 1208 /* TITLE_LAST_COPY */ :
504 case 1227 /* COPY_DELETE_WARNING */ :
505 case 5000 /* PERM_DENIED */ :
509 obj.error.standard_unexpected_error_alert($('catStrings').getString('staff.cat.copy_buckets.batch.error'), robj);
513 obj.render_pending_copies(); // FIXME -- need a generic refresh for lists
516 JSAN.use('util.widgets');
517 util.widgets.dispatch('change_bucket',obj.controller.view.bucket_menulist);
526 'cmd_request_items' : [
530 obj.list2.select_all();
532 var copy_ids = util.functional.map_list(
533 obj.list2.dump_retrieve_ids(),
535 return JSON2js(o)[0]; // acp_id
539 JSAN.use('cat.util');
540 cat.util.request_items(copy_ids);
543 obj.error.standard_unexpected_error_alert($('catStrings').getString('staff.cat.copy_buckets.copy_buckets_transfer_to_volume.error'), E);
548 'copy_buckets_transfer_to_volume' : [
552 obj.list2.select_all();
554 obj.data.stash_retrieve();
555 if (!obj.data.marked_volume) {
556 alert($('catStrings').getString('staff.cat.copy_buckets.copy_buckets_transfer_to_volume.no_volume'));
560 var copy_ids = util.functional.map_list(
561 obj.list2.dump_retrieve_ids(),
563 return JSON2js(o)[0]; // acp_id
567 var volume = obj.network.simple_request('FM_ACN_RETRIEVE.authoritative',[ obj.data.marked_volume ]);
569 var msg = $('catStrings').getFormattedString(
570 'staff.cat.copy_buckets.copy_buckets_transfer_to_volume.confirm',
572 obj.controller.view.bucket_menulist.getAttribute('label'),
574 obj.data.hash.aou[ volume.owning_lib() ].shortname()
578 JSAN.use('cat.util'); cat.util.transfer_copies( {
579 'copy_ids' : copy_ids,
581 'docid' : volume.record(),
582 'volume_label' : volume.label(),
583 'owning_lib' : volume.owning_lib(),
586 obj.render_pending_copies(); // FIXME -- need a generic refresh for lists
589 JSAN.use('util.widgets');
590 util.widgets.dispatch('change_bucket',obj.controller.view.bucket_menulist);
595 obj.error.standard_unexpected_error_alert($('catStrings').getString('staff.cat.copy_buckets.copy_buckets_transfer_to_volume.error'), E);
601 function() { alert($('commonStrings').getString('common.unimplemented')); }
603 'cmd_copy_buckets_print' : [
606 JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
607 obj.list2.on_all_fleshed = function() {
609 dump( js2JSON( obj.list2.dump_with_keys() ) + '\n' );
610 data.stash_retrieve();
611 var lib = data.hash.aou[ data.list.au[0].ws_ou() ];
615 'staff' : data.list.au[0],
616 'header' : data.print_list_templates.item_status.header,
617 'line_item' : data.print_list_templates.item_status.line_item,
618 'footer' : data.print_list_templates.item_status.footer,
619 'type' : data.print_list_templates.item_status.type,
620 'list' : obj.list2.dump_with_keys(),
621 'context' : data.print_list_templates.item_status.context,
623 JSAN.use('util.print'); var print = new util.print();
624 print.tree_list( p );
625 setTimeout(function(){obj.list2.on_all_fleshed = null;},0);
630 obj.list2.full_retrieve();
633 'cmd_copy_buckets_export' : [
636 obj.list2.dump_csv_to_clipboard();
639 'cmd_copy_buckets_reprint' : [
644 'cmd_export_to_copy_status' : [
648 obj.list2.on_all_fleshed =
651 obj.list2.select_all();
652 JSAN.use('util.functional');
653 var barcodes = util.functional.map_list(
654 obj.list2.dump_retrieve_ids(),
655 function(o) { return JSON2js(o)[1]; }
657 var url = urls.XUL_COPY_STATUS;
658 xulG.new_tab( url, {}, { 'barcodes' : barcodes });
659 setTimeout(function(){obj.list2.on_all_fleshed = null;},0);
661 obj.error.standard_unexpected_error_alert('export to copy status',E);
664 obj.list2.full_retrieve();
666 obj.error.standard_unexpected_error_alert($('catStrings').getString('staff.cat.copy_buckets.cmd_export_to_copy_status.error'), E);
673 this.controller.render();
675 if (typeof xulG == 'undefined') {
676 obj.controller.view.cmd_export_to_copy_status.disabled = true;
677 obj.controller.view.cmd_export_to_copy_status.setAttribute('disabled',true);
682 'prep_item_for_list' : function(acp_id,bucket_item_id) {
686 'retrieve_id' : js2JSON( [ acp_id, null, bucket_item_id ] ),
691 'bucket_item_id' : bucket_item_id
697 obj.error.standard_unexpected_error_alert($('catStrings').getString('staff.cat.copy_buckets.prep_item_for_list.error'), E);
703 'scan_barcode' : function() {
706 var barcode = obj.controller.view.copy_bucket_barcode_entry_textbox.value;
707 var barcode_object = xulG.get_barcode(window, 'asset', barcode);
708 // user_false means the user said "None of the above", so abort without further prompts/actions
709 if(barcode_object == "user_false") return;
710 if(barcode_object && barcode_object.barcode) {
711 barcode = barcode_object.barcode;
714 var copy_obj = obj.network.simple_request('FM_ACP_DETAILS_VIA_BARCODE',[ses(),barcode]);
715 if (copy_obj == null) {
716 throw(document.getElementById('circStrings').getString('staff.circ.copy_status.status.null_result'));
717 } else if (copy_obj.ilsevent) {
718 switch(Number(copy_obj.ilsevent)) {
720 obj.error.standard_network_error_alert();
721 obj.controller.view.copy_bucket_barcode_entry_textbox.select();
722 obj.controller.view.copy_bucket_barcode_entry_textbox.focus();
725 case 1502 /* ASSET_COPY_NOT_FOUND */ :
727 document.getElementById('circStrings').getFormattedString('staff.circ.copy_status.status.copy_not_found', [barcode]),
728 document.getElementById('circStrings').getString('staff.circ.copy_status.status.not_cataloged'),
729 document.getElementById('circStrings').getString('staff.circ.copy_status.ok'),
732 document.getElementById('circStrings').getString('staff.circ.confirm.msg')
734 obj.controller.view.copy_bucket_barcode_entry_textbox.select();
735 obj.controller.view.copy_bucket_barcode_entry_textbox.focus();
743 var item = obj.prep_item_for_list( copy_obj.copy.id() );
745 obj.copy_ids.push( copy_obj.copy.id() );
746 obj.copy_hash[ copy_obj.copy.id() ] = copy_obj;
747 obj.list1.append( item );
749 obj.controller.view.copy_bucket_barcode_entry_textbox.value = '';
750 obj.controller.view.copy_bucket_barcode_entry_textbox.focus();
752 obj.controller.view.copy_bucket_barcode_entry_textbox.select();
753 obj.controller.view.copy_bucket_barcode_entry_textbox.focus();
759 dump('exiting cat.copy_buckets.js\n');