1 dump('entering manage_items.js\n');
3 function $(id) { return document.getElementById(id); }
5 if (typeof serial == 'undefined') serial = {};
6 serial.manage_items = function (params) {
8 JSAN.use('util.error'); this.error = new util.error();
9 JSAN.use('util.network'); this.network = new util.network();
10 JSAN.use('OpenILS.data'); this.data = new OpenILS.data(); this.data.init({'via':'stash'});
12 this.current_sunit_id = -1; //default to **AUTO**
13 this.mode = 'receive';
17 serial.manage_items.prototype = {
19 'list_sitem_map' : {},
24 'retrieve_ssubs_and_sdists' : function () {
28 obj.lib = $('serial_item_lib_menu').value;
29 var sdist_retrieve_params = {"+ssub":{"record_entry" : obj.docid}};
30 if (obj.mode == 'receive') {
31 sdist_retrieve_params["+ssub"].owning_lib = obj.lib;
33 sdist_retrieve_params.holding_lib = obj.lib;
35 var robj = obj.network.request(
37 'open-ils.pcrud.id_list.sdist',
38 [ ses(), sdist_retrieve_params, {"join":"ssub"} ]
41 if (typeof robj.ilsevent != 'undefined') throw(robj);
42 obj.sdist_ids = robj.length ? robj : [robj];
43 // now get actual sdist and ssub objects
44 robj = obj.network.simple_request(
45 'FM_SDIST_FLESHED_BATCH_RETRIEVE.authoritative',
49 if (typeof robj.ilsevent != 'undefined') throw(robj);
50 robj = robj.length ? robj : [robj];
51 for (var i = 0; i < robj.length; i++) {
52 obj.sdist_map[robj[i].id()] = robj[i];
55 robj = obj.network.request(
57 'open-ils.pcrud.id_list.ssub',
58 [ ses(), {"+sdist" : {"id" : obj.sdist_ids}}, {"join":"sdist"} ]
60 var ssub_ids = robj.length ? robj : [robj];
61 robj = obj.network.simple_request(
62 'FM_SSUB_FLESHED_BATCH_RETRIEVE.authoritative',
66 if (typeof robj.ilsevent != 'undefined') throw(robj);
67 robj = robj.length ? robj : [robj];
68 for (var i = 0; i < robj.length; i++) {
69 obj.ssub_map[robj[i].id()] = robj[i];
77 obj.error.standard_unexpected_error_alert('retrieve_ssubs_and_sdists failed!',E);
81 'build_menus' : function () {
84 // draw library drop-down
85 obj.org_ids = obj.network.simple_request('FM_SSUB_AOU_IDS_RETRIEVE_VIA_RECORD_ID.authoritative',[ obj.docid ]);
86 if (typeof obj.org_ids.ilsevent != 'undefined') throw(obj.org_ids);
87 JSAN.use('util.functional');
88 obj.org_ids = util.functional.map_list( obj.org_ids, function (o) { return Number(o); });
90 var org = obj.data.hash.aou[ obj.data.list.au[0].ws_ou() ];
92 JSAN.use('util.file'); JSAN.use('util.widgets');
94 var file; var list_data; var ml;
96 file = new util.file('offline_ou_list');
97 if (file._file.exists()) {
98 list_data = file.get_object(); file.close();
99 for (var i = 0; i < list_data[0].length; i++) { // make sure all entries are enabled
100 list_data[0][i][2] = false;
102 ml = util.widgets.make_menulist( list_data[0], list_data[1] );
103 ml.setAttribute('id','serial_item_lib_menu'); document.getElementById('serial_item_lib_menu_box').appendChild(ml);
104 //TODO: class this menu properly
105 for (var i = 0; i < obj.org_ids.length; i++) {
106 ml.getElementsByAttribute('value',obj.org_ids[i])[0].setAttribute('class','has_distributions');
108 /*TODO: add/enable this legend?
109 ml.firstChild.addEventListener(
112 document.getElementById('legend').setAttribute('hidden','false');
116 ml.firstChild.addEventListener(
119 document.getElementById('legend').setAttribute('hidden','true');
126 //if (document.getElementById('serial_item_refresh_button')) document.getElementById('serial_item_refresh_button').focus();
128 // get latest sdist id list based on library drowdown
129 obj.retrieve_ssubs_and_sdists();
130 obj.refresh_list('main');
131 obj.refresh_list('workarea');
137 throw(document.getElementById('catStrings').getString('staff.cat.copy_browser.missing_library') + '\n');
139 file = new util.file('serial_items_prefs.'+obj.data.server_unadorned);
140 util.widgets.load_attributes(file);
141 ml.value = ml.getAttribute('value');
144 ml.setAttribute('value',ml.value);
147 // deal with mode radio selectedIndex, as load_attributes is setting a "read-only" value
148 if ($('mode_receive').getAttribute('selected')) {
149 $('serial_manage_items_mode').selectedIndex = 0;
150 } else if ($('mode_advanced_receive').getAttribute('selected')) {
151 $('serial_manage_items_mode').selectedIndex = 1;
153 $('serial_manage_items_mode').selectedIndex = 2;
156 // setup recent sunits list
157 var recent_sunits_file = new util.file('serial_items_recent_sunits_'+obj.docid+'.'+obj.data.server_unadorned);
158 util.widgets.load_attributes(recent_sunits_file);
159 var recent_sunits_popup = $('serial_items_recent_sunits');
160 obj.sunit_entries = JSON2js(recent_sunits_popup.getAttribute('sunit_json'));
161 for (i = 0; i < obj.sunit_entries.length; i++) {
162 var sunit_info = obj.sunit_entries[i];
163 var new_menu_item = recent_sunits_popup.appendItem(sunit_info.label);
164 new_menu_item.setAttribute('id', 'serial_items_recent_sunits_entry_'+sunit_info.id);
165 new_menu_item.setAttribute('sunit_id', sunit_info.id);
166 new_menu_item.setAttribute('command', 'cmd_set_sunit');
170 'init' : function( params ) {
173 obj.docid = params['docid'];
176 obj.set_sunit($('serial_items_current_sunit').getAttribute('sunit_id'), $('serial_items_current_sunit').getAttribute('sunit_label'), $('serial_items_current_sunit').getAttribute('sdist_id'), $('serial_items_current_sunit').getAttribute('sstr_id'));
177 //obj.retrieve_ssubs_and_sdists();
180 var mode_radio_group = $('serial_manage_items_mode');
181 obj.set_mode(mode_radio_group.selectedItem.id.substr(5));
182 mode_radio_group.addEventListener(
186 var mode = ev.target.id.substr(5); //strip out 'mode_'
188 obj.refresh_list('main');
189 obj.refresh_list('workarea');
193 $('serial_manage_items_show_all').addEventListener(
198 obj.refresh_list('main');
199 obj.refresh_list('workarea');
204 obj.set_alert_notes_button();
206 JSAN.use('util.controller'); obj.controller = new util.controller();
210 'save_columns' : [ [ 'command' ], function() { obj.lists.main.save_columns(); } ],
211 'cmd_broken' : [ ['command'], function() { alert('Not Yet Implemented'); } ],
212 'sel_clip' : [ ['command'], function() { obj.lists.main.clipboard(); } ],
217 var new_item = new sitem();
218 new_item.issuance(new siss());
219 new_item.stream(1); //FIXME: hard-coded stream
220 new_item.issuance().subscription(1); //FIXME: hard-coded subscription
222 new_item.issuance().isnew(1);
223 spawn_sitem_editor( {'sitems' : [new_item], 'do_edit' : 1 } );
225 obj.refresh_list('main');
228 obj.error.standard_unexpected_error_alert(document.getElementById('catStrings').getString('staff.cat.copy_browser.edit_items.error'),E);
236 if (!obj.retrieve_ids || obj.retrieve_ids.length == 0) return;
238 JSAN.use('util.functional');
239 var list = util.functional.map_list(
246 spawn_sitem_editor( { 'sitem_ids' : list, 'do_edit' : 1 } );
248 obj.refresh_rows(list);
251 obj.error.standard_unexpected_error_alert(document.getElementById('catStrings').getString('staff.cat.copy_browser.edit_items.error'),E);
255 'cmd_reset_items' : [
259 if (!obj.retrieve_ids || obj.retrieve_ids.length == 0) return;
261 JSAN.use('util.functional');
262 var list = util.functional.map_list(
269 var robj = obj.network.request(
271 'open-ils.serial.reset_items',
274 if (typeof robj.ilsevent != 'undefined') throw(robj);
276 alert('Successfully reset '+robj.num_items+' item(s)');
278 obj.refresh_list('main');
279 obj.refresh_list('workarea');
281 obj.error.standard_unexpected_error_alert('staff.serial.manage_items.reset_items.error',E);
285 'cmd_claim_items' : [
287 function () { obj.set_items_special_status('Claimed','staff.serial.manage_items.set_claimed_success') }
289 'cmd_set_items_not_published' : [
291 function () { obj.set_items_special_status('Not Published','staff.serial.manage_items.set_not_published_success') }
293 'cmd_set_items_not_held' : [
295 function () { obj.set_items_special_status('Not Held','staff.serial.manage_items.set_not_held_success') }
297 'cmd_delete_items' : [
301 JSAN.use('util.functional');
302 var list = util.functional.map_list(
305 return obj.list_sitem_map[o.sitem_id];
309 if (list.length != 1) {
310 delete_msg = document.getElementById('catStrings').getFormattedString('staff.cat.copy_browser.delete_items.confirm.plural', [list.length]);
312 delete_msg = document.getElementById('catStrings').getString('staff.cat.copy_browser.delete_items.confirm');
314 var r = obj.error.yns_alert(
316 document.getElementById('catStrings').getString('staff.cat.copy_browser.delete_items.title'),
317 document.getElementById('catStrings').getString('staff.cat.copy_browser.delete_items.delete'),
318 document.getElementById('catStrings').getString('staff.cat.copy_browser.delete_items.cancel'),
320 document.getElementById('commonStrings').getString('common.confirm')
324 for (var i = 0; i < list.length; i++) {
325 list[i].isdeleted('1');
327 var robj = obj.network.request(
329 'open-ils.serial.item.fleshed.batch.update',
333 'title' : document.getElementById('catStrings').getString('staff.cat.copy_browser.delete_items.override'),
334 'overridable_events' : [ // FIXME: replace or delete these events
335 1208 /* TITLE_LAST_COPY */,
336 1227 /* COPY_DELETE_WARNING */,
340 if (robj == null) throw(robj);
341 if (typeof robj.ilsevent != 'undefined') {
342 if ( (robj.ilsevent != 0) && (robj.ilsevent != 1227 /* COPY_DELETE_WARNING */) && (robj.ilsevent != 1208 /* TITLE_LAST_COPY */) ) throw(robj);
344 obj.refresh_list(obj.selected_list);
349 obj.error.standard_unexpected_error_alert('staff.serial.manage_items.delete_items.error',E);
358 var target = evt.explicitOriginalTarget;
359 obj.process_unit_selection(target);
361 obj.error.standard_unexpected_error_alert('cmd_set_sunit failed!',E);
365 'cmd_set_other_sunit' : [
368 obj.set_other_sunit();
369 if (obj.mode == 'bind') {
370 obj.refresh_list('main');
371 obj.refresh_list('workarea');
375 'cmd_predict_items' : [
378 alert('Subscription selection needed here'); //FIXME: make this prompt, or discard this feature
381 'cmd_read_alerts' : [
385 obj.view_alert_notes();
387 obj.error.standard_unexpected_error_alert('cmd_read_alerts failed!',E);
391 'cmd_receive_items' : [
395 JSAN.use('util.functional');
396 var donor_unit_ids = {};
397 var list = util.functional.map_list(
400 var item = obj.list_sitem_map[o.sitem_id];
402 donor_unit_ids[item.unit().id()] = 1;
404 item.unit(obj.current_sunit_id);
410 if (mode == 'advanced_receive') mode = 'receive';
412 var method; var success_label;
413 if (mode == 'receive') {
414 method = 'open-ils.serial.receive_items';
415 success_label = 'received';
416 } else { // bind mode
417 method = 'open-ils.serial.bind_items';
418 success_label = 'bound';
421 // deal with barcodes and call numbers for *NEW* units
423 var call_numbers = {};
424 var call_numbers_by_siss_and_sdist = {};
426 if (obj.current_sunit_id < 0) { // **AUTO** or **NEW** units
427 var new_unit_barcode = '';
428 var new_unit_call_number = '';
429 for (var i = 0; i < list.length; i++) {
431 if (new_unit_barcode) {
432 barcodes[item.id()] = new_unit_barcode;
433 call_numbers[item.id()] = new_unit_call_number;
437 if (obj.current_sunit_id == -1) {
438 prompt_text = 'for '+item.issuance().label()+ ' from Distribution: '+obj.sdist_map[item.stream().distribution()].label()+'/'+item.stream().id()+':';
439 } else { // must be -2
440 prompt_text = 'for the new unit:';
444 var barcode = window.prompt('Please enter a barcode ' + prompt_text,
446 'Unit Barcode Prompt');
447 barcode = String( barcode ).replace(/\s/g,'');
448 /* Casting a possibly null input value to a String turns it into "null" */
449 if (!barcode || barcode == 'null') {
450 alert('Invalid barcode entered, defaulting to system-generated.');
453 // disable alarm sound temporarily
454 var sound_setting = obj.data.no_sound;
455 if (!sound_setting) { // undefined or false
456 obj.data.no_sound = true; obj.data.stash('no_sound');
458 var test = obj.network.simple_request('FM_ACP_RETRIEVE_VIA_BARCODE',[ barcode ]);
459 if (typeof test.ilsevent == 'undefined') {
460 alert('Another copy has barcode "' + barcode + '", defaulting to system-generated.');
463 if (!sound_setting) {
464 obj.data.no_sound = sound_setting; obj.data.stash('no_sound');
467 barcodes[item.id()] = barcode;
470 if (typeof call_numbers_by_siss_and_sdist[item.issuance().id() + '@' + item.stream().distribution()] == 'undefined') {
471 var default_cn = 'DEFAULT';
472 // if they defined a *_call_number, honor it as the default
473 var preset_cn = obj.sdist_map[item.stream().distribution()][mode + '_call_number']();
475 default_cn = preset_cn.label();
477 // for now, let's default to the last created call number if there is one
478 var acn_list = obj.network.request(
480 'open-ils.pcrud.search.acn',
481 [ ses(), {"record" : obj.docid, "owning_lib" : obj.sdist_map[item.stream().distribution()].holding_lib().id(), "deleted" : 'f' }, {"order_by" : {"acn" : "create_date DESC"}, "limit" : "1" } ]
485 default_cn = acn_list.label();
488 var call_number = window.prompt('Please enter/adjust a call number ' + prompt_text,
489 default_cn, //TODO: real default by setting
490 'Unit Call Number Prompt');
491 call_number = String( call_number ).replace(/^\s+/,'').replace(/\s$/,'');
492 /* Casting a possibly null input value to a String turns it into "null" */
493 if (!call_number || call_number == 'null') {
494 alert('Invalid call number entered, setting to "DEFAULT".');
495 call_number = 'DEFAULT'; //TODO: real default by setting
497 call_numbers[item.id()] = call_number;
498 call_numbers_by_siss_and_sdist[item.issuance().id() + '@' + item.stream().distribution()] = call_number;
500 // we have already seen this same issuance and distribution combo, so use the same call number
501 call_numbers[item.id()] = call_numbers_by_siss_and_sdist[item.issuance().id() + '@' + item.stream().distribution()];
504 if (obj.current_sunit_id == -2) {
505 new_unit_barcode = barcode;
506 new_unit_call_number = call_number;
511 var robj = obj.network.request(
514 [ ses(), list, barcodes, call_numbers, donor_unit_ids ]
516 if (typeof robj.ilsevent != 'undefined') throw(robj); //TODO: catch for override
518 alert('Successfully '+success_label+' '+robj.num_items+' item(s)');
520 if (obj.current_sunit_id == -2) {
521 obj.current_sunit_id = robj.new_unit_id;
524 obj.rebuild_current_sunit(obj.sdist_map[list[0].stream().distribution()].label(), list[0].stream().distribution(), list[0].stream().id());
525 obj.refresh_list('main');
526 obj.refresh_list('workarea');
529 obj.error.standard_unexpected_error_alert('cmd_receive_items failed!',E);
537 /*if (!obj.retrieve_ids || obj.retrieve_ids.length == 0) return;
539 JSAN.use('util.functional');
540 var list = util.functional.map_list(
547 spawn_sunit_editor( { 'sunit_ids' : [1], 'edit' : 1 } ); //FIXME: hard-coded sunit
550 obj.error.standard_unexpected_error_alert('cmd_edit_sunit failed!',E);
554 'cmd_view_sitem_notes' : [
558 obj.view_notes('sitem');
560 obj.error.standard_unexpected_error_alert('cmd_view_sitem_notes failed!',E);
564 'cmd_view_sdist_notes' : [
568 obj.view_notes('sdist');
570 obj.error.standard_unexpected_error_alert('cmd_view_sdist_notes failed!',E);
574 'cmd_view_ssub_notes' : [
578 obj.view_notes('ssub');
580 obj.error.standard_unexpected_error_alert('cmd_view_ssub_notes failed!',E);
584 'cmd_items_print' : [ ['command'], function() { obj.items_print(obj.selected_list); } ],
585 'cmd_items_export' : [ ['command'], function() { obj.items_export(obj.selected_list); } ],
586 'cmd_refresh_list' : [ ['command'], function() { obj.refresh_all(); } ]
591 obj.retrieve('main'); // retrieve main list
592 obj.retrieve('workarea'); // retrieve shelving unit list
594 obj.controller.view.sel_clip.setAttribute('disabled','true');
598 'items_print' : function(which) {
601 var list = obj.lists[which];
602 /* FIXME: serial items print template? JSAN.use('patron.util');
604 'patron' : patron.util.retrieve_fleshed_au_via_id(ses(),obj.patron_id),
605 'template' : 'items_out'
607 list.print( params );
609 obj.error.standard_unexpected_error_alert('manage_items printing',E);
613 'items_export' : function(which) {
616 var list = obj.lists[which];
617 list.dump_csv_to_clipboard();
619 obj.error.standard_unexpected_error_alert('manage_items export',E);
623 'rebuild_current_sunit' : function(sdist_label, sdist_id, sstr_id) {
625 if (!obj.current_sunit_id) return; // current sunit is NONE
627 var robj = obj.network.request(
629 'open-ils.pcrud.retrieve.sunit',
630 [ ses(), obj.current_sunit_id]
632 if (!robj) return; // current sunit is NEW or AUTO
634 var label = '[' + sdist_label + '/' + sstr_id + ' #' + obj.current_sunit_id + '] ' + robj.summary_contents();
635 obj.set_sunit(obj.current_sunit_id, label, sdist_id, sstr_id);
636 obj.save_sunit(obj.current_sunit_id, label, sdist_id, sstr_id);
638 obj.error.standard_unexpected_error_alert('serial items set_sunit',E);
642 'set_sunit' : function(sunit_id, label, sdist_id, sstr_id) {
645 obj.current_sunit_id = sunit_id;
646 obj.current_sunit_sdist_id = sdist_id;
647 obj.current_sunit_sstr_id = sstr_id;
648 if (sunit_id < 0 || sunit_id === '') {
649 $('serial_workarea_sunit_desc').firstChild.nodeValue = '**' + label + '**';
651 $('serial_workarea_sunit_desc').firstChild.nodeValue = label;
652 obj.add_sunit_to_menu(sunit_id, label, sdist_id, sstr_id);
655 obj.error.standard_unexpected_error_alert('serial items set_sunit',E);
659 'save_sunit' : function(sunit_id, label, sdist_id, sstr_id) {
662 $('serial_items_current_sunit').setAttribute('sunit_id', sunit_id);
663 $('serial_items_current_sunit').setAttribute('sunit_label', label);
665 $('serial_items_current_sunit').setAttribute('sdist_id', sdist_id);
666 $('serial_items_current_sunit').setAttribute('sstr_id', sstr_id);
668 var recent_sunits_file = new util.file('serial_items_recent_sunits_'+obj.docid+'.'+obj.data.server_unadorned);
669 util.widgets.save_attributes(recent_sunits_file, { 'serial_items_recent_sunits' : [ 'sunit_json' ], 'serial_items_current_sunit' : [ 'sunit_id', 'sunit_label', 'sdist_id', 'sstr_id' ] });
671 obj.error.standard_unexpected_error_alert('serial items save_sunit',E);
675 'set_other_sunit' : function() {
678 JSAN.use('util.window'); var win = new util.window();
679 var select_unit_window = win.open(
680 xulG.url_prefix('XUL_SERIAL_SELECT_UNIT'),
682 'chrome,resizable,modal,centerscreen',
683 {'sdist_ids' : obj.sdist_ids}
685 if (!select_unit_window.sunit_selection) {
689 var selection = select_unit_window.sunit_selection;
690 var sunit_id = selection.sunit;
691 var sdist_id = selection.sdist;
692 var sstr_id = selection.sstr;
693 var label = selection.label;
695 obj.set_sunit(sunit_id, label, sdist_id, sstr_id);
696 obj.save_sunit(sunit_id, label, sdist_id, sstr_id);
698 obj.error.standard_unexpected_error_alert('serial items set_other_sunit',E);
702 'add_sunit_to_menu' : function(sunit_id, label, sdist_id, sstr_id) {
706 // check if it is already in sunit_entries, remove it
707 for (i = 0; i < obj.sunit_entries.length; i++) {
708 if (obj.sunit_entries[i].id == sunit_id) {
709 obj.sunit_entries.splice(i,1);
710 var menu_item = $('serial_items_recent_sunits_entry_'+sunit_id);
711 menu_item.parentNode.removeChild(menu_item);
715 // add to front of array
716 obj.sunit_entries.unshift({"id" : sunit_id, "label" : label, "sdist_id" : sdist_id, "sstr_id" : sstr_id});
717 var recent_sunits_popup = $('serial_items_recent_sunits');
718 var new_menu_item = recent_sunits_popup.insertItemAt(0,label);
719 new_menu_item.setAttribute('id', 'serial_items_recent_sunits_entry_'+sunit_id);
720 new_menu_item.setAttribute('sunit_id', sunit_id);
721 new_menu_item.setAttribute('sdist_id', sdist_id);
722 new_menu_item.setAttribute('sstr_id', sstr_id);
723 new_menu_item.setAttribute('command', 'cmd_set_sunit');
725 // pop off from sunit_entries if it already has 10 sunits
726 if (obj.sunit_entries.length > 10) {
727 var sunit_info = obj.sunit_entries.pop();
728 var menu_item = $('serial_items_recent_sunits_entry_'+sunit_info.id);
729 menu_item.parentNode.removeChild(menu_item);
732 recent_sunits_popup.setAttribute('sunit_json', js2JSON(obj.sunit_entries));
735 obj.error.standard_unexpected_error_alert('serial items add_sunit_to_menu',E);
739 'set_mode' : function(mode) {
748 obj.retrieve_ssubs_and_sdists();
750 if (mode == 'receive' || mode == 'advanced_receive') {
751 $('serial_workarea_mode_label').value = 'Recently Received';
752 if ($('serial_manage_items_show_all').checked) {
753 obj.lists.main.sitem_retrieve_params = {};
755 obj.lists.main.sitem_retrieve_params = { 'date_received' : null, 'status' : {'not in' : ['Not Held', 'Not Published']} };
757 obj.lists.main.sitem_extra_params ={'order_by' : {'sitem' : 'date_expected ASC, stream ASC'}};
759 obj.lists.workarea.sitem_retrieve_params = {'date_received' : {"!=" : null}};
760 obj.lists.workarea.sitem_extra_params ={'order_by' : {'sitem' : 'date_received DESC'}, 'limit' : 30};
761 if (mode == 'receive') {
762 $('serial_manage_items_context').value = $('serialStrings').getString('staff.serial.manage_items.subscriber.label') + ':';
763 $('cmd_set_other_sunit').setAttribute('disabled','true');
764 $('serial_items_recent_sunits').disabled = true;
765 obj.process_unit_selection($('serial_items_auto_per_item_menuitem'));
766 //obj.set_sunit(obj.current_sunit_id, label, sdist_id, sstr_id);
768 $('serial_manage_items_context').value = $('serialStrings').getString('staff.serial.manage_items.holder.label') + ':';
769 $('cmd_set_other_sunit').setAttribute('disabled','false');
770 $('serial_items_recent_sunits').disabled = false;
772 } else { // bind mode
773 $('serial_workarea_mode_label').value = 'Bound Items in Current Working Unit';
774 $('serial_manage_items_context').value = $('serialStrings').getString('staff.serial.manage_items.holder.label') + ':';
775 if ($('serial_manage_items_show_all').checked) {
776 obj.lists.main.sitem_retrieve_params = {};
778 obj.lists.main.sitem_retrieve_params = {'date_received' : {'!=' : null}}; // unit set dynamically in 'retrieve'
780 obj.lists.main.sitem_extra_params ={'order_by' : {'sitem' : 'date_expected ASC, stream ASC'}};
782 obj.lists.workarea.sitem_retrieve_params = {}; // unit set dynamically in 'retrieve'
783 obj.lists.workarea.sitem_extra_params ={'order_by' : {'sitem' : 'date_received DESC'}};
785 $('cmd_set_other_sunit').setAttribute('disabled','false');
786 $('serial_items_recent_sunits').disabled = false;
787 // default to **NEW UNIT**
788 // For now, keep the unit static. TODO: Eventually, keep track of and store the last used unit value for both receive and bind separately
789 // obj.set_sunit(-2, 'New Unit', '', '');
793 'save_settings' : function() {
796 JSAN.use('util.file'); var file = new util.file('serial_items_prefs.'+obj.data.server_unadorned);
797 util.widgets.save_attributes(file, { 'serial_item_lib_menu' : [ 'value' ], 'mode_receive' : [ 'selected' ], 'mode_advanced_receive' : [ 'selected' ], 'mode_bind' : [ 'selected' ], 'serial_manage_items_show_all' : [ 'checked' ] });
800 'init_lists' : function() {
803 JSAN.use('circ.util');
804 var columns = item_columns({});
806 function retrieve_row(params) {
808 var row = params.row;
809 obj.network.simple_request(
810 'FM_SITEM_FLESHED_BATCH_RETRIEVE.authoritative',
812 //[ ses(), row.my.sitem_id, {"flesh":2,"flesh_fields":{"sitem":["creator","editor","issuance","stream","unit","notes"], "sunit":["call_number"], "sstr":["distribution"]}}],
815 var robj = req.getResultObject();
816 if (typeof robj.ilsevent != 'undefined') throw(robj);
817 if (typeof robj.ilsevent == 'null') throw('null result');
819 obj.list_sitem_map[sitem.id()] = sitem;
820 row.my.sitem = sitem;
821 row.my.parent_obj = obj;
822 //params.treeitem_node.setAttribute( 'retrieve_id', js2JSON({'copy_id':copy_id,'circ_id':row.my.circ.id(),'barcode':row.my.acp.barcode(),'doc_id': ( row.my.record ? row.my.record.id() : null ) }) );
823 params.treeitem_node.setAttribute( 'retrieve_id', js2JSON({'sitem_id':sitem.id()}) );
824 if (sitem.status() == 'Claimed') {
825 params.treeitem_node.firstChild.setAttribute( 'properties', 'makeItGray' );
826 } else if (sitem.status() == 'Not Held' || sitem.status() == 'Not Published') {
827 var treecells = params.treeitem_node.firstChild.childNodes;
828 for (i = 0; i < treecells.length; i++) {
829 treecells[i].setAttribute( 'properties', 'crossItOut' );
832 dump('dumping... ' + js2JSON(obj.list_sitem_map[sitem.id()]));
833 if (typeof params.on_retrieve == 'function') {
834 params.on_retrieve(row);
838 obj.error.standard_unexpected_error_alert('staff.serial.manage_items.retrieve_row.callback_error', E);
844 obj.error.standard_unexpected_error_alert('staff.serial.manage_items.retrieve_row.error_in_retrieve_row',E);
849 JSAN.use('util.list');
852 obj.lists.main = new util.list('item_tree');
856 'retrieve_row' : retrieve_row,
857 'on_select' : function(ev) {
858 obj.selected_list = 'main';
859 JSAN.use('util.functional');
860 var sel = obj.lists.main.retrieve_selection();
861 obj.controller.view.sel_clip.setAttribute('disabled',sel.length < 1);
862 var list = util.functional.map_list(
864 function(o) { return JSON2js( o.getAttribute('retrieve_id') ); }
866 if (typeof obj.on_select == 'function') {
869 if (typeof window.xulG == 'object' && typeof window.xulG.on_select == 'function') {
870 obj.error.sdump('D_CAT','manage_items: Calling external .on_select()\n');
871 window.xulG.on_select(list);
877 obj.lists.workarea = new util.list('workarea_tree');
878 obj.lists.workarea.init(
881 'retrieve_row' : retrieve_row,
882 'on_select' : function(ev) {
883 obj.selected_list = 'workarea';
884 JSAN.use('util.functional');
885 var sel = obj.lists.workarea.retrieve_selection();
886 obj.controller.view.sel_clip.setAttribute('disabled',sel.length < 1);
887 var list = util.functional.map_list(
889 function(o) { return JSON2js( o.getAttribute('retrieve_id') ); }
891 if (typeof obj.on_select == 'function') {
894 if (typeof window.xulG == 'object' && typeof window.xulG.on_select == 'function') {
895 obj.error.sdump('D_CAT','serctrl: Calling external .on_select()\n');
896 window.xulG.on_select(list);
898 obj.error.sdump('D_CAT','serctrl: No external .on_select()\n');
905 'refresh_all' : function() {
908 obj.retrieve_ssubs_and_sdists();
909 obj.refresh_list('main');
910 obj.refresh_list('workarea');
913 'refresh_list' : function(list_name) {
916 //TODO Optimize this?
917 obj.retrieve(list_name);
920 // accepts a list of ids or a list of objects
921 'refresh_rows' : function(list) {
926 if (typeof list[0] == 'object') {
927 id_list = util.functional.map_list(
937 for (var i = 0; i < id_list.length; i++) {
938 obj.lists[obj.selected_list].refresh_row(obj.row_map[id_list[i]]);
942 'retrieve' : function(list_name) {
944 var list = obj.lists[list_name];
948 if (!obj.sdist_ids.length) { // no sdists to retrieve items for
952 var rparams = list.sitem_retrieve_params;
954 rparams['+sstr'] = { "distribution" : obj.sdist_ids };
956 if (obj.mode == 'bind') {
957 if (list_name == 'workarea') {
958 rparams['unit'] = obj.current_sunit_id;
959 } else if (!$('serial_manage_items_show_all').checked){
960 rparams['unit'] = {"<>" : obj.current_sunit_id};
964 var other_params = list.sitem_extra_params;
965 other_params.join = 'sstr';
967 robj = obj.network.simple_request(
969 [ ses(), rparams, other_params ]
973 } else if (typeof robj.ilsevent!='undefined') {
974 obj.error.standard_unexpected_error_alert('Failed to retrieve serial item ID list',E);
975 } else if (!robj.length) {
979 for (i = 0; i < robj.length; i++) {
980 var nparams = list.append( { 'row' : { 'my' : { 'sitem_id' : robj[i] } }, 'to_bottom' : true, 'no_auto_select' : true } );
981 obj.row_map[robj[i]] = nparams;
985 'on_select' : function(list) {
987 dump('manage_items.on_select list = ' + js2JSON(list) + '\n');
990 obj.controller.view.cmd_claim_items.setAttribute('disabled','false');
992 for (var i = 0; i < list.length; i++) {
993 var item = obj.list_sitem_map[list[i].sitem_id];
994 if (item.status() != 'Expected') {
995 obj.controller.view.cmd_claim_items.setAttribute('disabled','true');
1000 /*obj.controller.view.cmd_items_claimed_returned.setAttribute('disabled','false');
1001 obj.controller.view.sel_mark_items_missing.setAttribute('disabled','false');*/
1003 obj.retrieve_ids = list;
1004 obj.set_alert_notes_button();
1007 'process_unit_selection' : function(menuitem) {
1010 var label = menuitem.label;
1011 var sunit_id = menuitem.getAttribute('sunit_id');
1012 var sdist_id = menuitem.getAttribute('sdist_id');
1013 var sstr_id = menuitem.getAttribute('sstr_id');
1014 obj.set_sunit(sunit_id, label, sdist_id, sstr_id);
1015 obj.save_sunit(sunit_id, label, sdist_id, sstr_id);
1016 if (obj.mode == 'bind') {
1017 obj.refresh_list('main');
1018 obj.refresh_list('workarea');
1022 'view_notes' : function(type) {
1025 if (!obj.retrieve_ids || obj.retrieve_ids.length == 0) return;
1034 object_id_fn = function(item) { return item.id() };
1035 title_fn = function(item) { return fieldmapper.IDL.fmclasses.sitem.field_map.id.label + ' ' + item.id() };
1036 function_type = 'SIN';
1037 object_type = 'item';
1041 object_id_fn = function(item) { return item.stream().distribution() };
1042 title_fn = function(item) {
1043 var sdist_id = object_id_fn(item);
1044 return obj.sdist_map[sdist_id].label()
1045 + ' -- ' + obj.sdist_map[sdist_id].holding_lib().shortname()
1046 + ' (' + fieldmapper.IDL.fmclasses.sdist.field_map.id.label + ' ' + sdist_id + ')'
1048 function_type = 'SDISTN';
1049 object_type = 'distribution';
1050 constructor = sdistn;
1053 object_id_fn = function(item) { return item.issuance().subscription().id() };
1054 title_fn = function(item) {
1055 var ssub_id = object_id_fn(item);
1056 return obj.ssub_map[ssub_id].owning_lib().shortname()
1057 + ' (' + fieldmapper.IDL.fmclasses.ssub.field_map.id.label + ' ' + ssub_id + ')'
1059 function_type = 'SSUBN';
1060 object_type = 'subscription';
1061 constructor = ssubn;
1070 for (var i = 0; i < obj.retrieve_ids.length; i++) {
1071 var sitem_id = obj.retrieve_ids[i].sitem_id;
1072 var sitem = obj.list_sitem_map[sitem_id];
1073 sitem_ids.push(sitem_id);
1074 var obj_id = object_id_fn(sitem);
1075 if (seen_ids[obj_id]) continue;
1076 JSAN.use('util.window'); var win = new util.window();
1077 notes_window = win.open(
1078 urls.XUL_SERIAL_NOTES,
1079 '','chrome,resizable,modal',
1080 { 'object_id' : obj_id, 'function_type' : function_type, 'object_type' : object_type, 'constructor' : constructor, 'title' : $('serialStrings').getString('staff.serial.'+type+'_editor.notes') + ' -- ' + title_fn(sitem) }
1082 seen_ids[obj_id] = 1;
1084 if (notes_window.notes_updated) { // we changed some notes
1085 if (notes_window.notes_updated.sdistn || notes_window.notes_updated.ssubn) {
1088 obj.refresh_rows(sitem_ids);
1093 '_fetch_alert_notes' : function() {
1096 JSAN.use('util.functional');
1105 //gather selected item alerts
1106 if (obj.retrieve_ids) {
1107 var related_obj_ids = {'ssub' : {}, 'sdist' : {}};
1108 for (var i = 0; i < obj.retrieve_ids.length; i++) {
1109 var item = obj.list_sitem_map[obj.retrieve_ids[i].sitem_id];
1110 var my_notes = util.functional.filter_list(
1113 return get_bool(o.alert());
1117 related_obj_ids.ssub[item.issuance().subscription().id()] = 1;
1118 related_obj_ids.sdist[item.stream().distribution()] = 1;
1120 if (my_notes.length) {
1121 alert_ids['sitem'].push(item.id());
1122 notes = notes.concat(my_notes);
1126 // gather related object (sub/dist) alerts
1127 ['sdist', 'ssub'].forEach(function(type) {
1128 var obj_ids = related_obj_ids[type];
1129 var type_map = obj[type + '_map'];
1130 for (my_id in obj_ids) {
1131 var my_notes = util.functional.filter_list(
1132 type_map[my_id].notes(),
1134 return get_bool(o.alert());
1138 if (my_notes.length) {
1139 alert_ids[type].push(my_id);
1140 notes = notes.concat(my_notes);
1148 "alert_ids" : alert_ids
1152 'set_alert_notes_button' : function() {
1154 var alert_data = obj._fetch_alert_notes();
1156 var num_alerts = alert_data.notes.length;
1157 if (num_alerts > 0) {
1158 $('serial_alert_button').setAttribute('disabled','false');
1159 $('serial_alert_button_image').src = '/xul/server/skin/media/images/bell.png';
1160 if (num_alerts == 1) {
1161 $('serial_alert_button_label').value = $('serialStrings').getString('staff.serial.manage_items.alert_button.label');
1163 $('serial_alert_button_label').value = $('serialStrings').getFormattedString('staff.serial.manage_items.alert_button.plural.label', num_alerts);
1166 $('serial_alert_button').setAttribute('disabled','true');
1167 $('serial_alert_button_image').src = '/xul/server/skin/media/images/bell_disabled.png';
1168 $('serial_alert_button_label').value = $('serialStrings').getFormattedString('staff.serial.manage_items.alert_button.plural.label', 0);
1172 'view_alert_notes' : function() {
1175 JSAN.use('util.functional');
1176 var alert_data = obj._fetch_alert_notes();
1177 var notes = alert_data.notes;
1178 var alert_ids = alert_data.alert_ids;
1180 if (notes.length <= 0) return;
1182 // create titles for each alerted objects notes
1183 var section_titles = {
1188 for (type in alert_ids) {
1189 var typed_ids = alert_ids[type];
1190 for (var i = 0; i < typed_ids.length; i++) {
1191 var my_id = typed_ids[i];
1192 var title_chunk = '';
1199 title_chunk = obj.ssub_map[my_id].owning_lib().shortname();
1203 title_chunk = obj.sdist_map[my_id].label()
1205 + obj.sdist_map[my_id].holding_lib().shortname();
1206 fm_class = 'sdistn';
1209 section_titles[fm_class].push(
1210 $('serialStrings').getString('staff.serial.'+ type +'_editor.notes')
1211 + ' -- ' + title_chunk + ' ('
1212 + fieldmapper.IDL.fmclasses[type].field_map.id.label
1218 JSAN.use('util.window'); var win = new util.window();
1219 var notes_window = win.open(
1220 urls.XUL_SERIAL_NOTES,
1221 '','chrome,resizable,modal',
1222 { 'notes' : notes, 'section_titles' : section_titles, 'title' : "Serial Alerts", 'disable_create' : true, 'section_id_names' : { 'ssubn' : 'subscription', 'sdistn' : 'distribution', 'sin' : 'item'} }
1224 if (notes_window.notes_updated) { // we changed some notes
1225 if (notes_window.notes_updated.sdistn || notes_window.notes_updated.ssubn) {
1228 obj.refresh_rows(alert_ids["sitem"]);
1234 'set_items_special_status' : function(new_status, message) {
1237 if (!obj.retrieve_ids || obj.retrieve_ids.length == 0) return;
1239 JSAN.use('util.functional');
1240 var list = util.functional.map_list(
1243 var item = obj.list_sitem_map[o.sitem_id];
1244 item.status(new_status);
1245 obj.list_sitem_map[o.sitem_id] = item;
1250 var robj = obj.network.request(
1252 'open-ils.serial.item.fleshed.batch.update',
1255 if (typeof robj.ilsevent != 'undefined') throw(robj);
1257 alert($('serialStrings').getFormattedString(message, [list.length]));
1258 obj.refresh_rows(list);
1260 obj.error.standard_unexpected_error_alert('staff.serial.manage_items.set_items_special_status.error',E);
1265 function item_columns(modify,params) {
1267 JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
1268 //JSAN.use('util.network'); var network = new util.network();
1273 'label' : 'Item ID',
1277 'render' : function(my) { return my.sitem.id(); },
1278 'persist' : 'hidden width ordinal'
1282 'label' : 'Issuance Label',
1286 'render' : function(my) { return my.sitem.issuance().label(); },
1287 'persist' : 'hidden width ordinal'
1290 'id' : 'distribution',
1291 'label' : 'Distribution',
1295 'persist' : 'hidden width ordinal',
1296 'render' : function(my) { return my.parent_obj.sdist_map[my.sitem.stream().distribution()].label(); }
1299 'id' : 'distribution_ou',
1300 'label' : $('serialStrings').getString('staff.serial.manage_items.holder.label'),
1304 'persist' : 'hidden width ordinal',
1305 'render' : function(my) { return my.parent_obj.sdist_map[my.sitem.stream().distribution()].holding_lib().shortname(); }
1309 'label' : 'Stream ID',
1313 'persist' : 'hidden width ordinal',
1314 'render' : function(my) { return my.sitem.stream().id(); }
1317 'id' : 'date_published',
1318 'label' : 'Date Published',
1322 'render' : function(my) { return my.sitem.issuance().date_published().substr(0,10); },
1323 'persist' : 'hidden width ordinal'
1326 'id' : 'date_expected',
1327 'label' : 'Date Expected',
1331 'render' : function(my) { return my.sitem.date_expected().substr(0,10); },
1332 'persist' : 'hidden width ordinal'
1335 'id' : 'date_received',
1336 'label' : 'Date Received',
1340 'render' : function(my) { return my.sitem.date_received().substr(0,10); },
1341 'persist' : 'hidden width ordinal'
1345 'label' : $('serialStrings').getString('staff.serial.manage_items.notes_column.label'),
1349 'render' : function(my) { return my.sitem.notes().length + ' / ' + my.parent_obj.sdist_map[my.sitem.stream().distribution()].notes().length + ' / ' + my.parent_obj.ssub_map[my.sitem.issuance().subscription().id()].notes().length; },
1350 'persist' : 'hidden width ordinal'
1353 'id' : 'call_number',
1354 'label' : 'Call Number',
1358 'persist' : 'hidden width ordinal',
1359 'render' : function(my) { return my.sitem.unit().call_number().label(); }
1362 'id' : 'unit_id_contents',
1363 'label' : 'Unit ID / Contents',
1367 'render' : function(my) { return '[' + my.sitem.unit().id() + '] ' + my.sitem.unit().summary_contents() ; },
1368 'persist' : 'hidden width ordinal'
1372 'label' : 'Creator',
1376 'persist' : 'hidden width ordinal',
1377 'render' : function(my) { return my.sitem.creator().usrname(); }
1380 'id' : 'create_date',
1381 'label' : document.getElementById('circStrings').getString('staff.circ.utils.create_date'),
1385 'persist' : 'hidden width ordinal',
1386 'render' : function(my) { return my.sitem.create_date().substr(0,10); }
1394 'persist' : 'hidden width ordinal',
1395 'render' : function(my) { return my.sitem.editor().usrname(); }
1399 'label' : document.getElementById('circStrings').getString('staff.circ.utils.edit_date'),
1403 'persist' : 'hidden width ordinal',
1404 'render' : function(my) { return my.sitem.edit_date().substr(0,10); }
1407 'id' : 'holding_code',
1408 'label' : 'Holding Code',
1412 'render' : function(my) { return my.sitem.issuance().holding_code(); },
1413 'persist' : 'hidden width ordinal'
1416 'id' : 'holding_type',
1417 'label' : 'Holding Type',
1421 'render' : function(my) { return my.sitem.issuance().holding_type(); },
1422 'persist' : 'hidden width ordinal'
1425 'id' : 'holding_link_id',
1426 'label' : 'Holding Link ID',
1430 'render' : function(my) { return my.sitem.issuance().holding_link_id(); },
1431 'persist' : 'hidden width ordinal'
1434 for (var i = 0; i < c.length; i++) {
1435 if (modify[ c[i].id ]) {
1436 for (var j in modify[ c[i].id ]) {
1437 c[i][j] = modify[ c[i].id ][j];
1442 if (params.just_these) {
1443 JSAN.use('util.functional');
1445 for (var i = 0; i < params.just_these.length; i++) {
1446 var x = util.functional.find_list(c,function(d){return(d.id==params.just_these[i]);});
1447 new_c.push( function(y){ return y; }( x ) );
1451 if (params.except_these) {
1452 JSAN.use('util.functional');
1454 for (var i = 0; i < c.length; i++) {
1455 var x = util.functional.find_list(params.except_these,function(d){return(d==c[i].id);});
1456 if (!x) new_c.push(c[i]);
1461 //return c.sort( function(a,b) { if (a.label < b.label) return -1; if (a.label > b.label) return 1; return 0; } );
1465 spawn_sitem_editor = function(params) {
1467 if (!params.sitem_ids && !params.sitems) return;
1468 if (params.sitem_ids && params.sitem_ids.length == 0) return;
1469 if (params.sitems && params.sitems.length == 0) return;
1470 if (params.sitem_ids) params.sitem_ids = js2JSON(params.sitem_ids); // legacy
1471 if (!params.caller_handles_update) params.handle_update = 1; // legacy
1474 JSAN.use('util.network'); obj.network = new util.network();
1475 JSAN.use('util.error'); obj.error = new util.error();
1478 if (params.sitem_ids && params.sitem_ids.length > 1 && params.do_edit == 1)
1479 title = 'Batch Edit Items';
1480 else /* if(params.sitems && params.sitems.length > 1 && params.do_edit == 1)
1481 title = 'Batch View Items';
1482 else if(params.sitem_ids && params.sitem_ids.length == 1) */
1483 title = 'Edit Item';/*
1485 title = 'View Item';*/
1487 JSAN.use('util.window'); var win = new util.window();
1488 params.in_modal = true;
1489 var my_xulG = win.open(
1490 (urls.XUL_SERIAL_ITEM_EDITOR),
1492 'chrome,modal,resizable',
1495 if (my_xulG.sitems && params.do_edit) {
1496 return my_xulG.sitems;
1501 JSAN.use('util.error'); var error = new util.error();
1502 error.standard_unexpected_error_alert('error in spawn_sitem_editor',E);
1506 dump('exiting manage_items.js\n');