@firestitch/report 18.6.0 → 18.7.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 +6 -7
- package/app/reports/components/component-kpi/component-kpi.component.d.ts +8 -8
- package/app/reports/components/component-list/component-list.component.d.ts +33 -11
- package/app/reports/components/report-component/report-component.component.d.ts +3 -0
- package/app/reports/data/report.data.d.ts +2 -1
- package/app/reports/dialogs/list-columns/list-columns.component.d.ts +23 -0
- package/app/reports/dialogs/report-settings/report-locale-patch.d.ts +5 -0
- package/app/reports/dialogs/report-settings/report-settings.component.d.ts +20 -1
- package/app/reports/enums/report-chart-color.enum.d.ts +12 -0
- package/app/reports/enums/report-chart-data-labels.enum.d.ts +6 -0
- package/app/reports/enums/report-chart-date-label.enum.d.ts +5 -0
- package/app/reports/enums/report-chart-line-style.enum.d.ts +5 -0
- package/app/reports/enums/report-chart-mark-stat.enum.d.ts +6 -0
- package/app/reports/enums/report-list-column-format.enum.d.ts +6 -0
- package/app/reports/enums/report-number-units.enum.d.ts +6 -0
- package/app/reports/enums/report-value-format.enum.d.ts +5 -0
- package/app/reports/export/offscreen-chart.d.ts +2 -2
- package/app/reports/export/report-export-collector.service.d.ts +12 -9
- package/app/reports/export/report-pdf.service.d.ts +1 -0
- package/app/reports/export/report-pptx.service.d.ts +17 -0
- package/app/reports/format.d.ts +39 -4
- package/app/reports/interfaces/report.interface.d.ts +82 -10
- package/app/reports/list-config.d.ts +9 -0
- package/app/reports/option-builder.d.ts +69 -8
- package/app/reports/pipes/report-date.pipe.d.ts +2 -1
- package/app/reports/pipes/report-number.pipe.d.ts +8 -0
- package/app/reports/report-filter-items.d.ts +5 -2
- package/app/reports/report-url-state.d.ts +5 -0
- package/app/reports/services/report-filter-state.service.d.ts +29 -2
- package/app/reports/theme/palette.d.ts +3 -0
- package/app/reports/theme/typography.d.ts +1 -0
- package/esm2022/app/reports/components/component-chart/component-chart.component.mjs +19 -20
- package/esm2022/app/reports/components/component-kpi/component-kpi.component.mjs +23 -26
- package/esm2022/app/reports/components/component-list/component-list.component.mjs +157 -53
- package/esm2022/app/reports/components/report-component/report-component.component.mjs +81 -19
- package/esm2022/app/reports/data/report.data.mjs +17 -4
- package/esm2022/app/reports/dialogs/global-settings/global-settings.component.mjs +2 -2
- package/esm2022/app/reports/dialogs/list-columns/list-columns.component.mjs +56 -0
- package/esm2022/app/reports/dialogs/report-settings/report-locale-patch.mjs +13 -0
- package/esm2022/app/reports/dialogs/report-settings/report-settings.component.mjs +137 -15
- package/esm2022/app/reports/enums/report-chart-color.enum.mjs +19 -0
- package/esm2022/app/reports/enums/report-chart-data-labels.enum.mjs +13 -0
- package/esm2022/app/reports/enums/report-chart-date-label.enum.mjs +13 -0
- package/esm2022/app/reports/enums/report-chart-line-style.enum.mjs +12 -0
- package/esm2022/app/reports/enums/report-chart-mark-stat.enum.mjs +12 -0
- package/esm2022/app/reports/enums/report-list-column-format.enum.mjs +14 -0
- package/esm2022/app/reports/enums/report-number-units.enum.mjs +14 -0
- package/esm2022/app/reports/enums/report-value-format.enum.mjs +13 -0
- package/esm2022/app/reports/export/offscreen-chart.mjs +5 -4
- package/esm2022/app/reports/export/report-export-collector.service.mjs +96 -39
- package/esm2022/app/reports/export/report-pdf.service.mjs +94 -37
- package/esm2022/app/reports/export/report-pptx.service.mjs +482 -85
- package/esm2022/app/reports/format.mjs +502 -57
- package/esm2022/app/reports/interfaces/report.interface.mjs +1 -1
- package/esm2022/app/reports/list-config.mjs +74 -0
- package/esm2022/app/reports/option-builder.mjs +880 -95
- package/esm2022/app/reports/pipes/report-date.pipe.mjs +7 -6
- package/esm2022/app/reports/pipes/report-number.pipe.mjs +25 -0
- package/esm2022/app/reports/report-filter-items.mjs +28 -3
- package/esm2022/app/reports/report-url-state.mjs +60 -15
- package/esm2022/app/reports/services/report-filter-state.service.mjs +275 -29
- package/esm2022/app/reports/theme/echarts.mjs +8 -2
- package/esm2022/app/reports/theme/palette.mjs +19 -1
- package/esm2022/app/reports/theme/typography.mjs +4 -1
- package/esm2022/app/reports/views/report/fs-ai-report.component.mjs +11 -4
- package/esm2022/app/reports/views/report/report.component.mjs +6 -2
- package/esm2022/public_api.mjs +9 -1
- package/fesm2022/{firestitch-report-echarts-B9nl9XKM.mjs → firestitch-report-echarts-u5ImuZT5.mjs} +9 -3
- package/fesm2022/firestitch-report-echarts-u5ImuZT5.mjs.map +1 -0
- package/fesm2022/{firestitch-report-firestitch-report-Bb65HEYB.mjs → firestitch-report-firestitch-report-Cz-kA_id.mjs} +3213 -613
- package/fesm2022/firestitch-report-firestitch-report-Cz-kA_id.mjs.map +1 -0
- package/fesm2022/firestitch-report.mjs +1 -1
- package/package.json +1 -1
- package/public_api.d.ts +8 -0
- package/fesm2022/firestitch-report-echarts-B9nl9XKM.mjs.map +0 -1
- package/fesm2022/firestitch-report-firestitch-report-Bb65HEYB.mjs.map +0 -1
|
@@ -1,17 +1,65 @@
|
|
|
1
1
|
import type { EChartsOption } from 'echarts';
|
|
2
|
-
import {
|
|
2
|
+
import { ReportChartDataLabels } from './enums/report-chart-data-labels.enum';
|
|
3
|
+
import { ReportChartDateLabel } from './enums/report-chart-date-label.enum';
|
|
4
|
+
import { ReportChartLineStyle } from './enums/report-chart-line-style.enum';
|
|
5
|
+
import { ReportChartMarkStat } from './enums/report-chart-mark-stat.enum';
|
|
6
|
+
import { AxisChartType, ChartConfig, ChartGranularity, ChartMeasure, ChartValueAxis, ComponentData, LegendPosition, ListColumn, ListConfig, ReportComponent, ReportFormatContext, ReportLocaleTag, WaterfallStepKind } from './interfaces/report.interface';
|
|
7
|
+
export declare const PERCENT_AXIS_MAX = 1;
|
|
8
|
+
export declare const PERCENT_AXIS_INTERVAL = 0.25;
|
|
9
|
+
export declare const STAT_LABEL: Record<ReportChartMarkStat, string>;
|
|
10
|
+
export type ValueAxisIndex = 0 | 1;
|
|
11
|
+
export interface DrawnReference {
|
|
12
|
+
label: string;
|
|
13
|
+
low: number;
|
|
14
|
+
high: number;
|
|
15
|
+
band: boolean;
|
|
16
|
+
axisIndex: ValueAxisIndex;
|
|
17
|
+
}
|
|
18
|
+
interface DataLabelParams {
|
|
19
|
+
value?: unknown;
|
|
20
|
+
data?: unknown;
|
|
21
|
+
}
|
|
22
|
+
export type DataLabelFormatter = (params: DataLabelParams) => string;
|
|
23
|
+
export type DataLabelPosition = 'top' | 'inside' | 'outside';
|
|
24
|
+
export interface DataLabel<P extends DataLabelPosition = DataLabelPosition> {
|
|
25
|
+
show: true;
|
|
26
|
+
position: P;
|
|
27
|
+
fontSize: number;
|
|
28
|
+
formatter: DataLabelFormatter;
|
|
29
|
+
}
|
|
30
|
+
export interface SeriesDataLabels {
|
|
31
|
+
text: Omit<DataLabel, 'position'>;
|
|
32
|
+
hideOverlap: boolean;
|
|
33
|
+
lastOnly: boolean;
|
|
34
|
+
}
|
|
35
|
+
export type PercentShares = Map<number, (number | null)[]>;
|
|
3
36
|
export declare function isColorBy(config: ChartConfig): boolean;
|
|
4
37
|
export declare function colorByColumn(config: ChartConfig): string | undefined;
|
|
5
38
|
export interface ExtractedChartSeries {
|
|
6
39
|
categories: string[];
|
|
7
|
-
series:
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
40
|
+
series: ExtractedChartSeriesItem[];
|
|
41
|
+
}
|
|
42
|
+
export interface ExtractedChartSeriesItem {
|
|
43
|
+
name: string;
|
|
44
|
+
values: (number | null)[];
|
|
45
|
+
type?: AxisChartType;
|
|
46
|
+
measure: ChartMeasure;
|
|
47
|
+
measureIndex: number;
|
|
12
48
|
}
|
|
13
49
|
export declare function extractChartSeries(component: ReportComponent, data: ComponentData): ExtractedChartSeries;
|
|
50
|
+
export declare function seriesColor(series: ExtractedChartSeriesItem): string | undefined;
|
|
51
|
+
export declare function seriesHex(series: ExtractedChartSeriesItem, index: number): string;
|
|
52
|
+
export declare function measureLineStyle(measure: ChartMeasure | undefined): ReportChartLineStyle | undefined;
|
|
53
|
+
export declare function measureMarkStat(measure: ChartMeasure | undefined): ReportChartMarkStat | undefined;
|
|
54
|
+
export declare function seriesStat(values: (number | null)[], stat: ReportChartMarkStat): number | null;
|
|
55
|
+
export declare function drawsStatLines(config: ChartConfig): boolean;
|
|
56
|
+
export declare function colorByValues(extracted: ExtractedChartSeries): (number | null)[];
|
|
57
|
+
export declare function chartReferences(config: ChartConfig, twoAxes: boolean): DrawnReference[];
|
|
58
|
+
export declare function percentShares(values: (number | null)[][]): (number | null)[][];
|
|
59
|
+
export declare function percentStackedShares(extracted: ExtractedChartSeries, config: ChartConfig): PercentShares | null;
|
|
60
|
+
export declare function percentAxisMin(shares: PercentShares): number;
|
|
14
61
|
export declare function seriesTypes(extracted: ExtractedChartSeries, chartType: AxisChartType): AxisChartType[];
|
|
62
|
+
export declare function seriesAxisIndexes(extracted: ExtractedChartSeries, config: ChartConfig): ValueAxisIndex[];
|
|
15
63
|
export interface WaterfallStep {
|
|
16
64
|
category: string;
|
|
17
65
|
start: number;
|
|
@@ -24,7 +72,20 @@ export interface ExtractedWaterfall {
|
|
|
24
72
|
}
|
|
25
73
|
export declare const WATERFALL_TOTAL_LABEL = "Total";
|
|
26
74
|
export declare function extractWaterfall(component: ReportComponent, data: ComponentData): ExtractedWaterfall;
|
|
27
|
-
export declare function buildChartOption(component: ReportComponent, data: ComponentData): EChartsOption;
|
|
75
|
+
export declare function buildChartOption(component: ReportComponent, data: ComponentData, context: ReportFormatContext): EChartsOption;
|
|
76
|
+
export declare function referencePeak(references: DrawnReference[], axisIndex: ValueAxisIndex): number;
|
|
28
77
|
export declare function resolveLegendPosition(config: ChartConfig, seriesCount: number, colorBy?: boolean): LegendPosition;
|
|
78
|
+
export declare function dataLabelOption(mode: ReportChartDataLabels | undefined, formatter: DataLabelFormatter): SeriesDataLabels | null;
|
|
79
|
+
export declare function valueAxisRange(axis: ChartValueAxis | undefined): {
|
|
80
|
+
min?: number;
|
|
81
|
+
max?: number;
|
|
82
|
+
interval?: number;
|
|
83
|
+
};
|
|
29
84
|
export declare function spansMultipleYears(categories: string[]): boolean;
|
|
30
|
-
export declare function
|
|
85
|
+
export declare function chartDateLabel(config: ChartConfig | undefined): ReportChartDateLabel;
|
|
86
|
+
export declare function formatPeriodLabel(value: string, granularity: ChartGranularity, multiYear: boolean, locale: ReportLocaleTag, dateLabel?: ReportChartDateLabel): string;
|
|
87
|
+
export declare function pivotHeadings(config: ListConfig, data: ComponentData, locale: ReportLocaleTag): string[];
|
|
88
|
+
export declare function pivotColumnSpecs(config: ListConfig, data: ComponentData, locale: ReportLocaleTag): (ListColumn & {
|
|
89
|
+
numeric: boolean;
|
|
90
|
+
})[];
|
|
91
|
+
export {};
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { PipeTransform } from '@angular/core';
|
|
2
|
+
import { ReportLocaleTag } from '../interfaces/report.interface';
|
|
2
3
|
import * as i0 from "@angular/core";
|
|
3
4
|
export declare class ReportDatePipe implements PipeTransform {
|
|
4
|
-
transform(value: unknown, timezone: string): string;
|
|
5
|
+
transform(value: unknown, timezone: string, locale: ReportLocaleTag): string;
|
|
5
6
|
static ɵfac: i0.ɵɵFactoryDeclaration<ReportDatePipe, never>;
|
|
6
7
|
static ɵpipe: i0.ɵɵPipeDeclaration<ReportDatePipe, "fsReportDate", true>;
|
|
7
8
|
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { PipeTransform } from '@angular/core';
|
|
2
|
+
import { NumberFormatSpec, ReportFormatContext } from '../interfaces/report.interface';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
export declare class ReportNumberPipe implements PipeTransform {
|
|
5
|
+
transform(value: unknown, column: NumberFormatSpec, context: ReportFormatContext): string;
|
|
6
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<ReportNumberPipe, never>;
|
|
7
|
+
static ɵpipe: i0.ɵɵPipeDeclaration<ReportNumberPipe, "fsReportNumber", true>;
|
|
8
|
+
}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { IFilterConfigItem } from '@firestitch/filter';
|
|
2
2
|
import { Observable } from 'rxjs';
|
|
3
3
|
import { ReportData } from './data/report.data';
|
|
4
|
-
import { ChartGranularity, FilterGroupValue, Report, ReportFilterGroup } from './interfaces/report.interface';
|
|
4
|
+
import { ChartGranularity, FilterGroupValue, Report, ReportFilterGroup, ReportLocaleTag } from './interfaces/report.interface';
|
|
5
5
|
export declare function dateBoundString(value: Date | string | null | undefined): string | undefined;
|
|
6
|
-
export declare function dateBoundLabel(value: Date | string | null | undefined): string | null;
|
|
6
|
+
export declare function dateBoundLabel(value: Date | string | null | undefined, locale: ReportLocaleTag): string | null;
|
|
7
7
|
export declare function dateFromBound(value: string | null | undefined): Date | null;
|
|
8
8
|
export declare function dateToBound(value: Date | null | undefined): string | null;
|
|
9
9
|
export declare function relativeLabel(relative: string): string;
|
|
@@ -29,6 +29,9 @@ export declare function matchOptions(options$: Observable<{
|
|
|
29
29
|
value: unknown;
|
|
30
30
|
}[]>;
|
|
31
31
|
export declare function filterItemForGroup(group: ReportFilterGroup, reportData: ReportData, reportId: number, initial?: FilterGroupValue): IFilterConfigItem;
|
|
32
|
+
export declare const LIST_SEARCH_ITEM = "listSearch";
|
|
33
|
+
export declare const LIST_SEARCH_MAX_LENGTH = 100;
|
|
34
|
+
export declare function listSearchItem(value: string | null): IFilterConfigItem;
|
|
32
35
|
export declare function hasTimeSeriesChart(report: Report | null): boolean;
|
|
33
36
|
export declare function isGranularityOffered(report: Report, granularity: ChartGranularity | null): boolean;
|
|
34
37
|
export declare function groupByFilterItem(report: Report, initial?: ChartGranularity | null): IFilterConfigItem | null;
|
|
@@ -1,9 +1,14 @@
|
|
|
1
1
|
import { ParamMap, Params } from '@angular/router';
|
|
2
2
|
import { FilterGroupValue, ReportFilterType, ReportSort, ReportUrlParams, ReportUrlSnapshot } from './interfaces/report.interface';
|
|
3
|
+
export { GROUP_PARAM_PREFIX } from './report-filter-items';
|
|
3
4
|
export declare const LIST_SORT_PARAM_PREFIX = "s";
|
|
4
5
|
export declare const DATE_RANGE_SEPARATOR = "..";
|
|
6
|
+
export declare const LIST_SEARCH_PARAM_PREFIX = "q";
|
|
7
|
+
export declare const LIST_HIDDEN_PARAM_PREFIX = "h";
|
|
5
8
|
export declare const OWNED_PARAM: RegExp;
|
|
6
9
|
export declare function readReportUrlParams(params: ParamMap): ReportUrlParams;
|
|
10
|
+
export declare function encodeColumnList(names: readonly string[]): string;
|
|
11
|
+
export declare function decodeColumnList(raw: string): string[];
|
|
7
12
|
export declare function decodeFilterValue(type: ReportFilterType, raw: string, resolveRelative: (name: string) => {
|
|
8
13
|
start: Date;
|
|
9
14
|
end: Date;
|
|
@@ -1,11 +1,22 @@
|
|
|
1
1
|
import { Observable } from 'rxjs';
|
|
2
2
|
import { ReportChatViewerFilter } from '../interfaces/report-chat-viewer-filter.interface';
|
|
3
|
-
import { ChartGranularity, FilterGroupDefault, FilterGroupValue, Report, ReportComponent, ReportFilterGroup, ReportSort, ReportUrlParams, ReportUrlSnapshot, ResolvedFilterValue } from '../interfaces/report.interface';
|
|
3
|
+
import { ChartGranularity, FilterGroupDefault, FilterGroupValue, Report, ReportComponent, ReportFilterGroup, ReportFormatContext, ReportSort, ReportUrlParams, ReportUrlSnapshot, ResolvedFilterValue } from '../interfaces/report.interface';
|
|
4
4
|
import * as i0 from "@angular/core";
|
|
5
5
|
export declare function sameDefault(a: FilterGroupDefault | null, b: FilterGroupDefault | null): boolean;
|
|
6
|
+
export declare function sameFilterValue(a: FilterGroupValue | null | undefined, b: FilterGroupValue | null | undefined): boolean;
|
|
7
|
+
export declare function movedGroupValues(lastReported: Map<number, FilterGroupValue | null>, reported: {
|
|
8
|
+
groupId: number;
|
|
9
|
+
value: FilterGroupValue | null;
|
|
10
|
+
}[]): {
|
|
11
|
+
groupId: number;
|
|
12
|
+
value: FilterGroupValue | null;
|
|
13
|
+
}[];
|
|
14
|
+
export declare function listSearchText(text: string): string;
|
|
6
15
|
export declare function defaultSignature(group: ReportFilterGroup): string;
|
|
7
16
|
export declare class ReportFilterStateService {
|
|
8
17
|
readonly timezone: import("@angular/core").WritableSignal<string>;
|
|
18
|
+
readonly formatContext: import("@angular/core").WritableSignal<ReportFormatContext>;
|
|
19
|
+
readonly listHidden: import("@angular/core").WritableSignal<ReadonlyMap<number, readonly string[]>>;
|
|
9
20
|
private _values;
|
|
10
21
|
private _groups;
|
|
11
22
|
private _sessionDisabled;
|
|
@@ -13,6 +24,10 @@ export declare class ReportFilterStateService {
|
|
|
13
24
|
private _frequency;
|
|
14
25
|
private _frequencyChanged$;
|
|
15
26
|
private _listSorts;
|
|
27
|
+
private _listSearches;
|
|
28
|
+
private _lists;
|
|
29
|
+
private _serverSearches;
|
|
30
|
+
private _listSearchChanged$;
|
|
16
31
|
private _changed$;
|
|
17
32
|
private _urlChanged$;
|
|
18
33
|
init(report: Report, restore?: ReportUrlParams | null): void;
|
|
@@ -26,7 +41,13 @@ export declare class ReportFilterStateService {
|
|
|
26
41
|
setFrequency(frequency: ChartGranularity | null): void;
|
|
27
42
|
frequencyChanges(): Observable<void>;
|
|
28
43
|
listSort(componentId: number): ReportSort | null;
|
|
29
|
-
setListSort(
|
|
44
|
+
setListSort(component: ReportComponent, sort: ReportSort | null): void;
|
|
45
|
+
listSearch(componentId: number): string | null;
|
|
46
|
+
listSearchable(component: ReportComponent): boolean;
|
|
47
|
+
setListSearch(componentId: number, text: string): void;
|
|
48
|
+
hiddenColumns(componentId: number): readonly string[];
|
|
49
|
+
setHiddenColumns(componentId: number, names: readonly string[]): void;
|
|
50
|
+
listSearchChanges(componentId: number): Observable<void>;
|
|
30
51
|
urlChanges(): Observable<void>;
|
|
31
52
|
urlSnapshot(report: Report): ReportUrlSnapshot;
|
|
32
53
|
isFilterDisabled(filterId: number): boolean;
|
|
@@ -38,9 +59,15 @@ export declare class ReportFilterStateService {
|
|
|
38
59
|
private _resolvedFields;
|
|
39
60
|
private _seed;
|
|
40
61
|
private _restore;
|
|
62
|
+
private _restoreGroups;
|
|
63
|
+
private _restoreListSorts;
|
|
64
|
+
private _restoreListSearches;
|
|
65
|
+
private _restoreListHidden;
|
|
66
|
+
private _dropUnsearchable;
|
|
41
67
|
private _prune;
|
|
42
68
|
private _withPreset;
|
|
43
69
|
private _isDefault;
|
|
70
|
+
private _components;
|
|
44
71
|
private _listComponents;
|
|
45
72
|
private _sortableColumns;
|
|
46
73
|
private _defaultValue;
|
|
@@ -1,4 +1,7 @@
|
|
|
1
|
+
import { ReportChartColor } from '../enums/report-chart-color.enum';
|
|
1
2
|
import { WaterfallStepKind } from '../interfaces/report.interface';
|
|
2
3
|
export declare const REPORT_CHART_COLORS: string[];
|
|
3
4
|
export declare const REPORT_CHART_COLORS_CSS: string[];
|
|
5
|
+
export declare const REPORT_CHART_COLOR_BY_NAME: Record<ReportChartColor, string>;
|
|
6
|
+
export declare const REPORT_REFERENCE_COLOR = "52606d";
|
|
4
7
|
export declare const REPORT_WATERFALL_COLORS: Record<WaterfallStepKind, string>;
|
|
@@ -1,21 +1,24 @@
|
|
|
1
|
-
import { ChangeDetectionStrategy, Component,
|
|
1
|
+
import { ChangeDetectionStrategy, Component, computed, inject, input } from '@angular/core';
|
|
2
2
|
import { NgxEchartsDirective } from 'ngx-echarts';
|
|
3
3
|
import { buildChartOption } from '../../option-builder';
|
|
4
|
+
import { ReportFilterStateService } from '../../services/report-filter-state.service';
|
|
4
5
|
import * as i0 from "@angular/core";
|
|
5
6
|
// ECharts host for a chart component. Pure rendering: the parent owns the
|
|
6
|
-
// data fetch; this maps (component config, rows
|
|
7
|
-
// chart instance for resize + the future
|
|
8
|
-
// canvas renderer registered in
|
|
7
|
+
// data fetch; this maps (component config, rows, the open report's format
|
|
8
|
+
// context) → option and exposes the chart instance for resize + the future
|
|
9
|
+
// image exports (getDataURL needs the canvas renderer registered in
|
|
10
|
+
// theme/echarts.ts).
|
|
9
11
|
export class ComponentChartComponent {
|
|
10
|
-
component;
|
|
11
|
-
data = null;
|
|
12
|
-
options =
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
? buildChartOption(this.component, this.data)
|
|
12
|
+
component = input.required();
|
|
13
|
+
data = input(null);
|
|
14
|
+
options = computed(() => {
|
|
15
|
+
const data = this.data();
|
|
16
|
+
return data
|
|
17
|
+
? buildChartOption(this.component(), data, this._filterState.formatContext())
|
|
17
18
|
: null;
|
|
18
|
-
}
|
|
19
|
+
});
|
|
20
|
+
_chart = null;
|
|
21
|
+
_filterState = inject(ReportFilterStateService);
|
|
19
22
|
onChartInit(chart) {
|
|
20
23
|
this._chart = chart;
|
|
21
24
|
}
|
|
@@ -32,16 +35,12 @@ export class ComponentChartComponent {
|
|
|
32
35
|
}) ?? null;
|
|
33
36
|
}
|
|
34
37
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ComponentChartComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
35
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "
|
|
38
|
+
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", styles: [":host{display:block;width:100%;height:100%}.chart-host{width:100%;height:100%}\n"], dependencies: [{ 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 });
|
|
36
39
|
}
|
|
37
40
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ComponentChartComponent, decorators: [{
|
|
38
41
|
type: Component,
|
|
39
42
|
args: [{ selector: 'app-report-component-chart', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [
|
|
40
43
|
NgxEchartsDirective,
|
|
41
|
-
], template: "<div\n class=\"chart-host\"\n echarts\n [options]=\"options ?? {}\"\n [theme]=\"'report'\"\n [autoResize]=\"true\"\n (chartInit)=\"onChartInit($event)\">\n</div>\n", styles: [":host{display:block;width:100%;height:100%}.chart-host{width:100%;height:100%}\n"] }]
|
|
42
|
-
}]
|
|
43
|
-
|
|
44
|
-
}], data: [{
|
|
45
|
-
type: Input
|
|
46
|
-
}] } });
|
|
47
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LWNoYXJ0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy9jb21wb25lbnRzL2NvbXBvbmVudC1jaGFydC9jb21wb25lbnQtY2hhcnQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2NvbXBvbmVudHMvY29tcG9uZW50LWNoYXJ0L2NvbXBvbmVudC1jaGFydC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBYSxNQUFNLGVBQWUsQ0FBQztBQUdyRixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFHbEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7O0FBR3hELDBFQUEwRTtBQUMxRSwwRUFBMEU7QUFDMUUsNkVBQTZFO0FBQzdFLG1EQUFtRDtBQVduRCxNQUFNLE9BQU8sdUJBQXVCO0lBRWxCLFNBQVMsQ0FBa0I7SUFDM0IsSUFBSSxHQUF5QixJQUFJLENBQUM7SUFFM0MsT0FBTyxHQUF5QixJQUFJLENBQUM7SUFFcEMsTUFBTSxHQUFtQixJQUFJLENBQUM7SUFFL0IsV0FBVztRQUNoQixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLElBQUk7WUFDeEMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQztZQUM3QyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ1gsQ0FBQztJQUVNLFdBQVcsQ0FBQyxLQUFjO1FBQy9CLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO0lBQ3RCLENBQUM7SUFFRCw2REFBNkQ7SUFDdEQsTUFBTTtRQUNYLElBQUksQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUM7SUFDeEIsQ0FBQztJQUVELHdEQUF3RDtJQUNqRCxVQUFVLENBQUMsVUFBVSxHQUFHLENBQUM7UUFDOUIsT0FBTyxJQUFJLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQztZQUM3QixJQUFJLEVBQUUsS0FBSztZQUNYLFVBQVU7WUFDVixlQUFlLEVBQUUsU0FBUztTQUMzQixDQUFDLElBQUksSUFBSSxDQUFDO0lBQ2IsQ0FBQzt3R0EvQlUsdUJBQXVCOzRGQUF2Qix1QkFBdUIsNkpDdkJwQywyS0FRQSwwSURZSSxtQkFBbUI7OzRGQUdWLHVCQUF1QjtrQkFWbkMsU0FBUzsrQkFDRSw0QkFBNEIsbUJBR3JCLHVCQUF1QixDQUFDLE1BQU0sY0FDbkMsSUFBSSxXQUNQO3dCQUNQLG1CQUFtQjtxQkFDcEI7OEJBSWUsU0FBUztzQkFBeEIsS0FBSztnQkFDVSxJQUFJO3NCQUFuQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgSW5wdXQsIE9uQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgdHlwZSB7IEVDaGFydHNPcHRpb24sIEVDaGFydHMgfSBmcm9tICdlY2hhcnRzJztcbmltcG9ydCB7IE5neEVjaGFydHNEaXJlY3RpdmUgfSBmcm9tICduZ3gtZWNoYXJ0cyc7XG5cbmltcG9ydCB7IENvbXBvbmVudERhdGEsIFJlcG9ydENvbXBvbmVudCB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvcmVwb3J0LmludGVyZmFjZSc7XG5pbXBvcnQgeyBidWlsZENoYXJ0T3B0aW9uIH0gZnJvbSAnLi4vLi4vb3B0aW9uLWJ1aWxkZXInO1xuXG5cbi8vIEVDaGFydHMgaG9zdCBmb3IgYSBjaGFydCBjb21wb25lbnQuIFB1cmUgcmVuZGVyaW5nOiB0aGUgcGFyZW50IG93bnMgdGhlXG4vLyBkYXRhIGZldGNoOyB0aGlzIG1hcHMgKGNvbXBvbmVudCBjb25maWcsIHJvd3MpIOKGkiBvcHRpb24gYW5kIGV4cG9zZXMgdGhlXG4vLyBjaGFydCBpbnN0YW5jZSBmb3IgcmVzaXplICsgdGhlIGZ1dHVyZSBpbWFnZSBleHBvcnRzIChnZXREYXRhVVJMIG5lZWRzIHRoZVxuLy8gY2FudmFzIHJlbmRlcmVyIHJlZ2lzdGVyZWQgaW4gdGhlbWUvZWNoYXJ0cy50cykuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtcmVwb3J0LWNvbXBvbmVudC1jaGFydCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9jb21wb25lbnQtY2hhcnQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9jb21wb25lbnQtY2hhcnQuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBOZ3hFY2hhcnRzRGlyZWN0aXZlLFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBDb21wb25lbnRDaGFydENvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XG5cbiAgQElucHV0KCkgcHVibGljIGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50O1xuICBASW5wdXQoKSBwdWJsaWMgZGF0YTogQ29tcG9uZW50RGF0YSB8IG51bGwgPSBudWxsO1xuXG4gIHB1YmxpYyBvcHRpb25zOiBFQ2hhcnRzT3B0aW9uIHwgbnVsbCA9IG51bGw7XG5cbiAgcHJpdmF0ZSBfY2hhcnQ6IEVDaGFydHMgfCBudWxsID0gbnVsbDtcblxuICBwdWJsaWMgbmdPbkNoYW5nZXMoKTogdm9pZCB7XG4gICAgdGhpcy5vcHRpb25zID0gdGhpcy5jb21wb25lbnQgJiYgdGhpcy5kYXRhXG4gICAgICA/IGJ1aWxkQ2hhcnRPcHRpb24odGhpcy5jb21wb25lbnQsIHRoaXMuZGF0YSlcbiAgICAgIDogbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBvbkNoYXJ0SW5pdChjaGFydDogRUNoYXJ0cyk6IHZvaWQge1xuICAgIHRoaXMuX2NoYXJ0ID0gY2hhcnQ7XG4gIH1cblxuICAvLyBDYWxsZWQgYnkgdGhlIGNhbnZhcyB3aGVuIHRoZSBib3ggaXMgcmVzaXplZCBpbiBlZGl0IG1vZGUuXG4gIHB1YmxpYyByZXNpemUoKTogdm9pZCB7XG4gICAgdGhpcy5fY2hhcnQ/LnJlc2l6ZSgpO1xuICB9XG5cbiAgLy8gSGlnaC1yZXMgaW1hZ2UgZm9yIHRoZSAobGF0ZXItcGhhc2UpIFBQVC9QREYgZXhwb3J0cy5cbiAgcHVibGljIGdldERhdGFVUkwocGl4ZWxSYXRpbyA9IDMpOiBzdHJpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fY2hhcnQ/LmdldERhdGFVUkwoe1xuICAgICAgdHlwZTogJ3BuZycsXG4gICAgICBwaXhlbFJhdGlvLFxuICAgICAgYmFja2dyb3VuZENvbG9yOiAnI2ZmZmZmZicsXG4gICAgfSkgPz8gbnVsbDtcbiAgfVxufVxuIiwiPGRpdlxuICBjbGFzcz1cImNoYXJ0LWhvc3RcIlxuICBlY2hhcnRzXG4gIFtvcHRpb25zXT1cIm9wdGlvbnMgPz8ge31cIlxuICBbdGhlbWVdPVwiJ3JlcG9ydCdcIlxuICBbYXV0b1Jlc2l6ZV09XCJ0cnVlXCJcbiAgKGNoYXJ0SW5pdCk9XCJvbkNoYXJ0SW5pdCgkZXZlbnQpXCI+XG48L2Rpdj5cbiJdfQ==
|
|
44
|
+
], template: "<div\n class=\"chart-host\"\n echarts\n [options]=\"options() ?? {}\"\n [theme]=\"'report'\"\n [autoResize]=\"true\"\n (chartInit)=\"onChartInit($event)\">\n</div>\n", styles: [":host{display:block;width:100%;height:100%}.chart-host{width:100%;height:100%}\n"] }]
|
|
45
|
+
}] });
|
|
46
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LWNoYXJ0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy9jb21wb25lbnRzL2NvbXBvbmVudC1jaGFydC9jb21wb25lbnQtY2hhcnQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2NvbXBvbmVudHMvY29tcG9uZW50LWNoYXJ0L2NvbXBvbmVudC1jaGFydC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRzVGLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUdsRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQzs7QUFHdEYsMEVBQTBFO0FBQzFFLDBFQUEwRTtBQUMxRSwyRUFBMkU7QUFDM0Usb0VBQW9FO0FBQ3BFLHFCQUFxQjtBQVdyQixNQUFNLE9BQU8sdUJBQXVCO0lBRWxCLFNBQVMsR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFtQixDQUFDO0lBQzlDLElBQUksR0FBRyxLQUFLLENBQXVCLElBQUksQ0FBQyxDQUFDO0lBRXpDLE9BQU8sR0FBRyxRQUFRLENBQXVCLEdBQUcsRUFBRTtRQUM1RCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFFekIsT0FBTyxJQUFJO1lBQ1QsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUM3RSxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ1gsQ0FBQyxDQUFDLENBQUM7SUFFSyxNQUFNLEdBQW1CLElBQUksQ0FBQztJQUNyQixZQUFZLEdBQUcsTUFBTSxDQUFDLHdCQUF3QixDQUFDLENBQUM7SUFFMUQsV0FBVyxDQUFDLEtBQWM7UUFDL0IsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7SUFDdEIsQ0FBQztJQUVELDZEQUE2RDtJQUN0RCxNQUFNO1FBQ1gsSUFBSSxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsQ0FBQztJQUN4QixDQUFDO0lBRUQsd0RBQXdEO0lBQ2pELFVBQVUsQ0FBQyxVQUFVLEdBQUcsQ0FBQztRQUM5QixPQUFPLElBQUksQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDO1lBQzdCLElBQUksRUFBRSxLQUFLO1lBQ1gsVUFBVTtZQUNWLGVBQWUsRUFBRSxTQUFTO1NBQzNCLENBQUMsSUFBSSxJQUFJLENBQUM7SUFDYixDQUFDO3dHQWhDVSx1QkFBdUI7NEZBQXZCLHVCQUF1QiwwVkN6QnBDLDZLQVFBLDBJRGNJLG1CQUFtQjs7NEZBR1YsdUJBQXVCO2tCQVZuQyxTQUFTOytCQUNFLDRCQUE0QixtQkFHckIsdUJBQXVCLENBQUMsTUFBTSxjQUNuQyxJQUFJLFdBQ1A7d0JBQ1AsbUJBQW1CO3FCQUNwQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIGNvbXB1dGVkLCBpbmplY3QsIGlucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB0eXBlIHsgRUNoYXJ0c09wdGlvbiwgRUNoYXJ0cyB9IGZyb20gJ2VjaGFydHMnO1xuaW1wb3J0IHsgTmd4RWNoYXJ0c0RpcmVjdGl2ZSB9IGZyb20gJ25neC1lY2hhcnRzJztcblxuaW1wb3J0IHsgQ29tcG9uZW50RGF0YSwgUmVwb3J0Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9yZXBvcnQuaW50ZXJmYWNlJztcbmltcG9ydCB7IGJ1aWxkQ2hhcnRPcHRpb24gfSBmcm9tICcuLi8uLi9vcHRpb24tYnVpbGRlcic7XG5pbXBvcnQgeyBSZXBvcnRGaWx0ZXJTdGF0ZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9yZXBvcnQtZmlsdGVyLXN0YXRlLnNlcnZpY2UnO1xuXG5cbi8vIEVDaGFydHMgaG9zdCBmb3IgYSBjaGFydCBjb21wb25lbnQuIFB1cmUgcmVuZGVyaW5nOiB0aGUgcGFyZW50IG93bnMgdGhlXG4vLyBkYXRhIGZldGNoOyB0aGlzIG1hcHMgKGNvbXBvbmVudCBjb25maWcsIHJvd3MsIHRoZSBvcGVuIHJlcG9ydCdzIGZvcm1hdFxuLy8gY29udGV4dCkg4oaSIG9wdGlvbiBhbmQgZXhwb3NlcyB0aGUgY2hhcnQgaW5zdGFuY2UgZm9yIHJlc2l6ZSArIHRoZSBmdXR1cmVcbi8vIGltYWdlIGV4cG9ydHMgKGdldERhdGFVUkwgbmVlZHMgdGhlIGNhbnZhcyByZW5kZXJlciByZWdpc3RlcmVkIGluXG4vLyB0aGVtZS9lY2hhcnRzLnRzKS5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1yZXBvcnQtY29tcG9uZW50LWNoYXJ0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2NvbXBvbmVudC1jaGFydC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2NvbXBvbmVudC1jaGFydC5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIE5neEVjaGFydHNEaXJlY3RpdmUsXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIENvbXBvbmVudENoYXJ0Q29tcG9uZW50IHtcblxuICBwdWJsaWMgcmVhZG9ubHkgY29tcG9uZW50ID0gaW5wdXQucmVxdWlyZWQ8UmVwb3J0Q29tcG9uZW50PigpO1xuICBwdWJsaWMgcmVhZG9ubHkgZGF0YSA9IGlucHV0PENvbXBvbmVudERhdGEgfCBudWxsPihudWxsKTtcblxuICBwdWJsaWMgcmVhZG9ubHkgb3B0aW9ucyA9IGNvbXB1dGVkPEVDaGFydHNPcHRpb24gfCBudWxsPigoKSA9PiB7XG4gICAgY29uc3QgZGF0YSA9IHRoaXMuZGF0YSgpO1xuXG4gICAgcmV0dXJuIGRhdGFcbiAgICAgID8gYnVpbGRDaGFydE9wdGlvbih0aGlzLmNvbXBvbmVudCgpLCBkYXRhLCB0aGlzLl9maWx0ZXJTdGF0ZS5mb3JtYXRDb250ZXh0KCkpXG4gICAgICA6IG51bGw7XG4gIH0pO1xuXG4gIHByaXZhdGUgX2NoYXJ0OiBFQ2hhcnRzIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2ZpbHRlclN0YXRlID0gaW5qZWN0KFJlcG9ydEZpbHRlclN0YXRlU2VydmljZSk7XG5cbiAgcHVibGljIG9uQ2hhcnRJbml0KGNoYXJ0OiBFQ2hhcnRzKTogdm9pZCB7XG4gICAgdGhpcy5fY2hhcnQgPSBjaGFydDtcbiAgfVxuXG4gIC8vIENhbGxlZCBieSB0aGUgY2FudmFzIHdoZW4gdGhlIGJveCBpcyByZXNpemVkIGluIGVkaXQgbW9kZS5cbiAgcHVibGljIHJlc2l6ZSgpOiB2b2lkIHtcbiAgICB0aGlzLl9jaGFydD8ucmVzaXplKCk7XG4gIH1cblxuICAvLyBIaWdoLXJlcyBpbWFnZSBmb3IgdGhlIChsYXRlci1waGFzZSkgUFBUL1BERiBleHBvcnRzLlxuICBwdWJsaWMgZ2V0RGF0YVVSTChwaXhlbFJhdGlvID0gMyk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9jaGFydD8uZ2V0RGF0YVVSTCh7XG4gICAgICB0eXBlOiAncG5nJyxcbiAgICAgIHBpeGVsUmF0aW8sXG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6ICcjZmZmZmZmJyxcbiAgICB9KSA/PyBudWxsO1xuICB9XG59XG4iLCI8ZGl2XG4gIGNsYXNzPVwiY2hhcnQtaG9zdFwiXG4gIGVjaGFydHNcbiAgW29wdGlvbnNdPVwib3B0aW9ucygpID8/IHt9XCJcbiAgW3RoZW1lXT1cIidyZXBvcnQnXCJcbiAgW2F1dG9SZXNpemVdPVwidHJ1ZVwiXG4gIChjaGFydEluaXQpPVwib25DaGFydEluaXQoJGV2ZW50KVwiPlxuPC9kaXY+XG4iXX0=
|
|
@@ -1,33 +1,30 @@
|
|
|
1
|
-
import { ChangeDetectionStrategy, Component,
|
|
2
|
-
import {
|
|
1
|
+
import { ChangeDetectionStrategy, Component, computed, inject, input } from '@angular/core';
|
|
2
|
+
import { formatNumber } from '../../format';
|
|
3
|
+
import { ReportFilterStateService } from '../../services/report-filter-state.service';
|
|
3
4
|
import * as i0 from "@angular/core";
|
|
4
5
|
// A single big number: the component's measure aggregated over all (filtered)
|
|
5
|
-
// rows server-side; this just formats the one cell
|
|
6
|
+
// rows server-side; this just formats the one cell, in the open report's
|
|
7
|
+
// format context (its locale, its currency, and whether a percent arrives as a
|
|
8
|
+
// 0-1 ratio or, from an older server, already x100).
|
|
6
9
|
export class ComponentKpiComponent {
|
|
7
|
-
component;
|
|
8
|
-
data = null;
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
const
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
this.value = formatMeasureValue(row[column], config.measure?.format, config.measure?.precision);
|
|
21
|
-
}
|
|
10
|
+
component = input.required();
|
|
11
|
+
data = input(null);
|
|
12
|
+
label = computed(() => this._config().measure?.label ?? '');
|
|
13
|
+
// A missing row or value reads '—'. A measure without number-format keys
|
|
14
|
+
// reads as a plain number in the report's locale.
|
|
15
|
+
value = computed(() => {
|
|
16
|
+
const row = this.data()?.rows?.[0];
|
|
17
|
+
const measure = this._config().measure;
|
|
18
|
+
const column = measure?.column ?? Object.keys(row ?? {})[0];
|
|
19
|
+
return formatNumber(row?.[column], measure, this._filterState.formatContext(), { empty: '—' });
|
|
20
|
+
});
|
|
21
|
+
_config = computed(() => (this.component().config ?? {}));
|
|
22
|
+
_filterState = inject(ReportFilterStateService);
|
|
22
23
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ComponentKpiComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
23
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ComponentKpiComponent, isStandalone: true, selector: "app-report-component-kpi", inputs: { component: "component", data: "data"
|
|
24
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ComponentKpiComponent, isStandalone: true, selector: "app-report-component-kpi", 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 class=\"kpi\">\n <div class=\"kpi-value\">{{ value() }}</div>\n @if (label()) {\n <div class=\"kpi-label\">{{ label() }}</div>\n }\n</div>\n", styles: [":host{display:block;width:100%;height:100%}.kpi{width:100%;height:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px}.kpi .kpi-value{font-size:34px;font-weight:600;color:#1f2933;line-height:1}.kpi .kpi-label{font-size:12px;color:#7b8794}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
24
25
|
}
|
|
25
26
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ComponentKpiComponent, decorators: [{
|
|
26
27
|
type: Component,
|
|
27
|
-
args: [{ selector: 'app-report-component-kpi', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, template: "<div class=\"kpi\">\n <div class=\"kpi-value\">{{ value }}</div>\n @if (label) {\n <div class=\"kpi-label\">{{ label }}</div>\n }\n</div>\n", styles: [":host{display:block;width:100%;height:100%}.kpi{width:100%;height:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px}.kpi .kpi-value{font-size:34px;font-weight:600;color:#1f2933;line-height:1}.kpi .kpi-label{font-size:12px;color:#7b8794}\n"] }]
|
|
28
|
-
}]
|
|
29
|
-
|
|
30
|
-
}], data: [{
|
|
31
|
-
type: Input
|
|
32
|
-
}] } });
|
|
33
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LWtwaS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3JlcG9ydHMvY29tcG9uZW50cy9jb21wb25lbnQta3BpL2NvbXBvbmVudC1rcGkuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2NvbXBvbmVudHMvY29tcG9uZW50LWtwaS9jb21wb25lbnQta3BpLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFhLE1BQU0sZUFBZSxDQUFDO0FBRXJGLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGNBQWMsQ0FBQzs7QUFJbEQsOEVBQThFO0FBQzlFLG9EQUFvRDtBQVFwRCxNQUFNLE9BQU8scUJBQXFCO0lBRWhCLFNBQVMsQ0FBa0I7SUFDM0IsSUFBSSxHQUF5QixJQUFJLENBQUM7SUFFM0MsS0FBSyxHQUFHLEdBQUcsQ0FBQztJQUNaLEtBQUssR0FBRyxFQUFFLENBQUM7SUFFWCxXQUFXO1FBQ2hCLE1BQU0sTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxNQUFNLElBQUksRUFBRSxDQUFjLENBQUM7UUFDM0QsSUFBSSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsT0FBTyxFQUFFLEtBQUssSUFBSSxFQUFFLENBQUM7UUFFekMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDVCxJQUFJLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQztZQUVqQixPQUFPO1FBQ1QsQ0FBQztRQUVELE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxPQUFPLEVBQUUsTUFBTSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0QsSUFBSSxDQUFDLEtBQUssR0FBRyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsTUFBTSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQztJQUNsRyxDQUFDO3dHQXJCVSxxQkFBcUI7NEZBQXJCLHFCQUFxQiwySkNmbEMsbUpBTUE7OzRGRFNhLHFCQUFxQjtrQkFQakMsU0FBUzsrQkFDRSwwQkFBMEIsbUJBR25CLHVCQUF1QixDQUFDLE1BQU0sY0FDbkMsSUFBSTs4QkFJQSxTQUFTO3NCQUF4QixLQUFLO2dCQUNVLElBQUk7c0JBQW5CLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBJbnB1dCwgT25DaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IGZvcm1hdE1lYXN1cmVWYWx1ZSB9IGZyb20gJy4uLy4uL2Zvcm1hdCc7XG5pbXBvcnQgeyBDb21wb25lbnREYXRhLCBLcGlDb25maWcsIFJlcG9ydENvbXBvbmVudCB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvcmVwb3J0LmludGVyZmFjZSc7XG5cblxuLy8gQSBzaW5nbGUgYmlnIG51bWJlcjogdGhlIGNvbXBvbmVudCdzIG1lYXN1cmUgYWdncmVnYXRlZCBvdmVyIGFsbCAoZmlsdGVyZWQpXG4vLyByb3dzIHNlcnZlci1zaWRlOyB0aGlzIGp1c3QgZm9ybWF0cyB0aGUgb25lIGNlbGwuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtcmVwb3J0LWNvbXBvbmVudC1rcGknLFxuICB0ZW1wbGF0ZVVybDogJy4vY29tcG9uZW50LWtwaS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2NvbXBvbmVudC1rcGkuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG59KVxuZXhwb3J0IGNsYXNzIENvbXBvbmVudEtwaUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XG5cbiAgQElucHV0KCkgcHVibGljIGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50O1xuICBASW5wdXQoKSBwdWJsaWMgZGF0YTogQ29tcG9uZW50RGF0YSB8IG51bGwgPSBudWxsO1xuXG4gIHB1YmxpYyB2YWx1ZSA9ICfigJQnO1xuICBwdWJsaWMgbGFiZWwgPSAnJztcblxuICBwdWJsaWMgbmdPbkNoYW5nZXMoKTogdm9pZCB7XG4gICAgY29uc3QgY29uZmlnID0gKHRoaXMuY29tcG9uZW50Py5jb25maWcgPz8ge30pIGFzIEtwaUNvbmZpZztcbiAgICB0aGlzLmxhYmVsID0gY29uZmlnLm1lYXN1cmU/LmxhYmVsID8/ICcnO1xuXG4gICAgY29uc3Qgcm93ID0gdGhpcy5kYXRhPy5yb3dzPy5bMF07XG4gICAgaWYgKCFyb3cpIHtcbiAgICAgIHRoaXMudmFsdWUgPSAn4oCUJztcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbHVtbiA9IGNvbmZpZy5tZWFzdXJlPy5jb2x1bW4gPz8gT2JqZWN0LmtleXMocm93KVswXTtcbiAgICB0aGlzLnZhbHVlID0gZm9ybWF0TWVhc3VyZVZhbHVlKHJvd1tjb2x1bW5dLCBjb25maWcubWVhc3VyZT8uZm9ybWF0LCBjb25maWcubWVhc3VyZT8ucHJlY2lzaW9uKTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImtwaVwiPlxuICA8ZGl2IGNsYXNzPVwia3BpLXZhbHVlXCI+e3sgdmFsdWUgfX08L2Rpdj5cbiAgQGlmIChsYWJlbCkge1xuICAgIDxkaXYgY2xhc3M9XCJrcGktbGFiZWxcIj57eyBsYWJlbCB9fTwvZGl2PlxuICB9XG48L2Rpdj5cbiJdfQ==
|
|
28
|
+
args: [{ selector: 'app-report-component-kpi', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, template: "<div class=\"kpi\">\n <div class=\"kpi-value\">{{ value() }}</div>\n @if (label()) {\n <div class=\"kpi-label\">{{ label() }}</div>\n }\n</div>\n", styles: [":host{display:block;width:100%;height:100%}.kpi{width:100%;height:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px}.kpi .kpi-value{font-size:34px;font-weight:600;color:#1f2933;line-height:1}.kpi .kpi-label{font-size:12px;color:#7b8794}\n"] }]
|
|
29
|
+
}] });
|
|
30
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LWtwaS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3JlcG9ydHMvY29tcG9uZW50cy9jb21wb25lbnQta3BpL2NvbXBvbmVudC1rcGkuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2NvbXBvbmVudHMvY29tcG9uZW50LWtwaS9jb21wb25lbnQta3BpLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFNUYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUU1QyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQzs7QUFHdEYsOEVBQThFO0FBQzlFLHlFQUF5RTtBQUN6RSwrRUFBK0U7QUFDL0UscURBQXFEO0FBUXJELE1BQU0sT0FBTyxxQkFBcUI7SUFFaEIsU0FBUyxHQUFHLEtBQUssQ0FBQyxRQUFRLEVBQW1CLENBQUM7SUFDOUMsSUFBSSxHQUFHLEtBQUssQ0FBdUIsSUFBSSxDQUFDLENBQUM7SUFFekMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxFQUFFLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQztJQUU1RSx5RUFBeUU7SUFDekUsa0RBQWtEO0lBQ2xDLEtBQUssR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFO1FBQ3BDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNuQyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxDQUFDO1FBQ3ZDLE1BQU0sTUFBTSxHQUFHLE9BQU8sRUFBRSxNQUFNLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFNUQsT0FBTyxZQUFZLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztJQUNqRyxDQUFDLENBQUMsQ0FBQztJQUVjLE9BQU8sR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBYyxDQUFDLENBQUM7SUFDdkUsWUFBWSxHQUFHLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO3dHQWxCdEQscUJBQXFCOzRGQUFyQixxQkFBcUIsd1ZDbEJsQyx5SkFNQTs7NEZEWWEscUJBQXFCO2tCQVBqQyxTQUFTOytCQUNFLDBCQUEwQixtQkFHbkIsdUJBQXVCLENBQUMsTUFBTSxjQUNuQyxJQUFJIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgY29tcHV0ZWQsIGluamVjdCwgaW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgZm9ybWF0TnVtYmVyIH0gZnJvbSAnLi4vLi4vZm9ybWF0JztcbmltcG9ydCB7IENvbXBvbmVudERhdGEsIEtwaUNvbmZpZywgUmVwb3J0Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9yZXBvcnQuaW50ZXJmYWNlJztcbmltcG9ydCB7IFJlcG9ydEZpbHRlclN0YXRlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3JlcG9ydC1maWx0ZXItc3RhdGUuc2VydmljZSc7XG5cblxuLy8gQSBzaW5nbGUgYmlnIG51bWJlcjogdGhlIGNvbXBvbmVudCdzIG1lYXN1cmUgYWdncmVnYXRlZCBvdmVyIGFsbCAoZmlsdGVyZWQpXG4vLyByb3dzIHNlcnZlci1zaWRlOyB0aGlzIGp1c3QgZm9ybWF0cyB0aGUgb25lIGNlbGwsIGluIHRoZSBvcGVuIHJlcG9ydCdzXG4vLyBmb3JtYXQgY29udGV4dCAoaXRzIGxvY2FsZSwgaXRzIGN1cnJlbmN5LCBhbmQgd2hldGhlciBhIHBlcmNlbnQgYXJyaXZlcyBhcyBhXG4vLyAwLTEgcmF0aW8gb3IsIGZyb20gYW4gb2xkZXIgc2VydmVyLCBhbHJlYWR5IHgxMDApLlxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLXJlcG9ydC1jb21wb25lbnQta3BpJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2NvbXBvbmVudC1rcGkuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9jb21wb25lbnQta3BpLmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBzdGFuZGFsb25lOiB0cnVlLFxufSlcbmV4cG9ydCBjbGFzcyBDb21wb25lbnRLcGlDb21wb25lbnQge1xuXG4gIHB1YmxpYyByZWFkb25seSBjb21wb25lbnQgPSBpbnB1dC5yZXF1aXJlZDxSZXBvcnRDb21wb25lbnQ+KCk7XG4gIHB1YmxpYyByZWFkb25seSBkYXRhID0gaW5wdXQ8Q29tcG9uZW50RGF0YSB8IG51bGw+KG51bGwpO1xuXG4gIHB1YmxpYyByZWFkb25seSBsYWJlbCA9IGNvbXB1dGVkKCgpID0+IHRoaXMuX2NvbmZpZygpLm1lYXN1cmU/LmxhYmVsID8/ICcnKTtcblxuICAvLyBBIG1pc3Npbmcgcm93IG9yIHZhbHVlIHJlYWRzICfigJQnLiBBIG1lYXN1cmUgd2l0aG91dCBudW1iZXItZm9ybWF0IGtleXNcbiAgLy8gcmVhZHMgYXMgYSBwbGFpbiBudW1iZXIgaW4gdGhlIHJlcG9ydCdzIGxvY2FsZS5cbiAgcHVibGljIHJlYWRvbmx5IHZhbHVlID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IHJvdyA9IHRoaXMuZGF0YSgpPy5yb3dzPy5bMF07XG4gICAgY29uc3QgbWVhc3VyZSA9IHRoaXMuX2NvbmZpZygpLm1lYXN1cmU7XG4gICAgY29uc3QgY29sdW1uID0gbWVhc3VyZT8uY29sdW1uID8/IE9iamVjdC5rZXlzKHJvdyA/PyB7fSlbMF07XG5cbiAgICByZXR1cm4gZm9ybWF0TnVtYmVyKHJvdz8uW2NvbHVtbl0sIG1lYXN1cmUsIHRoaXMuX2ZpbHRlclN0YXRlLmZvcm1hdENvbnRleHQoKSwgeyBlbXB0eTogJ+KAlCcgfSk7XG4gIH0pO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2NvbmZpZyA9IGNvbXB1dGVkKCgpID0+ICh0aGlzLmNvbXBvbmVudCgpLmNvbmZpZyA/PyB7fSkgYXMgS3BpQ29uZmlnKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfZmlsdGVyU3RhdGUgPSBpbmplY3QoUmVwb3J0RmlsdGVyU3RhdGVTZXJ2aWNlKTtcbn1cbiIsIjxkaXYgY2xhc3M9XCJrcGlcIj5cbiAgPGRpdiBjbGFzcz1cImtwaS12YWx1ZVwiPnt7IHZhbHVlKCkgfX08L2Rpdj5cbiAgQGlmIChsYWJlbCgpKSB7XG4gICAgPGRpdiBjbGFzcz1cImtwaS1sYWJlbFwiPnt7IGxhYmVsKCkgfX08L2Rpdj5cbiAgfVxuPC9kaXY+XG4iXX0=
|