gosora/public/analytics.js
Azareal a1161e20f3 The rest of the Control Panel (exc. the Group Editor) now uses dyntmpl.
Improved the noavatar cacheability by constraining them in a range.
Improved the noavatar cacheability by serving a small subset from Gosora.
Improved the formatting of bytes in the memory analytics pane.
Static resources with checksums will now have their caches expire in a week rather than a day.

Tweaked the padding on the sub_heads on Nox.
Moved a block of CSS out of a template and into panel.css in Tempra Simple and Shadow.

Added the panel_themes_menus_items_suffix phrase.

Added the DisableNoavatarRange config setting.
Added the DisableDefaultNoavatar config setting.
2019-05-03 18:34:18 +10:00

80 lines
2.5 KiB
JavaScript

/*addHook(() => {
})*/
const Kilobyte = 1024;
const Megabyte = Kilobyte * 1024;
const Gigabyte = Megabyte * 1024;
const Terabyte = Gigabyte * 1024;
const Petabyte = Terabyte * 1024;
function convertByteUnit(bytes, places = 0) {
let out;
if(bytes >= Petabyte) out = [bytes / Petabyte, "PB"];
else if(bytes >= Terabyte) out = [bytes / Terabyte, "TB"];
else if(bytes >= Gigabyte) out = [bytes / Gigabyte, "GB"];
else if(bytes >= Megabyte) out = [bytes / Megabyte, "MB"];
else if(bytes >= Kilobyte) out = [bytes / Kilobyte, "KB"];
else out = [bytes,"b"];
if(places==0) return Math.ceil(out[0]) + out[1];
else {
let ex = Math.pow(10, places);
return (Math.round(out[0], ex) / ex) + out[1];
}
}
// TODO: Fully localise this
// TODO: Load rawLabels and seriesData dynamically rather than potentially fiddling with nonces for the CSP?
function buildStatsChart(rawLabels, seriesData, timeRange, legendNames, bytes = false) {
console.log("buildStatsChart");
let labels = [];
let aphrases = phraseBox["analytics"];
if(timeRange=="one-year") {
labels = [aphrases["analytics.now"],"1" + aphrases["analytics.months_short"]];
for(let i = 2; i < 12; i++) {
labels.push(i + aphrases["analytics.months_short"]);
}
} else if(timeRange=="three-months") {
labels = [aphrases["analytics.now"],"3" + aphrases["analytics.days_short"]]
for(let i = 6; i < 90; i = i + 3) {
labels.push(i + aphrases["analytics.days_short"]);
}
} else if(timeRange=="one-month") {
labels = [aphrases["analytics.now"],"1" + aphrases["analytics.days_short"]];
for(let i = 2; i < 30; i++) {
labels.push(i + aphrases["analytics.days_short"]);
}
} else if(timeRange=="one-week") {
labels = [aphrases["analytics.now"]];
for(let i = 2; i < 14; i++) {
if (i%2==0) labels.push("");
else labels.push(Math.floor(i/2) + aphrases["analytics.days"]);
}
} else {
for(const i in rawLabels) {
let date = new Date(rawLabels[i]*1000);
console.log("date: ", date);
let minutes = "0" + date.getMinutes();
let label = date.getHours() + ":" + minutes.substr(-2);
console.log("label:", label);
labels.push(label);
}
}
labels = labels.reverse()
for(let i = 0; i < seriesData.length; i++) {
seriesData[i] = seriesData[i].reverse();
}
let config = {height: '250px', plugins:[]};
if(legendNames.length > 0) config.plugins = [
Chartist.plugins.legend({legendNames: legendNames})
];
if(bytes) config.plugins.push(Chartist.plugins.byteUnits());
Chartist.Line('.ct_chart', {
labels: labels,
series: seriesData,
}, config);
}
runInitHook("analytics_loaded");