extensions/net.sf.basedb.reggie/trunk/resources/personal/map-external-data.js

Code
Comments
Other
Rev Date Author Line
4627 21 Nov 17 nicklas 1 var MapData = function()
4627 21 Nov 17 nicklas 2 {
4627 21 Nov 17 nicklas 3   var map = {};
4627 21 Nov 17 nicklas 4   var debug = 0;
4627 21 Nov 17 nicklas 5   
4627 21 Nov 17 nicklas 6   map.initPage = function()
4627 21 Nov 17 nicklas 7   {
4627 21 Nov 17 nicklas 8     // Step 1
4627 21 Nov 17 nicklas 9     Events.addEventHandler('step-1', 'wizard-validate', map.validateStep1);
4627 21 Nov 17 nicklas 10     Wizard.initFileSelectionField('file');
5663 11 Oct 19 nicklas 11     Events.addEventHandler('file', 'change', map.fileChanged);
5663 11 Oct 19 nicklas 12
5663 11 Oct 19 nicklas 13     Events.addEventHandler('mapFrom', 'change', map.mapFromChanged);
4627 21 Nov 17 nicklas 14     
4627 21 Nov 17 nicklas 15     // Navigation
4627 21 Nov 17 nicklas 16     Buttons.addClickHandler('gocancel', Wizard.cancelWizard);
4627 21 Nov 17 nicklas 17     Buttons.addClickHandler('gorestart', Wizard.restartWizard);
4627 21 Nov 17 nicklas 18     Buttons.addClickHandler('goexport', Wizard.goRegister);
4627 21 Nov 17 nicklas 19     Buttons.addClickHandler('godownload', map.download);
4627 21 Nov 17 nicklas 20
4627 21 Nov 17 nicklas 21     // Final registration
4627 21 Nov 17 nicklas 22     Events.addEventHandler('wizard', 'wizard-submit', map.submit);
4627 21 Nov 17 nicklas 23     
4627 21 Nov 17 nicklas 24     Doc.show('step-1');
4627 21 Nov 17 nicklas 25     Doc.show('goexport');
5663 11 Oct 19 nicklas 26     Events.sendChangeEvent('mapFrom');
4627 21 Nov 17 nicklas 27   }
4627 21 Nov 17 nicklas 28   
6824 30 Aug 22 nicklas 29   map.mapFromChanged = function()
5663 11 Oct 19 nicklas 30   {
5663 11 Oct 19 nicklas 31     var frm = document.forms['reggie'];
5740 20 Nov 19 nicklas 32     var fromPnr = frm.mapFrom.value == 'PersonalNo' || frm.mapFrom.value == 'PAD';
5663 11 Oct 19 nicklas 33     
5663 11 Oct 19 nicklas 34     Doc.showHide('exportPersonalNo', !fromPnr);
5740 20 Nov 19 nicklas 35     Doc.showHide('alsoExportPad', !fromPnr);
5663 11 Oct 19 nicklas 36     Doc.showHide('exportPatientId', fromPnr);
5663 11 Oct 19 nicklas 37     Doc.showHide('alsoExportCaseId', fromPnr);
5663 11 Oct 19 nicklas 38     Doc.showHide('alsoExportSpecimenId', fromPnr);
5663 11 Oct 19 nicklas 39   }
5663 11 Oct 19 nicklas 40   
5663 11 Oct 19 nicklas 41   map.fileChanged = function()
5663 11 Oct 19 nicklas 42   {
5663 11 Oct 19 nicklas 43     var frm = document.forms['reggie'];
5663 11 Oct 19 nicklas 44     var file = frm.file.files[0];
5663 11 Oct 19 nicklas 45     var reader = new FileReader();
5663 11 Oct 19 nicklas 46     reader.onload = map.fileLoaded;
5663 11 Oct 19 nicklas 47     reader.readAsText(file.slice(0, 100000)); // Read at most 100kB -- I think we should get at least 2 lines.... 
5663 11 Oct 19 nicklas 48   }
5663 11 Oct 19 nicklas 49
5663 11 Oct 19 nicklas 50   map.fileLoaded = function(event)
5663 11 Oct 19 nicklas 51   {
5663 11 Oct 19 nicklas 52     var frm = document.forms['reggie'];
5663 11 Oct 19 nicklas 53     var data = event.target.result;
5663 11 Oct 19 nicklas 54     var lines = data.split(/[\n\r]+/);
5663 11 Oct 19 nicklas 55
5663 11 Oct 19 nicklas 56     var lineNo = 0;
5663 11 Oct 19 nicklas 57     var mapFrom = null;
6474 04 Nov 21 nicklas 58     var separator = null;
5663 11 Oct 19 nicklas 59     var preview = '';
5663 11 Oct 19 nicklas 60     while (lineNo < lines.length && lineNo < 5)
5663 11 Oct 19 nicklas 61     {
5663 11 Oct 19 nicklas 62       var line = lines[lineNo];
6474 04 Nov 21 nicklas 63       if (lineNo < 4) 
5663 11 Oct 19 nicklas 64       {
5663 11 Oct 19 nicklas 65         preview += Strings.encodeTags(line) + '\n';
5663 11 Oct 19 nicklas 66       }
6474 04 Nov 21 nicklas 67       if (separator == null) separator = map.detectSeparator(line);
5740 20 Nov 19 nicklas 68       if (mapFrom == null) 
5663 11 Oct 19 nicklas 69       {
6474 04 Nov 21 nicklas 70         if (line.match(/^[QCS]\d+([\t,;].*)?$/))// We look for lines starting with 'Q', 'C' or 'S' followed by {digits} and a {tab/comma/semicolon}
5663 11 Oct 19 nicklas 71         {
5740 20 Nov 19 nicklas 72           var firstChar = line.charAt(0);
5740 20 Nov 19 nicklas 73           if (firstChar == 'Q')
5740 20 Nov 19 nicklas 74           {
5740 20 Nov 19 nicklas 75             mapFrom = 'PatientId';
5740 20 Nov 19 nicklas 76           }
5740 20 Nov 19 nicklas 77           else if (firstChar == 'C')
5740 20 Nov 19 nicklas 78           {
5740 20 Nov 19 nicklas 79             mapFrom = 'CaseId';
5740 20 Nov 19 nicklas 80           }
5740 20 Nov 19 nicklas 81           else if (firstChar == 'S')
5740 20 Nov 19 nicklas 82           {
5740 20 Nov 19 nicklas 83             mapFrom = 'SpecimenId';
5740 20 Nov 19 nicklas 84           }
5663 11 Oct 19 nicklas 85         }
6474 04 Nov 21 nicklas 86         else if (lineNo == 0 && line.match(/^[^\t,;]*pad/i)) // If the first header column contains 'pad' (ignoring case) we assume it contains PAD values
5663 11 Oct 19 nicklas 87         {
5740 20 Nov 19 nicklas 88           mapFrom = 'PAD';
5663 11 Oct 19 nicklas 89         }
5663 11 Oct 19 nicklas 90       }
5663 11 Oct 19 nicklas 91       lineNo++;
5663 11 Oct 19 nicklas 92     }
6474 04 Nov 21 nicklas 93     if (lines.length > 4) preview += '<div id="more-lines">+' + (lines.length-4) + ' more lines...</div>';
6474 04 Nov 21 nicklas 94     frm.separator.value = separator ? separator.id : 'tab';
5663 11 Oct 19 nicklas 95     frm.mapFrom.value = mapFrom || 'PersonalNo';
5663 11 Oct 19 nicklas 96     Events.sendChangeEvent(frm.mapFrom);
5663 11 Oct 19 nicklas 97     Doc.element('preview').innerHTML = preview;
5663 11 Oct 19 nicklas 98   }
5663 11 Oct 19 nicklas 99
6474 04 Nov 21 nicklas 100   /**
6474 04 Nov 21 nicklas 101     Detect the "best" separator to use by selecting the one 
6474 04 Nov 21 nicklas 102     that appear the most times in the given text line. If no
6474 04 Nov 21 nicklas 103     separator is found null is returned.
6474 04 Nov 21 nicklas 104   */
6474 04 Nov 21 nicklas 105   map.detectSeparator = function(text)
6474 04 Nov 21 nicklas 106   {
6474 04 Nov 21 nicklas 107     var separators =
6474 04 Nov 21 nicklas 108     [
6474 04 Nov 21 nicklas 109       { 'id': 'tab', 'test': /\t/g, 'sep': '\t'},
6474 04 Nov 21 nicklas 110       { 'id': 'comma', 'test': /,/g, 'sep': ','},
6474 04 Nov 21 nicklas 111       { 'id': 'semicolon', 'test': /;/g, 'sep': ';'}
6474 04 Nov 21 nicklas 112     ];
6474 04 Nov 21 nicklas 113     var maxCount = 0;
6474 04 Nov 21 nicklas 114     var bestMatch = 0;
6474 04 Nov 21 nicklas 115     for (var i=0; i < separators.length; i++)
6474 04 Nov 21 nicklas 116     {
6474 04 Nov 21 nicklas 117       var sep = separators[i];
6474 04 Nov 21 nicklas 118       var m = text.match(sep.test);
6474 04 Nov 21 nicklas 119       if (m && m.length > maxCount)
6474 04 Nov 21 nicklas 120       {
6474 04 Nov 21 nicklas 121         maxCount = m.length;
6474 04 Nov 21 nicklas 122         bestMatch = i;
6474 04 Nov 21 nicklas 123       }
6474 04 Nov 21 nicklas 124     }
6474 04 Nov 21 nicklas 125     return maxCount == 0 ? null : separators[bestMatch];
6474 04 Nov 21 nicklas 126   }
5663 11 Oct 19 nicklas 127   
4627 21 Nov 17 nicklas 128   map.validateStep1 = function(event)
4627 21 Nov 17 nicklas 129   {
4627 21 Nov 17 nicklas 130     var valid = true;
4627 21 Nov 17 nicklas 131     valid &= Wizard.isValid('file');
4627 21 Nov 17 nicklas 132     if (!valid) event.preventDefault();
4627 21 Nov 17 nicklas 133   }
4627 21 Nov 17 nicklas 134
4627 21 Nov 17 nicklas 135   map.submit = function()
4627 21 Nov 17 nicklas 136   {
4627 21 Nov 17 nicklas 137     var frm = document.forms['reggie'];
4627 21 Nov 17 nicklas 138     
4627 21 Nov 17 nicklas 139     var formData = new FormData();
4627 21 Nov 17 nicklas 140     var file = frm.file.files[0];
4627 21 Nov 17 nicklas 141     formData.append('file', file, file.name);
4627 21 Nov 17 nicklas 142
4627 21 Nov 17 nicklas 143     var url = '../Export.servlet?ID='+App.getSessionId();
4627 21 Nov 17 nicklas 144     url += '&cmd=MapDataToReleases';
6474 04 Nov 21 nicklas 145     url += '&separator='+frm.separator.value;
5663 11 Oct 19 nicklas 146     url += '&mapFrom='+Strings.encodeTags(frm.mapFrom.value);
5663 11 Oct 19 nicklas 147     url += '&exportCaseId='+(frm.exportCaseId.checked ? 1 : 0);
5663 11 Oct 19 nicklas 148     url += '&exportSpecimenId='+(frm.exportSpecimenId.checked ? 1 : 0);
5740 20 Nov 19 nicklas 149     url += '&exportPad='+(frm.exportPad.checked ? 1 : 0);
5663 11 Oct 19 nicklas 150     url += '&sortOutput='+(frm.sortOutputOrder.checked ? 1 : 0);
4627 21 Nov 17 nicklas 151     Wizard.showLoadingAnimation('Working...', 'map-data-progress');
4627 21 Nov 17 nicklas 152     Wizard.asyncJsonRequest(url, map.submissionResults, 'POST', formData);
4627 21 Nov 17 nicklas 153   }
4627 21 Nov 17 nicklas 154
4627 21 Nov 17 nicklas 155   map.submissionResults = function(response)
4627 21 Nov 17 nicklas 156   {
4627 21 Nov 17 nicklas 157     Wizard.showFinalMessage(response.messages);
4627 21 Nov 17 nicklas 158     Doc.show('godownload');
5332 20 Mar 19 nicklas 159     Doc.show('gorestart');
4627 21 Nov 17 nicklas 160   }
4627 21 Nov 17 nicklas 161   
4627 21 Nov 17 nicklas 162   map.download = function()
4627 21 Nov 17 nicklas 163   {
4627 21 Nov 17 nicklas 164     var url = '../Export.servlet?ID='+App.getSessionId();
4627 21 Nov 17 nicklas 165     url += '&cmd=DownloadMappedData';
4627 21 Nov 17 nicklas 166     location.href = url;
4627 21 Nov 17 nicklas 167   }
4627 21 Nov 17 nicklas 168
4627 21 Nov 17 nicklas 169   return map;
4627 21 Nov 17 nicklas 170 }();
4627 21 Nov 17 nicklas 171
4627 21 Nov 17 nicklas 172 Doc.onLoad(MapData.initPage);
4627 21 Nov 17 nicklas 173