@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.
- package/app/reports/components/component-chart/component-chart.component.d.ts +16 -0
- package/app/reports/components/component-kpi/component-kpi.component.d.ts +12 -0
- package/app/reports/components/component-list/component-list.component.d.ts +27 -0
- package/app/reports/components/report-canvas/report-canvas.component.d.ts +84 -0
- package/app/reports/components/report-component/report-component.component.d.ts +71 -0
- package/app/reports/components/timezone-select/timezone-select.component.d.ts +18 -0
- package/app/reports/data/report.data.d.ts +48 -0
- package/app/reports/dialogs/component-settings/component-settings.component.d.ts +49 -0
- package/app/reports/dialogs/report-settings/report-settings.component.d.ts +25 -0
- package/app/reports/export/offscreen-chart.d.ts +2 -0
- package/app/reports/export/report-export-collector.service.d.ts +26 -0
- package/app/reports/export/report-pdf.service.d.ts +13 -0
- package/app/reports/export/report-pptx.service.d.ts +14 -0
- package/app/reports/format.d.ts +1 -0
- package/app/reports/interfaces/report.interface.d.ts +174 -0
- package/app/reports/layout.d.ts +11 -0
- package/app/reports/option-builder.d.ts +15 -0
- package/app/reports/report-filter-items.d.ts +9 -0
- package/app/reports/services/report-filter-state.service.d.ts +25 -0
- package/app/reports/services/report.service.d.ts +15 -0
- package/app/reports/theme/echarts.d.ts +2 -0
- package/app/reports/theme/palette.d.ts +2 -0
- package/app/reports/views/report/report.component.d.ts +50 -0
- package/esm2022/app/reports/components/component-chart/component-chart.component.mjs +47 -0
- package/esm2022/app/reports/components/component-kpi/component-kpi.component.mjs +33 -0
- package/esm2022/app/reports/components/component-list/component-list.component.mjs +178 -0
- package/esm2022/app/reports/components/report-canvas/report-canvas.component.mjs +347 -0
- package/esm2022/app/reports/components/report-component/report-component.component.mjs +453 -0
- package/esm2022/app/reports/components/timezone-select/timezone-select.component.mjs +70 -0
- package/esm2022/app/reports/data/report.data.mjs +152 -0
- package/esm2022/app/reports/dialogs/component-settings/component-settings.component.mjs +221 -0
- package/esm2022/app/reports/dialogs/report-settings/report-settings.component.mjs +109 -0
- package/esm2022/app/reports/export/offscreen-chart.mjs +33 -0
- package/esm2022/app/reports/export/report-export-collector.service.mjs +94 -0
- package/esm2022/app/reports/export/report-pdf.service.mjs +155 -0
- package/esm2022/app/reports/export/report-pptx.service.mjs +224 -0
- package/esm2022/app/reports/format.mjs +25 -0
- package/esm2022/app/reports/interfaces/report.interface.mjs +16 -0
- package/esm2022/app/reports/layout.mjs +50 -0
- package/esm2022/app/reports/option-builder.mjs +293 -0
- package/esm2022/app/reports/report-filter-items.mjs +125 -0
- package/esm2022/app/reports/services/report-filter-state.service.mjs +177 -0
- package/esm2022/app/reports/services/report.service.mjs +56 -0
- package/esm2022/app/reports/theme/echarts.mjs +59 -0
- package/esm2022/app/reports/theme/palette.mjs +10 -0
- package/esm2022/app/reports/views/report/report.component.mjs +354 -0
- package/esm2022/firestitch-report.mjs +5 -0
- package/esm2022/public_api.mjs +13 -0
- package/fesm2022/firestitch-report-echarts-BxYnpz7n.mjs +60 -0
- package/fesm2022/firestitch-report-echarts-BxYnpz7n.mjs.map +1 -0
- package/fesm2022/firestitch-report-firestitch-report-Cnotycly.mjs +3107 -0
- package/fesm2022/firestitch-report-firestitch-report-Cnotycly.mjs.map +1 -0
- package/fesm2022/firestitch-report.mjs +2 -0
- package/fesm2022/firestitch-report.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/package.json +39 -0
- package/public_api.d.ts +5 -0
- 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=
|