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

Code
Comments
Other
Rev Date Author Line
7173 17 May 23 nicklas 1 var Protocol = function()
7173 17 May 23 nicklas 2 {
7173 17 May 23 nicklas 3   var protocol = {};
7173 17 May 23 nicklas 4   var debug = 0;
7173 17 May 23 nicklas 5
7173 17 May 23 nicklas 6   // Page initialization
7173 17 May 23 nicklas 7   protocol.initPage = function()
7173 17 May 23 nicklas 8   {
7173 17 May 23 nicklas 9     var pageId = Doc.getPageId();
7173 17 May 23 nicklas 10     if (pageId == 'protocol')
7173 17 May 23 nicklas 11     {
7173 17 May 23 nicklas 12       Buttons.addClickHandler('print-button', Wizard.goPrint);  
7173 17 May 23 nicklas 13
7173 17 May 23 nicklas 14       var boxId = Data.int('page-data', 'transport-box');
7173 17 May 23 nicklas 15       var url = '../ExternalSpecimen.servlet?ID='+App.getSessionId();
7173 17 May 23 nicklas 16       url += '&cmd=GetTransportBoxDetailsForMove&listId='+boxId;    
7173 17 May 23 nicklas 17       Wizard.showLoadingAnimation('Loading transport box information...');
7173 17 May 23 nicklas 18       Wizard.asyncJsonRequest(url, protocol.initializeProtocol);
7173 17 May 23 nicklas 19     }
7173 17 May 23 nicklas 20     else
7173 17 May 23 nicklas 21     {
7173 17 May 23 nicklas 22       Events.addEventHandler('transportBox', 'change', protocol.transportBoxOnChange);
7173 17 May 23 nicklas 23       Events.addEventHandler('listview', 'click', protocol.viewProtocol);
7173 17 May 23 nicklas 24       Events.addEventHandler('plateview', 'click', protocol.viewProtocol);
7173 17 May 23 nicklas 25
7173 17 May 23 nicklas 26       var url = '../ExternalSpecimen.servlet?ID='+App.getSessionId();
7173 17 May 23 nicklas 27       url += '&cmd=GetTransportBoxesToMove';
7173 17 May 23 nicklas 28       Wizard.showLoadingAnimation('Loading transport boxes...');
7173 17 May 23 nicklas 29       Wizard.asyncJsonRequest(url, protocol.initializeStep1);
7173 17 May 23 nicklas 30     }
7173 17 May 23 nicklas 31   }
7173 17 May 23 nicklas 32
7173 17 May 23 nicklas 33
7173 17 May 23 nicklas 34   protocol.initializeStep1 = function(response)
7173 17 May 23 nicklas 35   {
7173 17 May 23 nicklas 36     var frm = document.forms['reggie'];  
7173 17 May 23 nicklas 37
7173 17 May 23 nicklas 38     var transportBoxes = response.transportBoxes;
7173 17 May 23 nicklas 39     var boxes = frm.transportBox;
7173 17 May 23 nicklas 40     if (transportBoxes.length > 0)
7173 17 May 23 nicklas 41     {
7173 17 May 23 nicklas 42       for (var i=0; i < transportBoxes.length; i++)
7173 17 May 23 nicklas 43       {
7173 17 May 23 nicklas 44         var box = transportBoxes[i];
7173 17 May 23 nicklas 45         var name = box.name + ' ('+box.size+' samples)';
7173 17 May 23 nicklas 46         var option = new Option(name, box.id);
7173 17 May 23 nicklas 47         option.box = box;
7173 17 May 23 nicklas 48         boxes.options[boxes.length] = option;
7173 17 May 23 nicklas 49       }
7173 17 May 23 nicklas 50       
7173 17 May 23 nicklas 51       protocol.transportBoxOnChange();
7173 17 May 23 nicklas 52     }
7173 17 May 23 nicklas 53     else
7173 17 May 23 nicklas 54     {
7173 17 May 23 nicklas 55       Wizard.setFatalError('No transport boxes available for processing.');
7173 17 May 23 nicklas 56       return;
7173 17 May 23 nicklas 57     }
7173 17 May 23 nicklas 58
7173 17 May 23 nicklas 59     Doc.show('step-1');
7173 17 May 23 nicklas 60     Doc.show('gonext');
7173 17 May 23 nicklas 61   }
7173 17 May 23 nicklas 62   
7173 17 May 23 nicklas 63   
7173 17 May 23 nicklas 64   // Add pools to the pools list based on the bioplate selection
7173 17 May 23 nicklas 65   protocol.transportBoxOnChange = function()
7173 17 May 23 nicklas 66   {
7173 17 May 23 nicklas 67     var frm = document.forms['reggie'];
7173 17 May 23 nicklas 68     var box = frm.transportBox[frm.transportBox.selectedIndex].box;
7173 17 May 23 nicklas 69     Doc.element('comments').innerHTML = Strings.encodeTags(box.comments);
7173 17 May 23 nicklas 70   }
7173 17 May 23 nicklas 71   
7173 17 May 23 nicklas 72   protocol.viewProtocol = function(event)
7173 17 May 23 nicklas 73   {
7173 17 May 23 nicklas 74     var frm = document.forms['reggie'];
7173 17 May 23 nicklas 75     if (frm.transportBox && !frm.transportBox.disabled)
7173 17 May 23 nicklas 76     {
7173 17 May 23 nicklas 77       frm.view.value = Data.get(event.currentTarget, 'protocol-type');
7173 17 May 23 nicklas 78       frm.submit();
7173 17 May 23 nicklas 79     }
7173 17 May 23 nicklas 80   }
7173 17 May 23 nicklas 81
7173 17 May 23 nicklas 82   
7173 17 May 23 nicklas 83   protocol.initializeProtocol = function(response)
7173 17 May 23 nicklas 84   {
7173 17 May 23 nicklas 85     var transportBox = response.transportBox;
7173 17 May 23 nicklas 86     var storageBoxes = response.storageBoxes;
7173 17 May 23 nicklas 87     var samples = response.samples;
7173 17 May 23 nicklas 88     
7175 17 May 23 nicklas 89     if (transportBox.externalRef)
7175 17 May 23 nicklas 90     {
7175 17 May 23 nicklas 91       Doc.element('boxName').innerHTML = Strings.encodeTags(transportBox.externalRef);
7175 17 May 23 nicklas 92     }
7175 17 May 23 nicklas 93       
7173 17 May 23 nicklas 94     var boxNames = [];
7173 17 May 23 nicklas 95     for (var boxNo = 0; boxNo < storageBoxes.length; boxNo++)
7173 17 May 23 nicklas 96     {
7173 17 May 23 nicklas 97       var box = storageBoxes[boxNo];
7189 22 May 23 nicklas 98       boxNames[boxNames.length] = Strings.encodeTags(box.name + ' ('+box.freezer+')');
7173 17 May 23 nicklas 99     }
7189 22 May 23 nicklas 100     Doc.element('storageBoxes').innerHTML = boxNames.join('<br>');
7173 17 May 23 nicklas 101     
7173 17 May 23 nicklas 102     var html = '';
7173 17 May 23 nicklas 103     if (transportBox.messages.length > 0)
7173 17 May 23 nicklas 104     {
7173 17 May 23 nicklas 105       html += '<b>Notes</b>';
7173 17 May 23 nicklas 106       html += '<ul>';
7173 17 May 23 nicklas 107       for (var msgNo = 0; msgNo < transportBox.messages.length; msgNo++)
7173 17 May 23 nicklas 108       {
7173 17 May 23 nicklas 109         var msg = transportBox.messages[msgNo];
7173 17 May 23 nicklas 110         // Typically the message starts with a Clarity ID in which case
7173 17 May 23 nicklas 111         // we try to enhance the last digits that are printed larger on the tube
7173 17 May 23 nicklas 112         var ref = msg.match('^(.*?)(\\d+)(\\:.*)$');
7173 17 May 23 nicklas 113         if (ref)
7173 17 May 23 nicklas 114         {
7173 17 May 23 nicklas 115           html += '<li>'+ref[1]+'<span class="major-ref">'+ref[2]+'</span>'+Strings.encodeTags(ref[3]);
7173 17 May 23 nicklas 116         }
7173 17 May 23 nicklas 117         else
7173 17 May 23 nicklas 118         {
7173 17 May 23 nicklas 119           html += '<li>'+Strings.encodeTags(msg);
7173 17 May 23 nicklas 120         }
7173 17 May 23 nicklas 121       }
7173 17 May 23 nicklas 122       html += '</ul>';
7173 17 May 23 nicklas 123       Doc.element('transportMessages').innerHTML = html;
7173 17 May 23 nicklas 124     }
7173 17 May 23 nicklas 125     
7173 17 May 23 nicklas 126     var view = Data.get('page-data', 'view');
7173 17 May 23 nicklas 127     if (view == 'list')
7173 17 May 23 nicklas 128     {
7173 17 May 23 nicklas 129       protocol.viewAsList(samples);
7173 17 May 23 nicklas 130     }
7173 17 May 23 nicklas 131     else
7173 17 May 23 nicklas 132     {
7173 17 May 23 nicklas 133       protocol.viewAsBox(samples)
7173 17 May 23 nicklas 134     }
7173 17 May 23 nicklas 135     Doc.show('all-protocol');
7173 17 May 23 nicklas 136   }
7173 17 May 23 nicklas 137   
7173 17 May 23 nicklas 138
7173 17 May 23 nicklas 139   protocol.viewAsBox = function(samples)
7173 17 May 23 nicklas 140   {
7173 17 May 23 nicklas 141     var box1 = new StorageBox('box.1', 9, 9, BoxPainter);
7173 17 May 23 nicklas 142     var box2 = new StorageBox('box.2', 9, 9, BoxPainter);
7173 17 May 23 nicklas 143     
7173 17 May 23 nicklas 144     var currentBox = box1;
7173 17 May 23 nicklas 145     var lastBox = null;
7173 17 May 23 nicklas 146     var addName = true;
7173 17 May 23 nicklas 147     for (var i = 0; i < samples.length; i++)
7173 17 May 23 nicklas 148     {
7173 17 May 23 nicklas 149       var sample = samples[i];
7173 17 May 23 nicklas 150       var well = sample.well;
7173 17 May 23 nicklas 151       if (lastBox != null && well.bioPlate.id != lastBox)
7173 17 May 23 nicklas 152       {
7173 17 May 23 nicklas 153         Doc.show(currentBox.id+'.more-boxes');
7173 17 May 23 nicklas 154         currentBox = box2;
7173 17 May 23 nicklas 155         addName = true;
7173 17 May 23 nicklas 156       }
7173 17 May 23 nicklas 157       if (addName)
7173 17 May 23 nicklas 158       {
7173 17 May 23 nicklas 159         Doc.show(currentBox.id);
7173 17 May 23 nicklas 160         Doc.element(currentBox.id+'.name').innerHTML = well.bioPlate.name;
7173 17 May 23 nicklas 161         lastBox = well.bioPlate.id;
7173 17 May 23 nicklas 162         addName = false;
7173 17 May 23 nicklas 163       }
7173 17 May 23 nicklas 164       Doc.removeClass(currentBox.id+'.row.'+well.row, 'empty-row');
7208 26 May 23 nicklas 165       var tmp = currentBox.getWell(well.row, well.column);
7208 26 May 23 nicklas 166       tmp.setSample(sample);
7208 26 May 23 nicklas 167       Data.set(tmp.tag, 'name', sample.name);
7208 26 May 23 nicklas 168       tmp.tag.title = 'Open case summary: '+sample.name;
7208 26 May 23 nicklas 169       Events.addEventHandler(tmp.tag, 'click', Reggie.openCaseSummaryPopupOnEvent);
7173 17 May 23 nicklas 170     }
7173 17 May 23 nicklas 171
7173 17 May 23 nicklas 172     // Normally, the wells before the first one with a sample should have other tubes already
7173 17 May 23 nicklas 173     // we simply "fake" it here by setting the "locked" property
7173 17 May 23 nicklas 174     var wells = box1.getWells();
7173 17 May 23 nicklas 175     for (var i = 0; i < wells.length; i++)
7173 17 May 23 nicklas 176     {
7173 17 May 23 nicklas 177       var w = wells[i];
7173 17 May 23 nicklas 178       if (w.sample) break;
7173 17 May 23 nicklas 179       w.setLocked(true);
7173 17 May 23 nicklas 180     }
7173 17 May 23 nicklas 181
7173 17 May 23 nicklas 182     box1.paint(box1.getWells());
7173 17 May 23 nicklas 183     box2.paint(box2.getWells());
7173 17 May 23 nicklas 184   }
7173 17 May 23 nicklas 185
7173 17 May 23 nicklas 186   protocol.viewAsList = function(samples)
7173 17 May 23 nicklas 187   {
7173 17 May 23 nicklas 188     var html = '';
7173 17 May 23 nicklas 189     var lastRow = -1;
7173 17 May 23 nicklas 190     var rowClass = 'odd-row';
7173 17 May 23 nicklas 191     for (var i = 0; i < samples.length; i++)
7173 17 May 23 nicklas 192     {
7173 17 May 23 nicklas 193       var sample = samples[i];
7173 17 May 23 nicklas 194       var well = sample.well;
7173 17 May 23 nicklas 195       if (lastRow != well.row)
7173 17 May 23 nicklas 196       {
7173 17 May 23 nicklas 197         rowClass = rowClass=='even-row' ? 'odd-row' : 'even-row';
7173 17 May 23 nicklas 198       }
7173 17 May 23 nicklas 199       lastRow = well.row;
7173 17 May 23 nicklas 200       
7173 17 May 23 nicklas 201       html += '<tr class="'+rowClass+'">';
7173 17 May 23 nicklas 202       html += '<td class="clarityId">';
7173 17 May 23 nicklas 203       // We try to enhance the last digits that are printed larger on the tube
7173 17 May 23 nicklas 204       // Eg. cmd:CMD655A21 --> CMD655A (21)
7173 17 May 23 nicklas 205       var ref = sample.externalRef.match('^cmd\\:(.*?)(\\d+)$');
7173 17 May 23 nicklas 206       if (ref) 
7173 17 May 23 nicklas 207       {
7173 17 May 23 nicklas 208         html += Strings.encodeTags(ref[1])+'<span class="major-ref">'+Strings.encodeTags(ref[2])+'</span>';
7173 17 May 23 nicklas 209       }
7173 17 May 23 nicklas 210       else
7173 17 May 23 nicklas 211       {
7173 17 May 23 nicklas 212         html += Strings.encodeTags(sample.externalRef);
7173 17 May 23 nicklas 213       }
7173 17 May 23 nicklas 214       html += '</td>';
7173 17 May 23 nicklas 215       html += '<td class="specimen">'+Strings.encodeTags(sample.specimenName || sample.name)+'</td>';
7173 17 May 23 nicklas 216       html += '<td class="box">'+Strings.encodeTags(well.bioPlate.name)+'</td>';
7173 17 May 23 nicklas 217       html += '<td class="location">'+Strings.encodeTags(well.location)+'</td>';
7208 26 May 23 nicklas 218       html += '<td class="remain">'+Protocol.formatRemainingQuantity(sample.remain, sample.type)+'</td>';
7173 17 May 23 nicklas 219       html += '<td class="comment">'+Strings.encodeTags(sample.comment)+'</td>';
7173 17 May 23 nicklas 220       html += '</tr>';
7173 17 May 23 nicklas 221     }
7173 17 May 23 nicklas 222     Doc.element('listData').innerHTML = html;
7173 17 May 23 nicklas 223   }
7208 26 May 23 nicklas 224
7208 26 May 23 nicklas 225   protocol.formatRemainingQuantity = function(remain, sampleType)
7208 26 May 23 nicklas 226   {
7208 26 May 23 nicklas 227     var result = '';
7208 26 May 23 nicklas 228     if (sampleType == 'Specimen')
7208 26 May 23 nicklas 229     {
7208 26 May 23 nicklas 230       result = Numbers.formatNumber(remain/1000, 0, ' mg');
7208 26 May 23 nicklas 231     }
7208 26 May 23 nicklas 232     else if (sampleType == 'Lysate' || sampleType == 'FlowThrough')
7208 26 May 23 nicklas 233     {
7208 26 May 23 nicklas 234       result = Numbers.formatNumber(remain, 0, ' µl');
7208 26 May 23 nicklas 235     }
7208 26 May 23 nicklas 236     else // RNA and DNA
7208 26 May 23 nicklas 237     {
7208 26 May 23 nicklas 238       result = Numbers.formatNumber(remain, 1, ' µg');
7208 26 May 23 nicklas 239     }
7208 26 May 23 nicklas 240     return result;
7208 26 May 23 nicklas 241   }
7173 17 May 23 nicklas 242   
7173 17 May 23 nicklas 243   return protocol;
7173 17 May 23 nicklas 244 }();
7173 17 May 23 nicklas 245
7173 17 May 23 nicklas 246 Doc.onLoad(Protocol.initPage);
7173 17 May 23 nicklas 247
7173 17 May 23 nicklas 248
7173 17 May 23 nicklas 249 var BoxPainter = function()
7173 17 May 23 nicklas 250 {
7173 17 May 23 nicklas 251   var painter = {};
7173 17 May 23 nicklas 252   
7173 17 May 23 nicklas 253   painter.getClassNameForWell = function(well)
7173 17 May 23 nicklas 254   {
7173 17 May 23 nicklas 255     var cls = '';
7173 17 May 23 nicklas 256     if (well.sample)
7173 17 May 23 nicklas 257     {
7173 17 May 23 nicklas 258       cls += ' not-empty';
7173 17 May 23 nicklas 259     }
7173 17 May 23 nicklas 260     if (well.locked)
7173 17 May 23 nicklas 261     {
7173 17 May 23 nicklas 262       cls += ' locked';
7173 17 May 23 nicklas 263     }
7173 17 May 23 nicklas 264     return cls;
7173 17 May 23 nicklas 265   }
7173 17 May 23 nicklas 266   
7173 17 May 23 nicklas 267   painter.getWellText = function(well)
7173 17 May 23 nicklas 268   {
7173 17 May 23 nicklas 269     var text = '';
7173 17 May 23 nicklas 270     var sample = well.sample;
7173 17 May 23 nicklas 271     if (sample)
7173 17 May 23 nicklas 272     {
7173 17 May 23 nicklas 273       // We try to enhance the last digits that are printed larger on the tube
7173 17 May 23 nicklas 274       // Eg. cmd:CMD655A21 --> CMD655A (21)
7173 17 May 23 nicklas 275       var ref = sample.externalRef.match('^cmd\\:(.*?)(\\d+)$');
7173 17 May 23 nicklas 276       if (ref)
7173 17 May 23 nicklas 277       {
7173 17 May 23 nicklas 278         text += '<div class="minor-ref">'+Strings.encodeTags(ref[1])+'</div>';
7173 17 May 23 nicklas 279         text += '<div class="major-ref">'+Strings.encodeTags(ref[2])+'</div>';
7173 17 May 23 nicklas 280       }
7173 17 May 23 nicklas 281       else
7173 17 May 23 nicklas 282       {
7173 17 May 23 nicklas 283         text += '<div class="major-ref">'+Strings.encodeTags(sample.externalRef)+'</div>';
7173 17 May 23 nicklas 284       }
7173 17 May 23 nicklas 285       text += '<div class="specimen-name">'+Strings.encodeTags(sample.specimenName || sample.name)+'</div>';
7208 26 May 23 nicklas 286       if (sample.remain != null)
7208 26 May 23 nicklas 287       {
7208 26 May 23 nicklas 288         text += '<div class="remain">';
7208 26 May 23 nicklas 289         text += Protocol.formatRemainingQuantity(sample.remain, sample.type);
7208 26 May 23 nicklas 290         text += '</div>';
7208 26 May 23 nicklas 291       }
7173 17 May 23 nicklas 292     }
7173 17 May 23 nicklas 293     else if (well.locked)
7173 17 May 23 nicklas 294     {
7173 17 May 23 nicklas 295       text = '×';
7173 17 May 23 nicklas 296     }
7173 17 May 23 nicklas 297     return text;
7173 17 May 23 nicklas 298   }
7173 17 May 23 nicklas 299
7173 17 May 23 nicklas 300   return painter;
7173 17 May 23 nicklas 301 }();
7173 17 May 23 nicklas 302