extensions/net.sf.basedb.reggie/trunk/resources/outtake/picklist.js

Code
Comments
Other
Rev Date Author Line
4157 07 Oct 16 nicklas 1 var Picklist = function()
4157 07 Oct 16 nicklas 2 {
4157 07 Oct 16 nicklas 3   var picklist = {};
4157 07 Oct 16 nicklas 4   var debug = 0;
4157 07 Oct 16 nicklas 5   
4157 07 Oct 16 nicklas 6   var lysatesIsValid = false;
4157 07 Oct 16 nicklas 7
4157 07 Oct 16 nicklas 8   // Page initialization
4157 07 Oct 16 nicklas 9   picklist.initPage = function()
4157 07 Oct 16 nicklas 10   {
4157 07 Oct 16 nicklas 11     var pageId = Doc.getPageId();
4157 07 Oct 16 nicklas 12     if (pageId == 'protocol')
4157 07 Oct 16 nicklas 13     {
4164 20 Oct 16 nicklas 14       Buttons.addClickHandler('print-button', Wizard.goPrint);
4164 20 Oct 16 nicklas 15       
4164 20 Oct 16 nicklas 16       var url = '../Outtake.servlet?ID='+App.getSessionId();
4164 20 Oct 16 nicklas 17       url += '&cmd=GetOuttakeInfo';
4164 20 Oct 16 nicklas 18       url += '&workListId='+Data.int('page-data', 'list-id');
4166 21 Oct 16 nicklas 19       url += '&useExternalId='+Data.int('page-data', 'use-external-id');
4164 20 Oct 16 nicklas 20       Wizard.showLoadingAnimation('Loading aliquot information...');
4164 20 Oct 16 nicklas 21       Wizard.asyncJsonRequest(url, picklist.initializeProtocol);
4157 07 Oct 16 nicklas 22     }
4157 07 Oct 16 nicklas 23     else
4157 07 Oct 16 nicklas 24     {
4157 07 Oct 16 nicklas 25       Events.addEventHandler('workList', 'change', picklist.worklistOnChange);
5310 15 Feb 19 nicklas 26       Buttons.addClickHandler('downloadLabelsCsv', picklist.downloadLabels);
5310 15 Feb 19 nicklas 27       Buttons.addClickHandler('downloadLabelsXlsx', picklist.downloadLabels);
4157 07 Oct 16 nicklas 28       Buttons.addClickHandler('gocreate', picklist.viewProtocol);
4157 07 Oct 16 nicklas 29
4157 07 Oct 16 nicklas 30       var url = '../Outtake.servlet?ID='+App.getSessionId();
4157 07 Oct 16 nicklas 31       url += '&cmd=GetOuttakeWorklists';
4157 07 Oct 16 nicklas 32       Wizard.showLoadingAnimation('Loading outtake work lists...');
4157 07 Oct 16 nicklas 33       Wizard.asyncJsonRequest(url, picklist.initializeStep1);
4157 07 Oct 16 nicklas 34     }
4157 07 Oct 16 nicklas 35   }
4157 07 Oct 16 nicklas 36
4157 07 Oct 16 nicklas 37   picklist.initializeStep1 = function(response)
4157 07 Oct 16 nicklas 38   {
4157 07 Oct 16 nicklas 39     var frm = document.forms['reggie'];
4157 07 Oct 16 nicklas 40     var workLists = response.workLists;
4157 07 Oct 16 nicklas 41     
4157 07 Oct 16 nicklas 42     var workList = frm.workList;
4157 07 Oct 16 nicklas 43     if (workLists.length > 0)
4157 07 Oct 16 nicklas 44     {
4157 07 Oct 16 nicklas 45       for (var i=0; i < workLists.length; i++)
4157 07 Oct 16 nicklas 46       {
4157 07 Oct 16 nicklas 47         var list = workLists[i];
6326 14 Jun 21 nicklas 48         var name = list.name + ' (' + list.size+(list.parentType?' '+list.parentType : '') + ')';
4157 07 Oct 16 nicklas 49         var option = new Option(name, list.id);
4157 07 Oct 16 nicklas 50         option.workList = list;
4157 07 Oct 16 nicklas 51         workList.options[workList.length] = option;
4157 07 Oct 16 nicklas 52       }
4157 07 Oct 16 nicklas 53       Events.sendChangeEvent(workList);
4157 07 Oct 16 nicklas 54     }
4157 07 Oct 16 nicklas 55     else
4157 07 Oct 16 nicklas 56     {
4157 07 Oct 16 nicklas 57       Wizard.setFatalError('No outtake works lists available for processing.');
4157 07 Oct 16 nicklas 58       return;
4157 07 Oct 16 nicklas 59     }
4157 07 Oct 16 nicklas 60     
4157 07 Oct 16 nicklas 61     Doc.show('step-1');
4157 07 Oct 16 nicklas 62     Doc.show('gocreate');
4157 07 Oct 16 nicklas 63     Doc.show('golabels');
4157 07 Oct 16 nicklas 64   }
4157 07 Oct 16 nicklas 65   
4157 07 Oct 16 nicklas 66   picklist.worklistOnChange = function()
4157 07 Oct 16 nicklas 67   {
4157 07 Oct 16 nicklas 68     var frm = document.forms['reggie'];
4157 07 Oct 16 nicklas 69     var workList = frm.workList[frm.workList.selectedIndex].workList;
4157 07 Oct 16 nicklas 70     Doc.element('comments').innerHTML = Strings.encodeTags(workList.comments);
4157 07 Oct 16 nicklas 71   }
4157 07 Oct 16 nicklas 72
4157 07 Oct 16 nicklas 73   picklist.viewProtocol = function()
4157 07 Oct 16 nicklas 74   {
4157 07 Oct 16 nicklas 75     var frm = document.forms['reggie'];
4157 07 Oct 16 nicklas 76     frm.submit();
4157 07 Oct 16 nicklas 77   }
4157 07 Oct 16 nicklas 78
4157 07 Oct 16 nicklas 79   picklist.downloadLabels = function(event)
4157 07 Oct 16 nicklas 80   {
4157 07 Oct 16 nicklas 81     var frm = document.forms['reggie'];
5310 15 Feb 19 nicklas 82     var format = Data.get(event.currentTarget, 'format');
4157 07 Oct 16 nicklas 83
4157 07 Oct 16 nicklas 84     var url = '../Outtake.servlet?ID='+App.getSessionId();
4157 07 Oct 16 nicklas 85     url += '&cmd=DownloadLabels';
4157 07 Oct 16 nicklas 86     url += '&workListId='+frm.workList.value;
4166 21 Oct 16 nicklas 87     if (frm.useExternalId.checked)
4166 21 Oct 16 nicklas 88     {
4166 21 Oct 16 nicklas 89       url += '&useExternalId=1';
4166 21 Oct 16 nicklas 90     }
5310 15 Feb 19 nicklas 91     url += '&format='+encodeURIComponent(format);
4157 07 Oct 16 nicklas 92     location.href = url;
4157 07 Oct 16 nicklas 93   }
4157 07 Oct 16 nicklas 94
4164 20 Oct 16 nicklas 95   picklist.initializeProtocol = function(response)
4164 20 Oct 16 nicklas 96   {
4164 20 Oct 16 nicklas 97     var html = '';
4164 20 Oct 16 nicklas 98     
4164 20 Oct 16 nicklas 99     var list = response.list;
6326 14 Jun 21 nicklas 100     var needTargetAmount = list.TargetAmount > 0;
6326 14 Jun 21 nicklas 101     var needTargetVolume = list.TargetVolume > 0;
4164 20 Oct 16 nicklas 102     
6326 14 Jun 21 nicklas 103     Doc.element('parentType').innerHTML = Strings.encodeTags(list.parentType);
6326 14 Jun 21 nicklas 104     if (needTargetAmount)
6326 14 Jun 21 nicklas 105     {
6326 14 Jun 21 nicklas 106       Doc.element('targetAmount').innerHTML = Reggie.formatNumber(list.TargetAmount, ' µg', 1);
6326 14 Jun 21 nicklas 107     }
6326 14 Jun 21 nicklas 108     else
6326 14 Jun 21 nicklas 109     {
6326 14 Jun 21 nicklas 110       Doc.hide('targetAmountSection');
6326 14 Jun 21 nicklas 111     }
6326 14 Jun 21 nicklas 112     if (needTargetVolume)
6326 14 Jun 21 nicklas 113     {
6326 14 Jun 21 nicklas 114       Doc.element('targetVolume').innerHTML = Reggie.formatNumber(list.TargetVolume, ' µl', 1);
6326 14 Jun 21 nicklas 115     }
6326 14 Jun 21 nicklas 116     else
6326 14 Jun 21 nicklas 117     {
6326 14 Jun 21 nicklas 118       Doc.hide('targetVolumeSection');
6326 14 Jun 21 nicklas 119     }
6326 14 Jun 21 nicklas 120     if (needTargetAmount && needTargetVolume)
6326 14 Jun 21 nicklas 121     {
6326 14 Jun 21 nicklas 122       Doc.element('targetConcentration').innerHTML = Reggie.formatNumber(1000 * list.TargetAmount / list.TargetVolume, ' ng/µl', 2);
6326 14 Jun 21 nicklas 123     }
6326 14 Jun 21 nicklas 124     else
6326 14 Jun 21 nicklas 125     {
6326 14 Jun 21 nicklas 126       Doc.hide('targetConcentrationSection');
6326 14 Jun 21 nicklas 127     }
6326 14 Jun 21 nicklas 128     
4164 20 Oct 16 nicklas 129     var aliquots = response.aliquots;
4164 20 Oct 16 nicklas 130     var newBoxes = [];
4168 21 Oct 16 nicklas 131     var lastAliquotBox = -1;
4164 20 Oct 16 nicklas 132     var lastRow = -1;
4168 21 Oct 16 nicklas 133     var lastStorageBox = -1;
4164 20 Oct 16 nicklas 134     var numRows = 0;
6730 05 May 22 nicklas 135     var showLabelColumn = false;
4164 20 Oct 16 nicklas 136     
4164 20 Oct 16 nicklas 137     for (var aliquotNo = 0; aliquotNo < aliquots.length; aliquotNo++)
4164 20 Oct 16 nicklas 138     {
4164 20 Oct 16 nicklas 139       var a = aliquots[aliquotNo];
4164 20 Oct 16 nicklas 140       var p = a.parent;
6730 05 May 22 nicklas 141       if (p.label) showLabelColumn = true;
6220 20 Apr 21 nicklas 142       var storageBox = p.bioWell ? p.bioWell.bioPlate : { 'name': 'Unknown box', 'id': 0 };
4164 20 Oct 16 nicklas 143       var aliquotBox = a.bioWell.bioPlate;
4164 20 Oct 16 nicklas 144       var markNewBox = false;
4164 20 Oct 16 nicklas 145       var markNewRow = false;
4168 21 Oct 16 nicklas 146       if (lastAliquotBox != aliquotBox.id)
4164 20 Oct 16 nicklas 147       {
4164 20 Oct 16 nicklas 148         newBoxes[newBoxes.length] = Strings.encodeTags(aliquotBox.name);
4168 21 Oct 16 nicklas 149         lastAliquotBox = aliquotBox.id;
4164 20 Oct 16 nicklas 150         markNewBox = true;
4164 20 Oct 16 nicklas 151       }
4168 21 Oct 16 nicklas 152       var displayFreezer = false;
4168 21 Oct 16 nicklas 153       if (lastStorageBox != storageBox.id)
4168 21 Oct 16 nicklas 154       {
4168 21 Oct 16 nicklas 155         lastStorageBox = storageBox.id;
4168 21 Oct 16 nicklas 156         displayFreezer = true;
4168 21 Oct 16 nicklas 157         
4168 21 Oct 16 nicklas 158       }
4164 20 Oct 16 nicklas 159       if (lastRow != a.bioWell.row)
4164 20 Oct 16 nicklas 160       {
4164 20 Oct 16 nicklas 161         lastRow = a.bioWell.row;
4164 20 Oct 16 nicklas 162         numRows++;
4172 24 Oct 16 nicklas 163         markNewRow = true;
4172 24 Oct 16 nicklas 164       }
4172 24 Oct 16 nicklas 165       
4172 24 Oct 16 nicklas 166       if (displayFreezer || markNewBox)
4172 24 Oct 16 nicklas 167       {
4172 24 Oct 16 nicklas 168         markNewRow = true;
4172 24 Oct 16 nicklas 169         var freezer = storageBox.storage;
4172 24 Oct 16 nicklas 170         
4172 24 Oct 16 nicklas 171         html += '<tr class="box-row'+(numRows % 2 == 0 ? ' odd-row' : '')+'">';
6730 05 May 22 nicklas 172         html += '<td colspan="5">';
4172 24 Oct 16 nicklas 173         html += Strings.encodeTags(storageBox.name);
4172 24 Oct 16 nicklas 174         if (freezer)
4168 21 Oct 16 nicklas 175         {
4172 24 Oct 16 nicklas 176           html += '<span class="freezer"> - '+Strings.encodeTags(freezer.name);
4172 24 Oct 16 nicklas 177           if (freezer.section) html += '; Section ' + Strings.encodeTags(freezer.section);
4172 24 Oct 16 nicklas 178           if (freezer.tray) html += '; Tray ' + Strings.encodeTags(freezer.tray);
4172 24 Oct 16 nicklas 179           if (freezer.position) html += '; Position ' + Strings.encodeTags(freezer.position);
4172 24 Oct 16 nicklas 180           html += '</span>';
4168 21 Oct 16 nicklas 181         }
4172 24 Oct 16 nicklas 182         html += '</td>';
4172 24 Oct 16 nicklas 183         //html += '<td colspan="2" class="leftborder"></td>';
6730 05 May 22 nicklas 184         html += '<td class="leftborder new-box" colspan="2">'+Strings.encodeTags(aliquotBox.name)+'</td>';
4172 24 Oct 16 nicklas 185         html += '<td class="leftborder"></td>';
4172 24 Oct 16 nicklas 186         html += '</tr>';
4164 20 Oct 16 nicklas 187       }
4164 20 Oct 16 nicklas 188       
4164 20 Oct 16 nicklas 189       var remarks = [];
4165 21 Oct 16 nicklas 190       var dilution = {};
4165 21 Oct 16 nicklas 191       if (a.dilution)
4164 20 Oct 16 nicklas 192       {
4165 21 Oct 16 nicklas 193         dilution = a.dilution;
6326 14 Jun 21 nicklas 194         if (needTargetAmount)
4164 20 Oct 16 nicklas 195         {
6326 14 Jun 21 nicklas 196           if (dilution.amount < list.TargetAmount) 
6326 14 Jun 21 nicklas 197           {
6326 14 Jun 21 nicklas 198             // Not enough remaining quantity -- take as much as possible
6326 14 Jun 21 nicklas 199             remarks[remarks.length] = 'Remain: ' + Reggie.formatNumber(dilution.amount, ' µg', 1);
6326 14 Jun 21 nicklas 200           }
6326 14 Jun 21 nicklas 201           else if (dilution.amount > list.TargetAmount)
6326 14 Jun 21 nicklas 202           {
6326 14 Jun 21 nicklas 203             // Typically happens to avoid taking less than 1µl
6326 14 Jun 21 nicklas 204             remarks[remarks.length] = 'Large mix: ' + Reggie.formatNumber(dilution.amount, ' µg', 1);
6326 14 Jun 21 nicklas 205           }
4164 20 Oct 16 nicklas 206         }
6326 14 Jun 21 nicklas 207         else if (needTargetVolume)
4164 20 Oct 16 nicklas 208         {
6326 14 Jun 21 nicklas 209           if (dilution.volume < list.TargetVolume)
6326 14 Jun 21 nicklas 210           {
6326 14 Jun 21 nicklas 211             // Not enough remaining quantity -- take as much as possible
6326 14 Jun 21 nicklas 212             remarks[remarks.length] = 'Remain: ' + Reggie.formatNumber(dilution.volume, ' µl', 1);
6326 14 Jun 21 nicklas 213           }
4164 20 Oct 16 nicklas 214         }
4165 21 Oct 16 nicklas 215         if (dilution.water < 0)
4164 20 Oct 16 nicklas 216         {
4172 24 Oct 16 nicklas 217           // Happens when source concentration is lower that target concentration
6220 20 Apr 21 nicklas 218           remarks[remarks.length] = 'Conc: ' + Reggie.formatNumber(p.conc, ' ng/µl', 2);
4165 21 Oct 16 nicklas 219           dilution.water = null;
4164 20 Oct 16 nicklas 220         }
4164 20 Oct 16 nicklas 221       }
6326 14 Jun 21 nicklas 222       else
6326 14 Jun 21 nicklas 223       {
6326 14 Jun 21 nicklas 224         if (!p.remainingQuantity) 
6326 14 Jun 21 nicklas 225         {
6326 14 Jun 21 nicklas 226           remarks[remarks.length] = 'Remain: unknown';
6326 14 Jun 21 nicklas 227         }
6326 14 Jun 21 nicklas 228         else if (!p.NdConc)
6326 14 Jun 21 nicklas 229         {
6326 14 Jun 21 nicklas 230           remarks[remarks.length] = 'Conc: unknown';
6326 14 Jun 21 nicklas 231         }
6326 14 Jun 21 nicklas 232       }
4164 20 Oct 16 nicklas 233       
4164 20 Oct 16 nicklas 234       var rowClass = [];
4164 20 Oct 16 nicklas 235       if (markNewRow && numRows > 1) rowClass[rowClass.length] = 'new-row';
4164 20 Oct 16 nicklas 236       if (markNewBox && newBoxes.length > 1) rowClass[rowClass.length] = 'new-box';
4164 20 Oct 16 nicklas 237       if (newBoxes.length % 2 == 0) rowClass[rowClass.length] = 'odd-box';
4164 20 Oct 16 nicklas 238       if (numRows % 2 == 0) rowClass[rowClass.length] = 'odd-row';
4164 20 Oct 16 nicklas 239       
4164 20 Oct 16 nicklas 240       html += '<tr class="'+rowClass.join(' ')+'">';
4164 20 Oct 16 nicklas 241       html += '<th>'+Strings.encodeTags(p.name)+'</th>';
6730 05 May 22 nicklas 242       html += '<td class="label">'+Strings.encodeTags(p.label)+'</td>';
4172 24 Oct 16 nicklas 243       html += '<td class="box">'+picklist.asStorageLocation(p.bioWell, false)+'</td>';
4165 21 Oct 16 nicklas 244       html += '<td class="volume leftborder">' + (Numbers.formatNumber(dilution.volume, 1) || '-') + '</td>';
4165 21 Oct 16 nicklas 245       html += '<td class="water">' + (Numbers.formatNumber(dilution.water, 1) || '-') + '</td>';
6730 05 May 22 nicklas 246       html += '<th class="leftborder new-box">'+Strings.encodeTags(a.externalId || a.name)+'</th>';
6730 05 May 22 nicklas 247       html += '<td class="box new-box">'+(a.bioWell.location)+'</td>';
4164 20 Oct 16 nicklas 248       html += '<td class="leftborder">' + remarks.join(', ') + '</td>';
4164 20 Oct 16 nicklas 249       html += '</tr>';
4164 20 Oct 16 nicklas 250     }
4164 20 Oct 16 nicklas 251     
4164 20 Oct 16 nicklas 252     Doc.element('newBoxes').innerHTML = newBoxes.join(', ');
4164 20 Oct 16 nicklas 253     
4164 20 Oct 16 nicklas 254     Doc.element('aliquot-list').innerHTML = html;
6730 05 May 22 nicklas 255     if (showLabelColumn) 
6730 05 May 22 nicklas 256     {
6730 05 May 22 nicklas 257       Doc.removeClass('aliquot-table', 'nolabels');
6730 05 May 22 nicklas 258       Doc.show('protocol-footer');
6730 05 May 22 nicklas 259     }
4164 20 Oct 16 nicklas 260     Doc.show('all-protocol');
4164 20 Oct 16 nicklas 261   }
4164 20 Oct 16 nicklas 262
4168 21 Oct 16 nicklas 263   picklist.asStorageLocation = function(well, displayFreezer)
4164 20 Oct 16 nicklas 264   {
4164 20 Oct 16 nicklas 265     if (!well) return '';
4164 20 Oct 16 nicklas 266     var plate = well.bioPlate;
4168 21 Oct 16 nicklas 267     var location = '';
4168 21 Oct 16 nicklas 268     if (plate.storage && displayFreezer)
4164 20 Oct 16 nicklas 269     {
4164 20 Oct 16 nicklas 270       var storage = plate.storage;
4168 21 Oct 16 nicklas 271       location += Strings.encodeTags(storage.name);
4168 21 Oct 16 nicklas 272       if (storage.section) location += '; Section ' + Strings.encodeTags(storage.section);
4164 20 Oct 16 nicklas 273       if (storage.tray) location += '; Tray ' + Strings.encodeTags(storage.tray);
4164 20 Oct 16 nicklas 274       if (storage.position) location += '; Position ' + Strings.encodeTags(storage.position);
4168 21 Oct 16 nicklas 275       location += '<br>';
4164 20 Oct 16 nicklas 276     }
4168 21 Oct 16 nicklas 277     location += Strings.encodeTags(plate.name + ' ' + well.location);
4164 20 Oct 16 nicklas 278     return location;
4164 20 Oct 16 nicklas 279   }
4164 20 Oct 16 nicklas 280   
4157 07 Oct 16 nicklas 281   return picklist;
4157 07 Oct 16 nicklas 282 }();
4157 07 Oct 16 nicklas 283
4157 07 Oct 16 nicklas 284 Doc.onLoad(Picklist.initPage);
4157 07 Oct 16 nicklas 285