source: extensions/net.sf.basedb.reggie/trunk/resources/samplereportgenerator.jsp @ 1485

Last change on this file since 1485 was 1472, checked in by Martin Svensson, 10 years ago

References #339 It is now possible to generate a month-based sample count report. Some more work are perhaps needed on the presentation.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 13.3 KB
Line 
1<%@ page
2  pageEncoding="UTF-8"
3  session="false"
4  import="net.sf.basedb.core.User"
5  import="net.sf.basedb.core.DbControl"
6  import="net.sf.basedb.core.SessionControl"
7  import="net.sf.basedb.clients.web.Base" 
8%>
9<%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
10<%@ taglib prefix="p" uri="/WEB-INF/path.tld" %>
11<%
12final SessionControl sc = Base.getExistingSessionControl(request, true);
13final String ID = sc.getId();
14final float scale = Base.getScale(sc);
15DbControl dc = null;
16try
17{
18  dc = sc.newDbControl();
19  final User user = User.getById(dc, sc.getLoggedInUserId());
20  %>
21  <base:page type="default" >
22  <base:head scripts="ajax.js" styles="path.css">
23    <link rel="stylesheet" type="text/css" href="reggie.css">
24    <script language="JavaScript" src="reggie.js" type="text/javascript" charset="UTF-8"></script>
25   
26   
27  <script language="JavaScript">
28  var currentStep = 1;
29  var debug = false;
30  var sitesCombined;
31  var numCols;
32 
33  function goNext()
34  {
35    if (currentStep == 1)
36    {
37      gotoStep2();
38    }
39  }
40 
41  function gotoStep2()
42  {
43    var frm = document.forms['reggie'];
44    frm.reporttype.disabled = true;
45    if (frm.reporttype[frm.reporttype.selectedIndex].value == 'samplecount')
46    {
47      Main.show('sampleCountSection');
48    }
49       
50    Main.show('gocreate');   
51    Main.hide('gonext');
52    currentStep = 2;
53  }
54 
55  function goCreate()
56  {
57    var frm = document.forms['reggie'];
58    for (var i=0; i< frm.view.length; i++)
59    {
60      frm.view[i].disabled = true;
61    }
62    var reportType = frm.reporttype[frm.reporttype.selectedIndex].value;
63   
64    var url = 'SampleReport.servlet?ID=<%=ID%>&cmd='+reportType;
65    var columnView = Forms.getCheckedRadio(frm.view).value;
66    if (reportType == 'samplecount')
67    {
68      url += '&columnview=' + columnView;
69    }
70    var request = Ajax.getXmlHttpRequest();
71    request.open("GET", url, false);
72    request.send(null);
73   
74    if (debug) Main.debug(request.responseText);   
75    var response = JSON.parse(request.responseText); 
76    if (response.status != 'ok')
77    {
78      setFatalError(response.message);
79      return false;
80    }
81    var report = response.report;
82    var reportTable = getReportTable();
83    if ('samplecount' == reportType)
84    {
85      var fdString = report.firstDate;
86      var ldString = report.latestDate;
87      var firstDate = new Date();
88      firstDate.setYear(fdString.substr(0,4));
89      firstDate.setMonth(fdString.substr(4,2)-1);
90      firstDate.setDate(fdString.substr(6));
91      var latestDate = new Date();
92      latestDate.setYear(ldString.substr(0,4));
93      latestDate.setMonth(ldString.substr(4,2)-1);
94      latestDate.setDate(ldString.substr(6));
95     
96      // Calculate number of datacolumns
97      if (columnView == 'MONTH')
98      {
99        var numYears = latestDate.getFullYear() - firstDate.getFullYear();
100        numCols = (12*(numYears-1)) + (12-parseInt(fdString.substr(4,2)) + 1) + parseInt(ldString.substr(4,2));
101      }
102      else
103      {
104       
105      }
106      sitesCombined = Array(numCols);
107     
108      // Set table header
109      var headerText = '# Specimen by ';
110      headerText += columnView == 'WEEK' ? 'week' : 'month';
111      headerText += '(through '+latestDate.getFullYear()+'-';
112      if ((latestDate.getMonth()+1) < 10) headerText += '0' + (latestDate.getMonth()+1);
113      else headerText += (latestDate.getMonth()+1);
114      headerText += '-';
115      if (latestDate.getDate() < 10) headerText += '0' + latestDate.getDate();
116      else headerText += latestDate.getDate();
117      headerText += ')';
118      var headerRow = document.createElement('tr');
119      headerRow.appendChild(getTableCellElement(headerText, 'reportheader', (numCols+4)));
120     
121      // Sub headers
122      var subHeaderRowYear = document.createElement('tr');
123      addYearSubHeaders(firstDate, latestDate, subHeaderRowYear, columnView);     
124      subHeaderRowYear.appendChild(getTableCellElement('', 'reportsubheader'));
125           
126      //Columnsheader
127      var columnHeaderRow = document.createElement('tr');
128      var siteHeader = getTableCellElement('Site', 'reportsubheader');     
129      var startDateHeader = getTableCellElement('Start date','reportsubheader');     
130      columnHeaderRow.appendChild(siteHeader);
131      columnHeaderRow.appendChild(startDateHeader);     
132      if (columnView == 'MONTH') addMonthColumnHeaders(columnHeaderRow, firstDate, latestDate);
133//      else addWeekColumnHeaders(columnHeaderRow, firstDate,latestDate);
134      columnHeaderRow.appendChild(getTableCellElement('Grand\ntotal', 'reportsubheader'));
135
136      // Build table     
137      reportTable.appendChild(headerRow);
138      reportTable.appendChild(subHeaderRowYear);
139      reportTable.appendChild(columnHeaderRow);
140           
141      // Data rows     
142      addDataRowsToTable(report, reportTable, columnView);
143     
144      // Add a row with the combined number of each month-column
145      var sitesCombinedRow = document.createElement('tr');
146      sitesCombinedRow.appendChild(getTableCellElement('Sites combined', 'colsummary'));
147      sitesCombinedRow.appendChild(getTableCellElement('', 'colsummary'));
148      var gt = 0;
149      for (key in sitesCombined)
150      {       
151        sitesCombinedRow.appendChild(getTableCellElement(sitesCombined[key],'colsummary'));
152        gt += sitesCombined[key];
153      }
154      sitesCombinedRow.appendChild(getTableCellElement(gt, 'colsummary'));
155      reportTable.appendChild(sitesCombinedRow);     
156    }
157    var cellElement = document.getElementById('reportcell');
158    cellElement.appendChild(reportTable);
159    Main.hide('gocreate');
160    Main.show('gorestart');
161    Main.show('reportSection');
162  }
163 
164  function addWeekcolumnHeaders(columnHeaderRow, firstDate, latestDate)
165  {
166    var currentDate = firstDate;
167  }
168 
169  function addMonthColumnHeaders(columnHeaderRow, firstDate, latestDate)
170  {
171    var month=new Array(12);
172      month[0]="Jan";
173      month[1]="Feb";
174      month[2]="March";
175      month[3]="April";
176      month[4]="May";
177      month[5]="June";
178      month[6]="July";
179      month[7]="Aug";
180      month[8]="Sept";
181      month[9]="Oct";
182      month[10]="Nov";
183      month[11]="Dec";
184     
185    var currentDate = new Date(firstDate.getFullYear(), firstDate.getMonth());
186    for (var i=0;i<numCols;i++)
187    {
188      var currentMonth = new Date(0,firstDate.getMonth());
189      var columnText = month[currentDate.getMonth()];
190      if ((i+1) == numCols) 
191      {
192        columnText += '\n(to ' + latestDate.getDate();
193        if (latestDate.getDate() == 1) columnText += 'st';
194        else if (latestDate.getDate() == 2) columnText += 'nd';
195        else if (latestDate.getDate() == 3) columnText += 'rd';
196        else columnText += 'th';
197        columnText += ')';
198      }       
199      var monthHeader = getTableCellElement(columnText, 'reportsubheader');
200      columnHeaderRow.appendChild(monthHeader);       
201      currentDate.setMonth(currentDate.getMonth() +1);
202    }   
203  }
204 
205  function addYearSubHeaders(firstDate, latestDate, subHeaderRowYear, viewType)
206  {
207    subHeaderRowYear.appendChild(getTableCellElement('', 'reportsubheader', 2));
208    var currentYear = firstDate.getFullYear();     
209    do
210    {
211      var colspan;
212      if (viewType == "MONTH")
213      {
214        if (currentYear == firstDate.getFullYear()) 
215          colspan =  (12-parseInt(firstDate.getMonth()+1)+1);
216        else if (currentYear == latestDate.getFullYear()) 
217          colspan = parseInt(latestDate.getMonth()+1);
218        else
219          colspan = 12;
220        subHeaderRowYear.appendChild(getTableCellElement(currentYear, 'reportsubheader', colspan));
221      }
222      else
223      {
224       
225      }
226    }while(!(++currentYear>latestDate.getFullYear()));
227  }
228 
229  function addDataRowsToTable(report, reportTable, viewType)
230  {
231    var fdString = report.firstDate;
232    var ldString = report.latestDate;
233    var firstDate = new Date();
234    firstDate.setYear(fdString.substr(0,4));
235    firstDate.setMonth(fdString.substr(4,2)-1);
236    firstDate.setDate(fdString.substr(6));
237    var latestDate = new Date();
238    latestDate.setYear(ldString.substr(0,4));
239    latestDate.setMonth(ldString.substr(4,2)-1);
240    latestDate.setDate(ldString.substr(6));
241   
242    var sites = report.sites;
243    for (namePrefix in sites)
244    {
245      if (!sites.hasOwnProperty(namePrefix)) continue;       
246      var site = sites[namePrefix];
247      var siteName = site.name;       
248      var siteStartDate = site.startdate;
249     
250      var siteData = report[namePrefix];
251      var tableRow = document.createElement('tr');
252      var tableCol = getTableCellElement(siteName, 'rowtitle');
253      tableRow.appendChild(tableCol);
254      tableRow.appendChild(getTableCellElement(siteStartDate, 'reportdata'));
255     
256      var yearIndex = firstDate.getFullYear();
257      var monthIndex = firstDate.getMonth()+1;
258      var grandTotal = 0;
259      for (var i=0;i<numCols;i++)
260      {         
261        var dataCol = getTableCellElement('0', 'reportdata');       
262        if (siteData != null)
263        {
264          var rowfill = monthIndex < 10 ? '0' : '';
265          var keyIndex = null;
266          if (viewType == 'MONTH') keyIndex = yearIndex + rowfill + monthIndex;           
267          var data = siteData[keyIndex];
268          if (data == null) data = 0;
269          dataCol = getTableCellElement(data, 'reportdata');
270          if (sitesCombined[keyIndex] != null)
271            sitesCombined[keyIndex] += parseInt(data);
272          else
273            sitesCombined[keyIndex] = parseInt(data);
274          grandTotal += data;
275          monthIndex++;
276          if (monthIndex > 12)
277          {
278            yearIndex++;
279            monthIndex = 1;
280          }
281        }
282        tableRow.appendChild(dataCol);
283      }
284      tableRow.appendChild(getTableCellElement(grandTotal, 'rowsummary'));
285      reportTable.appendChild(tableRow);
286    }
287  }
288 
289  function getReportTable()
290  {
291      var reportTable = document.createElement('table');
292      reportTable.setAttribute('class','reporttable');
293      reportTable.setAttribute('border','1');
294      return reportTable;
295  }
296 
297  function getTableCellElement(text, clazz, colspan, rowspan)
298  {
299    var cellElement = document.createElement('td');
300    text = new String(text);   
301    var textArray = text.split("\n");   
302    if (textArray.length > 1)
303    {
304      for (var i=0;i<textArray.length;i++)
305      {       
306        if (i>0)cellElement.appendChild(document.createElement('br'));
307        cellElement.appendChild(document.createTextNode(textArray[i]));
308      }     
309    }
310    else
311    {
312      cellElement.appendChild(document.createTextNode(text));
313    }
314    cellElement.setAttribute('class', clazz);
315    if (colspan != null) cellElement.setAttribute('colspan', colspan);
316    if (rowspan != null) cellElement.setAttribute('rowspan', rowspan);
317   
318    return cellElement;
319  }
320  </script>
321 
322 
323  </base:head>
324  <base:body onload="init()">
325    <p:path style="margin-top: 20px; margin-bottom: 10px;">
326      <p:pathelement title="Reggie" href="<%="index.jsp?ID="+ID%>" />
327      <p:pathelement title="Report generator" />
328    </p:path>
329   
330    <%
331    if (sc.getActiveProjectId() == 0)
332    {
333      %>
334      <base:note type="warning" style="width: 800px; margin-left: 20px; margin-bottom: 20px; margin-right: 0px; font-weight: bold; color: #cc0000;">
335        No project has been selected. You may proceed with the report generation but
336        only your own items will be included in the report.
337      </base:note>
338      <%
339    }
340    %>
341 
342    <form name="reggie" onsubmit="return false;">
343      <!-- 1. Report type-->
344      <table border="0" cellspacing="0" cellpadding="0" class="stepform">
345      <tr>
346        <td rowspan="3" class="stepno">1</td>
347        <td class="steptitle">Report type</td>
348      </tr>
349      <tr>
350        <td class="stepfields">
351          <table border="0" cellspacing="0" cellpadding="0" width="100%">
352          <tr valign="top">
353            <td class="prompt">Report</td>
354            <td class="input">
355              <select name="reporttype">
356                <option value="samplecount">Sample count report</option>
357              </select>
358            </td>
359            <td class="status" id="report.status"></td>
360            <td class="help">
361              <span id="report.message" class="message" style="display: none;"></span>
362              Select which report to generate.
363            </td>
364          </tr>
365          </table>
366        </td>
367      </tr>
368      </table>
369     
370      <div id="sampleCountSection" style="display:none;">
371        <p></p>
372        <!-- 2. Report parameters-->
373        <table border="0" cellspacing="0" cellpadding="0" class="stepform">
374        <tr>
375          <td rowspan="3" class="stepno">2</td>
376          <td class="steptitle">Report parameters</td>
377        </tr>
378        <tr>
379          <td class="stepfields">
380            <table border="0" cellspacing="0" cellpadding="0" width="100%">
381            <tr valign="top">
382              <td class="prompt">View</td>
383              <td class="input">
384                per Month<input type="radio" value="MONTH" checked onChange="viewOnChange()" name="view"/>&nbsp;
385                per Week<input type="radio" value="WEEK" onChange="viewOnChange()" name="view" />
386              </td>
387              <td class="status" id="displayInterval.status"></td>
388              <td class="help">
389                <span id="displayInterval.message" class="message" style="display: none;"></span>
390                Select if the posts should be viewed per month or per week.
391              </td>
392            </tr>
393            </table>
394          </td>
395        </tr>
396        </table>
397      </div>
398     
399      <div id="reportSection" style="display:none;">
400        <p></p>
401        <table border="0" cellspacing="0" cellpadding="0" class="stepform">
402        <tr>
403          <td rowspan="3" class="stepno">3</td>
404          <td class="steptitle">Generated report</td>
405        </tr>
406        <tr>
407          <td id="reportcell" class="stepfields">
408          </td>
409        </tr>
410        </table>
411      </div> 
412     
413      <div class="error" id="errorMessage" style="display: none; width: 800px; margin-left: 20px; margin-bottom: 0px;"></div>   
414       
415      <table style="margin-left: 20px; margin-top: 10px;" class="navigation">
416        <tr>
417          <td><base:button id="gocancel" title="Cancel" onclick="goRestart(false)" style="display: none;"/></td>
418          <td><base:button id="gonext" title="Next" image="gonext.gif" onclick="goNext(true)" /></td>
419          <td><base:button id="gocreate" title="Generate" image="gonext.gif" onclick="goCreate()" style="display: none;"/></td>         
420          <td><base:button id="gorestart" title="Restart" image="goback.gif" onclick="goRestart(true)" style="display: none;"/></td>
421          <td id="gonext.message" class="message"></td>
422        </tr>
423      </table>     
424    </form>
425  </base:body>
426  </base:page>
427  <%
428}
429finally
430{
431  if (dc != null) dc.close();
432}
433%>
Note: See TracBrowser for help on using the repository browser.