]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/xul/staff_client/server/admin/offline_manage_xacts.js
some fixes
[Evergreen.git] / Open-ILS / xul / staff_client / server / admin / offline_manage_xacts.js
1 dump('entering admin/offline_manage_xacts.js\n');
2
3 if (typeof admin == 'undefined') admin = {};
4 admin.offline_manage_xacts = function (params) {
5
6         JSAN.use('util.error'); this.error = new util.error();
7         JSAN.use('util.network'); this.network = new util.network();
8 }
9
10 admin.offline_manage_xacts.prototype = {
11
12         'sel_list' : [],
13         'seslist' : [],
14
15         'init' : function( params ) {
16
17                 var obj = this;
18
19                 JSAN.use('OpenILS.data'); obj.data = new OpenILS.data(); obj.data.init({'via':'stash'});
20
21                 obj.init_list(); obj.init_script_list(); obj.init_error_list();
22
23                 obj.retrieve_seslist(); obj.render_seslist();
24
25                 var x = document.getElementById('create');
26                 if (obj.check_perm(obj.session,'OFFLINE_CREATE_SESSION')) {
27                         x.disabled = false;
28                         x.addEventListener('command',function() { try{obj.create_ses();}catch(E){alert(E);} },false);
29                 }
30
31                 x = document.getElementById('upload');
32                 x.addEventListener('command',function() { try{obj.upload();}catch(E){alert(E);} },false);
33
34                 x = document.getElementById('refresh');
35                 x.addEventListener('command',function() { try{obj.retrieve_seslist();obj.render_seslist();}catch(E){alert(E);} },false);
36
37                 x = document.getElementById('execute');
38                 x.addEventListener('command',function() { try{obj.execute_ses();}catch(E){alert(E);} },false);
39
40                 document.getElementById('deck').selectedIndex = 2;
41         },
42
43         'init_list' : function() {
44                 var obj = this; JSAN.use('util.list'); 
45                 obj.list = new util.list('session_tree');
46                 obj.list.init( {
47                         'columns' : [
48                                 {
49                                         'id' : 'org', 'hidden' : 'true', 'flex' : '1',
50                                         'label' : 'Organization',
51                                         'render' : 'data.hash.aou[ my.org ].shortname()',
52                                 },
53                                 { 
54                                         'id' : 'description', 'flex' : '2',
55                                         'label' : 'Description', 
56                                         'render' : "my.description", 
57                                 },
58                                 {
59                                         'id' : 'create_time', 'flex' : '1',
60                                         'label' : 'Date Created',
61                                         'render' : 'if (my.create_time) { var x = new Date(); x.setTime(my.create_time+"000"); util.date.formatted_date(x,"%F %H:%M"); } else { ""; }',
62                                 },
63                                 {
64                                         'id' : 'creator', 'flex' : '1', 'hidden' : 'true',
65                                         'label' : 'Created By',
66                                         'render' : 'my.creator',
67                                 },
68                                 { 
69                                         'id' : 'count', 'flex' : '1',
70                                         'label' : 'Upload Count', 
71                                         'render' : "my.scripts.length", 
72                                 },
73                                 { 
74                                         'id' : 'num_complete', 'flex' : '1', 
75                                         'label' : 'Transactions Processed', 
76                                         'render' : "my.num_complete", 
77                                 },
78                                 { 
79                                         'id' : 'in_process', 'flex' : '1',
80                                         'label' : 'Processing?', 
81                                         'render' : "if (my.end_time) { 'Completed' } else {my.in_process == 0 ? 'No' : 'Yes'}", 
82                                 },
83                                 {
84                                         'id' : 'start_time', 'flex' : '1', 'hidden' : 'true',
85                                         'label' : 'Date Started',
86                                         'render' : 'if (my.start_time) {var x = new Date(); x.setTime(my.start_time+"000"); util.date.formatted_date(x,"%F %H:%M");} else { ""; }',
87                                 },
88                                 {
89                                         'id' : 'end_time', 'flex' : '1',
90                                         'label' : 'Date Completed',
91                                         'render' : 'if (my.end_time) {var x = new Date(); x.setTime(my.end_time+"000"); util.date.formatted_date(x,"%F %H:%M");} else { ""; }',
92                                 },
93                                 { 
94                                         'id' : 'key', 'hidden' : 'true', 'flex' : '1', 
95                                         'label' : 'Session', 
96                                         'render' : "my.key", 
97                                 },
98                         ],
99                         'map_row_to_column' : function(row,col) {
100                                 JSAN.use('util.date');
101                                 JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
102                                 var my = row; var value;
103                                 try { value = eval( col.render ); } catch(E) { obj.error.sdump('D_ERROR',E); value = '???'; }
104                                 return value;
105                         },
106                         'on_select' : function(ev) {
107                                 try {
108                                         JSAN.use('util.functional');
109                                         var sel = obj.list.retrieve_selection();
110                                         obj.sel_list = util.functional.map_list(
111                                                 sel,
112                                                 function(o) { return o.getAttribute('retrieve_id'); }
113                                         );
114                                         if (obj.sel_list.length == 0) return;
115                                         if (obj.check_perm(obj.session,'OFFLINE_EXECUTE_SESSION')) {
116                                                 document.getElementById('execute').disabled = false;    
117                                         }
118                                         if (obj.check_perm(obj.session,'OFFLINE_UPLOAD_XACTS')) {
119                                                 document.getElementById('upload').disabled = false;     
120                                         }
121                                         var complete = false;
122                                         for (var i = 0; i < obj.sel_list.length; i++) { 
123                                                 if (obj.seslist[ obj.sel_list[i] ].end_time) { complete = true; }
124                                         }
125                                         if (complete) {
126                                                 obj.render_errorlist();
127                                         } else {
128                                                 obj.render_scriptlist();
129                                         }
130                                 } catch(E) {
131                                         alert('on_select:\nobj.seslist.length = ' + obj.seslist.length + '  obj.sel_list.length = ' + obj.sel_list.length + '\nerror: ' + E);
132                                 }
133                         },
134                 } );
135
136
137         },
138
139         'init_script_list' : function() {
140                 var obj = this; JSAN.use('util.list'); 
141                 obj.script_list = new util.list('script_tree');
142                 obj.script_list.init( {
143                         'columns' : [
144                                 {
145                                         'id' : 'create_time', 'flex' : '1',
146                                         'label' : 'Date Uploaded',
147                                         'render' : 'if (my.create_time) { var x = new Date(); x.setTime(my.create_time+"000"); util.date.formatted_date(x,"%F %H:%M"); } else { ""; }',
148                                 },
149                                 {
150                                         'id' : 'requestor', 'flex' : '1', 'hidden' : 'true',
151                                         'label' : 'Uploaded By',
152                                         'render' : 'my.requestor',
153                                 },
154                                 { 
155                                         'id' : 'time_delta', 'hidden' : 'true', 'flex' : '1', 
156                                         'label' : 'Server/Local Time Delta', 
157                                         'render' : "my.time_delta", 
158                                 },
159                                 { 
160                                         'id' : 'workstation', 'flex' : '1', 
161                                         'label' : 'Workstation', 
162                                         'render' : "my.workstation", 
163                                 },
164                         ],
165                         'map_row_to_column' : function(row,col) {
166                                 JSAN.use('util.date');
167                                 JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
168                                 var my = row; var value;
169                                 try { value = eval( col.render ); } catch(E) { obj.error.sdump('D_ERROR',E); value = '???'; }
170                                 return value;
171                         },
172                 } );
173
174
175         },
176
177         'init_error_list' : function() {
178                 var obj = this; JSAN.use('util.list'); 
179                 obj.error_list = new util.list('error_tree');
180                 obj.error_list.init( {
181                         'columns' : [
182                                 {
183                                         'id' : 'workstation', 'flex' : '1',
184                                         'label' : 'Workstation',
185                                         'render' : 'my.command._workstation ? my.command._workstation : my.command._worksation',
186                                 },
187                                 {
188                                         'id' : 'timestamp', 'flex' : '1',
189                                         'label' : 'Timestamp',
190                                         'render' : 'if (my.command.timestamp) { var x = new Date(); x.setTime(my.command.timestamp+"000"); util.date.formatted_date(x,"%F %H:%M"); } else { my.command._realtime; }',
191                                 },
192                                 {
193                                         'id' : 'type', 'flex' : '1',
194                                         'label' : 'Type',
195                                         'render' : 'my.command.type',
196                                 },
197                                 { 
198                                         'id' : 'ilsevent', 'hidden' : 'true', 'flex' : '1', 
199                                         'label' : 'Event Code', 
200                                         'render' : "my.event.ilsevent", 
201                                 },
202                                 { 
203                                         'id' : 'textcode', 'flex' : '1', 
204                                         'label' : 'Event Name', 
205                                         'render' : "my.event.textcode", 
206                                 },
207                                 {
208                                         'id' : 'i_barcode', 'flex' : '1',
209                                         'label' : 'Item Barcode',
210                                         'render' : 'my.command.barcode ? my.command.barcode : ""',
211                                 },
212                                 {
213                                         'id' : 'p_barcode', 'flex' : '1',
214                                         'label' : 'Patron Barcode',
215                                         'render' : 'if (my.command.patron_barcode) { my.command.patron_barcode; } else { if (my.command.user.card.barcode) { my.command.user.card.barcode; } else { ""; } }',
216                                 },
217                                 {
218                                         'id' : 'duedate', 'flex' : '1', 'hidden' : 'true',
219                                         'label' : 'Due Date',
220                                         'render' : 'my.command.due_date || ""',
221                                 },
222                                 {
223                                         'id' : 'backdate', 'flex' : '1', 'hidden' : 'true',
224                                         'label' : 'Check In Backdate',
225                                         'render' : 'my.command.backdate || ""',
226                                 },
227                                 {
228                                         'id' : 'count', 'flex' : '1', 'hidden' : 'true',
229                                         'label' : 'In House Use Count',
230                                         'render' : 'my.command.count || ""',
231                                 },
232                                 {
233                                         'id' : 'noncat', 'flex' : '1', 'hidden' : 'true',
234                                         'label' : 'Non-Cataloged?',
235                                         'render' : 'my.command.noncat == 1 ? "Yes" : "No"',
236                                 },
237                                 {
238                                         'id' : 'noncat_type', 'flex' : '1', 'hidden' : 'true',
239                                         'label' : 'Non-Cataloged Type',
240                                         'render' : 'data.hash.cnct[ my.command.noncat_type ] ? data.hash.cnct[ my.command.noncat_type ].name() : ""',
241                                 },
242                                 {
243                                         'id' : 'noncat_count', 'flex' : '1', 'hidden' : 'true',
244                                         'label' : 'Non-Cataloged Count',
245                                         'render' : 'my.command.noncat_count || ""',
246                                 },
247                         ],
248                         'map_row_to_column' : function(row,col) {
249                                 JSAN.use('util.date');
250                                 JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
251                                 var my = row; var value;
252                                 try { value = eval( col.render ); } catch(E) { obj.error.sdump('D_ERROR',E); value = '???'; }
253                                 return value;
254                         },
255                 } );
256
257
258         },
259
260         'check_perm' : function(ses,perms) {
261                 return true; /* FIXME */
262         },
263
264         'execute_ses' : function() {
265                 var obj = this;
266
267                 obj.data.stash_retrieve();
268
269                 for (var i = 0; i < obj.sel_list.length; i++) {
270
271                         var url  = xulG.url_prefix(urls.XUL_OFFLINE_MANAGE_XACTS_CGI)
272                                 + "?ses=" + window.escape(obj.data.session)
273                                 + "&action=execute" 
274                                 + "&seskey=" + window.escape(obj.seslist[obj.sel_list[i]].key)
275                                 + "&ws=" + window.escape(obj.data.ws_name);
276                         var x = new XMLHttpRequest();
277                         x.open("GET",url,false);
278                         x.send(null);
279
280                         dump(url + ' = ' + x.responseText + '\n' );
281                         var robj = JSON2js(x.responseText);
282
283                         if (robj.ilsevent != 0) { alert('Execute error: ' + x.responseText); }
284
285                         obj.retrieve_seslist(); obj.render_seslist();
286                 }
287         },
288
289         'ses_errors' : function() {
290                 var obj = this;
291
292                 obj.data.stash_retrieve();
293
294                 var url  = xulG.url_prefix(urls.XUL_OFFLINE_MANAGE_XACTS_CGI)
295                         + "?ses=" + window.escape(obj.data.session)
296                         + "&action=status" 
297                         + "&seskey=" + window.escape(obj.seslist[ obj.sel_list[0] ].key)
298                         + "&ws=" + window.escape(obj.data.ws_name)
299                         + '&status_type=exceptions';
300                 var x = new XMLHttpRequest();
301                 x.open("GET",url,false);
302                 x.send(null);
303
304                 dump(url + ' = ' + x.responseText + '\n' );
305                 var robj = JSON2js(x.responseText);
306
307                 return { 'errors' : robj, 'description' : obj.seslist[ obj.sel_list[0] ].description };
308
309         },
310
311         'rename_file' : function() {
312                 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
313                 var obj = this;
314                 JSAN.use('util.file'); 
315                 var pending = new util.file('pending_xacts');
316                 if ( !pending._file.exists() ) { throw("Can't rename a non-existent file"); }
317                 obj.transition_filename = 'pending_xacts_' + new Date().getTime();
318                 var count = 0;
319                 var file = new util.file(obj.transition_filename);
320                 while (file._file.exists()) {
321                         obj.transition_filename = 'pending_xacts_' + new Date().getTime();
322                         file = new util.file(obj.transition_filename);
323                         if (count++>100) throw("Taking too long to find a unique filename.");
324                 }
325                 pending._file.moveTo(null,obj.transition_filename);
326         },
327
328         'revert_file' : function() {
329                 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
330                 var obj = this;
331                 JSAN.use('util.file');
332                 var pending = new util.file('pending_xacts');
333                 if (pending._file.exists()) { alert('Something bad happened.  New offline transactions were accumulated during our attempted upload.  Tell your system admin that the file involved is ' + obj.transition_filename); return; }
334                 var file = new util.file(obj.transition_filename);
335                 file._file.moveTo(null,'pending_xacts');
336         },
337
338         'archive_file' : function() {
339                 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
340                 var obj = this;
341                 JSAN.use('util.file');
342                 var file = new util.file(obj.transition_filename);
343                 if (file._file.exists()) file._file.moveTo(null,obj.transition_filename + '.complete')
344         },
345
346         'upload' : function() {
347                 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
348                 var obj = this;
349                 if (obj.sel_list.length == 0) { alert('Please select a session to upload to.'); return; }
350                 if (obj.sel_list.length > 1) { alert('Please select a single session to upload to.'); return; }
351
352                 JSAN.use('util.file');
353
354                 var file = new util.file('pending_xacts');
355                 if (!file._file.exists()) { alert('No pending transactions to upload.'); return; }
356
357                 obj.rename_file();
358
359                 obj.data.stash_retrieve();
360                 var seskey = obj.seslist[ obj.sel_list[0] ].key;
361                 JSAN.use('util.widgets');
362                 var xx = document.getElementById('iframe_placeholder'); util.widgets.remove_children(xx);
363                 var x = document.createElement('iframe'); xx.appendChild(x); x.flex = 1;
364                 x.setAttribute(
365                         'src',
366                         window.xulG.url_prefix( urls.XUL_REMOTE_BROWSER )
367                         + '?url=' + window.escape(
368                                 urls.XUL_OFFLINE_UPLOAD_XACTS
369                                 + '?ses=' + window.escape(obj.data.session)
370                                 + '&seskey=' + window.escape(seskey)
371                                 + '&ws=' + window.escape(obj.data.ws_name)
372                                 + '&delta=' + window.escape('0')
373                                 + '&filename=' + window.escape( obj.transition_filename )
374                         )
375                 );
376                 var newG = { 
377                         'url_prefix' : window.xulG.url_prefix, 
378                         'passthru_content_params' : {
379                                 'url_prefix' : window.xulG.url_prefix,
380                                 'handle_event' : function(robj){
381                                         netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
382                                         try {
383                                                 dump('robj = ' + js2JSON(robj) + '\n');
384                                                 if ( robj.ilsevent != 0 ) {
385                                                         obj.revert_file();
386                                                         alert('There was an error:\n' + js2JSON(robj));
387                                                 } else {
388                                                         obj.archive_file();
389                                                 }
390                                                 obj.retrieve_seslist(); obj.render_seslist();
391                                                 setTimeout(
392                                                         function() {
393                                                                 JSAN.use('util.widgets');
394                                                                 util.widgets.remove_children('iframe_placeholder');
395                                                         },0
396                                                 );
397                                         } catch(E) {
398                                                 alert('handle_event error: ' + E);
399                                         }
400                                 } 
401                         }
402                 };
403                 x.contentWindow.xulG = newG;
404         },
405
406         'ses_status' : function() {
407                 var obj = this;
408
409                 obj.data.stash_retrieve();
410
411                 var url  = xulG.url_prefix(urls.XUL_OFFLINE_MANAGE_XACTS_CGI)
412                         + "?ses=" + window.escape(obj.data.session)
413                         + "&action=status" 
414                         + "&seskey=" + window.escape(obj.seslist[obj.sel_list[0]].key)
415                         + "&ws=" + window.escape(obj.data.ws_name)
416                         + "&status_type=scripts";
417                 var x = new XMLHttpRequest();
418                 x.open("GET",url,false);
419                 x.send(null);
420
421                 dump(url + ' = ' + x.responseText + '\n' );
422                 var robj = JSON2js(x.responseText);
423
424                 return robj;
425         },
426
427         'create_ses' : function() {
428
429                 var obj = this;
430
431                 var desc = window.prompt('Please enter a description:','','Create an Offline Transaction Session');
432                 if (desc=='' || desc==null) { return; }
433
434                 obj.data.stash_retrieve();
435
436                 var url  = xulG.url_prefix(urls.XUL_OFFLINE_MANAGE_XACTS_CGI)
437                         + "?ses=" + window.escape(obj.data.session)
438                         + "&action=create" 
439                         + "&desc=" + window.escape(desc)
440                         + "&ws=" + window.escape(obj.data.ws_name);
441                 var x = new XMLHttpRequest();
442                 x.open("GET",url,false);
443                 x.send(null);
444
445                 dump(url + ' = ' + x.responseText + '\n' );
446                 var robj = JSON2js(x.responseText);
447                 if (robj.ilsevent == 0) {
448                         obj.retrieve_seslist(); obj.render_seslist();
449                 } else {
450                         alert('Error: ' + x.responseText);
451                 }
452         },
453
454         'retrieve_seslist' : function() {
455
456                 var obj = this;
457
458                 obj.data.stash_retrieve();
459
460                 var url = xulG.url_prefix(urls.XUL_OFFLINE_MANAGE_XACTS_CGI) 
461                         + "?ses=" + window.escape(obj.data.session)
462                         + "&action=status"
463                         + "&org=" + window.escape(obj.data.list.au[0].ws_ou())
464                         + "&status_type=sessions";
465                 var x = new XMLHttpRequest();
466                 x.open("GET",url,false);
467                 x.send(null);
468
469                 dump(url + ' = ' + x.responseText + '\n' );
470                 obj.seslist = JSON2js( x.responseText );
471         },
472
473         'render_seslist' : function() {
474
475                 var obj = this;
476
477                 obj.list.clear();
478
479                 var funcs = [];
480                 for (var i = 0; i < obj.seslist.length; i++) {
481                         funcs.push( 
482                                 function(idx,row){ 
483                                         return function(){
484                                                 obj.list.append( { 'retrieve_id' : idx, 'row' : row } );
485                                         };
486                                 }(i,obj.seslist[i]) 
487                         );
488                 }
489                 JSAN.use('util.exec'); var exec = new util.exec();
490                 exec.chain( funcs );
491
492                 document.getElementById('execute').disabled = true;
493                 document.getElementById('upload').disabled = true;
494
495         },
496
497         'render_scriptlist' : function() {
498
499                 dump('render_scriptlist\n');
500
501                 document.getElementById('deck').selectedIndex = 0;
502
503                 var obj = this;
504
505                 obj.script_list.clear();
506
507                 var status = obj.ses_status();
508                 document.getElementById('status_caption').setAttribute('label','Uploaded Transactions for ' + status.description);
509
510                 var scripts = status.scripts;
511
512                 var funcs = [];
513                 for (var i = 0; i < scripts.length; i++) {
514                         funcs.push( 
515                                 function(row){ 
516                                         return function(){
517                                                 obj.script_list.append( { 'row' : row } );
518                                         };
519                                 }(scripts[i]) 
520                         );
521                 }
522                 JSAN.use('util.exec'); var exec = new util.exec();
523                 exec.chain( funcs );
524         },
525         
526         'render_errorlist' : function() {
527
528                 dump('render_errorlist\n');
529
530                 document.getElementById('deck').selectedIndex = 1;
531
532                 var obj = this;
533
534                 obj.error_list.clear();
535
536                 var error_meta = obj.ses_errors();
537                 document.getElementById('errors_caption').setAttribute('label','Exceptions for ' + error_meta.description);
538
539                 obj.errors = error_meta.errors;
540
541                 var funcs = [];
542                 for (var i = 0; i < obj.errors.length; i++) {
543                         funcs.push( 
544                                 function(idx,row){ 
545                                         return function(){
546                                                 obj.error_list.append( { 'retrieve_id' : idx, 'row' : row } );
547                                         };
548                                 }(i,obj.errors[i]) 
549                         );
550                 }
551                 JSAN.use('util.exec'); var exec = new util.exec();
552                 exec.chain( funcs );
553         },
554
555 }
556
557 dump('exiting admin/offline_manage_xacts.js\n');