LP#1086458: move up event listeners in place_hold.js
[working/Evergreen.git] / Open-ILS / xul / staff_client / server / patron / place_hold.js
1 var error;
2 var data;
3 var net;
4 var hold_usr;
5
6 function my_init() {
7     try {
8         ui_setup(); // JSAN, tab name, etc.
9         error.sdump('D_TRACE','my_init() for place_hold.xul');
10
11         JSAN.use('OpenILS.data');
12         data = new OpenILS.data();
13         data.stash_retrieve();
14
15         JSAN.use('util.network');
16         net = new util.network();
17
18         var copy_ids = xul_param('copy_ids');
19
20         window.place_hold_event_listeners = new EventListenerList();
21
22         populate_hold_usr_textbox();
23         populate_pickup_lib_menu();
24
25         window.place_hold_event_listeners.add($('request_btn'), 
26             'command',
27             function(ev) {
28                 make_request(copy_ids,false);
29             },
30             false
31         );
32         
33         set_remaining_event_listeners();
34
35     } catch(E) {
36         alert('Error in place_hold.js, my_init(): ' + E);
37     }
38 }
39
40 function my_cleanup() {
41     try {
42         window.place_hold_event_listeners.removeAll();
43     } catch(E) {
44         alert('Error in place_hold.js, my_init(): ' + E);
45     }
46 }
47
48 function make_request(copy_ids,override) {
49     try {
50
51         if (!hold_usr) {
52             alert( $('patronStrings').getString('staff.item.batch.hold.user_not_found') );
53             return;
54         }
55
56         var args = {
57             'hold_type' : $('hold_type_menu').value,
58             'patronid' : hold_usr,
59             'depth' : 0, 
60             'pickup_lib' : $('pickup_lib_menu').value
61         };
62
63         oils_lock_page();
64         $('progress_meter').hidden = false;
65         $('request_btn').disabled = true;
66         $('cancel_btn').disabled = true;
67
68         net.simple_request(
69             override
70             ? 'FM_AHR_CHECK_AND_CREATE.batch.override'
71             : 'FM_AHR_CHECK_AND_CREATE.batch',
72             [ ses(), args, copy_ids ],
73             handle_results
74         );
75
76     } catch(E) {
77         alert('Error in place_hold.js, make_request(): ' + E);
78     }
79 }
80
81 function handle_results(req) {
82     try {
83         oils_unlock_page();
84         $('progress_meter').hidden = true;
85
86         var results = req.getResultObject();
87         if(typeof(results.length) != "number") {
88             results = [results];
89         }
90
91         var successes = [];
92         var failures = {};
93         var failed_targets = [];
94         var failure_count = 0;
95
96         for (var i = 0; i < results.length; i++) {
97             var payload = results[i];
98             var target = payload.target;
99             var result = payload.result;
100             if (typeof result.length != 'undefined') {
101                 // Array; grab first exception for simplicity
102                 result = result[0];
103             }
104
105             if (typeof result == 'string' || typeof result == 'number') {
106                 successes.push( result ); // hold id's
107             } else {
108                 failure_count++;
109                 if (typeof failures[ result.textcode ] == 'undefined') {
110                     failures[ result.textcode ] = [];
111                 }
112                 failures[ result.textcode ].push( target );
113                 failed_targets.push( target );
114             }
115         }
116
117         var msg = document.createElement('description');
118         msg.appendChild(
119             document.createTextNode(
120                 $('patronStrings').getFormattedString('staff.item.batch.hold.x_holds_created',[ successes.length ])
121             )
122         );
123         $('msgs').appendChild(msg);
124
125         if (failure_count>0) {
126             $('desc').hidden = false;
127             handle_failures(failures,failed_targets);
128         }
129     } catch(E) {
130         alert('Error in place_hold.js, handle_results(): ' + E);
131     }
132 }
133
134 function handle_failures(failures,failed_targets) {
135     try {
136         for (k in failures) {
137             var err_box = document.createElement('hbox');
138             var err_msg = document.createElement('description');
139             err_box.appendChild(err_msg);
140             $('msgs').appendChild(err_box);
141             err_msg.appendChild(
142                 document.createTextNode(
143                     $('patronStrings').getFormattedString('staff.item.batch.hold.x_failed_holds',[ failures[k].length, k ])
144                 )
145             );
146             addCSSClass(err_msg,'click_link');
147             window.place_hold_event_listeners.add(err_msg, 
148                 'click',
149                 function(copy_ids) {
150                     return function(ev) {
151                         xulG.new_tab(
152                             urls.XUL_COPY_STATUS,
153                             {},
154                             {
155                                 'copy_ids' : copy_ids
156                             }
157                         );
158                     }
159                 }(failures[k]),
160                 false
161             );
162             var retry_btn = document.createElement('button');
163             retry_btn.setAttribute(
164                 'label',
165                 $('patronStrings').getString('staff.item.batch.hold.retry_btn_label')
166             );
167             err_box.appendChild(retry_btn);
168
169             window.place_hold_event_listeners.add(retry_btn, 
170                 'command',
171                 function(copy_ids) {
172                     return function(ev) {
173                         ev.target.disabled = true;
174                         ev.target.hidden = true;
175                         ev.target.nextSibling.disabled = true;
176                         ev.target.nextSibling.hidden = true;
177                         make_request(copy_ids,false);
178                     }
179                 }(failures[k]),
180                 false
181             );
182
183             var override_btn = document.createElement('button');
184             override_btn.setAttribute(
185                 'label',
186                 $('patronStrings').getString('staff.item.batch.hold.override_btn_label')
187             );
188             err_box.appendChild(override_btn);
189
190             window.place_hold_event_listeners.add(override_btn, 
191                 'command',
192                 function(copy_ids) {
193                     return function(ev) {
194                         ev.target.disabled = true;
195                         ev.target.hidden = true;
196                         ev.target.previousSibling.disabled = true;
197                         ev.target.previousSibling.hidden = true;
198                         make_request(copy_ids,true);
199                     }
200                 }(failures[k]),
201                 false
202             );
203
204         }
205     } catch(E) {
206         alert('Error in place_hold.js, handle_failures(): ' + E);
207     }
208 }
209
210 function set_remaining_event_listeners() {
211     try {
212
213         window.place_hold_event_listeners.add($('hold_type_menu'), 
214             'command',
215             function(ev) { oils_lock_page(); },
216             false
217         );
218
219         window.place_hold_event_listeners.add($('cancel_btn'), 
220             'command',
221             function(ev) { xulG.close_tab(); },
222             false
223         );
224
225     } catch(E) {
226         alert('Error in place_hold.js, set_remaining_event_listeners(): ' + E);
227     } 
228 }
229
230 function populate_hold_usr_textbox() {
231     JSAN.use('patron.util');
232     hold_usr = ses('staff_id');
233     var au_obj = patron.util.retrieve_fleshed_au_via_id(
234         ses(),
235         hold_usr,
236         ["card"]);
237     $('hold_usr_textbox').value = au_obj.card().barcode();
238     $('hold_usr_textbox').select();
239     $('hold_usr_textbox').focus();
240     $('hold_usr_name').setAttribute(
241         'value',
242         patron.util.format_name(au_obj)
243     );
244     window.place_hold_event_listeners.add($('hold_usr_textbox'), 
245         'change',
246         function(ev) {
247             try {
248                 oils_lock_page();
249                 var au_obj = patron.util.retrieve_fleshed_au_via_barcode(
250                     ses(),
251                     ev.target.value
252                 );
253                 if (typeof au_obj.textcode == 'undefined') {
254                     hold_usr = au_obj.id();
255                     $('hold_usr_name').setAttribute(
256                         'value',
257                         patron.util.format_name(au_obj)
258                     );
259                     removeCSSClass($('hold_usr_name'),'failure_text');
260                 } else {
261                     hold_usr = null;
262                     $('hold_usr_name').setAttribute(
263                         'value',
264                         $('patronStrings').getString('staff.item.batch.hold.user_not_found')
265                     );
266                     addCSSClass($('hold_usr_name'),'failure_text');
267                 }
268             } catch(E) {
269                 alert('Error in place_hold.js, hold_usr handler: ' + E);
270             }
271         },
272         false
273     );
274 }
275
276 function populate_pickup_lib_menu() {
277     try {
278         JSAN.use('util.widgets');
279         JSAN.use('util.functional');
280
281         util.widgets.remove_children('pickup_lib_menu_placeholder');
282
283         var list = util.functional.map_list(
284             data.list.aou,
285             function(o) {
286                 var sname = o.shortname();
287                 for (i = sname.length; i < 20; i++) sname += ' ';
288                 return [
289                     o.name() ? sname + ' ' + o.name() : o.shortname(),
290                     o.id(),
291                     ( !isTrue(data.hash.aout[ o.ou_type() ].can_have_users()) ),
292                     ( data.hash.aout[ o.ou_type() ].depth() * 2),
293                 ];
294             }
295         );
296         ml = util.widgets.make_menulist( list, data.list.au[0].ws_ou() );
297         ml.setAttribute('id','pickup_lib_menu');
298
299         $('pickup_lib_menu_placeholder').appendChild(ml);
300
301         window.place_hold_event_listeners.add(ml, 
302             'command',
303             function(ev) { oils_lock_page(); },
304             false
305         );
306
307     } catch(E) {
308         alert('Error in place_hold.js, populate_pickup_lib_menu(): ' + E);
309     } 
310 }
311
312 function ui_setup() {
313     if (typeof JSAN == 'undefined') {
314         throw( "The JSAN library object is missing.");
315     }
316     JSAN.errorLevel = "die"; // none, warn, or die
317     JSAN.addRepository('/xul/server/');
318     JSAN.use('util.error');
319     error = new util.error();
320
321     if (typeof xulG == 'object' && typeof xulG.set_tab_name == 'function') {
322         try {
323             xulG.set_tab_name(
324                 $('patronStrings').getString('staff.item.batch.hold.tab_name')
325             );
326         } catch(E) {
327             alert(E);
328         }
329     }
330
331 }