extensions/net.sf.basedb.meludi/trunk/resources/sampleproc/labelgeneration.js

Code
Comments
Other
Rev Date Author Line
2964 20 Nov 14 olle 1 var Labelgen = function()
2964 20 Nov 14 olle 2 {
2964 20 Nov 14 olle 3   var labelgen = {};
3030 11 Dec 14 olle 4   var debug = 0;
2964 20 Nov 14 olle 5   
4144 30 Sep 16 olle 6   var sampleItemPrefix = '';
4215 08 Nov 16 olle 7   var sampleItemNumDigits = 5;
2964 20 Nov 14 olle 8   var caseIsValid = true;
2964 20 Nov 14 olle 9   var nofCasesIsValid = true;
2964 20 Nov 14 olle 10   
2964 20 Nov 14 olle 11   // Page initialization
2964 20 Nov 14 olle 12   labelgen.initPage = function()
2964 20 Nov 14 olle 13   {
2964 20 Nov 14 olle 14     previewTitle = Doc.element('previewTitle');
2964 20 Nov 14 olle 15     previewList = Doc.element('previewList');
2964 20 Nov 14 olle 16
2964 20 Nov 14 olle 17     // Step 1
2964 20 Nov 14 olle 18     Events.addEventHandler('step-1', 'wizard-validate', labelgen.validateStep1);
2964 20 Nov 14 olle 19     Events.addEventHandler('nofCases', 'blur', labelgen.nofCasesOnChange);
4960 03 Sep 18 olle 20     Events.addEventHandler('tubeContentType', 'blur', labelgen.tubeContentTypeOnChange);
2964 20 Nov 14 olle 21     Events.addEventHandler('caseName', 'blur', labelgen.caseNameOnChange);
2964 20 Nov 14 olle 22     Events.addEventHandler('caseName', 'keypress', labelgen.validateStep1);
2964 20 Nov 14 olle 23
2964 20 Nov 14 olle 24     // Navigation
2964 20 Nov 14 olle 25     Buttons.addClickHandler('goexport', labelgen.goExport);
2964 20 Nov 14 olle 26     Buttons.addClickHandler('gopreview', labelgen.goPreview);
2964 20 Nov 14 olle 27
4252 25 Nov 16 olle 28     // Load configuration
4252 25 Nov 16 olle 29     labelgen.loadConfiguration();
4252 25 Nov 16 olle 30   }
4252 25 Nov 16 olle 31   
4252 25 Nov 16 olle 32   labelgen.loadConfiguration = function()
4252 25 Nov 16 olle 33   {
4252 25 Nov 16 olle 34     var url = '../Session.servlet?ID='+App.getSessionId();
4252 25 Nov 16 olle 35     url += '&cmd=GetConfiguration'
4252 25 Nov 16 olle 36     var request = Ajax.getXmlHttpRequest();
4252 25 Nov 16 olle 37     request.open("GET", url, true);
4252 25 Nov 16 olle 38     Ajax.setReadyStateHandler(request, labelgen.onConfiguration, labelgen.onConfiguration);
4252 25 Nov 16 olle 39     request.send(null);
4252 25 Nov 16 olle 40   }
4252 25 Nov 16 olle 41   
4252 25 Nov 16 olle 42   labelgen.onConfiguration = function(request)
4252 25 Nov 16 olle 43   {
4252 25 Nov 16 olle 44     var frm = document.forms['meludi'];  
4252 25 Nov 16 olle 45
4252 25 Nov 16 olle 46     if (debug)
4252 25 Nov 16 olle 47     {
4252 25 Nov 16 olle 48       App.debug(Strings.encodeTags(request.responseText));
4252 25 Nov 16 olle 49     }
4252 25 Nov 16 olle 50     
4252 25 Nov 16 olle 51     var response;
4252 25 Nov 16 olle 52     var error = false;
4252 25 Nov 16 olle 53     try
4252 25 Nov 16 olle 54     {
4252 25 Nov 16 olle 55       response = JSON.parse(request.responseText);
4252 25 Nov 16 olle 56       if (response.status != 'ok')
4252 25 Nov 16 olle 57       {
4252 25 Nov 16 olle 58         error = response.message || response.stacktrace || 'Unexpected error';
4252 25 Nov 16 olle 59       }
4252 25 Nov 16 olle 60     }
4252 25 Nov 16 olle 61     catch (ex)
4252 25 Nov 16 olle 62     {
4252 25 Nov 16 olle 63       error = ex;
4252 25 Nov 16 olle 64     }
4252 25 Nov 16 olle 65     if (error) App.debug(error);
4252 25 Nov 16 olle 66
4252 25 Nov 16 olle 67     // Get configuration result    
4252 25 Nov 16 olle 68     var conf = response.configuration;
4252 25 Nov 16 olle 69
4252 25 Nov 16 olle 70     // Check for extracts from first specimen only default
4252 25 Nov 16 olle 71     var extractsFromFirstSpecimenOnlyDefault = conf.extractsFromFirstSpecimenOnlyDefault;
4252 25 Nov 16 olle 72     if (extractsFromFirstSpecimenOnlyDefault != null)
4252 25 Nov 16 olle 73     {
4252 25 Nov 16 olle 74       frm.extractsFromFirstSpecimenOnlyCB.checked = extractsFromFirstSpecimenOnlyDefault;
4252 25 Nov 16 olle 75     }
4252 25 Nov 16 olle 76
4252 25 Nov 16 olle 77     // Continue with initializing info for case
2964 20 Nov 14 olle 78     var url = '../LabelGeneration.servlet?ID='+App.getSessionId();
3668 17 Dec 15 olle 79     url += '&cmd=GetLastLabelCase';
2964 20 Nov 14 olle 80     Wizard.showLoadingAnimation('Loading cases...');
2964 20 Nov 14 olle 81     Wizard.asyncJsonRequest(url, labelgen.caseInfoLoaded);
2964 20 Nov 14 olle 82   }
2964 20 Nov 14 olle 83   
2964 20 Nov 14 olle 84   labelgen.caseInfoLoaded = function(response)
2964 20 Nov 14 olle 85   {
2964 20 Nov 14 olle 86     var frm = document.forms['meludi'];  
2964 20 Nov 14 olle 87
4144 30 Sep 16 olle 88     sampleItemPrefix = response.sampleItemPrefix;
4215 08 Nov 16 olle 89     sampleItemNumDigits = response.sampleItemNumDigits;
2964 20 Nov 14 olle 90     var nofCases = response.count;
2964 20 Nov 14 olle 91     if (nofCases == null)
2964 20 Nov 14 olle 92     {
2964 20 Nov 14 olle 93       nofCases = 0;
2964 20 Nov 14 olle 94     }
2964 20 Nov 14 olle 95     var startNum = nofCases + 1;
4215 08 Nov 16 olle 96     // Pad number with leading zeros to get right number of digits
4215 08 Nov 16 olle 97     startNum = String('0000000000' + startNum).slice(-sampleItemNumDigits);
4144 30 Sep 16 olle 98     var startCase = sampleItemPrefix + startNum;
2964 20 Nov 14 olle 99     frm.caseName.value = startCase;
2964 20 Nov 14 olle 100     
2964 20 Nov 14 olle 101     Doc.show('step-1');
2964 20 Nov 14 olle 102     Doc.show('gopreview');
2964 20 Nov 14 olle 103     Doc.show('goexport');
2964 20 Nov 14 olle 104   }
2964 20 Nov 14 olle 105
2964 20 Nov 14 olle 106   labelgen.goPreview = function()
2964 20 Nov 14 olle 107   {
2964 20 Nov 14 olle 108     labelgen.doExport(true);
2964 20 Nov 14 olle 109   }
2964 20 Nov 14 olle 110
2964 20 Nov 14 olle 111   labelgen.goExport = function()
2964 20 Nov 14 olle 112   {
2964 20 Nov 14 olle 113     labelgen.doExport(false);
2964 20 Nov 14 olle 114   }
2964 20 Nov 14 olle 115
2964 20 Nov 14 olle 116   labelgen.doExport = function(preview)
2964 20 Nov 14 olle 117   {
2964 20 Nov 14 olle 118     var frm = document.forms['meludi'];
2964 20 Nov 14 olle 119     var nofCases = frm.nofCases.value;
2964 20 Nov 14 olle 120     var nofTubesPerCase = frm.nofTubesPerCase.value;
2964 20 Nov 14 olle 121     var startCase = frm.caseName.value;
4869 25 Jun 18 olle 122     var tubeContentType = frm.tubeContentType.value;
4252 25 Nov 16 olle 123     var extractsFromFirstSpecimenOnly = frm.extractsFromFirstSpecimenOnlyCB.checked;
2964 20 Nov 14 olle 124
2964 20 Nov 14 olle 125     var url = '../LabelGeneration.servlet?ID=' + App.getSessionId();
4252 25 Nov 16 olle 126     url += '&cmd=GetLabelFile';
4252 25 Nov 16 olle 127     url += '&nofCases=' + nofCases;
4252 25 Nov 16 olle 128     url += '&nofTubesPerCase=' + nofTubesPerCase;
4252 25 Nov 16 olle 129     url += '&startCase=' + encodeURIComponent(startCase);
4869 25 Jun 18 olle 130     url += '&tubeContentType=' + encodeURIComponent(tubeContentType);
4252 25 Nov 16 olle 131     url += '&extractsFromFirstSpecimenOnly=' + extractsFromFirstSpecimenOnly;
4252 25 Nov 16 olle 132     url += '&preview=' + preview;
4869 25 Jun 18 olle 133     //alert("labelgeneration.js::doExport(): tubeContentType = '" + tubeContentType + "' url = " + url);
2964 20 Nov 14 olle 134     
2964 20 Nov 14 olle 135     if (preview) 
2964 20 Nov 14 olle 136     {
2964 20 Nov 14 olle 137       Doc.hide('previewWrapper');
2964 20 Nov 14 olle 138       url += '&preview=1';
2964 20 Nov 14 olle 139       
2964 20 Nov 14 olle 140       Wizard.showLoadingAnimation('Working...');
2964 20 Nov 14 olle 141       Doc.hide('navigation');
2964 20 Nov 14 olle 142       Wizard.asyncJsonRequest(url, labelgen.onPreviewLoaded);
2964 20 Nov 14 olle 143     }
2964 20 Nov 14 olle 144     else
2964 20 Nov 14 olle 145     {
2964 20 Nov 14 olle 146       window.location = url;    
2964 20 Nov 14 olle 147     }
2964 20 Nov 14 olle 148   }
2964 20 Nov 14 olle 149
2964 20 Nov 14 olle 150   labelgen.onPreviewLoaded = function(response)
2964 20 Nov 14 olle 151   {
2964 20 Nov 14 olle 152     Doc.show('navigation');
2964 20 Nov 14 olle 153     var frm = document.forms['meludi'];
2964 20 Nov 14 olle 154     var allLines = response.split('\n');
2964 20 Nov 14 olle 155     var numLines = allLines.length - 1;
2964 20 Nov 14 olle 156     
2964 20 Nov 14 olle 157     var html = '<tr><th>'+allLines[0].replace(/\t/g, '</th><th>')+'</th></tr>';
2964 20 Nov 14 olle 158     // Check first column for 'ItemType' string, which indicates a header line.
2964 20 Nov 14 olle 159     var numNoConsent = 0;
2964 20 Nov 14 olle 160     var numMissingConsent = 0;
2964 20 Nov 14 olle 161     for (var i = 1 ; i <= numLines; i++)
2964 20 Nov 14 olle 162     {
2964 20 Nov 14 olle 163       var line = allLines[i];
2964 20 Nov 14 olle 164       var cols = line.split(/\t/);
2964 20 Nov 14 olle 165       var firstColumnVal = cols[0];
2964 20 Nov 14 olle 166       var lineIsHeader = false;
2964 20 Nov 14 olle 167       if (firstColumnVal == 'ItemType')
2964 20 Nov 14 olle 168       {
2964 20 Nov 14 olle 169         lineIsHeader = true;
2964 20 Nov 14 olle 170       }
2964 20 Nov 14 olle 171       var rowClass = '';
2964 20 Nov 14 olle 172       if (lineIsHeader)
2964 20 Nov 14 olle 173       {
2964 20 Nov 14 olle 174         html += '<tr><th>'+line.replace(/\t/g, '</th><th>')+'</th></tr>';
2964 20 Nov 14 olle 175       }
2964 20 Nov 14 olle 176       else
2964 20 Nov 14 olle 177       {
2964 20 Nov 14 olle 178         html += '<tr class="'+rowClass+'"><td>'+cols.join('</td><td>')+'</td></tr>';
2964 20 Nov 14 olle 179       }
2964 20 Nov 14 olle 180     }
2964 20 Nov 14 olle 181     
2964 20 Nov 14 olle 182     previewList.innerHTML = '<table>'+html+'</table>';
2964 20 Nov 14 olle 183     Doc.show('previewWrapper');
2964 20 Nov 14 olle 184   }
2964 20 Nov 14 olle 185
2964 20 Nov 14 olle 186   labelgen.nofCasesOnChange = function()
2964 20 Nov 14 olle 187   {
2964 20 Nov 14 olle 188     var frm = document.forms['meludi'];
2964 20 Nov 14 olle 189     var nofCases = frm.nofCases.value;
2964 20 Nov 14 olle 190     nofCasesIsValid = false;
2964 20 Nov 14 olle 191     if (nofCases == '')
2964 20 Nov 14 olle 192     {
2964 20 Nov 14 olle 193       Wizard.setInputStatus('nofCases', 'invalid', 'Missing');
2964 20 Nov 14 olle 194       frm.nofCases.focus();
2964 20 Nov 14 olle 195       return;
2964 20 Nov 14 olle 196     }
2964 20 Nov 14 olle 197     // Check that input is a natural number (1, 2, 3, ...)
2964 20 Nov 14 olle 198     var regex = /^[1-9][0-9]*$/;
2964 20 Nov 14 olle 199     if (!nofCases.match(regex))
2964 20 Nov 14 olle 200     {
2964 20 Nov 14 olle 201       Wizard.setInputStatus('nofCases', 'invalid', 'Only numbers > 0 are allowed.');
2964 20 Nov 14 olle 202       frm.nofCases.focus();
2964 20 Nov 14 olle 203       return;
2964 20 Nov 14 olle 204     }
2964 20 Nov 14 olle 205     Wizard.setInputStatus('nofCases', 'valid', '');
2964 20 Nov 14 olle 206     nofCasesIsValid = true;
2964 20 Nov 14 olle 207   }
2964 20 Nov 14 olle 208
4960 03 Sep 18 olle 209   labelgen.tubeContentTypeOnChange = function()
4960 03 Sep 18 olle 210   {
4960 03 Sep 18 olle 211     var frm = document.forms['meludi'];
4960 03 Sep 18 olle 212     
4960 03 Sep 18 olle 213     var tubeContentType = frm.tubeContentType.value;
4960 03 Sep 18 olle 214     if (tubeContentType == 'Specimen')
4960 03 Sep 18 olle 215     {
4960 03 Sep 18 olle 216       frm.nofTubesPerCase.value = 1;
4960 03 Sep 18 olle 217     }
4960 03 Sep 18 olle 218     else if (tubeContentType == 'Blood')
4960 03 Sep 18 olle 219     {
4960 03 Sep 18 olle 220       frm.nofTubesPerCase.value = 2;
4960 03 Sep 18 olle 221     }
4960 03 Sep 18 olle 222     frm.nofTubesPerCase.focus();
4960 03 Sep 18 olle 223   }
4960 03 Sep 18 olle 224
2964 20 Nov 14 olle 225   labelgen.caseNameOnChange = function()
2964 20 Nov 14 olle 226   {
2964 20 Nov 14 olle 227     var frm = document.forms['meludi'];
2964 20 Nov 14 olle 228     
2964 20 Nov 14 olle 229     var caseName = frm.caseName.value.toUpperCase();
2964 20 Nov 14 olle 230     caseIsValid = false;
2964 20 Nov 14 olle 231     if (caseName == '')
2964 20 Nov 14 olle 232     {
2964 20 Nov 14 olle 233       Wizard.setInputStatus('caseName', 'invalid', 'Missing');
2964 20 Nov 14 olle 234       frm.caseName.focus();
2964 20 Nov 14 olle 235       return;
2964 20 Nov 14 olle 236     }
4215 08 Nov 16 olle 237     if (!Meludi.isValidCaseName2(caseName, sampleItemPrefix, sampleItemNumDigits))
2964 20 Nov 14 olle 238     {
4215 08 Nov 16 olle 239       Wizard.setInputStatus('caseName', 'invalid', 'Only "' + sampleItemPrefix + '" + ' + sampleItemNumDigits + ' digits is allowed.');
2964 20 Nov 14 olle 240       frm.caseName.focus();
2964 20 Nov 14 olle 241       return;
2964 20 Nov 14 olle 242     }
2964 20 Nov 14 olle 243
2964 20 Nov 14 olle 244     frm.caseName.value = caseName;
2964 20 Nov 14 olle 245     Wizard.setInputStatus('caseName', 'valid');
2964 20 Nov 14 olle 246     caseIsValid = true;
2964 20 Nov 14 olle 247   }
2964 20 Nov 14 olle 248
2964 20 Nov 14 olle 249   labelgen.validateStep1 = function(event)
2964 20 Nov 14 olle 250   {
2964 20 Nov 14 olle 251     // Everything should be OK here, this is for future use
2964 20 Nov 14 olle 252     var frm = document.forms['meludi'];
2964 20 Nov 14 olle 253     if (nofCasesIsValid && caseIsValid)
2964 20 Nov 14 olle 254     {
2964 20 Nov 14 olle 255       return;
2964 20 Nov 14 olle 256     }
2964 20 Nov 14 olle 257     event.preventDefault();
2964 20 Nov 14 olle 258   }
2964 20 Nov 14 olle 259
2964 20 Nov 14 olle 260   labelgen.addEventHandlers = function(elements, eventName, handler)
2964 20 Nov 14 olle 261   {
2964 20 Nov 14 olle 262     for (var i = 0; i < elements.length; i++)
2964 20 Nov 14 olle 263     {
2964 20 Nov 14 olle 264       Events.addEventHandler(elements[i], eventName, handler);
2964 20 Nov 14 olle 265     }
2964 20 Nov 14 olle 266   }
2964 20 Nov 14 olle 267   
2964 20 Nov 14 olle 268   return labelgen;
2964 20 Nov 14 olle 269 }();
2964 20 Nov 14 olle 270
2964 20 Nov 14 olle 271 Doc.onLoad(Labelgen.initPage);
2964 20 Nov 14 olle 272