@firestitch/report 18.4.0 → 18.6.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 (67) hide show
  1. package/app/reports/components/component-list/component-list.component.d.ts +3 -6
  2. package/app/reports/components/report-canvas/report-canvas.component.d.ts +4 -4
  3. package/app/reports/components/report-component/report-component.component.d.ts +5 -5
  4. package/app/reports/components/timezone-select/timezone-select.component.d.ts +4 -6
  5. package/app/reports/consts/report-week.const.d.ts +2 -0
  6. package/app/reports/data/report-ai-chat.data.d.ts +12 -0
  7. package/app/reports/data/report.data.d.ts +3 -3
  8. package/app/reports/dialogs/component-settings/component-settings.component.d.ts +6 -6
  9. package/app/reports/dialogs/global-settings/components/semantic-database/semantic-database.component.d.ts +3 -0
  10. package/app/reports/dialogs/report-settings/report-settings.component.d.ts +5 -0
  11. package/app/reports/export/report-export-collector.service.d.ts +14 -2
  12. package/app/reports/export/report-pdf.service.d.ts +14 -1
  13. package/app/reports/export/report-pptx.service.d.ts +6 -1
  14. package/app/reports/format.d.ts +7 -0
  15. package/app/reports/interfaces/report-chat-viewer-filter.interface.d.ts +7 -0
  16. package/app/reports/interfaces/report-chat-viewer-state.interface.d.ts +7 -0
  17. package/app/reports/interfaces/report.interface.d.ts +19 -3
  18. package/app/reports/option-builder.d.ts +13 -1
  19. package/app/reports/pipes/report-date.pipe.d.ts +7 -0
  20. package/app/reports/report-filter-items.d.ts +5 -0
  21. package/app/reports/report-url-state.d.ts +14 -0
  22. package/app/reports/services/report-filter-state.service.d.ts +24 -2
  23. package/app/reports/text.d.ts +1 -0
  24. package/app/reports/theme/palette.d.ts +2 -0
  25. package/app/reports/theme/typography.d.ts +2 -0
  26. package/app/reports/views/report/fs-ai-report.component.d.ts +16 -8
  27. package/app/reports/views/report/report.component.d.ts +6 -6
  28. package/esm2022/app/reports/components/component-list/component-list.component.mjs +29 -104
  29. package/esm2022/app/reports/components/report-canvas/report-canvas.component.mjs +52 -44
  30. package/esm2022/app/reports/components/report-component/report-component.component.mjs +55 -35
  31. package/esm2022/app/reports/components/timezone-select/timezone-select.component.mjs +23 -23
  32. package/esm2022/app/reports/consts/report-week.const.mjs +7 -0
  33. package/esm2022/app/reports/data/report-ai-chat.data.mjs +25 -0
  34. package/esm2022/app/reports/data/report.data.mjs +22 -9
  35. package/esm2022/app/reports/dialogs/component-settings/component-settings.component.mjs +25 -26
  36. package/esm2022/app/reports/dialogs/global-settings/components/semantic-database/semantic-database.component.mjs +28 -14
  37. package/esm2022/app/reports/dialogs/global-settings/global-settings.component.mjs +3 -3
  38. package/esm2022/app/reports/dialogs/report-settings/report-settings.component.mjs +38 -13
  39. package/esm2022/app/reports/export/report-export-collector.service.mjs +92 -28
  40. package/esm2022/app/reports/export/report-export.service.mjs +11 -8
  41. package/esm2022/app/reports/export/report-pdf.service.mjs +241 -81
  42. package/esm2022/app/reports/export/report-pptx.service.mjs +143 -60
  43. package/esm2022/app/reports/format.mjs +119 -8
  44. package/esm2022/app/reports/interfaces/report-chat-viewer-filter.interface.mjs +2 -0
  45. package/esm2022/app/reports/interfaces/report-chat-viewer-state.interface.mjs +2 -0
  46. package/esm2022/app/reports/interfaces/report.interface.mjs +1 -1
  47. package/esm2022/app/reports/option-builder.mjs +230 -17
  48. package/esm2022/app/reports/pipes/report-date.pipe.mjs +21 -0
  49. package/esm2022/app/reports/report-filter-items.mjs +42 -10
  50. package/esm2022/app/reports/report-url-state.mjs +144 -0
  51. package/esm2022/app/reports/services/report-filter-state.service.mjs +308 -64
  52. package/esm2022/app/reports/text.mjs +2 -2
  53. package/esm2022/app/reports/theme/echarts.mjs +6 -5
  54. package/esm2022/app/reports/theme/palette.mjs +9 -1
  55. package/esm2022/app/reports/theme/typography.mjs +6 -0
  56. package/esm2022/app/reports/views/report/fs-ai-report.component.mjs +191 -90
  57. package/esm2022/app/reports/views/report/report.component.mjs +64 -62
  58. package/fesm2022/{firestitch-report-echarts-CFkoNvo_.mjs → firestitch-report-echarts-B9nl9XKM.mjs} +6 -6
  59. package/fesm2022/firestitch-report-echarts-B9nl9XKM.mjs.map +1 -0
  60. package/fesm2022/{firestitch-report-firestitch-report-PZzkYYTD.mjs → firestitch-report-firestitch-report-Bb65HEYB.mjs} +2348 -1161
  61. package/fesm2022/firestitch-report-firestitch-report-Bb65HEYB.mjs.map +1 -0
  62. package/fesm2022/firestitch-report.mjs +1 -1
  63. package/package.json +1 -1
  64. package/app/reports/dialogs/report-settings/report-settings-default.d.ts +0 -2
  65. package/esm2022/app/reports/dialogs/report-settings/report-settings-default.mjs +0 -22
  66. package/fesm2022/firestitch-report-echarts-CFkoNvo_.mjs.map +0 -1
  67. package/fesm2022/firestitch-report-firestitch-report-PZzkYYTD.mjs.map +0 -1
@@ -1,11 +1,10 @@
1
1
  import { OnInit } from '@angular/core';
2
2
  import { FsListComponent, FsListConfig } from '@firestitch/list';
3
- import { ReportComponent, ReportFilterGroup } from '../../interfaces/report.interface';
3
+ import { ReportComponent } from '../../interfaces/report.interface';
4
4
  import * as i0 from "@angular/core";
5
5
  export declare class ComponentListComponent implements OnInit {
6
6
  reportId: number;
7
7
  component: ReportComponent;
8
- groups: Map<number, ReportFilterGroup>;
9
8
  listComponent: FsListComponent;
10
9
  listConfig: FsListConfig;
11
10
  columns: import("@angular/core").WritableSignal<{
@@ -15,17 +14,15 @@ export declare class ComponentListComponent implements OnInit {
15
14
  }[]>;
16
15
  pivoted: import("@angular/core").WritableSignal<boolean>;
17
16
  truncated: import("@angular/core").WritableSignal<boolean>;
17
+ readonly timezone: import("@angular/core").WritableSignal<string>;
18
18
  private _reportData;
19
19
  private _filterState;
20
20
  private _destroyRef;
21
21
  ngOnInit(): void;
22
22
  private _initListConfig;
23
- private _ownFilters;
24
- private _filterItem;
25
23
  private _fetch;
26
24
  private _pivotColumns;
27
25
  private _spansMultipleYears;
28
- private _barValues;
29
26
  static ɵfac: i0.ɵɵFactoryDeclaration<ComponentListComponent, never>;
30
- static ɵcmp: i0.ɵɵComponentDeclaration<ComponentListComponent, "app-report-component-list", never, { "reportId": { "alias": "reportId"; "required": false; }; "component": { "alias": "component"; "required": false; }; "groups": { "alias": "groups"; "required": false; }; }, {}, never, never, true, never>;
27
+ static ɵcmp: i0.ɵɵComponentDeclaration<ComponentListComponent, "app-report-component-list", never, { "reportId": { "alias": "reportId"; "required": false; }; "component": { "alias": "component"; "required": false; }; }, {}, never, never, true, never>;
31
28
  }
@@ -40,16 +40,16 @@ export declare class ReportCanvasComponent implements OnChanges, AfterViewInit {
40
40
  private _guides;
41
41
  readonly PX = 96;
42
42
  readonly flowPadding = 0.25;
43
- activePageIndex: number;
44
- zoom: number;
43
+ readonly pages: import("@angular/core").WritableSignal<ReportPage[]>;
44
+ readonly activePageIndex: import("@angular/core").WritableSignal<number>;
45
+ readonly zoom: import("@angular/core").WritableSignal<number>;
45
46
  readonly masterMode: import("@angular/core").WritableSignal<boolean>;
46
47
  groups: Map<number, ReportFilterGroup>;
47
- selectedComponentId: number | null;
48
+ readonly selectedComponentId: import("@angular/core").WritableSignal<number>;
48
49
  readonly snapper: CanvasSnapper;
49
50
  private _reportData;
50
51
  private _prompt;
51
52
  private _message;
52
- private _cdRef;
53
53
  private _destroyRef;
54
54
  private _fitted;
55
55
  private _tokens;
@@ -31,18 +31,18 @@ export declare class ReportComponentComponent implements OnInit, OnChanges {
31
31
  readonly textEditing: import("@angular/core").WritableSignal<boolean>;
32
32
  chartComponent: ComponentChartComponent;
33
33
  get resizeHandles(): readonly Handle[];
34
- filterConfig: FilterConfig;
35
- data: ComponentData | null;
36
- loading: boolean;
37
- error: string | null;
34
+ readonly filterConfig: import("@angular/core").WritableSignal<FilterConfig>;
35
+ readonly data: import("@angular/core").WritableSignal<ComponentData>;
36
+ readonly loading: import("@angular/core").WritableSignal<boolean>;
37
+ readonly error: import("@angular/core").WritableSignal<string>;
38
38
  private _refresh$;
39
39
  private _reportData;
40
40
  private _filterState;
41
41
  private _process;
42
+ private _message;
42
43
  private _prompt;
43
44
  private _lastPress;
44
45
  private _destroyRef;
45
- private _cdRef;
46
46
  private _zone;
47
47
  private _host;
48
48
  ngOnInit(): void;
@@ -1,6 +1,6 @@
1
- import { EventEmitter, OnInit } from '@angular/core';
1
+ import { EventEmitter } from '@angular/core';
2
2
  import * as i0 from "@angular/core";
3
- export declare class TimezoneSelectComponent implements OnInit {
3
+ export declare class TimezoneSelectComponent {
4
4
  placeholder: string;
5
5
  required: boolean;
6
6
  disabled: boolean;
@@ -8,10 +8,8 @@ export declare class TimezoneSelectComponent implements OnInit {
8
8
  set timezone(value: string);
9
9
  get timezone(): string;
10
10
  guid: string;
11
- timezones: string[];
12
- private _browserTimezone;
13
- private _timezone;
14
- ngOnInit(): void;
11
+ readonly timezones: import("@angular/core").Signal<string[]>;
12
+ private readonly _timezone;
15
13
  private _supportedTimezones;
16
14
  static ɵfac: i0.ɵɵFactoryDeclaration<TimezoneSelectComponent, never>;
17
15
  static ɵcmp: i0.ɵɵComponentDeclaration<TimezoneSelectComponent, "fs-ai-report-timezone-select", never, { "placeholder": { "alias": "placeholder"; "required": false; }; "required": { "alias": "required"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "timezone": { "alias": "timezone"; "required": false; }; }, { "timezoneChange": "timezoneChange"; }, never, never, true, never>;
@@ -0,0 +1,2 @@
1
+ import { Day } from 'date-fns';
2
+ export declare const REPORT_WEEK_STARTS_ON: Day;
@@ -0,0 +1,12 @@
1
+ import { FsAiChatData } from '@firestitch/ai';
2
+ import * as i0 from "@angular/core";
3
+ type ChatStreamBody = Parameters<FsAiChatData['chatStream']>[1];
4
+ type ChatStreamConfig = Parameters<FsAiChatData['chatStream']>[2];
5
+ type ChatStream = ReturnType<FsAiChatData['chatStream']>;
6
+ export declare class ReportAiChatData extends FsAiChatData {
7
+ turnData: () => Record<string, unknown>;
8
+ chatStream(basePath: string, body: ChatStreamBody, config?: ChatStreamConfig): ChatStream;
9
+ static ɵfac: i0.ɵɵFactoryDeclaration<ReportAiChatData, never>;
10
+ static ɵprov: i0.ɵɵInjectableDeclaration<ReportAiChatData>;
11
+ }
12
+ export {};
@@ -1,6 +1,6 @@
1
1
  import { RequestConfig } from '@firestitch/api';
2
2
  import { Observable } from 'rxjs';
3
- import { ComponentDataState, FilterGroupDefault, ReportComponentSql, ReportFilterLevel, ReportTree, ResolvedFilterValue } from '../interfaces/report.interface';
3
+ import { ChartGranularity, ComponentDataState, ComponentExportResponse, FilterGroupDefault, ReportComponentSql, ReportFilterLevel, ReportTree, ResolvedFilterValue } from '../interfaces/report.interface';
4
4
  import * as i0 from "@angular/core";
5
5
  export declare class ReportData<T = any> {
6
6
  private _api;
@@ -50,8 +50,8 @@ export declare class ReportData<T = any> {
50
50
  order: number;
51
51
  }>)[], config?: RequestConfig): Observable<T>;
52
52
  componentData(reportId: number, componentId: number, filters?: ResolvedFilterValue[], state?: ComponentDataState, isExport?: boolean, config?: RequestConfig): Observable<T>;
53
- exportComponent(reportId: number, componentId: number, filters?: ResolvedFilterValue[], state?: ComponentDataState, config?: RequestConfig): Observable<T>;
54
- exportReport(reportId: number, filters?: ResolvedFilterValue[], pageId?: number | null, config?: RequestConfig): Observable<T>;
53
+ exportComponent(reportId: number, componentId: number, filters?: ResolvedFilterValue[], state?: ComponentDataState, config?: RequestConfig): Observable<ComponentExportResponse>;
54
+ exportReport(reportId: number, filters?: ResolvedFilterValue[], pageId?: number | null, frequency?: ChartGranularity | null, filterSummary?: string[], config?: RequestConfig): Observable<T>;
55
55
  filterOptions(reportId: number, filterId: number, config?: RequestConfig): Observable<T>;
56
56
  componentSql(reportId: number, componentId: number, config?: RequestConfig): Observable<ReportComponentSql>;
57
57
  componentColumns(reportId: number, componentId: number, config?: RequestConfig): Observable<T>;
@@ -24,11 +24,12 @@ export declare class ComponentSettingsComponent implements OnInit {
24
24
  paddingBottom: number | string;
25
25
  paddingLeft: number | string;
26
26
  configJson: string;
27
- sql: string | null;
28
- sqlBaseline: boolean;
29
- sqlError: string | null;
30
- rows: FilterRow[];
31
- columnsError: string | null;
27
+ readonly sql: import("@angular/core").WritableSignal<string>;
28
+ readonly sqlBaseline: import("@angular/core").WritableSignal<boolean>;
29
+ readonly sqlTimezone: import("@angular/core").WritableSignal<string>;
30
+ readonly sqlError: import("@angular/core").WritableSignal<string>;
31
+ readonly rows: import("@angular/core").WritableSignal<FilterRow[]>;
32
+ readonly columnsError: import("@angular/core").WritableSignal<string>;
32
33
  private _filterableColumns;
33
34
  private _filters;
34
35
  private _groupsById;
@@ -39,7 +40,6 @@ export declare class ComponentSettingsComponent implements OnInit {
39
40
  private readonly _message;
40
41
  private readonly _prompt;
41
42
  private readonly _destroyRef;
42
- private readonly _cdRef;
43
43
  ngOnInit(): void;
44
44
  typeLabel(type: ReportFilterType): string;
45
45
  delete(): void;
@@ -15,9 +15,11 @@ export declare class SemanticDatabaseComponent {
15
15
  private static readonly PENDING_COLOR;
16
16
  private static readonly NAME_SUFFIX;
17
17
  readonly status: import("@angular/core").WritableSignal<SemanticBuildStatus>;
18
+ readonly statusError: import("@angular/core").WritableSignal<boolean>;
18
19
  readonly filter: import("@angular/core").WritableSignal<string>;
19
20
  readonly building: import("@angular/core").WritableSignal<boolean>;
20
21
  readonly buildActive: import("@angular/core").Signal<boolean>;
22
+ readonly rebuild: import("@angular/core").Signal<boolean>;
21
23
  readonly buildStateLabel: import("@angular/core").Signal<string>;
22
24
  readonly buildComplete: import("@angular/core").Signal<boolean>;
23
25
  readonly incompleteEntityCount: import("@angular/core").Signal<number>;
@@ -86,6 +88,7 @@ export declare class SemanticDatabaseComponent {
86
88
  */
87
89
  private _displayName;
88
90
  private _refreshStatus;
91
+ private _loadStatus;
89
92
  static ɵfac: i0.ɵɵFactoryDeclaration<SemanticDatabaseComponent, never>;
90
93
  static ɵcmp: i0.ɵɵComponentDeclaration<SemanticDatabaseComponent, "fs-ai-report-global-settings-semantic-database", never, {}, {}, never, never, true, never>;
91
94
  }
@@ -1,6 +1,7 @@
1
1
  import { OnInit } from '@angular/core';
2
2
  import { Observable } from 'rxjs';
3
3
  import { ReportFilterGroup } from '../../interfaces/report.interface';
4
+ import { relativeLabel } from '../../report-filter-items';
4
5
  import * as i0 from "@angular/core";
5
6
  export interface ReportSettingsResult {
6
7
  action: 'saved' | 'deleted';
@@ -10,6 +11,7 @@ interface FilterDefaultRow {
10
11
  label: string;
11
12
  start: Date | null;
12
13
  end: Date | null;
14
+ relative: string | null;
13
15
  values: {
14
16
  name: string;
15
17
  value: unknown;
@@ -34,6 +36,7 @@ export declare class ReportSettingsComponent implements OnInit {
34
36
  timezone: string;
35
37
  headingSize: number;
36
38
  readonly filterRows: import("@angular/core").WritableSignal<FilterDefaultRow[]>;
39
+ readonly relativeLabel: typeof relativeLabel;
37
40
  private readonly _data;
38
41
  private readonly _dialogRef;
39
42
  private readonly _reportData;
@@ -43,7 +46,9 @@ export declare class ReportSettingsComponent implements OnInit {
43
46
  ngOnInit(): void;
44
47
  delete(): void;
45
48
  save: () => Observable<[any, ...any[]]>;
49
+ clearRelative(row: FilterDefaultRow): void;
46
50
  private _pageDimension;
51
+ private _timezoneSetting;
47
52
  private _buildFilterRows;
48
53
  private _rowDefault;
49
54
  private _defaultChanged;
@@ -13,16 +13,28 @@ export interface CollectedReport {
13
13
  report: Report;
14
14
  pages: CollectedPage[];
15
15
  filterSummary: string[];
16
+ contextLines: string[];
17
+ }
18
+ export interface ExportListColumn {
19
+ column: string;
20
+ label?: string;
21
+ format?: string;
16
22
  }
17
23
  export declare function emptyLabel(item: CollectedComponent): string;
18
24
  export declare function isFailed(item: CollectedComponent): boolean;
25
+ export declare function coverLines(collected: CollectedReport): string[];
26
+ export declare function exportCell(value: unknown, columnFormat: string | undefined, timezone: string): string;
27
+ export declare function listColumns(component: ReportComponent, data: ComponentData): ExportListColumn[];
28
+ export declare function listHeadings(component: ReportComponent, data: ComponentData): string[];
29
+ export declare function moreRowsNotice(remaining: number): string;
19
30
  export declare function failedPageNames(collected: CollectedReport): string[];
20
31
  export declare class ReportExportCollectorService {
21
32
  private _reportData;
22
33
  private _filterState;
23
- collect(report: Report): Observable<CollectedReport>;
34
+ collect(report: Report, listRows: number): Observable<CollectedReport>;
35
+ getFilterSummary(report: Report): Observable<string[]>;
24
36
  private _componentData;
25
- private _filterSummary;
37
+ private _contextLines;
26
38
  private _selectLine;
27
39
  private _date;
28
40
  static ɵfac: i0.ɵɵFactoryDeclaration<ReportExportCollectorService, never>;
@@ -1,7 +1,11 @@
1
1
  import { CollectedReport } from './report-export-collector.service';
2
2
  import * as i0 from "@angular/core";
3
+ export declare const PDF_LIST_ROWS = 500;
3
4
  export declare class ReportPdfService {
4
5
  export(collected: CollectedReport): Promise<void>;
6
+ private _context;
7
+ private _renderPage;
8
+ private _renderMaster;
5
9
  private _titlePage;
6
10
  private _renderText;
7
11
  private _wrap;
@@ -11,9 +15,18 @@ export declare class ReportPdfService {
11
15
  private _alignOffset;
12
16
  private _tokens;
13
17
  private _renderComponent;
18
+ private _componentTitle;
19
+ private _boxNote;
14
20
  private _renderTable;
21
+ private _tableCells;
22
+ private _tableOptions;
23
+ private _noticeRow;
24
+ private _measure;
25
+ private _drawTable;
26
+ private _renderContinuation;
27
+ private _continuationMargin;
28
+ private _continuedTitle;
15
29
  private _renderKpi;
16
- private _cell;
17
30
  private _slug;
18
31
  static ɵfac: i0.ɵɵFactoryDeclaration<ReportPdfService, never>;
19
32
  static ɵprov: i0.ɵɵInjectableDeclaration<ReportPdfService>;
@@ -1,5 +1,6 @@
1
1
  import { CollectedReport } from './report-export-collector.service';
2
2
  import * as i0 from "@angular/core";
3
+ export declare const PPTX_LIST_ROWS = 100;
3
4
  export declare class ReportPptxService {
4
5
  export(collected: CollectedReport): Promise<void>;
5
6
  private _titleSlide;
@@ -7,10 +8,14 @@ export declare class ReportPptxService {
7
8
  private _tokens;
8
9
  private _renderComponent;
9
10
  private _renderChart;
11
+ private _categoryOrderOptions;
10
12
  private _addChart;
13
+ private _renderWaterfall;
14
+ private _waterfallSeries;
15
+ private _categoryLabels;
16
+ private _axisTextOptions;
11
17
  private _renderTable;
12
18
  private _renderKpi;
13
- private _cell;
14
19
  private _slug;
15
20
  static ɵfac: i0.ɵɵFactoryDeclaration<ReportPptxService, never>;
16
21
  static ɵprov: i0.ɵɵInjectableDeclaration<ReportPptxService>;
@@ -1 +1,8 @@
1
+ import { Report } from './interfaces/report.interface';
1
2
  export declare function formatMeasureValue(value: unknown, format?: string, precision?: number): string;
3
+ export declare const AXIS_SEPARATOR_THRESHOLD = 1000;
4
+ export declare function chartAxisFormatCode(series: (number | null)[][], stacked: boolean): string;
5
+ export declare function resolveReportTimezone(report: Pick<Report, 'effectiveTimezone'>): string;
6
+ export declare function formatReportDate(value: unknown, timezone: string): string;
7
+ export declare function getTimezoneLabel(timezone: string): string;
8
+ export declare function getZonedNow(timezone: string): Date;
@@ -0,0 +1,7 @@
1
+ export interface ReportChatViewerFilter {
2
+ groupId: number;
3
+ start?: string;
4
+ end?: string;
5
+ values?: unknown[];
6
+ value?: string;
7
+ }
@@ -0,0 +1,7 @@
1
+ import { ReportChatViewerFilter } from './report-chat-viewer-filter.interface';
2
+ import { ChartGranularity } from './report.interface';
3
+ export interface ReportChatViewerState {
4
+ granularity: ChartGranularity | null;
5
+ selectedComponentId: number | null;
6
+ filters: ReportChatViewerFilter[];
7
+ }
@@ -4,6 +4,7 @@ export interface Report {
4
4
  name: string;
5
5
  layout: ReportLayout;
6
6
  timezone: string | null;
7
+ effectiveTimezone?: string;
7
8
  config: ReportConfig;
8
9
  pageWidth: number;
9
10
  pageHeight: number;
@@ -67,6 +68,7 @@ export interface ReportComponentSql {
67
68
  sql: string | null;
68
69
  origin: 'sql' | 'dbq' | 'derived';
69
70
  baseline: boolean;
71
+ timezone?: string;
70
72
  error: string | null;
71
73
  errorType: string | null;
72
74
  }
@@ -87,8 +89,9 @@ export declare const GRANULARITY_OPTIONS: {
87
89
  name: string;
88
90
  }[];
89
91
  export type AxisChartType = 'bar' | 'line' | 'area';
92
+ export type WaterfallStepKind = 'rise' | 'fall' | 'total';
90
93
  export interface ChartConfig {
91
- chartType?: AxisChartType | 'pie' | 'donut';
94
+ chartType?: AxisChartType | 'waterfall' | 'pie' | 'donut';
92
95
  xAxis?: {
93
96
  column: string;
94
97
  kind?: 'category' | 'time';
@@ -98,7 +101,6 @@ export interface ChartConfig {
98
101
  measures?: ChartMeasure[];
99
102
  splitBy?: {
100
103
  column: string;
101
- label?: string;
102
104
  };
103
105
  colorBy?: {
104
106
  column: string;
@@ -131,7 +133,6 @@ export interface ListConfig {
131
133
  };
132
134
  pivotBy?: {
133
135
  column: string;
134
- label?: string;
135
136
  };
136
137
  sort?: ReportSort;
137
138
  pageSize?: number;
@@ -186,6 +187,17 @@ export interface FilterGroupValue {
186
187
  end?: Date | string | null;
187
188
  values?: unknown[];
188
189
  value?: string;
190
+ preset?: string;
191
+ }
192
+ export interface ReportUrlParams {
193
+ groups: Map<number, string>;
194
+ listSorts: Map<number, string>;
195
+ groupBy: string | null;
196
+ }
197
+ export interface ReportUrlSnapshot {
198
+ groups: Map<number, FilterGroupValue | null>;
199
+ listSorts: Map<number, ReportSort>;
200
+ frequency: ChartGranularity | null;
189
201
  }
190
202
  export interface ResolvedFilterValue {
191
203
  filterId: number;
@@ -211,6 +223,10 @@ export interface ComponentData {
211
223
  truncated: boolean;
212
224
  granularity?: ChartGranularity | null;
213
225
  }
226
+ export interface ComponentExportResponse {
227
+ url: string;
228
+ notes?: string[];
229
+ }
214
230
  export interface ReportListItem {
215
231
  id: number;
216
232
  name: string;
@@ -1,5 +1,5 @@
1
1
  import type { EChartsOption } from 'echarts';
2
- import { AxisChartType, ChartConfig, ChartGranularity, ComponentData, LegendPosition, ReportComponent } from './interfaces/report.interface';
2
+ import { AxisChartType, ChartConfig, ChartGranularity, ComponentData, LegendPosition, ReportComponent, WaterfallStepKind } from './interfaces/report.interface';
3
3
  export declare function isColorBy(config: ChartConfig): boolean;
4
4
  export declare function colorByColumn(config: ChartConfig): string | undefined;
5
5
  export interface ExtractedChartSeries {
@@ -12,6 +12,18 @@ export interface ExtractedChartSeries {
12
12
  }
13
13
  export declare function extractChartSeries(component: ReportComponent, data: ComponentData): ExtractedChartSeries;
14
14
  export declare function seriesTypes(extracted: ExtractedChartSeries, chartType: AxisChartType): AxisChartType[];
15
+ export interface WaterfallStep {
16
+ category: string;
17
+ start: number;
18
+ change: number | null;
19
+ kind: WaterfallStepKind;
20
+ }
21
+ export interface ExtractedWaterfall {
22
+ name: string;
23
+ steps: WaterfallStep[];
24
+ }
25
+ export declare const WATERFALL_TOTAL_LABEL = "Total";
26
+ export declare function extractWaterfall(component: ReportComponent, data: ComponentData): ExtractedWaterfall;
15
27
  export declare function buildChartOption(component: ReportComponent, data: ComponentData): EChartsOption;
16
28
  export declare function resolveLegendPosition(config: ChartConfig, seriesCount: number, colorBy?: boolean): LegendPosition;
17
29
  export declare function spansMultipleYears(categories: string[]): boolean;
@@ -0,0 +1,7 @@
1
+ import { PipeTransform } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ export declare class ReportDatePipe implements PipeTransform {
4
+ transform(value: unknown, timezone: string): string;
5
+ static ɵfac: i0.ɵɵFactoryDeclaration<ReportDatePipe, never>;
6
+ static ɵpipe: i0.ɵɵPipeDeclaration<ReportDatePipe, "fsReportDate", true>;
7
+ }
@@ -4,6 +4,11 @@ import { ReportData } from './data/report.data';
4
4
  import { ChartGranularity, FilterGroupValue, Report, ReportFilterGroup } from './interfaces/report.interface';
5
5
  export declare function dateBoundString(value: Date | string | null | undefined): string | undefined;
6
6
  export declare function dateBoundLabel(value: Date | string | null | undefined): string | null;
7
+ export declare function dateFromBound(value: string | null | undefined): Date | null;
8
+ export declare function dateToBound(value: Date | null | undefined): string | null;
9
+ 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;
7
12
  export declare const GROUP_BY_ITEM = "groupBy";
8
13
  export declare function loadGroupOptions(group: ReportFilterGroup, reportData: ReportData, reportId: number): Observable<{
9
14
  name: string;
@@ -0,0 +1,14 @@
1
+ import { ParamMap, Params } from '@angular/router';
2
+ import { FilterGroupValue, ReportFilterType, ReportSort, ReportUrlParams, ReportUrlSnapshot } from './interfaces/report.interface';
3
+ export declare const LIST_SORT_PARAM_PREFIX = "s";
4
+ export declare const DATE_RANGE_SEPARATOR = "..";
5
+ export declare const OWNED_PARAM: RegExp;
6
+ export declare function readReportUrlParams(params: ParamMap): ReportUrlParams;
7
+ export declare function decodeFilterValue(type: ReportFilterType, raw: string, resolveRelative: (name: string) => {
8
+ start: Date;
9
+ end: Date;
10
+ } | null): FilterGroupValue | null | undefined;
11
+ export declare function encodeFilterValue(value: FilterGroupValue | null): string;
12
+ export declare function encodeSort(sort: ReportSort): string;
13
+ export declare function decodeSort(raw: string): ReportSort | null;
14
+ export declare function buildReportUrlParams(snapshot: ReportUrlSnapshot, current: ParamMap): Params;
@@ -1,26 +1,48 @@
1
1
  import { Observable } from 'rxjs';
2
- import { ChartGranularity, FilterGroupDefault, FilterGroupValue, Report, ReportComponent, ReportFilterGroup, ResolvedFilterValue } from '../interfaces/report.interface';
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
4
  import * as i0 from "@angular/core";
4
5
  export declare function sameDefault(a: FilterGroupDefault | null, b: FilterGroupDefault | null): boolean;
5
6
  export declare function defaultSignature(group: ReportFilterGroup): string;
6
7
  export declare class ReportFilterStateService {
8
+ readonly timezone: import("@angular/core").WritableSignal<string>;
7
9
  private _values;
8
10
  private _groups;
9
11
  private _sessionDisabled;
12
+ private _cleared;
10
13
  private _frequency;
11
14
  private _frequencyChanged$;
15
+ private _listSorts;
12
16
  private _changed$;
13
- init(report: Report): void;
17
+ private _urlChanged$;
18
+ init(report: Report, restore?: ReportUrlParams | null): void;
14
19
  value(groupId: number): FilterGroupValue | undefined;
15
20
  setValue(groupId: number, value: FilterGroupValue | null): void;
21
+ resolveRelative(name: string): {
22
+ start: Date;
23
+ end: Date;
24
+ } | null;
16
25
  frequency(): ChartGranularity | null;
17
26
  setFrequency(frequency: ChartGranularity | null): void;
18
27
  frequencyChanges(): Observable<void>;
28
+ listSort(componentId: number): ReportSort | null;
29
+ setListSort(componentId: number, sort: ReportSort | null): void;
30
+ urlChanges(): Observable<void>;
31
+ urlSnapshot(report: Report): ReportUrlSnapshot;
19
32
  isFilterDisabled(filterId: number): boolean;
20
33
  toggleFilter(filterId: number, groupId: number): void;
21
34
  changesFor(component: ReportComponent): Observable<number | null>;
22
35
  resolveForComponent(component: ReportComponent): ResolvedFilterValue[];
36
+ viewerFilters(): ReportChatViewerFilter[];
23
37
  resolveForReport(report: Report, pageId?: number | null): ResolvedFilterValue[];
38
+ private _resolvedFields;
39
+ private _seed;
40
+ private _restore;
41
+ private _prune;
42
+ private _withPreset;
43
+ private _isDefault;
44
+ private _listComponents;
45
+ private _sortableColumns;
24
46
  private _defaultValue;
25
47
  private _relativeRange;
26
48
  static ɵfac: i0.ɵɵFactoryDeclaration<ReportFilterStateService, never>;
@@ -27,3 +27,4 @@ export interface TextParagraph {
27
27
  export declare function fillTextTokens(html: string, context: TextTokenContext): string;
28
28
  export declare function textParagraphs(html: string, context: TextTokenContext): TextParagraph[];
29
29
  export declare function textPlain(html: string, context: TextTokenContext): string;
30
+ export declare function escapeHtml(value: string): string;
@@ -1,2 +1,4 @@
1
+ import { WaterfallStepKind } from '../interfaces/report.interface';
1
2
  export declare const REPORT_CHART_COLORS: string[];
2
3
  export declare const REPORT_CHART_COLORS_CSS: string[];
4
+ export declare const REPORT_WATERFALL_COLORS: Record<WaterfallStepKind, string>;
@@ -0,0 +1,2 @@
1
+ export declare const REPORT_CHART_FONT_FAMILY = "Roboto, \"Helvetica Neue\", sans-serif";
2
+ export declare const REPORT_AXIS_LABEL_FONT_SIZE = 11;
@@ -6,28 +6,36 @@ 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>;
9
10
  readonly deleted: import("@angular/core").OutputEmitterRef<number>;
10
11
  readonly renamed: import("@angular/core").OutputEmitterRef<Report>;
11
12
  readonly pageChanged: import("@angular/core").OutputEmitterRef<number>;
12
- report: Report | null;
13
- editMode: boolean;
14
- pageId: number | null;
13
+ readonly report: import("@angular/core").WritableSignal<Report>;
14
+ readonly editMode: import("@angular/core").WritableSignal<boolean>;
15
+ readonly timezoneLabel: import("@angular/core").Signal<string>;
16
+ readonly pageId: import("@angular/core").WritableSignal<number>;
15
17
  readonly chatPageId: import("@angular/core").WritableSignal<number>;
16
18
  readonly chatRequestData: import("@angular/core").Signal<Record<string, unknown>>;
17
- reportFilterConfig: FilterConfig;
19
+ readonly reportFilterConfig: import("@angular/core").WritableSignal<FilterConfig>;
20
+ readonly reportHasFilters: import("@angular/core").Signal<boolean>;
21
+ readonly reportFilterKey: import("@angular/core").Signal<string>;
18
22
  private _split;
19
23
  private _chatPanel;
20
24
  private _canvas?;
21
25
  private _reportData;
26
+ private _reportAiChatData;
22
27
  private _router;
23
28
  private _route;
24
29
  private _filterState;
25
30
  private _exportService;
31
+ private _collector;
26
32
  private _process;
27
33
  private _dialog;
28
34
  private _destroyRef;
29
- private _cdRef;
30
35
  private _zone;
36
+ private _restoredReportId;
37
+ private _pageReported;
38
+ private _pageWrite$;
31
39
  constructor();
32
40
  toggleEditMode(): void;
33
41
  get isMasterMode(): boolean;
@@ -42,14 +50,14 @@ export declare class FsAiReportComponent {
42
50
  exportData(thisPage?: boolean): void;
43
51
  onChatResponse(response: FsAiChatResponse): void;
44
52
  onResizeStart(event: PointerEvent): void;
53
+ private _chatViewerState;
45
54
  private _resizeTo;
46
55
  private _pageIdFromUrl;
56
+ private _writeUrl;
47
57
  private _loadReport;
48
58
  private _reportGroups;
49
- get reportHasFilters(): boolean;
50
- get reportFilterKey(): string;
51
59
  private _buildReportConfig;
52
60
  private _groupByItem;
53
61
  static ɵfac: i0.ɵɵFactoryDeclaration<FsAiReportComponent, never>;
54
- 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>;
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; }; "urlState": { "alias": "urlState"; "required": false; "isSignal": true; }; }, { "deleted": "deleted"; "renamed": "renamed"; "pageChanged": "pageChanged"; }, never, never, true, never>;
55
63
  }
@@ -3,11 +3,11 @@ import { FsAiChatResponse } from '@firestitch/ai';
3
3
  import { Report, ReportComponent as ReportComponentModel, ReportListItem } from '../../interfaces/report.interface';
4
4
  import * as i0 from "@angular/core";
5
5
  export declare class ReportComponent {
6
- selected: ReportListItem | null;
7
- report: Report | null;
8
- loadingReports: boolean;
9
- editMode: boolean;
10
- reportFilterConfig: FilterConfig;
6
+ readonly selected: import("@angular/core").WritableSignal<ReportListItem>;
7
+ readonly report: import("@angular/core").WritableSignal<Report>;
8
+ readonly loadingReports: import("@angular/core").WritableSignal<boolean>;
9
+ readonly editMode: import("@angular/core").WritableSignal<boolean>;
10
+ readonly reportFilterConfig: import("@angular/core").WritableSignal<FilterConfig>;
11
11
  private _split;
12
12
  private _chatPanel;
13
13
  private _canvas?;
@@ -18,11 +18,11 @@ export declare class ReportComponent {
18
18
  private _reportService;
19
19
  private _filterState;
20
20
  private _exportService;
21
+ private _collector;
21
22
  private _process;
22
23
  private _prompt;
23
24
  private _dialog;
24
25
  private _destroyRef;
25
- private _cdRef;
26
26
  private _zone;
27
27
  constructor();
28
28
  fetchReports: (keyword: string) => import("rxjs").Observable<ReportListItem[]>;