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