web/admin: rewrite overview page
Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org>
This commit is contained in:
		@ -1,8 +1,15 @@
 | 
			
		||||
import { css, CSSResult, html, LitElement, TemplateResult } from "lit-element";
 | 
			
		||||
import { Chart, ChartDataset, Tick, LineController, TimeScale, LinearScale, BarController, BarElement, ChartConfiguration, Legend, ChartData } from "chart.js";
 | 
			
		||||
import { css, CSSResult, html, LitElement, property, TemplateResult } from "lit-element";
 | 
			
		||||
import { Chart, Plugin, Tick, ChartConfiguration, ChartData, ChartOptions } from "chart.js";
 | 
			
		||||
import { Legend, Tooltip } from "chart.js";
 | 
			
		||||
import { DoughnutController, LineController, BarController } from "chart.js";
 | 
			
		||||
import { ArcElement, BarElement } from "chart.js";
 | 
			
		||||
import { TimeScale, LinearScale } from "chart.js";
 | 
			
		||||
import "chartjs-adapter-moment";
 | 
			
		||||
 | 
			
		||||
Chart.register(LineController, TimeScale, LinearScale, BarController, BarElement, Legend);
 | 
			
		||||
Chart.register(Legend, Tooltip);
 | 
			
		||||
Chart.register(LineController, BarController, DoughnutController);
 | 
			
		||||
Chart.register(ArcElement, BarElement);
 | 
			
		||||
Chart.register(TimeScale, LinearScale);
 | 
			
		||||
 | 
			
		||||
export abstract class AKChart<T> extends LitElement {
 | 
			
		||||
 | 
			
		||||
@ -11,14 +18,13 @@ export abstract class AKChart<T> extends LitElement {
 | 
			
		||||
 | 
			
		||||
    chart?: Chart;
 | 
			
		||||
 | 
			
		||||
    @property()
 | 
			
		||||
    centerText?: string;
 | 
			
		||||
 | 
			
		||||
    static get styles(): CSSResult[] {
 | 
			
		||||
        return [css`
 | 
			
		||||
            :host {
 | 
			
		||||
                position: relative;
 | 
			
		||||
            .container {
 | 
			
		||||
                height: 100%;
 | 
			
		||||
                width: 100%;
 | 
			
		||||
                display: block;
 | 
			
		||||
                min-height: 25rem;
 | 
			
		||||
            }
 | 
			
		||||
            canvas {
 | 
			
		||||
                width: 100px;
 | 
			
		||||
@ -36,46 +42,79 @@ export abstract class AKChart<T> extends LitElement {
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    getChartType(): string {
 | 
			
		||||
        return "bar";
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    getPlugins(): Plugin[] {
 | 
			
		||||
        return [
 | 
			
		||||
            {
 | 
			
		||||
                id: "center-text",
 | 
			
		||||
                beforeDraw: (chart) => {
 | 
			
		||||
                    if (!chart.ctx) return;
 | 
			
		||||
                    if (!this.centerText) return;
 | 
			
		||||
                    const width = chart.width || 0;
 | 
			
		||||
                    const height = chart.height || 0;
 | 
			
		||||
 | 
			
		||||
                    const fontSize = (height / 114).toFixed(2);
 | 
			
		||||
                    chart.ctx.font = fontSize + "em RedHatText, Overpass, overpass, helvetica, arial, sans-serif";
 | 
			
		||||
                    chart.ctx.textBaseline = "middle";
 | 
			
		||||
 | 
			
		||||
                    const textX = Math.round((width - chart.ctx.measureText(this.centerText).width) / 2);
 | 
			
		||||
                    const textY = height / 2;
 | 
			
		||||
 | 
			
		||||
                    chart.ctx.fillText(this.centerText, textX, textY);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        ];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    getOptions(): ChartOptions {
 | 
			
		||||
        return {
 | 
			
		||||
            maintainAspectRatio: false,
 | 
			
		||||
            scales: {
 | 
			
		||||
                x: {
 | 
			
		||||
                    type: "time",
 | 
			
		||||
                    display: true,
 | 
			
		||||
                    ticks: {
 | 
			
		||||
                        callback: function (tickValue: string | number, index: number, ticks: Tick[]): string {
 | 
			
		||||
                            const valueStamp = (ticks[index]);
 | 
			
		||||
                            const delta = Date.now() - valueStamp.value;
 | 
			
		||||
                            const ago = Math.round(delta / 1000 / 3600);
 | 
			
		||||
                            return `${ago} Hours ago`;
 | 
			
		||||
                        },
 | 
			
		||||
                        autoSkip: true,
 | 
			
		||||
                        maxTicksLimit: 8,
 | 
			
		||||
                    },
 | 
			
		||||
                    stacked: true,
 | 
			
		||||
                    grid: {
 | 
			
		||||
                        color: "rgba(0, 0, 0, 0)",
 | 
			
		||||
                    },
 | 
			
		||||
                    offset: true
 | 
			
		||||
                },
 | 
			
		||||
                y: {
 | 
			
		||||
                    type: "linear",
 | 
			
		||||
                    display: true,
 | 
			
		||||
                    stacked: true,
 | 
			
		||||
                    grid: {
 | 
			
		||||
                        color: "rgba(0, 0, 0, 0)",
 | 
			
		||||
                    },
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
        } as ChartOptions;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    configureChart(data: T, ctx: CanvasRenderingContext2D): Chart {
 | 
			
		||||
        const config = {
 | 
			
		||||
            type: "bar",
 | 
			
		||||
            type: this.getChartType(),
 | 
			
		||||
            data: this.getChartData(data),
 | 
			
		||||
            options: {
 | 
			
		||||
                maintainAspectRatio: false,
 | 
			
		||||
                scales: {
 | 
			
		||||
                    x: {
 | 
			
		||||
                        type: "time",
 | 
			
		||||
                        display: true,
 | 
			
		||||
                        ticks: {
 | 
			
		||||
                            callback: function (tickValue: string | number, index: number, ticks: Tick[]): string {
 | 
			
		||||
                                const valueStamp = (ticks[index]);
 | 
			
		||||
                                const delta = Date.now() - valueStamp.value;
 | 
			
		||||
                                const ago = Math.round(delta / 1000 / 3600);
 | 
			
		||||
                                return `${ago} Hours ago`;
 | 
			
		||||
                            },
 | 
			
		||||
                            autoSkip: true,
 | 
			
		||||
                            maxTicksLimit: 8,
 | 
			
		||||
                        },
 | 
			
		||||
                        stacked: true,
 | 
			
		||||
                        grid: {
 | 
			
		||||
                            color: "rgba(0, 0, 0, 0)",
 | 
			
		||||
                        },
 | 
			
		||||
                        offset: true
 | 
			
		||||
                    },
 | 
			
		||||
                    y: {
 | 
			
		||||
                        type: "linear",
 | 
			
		||||
                        display: true,
 | 
			
		||||
                        stacked: true,
 | 
			
		||||
                        grid: {
 | 
			
		||||
                            color: "rgba(0, 0, 0, 0)",
 | 
			
		||||
                        },
 | 
			
		||||
                    }
 | 
			
		||||
                },
 | 
			
		||||
            },
 | 
			
		||||
            options: this.getOptions(),
 | 
			
		||||
            plugins: this.getPlugins(),
 | 
			
		||||
        };
 | 
			
		||||
        return new Chart(ctx, config as ChartConfiguration);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    firstUpdated(): void {
 | 
			
		||||
        this.apiRequest().then((r) => {
 | 
			
		||||
            const canvas = <HTMLCanvasElement>this.shadowRoot?.querySelector("canvas");
 | 
			
		||||
@ -93,6 +132,10 @@ export abstract class AKChart<T> extends LitElement {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    render(): TemplateResult {
 | 
			
		||||
        return html`<canvas></canvas>`;
 | 
			
		||||
        return html`
 | 
			
		||||
            <div class="container">
 | 
			
		||||
                <canvas></canvas>
 | 
			
		||||
            </div>
 | 
			
		||||
        `;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user