1
0
Fork 0
mirror of synced 2024-07-27 17:26:16 +12:00
appwrite/public/scripts/views/forms/chart.js

135 lines
4.2 KiB
JavaScript
Raw Normal View History

2021-11-19 01:10:02 +13:00
(function (window) {
2020-05-13 08:15:36 +12:00
"use strict";
window.ls.container.get("view").add({
selector: "data-forms-chart",
2021-11-19 01:10:02 +13:00
controller: function (element, container, date, document) {
2020-10-31 08:53:27 +13:00
let wrapper = document.createElement("div");
2020-05-13 08:15:36 +12:00
let child = document.createElement("canvas");
let sources = element.getAttribute('data-forms-chart');
2020-07-17 21:49:02 +12:00
let width = element.getAttribute('data-width') || 500;
let height = element.getAttribute('data-height') || 175;
2021-11-12 22:47:39 +13:00
let showXAxis = element.getAttribute('data-show-x-axis') || false;
let showYAxis = element.getAttribute('data-show-y-axis') || false;
2020-10-31 08:53:27 +13:00
let colors = (element.getAttribute('data-colors') || 'blue,green,orange,red').split(',');
2021-11-19 01:10:02 +13:00
let themes = { 'blue': '#29b5d9', 'green': '#4eb55b', 'orange': '#fba233', 'red': '#dc3232', 'create': '#00b680', 'read': '#009cde', 'update': '#696fd7', 'delete': '#da5d95', };
let range = { '24h': 'H:i', '7d': 'd F Y', '30d': 'd F Y', '90d': 'd F Y' }
2021-11-18 18:39:21 +13:00
let ticksCount = 5;
2020-05-13 08:15:36 +12:00
2020-10-31 08:53:27 +13:00
element.parentNode.insertBefore(wrapper, element.nextSibling);
wrapper.classList.add('content');
2021-11-19 01:10:02 +13:00
2020-07-17 21:49:02 +12:00
child.width = width;
child.height = height;
2020-05-13 08:15:36 +12:00
2020-10-31 08:53:27 +13:00
sources = sources.split(',');
wrapper.appendChild(child);
let chart = null;
2021-11-19 01:10:02 +13:00
let check = function () {
2020-10-31 08:53:27 +13:00
let config = {
type: "line",
data: {
labels: [],
datasets: []
2020-05-13 08:15:36 +12:00
},
2020-10-31 08:53:27 +13:00
options: {
2021-12-16 23:27:19 +13:00
animation: {
duration: 0
},
2020-10-31 08:53:27 +13:00
responsive: true,
hover: {
mode: "nearest",
2021-11-19 01:10:02 +13:00
intersect: false
2020-10-31 08:53:27 +13:00
},
scales: {
2021-10-22 02:12:01 +13:00
x: {
2021-11-15 19:04:43 +13:00
display: showXAxis
2021-10-22 02:12:01 +13:00
},
y: {
2021-11-15 19:04:43 +13:00
display: showYAxis,
2021-11-18 18:39:21 +13:00
min: 0,
2021-11-15 19:04:43 +13:00
ticks: {
2021-11-18 18:39:21 +13:00
count: ticksCount,
2021-11-19 01:10:02 +13:00
fontColor: "#8f8f8f"
2021-11-15 19:04:43 +13:00
},
2021-10-22 02:12:01 +13:00
}
},
plugins: {
title: {
display: false,
text: "Stats"
},
legend: {
display: false
},
2021-11-19 18:47:02 +13:00
tooltip: {
mode: "index",
intersect: false,
caretPadding: 0
},
2020-10-31 08:53:27 +13:00
}
2020-05-13 08:15:36 +12:00
}
2020-10-31 08:53:27 +13:00
};
2020-05-13 08:15:36 +12:00
2021-11-18 18:39:21 +13:00
let highest = 0;
2020-10-31 08:53:27 +13:00
for (let i = 0; i < sources.length; i++) {
let label = sources[i].substring(0, sources[i].indexOf('='));
let path = sources[i].substring(sources[i].indexOf('=') + 1);
2021-11-09 22:24:06 +13:00
let usage = container.get('usage');
let data = usage[path];
2020-10-31 08:53:27 +13:00
let value = JSON.parse(element.value);
2020-05-13 08:15:36 +12:00
2020-10-31 08:53:27 +13:00
config.data.labels[i] = label;
config.data.datasets[i] = {};
config.data.datasets[i].label = label;
config.data.datasets[i].borderColor = themes[colors[i]];
config.data.datasets[i].backgroundColor = themes[colors[i]] + '36';
config.data.datasets[i].borderWidth = 2;
config.data.datasets[i].data = [0, 0, 0, 0, 0, 0, 0];
config.data.datasets[i].fill = true;
2020-05-13 08:15:36 +12:00
2021-11-19 01:10:02 +13:00
if (!data) {
2020-10-31 08:53:27 +13:00
return;
}
2020-05-13 08:15:36 +12:00
2021-11-12 22:54:43 +13:00
let dateFormat = (value.range && range[value.range]) ? range[value.range] : 'd F Y';
2021-11-19 01:10:02 +13:00
2020-10-31 08:53:27 +13:00
for (let x = 0; x < data.length; x++) {
2021-11-18 18:39:21 +13:00
if(data[x].value > highest) {
highest = data[x].value;
}
2020-10-31 08:53:27 +13:00
config.data.datasets[i].data[x] = data[x].value;
config.data.labels[x] = date.format(dateFormat, data[x].date);
}
2020-05-13 08:15:36 +12:00
}
2021-11-18 18:39:21 +13:00
if(highest == 0) {
config.options.scales.y.ticks.stepSize = 1;
config.options.scales.y.max = ticksCount;
} else {
// ceiling of the highest value
highest = Math.ceil(highest / ticksCount) * ticksCount;
config.options.scales.y.ticks.stepSize = highest / ticksCount;
config.options.scales.y.max = highest;
}
2020-05-13 08:15:36 +12:00
2020-10-31 08:53:27 +13:00
if(chart) {
chart.destroy();
2020-05-13 08:15:36 +12:00
}
2020-10-31 08:53:27 +13:00
else {
}
chart = new Chart(child.getContext("2d"), config);
wrapper.dataset["canvas"] = true;
}
2020-05-13 08:15:36 +12:00
2020-10-31 08:53:27 +13:00
check();
2020-05-13 08:15:36 +12:00
2020-10-31 08:53:27 +13:00
element.addEventListener('change', check);
2020-05-13 08:15:36 +12:00
}
});
2021-11-18 23:33:42 +13:00
})(window);