Added report export to CSV.

Ylian Saint-Hilaire committed Sep 9, 2021 at 12:58 UTC b7890f7f492ca00316c7b21ea1baaa81b91bf0b8
1 file changed +116 -62
views/default.handlebars
+116 -62
@@ -1187,6 +1187,9 @@
1187 <tr>
1188 <td class="h1"></td>
1189 <td class="style14">
1190 + <div style="float:right;line-height:22px">
1191 + <a id="p60downloadReportDiv" style="display:none" href=# onclick=p60downloadReport()><img src=images/link4.png height=10 width=10 title="Download Report" style=cursor:pointer></a>&nbsp;
1192 + </div>
1193 <div>
1194 <input type=button onclick=generateReportDialog() value="Generate Report..." />
1195 </div>
@@ -14909,6 +14912,8 @@
14912 // MY REPORTS
14913 //
14914
14915 + var reportCSV = null;
14916 +
14917 function generateReportDialog() {
14918 if (xxdialogMode) return;
14919 var y = '', x = '', settings = JSON.parse(getstore('_ReportSettings', '{}'));
@@ -14962,81 +14967,98 @@
14967 }
14968
14969 function renderReport(r) {
14965 - //console.log('renderReport', r);
14970 var colTranslation = { time: "Time", device: "Device", session: "Session", user: "User", length: "Length" }
14967 - var x = '<table style=width:100%>';
14971 + var x = '<table style=width:100%>', firstItem;
14972 var sumByCol = null; // Indicate by what colum we sum by
14973 var sumByValues = []; // Indicate by what values we sum by
14974
14971 - x += '<tr>'
14972 - for (var i in r.columns) {
14973 - var coltitle;
14974 - if (colTranslation[r.columns[i].title] != null) { coltitle = colTranslation[r.columns[i].title]; } else { coltitle = EscapeHtml(r.columns[i].title); }
14975 - var style = '';
14976 - if (r.columns[i].align) { style += ';text-align:' + EscapeHtml(r.columns[i].align); } else { style += ';text-align:left'; }
14977 - if ((i == 0) && ((r.columns[i].format == 'datetime') || (r.columns[i].format == 'time'))) { style += ';width:1%'; }
14978 - x += '<th style=' + style + '>' + coltitle + '</th>';
14979 - }
14980 - x += '</tr>'
14981 - for (var i in r.groups) {
14982 - x += '<tr style=height:8px></tr>'
14983 - x += '<tr><td colspan=' + r.columns.length + ' style="border-bottom:1pt solid black"><b>'
14984 - x += renderReportFormat(i, r.groupFormat);
14985 - x += '</b></td></tr>'
14986 - for (var j in r.groups[i].entries) {
14987 - var e = r.groups[i].entries[j];
14988 - x += '<tr>'
14989 - for (var k in r.columns) {
14990 - var style = '';
14991 - if (r.columns[k].align) { style = 'text-align:' + EscapeHtml(r.columns[k].align); }
14992 - if (e[r.columns[k].id] != null) { x += '<td style="' + style + '">' + renderReportFormat(e[r.columns[k].id], r.columns[k].format) + '</td>'; } else { x += '<td></td>'; }
14993 - if (r.columns[k].sumBy != null) {
14994 - var v1 = e[r.columns[k].sumBy];
14995 - var v2 = e[r.columns[k].id];
14996 - sumByCol = r.columns[k].sumBy;
14997 - if (v2 != null) {
14998 - if (sumByValues.indexOf(v1) == -1) { sumByValues.push(v1); }
14999 - if (r.columns[k].subtotals == null) { r.columns[k].subtotals = {}; r.columns[k].totals = {}; }
15000 - if (r.columns[k].subtotals[v1] == null) { r.columns[k].subtotals[v1] = v2; } else { r.columns[k].subtotals[v1] += v2; }
15001 - if (r.columns[k].totals[v1] == null) { r.columns[k].totals[v1] = v2; } else { r.columns[k].totals[v1] += v2; }
15002 - }
15003 - }
15004 - }
15005 - x += '</tr>'
15006 - }
15007 - }
15008 -
15009 - // Display totals
15010 - if (sumByCol != null) {
15011 - var sumByColNum = -1;
15012 - for (var i in r.columns) { if (r.columns[i].id == sumByCol) { sumByColNum = i; } }
15013 - if (sumByColNum >= 0) {
15014 - sumByValues.sort();
15015 - var firstRow = true;
14975 + if (Object.keys(r.groups).length == 0) {
14976 + reportCSV = null;
14977 + QV('p60downloadReportDiv', false);
14978 + x += '<tr><td style=text-align:center;padding-top:32px>' + "Report returned no entires." + '</tr></td>';
14979 + } else {
14980 + reportCSV = '"' + "Group" + '"';
14981 + x += '<tr>'
14982 + for (var i in r.columns) {
14983 + var coltitle;
14984 + if (colTranslation[r.columns[i].title] != null) { coltitle = colTranslation[r.columns[i].title]; } else { coltitle = EscapeHtml(r.columns[i].title); }
14985 + var style = '';
14986 + if (r.columns[i].align) { style += ';text-align:' + EscapeHtml(r.columns[i].align); } else { style += ';text-align:left'; }
14987 + if ((i == 0) && ((r.columns[i].format == 'datetime') || (r.columns[i].format == 'time'))) { style += ';width:1%'; }
14988 + x += '<th style=' + style + '>' + coltitle + '</th>';
14989 + reportCSV += ',"' + csvClean(coltitle) + '"';
14990 + firstItem = false;
14991 + }
14992 + x += '</tr>'
14993 + reportCSV += '\r\n';
14994 + for (var i in r.groups) {
14995 x += '<tr style=height:8px></tr>'
15017 - for (var j in sumByValues) {
14996 + x += '<tr><td colspan=' + r.columns.length + ' style="border-bottom:1pt solid black"><b>'
14997 + x += renderReportFormat(i, r.groupFormat);
14998 + x += '</b></td></tr>'
14999 + for (var j in r.groups[i].entries) {
15000 + var e = r.groups[i].entries[j];
15001 x += '<tr>'
15019 - for (var i in r.columns) {
15020 - if (i == sumByColNum) {
15021 - var style = '';
15022 - if (r.columns[k].align) { style += ';text-align:' + EscapeHtml(r.columns[k].align); }
15023 - if (firstRow) { style += ';border-top:1pt solid #777'; }
15024 - x += '<td style="color:#777' + style + '">' + renderReportFormat(sumByValues[j], r.columns[i].format); + '</td>';
15025 - } else if (r.columns[i].totals != null) {
15026 - var style = '';
15027 - if (r.columns[k].align) { style += ';text-align:' + EscapeHtml(r.columns[k].align); }
15028 - if (firstRow) { style += ';border-top:1pt solid #777'; }
15029 - x += '<td style="color:#777' + style + '">' + renderReportFormat(r.columns[i].totals[sumByValues[j]], r.columns[i].format); + '</td>';
15002 + reportCSV += '"' + csvClean(renderReportFormatCSV(i, r.groupFormat)) + '"';
15003 + for (var k in r.columns) {
15004 + var style = '';
15005 + if (r.columns[k].align) { style = 'text-align:' + EscapeHtml(r.columns[k].align); }
15006 + if (e[r.columns[k].id] != null) {
15007 + x += '<td style="' + style + '">' + renderReportFormat(e[r.columns[k].id], r.columns[k].format) + '</td>';
15008 + reportCSV += ',"' + csvClean(renderReportFormatCSV(e[r.columns[k].id], r.columns[k].format)) + '"';
15009 } else {
15010 x += '<td></td>';
15011 + reportCSV += ',';
15012 + }
15013 + if (r.columns[k].sumBy != null) {
15014 + var v1 = e[r.columns[k].sumBy];
15015 + var v2 = e[r.columns[k].id];
15016 + sumByCol = r.columns[k].sumBy;
15017 + if (v2 != null) {
15018 + if (sumByValues.indexOf(v1) == -1) { sumByValues.push(v1); }
15019 + if (r.columns[k].subtotals == null) { r.columns[k].subtotals = {}; r.columns[k].totals = {}; }
15020 + if (r.columns[k].subtotals[v1] == null) { r.columns[k].subtotals[v1] = v2; } else { r.columns[k].subtotals[v1] += v2; }
15021 + if (r.columns[k].totals[v1] == null) { r.columns[k].totals[v1] = v2; } else { r.columns[k].totals[v1] += v2; }
15022 + }
15023 }
15024 }
15025 x += '</tr>'
15035 - firstRow = false;
15026 + reportCSV += '\r\n';
15027 }
15028 }
15038 - }
15029
15030 + // Display totals
15031 + if (sumByCol != null) {
15032 + var sumByColNum = -1;
15033 + for (var i in r.columns) { if (r.columns[i].id == sumByCol) { sumByColNum = i; } }
15034 + if (sumByColNum >= 0) {
15035 + sumByValues.sort();
15036 + var firstRow = true;
15037 + x += '<tr style=height:8px></tr>'
15038 + for (var j in sumByValues) {
15039 + x += '<tr>'
15040 + for (var i in r.columns) {
15041 + if (i == sumByColNum) {
15042 + var style = '';
15043 + if (r.columns[k].align) { style += ';text-align:' + EscapeHtml(r.columns[k].align); }
15044 + if (firstRow) { style += ';border-top:1pt solid #777'; }
15045 + x += '<td style="color:#777' + style + '">' + renderReportFormat(sumByValues[j], r.columns[i].format); + '</td>';
15046 + } else if (r.columns[i].totals != null) {
15047 + var style = '';
15048 + if (r.columns[k].align) { style += ';text-align:' + EscapeHtml(r.columns[k].align); }
15049 + if (firstRow) { style += ';border-top:1pt solid #777'; }
15050 + x += '<td style="color:#777' + style + '">' + renderReportFormat(r.columns[i].totals[sumByValues[j]], r.columns[i].format); + '</td>';
15051 + } else {
15052 + x += '<td></td>';
15053 + }
15054 + }
15055 + x += '</tr>'
15056 + firstRow = false;
15057 + }
15058 + }
15059 + }
15060 + QV('p60downloadReportDiv', true);
15061 + }
15062 x += '</table>';
15063 QH('p60report', x);
15064 }
@@ -15048,7 +15070,7 @@
15070 if (v == 1) return "Terminal";
15071 if (v == 2) return "Desktop";
15072 if (v == 5) return "Files";
15051 - EscapeHtml(v);
15073 + return "Unknown";
15074 }
15075 if (f == 'seconds') {
15076 var seconds = v % 60;
@@ -15074,6 +15096,38 @@
15096 return EscapeHtml(v);
15097 }
15098
15099 + function renderReportFormatCSV(v, f) {
15100 + if (f == 'datetime') { return printDateTime(new Date(v)); }
15101 + if (f == 'time') { return printTime(new Date(v)); }
15102 + if (f == 'protocol') {
15103 + if (v == 1) return "Terminal";
15104 + if (v == 2) return "Desktop";
15105 + if (v == 5) return "Files";
15106 + return "Unknown";
15107 + }
15108 + if (f == 'node') {
15109 + var node = getNodeFromId(v);
15110 + if (node != null) { return node.name; }
15111 + }
15112 + if (f == 'user') {
15113 + var user = null;
15114 + if (v == userinfo._id) { user = userinfo; } else { if (users != null) { user = users[v]; } }
15115 + if (user != null) {
15116 + var name = user.name;
15117 + if (user.realname != null) { name += ' - ' + user.realname; }
15118 + return name;
15119 + } else {
15120 + return "Unknown User";
15121 + }
15122 + }
15123 + return '' + v;
15124 + }
15125 +
15126 + function p60downloadReport() {
15127 + if (xxdialogMode || (reportCSV == null)) return;
15128 + saveAs(stringToUtf8Blob(reportCSV), "Report.csv");
15129 + }
15130 +
15131 //
15132 // NOTIFICATIONS
15133 //