]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/xul/staff_client/server/patron/staged.js
Improve Firefox/XULRunner Support
[working/Evergreen.git] / Open-ILS / xul / staff_client / server / patron / staged.js
1 var list; var error; var net; var rows; var row_id_usrname_map; var menu_lib;
2
3 function $(id) { return document.getElementById(id); }
4
5 //// parent interfaces often call these
6 function default_focus() { $('lib_menu').focus(); }
7 function refresh() { populate_list(); }
8 ////
9
10 function staged_init() {
11     try {
12         commonStrings = $('commonStrings');
13         patronStrings = $('patronStrings');
14
15         if (typeof JSAN == 'undefined') {
16             throw(
17                 commonStrings.getString('common.jsan.missing')
18             );
19         }
20
21         JSAN.errorLevel = "die"; // none, warn, or die
22         JSAN.addRepository('..');
23
24         JSAN.use('OpenILS.data'); data = new OpenILS.data(); data.stash_retrieve();
25         XML_HTTP_SERVER = data.server_unadorned;
26
27         JSAN.use('util.error'); error = new util.error();
28         JSAN.use('util.network'); net = new util.network();
29         JSAN.use('patron.util'); 
30         JSAN.use('util.list'); 
31         JSAN.use('util.functional'); 
32         JSAN.use('util.widgets');
33
34         dojo.require('openils.Util');
35
36         populate_lib_menu();
37         init_list();
38         $('list_actions').appendChild( list.render_list_actions() );
39         list.set_list_actions();
40         $('cmd_cancel').addEventListener('command', gen_event_handler('cancel'), false);
41         $('cmd_load').addEventListener('command', gen_event_handler('load'), false);
42         $('cmd_reload').addEventListener('command', function() { populate_list(); }, false);
43         populate_list();
44         default_focus();
45
46     } catch(E) {
47         var err_prefix = 'staged.js -> staged_init() : ';
48         if (error) error.standard_unexpected_error_alert(err_prefix,E); else alert(err_prefix + E);
49     }
50 }
51
52 function populate_lib_menu() {
53     try {
54         JSAN.use('util.widgets');
55         var x = document.getElementById('lib_menu_placeholder');
56         if (!x) { return; }
57         util.widgets.remove_children( x );
58
59         JSAN.use('util.file');
60         var file = new util.file('offline_ou_list');
61         if (file._file.exists()) {
62             var list_data = file.get_object(); file.close();
63             menu_lib = x.getAttribute('value') || ses('ws_ou');
64             var ml = util.widgets.make_menulist( list_data[0], menu_lib );
65             ml.setAttribute('id','lib_menu');
66             x.appendChild( ml );
67             ml.addEventListener(
68                 'command',
69                 function(ev) {
70                     menu_lib = ev.target.value;
71                     x.setAttribute('value',ev.target.value); oils_persist(x);
72                     populate_list();
73                 },
74                 false
75             );
76         } else {
77             alert($("patronStrings").getString('staff.patron.staged.lib_menus.missing_library_list'));
78         }
79     } catch(E) {
80         alert('Error in staged.js, populate_lib_menu(): ' + E);
81     }
82 }
83
84 function gen_event_handler(method) { // cancel or load?
85     return function(ev) {
86         try {
87             var sel = list.retrieve_selection();
88             var row_ids = util.functional.map_list( sel, function(o) { return JSON2js( o.getAttribute('retrieve_id') ).row_id; } );
89             var usrnames = util.functional.map_list( sel, function(o) { return JSON2js( o.getAttribute('retrieve_id') ).usrname; } );
90
91             if (method == 'cancel') {
92                 cancel( row_ids );
93             } else {
94                 load( usrnames );
95             }
96
97         } catch(E) {
98             alert('Error in patron/staged.js, handle_???_event(): ' + E);
99         }
100     };
101 }
102
103 function cancel(ids) {
104     try {
105
106         if (! window.confirm( $('patronStrings').getString('staff.patron.staged.confirm_patron_delete') ) ) { return; }
107         var pm = $('progress'); pm.value = 0; pm.hidden = false;
108         var idx = 0;
109
110         function gen_req_handler(id) {
111             return function(req) {
112                 try {
113                     idx++; pm.value = Number( pm.value ) + 100/ids.length; 
114                     if (idx == ids.length) { pm.value = 0; pm.hidden = true; }
115                     var robj = req.getResultObject();
116                     if (robj == '1') {
117                         var node = rows[ row_id_usrname_map[ id ] ].treeitem_node;
118                         var parentNode = node.parentNode;
119                         parentNode.removeChild( node );
120                         delete(rows[ row_id_usrname_map[ id ] ]);
121                         delete(row_id_usrname_map[ id ]);
122                     } else {
123                         alert( $('patronStrings').getFormattedString('staff.patron.staged.error_on_delete',[ id ]) );
124                     }
125                 } catch(E) {
126                     alert('Error in staged.js, cancel patron request handler: ' + E);
127                 }
128             }
129         }
130
131         for (var i = 0; i < ids.length; i++) {
132             net.simple_request('FM_STGU_DELETE', [ ses(), ids[i] ], gen_req_handler( ids[i] ));
133         }
134     } catch(E) {
135         alert('Error in staged.js, cancel(): ' + E);
136     }
137 }
138
139 function spawn_search(s) {
140     data.stash_retrieve();
141     xulG.new_patron_tab( {}, { 'doit' : 1, 'query' : s } );
142 }
143
144 function spawn_editor(p,func) {
145     var url = urls.XUL_PATRON_EDIT;
146     var loc = xulG.url_prefix('XUL_REMOTE_BROWSER');
147     xulG.new_tab(
148         loc, 
149         {}, 
150         { 
151             'url' : url,
152             'show_print_button' : true , 
153             'tab_name' : $("patronStrings").getFormattedString('staff.patron.staged.register_patron',[p.stage]),
154             'passthru_content_params' : {
155                 'spawn_search' : spawn_search,
156                 'spawn_editor' : spawn_editor,
157                 'url_prefix' : xulG.url_prefix,
158                 'new_tab' : xulG.new_tab,
159                 'new_patron_tab' : xulG.new_patron_tab,
160                 'on_save' : function(p) { patron.util.work_log_patron_edit(p); if (typeof func == 'function') { func(p); } },
161                 'params' : p
162             },
163             'lock_tab' : xulG.lock_tab,
164             'unlock_tab' : xulG.unlock_tab
165         }
166     );
167 }
168
169 function load( usrnames ) {
170     try {
171
172         function gen_on_save_handler(usrname) {
173             return function() {
174                 try {
175                     var node = rows[ usrname ].treeitem_node;
176                     var parentNode = node.parentNode;
177                     parentNode.removeChild( node );
178                     delete(row_id_usrname_map[ rows[ usrname ].row.my.stgu.row_id() ]);
179                     delete(rows[ usrname ]);
180                 } catch(E) {
181                     alert('Error in staged.js, load on save handler: ' + E);
182                 }
183             }
184         }
185
186         var seen = {};
187
188         for (var i = 0; i < usrnames.length; i++) {
189             if (! seen[ usrnames[i] ]) {
190                 seen[ usrnames[i] ] = true;
191                 spawn_editor( { 'stage' : usrnames[i] }, gen_on_save_handler( usrnames[i] ) );
192             }
193         }
194
195     } catch(E) {
196         alert('Error in staged.js, load(): ' + E);
197     }
198 }
199
200 function init_list() {
201     try {
202
203         list = new util.list( 'stgu_list' );
204         list.init( 
205             {
206                 'columns' : list.fm_columns(
207                     'stgu', {
208                         'stgu_ident_type' : { 'render' : function(my) { return data.hash.cit[ my.stgu.ident_type() ].name(); } },
209                         'stgu_home_ou' : { 'render' : function(my) { return data.hash.aou[ my.stgu.home_ou() ].shortname(); } }
210                     }
211                 ),
212                 'retrieve_row' : retrieve_row,
213                 'on_select' : handle_selection
214             }
215         );
216
217     } catch(E) {
218         var err_prefix = 'staged.js -> init_list() : ';
219         if (error) error.standard_unexpected_error_alert(err_prefix,E); else alert(err_prefix + E);
220     }
221 }
222
223 function retrieve_row(params) { // callback function for fleshing rows in a list
224     try {
225         params.treeitem_node.setAttribute('retrieve_id',js2JSON( { 'row_id' : params.row.my.stgu.row_id(), 'usrname' : params.row.my.stgu.usrname() } )); 
226         params.on_retrieve(params.row); 
227     } catch(E) {
228         alert('Error in staged.js, retrieve_row(): ' + E);
229     }
230     return params.row; 
231 }
232
233 function handle_selection(ev) { // handler for list row selection event
234     var sel = list.retrieve_selection();
235     if (sel.length > 0) {
236         $('cmd_cancel').setAttribute('disabled','false');
237         $('cmd_load').setAttribute('disabled','false');
238     } else {
239         $('cmd_cancel').setAttribute('disabled','true');
240         $('cmd_load').setAttribute('disabled','true');
241     }
242 };
243
244 function populate_list() {
245     try {
246
247         rows = {}; row_id_usrname_map = {};
248         list.clear();
249
250         function onResponse(r) {
251             var blob = openils.Util.readResponse(r);
252             var row_params = {
253                 'row' : {
254                     'my' : {
255                         'stgu' : blob.user
256                     }
257                 }
258             };
259             rows[ blob.user.usrname() ] = list.append( row_params );
260             row_id_usrname_map[ blob.user.row_id() ] = blob.user.usrname();
261         }
262
263         function onError(r) {
264             var my_stgu = openils.Util.readResponse(r);
265             alert('error, my_stgu = ' + js2JSON(my_stgu));
266         }
267
268         fieldmapper.standardRequest(
269             [api['FM_STGU_RETRIEVE'].app, api['FM_STGU_RETRIEVE'].method ],
270             {   async: true,
271                 params: [ses(), menu_lib || ses('ws_ou'), $('limit').value || 100],
272                 onresponse : onResponse,
273                 onerror : onError,
274                 oncomplete : function() {
275                 }
276             }
277         );
278
279     } catch(E) {
280         var err_prefix = 'staged.js -> populate_list() : ';
281         if (error) error.standard_unexpected_error_alert(err_prefix,E); else alert(err_prefix + E);
282     }
283 }