1 dump('entering admin.transit_list.js\n');
3 if (typeof admin == 'undefined') admin = {};
4 admin.transit_list = function (params) {
6 JSAN.use('util.error'); this.error = new util.error();
7 JSAN.use('util.network'); this.network = new util.network(); JSAN.use('util.file');
8 JSAN.use('util.date'); JSAN.use('util.widgets'); JSAN.use('util.fm_utils'); JSAN.use('util.functional');
9 JSAN.use('OpenILS.data'); this.data = new OpenILS.data(); this.data.init({'via':'stash'});
12 admin.transit_list.prototype = {
14 'init' : function( params ) {
18 var x = document.getElementById('libmenu_placeholder');
19 util.widgets.remove_children( x );
21 var file; var list_data; var ml;
23 file = new util.file('offline_ou_list');
24 if (file._file.exists()) {
25 list_data = file.get_object(); file.close();
26 ml = util.widgets.make_menulist( list_data[0], list_data[1] );
27 ml.setAttribute('id','libmenu'); document.getElementById('libmenu_placeholder').appendChild(ml);
31 var file = new util.file('transit_list_prefs.'+obj.data.server_unadorned);
32 util.widgets.save_attributes(file, { 'libmenu' : [ 'value' ] });
37 throw(document.getElementById('adminStrings').getString('staff.admin.transit_list.missing_list') + '\n');
40 file = new util.file('transit_list_prefs.'+obj.data.server_unadorned);
41 util.widgets.load_attributes(file);
42 ml.value = ml.getAttribute('value');
44 ml.value = obj.data.list.au[0].ws_ou();
45 ml.setAttribute('value',ml.value);
51 obj.controller_init();
59 'handle_date' : function(value,end_of_day) {
64 if (value.match(/The Beginning/)) {
65 _date = new Date(); _date.setTime( 0 );
69 if (value.match(/^Today$/i)) {
70 _date = new Date(); _date = util.date.buildDate( _date.getFullYear(), _date.getMonth()+1, _date.getDate(), 0, 0, 0); // morning
73 /* handle YYYY-MM-DD */
74 var _string = value.match(/(\d\d\d\d)[\-\/](\d\d?)[\-\/](\d\d?)/);
76 if (util.date.check('YYYY-MM-DD',_string[1]+'-'+_string[2]+'-'+_string[3])) {
77 _date = util.date.buildDate( _string[1], _string[2], _string[3], 0, 0, 0);
79 alert(document.getElementById('adminStrings').getFormattedString('staff.admin.transit_list.invalid_date', [_string]));
80 _date = new Date(); _date = util.date.buildDate( _date.getFullYear(), _date.getMonth()+1, _date.getDate(), 0, 0, 0); // morning
84 /* handle relative dates */
85 var interval = value.match(/Today \- (.+)/);
87 _date = new Date(); _date = util.date.buildDate( _date.getFullYear(), _date.getMonth()+1, _date.getDate(), 0, 0, 0); // morning
88 _date.setTime( _date.getTime() - util.date.interval_to_seconds(interval[1])*1000 );
91 if (! util.date.check('YYYY-MM-DD',util.date.formatted_date(_date,"%F")) ) {
92 alert(document.getElementById('adminStrings').getFormattedString('staff.admin.transit_list.invalid_date', [_date, util.date.formatted_date(_date,"%F")]));
93 _date = new Date(); _date = util.date.buildDate( _date.getFullYear(), _date.getMonth()+1, _date.getDate(), 0, 0, 0); // morning
96 if (end_of_day) { // This just handles calendar days.. if we wanted to support (Today-1 month,Today-1 month), I'll need a better library, or a query to postgres
97 _date.setTime( _date.getTime() + util.date.interval_to_seconds('1 day')*1000 - util.date.interval_to_seconds('1 second')*1000 );
100 return util.date.formatted_date(_date,'%{iso8601}');
102 try { obj.error.standard_unexpected_error_alert(document.getElementById('adminStrings').getString('staff.admin.transit_list.date_processing.error'),E); } catch(F) { alert(E); }
103 _date = new Date(); _date = util.date.buildDate( _date.getFullYear(), _date.getMonth()+1, _date.getDate(), 0, 0, 0); // morning
104 return util.date.formatted_date(_date,'%{iso8601}');
108 'kick_off' : function() {
112 obj.sdate = obj.handle_date( document.getElementById('sdate').value, false );
113 obj.edate = obj.handle_date( document.getElementById('edate').value, true );
114 var sdate; var edate;
115 if (obj.sdate < obj.edate) {
116 sdate = obj.sdate; edate = obj.edate;
118 sdate = obj.edate; edate = obj.sdate;
120 obj.network.simple_request('FM_ATC_RETRIEVE_VIA_AOU',[ ses(), /*obj.data.list.au[ 0 ].ws_ou()*/ document.getElementById('libmenu').value, sdate, edate ],
123 var robj = req.getResultObject();
124 if (typeof robj.ilsevent != 'undefined') throw(robj);
126 JSAN.use('util.exec');
127 var exec = new util.exec(2);
128 var exec2 = new util.exec(2);
130 function gen_list_append(id,which_list) {
133 case 0: obj.list.append( { 'row' : { 'my' : { 'transit_id' : id } }, 'no_auto_select' : true } ); break;
134 case 1: obj.list.append( { 'row' : { 'my' : { 'transit_id' : id } }, 'no_auto_select' : true } ); break;
141 if (document.getElementById('transit_direction').value=='transit_from') for (var i = 0; i < robj.from.length; i++) {
142 //get_transit(robj.from[i], 0);
143 rows.push( gen_list_append(robj.from[i],0) );
146 if (document.getElementById('transit_direction').value=='transit_to') for (var i = 0; i < robj.to.length; i++) {
147 //get_transit(robj.to[i], 1);
148 rows.push( gen_list_append(robj.to[i],1) );
151 if (rows.length > 0) {
154 alert(document.getElementById('adminStrings').getString('staff.admin.transit_list.no_match'));
158 try { obj.error.standard_unexpected_error_alert(document.getElementById('adminStrings').getString('staff.admin.transit_list.retrieving_transit.error'),E); } catch(F) { alert(E); }
163 try { obj.error.standard_unexpected_error_alert(document.getElementById('adminStrings').getString('staff.admin.transit_list.preretrieving_transit.error'),E); } catch(F) { alert(E); }
167 'list_init' : function() {
171 obj.selection_list = [];
173 JSAN.use('circ.util');
174 var columns = circ.util.transit_columns(
176 'transit_source' : { 'hidden' : false },
177 'transit_source_send_time' : { 'hidden' : false },
178 'transit_dest_lib' : { 'hidden' : false },
179 'transit_item_barcode' : { 'hidden' : false },
180 'transit_item_title' : { 'hidden' : false },
186 'transit_source_send_time',
188 'transit_item_barcode',
189 'transit_item_title',
190 'transit_item_author',
191 'transit_item_callnumber',
192 'transit_target_copy',
196 circ.util.hold_columns(
198 'request_time' : { 'hidden' : false },
206 'patron_first_given_name',
207 'patron_family_name',
214 JSAN.use('util.list');
215 obj.list = new util.list('transit_list');
219 'retrieve_row' : function(params) {
220 var row = params.row;
222 obj.get_transit_and_hold_and_run_func(
224 function(transit,hold) { return obj.get_rest_of_row_given_transit_and_hold(params,transit,hold); }
227 try { obj.error.standard_unexpected_error_alert(document.getElementById('adminStrings').getString('staff.admin.transit_list.retrieving_row.error'),E); } catch(F) { alert(E); }
230 'on_select' : function(ev) {
232 JSAN.use('util.functional');
233 var sel = obj.list.retrieve_selection();
234 obj.selection_list = util.functional.map_list(
236 function(o) { return JSON2js(o.getAttribute('retrieve_id')); }
238 obj.error.sdump('D_TRACE','admin.transit_list: selection list = ' + js2JSON(obj.selection_list) );
239 if (obj.selection_list.length == 0) {
240 obj.controller.view.sel_edit.setAttribute('disabled','true');
241 obj.controller.view.sel_opac.setAttribute('disabled','true');
242 obj.controller.view.sel_bucket.setAttribute('disabled','true');
243 obj.controller.view.sel_copy_details.setAttribute('disabled','true');
244 obj.controller.view.sel_patron.setAttribute('disabled','true');
245 obj.controller.view.sel_transit_abort.setAttribute('disabled','true');
246 obj.controller.view.sel_clip.setAttribute('disabled','true');
248 obj.controller.view.sel_edit.setAttribute('disabled','false');
249 obj.controller.view.sel_opac.setAttribute('disabled','false');
250 obj.controller.view.sel_patron.setAttribute('disabled','false');
251 obj.controller.view.sel_bucket.setAttribute('disabled','false');
252 obj.controller.view.sel_copy_details.setAttribute('disabled','false');
253 obj.controller.view.sel_transit_abort.setAttribute('disabled','false');
254 obj.controller.view.sel_clip.setAttribute('disabled','false');
257 alert('FIXME: ' + E);
264 'get_transit_and_hold_and_run_func' : function (transit_id,do_this) {
266 obj.network.simple_request('FM_ATC_RETRIEVE', [ ses(), transit_id ],
269 var r_atc = req2.getResultObject();
270 if (typeof r_atc.ilsevent != 'undefined') throw(r_atc);
272 if (instanceOf(r_atc,atc)) {
274 } else if (instanceOf(r_atc,ahtc)) {
275 obj.network.simple_request('FM_AHR_RETRIEVE', [ ses(), r_atc.hold() ],
278 var r_ahr = req3.getResultObject();
279 if (typeof r_ahr.ilsevent != 'undefined') throw(r_ahr);
280 if (r_ahr.length == 0) {
281 // This can apparently happen under normal operating conditions when "checkout fills related hold" is active.
282 // So don't throw an error, just pretend that it wasn't a hold transit.
285 if (instanceOf(r_ahr[0],ahr)) {
286 do_this(r_atc,r_ahr[0]);
292 try { obj.error.standard_unexpected_error_alert(document.getElementById('adminStrings').getFormattedString('staff.admin.transit_list.empty_array.error', [r_atc.hold(), transit_id]),E); } catch(F) { alert(E); }
302 try { obj.error.standard_unexpected_error_alert(document.getElementById('adminStrings').getFormattedString('staff.admin.transit_list.transit_id.error', [transit_id]),E); } catch(F) { alert(E); }
308 'get_rest_of_row_given_transit_and_hold' : function(params,transit,hold) {
310 var row = params.row;
312 row.my.atc = transit;
313 if (hold) row.my.ahr = hold;
315 obj.network.simple_request(
317 [ row.my.atc.target_copy() ],
320 var r_acp = req.getResultObject();
321 if (typeof r_acp.ilsevent != 'undefined') throw(r_acp);
324 obj.network.simple_request(
325 'FM_ACN_RETRIEVE.authoritative',
326 [ r_acp.call_number() ],
329 var r_acn = req2.getResultObject();
330 if (typeof r_acn.ilsevent != 'undefined') throw(r_acn);
333 if (row.my.acn.record() > 0) {
334 obj.network.simple_request(
335 'MODS_SLIM_RECORD_RETRIEVE.authoritative',
339 var r_mvr = req3.getResultObject();
340 if (typeof r_mvr.ilsevent != 'undefined') throw(r_mvr);
343 params.treeitem_node.setAttribute(
344 'retrieve_id', js2JSON( {
345 'copy_id' : row.my.acp ? row.my.acp.id() : null,
346 'doc_id' : row.my.mvr ? row.my.mvr.doc_id() : null,
347 'barcode' : row.my.acp ? row.my.acp.barcode() : null,
348 'acp_id' : row.my.acp ? row.my.acp.id() : null,
349 'acn_id' : row.my.acn ? row.my.acn.id() : null,
350 'atc_id' : row.my.atc ? row.my.atc.id() : null,
351 'ahr_id' : row.my.ahr ? row.my.ahr.id() : null,
354 if (typeof params.on_retrieve == 'function') {
355 params.on_retrieve(row);
358 try { obj.error.standard_unexpected_error_alert('retrieving mvr',E); } catch(F) { alert(E); }
363 params.treeitem_node.setAttribute(
364 'retrieve_id', js2JSON( {
365 'copy_id' : row.my.acp ? row.my.acp.id() : null,
366 'doc_id' : row.my.mvr ? row.my.mvr.doc_id() : null,
367 'barcode' : row.my.acp ? row.my.acp.barcode() : null,
368 'acp_id' : row.my.acp ? row.my.acp.id() : null,
369 'acn_id' : row.my.acn ? row.my.acn.id() : null,
370 'atc_id' : row.my.atc ? row.my.atc.id() : null,
371 'ahr_id' : row.my.ahr ? row.my.ahr.id() : null,
374 if (typeof params.on_retrieve == 'function') {
375 params.on_retrieve(row);
380 try { obj.error.standard_unexpected_error_alert('retrieving acn',E); } catch(F) { alert(E); }
387 try { obj.error.standard_unexpected_error_alert('retrieving acp',E); } catch(F) { alert(E); }
393 'controller_init' : function() {
396 JSAN.use('util.controller'); obj.controller = new util.controller();
400 'save_columns' : [ [ 'command' ], function() { obj.list.save_columns(); } ],
401 'sel_clip' : [ ['command'], function() { obj.list.clipboard(); } ],
402 'sel_edit' : [ ['command'], function() { try { obj.spawn_copy_editor(0); } catch(E) { alert(E); } } ],
403 'sel_opac' : [ ['command'], function() { JSAN.use('cat.util'); cat.util.show_in_opac(obj.selection_list); } ],
404 'sel_transit_abort' : [ ['command'], function() { JSAN.use('circ.util'); circ.util.abort_transits(obj.selection_list); } ],
405 'sel_patron' : [ ['command'], function() { JSAN.use('circ.util'); circ.util.show_last_few_circs(obj.selection_list); } ],
406 'sel_copy_details' : [ ['command'],
408 JSAN.use('circ.util');
409 circ.util.item_details_new(
410 util.functional.map_list(
412 function(o) { return o.barcode; }
416 'sel_bucket' : [ ['command'], function() { JSAN.use('cat.util'); cat.util.add_copies_to_bucket(obj.selection_list); } ],
417 'cmd_print_list' : [ ['command'], function() { obj.print_list(0); } ],
418 'cmd_kick_off' : [ ['command'], function(ev) { ev.target.disabled = true; obj.kick_off(); } ],
419 'sdate' : [ ['change'], function(ev) { ev.target.value = obj.handle_date(ev.target.value,false); obj.sdate = ev.target.value; /*alert('obj.sdate='+obj.sdate);*/ } ],
420 'edate' : [ ['change'], function(ev) { ev.target.value = obj.handle_date(ev.target.value,true); obj.edate = ev.target.value; /*alert('obj.edate='+obj.edate);*/ } ],
424 this.controller.render();
428 'print_list' : function(which_list) {
431 var list = which_list == 0 ? obj.list : obj.list2;
433 'template' : 'transit_list'
437 obj.error.standard_unexpected_error_alert('print',E);
441 'spawn_copy_editor' : function(which_list) {
445 JSAN.use('util.functional');
447 var list = which_list == 0 ? obj.selection_list : obj.selection_list2;
449 list = util.functional.map_list(
456 JSAN.use('cat.util'); cat.util.spawn_copy_editor( { 'copy_ids' : list, 'edit' : 1 } );
462 dump('exiting admin.transit_list.js\n');