extensions/net.sf.basedb.reggie/trunk/resources/sampleproc/allprep_protocol.js

Code
Comments
Other
Rev Date Author Line
2686 22 Sep 14 nicklas 1 var Protocol = function()
2686 22 Sep 14 nicklas 2 {
2686 22 Sep 14 nicklas 3   var protocol = {};
2702 26 Sep 14 nicklas 4   var debug = 0;
2686 22 Sep 14 nicklas 5   
2686 22 Sep 14 nicklas 6   var lysatesIsValid = false;
2686 22 Sep 14 nicklas 7
2686 22 Sep 14 nicklas 8   // Page initialization
2686 22 Sep 14 nicklas 9   protocol.initPage = function()
2686 22 Sep 14 nicklas 10   {
2686 22 Sep 14 nicklas 11     var pageId = Doc.getPageId();
2686 22 Sep 14 nicklas 12     if (pageId == 'protocol')
2686 22 Sep 14 nicklas 13     {
2686 22 Sep 14 nicklas 14       Buttons.addClickHandler('print-button', Wizard.goPrint);  
2686 22 Sep 14 nicklas 15       Doc.show('all-protocol');
3168 05 Mar 15 nicklas 16       
3168 05 Mar 15 nicklas 17       var url = '../Extraction.servlet?ID='+App.getSessionId();
3168 05 Mar 15 nicklas 18       url += '&cmd=GetLatestReagentLotNumbers';    
3168 05 Mar 15 nicklas 19       Wizard.showLoadingAnimation('Loading recent reagent lot numbers...');
3168 05 Mar 15 nicklas 20       Wizard.asyncJsonRequest(url, protocol.reagentsLoaded);
3168 05 Mar 15 nicklas 21       
3168 05 Mar 15 nicklas 22       Events.addEventHandler('showReagents', 'click', protocol.toggleReagents);
2686 22 Sep 14 nicklas 23     }
2686 22 Sep 14 nicklas 24     else
2686 22 Sep 14 nicklas 25     {
2686 22 Sep 14 nicklas 26       Events.addEventHandler('lysates', 'change', protocol.lysatesOnChange);
4097 13 Sep 16 nicklas 27       Events.addEventHandler('reextraction', 'change', protocol.lysatesOnChange);
5304 15 Feb 19 nicklas 28       Buttons.addClickHandler('downloadLabelsCsv', protocol.downloadLabels);
5304 15 Feb 19 nicklas 29       Buttons.addClickHandler('downloadLabelsXlsx', protocol.downloadLabels);
2686 22 Sep 14 nicklas 30       Buttons.addClickHandler('gocreate', protocol.viewProtocol);
2686 22 Sep 14 nicklas 31
2686 22 Sep 14 nicklas 32       var url = '../Extraction.servlet?ID='+App.getSessionId();
4093 12 Sep 16 nicklas 33       url += '&cmd=GetUnprocessedLysates&includeReprocess=1';
2686 22 Sep 14 nicklas 34       Wizard.showLoadingAnimation('Loading Lysate extracts...');
2686 22 Sep 14 nicklas 35       Wizard.asyncJsonRequest(url, protocol.initializeStep1);
2686 22 Sep 14 nicklas 36     }
2686 22 Sep 14 nicklas 37   }
2686 22 Sep 14 nicklas 38
2686 22 Sep 14 nicklas 39
2686 22 Sep 14 nicklas 40   protocol.initializeStep1 = function(response)
2686 22 Sep 14 nicklas 41   {
2686 22 Sep 14 nicklas 42     var frm = document.forms['reggie'];  
2686 22 Sep 14 nicklas 43     var lysates = response.lysates;
2686 22 Sep 14 nicklas 44     
3469 27 Aug 15 nicklas 45     Doc.element('reserve').value = response.ReservedBy.id;
3740 11 Feb 16 nicklas 46     Doc.element('YellowLabel').value = response.YellowLabel.id;
4093 12 Sep 16 nicklas 47     Doc.element('AutoProcessing').value = response.AutoProcessing.id;
6723 04 May 22 nicklas 48     Doc.element('TubeLabel').value = response.TubeLabel.id;
3469 27 Aug 15 nicklas 49     
2686 22 Sep 14 nicklas 50     var lysateList = frm.lysates;
4097 13 Sep 16 nicklas 51     var reextractList = frm.reextraction;
2686 22 Sep 14 nicklas 52     if (lysates.length > 0)
2686 22 Sep 14 nicklas 53     {
3469 27 Aug 15 nicklas 54       // Check if we have any lysate reserved by the current user
3469 27 Aug 15 nicklas 55       var currentUser = Data.get(lysateList, 'current-user');
3469 27 Aug 15 nicklas 56       var hasReserved = false;
3740 11 Feb 16 nicklas 57       var numYellow = 0;
2686 22 Sep 14 nicklas 58       for (var i=0; i < lysates.length; i++)
2686 22 Sep 14 nicklas 59       {
3740 11 Feb 16 nicklas 60         var lysate = lysates[i];
3740 11 Feb 16 nicklas 61         if (lysate.ReservedBy == currentUser) hasReserved = true;
3740 11 Feb 16 nicklas 62         if (lysate.specimen.YellowLabel != null) numYellow++;
3469 27 Aug 15 nicklas 63       }
3469 27 Aug 15 nicklas 64       
3469 27 Aug 15 nicklas 65       var numSelected = 0;
3740 11 Feb 16 nicklas 66       var maxNonYellow = 12-numYellow;
3469 27 Aug 15 nicklas 67       for (var i=0; i < lysates.length; i++)
3469 27 Aug 15 nicklas 68       {
2686 22 Sep 14 nicklas 69         var lysate = lysates[i];
3740 11 Feb 16 nicklas 70         var isYellow = lysate.specimen.YellowLabel != null;
4097 13 Sep 16 nicklas 71         lysate.isReProcess = lysate.AutoProcessing == 'ReProcess';
2686 22 Sep 14 nicklas 72         var name = (i+1) + ': ' + Strings.encodeTags(lysate.name);
2686 22 Sep 14 nicklas 73         if (lysate.bioWell)
2686 22 Sep 14 nicklas 74         {
2686 22 Sep 14 nicklas 75           name += ' -- ' + Strings.encodeTags(lysate.bioWell.bioPlate.name + ' (' + lysate.bioWell.location+')');
2686 22 Sep 14 nicklas 76         }
3469 27 Aug 15 nicklas 77         if (lysate.ReservedBy)
3469 27 Aug 15 nicklas 78         {
3469 27 Aug 15 nicklas 79           name += ' ['+lysate.ReservedBy+']';
3469 27 Aug 15 nicklas 80         }
3469 27 Aug 15 nicklas 81         
3469 27 Aug 15 nicklas 82         // We only auto-select items reserved by the current user (if it has any)
3469 27 Aug 15 nicklas 83         // and never any items reserved by other users
3469 27 Aug 15 nicklas 84         var selected = false;
3469 27 Aug 15 nicklas 85         if (numSelected < 12)
3469 27 Aug 15 nicklas 86         {
3740 11 Feb 16 nicklas 87           if (hasReserved)
3740 11 Feb 16 nicklas 88           {
3740 11 Feb 16 nicklas 89             selected = lysate.ReservedBy == currentUser;
3740 11 Feb 16 nicklas 90           }
3740 11 Feb 16 nicklas 91           else
3740 11 Feb 16 nicklas 92           {
3740 11 Feb 16 nicklas 93             selected = isYellow || maxNonYellow > 0;
3740 11 Feb 16 nicklas 94           }
3740 11 Feb 16 nicklas 95           if (selected) 
3740 11 Feb 16 nicklas 96           {
3740 11 Feb 16 nicklas 97             numSelected++;
3740 11 Feb 16 nicklas 98             if (!isYellow) maxNonYellow--;
3740 11 Feb 16 nicklas 99           }
3469 27 Aug 15 nicklas 100         }
3469 27 Aug 15 nicklas 101         
2686 22 Sep 14 nicklas 102         var option = new Option(name, lysate.id, selected, selected);
3740 11 Feb 16 nicklas 103         if (isYellow) option.className = 'yellow';
2686 22 Sep 14 nicklas 104         option.lysate = lysate;
4097 13 Sep 16 nicklas 105         if (lysate.isReProcess)
4097 13 Sep 16 nicklas 106         {
4097 13 Sep 16 nicklas 107           reextractList.options[reextractList.length] = option;
4097 13 Sep 16 nicklas 108         }
4097 13 Sep 16 nicklas 109         else
4097 13 Sep 16 nicklas 110         {
4097 13 Sep 16 nicklas 111           lysateList.options[lysateList.length] = option;
4097 13 Sep 16 nicklas 112         }
2686 22 Sep 14 nicklas 113       }
4097 13 Sep 16 nicklas 114       if (lysateList.length == 0) Doc.hide('regularFlowRow');
4097 13 Sep 16 nicklas 115       if (reextractList.length > 0) Doc.show('reExtractionRow');
2686 22 Sep 14 nicklas 116       protocol.lysatesOnChange();
2686 22 Sep 14 nicklas 117     }
2686 22 Sep 14 nicklas 118     else
2686 22 Sep 14 nicklas 119     {  
2686 22 Sep 14 nicklas 120       Wizard.setFatalError('No Lysate available for processing.');
2686 22 Sep 14 nicklas 121       return;
2686 22 Sep 14 nicklas 122     }
2686 22 Sep 14 nicklas 123     
2686 22 Sep 14 nicklas 124     Doc.show('step-1');
2686 22 Sep 14 nicklas 125     Doc.show('gocreate');
2686 22 Sep 14 nicklas 126   }
2686 22 Sep 14 nicklas 127   
2686 22 Sep 14 nicklas 128
2686 22 Sep 14 nicklas 129   // Add pools to the pools list based on the bioplate selection
2686 22 Sep 14 nicklas 130   protocol.lysatesOnChange = function()
2686 22 Sep 14 nicklas 131   {
4097 13 Sep 16 nicklas 132     var frm = document.forms['reggie'];
2686 22 Sep 14 nicklas 133     lysatesIsValid = false;
4097 13 Sep 16 nicklas 134     Wizard.setInputStatus('lysates');
4097 13 Sep 16 nicklas 135     Wizard.setInputStatus('reextraction');
2686 22 Sep 14 nicklas 136     
4097 13 Sep 16 nicklas 137     var numLysates = 0;
4097 13 Sep 16 nicklas 138     var numReextraction = 0;
4097 13 Sep 16 nicklas 139     var numUnselectedYellowLysates = 0;
4097 13 Sep 16 nicklas 140     var numUnselectedYellowReextraction = 0;
2686 22 Sep 14 nicklas 141     
4097 13 Sep 16 nicklas 142     for (var i = 0; i < frm.lysates.length; i++)
2686 22 Sep 14 nicklas 143     {
4097 13 Sep 16 nicklas 144       var lysate = frm.lysates[i].lysate;
4097 13 Sep 16 nicklas 145       if (frm.lysates[i].selected)
3740 11 Feb 16 nicklas 146       {
4097 13 Sep 16 nicklas 147         numLysates++;
3740 11 Feb 16 nicklas 148       }
4097 13 Sep 16 nicklas 149       else if (lysate.specimen.YellowLabel != null)
3740 11 Feb 16 nicklas 150       {
4097 13 Sep 16 nicklas 151         numUnselectedYellowLysates++;
3740 11 Feb 16 nicklas 152       }
2686 22 Sep 14 nicklas 153     }
4097 13 Sep 16 nicklas 154     for (var i = 0; i < frm.reextraction.length; i++)
4097 13 Sep 16 nicklas 155     {
4097 13 Sep 16 nicklas 156       var lysate = frm.reextraction[i].lysate;
4097 13 Sep 16 nicklas 157       if (frm.reextraction[i].selected)
4097 13 Sep 16 nicklas 158       {
4097 13 Sep 16 nicklas 159         numReextraction++;
4097 13 Sep 16 nicklas 160       }
4097 13 Sep 16 nicklas 161       else if (lysate.specimen.YellowLabel != null)
4097 13 Sep 16 nicklas 162       {
4097 13 Sep 16 nicklas 163         numUnselectedYellowReextraction++;
4097 13 Sep 16 nicklas 164       }
4097 13 Sep 16 nicklas 165     }
2686 22 Sep 14 nicklas 166     
4097 13 Sep 16 nicklas 167     if (numReextraction == 0 && numLysates == 0)
2686 22 Sep 14 nicklas 168     {
4097 13 Sep 16 nicklas 169       Wizard.setInputStatus('lysates', 'invalid', 'At least one lysate must be selected');
4097 13 Sep 16 nicklas 170       Wizard.setInputStatus('reextraction', 'invalid', 'At least one lysate must be selected');
2686 22 Sep 14 nicklas 171       return;
2686 22 Sep 14 nicklas 172     }
4097 13 Sep 16 nicklas 173
4097 13 Sep 16 nicklas 174     if (numReextraction+numLysates > 12)
3466 25 Aug 15 nicklas 175     {
4097 13 Sep 16 nicklas 176       if (numLysates > 0) Wizard.setInputStatus('lysates', 'invalid', 'Must not select more than 12 items.');
4097 13 Sep 16 nicklas 177       if (numReextraction > 0) Wizard.setInputStatus('reextraction', 'invalid', 'Must not select more than 12 items.');
3466 25 Aug 15 nicklas 178       return;
3466 25 Aug 15 nicklas 179     }
2686 22 Sep 14 nicklas 180     
2686 22 Sep 14 nicklas 181     lysatesIsValid = true;
4097 13 Sep 16 nicklas 182     if (numUnselectedYellowLysates > 0)
4097 13 Sep 16 nicklas 183     {
4097 13 Sep 16 nicklas 184       Wizard.setInputStatus('lysates', 'warning', 'Not all YellowLabel specimen are selected.');
4097 13 Sep 16 nicklas 185     }
4097 13 Sep 16 nicklas 186     else
4097 13 Sep 16 nicklas 187     {
4097 13 Sep 16 nicklas 188       Wizard.setInputStatus('lysates', 'valid');
4097 13 Sep 16 nicklas 189     }
4097 13 Sep 16 nicklas 190     if (numUnselectedYellowReextraction > 0)
4097 13 Sep 16 nicklas 191     {
4097 13 Sep 16 nicklas 192       Wizard.setInputStatus('reextraction', 'warning', 'Not all YellowLabel specimen are selected.');
4097 13 Sep 16 nicklas 193     }
4097 13 Sep 16 nicklas 194     else
4097 13 Sep 16 nicklas 195     {
4097 13 Sep 16 nicklas 196       Wizard.setInputStatus('reextraction', 'valid');
4097 13 Sep 16 nicklas 197     }
3740 11 Feb 16 nicklas 198     
4097 13 Sep 16 nicklas 199     if (numReextraction > 0)
3740 11 Feb 16 nicklas 200     {
5304 15 Feb 19 nicklas 201       Doc.removeClass('downloadLabelsCsv', 'disabled');
5304 15 Feb 19 nicklas 202       Doc.removeClass('downloadLabelsXlsx', 'disabled');
3740 11 Feb 16 nicklas 203     }
3740 11 Feb 16 nicklas 204     else
3740 11 Feb 16 nicklas 205     {
5304 15 Feb 19 nicklas 206       Doc.addClass('downloadLabelsCsv', 'disabled');
5304 15 Feb 19 nicklas 207       Doc.addClass('downloadLabelsXlsx', 'disabled');
3740 11 Feb 16 nicklas 208     }
4097 13 Sep 16 nicklas 209
2686 22 Sep 14 nicklas 210   }
2686 22 Sep 14 nicklas 211   
5304 15 Feb 19 nicklas 212   protocol.downloadLabels = function(event)
4097 13 Sep 16 nicklas 213   {
4097 13 Sep 16 nicklas 214     var frm = document.forms['reggie'];
5304 15 Feb 19 nicklas 215     var format = Data.get(event.currentTarget, 'format');
4097 13 Sep 16 nicklas 216     
4097 13 Sep 16 nicklas 217     var lysates = [];
4097 13 Sep 16 nicklas 218     for (var i = 0; i < frm.reextraction.length; i++)
4097 13 Sep 16 nicklas 219     {
4097 13 Sep 16 nicklas 220       var lysate = frm.reextraction[i].lysate;
4097 13 Sep 16 nicklas 221       if (frm.reextraction[i].selected)
4097 13 Sep 16 nicklas 222       {
4097 13 Sep 16 nicklas 223         lysates[lysates.length] = lysate.id;
4097 13 Sep 16 nicklas 224       }
4097 13 Sep 16 nicklas 225     }
4097 13 Sep 16 nicklas 226     
4097 13 Sep 16 nicklas 227     var frm = document.forms['reggie'];
4097 13 Sep 16 nicklas 228     var url = '../Extraction.servlet?ID='+App.getSessionId();
4097 13 Sep 16 nicklas 229     url += '&cmd=DownloadLabelFile';
4097 13 Sep 16 nicklas 230     url += '&lysates=' + encodeURIComponent(lysates.join(','));
5304 15 Feb 19 nicklas 231     url += '&format='+encodeURIComponent(format);
4097 13 Sep 16 nicklas 232     window.open(url);
4097 13 Sep 16 nicklas 233   }
4097 13 Sep 16 nicklas 234   
2686 22 Sep 14 nicklas 235   protocol.viewProtocol = function()
2686 22 Sep 14 nicklas 236   {
2686 22 Sep 14 nicklas 237     var frm = document.forms['reggie'];
2686 22 Sep 14 nicklas 238     if (!lysatesIsValid)
2686 22 Sep 14 nicklas 239     {
2686 22 Sep 14 nicklas 240       Wizard.notifyError();
2686 22 Sep 14 nicklas 241       return;
2686 22 Sep 14 nicklas 242     }
2686 22 Sep 14 nicklas 243     frm.submit();
2686 22 Sep 14 nicklas 244   }
2686 22 Sep 14 nicklas 245
3168 05 Mar 15 nicklas 246   protocol.reagentsLoaded = function(response)
3168 05 Mar 15 nicklas 247   {
3168 05 Mar 15 nicklas 248     var rna = response.rna;
3168 05 Mar 15 nicklas 249     var lysate = response.lysate;
3168 05 Mar 15 nicklas 250     if (rna) 
3168 05 Mar 15 nicklas 251     {
3168 05 Mar 15 nicklas 252       protocol.fillLatestReagents(rna);
3168 05 Mar 15 nicklas 253       Doc.element('latestQiaCubeDate').innerHTML = Reggie.reformatDate(rna.QiaCubeDate);
3168 05 Mar 15 nicklas 254       Doc.show('showLatestReagents', 'inline');
3168 05 Mar 15 nicklas 255     }
3168 05 Mar 15 nicklas 256     if (lysate) protocol.fillLatestReagents(lysate);
3168 05 Mar 15 nicklas 257   }
3168 05 Mar 15 nicklas 258   
3168 05 Mar 15 nicklas 259   protocol.fillLatestReagents = function(item)
3168 05 Mar 15 nicklas 260   {
3168 05 Mar 15 nicklas 261     for (var rg in item)
3168 05 Mar 15 nicklas 262     {
3168 05 Mar 15 nicklas 263       if (item[rg] != null)
3168 05 Mar 15 nicklas 264       {
3168 05 Mar 15 nicklas 265         var e = Doc.element(rg);
3168 05 Mar 15 nicklas 266         if (e)
3168 05 Mar 15 nicklas 267         {
3168 05 Mar 15 nicklas 268           e.innerHTML = Strings.encodeTags(item[rg]);
3168 05 Mar 15 nicklas 269         }
3168 05 Mar 15 nicklas 270         
3168 05 Mar 15 nicklas 271       }
3168 05 Mar 15 nicklas 272     }
3168 05 Mar 15 nicklas 273   }
3168 05 Mar 15 nicklas 274   
3168 05 Mar 15 nicklas 275   protocol.toggleReagents = function(event)
3168 05 Mar 15 nicklas 276   {
3168 05 Mar 15 nicklas 277     Doc.addOrRemoveClass(document.body, 'hide-reagents', !event.currentTarget.checked);
3168 05 Mar 15 nicklas 278   }
4097 13 Sep 16 nicklas 279   
2686 22 Sep 14 nicklas 280   return protocol;
2686 22 Sep 14 nicklas 281 }();
2686 22 Sep 14 nicklas 282
2686 22 Sep 14 nicklas 283 Doc.onLoad(Protocol.initPage);
2686 22 Sep 14 nicklas 284