1 dump('entering patron.holds.js\n');
3 if (typeof patron == 'undefined') patron = {};
4 patron.holds = 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('OpenILS.data'); this.data = new OpenILS.data(); this.data.init({'via':'stash'});
11 patron.holds.prototype = {
13 'hold_interface_type' : null,
15 'pull_from_shelf_interface' : {
16 '_default' : { 'limit' : 50, 'offset' : 0 },
17 'current' : { 'limit' : 50, 'offset' : 0 }
26 'flatten_copy' : function(hold) {
27 try { if ( hold.current_copy() && typeof hold.current_copy() == 'object') hold.current_copy( hold.current_copy().id() ); } catch(E) { alert('FIXME: Error flattening hold before hold update: ' + E); }
31 'init' : function( params ) {
35 obj.patron_id = params['patron_id'];
36 obj.docid = params['docid'];
37 obj.shelf = params['shelf'];
38 obj.tree_id = params['tree_id'];
40 JSAN.use('circ.util');
41 var columns = circ.util.hold_columns(
43 'title' : { 'hidden' : false, 'flex' : '3' },
44 'request_time' : { 'hidden' : false },
45 'pickup_lib_shortname' : { 'hidden' : false },
46 'hold_type' : { 'hidden' : false },
47 'current_copy' : { 'hidden' : false },
48 'capture_time' : { 'hidden' : false },
49 'notify_time' : { 'hidden' : false },
50 'notify_count' : { 'hidden' : false },
54 JSAN.use('util.list'); obj.list = new util.list( obj.tree_id || 'holds_list');
58 'map_row_to_columns' : circ.util.std_map_row_to_columns(),
59 'retrieve_row' : function(params) {
62 obj.network.simple_request('FM_AHR_BLOB_RETRIEVE.authoritative', [ ses(), row.my.hold_id ],
65 var blob = blob_req.getResultObject();
66 if (typeof blob.ilsevent != 'undefined') throw(blob);
67 row.my.ahr = blob.hold;
68 row.my.status = blob.status;
69 row.my.ahr.status( blob.status );
70 row.my.acp = blob.copy;
71 row.my.acn = blob.volume;
72 row.my.mvr = blob.mvr;
73 row.my.patron_family_name = blob.patron_last;
74 row.my.patron_first_given_name = blob.patron_first;
75 row.my.patron_barcode = blob.patron_barcode;
77 var copy_id = row.my.ahr.current_copy();
78 if (typeof copy_id == 'object') {
79 if (copy_id == null) {
80 if (typeof row.my.acp == 'object' && row.my.acp != null) copy_id = row.my.acp.id();
82 copy_id = copy_id.id();
85 copy_id = row.my.acp.id();
88 obj.holds_map[ row.my.ahr.id() ] = row.my.ahr;
89 params.row_node.setAttribute('retrieve_id',
92 'barcode':row.my.acp ? row.my.acp.barcode() : null,
94 'type':row.my.ahr.hold_type(),
95 'target':row.my.ahr.target(),
96 'usr':row.my.ahr.usr(),
99 if (typeof params.on_retrieve == 'function') { params.on_retrieve(row); }
102 obj.error.standard_unexpected_error_alert('Error retrieving details for hold #' + row.my.hold_id, E);
107 obj.error.sdump('D_ERROR','retrieve_row: ' + E );
111 'on_select' : function(ev) {
112 JSAN.use('util.functional');
113 var sel = obj.list.retrieve_selection();
114 obj.controller.view.sel_clip.setAttribute('disabled',sel.length < 1);
115 obj.retrieve_ids = util.functional.map_list(
117 function(o) { return JSON2js( o.getAttribute('retrieve_id') ); }
119 if (obj.retrieve_ids.length > 0) {
120 obj.controller.view.sel_mark_items_damaged.setAttribute('disabled','false');
121 obj.controller.view.sel_mark_items_missing.setAttribute('disabled','false');
122 obj.controller.view.sel_copy_details.setAttribute('disabled','false');
123 obj.controller.view.sel_patron.setAttribute('disabled','false');
124 obj.controller.view.cmd_retrieve_patron.setAttribute('disabled','false');
125 obj.controller.view.cmd_holds_edit_pickup_lib.setAttribute('disabled','false');
126 obj.controller.view.cmd_holds_edit_phone_notify.setAttribute('disabled','false');
127 obj.controller.view.cmd_holds_edit_email_notify.setAttribute('disabled','false');
128 obj.controller.view.cmd_holds_edit_selection_depth.setAttribute('disabled','false');
129 obj.controller.view.cmd_holds_edit_thaw_date.setAttribute('disabled','false');
130 obj.controller.view.cmd_holds_activate.setAttribute('disabled','false');
131 obj.controller.view.cmd_holds_suspend.setAttribute('disabled','false');
132 obj.controller.view.cmd_show_notifications.setAttribute('disabled','false');
133 obj.controller.view.cmd_holds_retarget.setAttribute('disabled','false');
134 obj.controller.view.cmd_holds_cancel.setAttribute('disabled','false');
135 obj.controller.view.cmd_show_catalog.setAttribute('disabled','false');
137 obj.controller.view.sel_mark_items_damaged.setAttribute('disabled','true');
138 obj.controller.view.sel_mark_items_missing.setAttribute('disabled','true');
139 obj.controller.view.sel_copy_details.setAttribute('disabled','true');
140 obj.controller.view.sel_patron.setAttribute('disabled','true');
141 obj.controller.view.cmd_retrieve_patron.setAttribute('disabled','true');
142 obj.controller.view.cmd_holds_edit_pickup_lib.setAttribute('disabled','true');
143 obj.controller.view.cmd_holds_edit_phone_notify.setAttribute('disabled','true');
144 obj.controller.view.cmd_holds_edit_email_notify.setAttribute('disabled','true');
145 obj.controller.view.cmd_holds_edit_selection_depth.setAttribute('disabled','true');
146 obj.controller.view.cmd_holds_edit_thaw_date.setAttribute('disabled','true');
147 obj.controller.view.cmd_holds_activate.setAttribute('disabled','true');
148 obj.controller.view.cmd_holds_suspend.setAttribute('disabled','true');
149 obj.controller.view.cmd_show_notifications.setAttribute('disabled','true');
150 obj.controller.view.cmd_holds_retarget.setAttribute('disabled','true');
151 obj.controller.view.cmd_holds_cancel.setAttribute('disabled','true');
152 obj.controller.view.cmd_show_catalog.setAttribute('disabled','true');
159 JSAN.use('util.controller'); obj.controller = new util.controller();
163 'save_columns' : [ [ 'command' ], function() { obj.list.save_columns(); } ],
166 function() { obj.list.clipboard(); }
170 function() { alert('Not Yet Implemented'); }
175 JSAN.use('circ.util');
176 circ.util.show_last_few_circs(obj.retrieve_ids);
179 'sel_mark_items_damaged' : [
182 JSAN.use('cat.util'); JSAN.use('util.functional');
183 cat.util.mark_item_damaged( util.functional.map_list( obj.retrieve_ids, function(o) { return o.copy_id; } ) );
186 'sel_mark_items_missing' : [
189 JSAN.use('cat.util'); JSAN.use('util.functional');
190 cat.util.mark_item_missing( util.functional.map_list( obj.retrieve_ids, function(o) { return o.copy_id; } ) );
193 'sel_copy_details' : [
196 JSAN.use('circ.util');
197 for (var i = 0; i < obj.retrieve_ids.length; i++) {
198 if (obj.retrieve_ids[i].copy_id) circ.util.show_copy_details( obj.retrieve_ids[i].copy_id );
202 'cmd_holds_print' : [
206 JSAN.use('patron.util');
208 'patron' : patron.util.retrieve_au_via_id(ses(),obj.patron_id),
211 obj.list.print(params);
213 obj.error.standard_unexpected_error_alert('print 1',E);
217 'cmd_holds_export' : [
221 obj.list.dump_csv_to_clipboard();
223 obj.error.standard_unexpected_error_alert('export 1',E);
228 'cmd_show_notifications' : [
232 JSAN.use('util.window'); var win = new util.window();
233 for (var i = 0; i < obj.retrieve_ids.length; i++) {
234 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
236 xulG.url_prefix(urls.XUL_HOLD_NOTICES), // + '?ahr_id=' + obj.retrieve_ids[i].id,
237 'hold_notices_' + obj.retrieve_ids[i].id,
239 { 'ahr_id' : obj.retrieve_ids[i].id }
243 obj.error.standard_unexpected_error_alert('Error rendering/retrieving hold notifications.',E);
247 'cmd_holds_edit_selection_depth' : [
251 JSAN.use('util.widgets'); JSAN.use('util.functional');
252 var ws_type = obj.data.hash.aout[ obj.data.hash.aou[ obj.data.list.au[0].ws_ou() ].ou_type() ];
253 var list = util.functional.map_list(
254 util.functional.filter_list(
257 if (o.depth() > ws_type.depth()) return false;
258 if (o.depth() < ws_type.depth()) return true;
259 return (o.id() == ws_type.id());
271 ml = util.widgets.make_menulist( list, obj.data.list.au[0].ws_ou() );
272 ml.setAttribute('id','selection');
273 ml.setAttribute('name','fancy_data');
274 var xml = '<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" flex="1" style="overflow: vertical">';
275 xml += '<description>Please choose a Hold Range:</description>';
276 xml += util.widgets.serialize_node(ml);
278 var bot_xml = '<hbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" flex="1" style="overflow: vertical">';
279 bot_xml += '<spacer flex="1"/><button label="Done" accesskey="D" name="fancy_submit"/>';
280 bot_xml += '<button label="Cancel" accesskey="C" name="fancy_cancel"/></hbox>';
281 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
282 //obj.data.temp_mid = xml; obj.data.stash('temp_mid');
283 //obj.data.temp_bot = bot_xml; obj.data.stash('temp_bot');
284 JSAN.use('util.window'); var win = new util.window();
285 var fancy_prompt_data = win.open(
286 urls.XUL_FANCY_PROMPT,
287 //+ '?xml_in_stash=temp_mid'
288 //+ '&bottom_xml_in_stash=temp_bot'
289 //+ '&title=' + window.escape('Choose a Pick Up Library'),
290 'fancy_prompt', 'chrome,resizable,modal',
291 { 'xml' : xml, 'bottom_xml' : bot_xml, 'title' : 'Choose a Pick Up Library' }
293 if (fancy_prompt_data.fancy_status == 'incomplete') { return; }
294 var selection = fancy_prompt_data.selection;
295 var msg = 'Are you sure you would like to change the Hold Range for hold' + ( obj.retrieve_ids.length > 1 ? 's ' : ' ') + util.functional.map_list( obj.retrieve_ids, function(o){return o.id;}).join(', ') + ' to "' + obj.data.hash.aout[selection].opac_label() + '"?';
296 var r = obj.error.yns_alert(msg,'Modifying Holds','Yes','No',null,'Check here to confirm this message');
298 for (var i = 0; i < obj.retrieve_ids.length; i++) {
299 var hold = obj.holds_map[ obj.retrieve_ids[i].id ];
300 hold.selection_depth( obj.data.hash.aout[selection].depth() ); hold.ischanged('1');
301 hold = obj.flatten_copy(hold);
302 var robj = obj.network.simple_request('FM_AHR_UPDATE',[ ses(), hold ]);
303 if (typeof robj.ilsevent != 'undefined') throw(robj);
305 obj.clear_and_retrieve(true);
308 obj.error.standard_unexpected_error_alert('Holds not likely modified.',E);
313 'cmd_holds_edit_pickup_lib' : [
317 JSAN.use('util.widgets'); JSAN.use('util.functional');
318 var list = util.functional.map_list(
321 var sname = o.shortname(); for (i = sname.length; i < 20; i++) sname += ' ';
323 o.name() ? sname + ' ' + o.name() : o.shortname(),
325 ( obj.data.hash.aout[ o.ou_type() ].can_have_users() == 0),
326 ( obj.data.hash.aout[ o.ou_type() ].depth() * 2),
330 ml = util.widgets.make_menulist( list, obj.data.list.au[0].ws_ou() );
331 ml.setAttribute('id','lib');
332 ml.setAttribute('name','fancy_data');
333 var xml = '<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" flex="1" style="overflow: vertical">';
334 xml += '<description>Please choose a new Pickup Library:</description>';
335 xml += util.widgets.serialize_node(ml);
337 var bot_xml = '<hbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" flex="1" style="overflow: vertical">';
338 bot_xml += '<spacer flex="1"/><button label="Done" accesskey="D" name="fancy_submit"/>';
339 bot_xml += '<button label="Cancel" accesskey="C" name="fancy_cancel"/></hbox>';
340 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
341 //obj.data.temp_mid = xml; obj.data.stash('temp_mid');
342 //obj.data.temp_bot = bot_xml; obj.data.stash('temp_bot');
343 JSAN.use('util.window'); var win = new util.window();
344 var fancy_prompt_data = win.open(
345 urls.XUL_FANCY_PROMPT,
346 //+ '?xml_in_stash=temp_mid'
347 //+ '&bottom_xml_in_stash=temp_bot'
348 //+ '&title=' + window.escape('Choose a Pick Up Library'),
349 'fancy_prompt', 'chrome,resizable,modal',
350 { 'xml' : xml, 'bottom_xml' : bot_xml, 'title' : 'Choose a Pick Up Library' }
352 if (fancy_prompt_data.fancy_status == 'incomplete') { return; }
353 var pickup_lib = fancy_prompt_data.lib;
354 var msg = 'Are you sure you would like to change the Pick Up Lib for hold' + ( obj.retrieve_ids.length > 1 ? 's ' : ' ') + util.functional.map_list( obj.retrieve_ids, function(o){return o.id;}).join(', ') + ' to ' + obj.data.hash.aou[pickup_lib].shortname() + '?';
355 var r = obj.error.yns_alert(msg,'Modifying Holds','Yes','No',null,'Check here to confirm this message');
357 for (var i = 0; i < obj.retrieve_ids.length; i++) {
358 var hold = obj.holds_map[ obj.retrieve_ids[i].id ];
359 hold.pickup_lib( pickup_lib ); hold.ischanged('1');
360 hold = obj.flatten_copy(hold);
361 var robj = obj.network.simple_request('FM_AHR_UPDATE',[ ses(), hold ]);
362 if (typeof robj.ilsevent != 'undefined') throw(robj);
364 obj.clear_and_retrieve(true);
367 obj.error.standard_unexpected_error_alert('Holds not likely modified.',E);
371 'cmd_holds_edit_phone_notify' : [
375 var xml = '<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" flex="1" style="overflow: vertical">';
376 xml += '<description>Please enter a new phone number for hold notification (leave the field empty to disable phone notification):</description>';
377 xml += '<textbox id="phone" name="fancy_data"/>';
379 var bot_xml = '<hbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" flex="1" style="overflow: vertical">';
380 bot_xml += '<spacer flex="1"/><button label="Done" accesskey="D" name="fancy_submit"/>';
381 bot_xml += '<button label="Cancel" accesskey="C" name="fancy_cancel"/></hbox>';
382 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
383 //obj.data.temp_mid = xml; obj.data.stash('temp_mid');
384 //obj.data.temp_bot = bot_xml; obj.data.stash('temp_bot');
385 JSAN.use('util.window'); var win = new util.window();
386 var fancy_prompt_data = win.open(
387 urls.XUL_FANCY_PROMPT,
388 //+ '?xml_in_stash=temp_mid'
389 //+ '&bottom_xml_in_stash=temp_bot'
390 //+ '&title=' + window.escape('Choose a Hold Notification Phone Number')
392 'fancy_prompt', 'chrome,resizable,modal',
393 { 'xml' : xml, 'bottom_xml' : bot_xml, 'title' : 'Choose a Hold Notification Phone Number', 'focus' : 'phone' }
395 if (fancy_prompt_data.fancy_status == 'incomplete') { return; }
396 var phone = fancy_prompt_data.phone;
397 var msg = 'Are you sure you would like to change the Notification Phone Number for hold' + ( obj.retrieve_ids.length > 1 ? 's ' : ' ') + util.functional.map_list( obj.retrieve_ids, function(o){return o.id;}).join(', ') + ' to "' + phone + '"?';
398 var r = obj.error.yns_alert(msg,'Modifying Holds','Yes','No',null,'Check here to confirm this message');
400 for (var i = 0; i < obj.retrieve_ids.length; i++) {
401 var hold = obj.holds_map[ obj.retrieve_ids[i].id ];
402 hold.phone_notify( phone ); hold.ischanged('1');
403 hold = obj.flatten_copy(hold);
404 var robj = obj.network.simple_request('FM_AHR_UPDATE',[ ses(), hold ]);
405 if (typeof robj.ilsevent != 'undefined') throw(robj);
407 obj.clear_and_retrieve(true);
410 obj.error.standard_unexpected_error_alert('Holds not likely modified.',E);
414 'cmd_holds_edit_email_notify' : [
418 var xml = '<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" flex="1" style="overflow: vertical">';
419 xml += '<description>Send email notifications (when appropriate)? The email address used is found in the hold recipient account.</description>';
420 xml += '<hbox><button value="email" label="Email" accesskey="E" name="fancy_submit"/>';
421 xml += '<button value="noemail" label="No Email" accesskey="N" name="fancy_submit"/></hbox>';
423 var bot_xml = '<hbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" flex="1" style="overflow: vertical">';
424 bot_xml += '<spacer flex="1"/><button label="Cancel" accesskey="C" name="fancy_cancel"/></hbox>';
425 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
426 //obj.data.temp_mid = xml; obj.data.stash('temp_mid');
427 //obj.data.temp_bot = bot_xml; obj.data.stash('temp_bot');
428 JSAN.use('util.window'); var win = new util.window();
429 var fancy_prompt_data = win.open(
430 urls.XUL_FANCY_PROMPT,
431 //+ '?xml_in_stash=temp_mid'
432 //+ '&bottom_xml_in_stash=temp_bot'
433 //+ '&title=' + window.escape('Set Email Notification for Holds'),
434 'fancy_prompt', 'chrome,resizable,modal',
435 { 'xml' : xml, 'bottom_xml' : bot_xml, 'title' : 'Set Email Notification for Holds' }
437 if (fancy_prompt_data.fancy_status == 'incomplete') { return; }
438 var email = fancy_prompt_data.fancy_submit == 'email' ? get_db_true() : get_db_false();
439 var msg = 'Are you sure you would like ' + ( get_bool( email ) ? 'enable' : 'disable' ) + ' email notification for hold' + ( obj.retrieve_ids.length > 1 ? 's ' : ' ') + util.functional.map_list( obj.retrieve_ids, function(o){return o.id;}).join(', ') + '?';
440 var r = obj.error.yns_alert(msg,'Modifying Holds','Yes','No',null,'Check here to confirm this message');
442 for (var i = 0; i < obj.retrieve_ids.length; i++) {
443 var hold = obj.holds_map[ obj.retrieve_ids[i].id ];
444 hold.email_notify( email ); hold.ischanged('1');
445 hold = obj.flatten_copy(hold);
446 var robj = obj.network.simple_request('FM_AHR_UPDATE',[ ses(), hold ]);
447 if (typeof robj.ilsevent != 'undefined') throw(robj);
449 obj.clear_and_retrieve(true);
452 obj.error.standard_unexpected_error_alert('Holds not likely modified.',E);
456 'cmd_holds_suspend' : [
460 var hold_list = util.functional.map_list( obj.retrieve_ids, function(o){return o.id;}).join(', ');
461 var r = obj.error.yns_alert(
462 obj.retrieve_ids.length > 1 ?
463 document.getElementById('circStrings').getFormattedString('staff.circ.holds.suspend.prompt.plural',[hold_list]) :
464 document.getElementById('circStrings').getFormattedString('staff.circ.holds.suspend.prompt',[hold_list]),
465 document.getElementById('circStrings').getString('staff.circ.holds.modifying_holds'),
466 document.getElementById('circStrings').getString('staff.circ.holds.modifying_holds.yes'),
467 document.getElementById('circStrings').getString('staff.circ.holds.modifying_holds.no'),
469 document.getElementById('commonStrings').getString('common.confirm')
472 var already_suspended = [];
473 for (var i = 0; i < obj.retrieve_ids.length; i++) {
474 var hold = obj.holds_map[ obj.retrieve_ids[i].id ];
475 if ( get_bool( hold.frozen() ) ) {
476 already_suspended.push( hold.id() );
480 hold.thaw_date(null);
482 hold = obj.flatten_copy(hold);
483 var robj = obj.network.simple_request('FM_AHR_UPDATE',[ ses(), hold ]);
484 if (typeof robj.ilsevent != 'undefined') throw(robj);
486 if (already_suspended.length == 1) {
487 alert( document.getElementById('circStrings').getFormattedString('staff.circ.holds.already_suspended',[already_suspended[0]]) );
488 } else if (already_suspended.length > 1) {
489 alert( document.getElementById('circStrings').getFormattedString('staff.circ.holds.already_suspended.plural',[already_suspended.join(', ')]) );
491 obj.clear_and_retrieve(true);
494 obj.error.standard_unexpected_error_alert(document.getElementById('circStrings').getString('staff.circ.holds.unexpected_error.not_likely_suspended'),E);
498 'cmd_holds_activate' : [
502 var hold_list = util.functional.map_list( obj.retrieve_ids, function(o){return o.id;}).join(', ');
503 var r = obj.error.yns_alert(
504 obj.retrieve_ids.length > 1 ?
505 document.getElementById('circStrings').getFormattedString('staff.circ.holds.activate.prompt.plural',[hold_list]) :
506 document.getElementById('circStrings').getFormattedString('staff.circ.holds.activate.prompt',[hold_list]),
507 document.getElementById('circStrings').getString('staff.circ.holds.modifying_holds'),
508 document.getElementById('circStrings').getString('staff.circ.holds.modifying_holds.yes'),
509 document.getElementById('circStrings').getString('staff.circ.holds.modifying_holds.no'),
511 document.getElementById('commonStrings').getString('common.confirm')
514 var already_activated = [];
515 for (var i = 0; i < obj.retrieve_ids.length; i++) {
516 var hold = obj.holds_map[ obj.retrieve_ids[i].id ];
517 if ( ! get_bool( hold.frozen() ) ) {
518 already_activated.push( hold.id() );
522 hold.thaw_date(null);
524 hold = obj.flatten_copy(hold);
525 var robj = obj.network.simple_request('FM_AHR_UPDATE',[ ses(), hold ]);
526 if (typeof robj.ilsevent != 'undefined') throw(robj);
528 if (already_activated.length == 1) {
529 alert( document.getElementById('circStrings').getFormattedString('staff.circ.holds.already_activated',[already_activated[0]]) );
530 } else if (already_activated.length > 1) {
531 alert( document.getElementById('circStrings').getFormattedString('staff.circ.holds.already_activated.plural',[already_activated.join(', ')]) );
533 obj.clear_and_retrieve(true);
536 obj.error.standard_unexpected_error_alert(document.getElementById('circStrings').getString('staff.circ.holds.unexpected_error.not_likely_activated'),E);
540 'cmd_holds_edit_thaw_date' : [
544 JSAN.use('util.date');
545 function check_date(value) {
547 if (! util.date.check('YYYY-MM-DD',value) ) { throw('Invalid Date'); }
548 if (util.date.check_past('YYYY-MM-DD',value) ) {
549 throw('Thaw date for frozen holds needs to be after today.');
558 var msg = 'Please enter a thaw date for hold' + ( obj.retrieve_ids.length > 1 ? 's ' : ' ') + util.functional.map_list( obj.retrieve_ids, function(o){return o.id;}).join(', ') + '\nOr set to blank to unset the thaw date for these holds. Frozen holds without a thaw date will remain frozen until manually unfrozen, otherwise they unfreeze on the thaw date.';
559 var value = 'YYYY-MM-DD';
560 var title = 'Modifying Holds';
561 var thaw_date; var invalid = true;
563 thaw_date = window.prompt(msg,value,title);
565 invalid = ! check_date(thaw_date);
570 if (thaw_date || thaw_date == '') {
571 for (var i = 0; i < obj.retrieve_ids.length; i++) {
572 var hold = obj.holds_map[ obj.retrieve_ids[i].id ];
573 hold.thaw_date( thaw_date == '' ? null : util.date.formatted_date(thaw_date + ' 00:00:00','%{iso8601}') ); hold.ischanged('1');
574 hold = obj.flatten_copy(hold);
575 var robj = obj.network.simple_request('FM_AHR_UPDATE',[ ses(), hold ]);
576 if (typeof robj.ilsevent != 'undefined') throw(robj);
578 obj.clear_and_retrieve(true);
581 obj.error.standard_unexpected_error_alert('Holds not likely modified.',E);
586 'cmd_holds_retarget' : [
590 JSAN.use('util.functional');
591 var msg = 'Are you sure you would like to reset hold' + ( obj.retrieve_ids.length > 1 ? 's ' : ' ') + util.functional.map_list( obj.retrieve_ids, function(o){return o.id;}).join(', ') + '?';
592 var r = obj.error.yns_alert(msg,'Resetting Holds','Yes','No',null,'Check here to confirm this message');
594 for (var i = 0; i < obj.retrieve_ids.length; i++) {
595 var robj = obj.network.simple_request('FM_AHR_RESET',[ ses(), obj.retrieve_ids[i].id]);
596 if (typeof robj.ilsevent != 'undefined') throw(robj);
598 obj.clear_and_retrieve();
601 obj.error.standard_unexpected_error_alert('Holds not likely reset.',E);
607 'cmd_holds_cancel' : [
611 JSAN.use('util.functional');
612 var msg = 'Are you sure you would like to cancel hold' + ( obj.retrieve_ids.length > 1 ? 's ' : ' ') + util.functional.map_list( obj.retrieve_ids, function(o){return o.id;}).join(', ') + '?';
613 var r = obj.error.yns_alert(msg,'Cancelling Holds','Yes','No',null,'Check here to confirm this message');
616 for (var i = 0; i < obj.retrieve_ids.length; i++) {
617 if (obj.holds_map[ obj.retrieve_ids[i].id ].transit()) {
618 transits.push( obj.retrieve_ids[i].barcode );
620 var robj = obj.network.simple_request('FM_AHR_CANCEL',[ ses(), obj.retrieve_ids[i].id]);
621 if (typeof robj.ilsevent != 'undefined') throw(robj);
623 if (transits.length > 0) {
624 var msg2 = 'For barcodes ' + transits.join(', ') + ' cancel the transits as well?';
625 var r2 = obj.error.yns_alert(msg2,'Cancelling Transits','Yes','No',null,'Check here to confirm this message');
628 for (var i = 0; i < transits.length; i++) {
629 var robj = obj.network.simple_request('FM_ATC_VOID',[ ses(), { 'barcode' : transits[i] } ]);
630 if (typeof robj.ilsevent != 'undefined') {
631 switch(Number(robj.ilsevent)) {
632 case 1225 /* TRANSIT_ABORT_NOT_ALLOWED */ :
635 case 5000 /* PERM_FAILURE */ :
644 obj.error.standard_unexpected_error_alert('Hold-transits not likely cancelled.',E);
648 obj.clear_and_retrieve();
651 obj.error.standard_unexpected_error_alert('Holds not likely cancelled.',E);
655 'cmd_retrieve_patron' : [
660 for (var i = 0; i < obj.retrieve_ids.length; i++) {
661 var patron_id = obj.retrieve_ids[i].usr;
662 if (seen[patron_id]) continue; seen[patron_id] = true;
664 xulG.url_prefix(urls.XUL_PATRON_DISPLAY), // + '?id=' + patron_id,
670 obj.error.standard_unexpected_error_alert('',E);
674 'cmd_show_catalog' : [
678 for (var i = 0; i < obj.retrieve_ids.length; i++) {
679 var htarget = obj.retrieve_ids[i].target;
680 var htype = obj.retrieve_ids[i].type;
684 opac_url = xulG.url_prefix( urls.opac_rresult ) + '?m=' + htarget;
687 opac_url = xulG.url_prefix( urls.opac_rdetail ) + '?r=' + htarget;
690 var my_acn = obj.network.simple_request( 'FM_ACN_RETRIEVE.authoritative', [ htarget ]);
691 opac_url = xulG.url_prefix( urls.opac_rdetail) + '?r=' + my_acn.record();
694 var my_acp = obj.network.simple_request( 'FM_ACP_RETRIEVE', [ htarget ]);
696 if (typeof my_acp.call_number() == 'object') {
697 my_acn = my.acp.call_number();
699 my_acn = obj.network.simple_request( 'FM_ACN_RETRIEVE.authoritative',
700 [ my_acp.call_number() ]);
702 opac_url = xulG.url_prefix( urls.opac_rdetail) + '?r=' + my_acn.record();
705 obj.error.standard_unexpected_error_alert("I don't understand the hold type of " + htype + ", so I can't jump to the appropriate record in the catalog.", obj.retrieve_ids[i]);
709 var content_params = {
711 'authtime' : ses('authtime'),
712 'opac_url' : opac_url,
715 xulG.url_prefix(urls.XUL_OPAC_WRAPPER),
716 {'tab_name': htype == 'M' ? 'Catalog' : 'Retrieving title...'},
721 obj.error.standard_unexpected_error_alert('',E);
728 obj.pull_from_shelf_interface.current.offset += obj.pull_from_shelf_interface.current.limit;
732 'lib_filter_checkbox' : [
735 var x_lib_type_menu = document.getElementById('lib_type_menu');
736 if (x_lib_type_menu) x_lib_type_menu.disabled = ! ev.target.checked;
737 if (obj.controller.view.lib_menu) obj.controller.view.lib_menu.disabled = ! ev.target.checked;
738 obj.clear_and_retrieve();
739 ev.target.setAttribute('checked',ev.target.checked);
746 obj.determine_hold_interface_type();
747 var x_fetch_more = document.getElementById('fetch_more');
748 var x_lib_type_menu = document.getElementById('lib_type_menu');
749 var x_lib_menu_placeholder = document.getElementById('lib_menu_placeholder');
750 var x_lib_filter_checkbox = document.getElementById('lib_filter_checkbox');
751 switch(obj.hold_interface_type) {
753 obj.render_lib_menus({'pickup_lib':true});
754 if (x_lib_type_menu) x_lib_type_menu.hidden = false;
755 if (x_lib_menu_placeholder) x_lib_menu_placeholder.hidden = false;
758 if (x_fetch_more) x_fetch_more.hidden = false;
759 if (x_lib_type_menu) x_lib_type_menu.hidden = true;
760 if (x_lib_menu_placeholder) x_lib_menu_placeholder.hidden = true;
763 obj.render_lib_menus({'pickup_lib':true,'request_lib':true});
764 if (x_lib_filter_checkbox) x_lib_filter_checkbox.hidden = false;
765 if (x_lib_type_menu) x_lib_type_menu.hidden = false;
766 if (x_lib_menu_placeholder) x_lib_menu_placeholder.hidden = false;
769 if (x_fetch_more) x_fetch_more.hidden = true;
770 if (x_lib_type_menu) x_lib_type_menu.hidden = true;
771 if (x_lib_menu_placeholder) x_lib_menu_placeholder.hidden = true;
774 setTimeout( // We do this because render_lib_menus above creates and appends a DOM node, but until this thread exits, it doesn't really happen
776 if (x_lib_filter_checkbox) if (!x_lib_filter_checkbox.checked) {
777 if (x_lib_type_menu) x_lib_type_menu.disabled = true;
778 if (obj.controller.view.lib_menu) obj.controller.view.lib_menu.disabled = true;
780 obj.controller.render();
783 obj.controller.view.cmd_retrieve_patron.setAttribute('disabled','true');
784 obj.controller.view.cmd_holds_edit_pickup_lib.setAttribute('disabled','true');
785 obj.controller.view.cmd_holds_edit_phone_notify.setAttribute('disabled','true');
786 obj.controller.view.cmd_holds_edit_email_notify.setAttribute('disabled','true');
787 obj.controller.view.cmd_holds_edit_thaw_date.setAttribute('disabled','true');
788 obj.controller.view.cmd_holds_activate.setAttribute('disabled','true');
789 obj.controller.view.cmd_holds_suspend.setAttribute('disabled','true');
790 obj.controller.view.cmd_holds_edit_selection_depth.setAttribute('disabled','true');
791 obj.controller.view.cmd_show_notifications.setAttribute('disabled','true');
792 obj.controller.view.cmd_holds_retarget.setAttribute('disabled','true');
793 obj.controller.view.cmd_holds_cancel.setAttribute('disabled','true');
794 obj.controller.view.cmd_show_catalog.setAttribute('disabled','true');
799 'determine_hold_interface_type' : function() {
801 if (obj.patron_id) { /*************************************************** PATRON ******************************/
802 obj.hold_interface_type = 'patron';
803 } else if (obj.docid) { /*************************************************** RECORD ******************************/
804 obj.hold_interface_type = 'record';
805 } else if (obj.pull) { /*************************************************** PULL ******************************/
806 obj.hold_interface_type = 'pull';
807 } else if (obj.shelf) { /*************************************************** HOLD SHELF ******************************/
808 obj.hold_interface_type = 'shelf';
809 } else { /*************************************************** PULL ******************************/
810 obj.hold_interface_type = 'pull';
814 'clear_and_retrieve' : function(dont_show_me_the_list_change) {
816 this.pull_from_shelf_interface.current.offset = this.pull_from_shelf_interface._default.offset;
817 this.retrieve(dont_show_me_the_list_change);
820 'retrieve' : function(dont_show_me_the_list_change) {
821 var obj = this; var holds = [];
822 if (window.xulG && window.xulG.holds) {
823 holds = window.xulG.holds;
825 var method; var params = [ ses() ];
826 switch(obj.hold_interface_type) {
828 method = 'FM_AHR_ID_LIST_RETRIEVE_VIA_AU.authoritative';
829 params.push( obj.patron_id );
830 obj.controller.view.cmd_retrieve_patron.setAttribute('hidden','true');
833 method = 'FM_AHR_RETRIEVE_ALL_VIA_BRE';
834 params.push( obj.docid );
835 var x_lib_filter = document.getElementById('lib_filter_checkbox');
836 var x_lib_type_menu = document.getElementById('lib_type_menu');
838 if (x_lib_filter.checked) {
839 if (x_lib_type_menu && obj.controller.view.lib_menu) {
841 x[ x_lib_type_menu.value ] = obj.controller.view.lib_menu.value;
846 obj.controller.view.cmd_retrieve_patron.setAttribute('hidden','false');
849 method = 'FM_AHR_ID_LIST_ONSHELF_RETRIEVE';
850 params.push( obj.filter_lib || obj.data.list.au[0].ws_ou() );
851 obj.controller.view.cmd_retrieve_patron.setAttribute('hidden','false');
855 method = 'FM_AHR_ID_LIST_PULL_LIST';
856 params.push( obj.pull_from_shelf_interface.current.limit ); params.push( obj.pull_from_shelf_interface.current.offset );
857 //obj.controller.view.cmd_retrieve_patron.setAttribute('hidden','false');
860 var robj = obj.network.simple_request( method, params );
861 if (typeof robj.ilsevent != 'undefined') throw(robj);
862 if (method == 'FM_AHR_RETRIEVE_ALL_VIA_BRE') {
864 holds = holds.concat( robj.copy_holds );
865 holds = holds.concat( robj.volume_holds );
866 holds = holds.concat( robj.title_holds );
867 holds = holds.sort();
871 //alert('method = ' + method + ' params = ' + js2JSON(params));
874 var x_fetch_more = document.getElementById('fetch_more');
875 if (holds.length == 0) {
876 if (x_fetch_more) x_fetch_more.disabled = true;
878 if (x_fetch_more) x_fetch_more.disabled = false;
879 obj.render(holds,dont_show_me_the_list_change);
884 'render' : function(holds,dont_show_me_the_list_change) {
887 function list_append(hold_id) {
899 function gen_list_append(hold) {
901 if (typeof obj.controller.view.lib_menu == 'undefined') {
902 list_append(typeof hold == 'object' ? hold.id() : hold);
904 list_append(typeof hold == 'object' ? hold.id() : hold);
911 JSAN.use('util.exec'); var exec = new util.exec(2);
913 for (var i in holds) {
914 rows.push( gen_list_append(holds[i]) );
918 if (!dont_show_me_the_list_change) {
919 if (window.xulG && typeof window.xulG.on_list_change == 'function') {
920 try { window.xulG.on_list_change(holds); } catch(E) { this.error.sdump('D_ERROR',E); }
925 'render_lib_menus' : function(types) {
928 JSAN.use('util.widgets'); JSAN.use('util.functional'); JSAN.use('util.fm_utils');
930 var x = document.getElementById('lib_type_menu');
932 var nodes = x.firstChild.childNodes;
933 for (var i = 0; i < nodes.length; i++) nodes[i].hidden = true;
934 for (var i in types) document.getElementById(i).hidden = false;
936 x.setAttribute('oncommand','g.holds.clear_and_retrieve()');
938 x = document.getElementById('lib_menu_placeholder');
939 util.widgets.remove_children( x );
941 JSAN.use('util.file');
942 var file = new util.file('offline_ou_list');
943 if (file._file.exists()) {
944 var list_data = file.get_object(); file.close();
945 var ml = util.widgets.make_menulist( list_data[0], obj.data.list.au[0].ws_ou() );
946 ml.setAttribute('id','lib_menu');
951 obj.filter_lib = ev.target.value;
952 obj.clear_and_retrieve();
956 obj.controller.view.lib_menu = ml;
958 throw('Missing library list.\n');
962 this.error.standard_unexpected_error_alert('rendering lib menu',E);
967 dump('exiting patron.holds.js\n');