@firestitch/report 18.9.0 → 18.10.1
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/report-canvas/report-canvas.component.d.ts +3 -0
- package/app/reports/components/report-component/report-component.component.d.ts +35 -1
- package/app/reports/components/report-view-picker/report-view-picker.component.d.ts +21 -0
- package/app/reports/data/report.data.d.ts +20 -7
- package/app/reports/dialogs/component-settings/component-settings.component.d.ts +18 -3
- package/app/reports/dialogs/report-settings/report-settings.component.d.ts +45 -8
- 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/export/report-export-collector.service.d.ts +13 -4
- package/app/reports/export/report-filter-lines.d.ts +18 -0
- package/app/reports/filter-settings-rules.d.ts +37 -0
- package/app/reports/format.d.ts +0 -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-group-changes.interface.d.ts +7 -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-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 +27 -16
- package/app/reports/interfaces/tile-load-result.interface.d.ts +4 -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 +20 -21
- package/app/reports/report-tile.d.ts +2 -0
- package/app/reports/report-view-config.d.ts +34 -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 -11
- package/app/reports/services/report-view.service.d.ts +39 -0
- package/app/reports/tile-data-state.d.ts +7 -0
- package/app/reports/tile-loads.d.ts +4 -0
- package/app/reports/views/report/fs-ai-report.component.d.ts +10 -8
- 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 +26 -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 +11 -5
- package/esm2022/app/reports/components/report-canvas/report-canvas.component.mjs +56 -40
- package/esm2022/app/reports/components/report-component/report-component.component.mjs +261 -65
- package/esm2022/app/reports/components/report-view-picker/report-view-picker.component.mjs +115 -0
- package/esm2022/app/reports/data/report.data.mjs +94 -14
- package/esm2022/app/reports/dialogs/component-settings/component-settings.component.mjs +106 -51
- package/esm2022/app/reports/dialogs/report-settings/report-settings.component.mjs +248 -104
- 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/export/report-export-collector.service.mjs +187 -117
- package/esm2022/app/reports/export/report-filter-lines.mjs +235 -0
- package/esm2022/app/reports/export/report-pdf.service.mjs +12 -7
- package/esm2022/app/reports/export/report-pptx.service.mjs +18 -14
- package/esm2022/app/reports/filter-settings-rules.mjs +290 -0
- package/esm2022/app/reports/format.mjs +2 -22
- 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-group-changes.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-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/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 +263 -72
- package/esm2022/app/reports/report-tile.mjs +12 -0
- package/esm2022/app/reports/report-view-config.mjs +587 -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 +668 -210
- package/esm2022/app/reports/services/report-view.service.mjs +218 -0
- package/esm2022/app/reports/tile-data-state.mjs +127 -0
- package/esm2022/app/reports/tile-loads.mjs +38 -0
- package/esm2022/app/reports/views/report/fs-ai-report.component.mjs +194 -127
- package/esm2022/app/reports/views/report/report.component.mjs +112 -29
- package/esm2022/public_api.mjs +23 -1
- package/fesm2022/{firestitch-report-echarts-DBMOHmBF.mjs → firestitch-report-echarts-DHEH_K_q.mjs} +2 -2
- package/fesm2022/{firestitch-report-echarts-DBMOHmBF.mjs.map → firestitch-report-echarts-DHEH_K_q.mjs.map} +1 -1
- package/fesm2022/{firestitch-report-firestitch-report-CqbXT1gh.mjs → firestitch-report-firestitch-report-ZcHTnNKq.mjs} +8222 -4447
- package/fesm2022/firestitch-report-firestitch-report-ZcHTnNKq.mjs.map +1 -0
- package/fesm2022/firestitch-report.mjs +1 -1
- package/package.json +1 -1
- package/public_api.d.ts +22 -0
- package/app/reports/report-url-state.d.ts +0 -19
- package/esm2022/app/reports/report-url-state.mjs +0 -189
- package/fesm2022/firestitch-report-firestitch-report-CqbXT1gh.mjs.map +0 -1
|
@@ -1,34 +1,32 @@
|
|
|
1
1
|
import { IFilterConfigItem } from '@firestitch/filter';
|
|
2
2
|
import { Observable } from 'rxjs';
|
|
3
3
|
import { ReportData } from './data/report.data';
|
|
4
|
+
import { ReportFilterMatch } from './interfaces/report-filter-match.type';
|
|
5
|
+
import { ReportFilterOptionPair } from './interfaces/report-filter-option-pair.interface';
|
|
6
|
+
import { ReportViewerFeature } from './interfaces/report-viewer-feature.type';
|
|
4
7
|
import { ChartGranularity, FilterGroupValue, Report, ReportFilterGroup, ReportLocaleTag } from './interfaces/report.interface';
|
|
8
|
+
import { ReportFilterOptionsService } from './services/report-filter-options.service';
|
|
5
9
|
export declare function dateBoundString(value: Date | string | null | undefined): string | undefined;
|
|
6
10
|
export declare function dateBoundLabel(value: Date | string | null | undefined, locale: ReportLocaleTag): string | null;
|
|
7
11
|
export declare function dateFromBound(value: string | null | undefined): Date | null;
|
|
8
12
|
export declare function dateToBound(value: Date | null | undefined): string | null;
|
|
9
13
|
export declare function relativeLabel(relative: string): string;
|
|
10
|
-
export declare const GROUP_PARAM_PREFIX = "g";
|
|
11
|
-
export declare function groupItemName(group: Pick<ReportFilterGroup, 'id'>): string;
|
|
12
14
|
export declare const GROUP_BY_ITEM = "groupBy";
|
|
13
|
-
export
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
export declare function resolveOptionValues(options$: Observable<
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
export declare function
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
name: string;
|
|
29
|
-
value: unknown;
|
|
30
|
-
}[]>;
|
|
31
|
-
export declare function filterItemForGroup(group: ReportFilterGroup, reportData: ReportData, reportId: number, initial?: FilterGroupValue): IFilterConfigItem;
|
|
15
|
+
export type ItemRangeEnd = 'min' | 'max' | 'from' | 'to';
|
|
16
|
+
export declare function itemRangeName(name: string, end: ItemRangeEnd): string;
|
|
17
|
+
export declare function groupItemName(group: Pick<ReportFilterGroup, 'id'>): string;
|
|
18
|
+
export declare function loadGroupOptions(group: ReportFilterGroup, reportData: ReportData, reportId: number): Observable<ReportFilterOptionPair[]>;
|
|
19
|
+
export declare function resolveOptionValues(options$: Observable<ReportFilterOptionPair[]>, values: unknown[], label?: (value: unknown) => string | null): Observable<ReportFilterOptionPair[]>;
|
|
20
|
+
export declare function matchOptions(options$: Observable<ReportFilterOptionPair[]>, keyword?: string): Observable<ReportFilterOptionPair[]>;
|
|
21
|
+
export declare const OPTIONS_TRUNCATED_NOTE = "Showing the first 500. Type to narrow.";
|
|
22
|
+
export declare const OPTIONS_FAILED_NOTE = "Could not load the list.";
|
|
23
|
+
export declare function filterItemForGroup(group: ReportFilterGroup, options: ReportFilterOptionsService, report: Report | null, initial?: FilterGroupValue, features?: readonly ReportViewerFeature[]): IFilterConfigItem;
|
|
24
|
+
export declare function isMatchAnyGroup(group: ReportFilterGroup, pageId: number | null): boolean;
|
|
25
|
+
export declare function reportBarGroups(report: Report | null, pageId: number | null): ReportFilterGroup[];
|
|
26
|
+
export declare function hasPageGroup(report: Report | null): boolean;
|
|
27
|
+
export declare const MATCH_ITEM = "match";
|
|
28
|
+
export declare function matchFilterItem(report: Report | null, groups: ReportFilterGroup[], pageId: number | null, match: ReportFilterMatch): IFilterConfigItem | null;
|
|
29
|
+
export declare function matchFromQuery(query: Record<string, unknown>): ReportFilterMatch;
|
|
32
30
|
export declare const LIST_SEARCH_ITEM = "listSearch";
|
|
33
31
|
export declare const LIST_SEARCH_MAX_LENGTH = 100;
|
|
34
32
|
export declare function listSearchItem(value: string | null): IFilterConfigItem;
|
|
@@ -40,3 +38,4 @@ export declare function groupValuesFromQuery(query: Record<string, any>, groups:
|
|
|
40
38
|
groupId: number;
|
|
41
39
|
value: FilterGroupValue | null;
|
|
42
40
|
}[];
|
|
41
|
+
export declare function groupValueSignature(value: FilterGroupValue | null | undefined): string;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { ReportChatViewerState } from './interfaces/report-chat-viewer-state.interface';
|
|
2
|
+
import { ReportDrillStep } from './interfaces/report-drill-step.interface';
|
|
3
|
+
import { ReportViewConfig } from './interfaces/report-view-config.interface';
|
|
4
|
+
import { ReportViewSummary } from './interfaces/report-view-summary.interface';
|
|
5
|
+
import { ReportView } from './interfaces/report-view.interface';
|
|
6
|
+
import { ChartGranularity, FilterGroupDefault, FilterGroupValue, ReportFilterType, ReportRelativeRange } from './interfaces/report.interface';
|
|
7
|
+
export declare const REPORT_VIEW_CONFIG_VERSION = 1;
|
|
8
|
+
export declare const VIEW_CONFIG_MAX_BYTES: number;
|
|
9
|
+
export declare const VIEW_CONFIG_MAX_GROUPS = 100;
|
|
10
|
+
export declare const VIEW_CONFIG_MAX_TILES = 200;
|
|
11
|
+
export declare const GROUP_VALUE_MAX_PICKS = 500;
|
|
12
|
+
export declare const DRILL_MAX_DEPTH = 5;
|
|
13
|
+
export declare const RELATIVE_RANGE_NAMES: ReportRelativeRange[];
|
|
14
|
+
export declare function isRelativeRange(name: unknown): name is ReportRelativeRange;
|
|
15
|
+
export declare function isChartGranularity(value: unknown): value is ChartGranularity;
|
|
16
|
+
export declare function isCalendarDay(text: string): boolean;
|
|
17
|
+
export declare function numberFromText(text: string): number | null;
|
|
18
|
+
export declare function groupValueFromArray(value: Record<string, unknown>, type: ReportFilterType): FilterGroupDefault;
|
|
19
|
+
export declare function groupValueFromStored(value: unknown, type: ReportFilterType): FilterGroupDefault | null;
|
|
20
|
+
export declare function viewConfigFromArray(input: unknown): ReportViewConfig;
|
|
21
|
+
export declare function toStoredGroupValue(type: ReportFilterType, value: FilterGroupValue | null | undefined): FilterGroupDefault | null;
|
|
22
|
+
export declare function toLiveGroupValue(type: ReportFilterType, stored: FilterGroupDefault | null | undefined, resolveRelative: (name: string) => {
|
|
23
|
+
start: Date;
|
|
24
|
+
end: Date;
|
|
25
|
+
} | null): FilterGroupValue | null;
|
|
26
|
+
export declare function viewDiffers(base: ReportViewConfig, current: ReportViewConfig, authored?: ReportViewConfig | null): boolean;
|
|
27
|
+
export declare function sameStoredGroupValue(a: FilterGroupDefault | null | undefined, b: FilterGroupDefault | null | undefined): boolean;
|
|
28
|
+
export declare function cleanDrillPath(path: readonly unknown[] | null | undefined): ReportDrillStep[];
|
|
29
|
+
export declare function sameDrillPath(a: readonly ReportDrillStep[] | null | undefined, b: readonly ReportDrillStep[] | null | undefined): boolean;
|
|
30
|
+
export declare function withStoredKeys(stored: ReportViewConfig | null | undefined, screen: ReportViewConfig): ReportViewConfig;
|
|
31
|
+
export declare function viewDroppedCount(view: Pick<ReportView, 'config' | 'dropped'>, applied: ReportViewConfig): number;
|
|
32
|
+
export declare function viewDroppedMessage(count: number, canChange?: boolean): string | null;
|
|
33
|
+
export declare function chatViewFields(openView: Pick<ReportViewSummary, 'id'> | null, viewChanged: boolean): Pick<ReportChatViewerState, 'viewId' | 'viewChanged'>;
|
|
34
|
+
export declare function finiteNumber(value: unknown): number | undefined;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { ReportViewMenuItem } from './interfaces/report-view-menu-item.interface';
|
|
2
|
+
import { ReportViewSummary } from './interfaces/report-view-summary.interface';
|
|
3
|
+
export declare const VIEWS_LABEL = "Views";
|
|
4
|
+
export declare const EDITED_TOOLTIP = "The screen differs from this view";
|
|
5
|
+
export declare const SAVE_AS_TITLE = "Save as new view";
|
|
6
|
+
export declare const RENAME_TITLE = "Rename view";
|
|
7
|
+
export declare const CROSS_FILTER_NOTE = "Cross-filters are temporary and are not saved.";
|
|
8
|
+
export declare const VIEW_NAME_BLANK = "Enter a name";
|
|
9
|
+
export declare const VIEW_NAME_MAX_LENGTH = 100;
|
|
10
|
+
export declare function viewMenuItems(open: ReportViewSummary | null, views: readonly ReportViewSummary[], edited: boolean, canShare: boolean): ReportViewMenuItem[];
|
|
11
|
+
export declare function pickerLabel(open: Pick<ReportViewSummary, 'name'> | null, edited: boolean): string;
|
|
12
|
+
export declare function pickerTooltip(open: Pick<ReportViewSummary, 'name'> | null, edited: boolean): string | null;
|
|
13
|
+
export declare function deletePromptText(view: Pick<ReportViewSummary, 'name' | 'shared'>): string;
|
|
14
|
+
export declare function saveDialogNote(hasCrossFilter: boolean): string | null;
|
|
15
|
+
export declare function viewNameError(name: string | null | undefined): string | null;
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { ReportViewerFeature } from './interfaces/report-viewer-feature.type';
|
|
2
|
+
import { ReportFilterGroup } from './interfaces/report.interface';
|
|
3
|
+
export declare const VIEWER_FEATURES: readonly ReportViewerFeature[];
|
|
4
|
+
export declare function offeredViewerFeatures(served: readonly ReportViewerFeature[] | null | undefined): ReportViewerFeature[];
|
|
5
|
+
export declare function offersExclude(group: Pick<ReportFilterGroup, 'type' | 'multiColumn'>, features: readonly ReportViewerFeature[] | null | undefined): boolean;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { Observable } from 'rxjs';
|
|
2
|
+
import { ReportFilterOptionPair } from '../interfaces/report-filter-option-pair.interface';
|
|
3
|
+
import { Report, ReportFilterGroup } from '../interfaces/report.interface';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
export declare class ReportFilterOptionsService {
|
|
6
|
+
private _reportData;
|
|
7
|
+
private _filterState;
|
|
8
|
+
private _destroyRef;
|
|
9
|
+
private _streams;
|
|
10
|
+
private _labels;
|
|
11
|
+
private _asked;
|
|
12
|
+
private _loaded;
|
|
13
|
+
options(group: ReportFilterGroup, report: Report | null): Observable<ReportFilterOptionPair[]>;
|
|
14
|
+
label(groupId: number, value: unknown): string | null;
|
|
15
|
+
truncated(groupId: number): boolean;
|
|
16
|
+
failed(groupId: number): boolean;
|
|
17
|
+
private _ask;
|
|
18
|
+
private _request;
|
|
19
|
+
private _fetch;
|
|
20
|
+
private _stream;
|
|
21
|
+
private _syncLoad;
|
|
22
|
+
private _remember;
|
|
23
|
+
private _askedFor;
|
|
24
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<ReportFilterOptionsService, never>;
|
|
25
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<ReportFilterOptionsService>;
|
|
26
|
+
}
|
|
@@ -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, 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;
|
|
@@ -29,8 +42,19 @@ export declare class ReportFilterStateService {
|
|
|
29
42
|
private _serverSearches;
|
|
30
43
|
private _listSearchChanged$;
|
|
31
44
|
private _changed$;
|
|
32
|
-
private
|
|
33
|
-
|
|
45
|
+
private _stateChanged$;
|
|
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;
|
|
57
|
+
init(report: Report): void;
|
|
34
58
|
value(groupId: number): FilterGroupValue | undefined;
|
|
35
59
|
setValue(groupId: number, value: FilterGroupValue | null): void;
|
|
36
60
|
resolveRelative(name: string): {
|
|
@@ -48,8 +72,7 @@ export declare class ReportFilterStateService {
|
|
|
48
72
|
hiddenColumns(componentId: number): readonly string[];
|
|
49
73
|
setHiddenColumns(componentId: number, names: readonly string[]): void;
|
|
50
74
|
listSearchChanges(componentId: number): Observable<void>;
|
|
51
|
-
|
|
52
|
-
urlSnapshot(report: Report): ReportUrlSnapshot;
|
|
75
|
+
changes(): Observable<void>;
|
|
53
76
|
isFilterDisabled(filterId: number): boolean;
|
|
54
77
|
toggleFilter(filterId: number, groupId: number): void;
|
|
55
78
|
changesFor(component: ReportComponent): Observable<number | null>;
|
|
@@ -57,22 +80,53 @@ export declare class ReportFilterStateService {
|
|
|
57
80
|
resolveForComponent(component: ReportComponent): ResolvedFilterValue[];
|
|
58
81
|
viewerFilters(): ReportChatViewerFilter[];
|
|
59
82
|
resolveForReport(report: Report, pageId?: number | null): ResolvedFilterValue[];
|
|
83
|
+
setPage(pageId: number | null): void;
|
|
84
|
+
setMatch(match: ReportFilterMatch): void;
|
|
85
|
+
drill(componentId: number): readonly ReportDrillStep[];
|
|
86
|
+
setDrill(componentId: number, path: readonly ReportDrillStep[]): void;
|
|
87
|
+
drillChanges(componentId: number): Observable<void>;
|
|
88
|
+
adoptDrill(componentId: number, path: readonly ReportDrillStep[]): boolean;
|
|
89
|
+
snapshot(): ReportViewConfig;
|
|
90
|
+
authoredConfig(): ReportViewConfig;
|
|
91
|
+
apply(config: ReportViewConfig | null, pageId?: number | null): void;
|
|
92
|
+
resetToBase(): void;
|
|
93
|
+
setBaseToScreen(): void;
|
|
94
|
+
clearBase(): void;
|
|
95
|
+
resetGroupsToBase(groupIds: readonly number[]): void;
|
|
96
|
+
groupsDifferFromBase(groupIds: readonly number[]): boolean;
|
|
97
|
+
tileState(component: ReportComponent): ComponentDataState;
|
|
98
|
+
livePreset(groupId: number): ReportRelativeRange | null;
|
|
60
99
|
private _resolvedFields;
|
|
61
100
|
private _livePreset;
|
|
62
101
|
private _seed;
|
|
63
|
-
private _restore;
|
|
64
|
-
private _restoreGroups;
|
|
65
|
-
private _restoreListSorts;
|
|
66
|
-
private _restoreListSearches;
|
|
67
|
-
private _restoreListHidden;
|
|
68
102
|
private _dropUnsearchable;
|
|
69
103
|
private _prune;
|
|
70
104
|
private _withPreset;
|
|
71
|
-
private _isDefault;
|
|
72
105
|
private _listComponents;
|
|
73
106
|
private _sortableColumns;
|
|
74
107
|
private _defaultValue;
|
|
75
108
|
private _relativeRange;
|
|
109
|
+
private _snapshotGroups;
|
|
110
|
+
private _snapshotTiles;
|
|
111
|
+
private _setBase;
|
|
112
|
+
private _applyLayer;
|
|
113
|
+
private _applyGroups;
|
|
114
|
+
private _applyGroup;
|
|
115
|
+
private _seedAuthored;
|
|
116
|
+
private _clearTiles;
|
|
117
|
+
private _applyTile;
|
|
118
|
+
private _applyListTile;
|
|
119
|
+
private _setDrillPath;
|
|
120
|
+
private _applyPage;
|
|
121
|
+
private _notifyApplied;
|
|
122
|
+
private _tiles;
|
|
123
|
+
private _isChart;
|
|
124
|
+
private _pruneViewState;
|
|
125
|
+
private _pruneBase;
|
|
126
|
+
private _baseTile;
|
|
127
|
+
private _resolveExcludeAndRange;
|
|
128
|
+
private _excludeOrRangeDefault;
|
|
129
|
+
private _countSortResets;
|
|
76
130
|
static ɵfac: i0.ɵɵFactoryDeclaration<ReportFilterStateService, never>;
|
|
77
131
|
static ɵprov: i0.ɵɵInjectableDeclaration<ReportFilterStateService>;
|
|
78
132
|
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { Observable } from 'rxjs';
|
|
2
|
+
import { ReportViewCreate } from '../interfaces/report-view-create.interface';
|
|
3
|
+
import { ReportViewDeleted } from '../interfaces/report-view-deleted.interface';
|
|
4
|
+
import { ReportViewSummary } from '../interfaces/report-view-summary.interface';
|
|
5
|
+
import { ReportView } from '../interfaces/report-view.interface';
|
|
6
|
+
import { Report } from '../interfaces/report.interface';
|
|
7
|
+
import * as i0 from "@angular/core";
|
|
8
|
+
export declare class ReportViewService {
|
|
9
|
+
readonly views: import("@angular/core").Signal<ReportViewSummary[]>;
|
|
10
|
+
readonly canShare: import("@angular/core").Signal<boolean>;
|
|
11
|
+
readonly openView: import("@angular/core").Signal<ReportView>;
|
|
12
|
+
readonly viewChanged: import("@angular/core").Signal<boolean>;
|
|
13
|
+
private _reportData;
|
|
14
|
+
private _filterState;
|
|
15
|
+
private _message;
|
|
16
|
+
private _destroyRef;
|
|
17
|
+
private _views;
|
|
18
|
+
private _canShare;
|
|
19
|
+
private _openView;
|
|
20
|
+
private _reportId;
|
|
21
|
+
serves(report: Report | null): boolean;
|
|
22
|
+
open(report: Report, pageId: number | null): Observable<void>;
|
|
23
|
+
refresh(report: Report): void;
|
|
24
|
+
pick(reportViewId: number): Observable<ReportView>;
|
|
25
|
+
openDefaults(): void;
|
|
26
|
+
saveAsNew(view: Omit<ReportViewCreate, 'config'>): Observable<ReportView>;
|
|
27
|
+
saveChanges(): Observable<ReportView>;
|
|
28
|
+
rename(name: string): Observable<ReportView>;
|
|
29
|
+
share(shared: boolean): Observable<ReportView>;
|
|
30
|
+
setDefault(personalDefault: boolean): Observable<ReportView>;
|
|
31
|
+
deleteOpen(): Observable<ReportViewDeleted>;
|
|
32
|
+
private _start;
|
|
33
|
+
private _openOn;
|
|
34
|
+
private _changeOpen;
|
|
35
|
+
private _putRow;
|
|
36
|
+
private _readViews;
|
|
37
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<ReportViewService, never>;
|
|
38
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<ReportViewService>;
|
|
39
|
+
}
|
|
@@ -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>>;
|
|
@@ -6,36 +6,35 @@ export declare class FsAiReportComponent {
|
|
|
6
6
|
readonly reportId: import("@angular/core").InputSignal<number>;
|
|
7
7
|
readonly basePath: import("@angular/core").InputSignal<string>;
|
|
8
8
|
readonly pageQueryParam: import("@angular/core").InputSignal<string>;
|
|
9
|
-
readonly urlState: import("@angular/core").InputSignal<boolean>;
|
|
10
9
|
readonly deleted: import("@angular/core").OutputEmitterRef<number>;
|
|
11
10
|
readonly renamed: import("@angular/core").OutputEmitterRef<Report>;
|
|
12
11
|
readonly pageChanged: import("@angular/core").OutputEmitterRef<number>;
|
|
13
12
|
readonly report: import("@angular/core").WritableSignal<Report>;
|
|
14
13
|
readonly editMode: import("@angular/core").WritableSignal<boolean>;
|
|
15
|
-
readonly timezoneLabel: import("@angular/core").Signal<string>;
|
|
16
14
|
readonly pageId: import("@angular/core").WritableSignal<number>;
|
|
17
15
|
readonly chatPageId: import("@angular/core").WritableSignal<number>;
|
|
18
16
|
readonly chatRequestData: import("@angular/core").Signal<Record<string, unknown>>;
|
|
19
17
|
readonly reportFilterConfig: import("@angular/core").WritableSignal<FilterConfig>;
|
|
20
18
|
readonly reportHasFilters: import("@angular/core").Signal<boolean>;
|
|
21
19
|
readonly reportFilterKey: import("@angular/core").Signal<string>;
|
|
20
|
+
readonly viewsServed: import("@angular/core").Signal<boolean>;
|
|
22
21
|
private _split;
|
|
23
22
|
private _chatPanel;
|
|
24
23
|
private _canvas?;
|
|
25
24
|
private _reportData;
|
|
26
25
|
private _reportAiChatData;
|
|
27
|
-
private _router;
|
|
28
26
|
private _route;
|
|
29
27
|
private _filterState;
|
|
28
|
+
private _filterOptions;
|
|
29
|
+
private _views;
|
|
30
30
|
private _exportService;
|
|
31
31
|
private _collector;
|
|
32
32
|
private _process;
|
|
33
33
|
private _dialog;
|
|
34
34
|
private _destroyRef;
|
|
35
35
|
private _zone;
|
|
36
|
-
private
|
|
37
|
-
private
|
|
38
|
-
private _pageWrite$;
|
|
36
|
+
private _openedReportId;
|
|
37
|
+
private readonly _barVersion;
|
|
39
38
|
constructor();
|
|
40
39
|
toggleEditMode(): void;
|
|
41
40
|
get isMasterMode(): boolean;
|
|
@@ -53,11 +52,14 @@ export declare class FsAiReportComponent {
|
|
|
53
52
|
private _chatViewerState;
|
|
54
53
|
private _resizeTo;
|
|
55
54
|
private _pageIdFromUrl;
|
|
56
|
-
private _writeUrl;
|
|
57
55
|
private _loadReport;
|
|
56
|
+
private _openReport;
|
|
57
|
+
private _openAppliedPage;
|
|
58
58
|
private _reportGroups;
|
|
59
59
|
private _buildReportConfig;
|
|
60
|
+
private _barChanged;
|
|
60
61
|
private _groupByItem;
|
|
62
|
+
private _matchItem;
|
|
61
63
|
static ɵfac: i0.ɵɵFactoryDeclaration<FsAiReportComponent, never>;
|
|
62
|
-
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; };
|
|
64
|
+
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; }; }, { "deleted": "deleted"; "renamed": "renamed"; "pageChanged": "pageChanged"; }, never, never, true, never>;
|
|
63
65
|
}
|
|
@@ -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,26 @@
|
|
|
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 asked-for page does
|
|
5
|
+
// not beat it: that is a stale value the host still holds.
|
|
6
|
+
// - Otherwise the asked-for page (a ?page= the report opened with, or the
|
|
7
|
+
// open view's), when the report has it.
|
|
8
|
+
// - Another report that asks for no page it has opens on its first page:
|
|
9
|
+
// the old report's page number means nothing there.
|
|
10
|
+
// - The same report keeps the page it shows when the asked-for page does not
|
|
11
|
+
// resolve (it may still be loading); an index past the last page falls
|
|
12
|
+
// back to the first.
|
|
13
|
+
export function canvasLandingPage(input) {
|
|
14
|
+
const pageCount = input.pageIds.length;
|
|
15
|
+
const sameReport = input.reportId === input.previousReportId;
|
|
16
|
+
if (sameReport && input.previousPageCount > 0 && pageCount > input.previousPageCount) {
|
|
17
|
+
return pageCount - 1;
|
|
18
|
+
}
|
|
19
|
+
const linked = input.pageId == null ? -1 : input.pageIds.indexOf(input.pageId);
|
|
20
|
+
if (linked > -1) {
|
|
21
|
+
return linked;
|
|
22
|
+
}
|
|
23
|
+
const index = sameReport ? input.activePageIndex : 0;
|
|
24
|
+
return index < pageCount ? index : 0;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FudmFzLWxhbmRpbmctcGFnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy9jYW52YXMtbGFuZGluZy1wYWdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBLDZEQUE2RDtBQUM3RCxFQUFFO0FBQ0YsMEVBQTBFO0FBQzFFLDRFQUE0RTtBQUM1RSw2REFBNkQ7QUFDN0QsMEVBQTBFO0FBQzFFLDBDQUEwQztBQUMxQyx5RUFBeUU7QUFDekUsc0RBQXNEO0FBQ3RELDZFQUE2RTtBQUM3RSx5RUFBeUU7QUFDekUsdUJBQXVCO0FBQ3ZCLE1BQU0sVUFBVSxpQkFBaUIsQ0FBQyxLQUF5QjtJQUN6RCxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztJQUN2QyxNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsUUFBUSxLQUFLLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQztJQUU3RCxJQUFJLFVBQVUsSUFBSSxLQUFLLENBQUMsaUJBQWlCLEdBQUcsQ0FBQyxJQUFJLFNBQVMsR0FBRyxLQUFLLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUNyRixPQUFPLFNBQVMsR0FBRyxDQUFDLENBQUM7SUFDdkIsQ0FBQztJQUVELE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQy9FLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDaEIsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVELE1BQU0sS0FBSyxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRXJELE9BQU8sS0FBSyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENhbnZhc0xhbmRpbmdJbnB1dCB9IGZyb20gJy4vaW50ZXJmYWNlcy9jYW52YXMtbGFuZGluZy1pbnB1dC5pbnRlcmZhY2UnO1xuXG5cbi8vIFdoaWNoIHBhZ2UgdGhlIGNhbnZhcyBvcGVucyB3aGVuIGl0cyByZXBvcnQgaW5wdXQgY2hhbmdlcy5cbi8vXG4vLyAtIFRoZSBzYW1lIHJlcG9ydCB3aXRoIG1vcmUgcGFnZXMgdGhhbiBiZWZvcmU6IGEgcGFnZSB3YXMganVzdCBhZGRlZCBpblxuLy8gICB0aGlzIHRhYiwgc28gdGhlIGNhbnZhcyBsYW5kcyBvbiB0aGUgbGFzdCBwYWdlLiBUaGUgYXNrZWQtZm9yIHBhZ2UgZG9lc1xuLy8gICBub3QgYmVhdCBpdDogdGhhdCBpcyBhIHN0YWxlIHZhbHVlIHRoZSBob3N0IHN0aWxsIGhvbGRzLlxuLy8gLSBPdGhlcndpc2UgdGhlIGFza2VkLWZvciBwYWdlIChhID9wYWdlPSB0aGUgcmVwb3J0IG9wZW5lZCB3aXRoLCBvciB0aGVcbi8vICAgb3BlbiB2aWV3J3MpLCB3aGVuIHRoZSByZXBvcnQgaGFzIGl0LlxuLy8gLSBBbm90aGVyIHJlcG9ydCB0aGF0IGFza3MgZm9yIG5vIHBhZ2UgaXQgaGFzIG9wZW5zIG9uIGl0cyBmaXJzdCBwYWdlOlxuLy8gICB0aGUgb2xkIHJlcG9ydCdzIHBhZ2UgbnVtYmVyIG1lYW5zIG5vdGhpbmcgdGhlcmUuXG4vLyAtIFRoZSBzYW1lIHJlcG9ydCBrZWVwcyB0aGUgcGFnZSBpdCBzaG93cyB3aGVuIHRoZSBhc2tlZC1mb3IgcGFnZSBkb2VzIG5vdFxuLy8gICByZXNvbHZlIChpdCBtYXkgc3RpbGwgYmUgbG9hZGluZyk7IGFuIGluZGV4IHBhc3QgdGhlIGxhc3QgcGFnZSBmYWxsc1xuLy8gICBiYWNrIHRvIHRoZSBmaXJzdC5cbmV4cG9ydCBmdW5jdGlvbiBjYW52YXNMYW5kaW5nUGFnZShpbnB1dDogQ2FudmFzTGFuZGluZ0lucHV0KTogbnVtYmVyIHtcbiAgY29uc3QgcGFnZUNvdW50ID0gaW5wdXQucGFnZUlkcy5sZW5ndGg7XG4gIGNvbnN0IHNhbWVSZXBvcnQgPSBpbnB1dC5yZXBvcnRJZCA9PT0gaW5wdXQucHJldmlvdXNSZXBvcnRJZDtcblxuICBpZiAoc2FtZVJlcG9ydCAmJiBpbnB1dC5wcmV2aW91c1BhZ2VDb3VudCA+IDAgJiYgcGFnZUNvdW50ID4gaW5wdXQucHJldmlvdXNQYWdlQ291bnQpIHtcbiAgICByZXR1cm4gcGFnZUNvdW50IC0gMTtcbiAgfVxuXG4gIGNvbnN0IGxpbmtlZCA9IGlucHV0LnBhZ2VJZCA9PSBudWxsID8gLTEgOiBpbnB1dC5wYWdlSWRzLmluZGV4T2YoaW5wdXQucGFnZUlkKTtcbiAgaWYgKGxpbmtlZCA+IC0xKSB7XG4gICAgcmV0dXJuIGxpbmtlZDtcbiAgfVxuXG4gIGNvbnN0IGluZGV4ID0gc2FtZVJlcG9ydCA/IGlucHV0LmFjdGl2ZVBhZ2VJbmRleCA6IDA7XG5cbiAgcmV0dXJuIGluZGV4IDwgcGFnZUNvdW50ID8gaW5kZXggOiAwO1xufVxuIl19
|