1 dump('entering admin/offline_manage_xacts.js\n');
3 if (typeof admin == 'undefined') admin = {};
4 admin.offline_manage_xacts = function (params) {
6 JSAN.use('util.error'); this.error = new util.error();
7 JSAN.use('util.network'); this.network = new util.network();
10 admin.offline_manage_xacts.prototype = {
15 'init' : function( params ) {
19 JSAN.use('OpenILS.data'); obj.data = new OpenILS.data(); obj.data.init({'via':'stash'});
21 obj.init_list(); obj.init_script_list(); obj.init_error_list();
23 obj.retrieve_seslist(); obj.render_seslist();
25 var x = document.getElementById('create');
26 if (obj.check_perm(obj.session,'OFFLINE_CREATE_SESSION')) {
28 x.addEventListener('command',function() { try{obj.create_ses();}catch(E){alert(E);} },false);
31 x = document.getElementById('upload');
32 x.addEventListener('command',function() { try{obj.upload();}catch(E){alert(E);} },false);
34 x = document.getElementById('refresh');
35 x.addEventListener('command',function() { try{obj.retrieve_seslist();obj.render_seslist();}catch(E){alert(E);} },false);
37 x = document.getElementById('execute');
38 x.addEventListener('command',function() { try{obj.execute_ses();}catch(E){alert(E);} },false);
40 document.getElementById('deck').selectedIndex = 2;
43 'init_list' : function() {
44 var obj = this; JSAN.use('util.list');
45 obj.list = new util.list('session_tree');
49 'id' : 'org', 'hidden' : 'true', 'flex' : '1',
50 'label' : 'Organization',
51 'render' : 'data.hash.aou[ my.org ].shortname()',
54 'id' : 'description', 'flex' : '2',
55 'label' : 'Description',
56 'render' : "my.description",
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 { ""; }',
64 'id' : 'creator', 'flex' : '1', 'hidden' : 'true',
65 'label' : 'Created By',
66 'render' : 'my.creator',
69 'id' : 'count', 'flex' : '1',
70 'label' : 'Upload Count',
71 'render' : "my.scripts.length",
74 'id' : 'num_complete', 'flex' : '1',
75 'label' : 'Transactions Processed',
76 'render' : "my.num_complete",
79 'id' : 'in_process', 'flex' : '1',
80 'label' : 'Processing?',
81 'render' : "if (my.end_time) { 'Completed' } else {my.in_process == 0 ? 'No' : 'Yes'}",
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 { ""; }',
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 { ""; }',
94 'id' : 'key', 'hidden' : 'true', 'flex' : '1',
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 = '???'; }
106 'on_select' : function(ev) {
108 JSAN.use('util.functional');
109 var sel = obj.list.retrieve_selection();
110 obj.sel_list = util.functional.map_list(
112 function(o) { return o.getAttribute('retrieve_id'); }
114 if (obj.sel_list.length == 0) return;
116 var upload = true; var process = true;
118 if (obj.sel_list.length > 1) upload = false;
120 if (obj.seslist[ obj.sel_list[0] ].end_time) {
121 upload = false; process = false;
123 if (obj.seslist[ obj.sel_list[0] ].in_process == 1) {
124 upload = false; process = false;
127 /* should we really have this next restriction? */
128 for (var i = 0; i < obj.seslist[ obj.sel_list[0] ].scripts.length; i++) {
129 if (obj.seslist[ obj.sel_list[0] ].scripts[i].workstation ==
130 obj.data.ws_name ) upload = false;
134 if (obj.check_perm(obj.session,'OFFLINE_UPLOAD_XACTS')) {
135 document.getElementById('upload').disabled = false;
138 document.getElementById('upload').disabled = true;
141 if (obj.check_perm(obj.session,'OFFLINE_EXECUTE_SESSION')) {
142 document.getElementById('execute').disabled = false;
145 document.getElementById('execute').disabled = true;
148 var complete = false;
149 for (var i = 0; i < obj.sel_list.length; i++) {
150 if (obj.seslist[ obj.sel_list[i] ].end_time) { complete = true; }
153 obj.render_errorlist();
155 obj.render_scriptlist();
158 alert('on_select:\nobj.seslist.length = ' + obj.seslist.length + ' obj.sel_list.length = ' + obj.sel_list.length + '\nerror: ' + E);
166 'init_script_list' : function() {
167 var obj = this; JSAN.use('util.list');
168 obj.script_list = new util.list('script_tree');
169 obj.script_list.init( {
172 'id' : 'create_time', 'flex' : '1',
173 'label' : 'Date Uploaded',
174 'render' : 'if (my.create_time) { var x = new Date(); x.setTime(my.create_time+"000"); util.date.formatted_date(x,"%F %H:%M"); } else { ""; }',
177 'id' : 'requestor', 'flex' : '1', 'hidden' : 'true',
178 'label' : 'Uploaded By',
179 'render' : 'my.requestor',
182 'id' : 'time_delta', 'hidden' : 'true', 'flex' : '1',
183 'label' : 'Server/Local Time Delta',
184 'render' : "my.time_delta",
187 'id' : 'workstation', 'flex' : '1',
188 'label' : 'Workstation',
189 'render' : "my.workstation",
192 'map_row_to_column' : function(row,col) {
193 JSAN.use('util.date');
194 JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
195 var my = row; var value;
196 try { value = eval( col.render ); } catch(E) { obj.error.sdump('D_ERROR',E); value = '???'; }
204 'init_error_list' : function() {
205 var obj = this; JSAN.use('util.list');
206 obj.error_list = new util.list('error_tree');
207 obj.error_list.init( {
210 'id' : 'workstation', 'flex' : '1',
211 'label' : 'Workstation',
212 'render' : 'my.command._workstation ? my.command._workstation : my.command._worksation',
215 'id' : 'timestamp', 'flex' : '1',
216 'label' : 'Timestamp',
217 '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; }',
220 'id' : 'type', 'flex' : '1',
222 'render' : 'my.command.type',
225 'id' : 'ilsevent', 'hidden' : 'true', 'flex' : '1',
226 'label' : 'Event Code',
227 'render' : "my.event.ilsevent",
230 'id' : 'textcode', 'flex' : '1',
231 'label' : 'Event Name',
232 'render' : "my.event.textcode",
235 'id' : 'i_barcode', 'flex' : '1',
236 'label' : 'Item Barcode',
237 'render' : 'my.command.barcode ? my.command.barcode : ""',
240 'id' : 'p_barcode', 'flex' : '1',
241 'label' : 'Patron Barcode',
242 'render' : 'if (my.command.patron_barcode) { my.command.patron_barcode; } else { if (my.command.user.card.barcode) { my.command.user.card.barcode; } else { ""; } }',
245 'id' : 'duedate', 'flex' : '1', 'hidden' : 'true',
246 'label' : 'Due Date',
247 'render' : 'my.command.due_date || ""',
250 'id' : 'backdate', 'flex' : '1', 'hidden' : 'true',
251 'label' : 'Check In Backdate',
252 'render' : 'my.command.backdate || ""',
255 'id' : 'count', 'flex' : '1', 'hidden' : 'true',
256 'label' : 'In House Use Count',
257 'render' : 'my.command.count || ""',
260 'id' : 'noncat', 'flex' : '1', 'hidden' : 'true',
261 'label' : 'Non-Cataloged?',
262 'render' : 'my.command.noncat == 1 ? "Yes" : "No"',
265 'id' : 'noncat_type', 'flex' : '1', 'hidden' : 'true',
266 'label' : 'Non-Cataloged Type',
267 'render' : 'data.hash.cnct[ my.command.noncat_type ] ? data.hash.cnct[ my.command.noncat_type ].name() : ""',
270 'id' : 'noncat_count', 'flex' : '1', 'hidden' : 'true',
271 'label' : 'Non-Cataloged Count',
272 'render' : 'my.command.noncat_count || ""',
275 'map_row_to_column' : function(row,col) {
276 JSAN.use('util.date');
277 JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
278 var my = row; var value;
279 try { value = eval( col.render ); } catch(E) { obj.error.sdump('D_ERROR',E); value = '???'; }
287 'check_perm' : function(ses,perms) {
288 return true; /* FIXME */
291 'execute_ses' : function() {
294 obj.data.stash_retrieve();
296 for (var i = 0; i < obj.sel_list.length; i++) {
298 var url = xulG.url_prefix(urls.XUL_OFFLINE_MANAGE_XACTS_CGI)
299 + "?ses=" + window.escape(obj.data.session)
301 + "&seskey=" + window.escape(obj.seslist[obj.sel_list[i]].key)
302 + "&ws=" + window.escape(obj.data.ws_name);
303 var x = new XMLHttpRequest();
304 x.open("GET",url,false);
307 dump(url + ' = ' + x.responseText + '\n' );
308 var robj = JSON2js(x.responseText);
310 if (robj.ilsevent != 0) { alert('Execute error: ' + x.responseText); }
312 obj.retrieve_seslist(); obj.render_seslist();
316 'ses_errors' : function() {
319 obj.data.stash_retrieve();
321 var url = xulG.url_prefix(urls.XUL_OFFLINE_MANAGE_XACTS_CGI)
322 + "?ses=" + window.escape(obj.data.session)
324 + "&seskey=" + window.escape(obj.seslist[ obj.sel_list[0] ].key)
325 + "&ws=" + window.escape(obj.data.ws_name)
326 + '&status_type=exceptions';
327 var x = new XMLHttpRequest();
328 x.open("GET",url,false);
331 dump(url + ' = ' + x.responseText + '\n' );
332 var robj = JSON2js(x.responseText);
334 return { 'errors' : robj, 'description' : obj.seslist[ obj.sel_list[0] ].description };
338 'rename_file' : function() {
339 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
341 JSAN.use('util.file');
342 var pending = new util.file('pending_xacts');
343 if ( !pending._file.exists() ) { throw("Can't rename a non-existent file"); }
344 obj.transition_filename = 'pending_xacts_' + new Date().getTime();
346 var file = new util.file(obj.transition_filename);
347 while (file._file.exists()) {
348 obj.transition_filename = 'pending_xacts_' + new Date().getTime();
349 file = new util.file(obj.transition_filename);
350 if (count++>100) throw("Taking too long to find a unique filename.");
352 pending._file.moveTo(null,obj.transition_filename);
355 'revert_file' : function() {
356 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
358 JSAN.use('util.file');
359 var pending = new util.file('pending_xacts');
360 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; }
361 var file = new util.file(obj.transition_filename);
362 file._file.moveTo(null,'pending_xacts');
365 'archive_file' : function() {
366 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
368 JSAN.use('util.file');
369 var file = new util.file(obj.transition_filename);
370 if (file._file.exists()) file._file.moveTo(null,obj.transition_filename + '.complete')
373 'upload' : function() {
374 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
376 if (obj.sel_list.length == 0) { alert('Please select a session to upload to.'); return; }
377 if (obj.sel_list.length > 1) { alert('Please select a single session to upload to.'); return; }
379 JSAN.use('util.file');
381 var file = new util.file('pending_xacts');
382 if (!file._file.exists()) { alert('No pending transactions to upload.'); return; }
386 obj.data.stash_retrieve();
387 var seskey = obj.seslist[ obj.sel_list[0] ].key;
388 JSAN.use('util.widgets');
389 var xx = document.getElementById('iframe_placeholder'); util.widgets.remove_children(xx);
390 var x = document.createElement('iframe'); xx.appendChild(x); x.flex = 1;
393 window.xulG.url_prefix( urls.XUL_REMOTE_BROWSER )
394 + '?url=' + window.escape(
395 urls.XUL_OFFLINE_UPLOAD_XACTS
396 + '?ses=' + window.escape(obj.data.session)
397 + '&seskey=' + window.escape(seskey)
398 + '&ws=' + window.escape(obj.data.ws_name)
399 + '&delta=' + window.escape('0')
400 + '&filename=' + window.escape( obj.transition_filename )
404 'url_prefix' : window.xulG.url_prefix,
405 'passthru_content_params' : {
406 'url_prefix' : window.xulG.url_prefix,
407 'handle_event' : function(robj){
408 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
410 dump('robj = ' + js2JSON(robj) + '\n');
411 if ( robj.ilsevent != 0 ) {
413 alert('There was an error:\n' + js2JSON(robj));
417 obj.retrieve_seslist(); obj.render_seslist();
420 JSAN.use('util.widgets');
421 util.widgets.remove_children('iframe_placeholder');
425 alert('handle_event error: ' + E);
430 x.contentWindow.xulG = newG;
433 'ses_status' : function() {
436 obj.data.stash_retrieve();
438 var url = xulG.url_prefix(urls.XUL_OFFLINE_MANAGE_XACTS_CGI)
439 + "?ses=" + window.escape(obj.data.session)
441 + "&seskey=" + window.escape(obj.seslist[obj.sel_list[0]].key)
442 + "&ws=" + window.escape(obj.data.ws_name)
443 + "&status_type=scripts";
444 var x = new XMLHttpRequest();
445 x.open("GET",url,false);
448 dump(url + ' = ' + x.responseText + '\n' );
449 var robj = JSON2js(x.responseText);
454 'create_ses' : function() {
458 var desc = window.prompt('Please enter a description:','','Create an Offline Transaction Session');
459 if (desc=='' || desc==null) { return; }
461 obj.data.stash_retrieve();
463 var url = xulG.url_prefix(urls.XUL_OFFLINE_MANAGE_XACTS_CGI)
464 + "?ses=" + window.escape(obj.data.session)
466 + "&desc=" + window.escape(desc)
467 + "&ws=" + window.escape(obj.data.ws_name);
468 var x = new XMLHttpRequest();
469 x.open("GET",url,false);
472 dump(url + ' = ' + x.responseText + '\n' );
473 var robj = JSON2js(x.responseText);
474 if (robj.ilsevent == 0) {
475 obj.retrieve_seslist(); obj.render_seslist();
477 alert('Error: ' + x.responseText);
481 'retrieve_seslist' : function() {
485 obj.data.stash_retrieve();
487 var url = xulG.url_prefix(urls.XUL_OFFLINE_MANAGE_XACTS_CGI)
488 + "?ses=" + window.escape(obj.data.session)
490 + "&org=" + window.escape(obj.data.list.au[0].ws_ou())
491 + "&status_type=sessions";
492 var x = new XMLHttpRequest();
493 x.open("GET",url,false);
496 dump(url + ' = ' + x.responseText + '\n' );
497 obj.seslist = JSON2js( x.responseText );
500 'render_seslist' : function() {
507 for (var i = 0; i < obj.seslist.length; i++) {
511 obj.list.append( { 'retrieve_id' : idx, 'row' : row } );
516 JSAN.use('util.exec'); var exec = new util.exec();
519 document.getElementById('execute').disabled = true;
520 document.getElementById('upload').disabled = true;
524 'render_scriptlist' : function() {
526 dump('render_scriptlist\n');
528 document.getElementById('deck').selectedIndex = 0;
532 obj.script_list.clear();
534 var status = obj.ses_status();
535 document.getElementById('status_caption').setAttribute('label','Uploaded Transactions for ' + status.description);
537 var scripts = status.scripts;
540 for (var i = 0; i < scripts.length; i++) {
544 obj.script_list.append( { 'row' : row } );
549 JSAN.use('util.exec'); var exec = new util.exec();
553 'render_errorlist' : function() {
555 dump('render_errorlist\n');
557 document.getElementById('deck').selectedIndex = 1;
561 obj.error_list.clear();
563 var error_meta = obj.ses_errors();
564 document.getElementById('errors_caption').setAttribute('label','Exceptions for ' + error_meta.description);
566 obj.errors = error_meta.errors;
569 for (var i = 0; i < obj.errors.length; i++) {
573 obj.error_list.append( { 'retrieve_id' : idx, 'row' : row } );
578 JSAN.use('util.exec'); var exec = new util.exec();
584 dump('exiting admin/offline_manage_xacts.js\n');