Skip to content

Commit 5ec6715

Browse files
authored
report charts (#11)
1 parent 4d1f547 commit 5ec6715

File tree

1 file changed

+104
-0
lines changed

1 file changed

+104
-0
lines changed

src/microinvoicer/templates/report.html

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,111 @@
22
{% load humanize %}
33
{% block content %}
44

5+
{{ totals|json_script:"totals-data" }}
6+
57
<div class="row">
8+
<canvas id="reportChart"></canvas>
9+
<button id="backButton" style="float: left;">Back</button>
10+
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
11+
<script>
12+
(function () {
13+
'use strict';
14+
function createChart(canvasId, labels, data, label) {
15+
return new Chart(canvasId, {
16+
type: 'bar',
17+
data: {
18+
labels: labels,
19+
datasets: [
20+
{
21+
label: label,
22+
data: data,
23+
backgroundColor: 'rgba(200, 200, 200, 0.5)',
24+
borderColor: 'rgba(200, 200, 200, 1)',
25+
borderWidth: 1,
26+
},
27+
],
28+
},
29+
options: {
30+
responsive: true,
31+
scales: {
32+
y: {
33+
beginAtZero: true,
34+
},
35+
},
36+
},
37+
});
38+
}
39+
40+
function deleteChart(chart) {
41+
chart.destroy();
42+
}
43+
44+
var totalsData = JSON.parse(document.getElementById('totals-data').textContent);
45+
var years = Object.keys(totalsData);
46+
var yearData = Object.values(totalsData).map(function (obj) { return obj.total; });
47+
var selectedYear = years[0];
48+
49+
function getQuarters(year) {
50+
var quarters = Object.keys(totalsData[year]).filter(function (key) { return key !== "total"; });
51+
var quarterData = quarters.map(function (quarter) { return totalsData[year][quarter].total; });
52+
return [quarters, quarterData];
53+
}
54+
55+
function getMonths(year, quarter) {
56+
var months = Object.keys(totalsData[year][quarter]).filter(function (key) { return key !== "total"; });
57+
var monthData = months.map(function (month) { return totalsData[year][quarter][month].total; });
58+
return [months, monthData];
59+
}
60+
61+
var chartCanvas = document.getElementById('reportChart');
62+
63+
var x_axis = years;
64+
var y_axis = yearData;
65+
var label = 'Yearly Totals';
66+
var chart = createChart(chartCanvas, x_axis, y_axis, label);
67+
68+
chartCanvas.addEventListener('click', function (e) {
69+
var activePoints = chart.getElementsAtEventForMode(e, 'index', { intersect: true }, true);
70+
if (activePoints.length > 0) {
71+
var dataIndex = activePoints[0].index;
72+
if (label === 'Yearly Totals') {
73+
selectedYear = years[dataIndex];
74+
x_axis = getQuarters(selectedYear)[0];
75+
y_axis = getQuarters(selectedYear)[1];
76+
label = 'Quarterly Totals - ' + selectedYear;
77+
} else if (label.includes('Quarterly Totals')) {
78+
var selectedQuarter = Object.keys(totalsData[selectedYear]).filter(function (key) { return key !== "total"; })[dataIndex];
79+
x_axis = getMonths(selectedYear, selectedQuarter)[0];
80+
y_axis = getMonths(selectedYear, selectedQuarter)[1];
81+
label = 'Monthly Totals - ' + selectedQuarter + ' - ' + selectedYear;
82+
}
83+
deleteChart(chart);
84+
chart = createChart(chartCanvas, x_axis, y_axis, label);
85+
}
86+
});
87+
88+
var backButton = document.getElementById('backButton');
89+
backButton.addEventListener('click', function () {
90+
if (label.includes('Quarterly Totals')) {
91+
x_axis = years;
92+
y_axis = yearData;
93+
label = 'Yearly Totals';
94+
} else if (label.startsWith('Monthly Totals -')) {
95+
x_axis = getQuarters(selectedYear)[0];
96+
y_axis = getQuarters(selectedYear)[1];
97+
label = 'Quarterly Totals - ' + selectedYear;
98+
}
99+
deleteChart(chart);
100+
chart = createChart(chartCanvas, x_axis, y_axis, label);
101+
});
102+
})();
103+
</script>
104+
</div>
105+
106+
107+
108+
109+
<div id=my_table class="row">
6110
<table class="centered highlight">
7111
<thead>
8112
<th>Year</th>

0 commit comments

Comments
 (0)