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>
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
//