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 = {
16 'init' : function( params ) {
20 JSAN.use('OpenILS.data'); obj.data = new OpenILS.data(); obj.data.init({'via':'stash'});
22 obj.init_list(); obj.init_script_list(); obj.init_error_list();
24 obj.retrieve_seslist(); obj.render_seslist();
26 var x = document.getElementById('create');
27 if (obj.check_perm(['OFFLINE_UPLOAD'])) {
29 x.addEventListener('command',function() { try{obj.create_ses();}catch(E){alert(E);} },false);
33 x.addEventListener('command',function() { try{obj.upload();}catch(E){alert(E);} },false);
36 x.addEventListener('command',function() { try{$('deck').selectedIndex=0;obj.retrieve_seslist();obj.render_seslist();}catch(E){alert(E);} },false);
39 x.addEventListener('command',function() { try{obj.execute_ses();}catch(E){alert(E);} },false);
41 x = obj.$('retrieve_item');
42 x.addEventListener('command',function() { try{obj.retrieve_item();}catch(E){alert(E);} },false);
44 x = obj.$('retrieve_patron');
45 x.addEventListener('command',function() { try{obj.retrieve_patron();}catch(E){alert(E);} },false);
47 x = obj.$('retrieve_details');
48 x.addEventListener('command',function() { try{obj.retrieve_details();}catch(E){alert(E);} },false);
50 obj.$('deck').selectedIndex = 0;
53 '$' : function(id) { return document.getElementById(id); },
55 'init_list' : function() {
56 var obj = this; JSAN.use('util.list');
57 obj.list = new util.list('session_tree');
61 'id' : 'org', 'hidden' : 'true', 'flex' : '1',
62 'label' : 'Organization',
63 'render' : 'data.hash.aou[ my.org ].shortname()',
66 'id' : 'description', 'flex' : '2',
67 'label' : 'Description',
68 'render' : "my.description",
71 'id' : 'create_time', 'flex' : '1',
72 'label' : 'Date Created',
73 'render' : 'if (my.create_time) { var x = new Date(); x.setTime(my.create_time+"000"); util.date.formatted_date(x,"%F %H:%M"); } else { ""; }',
76 'id' : 'creator', 'flex' : '1', 'hidden' : 'true',
77 'label' : 'Created By',
78 'render' : 'JSAN.use("patron.util"); var staff_obj = patron.util.retrieve_name_via_id( ses(), my.creator ); staff_obj[0] + " @ " + obj.data.hash.aou[ staff_obj[3] ].shortname();',
81 'id' : 'count', 'flex' : '1',
82 'label' : 'Upload Count',
83 'render' : "my.scripts.length",
86 'id' : 'num_complete', 'flex' : '1',
87 'label' : 'Transactions Processed',
88 'render' : "my.num_complete",
91 'id' : 'in_process', 'flex' : '1',
92 'label' : 'Processing?',
93 'render' : "if (my.end_time) { 'Completed' } else {my.in_process == 0 ? 'No' : 'Yes'}",
96 'id' : 'start_time', 'flex' : '1', 'hidden' : 'true',
97 'label' : 'Date Started',
98 'render' : 'if (my.start_time) {var x = new Date(); x.setTime(my.start_time+"000"); util.date.formatted_date(x,"%F %H:%M");} else { ""; }',
101 'id' : 'end_time', 'flex' : '1',
102 'label' : 'Date Completed',
103 'render' : 'if (my.end_time) {var x = new Date(); x.setTime(my.end_time+"000"); util.date.formatted_date(x,"%F %H:%M");} else { ""; }',
106 'id' : 'key', 'hidden' : 'true', 'flex' : '1',
111 'map_row_to_column' : function(row,col) {
112 JSAN.use('util.date');
113 JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
114 var my = row; var value;
115 try { value = eval( col.render ); } catch(E) { obj.error.sdump('D_ERROR',E); value = '???'; }
118 'on_select' : function(ev) {
120 $('deck').selectedIndex = 0;
121 $('execute').disabled = true;
122 $('upload').disabled = true;
126 JSAN.use('util.functional');
127 var sel = obj.list.retrieve_selection();
128 obj.sel_list = util.functional.map_list(
130 function(o) { return o.getAttribute('retrieve_id'); }
132 if (obj.sel_list.length == 0) return;
134 var upload = true; var process = true;
136 if (obj.sel_list.length > 1) upload = false;
138 if (obj.seslist[ obj.sel_list[0] ].end_time) {
139 upload = false; process = false;
141 if (obj.seslist[ obj.sel_list[0] ].in_process == 1) {
142 upload = false; process = false;
145 /* should we really have this next restriction? */
146 for (var i = 0; i < obj.seslist[ obj.sel_list[0] ].scripts.length; i++) {
147 if (obj.seslist[ obj.sel_list[0] ].scripts[i].workstation ==
148 obj.data.ws_name ) upload = false;
152 if (obj.check_perm(['OFFLINE_UPLOAD'])) {
153 document.getElementById('upload').disabled = false;
156 document.getElementById('upload').disabled = true;
159 if (obj.check_perm(['OFFLINE_EXECUTE'])) {
160 document.getElementById('execute').disabled = false;
163 document.getElementById('execute').disabled = true;
166 var complete = false;
167 for (var i = 0; i < obj.sel_list.length; i++) {
168 if (obj.seslist[ obj.sel_list[i] ].end_time) { complete = true; }
171 obj.render_errorlist();
173 if (obj.seslist[ obj.sel_list[0] ].in_process == 1) {
176 obj.render_scriptlist();
180 alert('on_select: ' + E);
185 alert('on_select:\nobj.seslist.length = ' + obj.seslist.length + ' obj.sel_list.length = ' + obj.sel_list.length + '\nerror: ' + E);
193 'init_script_list' : function() {
194 var obj = this; JSAN.use('util.list');
195 obj.script_list = new util.list('script_tree');
196 obj.script_list.init( {
199 'id' : 'create_time', 'flex' : '1',
200 'label' : 'Date Uploaded',
201 'render' : 'if (my.create_time) { var x = new Date(); x.setTime(my.create_time+"000"); util.date.formatted_date(x,"%F %H:%M"); } else { ""; }',
204 'id' : 'requestor', 'flex' : '1', 'hidden' : 'true',
205 'label' : 'Uploaded By',
206 'render' : 'JSAN.use("patron.util"); var staff_obj = patron.util.retrieve_name_via_id( ses(), my.requestor ); staff_obj[0] + " @ " + obj.data.hash.aou[ staff_obj[3] ].shortname();',
209 'id' : 'time_delta', 'hidden' : 'true', 'flex' : '1',
210 'label' : 'Server/Local Time Delta',
211 'render' : "my.time_delta",
214 'id' : 'workstation', 'flex' : '1',
215 'label' : 'Workstation',
216 'render' : "my.workstation",
219 'map_row_to_column' : function(row,col) {
220 JSAN.use('util.date');
221 JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
222 var my = row; var value;
223 try { value = eval( col.render ); } catch(E) { obj.error.sdump('D_ERROR',E); value = '???'; }
231 'init_error_list' : function() {
232 var obj = this; JSAN.use('util.list');
233 obj.error_list = new util.list('error_tree');
234 obj.error_list.init( {
237 'id' : 'workstation', 'flex' : '1',
238 'label' : 'Workstation',
239 'render' : 'my.command._workstation ? my.command._workstation : my.command._worksation',
242 'id' : 'timestamp', 'flex' : '1',
243 'label' : 'Timestamp',
244 '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; }',
247 'id' : 'type', 'flex' : '1',
249 'render' : 'my.command.type',
252 'id' : 'ilsevent', 'hidden' : 'true', 'flex' : '1',
253 'label' : 'Event Code',
254 'render' : "my.event.ilsevent",
257 'id' : 'textcode', 'flex' : '1',
258 'label' : 'Event Name',
259 'render' : "JSAN.use('util.functional'); typeof my.event.textcode != 'undefined' ? my.event.textcode : util.functional.map_list( my.event, function(o) { return o.textcode; }).join('/')",
262 'id' : 'desc', 'flex' : '1', 'hidden' : 'true',
263 'label' : 'Event Description',
264 'render' : "my.event.desc",
267 'id' : 'i_barcode', 'flex' : '1',
268 'label' : 'Item Barcode',
269 'render' : 'my.command.barcode ? my.command.barcode : ""',
272 'id' : 'p_barcode', 'flex' : '1',
273 'label' : 'Patron Barcode',
274 'render' : 'if (my.command.patron_barcode) { my.command.patron_barcode; } else { if (my.command.user.card.barcode) { my.command.user.card.barcode; } else { ""; } }',
277 'id' : 'duedate', 'flex' : '1', 'hidden' : 'true',
278 'label' : 'Due Date',
279 'render' : 'my.command.due_date || ""',
282 'id' : 'backdate', 'flex' : '1', 'hidden' : 'true',
283 'label' : 'Check In Backdate',
284 'render' : 'my.command.backdate || ""',
287 'id' : 'count', 'flex' : '1', 'hidden' : 'true',
288 'label' : 'In House Use Count',
289 'render' : 'my.command.count || ""',
292 'id' : 'noncat', 'flex' : '1', 'hidden' : 'true',
293 'label' : 'Non-Cataloged?',
294 'render' : 'my.command.noncat == 1 ? "Yes" : "No"',
297 'id' : 'noncat_type', 'flex' : '1', 'hidden' : 'true',
298 'label' : 'Non-Cataloged Type',
299 'render' : 'data.hash.cnct[ my.command.noncat_type ] ? data.hash.cnct[ my.command.noncat_type ].name() : ""',
302 'id' : 'noncat_count', 'flex' : '1', 'hidden' : 'true',
303 'label' : 'Non-Cataloged Count',
304 'render' : 'my.command.noncat_count || ""',
307 'map_row_to_column' : function(row,col) {
308 JSAN.use('util.date');
309 JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
310 var my = row; var value;
311 try { value = eval( col.render ); } catch(E) { obj.error.sdump('D_ERROR',E); value = '???'; }
314 'on_select' : function(ev) {
316 var sel = obj.error_list.retrieve_selection();
317 obj.sel_errors = util.functional.map_list(
319 function(o) { return o.getAttribute('retrieve_id'); }
321 if (obj.sel_errors.length > 0) {
322 obj.$('retrieve_item').disabled = false;
323 obj.$('retrieve_patron').disabled = false;
324 obj.$('retrieve_details').disabled = false;
326 obj.$('retrieve_item').disabled = true;
327 obj.$('retrieve_patron').disabled = true;
328 obj.$('retrieve_details').disabled = true;
339 'check_perm' : function(perms) {
341 var robj = obj.network.simple_request('PERM_CHECK',[ses(),obj.data.list.au[0].id(),obj.data.list.au[0].ws_ou(),perms]);
342 if (typeof robj.ilsevent != 'undefined') {
343 obj.error.standard_unexpected_error_alert('check permission',E);
346 return robj.length == 0 ? true : false;
349 'execute_ses' : function() {
353 obj.data.stash_retrieve();
355 for (var i = 0; i < obj.sel_list.length; i++) {
357 var url = xulG.url_prefix(urls.XUL_OFFLINE_MANAGE_XACTS_CGI)
358 + "?ses=" + window.escape(ses())
360 + "&seskey=" + window.escape(obj.seslist[obj.sel_list[i]].key)
361 + "&ws=" + window.escape(obj.data.ws_name);
362 var x = new XMLHttpRequest();
363 x.open("GET",url,false);
366 dump(url + ' = ' + x.responseText + '\n' );
367 var robj = JSON2js(x.responseText);
369 if (robj.ilsevent != 0) { alert('Execute error: ' + x.responseText); }
371 obj.retrieve_seslist(); obj.render_seslist();
375 'ses_errors' : function() {
379 obj.data.stash_retrieve();
381 var url = xulG.url_prefix(urls.XUL_OFFLINE_MANAGE_XACTS_CGI)
382 + "?ses=" + window.escape(ses())
384 + "&seskey=" + window.escape(obj.seslist[ obj.sel_list[0] ].key)
385 + "&ws=" + window.escape(obj.data.ws_name)
386 + '&status_type=exceptions';
387 var x = new XMLHttpRequest();
388 x.open("GET",url,false);
391 dump(url + ' = ' + x.responseText + '\n' );
392 var robj = JSON2js(x.responseText);
394 return { 'errors' : robj, 'description' : obj.seslist[ obj.sel_list[0] ].description };
398 'rename_file' : function() {
399 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
401 JSAN.use('util.file');
402 var pending = new util.file('pending_xacts');
403 if ( !pending._file.exists() ) { throw("Can't rename a non-existent file"); }
404 obj.transition_filename = 'pending_xacts_' + new Date().getTime();
406 var file = new util.file(obj.transition_filename);
407 while (file._file.exists()) {
408 obj.transition_filename = 'pending_xacts_' + new Date().getTime();
409 file = new util.file(obj.transition_filename);
410 if (count++>100) throw("Taking too long to find a unique filename.");
412 pending._file.moveTo(null,obj.transition_filename);
415 'revert_file' : function() {
416 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
418 JSAN.use('util.file');
419 var pending = new util.file('pending_xacts');
420 if (pending._file.exists()) { obj.error.yns_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,'Scary Error','Ok',null,null,'Check here to confirm this message'); return; }
421 var file = new util.file(obj.transition_filename);
422 file._file.moveTo(null,'pending_xacts');
425 'archive_file' : function() {
426 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
428 JSAN.use('util.file');
429 var file = new util.file(obj.transition_filename);
430 if (file._file.exists()) file._file.moveTo(null,obj.transition_filename + '.complete')
433 'upload' : function() {
434 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
436 if (obj.sel_list.length == 0) { alert('Please select a session to upload to.'); return; }
437 if (obj.sel_list.length > 1) { alert('Please select a single session to upload to.'); return; }
439 JSAN.use('util.file');
441 var file = new util.file('pending_xacts');
442 if (!file._file.exists()) { alert('No pending transactions to upload.'); return; }
446 obj.data.stash_retrieve();
447 var seskey = obj.seslist[ obj.sel_list[0] ].key;
448 JSAN.use('util.widgets');
449 var xx = document.getElementById('iframe_placeholder'); util.widgets.remove_children(xx);
450 var x = document.createElement('iframe'); xx.appendChild(x); x.flex = 1;
453 window.xulG.url_prefix( urls.XUL_REMOTE_BROWSER )
454 + '?url=' + window.escape(
455 urls.XUL_OFFLINE_UPLOAD_XACTS
456 + '?ses=' + window.escape(ses())
457 + '&seskey=' + window.escape(seskey)
458 + '&ws=' + window.escape(obj.data.ws_name)
459 + '&delta=' + window.escape('0')
460 + '&filename=' + window.escape( obj.transition_filename )
464 'url_prefix' : window.xulG.url_prefix,
465 'passthru_content_params' : {
466 'url_prefix' : window.xulG.url_prefix,
467 'handle_event' : function(robj){
468 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
470 dump('robj = ' + js2JSON(robj) + '\n');
471 if ( robj.ilsevent != 0 ) {
473 alert('There was an error:\n' + js2JSON(robj));
477 obj.retrieve_seslist(); obj.render_seslist();
480 JSAN.use('util.widgets');
481 util.widgets.remove_children('iframe_placeholder');
485 alert('handle_event error: ' + E);
490 x.contentWindow.xulG = newG;
493 'ses_status' : function() {
497 obj.data.stash_retrieve();
499 var url = xulG.url_prefix(urls.XUL_OFFLINE_MANAGE_XACTS_CGI)
500 + "?ses=" + window.escape(ses())
502 + "&seskey=" + window.escape(obj.seslist[obj.sel_list[0]].key)
503 + "&ws=" + window.escape(obj.data.ws_name)
504 + "&status_type=scripts";
505 var x = new XMLHttpRequest();
506 x.open("GET",url,false);
509 dump(url + ' = ' + x.responseText + '\n' );
510 var robj = JSON2js(x.responseText);
515 'create_ses' : function() {
519 var desc = window.prompt('Please enter a description:','','Create an Offline Transaction Session');
520 if (desc=='' || desc==null) { return; }
523 obj.data.stash_retrieve();
525 var url = xulG.url_prefix(urls.XUL_OFFLINE_MANAGE_XACTS_CGI)
526 + "?ses=" + window.escape(ses())
528 + "&desc=" + window.escape(desc)
529 + "&ws=" + window.escape(obj.data.ws_name);
530 var x = new XMLHttpRequest();
531 x.open("GET",url,false);
534 dump(url + ' = ' + x.responseText + '\n' );
535 var robj = JSON2js(x.responseText);
536 if (robj.ilsevent == 0) {
537 obj.retrieve_seslist(); obj.render_seslist();
539 alert('Error: ' + x.responseText);
543 'retrieve_seslist' : function() {
550 obj.data.stash_retrieve();
552 var url = xulG.url_prefix(urls.XUL_OFFLINE_MANAGE_XACTS_CGI)
553 + "?ses=" + window.escape(ses())
555 + "&org=" + window.escape(obj.data.list.au[0].ws_ou())
556 + "&status_type=sessions";
557 var x = new XMLHttpRequest();
558 x.open("GET",url,false);
561 dump(url + ' = ' + x.responseText + '\n' );
563 var robj = JSON2js( x.responseText );
564 if (typeof robj.ilsevent != 'undefined') throw(robj);
566 obj.seslist = robj.sort(
568 return b.create_time - a.create_time;
573 obj.error.standard_unexpected_error_alert('Error retrieving offline sessions.',E);
577 'render_seslist' : function() {
581 var old_idx = obj.list.node.currentIndex;
582 if (old_idx < 0) old_idx = 0;
587 for (var i = 0; i < obj.seslist.length; i++) {
591 obj.list.append( { 'retrieve_id' : idx, 'row' : row } );
592 if (idx == old_idx) obj.list.node.view.selection.select(idx);
598 JSAN.use('util.exec'); var exec = new util.exec();
601 document.getElementById('execute').disabled = true;
602 document.getElementById('upload').disabled = true;
606 'render_scriptlist' : function() {
608 dump('render_scriptlist\n');
610 document.getElementById('deck').selectedIndex = 1;
614 obj.script_list.clear();
616 var status = obj.ses_status();
617 document.getElementById('status_caption').setAttribute('label','Uploaded Transactions for ' + status.description);
619 var scripts = status.scripts;
622 for (var i = 0; i < scripts.length; i++) {
626 obj.script_list.append( { 'row' : row } );
631 JSAN.use('util.exec'); var exec = new util.exec();
635 'render_errorlist' : function() {
637 dump('render_errorlist\n');
639 document.getElementById('deck').selectedIndex = 2;
643 obj.error_list.clear();
645 var error_meta = obj.ses_errors();
646 document.getElementById('errors_caption').setAttribute('label','Exceptions for ' + error_meta.description);
648 obj.errors = error_meta.errors;
651 for (var i = 0; i < obj.errors.length; i++) {
655 obj.error_list.append( { 'retrieve_id' : idx, 'row' : row } );
660 JSAN.use('util.exec'); var exec = new util.exec();
664 'render_status' : function() {
666 dump('render_status\n');
668 document.getElementById('deck').selectedIndex = 3;
672 'retrieve_item' : function() {
676 for (var i = 0; i < obj.sel_errors.length; i++) {
677 var error = obj.errors[ obj.sel_errors[i] ];
678 if ( ! error.command.barcode ) continue;
679 if ( [ '', ' ', '???' ].indexOf( error.command.barcode ) != -1 ) continue;
680 barcodes.push( error.command.barcode );
682 if (typeof window.xulG == 'object' && typeof window.xulG.new_tab == 'function') {
684 var url = urls.XUL_COPY_STATUS
685 + '?barcodes=' + window.escape( js2JSON(barcodes) );
698 'retrieve_patron' : function() {
701 for (var i = 0; i < obj.sel_errors.length; i++) {
702 var error = obj.errors[ obj.sel_errors[i] ];
703 if ( ! error.command.patron_barcode ) continue;
704 if ( [ '', ' ', '???' ].indexOf( error.command.patron_barcode ) != -1 ) continue;
705 if (typeof window.xulG == 'object' && typeof window.xulG.new_tab == 'function') {
707 var url = urls.XUL_PATRON_DISPLAY
708 + '?barcode=' + window.escape( error.command.patron_barcode );
722 'retrieve_details' : function() {
724 JSAN.use('util.window'); var win = new util.window();
726 for (var i = 0; i < obj.sel_errors.length; i++) {
727 var error = obj.errors[ obj.sel_errors[i] ];
729 'data:text/plain,' + window.escape(
730 'Details:\n' + obj.error.pretty_print(js2JSON(error))
732 'offline_error_details',
733 'chrome,resizable,modal'
743 dump('exiting admin/offline_manage_xacts.js\n');