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(obj.session,'OFFLINE_CREATE_SESSION')) {
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' : 'my.creator',
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(obj.session,'OFFLINE_UPLOAD_XACTS')) {
153 document.getElementById('upload').disabled = false;
156 document.getElementById('upload').disabled = true;
159 if (obj.check_perm(obj.session,'OFFLINE_EXECUTE_SESSION')) {
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' : 'my.requestor',
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' : "my.event.textcode",
262 'id' : 'i_barcode', 'flex' : '1',
263 'label' : 'Item Barcode',
264 'render' : 'my.command.barcode ? my.command.barcode : ""',
267 'id' : 'p_barcode', 'flex' : '1',
268 'label' : 'Patron Barcode',
269 'render' : 'if (my.command.patron_barcode) { my.command.patron_barcode; } else { if (my.command.user.card.barcode) { my.command.user.card.barcode; } else { ""; } }',
272 'id' : 'duedate', 'flex' : '1', 'hidden' : 'true',
273 'label' : 'Due Date',
274 'render' : 'my.command.due_date || ""',
277 'id' : 'backdate', 'flex' : '1', 'hidden' : 'true',
278 'label' : 'Check In Backdate',
279 'render' : 'my.command.backdate || ""',
282 'id' : 'count', 'flex' : '1', 'hidden' : 'true',
283 'label' : 'In House Use Count',
284 'render' : 'my.command.count || ""',
287 'id' : 'noncat', 'flex' : '1', 'hidden' : 'true',
288 'label' : 'Non-Cataloged?',
289 'render' : 'my.command.noncat == 1 ? "Yes" : "No"',
292 'id' : 'noncat_type', 'flex' : '1', 'hidden' : 'true',
293 'label' : 'Non-Cataloged Type',
294 'render' : 'data.hash.cnct[ my.command.noncat_type ] ? data.hash.cnct[ my.command.noncat_type ].name() : ""',
297 'id' : 'noncat_count', 'flex' : '1', 'hidden' : 'true',
298 'label' : 'Non-Cataloged Count',
299 'render' : 'my.command.noncat_count || ""',
302 'map_row_to_column' : function(row,col) {
303 JSAN.use('util.date');
304 JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
305 var my = row; var value;
306 try { value = eval( col.render ); } catch(E) { obj.error.sdump('D_ERROR',E); value = '???'; }
309 'on_select' : function(ev) {
311 var sel = obj.error_list.retrieve_selection();
312 obj.sel_errors = util.functional.map_list(
314 function(o) { return o.getAttribute('retrieve_id'); }
316 if (obj.sel_errors.length > 0) {
317 obj.$('retrieve_item').disabled = false;
318 obj.$('retrieve_patron').disabled = false;
319 obj.$('retrieve_details').disabled = false;
321 obj.$('retrieve_item').disabled = true;
322 obj.$('retrieve_patron').disabled = true;
323 obj.$('retrieve_details').disabled = true;
334 'check_perm' : function(ses,perms) {
335 return true; /* FIXME */
338 'execute_ses' : function() {
341 obj.data.stash_retrieve();
343 for (var i = 0; i < obj.sel_list.length; i++) {
345 var url = xulG.url_prefix(urls.XUL_OFFLINE_MANAGE_XACTS_CGI)
346 + "?ses=" + window.escape(obj.data.session)
348 + "&seskey=" + window.escape(obj.seslist[obj.sel_list[i]].key)
349 + "&ws=" + window.escape(obj.data.ws_name);
350 var x = new XMLHttpRequest();
351 x.open("GET",url,false);
354 dump(url + ' = ' + x.responseText + '\n' );
355 var robj = JSON2js(x.responseText);
357 if (robj.ilsevent != 0) { alert('Execute error: ' + x.responseText); }
359 obj.retrieve_seslist(); obj.render_seslist();
363 'ses_errors' : function() {
366 obj.data.stash_retrieve();
368 var url = xulG.url_prefix(urls.XUL_OFFLINE_MANAGE_XACTS_CGI)
369 + "?ses=" + window.escape(obj.data.session)
371 + "&seskey=" + window.escape(obj.seslist[ obj.sel_list[0] ].key)
372 + "&ws=" + window.escape(obj.data.ws_name)
373 + '&status_type=exceptions';
374 var x = new XMLHttpRequest();
375 x.open("GET",url,false);
378 dump(url + ' = ' + x.responseText + '\n' );
379 var robj = JSON2js(x.responseText);
381 return { 'errors' : robj, 'description' : obj.seslist[ obj.sel_list[0] ].description };
385 'rename_file' : function() {
386 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
388 JSAN.use('util.file');
389 var pending = new util.file('pending_xacts');
390 if ( !pending._file.exists() ) { throw("Can't rename a non-existent file"); }
391 obj.transition_filename = 'pending_xacts_' + new Date().getTime();
393 var file = new util.file(obj.transition_filename);
394 while (file._file.exists()) {
395 obj.transition_filename = 'pending_xacts_' + new Date().getTime();
396 file = new util.file(obj.transition_filename);
397 if (count++>100) throw("Taking too long to find a unique filename.");
399 pending._file.moveTo(null,obj.transition_filename);
402 'revert_file' : function() {
403 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
405 JSAN.use('util.file');
406 var pending = new util.file('pending_xacts');
407 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; }
408 var file = new util.file(obj.transition_filename);
409 file._file.moveTo(null,'pending_xacts');
412 'archive_file' : function() {
413 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
415 JSAN.use('util.file');
416 var file = new util.file(obj.transition_filename);
417 if (file._file.exists()) file._file.moveTo(null,obj.transition_filename + '.complete')
420 'upload' : function() {
421 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
423 if (obj.sel_list.length == 0) { alert('Please select a session to upload to.'); return; }
424 if (obj.sel_list.length > 1) { alert('Please select a single session to upload to.'); return; }
426 JSAN.use('util.file');
428 var file = new util.file('pending_xacts');
429 if (!file._file.exists()) { alert('No pending transactions to upload.'); return; }
433 obj.data.stash_retrieve();
434 var seskey = obj.seslist[ obj.sel_list[0] ].key;
435 JSAN.use('util.widgets');
436 var xx = document.getElementById('iframe_placeholder'); util.widgets.remove_children(xx);
437 var x = document.createElement('iframe'); xx.appendChild(x); x.flex = 1;
440 window.xulG.url_prefix( urls.XUL_REMOTE_BROWSER )
441 + '?url=' + window.escape(
442 urls.XUL_OFFLINE_UPLOAD_XACTS
443 + '?ses=' + window.escape(obj.data.session)
444 + '&seskey=' + window.escape(seskey)
445 + '&ws=' + window.escape(obj.data.ws_name)
446 + '&delta=' + window.escape('0')
447 + '&filename=' + window.escape( obj.transition_filename )
451 'url_prefix' : window.xulG.url_prefix,
452 'passthru_content_params' : {
453 'url_prefix' : window.xulG.url_prefix,
454 'handle_event' : function(robj){
455 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
457 dump('robj = ' + js2JSON(robj) + '\n');
458 if ( robj.ilsevent != 0 ) {
460 alert('There was an error:\n' + js2JSON(robj));
464 obj.retrieve_seslist(); obj.render_seslist();
467 JSAN.use('util.widgets');
468 util.widgets.remove_children('iframe_placeholder');
472 alert('handle_event error: ' + E);
477 x.contentWindow.xulG = newG;
480 'ses_status' : function() {
483 obj.data.stash_retrieve();
485 var url = xulG.url_prefix(urls.XUL_OFFLINE_MANAGE_XACTS_CGI)
486 + "?ses=" + window.escape(obj.data.session)
488 + "&seskey=" + window.escape(obj.seslist[obj.sel_list[0]].key)
489 + "&ws=" + window.escape(obj.data.ws_name)
490 + "&status_type=scripts";
491 var x = new XMLHttpRequest();
492 x.open("GET",url,false);
495 dump(url + ' = ' + x.responseText + '\n' );
496 var robj = JSON2js(x.responseText);
501 'create_ses' : function() {
505 var desc = window.prompt('Please enter a description:','','Create an Offline Transaction Session');
506 if (desc=='' || desc==null) { return; }
508 obj.data.stash_retrieve();
510 var url = xulG.url_prefix(urls.XUL_OFFLINE_MANAGE_XACTS_CGI)
511 + "?ses=" + window.escape(obj.data.session)
513 + "&desc=" + window.escape(desc)
514 + "&ws=" + window.escape(obj.data.ws_name);
515 var x = new XMLHttpRequest();
516 x.open("GET",url,false);
519 dump(url + ' = ' + x.responseText + '\n' );
520 var robj = JSON2js(x.responseText);
521 if (robj.ilsevent == 0) {
522 obj.retrieve_seslist(); obj.render_seslist();
524 alert('Error: ' + x.responseText);
528 'retrieve_seslist' : function() {
532 obj.data.stash_retrieve();
534 var url = xulG.url_prefix(urls.XUL_OFFLINE_MANAGE_XACTS_CGI)
535 + "?ses=" + window.escape(obj.data.session)
537 + "&org=" + window.escape(obj.data.list.au[0].ws_ou())
538 + "&status_type=sessions";
539 var x = new XMLHttpRequest();
540 x.open("GET",url,false);
543 dump(url + ' = ' + x.responseText + '\n' );
544 obj.seslist = JSON2js( x.responseText ).sort(
546 return b.create_time - a.create_time;
551 'render_seslist' : function() {
555 var old_idx = obj.list.node.currentIndex;
556 if (old_idx < 0) old_idx = 0;
561 for (var i = 0; i < obj.seslist.length; i++) {
565 obj.list.append( { 'retrieve_id' : idx, 'row' : row } );
566 if (idx == old_idx) obj.list.node.view.selection.select(idx);
572 JSAN.use('util.exec'); var exec = new util.exec();
575 document.getElementById('execute').disabled = true;
576 document.getElementById('upload').disabled = true;
580 'render_scriptlist' : function() {
582 dump('render_scriptlist\n');
584 document.getElementById('deck').selectedIndex = 1;
588 obj.script_list.clear();
590 var status = obj.ses_status();
591 document.getElementById('status_caption').setAttribute('label','Uploaded Transactions for ' + status.description);
593 var scripts = status.scripts;
596 for (var i = 0; i < scripts.length; i++) {
600 obj.script_list.append( { 'row' : row } );
605 JSAN.use('util.exec'); var exec = new util.exec();
609 'render_errorlist' : function() {
611 dump('render_errorlist\n');
613 document.getElementById('deck').selectedIndex = 2;
617 obj.error_list.clear();
619 var error_meta = obj.ses_errors();
620 document.getElementById('errors_caption').setAttribute('label','Exceptions for ' + error_meta.description);
622 obj.errors = error_meta.errors;
625 for (var i = 0; i < obj.errors.length; i++) {
629 obj.error_list.append( { 'retrieve_id' : idx, 'row' : row } );
634 JSAN.use('util.exec'); var exec = new util.exec();
638 'render_status' : function() {
640 dump('render_status\n');
642 document.getElementById('deck').selectedIndex = 3;
646 'retrieve_item' : function() {
650 for (var i = 0; i < obj.sel_errors.length; i++) {
651 var error = obj.errors[ obj.sel_errors[i] ];
652 if ( ! error.command.barcode ) continue;
653 if ( [ '', ' ', '???' ].indexOf( error.command.barcode ) != -1 ) continue;
654 barcodes.push( error.command.barcode );
656 if (typeof window.xulG == 'object' && typeof window.xulG.new_tab == 'function') {
658 var url = urls.XUL_COPY_STATUS
659 + '?session=' + window.escape(obj.data.session)
660 + '&barcodes=' + window.escape( js2JSON(barcodes) );
673 'retrieve_patron' : 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.patron_barcode ) continue;
679 if ( [ '', ' ', '???' ].indexOf( error.command.patron_barcode ) != -1 ) continue;
680 if (typeof window.xulG == 'object' && typeof window.xulG.new_tab == 'function') {
682 var url = urls.XUL_PATRON_DISPLAY
683 + '?session=' + window.escape(obj.data.session)
684 + '&barcode=' + window.escape( error.command.patron_barcode );
698 'retrieve_details' : function() {
699 alert('Not Yet Implemented');
703 dump('exiting admin/offline_manage_xacts.js\n');