1 function $(id) { return document.getElementById(id); }
5 if (typeof JSAN == 'undefined') { throw( $("commonStrings").getString('common.jsan.missing') ); }
6 JSAN.errorLevel = "die"; // none, warn, or die
7 JSAN.addRepository('/xul/server/');
9 JSAN.use('util.error'); g.error = new util.error();
10 JSAN.use('util.network'); g.network = new util.network();
11 JSAN.use('util.date'); JSAN.use('util.money'); JSAN.use('patron.util'); JSAN.use('util.functional');
12 JSAN.use('OpenILS.data'); g.data = new OpenILS.data(); g.data.stash_retrieve();
14 g.error.sdump('D_TRACE','my_init() for patron_info_group.xul');
16 g.patron_id = xul_param('patron_id');
20 g.patron = patron.util.retrieve_au_via_id(ses(),g.patron_id);
21 if ((g.patron == null) || (typeof g.patron.ilsevent != 'undefined') ) throw(p);
26 var err_msg = $("commonStrings").getFormattedString('common.exception', ['patron/info_group.xul', E]);
27 try { g.error.sdump('D_ERROR',err_msg); } catch(E) { dump(err_msg); }
32 function my_cleanup() {
36 var err_msg = $("commonStrings").getFormattedString('common.exception', ['patron/info_group.xul', E]);
37 try { g.error.sdump('D_ERROR',err_msg); } catch(E) { dump(err_msg); }
42 function retrieve_money_summaries() {
44 JSAN.use('util.money');
45 var robj = g.network.simple_request( 'BLOB_BALANCE_OWED_VIA_USERGROUP', [ ses(), g.patron.usrgroup() ]);
46 if (typeof robj.ilsevent != 'undefined') { throw(robj); }
48 var sum = 0; /* in cents */
51 for (var i = 0; i < robj.length; i++) {
52 sum += util.money.dollars_float_to_cents_integer( robj[i].balance_owed );
53 g.group_owed[ robj[i].usr ] = robj[i].balance_owed;
56 $('total_owed').setAttribute(
58 $('patronStrings').getFormattedString( 'staff.patron.info_group.total_owed.label', [ util.money.cents_as_dollars(sum) ] )
62 alert('Error in info_group.js, retrieve_money_summaries(): ' + E);
66 function tree_init() {
68 var obscure_dob = String( g.data.hash.aous['circ.obscure_dob'] ) == 'true';
70 JSAN.use('util.list'); g.list = new util.list('patron_list');
72 var columns = g.list.fm_columns( 'au', {
73 '*' : { 'hidden' : true },
74 'au_active' : { 'hidden' : 'false' },
75 'au_barred' : { 'hidden' : 'false' },
76 'au_family_name' : { 'hidden' : 'false' },
77 'au_first_given_name' : { 'hidden' : 'false' },
78 'au_second_given_name' : { 'hidden' : 'false' },
79 'au_dob' : { 'hidden' : obscure_dob },
80 'au_master_account' : { 'hidden' : 'false' }
83 'id' : 'gl_balance_owed', 'flex' : 1, 'sort_type' : 'money',
84 'label' : $("patronStrings").getString('staff.patron.summary.group_list.column.balance_owed.label'),
85 'render' : function(my) { return my.balance_owed; }
88 'id' : 'gl_circ_count_out', 'flex' : 1, 'sort_type' : 'number',
89 'label' : $("patronStrings").getString('staff.patron.info_group.column.circs_out.label'),
90 'render' : function(my) { return my.circ_counts.out; }
93 'id' : 'gl_circ_count_overdue', 'flex' : 1, 'sort_type' : 'number',
94 'label' : $("patronStrings").getString('staff.patron.info_group.column.circs_overdue.label'),
95 'render' : function(my) { return my.circ_counts.overdue; }
98 'id' : 'gl_circ_count_claims_returned', 'flex' : 1, 'sort_type' : 'number', 'hidden' : true,
99 'label' : $("patronStrings").getString('staff.patron.info_group.column.circs_claimed_returned.label'),
100 'render' : function(my) { return my.circ_counts.claims_returned; }
103 'id' : 'gl_circ_count_long_overdue', 'flex' : 1, 'sort_type' : 'number', 'hidden' : true,
104 'label' : $("patronStrings").getString('staff.patron.info_group.column.circs_long_overdue.label'),
105 'render' : function(my) { return my.circ_counts.long_overdue; }
108 'id' : 'gl_circ_count_lost', 'flex' : 1, 'sort_type' : 'number', 'hidden' : true,
109 'label' : $("patronStrings").getString('staff.patron.info_group.column.circs_lost.label'),
110 'render' : function(my) { return my.circ_counts.lost; }
116 'retrieve_row' : function(params) {
117 var id = params.retrieve_id;
118 var row = params.row;
119 if (typeof row.my == 'undefined') row.my = {};
121 function process_and_return() {
122 if (typeof params.on_retrieve == 'function') {
123 params.on_retrieve(row);
128 patron.util.retrieve_fleshed_au_via_id( ses(), id, null, function(req) {
129 row.my.au = req.getResultObject();
130 process_and_return();
132 g.network.simple_request(
133 'FM_CIRC_COUNT_RETRIEVE_VIA_USER.authoritative',
137 var robj = req.getResultObject();
138 // robj.out / robj.overdue / robj.claims_returned / robj.long_overdue / robj.lost
139 row.my.circ_counts = robj;
141 if (g.flesh_count >= g.row_count) {
142 $('total_out').setAttribute(
144 $('patronStrings').getFormattedString(
145 'staff.patron.info_group.total_out.label',
149 $('total_overdue').setAttribute(
151 $('patronStrings').getFormattedString(
152 'staff.patron.info_group.total_overdue.label',
157 process_and_return();
159 alert('Error in info_group.js, circ count retrieve(): ' + E);
164 process_and_return();
166 'on_select' : function(ev) {
167 JSAN.use('util.functional');
168 var sel = g.list.retrieve_selection();
169 g.sel_list = util.functional.map_list(
171 function(o) { return o.getAttribute('retrieve_id'); }
173 if (g.sel_list.length > 0) {
174 $('retrieve_p').disabled = false;
175 $('retrieve_p').setAttribute('disabled','false');
176 if (g.sel_list.length > 1) {
177 $('merge_p').disabled = false;
178 $('merge_p').setAttribute('disabled','false');
180 $('clone').disabled = false;
181 $('clone').setAttribute('disabled','false');
182 $('remove').disabled = false;
183 $('remove').setAttribute('disabled','false');
184 $('move').disabled = false;
185 $('move').setAttribute('disabled','false');
187 $('retrieve_p').disabled = true;
188 $('retrieve_p').setAttribute('disabled','true');
189 $('merge_p').disabled = true;
190 $('merge_p').setAttribute('disabled','true');
191 $('clone').disabled = true;
192 $('clone').setAttribute('disabled','true');
193 $('remove').disabled = true;
194 $('remove').setAttribute('disabled','true');
195 $('move').disabled = true;
196 $('move').setAttribute('disabled','true');
201 $('list_actions').appendChild( g.list.render_list_actions() );
202 g.list.set_list_actions();
203 $('retrieve_p').disabled = true;
204 $('retrieve_p').setAttribute('disabled','true');
205 $('merge_p').disabled = true;
206 $('merge_p').setAttribute('disabled','true');
207 $('clone').disabled = true;
208 $('clone').setAttribute('disabled','true');
209 $('remove').disabled = true;
210 $('remove').setAttribute('disabled','true');
211 $('move').disabled = true;
212 $('move').setAttribute('disabled','true');
213 setTimeout( function() { $('patron_list').focus(); }, 0 );
215 alert('Error in info_group.js, tree_init(): ' + E);
221 retrieve_money_summaries();
222 retrieve_group_members();
224 alert('Error in info_group.js, refresh(): ' + E);
228 function retrieve_group_members() {
230 JSAN.use('util.functional'); JSAN.use('patron.util');
231 g.group_members = [];
232 var robj = g.network.simple_request(
233 'FM_AU_LIST_RETRIEVE_VIA_GROUP.authoritative',
234 [ ses(), g.patron.usrgroup() ]
236 if ((robj == null) || (typeof robj.ilsevent != 'undefined') ) throw(robj);
237 var ids = util.functional.filter_list( robj, function(o) { return o != g.patron_id; });
238 g.row_count = ids.length + 1;
247 function gen_func(r) {
253 'balance_owed' : g.group_owed[r]
260 funcs.push( gen_func(g.patron_id) );
261 for (var i = 0; i < ids.length; i++) {
262 funcs.push( gen_func(ids[i]) );
264 JSAN.use('util.exec'); var exec = new util.exec(4);
265 exec.on_error = function(E) { alert('Error in info_group.js, retrieve_group_members chain exec: ' + E); }
269 g.error.standard_unexpected_error_alert($("patronStrings").getString('staff.patron.info_group.retrieve_group_members.failure'),E);
273 function retrieve_patron() {
275 if (! g.sel_list ) return;
276 if (typeof window.xulG == 'object' && typeof window.xulG.new_patron_tab == 'function') {
277 for (var i = 0; i < g.sel_list.length; i++) {
279 window.xulG.new_patron_tab(
280 { 'tab_name' : $("patronStrings").getString('staff.patron.info_group.retrieve_patron.tab_name') },
282 'id' : g.sel_list[i],
283 'url_prefix' : xulG.url_prefix,
284 'new_tab' : xulG.new_tab,
285 'set_tab' : xulG.set_tab
289 g.error.standard_unexpected_error_alert($("patronStrings").getString('staff.patron.info_group.retrieve_patron.failed_retrieving_patron'),E);
294 g.error.standard_unexpected_error_alert($("patronStrings").getString('staff.patron.info_group.retrieve_patron.failed_retrieving_patrons'),E);
298 function merge_patrons() {
300 if (! g.sel_list ) return;
301 JSAN.use('patron.util');
302 var result = patron.util.merge(g.sel_list);
304 if (result != g.patron_id && g.sel_list.indexOf( g.patron_id ) != -1) {
306 { 'tab_name' : $("patronStrings").getString('staff.patron.info_group.retrieve_patron.tab_name') },
316 g.error.standard_unexpected_error_alert($("patronStrings").getString('staff.patron.info_group.merge_patrons.failed_merging_patrons'),E);
320 function clone_patron() {
321 if (! g.sel_list ) return;
323 for (var i = 0; i < g.sel_list.length; i++) {
324 var loc = xulG.url_prefix('XUL_REMOTE_BROWSER');
325 //+ '?url=' + window.escape( urls.XUL_PATRON_EDIT + '?ses='
326 //+ window.escape( ses() ) + '&clone=' + g.sel_list[i] );
327 if (typeof window.xulG == 'object' && typeof window.xulG.new_tab == 'function') xulG.new_tab(
331 'url' : urls.XUL_PATRON_EDIT, // + '?ses=' + window.escape(ses()) + '&clone=' + g.sel_list[i],
332 'show_print_button' : true ,
333 'tab_name' : $("patronStrings").getString('staff.patron.info_group.clone_patron.register_clone.tab_name'),
334 'passthru_content_params' : {
336 'clone' : g.sel_list[i],
337 'spawn_search' : spawn_search,
338 'spawn_editor' : spawn_editor,
339 'on_save' : function(p) { patron.util.work_log_patron_edit(p); refresh(); },
340 'url_prefix' : xulG.url_prefix,
341 'new_tab' : xulG.new_tab,
343 'url_prefix' : xulG.url_prefix,
344 'new_tab' : xulG.new_tab,
345 'lock_tab' : xulG.lock_tab,
346 'unlock_tab' : xulG.unlock_tab
351 g.error.standard_unexpected_error_alert($("patronStrings").getString('staff.patron.info_group.clone_patron.error_spawning_editors'),E);
355 function spawn_editor(p) {
356 var url = urls.XUL_PATRON_EDIT;
358 'spawn_search' : spawn_search,
359 'spawn_editor' : spawn_editor,
360 'on_save' : function(p) { patron.util.work_log_patron_edit(p); refresh(); },
361 'url_prefix' : xulG.url_prefix,
362 'new_tab' : xulG.new_tab,
367 var loc = xulG.url_prefix('XUL_REMOTE_BROWSER'); // + '?url=' + window.escape( url );
368 if (typeof window.xulG == 'object' && typeof window.xulG.new_tab == 'function') xulG.new_tab(
373 'show_print_button' : true ,
374 'tab_name' : $("patronStrings").getString('staff.patron.info_group.spawn_editor.editing_patron'),
375 'passthru_content_params' : passthru,
376 'url_prefix' : xulG.url_prefix,
377 'new_tab' : xulG.new_tab,
378 'lock_tab' : xulG.lock_tab,
379 'unlock_tab' : xulG.unlock_tab
385 function spawn_search(s) {
387 g.error.sdump('D_TRACE', 'Editor would like to search for: ' + js2JSON(s) );
388 if (typeof window.xulG == 'object' && typeof window.xulG.new_patron_tab == 'function')
389 xulG.new_patron_tab( {}, {'doit':1,'query':s} );
391 g.error.standard_unexpected_error_alert($("patronStrings").getString('staff.patron.info_group.spawn_search'),E);
395 function remove_patron() {
396 if (! g.sel_list ) return;
398 for (var i = 0 ; i < g.sel_list.length; i++)
399 if (g.sel_list[i] == g.patron_id)
400 msg = $("patronStrings").getString('staff.patron.info_group.remove_patron.warning_message');
402 var c = window.confirm($("patronStrings").getFormattedString('staff.patron.info_group.remove_patron.warning_message_confirm', [msg]));
404 for (var i = 0; i < g.sel_list.length; i++) {
405 var robj = g.network.simple_request('FM_AU_NEW_USERGROUP', [ ses(), g.sel_list[i], get_db_true() ]);
406 if (typeof robj.ilsevent != 'undefined') {
407 g.error.standard_unexpected_error_alert($("patronStrings").getFormattedString('staff.patron.info_group.remove_patron.error_removing_patron', [g.sel_list[i]]), robj);
410 alert($("patronStrings").getString('staff.patron.info_group.remove_patron.patrons_removed_from_group'));
411 /* FIXME - xulrunner bug if this alert comes after refresh? */
412 /* that's okay, because now that we're on a distributed database, we want human delay to mitigate race conditions */
415 alert($("patronStrings").getString('staff.patron.info_group.remove_patron.patrons_not_removed_from_group'));
419 function link_patron(direction) {
421 if (! g.sel_list ) { g.sel_list = []; g.sel_list[0] = g.patron_id; }
422 if (direction == null) throw($("patronStrings").getString('staff.patron.info_group.link_patron.null_not_allowed'));
423 var first_msg; var second_msg;
432 throw($("patronStrings").getString('staff.patron.info_group.link_patron.invalid_parameter'));
435 var barcode = window.prompt($("patronStrings").getString('staff.patron.info_group.link_patron.scan_patron_barcode'),'',first_msg);
436 if (!barcode) return;
437 JSAN.use('patron.util');
438 var patron_b = patron.util.retrieve_fleshed_au_via_barcode(ses(),barcode);
439 if (typeof patron_b.ilsevent != 'undefined') throw(patron_b);
441 if (g.sel_list.length == 0) g.sel_list[0] = g.patron_id;
442 for (var i = 0; i < g.sel_list.length; i++) {
444 var patron_a = patron.util.retrieve_fleshed_au_via_id(ses(),g.sel_list[i],null);
445 if (typeof patron_a.ilsevent != 'undefined') throw(patron_a);
448 second_msg = $("patronStrings").getFormattedString('staff.patron.info_group.link_patron.move_patron_to_new_usergroup',[patron_a.card().barcode(), patron_b.card().barcode()]);
451 second_msg = $("patronStrings").getFormattedString('staff.patron.info_group.link_patron.move_patron_to_new_usergroup',[patron_b.card().barcode(), patron_a.card().barcode()]);
455 var horizontal_interface = String( g.data.hash.aous['ui.circ.patron_summary.horizontal'] ) == 'true';
456 var top_xml = '<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" flex="1" style="overflow: auto"><description>' + second_msg + '</description>';
457 top_xml += '<hbox><spacer flex="1"/><button label="'+$("patronStrings").getString('staff.patron.info_group.link_patron.move.label')+'"';
458 top_xml += ' accesskey="'+$("patronStrings").getString('staff.patron.info_group.link_patron.move.accesskey')+'" name="fancy_submit"/>';
459 top_xml += '<button label="'+$("patronStrings").getString('staff.patron.info_group.link_patron.done.label')+'"';
460 top_xml += ' accesskey="'+$("patronStrings").getString('staff.patron.info_group.link_patron.done.accesskey')+'" name="fancy_cancel"/></hbox></vbox>';
461 var xml = '<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" flex="1" style="overflow: vertical">';
462 if (horizontal_interface) {
463 xml += '<vbox flex="1">';
465 xml += '<hbox flex="1">';
468 xml += '<vbox flex="1">';
469 xml += '<hbox><spacer flex="1"/>';
471 xml += '<image src="/xul/server/skin/media/images/patron_right_arrow.png"/>';
473 xml += '<image src="/xul/server/skin/media/images/patron_left_arrow.png"/>';
476 xml += '<iframe style="min-height: 100px" flex="1" src="' + xulG.url_prefix('XUL_PATRON_SUMMARY');
477 xml += '?show_name=1&id=' + g.sel_list[i] + '" oils_force_external="true"/>';
479 xml += '<vbox flex="1">';
482 xml += '<image src="/xul/server/skin/media/images/patron_right_arrow.png"/>';
484 xml += '<image src="/xul/server/skin/media/images/patron_left_arrow.png"/>';
486 xml += '<spacer flex="1"/></hbox>';
487 xml += '<iframe style="min-height: 100px" flex="1" src="' + xulG.url_prefix('XUL_PATRON_SUMMARY');
488 xml += '?show_name=1&id=' + patron_b.id() + '" oils_force_external="true"/>';
491 if (horizontal_interface) {
498 var bot_xml = '<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" flex="1" style="overflow: auto"><hbox>';
499 bot_xml += '</hbox></vbox>';
501 //g.data.temp_top = top_xml; g.data.stash('temp_top');
502 //g.data.temp_mid = xml; g.data.stash('temp_mid');
503 //g.data.temp_bot = bot_xml; g.data.stash('temp_bot');
504 JSAN.use('util.window'); var win = new util.window();
505 var fancy_prompt_data = win.open(
506 urls.XUL_FANCY_PROMPT,
507 //+ '?xml_in_stash=temp_mid'
508 //+ '&top_xml_in_stash=temp_top'
509 //+ '&bottom_xml_in_stash=temp_bot'
510 //+ '&title=' + window.escape('Move Patron into a Usergroup'),
511 'fancy_prompt', 'chrome,resizable,modal,width=700,height=500',
512 { 'xml' : xml, 'top_xml' : top_xml, 'bottom_xml' : bot_xml, 'title' : $("patronStrings").getString('staff.patron.info_group.link_patron.move_patron_to_usergroup')}
514 if (fancy_prompt_data.fancy_status == 'incomplete') { continue; }
519 patron_a.usrgroup( patron_b.usrgroup() );
520 patron_a.ischanged( '1' );
524 patron_b.usrgroup( patron_a.usrgroup() );
525 patron_b.ischanged( '1' );
529 var robj = g.network.simple_request('FM_AU_UPDATE',[ ses(), patron_c ]);
530 if (typeof robj.ilsevent != 'undefined') g.error.standard_unexpected_error_alert($("patronStrings").getFormattedString('staff.patron.info_group.link_patron.error_linking_patron', [g.sel_list[i]]), robj);
533 alert($("patronStrings").getString('staff.patron.info_group.link_patron.usergroups_updated'));
536 g.error.standard_unexpected_error_alert($("patronStrings").getString('staff.patron.info_group.link_patron.error_linking_patrons'),E);