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{$('deck').selectedIndex=0;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 = 0;
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 $('deck').selectedIndex = 0;
109 $('execute').disabled = true;
110 $('upload').disabled = true;
114 JSAN.use('util.functional');
115 var sel = obj.list.retrieve_selection();
116 obj.sel_list = util.functional.map_list(
118 function(o) { return o.getAttribute('retrieve_id'); }
120 if (obj.sel_list.length == 0) return;
122 var upload = true; var process = true;
124 if (obj.sel_list.length > 1) upload = false;
126 if (obj.seslist[ obj.sel_list[0] ].end_time) {
127 upload = false; process = false;
129 if (obj.seslist[ obj.sel_list[0] ].in_process == 1) {
130 upload = false; process = false;
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;
140 if (obj.check_perm(obj.session,'OFFLINE_UPLOAD_XACTS')) {
141 document.getElementById('upload').disabled = false;
144 document.getElementById('upload').disabled = true;
147 if (obj.check_perm(obj.session,'OFFLINE_EXECUTE_SESSION')) {
148 document.getElementById('execute').disabled = false;
151 document.getElementById('execute').disabled = true;
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; }
159 obj.render_errorlist();
161 if (obj.seslist[ obj.sel_list[0] ].in_process == 1) {
164 obj.render_scriptlist();
168 alert('on_select: ' + E);
173 alert('on_select:\nobj.seslist.length = ' + obj.seslist.length + ' obj.sel_list.length = ' + obj.sel_list.length + '\nerror: ' + E);
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( {
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 { ""; }',
192 'id' : 'requestor', 'flex' : '1', 'hidden' : 'true',
193 'label' : 'Uploaded By',
194 'render' : 'my.requestor',
197 'id' : 'time_delta', 'hidden' : 'true', 'flex' : '1',
198 'label' : 'Server/Local Time Delta',
199 'render' : "my.time_delta",
202 'id' : 'workstation', 'flex' : '1',
203 'label' : 'Workstation',
204 'render' : "my.workstation",
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 = '???'; }
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( {
225 'id' : 'workstation', 'flex' : '1',
226 'label' : 'Workstation',
227 'render' : 'my.command._workstation ? my.command._workstation : my.command._worksation',
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; }',
235 'id' : 'type', 'flex' : '1',
237 'render' : 'my.command.type',
240 'id' : 'ilsevent', 'hidden' : 'true', 'flex' : '1',
241 'label' : 'Event Code',
242 'render' : "my.event.ilsevent",
245 'id' : 'textcode', 'flex' : '1',
246 'label' : 'Event Name',
247 'render' : "my.event.textcode",
250 'id' : 'i_barcode', 'flex' : '1',
251 'label' : 'Item Barcode',
252 'render' : 'my.command.barcode ? my.command.barcode : ""',
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 { ""; } }',
260 'id' : 'duedate', 'flex' : '1', 'hidden' : 'true',
261 'label' : 'Due Date',
262 'render' : 'my.command.due_date || ""',
265 'id' : 'backdate', 'flex' : '1', 'hidden' : 'true',
266 'label' : 'Check In Backdate',
267 'render' : 'my.command.backdate || ""',
270 'id' : 'count', 'flex' : '1', 'hidden' : 'true',
271 'label' : 'In House Use Count',
272 'render' : 'my.command.count || ""',
275 'id' : 'noncat', 'flex' : '1', 'hidden' : 'true',
276 'label' : 'Non-Cataloged?',
277 'render' : 'my.command.noncat == 1 ? "Yes" : "No"',
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() : ""',
285 'id' : 'noncat_count', 'flex' : '1', 'hidden' : 'true',
286 'label' : 'Non-Cataloged Count',
287 'render' : 'my.command.noncat_count || ""',
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 = '???'; }
302 'check_perm' : function(ses,perms) {
303 return true; /* FIXME */
306 'execute_ses' : function() {
309 obj.data.stash_retrieve();
311 for (var i = 0; i < obj.sel_list.length; i++) {
313 var url = xulG.url_prefix(urls.XUL_OFFLINE_MANAGE_XACTS_CGI)
314 + "?ses=" + window.escape(obj.data.session)
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);
322 dump(url + ' = ' + x.responseText + '\n' );
323 var robj = JSON2js(x.responseText);
325 if (robj.ilsevent != 0) { alert('Execute error: ' + x.responseText); }
327 obj.retrieve_seslist(); obj.render_seslist();
331 'ses_errors' : function() {
334 obj.data.stash_retrieve();
336 var url = xulG.url_prefix(urls.XUL_OFFLINE_MANAGE_XACTS_CGI)
337 + "?ses=" + window.escape(obj.data.session)
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);
346 dump(url + ' = ' + x.responseText + '\n' );
347 var robj = JSON2js(x.responseText);
349 return { 'errors' : robj, 'description' : obj.seslist[ obj.sel_list[0] ].description };
353 'rename_file' : function() {
354 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
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();
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.");
367 pending._file.moveTo(null,obj.transition_filename);
370 'revert_file' : function() {
371 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
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');
380 'archive_file' : function() {
381 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
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')
388 'upload' : function() {
389 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
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; }
394 JSAN.use('util.file');
396 var file = new util.file('pending_xacts');
397 if (!file._file.exists()) { alert('No pending transactions to upload.'); return; }
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;
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 )
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");
425 dump('robj = ' + js2JSON(robj) + '\n');
426 if ( robj.ilsevent != 0 ) {
428 alert('There was an error:\n' + js2JSON(robj));
432 obj.retrieve_seslist(); obj.render_seslist();
435 JSAN.use('util.widgets');
436 util.widgets.remove_children('iframe_placeholder');
440 alert('handle_event error: ' + E);
445 x.contentWindow.xulG = newG;
448 'ses_status' : function() {
451 obj.data.stash_retrieve();
453 var url = xulG.url_prefix(urls.XUL_OFFLINE_MANAGE_XACTS_CGI)
454 + "?ses=" + window.escape(obj.data.session)
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);
463 dump(url + ' = ' + x.responseText + '\n' );
464 var robj = JSON2js(x.responseText);
469 'create_ses' : function() {
473 var desc = window.prompt('Please enter a description:','','Create an Offline Transaction Session');
474 if (desc=='' || desc==null) { return; }
476 obj.data.stash_retrieve();
478 var url = xulG.url_prefix(urls.XUL_OFFLINE_MANAGE_XACTS_CGI)
479 + "?ses=" + window.escape(obj.data.session)
481 + "&desc=" + window.escape(desc)
482 + "&ws=" + window.escape(obj.data.ws_name);
483 var x = new XMLHttpRequest();
484 x.open("GET",url,false);
487 dump(url + ' = ' + x.responseText + '\n' );
488 var robj = JSON2js(x.responseText);
489 if (robj.ilsevent == 0) {
490 obj.retrieve_seslist(); obj.render_seslist();
492 alert('Error: ' + x.responseText);
496 'retrieve_seslist' : function() {
500 obj.data.stash_retrieve();
502 var url = xulG.url_prefix(urls.XUL_OFFLINE_MANAGE_XACTS_CGI)
503 + "?ses=" + window.escape(obj.data.session)
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);
511 dump(url + ' = ' + x.responseText + '\n' );
512 obj.seslist = JSON2js( x.responseText ).sort(
514 return b.create_time - a.create_time;
519 'render_seslist' : function() {
523 var old_idx = obj.list.node.currentIndex;
524 if (old_idx < 0) old_idx = 0;
529 for (var i = 0; i < obj.seslist.length; i++) {
533 obj.list.append( { 'retrieve_id' : idx, 'row' : row } );
534 if (idx == old_idx) obj.list.node.view.selection.select(idx);
540 JSAN.use('util.exec'); var exec = new util.exec();
543 document.getElementById('execute').disabled = true;
544 document.getElementById('upload').disabled = true;
548 'render_scriptlist' : function() {
550 dump('render_scriptlist\n');
552 document.getElementById('deck').selectedIndex = 1;
556 obj.script_list.clear();
558 var status = obj.ses_status();
559 document.getElementById('status_caption').setAttribute('label','Uploaded Transactions for ' + status.description);
561 var scripts = status.scripts;
564 for (var i = 0; i < scripts.length; i++) {
568 obj.script_list.append( { 'row' : row } );
573 JSAN.use('util.exec'); var exec = new util.exec();
577 'render_errorlist' : function() {
579 dump('render_errorlist\n');
581 document.getElementById('deck').selectedIndex = 2;
585 obj.error_list.clear();
587 var error_meta = obj.ses_errors();
588 document.getElementById('errors_caption').setAttribute('label','Exceptions for ' + error_meta.description);
590 obj.errors = error_meta.errors;
593 for (var i = 0; i < obj.errors.length; i++) {
597 obj.error_list.append( { 'retrieve_id' : idx, 'row' : row } );
602 JSAN.use('util.exec'); var exec = new util.exec();
606 'render_status' : function() {
608 dump('render_status\n');
610 document.getElementById('deck').selectedIndex = 3;
616 dump('exiting admin/offline_manage_xacts.js\n');