extensions/net.sf.basedb.reggie/trunk/resources/personal/import-inca.js

Code
Comments
Other
Rev Date Author Line
3786 17 Mar 16 olle 1 var Iport = function()
3786 17 Mar 16 olle 2 {
3786 17 Mar 16 olle 3   var iport = {};
3786 17 Mar 16 olle 4   var debug = 0;
3786 17 Mar 16 olle 5   
5270 29 Jan 19 nicklas 6   var importFileIsValid = false;
5270 29 Jan 19 nicklas 7   var checkType;
3786 17 Mar 16 olle 8
3786 17 Mar 16 olle 9   iport.initPage = function()
3786 17 Mar 16 olle 10   {
3786 17 Mar 16 olle 11     // Step 1
3786 17 Mar 16 olle 12     Events.addEventHandler('step-1', 'wizard-validate', iport.validateStep1);
5270 29 Jan 19 nicklas 13     Events.addEventHandler('exportDate', 'blur', Wizard.validateDate);
3786 17 Mar 16 olle 14     Events.addEventHandler('importfile', 'change', iport.importFileOnChange);
3786 17 Mar 16 olle 15     
5270 29 Jan 19 nicklas 16     // Step 2
5270 29 Jan 19 nicklas 17     Events.addEventHandler('step-2', 'wizard-initialize', iport.initializeStep2);
5270 29 Jan 19 nicklas 18     
3786 17 Mar 16 olle 19     // Navigation
5270 29 Jan 19 nicklas 20     Buttons.addClickHandler('fullcheck', iport.startCheck);
5270 29 Jan 19 nicklas 21     Buttons.addClickHandler('simplecheck', iport.startCheck);
3786 17 Mar 16 olle 22     Buttons.addClickHandler('gocancel', Wizard.cancelWizard);
3786 17 Mar 16 olle 23     Buttons.addClickHandler('gorestart', Wizard.restartWizard);
3786 17 Mar 16 olle 24     Buttons.addClickHandler('goimport', Wizard.goRegister);
3786 17 Mar 16 olle 25     Buttons.addClickHandler('downloadreportfile', iport.downloadReportFile);
5275 31 Jan 19 nicklas 26     Buttons.addClickHandler('downloadoutputfile', iport.downloadReportFile);
3786 17 Mar 16 olle 27
3786 17 Mar 16 olle 28     // Final registration
3786 17 Mar 16 olle 29     Events.addEventHandler('wizard', 'wizard-submit', iport.submit);
3786 17 Mar 16 olle 30     
3786 17 Mar 16 olle 31     Doc.show('step-1');
5270 29 Jan 19 nicklas 32     Doc.show('fullcheck');
3786 17 Mar 16 olle 33     Doc.show('simplecheck');
5270 29 Jan 19 nicklas 34
5270 29 Jan 19 nicklas 35     Doc.element('exportDate').focus();
5270 29 Jan 19 nicklas 36     Wizard.setInputStatus('importfile', 'invalid', 'Please select a file!');
5270 29 Jan 19 nicklas 37     iport.importFileOnChange();
3786 17 Mar 16 olle 38   }
3786 17 Mar 16 olle 39   
5270 29 Jan 19 nicklas 40   iport.startCheck = function(event)
5270 29 Jan 19 nicklas 41   {
5270 29 Jan 19 nicklas 42     checkType = event.currentTarget.id;
5273 31 Jan 19 nicklas 43     Doc.hide('downloadreportfile');
5270 29 Jan 19 nicklas 44     Wizard.setCurrentStep(1);
5270 29 Jan 19 nicklas 45     Doc.addClass('step-2', 'disabled');
5270 29 Jan 19 nicklas 46     Wizard.goNext();
5270 29 Jan 19 nicklas 47   }
5270 29 Jan 19 nicklas 48   
3786 17 Mar 16 olle 49   iport.validateStep1 = function(event)
3786 17 Mar 16 olle 50   {
5270 29 Jan 19 nicklas 51     var valid = importFileIsValid;
5270 29 Jan 19 nicklas 52     valid &= Wizard.isValid('exportDate');
3786 17 Mar 16 olle 53     if (!valid) event.preventDefault();
3786 17 Mar 16 olle 54   }
3786 17 Mar 16 olle 55
3786 17 Mar 16 olle 56   iport.importFileOnChange = function()
3786 17 Mar 16 olle 57   {
5270 29 Jan 19 nicklas 58     importFileIsValid = false;
5270 29 Jan 19 nicklas 59     Wizard.setInputStatus('importfile');
5270 29 Jan 19 nicklas 60     
3786 17 Mar 16 olle 61     var frm = document.forms['reggie'];
3786 17 Mar 16 olle 62     var files = frm.importfile.files;
3786 17 Mar 16 olle 63
5270 29 Jan 19 nicklas 64     if (files.length == 1)
3786 17 Mar 16 olle 65     {
5270 29 Jan 19 nicklas 66       importFileIsValid = true;
5270 29 Jan 19 nicklas 67       Wizard.setInputStatus('importfile', 'valid');
3786 17 Mar 16 olle 68     }
3786 17 Mar 16 olle 69     else
3786 17 Mar 16 olle 70     {
5270 29 Jan 19 nicklas 71       Wizard.setInputStatus('importfile', 'invalid', 'A file must be selected.');
3786 17 Mar 16 olle 72     }
3786 17 Mar 16 olle 73   }
3786 17 Mar 16 olle 74
3786 17 Mar 16 olle 75
5270 29 Jan 19 nicklas 76   iport.initializeStep2 = function()
3786 17 Mar 16 olle 77   {
5279 05 Feb 19 nicklas 78     Doc.hide('explainFileCheck');
3786 17 Mar 16 olle 79     var frm = document.forms['reggie'];
3786 17 Mar 16 olle 80     var exportDate = frm.exportDate.value;
3786 17 Mar 16 olle 81
3786 17 Mar 16 olle 82     var formData = new FormData();
3786 17 Mar 16 olle 83     var files = frm.importfile.files;
3786 17 Mar 16 olle 84     for (var i = 0; i < files.length; i++)
3786 17 Mar 16 olle 85     {
3786 17 Mar 16 olle 86       var file = files[i];
3786 17 Mar 16 olle 87       formData.append('incafiles[]', file, file.name);
3786 17 Mar 16 olle 88     }
3786 17 Mar 16 olle 89
3786 17 Mar 16 olle 90     var url = '../Inca.servlet?ID='+App.getSessionId();
3786 17 Mar 16 olle 91     url += '&cmd=ImportInca';
3786 17 Mar 16 olle 92     url += '&exportdate='+encodeURIComponent(exportDate);
5270 29 Jan 19 nicklas 93     url += '&checkType=' + checkType;
3786 17 Mar 16 olle 94
3786 17 Mar 16 olle 95     // POST
3920 03 May 16 olle 96     Wizard.showLoadingAnimation('Checking INCA data...', 'inca-import-progress');
5270 29 Jan 19 nicklas 97     Wizard.asyncJsonRequest(url, iport.checkCompleted, 'POST', formData);
3786 17 Mar 16 olle 98   }
5270 29 Jan 19 nicklas 99   
5270 29 Jan 19 nicklas 100   iport.checkCompleted = function(response)
3786 17 Mar 16 olle 101   {
5263 24 Jan 19 nicklas 102     var fileInfo = response.fileInfo;
5263 24 Jan 19 nicklas 103     var headers = fileInfo.headers;
5263 24 Jan 19 nicklas 104     
5270 29 Jan 19 nicklas 105     var checkType = response.checkType;
5270 29 Jan 19 nicklas 106     var fileCanBeImported = true;
5263 24 Jan 19 nicklas 107     
5263 24 Jan 19 nicklas 108     Doc.element('filename').innerHTML = Strings.encodeTags(fileInfo.filename);
5263 24 Jan 19 nicklas 109     Doc.element('isFollowUp').innerHTML = fileInfo.isFollowUp ? 'Yes' : 'No';
5263 24 Jan 19 nicklas 110     Doc.element('headerCount').innerHTML = headers.count;
5263 24 Jan 19 nicklas 111     
5263 24 Jan 19 nicklas 112     Doc.element('headerMissing').innerHTML = headers.missing;
5263 24 Jan 19 nicklas 113     if (headers.missing > 0)
5263 24 Jan 19 nicklas 114     {
5270 29 Jan 19 nicklas 115       fileCanBeImported = false;
5263 24 Jan 19 nicklas 116       Wizard.setInputStatus('headerMissing', 'invalid', 'One ore more required headers are missing: <b>' + Strings.encodeTags(headers.missingNames.join(', ')) + '</b>');
5263 24 Jan 19 nicklas 117     }
5274 31 Jan 19 nicklas 118     else
5274 31 Jan 19 nicklas 119     {
5274 31 Jan 19 nicklas 120       Wizard.setInputStatus('headerMissing', 'valid');
5274 31 Jan 19 nicklas 121     }
5274 31 Jan 19 nicklas 122     
5263 24 Jan 19 nicklas 123     Doc.element('headerDuplicates').innerHTML = headers.duplicates;
5263 24 Jan 19 nicklas 124     if (headers.duplicates > 0)
5263 24 Jan 19 nicklas 125     {
5270 29 Jan 19 nicklas 126       fileCanBeImported = false;
5263 24 Jan 19 nicklas 127       Wizard.setInputStatus('headerDuplicates', 'invalid', 'Duplicate headers must be removed before the file can be imported: <b>' + Strings.encodeTags(headers.duplicateNames.join(', ')) + '</b>');
5263 24 Jan 19 nicklas 128     }
5274 31 Jan 19 nicklas 129     else
5274 31 Jan 19 nicklas 130     {
5274 31 Jan 19 nicklas 131       Wizard.setInputStatus('headerDuplicates', 'valid');
5274 31 Jan 19 nicklas 132     }
5263 24 Jan 19 nicklas 133     
5263 24 Jan 19 nicklas 134     Doc.element('headerUnknown').innerHTML = headers.unknown;
5263 24 Jan 19 nicklas 135     if (headers.unknown > 0)
5263 24 Jan 19 nicklas 136     {
5274 31 Jan 19 nicklas 137       Wizard.setInputStatus('headerUnknown', 'warning', 'Data in columns that can\'t be mapped to INCA annotations is ignored.');
5263 24 Jan 19 nicklas 138     }
5263 24 Jan 19 nicklas 139     
5274 31 Jan 19 nicklas 140     Doc.element('headerMapped').innerHTML = headers.mapped;
5274 31 Jan 19 nicklas 141     if (headers.mapped == 0)
5274 31 Jan 19 nicklas 142     {
5274 31 Jan 19 nicklas 143       fileCanBeImported = false;
5274 31 Jan 19 nicklas 144       Wizard.setInputStatus('headerMapped', 'invalid', 'No columns could be mapped to INCA annotations.');
5274 31 Jan 19 nicklas 145     }
5274 31 Jan 19 nicklas 146     else
5274 31 Jan 19 nicklas 147     {
5274 31 Jan 19 nicklas 148       Wizard.setInputStatus('headerMapped', 'valid', 'Existing INCA annotations that are found in the file.');
5274 31 Jan 19 nicklas 149     }
5274 31 Jan 19 nicklas 150     
5268 25 Jan 19 nicklas 151     Doc.element('headerUnmapped').innerHTML = headers.unmapped;
5268 25 Jan 19 nicklas 152     if (headers.unmapped > 0)
5268 25 Jan 19 nicklas 153     {
5274 31 Jan 19 nicklas 154       Wizard.setInputStatus('headerUnmapped', 'warning', 'Existing INCA annotations that are not found in the file.');
5268 25 Jan 19 nicklas 155     }
5268 25 Jan 19 nicklas 156     
5270 29 Jan 19 nicklas 157     var importLineCount = fileInfo.data.count - fileInfo.data.totalExcluded;
5263 24 Jan 19 nicklas 158     Doc.element('lineCount').innerHTML = fileInfo.data.count;
5270 29 Jan 19 nicklas 159     Doc.element('importLineCount').innerHTML = importLineCount + (checkType == 'simplecheck' ? ' *' : '');
5270 29 Jan 19 nicklas 160     Doc.element('totalExcluded').innerHTML = fileInfo.data.totalExcluded;
5270 29 Jan 19 nicklas 161     if (fileInfo.data.count == 0)
5263 24 Jan 19 nicklas 162     {
5270 29 Jan 19 nicklas 163       fileCanBeImported = false;
5263 24 Jan 19 nicklas 164       Wizard.setInputStatus('lineCount', 'invalid', 'The file contains no data.');
5263 24 Jan 19 nicklas 165     }
5270 29 Jan 19 nicklas 166     else if (importLineCount == 0)
5263 24 Jan 19 nicklas 167     {
5270 29 Jan 19 nicklas 168       fileCanBeImported = false;
5270 29 Jan 19 nicklas 169       Wizard.setInputStatus('importLineCount', 'invalid', 'The file contains no data that can be imported.');
5263 24 Jan 19 nicklas 170     }
5270 29 Jan 19 nicklas 171     else 
5270 29 Jan 19 nicklas 172     {
5270 29 Jan 19 nicklas 173       if (checkType == 'simplecheck')
5270 29 Jan 19 nicklas 174       {
5270 29 Jan 19 nicklas 175         Wizard.setInputStatus('importLineCount', '', '* May change after the \'Full file check\'.');
5270 29 Jan 19 nicklas 176       }
5270 29 Jan 19 nicklas 177       else
5270 29 Jan 19 nicklas 178       {
5270 29 Jan 19 nicklas 179         Wizard.setInputStatus('importLineCount', 'valid');
5273 31 Jan 19 nicklas 180         Wizard.showGoNextConfirmation(false, importLineCount + ' of ' + fileInfo.data.count + ' data lines can be imported.');
5270 29 Jan 19 nicklas 181       }
5270 29 Jan 19 nicklas 182     }
5263 24 Jan 19 nicklas 183     
5270 29 Jan 19 nicklas 184     if (iport.setExcludedLines('tooManyColumns', fileInfo.data.TOO_MANY_COLUMNS) > 0)
5263 24 Jan 19 nicklas 185     {
5270 29 Jan 19 nicklas 186       fileCanBeImported = false;
5263 24 Jan 19 nicklas 187       Wizard.setInputStatus('tooManyColumns', 'invalid', 'All data lines must have the same number of columns.');
5263 24 Jan 19 nicklas 188     }
5270 29 Jan 19 nicklas 189     
5270 29 Jan 19 nicklas 190     if (iport.setExcludedLines('tooFewColumns', fileInfo.data.TOO_FEW_COLUMNS) > 0)
5263 24 Jan 19 nicklas 191     {
5270 29 Jan 19 nicklas 192       fileCanBeImported = false;
5263 24 Jan 19 nicklas 193       Wizard.setInputStatus('tooFewColumns', 'invalid', 'All data lines must have the same number of columns.');
5263 24 Jan 19 nicklas 194     }
5270 29 Jan 19 nicklas 195     
5270 29 Jan 19 nicklas 196     if (iport.setExcludedLines('missingPersonalNo', fileInfo.data.MISSING_PERSONAL_NO) > 0)
5263 24 Jan 19 nicklas 197     {
5263 24 Jan 19 nicklas 198       Wizard.setInputStatus('missingPersonalNo', 'warning', 'Lines without personal number are skipped.');
5263 24 Jan 19 nicklas 199     }
5270 29 Jan 19 nicklas 200     
5270 29 Jan 19 nicklas 201     if (iport.setExcludedLines('missingLaterality', fileInfo.data.MISSING_LATERALITY) > 0)
5263 24 Jan 19 nicklas 202     {
5263 24 Jan 19 nicklas 203       Wizard.setInputStatus('missingLaterality', 'warning', 'Lines without laterality are skipped.');
5263 24 Jan 19 nicklas 204     }
5270 29 Jan 19 nicklas 205     
5270 29 Jan 19 nicklas 206     if (iport.setExcludedLines('duplicateLaterality', fileInfo.data.DUPLICATE_LATERALITY) > 0)
5263 24 Jan 19 nicklas 207     {
5263 24 Jan 19 nicklas 208       Wizard.setInputStatus('duplicateLaterality', 'warning', 'Lines with same personal number and laterality are skipped.');
5263 24 Jan 19 nicklas 209     }
5270 29 Jan 19 nicklas 210     
5270 29 Jan 19 nicklas 211     if (iport.setExcludedLines('missingFollowUpDate', fileInfo.data.MISSING_FOLLOWUP_DATE) > 0)
5267 25 Jan 19 nicklas 212     {
5270 29 Jan 19 nicklas 213       Wizard.setInputStatus('missingFollowUpDate', 'warning', 'Follow-up entries without a date are skipped.');
5267 25 Jan 19 nicklas 214     }
5270 29 Jan 19 nicklas 215     
5270 29 Jan 19 nicklas 216     if (iport.setExcludedLines('duplicateFollowUp', fileInfo.data.DUPLICATE_FOLLOWUP) > 0)
5267 25 Jan 19 nicklas 217     {
5270 29 Jan 19 nicklas 218       Wizard.setInputStatus('duplicateFollowUp', 'warning', 'Only the latest follow-up entry for the same personal number and laterality is imported.');
5267 25 Jan 19 nicklas 219     }
5263 24 Jan 19 nicklas 220     
5270 29 Jan 19 nicklas 221     if (iport.setExcludedLines('invalidDataValue', fileInfo.data.INVALID_DATA_VALUE) > 0)
4746 13 Apr 18 nicklas 222     {
5270 29 Jan 19 nicklas 223       Wizard.setInputStatus('invalidDataValue', 'warning', 'Lines with invalid values are skipped.');
4746 13 Apr 18 nicklas 224     }
4746 13 Apr 18 nicklas 225     
5275 31 Jan 19 nicklas 226     if (iport.setExcludedLines('patientNotFound', checkType == 'simplecheck' ? '<i>not checked</i>' : fileInfo.data.PATIENT_NOTIN_DATABASE) > 0)
4746 13 Apr 18 nicklas 227     {
5270 29 Jan 19 nicklas 228       Wizard.setInputStatus('patientNotFound', 'warning', 'Lines with a personal number not found in the database are skipped.');
4746 13 Apr 18 nicklas 229     }
4746 13 Apr 18 nicklas 230     
5270 29 Jan 19 nicklas 231     if (iport.setExcludedLines('caseNotFound', checkType == 'simplecheck' ? '<i>not checked</i>' : fileInfo.data.CASE_NOTIN_DATABASE) > 0)
3786 17 Mar 16 olle 232     {
5270 29 Jan 19 nicklas 233       Wizard.setInputStatus('caseNotFound', 'warning', 'Lines with a personal number and laterality not found in the database are skipped.');
3786 17 Mar 16 olle 234     }
3786 17 Mar 16 olle 235     
5270 29 Jan 19 nicklas 236     Wizard.setCurrentStep(2);
5270 29 Jan 19 nicklas 237     if (fileCanBeImported)
3786 17 Mar 16 olle 238     {
5270 29 Jan 19 nicklas 239       if (checkType == 'fullcheck')
3786 17 Mar 16 olle 240       {
5270 29 Jan 19 nicklas 241         Doc.show('goimport');
5279 05 Feb 19 nicklas 242         Doc.show('downloadoutputfile');
3786 17 Mar 16 olle 243       }
5270 29 Jan 19 nicklas 244       else
3786 17 Mar 16 olle 245       {
5270 29 Jan 19 nicklas 246         Doc.show('fullcheck');
3786 17 Mar 16 olle 247       }
5270 29 Jan 19 nicklas 248       Doc.show('gocancel');
3925 10 May 16 olle 249     }
5270 29 Jan 19 nicklas 250     else
3925 10 May 16 olle 251     {
5270 29 Jan 19 nicklas 252       Wizard.setWizardStatus('messagecontainer error', 'Import is not possible.');
5270 29 Jan 19 nicklas 253       Wizard.setNoConfirm(true);
5270 29 Jan 19 nicklas 254       Doc.show('gorestart');
3786 17 Mar 16 olle 255     }
5270 29 Jan 19 nicklas 256     
5273 31 Jan 19 nicklas 257     Doc.show('downloadreportfile');
3786 17 Mar 16 olle 258   }
3786 17 Mar 16 olle 259
5270 29 Jan 19 nicklas 260   /**
5270 29 Jan 19 nicklas 261     Set the value for an 'excluded line' variable. If the
5270 29 Jan 19 nicklas 262     number of excluded lines is 0 the entire row is hidden.
5270 29 Jan 19 nicklas 263   */
5270 29 Jan 19 nicklas 264   iport.setExcludedLines = function(elementId, numLines)
3786 17 Mar 16 olle 265   {
5270 29 Jan 19 nicklas 266     Doc.element(elementId).innerHTML = numLines;
5270 29 Jan 19 nicklas 267     Doc.showHide(elementId+'.row', numLines > 0);
5270 29 Jan 19 nicklas 268     return numLines;
3786 17 Mar 16 olle 269   }
3786 17 Mar 16 olle 270
5273 31 Jan 19 nicklas 271   iport.downloadReportFile = function(event)
3786 17 Mar 16 olle 272   {
5273 31 Jan 19 nicklas 273     var reportType = Data.get(event.currentTarget, 'report-type');
3786 17 Mar 16 olle 274
3786 17 Mar 16 olle 275     var url = '../Inca.servlet?ID='+App.getSessionId();
3951 18 May 16 olle 276     url += '&cmd=DownloadIncaReportFile';
5273 31 Jan 19 nicklas 277     url += '&reporttype='+encodeURIComponent(reportType);
3786 17 Mar 16 olle 278     window.open(url);
3786 17 Mar 16 olle 279   }
3786 17 Mar 16 olle 280
3786 17 Mar 16 olle 281   iport.submit = function()
3786 17 Mar 16 olle 282   {
5273 31 Jan 19 nicklas 283     Doc.hide('downloadreportfile');
5275 31 Jan 19 nicklas 284     Doc.hide('downloadoutputfile');
5273 31 Jan 19 nicklas 285     
3786 17 Mar 16 olle 286     var frm = document.forms['reggie'];
3786 17 Mar 16 olle 287     var exportDate = frm.exportDate.value;
3786 17 Mar 16 olle 288
3786 17 Mar 16 olle 289     var formData = new FormData();
3786 17 Mar 16 olle 290     var files = frm.importfile.files;
3786 17 Mar 16 olle 291     for (var i = 0; i < files.length; i++)
3786 17 Mar 16 olle 292     {
3786 17 Mar 16 olle 293       var file = files[i];
3786 17 Mar 16 olle 294       formData.append('incafiles[]', file, file.name);
3786 17 Mar 16 olle 295     }
3786 17 Mar 16 olle 296
3786 17 Mar 16 olle 297     var url = '../Inca.servlet?ID='+App.getSessionId();
3786 17 Mar 16 olle 298     url += '&cmd=ImportInca';
3786 17 Mar 16 olle 299     url += '&exportdate='+encodeURIComponent(exportDate);
3786 17 Mar 16 olle 300
3786 17 Mar 16 olle 301     // POST
3920 03 May 16 olle 302     Wizard.showLoadingAnimation('Importing INCA data...', 'inca-import-progress');
3786 17 Mar 16 olle 303     Wizard.asyncJsonRequest(url, iport.submissionResults, 'POST', formData);
3786 17 Mar 16 olle 304   }
3786 17 Mar 16 olle 305
3786 17 Mar 16 olle 306   iport.submissionResults = function(response)
3786 17 Mar 16 olle 307   {
5275 31 Jan 19 nicklas 308     Wizard.showFinalMessage(response.messages);
5273 31 Jan 19 nicklas 309     Doc.show('downloadreportfile');
5275 31 Jan 19 nicklas 310     Doc.show('downloadoutputfile');
3786 17 Mar 16 olle 311     Doc.show('gorestart');
3786 17 Mar 16 olle 312   }
3786 17 Mar 16 olle 313
3786 17 Mar 16 olle 314   return iport;
3786 17 Mar 16 olle 315 }();
3786 17 Mar 16 olle 316
3786 17 Mar 16 olle 317 Doc.onLoad(Iport.initPage);
3786 17 Mar 16 olle 318