UNPKG

ng-prime-tools

Version:

An advanced PrimeNG table for Angular

153 lines 18.3 kB
import { Component, Input, ViewChild, } from '@angular/core'; import { Chart, registerables, } from 'chart.js'; import ChartDataLabels from 'chartjs-plugin-datalabels'; import * as i0 from "@angular/core"; export class PTChartComparisonComponent { constructor() { this.medianTitle = 'Médiane'; this.xAxisTitle = 'Time'; this.yAxisTitle = 'Value'; // Chart dimension inputs this.chartHeight = '400px'; this.chartWidth = '1200px'; Chart.register(...registerables, ChartDataLabels); } ngOnInit() { this.initializeChart(); } ngOnDestroy() { this.destroyChart(); } /** * Initializes the chart with median and datasets */ initializeChart() { const canvas = this.canvasRef.nativeElement; this.destroyChart(); const config = { type: this.chartConfig.type || 'line', data: this.getFormattedChartData(), // Get data with median options: this.getChartOptions(), }; this.chart = new Chart(canvas, config); } /** * Computes median values and adds them to the dataset */ getFormattedChartData() { const medianValues = this.calculateMedian(); return { labels: this.chartConfig.data.labels, datasets: [ // Add median line dataset { label: this.medianTitle || 'Médiane', data: medianValues, borderColor: '#0000FF', // Blue color borderWidth: 2, backgroundColor: 'transparent', pointRadius: 0, fill: false, tension: 0.1, borderDash: [5, 5], // Dashed line }, // Keep existing datasets ...this.chartConfig.data.datasets, ], }; } /** * Computes median values from all datasets at each time point */ calculateMedian() { const datasets = this.chartConfig.data.datasets; return this.chartConfig.data.labels.map((_, index) => { const valuesAtTime = datasets .map((dataset) => dataset.data[index]) .filter((val) => val !== undefined); if (valuesAtTime.length === 0) return 0; valuesAtTime.sort((a, b) => a - b); const middle = Math.floor(valuesAtTime.length / 2); return valuesAtTime.length % 2 === 0 ? (valuesAtTime[middle - 1] + valuesAtTime[middle]) / 2 : valuesAtTime[middle]; }); } /** * Defines chart options including Y-axis scaling */ getChartOptions() { return { responsive: true, maintainAspectRatio: false, plugins: { legend: { display: true, position: 'top' }, tooltip: { mode: 'index', intersect: false }, }, scales: { x: { title: { display: true, text: this.chartConfig.xAxisTitle || 'Time' }, ticks: { font: { size: 12 } }, }, y: { title: { display: true, text: this.chartConfig.yAxisTitle || 'Value', }, min: this.chartConfig.scales?.y?.min, max: this.chartConfig.scales?.y?.max, ticks: { stepSize: this.chartConfig.scales?.y?.ticks?.stepSize, font: { size: 16, weight: 'bold' }, color: '#333', }, grid: { color: 'rgba(0,0,0,0.1)', }, border: { display: true, color: '#000', }, }, }, }; } /** * Destroys the existing chart instance if present */ destroyChart() { if (this.chart) { this.chart.destroy(); this.chart = undefined; } } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: PTChartComparisonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.11", type: PTChartComparisonComponent, selector: "pt-chart-comparison", inputs: { chartConfig: "chartConfig", medianTitle: "medianTitle", xAxisTitle: "xAxisTitle", yAxisTitle: "yAxisTitle", yMin: "yMin", yMax: "yMax", yStepSize: "yStepSize", chartHeight: "chartHeight", chartWidth: "chartWidth" }, viewQueries: [{ propertyName: "canvasRef", first: true, predicate: ["chartCanvas"], descendants: true, static: true }], ngImport: i0, template: "<div class=\"chart-scroll-container\">\n <div\n class=\"chart-inner\"\n [style.width]=\"chartConfig.chartWidth || '1200px'\"\n [style.height]=\"chartConfig.chartHeight || '400px'\"\n >\n <canvas #chartCanvas></canvas>\n </div>\n</div>\n", styles: [".chart-scroll-container{width:100%;overflow-x:auto;white-space:nowrap;padding-bottom:10px}.chart-inner{display:inline-block}\n"] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: PTChartComparisonComponent, decorators: [{ type: Component, args: [{ selector: 'pt-chart-comparison', template: "<div class=\"chart-scroll-container\">\n <div\n class=\"chart-inner\"\n [style.width]=\"chartConfig.chartWidth || '1200px'\"\n [style.height]=\"chartConfig.chartHeight || '400px'\"\n >\n <canvas #chartCanvas></canvas>\n </div>\n</div>\n", styles: [".chart-scroll-container{width:100%;overflow-x:auto;white-space:nowrap;padding-bottom:10px}.chart-inner{display:inline-block}\n"] }] }], ctorParameters: () => [], propDecorators: { chartConfig: [{ type: Input }], medianTitle: [{ type: Input }], xAxisTitle: [{ type: Input }], yAxisTitle: [{ type: Input }], yMin: [{ type: Input }], yMax: [{ type: Input }], yStepSize: [{ type: Input }], chartHeight: [{ type: Input }], chartWidth: [{ type: Input }], canvasRef: [{ type: ViewChild, args: ['chartCanvas', { static: true }] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHQtY2hhcnQtY29tcGFyaXNvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1wcmltZS10b29scy9zcmMvbGliL3B0LWNoYXJ0LWNvbXBhcmlzb24vcHQtY2hhcnQtY29tcGFyaXNvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1wcmltZS10b29scy9zcmMvbGliL3B0LWNoYXJ0LWNvbXBhcmlzb24vcHQtY2hhcnQtY29tcGFyaXNvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFHTCxTQUFTLEdBRVYsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUNMLEtBQUssRUFFTCxhQUFhLEdBR2QsTUFBTSxVQUFVLENBQUM7QUFDbEIsT0FBTyxlQUFlLE1BQU0sMkJBQTJCLENBQUM7O0FBUXhELE1BQU0sT0FBTywwQkFBMEI7SUFvQnJDO1FBbEJTLGdCQUFXLEdBQVcsU0FBUyxDQUFDO1FBQ2hDLGVBQVUsR0FBVyxNQUFNLENBQUM7UUFDNUIsZUFBVSxHQUFXLE9BQU8sQ0FBQztRQU90Qyx5QkFBeUI7UUFDaEIsZ0JBQVcsR0FBVyxPQUFPLENBQUM7UUFDOUIsZUFBVSxHQUFXLFFBQVEsQ0FBQztRQVFyQyxLQUFLLENBQUMsUUFBUSxDQUFDLEdBQUcsYUFBYSxFQUFFLGVBQWUsQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRCxRQUFRO1FBQ04sSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFFRDs7T0FFRztJQUNLLGVBQWU7UUFDckIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUM7UUFDNUMsSUFBSSxDQUFDLFlBQVksRUFBRSxD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RkRjYSwwQkFBMEI7a0JBTHRDLFNBQVM7K0JBQ0UscUJBQXFCO3dEQUt0QixXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUdHLElBQUk7c0JBQVosS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFHRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBR04sU0FBUztzQkFEUixTQUFTO3VCQUFDLGFBQWEsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIElucHV0LFxuICBPbkluaXQsXG4gIE9uRGVzdHJveSxcbiAgVmlld0NoaWxkLFxuICBFbGVtZW50UmVmLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIENoYXJ0LFxuICBDaGFydENvbmZpZ3VyYXRpb24sXG4gIHJlZ2lzdGVyYWJsZXMsXG4gIENoYXJ0RGF0YSxcbiAgQ2hhcnRPcHRpb25zLFxufSBmcm9tICdjaGFydC5qcyc7XG5pbXBvcnQgQ2hhcnREYXRhTGFiZWxzIGZyb20gJ2NoYXJ0anMtcGx1Z2luLWRhdGFsYWJlbHMnO1xuaW1wb3J0IHsgQ2hhcnRDb25maWcsIERhdGFzZXQgfSBmcm9tICcuLi9tb2RlbHMvY2hhcnQtY29uZmlnLm1vZGVsJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAncHQtY2hhcnQtY29tcGFyaXNvbicsXG4gIHRlbXBsYXRlVXJsOiAnLi9wdC1jaGFydC1jb21wYXJpc29uLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vcHQtY2hhcnQtY29tcGFyaXNvbi5jb21wb25lbnQuY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIFBUQ2hhcnRDb21wYXJpc29uQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBASW5wdXQoKSBjaGFydENvbmZpZyE6IENoYXJ0Q29uZmlnO1xuICBASW5wdXQoKSBtZWRpYW5UaXRsZTogc3RyaW5nID0gJ03DqWRpYW5lJztcbiAgQElucHV0KCkgeEF4aXNUaXRsZTogc3RyaW5nID0gJ1RpbWUnO1xuICBASW5wdXQoKSB5QXhpc1RpdGxlOiBzdHJpbmcgPSAnVmFsdWUnO1xuXG4gIC8vIFktQXhpcyBtYW51YWwgaW5wdXRzXG4gIEBJbnB1dCgpIHlNaW4hOiBudW1iZXI7XG4gIEBJbnB1dCgpIHlNYXghOiBudW1iZXI7XG4gIEBJbnB1dCgpIHlTdGVwU2l6ZSE6IG51bWJlcjtcblxuICAvLyBDaGFydCBkaW1lbnNpb24gaW5wdXRzXG4gIEBJbnB1dCgpIGNoYXJ0SGVpZ2h0OiBzdHJpbmcgPSAnNDAwcHgnO1xuICBASW5wdXQoKSBjaGFydFdpZHRoOiBzdHJpbmcgPSAnMTIwMHB4JztcblxuICBAVmlld0NoaWxkKCdjaGFydENhbnZhcycsIHsgc3RhdGljOiB0cnVlIH0pXG4gIGNhbnZhc1JlZiE6IEVsZW1lbnRSZWY8SFRNTENhbnZhc0VsZW1lbnQ+O1xuXG4gIHByaXZhdGUgY2hhcnQhOiBDaGFydDtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBDaGFydC5yZWdpc3RlciguLi5yZWdpc3RlcmFibGVzLCBDaGFydERhdGFMYWJlbHMpO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5pbml0aWFsaXplQ2hhcnQoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuZGVzdHJveUNoYXJ0KCk7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZXMgdGhlIGNoYXJ0IHdpdGggbWVkaWFuIGFuZCBkYXRhc2V0c1xuICAgKi9cbiAgcHJpdmF0ZSBpbml0aWFsaXplQ2hhcnQoKSB7XG4gICAgY29uc3QgY2FudmFzID0gdGhpcy5jYW52YXNSZWYubmF0aXZlRWxlbWVudDtcbiAgICB0aGlzLmRlc3Ryb3lDaGFydCgpO1xuXG4gICAgY29uc3QgY29uZmlnOiBDaGFydENvbmZpZ3VyYXRpb24gPSB7XG4gICAgICB0eXBlOiB0aGlzLmNoYXJ0Q29uZmlnLnR5cGUgfHwgJ2xpbmUnLFxuICAgICAgZGF0YTogdGhpcy5nZXRGb3JtYXR0ZWRDaGFydERhdGEoKSwgLy8gR2V0IGRhdGEgd2l0aCBtZWRpYW5cbiAgICAgIG9wdGlvbnM6IHRoaXMuZ2V0Q2hhcnRPcHRpb25zKCksXG4gICAgfTtcblxuICAgIHRoaXMuY2hhcnQgPSBuZXcgQ2hhcnQoY2FudmFzLCBjb25maWcpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbXB1dGVzIG1lZGlhbiB2YWx1ZXMgYW5kIGFkZHMgdGhlbSB0byB0aGUgZGF0YXNldFxuICAgKi9cbiAgcHJpdmF0ZSBnZXRGb3JtYXR0ZWRDaGFydERhdGEoKTogQ2hhcnREYXRhIHtcbiAgICBjb25zdCBtZWRpYW5WYWx1ZXMgPSB0aGlzLmNhbGN1bGF0ZU1lZGlhbigpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGxhYmVsczogdGhpcy5jaGFydENvbmZpZy5kYXRhLmxhYmVscyxcbiAgICAgIGRhdGFzZXRzOiBbXG4gICAgICAgIC8vIEFkZCBtZWRpYW4gbGluZSBkYXRhc2V0XG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogdGhpcy5tZWRpYW5UaXRsZSB8fCAnTcOpZGlhbmUnLFxuICAgICAgICAgIGRhdGE6IG1lZGlhblZhbHVlcyxcbiAgICAgICAgICBib3JkZXJDb2xvcjogJyMwMDAwRkYnLCAvLyBCbHVlIGNvbG9yXG4gICAgICAgICAgYm9yZGVyV2lkdGg6IDIsXG4gICAgICAgICAgYmFja2dyb3VuZENvbG9yOiAndHJhbnNwYXJlbnQnLFxuICAgICAgICAgIHBvaW50UmFkaXVzOiAwLFxuICAgICAgICAgIGZpbGw6IGZhbHNlLFxuICAgICAgICAgIHRlbnNpb246IDAuMSxcbiAgICAgICAgICBib3JkZXJEYXNoOiBbNSwgNV0sIC8vIERhc2hlZCBsaW5lXG4gICAgICAgIH0sXG4gICAgICAgIC8vIEtlZXAgZXhpc3RpbmcgZGF0YXNldHNcbiAgICAgICAgLi4uKHRoaXMuY2hhcnRDb25maWcuZGF0YS5kYXRhc2V0cyBhcyBEYXRhc2V0W10pLFxuICAgICAgXSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbXB1dGVzIG1lZGlhbiB2YWx1ZXMgZnJvbSBhbGwgZGF0YXNldHMgYXQgZWFjaCB0aW1lIHBvaW50XG4gICAqL1xuICBwcml2YXRlIGNhbGN1bGF0ZU1lZGlhbigpOiBudW1iZXJbXSB7XG4gICAgY29uc3QgZGF0YXNldHMgPSB0aGlzLmNoYXJ0Q29uZmlnLmRhdGEuZGF0YXNldHMgYXMgRGF0YXNldFtdO1xuXG4gICAgcmV0dXJuIHRoaXMuY2hhcnRDb25maWcuZGF0YS5sYWJlbHMhLm1hcCgoXywgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlc0F0VGltZSA9IGRhdGFzZXRzXG4gICAgICAgIC5tYXAoKGRhdGFzZXQpID0+IGRhdGFzZXQuZGF0YVtpbmRleF0pXG4gICAgICAgIC5maWx0ZXIoKHZhbCkgPT4gdmFsICE9PSB1bmRlZmluZWQpO1xuXG4gICAgICBpZiAodmFsdWVzQXRUaW1lLmxlbmd0aCA9PT0gMCkgcmV0dXJuIDA7XG5cbiAgICAgIHZhbHVlc0F0VGltZS5zb3J0KChhLCBiKSA9PiBhIC0gYik7XG4gICAgICBjb25zdCBtaWRkbGUgPSBNYXRoLmZsb29yKHZhbHVlc0F0VGltZS5sZW5ndGggLyAyKTtcblxuICAgICAgcmV0dXJuIHZhbHVlc0F0VGltZS5sZW5ndGggJSAyID09PSAwXG4gICAgICAgID8gKHZhbHVlc0F0VGltZVttaWRkbGUgLSAxXSArIHZhbHVlc0F0VGltZVttaWRkbGVdKSAvIDJcbiAgICAgICAgOiB2YWx1ZXNBdFRpbWVbbWlkZGxlXTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWZpbmVzIGNoYXJ0IG9wdGlvbnMgaW5jbHVkaW5nIFktYXhpcyBzY2FsaW5nXG4gICAqL1xuICBwcml2YXRlIGdldENoYXJ0T3B0aW9ucygpOiBDaGFydE9wdGlvbnMge1xuICAgIHJldHVybiB7XG4gICAgICByZXNwb25zaXZlOiB0cnVlLFxuICAgICAgbWFpbnRhaW5Bc3BlY3RSYXRpbzogZmFsc2UsXG4gICAgICBwbHVnaW5zOiB7XG4gICAgICAgIGxlZ2VuZDogeyBkaXNwbGF5OiB0cnVlLCBwb3NpdGlvbjogJ3RvcCcgfSxcbiAgICAgICAgdG9vbHRpcDogeyBtb2RlOiAnaW5kZXgnLCBpbnRlcnNlY3Q6IGZhbHNlIH0sXG4gICAgICB9LFxuICAgICAgc2NhbGVzOiB7XG4gICAgICAgIHg6IHtcbiAgICAgICAgICB0aXRsZTogeyBkaXNwbGF5OiB0cnVlLCB0ZXh0OiB0aGlzLmNoYXJ0Q29uZmlnLnhBeGlzVGl0bGUgfHwgJ1RpbWUnIH0sXG4gICAgICAgICAgdGlja3M6IHsgZm9udDogeyBzaXplOiAxMiB9IH0sXG4gICAgICAgIH0sXG4gICAgICAgIHk6IHtcbiAgICAgICAgICB0aXRsZToge1xuICAgICAgICAgICAgZGlzcGxheTogdHJ1ZSxcbiAgICAgICAgICAgIHRleHQ6IHRoaXMuY2hhcnRDb25maWcueUF4aXNUaXRsZSB8fCAnVmFsdWUnLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgbWluOiB0aGlzLmNoYXJ0Q29uZmlnLnNjYWxlcz8ueT8ubWluLFxuICAgICAgICAgIG1heDogdGhpcy5jaGFydENvbmZpZy5zY2FsZXM/Lnk/Lm1heCxcbiAgICAgICAgICB0aWNrczoge1xuICAgICAgICAgICAgc3RlcFNpemU6IHRoaXMuY2hhcnRDb25maWcuc2NhbGVzPy55Py50aWNrcz8uc3RlcFNpemUsXG4gICAgICAgICAgICBmb250OiB7IHNpemU6IDE2LCB3ZWlnaHQ6ICdib2xkJyB9LFxuICAgICAgICAgICAgY29sb3I6ICcjMzMzJyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGdyaWQ6IHtcbiAgICAgICAgICAgIGNvbG9yOiAncmdiYSgwLDAsMCwwLjEpJyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGJvcmRlcjoge1xuICAgICAgICAgICAgZGlzcGxheTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbG9yOiAnIzAwMCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXN0cm95cyB0aGUgZXhpc3RpbmcgY2hhcnQgaW5zdGFuY2UgaWYgcHJlc2VudFxuICAgKi9cbiAgcHJpdmF0ZSBkZXN0cm95Q2hhcnQoKSB7XG4gICAgaWYgKHRoaXMuY2hhcnQpIHtcbiAgICAgIHRoaXMuY2hhcnQuZGVzdHJveSgpO1xuICAgICAgdGhpcy5jaGFydCA9IHVuZGVmaW5lZCBhcyBhbnk7XG4gICAgfVxuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiY2hhcnQtc2Nyb2xsLWNvbnRhaW5lclwiPlxuICA8ZGl2XG4gICAgY2xhc3M9XCJjaGFydC1pbm5lclwiXG4gICAgW3N0eWxlLndpZHRoXT1cImNoYXJ0Q29uZmlnLmNoYXJ0V2lkdGggfHwgJzEyMDBweCdcIlxuICAgIFtzdHlsZS5oZWlnaHRdPVwiY2hhcnRDb25maWcuY2hhcnRIZWlnaHQgfHwgJzQwMHB4J1wiXG4gID5cbiAgICA8Y2FudmFzICNjaGFydENhbnZhcz48L2NhbnZhcz5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==