ng-prime-tools 1.0.64 → 1.0.65

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -7,7 +7,6 @@ export class PTChartComparisonComponent {
7
7
  this.medianTitle = 'Médiane';
8
8
  this.xAxisTitle = 'Time';
9
9
  this.yAxisTitle = 'Value';
10
- // Chart dimension inputs
11
10
  this.chartHeight = '400px';
12
11
  this.chartWidth = '1200px';
13
12
  Chart.register(...registerables, ChartDataLabels);
@@ -18,53 +17,42 @@ export class PTChartComparisonComponent {
18
17
  ngOnDestroy() {
19
18
  this.destroyChart();
20
19
  }
21
- /**
22
- * Initializes the chart with median and datasets
23
- */
24
20
  initializeChart() {
25
21
  const canvas = this.canvasRef.nativeElement;
26
22
  this.destroyChart();
27
23
  const config = {
28
24
  type: this.chartConfig.type || 'line',
29
- data: this.getFormattedChartData(), // Get data with median
25
+ data: this.getFormattedChartData(),
30
26
  options: this.getChartOptions(),
31
27
  };
32
28
  this.chart = new Chart(canvas, config);
33
29
  }
34
- /**
35
- * Computes median values and adds them to the dataset
36
- */
37
30
  getFormattedChartData() {
38
31
  const medianValues = this.calculateMedian();
39
32
  return {
40
33
  labels: this.chartConfig.data.labels,
41
34
  datasets: [
42
- // Add median line dataset
43
35
  {
44
- label: this.medianTitle || 'Médiane',
36
+ label: this.chartConfig.medianTitle || this.medianTitle || 'Médiane',
45
37
  data: medianValues,
46
- borderColor: '#0000FF', // Blue color
47
- borderWidth: 2,
38
+ borderColor: '#0000FF',
39
+ borderWidth: 3,
48
40
  backgroundColor: 'transparent',
49
41
  pointRadius: 0,
50
42
  fill: false,
51
43
  tension: 0.1,
52
- borderDash: [5, 5], // Dashed line
44
+ borderDash: [], // médiane continue
53
45
  },
54
- // Keep existing datasets
55
46
  ...this.chartConfig.data.datasets,
56
47
  ],
57
48
  };
58
49
  }
59
- /**
60
- * Computes median values from all datasets at each time point
61
- */
62
50
  calculateMedian() {
63
51
  const datasets = this.chartConfig.data.datasets;
64
52
  return this.chartConfig.data.labels.map((_, index) => {
65
53
  const valuesAtTime = datasets
66
54
  .map((dataset) => dataset.data[index])
67
- .filter((val) => val !== undefined);
55
+ .filter((val) => typeof val === 'number' && !Number.isNaN(val));
68
56
  if (valuesAtTime.length === 0)
69
57
  return 0;
70
58
  valuesAtTime.sort((a, b) => a - b);
@@ -74,21 +62,24 @@ export class PTChartComparisonComponent {
74
62
  : valuesAtTime[middle];
75
63
  });
76
64
  }
77
- /**
78
- * Defines chart options including Y-axis scaling
79
- */
80
65
  getChartOptions() {
66
+ const externalOptions = this.chartConfig.options ?? {};
81
67
  return {
82
68
  responsive: true,
83
69
  maintainAspectRatio: false,
84
70
  plugins: {
85
71
  legend: { display: true, position: 'top' },
86
72
  tooltip: { mode: 'index', intersect: false },
73
+ datalabels: {
74
+ display: false, // ✅ supprime les nombres au-dessus des lignes
75
+ },
76
+ ...(externalOptions.plugins ?? {}),
87
77
  },
88
78
  scales: {
89
79
  x: {
90
80
  title: { display: true, text: this.chartConfig.xAxisTitle || 'Time' },
91
81
  ticks: { font: { size: 12 } },
82
+ ...externalOptions.scales?.x,
92
83
  },
93
84
  y: {
94
85
  title: {
@@ -109,13 +100,12 @@ export class PTChartComparisonComponent {
109
100
  display: true,
110
101
  color: '#000',
111
102
  },
103
+ ...externalOptions.scales?.y,
112
104
  },
113
105
  },
106
+ ...externalOptions,
114
107
  };
115
108
  }
116
- /**
117
- * Destroys the existing chart instance if present
118
- */
119
109
  destroyChart() {
120
110
  if (this.chart) {
121
111
  this.chart.destroy();
@@ -150,4 +140,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImpo
150
140
  type: ViewChild,
151
141
  args: ['chartCanvas', { static: true }]
152
142
  }] } });
153
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHQtY2hhcnQtY29tcGFyaXNvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1wcmltZS10b29scy9zcmMvbGliL3B0LWNoYXJ0LWNvbXBhcmlzb24vcHQtY2hhcnQtY29tcGFyaXNvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1wcmltZS10b29scy9zcmMvbGliL3B0LWNoYXJ0LWNvbXBhcmlzb24vcHQtY2hhcnQtY29tcGFyaXNvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFHTCxTQUFTLEdBRVYsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUNMLEtBQUssRUFFTCxhQUFhLEdBR2QsTUFBTSxVQUFVLENBQUM7QUFDbEIsT0FBTyxlQUFlLE1BQU0sMkJBQTJCLENBQUM7O0FBUXhELE1BQU0sT0FBTywwQkFBMEI7SUFvQnJDO1FBbEJTLGdCQUFXLEdBQVcsU0FBUyxDQUFDO1FBQ2hDLGVBQVUsR0FBVyxNQUFNLENBQUM7UUFDNUIsZUFBVSxHQUFXLE9BQU8sQ0FBQztRQU90Qyx5QkFBeUI7UUFDaEIsZ0JBQVcsR0FBVyxPQUFPLENBQUM7UUFDOUIsZUFBVSxHQUFXLFFBQVEsQ0FBQztRQVFyQyxLQUFLLENBQUMsUUFBUSxDQUFDLEdBQUcsYUFBYSxFQUFFLGVBQWUsQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRCxRQUFRO1FBQ04sSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFFRDs7T0FFRztJQUNLLGVBQWU7UUFDckIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUM7UUFDNUMsSUFBSSxDQUFDLFlBQVksRUFBRSxD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RkRjYSwwQkFBMEI7a0JBTHRDLFNBQVM7K0JBQ0UscUJBQXFCO3dEQUt0QixXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUdHLElBQUk7c0JBQVosS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFHRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBR04sU0FBUztzQkFEUixTQUFTO3VCQUFDLGFBQWEsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIElucHV0LFxuICBPbkluaXQsXG4gIE9uRGVzdHJveSxcbiAgVmlld0NoaWxkLFxuICBFbGVtZW50UmVmLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIENoYXJ0LFxuICBDaGFydENvbmZpZ3VyYXRpb24sXG4gIHJlZ2lzdGVyYWJsZXMsXG4gIENoYXJ0RGF0YSxcbiAgQ2hhcnRPcHRpb25zLFxufSBmcm9tICdjaGFydC5qcyc7XG5pbXBvcnQgQ2hhcnREYXRhTGFiZWxzIGZyb20gJ2NoYXJ0anMtcGx1Z2luLWRhdGFsYWJlbHMnO1xuaW1wb3J0IHsgQ2hhcnRDb25maWcsIERhdGFzZXQgfSBmcm9tICcuLi9tb2RlbHMvY2hhcnQtY29uZmlnLm1vZGVsJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAncHQtY2hhcnQtY29tcGFyaXNvbicsXG4gIHRlbXBsYXRlVXJsOiAnLi9wdC1jaGFydC1jb21wYXJpc29uLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vcHQtY2hhcnQtY29tcGFyaXNvbi5jb21wb25lbnQuY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIFBUQ2hhcnRDb21wYXJpc29uQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBASW5wdXQoKSBjaGFydENvbmZpZyE6IENoYXJ0Q29uZmlnO1xuICBASW5wdXQoKSBtZWRpYW5UaXRsZTogc3RyaW5nID0gJ03DqWRpYW5lJztcbiAgQElucHV0KCkgeEF4aXNUaXRsZTogc3RyaW5nID0gJ1RpbWUnO1xuICBASW5wdXQoKSB5QXhpc1RpdGxlOiBzdHJpbmcgPSAnVmFsdWUnO1xuXG4gIC8vIFktQXhpcyBtYW51YWwgaW5wdXRzXG4gIEBJbnB1dCgpIHlNaW4hOiBudW1iZXI7XG4gIEBJbnB1dCgpIHlNYXghOiBudW1iZXI7XG4gIEBJbnB1dCgpIHlTdGVwU2l6ZSE6IG51bWJlcjtcblxuICAvLyBDaGFydCBkaW1lbnNpb24gaW5wdXRzXG4gIEBJbnB1dCgpIGNoYXJ0SGVpZ2h0OiBzdHJpbmcgPSAnNDAwcHgnO1xuICBASW5wdXQoKSBjaGFydFdpZHRoOiBzdHJpbmcgPSAnMTIwMHB4JztcblxuICBAVmlld0NoaWxkKCdjaGFydENhbnZhcycsIHsgc3RhdGljOiB0cnVlIH0pXG4gIGNhbnZhc1JlZiE6IEVsZW1lbnRSZWY8SFRNTENhbnZhc0VsZW1lbnQ+O1xuXG4gIHByaXZhdGUgY2hhcnQhOiBDaGFydDtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBDaGFydC5yZWdpc3RlciguLi5yZWdpc3RlcmFibGVzLCBDaGFydERhdGFMYWJlbHMpO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5pbml0aWFsaXplQ2hhcnQoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuZGVzdHJveUNoYXJ0KCk7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZXMgdGhlIGNoYXJ0IHdpdGggbWVkaWFuIGFuZCBkYXRhc2V0c1xuICAgKi9cbiAgcHJpdmF0ZSBpbml0aWFsaXplQ2hhcnQoKSB7XG4gICAgY29uc3QgY2FudmFzID0gdGhpcy5jYW52YXNSZWYubmF0aXZlRWxlbWVudDtcbiAgICB0aGlzLmRlc3Ryb3lDaGFydCgpO1xuXG4gICAgY29uc3QgY29uZmlnOiBDaGFydENvbmZpZ3VyYXRpb24gPSB7XG4gICAgICB0eXBlOiB0aGlzLmNoYXJ0Q29uZmlnLnR5cGUgfHwgJ2xpbmUnLFxuICAgICAgZGF0YTogdGhpcy5nZXRGb3JtYXR0ZWRDaGFydERhdGEoKSwgLy8gR2V0IGRhdGEgd2l0aCBtZWRpYW5cbiAgICAgIG9wdGlvbnM6IHRoaXMuZ2V0Q2hhcnRPcHRpb25zKCksXG4gICAgfTtcblxuICAgIHRoaXMuY2hhcnQgPSBuZXcgQ2hhcnQoY2FudmFzLCBjb25maWcpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbXB1dGVzIG1lZGlhbiB2YWx1ZXMgYW5kIGFkZHMgdGhlbSB0byB0aGUgZGF0YXNldFxuICAgKi9cbiAgcHJpdmF0ZSBnZXRGb3JtYXR0ZWRDaGFydERhdGEoKTogQ2hhcnREYXRhIHtcbiAgICBjb25zdCBtZWRpYW5WYWx1ZXMgPSB0aGlzLmNhbGN1bGF0ZU1lZGlhbigpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGxhYmVsczogdGhpcy5jaGFydENvbmZpZy5kYXRhLmxhYmVscyxcbiAgICAgIGRhdGFzZXRzOiBbXG4gICAgICAgIC8vIEFkZCBtZWRpYW4gbGluZSBkYXRhc2V0XG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogdGhpcy5tZWRpYW5UaXRsZSB8fCAnTcOpZGlhbmUnLFxuICAgICAgICAgIGRhdGE6IG1lZGlhblZhbHVlcyxcbiAgICAgICAgICBib3JkZXJDb2xvcjogJyMwMDAwRkYnLCAvLyBCbHVlIGNvbG9yXG4gICAgICAgICAgYm9yZGVyV2lkdGg6IDIsXG4gICAgICAgICAgYmFja2dyb3VuZENvbG9yOiAndHJhbnNwYXJlbnQnLFxuICAgICAgICAgIHBvaW50UmFkaXVzOiAwLFxuICAgICAgICAgIGZpbGw6IGZhbHNlLFxuICAgICAgICAgIHRlbnNpb246IDAuMSxcbiAgICAgICAgICBib3JkZXJEYXNoOiBbNSwgNV0sIC8vIERhc2hlZCBsaW5lXG4gICAgICAgIH0sXG4gICAgICAgIC8vIEtlZXAgZXhpc3RpbmcgZGF0YXNldHNcbiAgICAgICAgLi4uKHRoaXMuY2hhcnRDb25maWcuZGF0YS5kYXRhc2V0cyBhcyBEYXRhc2V0W10pLFxuICAgICAgXSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbXB1dGVzIG1lZGlhbiB2YWx1ZXMgZnJvbSBhbGwgZGF0YXNldHMgYXQgZWFjaCB0aW1lIHBvaW50XG4gICAqL1xuICBwcml2YXRlIGNhbGN1bGF0ZU1lZGlhbigpOiBudW1iZXJbXSB7XG4gICAgY29uc3QgZGF0YXNldHMgPSB0aGlzLmNoYXJ0Q29uZmlnLmRhdGEuZGF0YXNldHMgYXMgRGF0YXNldFtdO1xuXG4gICAgcmV0dXJuIHRoaXMuY2hhcnRDb25maWcuZGF0YS5sYWJlbHMhLm1hcCgoXywgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlc0F0VGltZSA9IGRhdGFzZXRzXG4gICAgICAgIC5tYXAoKGRhdGFzZXQpID0+IGRhdGFzZXQuZGF0YVtpbmRleF0pXG4gICAgICAgIC5maWx0ZXIoKHZhbCkgPT4gdmFsICE9PSB1bmRlZmluZWQpO1xuXG4gICAgICBpZiAodmFsdWVzQXRUaW1lLmxlbmd0aCA9PT0gMCkgcmV0dXJuIDA7XG5cbiAgICAgIHZhbHVlc0F0VGltZS5zb3J0KChhLCBiKSA9PiBhIC0gYik7XG4gICAgICBjb25zdCBtaWRkbGUgPSBNYXRoLmZsb29yKHZhbHVlc0F0VGltZS5sZW5ndGggLyAyKTtcblxuICAgICAgcmV0dXJuIHZhbHVlc0F0VGltZS5sZW5ndGggJSAyID09PSAwXG4gICAgICAgID8gKHZhbHVlc0F0VGltZVttaWRkbGUgLSAxXSArIHZhbHVlc0F0VGltZVttaWRkbGVdKSAvIDJcbiAgICAgICAgOiB2YWx1ZXNBdFRpbWVbbWlkZGxlXTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWZpbmVzIGNoYXJ0IG9wdGlvbnMgaW5jbHVkaW5nIFktYXhpcyBzY2FsaW5nXG4gICAqL1xuICBwcml2YXRlIGdldENoYXJ0T3B0aW9ucygpOiBDaGFydE9wdGlvbnMge1xuICAgIHJldHVybiB7XG4gICAgICByZXNwb25zaXZlOiB0cnVlLFxuICAgICAgbWFpbnRhaW5Bc3BlY3RSYXRpbzogZmFsc2UsXG4gICAgICBwbHVnaW5zOiB7XG4gICAgICAgIGxlZ2VuZDogeyBkaXNwbGF5OiB0cnVlLCBwb3NpdGlvbjogJ3RvcCcgfSxcbiAgICAgICAgdG9vbHRpcDogeyBtb2RlOiAnaW5kZXgnLCBpbnRlcnNlY3Q6IGZhbHNlIH0sXG4gICAgICB9LFxuICAgICAgc2NhbGVzOiB7XG4gICAgICAgIHg6IHtcbiAgICAgICAgICB0aXRsZTogeyBkaXNwbGF5OiB0cnVlLCB0ZXh0OiB0aGlzLmNoYXJ0Q29uZmlnLnhBeGlzVGl0bGUgfHwgJ1RpbWUnIH0sXG4gICAgICAgICAgdGlja3M6IHsgZm9udDogeyBzaXplOiAxMiB9IH0sXG4gICAgICAgIH0sXG4gICAgICAgIHk6IHtcbiAgICAgICAgICB0aXRsZToge1xuICAgICAgICAgICAgZGlzcGxheTogdHJ1ZSxcbiAgICAgICAgICAgIHRleHQ6IHRoaXMuY2hhcnRDb25maWcueUF4aXNUaXRsZSB8fCAnVmFsdWUnLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgbWluOiB0aGlzLmNoYXJ0Q29uZmlnLnNjYWxlcz8ueT8ubWluLFxuICAgICAgICAgIG1heDogdGhpcy5jaGFydENvbmZpZy5zY2FsZXM/Lnk/Lm1heCxcbiAgICAgICAgICB0aWNrczoge1xuICAgICAgICAgICAgc3RlcFNpemU6IHRoaXMuY2hhcnRDb25maWcuc2NhbGVzPy55Py50aWNrcz8uc3RlcFNpemUsXG4gICAgICAgICAgICBmb250OiB7IHNpemU6IDE2LCB3ZWlnaHQ6ICdib2xkJyB9LFxuICAgICAgICAgICAgY29sb3I6ICcjMzMzJyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGdyaWQ6IHtcbiAgICAgICAgICAgIGNvbG9yOiAncmdiYSgwLDAsMCwwLjEpJyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGJvcmRlcjoge1xuICAgICAgICAgICAgZGlzcGxheTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbG9yOiAnIzAwMCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXN0cm95cyB0aGUgZXhpc3RpbmcgY2hhcnQgaW5zdGFuY2UgaWYgcHJlc2VudFxuICAgKi9cbiAgcHJpdmF0ZSBkZXN0cm95Q2hhcnQoKSB7XG4gICAgaWYgKHRoaXMuY2hhcnQpIHtcbiAgICAgIHRoaXMuY2hhcnQuZGVzdHJveSgpO1xuICAgICAgdGhpcy5jaGFydCA9IHVuZGVmaW5lZCBhcyBhbnk7XG4gICAgfVxuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiY2hhcnQtc2Nyb2xsLWNvbnRhaW5lclwiPlxuICA8ZGl2XG4gICAgY2xhc3M9XCJjaGFydC1pbm5lclwiXG4gICAgW3N0eWxlLndpZHRoXT1cImNoYXJ0Q29uZmlnLmNoYXJ0V2lkdGggfHwgJzEyMDBweCdcIlxuICAgIFtzdHlsZS5oZWlnaHRdPVwiY2hhcnRDb25maWcuY2hhcnRIZWlnaHQgfHwgJzQwMHB4J1wiXG4gID5cbiAgICA8Y2FudmFzICNjaGFydENhbnZhcz48L2NhbnZhcz5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
143
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHQtY2hhcnQtY29tcGFyaXNvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1wcmltZS10b29scy9zcmMvbGliL3B0LWNoYXJ0LWNvbXBhcmlzb24vcHQtY2hhcnQtY29tcGFyaXNvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1wcmltZS10b29scy9zcmMvbGliL3B0LWNoYXJ0LWNvbXBhcmlzb24vcHQtY2hhcnQtY29tcGFyaXNvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFHTCxTQUFTLEdBRVYsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUNMLEtBQUssRUFFTCxhQUFhLEdBR2QsTUFBTSxVQUFVLENBQUM7QUFDbEIsT0FBTyxlQUFlLE1BQU0sMkJBQTJCLENBQUM7O0FBUXhELE1BQU0sT0FBTywwQkFBMEI7SUFrQnJDO1FBaEJTLGdCQUFXLEdBQVcsU0FBUyxDQUFDO1FBQ2hDLGVBQVUsR0FBVyxNQUFNLENBQUM7UUFDNUIsZUFBVSxHQUFXLE9BQU8sQ0FBQztRQU03QixnQkFBVyxHQUFXLE9BQU8sQ0FBQztRQUM5QixlQUFVLEdBQVcsUUFBUSxDQUFDO1FBUXJDLEtBQUssQ0FBQyxRQUFRLENBQUMsR0FBRyxhQUFhLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVELFFBQVE7UUFDTixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDekIsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVPLGVBQWU7UUFDckIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUM7UUFDNUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBRXBCLE1BQU0sTUFBTSxHQUF1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LENBQUM7SUFFTyxZQUFZO1FBQ2xCLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2YsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNyQixJQUFJLENBQUMsS0FBSyxHQUFHLFNBQWdCLENBQUM7UUFDaEMsQ0FBQztJQUNILENBQUM7K0dBeklVLDBCQUEwQjttR0FBMUIsMEJBQTBCLHFaQ3ZCdkMsNlBBU0E7OzRGRGNhLDBCQUEwQjtrQkFMdEMsU0FBUzsrQkFDRSxxQkFBcUI7d0RBS3RCLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBRUcsSUFBSTtzQkFBWixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUVHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFHTixTQUFTO3NCQURSLFNBQVM7dUJBQUMsYUFBYSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgSW5wdXQsXG4gIE9uSW5pdCxcbiAgT25EZXN0cm95LFxuICBWaWV3Q2hpbGQsXG4gIEVsZW1lbnRSZWYsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQ2hhcnQsXG4gIENoYXJ0Q29uZmlndXJhdGlvbixcbiAgcmVnaXN0ZXJhYmxlcyxcbiAgQ2hhcnREYXRhLFxuICBDaGFydE9wdGlvbnMsXG59IGZyb20gJ2NoYXJ0LmpzJztcbmltcG9ydCBDaGFydERhdGFMYWJlbHMgZnJvbSAnY2hhcnRqcy1wbHVnaW4tZGF0YWxhYmVscyc7XG5pbXBvcnQgeyBDaGFydENvbmZpZywgRGF0YXNldCB9IGZyb20gJy4uL21vZGVscy9jaGFydC1jb25maWcubW9kZWwnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdwdC1jaGFydC1jb21wYXJpc29uJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3B0LWNoYXJ0LWNvbXBhcmlzb24uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9wdC1jaGFydC1jb21wYXJpc29uLmNvbXBvbmVudC5jc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgUFRDaGFydENvbXBhcmlzb25Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIEBJbnB1dCgpIGNoYXJ0Q29uZmlnITogQ2hhcnRDb25maWc7XG4gIEBJbnB1dCgpIG1lZGlhblRpdGxlOiBzdHJpbmcgPSAnTcOpZGlhbmUnO1xuICBASW5wdXQoKSB4QXhpc1RpdGxlOiBzdHJpbmcgPSAnVGltZSc7XG4gIEBJbnB1dCgpIHlBeGlzVGl0bGU6IHN0cmluZyA9ICdWYWx1ZSc7XG5cbiAgQElucHV0KCkgeU1pbiE6IG51bWJlcjtcbiAgQElucHV0KCkgeU1heCE6IG51bWJlcjtcbiAgQElucHV0KCkgeVN0ZXBTaXplITogbnVtYmVyO1xuXG4gIEBJbnB1dCgpIGNoYXJ0SGVpZ2h0OiBzdHJpbmcgPSAnNDAwcHgnO1xuICBASW5wdXQoKSBjaGFydFdpZHRoOiBzdHJpbmcgPSAnMTIwMHB4JztcblxuICBAVmlld0NoaWxkKCdjaGFydENhbnZhcycsIHsgc3RhdGljOiB0cnVlIH0pXG4gIGNhbnZhc1JlZiE6IEVsZW1lbnRSZWY8SFRNTENhbnZhc0VsZW1lbnQ+O1xuXG4gIHByaXZhdGUgY2hhcnQhOiBDaGFydDtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBDaGFydC5yZWdpc3RlciguLi5yZWdpc3RlcmFibGVzLCBDaGFydERhdGFMYWJlbHMpO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5pbml0aWFsaXplQ2hhcnQoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuZGVzdHJveUNoYXJ0KCk7XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVDaGFydCgpIHtcbiAgICBjb25zdCBjYW52YXMgPSB0aGlzLmNhbnZhc1JlZi5uYXRpdmVFbGVtZW50O1xuICAgIHRoaXMuZGVzdHJveUNoYXJ0KCk7XG5cbiAgICBjb25zdCBjb25maWc6IENoYXJ0Q29uZmlndXJhdGlvbiA9IHtcbiAgICAgIHR5cGU6IHRoaXMuY2hhcnRDb25maWcudHlwZSB8fCAnbGluZScsXG4gICAgICBkYXRhOiB0aGlzLmdldEZvcm1hdHRlZENoYXJ0RGF0YSgpLFxuICAgICAgb3B0aW9uczogdGhpcy5nZXRDaGFydE9wdGlvbnMoKSxcbiAgICB9O1xuXG4gICAgdGhpcy5jaGFydCA9IG5ldyBDaGFydChjYW52YXMsIGNvbmZpZyk7XG4gIH1cblxuICBwcml2YXRlIGdldEZvcm1hdHRlZENoYXJ0RGF0YSgpOiBDaGFydERhdGEge1xuICAgIGNvbnN0IG1lZGlhblZhbHVlcyA9IHRoaXMuY2FsY3VsYXRlTWVkaWFuKCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgbGFiZWxzOiB0aGlzLmNoYXJ0Q29uZmlnLmRhdGEubGFiZWxzLFxuICAgICAgZGF0YXNldHM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiB0aGlzLmNoYXJ0Q29uZmlnLm1lZGlhblRpdGxlIHx8IHRoaXMubWVkaWFuVGl0bGUgfHwgJ03DqWRpYW5lJyxcbiAgICAgICAgICBkYXRhOiBtZWRpYW5WYWx1ZXMsXG4gICAgICAgICAgYm9yZGVyQ29sb3I6ICcjMDAwMEZGJyxcbiAgICAgICAgICBib3JkZXJXaWR0aDogMyxcbiAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICd0cmFuc3BhcmVudCcsXG4gICAgICAgICAgcG9pbnRSYWRpdXM6IDAsXG4gICAgICAgICAgZmlsbDogZmFsc2UsXG4gICAgICAgICAgdGVuc2lvbjogMC4xLFxuICAgICAgICAgIGJvcmRlckRhc2g6IFtdLCAvLyDinIUgbcOpZGlhbmUgY29udGludWVcbiAgICAgICAgfSxcbiAgICAgICAgLi4uKHRoaXMuY2hhcnRDb25maWcuZGF0YS5kYXRhc2V0cyBhcyBEYXRhc2V0W10pLFxuICAgICAgXSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjYWxjdWxhdGVNZWRpYW4oKTogbnVtYmVyW10ge1xuICAgIGNvbnN0IGRhdGFzZXRzID0gdGhpcy5jaGFydENvbmZpZy5kYXRhLmRhdGFzZXRzIGFzIERhdGFzZXRbXTtcblxuICAgIHJldHVybiB0aGlzLmNoYXJ0Q29uZmlnLmRhdGEubGFiZWxzIS5tYXAoKF8sIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZXNBdFRpbWUgPSBkYXRhc2V0c1xuICAgICAgICAubWFwKChkYXRhc2V0KSA9PiBkYXRhc2V0LmRhdGFbaW5kZXhdKVxuICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgICh2YWwpOiB2YWwgaXMgbnVtYmVyID0+IHR5cGVvZiB2YWwgPT09ICdudW1iZXInICYmICFOdW1iZXIuaXNOYU4odmFsKSxcbiAgICAgICAgKTtcblxuICAgICAgaWYgKHZhbHVlc0F0VGltZS5sZW5ndGggPT09IDApIHJldHVybiAwO1xuXG4gICAgICB2YWx1ZXNBdFRpbWUuc29ydCgoYSwgYikgPT4gYSAtIGIpO1xuICAgICAgY29uc3QgbWlkZGxlID0gTWF0aC5mbG9vcih2YWx1ZXNBdFRpbWUubGVuZ3RoIC8gMik7XG5cbiAgICAgIHJldHVybiB2YWx1ZXNBdFRpbWUubGVuZ3RoICUgMiA9PT0gMFxuICAgICAgICA/ICh2YWx1ZXNBdFRpbWVbbWlkZGxlIC0gMV0gKyB2YWx1ZXNBdFRpbWVbbWlkZGxlXSkgLyAyXG4gICAgICAgIDogdmFsdWVzQXRUaW1lW21pZGRsZV07XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGdldENoYXJ0T3B0aW9ucygpOiBDaGFydE9wdGlvbnMge1xuICAgIGNvbnN0IGV4dGVybmFsT3B0aW9ucyA9IHRoaXMuY2hhcnRDb25maWcub3B0aW9ucyA/PyB7fTtcblxuICAgIHJldHVybiB7XG4gICAgICByZXNwb25zaXZlOiB0cnVlLFxuICAgICAgbWFpbnRhaW5Bc3BlY3RSYXRpbzogZmFsc2UsXG4gICAgICBwbHVnaW5zOiB7XG4gICAgICAgIGxlZ2VuZDogeyBkaXNwbGF5OiB0cnVlLCBwb3NpdGlvbjogJ3RvcCcgfSxcbiAgICAgICAgdG9vbHRpcDogeyBtb2RlOiAnaW5kZXgnLCBpbnRlcnNlY3Q6IGZhbHNlIH0sXG4gICAgICAgIGRhdGFsYWJlbHM6IHtcbiAgICAgICAgICBkaXNwbGF5OiBmYWxzZSwgLy8g4pyFIHN1cHByaW1lIGxlcyBub21icmVzIGF1LWRlc3N1cyBkZXMgbGlnbmVzXG4gICAgICAgIH0sXG4gICAgICAgIC4uLihleHRlcm5hbE9wdGlvbnMucGx1Z2lucyA/PyB7fSksXG4gICAgICB9LFxuICAgICAgc2NhbGVzOiB7XG4gICAgICAgIHg6IHtcbiAgICAgICAgICB0aXRsZTogeyBkaXNwbGF5OiB0cnVlLCB0ZXh0OiB0aGlzLmNoYXJ0Q29uZmlnLnhBeGlzVGl0bGUgfHwgJ1RpbWUnIH0sXG4gICAgICAgICAgdGlja3M6IHsgZm9udDogeyBzaXplOiAxMiB9IH0sXG4gICAgICAgICAgLi4uKGV4dGVybmFsT3B0aW9ucy5zY2FsZXMgYXMgYW55KT8ueCxcbiAgICAgICAgfSxcbiAgICAgICAgeToge1xuICAgICAgICAgIHRpdGxlOiB7XG4gICAgICAgICAgICBkaXNwbGF5OiB0cnVlLFxuICAgICAgICAgICAgdGV4dDogdGhpcy5jaGFydENvbmZpZy55QXhpc1RpdGxlIHx8ICdWYWx1ZScsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBtaW46IHRoaXMuY2hhcnRDb25maWcuc2NhbGVzPy55Py5taW4sXG4gICAgICAgICAgbWF4OiB0aGlzLmNoYXJ0Q29uZmlnLnNjYWxlcz8ueT8ubWF4LFxuICAgICAgICAgIHRpY2tzOiB7XG4gICAgICAgICAgICBzdGVwU2l6ZTogdGhpcy5jaGFydENvbmZpZy5zY2FsZXM/Lnk/LnRpY2tzPy5zdGVwU2l6ZSxcbiAgICAgICAgICAgIGZvbnQ6IHsgc2l6ZTogMTYsIHdlaWdodDogJ2JvbGQnIH0sXG4gICAgICAgICAgICBjb2xvcjogJyMzMzMnLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgZ3JpZDoge1xuICAgICAgICAgICAgY29sb3I6ICdyZ2JhKDAsMCwwLDAuMSknLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgYm9yZGVyOiB7XG4gICAgICAgICAgICBkaXNwbGF5OiB0cnVlLFxuICAgICAgICAgICAgY29sb3I6ICcjMDAwJyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIC4uLihleHRlcm5hbE9wdGlvbnMuc2NhbGVzIGFzIGFueSk/LnksXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgLi4uZXh0ZXJuYWxPcHRpb25zLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGRlc3Ryb3lDaGFydCgpIHtcbiAgICBpZiAodGhpcy5jaGFydCkge1xuICAgICAgdGhpcy5jaGFydC5kZXN0cm95KCk7XG4gICAgICB0aGlzLmNoYXJ0ID0gdW5kZWZpbmVkIGFzIGFueTtcbiAgICB9XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJjaGFydC1zY3JvbGwtY29udGFpbmVyXCI+XG4gIDxkaXZcbiAgICBjbGFzcz1cImNoYXJ0LWlubmVyXCJcbiAgICBbc3R5bGUud2lkdGhdPVwiY2hhcnRDb25maWcuY2hhcnRXaWR0aCB8fCAnMTIwMHB4J1wiXG4gICAgW3N0eWxlLmhlaWdodF09XCJjaGFydENvbmZpZy5jaGFydEhlaWdodCB8fCAnNDAwcHgnXCJcbiAgPlxuICAgIDxjYW52YXMgI2NoYXJ0Q2FudmFzPjwvY2FudmFzPlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
@@ -5482,7 +5482,6 @@ class PTChartComparisonComponent {
5482
5482
  this.medianTitle = 'Médiane';
5483
5483
  this.xAxisTitle = 'Time';
5484
5484
  this.yAxisTitle = 'Value';
5485
- // Chart dimension inputs
5486
5485
  this.chartHeight = '400px';
5487
5486
  this.chartWidth = '1200px';
5488
5487
  Chart.register(...registerables, ChartDataLabels);
@@ -5493,53 +5492,42 @@ class PTChartComparisonComponent {
5493
5492
  ngOnDestroy() {
5494
5493
  this.destroyChart();
5495
5494
  }
5496
- /**
5497
- * Initializes the chart with median and datasets
5498
- */
5499
5495
  initializeChart() {
5500
5496
  const canvas = this.canvasRef.nativeElement;
5501
5497
  this.destroyChart();
5502
5498
  const config = {
5503
5499
  type: this.chartConfig.type || 'line',
5504
- data: this.getFormattedChartData(), // Get data with median
5500
+ data: this.getFormattedChartData(),
5505
5501
  options: this.getChartOptions(),
5506
5502
  };
5507
5503
  this.chart = new Chart(canvas, config);
5508
5504
  }
5509
- /**
5510
- * Computes median values and adds them to the dataset
5511
- */
5512
5505
  getFormattedChartData() {
5513
5506
  const medianValues = this.calculateMedian();
5514
5507
  return {
5515
5508
  labels: this.chartConfig.data.labels,
5516
5509
  datasets: [
5517
- // Add median line dataset
5518
5510
  {
5519
- label: this.medianTitle || 'Médiane',
5511
+ label: this.chartConfig.medianTitle || this.medianTitle || 'Médiane',
5520
5512
  data: medianValues,
5521
- borderColor: '#0000FF', // Blue color
5522
- borderWidth: 2,
5513
+ borderColor: '#0000FF',
5514
+ borderWidth: 3,
5523
5515
  backgroundColor: 'transparent',
5524
5516
  pointRadius: 0,
5525
5517
  fill: false,
5526
5518
  tension: 0.1,
5527
- borderDash: [5, 5], // Dashed line
5519
+ borderDash: [], // médiane continue
5528
5520
  },
5529
- // Keep existing datasets
5530
5521
  ...this.chartConfig.data.datasets,
5531
5522
  ],
5532
5523
  };
5533
5524
  }
5534
- /**
5535
- * Computes median values from all datasets at each time point
5536
- */
5537
5525
  calculateMedian() {
5538
5526
  const datasets = this.chartConfig.data.datasets;
5539
5527
  return this.chartConfig.data.labels.map((_, index) => {
5540
5528
  const valuesAtTime = datasets
5541
5529
  .map((dataset) => dataset.data[index])
5542
- .filter((val) => val !== undefined);
5530
+ .filter((val) => typeof val === 'number' && !Number.isNaN(val));
5543
5531
  if (valuesAtTime.length === 0)
5544
5532
  return 0;
5545
5533
  valuesAtTime.sort((a, b) => a - b);
@@ -5549,21 +5537,24 @@ class PTChartComparisonComponent {
5549
5537
  : valuesAtTime[middle];
5550
5538
  });
5551
5539
  }
5552
- /**
5553
- * Defines chart options including Y-axis scaling
5554
- */
5555
5540
  getChartOptions() {
5541
+ const externalOptions = this.chartConfig.options ?? {};
5556
5542
  return {
5557
5543
  responsive: true,
5558
5544
  maintainAspectRatio: false,
5559
5545
  plugins: {
5560
5546
  legend: { display: true, position: 'top' },
5561
5547
  tooltip: { mode: 'index', intersect: false },
5548
+ datalabels: {
5549
+ display: false, // ✅ supprime les nombres au-dessus des lignes
5550
+ },
5551
+ ...(externalOptions.plugins ?? {}),
5562
5552
  },
5563
5553
  scales: {
5564
5554
  x: {
5565
5555
  title: { display: true, text: this.chartConfig.xAxisTitle || 'Time' },
5566
5556
  ticks: { font: { size: 12 } },
5557
+ ...externalOptions.scales?.x,
5567
5558
  },
5568
5559
  y: {
5569
5560
  title: {
@@ -5584,13 +5575,12 @@ class PTChartComparisonComponent {
5584
5575
  display: true,
5585
5576
  color: '#000',
5586
5577
  },
5578
+ ...externalOptions.scales?.y,
5587
5579
  },
5588
5580
  },
5581
+ ...externalOptions,
5589
5582
  };
5590
5583
  }
5591
- /**
5592
- * Destroys the existing chart instance if present
5593
- */
5594
5584
  destroyChart() {
5595
5585
  if (this.chart) {
5596
5586
  this.chart.destroy();