@firestitch/report 18.8.1 → 18.10.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/anchor-at-point.d.ts +14 -0
- package/app/reports/canvas-landing-page.d.ts +2 -0
- package/app/reports/components/component-chart/component-chart.component.d.ts +18 -2
- package/app/reports/components/component-kpi/component-kpi.component.d.ts +4 -1
- package/app/reports/components/component-text/component-text.component.d.ts +47 -2
- package/app/reports/components/component-text/value-embed.plugin.d.ts +67 -0
- package/app/reports/components/report-canvas/report-canvas.component.d.ts +37 -9
- package/app/reports/components/report-component/report-component.component.d.ts +45 -2
- package/app/reports/components/report-view-picker/report-view-picker.component.d.ts +21 -0
- package/app/reports/data/report.data.d.ts +18 -2
- package/app/reports/dialogs/component-settings/component-settings.component.d.ts +25 -2
- package/app/reports/dialogs/report-settings/report-settings.component.d.ts +15 -6
- package/app/reports/dialogs/report-view/report-view-dialog.component.d.ts +13 -0
- package/app/reports/drill-crumbs.d.ts +12 -0
- package/app/reports/enums/report-value-formula.enum.d.ts +6 -0
- package/app/reports/export/report-export-collector.service.d.ts +35 -4
- package/app/reports/export/report-export.service.d.ts +3 -1
- package/app/reports/export/report-filter-lines.d.ts +18 -0
- package/app/reports/export/report-pdf.service.d.ts +18 -2
- package/app/reports/export/report-pptx.service.d.ts +15 -2
- package/app/reports/export/report-text-layout.service.d.ts +35 -0
- package/app/reports/filter-settings-rules.d.ts +33 -0
- package/app/reports/format.d.ts +2 -1
- package/app/reports/interfaces/canvas-landing-input.interface.d.ts +8 -0
- package/app/reports/interfaces/component-data-applied.interface.d.ts +13 -0
- package/app/reports/interfaces/component-data-drill.interface.d.ts +22 -0
- package/app/reports/interfaces/filter-bar-placement.type.d.ts +1 -0
- package/app/reports/interfaces/filter-component-toggle-state.interface.d.ts +4 -0
- package/app/reports/interfaces/filter-settings-option.interface.d.ts +4 -0
- package/app/reports/interfaces/filter-type-select-state.interface.d.ts +5 -0
- package/app/reports/interfaces/report-chart-hit.interface.d.ts +5 -0
- package/app/reports/interfaces/report-chat-viewer-cross-filter-field.interface.d.ts +4 -0
- package/app/reports/interfaces/report-chat-viewer-cross-filter.interface.d.ts +7 -0
- package/app/reports/interfaces/report-chat-viewer-detail.interface.d.ts +4 -0
- package/app/reports/interfaces/report-chat-viewer-drill-step.interface.d.ts +5 -0
- package/app/reports/interfaces/report-chat-viewer-drill.interface.d.ts +5 -0
- package/app/reports/interfaces/report-chat-viewer-filter.interface.d.ts +3 -0
- package/app/reports/interfaces/report-chat-viewer-selection.interface.d.ts +5 -0
- package/app/reports/interfaces/report-chat-viewer-state.interface.d.ts +12 -0
- package/app/reports/interfaces/report-drill-crumb.interface.d.ts +6 -0
- package/app/reports/interfaces/report-drill-refusal.type.d.ts +1 -0
- package/app/reports/interfaces/report-drill-step.interface.d.ts +5 -0
- package/app/reports/interfaces/report-export-line-kind.type.d.ts +1 -0
- package/app/reports/interfaces/report-export-line.interface.d.ts +8 -0
- package/app/reports/interfaces/report-export-lines-input.interface.d.ts +9 -0
- package/app/reports/interfaces/report-export-snapshot.interface.d.ts +15 -0
- package/app/reports/interfaces/report-filter-line-context.interface.d.ts +8 -0
- package/app/reports/interfaces/report-filter-line-form.type.d.ts +1 -0
- package/app/reports/interfaces/report-filter-match.type.d.ts +1 -0
- package/app/reports/interfaces/report-filter-option-pair.interface.d.ts +4 -0
- package/app/reports/interfaces/report-filter-options-ask.interface.d.ts +6 -0
- package/app/reports/interfaces/report-filter-options-list.interface.d.ts +7 -0
- package/app/reports/interfaces/report-filter-options-request.interface.d.ts +6 -0
- package/app/reports/interfaces/report-filter-options-stream.interface.d.ts +11 -0
- package/app/reports/interfaces/report-filter-options.interface.d.ts +7 -0
- package/app/reports/interfaces/report-filter-skip.type.d.ts +1 -0
- package/app/reports/interfaces/report-mark-action.type.d.ts +1 -0
- package/app/reports/interfaces/report-mark-click.interface.d.ts +13 -0
- package/app/reports/interfaces/report-mark-context.interface.d.ts +6 -0
- package/app/reports/interfaces/report-mark-decision.interface.d.ts +6 -0
- package/app/reports/interfaces/report-mark-event.interface.d.ts +11 -0
- package/app/reports/interfaces/report-mark-point.interface.d.ts +8 -0
- package/app/reports/interfaces/report-temporary-state.interface.d.ts +4 -0
- package/app/reports/interfaces/report-tile-state.interface.d.ts +8 -0
- package/app/reports/interfaces/report-url-link.interface.d.ts +4 -0
- package/app/reports/interfaces/report-url-value-name.type.d.ts +1 -0
- package/app/reports/interfaces/report-url-write.interface.d.ts +4 -0
- package/app/reports/interfaces/report-view-config.interface.d.ts +11 -0
- package/app/reports/interfaces/report-view-create.interface.d.ts +7 -0
- package/app/reports/interfaces/report-view-deleted.interface.d.ts +4 -0
- package/app/reports/interfaces/report-view-dialog-data.interface.d.ts +7 -0
- package/app/reports/interfaces/report-view-dropped.interface.d.ts +5 -0
- package/app/reports/interfaces/report-view-menu-item.interface.d.ts +10 -0
- package/app/reports/interfaces/report-view-summary.interface.d.ts +11 -0
- package/app/reports/interfaces/report-view.interface.d.ts +7 -0
- package/app/reports/interfaces/report-viewer-feature.type.d.ts +1 -0
- package/app/reports/interfaces/report-views.interface.d.ts +7 -0
- package/app/reports/interfaces/report.interface.d.ts +48 -5
- package/app/reports/interfaces/tile-load-result.interface.d.ts +4 -0
- package/app/reports/layout.d.ts +2 -0
- package/app/reports/mark-click.d.ts +20 -0
- package/app/reports/option-builder.d.ts +12 -1
- package/app/reports/report-chat-viewer-state.d.ts +8 -0
- package/app/reports/report-date-presets.d.ts +2 -0
- package/app/reports/report-filter-items.d.ts +27 -22
- package/app/reports/report-tile.d.ts +2 -0
- package/app/reports/report-url-state.d.ts +27 -10
- package/app/reports/report-view-config.d.ts +36 -0
- package/app/reports/report-view-menu.d.ts +15 -0
- package/app/reports/report-viewer-features.d.ts +5 -0
- package/app/reports/services/report-filter-options.service.d.ts +26 -0
- package/app/reports/services/report-filter-state.service.d.ts +65 -2
- package/app/reports/services/report-view.service.d.ts +51 -0
- package/app/reports/text.d.ts +50 -0
- package/app/reports/tile-data-state.d.ts +7 -0
- package/app/reports/tile-loads.d.ts +4 -0
- package/app/reports/values.d.ts +17 -0
- package/app/reports/views/report/fs-ai-report.component.d.ts +9 -1
- package/app/reports/views/report/report.component.d.ts +6 -0
- package/esm2022/app/reports/anchor-at-point.mjs +49 -0
- package/esm2022/app/reports/canvas-landing-page.mjs +25 -0
- package/esm2022/app/reports/components/component-chart/component-chart.component.mjs +97 -5
- package/esm2022/app/reports/components/component-kpi/component-kpi.component.mjs +11 -4
- package/esm2022/app/reports/components/component-list/component-list.component.mjs +7 -1
- package/esm2022/app/reports/components/component-text/component-text.component.mjs +213 -16
- package/esm2022/app/reports/components/component-text/value-embed.plugin.mjs +484 -0
- package/esm2022/app/reports/components/report-canvas/report-canvas.component.mjs +296 -55
- package/esm2022/app/reports/components/report-component/report-component.component.mjs +318 -76
- package/esm2022/app/reports/components/report-view-picker/report-view-picker.component.mjs +115 -0
- package/esm2022/app/reports/data/report.data.mjs +103 -8
- package/esm2022/app/reports/dialogs/component-settings/component-settings.component.mjs +210 -44
- package/esm2022/app/reports/dialogs/report-settings/report-settings.component.mjs +86 -90
- package/esm2022/app/reports/dialogs/report-view/report-view-dialog.component.mjs +52 -0
- package/esm2022/app/reports/drill-crumbs.mjs +73 -0
- package/esm2022/app/reports/enums/report-value-formula.enum.mjs +14 -0
- package/esm2022/app/reports/export/report-export-collector.service.mjs +299 -125
- package/esm2022/app/reports/export/report-export.service.mjs +57 -19
- package/esm2022/app/reports/export/report-filter-lines.mjs +235 -0
- package/esm2022/app/reports/export/report-pdf.service.mjs +315 -71
- package/esm2022/app/reports/export/report-pptx.service.mjs +293 -71
- package/esm2022/app/reports/export/report-text-layout.service.mjs +241 -0
- package/esm2022/app/reports/filter-settings-rules.mjs +283 -0
- package/esm2022/app/reports/format.mjs +13 -30
- package/esm2022/app/reports/interfaces/canvas-landing-input.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/component-data-applied.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/component-data-drill.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/filter-bar-placement.type.mjs +2 -0
- package/esm2022/app/reports/interfaces/filter-component-toggle-state.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/filter-settings-option.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/filter-type-select-state.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-chart-hit.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-chat-viewer-cross-filter-field.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-chat-viewer-cross-filter.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-chat-viewer-detail.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-chat-viewer-drill-step.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-chat-viewer-drill.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-chat-viewer-filter.interface.mjs +1 -1
- package/esm2022/app/reports/interfaces/report-chat-viewer-selection.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-chat-viewer-state.interface.mjs +1 -1
- package/esm2022/app/reports/interfaces/report-drill-crumb.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-drill-refusal.type.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-drill-step.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-export-line-kind.type.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-export-line.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-export-lines-input.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-export-snapshot.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-filter-line-context.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-filter-line-form.type.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-filter-match.type.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-filter-option-pair.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-filter-options-ask.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-filter-options-list.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-filter-options-request.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-filter-options-stream.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-filter-options.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-filter-skip.type.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-mark-action.type.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-mark-click.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-mark-context.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-mark-decision.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-mark-event.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-mark-point.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-temporary-state.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-tile-state.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-url-link.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-url-value-name.type.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-url-write.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-view-config.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-view-create.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-view-deleted.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-view-dialog-data.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-view-dropped.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-view-menu-item.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-view-summary.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-view.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-viewer-feature.type.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-views.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report.interface.mjs +1 -1
- package/esm2022/app/reports/interfaces/tile-load-result.interface.mjs +2 -0
- package/esm2022/app/reports/layout.mjs +11 -1
- package/esm2022/app/reports/mark-click.mjs +193 -0
- package/esm2022/app/reports/option-builder.mjs +159 -15
- package/esm2022/app/reports/report-chat-viewer-state.mjs +34 -0
- package/esm2022/app/reports/report-date-presets.mjs +18 -0
- package/esm2022/app/reports/report-filter-items.mjs +343 -72
- package/esm2022/app/reports/report-tile.mjs +12 -0
- package/esm2022/app/reports/report-url-state.mjs +596 -108
- package/esm2022/app/reports/report-view-config.mjs +697 -0
- package/esm2022/app/reports/report-view-menu.mjs +119 -0
- package/esm2022/app/reports/report-viewer-features.mjs +42 -0
- package/esm2022/app/reports/services/report-filter-options.service.mjs +238 -0
- package/esm2022/app/reports/services/report-filter-state.service.mjs +715 -71
- package/esm2022/app/reports/services/report-view.service.mjs +358 -0
- package/esm2022/app/reports/text.mjs +293 -85
- package/esm2022/app/reports/tile-data-state.mjs +127 -0
- package/esm2022/app/reports/tile-loads.mjs +38 -0
- package/esm2022/app/reports/values.mjs +183 -0
- package/esm2022/app/reports/views/report/fs-ai-report.component.mjs +180 -46
- package/esm2022/app/reports/views/report/report.component.mjs +106 -23
- package/esm2022/public_api.mjs +24 -1
- package/fesm2022/{firestitch-report-echarts-CFnbJx44.mjs → firestitch-report-echarts-UBg8Wlhd.mjs} +2 -2
- package/fesm2022/{firestitch-report-echarts-CFnbJx44.mjs.map → firestitch-report-echarts-UBg8Wlhd.mjs.map} +1 -1
- package/fesm2022/{firestitch-report-firestitch-report-CSylkyko.mjs → firestitch-report-firestitch-report-B1keNrcK.mjs} +11315 -4201
- package/fesm2022/firestitch-report-firestitch-report-B1keNrcK.mjs.map +1 -0
- package/fesm2022/firestitch-report.mjs +1 -1
- package/package.json +1 -1
- package/public_api.d.ts +23 -0
- package/fesm2022/firestitch-report-firestitch-report-CSylkyko.mjs.map +0 -1
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
import { Observable } from 'rxjs';
|
|
2
2
|
import { ReportChatViewerFilter } from '../interfaces/report-chat-viewer-filter.interface';
|
|
3
|
-
import {
|
|
3
|
+
import { ReportDrillStep } from '../interfaces/report-drill-step.interface';
|
|
4
|
+
import { ReportFilterMatch } from '../interfaces/report-filter-match.type';
|
|
5
|
+
import { ReportViewConfig } from '../interfaces/report-view-config.interface';
|
|
6
|
+
import { ChartGranularity, FilterGroupDefault, FilterGroupValue, Report, ReportComponent, ReportFilterGroup, ReportFormatContext, ReportRelativeRange, ReportSort, ReportUrlParams, ReportUrlSnapshot, ResolvedFilterValue } from '../interfaces/report.interface';
|
|
7
|
+
import { ComponentDataState } from '../interfaces/report.interface';
|
|
4
8
|
import * as i0 from "@angular/core";
|
|
5
9
|
export declare function sameDefault(a: FilterGroupDefault | null, b: FilterGroupDefault | null): boolean;
|
|
6
10
|
export declare function sameFilterValue(a: FilterGroupValue | null | undefined, b: FilterGroupValue | null | undefined): boolean;
|
|
@@ -17,6 +21,15 @@ export declare class ReportFilterStateService {
|
|
|
17
21
|
readonly timezone: import("@angular/core").WritableSignal<string>;
|
|
18
22
|
readonly formatContext: import("@angular/core").WritableSignal<ReportFormatContext>;
|
|
19
23
|
readonly listHidden: import("@angular/core").WritableSignal<ReadonlyMap<number, readonly string[]>>;
|
|
24
|
+
readonly stateVersion: import("@angular/core").Signal<number>;
|
|
25
|
+
readonly appliedVersion: import("@angular/core").Signal<number>;
|
|
26
|
+
readonly listSortResets: import("@angular/core").Signal<ReadonlyMap<number, number>>;
|
|
27
|
+
readonly page: import("@angular/core").Signal<number>;
|
|
28
|
+
readonly match: import("@angular/core").Signal<ReportFilterMatch>;
|
|
29
|
+
readonly viewerFeatures: import("@angular/core").Signal<import("@firestitch/report").ReportViewerFeature[]>;
|
|
30
|
+
readonly report: import("@angular/core").Signal<Report>;
|
|
31
|
+
readonly base: import("@angular/core").Signal<ReportViewConfig>;
|
|
32
|
+
readonly viewChanged: import("@angular/core").Signal<boolean>;
|
|
20
33
|
private _values;
|
|
21
34
|
private _groups;
|
|
22
35
|
private _sessionDisabled;
|
|
@@ -30,6 +43,17 @@ export declare class ReportFilterStateService {
|
|
|
30
43
|
private _listSearchChanged$;
|
|
31
44
|
private _changed$;
|
|
32
45
|
private _urlChanged$;
|
|
46
|
+
private _revision;
|
|
47
|
+
private _stateVersion;
|
|
48
|
+
private _appliedVersion;
|
|
49
|
+
private _listSortResets;
|
|
50
|
+
private _report;
|
|
51
|
+
private _pageId;
|
|
52
|
+
private _match;
|
|
53
|
+
private _drills;
|
|
54
|
+
private _drillChanged$;
|
|
55
|
+
private _baseConfig;
|
|
56
|
+
private _temporary;
|
|
33
57
|
init(report: Report, restore?: ReportUrlParams | null): void;
|
|
34
58
|
value(groupId: number): FilterGroupValue | undefined;
|
|
35
59
|
setValue(groupId: number, value: FilterGroupValue | null): void;
|
|
@@ -53,9 +77,27 @@ export declare class ReportFilterStateService {
|
|
|
53
77
|
isFilterDisabled(filterId: number): boolean;
|
|
54
78
|
toggleFilter(filterId: number, groupId: number): void;
|
|
55
79
|
changesFor(component: ReportComponent): Observable<number | null>;
|
|
80
|
+
changesForAny(components: () => ReportComponent[]): Observable<number>;
|
|
56
81
|
resolveForComponent(component: ReportComponent): ResolvedFilterValue[];
|
|
57
82
|
viewerFilters(): ReportChatViewerFilter[];
|
|
58
83
|
resolveForReport(report: Report, pageId?: number | null): ResolvedFilterValue[];
|
|
84
|
+
setPage(pageId: number | null): void;
|
|
85
|
+
setMatch(match: ReportFilterMatch): void;
|
|
86
|
+
drill(componentId: number): readonly ReportDrillStep[];
|
|
87
|
+
setDrill(componentId: number, path: readonly ReportDrillStep[]): void;
|
|
88
|
+
drillChanges(componentId: number): Observable<void>;
|
|
89
|
+
adoptDrill(componentId: number, path: readonly ReportDrillStep[]): boolean;
|
|
90
|
+
snapshot(): ReportViewConfig;
|
|
91
|
+
authoredConfig(): ReportViewConfig;
|
|
92
|
+
apply(config: ReportViewConfig | null, urlDiff?: ReportViewConfig | null, base?: ReportViewConfig | null): void;
|
|
93
|
+
resetToBase(): void;
|
|
94
|
+
setBaseToScreen(): void;
|
|
95
|
+
clearBase(): void;
|
|
96
|
+
resetGroupsToBase(groupIds: readonly number[]): void;
|
|
97
|
+
groupsDifferFromBase(groupIds: readonly number[]): boolean;
|
|
98
|
+
rewriteUrl(): void;
|
|
99
|
+
tileState(component: ReportComponent): ComponentDataState;
|
|
100
|
+
livePreset(groupId: number): ReportRelativeRange | null;
|
|
59
101
|
private _resolvedFields;
|
|
60
102
|
private _livePreset;
|
|
61
103
|
private _seed;
|
|
@@ -68,11 +110,32 @@ export declare class ReportFilterStateService {
|
|
|
68
110
|
private _prune;
|
|
69
111
|
private _withPreset;
|
|
70
112
|
private _isDefault;
|
|
71
|
-
private _components;
|
|
72
113
|
private _listComponents;
|
|
73
114
|
private _sortableColumns;
|
|
74
115
|
private _defaultValue;
|
|
75
116
|
private _relativeRange;
|
|
117
|
+
private _snapshotGroups;
|
|
118
|
+
private _snapshotTiles;
|
|
119
|
+
private _setBase;
|
|
120
|
+
private _applyLayer;
|
|
121
|
+
private _applyGroups;
|
|
122
|
+
private _applyGroup;
|
|
123
|
+
private _rollingValue;
|
|
124
|
+
private _seedAuthored;
|
|
125
|
+
private _clearTiles;
|
|
126
|
+
private _applyTile;
|
|
127
|
+
private _applyListTile;
|
|
128
|
+
private _setDrillPath;
|
|
129
|
+
private _applyPage;
|
|
130
|
+
private _notifyApplied;
|
|
131
|
+
private _tiles;
|
|
132
|
+
private _isChart;
|
|
133
|
+
private _pruneViewState;
|
|
134
|
+
private _pruneBase;
|
|
135
|
+
private _baseTile;
|
|
136
|
+
private _resolveExcludeAndRange;
|
|
137
|
+
private _excludeOrRangeDefault;
|
|
138
|
+
private _countSortResets;
|
|
76
139
|
static ɵfac: i0.ɵɵFactoryDeclaration<ReportFilterStateService, never>;
|
|
77
140
|
static ɵprov: i0.ɵɵInjectableDeclaration<ReportFilterStateService>;
|
|
78
141
|
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { ParamMap, Params } from '@angular/router';
|
|
2
|
+
import { Observable } from 'rxjs';
|
|
3
|
+
import { ReportUrlValueName } from '../interfaces/report-url-value-name.type';
|
|
4
|
+
import { ReportViewCreate } from '../interfaces/report-view-create.interface';
|
|
5
|
+
import { ReportViewDeleted } from '../interfaces/report-view-deleted.interface';
|
|
6
|
+
import { ReportViewSummary } from '../interfaces/report-view-summary.interface';
|
|
7
|
+
import { ReportView } from '../interfaces/report-view.interface';
|
|
8
|
+
import { Report } from '../interfaces/report.interface';
|
|
9
|
+
import * as i0 from "@angular/core";
|
|
10
|
+
export declare class ReportViewService {
|
|
11
|
+
readonly views: import("@angular/core").Signal<ReportViewSummary[]>;
|
|
12
|
+
readonly canShare: import("@angular/core").Signal<boolean>;
|
|
13
|
+
readonly openView: import("@angular/core").Signal<ReportView>;
|
|
14
|
+
readonly viewChanged: import("@angular/core").Signal<boolean>;
|
|
15
|
+
private _reportData;
|
|
16
|
+
private _filterState;
|
|
17
|
+
private _message;
|
|
18
|
+
private _destroyRef;
|
|
19
|
+
private _views;
|
|
20
|
+
private _canShare;
|
|
21
|
+
private _openView;
|
|
22
|
+
private _reportId;
|
|
23
|
+
private _tooLongShown;
|
|
24
|
+
serves(report: Report | null): boolean;
|
|
25
|
+
open(report: Report, params: Params, pageId: number | null): Observable<void>;
|
|
26
|
+
refresh(report: Report): void;
|
|
27
|
+
pick(reportViewId: number): Observable<ReportView>;
|
|
28
|
+
openDefaults(): void;
|
|
29
|
+
saveAsNew(view: Omit<ReportViewCreate, 'config'>): Observable<ReportView>;
|
|
30
|
+
saveChanges(): Observable<ReportView>;
|
|
31
|
+
rename(name: string): Observable<ReportView>;
|
|
32
|
+
share(shared: boolean): Observable<ReportView>;
|
|
33
|
+
setDefault(personalDefault: boolean): Observable<ReportView>;
|
|
34
|
+
deleteOpen(): Observable<ReportViewDeleted>;
|
|
35
|
+
urlParams(current: ParamMap, name?: ReportUrlValueName): Params;
|
|
36
|
+
private _start;
|
|
37
|
+
private _openDefault;
|
|
38
|
+
private _openLink;
|
|
39
|
+
private _openOn;
|
|
40
|
+
private _changeOpen;
|
|
41
|
+
private _putRow;
|
|
42
|
+
private _readViews;
|
|
43
|
+
private _readView;
|
|
44
|
+
private _linkWrite;
|
|
45
|
+
private _linkDays;
|
|
46
|
+
private _groupDays;
|
|
47
|
+
private _reportGroups;
|
|
48
|
+
private _authoredSort;
|
|
49
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<ReportViewService, never>;
|
|
50
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<ReportViewService>;
|
|
51
|
+
}
|
package/app/reports/text.d.ts
CHANGED
|
@@ -1,11 +1,31 @@
|
|
|
1
1
|
export declare const DEFAULT_TEXT_SIZE = 12;
|
|
2
2
|
export declare const HEADING_TEXT_SIZES: Record<number, number>;
|
|
3
3
|
export declare const DEFAULT_TEXT_COLOR = "#1f2933";
|
|
4
|
+
export declare const TEXT_TABLE_BORDER_COLOR = "#cbd2d9";
|
|
5
|
+
export declare const TEXT_TABLE_BORDER_WIDTH = 0.75;
|
|
6
|
+
export declare const TEXT_TABLE_CELL_PADDING: {
|
|
7
|
+
vertical: number;
|
|
8
|
+
horizontal: number;
|
|
9
|
+
};
|
|
10
|
+
export declare const TEXT_TABLE_MARGIN = 4;
|
|
11
|
+
export interface TextValue {
|
|
12
|
+
name: string;
|
|
13
|
+
text?: string;
|
|
14
|
+
loading?: boolean;
|
|
15
|
+
reads?: string[];
|
|
16
|
+
}
|
|
4
17
|
export interface TextTokenContext {
|
|
5
18
|
pageNumber: number;
|
|
6
19
|
pageName: string;
|
|
7
20
|
reportName: string;
|
|
21
|
+
values?: Record<string, TextValue>;
|
|
22
|
+
valuePageId?: number | null;
|
|
8
23
|
}
|
|
24
|
+
export declare const VALUE_TOKEN_PATTERN: RegExp;
|
|
25
|
+
export declare const VALUE_EMPTY_TEXT = "\u2014";
|
|
26
|
+
export declare const VALUE_LOADING_TEXT = "\u2026";
|
|
27
|
+
export declare function valueToken(key: string): string;
|
|
28
|
+
export declare function valueText(value: TextValue | undefined): string;
|
|
9
29
|
export interface TextRun {
|
|
10
30
|
text: string;
|
|
11
31
|
bold?: boolean;
|
|
@@ -24,7 +44,37 @@ export interface TextParagraph {
|
|
|
24
44
|
bullet?: 'bullet' | 'number';
|
|
25
45
|
heading?: number;
|
|
26
46
|
}
|
|
47
|
+
export interface TextTableCell {
|
|
48
|
+
paragraphs: TextParagraph[];
|
|
49
|
+
colSpan: number;
|
|
50
|
+
rowSpan: number;
|
|
51
|
+
row: number;
|
|
52
|
+
column: number;
|
|
53
|
+
align: 'left' | 'center' | 'right' | 'justify';
|
|
54
|
+
valign?: 'top' | 'middle' | 'bottom';
|
|
55
|
+
fill?: string;
|
|
56
|
+
}
|
|
57
|
+
export interface TextTableRow {
|
|
58
|
+
section: 'head' | 'body' | 'foot';
|
|
59
|
+
cells: TextTableCell[];
|
|
60
|
+
}
|
|
61
|
+
export interface TextTable {
|
|
62
|
+
rows: TextTableRow[];
|
|
63
|
+
columns: number;
|
|
64
|
+
}
|
|
65
|
+
export type TextBlock = {
|
|
66
|
+
kind: 'text';
|
|
67
|
+
paragraphs: TextParagraph[];
|
|
68
|
+
} | {
|
|
69
|
+
kind: 'table';
|
|
70
|
+
table: TextTable;
|
|
71
|
+
};
|
|
27
72
|
export declare function fillTextTokens(html: string, context: TextTokenContext): string;
|
|
73
|
+
export declare function textBlocks(html: string, context: TextTokenContext): TextBlock[];
|
|
28
74
|
export declare function textParagraphs(html: string, context: TextTokenContext): TextParagraph[];
|
|
75
|
+
export declare function blockParagraphs(blocks: TextBlock[]): TextParagraph[];
|
|
29
76
|
export declare function textPlain(html: string, context: TextTokenContext): string;
|
|
77
|
+
export declare function splitAtTables(parent: Node): (Node[] | HTMLTableElement)[];
|
|
78
|
+
export declare function parseTable(element: HTMLTableElement): TextTable;
|
|
79
|
+
export declare function tableGrid(table: TextTable): TextTable;
|
|
30
80
|
export declare function escapeHtml(value: string): string;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { ReportViewConfig } from './interfaces/report-view-config.interface';
|
|
2
|
+
import { ComponentDataState, Report, ReportComponent } from './interfaces/report.interface';
|
|
3
|
+
export declare function isTimeSeriesChart(component: ReportComponent): boolean;
|
|
4
|
+
export declare function tileDataState(report: Report | null, component: ReportComponent, snapshot: ReportViewConfig): ComponentDataState;
|
|
5
|
+
export declare function zipExportStates(report: Report, snapshot: ReportViewConfig, pageId?: number | null): Record<number, ComponentDataState>;
|
|
6
|
+
export declare function valuesMatchAnyGroupIds(report: Report | null, layerId: number | null, snapshot: ReportViewConfig): number[];
|
|
7
|
+
export declare function tilePageId(report: Report, component: ReportComponent, snapshot: ReportViewConfig): number | null;
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { Observable } from 'rxjs';
|
|
2
|
+
import { TileLoadResult } from './interfaces/tile-load-result.interface';
|
|
3
|
+
export declare const TILE_REFRESH_DEBOUNCE_MS = 300;
|
|
4
|
+
export declare function tileLoads<T>(refresh$: Observable<unknown>, load: () => Observable<T>, version: () => number): Observable<TileLoadResult<T>>;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Report, ReportComponent, ReportFormatContext, ReportPageValue } from './interfaces/report.interface';
|
|
2
|
+
import { TextValue } from './text';
|
|
3
|
+
export declare const NO_VALUE_KEYS: ReadonlySet<string>;
|
|
4
|
+
export declare function valueKeys(html: string | null | undefined): string[];
|
|
5
|
+
export declare function valueKey(component: ReportComponent): string;
|
|
6
|
+
export declare function operandKeys(value: ReportComponent): string[];
|
|
7
|
+
export declare function shownValues(values: ReportComponent[], texts: ReportComponent[]): ReportComponent[];
|
|
8
|
+
export declare function readKeys(shown: Iterable<string>, values: Record<string, TextValue>): Set<string>;
|
|
9
|
+
export declare function textValues(values: ReportComponent[], results: {
|
|
10
|
+
rows: ReadonlyMap<number, ReportPageValue>;
|
|
11
|
+
} | null, format: ReportFormatContext, loading?: ReadonlySet<number>): Record<string, TextValue>;
|
|
12
|
+
export declare function formatValueText(value: ReportComponent, row: ReportPageValue, layerValues: ReportComponent[], ctx: ReportFormatContext): string;
|
|
13
|
+
export declare function failedValueKeys(values: ReportComponent[], rows: ReadonlyMap<number, ReportPageValue>): string[];
|
|
14
|
+
export declare function sameTextValues(a: Record<string, TextValue> | undefined, b: Record<string, TextValue> | undefined): boolean;
|
|
15
|
+
export declare function reportComponents(report: Report | null): ReportComponent[];
|
|
16
|
+
export declare function layerValueKeys(report: Report | null): Map<number, Set<string>>;
|
|
17
|
+
export declare function isDrawn(component: ReportComponent): boolean;
|
|
@@ -12,13 +12,13 @@ export declare class FsAiReportComponent {
|
|
|
12
12
|
readonly pageChanged: import("@angular/core").OutputEmitterRef<number>;
|
|
13
13
|
readonly report: import("@angular/core").WritableSignal<Report>;
|
|
14
14
|
readonly editMode: import("@angular/core").WritableSignal<boolean>;
|
|
15
|
-
readonly timezoneLabel: import("@angular/core").Signal<string>;
|
|
16
15
|
readonly pageId: import("@angular/core").WritableSignal<number>;
|
|
17
16
|
readonly chatPageId: import("@angular/core").WritableSignal<number>;
|
|
18
17
|
readonly chatRequestData: import("@angular/core").Signal<Record<string, unknown>>;
|
|
19
18
|
readonly reportFilterConfig: import("@angular/core").WritableSignal<FilterConfig>;
|
|
20
19
|
readonly reportHasFilters: import("@angular/core").Signal<boolean>;
|
|
21
20
|
readonly reportFilterKey: import("@angular/core").Signal<string>;
|
|
21
|
+
readonly viewsServed: import("@angular/core").Signal<boolean>;
|
|
22
22
|
private _split;
|
|
23
23
|
private _chatPanel;
|
|
24
24
|
private _canvas?;
|
|
@@ -27,6 +27,8 @@ export declare class FsAiReportComponent {
|
|
|
27
27
|
private _router;
|
|
28
28
|
private _route;
|
|
29
29
|
private _filterState;
|
|
30
|
+
private _filterOptions;
|
|
31
|
+
private _views;
|
|
30
32
|
private _exportService;
|
|
31
33
|
private _collector;
|
|
32
34
|
private _process;
|
|
@@ -36,6 +38,7 @@ export declare class FsAiReportComponent {
|
|
|
36
38
|
private _restoredReportId;
|
|
37
39
|
private _pageReported;
|
|
38
40
|
private _pageWrite$;
|
|
41
|
+
private readonly _barVersion;
|
|
39
42
|
constructor();
|
|
40
43
|
toggleEditMode(): void;
|
|
41
44
|
get isMasterMode(): boolean;
|
|
@@ -55,9 +58,14 @@ export declare class FsAiReportComponent {
|
|
|
55
58
|
private _pageIdFromUrl;
|
|
56
59
|
private _writeUrl;
|
|
57
60
|
private _loadReport;
|
|
61
|
+
private _openReport;
|
|
62
|
+
private _urlParams;
|
|
63
|
+
private _openAppliedPage;
|
|
58
64
|
private _reportGroups;
|
|
59
65
|
private _buildReportConfig;
|
|
66
|
+
private _barChanged;
|
|
60
67
|
private _groupByItem;
|
|
68
|
+
private _matchItem;
|
|
61
69
|
static ɵfac: i0.ɵɵFactoryDeclaration<FsAiReportComponent, never>;
|
|
62
70
|
static ɵcmp: i0.ɵɵComponentDeclaration<FsAiReportComponent, "fs-ai-report", never, { "reportId": { "alias": "reportId"; "required": false; "isSignal": true; }; "basePath": { "alias": "basePath"; "required": false; "isSignal": true; }; "pageQueryParam": { "alias": "pageQueryParam"; "required": false; "isSignal": true; }; "urlState": { "alias": "urlState"; "required": false; "isSignal": true; }; }, { "deleted": "deleted"; "renamed": "renamed"; "pageChanged": "pageChanged"; }, never, never, true, never>;
|
|
63
71
|
}
|
|
@@ -17,6 +17,7 @@ export declare class ReportComponent {
|
|
|
17
17
|
private _reportData;
|
|
18
18
|
private _reportService;
|
|
19
19
|
private _filterState;
|
|
20
|
+
private _filterOptions;
|
|
20
21
|
private _exportService;
|
|
21
22
|
private _collector;
|
|
22
23
|
private _process;
|
|
@@ -24,6 +25,8 @@ export declare class ReportComponent {
|
|
|
24
25
|
private _dialog;
|
|
25
26
|
private _destroyRef;
|
|
26
27
|
private _zone;
|
|
28
|
+
private readonly _barVersion;
|
|
29
|
+
private readonly _pageId;
|
|
27
30
|
constructor();
|
|
28
31
|
fetchReports: (keyword: string) => import("rxjs").Observable<ReportListItem[]>;
|
|
29
32
|
reportChange(report: ReportListItem | null): void;
|
|
@@ -34,6 +37,7 @@ export declare class ReportComponent {
|
|
|
34
37
|
toggleMasterMode(): void;
|
|
35
38
|
reportSettings(): void;
|
|
36
39
|
componentSettings(component: ReportComponentModel): void;
|
|
40
|
+
onCanvasPageChanged(pageId: number | null): void;
|
|
37
41
|
onCanvasReportChanged(): void;
|
|
38
42
|
exportPowerpoint(): void;
|
|
39
43
|
exportPdf(): void;
|
|
@@ -46,7 +50,9 @@ export declare class ReportComponent {
|
|
|
46
50
|
get reportHasFilters(): boolean;
|
|
47
51
|
get reportFilterKey(): string;
|
|
48
52
|
private _buildReportConfig;
|
|
53
|
+
private _barChanged;
|
|
49
54
|
private _groupByItem;
|
|
55
|
+
private _matchItem;
|
|
50
56
|
private _refreshReportName;
|
|
51
57
|
static ɵfac: i0.ɵɵFactoryDeclaration<ReportComponent, never>;
|
|
52
58
|
static ɵcmp: i0.ɵɵComponentDeclaration<ReportComponent, "ng-component", never, {}, {}, never, never, true, never>;
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
// A menu or popover that opens at a point, not at a control. fs-menu opens
|
|
2
|
+
// at its trigger element, never at an event, so the caller keeps one
|
|
3
|
+
// invisible trigger: a zero-size span inside a positioned container (a tile,
|
|
4
|
+
// a text block), moved to the point just before the menu opens. On a phone
|
|
5
|
+
// fs-menu opens as a bottom sheet and the point does not matter.
|
|
6
|
+
//
|
|
7
|
+
// The page may be zoomed (the canvas scales it, --canvas-zoom): a point in
|
|
8
|
+
// page pixels is converted to the container's own unscaled pixels.
|
|
9
|
+
// Where the anchor goes inside its container, in the container's unscaled
|
|
10
|
+
// pixels: the point's distance from the container's top left corner (both in
|
|
11
|
+
// page pixels), divided by the zoom.
|
|
12
|
+
export function anchorOffset(point, corner, zoom) {
|
|
13
|
+
const scale = usableZoom(zoom);
|
|
14
|
+
return {
|
|
15
|
+
left: (point.x - corner.x) / scale,
|
|
16
|
+
top: (point.y - corner.y) / scale,
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
// Moves the anchor to the point (in page pixels) inside the element it is
|
|
20
|
+
// positioned against, then opens what it triggers on the next turn: once the
|
|
21
|
+
// move is laid out, and once the click that asked for it is over, so that
|
|
22
|
+
// click does not close it again.
|
|
23
|
+
export function openAtPoint(anchor, point, zoom, open) {
|
|
24
|
+
const container = anchor.offsetParent ?? anchor.parentElement;
|
|
25
|
+
const rect = container?.getBoundingClientRect();
|
|
26
|
+
// An absolute child is placed from inside its container's border, which
|
|
27
|
+
// the zoom scales too.
|
|
28
|
+
const corner = rect
|
|
29
|
+
? {
|
|
30
|
+
x: rect.left + window.scrollX + container.clientLeft * usableZoom(zoom),
|
|
31
|
+
y: rect.top + window.scrollY + container.clientTop * usableZoom(zoom),
|
|
32
|
+
}
|
|
33
|
+
: point;
|
|
34
|
+
const offset = anchorOffset(point, corner, zoom);
|
|
35
|
+
Object.assign(anchor.style, {
|
|
36
|
+
position: 'absolute',
|
|
37
|
+
width: '0',
|
|
38
|
+
height: '0',
|
|
39
|
+
pointerEvents: 'none',
|
|
40
|
+
left: `${offset.left}px`,
|
|
41
|
+
top: `${offset.top}px`,
|
|
42
|
+
});
|
|
43
|
+
setTimeout(open);
|
|
44
|
+
}
|
|
45
|
+
// The zoom, or 1 when it is not a positive number.
|
|
46
|
+
function usableZoom(zoom) {
|
|
47
|
+
return Number.isFinite(zoom) && zoom > 0 ? zoom : 1;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5jaG9yLWF0LXBvaW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2FuY2hvci1hdC1wb2ludC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyRUFBMkU7QUFDM0UscUVBQXFFO0FBQ3JFLDZFQUE2RTtBQUM3RSwyRUFBMkU7QUFDM0UsaUVBQWlFO0FBQ2pFLEVBQUU7QUFDRiwyRUFBMkU7QUFDM0UsbUVBQW1FO0FBRW5FLDBFQUEwRTtBQUMxRSw2RUFBNkU7QUFDN0UscUNBQXFDO0FBQ3JDLE1BQU0sVUFBVSxZQUFZLENBQzFCLEtBQStCLEVBQy9CLE1BQWdDLEVBQ2hDLElBQVk7SUFFWixNQUFNLEtBQUssR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7SUFFL0IsT0FBTztRQUNMLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUs7UUFDbEMsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSztLQUNsQyxDQUFDO0FBQ0osQ0FBQztBQUVELDBFQUEwRTtBQUMxRSw2RUFBNkU7QUFDN0UsMEVBQTBFO0FBQzFFLGlDQUFpQztBQUNqQyxNQUFNLFVBQVUsV0FBVyxDQUN6QixNQUFtQixFQUNuQixLQUErQixFQUMvQixJQUFZLEVBQ1osSUFBZ0I7SUFFaEIsTUFBTSxTQUFTLEdBQUksTUFBTSxDQUFDLFlBQW1DLElBQUksTUFBTSxDQUFDLGFBQWEsQ0FBQztJQUN0RixNQUFNLElBQUksR0FBRyxTQUFTLEVBQUUscUJBQXFCLEVBQUUsQ0FBQztJQUNoRCx3RUFBd0U7SUFDeEUsdUJBQXVCO0lBQ3ZCLE1BQU0sTUFBTSxHQUFHLElBQUk7UUFDakIsQ0FBQyxDQUFDO1lBQ0EsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLE9BQU8sR0FBRyxTQUFTLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUM7WUFDdkUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLE9BQU8sR0FBRyxTQUFTLENBQUMsU0FBUyxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUM7U0FDdEU7UUFDRCxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQ1YsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFFakQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFO1FBQzFCLFFBQVEsRUFBRSxVQUFVO1FBQ3BCLEtBQUssRUFBRSxHQUFHO1FBQ1YsTUFBTSxFQUFFLEdBQUc7UUFDWCxhQUFhLEVBQUUsTUFBTTtRQUNyQixJQUFJLEVBQUUsR0FBRyxNQUFNLENBQUMsSUFBSSxJQUFJO1FBQ3hCLEdBQUcsRUFBRSxHQUFHLE1BQU0sQ0FBQyxHQUFHLElBQUk7S0FDdkIsQ0FBQyxDQUFDO0lBRUgsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ25CLENBQUM7QUFFRCxtREFBbUQ7QUFDbkQsU0FBUyxVQUFVLENBQUMsSUFBWTtJQUM5QixPQUFPLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEEgbWVudSBvciBwb3BvdmVyIHRoYXQgb3BlbnMgYXQgYSBwb2ludCwgbm90IGF0IGEgY29udHJvbC4gZnMtbWVudSBvcGVuc1xuLy8gYXQgaXRzIHRyaWdnZXIgZWxlbWVudCwgbmV2ZXIgYXQgYW4gZXZlbnQsIHNvIHRoZSBjYWxsZXIga2VlcHMgb25lXG4vLyBpbnZpc2libGUgdHJpZ2dlcjogYSB6ZXJvLXNpemUgc3BhbiBpbnNpZGUgYSBwb3NpdGlvbmVkIGNvbnRhaW5lciAoYSB0aWxlLFxuLy8gYSB0ZXh0IGJsb2NrKSwgbW92ZWQgdG8gdGhlIHBvaW50IGp1c3QgYmVmb3JlIHRoZSBtZW51IG9wZW5zLiBPbiBhIHBob25lXG4vLyBmcy1tZW51IG9wZW5zIGFzIGEgYm90dG9tIHNoZWV0IGFuZCB0aGUgcG9pbnQgZG9lcyBub3QgbWF0dGVyLlxuLy9cbi8vIFRoZSBwYWdlIG1heSBiZSB6b29tZWQgKHRoZSBjYW52YXMgc2NhbGVzIGl0LCAtLWNhbnZhcy16b29tKTogYSBwb2ludCBpblxuLy8gcGFnZSBwaXhlbHMgaXMgY29udmVydGVkIHRvIHRoZSBjb250YWluZXIncyBvd24gdW5zY2FsZWQgcGl4ZWxzLlxuXG4vLyBXaGVyZSB0aGUgYW5jaG9yIGdvZXMgaW5zaWRlIGl0cyBjb250YWluZXIsIGluIHRoZSBjb250YWluZXIncyB1bnNjYWxlZFxuLy8gcGl4ZWxzOiB0aGUgcG9pbnQncyBkaXN0YW5jZSBmcm9tIHRoZSBjb250YWluZXIncyB0b3AgbGVmdCBjb3JuZXIgKGJvdGggaW5cbi8vIHBhZ2UgcGl4ZWxzKSwgZGl2aWRlZCBieSB0aGUgem9vbS5cbmV4cG9ydCBmdW5jdGlvbiBhbmNob3JPZmZzZXQoXG4gIHBvaW50OiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0sXG4gIGNvcm5lcjogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9LFxuICB6b29tOiBudW1iZXIsXG4pOiB7IGxlZnQ6IG51bWJlcjsgdG9wOiBudW1iZXIgfSB7XG4gIGNvbnN0IHNjYWxlID0gdXNhYmxlWm9vbSh6b29tKTtcblxuICByZXR1cm4ge1xuICAgIGxlZnQ6IChwb2ludC54IC0gY29ybmVyLngpIC8gc2NhbGUsXG4gICAgdG9wOiAocG9pbnQueSAtIGNvcm5lci55KSAvIHNjYWxlLFxuICB9O1xufVxuXG4vLyBNb3ZlcyB0aGUgYW5jaG9yIHRvIHRoZSBwb2ludCAoaW4gcGFnZSBwaXhlbHMpIGluc2lkZSB0aGUgZWxlbWVudCBpdCBpc1xuLy8gcG9zaXRpb25lZCBhZ2FpbnN0LCB0aGVuIG9wZW5zIHdoYXQgaXQgdHJpZ2dlcnMgb24gdGhlIG5leHQgdHVybjogb25jZSB0aGVcbi8vIG1vdmUgaXMgbGFpZCBvdXQsIGFuZCBvbmNlIHRoZSBjbGljayB0aGF0IGFza2VkIGZvciBpdCBpcyBvdmVyLCBzbyB0aGF0XG4vLyBjbGljayBkb2VzIG5vdCBjbG9zZSBpdCBhZ2Fpbi5cbmV4cG9ydCBmdW5jdGlvbiBvcGVuQXRQb2ludChcbiAgYW5jaG9yOiBIVE1MRWxlbWVudCxcbiAgcG9pbnQ6IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSxcbiAgem9vbTogbnVtYmVyLFxuICBvcGVuOiAoKSA9PiB2b2lkLFxuKTogdm9pZCB7XG4gIGNvbnN0IGNvbnRhaW5lciA9IChhbmNob3Iub2Zmc2V0UGFyZW50IGFzIEhUTUxFbGVtZW50IHwgbnVsbCkgPz8gYW5jaG9yLnBhcmVudEVsZW1lbnQ7XG4gIGNvbnN0IHJlY3QgPSBjb250YWluZXI/LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAvLyBBbiBhYnNvbHV0ZSBjaGlsZCBpcyBwbGFjZWQgZnJvbSBpbnNpZGUgaXRzIGNvbnRhaW5lcidzIGJvcmRlciwgd2hpY2hcbiAgLy8gdGhlIHpvb20gc2NhbGVzIHRvby5cbiAgY29uc3QgY29ybmVyID0gcmVjdFxuICAgID8ge1xuICAgICAgeDogcmVjdC5sZWZ0ICsgd2luZG93LnNjcm9sbFggKyBjb250YWluZXIuY2xpZW50TGVmdCAqIHVzYWJsZVpvb20oem9vbSksXG4gICAgICB5OiByZWN0LnRvcCArIHdpbmRvdy5zY3JvbGxZICsgY29udGFpbmVyLmNsaWVudFRvcCAqIHVzYWJsZVpvb20oem9vbSksXG4gICAgfVxuICAgIDogcG9pbnQ7XG4gIGNvbnN0IG9mZnNldCA9IGFuY2hvck9mZnNldChwb2ludCwgY29ybmVyLCB6b29tKTtcblxuICBPYmplY3QuYXNzaWduKGFuY2hvci5zdHlsZSwge1xuICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgIHdpZHRoOiAnMCcsXG4gICAgaGVpZ2h0OiAnMCcsXG4gICAgcG9pbnRlckV2ZW50czogJ25vbmUnLFxuICAgIGxlZnQ6IGAke29mZnNldC5sZWZ0fXB4YCxcbiAgICB0b3A6IGAke29mZnNldC50b3B9cHhgLFxuICB9KTtcblxuICBzZXRUaW1lb3V0KG9wZW4pO1xufVxuXG4vLyBUaGUgem9vbSwgb3IgMSB3aGVuIGl0IGlzIG5vdCBhIHBvc2l0aXZlIG51bWJlci5cbmZ1bmN0aW9uIHVzYWJsZVpvb20oem9vbTogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZSh6b29tKSAmJiB6b29tID4gMCA/IHpvb20gOiAxO1xufVxuIl19
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
// Which page the canvas opens when its report input changes.
|
|
2
|
+
//
|
|
3
|
+
// - The same report with more pages than before: a page was just added in
|
|
4
|
+
// this tab, so the canvas lands on the last page. The link's page does not
|
|
5
|
+
// beat it: that is the stale value the host still holds from the URL.
|
|
6
|
+
// - Otherwise the link's (or the open view's) page, when the report has it.
|
|
7
|
+
// - Another report whose link names no page it has opens on its first page:
|
|
8
|
+
// the old report's page number means nothing there.
|
|
9
|
+
// - The same report keeps the page it shows when the link's page does not
|
|
10
|
+
// resolve (it may still be loading); an index past the last page falls
|
|
11
|
+
// back to the first.
|
|
12
|
+
export function canvasLandingPage(input) {
|
|
13
|
+
const pageCount = input.pageIds.length;
|
|
14
|
+
const sameReport = input.reportId === input.previousReportId;
|
|
15
|
+
if (sameReport && input.previousPageCount > 0 && pageCount > input.previousPageCount) {
|
|
16
|
+
return pageCount - 1;
|
|
17
|
+
}
|
|
18
|
+
const linked = input.pageId == null ? -1 : input.pageIds.indexOf(input.pageId);
|
|
19
|
+
if (linked > -1) {
|
|
20
|
+
return linked;
|
|
21
|
+
}
|
|
22
|
+
const index = sameReport ? input.activePageIndex : 0;
|
|
23
|
+
return index < pageCount ? index : 0;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FudmFzLWxhbmRpbmctcGFnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy9jYW52YXMtbGFuZGluZy1wYWdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBLDZEQUE2RDtBQUM3RCxFQUFFO0FBQ0YsMEVBQTBFO0FBQzFFLDZFQUE2RTtBQUM3RSx3RUFBd0U7QUFDeEUsNEVBQTRFO0FBQzVFLDRFQUE0RTtBQUM1RSxzREFBc0Q7QUFDdEQsMEVBQTBFO0FBQzFFLHlFQUF5RTtBQUN6RSx1QkFBdUI7QUFDdkIsTUFBTSxVQUFVLGlCQUFpQixDQUFDLEtBQXlCO0lBQ3pELE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDO0lBQ3ZDLE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxRQUFRLEtBQUssS0FBSyxDQUFDLGdCQUFnQixDQUFDO0lBRTdELElBQUksVUFBVSxJQUFJLEtBQUssQ0FBQyxpQkFBaUIsR0FBRyxDQUFDLElBQUksU0FBUyxHQUFHLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ3JGLE9BQU8sU0FBUyxHQUFHLENBQUMsQ0FBQztJQUN2QixDQUFDO0lBRUQsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDL0UsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNoQixPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQsTUFBTSxLQUFLLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFckQsT0FBTyxLQUFLLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2FudmFzTGFuZGluZ0lucHV0IH0gZnJvbSAnLi9pbnRlcmZhY2VzL2NhbnZhcy1sYW5kaW5nLWlucHV0LmludGVyZmFjZSc7XG5cblxuLy8gV2hpY2ggcGFnZSB0aGUgY2FudmFzIG9wZW5zIHdoZW4gaXRzIHJlcG9ydCBpbnB1dCBjaGFuZ2VzLlxuLy9cbi8vIC0gVGhlIHNhbWUgcmVwb3J0IHdpdGggbW9yZSBwYWdlcyB0aGFuIGJlZm9yZTogYSBwYWdlIHdhcyBqdXN0IGFkZGVkIGluXG4vLyAgIHRoaXMgdGFiLCBzbyB0aGUgY2FudmFzIGxhbmRzIG9uIHRoZSBsYXN0IHBhZ2UuIFRoZSBsaW5rJ3MgcGFnZSBkb2VzIG5vdFxuLy8gICBiZWF0IGl0OiB0aGF0IGlzIHRoZSBzdGFsZSB2YWx1ZSB0aGUgaG9zdCBzdGlsbCBob2xkcyBmcm9tIHRoZSBVUkwuXG4vLyAtIE90aGVyd2lzZSB0aGUgbGluaydzIChvciB0aGUgb3BlbiB2aWV3J3MpIHBhZ2UsIHdoZW4gdGhlIHJlcG9ydCBoYXMgaXQuXG4vLyAtIEFub3RoZXIgcmVwb3J0IHdob3NlIGxpbmsgbmFtZXMgbm8gcGFnZSBpdCBoYXMgb3BlbnMgb24gaXRzIGZpcnN0IHBhZ2U6XG4vLyAgIHRoZSBvbGQgcmVwb3J0J3MgcGFnZSBudW1iZXIgbWVhbnMgbm90aGluZyB0aGVyZS5cbi8vIC0gVGhlIHNhbWUgcmVwb3J0IGtlZXBzIHRoZSBwYWdlIGl0IHNob3dzIHdoZW4gdGhlIGxpbmsncyBwYWdlIGRvZXMgbm90XG4vLyAgIHJlc29sdmUgKGl0IG1heSBzdGlsbCBiZSBsb2FkaW5nKTsgYW4gaW5kZXggcGFzdCB0aGUgbGFzdCBwYWdlIGZhbGxzXG4vLyAgIGJhY2sgdG8gdGhlIGZpcnN0LlxuZXhwb3J0IGZ1bmN0aW9uIGNhbnZhc0xhbmRpbmdQYWdlKGlucHV0OiBDYW52YXNMYW5kaW5nSW5wdXQpOiBudW1iZXIge1xuICBjb25zdCBwYWdlQ291bnQgPSBpbnB1dC5wYWdlSWRzLmxlbmd0aDtcbiAgY29uc3Qgc2FtZVJlcG9ydCA9IGlucHV0LnJlcG9ydElkID09PSBpbnB1dC5wcmV2aW91c1JlcG9ydElkO1xuXG4gIGlmIChzYW1lUmVwb3J0ICYmIGlucHV0LnByZXZpb3VzUGFnZUNvdW50ID4gMCAmJiBwYWdlQ291bnQgPiBpbnB1dC5wcmV2aW91c1BhZ2VDb3VudCkge1xuICAgIHJldHVybiBwYWdlQ291bnQgLSAxO1xuICB9XG5cbiAgY29uc3QgbGlua2VkID0gaW5wdXQucGFnZUlkID09IG51bGwgPyAtMSA6IGlucHV0LnBhZ2VJZHMuaW5kZXhPZihpbnB1dC5wYWdlSWQpO1xuICBpZiAobGlua2VkID4gLTEpIHtcbiAgICByZXR1cm4gbGlua2VkO1xuICB9XG5cbiAgY29uc3QgaW5kZXggPSBzYW1lUmVwb3J0ID8gaW5wdXQuYWN0aXZlUGFnZUluZGV4IDogMDtcblxuICByZXR1cm4gaW5kZXggPCBwYWdlQ291bnQgPyBpbmRleCA6IDA7XG59XG4iXX0=
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { ChangeDetectionStrategy, Component, computed, inject, input } from '@angular/core';
|
|
1
|
+
import { ChangeDetectionStrategy, Component, NgZone, computed, inject, input, model, output, untracked, } from '@angular/core';
|
|
2
2
|
import { NgxEchartsDirective } from 'ngx-echarts';
|
|
3
|
+
import { chartMarkClick } from '../../mark-click';
|
|
3
4
|
import { buildChartOption } from '../../option-builder';
|
|
4
5
|
import { ReportFilterStateService } from '../../services/report-filter-state.service';
|
|
5
6
|
import { ComponentNoteComponent } from '../component-note/component-note.component';
|
|
@@ -11,19 +12,69 @@ import * as i0 from "@angular/core";
|
|
|
11
12
|
// theme/echarts.ts). The shared note under the plot names the days a
|
|
12
13
|
// comparison compares and why windowed series read as they do; the series'
|
|
13
14
|
// tooltips describe the windows themselves.
|
|
15
|
+
//
|
|
16
|
+
// A click on a mark (a bar, a point or the line, a slice, a step, or a
|
|
17
|
+
// category's empty band) is reported as a ReportMarkClick (markClick); the
|
|
18
|
+
// tile decides what it does. The tile's actions only shape the option: the
|
|
19
|
+
// hand pointer and the tooltip's hint.
|
|
14
20
|
export class ComponentChartComponent {
|
|
15
21
|
component = input.required();
|
|
16
22
|
data = input(null);
|
|
23
|
+
// Which legend entries are on, by series name. The tile holds it (two-way),
|
|
24
|
+
// so it outlives this chart and every option: each new option carries it
|
|
25
|
+
// (legend.selected), because ngx-echarts sets an option with notMerge. A
|
|
26
|
+
// click on the legend only records it: the chart has already toggled the
|
|
27
|
+
// series, so the option is not built again for it (untracked).
|
|
28
|
+
legendSelected = model({});
|
|
29
|
+
// What a click on the chart's marks does, from the tile (tileMarkActions).
|
|
30
|
+
actions = input([]);
|
|
31
|
+
markClick = output();
|
|
32
|
+
// A click or a tap on the chart that no mark answered (an empty band by
|
|
33
|
+
// touch, outside the plot, a waterfall's Total): the tile forgets a tap
|
|
34
|
+
// it was holding, so the next tap on a mark shows its tooltip first.
|
|
35
|
+
markMiss = output();
|
|
17
36
|
options = computed(() => {
|
|
18
37
|
const data = this.data();
|
|
19
38
|
return data
|
|
20
|
-
? buildChartOption(this.component(), data, this._filterState.formatContext())
|
|
39
|
+
? buildChartOption(this.component(), data, this._filterState.formatContext(), untracked(this.legendSelected), this.actions())
|
|
21
40
|
: null;
|
|
22
41
|
});
|
|
23
42
|
_chart = null;
|
|
43
|
+
// The browser event of the last click a mark answered, so the empty-band
|
|
44
|
+
// handler skips that event.
|
|
45
|
+
_markEvent = null;
|
|
24
46
|
_filterState = inject(ReportFilterStateService);
|
|
47
|
+
_zone = inject(NgZone);
|
|
25
48
|
onChartInit(chart) {
|
|
26
49
|
this._chart = chart;
|
|
50
|
+
// A click in a category's empty band is no element's click: the chart's
|
|
51
|
+
// drawing surface reports it. ECharts runs it outside Angular, and
|
|
52
|
+
// before the chart's own click on a mark (ECharts calls its element
|
|
53
|
+
// handler last), so it waits a microtask: by then a mark has answered
|
|
54
|
+
// the same click.
|
|
55
|
+
chart.getZr().on('click', (event) => {
|
|
56
|
+
queueMicrotask(() => this._zone.run(() => this._onBandClick(event)));
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
// ECharts reports every entry of the legend after a click.
|
|
60
|
+
onLegendSelectChanged(event) {
|
|
61
|
+
this.legendSelected.set({ ...(event?.selected ?? {}) });
|
|
62
|
+
}
|
|
63
|
+
// A click on a series element. A click on a line or an area's line itself
|
|
64
|
+
// carries no category, so it takes the category whose band it fell in, and
|
|
65
|
+
// no series id, so it takes the id the option gave that series (a partial
|
|
66
|
+
// segment's id names the series it continues).
|
|
67
|
+
onChartClick(params) {
|
|
68
|
+
this._markEvent = params.event?.event ?? null;
|
|
69
|
+
if (params.componentType !== 'series') {
|
|
70
|
+
this.markMiss.emit();
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
const seriesIndex = params.seriesIndex ?? null;
|
|
74
|
+
const dataIndex = typeof params.dataIndex === 'number'
|
|
75
|
+
? params.dataIndex
|
|
76
|
+
: this._bandIndex(params.event?.offsetX, params.event?.offsetY);
|
|
77
|
+
this._emit({ seriesIndex, seriesId: params.seriesId ?? this._seriesId(seriesIndex), dataIndex: dataIndex ?? -1 }, params.event?.event);
|
|
27
78
|
}
|
|
28
79
|
// Called by the canvas when the box is resized in edit mode.
|
|
29
80
|
resize() {
|
|
@@ -37,14 +88,55 @@ export class ComponentChartComponent {
|
|
|
37
88
|
backgroundColor: '#ffffff',
|
|
38
89
|
}) ?? null;
|
|
39
90
|
}
|
|
91
|
+
// A click on the chart that no element answered: the category whose band
|
|
92
|
+
// it fell in. Outside the plot it is a miss.
|
|
93
|
+
_onBandClick(event) {
|
|
94
|
+
if (event.event === this._markEvent) {
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
this._emit({ seriesIndex: null, seriesId: null, dataIndex: this._bandIndex(event.offsetX, event.offsetY) ?? -1 }, event.event);
|
|
98
|
+
}
|
|
99
|
+
// The category index under a point of the chart, read off the category
|
|
100
|
+
// axis (the y axis of a horizontal chart); null outside the plot or on a
|
|
101
|
+
// chart without one. An axis finder takes the one coordinate along its
|
|
102
|
+
// axis, not the point.
|
|
103
|
+
_bandIndex(x, y) {
|
|
104
|
+
const chart = this._chart;
|
|
105
|
+
if (!chart || typeof x !== 'number' || typeof y !== 'number' || !chart.containPixel('grid', [x, y])) {
|
|
106
|
+
return null;
|
|
107
|
+
}
|
|
108
|
+
const horizontal = this.component().config?.orientation === 'horizontal';
|
|
109
|
+
const index = Number(horizontal
|
|
110
|
+
? chart.convertFromPixel({ yAxisIndex: 0 }, y)
|
|
111
|
+
: chart.convertFromPixel({ xAxisIndex: 0 }, x));
|
|
112
|
+
return Number.isFinite(index) ? Math.round(index) : null;
|
|
113
|
+
}
|
|
114
|
+
// The id the option gave a drawn series, by its index.
|
|
115
|
+
_seriesId(seriesIndex) {
|
|
116
|
+
const series = this.options()?.series;
|
|
117
|
+
const id = Array.isArray(series) && seriesIndex !== null ? series[seriesIndex]?.id : null;
|
|
118
|
+
return id === null || id === undefined ? null : String(id);
|
|
119
|
+
}
|
|
120
|
+
_emit(hit, event) {
|
|
121
|
+
const data = this.data();
|
|
122
|
+
const click = data
|
|
123
|
+
? chartMarkClick(this.component(), data, this._filterState.formatContext(), hit, event)
|
|
124
|
+
: null;
|
|
125
|
+
if (click) {
|
|
126
|
+
this.markClick.emit(click);
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
this.markMiss.emit();
|
|
130
|
+
}
|
|
131
|
+
}
|
|
40
132
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ComponentChartComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
41
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.2.14", type: ComponentChartComponent, isStandalone: true, selector: "app-report-component-chart", inputs: { component: { classPropertyName: "component", publicName: "component", isSignal: true, isRequired: true, transformFunction: null }, data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<div\n class=\"chart-host\"\n echarts\n [options]=\"options() ?? {}\"\n [theme]=\"'report'\"\n [autoResize]=\"true\"\n (chartInit)=\"onChartInit($event)\">\n</div>\n<app-report-component-note [data]=\"data()\"></app-report-component-note>\n", styles: [":host{display:flex;flex-direction:column;width:100%;height:100%}.chart-host{flex:1 1 0;width:100%;min-height:0}\n"], dependencies: [{ kind: "component", type: ComponentNoteComponent, selector: "app-report-component-note", inputs: ["data", "windows", "windowDescriptions", "windowNotes"] }, { kind: "directive", type: NgxEchartsDirective, selector: "echarts, [echarts]", inputs: ["options", "theme", "initOpts", "merge", "autoResize", "loading", "loadingType", "loadingOpts"], outputs: ["chartInit", "optionsError", "chartClick", "chartDblClick", "chartMouseDown", "chartMouseMove", "chartMouseUp", "chartMouseOver", "chartMouseOut", "chartGlobalOut", "chartContextMenu", "chartHighlight", "chartDownplay", "chartSelectChanged", "chartLegendSelectChanged", "chartLegendSelected", "chartLegendUnselected", "chartLegendLegendSelectAll", "chartLegendLegendInverseSelect", "chartLegendScroll", "chartDataZoom", "chartDataRangeSelected", "chartGraphRoam", "chartGeoRoam", "chartTreeRoam", "chartTimelineChanged", "chartTimelinePlayChanged", "chartRestore", "chartDataViewChanged", "chartMagicTypeChanged", "chartGeoSelectChanged", "chartGeoSelected", "chartGeoUnselected", "chartAxisAreaSelected", "chartBrush", "chartBrushEnd", "chartBrushSelected", "chartGlobalCursorTaken", "chartRendered", "chartFinished"], exportAs: ["echarts"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
133
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.2.14", type: ComponentChartComponent, isStandalone: true, selector: "app-report-component-chart", inputs: { component: { classPropertyName: "component", publicName: "component", isSignal: true, isRequired: true, transformFunction: null }, data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: false, transformFunction: null }, legendSelected: { classPropertyName: "legendSelected", publicName: "legendSelected", isSignal: true, isRequired: false, transformFunction: null }, actions: { classPropertyName: "actions", publicName: "actions", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { legendSelected: "legendSelectedChange", markClick: "markClick", markMiss: "markMiss" }, ngImport: i0, template: "<div\n class=\"chart-host\"\n echarts\n [options]=\"options() ?? {}\"\n [theme]=\"'report'\"\n [autoResize]=\"true\"\n (chartInit)=\"onChartInit($event)\"\n (chartClick)=\"onChartClick($event)\"\n (chartLegendSelectChanged)=\"onLegendSelectChanged($event)\">\n</div>\n<app-report-component-note [data]=\"data()\"></app-report-component-note>\n", styles: [":host{display:flex;flex-direction:column;width:100%;height:100%}.chart-host{flex:1 1 0;width:100%;min-height:0}\n"], dependencies: [{ kind: "component", type: ComponentNoteComponent, selector: "app-report-component-note", inputs: ["data", "windows", "windowDescriptions", "windowNotes"] }, { kind: "directive", type: NgxEchartsDirective, selector: "echarts, [echarts]", inputs: ["options", "theme", "initOpts", "merge", "autoResize", "loading", "loadingType", "loadingOpts"], outputs: ["chartInit", "optionsError", "chartClick", "chartDblClick", "chartMouseDown", "chartMouseMove", "chartMouseUp", "chartMouseOver", "chartMouseOut", "chartGlobalOut", "chartContextMenu", "chartHighlight", "chartDownplay", "chartSelectChanged", "chartLegendSelectChanged", "chartLegendSelected", "chartLegendUnselected", "chartLegendLegendSelectAll", "chartLegendLegendInverseSelect", "chartLegendScroll", "chartDataZoom", "chartDataRangeSelected", "chartGraphRoam", "chartGeoRoam", "chartTreeRoam", "chartTimelineChanged", "chartTimelinePlayChanged", "chartRestore", "chartDataViewChanged", "chartMagicTypeChanged", "chartGeoSelectChanged", "chartGeoSelected", "chartGeoUnselected", "chartAxisAreaSelected", "chartBrush", "chartBrushEnd", "chartBrushSelected", "chartGlobalCursorTaken", "chartRendered", "chartFinished"], exportAs: ["echarts"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
42
134
|
}
|
|
43
135
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ComponentChartComponent, decorators: [{
|
|
44
136
|
type: Component,
|
|
45
137
|
args: [{ selector: 'app-report-component-chart', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [
|
|
46
138
|
ComponentNoteComponent,
|
|
47
139
|
NgxEchartsDirective,
|
|
48
|
-
], template: "<div\n class=\"chart-host\"\n echarts\n [options]=\"options() ?? {}\"\n [theme]=\"'report'\"\n [autoResize]=\"true\"\n (chartInit)=\"onChartInit($event)\">\n</div>\n<app-report-component-note [data]=\"data()\"></app-report-component-note>\n", styles: [":host{display:flex;flex-direction:column;width:100%;height:100%}.chart-host{flex:1 1 0;width:100%;min-height:0}\n"] }]
|
|
140
|
+
], template: "<div\n class=\"chart-host\"\n echarts\n [options]=\"options() ?? {}\"\n [theme]=\"'report'\"\n [autoResize]=\"true\"\n (chartInit)=\"onChartInit($event)\"\n (chartClick)=\"onChartClick($event)\"\n (chartLegendSelectChanged)=\"onLegendSelectChanged($event)\">\n</div>\n<app-report-component-note [data]=\"data()\"></app-report-component-note>\n", styles: [":host{display:flex;flex-direction:column;width:100%;height:100%}.chart-host{flex:1 1 0;width:100%;min-height:0}\n"] }]
|
|
49
141
|
}] });
|
|
50
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LWNoYXJ0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy9jb21wb25lbnRzL2NvbXBvbmVudC1jaGFydC9jb21wb25lbnQtY2hhcnQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2NvbXBvbmVudHMvY29tcG9uZW50LWNoYXJ0L2NvbXBvbmVudC1jaGFydC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRzVGLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUdsRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUN0RixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQzs7QUFHcEYsMEVBQTBFO0FBQzFFLDBFQUEwRTtBQUMxRSwyRUFBMkU7QUFDM0Usb0VBQW9FO0FBQ3BFLHFFQUFxRTtBQUNyRSwyRUFBMkU7QUFDM0UsNENBQTRDO0FBWTVDLE1BQU0sT0FBTyx1QkFBdUI7SUFFbEIsU0FBUyxHQUFHLEtBQUssQ0FBQyxRQUFRLEVBQW1CLENBQUM7SUFDOUMsSUFBSSxHQUFHLEtBQUssQ0FBdUIsSUFBSSxDQUFDLENBQUM7SUFFekMsT0FBTyxHQUFHLFFBQVEsQ0FBdUIsR0FBRyxFQUFFO1FBQzVELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUV6QixPQUFPLElBQUk7WUFDVCxDQUFDLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQzdFLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDWCxDQUFDLENBQUMsQ0FBQztJQUVLLE1BQU0sR0FBbUIsSUFBSSxDQUFDO0lBQ3JCLFlBQVksR0FBRyxNQUFNLENBQUMsd0JBQXdCLENBQUMsQ0FBQztJQUUxRCxXQUFXLENBQUMsS0FBYztRQUMvQixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztJQUN0QixDQUFDO0lBRUQsNkRBQTZEO0lBQ3RELE1BQU07UUFDWCxJQUFJLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxDQUFDO0lBQ3hCLENBQUM7SUFFRCx3REFBd0Q7SUFDakQsVUFBVSxDQUFDLFVBQVUsR0FBRyxDQUFDO1FBQzlCLE9BQU8sSUFBSSxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUM7WUFDN0IsSUFBSSxFQUFFLEtBQUs7WUFDWCxVQUFVO1lBQ1YsZUFBZSxFQUFFLFNBQVM7U0FDM0IsQ0FBQyxJQUFJLElBQUksQ0FBQztJQUNiLENBQUM7d0dBaENVLHVCQUF1Qjs0RkFBdkIsdUJBQXVCLDBWQzdCcEMsd1BBU0EsMktEZ0JJLHNCQUFzQix3SUFDdEIsbUJBQW1COzs0RkFHVix1QkFBdUI7a0JBWG5DLFNBQVM7K0JBQ0UsNEJBQTRCLG1CQUdyQix1QkFBdUIsQ0FBQyxNQUFNLGNBQ25DLElBQUksV0FDUDt3QkFDUCxzQkFBc0I7d0JBQ3RCLG1CQUFtQjtxQkFDcEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBjb21wdXRlZCwgaW5qZWN0LCBpbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgdHlwZSB7IEVDaGFydHNPcHRpb24sIEVDaGFydHMgfSBmcm9tICdlY2hhcnRzJztcbmltcG9ydCB7IE5neEVjaGFydHNEaXJlY3RpdmUgfSBmcm9tICduZ3gtZWNoYXJ0cyc7XG5cbmltcG9ydCB7IENvbXBvbmVudERhdGEsIFJlcG9ydENvbXBvbmVudCB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvcmVwb3J0LmludGVyZmFjZSc7XG5pbXBvcnQgeyBidWlsZENoYXJ0T3B0aW9uIH0gZnJvbSAnLi4vLi4vb3B0aW9uLWJ1aWxkZXInO1xuaW1wb3J0IHsgUmVwb3J0RmlsdGVyU3RhdGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcmVwb3J0LWZpbHRlci1zdGF0ZS5zZXJ2aWNlJztcbmltcG9ydCB7IENvbXBvbmVudE5vdGVDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnQtbm90ZS9jb21wb25lbnQtbm90ZS5jb21wb25lbnQnO1xuXG5cbi8vIEVDaGFydHMgaG9zdCBmb3IgYSBjaGFydCBjb21wb25lbnQuIFB1cmUgcmVuZGVyaW5nOiB0aGUgcGFyZW50IG93bnMgdGhlXG4vLyBkYXRhIGZldGNoOyB0aGlzIG1hcHMgKGNvbXBvbmVudCBjb25maWcsIHJvd3MsIHRoZSBvcGVuIHJlcG9ydCdzIGZvcm1hdFxuLy8gY29udGV4dCkg4oaSIG9wdGlvbiBhbmQgZXhwb3NlcyB0aGUgY2hhcnQgaW5zdGFuY2UgZm9yIHJlc2l6ZSArIHRoZSBmdXR1cmVcbi8vIGltYWdlIGV4cG9ydHMgKGdldERhdGFVUkwgbmVlZHMgdGhlIGNhbnZhcyByZW5kZXJlciByZWdpc3RlcmVkIGluXG4vLyB0aGVtZS9lY2hhcnRzLnRzKS4gVGhlIHNoYXJlZCBub3RlIHVuZGVyIHRoZSBwbG90IG5hbWVzIHRoZSBkYXlzIGFcbi8vIGNvbXBhcmlzb24gY29tcGFyZXMgYW5kIHdoeSB3aW5kb3dlZCBzZXJpZXMgcmVhZCBhcyB0aGV5IGRvOyB0aGUgc2VyaWVzJ1xuLy8gdG9vbHRpcHMgZGVzY3JpYmUgdGhlIHdpbmRvd3MgdGhlbXNlbHZlcy5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1yZXBvcnQtY29tcG9uZW50LWNoYXJ0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2NvbXBvbmVudC1jaGFydC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2NvbXBvbmVudC1jaGFydC5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENvbXBvbmVudE5vdGVDb21wb25lbnQsXG4gICAgTmd4RWNoYXJ0c0RpcmVjdGl2ZSxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgQ29tcG9uZW50Q2hhcnRDb21wb25lbnQge1xuXG4gIHB1YmxpYyByZWFkb25seSBjb21wb25lbnQgPSBpbnB1dC5yZXF1aXJlZDxSZXBvcnRDb21wb25lbnQ+KCk7XG4gIHB1YmxpYyByZWFkb25seSBkYXRhID0gaW5wdXQ8Q29tcG9uZW50RGF0YSB8IG51bGw+KG51bGwpO1xuXG4gIHB1YmxpYyByZWFkb25seSBvcHRpb25zID0gY29tcHV0ZWQ8RUNoYXJ0c09wdGlvbiB8IG51bGw+KCgpID0+IHtcbiAgICBjb25zdCBkYXRhID0gdGhpcy5kYXRhKCk7XG5cbiAgICByZXR1cm4gZGF0YVxuICAgICAgPyBidWlsZENoYXJ0T3B0aW9uKHRoaXMuY29tcG9uZW50KCksIGRhdGEsIHRoaXMuX2ZpbHRlclN0YXRlLmZvcm1hdENvbnRleHQoKSlcbiAgICAgIDogbnVsbDtcbiAgfSk7XG5cbiAgcHJpdmF0ZSBfY2hhcnQ6IEVDaGFydHMgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBfZmlsdGVyU3RhdGUgPSBpbmplY3QoUmVwb3J0RmlsdGVyU3RhdGVTZXJ2aWNlKTtcblxuICBwdWJsaWMgb25DaGFydEluaXQoY2hhcnQ6IEVDaGFydHMpOiB2b2lkIHtcbiAgICB0aGlzLl9jaGFydCA9IGNoYXJ0O1xuICB9XG5cbiAgLy8gQ2FsbGVkIGJ5IHRoZSBjYW52YXMgd2hlbiB0aGUgYm94IGlzIHJlc2l6ZWQgaW4gZWRpdCBtb2RlLlxuICBwdWJsaWMgcmVzaXplKCk6IHZvaWQge1xuICAgIHRoaXMuX2NoYXJ0Py5yZXNpemUoKTtcbiAgfVxuXG4gIC8vIEhpZ2gtcmVzIGltYWdlIGZvciB0aGUgKGxhdGVyLXBoYXNlKSBQUFQvUERGIGV4cG9ydHMuXG4gIHB1YmxpYyBnZXREYXRhVVJMKHBpeGVsUmF0aW8gPSAzKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX2NoYXJ0Py5nZXREYXRhVVJMKHtcbiAgICAgIHR5cGU6ICdwbmcnLFxuICAgICAgcGl4ZWxSYXRpbyxcbiAgICAgIGJhY2tncm91bmRDb2xvcjogJyNmZmZmZmYnLFxuICAgIH0pID8/IG51bGw7XG4gIH1cbn1cbiIsIjxkaXZcbiAgY2xhc3M9XCJjaGFydC1ob3N0XCJcbiAgZWNoYXJ0c1xuICBbb3B0aW9uc109XCJvcHRpb25zKCkgPz8ge31cIlxuICBbdGhlbWVdPVwiJ3JlcG9ydCdcIlxuICBbYXV0b1Jlc2l6ZV09XCJ0cnVlXCJcbiAgKGNoYXJ0SW5pdCk9XCJvbkNoYXJ0SW5pdCgkZXZlbnQpXCI+XG48L2Rpdj5cbjxhcHAtcmVwb3J0LWNvbXBvbmVudC1ub3RlIFtkYXRhXT1cImRhdGEoKVwiPjwvYXBwLXJlcG9ydC1jb21wb25lbnQtbm90ZT5cbiJdfQ==
|
|
142
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LWNoYXJ0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy9jb21wb25lbnRzL2NvbXBvbmVudC1jaGFydC9jb21wb25lbnQtY2hhcnQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2NvbXBvbmVudHMvY29tcG9uZW50LWNoYXJ0L2NvbXBvbmVudC1jaGFydC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFNBQVMsR0FDOUYsTUFBTSxlQUFlLENBQUM7QUFHdkIsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBT2xELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUN0RixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQzs7QUFHcEYsMEVBQTBFO0FBQzFFLDBFQUEwRTtBQUMxRSwyRUFBMkU7QUFDM0Usb0VBQW9FO0FBQ3BFLHFFQUFxRTtBQUNyRSwyRUFBMkU7QUFDM0UsNENBQTRDO0FBQzVDLEVBQUU7QUFDRix1RUFBdUU7QUFDdkUsMkVBQTJFO0FBQzNFLDJFQUEyRTtBQUMzRSx1Q0FBdUM7QUFZdkMsTUFBTSxPQUFPLHVCQUF1QjtJQUVsQixTQUFTLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBbUIsQ0FBQztJQUM5QyxJQUFJLEdBQUcsS0FBSyxDQUF1QixJQUFJLENBQUMsQ0FBQztJQUN6RCw0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QUssR0FBRyxJQUFJO1lBQ2hCLENBQUMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsRUFBRSxFQUFFLEdBQUcsRUFBRSxLQUF3QixDQUFDO1lBQzFHLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFFVCxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ1YsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDN0IsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3ZCLENBQUM7SUFDSCxDQUFDO3dHQWxKVSx1QkFBdUI7NEZBQXZCLHVCQUF1Qiw4c0JDekNwQyxpV0FXQSwyS0QwQkksc0JBQXNCLHdJQUN0QixtQkFBbUI7OzRGQUdWLHVCQUF1QjtrQkFYbkMsU0FBUzsrQkFDRSw0QkFBNEIsbUJBR3JCLHVCQUF1QixDQUFDLE1BQU0sY0FDbkMsSUFBSSxXQUNQO3dCQUNQLHNCQUFzQjt3QkFDdEIsbUJBQW1CO3FCQUNwQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIE5nWm9uZSwgY29tcHV0ZWQsIGluamVjdCwgaW5wdXQsIG1vZGVsLCBvdXRwdXQsIHVudHJhY2tlZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB0eXBlIHsgRUNFbGVtZW50RXZlbnQsIEVDaGFydHNPcHRpb24sIEVDaGFydHMsIEVsZW1lbnRFdmVudCB9IGZyb20gJ2VjaGFydHMnO1xuaW1wb3J0IHsgTmd4RWNoYXJ0c0RpcmVjdGl2ZSB9IGZyb20gJ25neC1lY2hhcnRzJztcblxuaW1wb3J0IHsgQ2hhcnRDb25maWcsIENvbXBvbmVudERhdGEsIFJlcG9ydENvbXBvbmVudCB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvcmVwb3J0LmludGVyZmFjZSc7XG5pbXBvcnQgeyBSZXBvcnRDaGFydEhpdCB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvcmVwb3J0LWNoYXJ0LWhpdC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUmVwb3J0TWFya0FjdGlvbiB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvcmVwb3J0LW1hcmstYWN0aW9uLnR5cGUnO1xuaW1wb3J0IHsgUmVwb3J0TWFya0NsaWNrIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9yZXBvcnQtbWFyay1jbGljay5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUmVwb3J0TWFya0V2ZW50IH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9yZXBvcnQtbWFyay1ldmVudC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgY2hhcnRNYXJrQ2xpY2sgfSBmcm9tICcuLi8uLi9tYXJrLWNsaWNrJztcbmltcG9ydCB7IGJ1aWxkQ2hhcnRPcHRpb24gfSBmcm9tICcuLi8uLi9vcHRpb24tYnVpbGRlcic7XG5pbXBvcnQgeyBSZXBvcnRGaWx0ZXJTdGF0ZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9yZXBvcnQtZmlsdGVyLXN0YXRlLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ29tcG9uZW50Tm90ZUNvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudC1ub3RlL2NvbXBvbmVudC1ub3RlLmNvbXBvbmVudCc7XG5cblxuLy8gRUNoYXJ0cyBob3N0IGZvciBhIGNoYXJ0IGNvbXBvbmVudC4gUHVyZSByZW5kZXJpbmc6IHRoZSBwYXJlbnQgb3ducyB0aGVcbi8vIGRhdGEgZmV0Y2g7IHRoaXMgbWFwcyAoY29tcG9uZW50IGNvbmZpZywgcm93cywgdGhlIG9wZW4gcmVwb3J0J3MgZm9ybWF0XG4vLyBjb250ZXh0KSDihpIgb3B0aW9uIGFuZCBleHBvc2VzIHRoZSBjaGFydCBpbnN0YW5jZSBmb3IgcmVzaXplICsgdGhlIGZ1dHVyZVxuLy8gaW1hZ2UgZXhwb3J0cyAoZ2V0RGF0YVVSTCBuZWVkcyB0aGUgY2FudmFzIHJlbmRlcmVyIHJlZ2lzdGVyZWQgaW5cbi8vIHRoZW1lL2VjaGFydHMudHMpLiBUaGUgc2hhcmVkIG5vdGUgdW5kZXIgdGhlIHBsb3QgbmFtZXMgdGhlIGRheXMgYVxuLy8gY29tcGFyaXNvbiBjb21wYXJlcyBhbmQgd2h5IHdpbmRvd2VkIHNlcmllcyByZWFkIGFzIHRoZXkgZG87IHRoZSBzZXJpZXMnXG4vLyB0b29sdGlwcyBkZXNjcmliZSB0aGUgd2luZG93cyB0aGVtc2VsdmVzLlxuLy9cbi8vIEEgY2xpY2sgb24gYSBtYXJrIChhIGJhciwgYSBwb2ludCBvciB0aGUgbGluZSwgYSBzbGljZSwgYSBzdGVwLCBvciBhXG4vLyBjYXRlZ29yeSdzIGVtcHR5IGJhbmQpIGlzIHJlcG9ydGVkIGFzIGEgUmVwb3J0TWFya0NsaWNrIChtYXJrQ2xpY2spOyB0aGVcbi8vIHRpbGUgZGVjaWRlcyB3aGF0IGl0IGRvZXMuIFRoZSB0aWxlJ3MgYWN0aW9ucyBvbmx5IHNoYXBlIHRoZSBvcHRpb246IHRoZVxuLy8gaGFuZCBwb2ludGVyIGFuZCB0aGUgdG9vbHRpcCdzIGhpbnQuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtcmVwb3J0LWNvbXBvbmVudC1jaGFydCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9jb21wb25lbnQtY2hhcnQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9jb21wb25lbnQtY2hhcnQuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBDb21wb25lbnROb3RlQ29tcG9uZW50LFxuICAgIE5neEVjaGFydHNEaXJlY3RpdmUsXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIENvbXBvbmVudENoYXJ0Q29tcG9uZW50IHtcblxuICBwdWJsaWMgcmVhZG9ubHkgY29tcG9uZW50ID0gaW5wdXQucmVxdWlyZWQ8UmVwb3J0Q29tcG9uZW50PigpO1xuICBwdWJsaWMgcmVhZG9ubHkgZGF0YSA9IGlucHV0PENvbXBvbmVudERhdGEgfCBudWxsPihudWxsKTtcbiAgLy8gV2hpY2ggbGVnZW5kIGVudHJpZXMgYXJlIG9uLCBieSBzZXJpZXMgbmFtZS4gVGhlIHRpbGUgaG9sZHMgaXQgKHR3by13YXkpLFxuICAvLyBzbyBpdCBvdXRsaXZlcyB0aGlzIGNoYXJ0IGFuZCBldmVyeSBvcHRpb246IGVhY2ggbmV3IG9wdGlvbiBjYXJyaWVzIGl0XG4gIC8vIChsZWdlbmQuc2VsZWN0ZWQpLCBiZWNhdXNlIG5neC1lY2hhcnRzIHNldHMgYW4gb3B0aW9uIHdpdGggbm90TWVyZ2UuIEFcbiAgLy8gY2xpY2sgb24gdGhlIGxlZ2VuZCBvbmx5IHJlY29yZHMgaXQ6IHRoZSBjaGFydCBoYXMgYWxyZWFkeSB0b2dnbGVkIHRoZVxuICAvLyBzZXJpZXMsIHNvIHRoZSBvcHRpb24gaXMgbm90IGJ1aWx0IGFnYWluIGZvciBpdCAodW50cmFja2VkKS5cbiAgcHVibGljIHJlYWRvbmx5IGxlZ2VuZFNlbGVjdGVkID0gbW9kZWw8UmVhZG9ubHk8UmVjb3JkPHN0cmluZywgYm9vbGVhbj4+Pih7fSk7XG4gIC8vIFdoYXQgYSBjbGljayBvbiB0aGUgY2hhcnQncyBtYXJrcyBkb2VzLCBmcm9tIHRoZSB0aWxlICh0aWxlTWFya0FjdGlvbnMpLlxuICBwdWJsaWMgcmVhZG9ubHkgYWN0aW9ucyA9IGlucHV0PHJlYWRvbmx5IFJlcG9ydE1hcmtBY3Rpb25bXT4oW10pO1xuXG4gIHB1YmxpYyByZWFkb25seSBtYXJrQ2xpY2sgPSBvdXRwdXQ8UmVwb3J0TWFya0NsaWNrPigpO1xuICAvLyBBIGNsaWNrIG9yIGEgdGFwIG9uIHRoZSBjaGFydCB0aGF0IG5vIG1hcmsgYW5zd2VyZWQgKGFuIGVtcHR5IGJhbmQgYnlcbiAgLy8gdG91Y2gsIG91dHNpZGUgdGhlIHBsb3QsIGEgd2F0ZXJmYWxsJ3MgVG90YWwpOiB0aGUgdGlsZSBmb3JnZXRzIGEgdGFwXG4gIC8vIGl0IHdhcyBob2xkaW5nLCBzbyB0aGUgbmV4dCB0YXAgb24gYSBtYXJrIHNob3dzIGl0cyB0b29sdGlwIGZpcnN0LlxuICBwdWJsaWMgcmVhZG9ubHkgbWFya01pc3MgPSBvdXRwdXQ8dm9pZD4oKTtcblxuICBwdWJsaWMgcmVhZG9ubHkgb3B0aW9ucyA9IGNvbXB1dGVkPEVDaGFydHNPcHRpb24gfCBudWxsPigoKSA9PiB7XG4gICAgY29uc3QgZGF0YSA9IHRoaXMuZGF0YSgpO1xuXG4gICAgcmV0dXJuIGRhdGFcbiAgICAgID8gYnVpbGRDaGFydE9wdGlvbihcbiAgICAgICAgdGhpcy5jb21wb25lbnQoKSxcbiAgICAgICAgZGF0YSxcbiAgICAgICAgdGhpcy5fZmlsdGVyU3RhdGUuZm9ybWF0Q29udGV4dCgpLFxuICAgICAgICB1bnRyYWNrZWQodGhpcy5sZWdlbmRTZWxlY3RlZCksXG4gICAgICAgIHRoaXMuYWN0aW9ucygpLFxuICAgICAgKVxuICAgICAgOiBudWxsO1xuICB9KTtcblxuICBwcml2YXRlIF9jaGFydDogRUNoYXJ0cyB8IG51bGwgPSBudWxsO1xuICAvLyBUaGUgYnJvd3NlciBldmVudCBvZiB0aGUgbGFzdCBjbGljayBhIG1hcmsgYW5zd2VyZWQsIHNvIHRoZSBlbXB0eS1iYW5kXG4gIC8vIGhhbmRsZXIgc2tpcHMgdGhhdCBldmVudC5cbiAgcHJpdmF0ZSBfbWFya0V2ZW50OiB1bmtub3duID0gbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBfZmlsdGVyU3RhdGUgPSBpbmplY3QoUmVwb3J0RmlsdGVyU3RhdGVTZXJ2aWNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfem9uZSA9IGluamVjdChOZ1pvbmUpO1xuXG4gIHB1YmxpYyBvbkNoYXJ0SW5pdChjaGFydDogRUNoYXJ0cyk6IHZvaWQge1xuICAgIHRoaXMuX2NoYXJ0ID0gY2hhcnQ7XG4gICAgLy8gQSBjbGljayBpbiBhIGNhdGVnb3J5J3MgZW1wdHkgYmFuZCBpcyBubyBlbGVtZW50J3MgY2xpY2s6IHRoZSBjaGFydCdzXG4gICAgLy8gZHJhd2luZyBzdXJmYWNlIHJlcG9ydHMgaXQuIEVDaGFydHMgcnVucyBpdCBvdXRzaWRlIEFuZ3VsYXIsIGFuZFxuICAgIC8vIGJlZm9yZSB0aGUgY2hhcnQncyBvd24gY2xpY2sgb24gYSBtYXJrIChFQ2hhcnRzIGNhbGxzIGl0cyBlbGVtZW50XG4gICAgLy8gaGFuZGxlciBsYXN0KSwgc28gaXQgd2FpdHMgYSBtaWNyb3Rhc2s6IGJ5IHRoZW4gYSBtYXJrIGhhcyBhbnN3ZXJlZFxuICAgIC8vIHRoZSBzYW1lIGNsaWNrLlxuICAgIGNoYXJ0LmdldFpyKCkub24oJ2NsaWNrJywgKGV2ZW50OiBFbGVtZW50RXZlbnQpID0+IHtcbiAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHRoaXMuX3pvbmUucnVuKCgpID0+IHRoaXMuX29uQmFuZENsaWNrKGV2ZW50KSkpO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gRUNoYXJ0cyByZXBvcnRzIGV2ZXJ5IGVudHJ5IG9mIHRoZSBsZWdlbmQgYWZ0ZXIgYSBjbGljay5cbiAgcHVibGljIG9uTGVnZW5kU2VsZWN0Q2hhbmdlZChldmVudDogeyBzZWxlY3RlZD86IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+IH0gfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy5sZWdlbmRTZWxlY3RlZC5zZXQoeyAuLi4oZXZlbnQ/LnNlbGVjdGVkID8/IHt9KSB9KTtcbiAgfVxuXG4gIC8vIEEgY2xpY2sgb24gYSBzZXJpZXMgZWxlbWVudC4gQSBjbGljayBvbiBhIGxpbmUgb3IgYW4gYXJlYSdzIGxpbmUgaXRzZWxmXG4gIC8vIGNhcnJpZXMgbm8gY2F0ZWdvcnksIHNvIGl0IHRha2VzIHRoZSBjYXRlZ29yeSB3aG9zZSBiYW5kIGl0IGZlbGwgaW4sIGFuZFxuICAvLyBubyBzZXJpZXMgaWQsIHNvIGl0IHRha2VzIHRoZSBpZCB0aGUgb3B0aW9uIGdhdmUgdGhhdCBzZXJpZXMgKGEgcGFydGlhbFxuICAvLyBzZWdtZW50J3MgaWQgbmFtZXMgdGhlIHNlcmllcyBpdCBjb250aW51ZXMpLlxuICBwdWJsaWMgb25DaGFydENsaWNrKHBhcmFtczogRUNFbGVtZW50RXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLl9tYXJrRXZlbnQgPSBwYXJhbXMuZXZlbnQ/LmV2ZW50ID8/IG51bGw7XG5cbiAgICBpZiAocGFyYW1zLmNvbXBvbmVudFR5cGUgIT09ICdzZXJpZXMnKSB7XG4gICAgICB0aGlzLm1hcmtNaXNzLmVtaXQoKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHNlcmllc0luZGV4ID0gcGFyYW1zLnNlcmllc0luZGV4ID8/IG51bGw7XG4gICAgY29uc3QgZGF0YUluZGV4ID0gdHlwZW9mIHBhcmFtcy5kYXRhSW5kZXggPT09ICdudW1iZXInXG4gICAgICA/IHBhcmFtcy5kYXRhSW5kZXhcbiAgICAgIDogdGhpcy5fYmFuZEluZGV4KHBhcmFtcy5ldmVudD8ub2Zmc2V0WCwgcGFyYW1zLmV2ZW50Py5vZmZzZXRZKTtcblxuICAgIHRoaXMuX2VtaXQoXG4gICAgICB7IHNlcmllc0luZGV4LCBzZXJpZXNJZDogcGFyYW1zLnNlcmllc0lkID8/IHRoaXMuX3Nlcmllc0lkKHNlcmllc0luZGV4KSwgZGF0YUluZGV4OiBkYXRhSW5kZXggPz8gLTEgfSxcbiAgICAgIHBhcmFtcy5ldmVudD8uZXZlbnQsXG4gICAgKTtcbiAgfVxuXG4gIC8vIENhbGxlZCBieSB0aGUgY2FudmFzIHdoZW4gdGhlIGJveCBpcyByZXNpemVkIGluIGVkaXQgbW9kZS5cbiAgcHVibGljIHJlc2l6ZSgpOiB2b2lkIHtcbiAgICB0aGlzLl9jaGFydD8ucmVzaXplKCk7XG4gIH1cblxuICAvLyBIaWdoLXJlcyBpbWFnZSBmb3IgdGhlIChsYXRlci1waGFzZSkgUFBUL1BERiBleHBvcnRzLlxuICBwdWJsaWMgZ2V0RGF0YVVSTChwaXhlbFJhdGlvID0gMyk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9jaGFydD8uZ2V0RGF0YVVSTCh7XG4gICAgICB0eXBlOiAncG5nJyxcbiAgICAgIHBpeGVsUmF0aW8sXG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6ICcjZmZmZmZmJyxcbiAgICB9KSA/PyBudWxsO1xuICB9XG5cbiAgLy8gQSBjbGljayBvbiB0aGUgY2hhcnQgdGhhdCBubyBlbGVtZW50IGFuc3dlcmVkOiB0aGUgY2F0ZWdvcnkgd2hvc2UgYmFuZFxuICAvLyBpdCBmZWxsIGluLiBPdXRzaWRlIHRoZSBwbG90IGl0IGlzIGEgbWlzcy5cbiAgcHJpdmF0ZSBfb25CYW5kQ2xpY2soZXZlbnQ6IEVsZW1lbnRFdmVudCk6IHZvaWQge1xuICAgIGlmIChldmVudC5ldmVudCA9PT0gdGhpcy5fbWFya0V2ZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fZW1pdChcbiAgICAgIHsgc2VyaWVzSW5kZXg6IG51bGwsIHNlcmllc0lkOiBudWxsLCBkYXRhSW5kZXg6IHRoaXMuX2JhbmRJbmRleChldmVudC5vZmZzZXRYLCBldmVudC5vZmZzZXRZKSA/PyAtMSB9LFxuICAgICAgZXZlbnQuZXZlbnQsXG4gICAgKTtcbiAgfVxuXG4gIC8vIFRoZSBjYXRlZ29yeSBpbmRleCB1bmRlciBhIHBvaW50IG9mIHRoZSBjaGFydCwgcmVhZCBvZmYgdGhlIGNhdGVnb3J5XG4gIC8vIGF4aXMgKHRoZSB5IGF4aXMgb2YgYSBob3Jpem9udGFsIGNoYXJ0KTsgbnVsbCBvdXRzaWRlIHRoZSBwbG90IG9yIG9uIGFcbiAgLy8gY2hhcnQgd2l0aG91dCBvbmUuIEFuIGF4aXMgZmluZGVyIHRha2VzIHRoZSBvbmUgY29vcmRpbmF0ZSBhbG9uZyBpdHNcbiAgLy8gYXhpcywgbm90IHRoZSBwb2ludC5cbiAgcHJpdmF0ZSBfYmFuZEluZGV4KHg6IG51bWJlciB8IHVuZGVmaW5lZCwgeTogbnVtYmVyIHwgdW5kZWZpbmVkKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgY29uc3QgY2hhcnQgPSB0aGlzLl9jaGFydDtcblxuICAgIGlmICghY2hhcnQgfHwgdHlwZW9mIHggIT09ICdudW1iZXInIHx8IHR5cGVvZiB5ICE9PSAnbnVtYmVyJyB8fCAhY2hhcnQuY29udGFpblBpeGVsKCdncmlkJywgW3gsIHldKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgaG9yaXpvbnRhbCA9ICh0aGlzLmNvbXBvbmVudCgpLmNvbmZpZyBhcyBDaGFydENvbmZpZyk/Lm9yaWVudGF0aW9uID09PSAnaG9yaXpvbnRhbCc7XG4gICAgY29uc3QgaW5kZXggPSBOdW1iZXIoaG9yaXpvbnRhbFxuICAgICAgPyBjaGFydC5jb252ZXJ0RnJvbVBpeGVsKHsgeUF4aXNJbmRleDogMCB9LCB5KVxuICAgICAgOiBjaGFydC5jb252ZXJ0RnJvbVBpeGVsKHsgeEF4aXNJbmRleDogMCB9LCB4KSk7XG5cbiAgICByZXR1cm4gTnVtYmVyLmlzRmluaXRlKGluZGV4KSA/IE1hdGgucm91bmQoaW5kZXgpIDogbnVsbDtcbiAgfVxuXG4gIC8vIFRoZSBpZCB0aGUgb3B0aW9uIGdhdmUgYSBkcmF3biBzZXJpZXMsIGJ5IGl0cyBpbmRleC5cbiAgcHJpdmF0ZSBfc2VyaWVzSWQoc2VyaWVzSW5kZXg6IG51bWJlciB8IG51bGwpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBjb25zdCBzZXJpZXMgPSB0aGlzLm9wdGlvbnMoKT8uc2VyaWVzO1xuICAgIGNvbnN0IGlkID0gQXJyYXkuaXNBcnJheShzZXJpZXMpICYmIHNlcmllc0luZGV4ICE9PSBudWxsID8gc2VyaWVzW3Nlcmllc0luZGV4XT8uaWQgOiBudWxsO1xuXG4gICAgcmV0dXJuIGlkID09PSBudWxsIHx8IGlkID09PSB1bmRlZmluZWQgPyBudWxsIDogU3RyaW5nKGlkKTtcbiAgfVxuXG4gIHByaXZhdGUgX2VtaXQoaGl0OiBSZXBvcnRDaGFydEhpdCwgZXZlbnQ6IHVua25vd24pOiB2b2lkIHtcbiAgICBjb25zdCBkYXRhID0gdGhpcy5kYXRhKCk7XG4gICAgY29uc3QgY2xpY2sgPSBkYXRhXG4gICAgICA/IGNoYXJ0TWFya0NsaWNrKHRoaXMuY29tcG9uZW50KCksIGRhdGEsIHRoaXMuX2ZpbHRlclN0YXRlLmZvcm1hdENvbnRleHQoKSwgaGl0LCBldmVudCBhcyBSZXBvcnRNYXJrRXZlbnQpXG4gICAgICA6IG51bGw7XG5cbiAgICBpZiAoY2xpY2spIHtcbiAgICAgIHRoaXMubWFya0NsaWNrLmVtaXQoY2xpY2spO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm1hcmtNaXNzLmVtaXQoKTtcbiAgICB9XG4gIH1cbn1cbiIsIjxkaXZcbiAgY2xhc3M9XCJjaGFydC1ob3N0XCJcbiAgZWNoYXJ0c1xuICBbb3B0aW9uc109XCJvcHRpb25zKCkgPz8ge31cIlxuICBbdGhlbWVdPVwiJ3JlcG9ydCdcIlxuICBbYXV0b1Jlc2l6ZV09XCJ0cnVlXCJcbiAgKGNoYXJ0SW5pdCk9XCJvbkNoYXJ0SW5pdCgkZXZlbnQpXCJcbiAgKGNoYXJ0Q2xpY2spPVwib25DaGFydENsaWNrKCRldmVudClcIlxuICAoY2hhcnRMZWdlbmRTZWxlY3RDaGFuZ2VkKT1cIm9uTGVnZW5kU2VsZWN0Q2hhbmdlZCgkZXZlbnQpXCI+XG48L2Rpdj5cbjxhcHAtcmVwb3J0LWNvbXBvbmVudC1ub3RlIFtkYXRhXT1cImRhdGEoKVwiPjwvYXBwLXJlcG9ydC1jb21wb25lbnQtbm90ZT5cbiJdfQ==
|