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