]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/xul/staff_client/server/admin/offline_manage_xacts.js
auto-select a row in the session list. First one, or last selected one
[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{$('deck').selectedIndex=0;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 = 0;
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                                         $('deck').selectedIndex = 0;
109                                         $('execute').disabled = true;
110                                         $('upload').disabled = true;
111                                         setTimeout(
112                                                 function() {
113                                                         try {
114                                                                 JSAN.use('util.functional');
115                                                                 var sel = obj.list.retrieve_selection();
116                                                                 obj.sel_list = util.functional.map_list(
117                                                                         sel,
118                                                                         function(o) { return o.getAttribute('retrieve_id'); }
119                                                                 );
120                                                                 if (obj.sel_list.length == 0) return;
121                                                                 {       
122                                                                         var upload = true; var process = true;
123
124                                                                         if (obj.sel_list.length > 1) upload = false;
125
126                                                                         if (obj.seslist[ obj.sel_list[0] ].end_time) {
127                                                                                 upload = false; process = false;
128                                                                         }
129                                                                         if (obj.seslist[ obj.sel_list[0] ].in_process == 1) {
130                                                                                 upload = false; process = false;
131                                                                         }
132
133                                                                         /* should we really have this next restriction? */
134                                                                         for (var i = 0; i < obj.seslist[ obj.sel_list[0] ].scripts.length; i++) {
135                                                                                 if (obj.seslist[ obj.sel_list[0] ].scripts[i].workstation ==
136                                                                                         obj.data.ws_name ) upload = false;
137                                                                         }
138
139                                                                         if (upload) {
140                                                                                 if (obj.check_perm(obj.session,'OFFLINE_UPLOAD_XACTS')) {
141                                                                                         document.getElementById('upload').disabled = false;
142                                                                                 }
143                                                                         } else {
144                                                                                 document.getElementById('upload').disabled = true;
145                                                                         }
146                                                                         if (process) {
147                                                                                 if (obj.check_perm(obj.session,'OFFLINE_EXECUTE_SESSION')) {
148                                                                                         document.getElementById('execute').disabled = false;    
149                                                                                 }
150                                                                         } else {
151                                                                                 document.getElementById('execute').disabled = true;     
152                                                                         }
153                                                                 }
154                                                                 var complete = false;
155                                                                 for (var i = 0; i < obj.sel_list.length; i++) { 
156                                                                         if (obj.seslist[ obj.sel_list[i] ].end_time) { complete = true; }
157                                                                 }
158                                                                 if (complete) {
159                                                                         obj.render_errorlist();
160                                                                 } else {
161                                                                         if (obj.seslist[ obj.sel_list[0] ].in_process == 1) {
162                                                                                 obj.render_status();
163                                                                         } else {
164                                                                                 obj.render_scriptlist();
165                                                                         }
166                                                                 }
167                                                         } catch(E) {
168                                                                 alert('on_select: ' + E);
169                                                         }
170                                                 }, 0
171                                         );
172                                 } catch(E) {
173                                         alert('on_select:\nobj.seslist.length = ' + obj.seslist.length + '  obj.sel_list.length = ' + obj.sel_list.length + '\nerror: ' + E);
174                                 }
175                         },
176                 } );
177
178
179         },
180
181         'init_script_list' : function() {
182                 var obj = this; JSAN.use('util.list'); 
183                 obj.script_list = new util.list('script_tree');
184                 obj.script_list.init( {
185                         'columns' : [
186                                 {
187                                         'id' : 'create_time', 'flex' : '1',
188                                         'label' : 'Date Uploaded',
189                                         'render' : 'if (my.create_time) { var x = new Date(); x.setTime(my.create_time+"000"); util.date.formatted_date(x,"%F %H:%M"); } else { ""; }',
190                                 },
191                                 {
192                                         'id' : 'requestor', 'flex' : '1', 'hidden' : 'true',
193                                         'label' : 'Uploaded By',
194                                         'render' : 'my.requestor',
195                                 },
196                                 { 
197                                         'id' : 'time_delta', 'hidden' : 'true', 'flex' : '1', 
198                                         'label' : 'Server/Local Time Delta', 
199                                         'render' : "my.time_delta", 
200                                 },
201                                 { 
202                                         'id' : 'workstation', 'flex' : '1', 
203                                         'label' : 'Workstation', 
204                                         'render' : "my.workstation", 
205                                 },
206                         ],
207                         'map_row_to_column' : function(row,col) {
208                                 JSAN.use('util.date');
209                                 JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
210                                 var my = row; var value;
211                                 try { value = eval( col.render ); } catch(E) { obj.error.sdump('D_ERROR',E); value = '???'; }
212                                 return value;
213                         },
214                 } );
215
216
217         },
218
219         'init_error_list' : function() {
220                 var obj = this; JSAN.use('util.list'); 
221                 obj.error_list = new util.list('error_tree');
222                 obj.error_list.init( {
223                         'columns' : [
224                                 {
225                                         'id' : 'workstation', 'flex' : '1',
226                                         'label' : 'Workstation',
227                                         'render' : 'my.command._workstation ? my.command._workstation : my.command._worksation',
228                                 },
229                                 {
230                                         'id' : 'timestamp', 'flex' : '1',
231                                         'label' : 'Timestamp',
232                                         '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; }',
233                                 },
234                                 {
235                                         'id' : 'type', 'flex' : '1',
236                                         'label' : 'Type',
237                                         'render' : 'my.command.type',
238                                 },
239                                 { 
240                                         'id' : 'ilsevent', 'hidden' : 'true', 'flex' : '1', 
241                                         'label' : 'Event Code', 
242                                         'render' : "my.event.ilsevent", 
243                                 },
244                                 { 
245                                         'id' : 'textcode', 'flex' : '1', 
246                                         'label' : 'Event Name', 
247                                         'render' : "my.event.textcode", 
248                                 },
249                                 {
250                                         'id' : 'i_barcode', 'flex' : '1',
251                                         'label' : 'Item Barcode',
252                                         'render' : 'my.command.barcode ? my.command.barcode : ""',
253                                 },
254                                 {
255                                         'id' : 'p_barcode', 'flex' : '1',
256                                         'label' : 'Patron Barcode',
257                                         'render' : 'if (my.command.patron_barcode) { my.command.patron_barcode; } else { if (my.command.user.card.barcode) { my.command.user.card.barcode; } else { ""; } }',
258                                 },
259                                 {
260                                         'id' : 'duedate', 'flex' : '1', 'hidden' : 'true',
261                                         'label' : 'Due Date',
262                                         'render' : 'my.command.due_date || ""',
263                                 },
264                                 {
265                                         'id' : 'backdate', 'flex' : '1', 'hidden' : 'true',
266                                         'label' : 'Check In Backdate',
267                                         'render' : 'my.command.backdate || ""',
268                                 },
269                                 {
270                                         'id' : 'count', 'flex' : '1', 'hidden' : 'true',
271                                         'label' : 'In House Use Count',
272                                         'render' : 'my.command.count || ""',
273                                 },
274                                 {
275                                         'id' : 'noncat', 'flex' : '1', 'hidden' : 'true',
276                                         'label' : 'Non-Cataloged?',
277                                         'render' : 'my.command.noncat == 1 ? "Yes" : "No"',
278                                 },
279                                 {
280                                         'id' : 'noncat_type', 'flex' : '1', 'hidden' : 'true',
281                                         'label' : 'Non-Cataloged Type',
282                                         'render' : 'data.hash.cnct[ my.command.noncat_type ] ? data.hash.cnct[ my.command.noncat_type ].name() : ""',
283                                 },
284                                 {
285                                         'id' : 'noncat_count', 'flex' : '1', 'hidden' : 'true',
286                                         'label' : 'Non-Cataloged Count',
287                                         'render' : 'my.command.noncat_count || ""',
288                                 },
289                         ],
290                         'map_row_to_column' : function(row,col) {
291                                 JSAN.use('util.date');
292                                 JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
293                                 var my = row; var value;
294                                 try { value = eval( col.render ); } catch(E) { obj.error.sdump('D_ERROR',E); value = '???'; }
295                                 return value;
296                         },
297                 } );
298
299
300         },
301
302         'check_perm' : function(ses,perms) {
303                 return true; /* FIXME */
304         },
305
306         'execute_ses' : function() {
307                 var obj = this;
308
309                 obj.data.stash_retrieve();
310
311                 for (var i = 0; i < obj.sel_list.length; i++) {
312
313                         var url  = xulG.url_prefix(urls.XUL_OFFLINE_MANAGE_XACTS_CGI)
314                                 + "?ses=" + window.escape(obj.data.session)
315                                 + "&action=execute" 
316                                 + "&seskey=" + window.escape(obj.seslist[obj.sel_list[i]].key)
317                                 + "&ws=" + window.escape(obj.data.ws_name);
318                         var x = new XMLHttpRequest();
319                         x.open("GET",url,false);
320                         x.send(null);
321
322                         dump(url + ' = ' + x.responseText + '\n' );
323                         var robj = JSON2js(x.responseText);
324
325                         if (robj.ilsevent != 0) { alert('Execute error: ' + x.responseText); }
326
327                         obj.retrieve_seslist(); obj.render_seslist();
328                 }
329         },
330
331         'ses_errors' : function() {
332                 var obj = this;
333
334                 obj.data.stash_retrieve();
335
336                 var url  = xulG.url_prefix(urls.XUL_OFFLINE_MANAGE_XACTS_CGI)
337                         + "?ses=" + window.escape(obj.data.session)
338                         + "&action=status" 
339                         + "&seskey=" + window.escape(obj.seslist[ obj.sel_list[0] ].key)
340                         + "&ws=" + window.escape(obj.data.ws_name)
341                         + '&status_type=exceptions';
342                 var x = new XMLHttpRequest();
343                 x.open("GET",url,false);
344                 x.send(null);
345
346                 dump(url + ' = ' + x.responseText + '\n' );
347                 var robj = JSON2js(x.responseText);
348
349                 return { 'errors' : robj, 'description' : obj.seslist[ obj.sel_list[0] ].description };
350
351         },
352
353         'rename_file' : function() {
354                 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
355                 var obj = this;
356                 JSAN.use('util.file'); 
357                 var pending = new util.file('pending_xacts');
358                 if ( !pending._file.exists() ) { throw("Can't rename a non-existent file"); }
359                 obj.transition_filename = 'pending_xacts_' + new Date().getTime();
360                 var count = 0;
361                 var file = new util.file(obj.transition_filename);
362                 while (file._file.exists()) {
363                         obj.transition_filename = 'pending_xacts_' + new Date().getTime();
364                         file = new util.file(obj.transition_filename);
365                         if (count++>100) throw("Taking too long to find a unique filename.");
366                 }
367                 pending._file.moveTo(null,obj.transition_filename);
368         },
369
370         'revert_file' : function() {
371                 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
372                 var obj = this;
373                 JSAN.use('util.file');
374                 var pending = new util.file('pending_xacts');
375                 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; }
376                 var file = new util.file(obj.transition_filename);
377                 file._file.moveTo(null,'pending_xacts');
378         },
379
380         'archive_file' : function() {
381                 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
382                 var obj = this;
383                 JSAN.use('util.file');
384                 var file = new util.file(obj.transition_filename);
385                 if (file._file.exists()) file._file.moveTo(null,obj.transition_filename + '.complete')
386         },
387
388         'upload' : function() {
389                 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
390                 var obj = this;
391                 if (obj.sel_list.length == 0) { alert('Please select a session to upload to.'); return; }
392                 if (obj.sel_list.length > 1) { alert('Please select a single session to upload to.'); return; }
393
394                 JSAN.use('util.file');
395
396                 var file = new util.file('pending_xacts');
397                 if (!file._file.exists()) { alert('No pending transactions to upload.'); return; }
398
399                 obj.rename_file();
400
401                 obj.data.stash_retrieve();
402                 var seskey = obj.seslist[ obj.sel_list[0] ].key;
403                 JSAN.use('util.widgets');
404                 var xx = document.getElementById('iframe_placeholder'); util.widgets.remove_children(xx);
405                 var x = document.createElement('iframe'); xx.appendChild(x); x.flex = 1;
406                 x.setAttribute(
407                         'src',
408                         window.xulG.url_prefix( urls.XUL_REMOTE_BROWSER )
409                         + '?url=' + window.escape(
410                                 urls.XUL_OFFLINE_UPLOAD_XACTS
411                                 + '?ses=' + window.escape(obj.data.session)
412                                 + '&seskey=' + window.escape(seskey)
413                                 + '&ws=' + window.escape(obj.data.ws_name)
414                                 + '&delta=' + window.escape('0')
415                                 + '&filename=' + window.escape( obj.transition_filename )
416                         )
417                 );
418                 var newG = { 
419                         'url_prefix' : window.xulG.url_prefix, 
420                         'passthru_content_params' : {
421                                 'url_prefix' : window.xulG.url_prefix,
422                                 'handle_event' : function(robj){
423                                         netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
424                                         try {
425                                                 dump('robj = ' + js2JSON(robj) + '\n');
426                                                 if ( robj.ilsevent != 0 ) {
427                                                         obj.revert_file();
428                                                         alert('There was an error:\n' + js2JSON(robj));
429                                                 } else {
430                                                         obj.archive_file();
431                                                 }
432                                                 obj.retrieve_seslist(); obj.render_seslist();
433                                                 setTimeout(
434                                                         function() {
435                                                                 JSAN.use('util.widgets');
436                                                                 util.widgets.remove_children('iframe_placeholder');
437                                                         },0
438                                                 );
439                                         } catch(E) {
440                                                 alert('handle_event error: ' + E);
441                                         }
442                                 } 
443                         }
444                 };
445                 x.contentWindow.xulG = newG;
446         },
447
448         'ses_status' : function() {
449                 var obj = this;
450
451                 obj.data.stash_retrieve();
452
453                 var url  = xulG.url_prefix(urls.XUL_OFFLINE_MANAGE_XACTS_CGI)
454                         + "?ses=" + window.escape(obj.data.session)
455                         + "&action=status" 
456                         + "&seskey=" + window.escape(obj.seslist[obj.sel_list[0]].key)
457                         + "&ws=" + window.escape(obj.data.ws_name)
458                         + "&status_type=scripts";
459                 var x = new XMLHttpRequest();
460                 x.open("GET",url,false);
461                 x.send(null);
462
463                 dump(url + ' = ' + x.responseText + '\n' );
464                 var robj = JSON2js(x.responseText);
465
466                 return robj;
467         },
468
469         'create_ses' : function() {
470
471                 var obj = this;
472
473                 var desc = window.prompt('Please enter a description:','','Create an Offline Transaction Session');
474                 if (desc=='' || desc==null) { return; }
475
476                 obj.data.stash_retrieve();
477
478                 var url  = xulG.url_prefix(urls.XUL_OFFLINE_MANAGE_XACTS_CGI)
479                         + "?ses=" + window.escape(obj.data.session)
480                         + "&action=create" 
481                         + "&desc=" + window.escape(desc)
482                         + "&ws=" + window.escape(obj.data.ws_name);
483                 var x = new XMLHttpRequest();
484                 x.open("GET",url,false);
485                 x.send(null);
486
487                 dump(url + ' = ' + x.responseText + '\n' );
488                 var robj = JSON2js(x.responseText);
489                 if (robj.ilsevent == 0) {
490                         obj.retrieve_seslist(); obj.render_seslist();
491                 } else {
492                         alert('Error: ' + x.responseText);
493                 }
494         },
495
496         'retrieve_seslist' : function() {
497
498                 var obj = this;
499
500                 obj.data.stash_retrieve();
501
502                 var url = xulG.url_prefix(urls.XUL_OFFLINE_MANAGE_XACTS_CGI) 
503                         + "?ses=" + window.escape(obj.data.session)
504                         + "&action=status"
505                         + "&org=" + window.escape(obj.data.list.au[0].ws_ou())
506                         + "&status_type=sessions";
507                 var x = new XMLHttpRequest();
508                 x.open("GET",url,false);
509                 x.send(null);
510
511                 dump(url + ' = ' + x.responseText + '\n' );
512                 obj.seslist = JSON2js( x.responseText ).sort(
513                         function(a,b) {
514                                 return b.create_time - a.create_time;
515                         }
516                 );
517         },
518
519         'render_seslist' : function() {
520
521                 var obj = this;
522
523                 var old_idx = obj.list.node.currentIndex;
524                 if (old_idx < 0) old_idx = 0;
525
526                 obj.list.clear();
527
528                 var funcs = [];
529                 for (var i = 0; i < obj.seslist.length; i++) {
530                         funcs.push( 
531                                 function(idx,row){ 
532                                         return function(){
533                                                 obj.list.append( { 'retrieve_id' : idx, 'row' : row } );
534                                                 if (idx == old_idx) obj.list.node.view.selection.select(idx);
535                                         };
536                                 }(i,obj.seslist[i]) 
537                         );
538                 }
539
540                 JSAN.use('util.exec'); var exec = new util.exec();
541                 exec.chain( funcs );
542
543                 document.getElementById('execute').disabled = true;
544                 document.getElementById('upload').disabled = true;
545
546         },
547
548         'render_scriptlist' : function() {
549
550                 dump('render_scriptlist\n');
551
552                 document.getElementById('deck').selectedIndex = 1;
553
554                 var obj = this;
555
556                 obj.script_list.clear();
557
558                 var status = obj.ses_status();
559                 document.getElementById('status_caption').setAttribute('label','Uploaded Transactions for ' + status.description);
560
561                 var scripts = status.scripts;
562
563                 var funcs = [];
564                 for (var i = 0; i < scripts.length; i++) {
565                         funcs.push( 
566                                 function(row){ 
567                                         return function(){
568                                                 obj.script_list.append( { 'row' : row } );
569                                         };
570                                 }(scripts[i]) 
571                         );
572                 }
573                 JSAN.use('util.exec'); var exec = new util.exec();
574                 exec.chain( funcs );
575         },
576         
577         'render_errorlist' : function() {
578
579                 dump('render_errorlist\n');
580
581                 document.getElementById('deck').selectedIndex = 2;
582
583                 var obj = this;
584
585                 obj.error_list.clear();
586
587                 var error_meta = obj.ses_errors();
588                 document.getElementById('errors_caption').setAttribute('label','Exceptions for ' + error_meta.description);
589
590                 obj.errors = error_meta.errors;
591
592                 var funcs = [];
593                 for (var i = 0; i < obj.errors.length; i++) {
594                         funcs.push( 
595                                 function(idx,row){ 
596                                         return function(){
597                                                 obj.error_list.append( { 'retrieve_id' : idx, 'row' : row } );
598                                         };
599                                 }(i,obj.errors[i]) 
600                         );
601                 }
602                 JSAN.use('util.exec'); var exec = new util.exec();
603                 exec.chain( funcs );
604         },
605
606         'render_status' : function() {
607         
608                 dump('render_status\n');
609
610                 document.getElementById('deck').selectedIndex = 3;
611
612         },
613
614 }
615
616 dump('exiting admin/offline_manage_xacts.js\n');