extensions/net.sf.basedb.reggie/trunk/resources/yellowlabel/list.js

Code
Comments
Other
Rev Date Author Line
3779 10 Mar 16 nicklas 1 var YellowLabel = function()
3779 10 Mar 16 nicklas 2 {
3779 10 Mar 16 nicklas 3   var yellow = {};
3779 10 Mar 16 nicklas 4   var debug = 0;
3782 11 Mar 16 nicklas 5   var home;
3787 17 Mar 16 nicklas 6   
3779 10 Mar 16 nicklas 7   var specimen;
3787 17 Mar 16 nicklas 8   var sites;
3787 17 Mar 16 nicklas 9   var permissions;
3779 10 Mar 16 nicklas 10   
3779 10 Mar 16 nicklas 11   // Page initialization
3779 10 Mar 16 nicklas 12   yellow.initPage = function()
3779 10 Mar 16 nicklas 13   {
3782 11 Mar 16 nicklas 14     home = Data.get('page-data', 'home-reggie');
3782 11 Mar 16 nicklas 15     
3779 10 Mar 16 nicklas 16     // Step 1
4183 27 Oct 16 nicklas 17     Events.addEventHandler('nameFilter', 'change', yellow.filterOnChange);
3779 10 Mar 16 nicklas 18     Events.addEventHandler('siteFilter', 'change', yellow.filterOnChange);
3779 10 Mar 16 nicklas 19     Events.addEventHandler('samplingDateFilter', 'change', yellow.filterOnChange);
3779 10 Mar 16 nicklas 20     Events.addEventHandler('arrivalDateFilter', 'change', yellow.filterOnChange);
3826 05 Apr 16 nicklas 21     Events.addEventHandler('consentDateFilter', 'change', yellow.filterOnChange);
3780 10 Mar 16 nicklas 22     Events.addEventHandler('extractionDateFilter', 'change', yellow.filterOnChange);
3827 05 Apr 16 nicklas 23     Events.addEventHandler('rnaqcFilter', 'change', yellow.filterOnChange);
3780 10 Mar 16 nicklas 24     Events.addEventHandler('libraryDateFilter', 'change', yellow.filterOnChange);
3782 11 Mar 16 nicklas 25     Events.addEventHandler('rawBioAssayDateFilter', 'change', yellow.filterOnChange);
3810 23 Mar 16 nicklas 26     Events.addEventHandler('pilotReportDateFilter', 'change', yellow.filterOnChange);
3814 23 Mar 16 nicklas 27     Events.addEventHandler('completedDateFilter', 'change', yellow.completedDateFilterOnChange);
4188 28 Oct 16 nicklas 28     Events.addEventHandler('downloadedDateFilter', 'change', yellow.filterOnChange);
3779 10 Mar 16 nicklas 29
3779 10 Mar 16 nicklas 30     Buttons.addClickHandler('check_uncheck', yellow.selectAll);
3787 17 Mar 16 nicklas 31     Buttons.addClickHandler('btnMarkAsCompleted', yellow.markAsCompleted);
3789 17 Mar 16 nicklas 32     Buttons.addClickHandler('btnCreatePilotReportZip', yellow.createPilotReportZip);
3825 05 Apr 16 nicklas 33     Buttons.addClickHandler('btnCreatePilotReportPdf', yellow.createPilotReportPdf);
4028 26 Jul 16 nicklas 34     Buttons.addClickHandler('btnPublishForDelivery', yellow.publishForDelivery);
3779 10 Mar 16 nicklas 35     
3779 10 Mar 16 nicklas 36     // Navigation
3779 10 Mar 16 nicklas 37     Buttons.addClickHandler('gocancel', Wizard.cancelWizard);
3779 10 Mar 16 nicklas 38     Buttons.addClickHandler('gorestart', Wizard.restartWizard);
3779 10 Mar 16 nicklas 39     Buttons.addClickHandler('gonext', Wizard.goNextOnClick);
3779 10 Mar 16 nicklas 40     Buttons.addClickHandler('goregister', Wizard.goRegister);
3779 10 Mar 16 nicklas 41     
3779 10 Mar 16 nicklas 42     // Final registration
3787 17 Mar 16 nicklas 43     Events.addEventHandler('wizard', 'wizard-submit', yellow.submit);
3779 10 Mar 16 nicklas 44
3779 10 Mar 16 nicklas 45     var url = '../YellowLabel.servlet?ID='+App.getSessionId();
3815 23 Mar 16 nicklas 46     url += '&cmd=LoadSitesAndPermissions';
3815 23 Mar 16 nicklas 47     Wizard.asyncJsonRequest(url, yellow.onSitesLoaded);
3815 23 Mar 16 nicklas 48     Wizard.showLoadingAnimation('Loading sites...');
3815 23 Mar 16 nicklas 49   }
3815 23 Mar 16 nicklas 50   
3815 23 Mar 16 nicklas 51   yellow.onSitesLoaded = function(response)
3815 23 Mar 16 nicklas 52   {
3815 23 Mar 16 nicklas 53     var frm = document.forms['reggie'];
3815 23 Mar 16 nicklas 54
3815 23 Mar 16 nicklas 55     sites = response.sites;
3815 23 Mar 16 nicklas 56     permissions = response.permissions;
3815 23 Mar 16 nicklas 57     if (permissions.PatientCurator || permissions.Administrator)
3815 23 Mar 16 nicklas 58     {
3815 23 Mar 16 nicklas 59       Doc.show('yellow-toolbar');
3815 23 Mar 16 nicklas 60     }
3815 23 Mar 16 nicklas 61     
3815 23 Mar 16 nicklas 62     for (var siteNo = 0; siteNo < sites.length; siteNo++)
3815 23 Mar 16 nicklas 63     {
3815 23 Mar 16 nicklas 64       var site = sites[siteNo];
3815 23 Mar 16 nicklas 65       frm.siteFilter[frm.siteFilter.length] = new Option(site.name, site.prefix);
3815 23 Mar 16 nicklas 66     }
3815 23 Mar 16 nicklas 67     
3815 23 Mar 16 nicklas 68     var url = '../YellowLabel.servlet?ID='+App.getSessionId();
3779 10 Mar 16 nicklas 69     url += '&cmd=LoadActiveYellowSpecimen';
3779 10 Mar 16 nicklas 70     Wizard.showLoadingAnimation('Loading YellowLabel specimen...');
3779 10 Mar 16 nicklas 71     Wizard.asyncJsonRequest(url, yellow.onSpecimenLoaded);
3779 10 Mar 16 nicklas 72   }
3779 10 Mar 16 nicklas 73   
3779 10 Mar 16 nicklas 74   yellow.onSpecimenLoaded = function(response)
3779 10 Mar 16 nicklas 75   {
3779 10 Mar 16 nicklas 76     specimen = response.specimen;
3779 10 Mar 16 nicklas 77     var frm = document.forms['reggie'];
3779 10 Mar 16 nicklas 78     
3787 17 Mar 16 nicklas 79     var siteCount = [];
3787 17 Mar 16 nicklas 80     for (var siteNo = 0; siteNo < sites.length; siteNo++)
3787 17 Mar 16 nicklas 81     {
3787 17 Mar 16 nicklas 82       siteCount[sites[siteNo].prefix] = 0;
3787 17 Mar 16 nicklas 83     }
3787 17 Mar 16 nicklas 84
3779 10 Mar 16 nicklas 85     var html = '';
3785 16 Mar 16 nicklas 86     var numActive = 0;
3785 16 Mar 16 nicklas 87     var numCompleted = 0;
3779 10 Mar 16 nicklas 88     for (var spNo = 0; spNo < specimen.length; spNo++)
3779 10 Mar 16 nicklas 89     {
3779 10 Mar 16 nicklas 90       var sp = specimen[spNo];
3780 10 Mar 16 nicklas 91       var rna = sp.rna;
3827 05 Apr 16 nicklas 92       var rnaqc = sp.rnaqc;
3780 10 Mar 16 nicklas 93       var lib = sp.library;
3782 11 Mar 16 nicklas 94       var raw = sp.raw;
3782 11 Mar 16 nicklas 95       var pilotReport = sp.pilotReport;
3782 11 Mar 16 nicklas 96       
3779 10 Mar 16 nicklas 97       sp.include = true;
3784 16 Mar 16 nicklas 98       var rowClass = 'highlight';
3784 16 Mar 16 nicklas 99       rowClass += spNo % 2 == 0 ? ' oddrow' : ' evenrow';
3800 18 Mar 16 nicklas 100       if (sp.CompletedDate) 
3800 18 Mar 16 nicklas 101       {
3800 18 Mar 16 nicklas 102         rowClass += ' completed';
3800 18 Mar 16 nicklas 103       }
3800 18 Mar 16 nicklas 104       else if (sp.pilotReport)
3800 18 Mar 16 nicklas 105       {
3800 18 Mar 16 nicklas 106         rowClass += ' pilotreport';
3800 18 Mar 16 nicklas 107       }
4993 02 Oct 18 nicklas 108       if (raw && raw.DO_NOT_USE || rna && rna.DO_NOT_USE)
4993 02 Oct 18 nicklas 109       {
4993 02 Oct 18 nicklas 110         rowClass += ' donotuse';
4993 02 Oct 18 nicklas 111       }
3779 10 Mar 16 nicklas 112       
3784 16 Mar 16 nicklas 113       html += '<tr class="' + rowClass + '" id="sp.'+sp.id + '">';
3784 16 Mar 16 nicklas 114       html += '<td>';
3787 17 Mar 16 nicklas 115       siteCount[sp.site.prefix]++;
3784 16 Mar 16 nicklas 116       if (!sp.CompletedDate)
3784 16 Mar 16 nicklas 117       {
3785 16 Mar 16 nicklas 118         numActive++;
3785 16 Mar 16 nicklas 119         html += '<span id="index.'+sp.id+'">'+numActive+'</span> <input type="checkbox" name="sp.'+sp.id+'">';
3784 16 Mar 16 nicklas 120       }
3784 16 Mar 16 nicklas 121       else
3784 16 Mar 16 nicklas 122       {
3785 16 Mar 16 nicklas 123         numCompleted++;
3784 16 Mar 16 nicklas 124       }
3784 16 Mar 16 nicklas 125       html += '</td>';
3822 04 Apr 16 nicklas 126       html += '<td class="dottedleft"><span class="link linked-item" data-item-type="SAMPLE" data-item-id="'+sp.id+'">'+Strings.encodeTags(sp.name)+'</span></td>';
4993 02 Oct 18 nicklas 127       html += '<td class="iconcol-2"><img class="link case-summary" data-name="'+Strings.encodeTags(sp.name)+'" src="../images/case_summary.png">'+yellow.doNotUseWarning(raw, rna)+'</td>';
3779 10 Mar 16 nicklas 128       html += '<td>'+Strings.encodeTags(sp.site.name) + '</td>';
3779 10 Mar 16 nicklas 129       html += '<td>'+Reggie.reformatDate(sp.SamplingDate)+'</td>';
3779 10 Mar 16 nicklas 130       html += '<td>'+Reggie.reformatDate(sp.ArrivalDate)+'</td>';
3828 05 Apr 16 nicklas 131       html += '<td>'+Reggie.reformatDate(sp.ConsentDate, '<span class="missing">Missing</span>')+'</td>';
3828 05 Apr 16 nicklas 132       html += '<td class="dottedleft">'+(rna ? Reggie.reformatDate(rna.QiacubeDate, '<span class="in-progress">In progress</span>'):'')+'</td>';
3822 04 Apr 16 nicklas 133       html += '<td class="iconcol-2">'+yellow.asItemLink(rna, 'EXTRACT')+yellow.asFlag(rna)+'</td>';
3828 05 Apr 16 nicklas 134       html += '<td>'+(rnaqc ? Reggie.formatNumber(rnaqc.RQS || rnaqc.RIN, '', 1) : (rna && rna.QiacubeDate ? '<span class="in-progress">In progress</span>' : ''))+'</td>';
3828 05 Apr 16 nicklas 135       html += '<td class="dottedleft">'+(lib ? Reggie.reformatDate(lib.creationDate, '<span class="in-progress">In progress</span>'):'')+'</td>';
3822 04 Apr 16 nicklas 136       html += '<td class="iconcol-1">'+yellow.asItemLink(lib, 'EXTRACT')+'</td>';
3828 05 Apr 16 nicklas 137       html += '<td class="dottedleft">'+(raw ? Reggie.reformatDate(raw.creationDate, '<span class="in-progress">In progress</span>'):'')+'</td>';
3822 04 Apr 16 nicklas 138       html += '<td class="iconcol-1">'+yellow.asItemLink(raw, 'RAWBIOASSAY')+'</td>';
3822 04 Apr 16 nicklas 139       html += '<td class="dottedleft">'+(pilotReport ? Reggie.reformatDate(pilotReport.lastUpdatedDate):'')+'</td>';
3822 04 Apr 16 nicklas 140       html += '<td class="iconcol-1">'+yellow.asFileLink(pilotReport, 'pdffile.png')+'</td>';
3812 23 Mar 16 nicklas 141       html += '<td class="dottedleft">'+Reggie.reformatDate(sp.CompletedDate)+'</td>';
4188 28 Oct 16 nicklas 142       html += '<td class="dottedleft">';
4188 28 Oct 16 nicklas 143       if (pilotReport)
4188 28 Oct 16 nicklas 144       {
4188 28 Oct 16 nicklas 145         if (pilotReport.isPublished)
4188 28 Oct 16 nicklas 146         {
4188 28 Oct 16 nicklas 147           if (pilotReport.downloadCount > 0)
4188 28 Oct 16 nicklas 148           {
4188 28 Oct 16 nicklas 149             html += Reggie.reformatDate(pilotReport.downloadedDate)+' ('+pilotReport.downloadCount+')';
4188 28 Oct 16 nicklas 150           }
4188 28 Oct 16 nicklas 151           else
4188 28 Oct 16 nicklas 152           {
4188 28 Oct 16 nicklas 153             html += 'Not downloaded';
4188 28 Oct 16 nicklas 154           }
4188 28 Oct 16 nicklas 155         }
4188 28 Oct 16 nicklas 156         else if (sp.CompletedDate)
4188 28 Oct 16 nicklas 157         {
4188 28 Oct 16 nicklas 158           html += 'Not published';
4188 28 Oct 16 nicklas 159         }
4188 28 Oct 16 nicklas 160       }
4188 28 Oct 16 nicklas 161       html += '</td>';
3779 10 Mar 16 nicklas 162       html += '</tr>';
3779 10 Mar 16 nicklas 163     }
3779 10 Mar 16 nicklas 164     
3815 23 Mar 16 nicklas 165     // Update the site filter list with current counts
3815 23 Mar 16 nicklas 166     for (var siteNo = 0; siteNo < sites.length; siteNo++)
3779 10 Mar 16 nicklas 167     {
3815 23 Mar 16 nicklas 168       var site = sites[siteNo];
3815 23 Mar 16 nicklas 169       frm.siteFilter[siteNo+1].text = site.name + ' ('+siteCount[site.prefix]+')'; 
3779 10 Mar 16 nicklas 170     }
3779 10 Mar 16 nicklas 171     
3779 10 Mar 16 nicklas 172     Doc.element('specimen-list').innerHTML = html;
3785 16 Mar 16 nicklas 173     Doc.element('num-active').innerHTML = numActive;
3785 16 Mar 16 nicklas 174     Doc.element('num-completed').innerHTML = numCompleted;
3779 10 Mar 16 nicklas 175     
3779 10 Mar 16 nicklas 176     var cs = document.getElementsByClassName('case-summary');
3779 10 Mar 16 nicklas 177     for (var i = 0; i < cs.length; i++)
3779 10 Mar 16 nicklas 178     {
5019 10 Oct 18 nicklas 179       Events.addEventHandler(cs[i], 'click', Reggie.openCaseSummaryPopupOnEvent);
3779 10 Mar 16 nicklas 180     }
3782 11 Mar 16 nicklas 181     
3787 17 Mar 16 nicklas 182     var linkedItems = document.getElementsByClassName('linked-item');
3787 17 Mar 16 nicklas 183     for (var itemNo = 0; itemNo < linkedItems.length; itemNo++)
3787 17 Mar 16 nicklas 184     {
3787 17 Mar 16 nicklas 185       Events.addEventHandler(linkedItems[itemNo], 'click', Items.itemOnClick);
3787 17 Mar 16 nicklas 186     }
3787 17 Mar 16 nicklas 187
3782 11 Mar 16 nicklas 188     var linkedFiles = document.getElementsByClassName('linked-file');
3782 11 Mar 16 nicklas 189     for (var fileNo = 0; fileNo < linkedFiles.length; fileNo++)
3782 11 Mar 16 nicklas 190     {
3782 11 Mar 16 nicklas 191       Events.addEventHandler(linkedFiles[fileNo], 'click', Files.viewFileOnClick);
3782 11 Mar 16 nicklas 192     }
3814 23 Mar 16 nicklas 193     
3815 23 Mar 16 nicklas 194     Doc.show('step-1');
3815 23 Mar 16 nicklas 195     
3814 23 Mar 16 nicklas 196     yellow.filterOnChange();
3782 11 Mar 16 nicklas 197
3779 10 Mar 16 nicklas 198   }
3779 10 Mar 16 nicklas 199   
3779 10 Mar 16 nicklas 200   yellow.selectAll = function()
3779 10 Mar 16 nicklas 201   {
3779 10 Mar 16 nicklas 202     var frm = document.forms['reggie'];
3779 10 Mar 16 nicklas 203     var firstChecked = null;
3779 10 Mar 16 nicklas 204     for (var spNo = 0; spNo < specimen.length; spNo++)
3779 10 Mar 16 nicklas 205     {
3779 10 Mar 16 nicklas 206       var sp = specimen[spNo];
3784 16 Mar 16 nicklas 207       var checkbox = frm['sp.'+sp.id];
3784 16 Mar 16 nicklas 208       if (sp.include && checkbox)
3779 10 Mar 16 nicklas 209       {
3779 10 Mar 16 nicklas 210         if (firstChecked == null)
3779 10 Mar 16 nicklas 211         {
3784 16 Mar 16 nicklas 212           firstChecked = checkbox.checked;
3779 10 Mar 16 nicklas 213         }
3784 16 Mar 16 nicklas 214         checkbox.checked = !firstChecked;
3779 10 Mar 16 nicklas 215       }
3779 10 Mar 16 nicklas 216     }
3779 10 Mar 16 nicklas 217   }
3779 10 Mar 16 nicklas 218   
3814 23 Mar 16 nicklas 219   yellow.completedDateFilterOnChange = function()
3814 23 Mar 16 nicklas 220   {
3814 23 Mar 16 nicklas 221     var frm = document.forms['reggie'];
3814 23 Mar 16 nicklas 222     var url = '../YellowLabel.servlet?ID='+App.getSessionId();
3814 23 Mar 16 nicklas 223     var completedDate = frm.completedDateFilter.value.replace(/\-/g, '');
4993 02 Oct 18 nicklas 224     Doc.element('specimen-list').innerHTML = '';
3814 23 Mar 16 nicklas 225     url += '&cmd=LoadActiveYellowSpecimen&completedDateFilter='+encodeURIComponent(completedDate);
3814 23 Mar 16 nicklas 226     Wizard.showLoadingAnimation('Loading YellowLabel specimen...');
3814 23 Mar 16 nicklas 227     Wizard.asyncJsonRequest(url, yellow.onSpecimenLoaded);
3814 23 Mar 16 nicklas 228   }
3814 23 Mar 16 nicklas 229   
3779 10 Mar 16 nicklas 230   yellow.filterOnChange = function()
3779 10 Mar 16 nicklas 231   {
3779 10 Mar 16 nicklas 232     var frm = document.forms['reggie'];
3779 10 Mar 16 nicklas 233     
3779 10 Mar 16 nicklas 234     var filter = new Filter();
3779 10 Mar 16 nicklas 235     // Specimen filters
4183 27 Oct 16 nicklas 236     filter.addContainsCriteria(ItemProperty.Name, frm.nameFilter.value);
3779 10 Mar 16 nicklas 237     filter.addTextCriteria(ItemProperty.Site, frm.siteFilter.value);
3779 10 Mar 16 nicklas 238     filter.addDateCriteria(ItemProperty.SamplingDate, frm.samplingDateFilter.value);
3779 10 Mar 16 nicklas 239     filter.addDateCriteria(ItemProperty.ArrivalDate, frm.arrivalDateFilter.value);
3826 05 Apr 16 nicklas 240     filter.addDateCriteria(ItemProperty.ConsentDate, frm.consentDateFilter.value);
3780 10 Mar 16 nicklas 241     filter.addDateCriteria(ItemProperty.ExtractionDate, frm.extractionDateFilter.value);
3827 05 Apr 16 nicklas 242     filter.addNumericCriteria(ItemProperty.RqsOrRin, frm.rnaqcFilter.value);
3780 10 Mar 16 nicklas 243     filter.addDateCriteria(ItemProperty.LibraryDate, frm.libraryDateFilter.value);
3782 11 Mar 16 nicklas 244     filter.addDateCriteria(ItemProperty.RawDate, frm.rawBioAssayDateFilter.value);
3810 23 Mar 16 nicklas 245     filter.addDateCriteria(ItemProperty.PilotReportDate, frm.pilotReportDateFilter.value);
3812 23 Mar 16 nicklas 246     filter.addDateCriteria(ItemProperty.CompletedDate, frm.completedDateFilter.value);
4188 28 Oct 16 nicklas 247     filter.addDateCriteria(ItemProperty.DownloadedDate, frm.downloadedDateFilter.value);
3779 10 Mar 16 nicklas 248
3785 16 Mar 16 nicklas 249     var numActive = 0;
3785 16 Mar 16 nicklas 250     var numCompleted = 0;
3779 10 Mar 16 nicklas 251     for (var spNo = 0; spNo < specimen.length; spNo++)
3779 10 Mar 16 nicklas 252     {
3779 10 Mar 16 nicklas 253       var sp = specimen[spNo];
3779 10 Mar 16 nicklas 254       
3779 10 Mar 16 nicklas 255       sp.include = filter.check(sp);
3779 10 Mar 16 nicklas 256       if (sp.include)
3779 10 Mar 16 nicklas 257       {
3785 16 Mar 16 nicklas 258         if (sp.CompletedDate)
3785 16 Mar 16 nicklas 259         {
3785 16 Mar 16 nicklas 260           numCompleted++;
3785 16 Mar 16 nicklas 261         }
3785 16 Mar 16 nicklas 262         else
3785 16 Mar 16 nicklas 263         {
3785 16 Mar 16 nicklas 264           numActive++;
3785 16 Mar 16 nicklas 265           Doc.element('index.'+sp.id).innerHTML = numActive;
3785 16 Mar 16 nicklas 266         }
3787 17 Mar 16 nicklas 267         var evenRow = (numActive + numCompleted) % 2 == 0;
3787 17 Mar 16 nicklas 268         var tr = Doc.element('sp.'+sp.id);
3787 17 Mar 16 nicklas 269         Doc.addOrRemoveClass(tr, 'oddrow', !evenRow);
3787 17 Mar 16 nicklas 270         Doc.addOrRemoveClass(tr, 'evenrow', evenRow);
3779 10 Mar 16 nicklas 271         Doc.show(tr);
3779 10 Mar 16 nicklas 272       }
3779 10 Mar 16 nicklas 273       else
3779 10 Mar 16 nicklas 274       {
3779 10 Mar 16 nicklas 275         Doc.hide('sp.'+sp.id);
3779 10 Mar 16 nicklas 276       }
3779 10 Mar 16 nicklas 277     }
3779 10 Mar 16 nicklas 278     
3787 17 Mar 16 nicklas 279     Doc.showHide('specimen-list', numActive+numCompleted > 0);
3787 17 Mar 16 nicklas 280     Doc.showHide('no-matching-specimen', numActive+numCompleted==0);
3785 16 Mar 16 nicklas 281     Doc.element('num-active').innerHTML = numActive;
3785 16 Mar 16 nicklas 282     Doc.element('num-completed').innerHTML = numCompleted;
3779 10 Mar 16 nicklas 283   }
3779 10 Mar 16 nicklas 284   
3822 04 Apr 16 nicklas 285   yellow.asFlag = function(item)
3822 04 Apr 16 nicklas 286   {
3822 04 Apr 16 nicklas 287     var html = '';
3822 04 Apr 16 nicklas 288     if (item && item.Flag)
3822 04 Apr 16 nicklas 289     {
3822 04 Apr 16 nicklas 290       html += '<img class="flagged" src="'+home+'/images/flag.png" title="'+Strings.encodeTags(item.Flag)+'">';
3822 04 Apr 16 nicklas 291     }
3822 04 Apr 16 nicklas 292     return html;
3822 04 Apr 16 nicklas 293   }
3822 04 Apr 16 nicklas 294   
3811 23 Mar 16 nicklas 295   yellow.asItemLink = function(item, itemType)
3811 23 Mar 16 nicklas 296   {
3811 23 Mar 16 nicklas 297     var link = '';
3811 23 Mar 16 nicklas 298     if (item) 
3811 23 Mar 16 nicklas 299     {
3811 23 Mar 16 nicklas 300       link = '<span class="link linked-item" data-item-type="'+itemType+'" data-item-id="'+item.id+'"><img src="../../../images/edit.png"></span>';
3811 23 Mar 16 nicklas 301     }
3811 23 Mar 16 nicklas 302     return link;
3811 23 Mar 16 nicklas 303   }
3811 23 Mar 16 nicklas 304   
3782 11 Mar 16 nicklas 305   yellow.asFileLink = function(file, icon)
3782 11 Mar 16 nicklas 306   {
3782 11 Mar 16 nicklas 307     var link = '';
3782 11 Mar 16 nicklas 308     if (file) 
3782 11 Mar 16 nicklas 309     {
3811 23 Mar 16 nicklas 310       link = '<span class="link linked-file" data-file-id="'+file.id+'"><img src="'+home+'/images/'+icon+'"></span>';
3782 11 Mar 16 nicklas 311     }
3782 11 Mar 16 nicklas 312     return link;
3782 11 Mar 16 nicklas 313   }
4993 02 Oct 18 nicklas 314   
4993 02 Oct 18 nicklas 315   yellow.doNotUseWarning = function(raw, rna)
4993 02 Oct 18 nicklas 316   {
4993 02 Oct 18 nicklas 317     var warning = '';
4993 02 Oct 18 nicklas 318     if (raw && raw.DO_NOT_USE)
4993 02 Oct 18 nicklas 319     {
4993 02 Oct 18 nicklas 320       warning += '<img src="'+home+'/images/warning.png" title="DoNotUse-'+Strings.encodeTags(raw.DO_NOT_USE + ': ' + raw.DO_NOT_USE_COMMENT)+'">';
4993 02 Oct 18 nicklas 321     }
4993 02 Oct 18 nicklas 322     else if (rna && rna.DO_NOT_USE)
4993 02 Oct 18 nicklas 323     {
4993 02 Oct 18 nicklas 324       warning += '<img src="'+home+'/images/warning.png" title="DoNotUse-'+Strings.encodeTags(rna.DO_NOT_USE + ': ' + rna.DO_NOT_USE_COMMENT)+'">';
4993 02 Oct 18 nicklas 325     }
4993 02 Oct 18 nicklas 326     return warning;
4993 02 Oct 18 nicklas 327   }
3779 10 Mar 16 nicklas 328
3787 17 Mar 16 nicklas 329   yellow.checkSelected = function(filter, noneSelectedMsg)
3787 17 Mar 16 nicklas 330   {
3787 17 Mar 16 nicklas 331     var frm = document.forms['reggie'];
3787 17 Mar 16 nicklas 332     var selected = [];
3787 17 Mar 16 nicklas 333     
3787 17 Mar 16 nicklas 334     for (var spNo = 0; spNo < specimen.length; spNo++)
3787 17 Mar 16 nicklas 335     {
3787 17 Mar 16 nicklas 336       var sp = specimen[spNo];
3787 17 Mar 16 nicklas 337       if (sp.include && frm['sp.'+sp.id] && frm['sp.'+sp.id].checked)
3787 17 Mar 16 nicklas 338       {
3787 17 Mar 16 nicklas 339         if (!filter || filter.check(sp))
3787 17 Mar 16 nicklas 340         selected[selected.length] = sp;
3787 17 Mar 16 nicklas 341       }
3787 17 Mar 16 nicklas 342     }
3787 17 Mar 16 nicklas 343     
3787 17 Mar 16 nicklas 344     if (selected.length == 0 && noneSelectedMsg)
3787 17 Mar 16 nicklas 345     {
3787 17 Mar 16 nicklas 346       Forms.showNotification('check_uncheck', noneSelectedMsg, null, 'pointer-below');
3787 17 Mar 16 nicklas 347     }
3787 17 Mar 16 nicklas 348     
3787 17 Mar 16 nicklas 349     return selected;
3787 17 Mar 16 nicklas 350   }
4993 02 Oct 18 nicklas 351   
4993 02 Oct 18 nicklas 352   /**
4993 02 Oct 18 nicklas 353     Count the number of items in the list that has a raw bioassay
4993 02 Oct 18 nicklas 354     or RNA marked as DoNotUse.
4993 02 Oct 18 nicklas 355    */
4993 02 Oct 18 nicklas 356   yellow.countDoNotUse = function(items)
4993 02 Oct 18 nicklas 357   {
4993 02 Oct 18 nicklas 358     var numDoNotUse = 0;
4993 02 Oct 18 nicklas 359     for (var i = 0; i < items.length; i++)
4993 02 Oct 18 nicklas 360     {
4993 02 Oct 18 nicklas 361       var item = items[i];
4993 02 Oct 18 nicklas 362       if (item.raw && item.raw.DO_NOT_USE || item.rna && item.rna.DO_NOT_USE) numDoNotUse++;
4993 02 Oct 18 nicklas 363     }
4993 02 Oct 18 nicklas 364     return numDoNotUse;
4993 02 Oct 18 nicklas 365   }
3782 11 Mar 16 nicklas 366
3824 04 Apr 16 nicklas 367   /**
3824 04 Apr 16 nicklas 368     Called when clicking the button and also a callback
3824 04 Apr 16 nicklas 369     for for the dialog. In the second case, options
3824 04 Apr 16 nicklas 370     must be specifed.
3824 04 Apr 16 nicklas 371    */
3824 04 Apr 16 nicklas 372   yellow.markAsCompleted = function(event, options)
3779 10 Mar 16 nicklas 373   {
3787 17 Mar 16 nicklas 374     var selected = yellow.checkSelected(null, 'Select at least one specimen');
3787 17 Mar 16 nicklas 375     if (selected.length == 0) return;
3787 17 Mar 16 nicklas 376     
3824 04 Apr 16 nicklas 377     if (!options)
3787 17 Mar 16 nicklas 378     {
3824 04 Apr 16 nicklas 379       var url = 'mark-completed.jsp?ID='+App.getSessionId();
3824 04 Apr 16 nicklas 380       url += '&numSelected='+selected.length;
4993 02 Oct 18 nicklas 381       url += '&numDoNotUse='+yellow.countDoNotUse(selected);
3824 04 Apr 16 nicklas 382       Dialogs.openPopup(url, 'MarkCompleted', 450, 300);
3787 17 Mar 16 nicklas 383     }
3824 04 Apr 16 nicklas 384     else
3824 04 Apr 16 nicklas 385     {
3824 04 Apr 16 nicklas 386       var sp = [];
3824 04 Apr 16 nicklas 387       for (var i = 0; i < selected.length; i++)
3824 04 Apr 16 nicklas 388       {
3824 04 Apr 16 nicklas 389         var tmp = {};
3824 04 Apr 16 nicklas 390         tmp.id = selected[i].id;
3824 04 Apr 16 nicklas 391         sp[i] = tmp;
3824 04 Apr 16 nicklas 392       }
3824 04 Apr 16 nicklas 393       
3824 04 Apr 16 nicklas 394       var submitInfo = {};
3824 04 Apr 16 nicklas 395       submitInfo.cmd = 'MarkAsCompleted';
3824 04 Apr 16 nicklas 396       submitInfo.message = 'Marking ' + selected.length + ' specimen as completed';
3824 04 Apr 16 nicklas 397       submitInfo.specimen = sp;
3824 04 Apr 16 nicklas 398       submitInfo.options = options;
3824 04 Apr 16 nicklas 399       Wizard.goRegister(submitInfo);
3824 04 Apr 16 nicklas 400     }
3787 17 Mar 16 nicklas 401   }
3787 17 Mar 16 nicklas 402   
3791 17 Mar 16 nicklas 403   /**
3791 17 Mar 16 nicklas 404     Called when clicking the button and also a callback
3791 17 Mar 16 nicklas 405     for downloading the ZIP file. In the second case, options
3791 17 Mar 16 nicklas 406     must be specifed.
3791 17 Mar 16 nicklas 407    */
3791 17 Mar 16 nicklas 408   yellow.createPilotReportZip = function(event, options)
3789 17 Mar 16 nicklas 409   {
3789 17 Mar 16 nicklas 410     var frm = document.forms['reggie'];
3789 17 Mar 16 nicklas 411     
3791 17 Mar 16 nicklas 412     // Filter out items that have a pilot report
3789 17 Mar 16 nicklas 413     var filter = new Filter();
3789 17 Mar 16 nicklas 414     filter.addNumericCriteria(ItemProperty.PilotReportExists, '1');
3789 17 Mar 16 nicklas 415     
3826 05 Apr 16 nicklas 416     var selected = yellow.checkSelected(filter, 'Select at least one specimen that has a pilot report');
3789 17 Mar 16 nicklas 417     if (selected.length == 0) return;
3823 04 Apr 16 nicklas 418
3791 17 Mar 16 nicklas 419     if (!options)
3789 17 Mar 16 nicklas 420     {
3791 17 Mar 16 nicklas 421       var url = 'make-zip.jsp?ID='+App.getSessionId();
3791 17 Mar 16 nicklas 422       url += '&numSelected='+selected.length;
4993 02 Oct 18 nicklas 423       url += '&numDoNotUse='+yellow.countDoNotUse(selected);
3791 17 Mar 16 nicklas 424       Dialogs.openPopup(url, 'MakeZip', 450, 300);
3789 17 Mar 16 nicklas 425     }
3791 17 Mar 16 nicklas 426     else
3791 17 Mar 16 nicklas 427     {
3791 17 Mar 16 nicklas 428       var raw = [];
3821 04 Apr 16 nicklas 429       var specimen = [];
3791 17 Mar 16 nicklas 430       for (var i = 0; i < selected.length; i++)
3791 17 Mar 16 nicklas 431       {
3791 17 Mar 16 nicklas 432         raw[i] = selected[i].raw.id;
3821 04 Apr 16 nicklas 433         specimen[i] = selected[i].id;
3791 17 Mar 16 nicklas 434       }
3791 17 Mar 16 nicklas 435       
3791 17 Mar 16 nicklas 436       var url = '../YellowLabel.servlet?ID='+App.getSessionId();
3791 17 Mar 16 nicklas 437       url += '&cmd=CreatePilotReportZip';
3791 17 Mar 16 nicklas 438       url += '&rawBioAssays='+raw.join(',');
3821 04 Apr 16 nicklas 439       url += '&specimen='+specimen.join(',');
3791 17 Mar 16 nicklas 440       url += '&password='+encodeURIComponent(options.password);
3821 04 Apr 16 nicklas 441       url += '&completedDate='+encodeURIComponent(options.completedDate);
3823 04 Apr 16 nicklas 442       url += '&site='+encodeURIComponent(frm.siteFilter.value);
3826 05 Apr 16 nicklas 443       location.href = url;
3791 17 Mar 16 nicklas 444     }
3789 17 Mar 16 nicklas 445   }
3789 17 Mar 16 nicklas 446   
3825 05 Apr 16 nicklas 447   yellow.createPilotReportPdf = function()
3825 05 Apr 16 nicklas 448   {
4359 15 Feb 17 nicklas 449     // Filter out items that have raw data
3825 05 Apr 16 nicklas 450     var filter = new Filter();
4359 15 Feb 17 nicklas 451     filter.addNumericCriteria(ItemProperty.RawDataExists, '1');
3825 05 Apr 16 nicklas 452     
3825 05 Apr 16 nicklas 453     var selected = yellow.checkSelected(filter, 'Select at least one specimen that has raw data');
3825 05 Apr 16 nicklas 454     if (selected.length == 0) return;
3791 17 Mar 16 nicklas 455
3825 05 Apr 16 nicklas 456     var raw = [];
3825 05 Apr 16 nicklas 457     for (var i = 0; i < selected.length; i++)
3825 05 Apr 16 nicklas 458     {
3825 05 Apr 16 nicklas 459       raw[i] = { 'id': selected[i].raw.id };
3825 05 Apr 16 nicklas 460     }
3825 05 Apr 16 nicklas 461
3825 05 Apr 16 nicklas 462     var submitInfo = {};
3825 05 Apr 16 nicklas 463     submitInfo.rawBioAssays = raw;
3825 05 Apr 16 nicklas 464     submitInfo.useDefaultSoftware = 1;
3825 05 Apr 16 nicklas 465     submitInfo.report = 'PILOT_REPORT';
3825 05 Apr 16 nicklas 466     
3825 05 Apr 16 nicklas 467     var url = '../Report.servlet?ID='+App.getSessionId();
3825 05 Apr 16 nicklas 468     url += '&cmd=CreateReport';
3825 05 Apr 16 nicklas 469     Wizard.asyncJsonRequest(url, yellow.reportJobSubmitted, 'POST', JSON.stringify(submitInfo));
3825 05 Apr 16 nicklas 470   }
3825 05 Apr 16 nicklas 471
4028 26 Jul 16 nicklas 472   /**
4028 26 Jul 16 nicklas 473     Called when clicking the button and also a callback
4028 26 Jul 16 nicklas 474     for starting the publish job. In the second case, options
4028 26 Jul 16 nicklas 475     must be specifed.
4028 26 Jul 16 nicklas 476    */
4028 26 Jul 16 nicklas 477   yellow.publishForDelivery = function(event, options)
4028 26 Jul 16 nicklas 478   {
4028 26 Jul 16 nicklas 479     // Filter out items that have a pilot report
4028 26 Jul 16 nicklas 480     var filter = new Filter();
4028 26 Jul 16 nicklas 481     filter.addNumericCriteria(ItemProperty.PilotReportExists, '1');
4028 26 Jul 16 nicklas 482     
4028 26 Jul 16 nicklas 483     var selected = yellow.checkSelected(filter, 'Select at least one specimen that has a pilot report');
4028 26 Jul 16 nicklas 484     if (selected.length == 0) return;
4028 26 Jul 16 nicklas 485   
4028 26 Jul 16 nicklas 486     if (!options)
4028 26 Jul 16 nicklas 487     {
4028 26 Jul 16 nicklas 488       var url = 'publish-for-delivery.jsp?ID='+App.getSessionId();
4028 26 Jul 16 nicklas 489       url += '&numSelected='+selected.length;
4993 02 Oct 18 nicklas 490       url += '&numDoNotUse='+yellow.countDoNotUse(selected);
4028 26 Jul 16 nicklas 491       Dialogs.openPopup(url, 'PublishForDelivery', 450, 300);
4028 26 Jul 16 nicklas 492     }
4028 26 Jul 16 nicklas 493     else
4028 26 Jul 16 nicklas 494     {
4028 26 Jul 16 nicklas 495       var raw = [];
4028 26 Jul 16 nicklas 496       var specimen = [];
4028 26 Jul 16 nicklas 497       for (var i = 0; i < selected.length; i++)
4028 26 Jul 16 nicklas 498       {
4028 26 Jul 16 nicklas 499         raw[i] = {'id': selected[i].raw.id };
4028 26 Jul 16 nicklas 500         specimen[i] = {'id': selected[i].id };
4028 26 Jul 16 nicklas 501       }
4028 26 Jul 16 nicklas 502       
4028 26 Jul 16 nicklas 503       var submitInfo = {};
4028 26 Jul 16 nicklas 504       submitInfo.cmd = 'PublishForDelivery';
4028 26 Jul 16 nicklas 505       submitInfo.rawBioAssays = raw;
4028 26 Jul 16 nicklas 506       submitInfo.specimen = specimen;
4028 26 Jul 16 nicklas 507       submitInfo.options = options;
4028 26 Jul 16 nicklas 508       
4028 26 Jul 16 nicklas 509       Wizard.goRegister(submitInfo);
4028 26 Jul 16 nicklas 510     }
4028 26 Jul 16 nicklas 511   }
4028 26 Jul 16 nicklas 512   
3825 05 Apr 16 nicklas 513   yellow.reportJobSubmitted = function(response)
3825 05 Apr 16 nicklas 514   {
3825 05 Apr 16 nicklas 515     if (response.job)
3825 05 Apr 16 nicklas 516     {
3825 05 Apr 16 nicklas 517       Items.viewItem('JOB', response.job.id);
3825 05 Apr 16 nicklas 518       location.reload(true);
3825 05 Apr 16 nicklas 519     }  
3825 05 Apr 16 nicklas 520   }
3825 05 Apr 16 nicklas 521   
3787 17 Mar 16 nicklas 522   yellow.submit = function(event)
3787 17 Mar 16 nicklas 523   {
3787 17 Mar 16 nicklas 524     var submitInfo = event.detail;
3787 17 Mar 16 nicklas 525     var url = '../YellowLabel.servlet?ID='+App.getSessionId();
3787 17 Mar 16 nicklas 526     url += '&cmd='+submitInfo.cmd;
3787 17 Mar 16 nicklas 527     Wizard.showLoadingAnimation(submitInfo.message || 'Registering YellowLabel specimen...');
3787 17 Mar 16 nicklas 528     Wizard.asyncJsonRequest(url, yellow.submissionResults, 'POST', JSON.stringify(submitInfo));
3779 10 Mar 16 nicklas 529   }
3779 10 Mar 16 nicklas 530   
3779 10 Mar 16 nicklas 531   yellow.submissionResults = function(response)
3779 10 Mar 16 nicklas 532   {
3779 10 Mar 16 nicklas 533     Wizard.showFinalMessage(response.messages);
3779 10 Mar 16 nicklas 534     Doc.show('gorestart');
3779 10 Mar 16 nicklas 535   }
3779 10 Mar 16 nicklas 536   
3779 10 Mar 16 nicklas 537   return yellow;
3779 10 Mar 16 nicklas 538 }();
3779 10 Mar 16 nicklas 539
3779 10 Mar 16 nicklas 540 Doc.onLoad(YellowLabel.initPage);
3779 10 Mar 16 nicklas 541
3779 10 Mar 16 nicklas 542
3779 10 Mar 16 nicklas 543 /**
3779 10 Mar 16 nicklas 544   Holds one or more filter criterias. Use the 'add*' methods
3779 10 Mar 16 nicklas 545   to add criterias to the filter, and the 'check(item)' method
3779 10 Mar 16 nicklas 546   to evaluate all criterias against a single item.
3779 10 Mar 16 nicklas 547 */
3779 10 Mar 16 nicklas 548 var Filter = function()
3779 10 Mar 16 nicklas 549 {
3779 10 Mar 16 nicklas 550   this.criterias = [];
3779 10 Mar 16 nicklas 551 }
3779 10 Mar 16 nicklas 552
3779 10 Mar 16 nicklas 553 /**
3779 10 Mar 16 nicklas 554   Adds a text criteria comparing the given item property to
3779 10 Mar 16 nicklas 555   a static value (f2).
3779 10 Mar 16 nicklas 556 */
3779 10 Mar 16 nicklas 557 Filter.prototype.addTextCriteria = function(itemProp, f2)
3779 10 Mar 16 nicklas 558 {
3779 10 Mar 16 nicklas 559   if (f2 != '') 
3779 10 Mar 16 nicklas 560   {
4359 15 Feb 17 nicklas 561     var cmp;
4359 15 Feb 17 nicklas 562     if (f2 == '=')
4359 15 Feb 17 nicklas 563     {
4359 15 Feb 17 nicklas 564       cmp = Comparator.eq;
4359 15 Feb 17 nicklas 565       f2 = null;
4359 15 Feb 17 nicklas 566     }
4359 15 Feb 17 nicklas 567     else if (f2 == '<>')
4359 15 Feb 17 nicklas 568     {
4359 15 Feb 17 nicklas 569       cmp = Comparator.neq;
4359 15 Feb 17 nicklas 570       f2 = null;
4359 15 Feb 17 nicklas 571     }
4359 15 Feb 17 nicklas 572     else
4359 15 Feb 17 nicklas 573     {
4359 15 Feb 17 nicklas 574       cmp = Comparator.eq;
4359 15 Feb 17 nicklas 575     }
4359 15 Feb 17 nicklas 576     this.criterias[this.criterias.length] = function(item) { return cmp(itemProp(item), f2) };
3779 10 Mar 16 nicklas 577   }
3779 10 Mar 16 nicklas 578 }
3779 10 Mar 16 nicklas 579
3779 10 Mar 16 nicklas 580 /**
4183 27 Oct 16 nicklas 581   Adds a text criteria checking if the given item property to
4183 27 Oct 16 nicklas 582   contains a static value (f2).
4183 27 Oct 16 nicklas 583 */
4183 27 Oct 16 nicklas 584 Filter.prototype.addContainsCriteria = function(itemProp, f2)
4183 27 Oct 16 nicklas 585 {
4183 27 Oct 16 nicklas 586   if (f2 != '') 
4183 27 Oct 16 nicklas 587   {
4359 15 Feb 17 nicklas 588     var cmp;
4359 15 Feb 17 nicklas 589     if (f2 == '=')
4359 15 Feb 17 nicklas 590     {
4359 15 Feb 17 nicklas 591       cmp = Comparator.eq;
4359 15 Feb 17 nicklas 592       f2 = null;
4359 15 Feb 17 nicklas 593     }
4359 15 Feb 17 nicklas 594     else if (f2 == '<>')
4359 15 Feb 17 nicklas 595     {
4359 15 Feb 17 nicklas 596       cmp = Comparator.neq;
4359 15 Feb 17 nicklas 597       f2 = null;
4359 15 Feb 17 nicklas 598     }
4359 15 Feb 17 nicklas 599     else
4359 15 Feb 17 nicklas 600     {
4359 15 Feb 17 nicklas 601       cmp = Comparator.contains;
4359 15 Feb 17 nicklas 602     }
4359 15 Feb 17 nicklas 603     this.criterias[this.criterias.length] = function(item) { return cmp(itemProp(item), f2) };
4183 27 Oct 16 nicklas 604   }
4183 27 Oct 16 nicklas 605 }
4183 27 Oct 16 nicklas 606
4183 27 Oct 16 nicklas 607 /**
3779 10 Mar 16 nicklas 608   Adds a numeric criteria comparing the given item property to
3779 10 Mar 16 nicklas 609   a static value (f2). The 'f2' value may start with either '<' or '>'
3779 10 Mar 16 nicklas 610   to compare with less than/greater than operators, otherwise
3779 10 Mar 16 nicklas 611   it will use the 'approximately equals' operator.
3779 10 Mar 16 nicklas 612 */
3779 10 Mar 16 nicklas 613 Filter.prototype.addNumericCriteria = function(itemProp, f2, factor)
3779 10 Mar 16 nicklas 614 {
3779 10 Mar 16 nicklas 615   if (f2 != '')
3779 10 Mar 16 nicklas 616   {
4359 15 Feb 17 nicklas 617     var cmp;
4359 15 Feb 17 nicklas 618     var limit;
4359 15 Feb 17 nicklas 619     if (f2 == '=')
4359 15 Feb 17 nicklas 620     {
4359 15 Feb 17 nicklas 621       cmp = Comparator.eq;
4359 15 Feb 17 nicklas 622       limit = null;
4359 15 Feb 17 nicklas 623     }
4359 15 Feb 17 nicklas 624     else if (f2 == '<>')
4359 15 Feb 17 nicklas 625     {
4359 15 Feb 17 nicklas 626       cmp = Comparator.neq;
4359 15 Feb 17 nicklas 627       limit = null;
4359 15 Feb 17 nicklas 628     }
4359 15 Feb 17 nicklas 629     else
4359 15 Feb 17 nicklas 630     {
4359 15 Feb 17 nicklas 631       var firstChar = f2.charAt(0);
4359 15 Feb 17 nicklas 632       if (!firstChar.match(/[\d\-]/)) f2 = f2.substring(1);
3779 10 Mar 16 nicklas 633
4359 15 Feb 17 nicklas 634       cmp = Comparator.get(firstChar, Comparator.approx);
4359 15 Feb 17 nicklas 635       limit = parseFloat(f2);
4359 15 Feb 17 nicklas 636       if (factor) limit *= factor;
4359 15 Feb 17 nicklas 637     }
4359 15 Feb 17 nicklas 638     
3779 10 Mar 16 nicklas 639
3779 10 Mar 16 nicklas 640     this.criterias[this.criterias.length] = function(item) { return cmp(itemProp(item), limit) };
3779 10 Mar 16 nicklas 641   }
3779 10 Mar 16 nicklas 642 }
3779 10 Mar 16 nicklas 643
3779 10 Mar 16 nicklas 644 /**
3779 10 Mar 16 nicklas 645   Adds a temporal criteria for comparing dates. The 'f2' value
3779 10 Mar 16 nicklas 646   may start with either '<' or '>' to compare with earlier/later
3779 10 Mar 16 nicklas 647   than operators. In all cases, the 'f2' value is stripped from '-'
3779 10 Mar 16 nicklas 648   characters.
3779 10 Mar 16 nicklas 649  */
3779 10 Mar 16 nicklas 650 Filter.prototype.addDateCriteria = function(itemProp, f2)
3779 10 Mar 16 nicklas 651 {
3779 10 Mar 16 nicklas 652   if (f2 != '')
3779 10 Mar 16 nicklas 653   {
4359 15 Feb 17 nicklas 654     var cmp;
4359 15 Feb 17 nicklas 655     if (f2 == '=')
4359 15 Feb 17 nicklas 656     {
4359 15 Feb 17 nicklas 657       cmp = Comparator.eq;
4359 15 Feb 17 nicklas 658       f2 = null;
4359 15 Feb 17 nicklas 659     }
4359 15 Feb 17 nicklas 660     else if (f2 == '<>')
4359 15 Feb 17 nicklas 661     {
4359 15 Feb 17 nicklas 662       cmp = Comparator.neq;
4359 15 Feb 17 nicklas 663       f2 = null;
4359 15 Feb 17 nicklas 664     }
4359 15 Feb 17 nicklas 665     else
4359 15 Feb 17 nicklas 666     {
4359 15 Feb 17 nicklas 667       var firstChar = f2.charAt(0);
4359 15 Feb 17 nicklas 668       if (firstChar == '<' || firstChar == '>') f2 = f2.substring(1);
4359 15 Feb 17 nicklas 669       f2 = f2.replace(/\-/g, '');
4359 15 Feb 17 nicklas 670       cmp = Comparator.get(firstChar, Comparator.startsWith);
4359 15 Feb 17 nicklas 671     }
3779 10 Mar 16 nicklas 672     this.criterias[this.criterias.length] = function(item) { return cmp(itemProp(item), f2) };
3779 10 Mar 16 nicklas 673   }
3779 10 Mar 16 nicklas 674   
3779 10 Mar 16 nicklas 675 }
3779 10 Mar 16 nicklas 676
3779 10 Mar 16 nicklas 677 /**
3779 10 Mar 16 nicklas 678   Evaluate all criterias. Return true if all pass, false otherwise.
3779 10 Mar 16 nicklas 679 */
3779 10 Mar 16 nicklas 680 Filter.prototype.check = function(item)
3779 10 Mar 16 nicklas 681 {
3779 10 Mar 16 nicklas 682   for (var i = 0; i < this.criterias.length; i++)
3779 10 Mar 16 nicklas 683   {
3779 10 Mar 16 nicklas 684     if (!this.criterias[i](item)) return false;
3779 10 Mar 16 nicklas 685   }
3779 10 Mar 16 nicklas 686   return true;
3779 10 Mar 16 nicklas 687 }
3779 10 Mar 16 nicklas 688
3779 10 Mar 16 nicklas 689 /**
3779 10 Mar 16 nicklas 690   Functions for extracting various properties from
3814 23 Mar 16 nicklas 691   specimen items. Each method accepts a single specimen as a parameter
3814 23 Mar 16 nicklas 692   and return a value from the specimen item. The methods
3779 10 Mar 16 nicklas 693   are used as parameters to Filter.add*Criteria() methods.
3779 10 Mar 16 nicklas 694 */
3779 10 Mar 16 nicklas 695 var ItemProperty = function()
3779 10 Mar 16 nicklas 696 {
3779 10 Mar 16 nicklas 697   var p = {};
3779 10 Mar 16 nicklas 698   
4183 27 Oct 16 nicklas 699   p.Name = function(item)
4183 27 Oct 16 nicklas 700   {
4183 27 Oct 16 nicklas 701     return item.name;
4183 27 Oct 16 nicklas 702   }
4183 27 Oct 16 nicklas 703   
3779 10 Mar 16 nicklas 704   // Get the item.site.prefix value
3779 10 Mar 16 nicklas 705   p.Site = function(item)
3779 10 Mar 16 nicklas 706   {
3779 10 Mar 16 nicklas 707     return item.site.prefix;
3779 10 Mar 16 nicklas 708   }
3779 10 Mar 16 nicklas 709
3779 10 Mar 16 nicklas 710   p.ArrivalDate = function(item)
3779 10 Mar 16 nicklas 711   {
3779 10 Mar 16 nicklas 712     return item.ArrivalDate;
3779 10 Mar 16 nicklas 713   }
3779 10 Mar 16 nicklas 714
3779 10 Mar 16 nicklas 715   p.SamplingDate = function(item)
3779 10 Mar 16 nicklas 716   {
3779 10 Mar 16 nicklas 717     return item.SamplingDate;
3779 10 Mar 16 nicklas 718   }
3780 10 Mar 16 nicklas 719   
3826 05 Apr 16 nicklas 720   p.ConsentDate = function(item)
3826 05 Apr 16 nicklas 721   {
3826 05 Apr 16 nicklas 722     return item.ConsentDate;
3826 05 Apr 16 nicklas 723   }
3826 05 Apr 16 nicklas 724   
3780 10 Mar 16 nicklas 725   p.ExtractionDate = function(item)
3780 10 Mar 16 nicklas 726   {
3780 10 Mar 16 nicklas 727     return item.rna ? item.rna.QiacubeDate : null;
3780 10 Mar 16 nicklas 728   }
3780 10 Mar 16 nicklas 729   
3827 05 Apr 16 nicklas 730   p.RqsOrRin = function(item)
3827 05 Apr 16 nicklas 731   {
3827 05 Apr 16 nicklas 732     return item.rnaqc ? (item.rnaqc.RQS || item.rnaqc.RIN) : null;
3827 05 Apr 16 nicklas 733   }
3827 05 Apr 16 nicklas 734   
3780 10 Mar 16 nicklas 735   p.LibraryDate = function(item)
3780 10 Mar 16 nicklas 736   {
3780 10 Mar 16 nicklas 737     return item.library ? item.library.creationDate : null;
3780 10 Mar 16 nicklas 738   }
3782 11 Mar 16 nicklas 739   
3782 11 Mar 16 nicklas 740   p.RawDate = function(item)
3782 11 Mar 16 nicklas 741   {
3782 11 Mar 16 nicklas 742     return item.raw ? item.raw.creationDate : null;
3782 11 Mar 16 nicklas 743   }
3782 11 Mar 16 nicklas 744   
4359 15 Feb 17 nicklas 745   p.RawDataExists = function(item)
4359 15 Feb 17 nicklas 746   {
4359 15 Feb 17 nicklas 747     return item.raw ? 1 : 0;
4359 15 Feb 17 nicklas 748   }
4359 15 Feb 17 nicklas 749   
3813 23 Mar 16 nicklas 750   p.PilotReportExists = function(item)
3813 23 Mar 16 nicklas 751   {
3813 23 Mar 16 nicklas 752     return item.pilotReport ? 1 : 0;
3813 23 Mar 16 nicklas 753   }
3813 23 Mar 16 nicklas 754
3810 23 Mar 16 nicklas 755   p.PilotReportDate = function(item)
3782 11 Mar 16 nicklas 756   {
3810 23 Mar 16 nicklas 757     return item.pilotReport ? item.pilotReport.lastUpdatedDate : null;
3782 11 Mar 16 nicklas 758   }
3812 23 Mar 16 nicklas 759   
3812 23 Mar 16 nicklas 760   p.CompletedDate = function(item)
3812 23 Mar 16 nicklas 761   {
3812 23 Mar 16 nicklas 762     return item.CompletedDate;
3812 23 Mar 16 nicklas 763   }
4188 28 Oct 16 nicklas 764   
4188 28 Oct 16 nicklas 765   p.DownloadedDate = function(item)
4188 28 Oct 16 nicklas 766   {
4188 28 Oct 16 nicklas 767     return item.pilotReport ? item.pilotReport.downloadedDate : null;
4188 28 Oct 16 nicklas 768   }
3779 10 Mar 16 nicklas 769
3779 10 Mar 16 nicklas 770   return p;
3779 10 Mar 16 nicklas 771 }();
3779 10 Mar 16 nicklas 772
3779 10 Mar 16 nicklas 773 /**
3779 10 Mar 16 nicklas 774   Comparator functions for comparing two values.
3779 10 Mar 16 nicklas 775 */
3779 10 Mar 16 nicklas 776 var Comparator = function()
3779 10 Mar 16 nicklas 777 {
3779 10 Mar 16 nicklas 778   var cmp = {};
3779 10 Mar 16 nicklas 779   
3779 10 Mar 16 nicklas 780   /**
3779 10 Mar 16 nicklas 781     Return a comparator based on the symbol
3779 10 Mar 16 nicklas 782     which can be either '>' or '<' to return
3779 10 Mar 16 nicklas 783     Comparator.gt or Comparator.lt. Otherwise
3779 10 Mar 16 nicklas 784     the given default or Comparator.eq is returned.
3779 10 Mar 16 nicklas 785   */
3779 10 Mar 16 nicklas 786   cmp.get = function(symbol, defaultCmp)
3779 10 Mar 16 nicklas 787   {
3779 10 Mar 16 nicklas 788     var c;
3779 10 Mar 16 nicklas 789     if (symbol == '<')
3779 10 Mar 16 nicklas 790     {
3779 10 Mar 16 nicklas 791       c = cmp.lt;
3779 10 Mar 16 nicklas 792     }
3779 10 Mar 16 nicklas 793     else if (symbol == '>')
3779 10 Mar 16 nicklas 794     {
3779 10 Mar 16 nicklas 795       c = cmp.gt;
3779 10 Mar 16 nicklas 796     }
3779 10 Mar 16 nicklas 797     else
3779 10 Mar 16 nicklas 798     {
3779 10 Mar 16 nicklas 799       c = defaultCmp || cmp.eq;
3779 10 Mar 16 nicklas 800     }
3779 10 Mar 16 nicklas 801     return c;
3779 10 Mar 16 nicklas 802   }
3779 10 Mar 16 nicklas 803   
3779 10 Mar 16 nicklas 804   // Compare if two values are equal
3779 10 Mar 16 nicklas 805   cmp.eq = function(v1, v2)
3779 10 Mar 16 nicklas 806   {
3779 10 Mar 16 nicklas 807     return v1 == v2;
3779 10 Mar 16 nicklas 808   }
3779 10 Mar 16 nicklas 809   
4359 15 Feb 17 nicklas 810   // Compare if two values are different
4359 15 Feb 17 nicklas 811   cmp.neq = function(v1, v2)
4359 15 Feb 17 nicklas 812   {
4359 15 Feb 17 nicklas 813     return v1 != v2;
4359 15 Feb 17 nicklas 814   }
4359 15 Feb 17 nicklas 815   
4183 27 Oct 16 nicklas 816   // Check if v2 is contained in v1
4183 27 Oct 16 nicklas 817   cmp.contains = function(v1, v2)
4183 27 Oct 16 nicklas 818   {
4183 27 Oct 16 nicklas 819     return v1 != null && v2 != null && v1.indexOf(v2) >= 0;
4183 27 Oct 16 nicklas 820   }
4183 27 Oct 16 nicklas 821   
3779 10 Mar 16 nicklas 822   // Compare if two values are appoximately equals (difference is not more than 0.05)
3779 10 Mar 16 nicklas 823   cmp.approx = function(v1, v2)
3779 10 Mar 16 nicklas 824   {
3779 10 Mar 16 nicklas 825     return Math.abs(v2 - v1) < 0.05;
3779 10 Mar 16 nicklas 826   }
3779 10 Mar 16 nicklas 827   
3779 10 Mar 16 nicklas 828   // Compare if v1 starts with the same string as v2
3779 10 Mar 16 nicklas 829   cmp.startsWith = function(v1, v2)
3779 10 Mar 16 nicklas 830   {
3779 10 Mar 16 nicklas 831     return v1 != null && v1.indexOf(v2) == 0;
3779 10 Mar 16 nicklas 832   }
3779 10 Mar 16 nicklas 833   
3779 10 Mar 16 nicklas 834   // Compare if v1 is greater than or equal to v2
3779 10 Mar 16 nicklas 835   cmp.gt = function(v1, v2)
3779 10 Mar 16 nicklas 836   {
3814 23 Mar 16 nicklas 837     return v1 != null && v2 != null && v1 >= v2;
3779 10 Mar 16 nicklas 838   }
3779 10 Mar 16 nicklas 839   
3779 10 Mar 16 nicklas 840   // Compare if v1 is less than or equal to v2
3779 10 Mar 16 nicklas 841   cmp.lt = function(v1, v2)
3779 10 Mar 16 nicklas 842   {
3814 23 Mar 16 nicklas 843     return v1 != null && v2 != null && v1 <= v2;
3779 10 Mar 16 nicklas 844   }
3779 10 Mar 16 nicklas 845   
3779 10 Mar 16 nicklas 846   return cmp;
3779 10 Mar 16 nicklas 847 }();
3779 10 Mar 16 nicklas 848