]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/xul/staff_client/server/patron/info_group.xul
Another monster patch. Change each tab to 4 spaces in the staff client xul, html...
[working/Evergreen.git] / Open-ILS / xul / staff_client / server / patron / info_group.xul
1 <?xml version="1.0"?>
2 <!-- Application: Evergreen Staff Client -->
3 <!-- Screen: Patron Display -->
4
5 <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
6 <!-- STYLESHEETS -->
7 <?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
8 <?xml-stylesheet href="/xul/server/skin/global.css" type="text/css"?>
9 <?xml-stylesheet href="/xul/server/skin/patron_display.css" type="text/css"?>
10
11 <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
12 <!-- LOCALIZATION -->
13 <!DOCTYPE window PUBLIC "" ""[
14     <!--#include virtual="/opac/locale/${locale}/lang.dtd"-->
15 ]>
16
17 <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
18 <!-- OVERLAYS -->
19 <?xul-overlay href="/xul/server/OpenILS/util_overlay.xul"?>
20
21 <window id="patron_info_group_win" width="700" height="550"
22     onload="try{ my_init(); font_helper(); } catch(E) { alert(E); }"
23     xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
24
25     <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
26     <!-- BEHAVIOR -->
27         <script type="text/javascript">var myPackageDir = 'open_ils_staff_client'; var IAMXUL = true; var g = {};</script>
28         <scripts id="openils_util_scripts"/>
29
30     <script type="text/javascript" src="/xul/server/main/JSAN.js"/>
31     <script>
32     <![CDATA[
33
34         function $(id) { return document.getElementById(id); }
35
36         function my_init() {
37             try {
38                 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
39                 if (typeof JSAN == 'undefined') { throw( $("commonStrings").getString('common.jsan.missing') ); }
40                 JSAN.errorLevel = "die"; // none, warn, or die
41                 JSAN.addRepository('/xul/server/');
42
43                 JSAN.use('util.error'); g.error = new util.error();
44                 JSAN.use('util.network'); g.network = new util.network();
45                 JSAN.use('util.date'); JSAN.use('util.money'); JSAN.use('patron.util'); JSAN.use('util.functional');
46                 JSAN.use('OpenILS.data'); g.data = new OpenILS.data(); g.data.init({'via':'stash'});
47
48                 g.error.sdump('D_TRACE','my_init() for patron_info_group.xul');
49
50                 g.patron_id = xul_param('patron_id');
51
52                 tree_init();
53
54                 refresh();
55
56             } catch(E) {
57                 var err_msg = $("commonStrings").getFormattedString('common.exception', ['patron/info_group.xul', E]);
58                 try { g.error.sdump('D_ERROR',err_msg); } catch(E) { dump(err_msg); }
59                 alert(err_msg);
60             }
61         }
62
63         function tree_init() {
64                 JSAN.use('OpenILS.data'); g.OpenILS = {}; 
65                 g.OpenILS.data = new OpenILS.data(); g.OpenILS.data.init({'via':'stash'});
66                 var obscure_dob = String( g.OpenILS.data.hash.aous['circ.obscure_dob'] ) == 'true';
67
68                 JSAN.use('util.list'); g.list = new util.list('patron_list');
69
70                 JSAN.use('patron.util');
71                 var columns = patron.util.columns(
72                     {
73                         'active' : { 'hidden' : 'false' },
74                         'barred' : { 'hidden' : 'false' },
75                         'family_name' : { 'hidden' : 'false' },
76                         'first_given_name' : { 'hidden' : 'false' },
77                         'second_given_name' : { 'hidden' : 'false' },
78                         'dob' : { 'hidden' : obscure_dob },
79                         'master_account' : { 'hidden' : 'false' },
80                     }
81                 );
82                 g.list.init(
83                     {
84                         'columns' : columns,
85                         'map_row_to_columns' : patron.util.std_map_row_to_columns(),
86                         'retrieve_row' : function(params) {
87                             var id = params.retrieve_id;
88                             var au_obj = patron.util.retrieve_fleshed_au_via_id( ses(), id );
89
90                             var row = params.row;
91                             if (typeof row.my == 'undefined') row.my = {};
92                             row.my.au = au_obj;
93                             if (typeof params.on_retrieve == 'function') {
94                                 params.on_retrieve(row);
95                             }
96                             return row;
97                         },
98                         'on_select' : function(ev) {
99                             JSAN.use('util.functional');
100                             var sel = g.list.retrieve_selection();
101                             g.sel_list = util.functional.map_list(
102                                 sel,
103                                 function(o) { return o.getAttribute('retrieve_id'); }
104                             );
105                             if (g.sel_list.length > 0) {
106                                 $('retrieve_p').disabled = false;
107                                 $('retrieve_p').setAttribute('disabled','false');
108                                 if (g.sel_list.length > 1) {
109                                     $('merge_p').disabled = false;
110                                     $('merge_p').setAttribute('disabled','false');
111                                 }
112                                 $('clone').disabled = false;
113                                 $('clone').setAttribute('disabled','false');
114                                 $('remove').disabled = false;
115                                 $('remove').setAttribute('disabled','false');
116                                 $('move').disabled = false;
117                                 $('move').setAttribute('disabled','false');
118                             } else {
119                                 $('retrieve_p').disabled = true;
120                                 $('retrieve_p').setAttribute('disabled','true');
121                                 $('merge_p').disabled = true;
122                                 $('merge_p').setAttribute('disabled','true');
123                                 $('clone').disabled = true;
124                                 $('clone').setAttribute('disabled','true');
125                                 $('remove').disabled = true;
126                                 $('remove').setAttribute('disabled','true');
127                                 $('move').disabled = true;
128                                 $('move').setAttribute('disabled','true');
129                             }
130                         }
131                     }
132                 );
133                 $('retrieve_p').disabled = true;
134                 $('retrieve_p').setAttribute('disabled','true');
135                 $('merge_p').disabled = true;
136                 $('merge_p').setAttribute('disabled','true');
137                 $('clone').disabled = true;
138                 $('clone').setAttribute('disabled','true');
139                 $('remove').disabled = true;
140                 $('remove').setAttribute('disabled','true');
141                 $('move').disabled = true;
142                 $('move').setAttribute('disabled','true');
143                 setTimeout( function() { $('patron_list').focus(); }, 0 );
144         }
145
146         function refresh() {
147             retrieve_group_members();
148         }
149
150         function retrieve_group_members() {
151             try {
152                 JSAN.use('util.functional'); JSAN.use('patron.util');
153                 g.group_members = [];
154                 var p = patron.util.retrieve_au_via_id(ses(),g.patron_id);
155                 if ((p == null) || (typeof p.ilsevent != 'undefined') ) throw(p);
156                 var robj = g.network.simple_request(
157                     'FM_AU_LIST_RETRIEVE_VIA_GROUP.authoritative',
158                     [ ses(), p.usrgroup() ]
159                 );
160                 if ((robj == null) || (typeof robj.ilsevent != 'undefined') ) throw(robj);
161                 var ids = util.functional.filter_list( robj, function(o) { return o != g.patron_id; });
162
163                 g.list.clear();
164
165                 var funcs = [];
166
167                     function gen_func(r) {
168                         return function() {
169                             g.list.append( { 'retrieve_id' : r, 'row' : {} } );
170                         }
171                     }
172
173                 funcs.push( gen_func(g.patron_id) );
174                 for (var i = 0; i < ids.length; i++) {
175                     funcs.push( gen_func(ids[i]) );
176                 }
177                 JSAN.use('util.exec'); var exec = new util.exec(4);
178                 exec.chain( funcs );
179
180             } catch(E) {
181                 g.error.standard_unexpected_error_alert($("patronStrings").getString('staff.patron.info_group.retrieve_group_members.failure'),E);
182             }
183         }
184
185         function retrieve_patron() {
186             try {
187                 if (! g.sel_list ) return;
188                 if (typeof window.xulG == 'object' && typeof window.xulG.new_patron_tab == 'function') {
189                     for (var i = 0; i < g.sel_list.length; i++) {    
190                         try {
191                             window.xulG.new_patron_tab(
192                                 { 'tab_name' : $("patronStrings").getString('staff.patron.info_group.retrieve_patron.tab_name') }, 
193                                 { 
194                                     'id' : g.sel_list[i],
195                                     'url_prefix' : xulG.url_prefix,
196                                     'new_tab' : xulG.new_tab,
197                                     'set_tab' : xulG.set_tab
198                                 }
199                             );
200                         } catch(E) {
201                             g.error.standard_unexpected_error_alert($("patronStrings").getString('staff.patron.info_group.retrieve_patron.failed_retrieving_patron'),E);
202                         }
203                     }
204                 }
205             } catch(E) {
206                 g.error.standard_unexpected_error_alert($("patronStrings").getString('staff.patron.info_group.retrieve_patron.failed_retrieving_patrons'),E);
207             }
208         }
209
210         function merge_patrons() {
211             try {
212                 if (! g.sel_list ) return;
213                 JSAN.use('patron.util'); 
214                 var result = patron.util.merge(g.sel_list);
215                 if (result) {
216                     if (result != g.patron_id && g.sel_list.indexOf( g.patron_id ) != -1) {
217                         xulG.set_patron_tab(
218                             { 'tab_name' : $("patronStrings").getString('staff.patron.info_group.retrieve_patron.tab_name') }, 
219                             {
220                                 'id' : result
221                             } 
222                         );
223                     } else {
224                         refresh();
225                     }
226                 }
227             } catch(E) {
228                 g.error.standard_unexpected_error_alert($("patronStrings").getString('staff.patron.info_group.merge_patrons.failed_merging_patrons'),E);
229             }
230         }
231
232         function clone_patron() {
233             if (! g.sel_list ) return;
234             try {
235                 for (var i = 0; i < g.sel_list.length; i++) {    
236                     var loc = xulG.url_prefix( urls.XUL_REMOTE_BROWSER ); 
237                         //+ '?url=' + window.escape( urls.XUL_PATRON_EDIT + '?ses=' 
238                         //+ window.escape( ses() ) + '&clone=' + g.sel_list[i] );
239                     if (typeof window.xulG == 'object' && typeof window.xulG.new_tab == 'function') xulG.new_tab(
240                         loc, 
241                         {}, 
242                         { 
243                             'url' : urls.XUL_PATRON_EDIT, // + '?ses=' + window.escape(ses()) + '&clone=' + g.sel_list[i],
244                             'show_print_button' : true , 
245                             'tab_name' : $("patronStrings").getString('staff.patron.info_group.clone_patron.register_clone.tab_name'),
246                             'passthru_content_params' : {
247                                 'ses' : ses(),
248                                 'clone' : g.sel_list[i],
249                                 'spawn_search' : spawn_search,
250                                 'spawn_editor' : spawn_editor,
251                                 'on_save' : function() { refresh(); },
252                                 'url_prefix' : xulG.url_prefix,
253                                 'new_tab' : xulG.new_tab,
254                             },
255                             'url_prefix' : xulG.url_prefix,
256                             'new_tab' : xulG.new_tab,
257                         }
258                     );
259                 }
260             } catch(E) {
261                 g.error.standard_unexpected_error_alert($("patronStrings").getString('staff.patron.info_group.clone_patron.error_spawning_editors'),E);
262             }
263         }
264
265         function spawn_editor(p) {
266             var url = urls.XUL_PATRON_EDIT;
267             var passthru = {
268                 'spawn_search' : spawn_search,
269                 'spawn_editor' : spawn_editor,
270                 'on_save' : function() { refresh(); },
271                 'url_prefix' : xulG.url_prefix,
272                 'new_tab' : xulG.new_tab,
273             };
274             for (var i in p) {
275                 passthru[i] = p[i];
276             }
277             var loc = xulG.url_prefix( urls.XUL_REMOTE_BROWSER ); // + '?url=' + window.escape( url );
278             if (typeof window.xulG == 'object' && typeof window.xulG.new_tab == 'function') xulG.new_tab(
279                 loc, 
280                 {}, 
281                 { 
282                     'url' : url,
283                     'show_print_button' : true , 
284                     'tab_name' : $("patronStrings").getString('staff.patron.info_group.spwan_editor.editing_patron'),
285                     'passthru_content_params' : passthru,
286                     'url_prefix' : xulG.url_prefix,
287                     'new_tab' : xulG.new_tab,
288                 }
289             );
290
291         }
292
293         function spawn_search(s) {
294             try {
295                 g.error.sdump('D_TRACE', 'Editor would like to search for: ' + js2JSON(s) ); 
296                 if (typeof window.xulG == 'object' && typeof window.xulG.new_patron_tab == 'function') 
297                     xulG.new_patron_tab( {}, {'doit':1,'query':s} );
298             } catch(E) {
299                 g.error.standard_unexpected_error_alert($("patronStrings").getString('staff.patron.info_group.spwan_search'),E);
300             }
301         }
302
303         function remove_patron() {
304             if (! g.sel_list ) return;
305             var msg = '';
306             for (var i = 0 ; i < g.sel_list.length; i++)
307                 if (g.sel_list[i] == g.patron_id)
308                     msg = $("patronStrings").getString('staff.patron.info_group.remove_patron.warning_message');
309                     
310             var c = window.confirm($("patronStrings").getFormattedString('staff.patron.info_group.remove_patron.warning_message_confirm', [msg]));
311             if (c) {
312                 for (var i = 0; i < g.sel_list.length; i++) {    
313                     var robj = g.network.simple_request('FM_AU_NEW_USERGROUP', [ ses(), g.sel_list[i], get_db_true() ]);
314                     if (typeof robj.ilsevent != 'undefined') {
315                         g.error.standard_unexpected_error_alert($("patronStrings").getFormattedString('staff.patron.info_group.remove_patron.error_removing_patron', [g.sel_list[i]]), robj);
316                     }
317                 }
318                 alert($("patronStrings").getString('staff.patron.info_group.remove_patron.patrons_removed_from_group')); 
319                 /* FIXME - xulrunner bug if this alert comes after refresh? */
320                 /* that's okay, because now that we're on a distributed database, we want human delay to mitigate race conditions */
321                 refresh();
322             } else {
323                 alert($("patronStrings").getString('staff.patron.info_group.remove_patron.patrons_not_removed_from_group'));
324             }
325         }
326
327         function link_patron(direction) {
328             try {
329                 if (! g.sel_list ) { g.sel_list = []; g.sel_list[0] = g.patron_id; }
330                 if (direction == null) throw($("patronStrings").getString('staff.patron.info_group.link_patron.null_not_allowed'));
331                 var first_msg; var second_msg;
332                 switch(direction) {
333                     case true:
334                         first_msg = "-->";
335                         break;
336                     case false:
337                         first_msg = "<--";
338                         break;
339                     default:
340                         throw($("patronStrings").getString('staff.patron.info_group.link_patron.invalid_parameter'));
341                         break;
342                 }
343                 var barcode = window.prompt($("patronStrings").getString('staff.patron.info_group.link_patron.scan_patron_barcode'),'',first_msg);
344                 if (!barcode) return;
345                 JSAN.use('patron.util');
346                 var patron_b = patron.util.retrieve_fleshed_au_via_barcode(ses(),barcode);
347                 if (typeof patron_b.ilsevent != 'undefined') throw(patron_b);
348
349                 if (g.sel_list.length == 0) g.sel_list[0] = g.patron_id;
350                 for (var i = 0; i < g.sel_list.length; i++) {    
351
352                     var patron_a = patron.util.retrieve_fleshed_au_via_id(ses(),g.sel_list[i]);
353                     if (typeof patron_a.ilsevent != 'undefined') throw(patron_a);
354                     switch(direction) {
355                         case true:
356                             second_msg = $("patronStrings").getFormattedString('staff.patron.info_group.link_patron.move_patron_to_new_usergroup',[patron_a.card().barcode(), patron_b.card().barcode()]);
357                             break;
358                         case false:
359                             second_msg = $("patronStrings").getFormattedString('staff.patron.info_group.link_patron.move_patron_to_new_usergroup',[patron_b.card().barcode(), patron_a.card().barcode()]);
360                             break;
361                     }
362
363                     netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
364                     var top_xml = '<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" flex="1" style="overflow: auto"><description>' + second_msg + '</description>';
365                     top_xml += '<hbox><spacer flex="1"/><button label="'+$("patronStrings").getString('staff.patron.info_group.link_patron.move.label')+'"';
366                     top_xml += ' accesskey="'+$("patronStrings").getString('staff.patron.info_group.link_patron.move.accesskey')+'" name="fancy_submit"/>';
367                     top_xml += '<button label="'+$("patronStrings").getString('staff.patron.info_group.link_patron.done.label')+'"';
368                     top_xml += ' accesskey="'+$("patronStrings").getString('staff.patron.info_group.link_patron.done.accesskey')+'" name="fancy_cancel"/></hbox></vbox>';
369                     var xml = '<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" flex="1" style="overflow: vertical"><hbox flex="1">';
370                     /************/
371                     xml += '<vbox flex="1">';
372                     xml += '<hbox><spacer flex="1"/>';
373                     if (direction) {
374                         xml += '<image src="/xul/server/skin/media/images/patron_right_arrow.png"/>';
375                     } else {
376                         xml += '<image src="/xul/server/skin/media/images/patron_left_arrow.png"/>';
377                     }
378                     xml += '</hbox>';
379                     xml += '<iframe style="min-height: 100px" flex="1" src="' + xulG.url_prefix( urls.XUL_PATRON_SUMMARY );
380                     xml += '?show_name=1&amp;id=' + g.sel_list[i] + '"/>';
381                     xml += '</vbox>';
382                     xml += '<vbox flex="1">';
383                     xml += '<hbox>';
384                     if (direction) {
385                         xml += '<image src="/xul/server/skin/media/images/patron_right_arrow.png"/>';
386                     } else {
387                         xml += '<image src="/xul/server/skin/media/images/patron_left_arrow.png"/>';
388                     }
389                     xml += '<spacer flex="1"/></hbox>';
390                     xml += '<iframe style="min-height: 100px" flex="1" src="' + xulG.url_prefix( urls.XUL_PATRON_SUMMARY );
391                     xml += '?show_name=1&amp;id=' + patron_b.id() + '"/>';
392                     xml += '</vbox>';
393                     /************/
394                     xml += '</hbox></vbox>';
395                     
396                     var bot_xml = '<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" flex="1" style="overflow: auto"><hbox>';
397                     bot_xml += '</hbox></vbox>';
398         
399                     //g.data.temp_top = top_xml; g.data.stash('temp_top');
400                     //g.data.temp_mid = xml; g.data.stash('temp_mid');
401                     //g.data.temp_bot = bot_xml; g.data.stash('temp_bot');
402                     JSAN.use('util.window'); var win = new util.window();
403                     var fancy_prompt_data = win.open(
404                         urls.XUL_FANCY_PROMPT,
405                         //+ '?xml_in_stash=temp_mid'
406                         //+ '&top_xml_in_stash=temp_top'
407                         //+ '&bottom_xml_in_stash=temp_bot'
408                         //+ '&title=' + window.escape('Move Patron into a Usergroup'),
409                         'fancy_prompt', 'chrome,resizable,modal,width=700,height=500',
410                         { 'xml' : xml, 'top_xml' : top_xml, 'bottom_xml' : bot_xml, 'title' : $("patronStrings").getString('staff.patron.info_group.link_patron.move_patron_to_usergroup')}
411                     );
412                     if (fancy_prompt_data.fancy_status == 'incomplete') { continue; }
413                     else {
414                         var patron_c;
415                         switch(direction) {
416                             case true:
417                                 patron_a.usrgroup( patron_b.usrgroup() );
418                                 patron_a.ischanged( '1' );
419                                 patron_c = patron_a;
420                             break;
421                             case false:
422                                 patron_b.usrgroup( patron_a.usrgroup() );
423                                 patron_b.ischanged( '1' );
424                                 patron_c = patron_b;
425                             break;
426                         }
427                         var robj = g.network.simple_request('FM_AU_UPDATE',[ ses(), patron_c ]);
428                         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);
429                     }
430                 }
431                 alert($("patronStrings").getString('staff.patron.info_group.link_patron.usergroups_updated'));
432                 refresh();
433             } catch(E) {
434                 g.error.standard_unexpected_error_alert($("patronStrings").getString('staff.patron.info_group.link_patron.error_linking_patrons'),E);
435                 refresh();
436             }
437         }
438
439     ]]>
440     </script>
441     
442     <messagecatalog id="patronStrings" src="/xul/server/locale/<!--#echo var='locale'-->/patron.properties"/>
443
444     <commandset id="info_group_cmds">
445         <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);}"/>
446         <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);}"/>
447         <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);}"/>    
448         <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);}"/>    
449         <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);}"/>
450         <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);}"/>
451     </commandset>
452
453     <popupset id="info_group_popupset">
454         <popup id="info_group_actions" position="at_pointer"> 
455             <menuitem command="clone" />
456             <menuitem command="remove" />
457             <menuitem command="move" />
458             <menuitem command="add" />
459             <menuitem command="retrieve_p" />
460             <menuitem command="merge_p" />
461         </popup>
462     </popupset>
463
464     <vbox flex="1" class="my_overflow" id="group_panel">
465         <groupbox flex="1">
466             <caption label="&staff.patron.info_group.group_member.label;"/>
467             <hbox>
468                 <spacer flex="1"/>
469                 <menubar id="ml">
470                     <menu label="&staff.patron.info_group.choose_an_action.label;" accesskey="&staff.patron.info_group.choose_an_action.accesskey;" value="0">
471                         <menupopup>
472                             <menuitem command="clone" />
473                             <menuitem command="remove" />
474                             <menuitem command="move" />
475                             <menuitem command="add" />
476                             <menuitem command="retrieve_p" />
477                             <menuitem command="merge_p" />
478                         </menupopup>
479                     </menu>
480                 </menubar>
481             </hbox>
482             <tree id="patron_list" flex="1" enableColumnDrag="true" seltype="multiple" context="info_group_actions"/>
483         </groupbox>
484     </vbox>
485
486
487 </window>
488