extensions/net.sf.basedb.reggie/trunk/resources/mipsprep/flowcell_protocol.js

Code
Comments
Other
Rev Date Author Line
5462 03 Jun 19 nicklas 1 var FlowCell = function()
5462 03 Jun 19 nicklas 2 {
5462 03 Jun 19 nicklas 3   var flowcell = {};
5462 03 Jun 19 nicklas 4   var debug = 0;
5462 03 Jun 19 nicklas 5   
5462 03 Jun 19 nicklas 6   var COLORS = ['blue', 'green', 'yellow', 'red'];
5462 03 Jun 19 nicklas 7   var nextColor = 0;
5462 03 Jun 19 nicklas 8
5462 03 Jun 19 nicklas 9   // Page initialization
5462 03 Jun 19 nicklas 10   flowcell.initPage = function()
5462 03 Jun 19 nicklas 11   {
5462 03 Jun 19 nicklas 12     var pageId = Doc.getPageId();
5462 03 Jun 19 nicklas 13     if (pageId == 'protocol')
5462 03 Jun 19 nicklas 14     {
5462 03 Jun 19 nicklas 15       Buttons.addClickHandler('print-button', Wizard.goPrint);    
5462 03 Jun 19 nicklas 16       var idList = Data.get('page-data', 'flowcells');
5470 05 Jun 19 nicklas 17       var url = '../FlowCell.servlet?ID='+App.getSessionId();
5462 03 Jun 19 nicklas 18       url += '&cmd=GetFlowCellInfo';
5462 03 Jun 19 nicklas 19       url += '&idlist='+idList;
5462 03 Jun 19 nicklas 20       Wizard.showLoadingAnimation('Loading flow cell info...');
5462 03 Jun 19 nicklas 21       Wizard.asyncJsonRequest(url, flowcell.initializeProtocol);
5462 03 Jun 19 nicklas 22     }
5462 03 Jun 19 nicklas 23     else
5462 03 Jun 19 nicklas 24     {
5462 03 Jun 19 nicklas 25       Buttons.addClickHandler('gocreate', flowcell.createProtocol);
5470 05 Jun 19 nicklas 26       var url = '../FlowCell.servlet?ID='+App.getSessionId();
5470 05 Jun 19 nicklas 27       url += '&cmd=GetUnprocessedFlowCells&pipeline=MIPS';    
5462 03 Jun 19 nicklas 28       Wizard.showLoadingAnimation('Loading flow cells...');
5462 03 Jun 19 nicklas 29       Wizard.asyncJsonRequest(url, flowcell.initializeStep1);
5462 03 Jun 19 nicklas 30     }
5462 03 Jun 19 nicklas 31   }
5462 03 Jun 19 nicklas 32
5462 03 Jun 19 nicklas 33
5462 03 Jun 19 nicklas 34   flowcell.initializeStep1 = function(response)
5462 03 Jun 19 nicklas 35   {
5462 03 Jun 19 nicklas 36     var frm = document.forms['reggie'];
5462 03 Jun 19 nicklas 37     var flowCells = response.flowCells;
5462 03 Jun 19 nicklas 38     
5462 03 Jun 19 nicklas 39     if (flowCells.length > 0)
5462 03 Jun 19 nicklas 40     {
5462 03 Jun 19 nicklas 41       var lastOption = null;
5462 03 Jun 19 nicklas 42       for (var fcNo=0; fcNo < flowCells.length; fcNo++)
5462 03 Jun 19 nicklas 43       {
5462 03 Jun 19 nicklas 44         var fc = flowCells[fcNo];
5462 03 Jun 19 nicklas 45         var option = flowcell.getOptionForFlowCell(fc);
5462 03 Jun 19 nicklas 46         if (fcNo == 0 || (lastOption != null && lastOption.selected && lastOption.title == option.title)) 
5462 03 Jun 19 nicklas 47         {
5462 03 Jun 19 nicklas 48           // Select the first option and more if they have the same pool(s)
5462 03 Jun 19 nicklas 49           option.selected = true;
5462 03 Jun 19 nicklas 50         }
5462 03 Jun 19 nicklas 51         frm.flowcells[frm.flowcells.length] = option;
5462 03 Jun 19 nicklas 52         lastOption = option;
5462 03 Jun 19 nicklas 53       }
5462 03 Jun 19 nicklas 54     }
5462 03 Jun 19 nicklas 55     else
5462 03 Jun 19 nicklas 56     {
5462 03 Jun 19 nicklas 57       Wizard.setFatalError('No flow cells available for processing.');
5462 03 Jun 19 nicklas 58       return;
5462 03 Jun 19 nicklas 59     }
5462 03 Jun 19 nicklas 60
5462 03 Jun 19 nicklas 61     // All is ok
5462 03 Jun 19 nicklas 62     Doc.show('step-1');
5462 03 Jun 19 nicklas 63     Doc.show('gocreate')
5462 03 Jun 19 nicklas 64     frm.flowcells.focus();
5462 03 Jun 19 nicklas 65   }
5462 03 Jun 19 nicklas 66   
5462 03 Jun 19 nicklas 67   
5462 03 Jun 19 nicklas 68   flowcell.getOptionForFlowCell = function(fc)
5462 03 Jun 19 nicklas 69   {
5462 03 Jun 19 nicklas 70     var name = fc.name +': ';
5462 03 Jun 19 nicklas 71
5462 03 Jun 19 nicklas 72     var numPools = fc.pools.length;
5462 03 Jun 19 nicklas 73     var firstPoolNum = flowcell.getPoolNum(fc.pools[0].name);
5462 03 Jun 19 nicklas 74     var lastPoolNum = flowcell.getPoolNum(fc.pools[fc.pools.length-1].name);
5462 03 Jun 19 nicklas 75
5462 03 Jun 19 nicklas 76     if (lastPoolNum - firstPoolNum == numPools - 1)
5462 03 Jun 19 nicklas 77     {
5462 03 Jun 19 nicklas 78       if (numPools > 1)
5462 03 Jun 19 nicklas 79       {
5462 03 Jun 19 nicklas 80         // Display: PoolN -- PoolY
5462 03 Jun 19 nicklas 81         name += fc.pools[0].name + ' — ' + fc.pools[fc.pools.length-1].name;
5462 03 Jun 19 nicklas 82       }
5462 03 Jun 19 nicklas 83       else
5462 03 Jun 19 nicklas 84       {
5462 03 Jun 19 nicklas 85         name += fc.pools[0].name;
5462 03 Jun 19 nicklas 86       }
5462 03 Jun 19 nicklas 87     }
5462 03 Jun 19 nicklas 88     else
5462 03 Jun 19 nicklas 89     {
5462 03 Jun 19 nicklas 90       // Display: PoolN + x more...
5462 03 Jun 19 nicklas 91       name += fc.pools[0].name + ' + ' + (numPools-1) + ' more...';
5462 03 Jun 19 nicklas 92     }
5462 03 Jun 19 nicklas 93     
5470 05 Jun 19 nicklas 94     name += ' [';
5470 05 Jun 19 nicklas 95     if (fc.FlowCellType) name += fc.FlowCellType + '; ';
5470 05 Jun 19 nicklas 96     name += fc.pipeline + ']';
5462 03 Jun 19 nicklas 97
5462 03 Jun 19 nicklas 98     // Tooltip is always all pools
5462 03 Jun 19 nicklas 99     var title = '';
5462 03 Jun 19 nicklas 100     for (var poolNo=0; poolNo < numPools; poolNo++)
5462 03 Jun 19 nicklas 101     {
5462 03 Jun 19 nicklas 102       var pool = fc.pools[poolNo];
5462 03 Jun 19 nicklas 103       if (poolNo > 0) title += ', ';
5462 03 Jun 19 nicklas 104       title += pool.name;
5462 03 Jun 19 nicklas 105     }
5462 03 Jun 19 nicklas 106     
5462 03 Jun 19 nicklas 107     var option = new Option(name, fc.id);
5462 03 Jun 19 nicklas 108     option.title = title;
5462 03 Jun 19 nicklas 109     option.flowCell = fc;
5462 03 Jun 19 nicklas 110
5462 03 Jun 19 nicklas 111     return option;
5462 03 Jun 19 nicklas 112   }
5462 03 Jun 19 nicklas 113   
5462 03 Jun 19 nicklas 114   flowcell.getPoolNum = function(poolName)
5462 03 Jun 19 nicklas 115   {
5462 03 Jun 19 nicklas 116     var num = poolName.match(/Pool(\d+)/);
5462 03 Jun 19 nicklas 117     return num ? parseInt(num[1], 10) : null;  
5462 03 Jun 19 nicklas 118   }
5462 03 Jun 19 nicklas 119
5462 03 Jun 19 nicklas 120
5462 03 Jun 19 nicklas 121   flowcell.createProtocol = function()
5462 03 Jun 19 nicklas 122   {
5462 03 Jun 19 nicklas 123     var frm = document.forms['reggie'];
5462 03 Jun 19 nicklas 124     
5462 03 Jun 19 nicklas 125     var selected = [];
5462 03 Jun 19 nicklas 126     for (var i = 0; i < frm.flowcells.length; i++)
5462 03 Jun 19 nicklas 127     {
5462 03 Jun 19 nicklas 128       if (frm.flowcells[i].selected) 
5462 03 Jun 19 nicklas 129       {
5462 03 Jun 19 nicklas 130         selected[selected.length] = frm.flowcells[i].value;
5462 03 Jun 19 nicklas 131       }
5462 03 Jun 19 nicklas 132     }
5462 03 Jun 19 nicklas 133     
5462 03 Jun 19 nicklas 134     if (selected.length == 0) 
5462 03 Jun 19 nicklas 135     {
5462 03 Jun 19 nicklas 136       Wizard.setInputStatus('flowcells', 'invalid', 'Select at least one flow cell');
5462 03 Jun 19 nicklas 137       Wizard.notifyError();
5462 03 Jun 19 nicklas 138       return;
5462 03 Jun 19 nicklas 139     }
5462 03 Jun 19 nicklas 140
5462 03 Jun 19 nicklas 141     frm.submit();
5462 03 Jun 19 nicklas 142   }
5462 03 Jun 19 nicklas 143   
5462 03 Jun 19 nicklas 144   flowcell.initializeProtocol = function(response)
5462 03 Jun 19 nicklas 145   {
5462 03 Jun 19 nicklas 146     var flowCells = response.flowCells;
5462 03 Jun 19 nicklas 147
5462 03 Jun 19 nicklas 148     var allColors = [];
5462 03 Jun 19 nicklas 149     var useDarker = false;
5462 03 Jun 19 nicklas 150
5462 03 Jun 19 nicklas 151     var names = [];
5462 03 Jun 19 nicklas 152     
5462 03 Jun 19 nicklas 153     for (var fcNo = 0; fcNo < flowCells.length; fcNo++)
5462 03 Jun 19 nicklas 154     {
5462 03 Jun 19 nicklas 155       var fc = flowCells[fcNo];
5462 03 Jun 19 nicklas 156       names[names.length] = fc.name;
5462 03 Jun 19 nicklas 157       
5462 03 Jun 19 nicklas 158       var poolColors = [];
5462 03 Jun 19 nicklas 159       var poolsRow = Doc.element('all-pools-'+fcNo);
5462 03 Jun 19 nicklas 160
5462 03 Jun 19 nicklas 161       Doc.element('flowCellName.'+fcNo).innerHTML = Strings.encodeTags(fc.name);
5462 03 Jun 19 nicklas 162       Doc.element('flowCellDescription.'+fcNo).innerHTML = Strings.encodeTags(fc.description);
5462 03 Jun 19 nicklas 163       Doc.element('sequencingCycles.'+fcNo).innerHTML = Strings.encodeTags(fc.SequencingCycles);
5462 03 Jun 19 nicklas 164       Doc.element('flowCellId.'+fcNo).innerHTML = Strings.encodeTags(fc.externalId);
5470 05 Jun 19 nicklas 165       Doc.element('flowCellType.'+fcNo).innerHTML = Strings.encodeTags(fc.FlowCellType || '') + '; ' + Strings.encodeTags(fc.pipeline || '');
5462 03 Jun 19 nicklas 166       
5462 03 Jun 19 nicklas 167       if (fc.FlowCellType == 'NextSeq') Doc.hide('pos.b.'+fcNo);
5462 03 Jun 19 nicklas 168       
5462 03 Jun 19 nicklas 169       var lanesHtml = '';
5462 03 Jun 19 nicklas 170       for (var laneNo = 0; laneNo < fc.numLanes; laneNo++)
5462 03 Jun 19 nicklas 171       {
5462 03 Jun 19 nicklas 172         var pool = fc.lanes[laneNo];
5462 03 Jun 19 nicklas 173         var poolName = pool.name;
5462 03 Jun 19 nicklas 174         var color = poolColors[poolName];
5462 03 Jun 19 nicklas 175         if (!color)
5462 03 Jun 19 nicklas 176         {
5462 03 Jun 19 nicklas 177           color = allColors[poolName];
5462 03 Jun 19 nicklas 178           if (!color)
5462 03 Jun 19 nicklas 179           {
5462 03 Jun 19 nicklas 180             color = COLORS[nextColor] + (useDarker ? ' darker' : '');
5462 03 Jun 19 nicklas 181             allColors[poolName] = color;
5462 03 Jun 19 nicklas 182             nextColor++;
5462 03 Jun 19 nicklas 183             if (nextColor == COLORS.length)
5462 03 Jun 19 nicklas 184             {
5462 03 Jun 19 nicklas 185               nextColor = 0;
5462 03 Jun 19 nicklas 186               useDarker = !useDarker;
5462 03 Jun 19 nicklas 187             }
5462 03 Jun 19 nicklas 188           }
5462 03 Jun 19 nicklas 189           poolColors[poolName] = color;
5462 03 Jun 19 nicklas 190           var td = document.createElement('td');
5462 03 Jun 19 nicklas 191           td.className = 'pool-legend ' + color;
5462 03 Jun 19 nicklas 192           td.innerHTML = poolName;
5462 03 Jun 19 nicklas 193           poolsRow.appendChild(td);
5462 03 Jun 19 nicklas 194         }
5462 03 Jun 19 nicklas 195
5462 03 Jun 19 nicklas 196         lanesHtml += '<tr>';
5462 03 Jun 19 nicklas 197         lanesHtml += '<td class="lane-no">'+(laneNo+1)+'</td>';
5462 03 Jun 19 nicklas 198         lanesHtml += '<td class="pool-name '+color+'">'+Strings.encodeTags(poolName)+'</td>';
5462 03 Jun 19 nicklas 199         lanesHtml += '<td class="remarks">';
5462 03 Jun 19 nicklas 200         lanesHtml += '</td>';
5462 03 Jun 19 nicklas 201         lanesHtml += '</tr>';
5462 03 Jun 19 nicklas 202       }
5462 03 Jun 19 nicklas 203       
5462 03 Jun 19 nicklas 204       Doc.element('pools.'+fcNo).innerHTML = lanesHtml;
5462 03 Jun 19 nicklas 205         
5462 03 Jun 19 nicklas 206       if (poolColors.length <= 6)
5462 03 Jun 19 nicklas 207       {
5462 03 Jun 19 nicklas 208         // White-space at end to avoid pools getting to wide
5462 03 Jun 19 nicklas 209         var td = document.createElement('td');
5462 03 Jun 19 nicklas 210         td.innerHTML = '';
5462 03 Jun 19 nicklas 211         poolsRow.appendChild(td);
5462 03 Jun 19 nicklas 212       }
5462 03 Jun 19 nicklas 213     }
5462 03 Jun 19 nicklas 214     
5462 03 Jun 19 nicklas 215     document.title = 'Lab protocol for ' + names.join(', ');
5462 03 Jun 19 nicklas 216     Doc.show('all-protocol');
5462 03 Jun 19 nicklas 217   }
5462 03 Jun 19 nicklas 218   
5462 03 Jun 19 nicklas 219   return flowcell;
5462 03 Jun 19 nicklas 220 }();
5462 03 Jun 19 nicklas 221
5462 03 Jun 19 nicklas 222 Doc.onLoad(FlowCell.initPage);
5462 03 Jun 19 nicklas 223