]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/xul/staff_client/server/patron/hold_details.js
This completes the morphing of the Hold Notifications interface into a dual Notes...
[Evergreen.git] / Open-ILS / xul / staff_client / server / patron / hold_details.js
1 function $(id) { return document.getElementById(id); }
2
3 function my_init() {
4     try {
5         netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
6         if (typeof JSAN == 'undefined') { throw( $("commonStrings").getString('common.jsan.missing') ); }
7         JSAN.errorLevel = "die"; // none, warn, or die
8         JSAN.addRepository('/xul/server/');
9
10         dojo.require('openils.PermaCrud');
11         JSAN.use('util.error'); g.error = new util.error();
12         JSAN.use('util.network'); g.network = new util.network();
13         JSAN.use('util.date'); JSAN.use('util.money'); JSAN.use('patron.util');
14         JSAN.use('OpenILS.data'); g.data = new OpenILS.data(); g.data.init({'via':'stash'});
15
16         g.error.sdump('D_TRACE','my_init() for hold_notices.xul');
17
18         g.pcrud = new openils.PermaCrud({authtoken :ses()});
19
20         init_list();
21
22         if (xulG.ahr_id) fetch_and_render_all();
23
24     } catch(E) {
25         try { g.error.standard_unexpected_error_alert('/xul/server/patron/hold_notices.xul',E); } catch(E) { alert('FIXME: ' + js2JSON(E)); }
26     }
27 }
28
29 function fetch_and_render_all() {
30     try {
31         if (!xulG.ahr_id) { alert('boo'); return; }
32
33         fetch_hold();
34
35         if (xulG.patron_rendered_elsewhere) {
36             // Hide patron line
37         } else {
38             render_patron();
39         }
40
41         a_list_of_one();
42
43         var x = document.getElementById('bib_brief_box'); while (x.firstChild) x.removeChild(x.lastChild);
44         var bib_brief = document.createElement('iframe'); x.appendChild(bib_brief);
45         bib_brief.setAttribute('flex',1);
46         bib_brief.setAttribute('src',urls.XUL_BIB_BRIEF); 
47         get_contentWindow(bib_brief).xulG = { 'docid' : g.ahr.target() };
48
49         retrieve_notes(); render_notes();
50
51         retrieve_notifications(); render_notifications();
52
53     } catch(E) {
54         alert('Error in hold_details.js, fetch_and_render_all(): ' + E);
55     }
56 }
57
58 function fetch_hold(id) {
59     try {
60         g.ahr_id = xulG.ahr_id;
61         g.ahr = g.network.simple_request('FM_AHR_RETRIEVE',[ ses(), g.ahr_id ]);
62         if (typeof g.ahr.ilsevent != 'undefined') { throw(g.ahr); }
63         g.ahr = g.ahr[0];
64     } catch(E) {
65         alert('Error in hold_details.js, fetch_hold(): ' + E);
66     }
67 }
68
69 function render_patron() {
70     if (g.ahr.usr()) {
71         JSAN.use('patron.util'); 
72         var au_obj = patron.util.retrieve_fleshed_au_via_id( ses(), g.ahr.usr() );
73         
74         $('patron_name').setAttribute('value', 
75             ( au_obj.prefix() ? au_obj.prefix() + ' ' : '') + 
76             au_obj.family_name() + ', ' + 
77             au_obj.first_given_name() + ' ' +
78             ( au_obj.second_given_name() ? au_obj.second_given_name() + ' ' : '' ) +
79             ( au_obj.suffix() ? au_obj.suffix() : '')
80             + ' : ' + au_obj.card().barcode() 
81         );
82     }
83 }
84
85 function init_list() {
86     JSAN.use('circ.util');
87     var columns = circ.util.hold_columns( 
88         { 
89             'status' : { 'hidden' : true },
90             'request_time' : { 'hidden' : false },
91             'pickup_lib_shortname' : { 'hidden' : false },
92             'current_copy' : { 'hidden' : false },
93             'phone_notify' : { 'hidden' : false },
94             'email_notify' : { 'hidden' : false },
95         } 
96     );
97     JSAN.use('util.list'); g.list = new util.list('holds_list');
98     g.list.init(
99         {
100             'columns' : columns,
101             'map_row_to_columns' : circ.util.std_map_row_to_columns(),
102             'retrieve_row' : function(params) {
103                 var row = params.row;
104                 try {
105                     switch(row.my.ahr.hold_type()) {
106                         case 'M' :
107                             row.my.mvr = g.network.request(
108                                 api.MODS_SLIM_METARECORD_RETRIEVE.app,
109                                 api.MODS_SLIM_METARECORD_RETRIEVE.method,
110                                 [ row.my.ahr.target() ]
111                             );
112                         break;
113                         default:
114                             row.my.mvr = g.network.simple_request(
115                                 'MODS_SLIM_RECORD_RETRIEVE.authoritative',
116                                 [ row.my.ahr.target() ]
117                             );
118                             if (row.my.ahr.current_copy()) {
119                                 row.my.acp = g.network.simple_request( 'FM_ACP_RETRIEVE', [ row.my.ahr.current_copy() ]);
120                             }
121                         break;
122                     }
123                 } catch(E) {
124                     g.error.sdump('D_ERROR','retrieve_row: ' + E );
125                 }
126                 if (typeof params.on_retrieve == 'function') {
127                     params.on_retrieve(row);
128                 }
129                 return row;
130             },
131         }
132     );
133 }
134
135 function a_list_of_one() {
136     g.list.clear();
137     g.list.append(
138         {
139             'row' : {
140                 'my' : {
141                     'ahr' : g.ahr,
142                 }
143             },
144             'no_auto_select' : true,
145         }
146     );
147 }
148
149 function retrieve_notifications() {
150     g.notifications = g.network.simple_request('FM_AHN_RETRIEVE_VIA_AHR',[ ses(), g.ahr_id ]).reverse();
151 }
152
153 function retrieve_notes() {
154     g.notes = g.pcrud.search('ahrn',{'hold':g.ahr_id});
155     g.notes = g.notes.reverse();
156 }
157
158 function apply(node,field,value) {
159     util.widgets.apply(
160         node,'name',field,
161         function(n) {
162             switch(n.nodeName) {
163                 case 'description' : n.appendChild( document.createTextNode( value ) ); break;
164                 case 'label' : n.value = value; break;
165                 default : n.value = value; break;
166             }
167         }
168     );
169 }
170
171 function render_notifications() {
172     JSAN.use('util.widgets'); util.widgets.remove_children('notifications_panel');
173     var np = $('notifications_panel');
174
175     for (var i = 0; i < g.notifications.length; i++) {
176
177         /* template */
178         var node = $('notification_template').cloneNode(true); np.appendChild(node); node.hidden = false;
179         util.widgets.apply(node,'name','notify_time',
180             function(n){
181                 n.setAttribute(
182                     "tooltiptext", 
183                     $("patronStrings").getFormattedString('staff.patron.hold_notices.tooltiptext',[g.notifications[i].id(), g.notifications[i].hold(), g.notifications[i].notify_staff()])
184                 );
185             }
186         );
187         apply(node,'method',g.notifications[i].method() ? g.notifications[i].method() : '');
188         apply(node,'note',g.notifications[i].note() ? g.notifications[i].note() : '');
189         apply(node,'notify_time',g.notifications[i].notify_time() ? g.notifications[i].notify_time().toString().substr(0,10) : '');
190     }
191
192 }
193
194 function render_notes() {
195     JSAN.use('util.widgets'); util.widgets.remove_children('notes_panel');
196     var np = $('notes_panel');
197
198     for (var i = 0; i < g.notes.length; i++) {
199
200         /* template */
201         var node = $('note_template').cloneNode(true); np.appendChild(node); node.hidden = false;
202         util.widgets.apply(node,'name','create_date',
203             function(n){
204                 n.setAttribute(
205                     "tooltiptext", 
206                     $("patronStrings").getFormattedString('staff.patron.hold_notes.tooltiptext',[g.notes[i].id(), g.notes[i].hold(), g.notes[i].staff()])
207                 );
208             }
209         );
210         apply(node,'title',g.notes[i].title() ? g.notes[i].title() : '');
211         apply(node,'note',g.notes[i].body() ? g.notes[i].body() : '');
212         //apply(node,'create_date',g.notes[i].create_date() ? g.notes[i].create_date().toString().substr(0,10) : ''); // FIXME -- need to rework date display more intelligently
213         apply(node,'pub',get_bool( g.notes[i].pub() ) ? $("patronStrings").getString('staff.patron.hold_notes.public') : $("patronStrings").getString('staff.patron.hold_notes.private') )
214         apply(node,'slip',get_bool( g.notes[i].slip() ) ? $("patronStrings").getString('staff.patron.hold_notes.print_on_slip') : $("patronStrings").getString('staff.patron.hold_notes.no_print_on_slip') )
215         apply(node,'staff',get_bool( g.notes[i].staff() ) ? $("patronStrings").getString('staff.patron.hold_notes.by_staff') : $("patronStrings").getString('staff.patron.hold_notes.by_patron') )
216     }
217
218 }
219
220
221 function new_notification() {
222     try {
223         netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect UniversalBrowserWrite");
224         var xml = '<groupbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" flex="1">';
225         xml += '<caption label="' + $("patronStrings").getString('staff.patron.hold_notices.new_notification_record') + '"/><grid flex="1"><columns><column/><column flex="1"/></columns><rows>';
226         xml += '<row><label value="' + $("patronStrings").getString('staff.patron.hold_notices.method') + '"/><textbox id="method" name="fancy_data" context="clipboard"/></row>';
227         xml += '<row><label value="' + $("patronStrings").getString('staff.patron.hold_notices.note') + '"/><textbox multiline="true" id="note" name="fancy_data" context="clipboard"/></row>';
228         xml += '<row><spacer/><hbox><button label="' + $("patronStrings").getString('staff.patron.hold_notices.cancel') + '" name="fancy_cancel" ';
229         xml += 'accesskey="' + $("patronStrings").getString('staff.patron.hold_notices.cancel_accesskey') + '"/>';
230         xml += '<button label="' + $("patronStrings").getString('staff.patron.hold_notices.add_notif_record') + '" ';
231         xml += 'accesskey="' + $("patronStrings").getString('staff.patron.hold_notices.add_notif_record_accesskey') + '" name="fancy_submit"/></hbox></row></rows></grid></groupbox>';
232         JSAN.use('util.window'); var win = new util.window();
233         var fancy_prompt_data = win.open(
234             urls.XUL_FANCY_PROMPT,
235             'fancy_prompt', 'chrome,resizable,modal,width=700,height=500',
236             { 'xml' : xml, 'focus' : 'method', 'title' : $("patronStrings").getString('staff.patron.hold_notices.add_notif_record') }
237         );
238         if (fancy_prompt_data.fancy_status == 'complete') {
239             var notification = new ahn();
240             notification.isnew(1);
241             notification.hold(g.ahr_id);
242             notification.method( fancy_prompt_data.method );
243             notification.note( fancy_prompt_data.note );
244             var r = g.network.simple_request('FM_AHN_CREATE',[ ses(), notification ]); if (typeof r.ilsevent != 'undefined') throw(r);
245             setTimeout(function(){fetch_and_render_all();},0);
246         }
247     } catch(E) {
248         g.error.standard_unexpected_error_alert($("patronStrings").getString('staff.patron.hold_notices.new_notification.not_created'),E);
249         setTimeout(function(){fetch_and_render_all();},0);
250     }
251 }
252
253 function new_note() {
254     try {
255         netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect UniversalBrowserWrite");
256         var xml = '<groupbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" flex="1">';
257         xml += '<caption label="' + $("patronStrings").getString('staff.patron.hold_notes.new_note') + '"/><grid flex="1"><columns><column/><column flex="1"/></columns><rows>';
258         xml += '<row><label value="' + $('patronStrings').getString('staff.patron.hold_notes.new_note.public') + '"/><checkbox id="pub" name="fancy_data" checked="false"/></row>';
259         xml += '<row><label value="' + $('patronStrings').getString('staff.patron.hold_notes.new_note.slip') + '"/><checkbox id="slip" name="fancy_data" checked="false"/></row>';
260         xml += '<row><label value="' + $("patronStrings").getString('staff.patron.hold_notes.title') + '"/><textbox id="title" name="fancy_data" context="clipboard"/></row>';
261         xml += '<row><label value="' + $("patronStrings").getString('staff.patron.hold_notes.body') + '"/><textbox multiline="true" id="note" name="fancy_data" context="clipboard"/></row>';
262         xml += '<row><spacer/><hbox><button label="' + $("patronStrings").getString('staff.patron.hold_notes.cancel') + '" name="fancy_cancel" ';
263         xml += 'accesskey="' + $("patronStrings").getString('staff.patron.hold_notes.cancel_accesskey') + '"/>';
264         xml += '<button label="' + $("patronStrings").getString('staff.patron.hold_notes.add_note') + '" ';
265         xml += 'accesskey="' + $("patronStrings").getString('staff.patron.hold_notes.add_note.accesskey') + '" name="fancy_submit"/></hbox></row></rows></grid></groupbox>';
266         JSAN.use('util.window'); var win = new util.window();
267         var fancy_prompt_data = win.open(
268             urls.XUL_FANCY_PROMPT,
269             'fancy_prompt', 'chrome,resizable,modal,width=700,height=500',
270             { 'xml' : xml, 'focus' : 'title', 'title' : $("patronStrings").getString('staff.patron.hold_notes.add_note') }
271         );
272         if (fancy_prompt_data.fancy_status == 'complete') {
273             var note = new ahrn();
274             note.isnew(1);
275             note.hold(g.ahr_id);
276             note.title( fancy_prompt_data.title );
277             note.body( fancy_prompt_data.note );
278             note.pub( get_bool( fancy_prompt_data.pub ) ? get_db_true() : get_db_false() );
279             note.slip( get_bool( fancy_prompt_data.slip ) ? get_db_true() : get_db_false() );
280             note.staff( true );
281             //var r = g.network.simple_request('FM_AHN_CREATE',[ ses(), notification ]); if (typeof r.ilsevent != 'undefined') throw(r);
282             g.pcrud.create(note);
283             setTimeout(function(){fetch_and_render_all();},0);
284         }
285     } catch(E) {
286         g.error.standard_unexpected_error_alert($("patronStrings").getString('staff.patron.hold_notes.new_note.not_created'),E);
287         setTimeout(function(){fetch_and_render_all();},0);
288     }
289 }
290
291