@firestitch/report 18.18.2 → 18.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/app/reports/chart-axis-settings.d.ts +4 -0
  2. package/app/reports/components/report-canvas/report-canvas.component.d.ts +5 -1
  3. package/app/reports/components/report-component/report-component.component.d.ts +1 -0
  4. package/app/reports/dialogs/component-settings/component-settings.component.d.ts +24 -0
  5. package/app/reports/enums/report-chart-date-label.enum.d.ts +2 -1
  6. package/app/reports/enums/report-chart-span-mode.enum.d.ts +5 -0
  7. package/app/reports/enums/report-chart-span-through.enum.d.ts +3 -0
  8. package/app/reports/format.d.ts +1 -0
  9. package/app/reports/interfaces/canvas-landing-input.interface.d.ts +1 -0
  10. package/app/reports/interfaces/report-chart-axis-settings.interface.d.ts +6 -0
  11. package/app/reports/interfaces/report-chart-span.interface.d.ts +6 -0
  12. package/app/reports/interfaces/report.interface.d.ts +5 -0
  13. package/app/reports/views/report/fs-ai-report.component.d.ts +3 -0
  14. package/esm2022/app/reports/canvas-landing-page.mjs +7 -1
  15. package/esm2022/app/reports/chart-axis-settings.mjs +24 -0
  16. package/esm2022/app/reports/components/report-canvas/report-canvas.component.mjs +36 -4
  17. package/esm2022/app/reports/components/report-component/report-component.component.mjs +27 -4
  18. package/esm2022/app/reports/dialogs/component-settings/component-settings.component.mjs +121 -16
  19. package/esm2022/app/reports/enums/report-chart-date-label.enum.mjs +5 -2
  20. package/esm2022/app/reports/enums/report-chart-span-mode.enum.mjs +10 -0
  21. package/esm2022/app/reports/enums/report-chart-span-through.enum.mjs +11 -0
  22. package/esm2022/app/reports/format.mjs +3 -1
  23. package/esm2022/app/reports/interfaces/canvas-landing-input.interface.mjs +1 -1
  24. package/esm2022/app/reports/interfaces/report-chart-axis-settings.interface.mjs +2 -0
  25. package/esm2022/app/reports/interfaces/report-chart-span.interface.mjs +2 -0
  26. package/esm2022/app/reports/interfaces/report.interface.mjs +1 -1
  27. package/esm2022/app/reports/option-builder.mjs +34 -10
  28. package/esm2022/app/reports/views/report/fs-ai-report.component.mjs +32 -8
  29. package/esm2022/public_api.mjs +4 -1
  30. package/fesm2022/{firestitch-report-echarts-DKuqS_De.mjs → firestitch-report-echarts-CgZBsQWf.mjs} +2 -2
  31. package/fesm2022/{firestitch-report-echarts-DKuqS_De.mjs.map → firestitch-report-echarts-CgZBsQWf.mjs.map} +1 -1
  32. package/fesm2022/{firestitch-report-firestitch-report-CkTkXk5B.mjs → firestitch-report-firestitch-report-BQseFyHJ.mjs} +312 -59
  33. package/fesm2022/firestitch-report-firestitch-report-BQseFyHJ.mjs.map +1 -0
  34. package/fesm2022/firestitch-report.mjs +1 -1
  35. package/package.json +1 -1
  36. package/public_api.d.ts +3 -0
  37. package/fesm2022/firestitch-report-firestitch-report-CkTkXk5B.mjs.map +0 -1
@@ -0,0 +1,4 @@
1
+ import { ReportChartAxisSettings } from './interfaces/report-chart-axis-settings.interface';
2
+ import { ChartConfig } from './interfaces/report.interface';
3
+ export declare function chartAxisSettings(config: ChartConfig | null | undefined): ReportChartAxisSettings;
4
+ export declare function sameChartAxisSettings(a: ReportChartAxisSettings, b: ReportChartAxisSettings): boolean;
@@ -32,9 +32,11 @@ export declare class ReportCanvasComponent implements OnChanges, AfterViewInit {
32
32
  report: Report;
33
33
  editMode: boolean;
34
34
  pageId: number | null;
35
+ busy: boolean;
35
36
  componentSettings: EventEmitter<ReportComponent>;
36
37
  reportChanged: EventEmitter<void>;
37
38
  pageChanged: EventEmitter<number>;
39
+ refresh: EventEmitter<void>;
38
40
  zoomPan: FsZoomPanComponent;
39
41
  private _renderedComponents;
40
42
  private _viewport;
@@ -64,6 +66,7 @@ export declare class ReportCanvasComponent implements OnChanges, AfterViewInit {
64
66
  private _previousReportId;
65
67
  private _emittedPageId;
66
68
  private _editOnArrival;
69
+ private _keepPageId;
67
70
  private _report;
68
71
  private _pageValueComponents;
69
72
  private _masterValueComponents;
@@ -104,6 +107,7 @@ export declare class ReportCanvasComponent implements OnChanges, AfterViewInit {
104
107
  applyComponentSettings(componentId: number, settings: ComponentSettings): void;
105
108
  selectComponent(componentId: number | null): void;
106
109
  onCanvasPointerDown(): void;
110
+ refreshReport(): void;
107
111
  onZoomed(scale: number): void;
108
112
  zoomIn(): void;
109
113
  zoomOut(): void;
@@ -139,6 +143,6 @@ export declare class ReportCanvasComponent implements OnChanges, AfterViewInit {
139
143
  private _renderGuides;
140
144
  private _clearGuides;
141
145
  static ɵfac: i0.ɵɵFactoryDeclaration<ReportCanvasComponent, never>;
142
- static ɵcmp: i0.ɵɵComponentDeclaration<ReportCanvasComponent, "app-report-canvas", never, { "report": { "alias": "report"; "required": false; }; "editMode": { "alias": "editMode"; "required": false; }; "pageId": { "alias": "pageId"; "required": false; }; }, { "componentSettings": "componentSettings"; "reportChanged": "reportChanged"; "pageChanged": "pageChanged"; }, never, never, true, never>;
146
+ static ɵcmp: i0.ɵɵComponentDeclaration<ReportCanvasComponent, "app-report-canvas", never, { "report": { "alias": "report"; "required": false; }; "editMode": { "alias": "editMode"; "required": false; }; "pageId": { "alias": "pageId"; "required": false; }; "busy": { "alias": "busy"; "required": false; }; }, { "componentSettings": "componentSettings"; "reportChanged": "reportChanged"; "pageChanged": "pageChanged"; "refresh": "refresh"; }, never, never, true, never>;
143
147
  }
144
148
  export {};
@@ -87,6 +87,7 @@ export declare class ReportComponentComponent implements OnInit, OnChanges {
87
87
  applySettings(settings: ComponentSettings): void;
88
88
  exportCsv(): void;
89
89
  exportExcel(): void;
90
+ private _axisWith;
90
91
  private _export;
91
92
  onMarkClick(click: ReportMarkClick): void;
92
93
  onMarkMiss(): void;
@@ -2,6 +2,8 @@ import { EventEmitter, OnInit } from '@angular/core';
2
2
  import { AbstractControl } from '@angular/forms';
3
3
  import { Observable } from 'rxjs';
4
4
  import { ReportChangePolarity } from '../../enums/report-change-polarity.enum';
5
+ import { ReportChartDateLabel } from '../../enums/report-chart-date-label.enum';
6
+ import { ReportChartSpanMode } from '../../enums/report-chart-span-mode.enum';
5
7
  import { ChartGranularity, ComponentSettings, Report, ReportComponent, ReportFilterType } from '../../interfaces/report.interface';
6
8
  import { FilterBarPlacement } from '../../interfaces/filter-bar-placement.type';
7
9
  import { FilterComponentToggleState } from '../../interfaces/filter-component-toggle-state.interface';
@@ -68,6 +70,23 @@ export declare class ComponentSettingsComponent implements OnInit {
68
70
  readonly sparkline: import("@angular/core").WritableSignal<boolean>;
69
71
  readonly sparklineGranularity: import("@angular/core").WritableSignal<ChartGranularity>;
70
72
  readonly sparklinePeriods: import("@angular/core").WritableSignal<string | number>;
73
+ readonly dateLabelOptions: {
74
+ value: ReportChartDateLabel;
75
+ name: string;
76
+ }[];
77
+ readonly spanModeOptions: {
78
+ value: ReportChartSpanMode;
79
+ name: string;
80
+ }[];
81
+ readonly spanMinPeriods = 1;
82
+ readonly spanMaxPeriods = 400;
83
+ readonly ReportChartSpanMode: typeof ReportChartSpanMode;
84
+ readonly timeAxis: import("@angular/core").WritableSignal<boolean>;
85
+ readonly spanAllowed: import("@angular/core").WritableSignal<boolean>;
86
+ readonly dateLabel: import("@angular/core").WritableSignal<ReportChartDateLabel>;
87
+ readonly spanMode: import("@angular/core").WritableSignal<ReportChartSpanMode>;
88
+ readonly spanPeriods: import("@angular/core").WritableSignal<string | number>;
89
+ readonly spanStart: import("@angular/core").WritableSignal<Date>;
71
90
  readonly sql: import("@angular/core").WritableSignal<string>;
72
91
  readonly sqlBaseline: import("@angular/core").WritableSignal<boolean>;
73
92
  readonly sqlTimezone: import("@angular/core").WritableSignal<string>;
@@ -106,6 +125,11 @@ export declare class ComponentSettingsComponent implements OnInit {
106
125
  private _layerValues;
107
126
  private _valueName;
108
127
  private _seedKpiCard;
128
+ private _seedTimeAxis;
129
+ private _chartAxisSettings;
130
+ private _span;
131
+ private _sentAxisKeys;
132
+ private _savedChartAxis;
109
133
  private _savedKpiCard;
110
134
  private _kpiCardSettings;
111
135
  private _targetShown;
@@ -1,5 +1,6 @@
1
1
  export declare enum ReportChartDateLabel {
2
2
  Short = "short",
3
3
  Long = "long",
4
- Numeric = "numeric"
4
+ Numeric = "numeric",
5
+ PeriodEnd = "periodEnd"
5
6
  }
@@ -0,0 +1,5 @@
1
+ export declare enum ReportChartSpanMode {
2
+ None = "none",
3
+ Periods = "periods",
4
+ Start = "start"
5
+ }
@@ -0,0 +1,3 @@
1
+ export declare enum ReportChartSpanThrough {
2
+ FilterEnd = "filterEnd"
3
+ }
@@ -50,6 +50,7 @@ export declare const DAY_LONG: Intl.DateTimeFormatOptions;
50
50
  export declare const MONTH_LONG: Intl.DateTimeFormatOptions;
51
51
  export declare const MONTH_YEAR: Intl.DateTimeFormatOptions;
52
52
  export declare const MONTH_DAY: Intl.DateTimeFormatOptions;
53
+ export declare const DAY_NUMERIC: Intl.DateTimeFormatOptions;
53
54
  export declare function formatLocalDate(date: Date, locale: ReportLocaleTag, options: Intl.DateTimeFormatOptions, timeZone?: string): string;
54
55
  export declare function formatReportDate(value: unknown, timezone: string, locale: ReportLocaleTag): string;
55
56
  export declare const TIME_SHORT: Intl.DateTimeFormatOptions;
@@ -5,4 +5,5 @@ export interface CanvasLandingInput {
5
5
  pageIds: number[];
6
6
  pageId: number | null;
7
7
  activePageIndex: number;
8
+ keepPageId: number | null;
8
9
  }
@@ -0,0 +1,6 @@
1
+ import { ReportChartDateLabel } from '../enums/report-chart-date-label.enum';
2
+ import { ReportChartSpan } from './report-chart-span.interface';
3
+ export interface ReportChartAxisSettings {
4
+ dateLabel: ReportChartDateLabel | null;
5
+ span: ReportChartSpan | null;
6
+ }
@@ -0,0 +1,6 @@
1
+ import { ReportChartSpanThrough } from '../enums/report-chart-span-through.enum';
2
+ export interface ReportChartSpan {
3
+ through: ReportChartSpanThrough;
4
+ periods?: number;
5
+ start?: string;
6
+ }
@@ -11,6 +11,8 @@ import { ReportValueFormat } from '../enums/report-value-format.enum';
11
11
  import { ReportValueFormula } from '../enums/report-value-formula.enum';
12
12
  import { ComponentDataApplied } from './component-data-applied.interface';
13
13
  import { ComponentDataDrill } from './component-data-drill.interface';
14
+ import { ReportChartAxisSettings } from './report-chart-axis-settings.interface';
15
+ import { ReportChartSpan } from './report-chart-span.interface';
14
16
  import { ReportDrillStep } from './report-drill-step.interface';
15
17
  import { GridConfig } from './report-grid-config.interface';
16
18
  import { ReportViewerFeature } from './report-viewer-feature.type';
@@ -140,6 +142,7 @@ export interface ComponentSettings {
140
142
  title: string;
141
143
  padding: ComponentPadding;
142
144
  kpi?: KpiCardSettings;
145
+ chartAxis?: ReportChartAxisSettings;
143
146
  }
144
147
  export interface KpiCardSettings {
145
148
  increaseIs: ReportChangePolarity | null;
@@ -162,10 +165,12 @@ export interface ChartConfig {
162
165
  granularity?: ChartGranularity;
163
166
  label?: string;
164
167
  dateLabel?: ReportChartDateLabel;
168
+ span?: ReportChartSpan;
165
169
  };
166
170
  measures?: ChartMeasure[];
167
171
  splitBy?: {
168
172
  column: string;
173
+ label?: string;
169
174
  };
170
175
  colorBy?: {
171
176
  column: string;
@@ -12,6 +12,7 @@ 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 busy: import("@angular/core").WritableSignal<boolean>;
15
16
  readonly pageId: import("@angular/core").WritableSignal<number>;
16
17
  readonly chatPageId: import("@angular/core").WritableSignal<number>;
17
18
  readonly chatBasePath: import("@angular/core").Signal<string>;
@@ -47,6 +48,7 @@ export declare class FsAiReportComponent {
47
48
  componentSettings(component: ReportComponentModel): void;
48
49
  onCanvasPageChanged(pageId: number | null): void;
49
50
  onCanvasReportChanged(): void;
51
+ onCanvasRefresh(): void;
50
52
  exportPowerpoint(): void;
51
53
  exportPdf(): void;
52
54
  exportData(thisPage?: boolean, format?: ReportExportFormat): void;
@@ -58,6 +60,7 @@ export declare class FsAiReportComponent {
58
60
  private _writePageToUrl;
59
61
  private _pageIdFromUrl;
60
62
  private _loadReport;
63
+ private _reportLoad;
61
64
  private _reportGroups;
62
65
  private _buildReportConfig;
63
66
  private _openOnFirstSavedFilter;
@@ -1,5 +1,8 @@
1
1
  // Which page the canvas opens when its report input changes.
2
2
  //
3
+ // - A Refresh keeps the page that was on screen, by id, wherever it moved; when
4
+ // it is gone, the first page. A page that arrived with the refresh was added
5
+ // elsewhere (the MCP, another tab), so it does not take the viewer there.
3
6
  // - The same report with more pages than before: a page was just added in
4
7
  // this tab, so the canvas lands on the last page. The asked-for page does
5
8
  // not beat it: that is a stale value the host still holds.
@@ -13,6 +16,9 @@
13
16
  export function canvasLandingPage(input) {
14
17
  const pageCount = input.pageIds.length;
15
18
  const sameReport = input.reportId === input.previousReportId;
19
+ if (input.keepPageId !== null) {
20
+ return Math.max(input.pageIds.indexOf(input.keepPageId), 0);
21
+ }
16
22
  if (sameReport && input.previousPageCount > 0 && pageCount > input.previousPageCount) {
17
23
  return pageCount - 1;
18
24
  }
@@ -23,4 +29,4 @@ export function canvasLandingPage(input) {
23
29
  const index = sameReport ? input.activePageIndex : 0;
24
30
  return index < pageCount ? index : 0;
25
31
  }
26
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FudmFzLWxhbmRpbmctcGFnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy9jYW52YXMtbGFuZGluZy1wYWdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBLDZEQUE2RDtBQUM3RCxFQUFFO0FBQ0YsMEVBQTBFO0FBQzFFLDRFQUE0RTtBQUM1RSw2REFBNkQ7QUFDN0QsNkVBQTZFO0FBQzdFLG1CQUFtQjtBQUNuQix5RUFBeUU7QUFDekUsc0RBQXNEO0FBQ3RELDZFQUE2RTtBQUM3RSx5RUFBeUU7QUFDekUsdUJBQXVCO0FBQ3ZCLE1BQU0sVUFBVSxpQkFBaUIsQ0FBQyxLQUF5QjtJQUN6RCxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztJQUN2QyxNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsUUFBUSxLQUFLLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQztJQUU3RCxJQUFJLFVBQVUsSUFBSSxLQUFLLENBQUMsaUJBQWlCLEdBQUcsQ0FBQyxJQUFJLFNBQVMsR0FBRyxLQUFLLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUNyRixPQUFPLFNBQVMsR0FBRyxDQUFDLENBQUM7SUFDdkIsQ0FBQztJQUVELE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQy9FLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDaEIsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVELE1BQU0sS0FBSyxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRXJELE9BQU8sS0FBSyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENhbnZhc0xhbmRpbmdJbnB1dCB9IGZyb20gJy4vaW50ZXJmYWNlcy9jYW52YXMtbGFuZGluZy1pbnB1dC5pbnRlcmZhY2UnO1xuXG5cbi8vIFdoaWNoIHBhZ2UgdGhlIGNhbnZhcyBvcGVucyB3aGVuIGl0cyByZXBvcnQgaW5wdXQgY2hhbmdlcy5cbi8vXG4vLyAtIFRoZSBzYW1lIHJlcG9ydCB3aXRoIG1vcmUgcGFnZXMgdGhhbiBiZWZvcmU6IGEgcGFnZSB3YXMganVzdCBhZGRlZCBpblxuLy8gICB0aGlzIHRhYiwgc28gdGhlIGNhbnZhcyBsYW5kcyBvbiB0aGUgbGFzdCBwYWdlLiBUaGUgYXNrZWQtZm9yIHBhZ2UgZG9lc1xuLy8gICBub3QgYmVhdCBpdDogdGhhdCBpcyBhIHN0YWxlIHZhbHVlIHRoZSBob3N0IHN0aWxsIGhvbGRzLlxuLy8gLSBPdGhlcndpc2UgdGhlIGFza2VkLWZvciBwYWdlIChhID9wYWdlPSB0aGUgcmVwb3J0IG9wZW5lZCB3aXRoKSwgd2hlbiB0aGVcbi8vICAgcmVwb3J0IGhhcyBpdC5cbi8vIC0gQW5vdGhlciByZXBvcnQgdGhhdCBhc2tzIGZvciBubyBwYWdlIGl0IGhhcyBvcGVucyBvbiBpdHMgZmlyc3QgcGFnZTpcbi8vICAgdGhlIG9sZCByZXBvcnQncyBwYWdlIG51bWJlciBtZWFucyBub3RoaW5nIHRoZXJlLlxuLy8gLSBUaGUgc2FtZSByZXBvcnQga2VlcHMgdGhlIHBhZ2UgaXQgc2hvd3Mgd2hlbiB0aGUgYXNrZWQtZm9yIHBhZ2UgZG9lcyBub3Rcbi8vICAgcmVzb2x2ZSAoaXQgbWF5IHN0aWxsIGJlIGxvYWRpbmcpOyBhbiBpbmRleCBwYXN0IHRoZSBsYXN0IHBhZ2UgZmFsbHNcbi8vICAgYmFjayB0byB0aGUgZmlyc3QuXG5leHBvcnQgZnVuY3Rpb24gY2FudmFzTGFuZGluZ1BhZ2UoaW5wdXQ6IENhbnZhc0xhbmRpbmdJbnB1dCk6IG51bWJlciB7XG4gIGNvbnN0IHBhZ2VDb3VudCA9IGlucHV0LnBhZ2VJZHMubGVuZ3RoO1xuICBjb25zdCBzYW1lUmVwb3J0ID0gaW5wdXQucmVwb3J0SWQgPT09IGlucHV0LnByZXZpb3VzUmVwb3J0SWQ7XG5cbiAgaWYgKHNhbWVSZXBvcnQgJiYgaW5wdXQucHJldmlvdXNQYWdlQ291bnQgPiAwICYmIHBhZ2VDb3VudCA+IGlucHV0LnByZXZpb3VzUGFnZUNvdW50KSB7XG4gICAgcmV0dXJuIHBhZ2VDb3VudCAtIDE7XG4gIH1cblxuICBjb25zdCBsaW5rZWQgPSBpbnB1dC5wYWdlSWQgPT0gbnVsbCA/IC0xIDogaW5wdXQucGFnZUlkcy5pbmRleE9mKGlucHV0LnBhZ2VJZCk7XG4gIGlmIChsaW5rZWQgPiAtMSkge1xuICAgIHJldHVybiBsaW5rZWQ7XG4gIH1cblxuICBjb25zdCBpbmRleCA9IHNhbWVSZXBvcnQgPyBpbnB1dC5hY3RpdmVQYWdlSW5kZXggOiAwO1xuXG4gIHJldHVybiBpbmRleCA8IHBhZ2VDb3VudCA/IGluZGV4IDogMDtcbn1cbiJdfQ==
32
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FudmFzLWxhbmRpbmctcGFnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy9jYW52YXMtbGFuZGluZy1wYWdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBLDZEQUE2RDtBQUM3RCxFQUFFO0FBQ0YsZ0ZBQWdGO0FBQ2hGLCtFQUErRTtBQUMvRSw0RUFBNEU7QUFDNUUsMEVBQTBFO0FBQzFFLDRFQUE0RTtBQUM1RSw2REFBNkQ7QUFDN0QsNkVBQTZFO0FBQzdFLG1CQUFtQjtBQUNuQix5RUFBeUU7QUFDekUsc0RBQXNEO0FBQ3RELDZFQUE2RTtBQUM3RSx5RUFBeUU7QUFDekUsdUJBQXVCO0FBQ3ZCLE1BQU0sVUFBVSxpQkFBaUIsQ0FBQyxLQUF5QjtJQUN6RCxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztJQUN2QyxNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsUUFBUSxLQUFLLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQztJQUU3RCxJQUFJLEtBQUssQ0FBQyxVQUFVLEtBQUssSUFBSSxFQUFFLENBQUM7UUFDOUIsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBRUQsSUFBSSxVQUFVLElBQUksS0FBSyxDQUFDLGlCQUFpQixHQUFHLENBQUMsSUFBSSxTQUFTLEdBQUcsS0FBSyxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDckYsT0FBTyxTQUFTLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMvRSxJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ2hCLE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxNQUFNLEtBQUssR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUVyRCxPQUFPLEtBQUssR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDYW52YXNMYW5kaW5nSW5wdXQgfSBmcm9tICcuL2ludGVyZmFjZXMvY2FudmFzLWxhbmRpbmctaW5wdXQuaW50ZXJmYWNlJztcblxuXG4vLyBXaGljaCBwYWdlIHRoZSBjYW52YXMgb3BlbnMgd2hlbiBpdHMgcmVwb3J0IGlucHV0IGNoYW5nZXMuXG4vL1xuLy8gLSBBIFJlZnJlc2gga2VlcHMgdGhlIHBhZ2UgdGhhdCB3YXMgb24gc2NyZWVuLCBieSBpZCwgd2hlcmV2ZXIgaXQgbW92ZWQ7IHdoZW5cbi8vICAgaXQgaXMgZ29uZSwgdGhlIGZpcnN0IHBhZ2UuIEEgcGFnZSB0aGF0IGFycml2ZWQgd2l0aCB0aGUgcmVmcmVzaCB3YXMgYWRkZWRcbi8vICAgZWxzZXdoZXJlICh0aGUgTUNQLCBhbm90aGVyIHRhYiksIHNvIGl0IGRvZXMgbm90IHRha2UgdGhlIHZpZXdlciB0aGVyZS5cbi8vIC0gVGhlIHNhbWUgcmVwb3J0IHdpdGggbW9yZSBwYWdlcyB0aGFuIGJlZm9yZTogYSBwYWdlIHdhcyBqdXN0IGFkZGVkIGluXG4vLyAgIHRoaXMgdGFiLCBzbyB0aGUgY2FudmFzIGxhbmRzIG9uIHRoZSBsYXN0IHBhZ2UuIFRoZSBhc2tlZC1mb3IgcGFnZSBkb2VzXG4vLyAgIG5vdCBiZWF0IGl0OiB0aGF0IGlzIGEgc3RhbGUgdmFsdWUgdGhlIGhvc3Qgc3RpbGwgaG9sZHMuXG4vLyAtIE90aGVyd2lzZSB0aGUgYXNrZWQtZm9yIHBhZ2UgKGEgP3BhZ2U9IHRoZSByZXBvcnQgb3BlbmVkIHdpdGgpLCB3aGVuIHRoZVxuLy8gICByZXBvcnQgaGFzIGl0LlxuLy8gLSBBbm90aGVyIHJlcG9ydCB0aGF0IGFza3MgZm9yIG5vIHBhZ2UgaXQgaGFzIG9wZW5zIG9uIGl0cyBmaXJzdCBwYWdlOlxuLy8gICB0aGUgb2xkIHJlcG9ydCdzIHBhZ2UgbnVtYmVyIG1lYW5zIG5vdGhpbmcgdGhlcmUuXG4vLyAtIFRoZSBzYW1lIHJlcG9ydCBrZWVwcyB0aGUgcGFnZSBpdCBzaG93cyB3aGVuIHRoZSBhc2tlZC1mb3IgcGFnZSBkb2VzIG5vdFxuLy8gICByZXNvbHZlIChpdCBtYXkgc3RpbGwgYmUgbG9hZGluZyk7IGFuIGluZGV4IHBhc3QgdGhlIGxhc3QgcGFnZSBmYWxsc1xuLy8gICBiYWNrIHRvIHRoZSBmaXJzdC5cbmV4cG9ydCBmdW5jdGlvbiBjYW52YXNMYW5kaW5nUGFnZShpbnB1dDogQ2FudmFzTGFuZGluZ0lucHV0KTogbnVtYmVyIHtcbiAgY29uc3QgcGFnZUNvdW50ID0gaW5wdXQucGFnZUlkcy5sZW5ndGg7XG4gIGNvbnN0IHNhbWVSZXBvcnQgPSBpbnB1dC5yZXBvcnRJZCA9PT0gaW5wdXQucHJldmlvdXNSZXBvcnRJZDtcblxuICBpZiAoaW5wdXQua2VlcFBhZ2VJZCAhPT0gbnVsbCkge1xuICAgIHJldHVybiBNYXRoLm1heChpbnB1dC5wYWdlSWRzLmluZGV4T2YoaW5wdXQua2VlcFBhZ2VJZCksIDApO1xuICB9XG5cbiAgaWYgKHNhbWVSZXBvcnQgJiYgaW5wdXQucHJldmlvdXNQYWdlQ291bnQgPiAwICYmIHBhZ2VDb3VudCA+IGlucHV0LnByZXZpb3VzUGFnZUNvdW50KSB7XG4gICAgcmV0dXJuIHBhZ2VDb3VudCAtIDE7XG4gIH1cblxuICBjb25zdCBsaW5rZWQgPSBpbnB1dC5wYWdlSWQgPT0gbnVsbCA/IC0xIDogaW5wdXQucGFnZUlkcy5pbmRleE9mKGlucHV0LnBhZ2VJZCk7XG4gIGlmIChsaW5rZWQgPiAtMSkge1xuICAgIHJldHVybiBsaW5rZWQ7XG4gIH1cblxuICBjb25zdCBpbmRleCA9IHNhbWVSZXBvcnQgPyBpbnB1dC5hY3RpdmVQYWdlSW5kZXggOiAwO1xuXG4gIHJldHVybiBpbmRleCA8IHBhZ2VDb3VudCA/IGluZGV4IDogMDtcbn1cbiJdfQ==
@@ -0,0 +1,24 @@
1
+ import { ReportChartDateLabel } from './enums/report-chart-date-label.enum';
2
+ // A time-axis chart's settings-dialog keys (dateLabel and span), from its
3
+ // config.xAxis; null where the config has none.
4
+ export function chartAxisSettings(config) {
5
+ return {
6
+ dateLabel: config?.xAxis?.dateLabel ?? null,
7
+ span: config?.xAxis?.span ?? null,
8
+ };
9
+ }
10
+ // Whether two sets of time-axis keys draw the same chart. Short and an absent
11
+ // dateLabel are one, as are a span's absent and null periods or start.
12
+ export function sameChartAxisSettings(a, b) {
13
+ return JSON.stringify(normalizedAxisSettings(a)) === JSON.stringify(normalizedAxisSettings(b));
14
+ }
15
+ function normalizedAxisSettings(settings) {
16
+ const { dateLabel, span } = settings;
17
+ return {
18
+ dateLabel: dateLabel === ReportChartDateLabel.Short ? null : (dateLabel ?? null),
19
+ span: span
20
+ ? { through: span.through, periods: span.periods ?? undefined, start: span.start || undefined }
21
+ : null,
22
+ };
23
+ }
24
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhcnQtYXhpcy1zZXR0aW5ncy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy9jaGFydC1heGlzLXNldHRpbmdzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBSzVFLDBFQUEwRTtBQUMxRSxnREFBZ0Q7QUFDaEQsTUFBTSxVQUFVLGlCQUFpQixDQUFDLE1BQXNDO0lBQ3RFLE9BQU87UUFDTCxTQUFTLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxTQUFTLElBQUksSUFBSTtRQUMzQyxJQUFJLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxJQUFJLElBQUksSUFBSTtLQUNsQyxDQUFDO0FBQ0osQ0FBQztBQUVELDhFQUE4RTtBQUM5RSx1RUFBdUU7QUFDdkUsTUFBTSxVQUFVLHFCQUFxQixDQUFDLENBQTBCLEVBQUUsQ0FBMEI7SUFDMUYsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pHLENBQUM7QUFFRCxTQUFTLHNCQUFzQixDQUFDLFFBQWlDO0lBQy9ELE1BQU0sRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEdBQUcsUUFBUSxDQUFDO0lBRXJDLE9BQU87UUFDTCxTQUFTLEVBQUUsU0FBUyxLQUFLLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUM7UUFDaEYsSUFBSSxFQUFFLElBQUk7WUFDUixDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sSUFBSSxTQUFTLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLElBQUksU0FBUyxFQUFFO1lBQy9GLENBQUMsQ0FBQyxJQUFJO0tBQ1QsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSZXBvcnRDaGFydERhdGVMYWJlbCB9IGZyb20gJy4vZW51bXMvcmVwb3J0LWNoYXJ0LWRhdGUtbGFiZWwuZW51bSc7XG5pbXBvcnQgeyBSZXBvcnRDaGFydEF4aXNTZXR0aW5ncyB9IGZyb20gJy4vaW50ZXJmYWNlcy9yZXBvcnQtY2hhcnQtYXhpcy1zZXR0aW5ncy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgQ2hhcnRDb25maWcgfSBmcm9tICcuL2ludGVyZmFjZXMvcmVwb3J0LmludGVyZmFjZSc7XG5cblxuLy8gQSB0aW1lLWF4aXMgY2hhcnQncyBzZXR0aW5ncy1kaWFsb2cga2V5cyAoZGF0ZUxhYmVsIGFuZCBzcGFuKSwgZnJvbSBpdHNcbi8vIGNvbmZpZy54QXhpczsgbnVsbCB3aGVyZSB0aGUgY29uZmlnIGhhcyBub25lLlxuZXhwb3J0IGZ1bmN0aW9uIGNoYXJ0QXhpc1NldHRpbmdzKGNvbmZpZzogQ2hhcnRDb25maWcgfCBudWxsIHwgdW5kZWZpbmVkKTogUmVwb3J0Q2hhcnRBeGlzU2V0dGluZ3Mge1xuICByZXR1cm4ge1xuICAgIGRhdGVMYWJlbDogY29uZmlnPy54QXhpcz8uZGF0ZUxhYmVsID8/IG51bGwsXG4gICAgc3BhbjogY29uZmlnPy54QXhpcz8uc3BhbiA/PyBudWxsLFxuICB9O1xufVxuXG4vLyBXaGV0aGVyIHR3byBzZXRzIG9mIHRpbWUtYXhpcyBrZXlzIGRyYXcgdGhlIHNhbWUgY2hhcnQuIFNob3J0IGFuZCBhbiBhYnNlbnRcbi8vIGRhdGVMYWJlbCBhcmUgb25lLCBhcyBhcmUgYSBzcGFuJ3MgYWJzZW50IGFuZCBudWxsIHBlcmlvZHMgb3Igc3RhcnQuXG5leHBvcnQgZnVuY3Rpb24gc2FtZUNoYXJ0QXhpc1NldHRpbmdzKGE6IFJlcG9ydENoYXJ0QXhpc1NldHRpbmdzLCBiOiBSZXBvcnRDaGFydEF4aXNTZXR0aW5ncyk6IGJvb2xlYW4ge1xuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkobm9ybWFsaXplZEF4aXNTZXR0aW5ncyhhKSkgPT09IEpTT04uc3RyaW5naWZ5KG5vcm1hbGl6ZWRBeGlzU2V0dGluZ3MoYikpO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVkQXhpc1NldHRpbmdzKHNldHRpbmdzOiBSZXBvcnRDaGFydEF4aXNTZXR0aW5ncyk6IFJlcG9ydENoYXJ0QXhpc1NldHRpbmdzIHtcbiAgY29uc3QgeyBkYXRlTGFiZWwsIHNwYW4gfSA9IHNldHRpbmdzO1xuXG4gIHJldHVybiB7XG4gICAgZGF0ZUxhYmVsOiBkYXRlTGFiZWwgPT09IFJlcG9ydENoYXJ0RGF0ZUxhYmVsLlNob3J0ID8gbnVsbCA6IChkYXRlTGFiZWwgPz8gbnVsbCksXG4gICAgc3Bhbjogc3BhblxuICAgICAgPyB7IHRocm91Z2g6IHNwYW4udGhyb3VnaCwgcGVyaW9kczogc3Bhbi5wZXJpb2RzID8/IHVuZGVmaW5lZCwgc3RhcnQ6IHNwYW4uc3RhcnQgfHwgdW5kZWZpbmVkIH1cbiAgICAgIDogbnVsbCxcbiAgfTtcbn1cbiJdfQ==