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