@firestitch/report 18.8.0 → 18.9.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 (52) hide show
  1. package/app/reports/components/component-text/component-text.component.d.ts +47 -2
  2. package/app/reports/components/component-text/value-embed.plugin.d.ts +67 -0
  3. package/app/reports/components/report-canvas/report-canvas.component.d.ts +34 -9
  4. package/app/reports/components/report-component/report-component.component.d.ts +10 -1
  5. package/app/reports/data/report.data.d.ts +2 -1
  6. package/app/reports/dialogs/component-settings/component-settings.component.d.ts +8 -0
  7. package/app/reports/enums/report-value-formula.enum.d.ts +6 -0
  8. package/app/reports/export/report-export-collector.service.d.ts +24 -0
  9. package/app/reports/export/report-export.service.d.ts +3 -1
  10. package/app/reports/export/report-pdf.service.d.ts +18 -2
  11. package/app/reports/export/report-pptx.service.d.ts +15 -2
  12. package/app/reports/export/report-text-layout.service.d.ts +35 -0
  13. package/app/reports/format.d.ts +5 -1
  14. package/app/reports/interfaces/report.interface.d.ts +22 -3
  15. package/app/reports/layout.d.ts +2 -0
  16. package/app/reports/services/report-filter-state.service.d.ts +1 -1
  17. package/app/reports/text.d.ts +50 -0
  18. package/app/reports/theme/palette.d.ts +2 -0
  19. package/app/reports/values.d.ts +17 -0
  20. package/esm2022/app/reports/components/component-text/component-text.component.mjs +213 -16
  21. package/esm2022/app/reports/components/component-text/value-embed.plugin.mjs +484 -0
  22. package/esm2022/app/reports/components/report-canvas/report-canvas.component.mjs +260 -34
  23. package/esm2022/app/reports/components/report-component/report-component.component.mjs +65 -19
  24. package/esm2022/app/reports/data/report.data.mjs +19 -1
  25. package/esm2022/app/reports/dialogs/component-settings/component-settings.component.mjs +134 -23
  26. package/esm2022/app/reports/enums/report-value-formula.enum.mjs +14 -0
  27. package/esm2022/app/reports/export/report-export-collector.service.mjs +170 -44
  28. package/esm2022/app/reports/export/report-export.service.mjs +57 -19
  29. package/esm2022/app/reports/export/report-pdf.service.mjs +339 -96
  30. package/esm2022/app/reports/export/report-pptx.service.mjs +316 -88
  31. package/esm2022/app/reports/export/report-text-layout.service.mjs +241 -0
  32. package/esm2022/app/reports/format.mjs +41 -10
  33. package/esm2022/app/reports/interfaces/report.interface.mjs +1 -1
  34. package/esm2022/app/reports/kpi-card.mjs +19 -6
  35. package/esm2022/app/reports/layout.mjs +11 -1
  36. package/esm2022/app/reports/option-builder.mjs +18 -5
  37. package/esm2022/app/reports/output-notes.mjs +57 -11
  38. package/esm2022/app/reports/services/report-filter-state.service.mjs +19 -10
  39. package/esm2022/app/reports/text.mjs +293 -85
  40. package/esm2022/app/reports/theme/palette.mjs +7 -2
  41. package/esm2022/app/reports/values.mjs +183 -0
  42. package/esm2022/app/reports/views/report/fs-ai-report.component.mjs +4 -1
  43. package/esm2022/app/reports/views/report/report.component.mjs +4 -1
  44. package/esm2022/public_api.mjs +2 -1
  45. package/fesm2022/{firestitch-report-echarts-qCBE3LqM.mjs → firestitch-report-echarts-DBMOHmBF.mjs} +2 -2
  46. package/fesm2022/{firestitch-report-echarts-qCBE3LqM.mjs.map → firestitch-report-echarts-DBMOHmBF.mjs.map} +1 -1
  47. package/fesm2022/{firestitch-report-firestitch-report-DbsWbE-j.mjs → firestitch-report-firestitch-report-CqbXT1gh.mjs} +3492 -1028
  48. package/fesm2022/firestitch-report-firestitch-report-CqbXT1gh.mjs.map +1 -0
  49. package/fesm2022/firestitch-report.mjs +1 -1
  50. package/package.json +1 -1
  51. package/public_api.d.ts +1 -0
  52. package/fesm2022/firestitch-report-firestitch-report-DbsWbE-j.mjs.map +0 -1
@@ -1,13 +1,36 @@
1
1
  import { SafeHtml } from '@angular/platform-browser';
2
2
  import { FsHtmlEditorConfig } from '@firestitch/html-editor';
3
- import { TextTokenContext } from '../../text';
3
+ import { FsPopoverRef } from '@firestitch/popover';
4
+ import { TextTokenContext, TextValue } from '../../text';
5
+ import { ValueEmbedBlock, ValueEmbedPlugin } from './value-embed.plugin';
4
6
  import * as i0 from "@angular/core";
7
+ type TextNotice = {
8
+ kind: 'blocked';
9
+ block: ValueEmbedBlock;
10
+ } | {
11
+ kind: 'unused';
12
+ count: number;
13
+ undo: () => void;
14
+ } | {
15
+ kind: 'message';
16
+ text: string;
17
+ };
18
+ interface ValuePopoverAnchor {
19
+ key: string;
20
+ chip: HTMLElement;
21
+ left: number;
22
+ top: number;
23
+ width: number;
24
+ height: number;
25
+ }
5
26
  export declare class ComponentTextComponent {
6
27
  readonly html: import("@angular/core").InputSignal<string>;
7
28
  readonly tokens: import("@angular/core").InputSignal<TextTokenContext>;
8
29
  readonly editing: import("@angular/core").InputSignal<boolean>;
30
+ readonly shownElsewhere: import("@angular/core").InputSignal<() => ReadonlySet<string>>;
9
31
  readonly saved: import("@angular/core").OutputEmitterRef<string>;
10
32
  readonly editEnded: import("@angular/core").OutputEmitterRef<void>;
33
+ readonly valueSettings: import("@angular/core").OutputEmitterRef<string>;
11
34
  readonly typeScale: {
12
35
  body: string;
13
36
  h1: string;
@@ -15,20 +38,42 @@ export declare class ComponentTextComponent {
15
38
  h3: string;
16
39
  color: string;
17
40
  };
41
+ readonly tableLook: {
42
+ border: string;
43
+ padding: string;
44
+ margin: string;
45
+ };
46
+ readonly showValueNames: import("@angular/core").WritableSignal<boolean>;
47
+ readonly notice: import("@angular/core").WritableSignal<TextNotice>;
48
+ readonly valuePopover: import("@angular/core").WritableSignal<ValuePopoverAnchor>;
49
+ readonly valuePopoverValue: import("@angular/core").Signal<TextValue>;
50
+ readonly valueEmbeds: ValueEmbedPlugin;
18
51
  readonly editorConfig: FsHtmlEditorConfig;
19
52
  readonly displayHtml: import("@angular/core").Signal<SafeHtml>;
20
53
  draft: string;
21
54
  private readonly _editor;
55
+ private readonly _valuePopoverAnchor;
22
56
  private readonly _sanitizer;
23
57
  private readonly _host;
24
58
  private readonly _destroyRef;
25
59
  private _isOpen;
60
+ private _noticeTimer;
26
61
  constructor();
27
62
  onKeydown(event: KeyboardEvent): void;
63
+ removeValue(key: string): void;
64
+ openValueSettings(popover: FsPopoverRef): void;
65
+ removeBlockedSelection(): void;
66
+ undoValuesUnused(): void;
67
+ dismissNotice(): void;
68
+ private _openValuePopover;
69
+ private _showNotice;
70
+ private _clearNoticeTimer;
71
+ private _onValuesRemoved;
28
72
  private _onDocumentPress;
29
73
  private _close;
30
74
  private _syncDraft;
31
75
  private _finish;
32
76
  static ɵfac: i0.ɵɵFactoryDeclaration<ComponentTextComponent, never>;
33
- static ɵcmp: i0.ɵɵComponentDeclaration<ComponentTextComponent, "app-report-component-text", never, { "html": { "alias": "html"; "required": false; "isSignal": true; }; "tokens": { "alias": "tokens"; "required": true; "isSignal": true; }; "editing": { "alias": "editing"; "required": false; "isSignal": true; }; }, { "saved": "saved"; "editEnded": "editEnded"; }, never, never, true, never>;
77
+ static ɵcmp: i0.ɵɵComponentDeclaration<ComponentTextComponent, "app-report-component-text", never, { "html": { "alias": "html"; "required": false; "isSignal": true; }; "tokens": { "alias": "tokens"; "required": true; "isSignal": true; }; "editing": { "alias": "editing"; "required": false; "isSignal": true; }; "shownElsewhere": { "alias": "shownElsewhere"; "required": false; "isSignal": true; }; }, { "saved": "saved"; "editEnded": "editEnded"; "valueSettings": "valueSettings"; }, never, never, true, never>;
34
78
  }
79
+ export {};
@@ -0,0 +1,67 @@
1
+ import { Plugin, PluginConfig } from '@firestitch/html-editor';
2
+ import { TextValue } from '../../text';
3
+ export declare const VALUE_EMBED_ATTRIBUTES: string[];
4
+ export interface ValueEmbedBlock {
5
+ count: number;
6
+ removeSelection?: () => void;
7
+ }
8
+ export interface ValueEmbedRemoval {
9
+ before: string[];
10
+ after: string[];
11
+ undo: () => void;
12
+ }
13
+ export interface ValueEmbedPluginConfig extends PluginConfig {
14
+ host: () => HTMLElement;
15
+ values: () => Record<string, TextValue>;
16
+ scope: () => string;
17
+ showNames: () => boolean;
18
+ click: (key: string, chip: HTMLElement) => void;
19
+ blocked: (block: ValueEmbedBlock) => void;
20
+ removed: (removal: ValueEmbedRemoval) => void;
21
+ changed: () => void;
22
+ refused: (text: string) => void;
23
+ }
24
+ export declare class ValueEmbedPlugin extends Plugin {
25
+ config: ValueEmbedPluginConfig;
26
+ private _editor;
27
+ private _removing;
28
+ private _domListeners;
29
+ private _pasteScope;
30
+ private _before;
31
+ constructor(config: ValueEmbedPluginConfig);
32
+ initialize(): void;
33
+ destroy(): void;
34
+ refresh(): void;
35
+ hideToolbar(): void;
36
+ undo(): void;
37
+ removeKey(key: string): void;
38
+ remove(chip: HTMLElement): void;
39
+ private _chips;
40
+ private _chipCounts;
41
+ private _reportRemoved;
42
+ private _watchCommands;
43
+ private _onCommandBefore;
44
+ private _caretIn;
45
+ private _toChips;
46
+ private _keepsPasted;
47
+ private _splitText;
48
+ private _toTokenText;
49
+ private _createChip;
50
+ private _label;
51
+ private _toTokens;
52
+ private _onKeydown;
53
+ private _onBeforeInput;
54
+ private _guardSelection;
55
+ private _onCopy;
56
+ private _plainText;
57
+ private _onClick;
58
+ private _onChip;
59
+ private _block;
60
+ private _removeRange;
61
+ private _changed;
62
+ private _selection;
63
+ private _range;
64
+ private _chipsIn;
65
+ private _adjacentChip;
66
+ private _granularity;
67
+ }
@@ -1,4 +1,4 @@
1
- import { AfterViewInit, EventEmitter, OnChanges, SimpleChanges } from '@angular/core';
1
+ import { AfterViewInit, EventEmitter, OnChanges, SimpleChanges, WritableSignal } from '@angular/core';
2
2
  import { CdkDragDrop } from '@angular/cdk/drag-drop';
3
3
  import { FsZoomPanComponent } from '@firestitch/zoom-pan';
4
4
  import { ComponentSettings, Report, ReportComponent, ReportFilterGroup, ReportHeaderFooter, ReportPage } from '../../interfaces/report.interface';
@@ -39,34 +39,49 @@ export declare class ReportCanvasComponent implements OnChanges, AfterViewInit {
39
39
  private _viewport;
40
40
  private _guides;
41
41
  readonly PX = 96;
42
- readonly pages: import("@angular/core").WritableSignal<ReportPage[]>;
43
- readonly activePageIndex: import("@angular/core").WritableSignal<number>;
44
- readonly zoom: import("@angular/core").WritableSignal<number>;
45
- readonly masterMode: import("@angular/core").WritableSignal<boolean>;
42
+ readonly pages: WritableSignal<ReportPage[]>;
43
+ readonly activePageIndex: WritableSignal<number>;
44
+ readonly activePageId: import("@angular/core").Signal<number>;
45
+ readonly zoom: WritableSignal<number>;
46
+ readonly masterMode: WritableSignal<boolean>;
46
47
  groups: Map<number, ReportFilterGroup>;
47
- readonly selectedComponentId: import("@angular/core").WritableSignal<number>;
48
+ readonly selectedComponentId: WritableSignal<number>;
49
+ readonly activePageComponents: import("@angular/core").Signal<ReportComponent[]>;
50
+ readonly masterComponents: import("@angular/core").Signal<ReportComponent[]>;
51
+ readonly pageTokens: import("@angular/core").Signal<TextTokenContext>;
52
+ readonly masterTokens: import("@angular/core").Signal<TextTokenContext>;
48
53
  readonly snapper: CanvasSnapper;
54
+ readonly valueKeysElsewhere: (text: ReportComponent) => ReadonlySet<string>;
49
55
  private _reportData;
56
+ private _filterState;
50
57
  private _prompt;
51
58
  private _message;
52
59
  private _destroyRef;
53
60
  private _fitted;
54
- private _tokens;
55
61
  private _previousPageCount;
56
62
  private _emittedPageId;
63
+ private _report;
64
+ private _pageValueComponents;
65
+ private _masterValueComponents;
66
+ private _masterNeeded;
67
+ private _pageValues;
68
+ private _masterValues;
69
+ private _valuesRevision;
70
+ private _valueKeysByLayer;
71
+ constructor();
57
72
  ngOnChanges(changes: SimpleChanges): void;
58
73
  get headingSizePx(): number;
59
74
  ngAfterViewInit(): void;
60
75
  get activePage(): ReportPage | null;
61
76
  get bands(): ReportHeaderFooter;
62
- get masterComponents(): ReportComponent[];
63
77
  get isMasterShown(): boolean;
64
78
  get isPageEditing(): boolean;
65
79
  get isMasterEditing(): boolean;
66
- get tokens(): TextTokenContext;
67
80
  toggleMasterMode(): void;
68
81
  addText(): void;
69
82
  onComponentRemoved(componentId: number): void;
83
+ onTextSaved(text: ReportComponent, html: string): void;
84
+ openValueSettings(text: ReportComponent, key: string): void;
70
85
  toggleMasterHidden(page: ReportPage): void;
71
86
  selectPage(index: number): void;
72
87
  addPage(): void;
@@ -85,6 +100,16 @@ export declare class ReportCanvasComponent implements OnChanges, AfterViewInit {
85
100
  onPositionChanged(position: {
86
101
  componentId: number;
87
102
  } & Record<string, number>): void;
103
+ private _init;
104
+ private _valueLayer;
105
+ private _watchValues;
106
+ private _reloadIfChanged;
107
+ private _layerRequest;
108
+ private _shownValues;
109
+ private _loadValues;
110
+ private _tokenContext;
111
+ private _dropRemovedValueChips;
112
+ private _isMasterComponent;
88
113
  private get _snapThreshold();
89
114
  private _snapMove;
90
115
  private _snapResize;
@@ -21,14 +21,21 @@ export declare class ReportComponentComponent implements OnInit, OnChanges {
21
21
  } & Record<string, number>>;
22
22
  openSettings: EventEmitter<ReportComponentModel>;
23
23
  readonly tokens: import("@angular/core").InputSignal<TextTokenContext>;
24
+ readonly valueKeysElsewhere: import("@angular/core").InputSignal<(text: ReportComponentModel) => ReadonlySet<string>>;
24
25
  readonly removed: import("@angular/core").OutputEmitterRef<number>;
26
+ readonly valueSettings: import("@angular/core").OutputEmitterRef<string>;
27
+ readonly textSaved: import("@angular/core").OutputEmitterRef<string>;
28
+ readonly valuesRemoved: import("@angular/core").OutputEmitterRef<number[]>;
25
29
  readonly textEditing: import("@angular/core").WritableSignal<boolean>;
30
+ readonly textHtml: import("@angular/core").WritableSignal<string>;
31
+ readonly shownElsewhere: () => ReadonlySet<string>;
26
32
  chartComponent: ComponentChartComponent;
27
33
  get resizeHandles(): readonly Handle[];
28
34
  readonly filterConfig: import("@angular/core").WritableSignal<FilterConfig>;
29
35
  readonly data: import("@angular/core").WritableSignal<ComponentData>;
30
36
  readonly loading: import("@angular/core").WritableSignal<boolean>;
31
37
  readonly error: import("@angular/core").WritableSignal<string>;
38
+ private readonly _text;
32
39
  private _refresh$;
33
40
  private _reportData;
34
41
  private _filterState;
@@ -45,6 +52,7 @@ export declare class ReportComponentComponent implements OnInit, OnChanges {
45
52
  get filterKey(): string;
46
53
  get isText(): boolean;
47
54
  editText(): void;
55
+ removeValue(key: string): void;
48
56
  onTextSaved(html: string): void;
49
57
  deleteText(): void;
50
58
  get truncated(): boolean;
@@ -59,6 +67,7 @@ export declare class ReportComponentComponent implements OnInit, OnChanges {
59
67
  onComponentPointerDown(event: PointerEvent): void;
60
68
  onDragStart(event: PointerEvent): void;
61
69
  onResizeStart(event: PointerEvent, handle: Handle): void;
70
+ private _setTextHtml;
62
71
  private _buildFilterConfig;
63
72
  private _origin;
64
73
  private _track;
@@ -71,6 +80,6 @@ export declare class ReportComponentComponent implements OnInit, OnChanges {
71
80
  private _applyGeometry;
72
81
  private _load;
73
82
  static ɵfac: i0.ɵɵFactoryDeclaration<ReportComponentComponent, never>;
74
- static ɵcmp: i0.ɵɵComponentDeclaration<ReportComponentComponent, "app-report-component", never, { "reportId": { "alias": "reportId"; "required": false; }; "component": { "alias": "component"; "required": false; }; "groups": { "alias": "groups"; "required": false; }; "editMode": { "alias": "editMode"; "required": false; }; "zoom": { "alias": "zoom"; "required": false; }; "snapper": { "alias": "snapper"; "required": false; }; "selected": { "alias": "selected"; "required": false; }; "tokens": { "alias": "tokens"; "required": false; "isSignal": true; }; }, { "selectComponent": "selectComponent"; "positionChanged": "positionChanged"; "openSettings": "openSettings"; "removed": "removed"; }, never, never, true, never>;
83
+ static ɵcmp: i0.ɵɵComponentDeclaration<ReportComponentComponent, "app-report-component", never, { "reportId": { "alias": "reportId"; "required": false; }; "component": { "alias": "component"; "required": false; }; "groups": { "alias": "groups"; "required": false; }; "editMode": { "alias": "editMode"; "required": false; }; "zoom": { "alias": "zoom"; "required": false; }; "snapper": { "alias": "snapper"; "required": false; }; "selected": { "alias": "selected"; "required": false; }; "tokens": { "alias": "tokens"; "required": false; "isSignal": true; }; "valueKeysElsewhere": { "alias": "valueKeysElsewhere"; "required": false; "isSignal": true; }; }, { "selectComponent": "selectComponent"; "positionChanged": "positionChanged"; "openSettings": "openSettings"; "removed": "removed"; "valueSettings": "valueSettings"; "textSaved": "textSaved"; "valuesRemoved": "valuesRemoved"; }, never, never, true, never>;
75
84
  }
76
85
  export {};
@@ -1,6 +1,6 @@
1
1
  import { RequestConfig } from '@firestitch/api';
2
2
  import { Observable } from 'rxjs';
3
- import { ChartGranularity, ComponentDataState, ComponentExportResponse, FilterGroupDefault, ReportComponentSql, ReportFilterLevel, ReportLocales, ReportTree, ResolvedFilterValue } from '../interfaces/report.interface';
3
+ import { ChartGranularity, ComponentDataState, ComponentExportResponse, FilterGroupDefault, ReportComponentSql, ReportFilterLevel, ReportLocales, ReportPageValue, 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;
@@ -48,6 +48,7 @@ export declare class ReportData<T = any> {
48
48
  h: number;
49
49
  }>)[], config?: RequestConfig): Observable<T>;
50
50
  componentData(reportId: number, componentId: number, filters?: ResolvedFilterValue[], state?: ComponentDataState, isExport?: boolean, config?: RequestConfig): Observable<T>;
51
+ pageValues(reportId: number, pageId: number, filters?: ResolvedFilterValue[], isExport?: boolean, config?: RequestConfig): Observable<ReportPageValue[]>;
51
52
  exportComponent(reportId: number, componentId: number, filters?: ResolvedFilterValue[], state?: ComponentDataState, config?: RequestConfig): Observable<ComponentExportResponse>;
52
53
  exportReport(reportId: number, filters?: ResolvedFilterValue[], pageId?: number | null, frequency?: ChartGranularity | null, filterSummary?: string[], config?: RequestConfig): Observable<T>;
53
54
  filterOptions(reportId: number, filterId: number, config?: RequestConfig): Observable<T>;
@@ -41,6 +41,9 @@ export declare class ComponentSettingsComponent implements OnInit {
41
41
  readonly sparklineMinPeriods = 2;
42
42
  readonly sparklineMaxPeriods = 60;
43
43
  readonly kpiCard: import("@angular/core").WritableSignal<boolean>;
44
+ readonly isValue: import("@angular/core").WritableSignal<boolean>;
45
+ readonly isFormula: import("@angular/core").WritableSignal<boolean>;
46
+ readonly formulaLine: import("@angular/core").Signal<string>;
44
47
  readonly increaseIs: import("@angular/core").WritableSignal<ReportChangePolarity>;
45
48
  readonly targetValue: import("@angular/core").WritableSignal<string | number>;
46
49
  readonly targetLabel: import("@angular/core").WritableSignal<string>;
@@ -71,6 +74,11 @@ export declare class ComponentSettingsComponent implements OnInit {
71
74
  validateTarget: (control: AbstractControl) => void;
72
75
  save: () => Observable<ComponentSettingsResponse>;
73
76
  setExposure(row: FilterRow, target: 'report' | 'component', on: boolean): void;
77
+ private _setValueExposure;
78
+ private _formulaLine;
79
+ private _dependentsNote;
80
+ private _layerValues;
81
+ private _valueName;
74
82
  private _seedKpiCard;
75
83
  private _savedKpiCard;
76
84
  private _kpiCardSettings;
@@ -0,0 +1,6 @@
1
+ export declare enum ReportValueFormula {
2
+ Change = "change",
3
+ PercentChange = "percent_change",
4
+ Ratio = "ratio",
5
+ Sum = "sum"
6
+ }
@@ -2,6 +2,7 @@ import { Observable } from 'rxjs';
2
2
  import { ComponentData, ListColumn, Report, ReportComponent, ReportFormatContext, ReportLocaleTag, ReportPage } from '../interfaces/report.interface';
3
3
  import { KpiCardView } from '../kpi-card';
4
4
  import { ListOutputColumn } from '../list-config';
5
+ import { TextTokenContext, TextValue } from '../text';
5
6
  import * as i0 from "@angular/core";
6
7
  export interface CollectedComponent {
7
8
  component: ReportComponent;
@@ -12,14 +13,28 @@ export interface CollectedComponent {
12
13
  export interface CollectedPage {
13
14
  page: ReportPage;
14
15
  components: CollectedComponent[];
16
+ values: Record<string, TextValue>;
17
+ failedValues: string[];
15
18
  }
16
19
  export interface CollectedReport {
17
20
  report: Report;
18
21
  pages: CollectedPage[];
22
+ masterValues: Record<string, TextValue>;
23
+ masterFailedValues: string[];
19
24
  filterSummary: string[];
20
25
  contextLines: string[];
21
26
  formatContext: ReportFormatContext;
22
27
  }
28
+ export interface TextOverflow {
29
+ componentId: number;
30
+ page: string;
31
+ snippet: string;
32
+ }
33
+ export interface BuiltExport {
34
+ overflows: TextOverflow[];
35
+ overflowNote: string;
36
+ save: () => void | Promise<void>;
37
+ }
23
38
  export type ExportListColumn = ListColumn & {
24
39
  numeric: boolean;
25
40
  output?: ListOutputColumn;
@@ -39,10 +54,13 @@ export interface KpiExportParts {
39
54
  target: boolean;
40
55
  sparkline: boolean;
41
56
  notes: string[];
57
+ scale: number;
42
58
  }
59
+ export declare const HEADER_FOOTER_NAME = "Header & footer";
43
60
  export declare function emptyLabel(item: CollectedComponent): string;
44
61
  export declare function exportTitle(component: ReportComponent, search?: string | null): string;
45
62
  export declare function isFailed(item: CollectedComponent): boolean;
63
+ export declare function textOverflow(component: ReportComponent, page: string, tokens: TextTokenContext): TextOverflow;
46
64
  export declare function coverLines(collected: CollectedReport): string[];
47
65
  export declare function exportCell(value: unknown, column: ListColumn & {
48
66
  output?: ListOutputColumn;
@@ -54,6 +72,7 @@ export declare function exportWindowsLine(item: CollectedComponent, timezone: st
54
72
  export declare function exportNoteLines(item: CollectedComponent, timezone: string, locale: ReportLocaleTag): string[];
55
73
  export declare function kpiCardHasExtras(view: KpiCardView, notes: readonly string[]): boolean;
56
74
  export declare function kpiExportParts(view: KpiCardView, notes: readonly string[], available: number, heights: KpiExportHeights): KpiExportParts;
75
+ export declare function scaledKpiHeights(heights: KpiExportHeights, scale: number): KpiExportHeights;
57
76
  export declare function kpiExportHeight(view: KpiCardView, parts: KpiExportParts, heights: KpiExportHeights): number;
58
77
  export declare function moreRowsNotice(remaining: number): string;
59
78
  export declare function failedPageNames(collected: CollectedReport): string[];
@@ -62,7 +81,12 @@ export declare class ReportExportCollectorService {
62
81
  private _filterState;
63
82
  collect(report: Report, listRows: number): Observable<CollectedReport>;
64
83
  getFilterSummary(report: Report): Observable<string[]>;
84
+ private _jobs;
85
+ private _valuesJobs;
86
+ private _runJob;
65
87
  private _componentData;
88
+ private _pageValues;
89
+ private _file;
66
90
  private _contextLines;
67
91
  private _selectLine;
68
92
  private _date;
@@ -9,7 +9,9 @@ export declare class ReportExportService {
9
9
  pdf(report: Report): Observable<unknown>;
10
10
  powerpoint(report: Report): Observable<unknown>;
11
11
  private _run;
12
- private _gate;
12
+ private _buildAndSave;
13
+ private _failureGate;
14
+ private _overflowGate;
13
15
  static ɵfac: i0.ɵɵFactoryDeclaration<ReportExportService, never>;
14
16
  static ɵprov: i0.ɵɵInjectableDeclaration<ReportExportService>;
15
17
  }
@@ -1,13 +1,26 @@
1
- import { CollectedReport } from './report-export-collector.service';
1
+ import { BuiltExport, CollectedReport } from './report-export-collector.service';
2
2
  import * as i0 from "@angular/core";
3
3
  export declare const PDF_LIST_ROWS = 500;
4
4
  export declare class ReportPdfService {
5
- export(collected: CollectedReport): Promise<void>;
5
+ private readonly _textLayout;
6
+ build(collected: CollectedReport): Promise<BuiltExport>;
6
7
  private _context;
7
8
  private _renderPage;
8
9
  private _renderMaster;
10
+ private _recordOverflow;
9
11
  private _titlePage;
10
12
  private _renderText;
13
+ private _textBox;
14
+ private _drawParagraphs;
15
+ private _paragraphsHeight;
16
+ private _lineSize;
17
+ private _drawLine;
18
+ private _drawTextTable;
19
+ private _textCellInput;
20
+ private _textTableOptions;
21
+ private _textTableFit;
22
+ private _keptRows;
23
+ private _drawTextCell;
11
24
  private _wrap;
12
25
  private _drawWord;
13
26
  private _font;
@@ -24,8 +37,10 @@ export declare class ReportPdfService {
24
37
  private _tableOptions;
25
38
  private _noticeRow;
26
39
  private _measure;
40
+ private _scratchDocument;
27
41
  private _drawTable;
28
42
  private _renderContinuation;
43
+ private _renderContinuationMasters;
29
44
  private _continuationMargin;
30
45
  private _continuedTitle;
31
46
  private _renderKpi;
@@ -33,6 +48,7 @@ export declare class ReportPdfService {
33
48
  private _kpiTarget;
34
49
  private _kpiSparkline;
35
50
  private _pdfText;
51
+ private _pdfValues;
36
52
  private _slug;
37
53
  static ɵfac: i0.ɵɵFactoryDeclaration<ReportPdfService, never>;
38
54
  static ɵprov: i0.ɵɵInjectableDeclaration<ReportPdfService>;
@@ -1,13 +1,26 @@
1
1
  import { ReportLocaleTag } from '../interfaces/report.interface';
2
- import { CollectedReport } from './report-export-collector.service';
2
+ import { BuiltExport, CollectedReport } from './report-export-collector.service';
3
3
  import * as i0 from "@angular/core";
4
4
  export declare const PPTX_LIST_ROWS = 100;
5
5
  export declare const PPTX_AUTO_LABEL_MAX_POINTS = 24;
6
6
  export declare function pptxRunOptions(options: Record<string, unknown>, valueLocale?: ReportLocaleTag): Record<string, unknown>;
7
7
  export declare class ReportPptxService {
8
- export(collected: CollectedReport): Promise<void>;
8
+ private readonly _textLayout;
9
+ build(collected: CollectedReport): Promise<BuiltExport>;
10
+ private _renderPage;
11
+ private _renderMaster;
12
+ private _recordOverflow;
9
13
  private _titleSlide;
10
14
  private _renderText;
15
+ private _addTextBox;
16
+ private _renderTextStack;
17
+ private _addTextSegment;
18
+ private _addTextTable;
19
+ private _keptRows;
20
+ private _tableRows;
21
+ private _tableCell;
22
+ private _paragraphRuns;
23
+ private _runOptions;
11
24
  private _tokens;
12
25
  private _renderComponent;
13
26
  private _lineRuns;
@@ -0,0 +1,35 @@
1
+ import { ReportComponent } from '../interfaces/report.interface';
2
+ import { TextTokenContext } from '../text';
3
+ import * as i0 from "@angular/core";
4
+ export interface TextSegmentLayout {
5
+ top: number;
6
+ bottom: number;
7
+ }
8
+ export interface TextTableLayout {
9
+ top: number;
10
+ left: number;
11
+ width: number;
12
+ height: number;
13
+ rowHeights: number[];
14
+ columnWidths: number[];
15
+ }
16
+ export interface TextBlockLayout {
17
+ contentWidth: number;
18
+ contentHeight: number;
19
+ usedHeight: number;
20
+ overflow: boolean;
21
+ segments: (TextSegmentLayout | null)[];
22
+ tables: TextTableLayout[];
23
+ }
24
+ export declare const OVERFLOW_SLACK: number;
25
+ export declare class ReportTextLayoutService {
26
+ private readonly _appRef;
27
+ private readonly _environmentInjector;
28
+ private readonly _injector;
29
+ private readonly _layouts;
30
+ measure(component: ReportComponent, tokens: TextTokenContext): Promise<TextBlockLayout>;
31
+ private _render;
32
+ private _rendered;
33
+ static ɵfac: i0.ɵɵFactoryDeclaration<ReportTextLayoutService, never>;
34
+ static ɵprov: i0.ɵɵInjectableDeclaration<ReportTextLayoutService>;
35
+ }
@@ -1,5 +1,5 @@
1
1
  import { ReportNumberUnits } from './enums/report-number-units.enum';
2
- import { ChartGranularity, ChartMeasure, ComparisonAgainst, ComparisonNoteCode, ComparisonOffset, ComponentComparison, KpiNoteCode, NumberFormatSpec, OutputMeta, OutputRole, Report, ReportCurrencyCode, ReportFormatContext, ReportLocaleTag, WindowMeta, WindowNoteCode } from './interfaces/report.interface';
2
+ import { ChartGranularity, ChartMeasure, ComparisonAgainst, ComparisonNoteCode, ComparisonOffset, ComparisonWindow, ComponentComparison, KpiNoteCode, NumberFormatSpec, OutputMeta, OutputRole, Report, ReportCurrencyCode, ReportFormatContext, ReportLocaleTag, WindowMeta, WindowNoteCode } from './interfaces/report.interface';
3
3
  export declare const REPORT_FALLBACK_LOCALE: ReportLocaleTag;
4
4
  export declare const REPORT_FALLBACK_CURRENCY: ReportCurrencyCode;
5
5
  export declare const DEFAULT_FORMAT_CONTEXT: Readonly<ReportFormatContext>;
@@ -28,6 +28,8 @@ export interface OutputValueOptions {
28
28
  prior?: unknown;
29
29
  floor?: string | null;
30
30
  empty?: string;
31
+ signed?: boolean;
32
+ pointsUnit?: boolean;
31
33
  }
32
34
  export interface FormattedOutputValue {
33
35
  text: string;
@@ -58,6 +60,8 @@ export declare function formatDayWindow(meta: {
58
60
  end: string | null;
59
61
  through?: string | null;
60
62
  }, timezone: string, locale: ReportLocaleTag): string;
63
+ export declare function isReadOnOneDay(comparison: ComponentComparison | null | undefined): boolean;
64
+ export declare function formatReadingDay(window: Pick<ComparisonWindow, 'end'>, locale: ReportLocaleTag, lead?: boolean): string;
61
65
  export declare function localeName(tag: ReportLocaleTag): string;
62
66
  export declare function currencyName(code: ReportCurrencyCode): string;
63
67
  export declare function comparisonOffsetLabel(offset: ComparisonOffset): string;
@@ -7,6 +7,7 @@ import { ReportChartMarkStat } from '../enums/report-chart-mark-stat.enum';
7
7
  import { ReportListColumnFormat } from '../enums/report-list-column-format.enum';
8
8
  import { ReportNumberUnits } from '../enums/report-number-units.enum';
9
9
  import { ReportValueFormat } from '../enums/report-value-format.enum';
10
+ import { ReportValueFormula } from '../enums/report-value-formula.enum';
10
11
  export type ReportLocaleTag = string;
11
12
  export type ReportCurrencyCode = string;
12
13
  export interface Report {
@@ -29,6 +30,7 @@ export interface Report {
29
30
  export interface ReportMaster {
30
31
  id: number;
31
32
  components: ReportComponent[];
33
+ values?: ReportComponent[];
32
34
  }
33
35
  export interface ReportFormatContext {
34
36
  locale: ReportLocaleTag;
@@ -75,8 +77,9 @@ export interface ReportPage {
75
77
  order: number;
76
78
  masterHidden: boolean;
77
79
  components: ReportComponent[];
80
+ values?: ReportComponent[];
78
81
  }
79
- export type ReportComponentType = 'chart' | 'list' | 'kpi' | 'text';
82
+ export type ReportComponentType = 'chart' | 'list' | 'kpi' | 'text' | 'value';
80
83
  export interface ReportComponent {
81
84
  id: number;
82
85
  type: ReportComponentType;
@@ -87,7 +90,7 @@ export interface ReportComponent {
87
90
  h: number;
88
91
  autoHeight: boolean;
89
92
  sql: string | null;
90
- config: ChartConfig & ListConfig & KpiConfig & TextConfig & ComponentLayoutConfig & Record<string, unknown>;
93
+ config: ChartConfig & ListConfig & KpiConfig & TextConfig & ValueConfig & ComponentLayoutConfig & Record<string, unknown>;
91
94
  filters: ReportFilter[];
92
95
  }
93
96
  export interface ReportComponentSql {
@@ -101,6 +104,22 @@ export interface ReportComponentSql {
101
104
  export interface TextConfig {
102
105
  html?: string;
103
106
  }
107
+ export interface ValueConfig {
108
+ key?: string;
109
+ formula?: ValueFormulaConfig | null;
110
+ }
111
+ export interface ValueFormulaConfig {
112
+ op: ReportValueFormula;
113
+ of: string[];
114
+ signed?: boolean | null;
115
+ }
116
+ export interface ReportPageValue {
117
+ id: number;
118
+ key: string;
119
+ value: number | string | null;
120
+ error: string | null;
121
+ role?: OutputRole | null;
122
+ }
104
123
  export interface ComponentLayoutConfig {
105
124
  padding?: ComponentPadding;
106
125
  }
@@ -327,7 +346,7 @@ export interface ComponentTimeframe {
327
346
  range: ReportRelativeRange | null;
328
347
  source: TimeframeSource;
329
348
  }
330
- export type ComparisonMode = 'range' | 'series' | 'as_of';
349
+ export type ComparisonMode = 'range' | 'series' | 'period_end';
331
350
  export type ComparisonAlign = 'to_date' | 'full';
332
351
  export type ComparisonAgainst = 'previous_period' | 'previous_week' | 'previous_month' | 'previous_quarter' | 'previous_year' | 'range';
333
352
  export type ComparisonNoteCode = 'no_window' | 'unit_inferred' | 'window_in_future' | 'other_date_filter' | 'grain_followed';
@@ -1,4 +1,6 @@
1
+ import { ReportComponent } from './interfaces/report.interface';
1
2
  export declare const DEFAULT_COMPONENT_PADDING = 0.125;
3
+ export declare function componentPaddingCss(component: ReportComponent): string;
2
4
  export declare const DEFAULT_HEADING_SIZE = 16;
3
5
  export declare const PAGE_DIMENSION_MIN = 1;
4
6
  export declare const PAGE_DIMENSION_MAX = 50;
@@ -53,6 +53,7 @@ export declare class ReportFilterStateService {
53
53
  isFilterDisabled(filterId: number): boolean;
54
54
  toggleFilter(filterId: number, groupId: number): void;
55
55
  changesFor(component: ReportComponent): Observable<number | null>;
56
+ changesForAny(components: () => ReportComponent[]): Observable<number>;
56
57
  resolveForComponent(component: ReportComponent): ResolvedFilterValue[];
57
58
  viewerFilters(): ReportChatViewerFilter[];
58
59
  resolveForReport(report: Report, pageId?: number | null): ResolvedFilterValue[];
@@ -68,7 +69,6 @@ export declare class ReportFilterStateService {
68
69
  private _prune;
69
70
  private _withPreset;
70
71
  private _isDefault;
71
- private _components;
72
72
  private _listComponents;
73
73
  private _sortableColumns;
74
74
  private _defaultValue;