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'); JSAN.use('util.date'); JSAN.use('patron.util');
57 obj.list = new util.list('session_tree');
61 'id' : 'org', 'hidden' : 'true', 'flex' : '1',
62 'label' : 'Organization',
63 'render' : function(my) { return obj.data.hash.aou[ my.org ].shortname(); },
66 'id' : 'description', 'flex' : '2',
67 'label' : 'Description',
68 'render' : function(my) { return my.description; },
71 'id' : 'create_time', 'flex' : '1',
72 'label' : 'Date Created',
73 'render' : function(my) { if (my.create_time) { var x = new Date(); x.setTime(my.create_time+"000"); return util.date.formatted_date(x,"%F %H:%M"); } else { return ""; }; },
76 'id' : 'creator', 'flex' : '1', 'hidden' : 'true',
77 'label' : 'Created By',
78 'render' : function(my) { var staff_obj = patron.util.retrieve_name_via_id( ses(), my.creator ); return staff_obj[0] + " @ " + obj.data.hash.aou[ staff_obj[3] ].shortname(); },
81 'id' : 'count', 'flex' : '1',
82 'label' : 'Upload Count',
83 'render' : function(my) { return my.scripts.length; },
86 'id' : 'num_complete', 'flex' : '1',
87 'label' : 'Transactions Processed',
88 'render' : function(my) { return my.num_complete; },
91 'id' : 'in_process', 'flex' : '1',
92 'label' : 'Processing?',
93 'render' : function(my) { if (my.end_time) { return 'Completed' } else { return get_bool(my.in_process) ? 'Yes' : 'No'}; },
96 'id' : 'start_time', 'flex' : '1', 'hidden' : 'true',
97 'label' : 'Date Started',
98 'render' : function(my) { if (my.start_time) {var x = new Date(); x.setTime(my.start_time+"000"); return util.date.formatted_date(x,"%F %H:%M");} else { return ""; }; },
101 'id' : 'end_time', 'flex' : '1',
102 'label' : 'Date Completed',
103 'render' : function(my) { if (my.end_time) {var x = new Date(); x.setTime(my.end_time+"000"); return util.date.formatted_date(x,"%F %H:%M");} else { return ""; }; },
106 'id' : 'key', 'hidden' : 'true', 'flex' : '1',
108 'render' : function(my) { return my.key; },
111 'map_row_to_columns' : patron.util.std_map_row_to_columns(),
112 'on_select' : function(ev) {
114 $('deck').selectedIndex = 0;
115 $('execute').disabled = true;
116 $('upload').disabled = true;
120 JSAN.use('util.functional');
121 var sel = obj.list.retrieve_selection();
122 obj.sel_list = util.functional.map_list(
124 function(o) { return o.getAttribute('retrieve_id'); }
126 if (obj.sel_list.length == 0) return;
128 var upload = true; var process = true;
130 if (obj.sel_list.length > 1) upload = false;
132 if (obj.seslist[ obj.sel_list[0] ].end_time) {
133 upload = false; process = false;
135 if (obj.seslist[ obj.sel_list[0] ].in_process == 1) {
136 upload = false; process = false;
139 /* should we really have this next restriction? */
140 for (var i = 0; i < obj.seslist[ obj.sel_list[0] ].scripts.length; i++) {
141 if (obj.seslist[ obj.sel_list[0] ].scripts[i].workstation ==
142 obj.data.ws_name ) upload = false;
146 if (obj.check_perm(['OFFLINE_UPLOAD'])) {
147 document.getElementById('upload').disabled = false;
150 document.getElementById('upload').disabled = true;
153 if (obj.check_perm(['OFFLINE_EXECUTE'])) {
154 document.getElementById('execute').disabled = false;
157 document.getElementById('execute').disabled = true;
160 var complete = false;
161 for (var i = 0; i < obj.sel_list.length; i++) {
162 if (obj.seslist[ obj.sel_list[i] ].end_time) { complete = true; }
165 obj.render_errorlist();
167 if (obj.seslist[ obj.sel_list[0] ].in_process == 1) {
170 obj.render_scriptlist();
174 alert('on_select: ' + E);
179 alert('on_select:\nobj.seslist.length = ' + obj.seslist.length + ' obj.sel_list.length = ' + obj.sel_list.length + '\nerror: ' + E);
187 'init_script_list' : function() {
188 var obj = this; JSAN.use('util.list'); JSAN.use('util.date'); JSAN.use('patron.util');
189 obj.script_list = new util.list('script_tree');
190 obj.script_list.init( {
193 'id' : 'create_time', 'flex' : '1',
194 'label' : 'Date Uploaded',
195 'render' : function(my) { if (my.create_time) { var x = new Date(); x.setTime(my.create_time+"000"); return util.date.formatted_date(x,"%F %H:%M"); } else { return ""; }; },
198 'id' : 'requestor', 'flex' : '1', 'hidden' : 'true',
199 'label' : 'Uploaded By',
200 'render' : function(my) { var staff_obj = patron.util.retrieve_name_via_id( ses(), my.requestor ); return staff_obj[0] + " @ " + obj.data.hash.aou[ staff_obj[3] ].shortname(); },
203 'id' : 'time_delta', 'hidden' : 'true', 'flex' : '1',
204 'label' : 'Server/Local Time Delta',
205 'render' : function(my) { return my.time_delta; },
208 'id' : 'workstation', 'flex' : '1',
209 'label' : 'Workstation',
210 'render' : function(my) { return my.workstation; },
213 'map_row_to_columns' : patron.util.std_map_row_to_columns(),
219 'init_error_list' : function() {
220 var obj = this; JSAN.use('util.list'); JSAN.use('util.date'); JSAN.use('patron.util'); JSAN.use('util.functional');
221 obj.error_list = new util.list('error_tree');
222 obj.error_list.init( {
225 'id' : 'workstation', 'flex' : '1',
226 'label' : 'Workstation',
227 'render' : function(my) { return my.command._workstation ? my.command._workstation : my.command._worksation; },
230 'id' : 'timestamp', 'flex' : '1',
231 'label' : 'Timestamp',
232 'render' : function(my) { if (my.command.timestamp) { var x = new Date(); x.setTime(my.command.timestamp+"000"); return util.date.formatted_date(x,"%F %H:%M"); } else { return my.command._realtime; }; },
235 'id' : 'type', 'flex' : '1',
237 'render' : function(my) { return my.command.type; },
240 'id' : 'ilsevent', 'hidden' : 'true', 'flex' : '1',
241 'label' : 'Event Code',
242 'render' : function(my) { return my.event.ilsevent; },
245 'id' : 'textcode', 'flex' : '1',
246 'label' : 'Event Name',
247 'render' : function(my) { return typeof my.event.textcode != 'undefined' ? my.event.textcode : util.functional.map_list( my.event, function(o) { return o.textcode; }).join('/'); },
250 'id' : 'desc', 'flex' : '1', 'hidden' : 'true',
251 'label' : 'Event Description',
252 'render' : function(my) { return my.event.desc; },
255 'id' : 'i_barcode', 'flex' : '1',
256 'label' : 'Item Barcode',
257 'render' : function(my) { return my.command.barcode ? my.command.barcode : ""; },
260 'id' : 'p_barcode', 'flex' : '1',
261 'label' : 'Patron Barcode',
262 'render' : function(my) { if (my.command.patron_barcode) { return my.command.patron_barcode; } else { if (my.command.user.card.barcode) { return my.command.user.card.barcode; } else { return ""; } }; },
265 'id' : 'duedate', 'flex' : '1', 'hidden' : 'true',
266 'label' : 'Due Date',
267 'render' : function(my) { return my.command.due_date || ""; },
270 'id' : 'backdate', 'flex' : '1', 'hidden' : 'true',
271 'label' : 'Check In Backdate',
272 'render' : function(my) { return my.command.backdate || ""; },
275 'id' : 'count', 'flex' : '1', 'hidden' : 'true',
276 'label' : 'In House Use Count',
277 'render' : function(my) { return my.command.count || ""; },
280 'id' : 'noncat', 'flex' : '1', 'hidden' : 'true',
281 'label' : 'Non-Cataloged?',
282 'render' : function(my) { return get_bool(my.command.noncat) ? "Yes" : "No"; },
285 'id' : 'noncat_type', 'flex' : '1', 'hidden' : 'true',
286 'label' : 'Non-Cataloged Type',
287 'render' : function(my) { return data.hash.cnct[ my.command.noncat_type ] ? obj.data.hash.cnct[ my.command.noncat_type ].name() : ""; },
290 'id' : 'noncat_count', 'flex' : '1', 'hidden' : 'true',
291 'label' : 'Non-Cataloged Count',
292 'render' : function(my) { return my.command.noncat_count || ""; },
295 'map_row_to_columns' : patron.util.std_map_row_to_columns(),
296 'on_select' : function(ev) {
298 var sel = obj.error_list.retrieve_selection();
299 obj.sel_errors = util.functional.map_list(
301 function(o) { return o.getAttribute('retrieve_id'); }
303 if (obj.sel_errors.length > 0) {
304 obj.$('retrieve_item').disabled = false;
305 obj.$('retrieve_patron').disabled = false;
306 obj.$('retrieve_details').disabled = false;
308 obj.$('retrieve_item').disabled = true;
309 obj.$('retrieve_patron').disabled = true;
310 obj.$('retrieve_details').disabled = true;
318 var export_button = document.getElementById('export_btn');
319 if (export_button) export_button.addEventListener(
323 obj.error_list.dump_csv_to_clipboard();
325 obj.error.standard_unexpected_error_alert('export',E);
331 var print_export_button = document.getElementById('print_export_btn');
332 if (print_export_button) print_export_button.addEventListener(
336 obj.error_list.on_all_fleshed =
339 dump( obj.error_list.dump_csv() + '\n' );
340 //copy_to_clipboard(obj.error_list.dump_csv());
341 JSAN.use('util.print'); var p = new util.print();
342 p.simple( obj.error_list.dump_csv(), { 'content_type' : 'text/plain' } );
343 setTimeout(function(){ obj.error_list.on_all_fleshed = null; },0);
345 obj.error.standard_unexpected_error_alert('export',E);
348 obj.error_list.full_retrieve();
350 obj.error.standard_unexpected_error_alert('print export',E);
358 'check_perm' : function(perms) {
361 var robj = obj.network.simple_request('PERM_CHECK',[ses(),obj.data.list.au[0].id(),obj.data.list.au[0].ws_ou(),perms]);
362 if (typeof robj.ilsevent != 'undefined') {
363 obj.error.standard_unexpected_error_alert('check permission',E);
366 return robj.length == 0 ? true : false;
368 obj.error.standard_unexpected_error_alert('Error checking permissions',E);
372 'execute_ses' : function() {
378 obj.data.stash_retrieve();
380 for (var i = 0; i < obj.sel_list.length; i++) {
382 var url = xulG.url_prefix(urls.XUL_OFFLINE_MANAGE_XACTS_CGI)
383 + "?ses=" + window.escape(ses())
385 + "&seskey=" + window.escape(obj.seslist[obj.sel_list[i]].key)
386 + "&ws=" + window.escape(obj.data.ws_name);
387 var x = new XMLHttpRequest();
388 x.open("GET",url,false);
391 dump(url + ' = ' + x.responseText + '\n' );
392 if (!x.responseText) throw('Bad response from CGI component');
393 var robj = JSON2js(x.responseText);
395 if (robj.ilsevent != 0) { alert('Execute error: ' + x.responseText); }
397 obj.retrieve_seslist(); obj.render_seslist();
401 obj.error.standard_unexpected_error_alert('Error executing session',E);
405 'ses_errors' : function() {
411 obj.data.stash_retrieve();
413 var url = xulG.url_prefix(urls.XUL_OFFLINE_MANAGE_XACTS_CGI)
414 + "?ses=" + window.escape(ses())
416 + "&seskey=" + window.escape(obj.seslist[ obj.sel_list[0] ].key)
417 + "&ws=" + window.escape(obj.data.ws_name)
418 + '&status_type=exceptions';
419 var x = new XMLHttpRequest();
420 x.open("GET",url,false);
423 dump(url + ' = ' + x.responseText + '\n' );
424 if (!x.responseText) throw('Bad response from CGI component');
425 var robj = JSON2js(x.responseText);
427 return { 'errors' : robj, 'description' : obj.seslist[ obj.sel_list[0] ].description };
430 throw('Error retrieving session errors: ' + E);
435 'rename_file' : function() {
436 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
441 JSAN.use('util.file');
442 var pending = new util.file('pending_xacts');
443 if ( !pending._file.exists() ) { throw("Can't rename a non-existent file"); }
444 obj.transition_filename = 'pending_xacts_' + new Date().getTime();
446 var file = new util.file(obj.transition_filename);
447 while (file._file.exists()) {
448 obj.transition_filename = 'pending_xacts_' + new Date().getTime();
449 file = new util.file(obj.transition_filename);
450 if (count++>100) throw("Taking too long to find a unique filename.");
452 pending._file.moveTo(null,obj.transition_filename);
455 obj.error.standard_unexpected_error_alert('Error renaming xact file',E);
459 'revert_file' : function() {
460 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
465 JSAN.use('util.file');
466 var pending = new util.file('pending_xacts');
467 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; }
468 var file = new util.file(obj.transition_filename);
469 file._file.moveTo(null,'pending_xacts');
472 obj.error.standard_unexpected_error_alert('Error reverting xact file',E);
476 'archive_file' : function() {
477 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
482 JSAN.use('util.file');
483 var file = new util.file(obj.transition_filename);
484 if (file._file.exists()) file._file.moveTo(null,obj.transition_filename + '.complete');
487 obj.error.standard_unexpected_error_alert('Error archiving xact file',E);
491 'upload' : function() {
492 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
497 if (obj.sel_list.length == 0) { alert('Please select a session to upload to.'); return; }
498 if (obj.sel_list.length > 1) { alert('Please select a single session to upload to.'); return; }
500 JSAN.use('util.file');
502 var file = new util.file('pending_xacts');
503 if (!file._file.exists()) { alert('No pending transactions to upload.'); return; }
507 obj.data.stash_retrieve();
508 var seskey = obj.seslist[ obj.sel_list[0] ].key;
509 JSAN.use('util.widgets');
510 var xx = document.getElementById('iframe_placeholder'); util.widgets.remove_children(xx);
511 var x = document.createElement('iframe'); xx.appendChild(x); x.flex = 1;
514 window.xulG.url_prefix( urls.XUL_REMOTE_BROWSER )
516 + '?url=' + window.escape(
517 urls.XUL_OFFLINE_UPLOAD_XACTS
518 + '?ses=' + window.escape(ses())
519 + '&seskey=' + window.escape(seskey)
520 + '&ws=' + window.escape(obj.data.ws_name)
521 + '&delta=' + window.escape('0')
522 + '&filename=' + window.escape( obj.transition_filename )
527 'url' : urls.XUL_OFFLINE_UPLOAD_XACTS,
528 'url_prefix' : window.xulG.url_prefix,
529 'passthru_content_params' : {
532 'ws' : obj.data.ws_name,
534 'filename' : obj.transition_filename,
535 'url_prefix' : window.xulG.url_prefix,
536 'handle_event' : function(robj){
537 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
539 dump('robj = ' + js2JSON(robj) + '\n');
540 if ( robj.ilsevent != 0 ) {
542 alert('There was an error:\n' + js2JSON(robj));
546 obj.retrieve_seslist(); obj.render_seslist();
549 JSAN.use('util.widgets');
550 util.widgets.remove_children('iframe_placeholder');
554 alert('handle_event error: ' + E);
559 get_contentWindow(x).xulG = newG;
562 obj.error.standard_unexpected_error_alert('Error uploading xacts',E);
566 'ses_status' : function() {
572 obj.data.stash_retrieve();
574 var url = xulG.url_prefix(urls.XUL_OFFLINE_MANAGE_XACTS_CGI)
575 + "?ses=" + window.escape(ses())
577 + "&seskey=" + window.escape(obj.seslist[obj.sel_list[0]].key)
578 + "&ws=" + window.escape(obj.data.ws_name)
579 + "&status_type=scripts";
580 var x = new XMLHttpRequest();
581 x.open("GET",url,false);
584 dump(url + ' = ' + x.responseText + '\n' );
585 if (!x.responseText) throw('Bad response from CGI component');
586 var robj = JSON2js(x.responseText);
592 obj.error.standard_unexpected_error_alert('Error retrieving session status',E);
593 return { 'ilsevent' : -2 };
598 'create_ses' : function() {
604 var desc = window.prompt('Please enter a description:','','Create an Offline Transaction Session');
605 if (desc=='' || desc==null) { return; }
608 obj.data.stash_retrieve();
610 var url = xulG.url_prefix(urls.XUL_OFFLINE_MANAGE_XACTS_CGI)
611 + "?ses=" + window.escape(ses())
613 + "&desc=" + window.escape(desc)
614 + "&ws=" + window.escape(obj.data.ws_name);
615 var x = new XMLHttpRequest();
616 x.open("GET",url,false);
619 dump(url + ' = ' + x.responseText + '\n' );
620 if (!x.responseText) throw('Bad response from CGI component');
621 var robj = JSON2js(x.responseText);
622 if (robj.ilsevent == 0) {
623 obj.retrieve_seslist(); obj.render_seslist();
625 alert('Error: ' + x.responseText);
629 obj.error.standard_unexpected_error_alert('Error creating session',E);
634 'retrieve_seslist' : function() {
641 obj.data.stash_retrieve();
643 var url = xulG.url_prefix(urls.XUL_OFFLINE_MANAGE_XACTS_CGI)
644 + "?ses=" + window.escape(ses())
646 + "&org=" + window.escape(obj.data.list.au[0].ws_ou())
647 + "&status_type=sessions";
648 var x = new XMLHttpRequest();
649 x.open("GET",url,false);
652 dump(url + ' = ' + typeof(x.responseText) + '\n' );
654 if (!x.responseText) throw('Bad response from CGI component');
656 var robj = JSON2js( x.responseText );
657 if (typeof robj.ilsevent != 'undefined') throw(robj);
659 if (!robj) throw(robj);
661 obj.seslist = robj.sort(
663 return b.create_time - a.create_time;
668 obj.error.standard_unexpected_error_alert('Error retrieving offline sessions.',E);
672 'render_seslist' : function() {
678 var old_idx = obj.list.node.currentIndex;
679 if (old_idx < 0) old_idx = 0;
684 for (var i = 0; i < obj.seslist.length; i++) {
688 obj.list.append( { 'retrieve_id' : idx, 'row' : row, 'no_auto_select' : true, 'to_bottom' : true } );
689 //if (idx == old_idx) obj.list.node.view.selection.select(idx);
691 }(i,{ 'my' : obj.seslist[i] })
695 JSAN.use('util.exec'); var exec = new util.exec();
698 document.getElementById('execute').disabled = true;
699 document.getElementById('upload').disabled = true;
702 obj.error.standard_unexpected_error_alert('Error rendering session list',E);
706 'render_scriptlist' : function() {
708 dump('render_scriptlist\n');
714 document.getElementById('deck').selectedIndex = 1;
716 obj.script_list.clear();
718 var status = obj.ses_status();
719 document.getElementById('status_caption').setAttribute('label','Uploaded Transactions for ' + status.description);
721 var scripts = status.scripts;
724 for (var i = 0; i < scripts.length; i++) {
728 obj.script_list.append( { 'row' : row, 'no_auto_select' : true } );
730 }({ 'my' : scripts[i] })
733 JSAN.use('util.exec'); var exec = new util.exec();
737 obj.error.standard_unexpected_error_alert('Error rendering script list',E);
741 'render_errorlist' : function() {
743 dump('render_errorlist\n');
749 document.getElementById('deck').selectedIndex = 2;
751 obj.error_list.clear();
753 var error_meta = obj.ses_errors();
754 document.getElementById('errors_caption').setAttribute('label','Exceptions for ' + error_meta.description);
756 obj.errors = error_meta.errors;
759 for (var i = 0; i < obj.errors.length; i++) {
763 obj.error_list.append( { 'retrieve_id' : idx, 'row' : row, 'no_auto_select' : true } );
765 }(i,{ 'my' : obj.errors[i] })
768 JSAN.use('util.exec'); var exec = new util.exec();
772 obj.error.standard_unexpected_error_alert('Error rendering error list',E);
776 'render_status' : function() {
778 dump('render_status\n');
780 document.getElementById('deck').selectedIndex = 3;
784 'retrieve_item' : function() {
788 for (var i = 0; i < obj.sel_errors.length; i++) {
789 var error = obj.errors[ obj.sel_errors[i] ];
790 if ( ! error.command.barcode ) continue;
791 if ( [ '', ' ', '???' ].indexOf( error.command.barcode ) != -1 ) continue;
792 barcodes.push( error.command.barcode );
794 if (typeof window.xulG == 'object' && typeof window.xulG.new_tab == 'function') {
796 var url = urls.XUL_COPY_STATUS;
797 //+ '?barcodes=' + window.escape( js2JSON(barcodes) );
799 url, {}, { 'barcodes' : barcodes }
810 'retrieve_patron' : function() {
814 for (var i = 0; i < obj.sel_errors.length; i++) {
815 var error = obj.errors[ obj.sel_errors[i] ];
816 if ( ! error.command.patron_barcode ) continue;
817 if ( [ '', ' ', '???' ].indexOf( error.command.patron_barcode ) != -1 ) continue;
818 patrons[ error.command.patron_barcode ] = true;
820 for (var barcode in patrons) {
821 if (typeof window.xulG == 'object' && typeof window.xulG.new_tab == 'function') {
823 var url = urls.XUL_PATRON_DISPLAY;
824 //+ '?barcode=' + window.escape( error.command.patron_barcode );
826 url, {}, { 'barcode' : barcode }
839 'retrieve_details' : function() {
841 JSAN.use('util.window'); var win = new util.window();
843 for (var i = 0; i < obj.sel_errors.length; i++) {
844 var error = obj.errors[ obj.sel_errors[i] ];
846 'data:text/plain,' + window.escape(
847 'Details:\n' + obj.error.pretty_print(js2JSON(error))
849 'offline_error_details',
850 'height=780,width=580,scrollbars=yes,chrome,resizable,modal'
860 dump('exiting admin/offline_manage_xacts.js\n');