2 <!-- Application: Evergreen Staff Client -->
3 <!-- Screen: Patron Display -->
5 <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
7 <?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
8 <?xml-stylesheet href="chrome://open_ils_staff_client/skin/global.css" type="text/css"?>
9 <?xml-stylesheet href="/xul/server/skin/global.css" type="text/css"?>
10 <?xml-stylesheet href="/xul/server/skin/patron_display.css" type="text/css"?>
12 <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
14 <!DOCTYPE window PUBLIC "" ""[
15 <!--#include virtual="/opac/locale/${locale}/lang.dtd"-->
18 <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
20 <?xul-overlay href="/xul/server/OpenILS/util_overlay.xul"?>
22 <window id="patron_info_group_win" width="700" height="550"
23 onload="try{ my_init(); font_helper(); } catch(E) { alert(E); }"
24 xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
26 <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
28 <script type="text/javascript">var myPackageDir = 'open_ils_staff_client'; var IAMXUL = true; var g = {};</script>
29 <scripts id="openils_util_scripts"/>
31 <script type="text/javascript" src="/xul/server/main/JSAN.js"/>
35 function $(id) { return document.getElementById(id); }
39 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
40 if (typeof JSAN == 'undefined') { throw( $("commonStrings").getString('common.jsan.missing') ); }
41 JSAN.errorLevel = "die"; // none, warn, or die
42 JSAN.addRepository('/xul/server/');
44 JSAN.use('util.error'); g.error = new util.error();
45 JSAN.use('util.network'); g.network = new util.network();
46 JSAN.use('util.date'); JSAN.use('util.money'); JSAN.use('patron.util'); JSAN.use('util.functional');
47 JSAN.use('OpenILS.data'); g.data = new OpenILS.data(); g.data.init({'via':'stash'});
49 g.error.sdump('D_TRACE','my_init() for patron_info_group.xul');
51 g.patron_id = xul_param('patron_id');
58 var err_msg = $("commonStrings").getFormattedString('common.exception', ['patron/info_group.xul', E]);
59 try { g.error.sdump('D_ERROR',err_msg); } catch(E) { dump(err_msg); }
64 function tree_init() {
65 JSAN.use('OpenILS.data'); g.OpenILS = {};
66 g.OpenILS.data = new OpenILS.data(); g.OpenILS.data.init({'via':'stash'});
67 var obscure_dob = String( g.OpenILS.data.hash.aous['circ.obscure_dob'] ) == 'true';
69 JSAN.use('util.list'); g.list = new util.list('patron_list');
71 JSAN.use('patron.util');
72 var columns = patron.util.columns(
74 'active' : { 'hidden' : 'false' },
75 'barred' : { 'hidden' : 'false' },
76 'family_name' : { 'hidden' : 'false' },
77 'first_given_name' : { 'hidden' : 'false' },
78 'second_given_name' : { 'hidden' : 'false' },
79 'dob' : { 'hidden' : obscure_dob },
80 'master_account' : { 'hidden' : 'false' },
86 'map_row_to_columns' : patron.util.std_map_row_to_columns(),
87 'retrieve_row' : function(params) {
88 var id = params.retrieve_id;
89 var au_obj = patron.util.retrieve_fleshed_au_via_id( ses(), id );
92 if (typeof row.my == 'undefined') row.my = {};
94 if (typeof params.on_retrieve == 'function') {
95 params.on_retrieve(row);
99 'on_select' : function(ev) {
100 JSAN.use('util.functional');
101 var sel = g.list.retrieve_selection();
102 g.sel_list = util.functional.map_list(
104 function(o) { return o.getAttribute('retrieve_id'); }
106 if (g.sel_list.length > 0) {
107 $('retrieve_p').disabled = false;
108 $('retrieve_p').setAttribute('disabled','false');
109 if (g.sel_list.length > 1) {
110 $('merge_p').disabled = false;
111 $('merge_p').setAttribute('disabled','false');
113 $('clone').disabled = false;
114 $('clone').setAttribute('disabled','false');
115 $('remove').disabled = false;
116 $('remove').setAttribute('disabled','false');
117 $('move').disabled = false;
118 $('move').setAttribute('disabled','false');
120 $('retrieve_p').disabled = true;
121 $('retrieve_p').setAttribute('disabled','true');
122 $('merge_p').disabled = true;
123 $('merge_p').setAttribute('disabled','true');
124 $('clone').disabled = true;
125 $('clone').setAttribute('disabled','true');
126 $('remove').disabled = true;
127 $('remove').setAttribute('disabled','true');
128 $('move').disabled = true;
129 $('move').setAttribute('disabled','true');
134 $('retrieve_p').disabled = true;
135 $('retrieve_p').setAttribute('disabled','true');
136 $('merge_p').disabled = true;
137 $('merge_p').setAttribute('disabled','true');
138 $('clone').disabled = true;
139 $('clone').setAttribute('disabled','true');
140 $('remove').disabled = true;
141 $('remove').setAttribute('disabled','true');
142 $('move').disabled = true;
143 $('move').setAttribute('disabled','true');
144 setTimeout( function() { $('patron_list').focus(); }, 0 );
148 retrieve_group_members();
151 function retrieve_group_members() {
153 JSAN.use('util.functional'); JSAN.use('patron.util');
154 g.group_members = [];
155 var p = patron.util.retrieve_au_via_id(ses(),g.patron_id);
156 if ((p == null) || (typeof p.ilsevent != 'undefined') ) throw(p);
157 var robj = g.network.simple_request(
158 'FM_AU_LIST_RETRIEVE_VIA_GROUP.authoritative',
159 [ ses(), p.usrgroup() ]
161 if ((robj == null) || (typeof robj.ilsevent != 'undefined') ) throw(robj);
162 var ids = util.functional.filter_list( robj, function(o) { return o != g.patron_id; });
168 function gen_func(r) {
170 g.list.append( { 'retrieve_id' : r, 'row' : {} } );
174 funcs.push( gen_func(g.patron_id) );
175 for (var i = 0; i < ids.length; i++) {
176 funcs.push( gen_func(ids[i]) );
178 JSAN.use('util.exec'); var exec = new util.exec(4);
182 g.error.standard_unexpected_error_alert($("patronStrings").getString('staff.patron.info_group.retrieve_group_members.failure'),E);
186 function retrieve_patron() {
188 if (! g.sel_list ) return;
189 if (typeof window.xulG == 'object' && typeof window.xulG.new_patron_tab == 'function') {
190 for (var i = 0; i < g.sel_list.length; i++) {
192 window.xulG.new_patron_tab(
193 { 'tab_name' : $("patronStrings").getString('staff.patron.info_group.retrieve_patron.tab_name') },
195 'id' : g.sel_list[i],
196 'url_prefix' : xulG.url_prefix,
197 'new_tab' : xulG.new_tab,
198 'set_tab' : xulG.set_tab
202 g.error.standard_unexpected_error_alert($("patronStrings").getString('staff.patron.info_group.retrieve_patron.failed_retrieving_patron'),E);
207 g.error.standard_unexpected_error_alert($("patronStrings").getString('staff.patron.info_group.retrieve_patron.failed_retrieving_patrons'),E);
211 function merge_patrons() {
213 if (! g.sel_list ) return;
214 JSAN.use('patron.util');
215 var result = patron.util.merge(g.sel_list);
217 if (result != g.patron_id && g.sel_list.indexOf( g.patron_id ) != -1) {
219 { 'tab_name' : $("patronStrings").getString('staff.patron.info_group.retrieve_patron.tab_name') },
229 g.error.standard_unexpected_error_alert($("patronStrings").getString('staff.patron.info_group.merge_patrons.failed_merging_patrons'),E);
233 function clone_patron() {
234 if (! g.sel_list ) return;
236 for (var i = 0; i < g.sel_list.length; i++) {
237 var loc = xulG.url_prefix( urls.XUL_REMOTE_BROWSER );
238 //+ '?url=' + window.escape( urls.XUL_PATRON_EDIT + '?ses='
239 //+ window.escape( ses() ) + '&clone=' + g.sel_list[i] );
240 if (typeof window.xulG == 'object' && typeof window.xulG.new_tab == 'function') xulG.new_tab(
244 'url' : urls.XUL_PATRON_EDIT, // + '?ses=' + window.escape(ses()) + '&clone=' + g.sel_list[i],
245 'show_print_button' : true ,
246 'tab_name' : $("patronStrings").getString('staff.patron.info_group.clone_patron.register_clone.tab_name'),
247 'passthru_content_params' : {
249 'clone' : g.sel_list[i],
250 'spawn_search' : spawn_search,
251 'spawn_editor' : spawn_editor,
252 'on_save' : function() { refresh(); },
253 'url_prefix' : xulG.url_prefix,
254 'new_tab' : xulG.new_tab,
256 'url_prefix' : xulG.url_prefix,
257 'new_tab' : xulG.new_tab,
262 g.error.standard_unexpected_error_alert($("patronStrings").getString('staff.patron.info_group.clone_patron.error_spawning_editors'),E);
266 function spawn_editor(p) {
267 var url = urls.XUL_PATRON_EDIT;
269 'spawn_search' : spawn_search,
270 'spawn_editor' : spawn_editor,
271 'on_save' : function() { refresh(); },
272 'url_prefix' : xulG.url_prefix,
273 'new_tab' : xulG.new_tab,
278 var loc = xulG.url_prefix( urls.XUL_REMOTE_BROWSER ); // + '?url=' + window.escape( url );
279 if (typeof window.xulG == 'object' && typeof window.xulG.new_tab == 'function') xulG.new_tab(
284 'show_print_button' : true ,
285 'tab_name' : $("patronStrings").getString('staff.patron.info_group.spwan_editor.editing_patron'),
286 'passthru_content_params' : passthru,
287 'url_prefix' : xulG.url_prefix,
288 'new_tab' : xulG.new_tab,
294 function spawn_search(s) {
296 g.error.sdump('D_TRACE', 'Editor would like to search for: ' + js2JSON(s) );
297 if (typeof window.xulG == 'object' && typeof window.xulG.new_patron_tab == 'function')
298 xulG.new_patron_tab( {}, {'doit':1,'query':s} );
300 g.error.standard_unexpected_error_alert($("patronStrings").getString('staff.patron.info_group.spwan_search'),E);
304 function remove_patron() {
305 if (! g.sel_list ) return;
307 for (var i = 0 ; i < g.sel_list.length; i++)
308 if (g.sel_list[i] == g.patron_id)
309 msg = $("patronStrings").getString('staff.patron.info_group.remove_patron.warning_message');
311 var c = window.confirm($("patronStrings").getFormattedString('staff.patron.info_group.remove_patron.warning_message_confirm', [msg]));
313 for (var i = 0; i < g.sel_list.length; i++) {
314 var robj = g.network.simple_request('FM_AU_NEW_USERGROUP', [ ses(), g.sel_list[i], get_db_true() ]);
315 if (typeof robj.ilsevent != 'undefined') {
316 g.error.standard_unexpected_error_alert($("patronStrings").getFormattedString('staff.patron.info_group.remove_patron.error_removing_patron', [g.sel_list[i]]), robj);
319 alert($("patronStrings").getString('staff.patron.info_group.remove_patron.patrons_removed_from_group'));
320 /* FIXME - xulrunner bug if this alert comes after refresh? */
321 /* that's okay, because now that we're on a distributed database, we want human delay to mitigate race conditions */
324 alert($("patronStrings").getString('staff.patron.info_group.remove_patron.patrons_not_removed_from_group'));
328 function link_patron(direction) {
330 if (! g.sel_list ) { g.sel_list = []; g.sel_list[0] = g.patron_id; }
331 if (direction == null) throw($("patronStrings").getString('staff.patron.info_group.link_patron.null_not_allowed'));
332 var first_msg; var second_msg;
341 throw($("patronStrings").getString('staff.patron.info_group.link_patron.invalid_parameter'));
344 var barcode = window.prompt($("patronStrings").getString('staff.patron.info_group.link_patron.scan_patron_barcode'),'',first_msg);
345 if (!barcode) return;
346 JSAN.use('patron.util');
347 var patron_b = patron.util.retrieve_fleshed_au_via_barcode(ses(),barcode);
348 if (typeof patron_b.ilsevent != 'undefined') throw(patron_b);
350 if (g.sel_list.length == 0) g.sel_list[0] = g.patron_id;
351 for (var i = 0; i < g.sel_list.length; i++) {
353 var patron_a = patron.util.retrieve_fleshed_au_via_id(ses(),g.sel_list[i]);
354 if (typeof patron_a.ilsevent != 'undefined') throw(patron_a);
357 second_msg = $("patronStrings").getFormattedString('staff.patron.info_group.link_patron.move_patron_to_new_usergroup',[patron_a.card().barcode(), patron_b.card().barcode()]);
360 second_msg = $("patronStrings").getFormattedString('staff.patron.info_group.link_patron.move_patron_to_new_usergroup',[patron_b.card().barcode(), patron_a.card().barcode()]);
364 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
365 var top_xml = '<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" flex="1" style="overflow: auto"><description>' + second_msg + '</description>';
366 top_xml += '<hbox><spacer flex="1"/><button label="'+$("patronStrings").getString('staff.patron.info_group.link_patron.move.label')+'"';
367 top_xml += ' accesskey="'+$("patronStrings").getString('staff.patron.info_group.link_patron.move.accesskey')+'" name="fancy_submit"/>';
368 top_xml += '<button label="'+$("patronStrings").getString('staff.patron.info_group.link_patron.done.label')+'"';
369 top_xml += ' accesskey="'+$("patronStrings").getString('staff.patron.info_group.link_patron.done.accesskey')+'" name="fancy_cancel"/></hbox></vbox>';
370 var xml = '<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" flex="1" style="overflow: vertical"><hbox flex="1">';
372 xml += '<vbox flex="1">';
373 xml += '<hbox><spacer flex="1"/>';
375 xml += '<image src="/xul/server/skin/media/images/patron_right_arrow.png"/>';
377 xml += '<image src="/xul/server/skin/media/images/patron_left_arrow.png"/>';
380 xml += '<iframe style="min-height: 100px" flex="1" src="' + xulG.url_prefix( urls.XUL_PATRON_SUMMARY );
381 xml += '?show_name=1&id=' + g.sel_list[i] + '"/>';
383 xml += '<vbox flex="1">';
386 xml += '<image src="/xul/server/skin/media/images/patron_right_arrow.png"/>';
388 xml += '<image src="/xul/server/skin/media/images/patron_left_arrow.png"/>';
390 xml += '<spacer flex="1"/></hbox>';
391 xml += '<iframe style="min-height: 100px" flex="1" src="' + xulG.url_prefix( urls.XUL_PATRON_SUMMARY );
392 xml += '?show_name=1&id=' + patron_b.id() + '"/>';
395 xml += '</hbox></vbox>';
397 var bot_xml = '<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" flex="1" style="overflow: auto"><hbox>';
398 bot_xml += '</hbox></vbox>';
400 //g.data.temp_top = top_xml; g.data.stash('temp_top');
401 //g.data.temp_mid = xml; g.data.stash('temp_mid');
402 //g.data.temp_bot = bot_xml; g.data.stash('temp_bot');
403 JSAN.use('util.window'); var win = new util.window();
404 var fancy_prompt_data = win.open(
405 urls.XUL_FANCY_PROMPT,
406 //+ '?xml_in_stash=temp_mid'
407 //+ '&top_xml_in_stash=temp_top'
408 //+ '&bottom_xml_in_stash=temp_bot'
409 //+ '&title=' + window.escape('Move Patron into a Usergroup'),
410 'fancy_prompt', 'chrome,resizable,modal,width=700,height=500',
411 { 'xml' : xml, 'top_xml' : top_xml, 'bottom_xml' : bot_xml, 'title' : $("patronStrings").getString('staff.patron.info_group.link_patron.move_patron_to_usergroup')}
413 if (fancy_prompt_data.fancy_status == 'incomplete') { continue; }
418 patron_a.usrgroup( patron_b.usrgroup() );
419 patron_a.ischanged( '1' );
423 patron_b.usrgroup( patron_a.usrgroup() );
424 patron_b.ischanged( '1' );
428 var robj = g.network.simple_request('FM_AU_UPDATE',[ ses(), patron_c ]);
429 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);
432 alert($("patronStrings").getString('staff.patron.info_group.link_patron.usergroups_updated'));
435 g.error.standard_unexpected_error_alert($("patronStrings").getString('staff.patron.info_group.link_patron.error_linking_patrons'),E);
443 <messagecatalog id="patronStrings" src="/xul/server/locale/<!--#echo var='locale'-->/patron.properties"/>
445 <commandset id="info_group_cmds">
446 <command id="clone" accesskey="&staff.patron.info_group.clone.accesskey;" label="&staff.patron.info_group.clone.label;" oncommand="try{clone_patron();}catch(E){alert('FIXME:'+E);}"/>
447 <command id="remove" accesskey="&staff.patron.info_group.remove.accesskey;" label="&staff.patron.info_group.remove.label;" oncommand="try{remove_patron();}catch(E){alert('FIXME:'+E);}"/>
448 <command id="move" accesskey="&staff.patron.info_group.move.accesskey;" label="&staff.patron.info_group.move.label;" oncommand="try{link_patron(true);}catch(E){alert('FIXME:'+E);}"/>
449 <command id="add" accesskey="&staff.patron.info_group.add.accesskey;" label="&staff.patron.info_group.add.label;" oncommand="try{link_patron(false);}catch(E){alert('FIXME:'+E);}"/>
450 <command id="retrieve_p" label="&staff.patron.info_group.retrieve_p.label;" accesskey="&staff.patron.info_group.retrieve_p.accesskey;" oncommand="try{retrieve_patron();}catch(E){alert(E);}"/>
451 <command id="merge_p" label="&staff.patron.info_group.merge_patrons.label;" accesskey="&staff.patron.info_group.merge_patrons.accesskey;" oncommand="try{merge_patrons();}catch(E){alert(E);}"/>
454 <popupset id="info_group_popupset">
455 <popup id="info_group_actions" position="at_pointer">
456 <menuitem command="clone" />
457 <menuitem command="remove" />
458 <menuitem command="move" />
459 <menuitem command="add" />
460 <menuitem command="retrieve_p" />
461 <menuitem command="merge_p" />
465 <vbox flex="1" class="my_overflow" id="group_panel">
467 <caption label="&staff.patron.info_group.group_member.label;"/>
471 <menu label="&staff.patron.info_group.choose_an_action.label;" accesskey="&staff.patron.info_group.choose_an_action.accesskey;" value="0">
473 <menuitem command="clone" />
474 <menuitem command="remove" />
475 <menuitem command="move" />
476 <menuitem command="add" />
477 <menuitem command="retrieve_p" />
478 <menuitem command="merge_p" />
483 <tree id="patron_list" flex="1" enableColumnDrag="true" seltype="multiple" context="info_group_actions"/>