]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/xul/staff_client/server/patron/info_notes.xul
LP#1086458: clean up after event listeners in circ/patron interface
[working/Evergreen.git] / Open-ILS / xul / staff_client / server / patron / info_notes.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_win" width="700" height="550"
22     onload="try{ my_init(); font_helper(); persist_helper(); } catch(E) { alert(E); }"
23     onunload="try { my_cleanup(); persist_helper_cleanup(); } catch(E) { alert(E); }"
24     xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
25
26     <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
27     <!-- BEHAVIOR -->
28     <script type="text/javascript">
29         var myPackageDir = 'open_ils_staff_client';
30         var IAMXUL = true;
31         var g = {};
32     </script>
33     <scripts id="openils_util_scripts"/>
34
35     <script type="text/javascript" src="/xul/server/main/JSAN.js"/>
36     <script>
37     <![CDATA[
38
39         function $(id) { return document.getElementById(id); }
40
41         function my_init() {
42             try {
43                 if (typeof JSAN == 'undefined') { throw( $("commonStrings").getString('common.jsan.missing') ); }
44                 JSAN.errorLevel = "die"; // none, warn, or die
45                 JSAN.addRepository('/xul/server/');
46
47                 JSAN.use('util.error'); g.error = new util.error();
48                 JSAN.use('util.network'); g.network = new util.network();
49                 JSAN.use('util.date'); JSAN.use('util.money'); JSAN.use('patron.util');
50                 JSAN.use('OpenILS.data'); g.data = new OpenILS.data(); g.data.init({'via':'stash'});
51
52                 g.error.sdump('D_TRACE','my_init() for patron_info.xul');
53
54                 g.patron_id = xul_param('patron_id');
55
56                 g.new_note = false;
57
58                 g.info_notes_event_listeners = new EventListenerList();
59
60                 refresh();
61
62             } catch(E) {
63                 var err_msg = $("commonStrings").getFormattedString('common.exception', ['patron/info_notes.xul', E]);
64                 try { g.error.sdump('D_ERROR',err_msg); } catch(E) { dump(err_msg); }
65                 alert(err_msg);
66             }
67         }
68
69         function my_cleanup() {
70             try {
71                 g.info_notes_event_listeners.removeAll();
72             } catch(E) {
73                 var err_msg = $("commonStrings").getFormattedString('common.exception', ['patron/info_notes.xul', E]);
74                 try { g.error.sdump('D_ERROR',err_msg); } catch(E) { dump(err_msg); }
75                 alert(err_msg);
76             }
77         }
78
79         function refresh() {
80             retrieve_notes(); render_notes();
81         }
82
83         function retrieve_notes() {
84             if (g.new_note) {
85                 g.notes = g.network.simple_request('FM_AUN_RETRIEVE_ALL.authoritative',[ ses(), { 'patronid' : g.patron_id } ]).reverse();
86                 g.new_note = false;
87             } else {
88                 g.notes = g.network.simple_request('FM_AUN_RETRIEVE_ALL.authoritative',[ ses(), { 'patronid' : g.patron_id } ]).reverse();
89             }
90         }
91
92         function apply(node,field,value) {
93             util.widgets.apply(
94                 node,'name',field,
95                 function(n) {
96                     switch(n.nodeName) {
97                         case 'description' : n.appendChild( document.createTextNode( value ) ); break;
98                         case 'label' : n.value = value; break;
99                         default : n.value = value; break;
100                     }
101                 }
102             );
103         }
104
105         function render_notes() {
106             JSAN.use('util.widgets'); util.widgets.remove_children('notes_panel');
107             var np = $('notes_panel');
108             var hbox = document.createElement('hbox'); np.appendChild(hbox);
109             var btn = document.createElement('button'); hbox.appendChild(btn);
110             btn.setAttribute('label', $("patronStrings").getString('staff.patron.info_notes.render_notes.add_new_note.label'));
111             btn.setAttribute('accesskey', $("patronStrings").getString('staff.patron.info_notes.render_notes.add_new_note.accesskey'));
112             btn.setAttribute('oncommand','new_note()');
113
114             for (var i = 0; i < g.notes.length; i++) {
115
116                 /* template */
117                 var node = $('note_template').cloneNode(true); np.appendChild(node); node.hidden = false;
118                 apply(node,'create_date',util.date.formatted_date(g.notes[i].create_date(),'%{localized}'));
119                 util.widgets.apply(node,'name','create_date',
120                     function(n){n.setAttribute("tooltiptext", $("patronStrings").getFormattedString('staff.patron.info_notes.render_notes.tooltiptext', [g.notes[i].id(), g.notes[i].creator()]));}
121                 );
122                 apply(node,'title',g.notes[i].title());
123                 if (get_bool(g.notes[i].pub())) {
124                     apply(node, 'pub', $("patronStrings").getString('staff.patron.info_notes.render_notes.pub.patron_visible'));
125                 } else {
126                     apply(node, 'pub', $("patronStrings").getString('staff.patron.info_notes.render_notes.pub.staff_only') );
127                 }
128                 apply(node,'value',g.notes[i].value());
129                 apply(node,'id',g.notes[i].id());
130                 apply(node,'creator',g.notes[i].creator());
131
132                 /* button bar */
133                 var hb = document.createElement('hbox');
134                 np.appendChild(hb);
135                 var btn1 = document.createElement('button');
136                 hb.appendChild(btn1);
137                 btn1.setAttribute('label',$("patronStrings").getString('staff.patron.info_notes.render_notes.btn1.delete_note.label'));
138                 btn1.setAttribute('image',"/xul/server/skin/media/images/up_arrow.gif");
139
140                 g.info_notes_event_listeners.add(btn1, 
141                     'command',
142                     function(id){ 
143                         return function() { 
144                             var r = g.error.yns_alert(
145                                 $("patronStrings").getFormattedString('staff.patron.info_notes.render_notes.delete_note_message',[g.notes[id].title(), util.date.formatted_date(g.notes[id].create_date(),'%{localized}')]),
146                                 $("patronStrings").getString('staff.patron.info_notes.render_notes.delete_note_title'),
147                                 $("commonStrings").getString('common.yes'),
148                                 $("commonStrings").getString('common.no'),
149                                 null,
150                                 $("commonStrings").getString('common.check_to_confirm')
151                             ); 
152                             if (r == 0) {
153                                 g.network.simple_request('FM_AUN_DELETE',[ses(),g.notes[id].id()]);
154                                 setTimeout(function(){ 
155                                     g.new_note = true;
156                                     alert($("patronStrings").getString('staff.patron.info_notes.render_notes.note_deleted'));
157                                     refresh();
158                                 },0);
159                             }
160                         }
161                      }
162                     (i), false
163                     );
164                     var btn2 = document.createElement('button');
165                     hb.appendChild(btn2);
166                     btn2.setAttribute('label',$("patronStrings").getString('staff.patron.info_notes.render_notes.btn2.print_note.label'));
167                     btn2.setAttribute('image',"/xul/server/skin/media/images/up_arrow.gif");
168
169                     g.info_notes_event_listeners.add(btn2, 
170                         'command',
171                         function(id){ return function() { 
172                             try {
173                                 JSAN.use('patron.util'); 
174                                 var patron_obj = patron.util.retrieve_fleshed_au_via_id(ses(),g.patron_id);
175                                 var staff_obj = patron.util.retrieve_name_via_id( ses(), g.notes[id].creator() );
176                                 JSAN.use('util.print');
177                                 var p = new util.print();
178                                 p.simple(
179                                     '<hr/>'
180                                     + '<p>'+ $("patronStrings").getString('staff.patron.info_notes.render_notes.pertaining_to') + ' ' + 
181                                         patron.util.format_name( patron_obj ) + ' : ' 
182                                     + patron_obj.card().barcode() + '</p>'
183                                     + '<p><b>"' + g.notes[id].title() + '"</b>'
184                                     + $("patronStrings").getFormattedString('staff.patron.info_notes.render_notes.created_on', [util.date.formatted_date(g.notes[id].create_date(),'%{localized}'), staff_obj[0], g.data.hash.aou[ staff_obj[3] ].shortname()]) 
185                                     + '</p><p>'
186                                     + g.notes[id].value()
187                                     + '</p><hr/>'
188                                 );
189                             } catch(E) {
190                                 g.error.standard_unexpected_error_alert($("patronStrings").getFormattedString('staff.patron.info_notes.render_notes.printing_note_num', [g.notes[id].id()]), E);
191                             }
192                         }
193                     }(i), false
194                 );
195             }
196
197         }
198         
199         function new_note() {
200             try {
201                 var xml = '<groupbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" flex="1">';
202                 xml += '<caption label="'+$("patronStrings").getString('staff.patron.info_notes.new_note.label')+'"/><grid flex="1"><columns><column/><column flex="1"/></columns><rows><row>';
203                 xml += '<label value="'+$("patronStrings").getString('staff.patron.info_notes.new_note.patron_visible.value')+'"/><checkbox id="pub" name="fancy_data"/></row>';
204                 xml += '<row><label value="'+$("patronStrings").getString('staff.patron.info_notes.new_note.title.value')+'"/><textbox id="title" name="fancy_data" context="clipboard"/></row>';
205                 xml += '<row><label value="'+$("patronStrings").getString('staff.patron.info_notes.new_note.note.value')+'"/><textbox multiline="true" id="note" name="fancy_data" context="clipboard"/></row>';
206                 var show_initials = String( g.data.hash.aous['ui.staff.require_initials'] ) == 'true';
207                 if (show_initials) {
208                     xml += '<row><label value="'+$("patronStrings").getString('staff.patron.info_notes.new_note.initials.value')+'"/><textbox id="initials" name="fancy_required_data" context="clipboard"/></row>';
209                 }
210                 xml += '<row><spacer/><hbox><button label="'+$("patronStrings").getString('staff.patron.info_notes.new_note.cancel.label')+'" name="fancy_cancel"';
211                 xml += ' accesskey="'+$("patronStrings").getString('staff.patron.info_notes.new_note.cancel.accesskey')+'"/>';
212                 xml += '<button label="'+$("patronStrings").getString('staff.patron.info_notes.new_note.add.label')+'"';
213                 xml += ' accesskey="'+$("patronStrings").getString('staff.patron.info_notes.new_note.add.accesskey')+'" name="fancy_submit"/></hbox></row></rows></grid></groupbox>';
214                 JSAN.use('util.window'); var win = new util.window();
215                 var fancy_prompt_data = win.open(
216                     urls.XUL_FANCY_PROMPT,
217                     'fancy_prompt', 'chrome,resizable,modal,width=700,height=500',
218                     { 'xml' : xml, 'focus' : 'title', 'title' : $("patronStrings").getString('staff.patron.info_notes.new_note.add_note_title') }
219                 );
220                 if (fancy_prompt_data.fancy_status == 'complete') {
221                     //alert(js2JSON(g.data.fancy_prompt_data));
222                     var note = new aun();
223                     note.isnew(1);
224                     note.title( fancy_prompt_data.title );
225                     if (fancy_prompt_data.initials) {
226                         fancy_prompt_data.note = fancy_prompt_data.note 
227                             + $("commonStrings").getFormattedString('staff.initials.format',[fancy_prompt_data.initials,util.date.formatted_date(new Date(),'%F'), ses('ws_ou_shortname')]);
228                     }
229                     note.value( fancy_prompt_data.note );
230                     note.pub( get_bool( fancy_prompt_data.pub ) ? get_db_true() : get_db_false() );
231                     note.usr( g.patron_id );
232                     var r = g.network.simple_request('FM_AUN_CREATE',[ ses(), note ]);
233                     if (typeof r.ilsevent != 'undefined') throw(r);
234                     setTimeout(function(){
235                         g.new_note = true;
236                         refresh();
237                     },0);
238                 }
239             } catch(E) {
240                 g.error.standard_unexpected_error_alert($("patronStrings").getString('staff.patron.info_notes.new_note.note_not_created'),E);
241             }
242         }
243
244     ]]>
245     </script>
246     
247     <messagecatalog id="patronStrings" src="/xul/server/locale/<!--#echo var='locale'-->/patron.properties"/>
248
249     <stack hidden="true" id="note_template" flex="1" minheight="50px">
250         <groupbox flex="1" style="background-color: black;"/>
251         <groupbox flex="1" style="background-color: #FFDE00; -moz-border-radius-topright: 35px;" >
252             <hbox>
253                 <description name="title" class="copyable" style="font-weight: bold"/>
254                 <spacer flex="1"/>
255                 <description name="create_date" class="copyable" style="font-weight: bold"/>
256                 <description name="pub" class="copyable" style="font-weight: bold"/>
257             </hbox>
258             <description class="copyable" name="value"/>
259         </groupbox>
260     </stack>
261
262     <vbox flex="1" class="my_overflow" id="notes_panel">
263     </vbox>
264
265
266 </window>
267