extensions/net.sf.basedb.meludi/trunk/resources/reports/meludi_quarter_month_report_generator.js

Code
Comments
Other
Rev Date Author Line
3505 23 Sep 15 olle 1 var Report = function()
3505 23 Sep 15 olle 2 {
3505 23 Sep 15 olle 3   var report = {};
3505 23 Sep 15 olle 4   var debug = 0;
3505 23 Sep 15 olle 5   
3505 23 Sep 15 olle 6   var PLOT_WIDTH = 700;
3505 23 Sep 15 olle 7   var PLOT_HEIGHT = 550;
3505 23 Sep 15 olle 8   var PLOT_SCALE = 2;
3505 23 Sep 15 olle 9   
3505 23 Sep 15 olle 10   var periodIsValid = true;
4175 24 Oct 16 olle 11   report.TITLE = 'MeLuDI';
6805 24 Aug 22 olle 12   report.VERSION = '1.6.0';
3505 23 Sep 15 olle 13   var xGuide;
3505 23 Sep 15 olle 14   var yGuide;
3505 23 Sep 15 olle 15   
3505 23 Sep 15 olle 16   report.initPage = function()
3505 23 Sep 15 olle 17   {
3505 23 Sep 15 olle 18     var frm = document.forms['meludi'];
3505 23 Sep 15 olle 19
3505 23 Sep 15 olle 20     // Step 1
3505 23 Sep 15 olle 21     Events.addEventHandler('fromdate', 'blur', report.dateOnChange)
3505 23 Sep 15 olle 22     Events.addEventHandler('todate', 'blur', report.dateOnChange)
3505 23 Sep 15 olle 23     Events.addEventHandler('step-1', 'wizard-validate', report.validateStep1);
3505 23 Sep 15 olle 24     
3505 23 Sep 15 olle 25     // Step 2
3505 23 Sep 15 olle 26     Events.addEventHandler('printButton', 'click', report.printVersion);
3505 23 Sep 15 olle 27     
3505 23 Sep 15 olle 28     // Navigation
3505 23 Sep 15 olle 29     Buttons.addClickHandler('gocancel', Wizard.cancelWizard);
3505 23 Sep 15 olle 30     Buttons.addClickHandler('gorestart', Wizard.restartWizard);
3505 23 Sep 15 olle 31     Buttons.addClickHandler('gonext', Wizard.goNextOnClick);
3505 23 Sep 15 olle 32     Buttons.addClickHandler('gocreate', Wizard.goRegister);
3505 23 Sep 15 olle 33   
3505 23 Sep 15 olle 34     // Final registration
3505 23 Sep 15 olle 35     Events.addEventHandler('wizard', 'wizard-submit', report.submit);
3505 23 Sep 15 olle 36     
3505 23 Sep 15 olle 37     Doc.show('step-1');
3505 23 Sep 15 olle 38     Doc.show('gocreate');
3505 23 Sep 15 olle 39     frm.fromdate.focus();
3505 23 Sep 15 olle 40
3505 23 Sep 15 olle 41     // Load sites
3505 23 Sep 15 olle 42     var url = '../MeludiQuarterMonthReport.servlet?ID='+App.getSessionId();
3505 23 Sep 15 olle 43     url += '&cmd=GetSites';    
3505 23 Sep 15 olle 44     Doc.addClass('sites', 'list-loading');
3505 23 Sep 15 olle 45     frm.sites[0] = new Option('loading...');
3505 23 Sep 15 olle 46     Wizard.asyncJsonRequest(url, report.sitesLoaded);
3505 23 Sep 15 olle 47   }
3505 23 Sep 15 olle 48   
3505 23 Sep 15 olle 49   
3505 23 Sep 15 olle 50   report.sitesLoaded = function(response)
3505 23 Sep 15 olle 51   {
3505 23 Sep 15 olle 52     Doc.removeClass('sites', 'list-loading');
3505 23 Sep 15 olle 53     var frm = document.forms['meludi'];
3505 23 Sep 15 olle 54     var sites = response.sites;
3505 23 Sep 15 olle 55     frm.sites.length = 0;
3505 23 Sep 15 olle 56     frm.sites[0] = new Option('All sites together', '');
3505 23 Sep 15 olle 57     for (var i = 0; i < sites.length; i++)
3505 23 Sep 15 olle 58     {
3505 23 Sep 15 olle 59       var s = sites[i];
3505 23 Sep 15 olle 60       var option = new Option(s.name, s.prefix);
3505 23 Sep 15 olle 61       frm.sites[frm.sites.length] = option;
3505 23 Sep 15 olle 62     }
3505 23 Sep 15 olle 63   }
3505 23 Sep 15 olle 64
3505 23 Sep 15 olle 65   report.dateOnChange = function()
3505 23 Sep 15 olle 66   {
3505 23 Sep 15 olle 67     var frm = document.forms['meludi'];    
3505 23 Sep 15 olle 68     var fromDate = frm.fromdate.value;
3505 23 Sep 15 olle 69     var toDate = frm.todate.value;
3505 23 Sep 15 olle 70     
3505 23 Sep 15 olle 71     periodIsValid = false;
3505 23 Sep 15 olle 72     Wizard.setInputStatus('period');
3505 23 Sep 15 olle 73
3505 23 Sep 15 olle 74     if (fromDate != '')
3505 23 Sep 15 olle 75     {
3505 23 Sep 15 olle 76       fromDate = Meludi.autoFillDate(fromDate, true);
3505 23 Sep 15 olle 77       frm.fromdate.value = fromDate;      
3505 23 Sep 15 olle 78       if (!Dates.isDate(fromDate, 'yyyyMMdd'))
3505 23 Sep 15 olle 79       {
3505 23 Sep 15 olle 80         Wizard.setInputStatus('period', 'invalid', 'Not a valid from-date');
3505 23 Sep 15 olle 81         return;
3505 23 Sep 15 olle 82       }
3505 23 Sep 15 olle 83     }
3505 23 Sep 15 olle 84
3505 23 Sep 15 olle 85     if (toDate != '')
3505 23 Sep 15 olle 86     {
3505 23 Sep 15 olle 87       toDate = Meludi.autoFillDate(toDate, true);
3505 23 Sep 15 olle 88       frm.todate.value = toDate;      
3505 23 Sep 15 olle 89       if (!Dates.isDate(toDate, 'yyyyMMdd'))
3505 23 Sep 15 olle 90       {
3505 23 Sep 15 olle 91         Wizard.setInputStatus('period', 'invalid', 'Not a valid to-date');
3505 23 Sep 15 olle 92         return;
3505 23 Sep 15 olle 93       }
3505 23 Sep 15 olle 94     }
3505 23 Sep 15 olle 95     
3505 23 Sep 15 olle 96     if (toDate && fromDate)
3505 23 Sep 15 olle 97     {
3505 23 Sep 15 olle 98       if (fromDate > toDate)
3505 23 Sep 15 olle 99       {
3505 23 Sep 15 olle 100         Wizard.setInputStatus('period', 'invalid', 'Invalid period')
3505 23 Sep 15 olle 101         return;
3505 23 Sep 15 olle 102       }      
3505 23 Sep 15 olle 103     }
3505 23 Sep 15 olle 104     
3505 23 Sep 15 olle 105     Wizard.setInputStatus('period', 'valid');
3505 23 Sep 15 olle 106     periodIsValid = true;
3505 23 Sep 15 olle 107   }
3505 23 Sep 15 olle 108
3505 23 Sep 15 olle 109   
3505 23 Sep 15 olle 110   report.validateStep1 = function(event)
3505 23 Sep 15 olle 111   {
3505 23 Sep 15 olle 112     if (!periodIsValid) event.preventDefault();
3505 23 Sep 15 olle 113   }
3505 23 Sep 15 olle 114   
3505 23 Sep 15 olle 115   
3505 23 Sep 15 olle 116   report.submit = function(event)
3505 23 Sep 15 olle 117   {
3505 23 Sep 15 olle 118     var frm = document.forms['meludi'];
3505 23 Sep 15 olle 119     
3505 23 Sep 15 olle 120     var url = '../MeludiQuarterMonthReport.servlet?ID='+App.getSessionId();
3505 23 Sep 15 olle 121     url += '&cmd=meludiquartermonthreport';
3505 23 Sep 15 olle 122     url += '&fdate='+encodeURIComponent(frm.fromdate.value);
3505 23 Sep 15 olle 123     url += '&tdate='+encodeURIComponent(frm.todate.value);
3505 23 Sep 15 olle 124     url += '&vtype='+encodeURIComponent(frm.viewtype.value);
3515 29 Sep 15 olle 125     url += '&extractsourcefilter='+encodeURIComponent(frm.extractsourcefilter.value);
3505 23 Sep 15 olle 126     url += '&projectfocusfilter='+encodeURIComponent(frm.projectfocusfilter.value);
3505 23 Sep 15 olle 127     url += '&site='+encodeURIComponent(frm.sites.value);
3505 23 Sep 15 olle 128     url += '&cvariant='+encodeURIComponent(frm.chartvariant.value);
3505 23 Sep 15 olle 129     
3505 23 Sep 15 olle 130     Wizard.showLoadingAnimation('Generating plots...');
3505 23 Sep 15 olle 131     request = Wizard.asyncJsonRequest(url, report.onPlotGenerated);
3505 23 Sep 15 olle 132   }
3505 23 Sep 15 olle 133
3505 23 Sep 15 olle 134   report.onPlotGenerated = function(response)
3505 23 Sep 15 olle 135   {
3505 23 Sep 15 olle 136     request = null;
3505 23 Sep 15 olle 137     var frm = document.forms['meludi'];    
3505 23 Sep 15 olle 138
3505 23 Sep 15 olle 139     var plotReport = response.report;
4175 24 Oct 16 olle 140     var projectName = plotReport.projectName;
3505 23 Sep 15 olle 141     var reportTable;
3505 23 Sep 15 olle 142     var reportDiv = Doc.element('reportdiv');
3505 23 Sep 15 olle 143     
3505 23 Sep 15 olle 144     var plots = plotReport.plotStatistics;
3505 23 Sep 15 olle 145     // Draw plots
3505 23 Sep 15 olle 146     for (var plotNo = 0; plotNo < plots.length; plotNo++)
3505 23 Sep 15 olle 147     {
3505 23 Sep 15 olle 148       // Get plot JSON data container with extra info and plot data
3505 23 Sep 15 olle 149       var plot = plots[plotNo];
3505 23 Sep 15 olle 150
3505 23 Sep 15 olle 151       // Get plot JSON extra info and plot data
3505 23 Sep 15 olle 152       var plotChartVariant = plot.chartVariant;
3505 23 Sep 15 olle 153       var plotViewType = plot.viewType;
3505 23 Sep 15 olle 154       var plotOptionalHeadline = plot.optionalHeadline;
3505 23 Sep 15 olle 155       var boxPlotJsonData = plot.plotData;
3505 23 Sep 15 olle 156
3505 23 Sep 15 olle 157       // Create plot from plot JSON data
4175 24 Oct 16 olle 158       var headlineText = document.createElement('text');
4175 24 Oct 16 olle 159       headlineText.innerHTML = "<BR><H2>" + projectName + " [" + Report.TITLE + " " + Report.VERSION + "]</H2><BR>";
3505 23 Sep 15 olle 160       if (plotOptionalHeadline != null && plotOptionalHeadline != '')
3505 23 Sep 15 olle 161       {
3505 23 Sep 15 olle 162         // Print optional headline
4175 24 Oct 16 olle 163         //var headlineText = document.createElement('text');
4175 24 Oct 16 olle 164         headlineText.innerHTML += "<BR>" + plotOptionalHeadline + "<BR>";
4175 24 Oct 16 olle 165         //reportDiv.appendChild(headlineText);
3505 23 Sep 15 olle 166       }
4175 24 Oct 16 olle 167       reportDiv.appendChild(headlineText);
3505 23 Sep 15 olle 168
3505 23 Sep 15 olle 169       var plotKey = plotChartVariant + '_' + plotViewType;
3505 23 Sep 15 olle 170 /*
3505 23 Sep 15 olle 171           // Add plot key as debug text
3505 23 Sep 15 olle 172           var debugText = document.createElement('text');
3505 23 Sep 15 olle 173           debugText.innerHTML = "<BR>" + plotKey + "<BR>";
3505 23 Sep 15 olle 174           reportDiv.appendChild(spacer);
3505 23 Sep 15 olle 175           reportDiv.appendChild(debugText);
3505 23 Sep 15 olle 176 */
3505 23 Sep 15 olle 177       // Add plot
3505 23 Sep 15 olle 178       var canvasInTable = document.createElement('canvas');
3505 23 Sep 15 olle 179       canvasInTable.setAttribute('id', plotKey);
3505 23 Sep 15 olle 180       canvasInTable.setAttribute('width', PLOT_WIDTH * PLOT_SCALE);
3505 23 Sep 15 olle 181       canvasInTable.setAttribute('height', PLOT_HEIGHT * PLOT_SCALE);
3505 23 Sep 15 olle 182       createBoxPlot(boxPlotJsonData, canvasInTable, PLOT_WIDTH, PLOT_HEIGHT, PLOT_SCALE);
3505 23 Sep 15 olle 183       reportDiv.appendChild(canvasInTable);          
3505 23 Sep 15 olle 184       canvasInTable.addEventListener('mousemove', report.drawCanvasGuidelines, false);
3505 23 Sep 15 olle 185       canvasInTable.addEventListener('mouseleave', report.hideCanvasGuidelines, false);
3505 23 Sep 15 olle 186     }
3505 23 Sep 15 olle 187     
3505 23 Sep 15 olle 188     // Print optional appended info
3505 23 Sep 15 olle 189     var appendedInfo = plotReport.appendedInfo;
3505 23 Sep 15 olle 190     if (appendedInfo != null && appendedInfo != '')
3505 23 Sep 15 olle 191     {
3505 23 Sep 15 olle 192       // Print optional headline
3505 23 Sep 15 olle 193       var infoText = document.createElement('text');
3505 23 Sep 15 olle 194       infoText.innerHTML = "<BR>" + appendedInfo + "<BR>";
3505 23 Sep 15 olle 195       reportDiv.appendChild(infoText);
3505 23 Sep 15 olle 196     }
3505 23 Sep 15 olle 197     
3505 23 Sep 15 olle 198     var caseSummary = reportDiv.getElementsByClassName('case-summary');
3505 23 Sep 15 olle 199     for (var i = 0; i < caseSummary.length; i++)
3505 23 Sep 15 olle 200     {
3505 23 Sep 15 olle 201       var cs = caseSummary[i];
3505 23 Sep 15 olle 202       Events.addEventHandler(cs, 'click', report.showCaseSummary);
3505 23 Sep 15 olle 203     }
3505 23 Sep 15 olle 204     
3505 23 Sep 15 olle 205     Doc.show('step-2');
3505 23 Sep 15 olle 206     Doc.show('printButton');
3505 23 Sep 15 olle 207     Doc.show('gorestart');    
3505 23 Sep 15 olle 208
3505 23 Sep 15 olle 209   }
3505 23 Sep 15 olle 210   
3505 23 Sep 15 olle 211   report.drawCanvasGuidelines = function(event)
3505 23 Sep 15 olle 212   {
3505 23 Sep 15 olle 213     if (!xGuide)
3505 23 Sep 15 olle 214     {
3505 23 Sep 15 olle 215       xGuide = Doc.element('x-guide');
3505 23 Sep 15 olle 216       yGuide = Doc.element('y-guide');
3505 23 Sep 15 olle 217     }
3505 23 Sep 15 olle 218     var canvas = event.target;
3505 23 Sep 15 olle 219     var centerX = event.clientX;
3505 23 Sep 15 olle 220     var centerY = event.clientY;
3505 23 Sep 15 olle 221     var canvasPos = Doc.getElementPosition(canvas);
3505 23 Sep 15 olle 222     var startX = canvasPos.left+50;
3505 23 Sep 15 olle 223     var widthX = canvasPos.width-100;
3505 23 Sep 15 olle 224     var startY = canvasPos.top+80;
3505 23 Sep 15 olle 225     var heightY = canvasPos.height-160;
3505 23 Sep 15 olle 226     if (centerY < startY || centerY > startY+heightY)
3505 23 Sep 15 olle 227     {
3505 23 Sep 15 olle 228       // Hide when mouse is in the text area below or over the plot
3505 23 Sep 15 olle 229       yGuide.style.display = 'none';
3505 23 Sep 15 olle 230     }
3505 23 Sep 15 olle 231     else
3505 23 Sep 15 olle 232     {
3505 23 Sep 15 olle 233       yGuide.style.top = (centerY-2) + 'px';
3505 23 Sep 15 olle 234       yGuide.style.left = startX + 'px';
3505 23 Sep 15 olle 235       yGuide.style.width = widthX + 'px';
3505 23 Sep 15 olle 236       yGuide.style.display = 'block';
3505 23 Sep 15 olle 237     }
3505 23 Sep 15 olle 238     if (centerX < startX || centerX > startX + widthX)
3505 23 Sep 15 olle 239     {
3505 23 Sep 15 olle 240       // Hide when mouse is in the text area to the left or right of the plot
3505 23 Sep 15 olle 241       xGuide.style.display = 'none';
3505 23 Sep 15 olle 242     }
3505 23 Sep 15 olle 243     else
3505 23 Sep 15 olle 244     {
3505 23 Sep 15 olle 245       // Avoid drawing outside the avilable hight (causes an extra pair of scroll bars)
3505 23 Sep 15 olle 246       var yLimit = App.getWindowPosition().height;
3505 23 Sep 15 olle 247       if (startY+heightY > yLimit)
3505 23 Sep 15 olle 248       {
3505 23 Sep 15 olle 249         heightY = yLimit-startY;
3505 23 Sep 15 olle 250       }
3505 23 Sep 15 olle 251       xGuide.style.top = startY + 'px';
3505 23 Sep 15 olle 252       xGuide.style.left = (centerX-2) + 'px';
3505 23 Sep 15 olle 253       xGuide.style.height = heightY + 'px';
3505 23 Sep 15 olle 254       xGuide.style.display = 'block';
3505 23 Sep 15 olle 255     }
3505 23 Sep 15 olle 256
3505 23 Sep 15 olle 257   }
3505 23 Sep 15 olle 258   
3505 23 Sep 15 olle 259   report.hideCanvasGuidelines = function(event)
3505 23 Sep 15 olle 260   {
3505 23 Sep 15 olle 261     xGuide.style.display = 'none';
3505 23 Sep 15 olle 262     yGuide.style.display = 'none';
3505 23 Sep 15 olle 263   }
3505 23 Sep 15 olle 264
3505 23 Sep 15 olle 265   
3505 23 Sep 15 olle 266   report.printVersion = function()
3505 23 Sep 15 olle 267   {
3505 23 Sep 15 olle 268     var printNote = '<b>Note!</b> For better printing set page orientation to <i>portrait</i>.';
3505 23 Sep 15 olle 269     printNote += ' Scale down to <i>90%</i> to fit 2 plots per page.';
3505 23 Sep 15 olle 270     Meludi.openPrintWindow('step-2-content', 'Sample processing statistics', 'portrait', printNote, '../', 'report.css');
3505 23 Sep 15 olle 271   }
3505 23 Sep 15 olle 272
3505 23 Sep 15 olle 273   report.showCaseSummary = function(event)
3505 23 Sep 15 olle 274   {
3505 23 Sep 15 olle 275     var caseName = Data.get(event.currentTarget, 'case-name');
3505 23 Sep 15 olle 276     if (caseName)
3505 23 Sep 15 olle 277     {
3505 23 Sep 15 olle 278       var url = 'case_summary.jsp?ID='+App.getSessionId();
3505 23 Sep 15 olle 279       url += '&caseName='+encodeURIComponent(caseName);
3505 23 Sep 15 olle 280       url += '&pageType=popup';
3505 23 Sep 15 olle 281       Dialogs.openPopup(url, 'CaseSummary', 1000, 700);
3505 23 Sep 15 olle 282     }
3505 23 Sep 15 olle 283   }
3505 23 Sep 15 olle 284   
3505 23 Sep 15 olle 285   return report;
3505 23 Sep 15 olle 286 }();
3505 23 Sep 15 olle 287
3505 23 Sep 15 olle 288 Doc.onLoad(Report.initPage);