@firestitch/report 18.0.0

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.
Files changed (58) hide show
  1. package/app/reports/components/component-chart/component-chart.component.d.ts +16 -0
  2. package/app/reports/components/component-kpi/component-kpi.component.d.ts +12 -0
  3. package/app/reports/components/component-list/component-list.component.d.ts +27 -0
  4. package/app/reports/components/report-canvas/report-canvas.component.d.ts +84 -0
  5. package/app/reports/components/report-component/report-component.component.d.ts +71 -0
  6. package/app/reports/components/timezone-select/timezone-select.component.d.ts +18 -0
  7. package/app/reports/data/report.data.d.ts +48 -0
  8. package/app/reports/dialogs/component-settings/component-settings.component.d.ts +49 -0
  9. package/app/reports/dialogs/report-settings/report-settings.component.d.ts +25 -0
  10. package/app/reports/export/offscreen-chart.d.ts +2 -0
  11. package/app/reports/export/report-export-collector.service.d.ts +26 -0
  12. package/app/reports/export/report-pdf.service.d.ts +13 -0
  13. package/app/reports/export/report-pptx.service.d.ts +14 -0
  14. package/app/reports/format.d.ts +1 -0
  15. package/app/reports/interfaces/report.interface.d.ts +174 -0
  16. package/app/reports/layout.d.ts +11 -0
  17. package/app/reports/option-builder.d.ts +15 -0
  18. package/app/reports/report-filter-items.d.ts +9 -0
  19. package/app/reports/services/report-filter-state.service.d.ts +25 -0
  20. package/app/reports/services/report.service.d.ts +15 -0
  21. package/app/reports/theme/echarts.d.ts +2 -0
  22. package/app/reports/theme/palette.d.ts +2 -0
  23. package/app/reports/views/report/report.component.d.ts +50 -0
  24. package/esm2022/app/reports/components/component-chart/component-chart.component.mjs +47 -0
  25. package/esm2022/app/reports/components/component-kpi/component-kpi.component.mjs +33 -0
  26. package/esm2022/app/reports/components/component-list/component-list.component.mjs +178 -0
  27. package/esm2022/app/reports/components/report-canvas/report-canvas.component.mjs +347 -0
  28. package/esm2022/app/reports/components/report-component/report-component.component.mjs +453 -0
  29. package/esm2022/app/reports/components/timezone-select/timezone-select.component.mjs +70 -0
  30. package/esm2022/app/reports/data/report.data.mjs +152 -0
  31. package/esm2022/app/reports/dialogs/component-settings/component-settings.component.mjs +221 -0
  32. package/esm2022/app/reports/dialogs/report-settings/report-settings.component.mjs +109 -0
  33. package/esm2022/app/reports/export/offscreen-chart.mjs +33 -0
  34. package/esm2022/app/reports/export/report-export-collector.service.mjs +94 -0
  35. package/esm2022/app/reports/export/report-pdf.service.mjs +155 -0
  36. package/esm2022/app/reports/export/report-pptx.service.mjs +224 -0
  37. package/esm2022/app/reports/format.mjs +25 -0
  38. package/esm2022/app/reports/interfaces/report.interface.mjs +16 -0
  39. package/esm2022/app/reports/layout.mjs +50 -0
  40. package/esm2022/app/reports/option-builder.mjs +293 -0
  41. package/esm2022/app/reports/report-filter-items.mjs +125 -0
  42. package/esm2022/app/reports/services/report-filter-state.service.mjs +177 -0
  43. package/esm2022/app/reports/services/report.service.mjs +56 -0
  44. package/esm2022/app/reports/theme/echarts.mjs +59 -0
  45. package/esm2022/app/reports/theme/palette.mjs +10 -0
  46. package/esm2022/app/reports/views/report/report.component.mjs +354 -0
  47. package/esm2022/firestitch-report.mjs +5 -0
  48. package/esm2022/public_api.mjs +13 -0
  49. package/fesm2022/firestitch-report-echarts-BxYnpz7n.mjs +60 -0
  50. package/fesm2022/firestitch-report-echarts-BxYnpz7n.mjs.map +1 -0
  51. package/fesm2022/firestitch-report-firestitch-report-Cnotycly.mjs +3107 -0
  52. package/fesm2022/firestitch-report-firestitch-report-Cnotycly.mjs.map +1 -0
  53. package/fesm2022/firestitch-report.mjs +2 -0
  54. package/fesm2022/firestitch-report.mjs.map +1 -0
  55. package/index.d.ts +5 -0
  56. package/package.json +39 -0
  57. package/public_api.d.ts +5 -0
  58. package/styles.scss +1 -0
@@ -0,0 +1,177 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { Subject } from 'rxjs';
3
+ import { filter as rxFilter } from 'rxjs/operators';
4
+ import { startOfMonth, startOfQuarter, startOfYear, subDays, subMonths, } from 'date-fns';
5
+ import { dateBoundString } from '../report-filter-items';
6
+ import * as i0 from "@angular/core";
7
+ // Session filter state for the open report. Filter VALUES are never persisted
8
+ // — this service holds them per filter GROUP (the propagation unit), resolves
9
+ // them into per-component member-filter values for each data request, and
10
+ // notifies the components whose groups changed so only they refetch.
11
+ //
12
+ // Also session-scoped: per-filter enable/disable toggles from a component's
13
+ // filter menu (the `enabled` column is the authored default; a viewer's toggle
14
+ // shouldn't write to the report).
15
+ export class ReportFilterStateService {
16
+ _values = new Map();
17
+ _groups = new Map();
18
+ _sessionDisabled = new Set();
19
+ // The runtime Frequency control: a single session-wide bucket override for all
20
+ // time-series charts. Unset = each chart uses its authored granularity. Never
21
+ // persisted (it dies with this report view), and carried in the data request's
22
+ // `state`, so it propagates through to the PDF/PowerPoint exports too.
23
+ _frequency = null;
24
+ _frequencyChanged$ = new Subject();
25
+ // Emits the group id that changed; components listen filtered to their own
26
+ // group ids. null = everything changed (re-init).
27
+ _changed$ = new Subject();
28
+ // Seed groups + their defaults when a report loads. Existing session values
29
+ // for still-existing groups survive a structure re-fetch (a chat edit
30
+ // shouldn't reset the viewer's filters).
31
+ init(report) {
32
+ this._groups.clear();
33
+ const validIds = new Set();
34
+ for (const group of report.filterGroups ?? []) {
35
+ this._groups.set(group.id, group);
36
+ validIds.add(group.id);
37
+ if (!this._values.has(group.id)) {
38
+ const defaultValue = this._defaultValue(group);
39
+ if (defaultValue) {
40
+ this._values.set(group.id, defaultValue);
41
+ }
42
+ }
43
+ }
44
+ for (const groupId of [...this._values.keys()]) {
45
+ if (!validIds.has(groupId)) {
46
+ this._values.delete(groupId);
47
+ }
48
+ }
49
+ this._changed$.next(null);
50
+ }
51
+ value(groupId) {
52
+ return this._values.get(groupId);
53
+ }
54
+ setValue(groupId, value) {
55
+ if (value === null) {
56
+ this._values.delete(groupId);
57
+ }
58
+ else {
59
+ this._values.set(groupId, value);
60
+ }
61
+ this._changed$.next(groupId);
62
+ }
63
+ // The active Frequency override, or null when the viewer hasn't chosen one.
64
+ frequency() {
65
+ return this._frequency;
66
+ }
67
+ setFrequency(frequency) {
68
+ this._frequency = frequency;
69
+ this._frequencyChanged$.next();
70
+ }
71
+ // Fires whenever the Frequency changes — every time-series chart listens so it
72
+ // refetches and re-buckets (the override isn't scoped to any filter group, so
73
+ // changesFor() can't carry it).
74
+ frequencyChanges() {
75
+ return this._frequencyChanged$.asObservable();
76
+ }
77
+ isFilterDisabled(filterId) {
78
+ return this._sessionDisabled.has(filterId);
79
+ }
80
+ toggleFilter(filterId, groupId) {
81
+ if (this._sessionDisabled.has(filterId)) {
82
+ this._sessionDisabled.delete(filterId);
83
+ }
84
+ else {
85
+ this._sessionDisabled.add(filterId);
86
+ }
87
+ this._changed$.next(groupId);
88
+ }
89
+ // Notifications relevant to ONE component: any change to a group one of its
90
+ // filters belongs to (or a full re-init).
91
+ changesFor(component) {
92
+ const groupIds = new Set((component.filters ?? []).map((filter) => filter.filterGroupId));
93
+ return this._changed$.asObservable()
94
+ .pipe(rxFilter((groupId) => groupId === null || groupIds.has(groupId)));
95
+ }
96
+ // The group values resolved into this component's member-filter values —
97
+ // what the data request carries. Disabled filters (authored or session) are
98
+ // skipped entirely.
99
+ resolveForComponent(component) {
100
+ const resolved = [];
101
+ for (const filter of component.filters ?? []) {
102
+ if (!filter.enabled || this._sessionDisabled.has(filter.id)) {
103
+ continue;
104
+ }
105
+ const value = this._values.get(filter.filterGroupId);
106
+ if (!value) {
107
+ continue;
108
+ }
109
+ const entry = { filterId: filter.id };
110
+ if (value.start) {
111
+ entry.start = dateBoundString(value.start);
112
+ }
113
+ if (value.end) {
114
+ entry.end = dateBoundString(value.end);
115
+ }
116
+ if (value.values?.length) {
117
+ entry.values = value.values;
118
+ }
119
+ if (value.value?.trim()) {
120
+ entry.value = value.value.trim();
121
+ }
122
+ if (entry.start || entry.end || entry.values || entry.value) {
123
+ resolved.push(entry);
124
+ }
125
+ }
126
+ return resolved;
127
+ }
128
+ // A group's authored default — relative presets resolve against "now" each
129
+ // time the report opens, so a saved "last 12 months" stays relative.
130
+ _defaultValue(group) {
131
+ const groupDefault = group.config?.default;
132
+ if (!groupDefault) {
133
+ return null;
134
+ }
135
+ if (groupDefault.relative) {
136
+ const range = this._relativeRange(groupDefault.relative);
137
+ return range ? { start: range.start, end: range.end } : null;
138
+ }
139
+ if (groupDefault.start || groupDefault.end) {
140
+ return {
141
+ start: groupDefault.start ?? null,
142
+ end: groupDefault.end ?? null,
143
+ };
144
+ }
145
+ return null;
146
+ }
147
+ _relativeRange(relative) {
148
+ const now = new Date();
149
+ switch (relative) {
150
+ case 'last7Days':
151
+ return { start: subDays(now, 7), end: now };
152
+ case 'last30Days':
153
+ return { start: subDays(now, 30), end: now };
154
+ case 'last3Months':
155
+ return { start: subMonths(now, 3), end: now };
156
+ case 'last6Months':
157
+ return { start: subMonths(now, 6), end: now };
158
+ case 'last12Months':
159
+ return { start: subMonths(now, 12), end: now };
160
+ case 'thisMonth':
161
+ return { start: startOfMonth(now), end: now };
162
+ case 'thisQuarter':
163
+ return { start: startOfQuarter(now), end: now };
164
+ case 'thisYear':
165
+ case 'yearToDate':
166
+ return { start: startOfYear(now), end: now };
167
+ default:
168
+ return null;
169
+ }
170
+ }
171
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportFilterStateService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
172
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportFilterStateService });
173
+ }
174
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportFilterStateService, decorators: [{
175
+ type: Injectable
176
+ }] });
177
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LWZpbHRlci1zdGF0ZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL3NlcnZpY2VzL3JlcG9ydC1maWx0ZXItc3RhdGUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNDLE9BQU8sRUFBYyxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDM0MsT0FBTyxFQUFFLE1BQU0sSUFBSSxRQUFRLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVwRCxPQUFPLEVBQ0wsWUFBWSxFQUFFLGNBQWMsRUFBRSxXQUFXLEVBQ3pDLE9BQU8sRUFBRSxTQUFTLEdBQ25CLE1BQU0sVUFBVSxDQUFDO0FBVWxCLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7QUFHekQsOEVBQThFO0FBQzlFLDhFQUE4RTtBQUM5RSwwRUFBMEU7QUFDMUUscUVBQXFFO0FBQ3JFLEVBQUU7QUFDRiw0RUFBNEU7QUFDNUUsK0VBQStFO0FBQy9FLGtDQUFrQztBQUVsQyxNQUFNLE9BQU8sd0JBQXdCO0lBRTNCLE9BQU8sR0FBRyxJQUFJLEdBQUcsRUFBNEIsQ0FBQztJQUM5QyxPQUFPLEdBQUcsSUFBSSxHQUFHLEVBQTZCLENBQUM7SUFDL0MsZ0JBQWdCLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztJQUU3QywrRUFBK0U7SUFDL0UsOEVBQThFO0lBQzlFLCtFQUErRTtJQUMvRSx1RUFBdUU7SUFDL0QsVUFBVSxHQUE0QixJQUFJLENBQUM7SUFDM0Msa0JBQWtCLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztJQUVqRCwyRUFBMkU7SUFDM0Usa0RBQWtEO0lBQzFDLFNBQVMsR0FBRyxJQUFJLE9BQU8sRUFBaUIsQ0FBQztJQUVqRCw0RUFBNEU7SUFDNUUsc0VBQXNFO0lBQ3RFLHlDQUF5QztJQUNsQyxJ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QkFDZCxPQUFPLEVBQUUsS0FBSyxFQUFFLFlBQVksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7WUFDaEQsS0FBSyxhQUFhO2dCQUNoQixPQUFPLEVBQUUsS0FBSyxFQUFFLGNBQWMsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7WUFDbEQsS0FBSyxVQUFVLENBQUM7WUFDaEIsS0FBSyxZQUFZO2dCQUNmLE9BQU8sRUFBRSxLQUFLLEVBQUUsV0FBVyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztZQUMvQztnQkFDRSxPQUFPLElBQUksQ0FBQztRQUNoQixDQUFDO0lBQ0gsQ0FBQzt3R0E1TFUsd0JBQXdCOzRHQUF4Qix3QkFBd0I7OzRGQUF4Qix3QkFBd0I7a0JBRHBDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbHRlciBhcyByeEZpbHRlciB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHtcbiAgc3RhcnRPZk1vbnRoLCBzdGFydE9mUXVhcnRlciwgc3RhcnRPZlllYXIsXG4gIHN1YkRheXMsIHN1Yk1vbnRocyxcbn0gZnJvbSAnZGF0ZS1mbnMnO1xuXG5pbXBvcnQge1xuICBDaGFydEdyYW51bGFyaXR5LFxuICBGaWx0ZXJHcm91cFZhbHVlLFxuICBSZXBvcnQsXG4gIFJlcG9ydENvbXBvbmVudCxcbiAgUmVwb3J0RmlsdGVyR3JvdXAsXG4gIFJlc29sdmVkRmlsdGVyVmFsdWUsXG59IGZyb20gJy4uL2ludGVyZmFjZXMvcmVwb3J0LmludGVyZmFjZSc7XG5pbXBvcnQgeyBkYXRlQm91bmRTdHJpbmcgfSBmcm9tICcuLi9yZXBvcnQtZmlsdGVyLWl0ZW1zJztcblxuXG4vLyBTZXNzaW9uIGZpbHRlciBzdGF0ZSBmb3IgdGhlIG9wZW4gcmVwb3J0LiBGaWx0ZXIgVkFMVUVTIGFyZSBuZXZlciBwZXJzaXN0ZWRcbi8vIOKAlCB0aGlzIHNlcnZpY2UgaG9sZHMgdGhlbSBwZXIgZmlsdGVyIEdST1VQICh0aGUgcHJvcGFnYXRpb24gdW5pdCksIHJlc29sdmVzXG4vLyB0aGVtIGludG8gcGVyLWNvbXBvbmVudCBtZW1iZXItZmlsdGVyIHZhbHVlcyBmb3IgZWFjaCBkYXRhIHJlcXVlc3QsIGFuZFxuLy8gbm90aWZpZXMgdGhlIGNvbXBvbmVudHMgd2hvc2UgZ3JvdXBzIGNoYW5nZWQgc28gb25seSB0aGV5IHJlZmV0Y2guXG4vL1xuLy8gQWxzbyBzZXNzaW9uLXNjb3BlZDogcGVyLWZpbHRlciBlbmFibGUvZGlzYWJsZSB0b2dnbGVzIGZyb20gYSBjb21wb25lbnQnc1xuLy8gZmlsdGVyIG1lbnUgKHRoZSBgZW5hYmxlZGAgY29sdW1uIGlzIHRoZSBhdXRob3JlZCBkZWZhdWx0OyBhIHZpZXdlcidzIHRvZ2dsZVxuLy8gc2hvdWxkbid0IHdyaXRlIHRvIHRoZSByZXBvcnQpLlxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFJlcG9ydEZpbHRlclN0YXRlU2VydmljZSB7XG5cbiAgcHJpdmF0ZSBfdmFsdWVzID0gbmV3IE1hcDxudW1iZXIsIEZpbHRlckdyb3VwVmFsdWU+KCk7XG4gIHByaXZhdGUgX2dyb3VwcyA9IG5ldyBNYXA8bnVtYmVyLCBSZXBvcnRGaWx0ZXJHcm91cD4oKTtcbiAgcHJpdmF0ZSBfc2Vzc2lvbkRpc2FibGVkID0gbmV3IFNldDxudW1iZXI+KCk7XG5cbiAgLy8gVGhlIHJ1bnRpbWUgRnJlcXVlbmN5IGNvbnRyb2w6IGEgc2luZ2xlIHNlc3Npb24td2lkZSBidWNrZXQgb3ZlcnJpZGUgZm9yIGFsbFxuICAvLyB0aW1lLXNlcmllcyBjaGFydHMuIFVuc2V0ID0gZWFjaCBjaGFydCB1c2VzIGl0cyBhdXRob3JlZCBncmFudWxhcml0eS4gTmV2ZXJcbiAgLy8gcGVyc2lzdGVkIChpdCBkaWVzIHdpdGggdGhpcyByZXBvcnQgdmlldyksIGFuZCBjYXJyaWVkIGluIHRoZSBkYXRhIHJlcXVlc3Qnc1xuICAvLyBgc3RhdGVgLCBzbyBpdCBwcm9wYWdhdGVzIHRocm91Z2ggdG8gdGhlIFBERi9Qb3dlclBvaW50IGV4cG9ydHMgdG9vLlxuICBwcml2YXRlIF9mcmVxdWVuY3k6IENoYXJ0R3JhbnVsYXJpdHkgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfZnJlcXVlbmN5Q2hhbmdlZCQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIC8vIEVtaXRzIHRoZSBncm91cCBpZCB0aGF0IGNoYW5nZWQ7IGNvbXBvbmVudHMgbGlzdGVuIGZpbHRlcmVkIHRvIHRoZWlyIG93blxuICAvLyBncm91cCBpZHMuIG51bGwgPSBldmVyeXRoaW5nIGNoYW5nZWQgKHJlLWluaXQpLlxuICBwcml2YXRlIF9jaGFuZ2VkJCA9IG5ldyBTdWJqZWN0PG51bWJlciB8IG51bGw+KCk7XG5cbiAgLy8gU2VlZCBncm91cHMgKyB0aGVpciBkZWZhdWx0cyB3aGVuIGEgcmVwb3J0IGxvYWRzLiBFeGlzdGluZyBzZXNzaW9uIHZhbHVlc1xuICAvLyBmb3Igc3RpbGwtZXhpc3RpbmcgZ3JvdXBzIHN1cnZpdmUgYSBzdHJ1Y3R1cmUgcmUtZmV0Y2ggKGEgY2hhdCBlZGl0XG4gIC8vIHNob3VsZG4ndCByZXNldCB0aGUgdmlld2VyJ3MgZmlsdGVycykuXG4gIHB1YmxpYyBpbml0KHJlcG9ydDogUmVwb3J0KTogdm9pZCB7XG4gICAgdGhpcy5fZ3JvdXBzLmNsZWFyKCk7XG5cbiAgICBjb25zdCB2YWxpZElkcyA9IG5ldyBTZXQ8bnVtYmVyPigpO1xuICAgIGZvciAoY29uc3QgZ3JvdXAgb2YgcmVwb3J0LmZpbHRlckdyb3VwcyA/PyBbXSkge1xuICAgICAgdGhpcy5fZ3JvdXBzLnNldChncm91cC5pZCwgZ3JvdXApO1xuICAgICAgdmFsaWRJZHMuYWRkKGdyb3VwLmlkKTtcblxuICAgICAgaWYgKCF0aGlzLl92YWx1ZXMuaGFzKGdyb3VwLmlkKSkge1xuICAgICAgICBjb25zdCBkZWZhdWx0VmFsdWUgPSB0aGlzLl9kZWZhdWx0VmFsdWUoZ3JvdXApO1xuICAgICAgICBpZiAoZGVmYXVsdFZhbHVlKSB7XG4gICAgICAgICAgdGhpcy5fdmFsdWVzLnNldChncm91cC5pZCwgZGVmYXVsdFZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgZ3JvdXBJZCBvZiBbLi4udGhpcy5fdmFsdWVzLmtleXMoKV0pIHtcbiAgICAgIGlmICghdmFsaWRJZHMuaGFzKGdyb3VwSWQpKSB7XG4gICAgICAgIHRoaXMuX3ZhbHVlcy5kZWxldGUoZ3JvdXBJZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5fY2hhbmdlZCQubmV4dChudWxsKTtcbiAgfVxuXG4gIHB1YmxpYyB2YWx1ZShncm91cElkOiBudW1iZXIpOiBGaWx0ZXJHcm91cFZhbHVlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWVzLmdldChncm91cElkKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRWYWx1ZShncm91cElkOiBudW1iZXIsIHZhbHVlOiBGaWx0ZXJHcm91cFZhbHVlIHwgbnVsbCk6IHZvaWQge1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgdGhpcy5fdmFsdWVzLmRlbGV0ZShncm91cElkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fdmFsdWVzLnNldChncm91cElkLCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgdGhpcy5fY2hhbmdlZCQubmV4dChncm91cElkKTtcbiAgfVxuXG4gIC8vIFRoZSBhY3RpdmUgRnJlcXVlbmN5IG92ZXJyaWRlLCBvciBudWxsIHdoZW4gdGhlIHZpZXdlciBoYXNuJ3QgY2hvc2VuIG9uZS5cbiAgcHVibGljIGZyZXF1ZW5jeSgpOiBDaGFydEdyYW51bGFyaXR5IHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX2ZyZXF1ZW5jeTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRGcmVxdWVuY3koZnJlcXVlbmN5OiBDaGFydEdyYW51bGFyaXR5IHwgbnVsbCk6IHZvaWQge1xuICAgIHRoaXMuX2ZyZXF1ZW5jeSA9IGZyZXF1ZW5jeTtcbiAgICB0aGlzLl9mcmVxdWVuY3lDaGFuZ2VkJC5uZXh0KCk7XG4gIH1cblxuICAvLyBGaXJlcyB3aGVuZXZlciB0aGUgRnJlcXVlbmN5IGNoYW5nZXMg4oCUIGV2ZXJ5IHRpbWUtc2VyaWVzIGNoYXJ0IGxpc3RlbnMgc28gaXRcbiAgLy8gcmVmZXRjaGVzIGFuZCByZS1idWNrZXRzICh0aGUgb3ZlcnJpZGUgaXNuJ3Qgc2NvcGVkIHRvIGFueSBmaWx0ZXIgZ3JvdXAsIHNvXG4gIC8vIGNoYW5nZXNGb3IoKSBjYW4ndCBjYXJyeSBpdCkuXG4gIHB1YmxpYyBmcmVxdWVuY3lDaGFuZ2VzKCk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl9mcmVxdWVuY3lDaGFuZ2VkJC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIHB1YmxpYyBpc0ZpbHRlckRpc2FibGVkKGZpbHRlcklkOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fc2Vzc2lvbkRpc2FibGVkLmhhcyhmaWx0ZXJJZCk7XG4gIH1cblxuICBwdWJsaWMgdG9nZ2xlRmlsdGVyKGZpbHRlcklkOiBudW1iZXIsIGdyb3VwSWQ6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh0aGlzLl9zZXNzaW9uRGlzYWJsZWQuaGFzKGZpbHRlcklkKSkge1xuICAgICAgdGhpcy5fc2Vzc2lvbkRpc2FibGVkLmRlbGV0ZShmaWx0ZXJJZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3Nlc3Npb25EaXNhYmxlZC5hZGQoZmlsdGVySWQpO1xuICAgIH1cblxuICAgIHRoaXMuX2NoYW5nZWQkLm5leHQoZ3JvdXBJZCk7XG4gIH1cblxuICAvLyBOb3RpZmljYXRpb25zIHJlbGV2YW50IHRvIE9ORSBjb21wb25lbnQ6IGFueSBjaGFuZ2UgdG8gYSBncm91cCBvbmUgb2YgaXRzXG4gIC8vIGZpbHRlcnMgYmVsb25ncyB0byAob3IgYSBmdWxsIHJlLWluaXQpLlxuICBwdWJsaWMgY2hhbmdlc0Zvcihjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudCk6IE9ic2VydmFibGU8bnVtYmVyIHwgbnVsbD4ge1xuICAgIGNvbnN0IGdyb3VwSWRzID0gbmV3IFNldCgoY29tcG9uZW50LmZpbHRlcnMgPz8gW10pLm1hcCgoZmlsdGVyKSA9PiBmaWx0ZXIuZmlsdGVyR3JvdXBJZCkpO1xuXG4gICAgcmV0dXJuIHRoaXMuX2NoYW5nZWQkLmFzT2JzZXJ2YWJsZSgpXG4gICAgICAucGlwZShcbiAgICAgICAgcnhGaWx0ZXIoKGdyb3VwSWQpID0+IGdyb3VwSWQgPT09IG51bGwgfHwgZ3JvdXBJZHMuaGFzKGdyb3VwSWQpKSxcbiAgICAgICk7XG4gIH1cblxuICAvLyBUaGUgZ3JvdXAgdmFsdWVzIHJlc29sdmVkIGludG8gdGhpcyBjb21wb25lbnQncyBtZW1iZXItZmlsdGVyIHZhbHVlcyDigJRcbiAgLy8gd2hhdCB0aGUgZGF0YSByZXF1ZXN0IGNhcnJpZXMuIERpc2FibGVkIGZpbHRlcnMgKGF1dGhvcmVkIG9yIHNlc3Npb24pIGFyZVxuICAvLyBza2lwcGVkIGVudGlyZWx5LlxuICBwdWJsaWMgcmVzb2x2ZUZvckNvbXBvbmVudChjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudCk6IFJlc29sdmVkRmlsdGVyVmFsdWVbXSB7XG4gICAgY29uc3QgcmVzb2x2ZWQ6IFJlc29sdmVkRmlsdGVyVmFsdWVbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBmaWx0ZXIgb2YgY29tcG9uZW50LmZpbHRlcnMgPz8gW10pIHtcbiAgICAgIGlmICghZmlsdGVyLmVuYWJsZWQgfHwgdGhpcy5fc2Vzc2lvbkRpc2FibGVkLmhhcyhmaWx0ZXIuaWQpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuX3ZhbHVlcy5nZXQoZmlsdGVyLmZpbHRlckdyb3VwSWQpO1xuICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZW50cnk6IFJlc29sdmVkRmlsdGVyVmFsdWUgPSB7IGZpbHRlcklkOiBmaWx0ZXIuaWQgfTtcblxuICAgICAgaWYgKHZhbHVlLnN0YXJ0KSB7XG4gICAgICAgIGVudHJ5LnN0YXJ0ID0gZGF0ZUJvdW5kU3RyaW5nKHZhbHVlLnN0YXJ0KTtcbiAgICAgIH1cbiAgICAgIGlmICh2YWx1ZS5lbmQpIHtcbiAgICAgICAgZW50cnkuZW5kID0gZGF0ZUJvdW5kU3RyaW5nKHZhbHVlLmVuZCk7XG4gICAgICB9XG4gICAgICBpZiAodmFsdWUudmFsdWVzPy5sZW5ndGgpIHtcbiAgICAgICAgZW50cnkudmFsdWVzID0gdmFsdWUudmFsdWVzO1xuICAgICAgfVxuICAgICAgaWYgKHZhbHVlLnZhbHVlPy50cmltKCkpIHtcbiAgICAgICAgZW50cnkudmFsdWUgPSB2YWx1ZS52YWx1ZS50cmltKCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChlbnRyeS5zdGFydCB8fCBlbnRyeS5lbmQgfHwgZW50cnkudmFsdWVzIHx8IGVudHJ5LnZhbHVlKSB7XG4gICAgICAgIHJlc29sdmVkLnB1c2goZW50cnkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXNvbHZlZDtcbiAgfVxuXG4gIC8vIEEgZ3JvdXAncyBhdXRob3JlZCBkZWZhdWx0IOKAlCByZWxhdGl2ZSBwcmVzZXRzIHJlc29sdmUgYWdhaW5zdCBcIm5vd1wiIGVhY2hcbiAgLy8gdGltZSB0aGUgcmVwb3J0IG9wZW5zLCBzbyBhIHNhdmVkIFwibGFzdCAxMiBtb250aHNcIiBzdGF5cyByZWxhdGl2ZS5cbiAgcHJpdmF0ZSBfZGVmYXVsdFZhbHVlKGdyb3VwOiBSZXBvcnRGaWx0ZXJHcm91cCk6IEZpbHRlckdyb3VwVmFsdWUgfCBudWxsIHtcbiAgICBjb25zdCBncm91cERlZmF1bHQgPSBncm91cC5jb25maWc/LmRlZmF1bHQ7XG4gICAgaWYgKCFncm91cERlZmF1bHQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChncm91cERlZmF1bHQucmVsYXRpdmUpIHtcbiAgICAgIGNvbnN0IHJhbmdlID0gdGhpcy5fcmVsYXRpdmVSYW5nZShncm91cERlZmF1bHQucmVsYXRpdmUpO1xuXG4gICAgICByZXR1cm4gcmFuZ2UgPyB7IHN0YXJ0OiByYW5nZS5zdGFydCwgZW5kOiByYW5nZS5lbmQgfSA6IG51bGw7XG4gICAgfVxuXG4gICAgaWYgKGdyb3VwRGVmYXVsdC5zdGFydCB8fCBncm91cERlZmF1bHQuZW5kKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdGFydDogZ3JvdXBEZWZhdWx0LnN0YXJ0ID8/IG51bGwsXG4gICAgICAgIGVuZDogZ3JvdXBEZWZhdWx0LmVuZCA/PyBudWxsLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgX3JlbGF0aXZlUmFuZ2UocmVsYXRpdmU6IHN0cmluZyk6IHsgc3RhcnQ6IERhdGU7IGVuZDogRGF0ZSB9IHwgbnVsbCB7XG4gICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcblxuICAgIHN3aXRjaCAocmVsYXRpdmUpIHtcbiAgICAgIGNhc2UgJ2xhc3Q3RGF5cyc6XG4gICAgICAgIHJldHVybiB7IHN0YXJ0OiBzdWJEYXlzKG5vdywgNyksIGVuZDogbm93IH07XG4gICAgICBjYXNlICdsYXN0MzBEYXlzJzpcbiAgICAgICAgcmV0dXJuIHsgc3RhcnQ6IHN1YkRheXMobm93LCAzMCksIGVuZDogbm93IH07XG4gICAgICBjYXNlICdsYXN0M01vbnRocyc6XG4gICAgICAgIHJldHVybiB7IHN0YXJ0OiBzdWJNb250aHMobm93LCAzKSwgZW5kOiBub3cgfTtcbiAgICAgIGNhc2UgJ2xhc3Q2TW9udGhzJzpcbiAgICAgICAgcmV0dXJuIHsgc3RhcnQ6IHN1Yk1vbnRocyhub3csIDYpLCBlbmQ6IG5vdyB9O1xuICAgICAgY2FzZSAnbGFzdDEyTW9udGhzJzpcbiAgICAgICAgcmV0dXJuIHsgc3RhcnQ6IHN1Yk1vbnRocyhub3csIDEyKSwgZW5kOiBub3cgfTtcbiAgICAgIGNhc2UgJ3RoaXNNb250aCc6XG4gICAgICAgIHJldHVybiB7IHN0YXJ0OiBzdGFydE9mTW9udGgobm93KSwgZW5kOiBub3cgfTtcbiAgICAgIGNhc2UgJ3RoaXNRdWFydGVyJzpcbiAgICAgICAgcmV0dXJuIHsgc3RhcnQ6IHN0YXJ0T2ZRdWFydGVyKG5vdyksIGVuZDogbm93IH07XG4gICAgICBjYXNlICd0aGlzWWVhcic6XG4gICAgICBjYXNlICd5ZWFyVG9EYXRlJzpcbiAgICAgICAgcmV0dXJuIHsgc3RhcnQ6IHN0YXJ0T2ZZZWFyKG5vdyksIGVuZDogbm93IH07XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,56 @@
1
+ import { Injectable, inject } from '@angular/core';
2
+ import { BehaviorSubject, of } from 'rxjs';
3
+ import { map, tap } from 'rxjs/operators';
4
+ import { ReportData } from '../data/report.data';
5
+ import * as i0 from "@angular/core";
6
+ // Holds the report list in memory so the picker doesn't hit the API on every
7
+ // focus. Loaded once when the page opens; create/rename/delete keep the cache
8
+ // in sync.
9
+ export class ReportService {
10
+ _reportData = inject(ReportData);
11
+ _reports$ = new BehaviorSubject([]);
12
+ get reports$() {
13
+ return this._reports$.asObservable();
14
+ }
15
+ load() {
16
+ return this._reportData.reports()
17
+ .pipe(tap((reports) => this._reports$.next(reports ?? [])));
18
+ }
19
+ // Filters the cached list locally — what the autocomplete's [fetch] calls.
20
+ filter(keyword) {
21
+ const term = (keyword ?? '').trim().toLowerCase();
22
+ const reports = this._reports$.getValue();
23
+ if (!term) {
24
+ return of(reports);
25
+ }
26
+ return of(reports.filter((report) => report.name.toLowerCase().includes(term)));
27
+ }
28
+ create(name) {
29
+ return this._reportData.create(name)
30
+ .pipe(tap((report) => {
31
+ this._reports$.next([...this._reports$.getValue(), report]);
32
+ }));
33
+ }
34
+ rename(reportId, name) {
35
+ return this._reportData.rename(reportId, name)
36
+ .pipe(tap((report) => {
37
+ this._reports$.next(this._reports$.getValue()
38
+ .map((existing) => (existing.id === report.id ? report : existing)));
39
+ }));
40
+ }
41
+ delete(reportId) {
42
+ return this._reportData.delete(reportId)
43
+ .pipe(tap(() => {
44
+ this._reports$.next(this._reports$.getValue().filter((report) => report.id !== reportId));
45
+ }), map(() => undefined));
46
+ }
47
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
48
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportService, providedIn: 'root' });
49
+ }
50
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportService, decorators: [{
51
+ type: Injectable,
52
+ args: [{
53
+ providedIn: 'root',
54
+ }]
55
+ }] });
56
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3JlcG9ydHMvc2VydmljZXMvcmVwb3J0LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFbkQsT0FBTyxFQUFFLGVBQWUsRUFBYyxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdkQsT0FBTyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUxQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0scUJBQXFCLENBQUM7O0FBSWpELDZFQUE2RTtBQUM3RSw4RUFBOEU7QUFDOUUsV0FBVztBQUlYLE1BQU0sT0FBTyxhQUFhO0lBRWhCLFdBQVcsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7SUFFakMsU0FBUyxHQUFHLElBQUksZUFBZSxDQUFtQixFQUFFLENBQUMsQ0FBQztJQUU5RCxJQUFXLFFBQVE7UUFDakIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3ZDLENBQUM7SUFFTSxJQUFJO1FBQ1QsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRTthQUM5QixJQUFJLENBQ0gsR0FBRyxDQUFDLENBQUMsT0FBeUIsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQ3ZFLENBQUM7SUFDTixDQUFDO0lBRUQsMkVBQTJFO0lBQ3BFLE1BQU0sQ0FBQyxPQUFlO1FBQzNCLE1BQU0sSUFBSSxHQUFHLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ2xELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUM7UUFFMUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ1YsT0FBTyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDckIsQ0FBQztRQUVELE9BQU8sRUFBRSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNsRixDQUFDO0lBRU0sTUFBTSxDQUFDLElBQVk7UUFDeEIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7YUFDakMsSUFBSSxDQUNILEdBQUcsQ0FBQyxDQUFDLE1BQXNCLEVBQUUsRUFBRTtZQUM3QixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQzlELENBQUMsQ0FBQyxDQUNILENBQUM7SUFDTixDQUFDO0lBRU0sTUFBTSxDQUFDLFFBQWdCLEVBQUUsSUFBWTtRQUMxQyxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUM7YUFDM0MsSUFBSSxDQUNILEdBQUcsQ0FBQyxDQUFDLE1BQXNCLEVBQUUsRUFBRTtZQUM3QixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FDakIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUU7aUJBQ3RCLEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxLQUFLLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FDdEUsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUNILENBQUM7SUFDTixDQUFDO0lBRU0sTUFBTSxDQUFDLFFBQWdCO1FBQzVCLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDO2FBQ3JDLElBQUksQ0FDSCxHQUFHLENBQUMsR0FBRyxFQUFFO1lBQ1AsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQ2pCLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxLQUFLLFFBQVEsQ0FBQyxDQUNyRSxDQUFDO1FBQ0osQ0FBQyxDQUFDLEVBQ0YsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUNyQixDQUFDO0lBQ04sQ0FBQzt3R0E1RFUsYUFBYTs0R0FBYixhQUFhLGNBRlosTUFBTTs7NEZBRVAsYUFBYTtrQkFIekIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlLCBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IFJlcG9ydERhdGEgfSBmcm9tICcuLi9kYXRhL3JlcG9ydC5kYXRhJztcbmltcG9ydCB7IFJlcG9ydExpc3RJdGVtIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9yZXBvcnQuaW50ZXJmYWNlJztcblxuXG4vLyBIb2xkcyB0aGUgcmVwb3J0IGxpc3QgaW4gbWVtb3J5IHNvIHRoZSBwaWNrZXIgZG9lc24ndCBoaXQgdGhlIEFQSSBvbiBldmVyeVxuLy8gZm9jdXMuIExvYWRlZCBvbmNlIHdoZW4gdGhlIHBhZ2Ugb3BlbnM7IGNyZWF0ZS9yZW5hbWUvZGVsZXRlIGtlZXAgdGhlIGNhY2hlXG4vLyBpbiBzeW5jLlxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIFJlcG9ydFNlcnZpY2Uge1xuXG4gIHByaXZhdGUgX3JlcG9ydERhdGEgPSBpbmplY3QoUmVwb3J0RGF0YSk7XG5cbiAgcHJpdmF0ZSBfcmVwb3J0cyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFJlcG9ydExpc3RJdGVtW10+KFtdKTtcblxuICBwdWJsaWMgZ2V0IHJlcG9ydHMkKCk6IE9ic2VydmFibGU8UmVwb3J0TGlzdEl0ZW1bXT4ge1xuICAgIHJldHVybiB0aGlzLl9yZXBvcnRzJC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIHB1YmxpYyBsb2FkKCk6IE9ic2VydmFibGU8UmVwb3J0TGlzdEl0ZW1bXT4ge1xuICAgIHJldHVybiB0aGlzLl9yZXBvcnREYXRhLnJlcG9ydHMoKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRhcCgocmVwb3J0czogUmVwb3J0TGlzdEl0ZW1bXSkgPT4gdGhpcy5fcmVwb3J0cyQubmV4dChyZXBvcnRzID8/IFtdKSksXG4gICAgICApO1xuICB9XG5cbiAgLy8gRmlsdGVycyB0aGUgY2FjaGVkIGxpc3QgbG9jYWxseSDigJQgd2hhdCB0aGUgYXV0b2NvbXBsZXRlJ3MgW2ZldGNoXSBjYWxscy5cbiAgcHVibGljIGZpbHRlcihrZXl3b3JkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPFJlcG9ydExpc3RJdGVtW10+IHtcbiAgICBjb25zdCB0ZXJtID0gKGtleXdvcmQgPz8gJycpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IHJlcG9ydHMgPSB0aGlzLl9yZXBvcnRzJC5nZXRWYWx1ZSgpO1xuXG4gICAgaWYgKCF0ZXJtKSB7XG4gICAgICByZXR1cm4gb2YocmVwb3J0cyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG9mKHJlcG9ydHMuZmlsdGVyKChyZXBvcnQpID0+IHJlcG9ydC5uYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModGVybSkpKTtcbiAgfVxuXG4gIHB1YmxpYyBjcmVhdGUobmFtZTogc3RyaW5nKTogT2JzZXJ2YWJsZTxSZXBvcnRMaXN0SXRlbT4ge1xuICAgIHJldHVybiB0aGlzLl9yZXBvcnREYXRhLmNyZWF0ZShuYW1lKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRhcCgocmVwb3J0OiBSZXBvcnRMaXN0SXRlbSkgPT4ge1xuICAgICAgICAgIHRoaXMuX3JlcG9ydHMkLm5leHQoWy4uLnRoaXMuX3JlcG9ydHMkLmdldFZhbHVlKCksIHJlcG9ydF0pO1xuICAgICAgICB9KSxcbiAgICAgICk7XG4gIH1cblxuICBwdWJsaWMgcmVuYW1lKHJlcG9ydElkOiBudW1iZXIsIG5hbWU6IHN0cmluZyk6IE9ic2VydmFibGU8UmVwb3J0TGlzdEl0ZW0+IHtcbiAgICByZXR1cm4gdGhpcy5fcmVwb3J0RGF0YS5yZW5hbWUocmVwb3J0SWQsIG5hbWUpXG4gICAgICAucGlwZShcbiAgICAgICAgdGFwKChyZXBvcnQ6IFJlcG9ydExpc3RJdGVtKSA9PiB7XG4gICAgICAgICAgdGhpcy5fcmVwb3J0cyQubmV4dChcbiAgICAgICAgICAgIHRoaXMuX3JlcG9ydHMkLmdldFZhbHVlKClcbiAgICAgICAgICAgICAgLm1hcCgoZXhpc3RpbmcpID0+IChleGlzdGluZy5pZCA9PT0gcmVwb3J0LmlkID8gcmVwb3J0IDogZXhpc3RpbmcpKSxcbiAgICAgICAgICApO1xuICAgICAgICB9KSxcbiAgICAgICk7XG4gIH1cblxuICBwdWJsaWMgZGVsZXRlKHJlcG9ydElkOiBudW1iZXIpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fcmVwb3J0RGF0YS5kZWxldGUocmVwb3J0SWQpXG4gICAgICAucGlwZShcbiAgICAgICAgdGFwKCgpID0+IHtcbiAgICAgICAgICB0aGlzLl9yZXBvcnRzJC5uZXh0KFxuICAgICAgICAgICAgdGhpcy5fcmVwb3J0cyQuZ2V0VmFsdWUoKS5maWx0ZXIoKHJlcG9ydCkgPT4gcmVwb3J0LmlkICE9PSByZXBvcnRJZCksXG4gICAgICAgICAgKTtcbiAgICAgICAgfSksXG4gICAgICAgIG1hcCgoKSA9PiB1bmRlZmluZWQpLFxuICAgICAgKTtcbiAgfVxufVxuIl19
@@ -0,0 +1,59 @@
1
+ // Tree-shaken ECharts build for the reports renderer: only the chart types and
2
+ // components the option-builder emits are registered, keeping the lazy chunk
3
+ // lean. Loaded on demand by ngx-echarts via provideEchartsCore — see
4
+ // REPORT_ECHARTS_PROVIDERS in reports-echarts.provider.ts.
5
+ //
6
+ // The canvas renderer (not SVG) is deliberate: chart.getDataURL() needs it for
7
+ // the high-res images the PPT/PDF exports will use.
8
+ import { BarChart, LineChart, PieChart } from 'echarts/charts';
9
+ import { DatasetComponent, GridComponent, LegendComponent, TooltipComponent, } from 'echarts/components';
10
+ import * as echarts from 'echarts/core';
11
+ import { CanvasRenderer } from 'echarts/renderers';
12
+ import { REPORT_CHART_COLORS_CSS } from './palette';
13
+ echarts.use([
14
+ BarChart,
15
+ LineChart,
16
+ PieChart,
17
+ GridComponent,
18
+ TooltipComponent,
19
+ LegendComponent,
20
+ DatasetComponent,
21
+ CanvasRenderer,
22
+ ]);
23
+ // The house theme — the single place report chart "standards" live (palette,
24
+ // typography, tooltip styling). Polished defaults now; refined in the polish
25
+ // phase.
26
+ echarts.registerTheme('report', {
27
+ color: REPORT_CHART_COLORS_CSS,
28
+ textStyle: {
29
+ fontFamily: 'Roboto, "Helvetica Neue", sans-serif',
30
+ },
31
+ title: {
32
+ textStyle: { color: '#1f2933', fontSize: 14, fontWeight: 600 },
33
+ },
34
+ legend: {
35
+ textStyle: { color: '#52606d', fontSize: 11 },
36
+ },
37
+ tooltip: {
38
+ backgroundColor: 'rgba(31, 41, 51, 0.92)',
39
+ borderWidth: 0,
40
+ textStyle: { color: '#fff', fontSize: 12 },
41
+ },
42
+ categoryAxis: {
43
+ axisLine: { lineStyle: { color: '#cbd2d9' } },
44
+ axisTick: { show: false },
45
+ axisLabel: { color: '#52606d', fontSize: 11 },
46
+ splitLine: { show: false },
47
+ },
48
+ valueAxis: {
49
+ axisLine: { show: false },
50
+ axisLabel: { color: '#52606d', fontSize: 11 },
51
+ splitLine: { lineStyle: { color: '#e4e7eb' } },
52
+ },
53
+ timeAxis: {
54
+ axisLine: { lineStyle: { color: '#cbd2d9' } },
55
+ axisLabel: { color: '#52606d', fontSize: 11 },
56
+ },
57
+ });
58
+ export default echarts;
59
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWNoYXJ0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy90aGVtZS9lY2hhcnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtFQUErRTtBQUMvRSw2RUFBNkU7QUFDN0UscUVBQXFFO0FBQ3JFLDJEQUEyRDtBQUMzRCxFQUFFO0FBQ0YsK0VBQStFO0FBQy9FLG9EQUFvRDtBQUVwRCxPQUFPLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMvRCxPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLGFBQWEsRUFDYixlQUFlLEVBQ2YsZ0JBQWdCLEdBQ2pCLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFDeEMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRW5ELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUVwRCxPQUFPLENBQUMsR0FBRyxDQUFDO0lBQ1YsUUFBUTtJQUNSLFNBQVM7SUFDVCxRQUFRO0lBQ1IsYUFBYTtJQUNiLGdCQUFnQjtJQUNoQixlQUFlO0lBQ2YsZ0JBQWdCO0lBQ2hCLGNBQWM7Q0FDZixDQUFDLENBQUM7QUFFSCw2RUFBNkU7QUFDN0UsNkVBQTZFO0FBQzdFLFNBQVM7QUFDVCxPQUFPLENBQUMsYUFBYSxDQUFDLFFBQVEsRUFBRTtJQUM5QixLQUFLLEVBQUUsdUJBQXVCO0lBQzlCLFNBQVMsRUFBRTtRQUNULFVBQVUsRUFBRSxzQ0FBc0M7S0FDbkQ7SUFDRCxLQUFLLEVBQUU7UUFDTCxTQUFTLEVBQUUsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRTtLQUMvRDtJQUNELE1BQU0sRUFBRTtRQUNOLFNBQVMsRUFBRSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRTtLQUM5QztJQUNELE9BQU8sRUFBRTtRQUNQLGVBQWUsRUFBRSx3QkFBd0I7UUFDekMsV0FBVyxFQUFFLENBQUM7UUFDZCxTQUFTLEVBQUUsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUU7S0FDM0M7SUFDRCxZQUFZLEVBQUU7UUFDWixRQUFRLEVBQUUsRUFBRSxTQUFTLEVBQUUsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLEVBQUU7UUFDN0MsUUFBUSxFQUFFLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRTtRQUN6QixTQUFTLEVBQUUsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUU7UUFDN0MsU0FBUyxFQUFFLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRTtLQUMzQjtJQUNELFNBQVMsRUFBRTtRQUNULFFBQVEsRUFBRSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUU7UUFDekIsU0FBUyxFQUFFLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFO1FBQzdDLFNBQVMsRUFBRSxFQUFFLFNBQVMsRUFBRSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsRUFBRTtLQUMvQztJQUNELFFBQVEsRUFBRTtRQUNSLFFBQVEsRUFBRSxFQUFFLFNBQVMsRUFBRSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsRUFBRTtRQUM3QyxTQUFTLEVBQUUsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUU7S0FDOUM7Q0FDRixDQUFDLENBQUM7QUFFSCxlQUFlLE9BQU8sQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIFRyZWUtc2hha2VuIEVDaGFydHMgYnVpbGQgZm9yIHRoZSByZXBvcnRzIHJlbmRlcmVyOiBvbmx5IHRoZSBjaGFydCB0eXBlcyBhbmRcbi8vIGNvbXBvbmVudHMgdGhlIG9wdGlvbi1idWlsZGVyIGVtaXRzIGFyZSByZWdpc3RlcmVkLCBrZWVwaW5nIHRoZSBsYXp5IGNodW5rXG4vLyBsZWFuLiBMb2FkZWQgb24gZGVtYW5kIGJ5IG5neC1lY2hhcnRzIHZpYSBwcm92aWRlRWNoYXJ0c0NvcmUg4oCUIHNlZVxuLy8gUkVQT1JUX0VDSEFSVFNfUFJPVklERVJTIGluIHJlcG9ydHMtZWNoYXJ0cy5wcm92aWRlci50cy5cbi8vXG4vLyBUaGUgY2FudmFzIHJlbmRlcmVyIChub3QgU1ZHKSBpcyBkZWxpYmVyYXRlOiBjaGFydC5nZXREYXRhVVJMKCkgbmVlZHMgaXQgZm9yXG4vLyB0aGUgaGlnaC1yZXMgaW1hZ2VzIHRoZSBQUFQvUERGIGV4cG9ydHMgd2lsbCB1c2UuXG5cbmltcG9ydCB7IEJhckNoYXJ0LCBMaW5lQ2hhcnQsIFBpZUNoYXJ0IH0gZnJvbSAnZWNoYXJ0cy9jaGFydHMnO1xuaW1wb3J0IHtcbiAgRGF0YXNldENvbXBvbmVudCxcbiAgR3JpZENvbXBvbmVudCxcbiAgTGVnZW5kQ29tcG9uZW50LFxuICBUb29sdGlwQ29tcG9uZW50LFxufSBmcm9tICdlY2hhcnRzL2NvbXBvbmVudHMnO1xuaW1wb3J0ICogYXMgZWNoYXJ0cyBmcm9tICdlY2hhcnRzL2NvcmUnO1xuaW1wb3J0IHsgQ2FudmFzUmVuZGVyZXIgfSBmcm9tICdlY2hhcnRzL3JlbmRlcmVycyc7XG5cbmltcG9ydCB7IFJFUE9SVF9DSEFSVF9DT0xPUlNfQ1NTIH0gZnJvbSAnLi9wYWxldHRlJztcblxuZWNoYXJ0cy51c2UoW1xuICBCYXJDaGFydCxcbiAgTGluZUNoYXJ0LFxuICBQaWVDaGFydCxcbiAgR3JpZENvbXBvbmVudCxcbiAgVG9vbHRpcENvbXBvbmVudCxcbiAgTGVnZW5kQ29tcG9uZW50LFxuICBEYXRhc2V0Q29tcG9uZW50LFxuICBDYW52YXNSZW5kZXJlcixcbl0pO1xuXG4vLyBUaGUgaG91c2UgdGhlbWUg4oCUIHRoZSBzaW5nbGUgcGxhY2UgcmVwb3J0IGNoYXJ0IFwic3RhbmRhcmRzXCIgbGl2ZSAocGFsZXR0ZSxcbi8vIHR5cG9ncmFwaHksIHRvb2x0aXAgc3R5bGluZykuIFBvbGlzaGVkIGRlZmF1bHRzIG5vdzsgcmVmaW5lZCBpbiB0aGUgcG9saXNoXG4vLyBwaGFzZS5cbmVjaGFydHMucmVnaXN0ZXJUaGVtZSgncmVwb3J0Jywge1xuICBjb2xvcjogUkVQT1JUX0NIQVJUX0NPTE9SU19DU1MsXG4gIHRleHRTdHlsZToge1xuICAgIGZvbnRGYW1pbHk6ICdSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZicsXG4gIH0sXG4gIHRpdGxlOiB7XG4gICAgdGV4dFN0eWxlOiB7IGNvbG9yOiAnIzFmMjkzMycsIGZvbnRTaXplOiAxNCwgZm9udFdlaWdodDogNjAwIH0sXG4gIH0sXG4gIGxlZ2VuZDoge1xuICAgIHRleHRTdHlsZTogeyBjb2xvcjogJyM1MjYwNmQnLCBmb250U2l6ZTogMTEgfSxcbiAgfSxcbiAgdG9vbHRpcDoge1xuICAgIGJhY2tncm91bmRDb2xvcjogJ3JnYmEoMzEsIDQxLCA1MSwgMC45MiknLFxuICAgIGJvcmRlcldpZHRoOiAwLFxuICAgIHRleHRTdHlsZTogeyBjb2xvcjogJyNmZmYnLCBmb250U2l6ZTogMTIgfSxcbiAgfSxcbiAgY2F0ZWdvcnlBeGlzOiB7XG4gICAgYXhpc0xpbmU6IHsgbGluZVN0eWxlOiB7IGNvbG9yOiAnI2NiZDJkOScgfSB9LFxuICAgIGF4aXNUaWNrOiB7IHNob3c6IGZhbHNlIH0sXG4gICAgYXhpc0xhYmVsOiB7IGNvbG9yOiAnIzUyNjA2ZCcsIGZvbnRTaXplOiAxMSB9LFxuICAgIHNwbGl0TGluZTogeyBzaG93OiBmYWxzZSB9LFxuICB9LFxuICB2YWx1ZUF4aXM6IHtcbiAgICBheGlzTGluZTogeyBzaG93OiBmYWxzZSB9LFxuICAgIGF4aXNMYWJlbDogeyBjb2xvcjogJyM1MjYwNmQnLCBmb250U2l6ZTogMTEgfSxcbiAgICBzcGxpdExpbmU6IHsgbGluZVN0eWxlOiB7IGNvbG9yOiAnI2U0ZTdlYicgfSB9LFxuICB9LFxuICB0aW1lQXhpczoge1xuICAgIGF4aXNMaW5lOiB7IGxpbmVTdHlsZTogeyBjb2xvcjogJyNjYmQyZDknIH0gfSxcbiAgICBheGlzTGFiZWw6IHsgY29sb3I6ICcjNTI2MDZkJywgZm9udFNpemU6IDExIH0sXG4gIH0sXG59KTtcblxuZXhwb3J0IGRlZmF1bHQgZWNoYXJ0cztcbiJdfQ==
@@ -0,0 +1,10 @@
1
+ // The report chart palette — one definition shared by the ECharts theme (on
2
+ // screen), the PowerPoint export's native chart colors, and the PDF export,
3
+ // so a series keeps its color across every medium.
4
+ export const REPORT_CHART_COLORS = [
5
+ '4e79a7', 'f28e2b', 'e15759', '76b7b2', '59a14f',
6
+ 'edc948', 'b07aa1', 'ff9da7', '9c755f', 'bab0ac',
7
+ ];
8
+ // CSS-hex form for ECharts.
9
+ export const REPORT_CHART_COLORS_CSS = REPORT_CHART_COLORS.map((color) => `#${color}`);
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFsZXR0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy90aGVtZS9wYWxldHRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDRFQUE0RTtBQUM1RSw0RUFBNEU7QUFDNUUsbURBQW1EO0FBQ25ELE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHO0lBQ2pDLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRO0lBQ2hELFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRO0NBQ2pELENBQUM7QUFFRiw0QkFBNEI7QUFDNUIsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsbUJBQW1CLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxJQUFJLEtBQUssRUFBRSxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBUaGUgcmVwb3J0IGNoYXJ0IHBhbGV0dGUg4oCUIG9uZSBkZWZpbml0aW9uIHNoYXJlZCBieSB0aGUgRUNoYXJ0cyB0aGVtZSAob25cbi8vIHNjcmVlbiksIHRoZSBQb3dlclBvaW50IGV4cG9ydCdzIG5hdGl2ZSBjaGFydCBjb2xvcnMsIGFuZCB0aGUgUERGIGV4cG9ydCxcbi8vIHNvIGEgc2VyaWVzIGtlZXBzIGl0cyBjb2xvciBhY3Jvc3MgZXZlcnkgbWVkaXVtLlxuZXhwb3J0IGNvbnN0IFJFUE9SVF9DSEFSVF9DT0xPUlMgPSBbXG4gICc0ZTc5YTcnLCAnZjI4ZTJiJywgJ2UxNTc1OScsICc3NmI3YjInLCAnNTlhMTRmJyxcbiAgJ2VkYzk0OCcsICdiMDdhYTEnLCAnZmY5ZGE3JywgJzljNzU1ZicsICdiYWIwYWMnLFxuXTtcblxuLy8gQ1NTLWhleCBmb3JtIGZvciBFQ2hhcnRzLlxuZXhwb3J0IGNvbnN0IFJFUE9SVF9DSEFSVF9DT0xPUlNfQ1NTID0gUkVQT1JUX0NIQVJUX0NPTE9SUy5tYXAoKGNvbG9yKSA9PiBgIyR7Y29sb3J9YCk7XG4iXX0=