add dashboard display
parent
c53482cbe3
commit
4dc3bf2cab
@ -0,0 +1,135 @@
|
|||||||
|
package pages
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"html/template"
|
||||||
|
|
||||||
|
"faculty_media_report/dbi"
|
||||||
|
)
|
||||||
|
|
||||||
|
var dashboardTmpl = template.Must(template.New("dashboard").Parse(`<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<title>Dashboard — Maurer School of Law</title>
|
||||||
|
<link rel="stylesheet" href="https://unpkg.com/rivet-core@2/css/rivet.min.css">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<header class="rvt-header-wrapper">
|
||||||
|
<a class="rvt-header-wrapper__skip-link" href="#main-content">Skip to main content</a>
|
||||||
|
<div class="rvt-header-global">
|
||||||
|
<div class="rvt-container-xl">
|
||||||
|
<div class="rvt-header-global__inner">
|
||||||
|
<div class="rvt-header-global__logo-slot">
|
||||||
|
<a class="rvt-lockup" href="/">
|
||||||
|
<div class="rvt-lockup__tab">
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" class="rvt-lockup__trident" viewBox="0 0 28 34">
|
||||||
|
<path d="M-3.34344e-05 4.70897H8.83308V7.174H7.1897V21.1426H10.6134V2.72321H8.83308V0.121224H18.214V2.65476H16.2283V21.1426H19.7889V7.174H18.214V4.64047H27.0471V7.174H25.0614V23.6761L21.7746 26.8944H16.2967V30.455H18.214V33.8787H8.76463V30.592H10.6819V26.8259H5.20403L1.91726 23.6077V7.174H-3.34344e-05V4.70897Z" fill="currentColor"></path>
|
||||||
|
</svg>
|
||||||
|
</div>
|
||||||
|
<div class="rvt-lockup__body">
|
||||||
|
<span class="rvt-lockup__title">Maurer School of Law</span>
|
||||||
|
<span class="rvt-lockup__subtitle">Faculty Public Activity Report</span>
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<main id="main-content" class="rvt-container-xl rvt-p-top-xxl rvt-p-bottom-xxl">
|
||||||
|
<h1 class="rvt-ts-xxl rvt-m-bottom-xxl">Activity Report Dashboard</h1>
|
||||||
|
{{if .}}
|
||||||
|
<div class="rvt-m-bottom-lg">
|
||||||
|
<button class="rvt-button rvt-button--secondary" type="button" id="download-csv">Download CSV Report</button>
|
||||||
|
</div>
|
||||||
|
<div style="overflow-x:auto;">
|
||||||
|
<table class="rvt-table rvt-table--cells" id="report-table">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th scope="col">Date Submitted</th>
|
||||||
|
<th scope="col">Name</th>
|
||||||
|
<th scope="col">Title</th>
|
||||||
|
<th scope="col">Description</th>
|
||||||
|
<th scope="col">Hyperlink</th>
|
||||||
|
<th scope="col">Type</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
{{range .}}
|
||||||
|
<tr>
|
||||||
|
<td>{{.Created}}</td>
|
||||||
|
<td>{{.LastName}}, {{.FirstName}}</td>
|
||||||
|
<td>{{.Title}}</td>
|
||||||
|
<td>{{.Description}}</td>
|
||||||
|
<td>{{if .Hyperlink}}<a href="{{.Hyperlink}}" target="_blank" rel="noopener">Link</a>{{end}}</td>
|
||||||
|
<td>{{.ItemType}}</td>
|
||||||
|
</tr>
|
||||||
|
{{end}}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
{{else}}
|
||||||
|
<p class="rvt-ts-lg">No reported items.</p>
|
||||||
|
{{end}}
|
||||||
|
</main>
|
||||||
|
<script>
|
||||||
|
var dlBtn = document.getElementById('download-csv');
|
||||||
|
if (dlBtn) {
|
||||||
|
dlBtn.addEventListener('click', function() {
|
||||||
|
var now = new Date();
|
||||||
|
var p = function(n) { return n < 10 ? '0' + n : '' + n; };
|
||||||
|
var stamp = '' + now.getFullYear() + p(now.getMonth()+1) + p(now.getDate()) + p(now.getHours()) + p(now.getMinutes()) + p(now.getSeconds());
|
||||||
|
var filename = 'Faculty_Activity_Report-' + stamp + '.csv';
|
||||||
|
|
||||||
|
function esc(val) {
|
||||||
|
val = val || '';
|
||||||
|
if (val.indexOf('|') !== -1 || val.indexOf('"') !== -1 || val.indexOf('\n') !== -1) {
|
||||||
|
return '"' + val.replace(/"/g, '""') + '"';
|
||||||
|
}
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
|
var lines = ['sep=|'];
|
||||||
|
lines.push(['Date Submitted', 'Name', 'Title', 'Description', 'Hyperlink', 'Type'].map(esc).join('|'));
|
||||||
|
|
||||||
|
var rows = document.querySelectorAll('#report-table tbody tr');
|
||||||
|
rows.forEach(function(row) {
|
||||||
|
var cells = row.querySelectorAll('td');
|
||||||
|
var fields = [];
|
||||||
|
cells.forEach(function(cell, i) {
|
||||||
|
if (i === 4) {
|
||||||
|
var a = cell.querySelector('a');
|
||||||
|
fields.push(esc(a ? a.href : ''));
|
||||||
|
} else {
|
||||||
|
fields.push(esc(cell.textContent.trim()));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
lines.push(fields.join('|'));
|
||||||
|
});
|
||||||
|
|
||||||
|
var csv = lines.join('\r\n');
|
||||||
|
var blob = new Blob([csv], {type: 'text/csv;charset=utf-8;'});
|
||||||
|
var url = URL.createObjectURL(blob);
|
||||||
|
var a = document.createElement('a');
|
||||||
|
a.href = url;
|
||||||
|
a.download = filename;
|
||||||
|
document.body.appendChild(a);
|
||||||
|
a.click();
|
||||||
|
document.body.removeChild(a);
|
||||||
|
URL.revokeObjectURL(url);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>`))
|
||||||
|
|
||||||
|
func DashboardPage(items []dbi.DashboardItem) (string, error) {
|
||||||
|
var buf bytes.Buffer
|
||||||
|
if err := dashboardTmpl.Execute(&buf, items); err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
return buf.String(), nil
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue