bways-report 0.1.1 → 0.1.3

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 (100) hide show
  1. package/README.md +153 -51
  2. package/esm2022/lib/core/errors/reporting-errors.mjs +2 -2
  3. package/esm2022/lib/core/index.mjs +3 -1
  4. package/esm2022/lib/core/models/report-datasource.model.mjs +1 -1
  5. package/esm2022/lib/core/models/report-definition.model.mjs +1 -1
  6. package/esm2022/lib/core/models/report-grid.model.mjs +1 -1
  7. package/esm2022/lib/core/services/report-session-context.service.mjs +50 -5
  8. package/esm2022/lib/core/utils/data-normalization.util.mjs +56 -0
  9. package/esm2022/lib/core/utils/report-parameter.util.mjs +180 -0
  10. package/esm2022/lib/data-access/adapters/http-datasource.adapter.mjs +82 -0
  11. package/esm2022/lib/data-access/adapters/http-lookup.adapter.mjs +34 -9
  12. package/esm2022/lib/data-access/adapters/http-masterdata.adapter.mjs +38 -0
  13. package/esm2022/lib/data-access/adapters/http-persistence.adapter.mjs +217 -0
  14. package/esm2022/lib/data-access/adapters/http-schema-discovery.adapter.mjs +3 -1
  15. package/esm2022/lib/data-access/adapters/index.mjs +8 -3
  16. package/esm2022/lib/data-access/adapters/local-storage-persistence.adapter.mjs +167 -0
  17. package/esm2022/lib/data-access/adapters/mock-datasource.adapter.mjs +60 -0
  18. package/esm2022/lib/data-access/contracts/api-dtos.mjs +6 -0
  19. package/esm2022/lib/data-access/contracts/index.mjs +2 -1
  20. package/esm2022/lib/features/designer/components/design-canvas/design-canvas.component.mjs +665 -90
  21. package/esm2022/lib/features/designer/components/property-editor/property-editor-action.component.mjs +593 -0
  22. package/esm2022/lib/features/designer/components/property-editor/property-editor-datasource.component.mjs +164 -23
  23. package/esm2022/lib/features/designer/components/property-editor/property-editor-grid.component.mjs +458 -14
  24. package/esm2022/lib/features/designer/components/property-editor/property-editor.component.mjs +173 -2
  25. package/esm2022/lib/features/designer/components/toolbar/designer-toolbar.component.mjs +182 -6
  26. package/esm2022/lib/features/designer/designer.component.mjs +101 -12
  27. package/esm2022/lib/features/designer/index.mjs +4 -1
  28. package/esm2022/lib/features/designer/rpt-report-designer.component.mjs +102 -0
  29. package/esm2022/lib/features/designer/services/designer-state.service.mjs +10 -9
  30. package/esm2022/lib/features/designer/services/report-template.service.mjs +318 -0
  31. package/esm2022/lib/features/designer/utilities/canvas-layout.util.mjs +41 -9
  32. package/esm2022/lib/features/export/index.mjs +2 -2
  33. package/esm2022/lib/features/export/models/export.models.mjs +1 -1
  34. package/esm2022/lib/features/export/services/report-export.service.mjs +420 -5
  35. package/esm2022/lib/features/routing/components/routed-report-runtime.component.mjs +2 -2
  36. package/esm2022/lib/features/runtime/dynamic-renderer.component.mjs +231 -33
  37. package/esm2022/lib/features/runtime/index.mjs +2 -1
  38. package/esm2022/lib/features/runtime/report-execution.service.mjs +64 -0
  39. package/esm2022/lib/features/runtime/report-grid-bridge.component.mjs +224 -26
  40. package/esm2022/lib/features/runtime/report-runtime.component.mjs +341 -7
  41. package/esm2022/lib/features/runtime/rpt-report.component.mjs +537 -0
  42. package/esm2022/lib/primitives/components/button/rpt-button.component.mjs +26 -9
  43. package/esm2022/lib/primitives/components/chart-bridge/report-chart-bridge.component.mjs +18 -7
  44. package/esm2022/lib/primitives/components/date-range/rpt-date-range.component.mjs +346 -0
  45. package/esm2022/lib/primitives/components/dropdown/rpt-dropdown.component.mjs +727 -73
  46. package/esm2022/lib/primitives/components/icon/rpt-icon.component.mjs +8 -1
  47. package/esm2022/lib/primitives/components/index.mjs +2 -1
  48. package/esm2022/lib/primitives/register-builtins.mjs +51 -2
  49. package/esm2022/lib/provide-reporting.mjs +145 -24
  50. package/fesm2022/bways-report.mjs +8051 -1672
  51. package/fesm2022/bways-report.mjs.map +1 -1
  52. package/lib/core/index.d.ts +2 -0
  53. package/lib/core/models/report-datasource.model.d.ts +9 -0
  54. package/lib/core/models/report-definition.model.d.ts +2 -0
  55. package/lib/core/models/report-grid.model.d.ts +44 -0
  56. package/lib/core/services/report-session-context.service.d.ts +6 -1
  57. package/lib/core/utils/data-normalization.util.d.ts +15 -0
  58. package/lib/core/utils/report-parameter.util.d.ts +35 -0
  59. package/lib/data-access/adapters/http-datasource.adapter.d.ts +20 -0
  60. package/lib/data-access/adapters/http-lookup.adapter.d.ts +3 -0
  61. package/lib/data-access/adapters/http-masterdata.adapter.d.ts +13 -0
  62. package/lib/data-access/adapters/http-persistence.adapter.d.ts +27 -0
  63. package/lib/data-access/adapters/http-schema-discovery.adapter.d.ts +2 -0
  64. package/lib/data-access/adapters/index.d.ts +7 -2
  65. package/lib/data-access/adapters/local-storage-persistence.adapter.d.ts +19 -0
  66. package/lib/data-access/adapters/mock-datasource.adapter.d.ts +9 -0
  67. package/lib/data-access/contracts/api-dtos.d.ts +67 -0
  68. package/lib/data-access/contracts/index.d.ts +1 -0
  69. package/lib/features/designer/components/design-canvas/design-canvas.component.d.ts +24 -0
  70. package/lib/features/designer/components/property-editor/parameter-binding-editor.component.d.ts +1 -1
  71. package/lib/features/designer/components/property-editor/property-editor-action.component.d.ts +33 -0
  72. package/lib/features/designer/components/property-editor/property-editor-datasource.component.d.ts +4 -0
  73. package/lib/features/designer/components/property-editor/property-editor-grid.component.d.ts +18 -2
  74. package/lib/features/designer/components/property-editor/property-editor.component.d.ts +7 -0
  75. package/lib/features/designer/components/toolbar/designer-toolbar.component.d.ts +9 -0
  76. package/lib/features/designer/designer.component.d.ts +5 -0
  77. package/lib/features/designer/index.d.ts +4 -0
  78. package/lib/features/designer/rpt-report-designer.component.d.ts +38 -0
  79. package/lib/features/designer/services/designer-state.service.d.ts +1 -1
  80. package/lib/features/designer/services/report-template.service.d.ts +32 -0
  81. package/lib/features/designer/utilities/canvas-layout.util.d.ts +4 -0
  82. package/lib/features/export/index.d.ts +2 -2
  83. package/lib/features/export/models/export.models.d.ts +23 -0
  84. package/lib/features/export/services/report-export.service.d.ts +31 -2
  85. package/lib/features/runtime/dynamic-renderer.component.d.ts +39 -2
  86. package/lib/features/runtime/index.d.ts +2 -0
  87. package/lib/features/runtime/report-execution.service.d.ts +16 -0
  88. package/lib/features/runtime/report-grid-bridge.component.d.ts +129 -6
  89. package/lib/features/runtime/report-runtime.component.d.ts +83 -1
  90. package/lib/features/runtime/rpt-report.component.d.ts +66 -0
  91. package/lib/primitives/components/button/rpt-button.component.d.ts +5 -2
  92. package/lib/primitives/components/chart-bridge/report-chart-bridge.component.d.ts +1 -0
  93. package/lib/primitives/components/date-range/rpt-date-range.component.d.ts +43 -0
  94. package/lib/primitives/components/dropdown/rpt-dropdown.component.d.ts +55 -7
  95. package/lib/primitives/components/index.d.ts +2 -0
  96. package/lib/provide-reporting.d.ts +79 -26
  97. package/package.json +2 -1
  98. package/schematics/collection.json +10 -0
  99. package/schematics/ng-add/index.js +45 -0
  100. package/schematics/ng-add/schema.json +17 -0
@@ -0,0 +1,38 @@
1
+ import { ReportDefinition } from '../../core/models/report-definition.model';
2
+ import * as i0 from "@angular/core";
3
+ /**
4
+ * `<rpt-report-designer>` (and `<rpt-designer-view>`)
5
+ *
6
+ * 1-tag facade component for visual report building.
7
+ * Simplifies report creation and editing across Angular apps and ERP suites.
8
+ *
9
+ * Usage:
10
+ * ```html
11
+ * <!-- Load and edit by ID with automatic persistence -->
12
+ * <rpt-report-designer [id]="'sales-report'" (saved)="onReportSaved($event)" />
13
+ *
14
+ * <!-- Or pass in-memory report object -->
15
+ * <rpt-report-designer [report]="myReport" (saved)="onReportSaved($event)" />
16
+ * ```
17
+ */
18
+ export declare class RptReportDesignerComponent {
19
+ /** Report ID to automatically load via configured ReportPersistenceAdapter */
20
+ readonly id: import("@angular/core").InputSignal<string | undefined>;
21
+ /** Report definition to load directly in memory */
22
+ readonly report: import("@angular/core").InputSignal<ReportDefinition | null>;
23
+ /** Whether to render a back/close button toolbar */
24
+ readonly showCloseButton: import("@angular/core").InputSignal<boolean>;
25
+ /** Label for close button */
26
+ readonly closeLabel: import("@angular/core").InputSignal<string>;
27
+ /** Emitted when user saves the report */
28
+ readonly saved: import("@angular/core").OutputEmitterRef<ReportDefinition>;
29
+ /** Emitted when user clicks the close button */
30
+ readonly closed: import("@angular/core").OutputEmitterRef<void>;
31
+ /** Emitted whenever the designer definition changes */
32
+ readonly definitionChange: import("@angular/core").OutputEmitterRef<ReportDefinition>;
33
+ onSave(definition: ReportDefinition): void;
34
+ onDefinitionChange(definition: ReportDefinition): void;
35
+ onClose(): void;
36
+ static ɵfac: i0.ɵɵFactoryDeclaration<RptReportDesignerComponent, never>;
37
+ static ɵcmp: i0.ɵɵComponentDeclaration<RptReportDesignerComponent, "rpt-report-designer, rpt-designer-view", never, { "id": { "alias": "id"; "required": false; "isSignal": true; }; "report": { "alias": "report"; "required": false; "isSignal": true; }; "showCloseButton": { "alias": "showCloseButton"; "required": false; "isSignal": true; }; "closeLabel": { "alias": "closeLabel"; "required": false; "isSignal": true; }; }, { "saved": "saved"; "closed": "closed"; "definitionChange": "definitionChange"; }, never, never, true, never>;
38
+ }
@@ -48,7 +48,7 @@ export declare class DesignerStateService {
48
48
  /**
49
49
  * Adds a new component of the specified type onto the canvas.
50
50
  */
51
- addComponent(type: string, targetIndex?: number): ReportComponentDefinition;
51
+ addComponent(type: string, targetIndex?: number, overrides?: Partial<ReportComponentDefinition>): ReportComponentDefinition;
52
52
  /**
53
53
  * Removes a component by its ID.
54
54
  */
@@ -0,0 +1,32 @@
1
+ import { ReportDefinition } from '../../../core/models/report-definition.model';
2
+ import * as i0 from "@angular/core";
3
+ export interface ReportBlueprint {
4
+ id: string;
5
+ name: string;
6
+ category: 'Registers & Logs' | 'Financial & Ledger' | 'Analytics & Executive' | 'Custom';
7
+ description: string;
8
+ icon?: string;
9
+ tags?: string[];
10
+ definition: Omit<ReportDefinition, 'id'>;
11
+ }
12
+ export declare class ReportTemplateService {
13
+ private readonly customBlueprints;
14
+ /**
15
+ * Returns all available report blueprints (built-in + user registered).
16
+ */
17
+ getTemplates(): ReportBlueprint[];
18
+ /**
19
+ * Retrieves a blueprint by its unique identifier.
20
+ */
21
+ getTemplateById(id: string): ReportBlueprint | undefined;
22
+ /**
23
+ * Instantiates a new ReportDefinition from a template with unique IDs.
24
+ */
25
+ instantiateTemplate(templateId: string, customName?: string): ReportDefinition;
26
+ /**
27
+ * Registers a custom blueprint to make it available in the gallery.
28
+ */
29
+ registerTemplate(blueprint: ReportBlueprint): void;
30
+ static ɵfac: i0.ɵɵFactoryDeclaration<ReportTemplateService, never>;
31
+ static ɵprov: i0.ɵɵInjectableDeclaration<ReportTemplateService>;
32
+ }
@@ -29,6 +29,10 @@ export declare const CANVAS_CARD_OVERHEAD = 48;
29
29
  * accurately mirrors the runtime component height.
30
30
  */
31
31
  export declare function resolveCanvasCardHeight(comp: ReportComponentDefinition, overrideComponentHeight?: number | null, overhead?: number): string;
32
+ /**
33
+ * Natural minimum height in pixels required for a component type to render without cramping or overflow.
34
+ */
35
+ export declare function getComponentNaturalMinHeight(type: string): number;
32
36
  /**
33
37
  * Resolves the CSS min-height property for the canvas component card.
34
38
  */
@@ -1,2 +1,2 @@
1
- export type { ExportColumn, CsvExportOptions, JsonExportOptions } from './models/export.models';
2
- export { ReportExportService, sanitizeCsvCell, generateCsvContent } from './services/report-export.service';
1
+ export type { ExportColumn, CsvExportOptions, ExcelExportOptions, HtmlExportOptions, JsonExportOptions, BrandedHeaderOptions, } from './models/export.models';
2
+ export { ReportExportService, sanitizeCsvCell, generateCsvContent, generateExcelXml, generateHtmlContent, formatFilterSummary, } from './services/report-export.service';
@@ -3,12 +3,35 @@ export interface ExportColumn {
3
3
  header: string;
4
4
  formatter?: (value: any, row?: Record<string, unknown>) => string;
5
5
  }
6
+ export interface BrandedHeaderOptions {
7
+ companyName?: string;
8
+ branchName?: string;
9
+ reportTitle?: string;
10
+ generatedAt?: Date | string;
11
+ generatedBy?: string;
12
+ activeFilterSummary?: Record<string, unknown> | string;
13
+ }
6
14
  export interface CsvExportOptions {
7
15
  fileName?: string;
8
16
  columns?: ExportColumn[];
9
17
  includeHeader?: boolean;
10
18
  delimiter?: string;
11
19
  addBom?: boolean;
20
+ brandedHeader?: BrandedHeaderOptions;
21
+ }
22
+ export interface ExcelExportOptions {
23
+ fileName?: string;
24
+ sheetName?: string;
25
+ columns?: ExportColumn[];
26
+ includeHeader?: boolean;
27
+ brandedHeader?: BrandedHeaderOptions;
28
+ }
29
+ export interface HtmlExportOptions {
30
+ fileName?: string;
31
+ columns?: ExportColumn[];
32
+ brandedHeader?: BrandedHeaderOptions;
33
+ title?: string;
34
+ autoPrint?: boolean;
12
35
  }
13
36
  export interface JsonExportOptions {
14
37
  fileName?: string;
@@ -1,19 +1,48 @@
1
- import { CsvExportOptions, ExportColumn, JsonExportOptions } from '../models/export.models';
1
+ import { BrandedHeaderOptions, CsvExportOptions, ExcelExportOptions, ExportColumn, HtmlExportOptions, JsonExportOptions } from '../models/export.models';
2
2
  import * as i0 from "@angular/core";
3
3
  /**
4
4
  * Sanitizes and escapes a single cell value for CSV output.
5
5
  */
6
6
  export declare function sanitizeCsvCell(value: unknown, delimiter?: string): string;
7
+ /**
8
+ * Formats a record or string of active filter criteria into a clean text line.
9
+ */
10
+ export declare function formatFilterSummary(summary?: Record<string, unknown> | string): string;
7
11
  /**
8
12
  * Pure generator function to create CSV content string from row data and columns.
9
13
  */
10
- export declare function generateCsvContent(rows: Record<string, unknown>[], columns: ExportColumn[], delimiter?: string, includeHeader?: boolean, addBom?: boolean): string;
14
+ export declare function generateCsvContent(rows: Record<string, unknown>[], columns: ExportColumn[], delimiter?: string, includeHeader?: boolean, addBom?: boolean, brandedHeader?: BrandedHeaderOptions): string;
15
+ /**
16
+ * Generates an Excel-compatible XML Spreadsheet (SpreadsheetML) document string.
17
+ */
18
+ export declare function generateExcelXml(rows: Record<string, unknown>[], columns: ExportColumn[], sheetName?: string, brandedHeader?: BrandedHeaderOptions): string;
19
+ /**
20
+ * Generates an HTML document string formatted for printing and clean PDF conversion.
21
+ */
22
+ export declare function generateHtmlContent(rows: Record<string, unknown>[], columns: ExportColumn[], title?: string, brandedHeader?: BrandedHeaderOptions): string;
11
23
  export declare class ReportExportService {
12
24
  private readonly document;
25
+ private readonly sessionService;
26
+ /**
27
+ * Enriches branded header options with fallback session context data if available.
28
+ */
29
+ private resolveBrandedHeader;
13
30
  /**
14
31
  * Generates and triggers browser download of a CSV file.
15
32
  */
16
33
  exportCsv(rows: Record<string, unknown>[], options?: CsvExportOptions): void;
34
+ /**
35
+ * Generates and triggers browser download of an Excel spreadsheet (.xls SpreadsheetML).
36
+ */
37
+ exportExcel(rows: Record<string, unknown>[], options?: ExcelExportOptions): void;
38
+ /**
39
+ * Generates and triggers browser download of a styled, printable HTML report file.
40
+ */
41
+ exportHtml(rows: Record<string, unknown>[], options?: HtmlExportOptions): void;
42
+ /**
43
+ * Opens a printable window with branded styling and optionally calls window.print().
44
+ */
45
+ printReport(rows: Record<string, unknown>[], options?: HtmlExportOptions): void;
17
46
  /**
18
47
  * Generates and triggers browser download of a JSON file.
19
48
  */
@@ -3,10 +3,14 @@ import { FormGroup } from '@angular/forms';
3
3
  import { ReportDefinition } from '../../core/models/report-definition.model';
4
4
  import { ReportComponentDefinition } from '../../core/models/report-component.model';
5
5
  import { ComponentActionDefinition } from '../../core/models/component-event.model';
6
+ import { GridColumnDefinition, GridRowClickAction } from '../../core/models/report-grid.model';
6
7
  import * as i0 from "@angular/core";
7
8
  export declare class DynamicRendererComponent {
8
9
  private readonly registry;
9
10
  private readonly formBuilder;
11
+ private readonly router;
12
+ private readonly exportService;
13
+ private readonly sessionService;
10
14
  readonly definition: import("@angular/core").InputSignal<ReportDefinition>;
11
15
  readonly initialValues: import("@angular/core").InputSignal<Record<string, unknown>>;
12
16
  readonly resultData: import("@angular/core").InputSignal<unknown[] | null>;
@@ -14,6 +18,32 @@ export declare class DynamicRendererComponent {
14
18
  definition: ReportDefinition;
15
19
  parameters: Record<string, unknown>;
16
20
  }>;
21
+ readonly resetRequested: import("@angular/core").OutputEmitterRef<{
22
+ definition: ReportDefinition;
23
+ }>;
24
+ readonly exportRequested: import("@angular/core").OutputEmitterRef<{
25
+ format: string;
26
+ fileName?: string;
27
+ parameters: Record<string, unknown>;
28
+ data: unknown[] | null;
29
+ }>;
30
+ readonly printRequested: import("@angular/core").OutputEmitterRef<{
31
+ rptFileName?: string;
32
+ exportType?: string;
33
+ parameters: Record<string, unknown>;
34
+ }>;
35
+ readonly customActionTriggered: import("@angular/core").OutputEmitterRef<{
36
+ action: ComponentActionDefinition;
37
+ component: ReportComponentDefinition;
38
+ parameters: Record<string, unknown>;
39
+ }>;
40
+ readonly gridStateChanged: import("@angular/core").OutputEmitterRef<any>;
41
+ readonly columnDefsChanged: import("@angular/core").OutputEmitterRef<any>;
42
+ readonly rowActionTriggered: import("@angular/core").OutputEmitterRef<{
43
+ action: GridRowClickAction;
44
+ row: Record<string, unknown>;
45
+ parameters: Record<string, unknown>;
46
+ }>;
17
47
  readonly form: import("@angular/core").Signal<FormGroup<any>>;
18
48
  readonly sortedComponents: import("@angular/core").Signal<ReportComponentDefinition[]>;
19
49
  readonly totalGridColumns: import("@angular/core").Signal<number>;
@@ -22,9 +52,16 @@ export declare class DynamicRendererComponent {
22
52
  getComponentInputs(comp: ReportComponentDefinition): Record<string, unknown>;
23
53
  getGridColumn(comp: ReportComponentDefinition): string;
24
54
  getGridRow(comp: ReportComponentDefinition): string;
55
+ getComponentHeight(comp: ReportComponentDefinition): string;
56
+ getComponentMinHeight(comp: ReportComponentDefinition): string;
25
57
  isComponentVisible(comp: ReportComponentDefinition): boolean;
26
58
  onSubmit(): void;
27
- handleAction(action: ComponentActionDefinition): void;
59
+ handleAction(action: ComponentActionDefinition, comp?: ReportComponentDefinition): void;
60
+ onGridRowClick(event: {
61
+ row: Record<string, unknown>;
62
+ column?: GridColumnDefinition;
63
+ event?: MouseEvent;
64
+ }): void;
28
65
  static ɵfac: i0.ɵɵFactoryDeclaration<DynamicRendererComponent, never>;
29
- static ɵcmp: i0.ɵɵComponentDeclaration<DynamicRendererComponent, "rpt-dynamic-renderer", never, { "definition": { "alias": "definition"; "required": true; "isSignal": true; }; "initialValues": { "alias": "initialValues"; "required": false; "isSignal": true; }; "resultData": { "alias": "resultData"; "required": false; "isSignal": true; }; }, { "executeRequested": "executeRequested"; }, never, never, true, never>;
66
+ static ɵcmp: i0.ɵɵComponentDeclaration<DynamicRendererComponent, "rpt-dynamic-renderer", never, { "definition": { "alias": "definition"; "required": true; "isSignal": true; }; "initialValues": { "alias": "initialValues"; "required": false; "isSignal": true; }; "resultData": { "alias": "resultData"; "required": false; "isSignal": true; }; }, { "executeRequested": "executeRequested"; "resetRequested": "resetRequested"; "exportRequested": "exportRequested"; "printRequested": "printRequested"; "customActionTriggered": "customActionTriggered"; "gridStateChanged": "gridStateChanged"; "columnDefsChanged": "columnDefsChanged"; "rowActionTriggered": "rowActionTriggered"; }, never, never, true, never>;
30
67
  }
@@ -1,3 +1,5 @@
1
1
  export { ReportRuntimeComponent } from './report-runtime.component';
2
2
  export { DynamicRendererComponent } from './dynamic-renderer.component';
3
3
  export { ReportGridBridgeComponent } from './report-grid-bridge.component';
4
+ export { RptReportComponent } from './rpt-report.component';
5
+ export type { ReportViewPreset } from './rpt-report.component';
@@ -0,0 +1,16 @@
1
+ import { Observable } from 'rxjs';
2
+ import { ReportDefinition } from '../../core/models/report-definition.model';
3
+ import * as i0 from "@angular/core";
4
+ /**
5
+ * Runs a report's result query. Shared by the Live Runtime, the designer's
6
+ * Live Preview and the designer canvas so all three behave identically.
7
+ */
8
+ export declare class ReportExecutionService {
9
+ private readonly adapter;
10
+ private readonly session;
11
+ /** Canvas field keys the user still has to fill before the report can run. */
12
+ getMissingFields(def: ReportDefinition, formValues: Record<string, unknown>): string[];
13
+ execute(def: ReportDefinition, formValues: Record<string, unknown>): Observable<unknown[]>;
14
+ static ɵfac: i0.ɵɵFactoryDeclaration<ReportExecutionService, never>;
15
+ static ɵprov: i0.ɵɵInjectableDeclaration<ReportExecutionService>;
16
+ }
@@ -1,14 +1,44 @@
1
- import { Type } from '@angular/core';
1
+ import { OnDestroy, Type } from '@angular/core';
2
2
  import { GridColumnDefinition, ReportGridDefinition } from '../../core/models/report-grid.model';
3
3
  import * as i0 from "@angular/core";
4
+ export declare class RptGridOutletDirective implements OnDestroy {
5
+ private readonly vcr;
6
+ private compRef;
7
+ private subs;
8
+ readonly componentType: import("@angular/core").InputSignal<Type<any> | null>;
9
+ readonly inputs: import("@angular/core").InputSignal<Record<string, unknown>>;
10
+ readonly gridStateChange: import("@angular/core").OutputEmitterRef<any>;
11
+ readonly columnDefsChange: import("@angular/core").OutputEmitterRef<any>;
12
+ readonly rowClick: import("@angular/core").OutputEmitterRef<{
13
+ row: Record<string, unknown>;
14
+ column?: any;
15
+ event?: any;
16
+ }>;
17
+ constructor();
18
+ private recreateComponent;
19
+ private clear;
20
+ ngOnDestroy(): void;
21
+ static ɵfac: i0.ɵɵFactoryDeclaration<RptGridOutletDirective, never>;
22
+ static ɵdir: i0.ɵɵDirectiveDeclaration<RptGridOutletDirective, "[rptGridOutlet]", never, { "componentType": { "alias": "rptGridOutlet"; "required": false; "isSignal": true; }; "inputs": { "alias": "inputs"; "required": false; "isSignal": true; }; }, { "gridStateChange": "gridStateChange"; "columnDefsChange": "columnDefsChange"; "rowClick": "rowClick"; }, never, never, true, never>;
23
+ }
4
24
  export declare class ReportGridBridgeComponent {
5
25
  private readonly injectedGrid;
26
+ constructor();
6
27
  readonly gridDefinition: import("@angular/core").InputSignal<ReportGridDefinition>;
7
28
  readonly data: import("@angular/core").InputSignal<unknown[]>;
29
+ readonly gridStateChange: import("@angular/core").OutputEmitterRef<any>;
30
+ readonly columnDefsChange: import("@angular/core").OutputEmitterRef<any>;
31
+ readonly rowClick: import("@angular/core").OutputEmitterRef<{
32
+ row: Record<string, unknown>;
33
+ column?: GridColumnDefinition;
34
+ event?: MouseEvent;
35
+ }>;
8
36
  readonly customGridComponent: import("@angular/core").Signal<Type<unknown> | null>;
37
+ readonly hasRowClickAction: import("@angular/core").Signal<boolean>;
9
38
  readonly sortColumn: import("@angular/core").WritableSignal<string | null>;
10
39
  readonly sortDirection: import("@angular/core").WritableSignal<"desc" | "asc">;
11
40
  readonly currentPage: import("@angular/core").WritableSignal<number>;
41
+ readonly visibleColumns: import("@angular/core").Signal<GridColumnDefinition[]>;
12
42
  readonly bridgedColumns: import("@angular/core").Signal<{
13
43
  headerName: string;
14
44
  header: string;
@@ -27,7 +57,55 @@ export declare class ReportGridBridgeComponent {
27
57
  pinned?: "left" | "right" | false;
28
58
  order?: number;
29
59
  aggregate?: "sum" | "avg" | "count" | "min" | "max" | "none";
60
+ action?: import("../../core/models/report-grid.model").GridRowClickAction;
30
61
  }[]>;
62
+ readonly gridInstanceKey: import("@angular/core").Signal<string>;
63
+ readonly gridStateKey: import("@angular/core").Signal<string>;
64
+ readonly gridConfig: import("@angular/core").Signal<{
65
+ stateKey: string;
66
+ pageSize?: number;
67
+ pagination?: boolean;
68
+ selectable?: boolean;
69
+ selectionMode?: "single" | "multiple";
70
+ showRowNumbers?: boolean;
71
+ allowColumnReorder?: boolean;
72
+ allowExport?: boolean;
73
+ exportFormats?: ("csv" | "excel" | "pdf")[];
74
+ showFooter?: boolean;
75
+ height?: string;
76
+ groupModel?: string[];
77
+ sortModel?: unknown[];
78
+ reportState?: Record<string, unknown>;
79
+ presets?: unknown[];
80
+ rowClickAction?: import("../../core/models/report-grid.model").GridRowClickAction;
81
+ }>;
82
+ readonly gridReportState: import("@angular/core").Signal<{
83
+ columnGroupDefs: null;
84
+ columnDefs: {
85
+ headerName: string;
86
+ header: string;
87
+ title: string;
88
+ hide: boolean;
89
+ width: number | undefined;
90
+ aggFunc: "sum" | "avg" | "count" | "min" | "max" | undefined;
91
+ field: string;
92
+ label: string;
93
+ dataType?: "string" | "number" | "date" | "boolean" | "currency";
94
+ format?: string;
95
+ sortable?: boolean;
96
+ filterable?: boolean;
97
+ align?: "left" | "center" | "right";
98
+ visible?: boolean;
99
+ pinned?: "left" | "right" | false;
100
+ order?: number;
101
+ aggregate?: "sum" | "avg" | "count" | "min" | "max" | "none";
102
+ action?: import("../../core/models/report-grid.model").GridRowClickAction;
103
+ }[];
104
+ sortModel: any;
105
+ groupModel: string[];
106
+ activeFilters: {};
107
+ highlightRules: never[];
108
+ }>;
31
109
  readonly gridInputs: import("@angular/core").Signal<{
32
110
  columns: {
33
111
  headerName: string;
@@ -47,6 +125,7 @@ export declare class ReportGridBridgeComponent {
47
125
  pinned?: "left" | "right" | false;
48
126
  order?: number;
49
127
  aggregate?: "sum" | "avg" | "count" | "min" | "max" | "none";
128
+ action?: import("../../core/models/report-grid.model").GridRowClickAction;
50
129
  }[];
51
130
  columnDefs: {
52
131
  headerName: string;
@@ -66,15 +145,57 @@ export declare class ReportGridBridgeComponent {
66
145
  pinned?: "left" | "right" | false;
67
146
  order?: number;
68
147
  aggregate?: "sum" | "avg" | "count" | "min" | "max" | "none";
148
+ action?: import("../../core/models/report-grid.model").GridRowClickAction;
69
149
  }[];
70
- data: unknown[];
71
150
  rowData: unknown[];
72
- options: import("../../core/models/report-grid.model").GridOptionsDefinition | undefined;
73
- config: import("../../core/models/report-grid.model").GridOptionsDefinition | undefined;
151
+ config: {
152
+ stateKey: string;
153
+ pageSize?: number;
154
+ pagination?: boolean;
155
+ selectable?: boolean;
156
+ selectionMode?: "single" | "multiple";
157
+ showRowNumbers?: boolean;
158
+ allowColumnReorder?: boolean;
159
+ allowExport?: boolean;
160
+ exportFormats?: ("csv" | "excel" | "pdf")[];
161
+ showFooter?: boolean;
162
+ height?: string;
163
+ groupModel?: string[];
164
+ sortModel?: unknown[];
165
+ reportState?: Record<string, unknown>;
166
+ presets?: unknown[];
167
+ rowClickAction?: import("../../core/models/report-grid.model").GridRowClickAction;
168
+ };
169
+ reportState: {
170
+ columnGroupDefs: null;
171
+ columnDefs: {
172
+ headerName: string;
173
+ header: string;
174
+ title: string;
175
+ hide: boolean;
176
+ width: number | undefined;
177
+ aggFunc: "sum" | "avg" | "count" | "min" | "max" | undefined;
178
+ field: string;
179
+ label: string;
180
+ dataType?: "string" | "number" | "date" | "boolean" | "currency";
181
+ format?: string;
182
+ sortable?: boolean;
183
+ filterable?: boolean;
184
+ align?: "left" | "center" | "right";
185
+ visible?: boolean;
186
+ pinned?: "left" | "right" | false;
187
+ order?: number;
188
+ aggregate?: "sum" | "avg" | "count" | "min" | "max" | "none";
189
+ action?: import("../../core/models/report-grid.model").GridRowClickAction;
190
+ }[];
191
+ sortModel: any;
192
+ groupModel: string[];
193
+ activeFilters: {};
194
+ highlightRules: never[];
195
+ };
74
196
  pagination: boolean;
75
197
  pageSize: number;
76
198
  }>;
77
- readonly visibleColumns: import("@angular/core").Signal<GridColumnDefinition[]>;
78
199
  readonly showRowNumbers: import("@angular/core").Signal<boolean>;
79
200
  readonly isPaginationEnabled: import("@angular/core").Signal<boolean>;
80
201
  readonly pageSize: import("@angular/core").Signal<number>;
@@ -89,6 +210,8 @@ export declare class ReportGridBridgeComponent {
89
210
  nextPage(): void;
90
211
  formatValue(value: unknown, col: GridColumnDefinition): string;
91
212
  computeAggregate(col: GridColumnDefinition): string;
213
+ onRowClick(row: Record<string, unknown>, event: MouseEvent): void;
214
+ onCellClick(row: Record<string, unknown>, col: GridColumnDefinition, event: MouseEvent): void;
92
215
  static ɵfac: i0.ɵɵFactoryDeclaration<ReportGridBridgeComponent, never>;
93
- static ɵcmp: i0.ɵɵComponentDeclaration<ReportGridBridgeComponent, "rpt-grid-bridge", never, { "gridDefinition": { "alias": "gridDefinition"; "required": true; "isSignal": true; }; "data": { "alias": "data"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
216
+ static ɵcmp: i0.ɵɵComponentDeclaration<ReportGridBridgeComponent, "rpt-grid-bridge", never, { "gridDefinition": { "alias": "gridDefinition"; "required": true; "isSignal": true; }; "data": { "alias": "data"; "required": false; "isSignal": true; }; }, { "gridStateChange": "gridStateChange"; "columnDefsChange": "columnDefsChange"; "rowClick": "rowClick"; }, never, never, true, never>;
94
217
  }
@@ -1,26 +1,108 @@
1
1
  import { ReportDefinition } from '../../core/models/report-definition.model';
2
+ import { ReportComponentDefinition } from '../../core/models/report-component.model';
3
+ import { ComponentActionDefinition } from '../../core/models/component-event.model';
4
+ import { GridRowClickAction } from '../../core/models/report-grid.model';
2
5
  import * as i0 from "@angular/core";
3
6
  export declare class ReportRuntimeComponent {
4
7
  private readonly persistenceAdapter;
5
8
  private readonly dataSourceAdapter;
6
9
  private readonly sessionService;
10
+ private readonly executionService;
7
11
  /** Report ID to load via persistence adapter */
8
12
  readonly reportId: import("@angular/core").InputSignal<string | undefined>;
9
13
  /** Directly passed report definition (skips persistence adapter) */
10
14
  readonly definition: import("@angular/core").InputSignal<ReportDefinition | null>;
15
+ readonly resetRequested: import("@angular/core").OutputEmitterRef<{
16
+ definition: ReportDefinition;
17
+ }>;
18
+ readonly exportRequested: import("@angular/core").OutputEmitterRef<{
19
+ format: string;
20
+ fileName?: string;
21
+ parameters: Record<string, unknown>;
22
+ data: unknown[] | null;
23
+ }>;
24
+ readonly printRequested: import("@angular/core").OutputEmitterRef<{
25
+ rptFileName?: string;
26
+ exportType?: string;
27
+ parameters: Record<string, unknown>;
28
+ }>;
29
+ readonly customActionTriggered: import("@angular/core").OutputEmitterRef<{
30
+ action: ComponentActionDefinition;
31
+ component: ReportComponentDefinition;
32
+ parameters: Record<string, unknown>;
33
+ }>;
34
+ readonly gridStateChange: import("@angular/core").OutputEmitterRef<any>;
35
+ readonly columnDefsChange: import("@angular/core").OutputEmitterRef<any>;
36
+ readonly rowActionTriggered: import("@angular/core").OutputEmitterRef<{
37
+ action: GridRowClickAction;
38
+ row: Record<string, unknown>;
39
+ parameters: Record<string, unknown>;
40
+ }>;
41
+ readonly drilldownRequested: import("@angular/core").OutputEmitterRef<{
42
+ targetReportId: string;
43
+ parameters: Record<string, unknown>;
44
+ row: Record<string, unknown>;
45
+ }>;
11
46
  readonly internalDefinition: import("@angular/core").WritableSignal<ReportDefinition | null>;
12
47
  readonly resultData: import("@angular/core").WritableSignal<unknown[] | null>;
13
48
  readonly isLoading: import("@angular/core").WritableSignal<boolean>;
14
49
  readonly loadingMessage: import("@angular/core").WritableSignal<string>;
15
50
  readonly errorMessage: import("@angular/core").WritableSignal<string | null>;
51
+ readonly isDrawerOpen: import("@angular/core").WritableSignal<boolean>;
52
+ readonly drawerTitle: import("@angular/core").WritableSignal<string>;
53
+ readonly drawerWidth: import("@angular/core").WritableSignal<string>;
54
+ readonly drawerDefinition: import("@angular/core").WritableSignal<ReportDefinition | null>;
55
+ readonly drawerParameters: import("@angular/core").WritableSignal<Record<string, unknown>>;
56
+ readonly drawerResultData: import("@angular/core").WritableSignal<unknown[] | null>;
57
+ readonly drawerContextBadge: import("@angular/core").WritableSignal<string | null>;
58
+ readonly isDrawerLoading: import("@angular/core").WritableSignal<boolean>;
59
+ readonly drawerLoadingMessage: import("@angular/core").WritableSignal<string>;
60
+ readonly drawerError: import("@angular/core").WritableSignal<string | null>;
61
+ private activeDrawerTargetId;
62
+ private activeDrawerRow;
63
+ private activeDrawerAction?;
16
64
  readonly currentDefinition: import("@angular/core").Signal<ReportDefinition | null>;
17
65
  constructor();
66
+ onEscape(): void;
18
67
  loadReport(id: string): void;
19
68
  onExecuteReport(event: {
20
69
  definition: ReportDefinition;
21
70
  parameters: Record<string, unknown>;
22
71
  }): void;
72
+ onResetReport(event: {
73
+ definition: ReportDefinition;
74
+ }): void;
75
+ onExportRequested(event: {
76
+ format: string;
77
+ fileName?: string;
78
+ parameters: Record<string, unknown>;
79
+ data: unknown[] | null;
80
+ }): void;
81
+ onPrintRequested(event: {
82
+ rptFileName?: string;
83
+ exportType?: string;
84
+ parameters: Record<string, unknown>;
85
+ }): void;
86
+ onCustomAction(event: {
87
+ action: ComponentActionDefinition;
88
+ component: ReportComponentDefinition;
89
+ parameters: Record<string, unknown>;
90
+ }): void;
91
+ onRowActionTriggered(event: {
92
+ action: GridRowClickAction;
93
+ row: Record<string, unknown>;
94
+ parameters: Record<string, unknown>;
95
+ }): void;
96
+ openDrilldownDrawer(targetReportId: string, parameters: Record<string, unknown>, row: Record<string, unknown>, action?: GridRowClickAction): void;
97
+ private executeDrawerReport;
98
+ onDrawerExecute(event: {
99
+ definition: ReportDefinition;
100
+ parameters: Record<string, unknown>;
101
+ }): void;
102
+ onEscapePressed(): void;
103
+ closeDrawer(): void;
104
+ retryDrawer(): void;
23
105
  retry(): void;
24
106
  static ɵfac: i0.ɵɵFactoryDeclaration<ReportRuntimeComponent, never>;
25
- static ɵcmp: i0.ɵɵComponentDeclaration<ReportRuntimeComponent, "rpt-report-runtime, rpt-runtime", never, { "reportId": { "alias": "reportId"; "required": false; "isSignal": true; }; "definition": { "alias": "report"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
107
+ static ɵcmp: i0.ɵɵComponentDeclaration<ReportRuntimeComponent, "rpt-report-runtime, rpt-runtime", never, { "reportId": { "alias": "reportId"; "required": false; "isSignal": true; }; "definition": { "alias": "report"; "required": false; "isSignal": true; }; }, { "resetRequested": "resetRequested"; "exportRequested": "exportRequested"; "printRequested": "printRequested"; "customActionTriggered": "customActionTriggered"; "gridStateChange": "gridStateChange"; "columnDefsChange": "columnDefsChange"; "rowActionTriggered": "rowActionTriggered"; "drilldownRequested": "drilldownRequested"; }, never, never, true, never>;
26
108
  }
@@ -0,0 +1,66 @@
1
+ import { ReportDefinition } from '../../core/models/report-definition.model';
2
+ import { GridRowClickAction } from '../../core/models/report-grid.model';
3
+ import { ReportRuntimeComponent } from './report-runtime.component';
4
+ import * as i0 from "@angular/core";
5
+ export interface ReportViewPreset {
6
+ id: string;
7
+ name: string;
8
+ gridState: Record<string, unknown>;
9
+ formValues?: Record<string, unknown>;
10
+ createdAt?: string;
11
+ }
12
+ export declare class RptReportComponent {
13
+ private readonly exportService;
14
+ private readonly persistence;
15
+ readonly id: import("@angular/core").InputSignal<string | undefined>;
16
+ readonly report: import("@angular/core").InputSignal<ReportDefinition | null>;
17
+ readonly parameters: import("@angular/core").InputSignal<Record<string, unknown>>;
18
+ readonly showExport: import("@angular/core").InputSignal<boolean>;
19
+ readonly enablePresets: import("@angular/core").InputSignal<boolean>;
20
+ readonly autoExecute: import("@angular/core").InputSignal<boolean>;
21
+ readonly rowClick: import("@angular/core").OutputEmitterRef<{
22
+ row: Record<string, unknown>;
23
+ parameters: Record<string, unknown>;
24
+ action?: GridRowClickAction;
25
+ }>;
26
+ readonly dataLoaded: import("@angular/core").OutputEmitterRef<unknown[]>;
27
+ readonly gridStateChange: import("@angular/core").OutputEmitterRef<any>;
28
+ readonly presetSaved: import("@angular/core").OutputEmitterRef<{
29
+ name: string;
30
+ preset: ReportViewPreset;
31
+ }>;
32
+ readonly presetChange: import("@angular/core").OutputEmitterRef<ReportViewPreset | null>;
33
+ readonly exportRequested: import("@angular/core").OutputEmitterRef<any>;
34
+ readonly printRequested: import("@angular/core").OutputEmitterRef<any>;
35
+ readonly runtimeComponent: import("@angular/core").Signal<ReportRuntimeComponent | undefined>;
36
+ readonly activePresetId: import("@angular/core").WritableSignal<string>;
37
+ readonly isSavePresetModalOpen: import("@angular/core").WritableSignal<boolean>;
38
+ readonly newPresetName: import("@angular/core").WritableSignal<string>;
39
+ readonly latestGridState: import("@angular/core").WritableSignal<Record<string, unknown> | null>;
40
+ readonly customPresets: import("@angular/core").WritableSignal<ReportViewPreset[]>;
41
+ readonly currentDefinition: import("@angular/core").Signal<ReportDefinition | null>;
42
+ readonly activeDefinition: import("@angular/core").Signal<ReportDefinition | null>;
43
+ readonly recordCount: import("@angular/core").Signal<number>;
44
+ readonly showToolbar: import("@angular/core").Signal<boolean>;
45
+ readonly savedPresets: import("@angular/core").Signal<ReportViewPreset[]>;
46
+ onRowActionTriggered(event: {
47
+ action: GridRowClickAction;
48
+ row: Record<string, unknown>;
49
+ parameters: Record<string, unknown>;
50
+ }): void;
51
+ onGridStateChanged(state: any): void;
52
+ onSelectPreset(presetId: string): void;
53
+ confirmSavePreset(): void;
54
+ exportExcel(): void;
55
+ exportCsv(): void;
56
+ print(): void;
57
+ openSavePresetModal(): void;
58
+ closeSavePresetModal(): void;
59
+ saveCurrentPreset(): void;
60
+ deletePreset(presetId: string): void;
61
+ onExportExcel(): void;
62
+ onExportCsv(): void;
63
+ onPrintReport(): void;
64
+ static ɵfac: i0.ɵɵFactoryDeclaration<RptReportComponent, never>;
65
+ static ɵcmp: i0.ɵɵComponentDeclaration<RptReportComponent, "rpt-report, rpt-view", never, { "id": { "alias": "id"; "required": false; "isSignal": true; }; "report": { "alias": "report"; "required": false; "isSignal": true; }; "parameters": { "alias": "parameters"; "required": false; "isSignal": true; }; "showExport": { "alias": "showExport"; "required": false; "isSignal": true; }; "enablePresets": { "alias": "enablePresets"; "required": false; "isSignal": true; }; "autoExecute": { "alias": "autoExecute"; "required": false; "isSignal": true; }; }, { "rowClick": "rowClick"; "dataLoaded": "dataLoaded"; "gridStateChange": "gridStateChange"; "presetSaved": "presetSaved"; "presetChange": "presetChange"; "exportRequested": "exportRequested"; "printRequested": "printRequested"; }, never, never, true, never>;
66
+ }