extensions/net.sf.basedb.reggie/trunk/resources/libprep/import-external-rna.js

Code
Comments
Other
Rev Date Author Line
5631 27 Sep 19 nicklas 1 var ImportPlates = function()
5631 27 Sep 19 nicklas 2 {
5631 27 Sep 19 nicklas 3   var importer = {};
5631 27 Sep 19 nicklas 4   var debug = 0;
5631 27 Sep 19 nicklas 5   
5631 27 Sep 19 nicklas 6   var prefixIsValid = false;
5631 27 Sep 19 nicklas 7   
5631 27 Sep 19 nicklas 8   var importData;
5631 27 Sep 19 nicklas 9   
5631 27 Sep 19 nicklas 10   // Page initialization
5631 27 Sep 19 nicklas 11   importer.initPage = function()
5631 27 Sep 19 nicklas 12   {
5631 27 Sep 19 nicklas 13     // Step 1
5631 27 Sep 19 nicklas 14     Events.addEventHandler('step-1', 'wizard-validate', importer.validateStep1);
5631 27 Sep 19 nicklas 15
5631 27 Sep 19 nicklas 16     Events.addEventHandler('prefix', 'change', importer.prefixOnChange);
5631 27 Sep 19 nicklas 17     Events.addEventHandler('prefix', 'keypress', Wizard.focusOnEnter);
5631 27 Sep 19 nicklas 18     Wizard.initFileSelectionField('importfile');
5631 27 Sep 19 nicklas 19     Events.addEventHandler('importfile', 'change', importer.importFileOnChange);
5631 27 Sep 19 nicklas 20     Events.addEventHandler('sheet', 'change', importer.worksheetOnChange);
5631 27 Sep 19 nicklas 21     
5631 27 Sep 19 nicklas 22     Events.addEventHandler('plateNames', 'change', importer.displayAliquotsOnPlate);
5631 27 Sep 19 nicklas 23     
5631 27 Sep 19 nicklas 24     // Navigation
5631 27 Sep 19 nicklas 25     Buttons.addClickHandler('gocancel', Wizard.cancelWizard);
5631 27 Sep 19 nicklas 26     Buttons.addClickHandler('gorestart', Wizard.restartWizard);
5631 27 Sep 19 nicklas 27     Buttons.addClickHandler('gonext', Wizard.goNextOnClick);
5631 27 Sep 19 nicklas 28     Buttons.addClickHandler('goregister', Wizard.goRegister);
5631 27 Sep 19 nicklas 29     
5631 27 Sep 19 nicklas 30     // Final registration
5631 27 Sep 19 nicklas 31     Events.addEventHandler('wizard', 'wizard-submit', importer.submit);
5631 27 Sep 19 nicklas 32
5631 27 Sep 19 nicklas 33     Plate.init(9, 9, null, WellPainter);
5631 27 Sep 19 nicklas 34     Plate.paint(Plate.getWells());
5631 27 Sep 19 nicklas 35     window.addEventListener('beforeunload', importer.confirmLeaveWizard);
5631 27 Sep 19 nicklas 36 //    Wizard.keepSessionAlive();
5631 27 Sep 19 nicklas 37     
5631 27 Sep 19 nicklas 38     Doc.show('step-1');
5631 27 Sep 19 nicklas 39     Doc.show('gocancel');
5631 27 Sep 19 nicklas 40     Doc.show('goregister');
5631 27 Sep 19 nicklas 41     Events.sendChangeEvent('prefix');
5631 27 Sep 19 nicklas 42   }
5631 27 Sep 19 nicklas 43   
5631 27 Sep 19 nicklas 44   /**
5631 27 Sep 19 nicklas 45     Ask for confirmation to abort if RNA has been placed on the plate.
5631 27 Sep 19 nicklas 46   */
5631 27 Sep 19 nicklas 47   importer.confirmLeaveWizard = function(event)
5631 27 Sep 19 nicklas 48   {
5631 27 Sep 19 nicklas 49     if (Plate.getUsed().length > 0)
5631 27 Sep 19 nicklas 50     {
5631 27 Sep 19 nicklas 51       event.preventDefault();
5631 27 Sep 19 nicklas 52     }
5631 27 Sep 19 nicklas 53   }
5631 27 Sep 19 nicklas 54
5631 27 Sep 19 nicklas 55   importer.prefixOnChange = function()
5631 27 Sep 19 nicklas 56   {
5631 27 Sep 19 nicklas 57     var frm = document.forms['reggie'];
5631 27 Sep 19 nicklas 58     Wizard.setInputStatus('prefix');
5631 27 Sep 19 nicklas 59     
5631 27 Sep 19 nicklas 60     var prefix = frm.prefix.value.toUpperCase().replace(/_/g, '');
5631 27 Sep 19 nicklas 61     prefixIsValid = false;
5631 27 Sep 19 nicklas 62     if (prefix.length < 2)
5631 27 Sep 19 nicklas 63     {
5631 27 Sep 19 nicklas 64       Wizard.setInputStatus('prefix', 'invalid', 'The prefix should have at least 2 characters.');
5631 27 Sep 19 nicklas 65       frm.prefix.focus();
5631 27 Sep 19 nicklas 66       return;
5631 27 Sep 19 nicklas 67     }
5631 27 Sep 19 nicklas 68     
5631 27 Sep 19 nicklas 69     frm.prefix.value = prefix+'_';
5631 27 Sep 19 nicklas 70     Wizard.setInputStatus('prefix', 'valid');
5631 27 Sep 19 nicklas 71     prefixIsValid = true;
5631 27 Sep 19 nicklas 72     
5631 27 Sep 19 nicklas 73     importer.prevalidateImportFile();
5631 27 Sep 19 nicklas 74   }
5631 27 Sep 19 nicklas 75   
5631 27 Sep 19 nicklas 76   importer.importFileOnChange = function()
5631 27 Sep 19 nicklas 77   {
5631 27 Sep 19 nicklas 78     Doc.hide('worksheetSection');
5631 27 Sep 19 nicklas 79     Doc.hide('worksheetSection.help');
5631 27 Sep 19 nicklas 80     importer.prevalidateImportFile();
5631 27 Sep 19 nicklas 81   }
5631 27 Sep 19 nicklas 82   
5631 27 Sep 19 nicklas 83   importer.worksheetOnChange = function()
5631 27 Sep 19 nicklas 84   {
5631 27 Sep 19 nicklas 85     importer.prevalidateImportFile();
5631 27 Sep 19 nicklas 86   }
5631 27 Sep 19 nicklas 87   
5631 27 Sep 19 nicklas 88   importer.validateStep1 = function(event)
5631 27 Sep 19 nicklas 89   {
5631 27 Sep 19 nicklas 90     if (!prefixIsValid || !Wizard.isValid('importfile'))
5631 27 Sep 19 nicklas 91     {
5631 27 Sep 19 nicklas 92       event.preventDefault();
5631 27 Sep 19 nicklas 93     }
5631 27 Sep 19 nicklas 94   }
5631 27 Sep 19 nicklas 95
5631 27 Sep 19 nicklas 96   importer.prevalidateImportFile = function()
5631 27 Sep 19 nicklas 97   {
5631 27 Sep 19 nicklas 98     Doc.hide('platePreview');
5631 27 Sep 19 nicklas 99     Wizard.hideWizardStatus();
5631 27 Sep 19 nicklas 100     Wizard.hideGoNextConfirmation();
5631 27 Sep 19 nicklas 101     
5631 27 Sep 19 nicklas 102     var frm = document.forms['reggie'];
5631 27 Sep 19 nicklas 103     var path = frm.importfile.value;
5631 27 Sep 19 nicklas 104     if (!prefixIsValid || path == '') return;
5631 27 Sep 19 nicklas 105     
5631 27 Sep 19 nicklas 106     Wizard.setInputStatus('importfile');
5631 27 Sep 19 nicklas 107     Data.set('importfile', 'valid', 0);
5631 27 Sep 19 nicklas 108
5631 27 Sep 19 nicklas 109     var url = '../Import.servlet?ID='+App.getSessionId();
5631 27 Sep 19 nicklas 110     url += '&cmd=PreValidateRNAImportFile';
5631 27 Sep 19 nicklas 111     url += '&path='+encodeURIComponent(path);
5631 27 Sep 19 nicklas 112     url += '&prefix='+encodeURIComponent(frm.prefix.value);
5631 27 Sep 19 nicklas 113     url += '&sheet='+encodeURIComponent(frm.sheet.value);
5631 27 Sep 19 nicklas 114     
5631 27 Sep 19 nicklas 115     Wizard.showLoadingAnimation('Validating ' + Strings.encodeTags(path));
5631 27 Sep 19 nicklas 116     Wizard.asyncJsonRequest(url, importer.onImportFileValidated, 'POST');
5631 27 Sep 19 nicklas 117   }
5631 27 Sep 19 nicklas 118
5631 27 Sep 19 nicklas 119   importer.onImportFileValidated = function(response)
5631 27 Sep 19 nicklas 120   {
5631 27 Sep 19 nicklas 121     var frm = document.forms['reggie'];
5631 27 Sep 19 nicklas 122
5631 27 Sep 19 nicklas 123     Wizard.setInputStatus('importfile');
5631 27 Sep 19 nicklas 124     Wizard.showFinalMessage(response.messages);
5631 27 Sep 19 nicklas 125     
5631 27 Sep 19 nicklas 126     importData = response.importFile;
5631 27 Sep 19 nicklas 127
5631 27 Sep 19 nicklas 128     var sheetNames = importData.sheetNames;
5631 27 Sep 19 nicklas 129     if (sheetNames && sheetNames.length)
5631 27 Sep 19 nicklas 130     {
5631 27 Sep 19 nicklas 131       var currentSheet = frm.sheet.value;
5631 27 Sep 19 nicklas 132       frm.sheet.length = 0;
5631 27 Sep 19 nicklas 133       for (var sNo = 0; sNo < sheetNames.length; sNo++)
5631 27 Sep 19 nicklas 134       {
5631 27 Sep 19 nicklas 135         var sheet = sheetNames[sNo];
5631 27 Sep 19 nicklas 136         frm.sheet[frm.sheet.length] = new Option(sheet, sheet, false, currentSheet == sheet);
5631 27 Sep 19 nicklas 137       }
5631 27 Sep 19 nicklas 138       if (frm.sheet.length > 1) 
5631 27 Sep 19 nicklas 139       {
5631 27 Sep 19 nicklas 140         Doc.show('worksheetSection');
5631 27 Sep 19 nicklas 141         Doc.show('worksheetSection.help');
5631 27 Sep 19 nicklas 142       }
5631 27 Sep 19 nicklas 143     }
5631 27 Sep 19 nicklas 144     
5631 27 Sep 19 nicklas 145     var plates = importData.plates;
5631 27 Sep 19 nicklas 146     frm.plateNames.length = 0;
5631 27 Sep 19 nicklas 147     
5631 27 Sep 19 nicklas 148     if (plates && plates.length)
5631 27 Sep 19 nicklas 149     {
5631 27 Sep 19 nicklas 150       for (var pNo = 0; pNo < plates.length; pNo++)
5631 27 Sep 19 nicklas 151       {
5631 27 Sep 19 nicklas 152         var plate = plates[pNo];
5631 27 Sep 19 nicklas 153         var text = plate.name;
5631 27 Sep 19 nicklas 154         if (plate.error) 
5631 27 Sep 19 nicklas 155         {
5631 27 Sep 19 nicklas 156           text += ' (' + plate.error + ')';
5631 27 Sep 19 nicklas 157         }
5631 27 Sep 19 nicklas 158         else
5631 27 Sep 19 nicklas 159         {
5635 01 Oct 19 nicklas 160           text += ' (';
5635 01 Oct 19 nicklas 161           text += plate.id ? 'existing box; ' : 'new box; ';
5635 01 Oct 19 nicklas 162           text += plate.aliquots.length + ' aliquots)';
5631 27 Sep 19 nicklas 163         }
5631 27 Sep 19 nicklas 164         frm.plateNames[frm.plateNames.length] = new Option(text);
5631 27 Sep 19 nicklas 165       }
5631 27 Sep 19 nicklas 166     }
5631 27 Sep 19 nicklas 167     
5631 27 Sep 19 nicklas 168     if (importData.valid)
5631 27 Sep 19 nicklas 169     {
5631 27 Sep 19 nicklas 170       Wizard.setInputStatus('importfile', importData.warnings > 0 ? 'warning' : 'valid');
5631 27 Sep 19 nicklas 171       Data.set('importfile', 'valid', 1);
5631 27 Sep 19 nicklas 172       if (importData.warnings > 0)
5631 27 Sep 19 nicklas 173       {
5631 27 Sep 19 nicklas 174         Wizard.showGoNextConfirmation(true, 'Check to verify registration of plate with warnings.');
5631 27 Sep 19 nicklas 175       }
5631 27 Sep 19 nicklas 176     }
5631 27 Sep 19 nicklas 177     else
5631 27 Sep 19 nicklas 178     {
5631 27 Sep 19 nicklas 179       Wizard.setInputStatus('importfile', 'invalid');
5631 27 Sep 19 nicklas 180     }
5631 27 Sep 19 nicklas 181     
5631 27 Sep 19 nicklas 182     importer.displayAliquotsOnPlate();
5631 27 Sep 19 nicklas 183   }
5631 27 Sep 19 nicklas 184
5631 27 Sep 19 nicklas 185   importer.displayAliquotsOnPlate = function()
5631 27 Sep 19 nicklas 186   {
5631 27 Sep 19 nicklas 187     Doc.element('filename').innerHTML = Strings.encodeTags(importData.filename);
5631 27 Sep 19 nicklas 188     Doc.element('numPlates').innerHTML = importData.numPlates;
5631 27 Sep 19 nicklas 189     Doc.element('numAliquots').innerHTML = importData.numAliquots;
5631 27 Sep 19 nicklas 190     Doc.element('numErrors').innerHTML = importData.errors;
5631 27 Sep 19 nicklas 191     Doc.element('numWarnings').innerHTML = importData.warnings;
5631 27 Sep 19 nicklas 192     
5631 27 Sep 19 nicklas 193     Doc.element('importPossible').innerHTML = importData.valid ? '<img src="../images/ok.png">Import is possible!' : '<img src="../images/error.png">Import is not possible!';
5631 27 Sep 19 nicklas 194     
5631 27 Sep 19 nicklas 195     Doc.show('platePreview');
5631 27 Sep 19 nicklas 196     var frm = document.forms['reggie'];
5631 27 Sep 19 nicklas 197     var plateIndex = frm.plateNames.selectedIndex;
5631 27 Sep 19 nicklas 198     
5631 27 Sep 19 nicklas 199     var wells = Plate.getWells();
5631 27 Sep 19 nicklas 200     Plate.clear(wells);
5631 27 Sep 19 nicklas 201     
5631 27 Sep 19 nicklas 202     if (plateIndex >= 0 && importData.plates.length > plateIndex)
5631 27 Sep 19 nicklas 203     {
5631 27 Sep 19 nicklas 204       var plate = importData.plates[plateIndex];
5631 27 Sep 19 nicklas 205       var aliquots = plate.aliquots;
5631 27 Sep 19 nicklas 206       for (var aNo = 0; aNo < aliquots.length; aNo++)
5631 27 Sep 19 nicklas 207       {
5631 27 Sep 19 nicklas 208         var aliquot = aliquots[aNo];
5631 27 Sep 19 nicklas 209         var well = Plate.getWellByLocation(aliquot.location);
5631 27 Sep 19 nicklas 210         if (well && !well.extract) 
5631 27 Sep 19 nicklas 211         {
5631 27 Sep 19 nicklas 212           if (plate.error && !aliquot.error) aliquot.error = plate.error;
5631 27 Sep 19 nicklas 213           well.setExtract(aliquot);
5631 27 Sep 19 nicklas 214         }
5631 27 Sep 19 nicklas 215       }
5633 30 Sep 19 nicklas 216       var existingAliquots = plate.existingAliquots;
5633 30 Sep 19 nicklas 217       for (var eNo = 0; eNo < existingAliquots.length; eNo++)
5633 30 Sep 19 nicklas 218       {
5633 30 Sep 19 nicklas 219         var aliquot = existingAliquots[eNo];
5633 30 Sep 19 nicklas 220         var well = Plate.getWellByLocation(aliquot.location);
5633 30 Sep 19 nicklas 221         if (well && !well.extract) 
5633 30 Sep 19 nicklas 222         {
5633 30 Sep 19 nicklas 223           //if (plate.error && !aliquot.error) aliquot.error = plate.error;
5633 30 Sep 19 nicklas 224           well.setExtract(aliquot);
5633 30 Sep 19 nicklas 225         }
5633 30 Sep 19 nicklas 226       }
5631 27 Sep 19 nicklas 227     }
5631 27 Sep 19 nicklas 228     Plate.paint(wells);
5631 27 Sep 19 nicklas 229   }
5631 27 Sep 19 nicklas 230   
5631 27 Sep 19 nicklas 231   importer.submit = function()
5631 27 Sep 19 nicklas 232   {
5631 27 Sep 19 nicklas 233     var frm = document.forms['reggie'];
5631 27 Sep 19 nicklas 234     var path = frm.importfile.value;
5631 27 Sep 19 nicklas 235
5631 27 Sep 19 nicklas 236     var url = '../Import.servlet?ID='+App.getSessionId();
5631 27 Sep 19 nicklas 237     url += '&cmd=ImportRNAFromFile';
5631 27 Sep 19 nicklas 238     url += '&path='+encodeURIComponent(path);
5631 27 Sep 19 nicklas 239     url += '&prefix='+encodeURIComponent(frm.prefix.value);
5631 27 Sep 19 nicklas 240     url += '&sheet='+encodeURIComponent(frm.sheet.value);
5631 27 Sep 19 nicklas 241     
5631 27 Sep 19 nicklas 242     Wizard.showLoadingAnimation('Performing registration...');
5631 27 Sep 19 nicklas 243     Wizard.asyncJsonRequest(url, importer.submissionResults, 'POST');
5631 27 Sep 19 nicklas 244   }
5631 27 Sep 19 nicklas 245   
5631 27 Sep 19 nicklas 246   importer.submissionResults = function(response)
5631 27 Sep 19 nicklas 247   {
5631 27 Sep 19 nicklas 248     window.removeEventListener('beforeunload', importer.confirmLeaveWizard);
5631 27 Sep 19 nicklas 249     Wizard.showFinalMessage(response.messages);
5631 27 Sep 19 nicklas 250     Doc.show('gorestart');
5631 27 Sep 19 nicklas 251   }
5631 27 Sep 19 nicklas 252
5631 27 Sep 19 nicklas 253   importer.initElements = function(element, autoInit)
5631 27 Sep 19 nicklas 254   {
5631 27 Sep 19 nicklas 255     if (autoInit == 'plate-col')
5631 27 Sep 19 nicklas 256     {
5631 27 Sep 19 nicklas 257       Events.addEventHandler(element, 'click', importer.toggleColumn);
5631 27 Sep 19 nicklas 258       Events.addEventHandler(element, 'mouseover', importer.highlightColumn);
5631 27 Sep 19 nicklas 259       Events.addEventHandler(element, 'mouseout', importer.highlightColumn);
5631 27 Sep 19 nicklas 260     }
5631 27 Sep 19 nicklas 261     else if (autoInit == 'plate-row')
5631 27 Sep 19 nicklas 262     {
5631 27 Sep 19 nicklas 263       Events.addEventHandler(element, 'click', importer.toggleRow);
5631 27 Sep 19 nicklas 264       Events.addEventHandler(element, 'mouseover', importer.highlightRow);
5631 27 Sep 19 nicklas 265       Events.addEventHandler(element, 'mouseout', importer.highlightRow);
5631 27 Sep 19 nicklas 266     }
5631 27 Sep 19 nicklas 267     else if (autoInit == 'plate-well')
5631 27 Sep 19 nicklas 268     {
5631 27 Sep 19 nicklas 269       Events.addEventHandler(element, 'click', importer.toggleWell);
5631 27 Sep 19 nicklas 270     }
5631 27 Sep 19 nicklas 271   }
5631 27 Sep 19 nicklas 272
5631 27 Sep 19 nicklas 273   // Toggle the selected status of a single well
5631 27 Sep 19 nicklas 274   importer.toggleWell = function(event)
5631 27 Sep 19 nicklas 275   {
5631 27 Sep 19 nicklas 276     var row = Data.int(event.currentTarget, 'row');
5631 27 Sep 19 nicklas 277     var column = Data.int(event.currentTarget, 'col');
5631 27 Sep 19 nicklas 278     var well = Plate.getWell(row, column);
5631 27 Sep 19 nicklas 279     Plate.toggleSelected([well]);
5631 27 Sep 19 nicklas 280   }
5631 27 Sep 19 nicklas 281
5631 27 Sep 19 nicklas 282   // Toggle the selected status of a complete row
5631 27 Sep 19 nicklas 283   importer.toggleRow = function(event)
5631 27 Sep 19 nicklas 284   {
5631 27 Sep 19 nicklas 285     var row = Data.int(event.currentTarget, 'row');
5631 27 Sep 19 nicklas 286     Plate.toggleSelected(Plate.getRow(row));
5631 27 Sep 19 nicklas 287   }
5631 27 Sep 19 nicklas 288
5631 27 Sep 19 nicklas 289   // Toggle the selected status of a complete column
5631 27 Sep 19 nicklas 290   importer.toggleColumn = function(event)
5631 27 Sep 19 nicklas 291   {
5631 27 Sep 19 nicklas 292     var column = Data.int(event.currentTarget, 'col');
5631 27 Sep 19 nicklas 293     Plate.toggleSelected(Plate.getColumn(column));
5631 27 Sep 19 nicklas 294   }
5631 27 Sep 19 nicklas 295   
5631 27 Sep 19 nicklas 296   // Highlight enable/disable all wells in a column
5631 27 Sep 19 nicklas 297   importer.highlightColumn = function(event)
5631 27 Sep 19 nicklas 298   {
5631 27 Sep 19 nicklas 299     var column = Data.int(event.currentTarget, 'col');
5631 27 Sep 19 nicklas 300     var on = event.type == 'mouseover';
5631 27 Sep 19 nicklas 301     
5631 27 Sep 19 nicklas 302     Doc.addOrRemoveClass(event.currentTarget, 'highlight-column', on);
5631 27 Sep 19 nicklas 303     var wells = Plate.getColumn(column);
5631 27 Sep 19 nicklas 304     Plate.setHighlight(wells, 'highlight-column', on);
5631 27 Sep 19 nicklas 305   }
5631 27 Sep 19 nicklas 306
5631 27 Sep 19 nicklas 307   // Highlight enable/disable all wells in a row
5631 27 Sep 19 nicklas 308   importer.highlightRow = function(event)
5631 27 Sep 19 nicklas 309   {
5631 27 Sep 19 nicklas 310     var row = Data.int(event.currentTarget, 'row');
5631 27 Sep 19 nicklas 311     var on = event.type == 'mouseover';
5631 27 Sep 19 nicklas 312     
5631 27 Sep 19 nicklas 313     Doc.addOrRemoveClass(event.currentTarget, 'highlight-row', on);
5631 27 Sep 19 nicklas 314     var wells = Plate.getRow(row);
5631 27 Sep 19 nicklas 315     Plate.setHighlight(wells, 'highlight-row', on);
5631 27 Sep 19 nicklas 316   }
5631 27 Sep 19 nicklas 317   
5631 27 Sep 19 nicklas 318   return importer;
5631 27 Sep 19 nicklas 319 }();
5631 27 Sep 19 nicklas 320
5631 27 Sep 19 nicklas 321 Doc.onLoad(ImportPlates.initPage);
5631 27 Sep 19 nicklas 322 Doc.addElementInitializer(ImportPlates.initElements);
5631 27 Sep 19 nicklas 323
5631 27 Sep 19 nicklas 324 var WellPainter = function()
5631 27 Sep 19 nicklas 325 {
5631 27 Sep 19 nicklas 326   var painter = {};
5631 27 Sep 19 nicklas 327   
5631 27 Sep 19 nicklas 328   // Add class indicators for replicates and QC assigned wells
5631 27 Sep 19 nicklas 329   painter.getClassNameForWell = function(well)
5631 27 Sep 19 nicklas 330   {
5631 27 Sep 19 nicklas 331     var cls = '';
5631 27 Sep 19 nicklas 332     if (well.extract)
5631 27 Sep 19 nicklas 333     {
5631 27 Sep 19 nicklas 334       cls += ' primary';
5633 30 Sep 19 nicklas 335       cls += well.extract.id ? ' existing': ' bg-green';
5631 27 Sep 19 nicklas 336     }
5631 27 Sep 19 nicklas 337     if (well.column == Plate.columns-1) cls += ' last-child';
5631 27 Sep 19 nicklas 338     return cls;
5631 27 Sep 19 nicklas 339   }
5631 27 Sep 19 nicklas 340   
5631 27 Sep 19 nicklas 341   painter.getWellText = function(well)
5631 27 Sep 19 nicklas 342   {
5631 27 Sep 19 nicklas 343     var text = '';
5631 27 Sep 19 nicklas 344     if (well.extract)
5631 27 Sep 19 nicklas 345     {
5631 27 Sep 19 nicklas 346       // The well contains RNA
5631 27 Sep 19 nicklas 347       var aliquot = well.extract;
5631 27 Sep 19 nicklas 348       text += '<div class="name">'+Reggie.softLineBreaks(Strings.encodeTags(aliquot.name || aliquot.prefix))+'</div>';
5631 27 Sep 19 nicklas 349       
5633 30 Sep 19 nicklas 350       if (aliquot.id)
5632 30 Sep 19 nicklas 351       {
5633 30 Sep 19 nicklas 352         // Nothing
5632 30 Sep 19 nicklas 353       }
5633 30 Sep 19 nicklas 354       else
5632 30 Sep 19 nicklas 355       {
5633 30 Sep 19 nicklas 356         text += '<div class="volumes"' + (aliquot.NDConcF ? ' title="NDConc: ' + Reggie.formatNumber(aliquot.NDConcF, 'ng/µl', 1, 1) + '"' : '') + '>';
5636 02 Oct 19 nicklas 357         text += '<span class="quantity">'+(aliquot.quantityF ? Reggie.formatNumber(aliquot.quantityF*1000, 'ng', 1, 1) : (aliquot.NDConcF ? Reggie.formatNumber(aliquot.NDConcF, 'ng/µl', 1, 1) : '-')) + '</span>';
5633 30 Sep 19 nicklas 358         text += '<span class="volume">'+(aliquot.volume ? Reggie.formatNumber(aliquot.volume, 'µl', 1, 1) : '-') + '</span>';
5633 30 Sep 19 nicklas 359         text += '</div>';
5633 30 Sep 19 nicklas 360         
5633 30 Sep 19 nicklas 361         text += '<div class="rnaqc">';
5633 30 Sep 19 nicklas 362         if (aliquot.CA_RQS) 
5633 30 Sep 19 nicklas 363         {
5633 30 Sep 19 nicklas 364           text += 'RQS: ' + Strings.encodeTags(aliquot.CA_RQS);
5633 30 Sep 19 nicklas 365         }
5633 30 Sep 19 nicklas 366         else if (aliquot.BA_RIN)
5633 30 Sep 19 nicklas 367         {
5633 30 Sep 19 nicklas 368           text += 'RIN: ' + Strings.encodeTags(aliquot.BA_RIN);
5633 30 Sep 19 nicklas 369         }
5633 30 Sep 19 nicklas 370         text += '</div>';
5632 30 Sep 19 nicklas 371       }
5631 27 Sep 19 nicklas 372       if (aliquot.comment)
5631 27 Sep 19 nicklas 373       {
5631 27 Sep 19 nicklas 374         text += '<div class="comment">'+Strings.encodeTags(aliquot.comment)+'</div>';
5631 27 Sep 19 nicklas 375       }
5631 27 Sep 19 nicklas 376     }
5631 27 Sep 19 nicklas 377     else
5631 27 Sep 19 nicklas 378     {
5631 27 Sep 19 nicklas 379       text = 'empty';
5631 27 Sep 19 nicklas 380     }
5631 27 Sep 19 nicklas 381     return text;
5631 27 Sep 19 nicklas 382   }
5631 27 Sep 19 nicklas 383   
5631 27 Sep 19 nicklas 384   return painter;
5631 27 Sep 19 nicklas 385 }();