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');
319 var deny_edit_because_of_transit = false;
320 for (var i = 0; i < obj.retrieve_ids.length; i++) {
321 var hold = obj.holds_map[ obj.retrieve_ids[i].id ];
322 if (hold.status() > 2 /* Which means holds that are In-Transit or Ready for Pickup */) deny_edit_because_of_transit = true;
324 if (deny_edit_because_of_transit) {
325 alert(document.getElementById('circStrings').getString('staff.circ.holds.error.may_not_edit_pickup_lib_for_hold_intransit'));
329 var list = util.functional.map_list(
332 var sname = o.shortname(); for (i = sname.length; i < 20; i++) sname += ' ';
334 o.name() ? sname + ' ' + o.name() : o.shortname(),
336 ( obj.data.hash.aout[ o.ou_type() ].can_have_users() == 0),
337 ( obj.data.hash.aout[ o.ou_type() ].depth() * 2),
341 ml = util.widgets.make_menulist( list, obj.data.list.au[0].ws_ou() );
342 ml.setAttribute('id','lib');
343 ml.setAttribute('name','fancy_data');
344 var xml = '<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" flex="1" style="overflow: vertical">';
345 xml += '<description>Please choose a new Pickup Library:</description>';
346 xml += util.widgets.serialize_node(ml);
348 var bot_xml = '<hbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" flex="1" style="overflow: vertical">';
349 bot_xml += '<spacer flex="1"/><button label="Done" accesskey="D" name="fancy_submit"/>';
350 bot_xml += '<button label="Cancel" accesskey="C" name="fancy_cancel"/></hbox>';
351 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
352 //obj.data.temp_mid = xml; obj.data.stash('temp_mid');
353 //obj.data.temp_bot = bot_xml; obj.data.stash('temp_bot');
354 JSAN.use('util.window'); var win = new util.window();
355 var fancy_prompt_data = win.open(
356 urls.XUL_FANCY_PROMPT,
357 //+ '?xml_in_stash=temp_mid'
358 //+ '&bottom_xml_in_stash=temp_bot'
359 //+ '&title=' + window.escape('Choose a Pick Up Library'),
360 'fancy_prompt', 'chrome,resizable,modal',
361 { 'xml' : xml, 'bottom_xml' : bot_xml, 'title' : 'Choose a Pick Up Library' }
363 if (fancy_prompt_data.fancy_status == 'incomplete') { return; }
364 var pickup_lib = fancy_prompt_data.lib;
365 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() + '?';
366 var r = obj.error.yns_alert(msg,'Modifying Holds','Yes','No',null,'Check here to confirm this message');
368 for (var i = 0; i < obj.retrieve_ids.length; i++) {
369 var hold = obj.holds_map[ obj.retrieve_ids[i].id ];
370 hold.pickup_lib( pickup_lib ); hold.ischanged('1');
371 hold = obj.flatten_copy(hold);
372 var robj = obj.network.simple_request('FM_AHR_UPDATE',[ ses(), hold ]);
373 if (typeof robj.ilsevent != 'undefined') throw(robj);
375 obj.clear_and_retrieve(true);
378 obj.error.standard_unexpected_error_alert('Holds not likely modified.',E);
382 'cmd_holds_edit_phone_notify' : [
386 var xml = '<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" flex="1" style="overflow: vertical">';
387 xml += '<description>Please enter a new phone number for hold notification (leave the field empty to disable phone notification):</description>';
388 xml += '<textbox id="phone" name="fancy_data"/>';
390 var bot_xml = '<hbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" flex="1" style="overflow: vertical">';
391 bot_xml += '<spacer flex="1"/><button label="Done" accesskey="D" name="fancy_submit"/>';
392 bot_xml += '<button label="Cancel" accesskey="C" name="fancy_cancel"/></hbox>';
393 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
394 //obj.data.temp_mid = xml; obj.data.stash('temp_mid');
395 //obj.data.temp_bot = bot_xml; obj.data.stash('temp_bot');
396 JSAN.use('util.window'); var win = new util.window();
397 var fancy_prompt_data = win.open(
398 urls.XUL_FANCY_PROMPT,
399 //+ '?xml_in_stash=temp_mid'
400 //+ '&bottom_xml_in_stash=temp_bot'
401 //+ '&title=' + window.escape('Choose a Hold Notification Phone Number')
403 'fancy_prompt', 'chrome,resizable,modal',
404 { 'xml' : xml, 'bottom_xml' : bot_xml, 'title' : 'Choose a Hold Notification Phone Number', 'focus' : 'phone' }
406 if (fancy_prompt_data.fancy_status == 'incomplete') { return; }
407 var phone = fancy_prompt_data.phone;
408 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 + '"?';
409 var r = obj.error.yns_alert(msg,'Modifying Holds','Yes','No',null,'Check here to confirm this message');
411 for (var i = 0; i < obj.retrieve_ids.length; i++) {
412 var hold = obj.holds_map[ obj.retrieve_ids[i].id ];
413 hold.phone_notify( phone ); hold.ischanged('1');
414 hold = obj.flatten_copy(hold);
415 var robj = obj.network.simple_request('FM_AHR_UPDATE',[ ses(), hold ]);
416 if (typeof robj.ilsevent != 'undefined') throw(robj);
418 obj.clear_and_retrieve(true);
421 obj.error.standard_unexpected_error_alert('Holds not likely modified.',E);
425 'cmd_holds_edit_email_notify' : [
429 var xml = '<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" flex="1" style="overflow: vertical">';
430 xml += '<description>Send email notifications (when appropriate)? The email address used is found in the hold recipient account.</description>';
431 xml += '<hbox><button value="email" label="Email" accesskey="E" name="fancy_submit"/>';
432 xml += '<button value="noemail" label="No Email" accesskey="N" name="fancy_submit"/></hbox>';
434 var bot_xml = '<hbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" flex="1" style="overflow: vertical">';
435 bot_xml += '<spacer flex="1"/><button label="Cancel" accesskey="C" name="fancy_cancel"/></hbox>';
436 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
437 //obj.data.temp_mid = xml; obj.data.stash('temp_mid');
438 //obj.data.temp_bot = bot_xml; obj.data.stash('temp_bot');
439 JSAN.use('util.window'); var win = new util.window();
440 var fancy_prompt_data = win.open(
441 urls.XUL_FANCY_PROMPT,
442 //+ '?xml_in_stash=temp_mid'
443 //+ '&bottom_xml_in_stash=temp_bot'
444 //+ '&title=' + window.escape('Set Email Notification for Holds'),
445 'fancy_prompt', 'chrome,resizable,modal',
446 { 'xml' : xml, 'bottom_xml' : bot_xml, 'title' : 'Set Email Notification for Holds' }
448 if (fancy_prompt_data.fancy_status == 'incomplete') { return; }
449 var email = fancy_prompt_data.fancy_submit == 'email' ? get_db_true() : get_db_false();
450 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(', ') + '?';
451 var r = obj.error.yns_alert(msg,'Modifying Holds','Yes','No',null,'Check here to confirm this message');
453 for (var i = 0; i < obj.retrieve_ids.length; i++) {
454 var hold = obj.holds_map[ obj.retrieve_ids[i].id ];
455 hold.email_notify( email ); hold.ischanged('1');
456 hold = obj.flatten_copy(hold);
457 var robj = obj.network.simple_request('FM_AHR_UPDATE',[ ses(), hold ]);
458 if (typeof robj.ilsevent != 'undefined') throw(robj);
460 obj.clear_and_retrieve(true);
463 obj.error.standard_unexpected_error_alert('Holds not likely modified.',E);
467 'cmd_holds_suspend' : [
471 var hold_list = util.functional.map_list( obj.retrieve_ids, function(o){return o.id;}).join(', ');
472 var r = obj.error.yns_alert(
473 obj.retrieve_ids.length > 1 ?
474 document.getElementById('circStrings').getFormattedString('staff.circ.holds.suspend.prompt.plural',[hold_list]) :
475 document.getElementById('circStrings').getFormattedString('staff.circ.holds.suspend.prompt',[hold_list]),
476 document.getElementById('circStrings').getString('staff.circ.holds.modifying_holds'),
477 document.getElementById('circStrings').getString('staff.circ.holds.modifying_holds.yes'),
478 document.getElementById('circStrings').getString('staff.circ.holds.modifying_holds.no'),
480 document.getElementById('commonStrings').getString('common.confirm')
483 var already_suspended = [];
484 for (var i = 0; i < obj.retrieve_ids.length; i++) {
485 var hold = obj.holds_map[ obj.retrieve_ids[i].id ];
486 if ( get_bool( hold.frozen() ) ) {
487 already_suspended.push( hold.id() );
491 hold.thaw_date(null);
493 hold = obj.flatten_copy(hold);
494 var robj = obj.network.simple_request('FM_AHR_UPDATE',[ ses(), hold ]);
495 if (typeof robj.ilsevent != 'undefined') throw(robj);
497 if (already_suspended.length == 1) {
498 alert( document.getElementById('circStrings').getFormattedString('staff.circ.holds.already_suspended',[already_suspended[0]]) );
499 } else if (already_suspended.length > 1) {
500 alert( document.getElementById('circStrings').getFormattedString('staff.circ.holds.already_suspended.plural',[already_suspended.join(', ')]) );
502 obj.clear_and_retrieve(true);
505 obj.error.standard_unexpected_error_alert(document.getElementById('circStrings').getString('staff.circ.holds.unexpected_error.not_likely_suspended'),E);
509 'cmd_holds_activate' : [
513 var hold_list = util.functional.map_list( obj.retrieve_ids, function(o){return o.id;}).join(', ');
514 var r = obj.error.yns_alert(
515 obj.retrieve_ids.length > 1 ?
516 document.getElementById('circStrings').getFormattedString('staff.circ.holds.activate.prompt.plural',[hold_list]) :
517 document.getElementById('circStrings').getFormattedString('staff.circ.holds.activate.prompt',[hold_list]),
518 document.getElementById('circStrings').getString('staff.circ.holds.modifying_holds'),
519 document.getElementById('circStrings').getString('staff.circ.holds.modifying_holds.yes'),
520 document.getElementById('circStrings').getString('staff.circ.holds.modifying_holds.no'),
522 document.getElementById('commonStrings').getString('common.confirm')
525 var already_activated = [];
526 for (var i = 0; i < obj.retrieve_ids.length; i++) {
527 var hold = obj.holds_map[ obj.retrieve_ids[i].id ];
528 if ( ! get_bool( hold.frozen() ) ) {
529 already_activated.push( hold.id() );
533 hold.thaw_date(null);
535 hold = obj.flatten_copy(hold);
536 var robj = obj.network.simple_request('FM_AHR_UPDATE',[ ses(), hold ]);
537 if (typeof robj.ilsevent != 'undefined') throw(robj);
539 if (already_activated.length == 1) {
540 alert( document.getElementById('circStrings').getFormattedString('staff.circ.holds.already_activated',[already_activated[0]]) );
541 } else if (already_activated.length > 1) {
542 alert( document.getElementById('circStrings').getFormattedString('staff.circ.holds.already_activated.plural',[already_activated.join(', ')]) );
544 obj.clear_and_retrieve(true);
547 obj.error.standard_unexpected_error_alert(document.getElementById('circStrings').getString('staff.circ.holds.unexpected_error.not_likely_activated'),E);
551 'cmd_holds_edit_thaw_date' : [
555 JSAN.use('util.date');
556 function check_date(value) {
558 if (! util.date.check('YYYY-MM-DD',value) ) { throw(document.getElementById('circStrings').getString('staff.circ.holds.activation_date.invalid_date')); }
559 if (util.date.check_past('YYYY-MM-DD',value) || util.date.formatted_date(new Date(),'%F') == value ) {
560 throw(document.getElementById('circStrings').getString('staff.circ.holds.activation_date.too_early.error'));
569 var hold_ids = util.functional.map_list( obj.retrieve_ids, function(o){return o.id;}).join(', ');
570 var msg_singular = document.getElementById('circStrings').getFormattedString('staff.circ.holds.activation_date.prompt',[hold_ids]);
571 var msg_plural = document.getElementById('circStrings').getFormattedString('staff.circ.holds.activation_date.prompt',[hold_ids]);
572 var msg = obj.retrieve_ids.length > 1 ? msg_plural : msg_singular;
573 var value = 'YYYY-MM-DD';
574 var title = document.getElementById('circStrings').getString('staff.circ.holds.modifying_holds');
575 var thaw_date; var invalid = true;
577 thaw_date = window.prompt(msg,value,title);
579 invalid = ! check_date(thaw_date);
584 if (thaw_date || thaw_date == '') {
585 for (var i = 0; i < obj.retrieve_ids.length; i++) {
586 var hold = obj.holds_map[ obj.retrieve_ids[i].id ];
588 hold.thaw_date( thaw_date == '' ? null : util.date.formatted_date(thaw_date + ' 00:00:00','%{iso8601}') ); hold.ischanged('1');
589 hold = obj.flatten_copy(hold);
590 var robj = obj.network.simple_request('FM_AHR_UPDATE',[ ses(), hold ]);
591 if (typeof robj.ilsevent != 'undefined') throw(robj);
593 obj.clear_and_retrieve(true);
596 obj.error.standard_unexpected_error_alert(document.getElementById('circStrings').getString('staff.circ.holds.unexpected_error.not_likely_modified'),E);
601 'cmd_holds_retarget' : [
605 JSAN.use('util.functional');
606 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(', ') + '?';
607 var r = obj.error.yns_alert(msg,'Resetting Holds','Yes','No',null,'Check here to confirm this message');
609 for (var i = 0; i < obj.retrieve_ids.length; i++) {
610 var robj = obj.network.simple_request('FM_AHR_RESET',[ ses(), obj.retrieve_ids[i].id]);
611 if (typeof robj.ilsevent != 'undefined') throw(robj);
613 obj.clear_and_retrieve();
616 obj.error.standard_unexpected_error_alert('Holds not likely reset.',E);
622 'cmd_holds_cancel' : [
626 JSAN.use('util.functional');
627 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(', ') + '?';
628 var r = obj.error.yns_alert(msg,'Cancelling Holds','Yes','No',null,'Check here to confirm this message');
631 for (var i = 0; i < obj.retrieve_ids.length; i++) {
632 if (obj.holds_map[ obj.retrieve_ids[i].id ].transit()) {
633 transits.push( obj.retrieve_ids[i].barcode );
635 var robj = obj.network.simple_request('FM_AHR_CANCEL',[ ses(), obj.retrieve_ids[i].id]);
636 if (typeof robj.ilsevent != 'undefined') throw(robj);
638 if (transits.length > 0) {
639 var msg2 = 'For barcodes ' + transits.join(', ') + ' cancel the transits as well?';
640 var r2 = obj.error.yns_alert(msg2,'Cancelling Transits','Yes','No',null,'Check here to confirm this message');
643 for (var i = 0; i < transits.length; i++) {
644 var robj = obj.network.simple_request('FM_ATC_VOID',[ ses(), { 'barcode' : transits[i] } ]);
645 if (typeof robj.ilsevent != 'undefined') {
646 switch(Number(robj.ilsevent)) {
647 case 1225 /* TRANSIT_ABORT_NOT_ALLOWED */ :
650 case 5000 /* PERM_FAILURE */ :
659 obj.error.standard_unexpected_error_alert('Hold-transits not likely cancelled.',E);
663 obj.clear_and_retrieve();
666 obj.error.standard_unexpected_error_alert('Holds not likely cancelled.',E);
670 'cmd_retrieve_patron' : [
675 for (var i = 0; i < obj.retrieve_ids.length; i++) {
676 var patron_id = obj.retrieve_ids[i].usr;
677 if (seen[patron_id]) continue; seen[patron_id] = true;
679 xulG.url_prefix(urls.XUL_PATRON_DISPLAY), // + '?id=' + patron_id,
685 obj.error.standard_unexpected_error_alert('',E);
689 'cmd_show_catalog' : [
693 for (var i = 0; i < obj.retrieve_ids.length; i++) {
694 var htarget = obj.retrieve_ids[i].target;
695 var htype = obj.retrieve_ids[i].type;
699 opac_url = xulG.url_prefix( urls.opac_rresult ) + '?m=' + htarget;
702 opac_url = xulG.url_prefix( urls.opac_rdetail ) + '?r=' + htarget;
705 var my_acn = obj.network.simple_request( 'FM_ACN_RETRIEVE.authoritative', [ htarget ]);
706 opac_url = xulG.url_prefix( urls.opac_rdetail) + '?r=' + my_acn.record();
709 var my_acp = obj.network.simple_request( 'FM_ACP_RETRIEVE', [ htarget ]);
711 if (typeof my_acp.call_number() == 'object') {
712 my_acn = my.acp.call_number();
714 my_acn = obj.network.simple_request( 'FM_ACN_RETRIEVE.authoritative',
715 [ my_acp.call_number() ]);
717 opac_url = xulG.url_prefix( urls.opac_rdetail) + '?r=' + my_acn.record();
720 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]);
724 var content_params = {
726 'authtime' : ses('authtime'),
727 'opac_url' : opac_url,
730 xulG.url_prefix(urls.XUL_OPAC_WRAPPER),
731 {'tab_name': htype == 'M' ? 'Catalog' : 'Retrieving title...'},
736 obj.error.standard_unexpected_error_alert('',E);
743 obj.pull_from_shelf_interface.current.offset += obj.pull_from_shelf_interface.current.limit;
747 'lib_filter_checkbox' : [
750 var x_lib_type_menu = document.getElementById('lib_type_menu');
751 if (x_lib_type_menu) x_lib_type_menu.disabled = ! ev.target.checked;
752 if (obj.controller.view.lib_menu) obj.controller.view.lib_menu.disabled = ! ev.target.checked;
753 obj.clear_and_retrieve();
754 ev.target.setAttribute('checked',ev.target.checked);
761 obj.determine_hold_interface_type();
762 var x_fetch_more = document.getElementById('fetch_more');
763 var x_lib_type_menu = document.getElementById('lib_type_menu');
764 var x_lib_menu_placeholder = document.getElementById('lib_menu_placeholder');
765 var x_lib_filter_checkbox = document.getElementById('lib_filter_checkbox');
766 switch(obj.hold_interface_type) {
768 obj.render_lib_menus({'pickup_lib':true});
769 if (x_lib_type_menu) x_lib_type_menu.hidden = false;
770 if (x_lib_menu_placeholder) x_lib_menu_placeholder.hidden = false;
773 if (x_fetch_more) x_fetch_more.hidden = false;
774 if (x_lib_type_menu) x_lib_type_menu.hidden = true;
775 if (x_lib_menu_placeholder) x_lib_menu_placeholder.hidden = true;
778 obj.render_lib_menus({'pickup_lib':true,'request_lib':true});
779 if (x_lib_filter_checkbox) x_lib_filter_checkbox.hidden = false;
780 if (x_lib_type_menu) x_lib_type_menu.hidden = false;
781 if (x_lib_menu_placeholder) x_lib_menu_placeholder.hidden = false;
784 if (x_fetch_more) x_fetch_more.hidden = true;
785 if (x_lib_type_menu) x_lib_type_menu.hidden = true;
786 if (x_lib_menu_placeholder) x_lib_menu_placeholder.hidden = true;
789 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
791 if (x_lib_filter_checkbox) if (!x_lib_filter_checkbox.checked) {
792 if (x_lib_type_menu) x_lib_type_menu.disabled = true;
793 if (obj.controller.view.lib_menu) obj.controller.view.lib_menu.disabled = true;
795 obj.controller.render();
798 obj.controller.view.cmd_retrieve_patron.setAttribute('disabled','true');
799 obj.controller.view.cmd_holds_edit_pickup_lib.setAttribute('disabled','true');
800 obj.controller.view.cmd_holds_edit_phone_notify.setAttribute('disabled','true');
801 obj.controller.view.cmd_holds_edit_email_notify.setAttribute('disabled','true');
802 obj.controller.view.cmd_holds_edit_thaw_date.setAttribute('disabled','true');
803 obj.controller.view.cmd_holds_activate.setAttribute('disabled','true');
804 obj.controller.view.cmd_holds_suspend.setAttribute('disabled','true');
805 obj.controller.view.cmd_holds_edit_selection_depth.setAttribute('disabled','true');
806 obj.controller.view.cmd_show_notifications.setAttribute('disabled','true');
807 obj.controller.view.cmd_holds_retarget.setAttribute('disabled','true');
808 obj.controller.view.cmd_holds_cancel.setAttribute('disabled','true');
809 obj.controller.view.cmd_show_catalog.setAttribute('disabled','true');
814 'determine_hold_interface_type' : function() {
816 if (obj.patron_id) { /*************************************************** PATRON ******************************/
817 obj.hold_interface_type = 'patron';
818 } else if (obj.docid) { /*************************************************** RECORD ******************************/
819 obj.hold_interface_type = 'record';
820 } else if (obj.pull) { /*************************************************** PULL ******************************/
821 obj.hold_interface_type = 'pull';
822 } else if (obj.shelf) { /*************************************************** HOLD SHELF ******************************/
823 obj.hold_interface_type = 'shelf';
824 } else { /*************************************************** PULL ******************************/
825 obj.hold_interface_type = 'pull';
829 'clear_and_retrieve' : function(dont_show_me_the_list_change) {
831 this.pull_from_shelf_interface.current.offset = this.pull_from_shelf_interface._default.offset;
832 this.retrieve(dont_show_me_the_list_change);
835 'retrieve' : function(dont_show_me_the_list_change) {
836 var obj = this; var holds = [];
837 if (window.xulG && window.xulG.holds) {
838 holds = window.xulG.holds;
840 var method; var params = [ ses() ];
841 switch(obj.hold_interface_type) {
843 method = 'FM_AHR_ID_LIST_RETRIEVE_VIA_AU.authoritative';
844 params.push( obj.patron_id );
845 obj.controller.view.cmd_retrieve_patron.setAttribute('hidden','true');
848 method = 'FM_AHR_RETRIEVE_ALL_VIA_BRE';
849 params.push( obj.docid );
850 var x_lib_filter = document.getElementById('lib_filter_checkbox');
851 var x_lib_type_menu = document.getElementById('lib_type_menu');
853 if (x_lib_filter.checked) {
854 if (x_lib_type_menu && obj.controller.view.lib_menu) {
856 x[ x_lib_type_menu.value ] = obj.controller.view.lib_menu.value;
861 obj.controller.view.cmd_retrieve_patron.setAttribute('hidden','false');
864 method = 'FM_AHR_ID_LIST_ONSHELF_RETRIEVE';
865 params.push( obj.filter_lib || obj.data.list.au[0].ws_ou() );
866 obj.controller.view.cmd_retrieve_patron.setAttribute('hidden','false');
870 method = 'FM_AHR_ID_LIST_PULL_LIST';
871 params.push( obj.pull_from_shelf_interface.current.limit ); params.push( obj.pull_from_shelf_interface.current.offset );
872 //obj.controller.view.cmd_retrieve_patron.setAttribute('hidden','false');
875 var robj = obj.network.simple_request( method, params );
876 if (typeof robj.ilsevent != 'undefined') throw(robj);
877 if (method == 'FM_AHR_RETRIEVE_ALL_VIA_BRE') {
879 holds = holds.concat( robj.copy_holds );
880 holds = holds.concat( robj.volume_holds );
881 holds = holds.concat( robj.title_holds );
882 holds = holds.sort();
886 //alert('method = ' + method + ' params = ' + js2JSON(params));
889 var x_fetch_more = document.getElementById('fetch_more');
890 if (holds.length == 0) {
891 if (x_fetch_more) x_fetch_more.disabled = true;
893 if (x_fetch_more) x_fetch_more.disabled = false;
894 obj.render(holds,dont_show_me_the_list_change);
899 'render' : function(holds,dont_show_me_the_list_change) {
902 function list_append(hold_id) {
914 function gen_list_append(hold) {
916 if (typeof obj.controller.view.lib_menu == 'undefined') {
917 list_append(typeof hold == 'object' ? hold.id() : hold);
919 list_append(typeof hold == 'object' ? hold.id() : hold);
926 JSAN.use('util.exec'); var exec = new util.exec(2);
928 for (var i in holds) {
929 rows.push( gen_list_append(holds[i]) );
933 if (!dont_show_me_the_list_change) {
934 if (window.xulG && typeof window.xulG.on_list_change == 'function') {
935 try { window.xulG.on_list_change(holds); } catch(E) { this.error.sdump('D_ERROR',E); }
940 'render_lib_menus' : function(types) {
943 JSAN.use('util.widgets'); JSAN.use('util.functional'); JSAN.use('util.fm_utils');
945 var x = document.getElementById('lib_type_menu');
947 var nodes = x.firstChild.childNodes;
948 for (var i = 0; i < nodes.length; i++) nodes[i].hidden = true;
949 for (var i in types) document.getElementById(i).hidden = false;
951 x.setAttribute('oncommand','g.holds.clear_and_retrieve()');
953 x = document.getElementById('lib_menu_placeholder');
954 util.widgets.remove_children( x );
956 JSAN.use('util.file');
957 var file = new util.file('offline_ou_list');
958 if (file._file.exists()) {
959 var list_data = file.get_object(); file.close();
960 var ml = util.widgets.make_menulist( list_data[0], obj.data.list.au[0].ws_ou() );
961 ml.setAttribute('id','lib_menu');
966 obj.filter_lib = ev.target.value;
967 obj.clear_and_retrieve();
971 obj.controller.view.lib_menu = ml;
973 throw('Missing library list.\n');
977 this.error.standard_unexpected_error_alert('rendering lib menu',E);
982 dump('exiting patron.holds.js\n');