@forgeroute/ui 0.3.5 → 0.3.7

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.
@@ -0,0 +1,323 @@
1
+ import * as i0 from "@angular/core";
2
+ import { ChangeDetectionStrategy, Component, DestroyRef, NgZone, computed, effect, inject, input, viewChild } from "@angular/core";
3
+ import { BarController, BarElement, CategoryScale, Chart, LinearScale, Tooltip } from "chart.js";
4
+ let registered = false;
5
+ function registerChartParts() {
6
+ if (registered) return;
7
+ Chart.register(BarController, BarElement, CategoryScale, LinearScale, Tooltip);
8
+ registered = true;
9
+ }
10
+ const VALUE_LABELS = {
11
+ id: "uiBarChartValueLabels",
12
+ afterDatasetsDraw(chart) {
13
+ if (chart.options.plugins["uiBarChartValueLabels"]?.enabled === false) return;
14
+ const ctx = chart.ctx;
15
+ ctx.save();
16
+ ctx.fillStyle = "#475569";
17
+ ctx.font = "600 11px sans-serif";
18
+ ctx.textAlign = "center";
19
+ ctx.textBaseline = "bottom";
20
+ chart.getDatasetMeta(0).data.forEach((bar, i) => {
21
+ const value = chart.data.datasets[0]?.data[i];
22
+ if (typeof value === "number" && Number.isFinite(value) && value !== 0) ctx.fillText(String(value), bar.x, bar.y - 2);
23
+ });
24
+ ctx.restore();
25
+ }
26
+ };
27
+ var BarChartComponent = class BarChartComponent {
28
+ constructor() {
29
+ this.labels = input([], ...ngDevMode ? [{ debugName: "labels" }] : /* istanbul ignore next */ []);
30
+ this.values = input([], ...ngDevMode ? [{ debugName: "values" }] : /* istanbul ignore next */ []);
31
+ this.color = input("#3b82f6", ...ngDevMode ? [{ debugName: "color" }] : /* istanbul ignore next */ []);
32
+ this.hoverColor = input("#2563eb", ...ngDevMode ? [{ debugName: "hoverColor" }] : /* istanbul ignore next */ []);
33
+ this.height = input(240, ...ngDevMode ? [{ debugName: "height" }] : /* istanbul ignore next */ []);
34
+ this.ariaLabel = input("", ...ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []);
35
+ this.showValues = input(true, ...ngDevMode ? [{ debugName: "showValues" }] : /* istanbul ignore next */ []);
36
+ this.unitSingular = input("", ...ngDevMode ? [{ debugName: "unitSingular" }] : /* istanbul ignore next */ []);
37
+ this.unitPlural = input("", ...ngDevMode ? [{ debugName: "unitPlural" }] : /* istanbul ignore next */ []);
38
+ this.canvas = viewChild.required("canvas", ...ngDevMode ? [{ debugName: "canvas" }] : /* istanbul ignore next */ []);
39
+ this.zone = inject(NgZone);
40
+ this.chart = null;
41
+ this.tooltipText = (value) => {
42
+ const unit = value === 1 ? this.unitSingular() : this.unitPlural();
43
+ return unit ? `${value} ${unit}` : String(value);
44
+ };
45
+ this.series = computed(() => ({
46
+ labels: this.labels(),
47
+ data: this.values(),
48
+ color: this.color(),
49
+ hoverColor: this.hoverColor(),
50
+ showValues: this.showValues()
51
+ }), ...ngDevMode ? [{ debugName: "series" }] : /* istanbul ignore next */ []);
52
+ effect(() => {
53
+ const s = this.series();
54
+ const canvas = this.canvas().nativeElement;
55
+ if (!this.chart) {
56
+ registerChartParts();
57
+ this.zone.runOutsideAngular(() => {
58
+ this.chart = new Chart(canvas, {
59
+ type: "bar",
60
+ data: {
61
+ labels: s.labels,
62
+ datasets: [{
63
+ data: s.data,
64
+ backgroundColor: s.color,
65
+ hoverBackgroundColor: s.hoverColor,
66
+ borderRadius: 3,
67
+ borderSkipped: false
68
+ }]
69
+ },
70
+ options: {
71
+ responsive: true,
72
+ maintainAspectRatio: false,
73
+ animation: false,
74
+ layout: { padding: { top: 20 } },
75
+ plugins: {
76
+ legend: { display: false },
77
+ tooltip: { callbacks: { label: (item) => this.tooltipText(Number(item.raw)) } }
78
+ },
79
+ scales: {
80
+ y: {
81
+ beginAtZero: true,
82
+ ticks: {
83
+ precision: 0,
84
+ color: "#94a3b8",
85
+ font: { size: 11 }
86
+ },
87
+ grid: { color: "#e2e8f0" },
88
+ border: { display: false }
89
+ },
90
+ x: {
91
+ grid: { display: false },
92
+ ticks: {
93
+ maxRotation: 0,
94
+ color: "#94a3b8",
95
+ font: { size: 10 }
96
+ },
97
+ border: { display: false }
98
+ }
99
+ }
100
+ },
101
+ plugins: [VALUE_LABELS]
102
+ });
103
+ });
104
+ }
105
+ const chart = this.chart;
106
+ chart.data.labels = s.labels;
107
+ const ds = chart.data.datasets[0];
108
+ ds.data = s.data;
109
+ ds.backgroundColor = s.color;
110
+ ds.hoverBackgroundColor = s.hoverColor;
111
+ chart.options.plugins["uiBarChartValueLabels"] = { enabled: s.showValues };
112
+ chart.update("none");
113
+ });
114
+ inject(DestroyRef).onDestroy(() => {
115
+ this.chart?.destroy();
116
+ this.chart = null;
117
+ });
118
+ }
119
+ static {
120
+ this.ɵfac = i0.ɵɵngDeclareFactory({
121
+ minVersion: "12.0.0",
122
+ version: "22.2.2",
123
+ ngImport: i0,
124
+ type: BarChartComponent,
125
+ deps: [],
126
+ target: i0.ɵɵFactoryTarget.Component
127
+ });
128
+ }
129
+ static {
130
+ this.ɵcmp = i0.ɵɵngDeclareComponent({
131
+ minVersion: "17.2.0",
132
+ version: "22.2.2",
133
+ type: BarChartComponent,
134
+ isStandalone: true,
135
+ selector: "ui-bar-chart",
136
+ inputs: {
137
+ labels: {
138
+ classPropertyName: "labels",
139
+ publicName: "labels",
140
+ isSignal: true,
141
+ isRequired: false,
142
+ transformFunction: null
143
+ },
144
+ values: {
145
+ classPropertyName: "values",
146
+ publicName: "values",
147
+ isSignal: true,
148
+ isRequired: false,
149
+ transformFunction: null
150
+ },
151
+ color: {
152
+ classPropertyName: "color",
153
+ publicName: "color",
154
+ isSignal: true,
155
+ isRequired: false,
156
+ transformFunction: null
157
+ },
158
+ hoverColor: {
159
+ classPropertyName: "hoverColor",
160
+ publicName: "hoverColor",
161
+ isSignal: true,
162
+ isRequired: false,
163
+ transformFunction: null
164
+ },
165
+ height: {
166
+ classPropertyName: "height",
167
+ publicName: "height",
168
+ isSignal: true,
169
+ isRequired: false,
170
+ transformFunction: null
171
+ },
172
+ ariaLabel: {
173
+ classPropertyName: "ariaLabel",
174
+ publicName: "ariaLabel",
175
+ isSignal: true,
176
+ isRequired: false,
177
+ transformFunction: null
178
+ },
179
+ showValues: {
180
+ classPropertyName: "showValues",
181
+ publicName: "showValues",
182
+ isSignal: true,
183
+ isRequired: false,
184
+ transformFunction: null
185
+ },
186
+ unitSingular: {
187
+ classPropertyName: "unitSingular",
188
+ publicName: "unitSingular",
189
+ isSignal: true,
190
+ isRequired: false,
191
+ transformFunction: null
192
+ },
193
+ unitPlural: {
194
+ classPropertyName: "unitPlural",
195
+ publicName: "unitPlural",
196
+ isSignal: true,
197
+ isRequired: false,
198
+ transformFunction: null
199
+ }
200
+ },
201
+ viewQueries: [{
202
+ propertyName: "canvas",
203
+ first: true,
204
+ predicate: ["canvas"],
205
+ descendants: true,
206
+ isSignal: true
207
+ }],
208
+ ngImport: i0,
209
+ template: `
210
+ <div class="bc-wrap" [class.bc-default-height]="height() === 240" [style.height.px]="height()"
211
+ [attr.role]="ariaLabel() ? 'img' : null" [attr.aria-label]="ariaLabel() || null">
212
+ <canvas #canvas></canvas>
213
+ </div>
214
+ `,
215
+ isInline: true,
216
+ styles: [":host{display:block}.bc-wrap{position:relative}@media(max-width:768px){.bc-wrap.bc-default-height{height:200px!important}}@media(max-width:480px){.bc-wrap.bc-default-height{height:160px!important}}\n"],
217
+ changeDetection: i0.ChangeDetectionStrategy.OnPush
218
+ });
219
+ }
220
+ };
221
+ i0.ɵɵngDeclareClassMetadata({
222
+ minVersion: "12.0.0",
223
+ version: "22.2.2",
224
+ ngImport: i0,
225
+ type: BarChartComponent,
226
+ decorators: [{
227
+ type: Component,
228
+ args: [{
229
+ selector: "ui-bar-chart",
230
+ standalone: true,
231
+ changeDetection: ChangeDetectionStrategy.OnPush,
232
+ template: `
233
+ <div class="bc-wrap" [class.bc-default-height]="height() === 240" [style.height.px]="height()"
234
+ [attr.role]="ariaLabel() ? 'img' : null" [attr.aria-label]="ariaLabel() || null">
235
+ <canvas #canvas></canvas>
236
+ </div>
237
+ `,
238
+ styles: [":host{display:block}.bc-wrap{position:relative}@media(max-width:768px){.bc-wrap.bc-default-height{height:200px!important}}@media(max-width:480px){.bc-wrap.bc-default-height{height:160px!important}}\n"]
239
+ }]
240
+ }],
241
+ ctorParameters: () => [],
242
+ propDecorators: {
243
+ labels: [{
244
+ type: i0.Input,
245
+ args: [{
246
+ isSignal: true,
247
+ alias: "labels",
248
+ required: false
249
+ }]
250
+ }],
251
+ values: [{
252
+ type: i0.Input,
253
+ args: [{
254
+ isSignal: true,
255
+ alias: "values",
256
+ required: false
257
+ }]
258
+ }],
259
+ color: [{
260
+ type: i0.Input,
261
+ args: [{
262
+ isSignal: true,
263
+ alias: "color",
264
+ required: false
265
+ }]
266
+ }],
267
+ hoverColor: [{
268
+ type: i0.Input,
269
+ args: [{
270
+ isSignal: true,
271
+ alias: "hoverColor",
272
+ required: false
273
+ }]
274
+ }],
275
+ height: [{
276
+ type: i0.Input,
277
+ args: [{
278
+ isSignal: true,
279
+ alias: "height",
280
+ required: false
281
+ }]
282
+ }],
283
+ ariaLabel: [{
284
+ type: i0.Input,
285
+ args: [{
286
+ isSignal: true,
287
+ alias: "ariaLabel",
288
+ required: false
289
+ }]
290
+ }],
291
+ showValues: [{
292
+ type: i0.Input,
293
+ args: [{
294
+ isSignal: true,
295
+ alias: "showValues",
296
+ required: false
297
+ }]
298
+ }],
299
+ unitSingular: [{
300
+ type: i0.Input,
301
+ args: [{
302
+ isSignal: true,
303
+ alias: "unitSingular",
304
+ required: false
305
+ }]
306
+ }],
307
+ unitPlural: [{
308
+ type: i0.Input,
309
+ args: [{
310
+ isSignal: true,
311
+ alias: "unitPlural",
312
+ required: false
313
+ }]
314
+ }],
315
+ canvas: [{
316
+ type: i0.ViewChild,
317
+ args: ["canvas", { isSignal: true }]
318
+ }]
319
+ }
320
+ });
321
+ export { BarChartComponent };
322
+
323
+ //# sourceMappingURL=forgeroute-ui-charts.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forgeroute-ui-charts.mjs","names":[],"sources":["../../../projects/forgeroute-ui/charts/src/bar-chart/bar-chart.component.ts"],"sourcesContent":["import {\n Component, ChangeDetectionStrategy, DestroyRef, ElementRef, NgZone, computed, effect, inject, input, viewChild,\n} from '@angular/core';\nimport { BarController, BarElement, CategoryScale, Chart, LinearScale, Tooltip } from 'chart.js';\nimport type { Plugin } from 'chart.js';\n\n// Registered when a chart is first created (not at import time) so apps that never use ui-bar-chart can drop chart.js from their bundle.\nlet registered = false;\nfunction registerChartParts(): void {\n if (registered) return;\n Chart.register(BarController, BarElement, CategoryScale, LinearScale, Tooltip);\n registered = true;\n}\n\n/** Draws each bar's value above it (nothing for a 0 bar). Local to ui-bar-chart so no chart.js plugin package is needed. */\nconst VALUE_LABELS: Plugin<'bar'> = {\n id: 'uiBarChartValueLabels',\n afterDatasetsDraw(chart) {\n const opts = (chart.options.plugins as Record<string, { enabled?: boolean } | undefined>)['uiBarChartValueLabels'];\n if (opts?.enabled === false) return;\n const ctx = chart.ctx;\n ctx.save();\n ctx.fillStyle = '#475569';\n ctx.font = '600 11px sans-serif';\n ctx.textAlign = 'center';\n ctx.textBaseline = 'bottom';\n chart.getDatasetMeta(0).data.forEach((bar, i) => {\n const value = chart.data.datasets[0]?.data[i];\n if (typeof value === 'number' && Number.isFinite(value) && value !== 0) ctx.fillText(String(value), bar.x, bar.y - 2);\n });\n ctx.restore();\n },\n};\n\n/**\n * Bar chart of one series (e.g. calls per day). Pass the category `labels` and the matching `values`.\n *\n * <ui-bar-chart [labels]=\"['8/1', '8/2']\" [values]=\"[3, 0]\" ariaLabel=\"Daily call volume\"\n * unitSingular=\"call\" unitPlural=\"calls\" />\n *\n * - Bars show their value above them (`showValues`, a 0 bar shows nothing), the y axis starts at 0 and counts whole numbers.\n * - The tooltip reads \"<value> <unit>\" (`unitSingular` for 1, `unitPlural` otherwise; no unit = just the number).\n * - With an `ariaLabel` the chart is an image for assistive tech (`role=\"img\"` + that label; without a label no role is set, as an\n * unnamed image is an accessibility error); render the same figures as text next to it\n * (e.g. a visually hidden list) when the exact values matter.\n * - Height is `height` px (shorter on phones: 200px up to 768px wide, 160px up to 480px wide, when the default 240 is used);\n * the width follows the container. Needs the optional peer dependency `chart.js` (>= 4).\n */\n@Component({\n selector: 'ui-bar-chart',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"bc-wrap\" [class.bc-default-height]=\"height() === 240\" [style.height.px]=\"height()\"\n [attr.role]=\"ariaLabel() ? 'img' : null\" [attr.aria-label]=\"ariaLabel() || null\">\n <canvas #canvas></canvas>\n </div>\n `,\n styles: [`\n :host { display: block; }\n .bc-wrap { position: relative; }\n @media (max-width: 768px) { .bc-wrap.bc-default-height { height: 200px !important; } }\n @media (max-width: 480px) { .bc-wrap.bc-default-height { height: 160px !important; } }\n `],\n})\nexport class BarChartComponent {\n /** Category labels, left to right (one per bar). */\n readonly labels = input<string[]>([]);\n /** The bar values, in the order of `labels`. */\n readonly values = input<number[]>([]);\n /** Bar colour (any CSS colour). */\n readonly color = input('#3b82f6');\n /** Bar colour while hovered. */\n readonly hoverColor = input('#2563eb');\n /** Chart height in px. */\n readonly height = input(240);\n /** Spoken description of the chart. */\n readonly ariaLabel = input('');\n /** Show each bar's value above it. */\n readonly showValues = input(true);\n /** Tooltip unit for exactly 1 (e.g. \"call\"). */\n readonly unitSingular = input('');\n /** Tooltip unit for any other value (e.g. \"calls\"). */\n readonly unitPlural = input('');\n\n private readonly canvas = viewChild.required<ElementRef<HTMLCanvasElement>>('canvas');\n private readonly zone = inject(NgZone);\n private chart: Chart<'bar'> | null = null;\n\n private readonly tooltipText = (value: number): string => {\n const unit = value === 1 ? this.unitSingular() : this.unitPlural();\n return unit ? `${value} ${unit}` : String(value);\n };\n\n protected readonly series = computed(() => ({\n labels: this.labels(),\n data: this.values(),\n color: this.color(),\n hoverColor: this.hoverColor(),\n showValues: this.showValues(),\n }));\n\n constructor() {\n effect(() => {\n const s = this.series();\n const canvas = this.canvas().nativeElement;\n if (!this.chart) {\n registerChartParts();\n this.zone.runOutsideAngular(() => {\n this.chart = new Chart(canvas, {\n type: 'bar',\n data: { labels: s.labels, datasets: [{ data: s.data, backgroundColor: s.color, hoverBackgroundColor: s.hoverColor, borderRadius: 3, borderSkipped: false }] },\n options: {\n responsive: true,\n maintainAspectRatio: false,\n animation: false,\n layout: { padding: { top: 20 } },\n plugins: {\n legend: { display: false },\n tooltip: { callbacks: { label: (item) => this.tooltipText(Number(item.raw)) } },\n },\n scales: {\n y: { beginAtZero: true, ticks: { precision: 0, color: '#94a3b8', font: { size: 11 } }, grid: { color: '#e2e8f0' }, border: { display: false } },\n x: { grid: { display: false }, ticks: { maxRotation: 0, color: '#94a3b8', font: { size: 10 } }, border: { display: false } },\n },\n },\n plugins: [VALUE_LABELS],\n });\n });\n }\n const chart = this.chart!;\n chart.data.labels = s.labels;\n const ds = chart.data.datasets[0];\n ds.data = s.data;\n ds.backgroundColor = s.color;\n ds.hoverBackgroundColor = s.hoverColor;\n // the value labels plugin reads this flag at draw time\n (chart.options.plugins as Record<string, unknown>)['uiBarChartValueLabels'] = { enabled: s.showValues };\n chart.update('none');\n });\n inject(DestroyRef).onDestroy(() => { this.chart?.destroy(); this.chart = null; });\n }\n}\n"],"mappings":"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"}