feat(cloudron): add tirreno package artifacts
- Add CloudronStack/output/CloudronPackages-Artifacts/tirreno/ directory and its contents - Includes package manifest, Dockerfile, source code, documentation, and build artifacts - Add tirreno-1761840148.tar.gz as a build artifact - Add tirreno-cloudron-package-1761841304.tar.gz as the Cloudron package - Include all necessary files for the tirreno Cloudron package This adds the complete tirreno Cloudron package artifacts to the repository.
This commit is contained in:
@@ -0,0 +1,210 @@
|
||||
import {BaseChart} from './BaseChart.js?v=2';
|
||||
import {COLOR_MAP} from '../utils/Constants.js?v=2';
|
||||
import {formatIntTimeUtc} from '../utils/Date.js?v=2';
|
||||
import {renderChartTooltipPart} from '../DataRenderers.js?v=2';
|
||||
|
||||
export class BaseBarChart extends BaseChart {
|
||||
getSeries() {
|
||||
return [
|
||||
this.getDaySeries(),
|
||||
{
|
||||
width: -1,
|
||||
paths: uPlot.paths.bars({size: [0.6, 100]}),
|
||||
points: {show: false},
|
||||
},
|
||||
this.getSingleSeries('Regular events', 'green'),
|
||||
this.getSingleSeries('Warning events', 'yellow'),
|
||||
this.getSingleSeries('Alert events', 'red'),
|
||||
];
|
||||
}
|
||||
|
||||
getSingleSeries(label, color) {
|
||||
return {
|
||||
label: label,
|
||||
width: -1,
|
||||
drawStyle: 1,
|
||||
fill: COLOR_MAP[color].main,
|
||||
stroke: COLOR_MAP[color].main,
|
||||
paths: uPlot.paths.bars({size: [0.6, 100]}),
|
||||
points: {show: false},
|
||||
};
|
||||
}
|
||||
|
||||
// dataset adaption for bands instead of regular bars
|
||||
getData(data) {
|
||||
let stacked = [data[0]];
|
||||
let sums = new Array(data[0].length).fill(0);
|
||||
|
||||
stacked.push(new Array(data[0].length).fill(0));
|
||||
|
||||
let maxLvl = data.length - 1;
|
||||
|
||||
for (let i = 1; i < data.length; i++) {
|
||||
let series = [];
|
||||
for (let j = 0; j < data[0].length; j++) {
|
||||
sums[j] += +data[i][j];
|
||||
series.push(sums[j]);
|
||||
}
|
||||
stacked.push(series);
|
||||
}
|
||||
|
||||
maxLvl = data.length;
|
||||
|
||||
for (let i = 0; i < data[0].length; i++) {
|
||||
let topMet = false;
|
||||
for (let j = maxLvl; j > 1; j--) {
|
||||
if (stacked[j][i] <= stacked[j-1][i] && !topMet) {
|
||||
stacked[j][i] = null;
|
||||
} else {
|
||||
topMet = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
this.data = stacked;
|
||||
|
||||
return stacked;
|
||||
}
|
||||
|
||||
stack(data, omit) {
|
||||
let data2 = [];
|
||||
let bands = [];
|
||||
let d0Len = data ? data[0].length : 0;
|
||||
let accum = Array(d0Len);
|
||||
|
||||
let i;
|
||||
|
||||
for (i = 0; i < d0Len; i++) {
|
||||
accum[i] = 0;
|
||||
}
|
||||
|
||||
let el;
|
||||
|
||||
for (i = 1; i < data.length; i++) {
|
||||
el = data[i];
|
||||
|
||||
if (!omit(i)) {
|
||||
el = el.map((v, j) => {
|
||||
let val = accum[j] + +v;
|
||||
accum[j] = val;
|
||||
|
||||
return val;
|
||||
});
|
||||
}
|
||||
|
||||
data2.push(el);
|
||||
}
|
||||
|
||||
for (i = 1; i < data.length; i++) {
|
||||
!omit(i) && bands.push({
|
||||
series: [
|
||||
data.findIndex((s, j) => j > i && !omit(j)),
|
||||
i,
|
||||
],
|
||||
});
|
||||
}
|
||||
|
||||
bands = bands.filter(b => b.series[1] > -1);
|
||||
|
||||
return {
|
||||
data: [data[0]].concat(data2),
|
||||
bands,
|
||||
};
|
||||
}
|
||||
|
||||
getOptions(resolution = 'day', nullChar = '0') {
|
||||
const opts = super.getOptions(resolution, nullChar);
|
||||
|
||||
let stacked = this.stack(this.data, i => false);
|
||||
|
||||
opts.bands = stacked.bands;
|
||||
|
||||
opts.series.forEach((s, sIdx) => {
|
||||
if (s) {
|
||||
s.value = (u, v, si, i) => u.data[sIdx][i];
|
||||
|
||||
s.points = s.points || {};
|
||||
s.points.filter = (u, seriesIdx, show, gaps) => {
|
||||
if (show) {
|
||||
let pts = [];
|
||||
u.data[seriesIdx].forEach((v, i) => {
|
||||
v != null && pts.push(i);
|
||||
});
|
||||
return pts;
|
||||
}
|
||||
};
|
||||
}
|
||||
});
|
||||
|
||||
return opts;
|
||||
}
|
||||
|
||||
tooltipCursor(u, seriestt, opts, resolution, defaultVal) {
|
||||
const left = u.cursor.left;
|
||||
const idx = u.cursor.idx;
|
||||
const col = [];
|
||||
|
||||
if (opts && opts.cursorMemo) {
|
||||
opts.cursorMemo.set(left, top);
|
||||
}
|
||||
|
||||
seriestt.style.display = 'none';
|
||||
|
||||
if (left >= 0 && u.data) {
|
||||
let xVal = u.data[0][idx];
|
||||
|
||||
let maxLvl = u.data.length - 1;
|
||||
|
||||
for (let i = 0; i <= maxLvl; i++) {
|
||||
col.push(u.data[i][idx]);
|
||||
}
|
||||
|
||||
const vtp = (resolution === 'day') ? 'DAY' : ((resolution === 'hour') ? 'HOUR' : 'MINUTE');
|
||||
let ts = '';
|
||||
|
||||
if (Number.isInteger(xVal)) {
|
||||
const useTime = resolution === 'hour' || resolution === 'minute';
|
||||
ts = formatIntTimeUtc(xVal * 1000, useTime);
|
||||
}
|
||||
|
||||
let frag = document.createDocumentFragment();
|
||||
frag.appendChild(document.createTextNode(ts.replace(/\./g, '/')));
|
||||
|
||||
let prev = null;
|
||||
|
||||
let maxVal = 0;
|
||||
let maxIdx = 0;
|
||||
|
||||
for (let i = maxLvl; i >= 1; i--) {
|
||||
if (col[i] === null) {
|
||||
col[i] = 0;
|
||||
} else {
|
||||
if (maxVal < col[i]) {
|
||||
maxVal = col[i];
|
||||
maxIdx = i;
|
||||
}
|
||||
|
||||
if (prev !== null) {
|
||||
col[prev] -= col[i];
|
||||
}
|
||||
|
||||
prev = i;
|
||||
}
|
||||
}
|
||||
|
||||
for (let i = 2; i <= maxLvl; i++) {
|
||||
frag = this.extendTooltipFragment(i, null, col, defaultVal, u, frag);
|
||||
}
|
||||
|
||||
if (frag.children.length > 1) {
|
||||
seriestt.replaceChildren(frag);
|
||||
|
||||
seriestt.style.top = Math.round(u.valToPos(maxVal, u.series[maxIdx].scale)) + 'px';
|
||||
seriestt.style.left = Math.round(u.valToPos(xVal, vtp)) + 'px';
|
||||
seriestt.style.display = null;
|
||||
}
|
||||
}
|
||||
|
||||
return [seriestt, opts];
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user