bways-report 0.1.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 (185) hide show
  1. package/LICENSE +26 -0
  2. package/README.md +477 -0
  3. package/esm2022/bways-report.mjs +5 -0
  4. package/esm2022/lib/core/errors/index.mjs +2 -0
  5. package/esm2022/lib/core/errors/reporting-errors.mjs +65 -0
  6. package/esm2022/lib/core/index.mjs +8 -0
  7. package/esm2022/lib/core/models/component-event.model.mjs +8 -0
  8. package/esm2022/lib/core/models/index.mjs +5 -0
  9. package/esm2022/lib/core/models/report-component.model.mjs +10 -0
  10. package/esm2022/lib/core/models/report-datasource.model.mjs +9 -0
  11. package/esm2022/lib/core/models/report-definition.model.mjs +13 -0
  12. package/esm2022/lib/core/models/report-grid.model.mjs +10 -0
  13. package/esm2022/lib/core/models/report-layout.model.mjs +9 -0
  14. package/esm2022/lib/core/models/report-parameter.model.mjs +9 -0
  15. package/esm2022/lib/core/models/validation.model.mjs +8 -0
  16. package/esm2022/lib/core/registry/component-category.mjs +8 -0
  17. package/esm2022/lib/core/registry/component-registry.mjs +90 -0
  18. package/esm2022/lib/core/registry/index.mjs +2 -0
  19. package/esm2022/lib/core/registry/property-definition.model.mjs +10 -0
  20. package/esm2022/lib/core/services/dynamic-form-builder.service.mjs +55 -0
  21. package/esm2022/lib/core/services/index.mjs +3 -0
  22. package/esm2022/lib/core/services/report-session-context.service.mjs +314 -0
  23. package/esm2022/lib/core/tokens/index.mjs +3 -0
  24. package/esm2022/lib/core/tokens/reporting-config.token.mjs +26 -0
  25. package/esm2022/lib/core/tokens/session-context.token.mjs +18 -0
  26. package/esm2022/lib/core/utilities/id-generator.mjs +17 -0
  27. package/esm2022/lib/core/utilities/index.mjs +3 -0
  28. package/esm2022/lib/core/utilities/schema-migration.mjs +38 -0
  29. package/esm2022/lib/core/utils/identifier-humanizer.mjs +88 -0
  30. package/esm2022/lib/core/validation/index.mjs +2 -0
  31. package/esm2022/lib/core/validation/validation-factory.mjs +70 -0
  32. package/esm2022/lib/data-access/adapters/http-lookup.adapter.mjs +107 -0
  33. package/esm2022/lib/data-access/adapters/http-schema-discovery.adapter.mjs +119 -0
  34. package/esm2022/lib/data-access/adapters/index.mjs +3 -0
  35. package/esm2022/lib/data-access/contracts/data-source.contract.mjs +28 -0
  36. package/esm2022/lib/data-access/contracts/index.mjs +7 -0
  37. package/esm2022/lib/data-access/contracts/lookup.contract.mjs +6 -0
  38. package/esm2022/lib/data-access/contracts/master-data.provider.mjs +24 -0
  39. package/esm2022/lib/data-access/contracts/report-persistence.contract.mjs +25 -0
  40. package/esm2022/lib/data-access/contracts/schema-discovery.contract.mjs +7 -0
  41. package/esm2022/lib/data-access/contracts/translation.contract.mjs +9 -0
  42. package/esm2022/lib/data-access/index.mjs +3 -0
  43. package/esm2022/lib/features/designer/components/component-palette/component-palette.component.mjs +542 -0
  44. package/esm2022/lib/features/designer/components/design-canvas/design-canvas.component.mjs +843 -0
  45. package/esm2022/lib/features/designer/components/property-editor/parameter-binding-editor.component.mjs +556 -0
  46. package/esm2022/lib/features/designer/components/property-editor/property-editor-datasource.component.mjs +845 -0
  47. package/esm2022/lib/features/designer/components/property-editor/property-editor-general.component.mjs +185 -0
  48. package/esm2022/lib/features/designer/components/property-editor/property-editor-grid.component.mjs +452 -0
  49. package/esm2022/lib/features/designer/components/property-editor/property-editor-layout.component.mjs +350 -0
  50. package/esm2022/lib/features/designer/components/property-editor/property-editor-report.component.mjs +175 -0
  51. package/esm2022/lib/features/designer/components/property-editor/property-editor-validation.component.mjs +137 -0
  52. package/esm2022/lib/features/designer/components/property-editor/property-editor.component.mjs +608 -0
  53. package/esm2022/lib/features/designer/components/toolbar/designer-toolbar.component.mjs +225 -0
  54. package/esm2022/lib/features/designer/designer.component.mjs +285 -0
  55. package/esm2022/lib/features/designer/index.mjs +7 -0
  56. package/esm2022/lib/features/designer/services/designer-state.service.mjs +310 -0
  57. package/esm2022/lib/features/designer/services/index.mjs +2 -0
  58. package/esm2022/lib/features/designer/utilities/canvas-layout.util.mjs +124 -0
  59. package/esm2022/lib/features/export/index.mjs +2 -0
  60. package/esm2022/lib/features/export/models/export.models.mjs +2 -0
  61. package/esm2022/lib/features/export/services/report-export.service.mjs +107 -0
  62. package/esm2022/lib/features/index.mjs +6 -0
  63. package/esm2022/lib/features/persistence/index.mjs +2 -0
  64. package/esm2022/lib/features/persistence/services/index.mjs +4 -0
  65. package/esm2022/lib/features/persistence/services/report-store.service.mjs +183 -0
  66. package/esm2022/lib/features/persistence/services/report-versioning.service.mjs +81 -0
  67. package/esm2022/lib/features/persistence/services/schema-validator.service.mjs +102 -0
  68. package/esm2022/lib/features/routing/components/routed-report-designer.component.mjs +156 -0
  69. package/esm2022/lib/features/routing/components/routed-report-runtime.component.mjs +163 -0
  70. package/esm2022/lib/features/routing/index.mjs +6 -0
  71. package/esm2022/lib/features/routing/models/report-route.models.mjs +2 -0
  72. package/esm2022/lib/features/routing/report-routes.mjs +49 -0
  73. package/esm2022/lib/features/routing/resolvers/report.resolver.mjs +22 -0
  74. package/esm2022/lib/features/routing/services/report-menu.service.mjs +77 -0
  75. package/esm2022/lib/features/runtime/dynamic-renderer.component.mjs +222 -0
  76. package/esm2022/lib/features/runtime/index.mjs +4 -0
  77. package/esm2022/lib/features/runtime/report-grid-bridge.component.mjs +409 -0
  78. package/esm2022/lib/features/runtime/report-runtime.component.mjs +147 -0
  79. package/esm2022/lib/primitives/components/button/rpt-button.component.mjs +88 -0
  80. package/esm2022/lib/primitives/components/chart-bridge/report-chart-bridge.component.mjs +361 -0
  81. package/esm2022/lib/primitives/components/checkbox/rpt-checkbox.component.mjs +86 -0
  82. package/esm2022/lib/primitives/components/date/rpt-date.component.mjs +91 -0
  83. package/esm2022/lib/primitives/components/dropdown/rpt-dropdown.component.mjs +204 -0
  84. package/esm2022/lib/primitives/components/icon/rpt-icon.component.mjs +476 -0
  85. package/esm2022/lib/primitives/components/index.mjs +10 -0
  86. package/esm2022/lib/primitives/components/input/rpt-input.component.mjs +88 -0
  87. package/esm2022/lib/primitives/components/kpi-card/rpt-kpi-card.component.mjs +197 -0
  88. package/esm2022/lib/primitives/components/number/rpt-number.component.mjs +110 -0
  89. package/esm2022/lib/primitives/index.mjs +3 -0
  90. package/esm2022/lib/primitives/register-builtins.mjs +328 -0
  91. package/esm2022/lib/provide-reporting.mjs +92 -0
  92. package/esm2022/public-api.mjs +9 -0
  93. package/fesm2022/bways-report.mjs +10360 -0
  94. package/fesm2022/bways-report.mjs.map +1 -0
  95. package/index.d.ts +5 -0
  96. package/lib/core/errors/index.d.ts +1 -0
  97. package/lib/core/errors/reporting-errors.d.ts +42 -0
  98. package/lib/core/index.d.ts +7 -0
  99. package/lib/core/models/component-event.model.d.ts +37 -0
  100. package/lib/core/models/index.d.ts +11 -0
  101. package/lib/core/models/report-component.model.d.ts +95 -0
  102. package/lib/core/models/report-datasource.model.d.ts +39 -0
  103. package/lib/core/models/report-definition.model.d.ts +100 -0
  104. package/lib/core/models/report-grid.model.d.ts +73 -0
  105. package/lib/core/models/report-layout.model.d.ts +43 -0
  106. package/lib/core/models/report-parameter.model.d.ts +22 -0
  107. package/lib/core/models/validation.model.d.ts +30 -0
  108. package/lib/core/registry/component-category.d.ts +16 -0
  109. package/lib/core/registry/component-registry.d.ts +101 -0
  110. package/lib/core/registry/index.d.ts +4 -0
  111. package/lib/core/registry/property-definition.model.d.ts +38 -0
  112. package/lib/core/services/dynamic-form-builder.service.d.ts +30 -0
  113. package/lib/core/services/index.d.ts +3 -0
  114. package/lib/core/services/report-session-context.service.d.ts +87 -0
  115. package/lib/core/tokens/index.d.ts +4 -0
  116. package/lib/core/tokens/reporting-config.token.d.ts +42 -0
  117. package/lib/core/tokens/session-context.token.d.ts +36 -0
  118. package/lib/core/utilities/id-generator.d.ts +9 -0
  119. package/lib/core/utilities/index.d.ts +3 -0
  120. package/lib/core/utilities/schema-migration.d.ts +10 -0
  121. package/lib/core/utils/identifier-humanizer.d.ts +22 -0
  122. package/lib/core/validation/index.d.ts +1 -0
  123. package/lib/core/validation/validation-factory.d.ts +31 -0
  124. package/lib/data-access/adapters/http-lookup.adapter.d.ts +19 -0
  125. package/lib/data-access/adapters/http-schema-discovery.adapter.d.ts +20 -0
  126. package/lib/data-access/adapters/index.d.ts +2 -0
  127. package/lib/data-access/contracts/data-source.contract.d.ts +37 -0
  128. package/lib/data-access/contracts/index.d.ts +9 -0
  129. package/lib/data-access/contracts/lookup.contract.d.ts +32 -0
  130. package/lib/data-access/contracts/master-data.provider.d.ts +54 -0
  131. package/lib/data-access/contracts/report-persistence.contract.d.ts +36 -0
  132. package/lib/data-access/contracts/schema-discovery.contract.d.ts +52 -0
  133. package/lib/data-access/contracts/translation.contract.d.ts +16 -0
  134. package/lib/data-access/index.d.ts +2 -0
  135. package/lib/features/designer/components/component-palette/component-palette.component.d.ts +39 -0
  136. package/lib/features/designer/components/design-canvas/design-canvas.component.d.ts +42 -0
  137. package/lib/features/designer/components/property-editor/parameter-binding-editor.component.d.ts +36 -0
  138. package/lib/features/designer/components/property-editor/property-editor-datasource.component.d.ts +68 -0
  139. package/lib/features/designer/components/property-editor/property-editor-general.component.d.ts +20 -0
  140. package/lib/features/designer/components/property-editor/property-editor-grid.component.d.ts +20 -0
  141. package/lib/features/designer/components/property-editor/property-editor-layout.component.d.ts +18 -0
  142. package/lib/features/designer/components/property-editor/property-editor-report.component.d.ts +15 -0
  143. package/lib/features/designer/components/property-editor/property-editor-validation.component.d.ts +12 -0
  144. package/lib/features/designer/components/property-editor/property-editor.component.d.ts +44 -0
  145. package/lib/features/designer/components/toolbar/designer-toolbar.component.d.ts +18 -0
  146. package/lib/features/designer/designer.component.d.ts +36 -0
  147. package/lib/features/designer/index.d.ts +7 -0
  148. package/lib/features/designer/services/designer-state.service.d.ts +103 -0
  149. package/lib/features/designer/services/index.d.ts +2 -0
  150. package/lib/features/designer/utilities/canvas-layout.util.d.ts +55 -0
  151. package/lib/features/export/index.d.ts +2 -0
  152. package/lib/features/export/models/export.models.d.ts +16 -0
  153. package/lib/features/export/services/report-export.service.d.ts +27 -0
  154. package/lib/features/index.d.ts +5 -0
  155. package/lib/features/persistence/index.d.ts +1 -0
  156. package/lib/features/persistence/services/index.d.ts +5 -0
  157. package/lib/features/persistence/services/report-store.service.d.ts +53 -0
  158. package/lib/features/persistence/services/report-versioning.service.d.ts +29 -0
  159. package/lib/features/persistence/services/schema-validator.service.d.ts +34 -0
  160. package/lib/features/routing/components/routed-report-designer.component.d.ts +18 -0
  161. package/lib/features/routing/components/routed-report-runtime.component.d.ts +18 -0
  162. package/lib/features/routing/index.d.ts +6 -0
  163. package/lib/features/routing/models/report-route.models.d.ts +41 -0
  164. package/lib/features/routing/report-routes.d.ts +16 -0
  165. package/lib/features/routing/resolvers/report.resolver.d.ts +7 -0
  166. package/lib/features/routing/services/report-menu.service.d.ts +30 -0
  167. package/lib/features/runtime/dynamic-renderer.component.d.ts +30 -0
  168. package/lib/features/runtime/index.d.ts +3 -0
  169. package/lib/features/runtime/report-grid-bridge.component.d.ts +94 -0
  170. package/lib/features/runtime/report-runtime.component.d.ts +26 -0
  171. package/lib/primitives/components/button/rpt-button.component.d.ts +19 -0
  172. package/lib/primitives/components/chart-bridge/report-chart-bridge.component.d.ts +45 -0
  173. package/lib/primitives/components/checkbox/rpt-checkbox.component.d.ts +14 -0
  174. package/lib/primitives/components/date/rpt-date.component.d.ts +17 -0
  175. package/lib/primitives/components/dropdown/rpt-dropdown.component.d.ts +32 -0
  176. package/lib/primitives/components/icon/rpt-icon.component.d.ts +41 -0
  177. package/lib/primitives/components/index.d.ts +12 -0
  178. package/lib/primitives/components/input/rpt-input.component.d.ts +16 -0
  179. package/lib/primitives/components/kpi-card/rpt-kpi-card.component.d.ts +43 -0
  180. package/lib/primitives/components/number/rpt-number.component.d.ts +20 -0
  181. package/lib/primitives/index.d.ts +2 -0
  182. package/lib/primitives/register-builtins.d.ts +11 -0
  183. package/lib/provide-reporting.d.ts +75 -0
  184. package/package.json +55 -0
  185. package/public-api.d.ts +5 -0
@@ -0,0 +1,39 @@
1
+ import { ReportingComponentMeta } from '../../../../core/registry/component-registry';
2
+ import * as i0 from "@angular/core";
3
+ export declare class ComponentPaletteComponent {
4
+ private readonly registry;
5
+ private readonly designerState;
6
+ readonly searchQuery: import("@angular/core").WritableSignal<string>;
7
+ /** Layout view mode: 'grid' (2-column side-by-side grid) or 'list' (compact row list). Defaults to 'grid'. */
8
+ readonly layoutMode: import("@angular/core").WritableSignal<"grid" | "list">;
9
+ /** Set of expanded category IDs */
10
+ readonly expandedCategories: import("@angular/core").WritableSignal<Set<string>>;
11
+ readonly totalComponentCount: import("@angular/core").Signal<number>;
12
+ readonly categoryMeta: Record<string, {
13
+ label: string;
14
+ icon: string;
15
+ }>;
16
+ readonly filteredCategories: import("@angular/core").Signal<{
17
+ name: string;
18
+ label: string;
19
+ icon: string;
20
+ items: ReportingComponentMeta[];
21
+ }[]>;
22
+ readonly allExpanded: import("@angular/core").Signal<boolean>;
23
+ isCategoryExpanded(categoryName: string): boolean;
24
+ toggleCategory(categoryName: string): void;
25
+ toggleAllCategories(): void;
26
+ getIconName(item: ReportingComponentMeta): string;
27
+ onItemDoubleClick(type: string): void;
28
+ onAddClick(event: MouseEvent, type: string): void;
29
+ static ɵfac: i0.ɵɵFactoryDeclaration<ComponentPaletteComponent, never>;
30
+ static ɵcmp: i0.ɵɵComponentDeclaration<ComponentPaletteComponent, "rpt-component-palette", never, {}, {}, never, never, true, never>;
31
+ }
32
+ /** Dictionary of synonyms for component types and UI concepts */
33
+ export declare const COMPONENT_SYNONYMS: Record<string, string[]>;
34
+ /** Compute Levenshtein distance between two strings for typo tolerance */
35
+ export declare function levenshteinDistance(a: string, b: string): number;
36
+ /** Check if a search term matches a target word (substring or misspelling) */
37
+ export declare function fuzzyMatchWord(target: string, term: string): boolean;
38
+ /** Pure predicate to check if a component metadata item matches a search query */
39
+ export declare function matchesSearchQuery(item: ReportingComponentMeta, rawQuery: string): boolean;
@@ -0,0 +1,42 @@
1
+ import { CdkDragDrop } from '@angular/cdk/drag-drop';
2
+ import { ReportComponentDefinition } from '../../../../core/models/report-component.model';
3
+ import { getComponentIconName } from '../../utilities/canvas-layout.util';
4
+ import * as i0 from "@angular/core";
5
+ export declare class DesignCanvasComponent {
6
+ private readonly designerState;
7
+ readonly definition: import("@angular/core").WritableSignal<import("bways-report").ReportDefinition>;
8
+ readonly components: import("@angular/core").Signal<ReportComponentDefinition[]>;
9
+ readonly selectedId: import("@angular/core").WritableSignal<string | null>;
10
+ readonly totalColumns: import("@angular/core").Signal<number>;
11
+ readonly gridTemplateColumns: import("@angular/core").Signal<string>;
12
+ readonly sortedComponents: import("@angular/core").Signal<ReportComponentDefinition[]>;
13
+ readonly resizingCompId: import("@angular/core").WritableSignal<string | null>;
14
+ readonly resizingSpan: import("@angular/core").WritableSignal<number | null>;
15
+ readonly resizingHeight: import("@angular/core").WritableSignal<number | null>;
16
+ readonly isAnyResizing: import("@angular/core").Signal<boolean>;
17
+ isSelected(id: string): boolean;
18
+ getSpan(comp: ReportComponentDefinition): number;
19
+ getGridColumn(comp: ReportComponentDefinition): string;
20
+ toggleNewRow(comp: ReportComponentDefinition, event: MouseEvent): void;
21
+ getGridRow(comp: ReportComponentDefinition): string;
22
+ getComponentHeight(comp: ReportComponentDefinition): string;
23
+ getComponentMinHeight(comp: ReportComponentDefinition): string;
24
+ getCustomBtnHeight(comp: ReportComponentDefinition): string | null;
25
+ getCustomBtnWidth(comp: ReportComponentDefinition): string | null;
26
+ getCustomBtnIcon(comp: ReportComponentDefinition): string;
27
+ resizingTooltip(comp: ReportComponentDefinition): string;
28
+ readonly getComponentIconName: typeof getComponentIconName;
29
+ onSelect(id: string, event: MouseEvent): void;
30
+ adjustSpan(comp: ReportComponentDefinition, delta: number, event: MouseEvent): void;
31
+ onDuplicate(id: string, event: MouseEvent): void;
32
+ onDelete(id: string, event: MouseEvent): void;
33
+ onEscape(): void;
34
+ onCanvasBackgroundClick(event: MouseEvent): void;
35
+ selectReportSettings(event?: MouseEvent): void;
36
+ selectGridSettings(event?: MouseEvent): void;
37
+ startResize(event: PointerEvent, comp: ReportComponentDefinition, direction: 'e' | 's' | 'se'): void;
38
+ resetDimensions(comp: ReportComponentDefinition, event?: MouseEvent): void;
39
+ onDrop(event: CdkDragDrop<ReportComponentDefinition[], unknown, unknown>): void;
40
+ static ɵfac: i0.ɵɵFactoryDeclaration<DesignCanvasComponent, never>;
41
+ static ɵcmp: i0.ɵɵComponentDeclaration<DesignCanvasComponent, "rpt-design-canvas", never, {}, {}, never, never, true, never>;
42
+ }
@@ -0,0 +1,36 @@
1
+ import { ProcedureParameterMetadata } from '../../../../data-access/contracts/schema-discovery.contract';
2
+ import { ReportComponentDefinition } from '../../../../core/models/report-component.model';
3
+ import * as i0 from "@angular/core";
4
+ export type ParameterBindingMode = 'session' | 'control' | 'fixed' | 'context' | 'custom';
5
+ export declare class ParameterBindingEditorComponent {
6
+ private readonly sessionService;
7
+ readonly param: import("@angular/core").InputSignal<ProcedureParameterMetadata>;
8
+ readonly currentValue: import("@angular/core").InputSignal<string | number | boolean>;
9
+ readonly allComponents: import("@angular/core").InputSignal<ReportComponentDefinition[]>;
10
+ readonly currentComponentId: import("@angular/core").InputSignal<string>;
11
+ readonly isAdvancedMode: import("@angular/core").InputSignal<boolean>;
12
+ readonly valueChange: import("@angular/core").OutputEmitterRef<string | number | boolean>;
13
+ readonly linkedFieldChange: import("@angular/core").OutputEmitterRef<{
14
+ paramName: string;
15
+ fieldKey: string;
16
+ isLinked: boolean;
17
+ }>;
18
+ readonly internalMode: import("@angular/core").WritableSignal<ParameterBindingMode | null>;
19
+ readonly sessionMatch: import("@angular/core").Signal<import("../../../../core/services/report-session-context.service").SessionParamMatch | null>;
20
+ readonly friendlyLabel: import("@angular/core").Signal<string>;
21
+ readonly displayType: import("@angular/core").Signal<"Text" | "Date" | "Number" | "Yes / No">;
22
+ readonly compatibleControls: import("@angular/core").Signal<ReportComponentDefinition[]>;
23
+ readonly hasValue: import("@angular/core").Signal<boolean>;
24
+ readonly activeMode: import("@angular/core").Signal<ParameterBindingMode>;
25
+ readonly isAutoSessionDerived: import("@angular/core").Signal<boolean>;
26
+ readonly selectedControlKey: import("@angular/core").Signal<string>;
27
+ readonly selectedContextKey: import("@angular/core").Signal<string>;
28
+ readonly booleanFixedValue: import("@angular/core").Signal<boolean>;
29
+ setMode(mode: ParameterBindingMode): void;
30
+ onControlSelected(key: string): void;
31
+ onBooleanChanged(checked: boolean): void;
32
+ onFixedValueChanged(val: unknown): void;
33
+ onContextSelected(ctxKey: string): void;
34
+ static ɵfac: i0.ɵɵFactoryDeclaration<ParameterBindingEditorComponent, never>;
35
+ static ɵcmp: i0.ɵɵComponentDeclaration<ParameterBindingEditorComponent, "rpt-parameter-binding-editor", never, { "param": { "alias": "param"; "required": true; "isSignal": true; }; "currentValue": { "alias": "currentValue"; "required": false; "isSignal": true; }; "allComponents": { "alias": "allComponents"; "required": false; "isSignal": true; }; "currentComponentId": { "alias": "currentComponentId"; "required": false; "isSignal": true; }; "isAdvancedMode": { "alias": "isAdvancedMode"; "required": false; "isSignal": true; }; }, { "valueChange": "valueChange"; "linkedFieldChange": "linkedFieldChange"; }, never, never, true, never>;
36
+ }
@@ -0,0 +1,68 @@
1
+ import { OnInit } from '@angular/core';
2
+ import { ComponentDataSourceDefinition, DropdownSourceType, ReportComponentDefinition } from '../../../../core/models/report-component.model';
3
+ import { DatabaseEntityMetadata, EntityColumnMetadata, ProcedureParameterMetadata } from '../../../../data-access/contracts/schema-discovery.contract';
4
+ import * as i0 from "@angular/core";
5
+ export interface StaticOptionItem {
6
+ key: string;
7
+ label: string;
8
+ }
9
+ export declare class PropertyEditorDatasourceComponent implements OnInit {
10
+ private readonly discoveryAdapter;
11
+ readonly comp: import("@angular/core").InputSignal<ReportComponentDefinition>;
12
+ readonly allComponents: import("@angular/core").InputSignal<ReportComponentDefinition[]>;
13
+ readonly updateDataSource: import("@angular/core").OutputEmitterRef<ComponentDataSourceDefinition>;
14
+ readonly updateProperty: import("@angular/core").OutputEmitterRef<{
15
+ key: string;
16
+ value: unknown;
17
+ }>;
18
+ readonly isAdvancedMode: import("@angular/core").WritableSignal<boolean>;
19
+ readonly allEntities: import("@angular/core").WritableSignal<DatabaseEntityMetadata[]>;
20
+ readonly entityColumns: import("@angular/core").WritableSignal<EntityColumnMetadata[]>;
21
+ readonly procedureParameters: import("@angular/core").WritableSignal<ProcedureParameterMetadata[]>;
22
+ readonly currentSourceType: import("@angular/core").Signal<DropdownSourceType>;
23
+ readonly selectedEntity: import("@angular/core").Signal<string>;
24
+ readonly selectedValueField: import("@angular/core").Signal<string>;
25
+ readonly selectedDisplayField: import("@angular/core").Signal<string>;
26
+ readonly selectedDependsOn: import("@angular/core").Signal<string>;
27
+ readonly availableTables: import("@angular/core").Signal<{
28
+ displayName: string;
29
+ name: string;
30
+ schema: string;
31
+ type: import("../../../../data-access/contracts/schema-discovery.contract").DatabaseEntityType;
32
+ friendlyName?: string;
33
+ category?: string;
34
+ description?: string;
35
+ }[]>;
36
+ readonly availableProcedures: import("@angular/core").Signal<{
37
+ displayName: string;
38
+ name: string;
39
+ schema: string;
40
+ type: import("../../../../data-access/contracts/schema-discovery.contract").DatabaseEntityType;
41
+ friendlyName?: string;
42
+ category?: string;
43
+ description?: string;
44
+ }[]>;
45
+ readonly availableParentFields: import("@angular/core").Signal<ReportComponentDefinition[]>;
46
+ readonly staticOptions: import("@angular/core").Signal<StaticOptionItem[]>;
47
+ constructor();
48
+ ngOnInit(): void;
49
+ loadEntities(): void;
50
+ loadEntityDetails(entityName: string, type: DropdownSourceType): void;
51
+ setSourceType(type: DropdownSourceType): void;
52
+ onEntitySelected(entityName: string): void;
53
+ onValueFieldChanged(valueField: string): void;
54
+ onDisplayFieldChanged(displayField: string): void;
55
+ onDependsOnChanged(parentKey: string): void;
56
+ getParamValue(paramName: string): string | number | boolean;
57
+ setParamValue(paramName: string, value: string | number | boolean): void;
58
+ onParamLinkedFieldChange(evt: {
59
+ paramName: string;
60
+ fieldKey: string;
61
+ isLinked: boolean;
62
+ }): void;
63
+ addStaticOption(): void;
64
+ updateStaticOption(index: number, field: 'key' | 'label', val: string): void;
65
+ removeStaticOption(index: number): void;
66
+ static ɵfac: i0.ɵɵFactoryDeclaration<PropertyEditorDatasourceComponent, never>;
67
+ static ɵcmp: i0.ɵɵComponentDeclaration<PropertyEditorDatasourceComponent, "rpt-property-editor-datasource", never, { "comp": { "alias": "comp"; "required": true; "isSignal": true; }; "allComponents": { "alias": "allComponents"; "required": false; "isSignal": true; }; }, { "updateDataSource": "updateDataSource"; "updateProperty": "updateProperty"; }, never, never, true, never>;
68
+ }
@@ -0,0 +1,20 @@
1
+ import { ReportComponentDefinition } from '../../../../core/models/report-component.model';
2
+ import { PropertyDefinition } from '../../../../core/registry/property-definition.model';
3
+ import * as i0 from "@angular/core";
4
+ export declare class PropertyEditorGeneralComponent {
5
+ readonly comp: import("@angular/core").InputSignal<ReportComponentDefinition>;
6
+ readonly propertySchema: import("@angular/core").InputSignal<PropertyDefinition[]>;
7
+ readonly filteredPropertySchema: import("@angular/core").Signal<PropertyDefinition[]>;
8
+ readonly update: import("@angular/core").OutputEmitterRef<{
9
+ field: string;
10
+ value: unknown;
11
+ }>;
12
+ readonly updateProperty: import("@angular/core").OutputEmitterRef<{
13
+ key: string;
14
+ value: unknown;
15
+ }>;
16
+ readonly deselect: import("@angular/core").OutputEmitterRef<void>;
17
+ getPropValue(key: string): unknown;
18
+ static ɵfac: i0.ɵɵFactoryDeclaration<PropertyEditorGeneralComponent, never>;
19
+ static ɵcmp: i0.ɵɵComponentDeclaration<PropertyEditorGeneralComponent, "rpt-property-editor-general", never, { "comp": { "alias": "comp"; "required": true; "isSignal": true; }; "propertySchema": { "alias": "propertySchema"; "required": false; "isSignal": true; }; }, { "update": "update"; "updateProperty": "updateProperty"; "deselect": "deselect"; }, never, never, true, never>;
20
+ }
@@ -0,0 +1,20 @@
1
+ import { GridColumnDefinition, ReportGridDefinition } from '../../../../core/models/report-grid.model';
2
+ import * as i0 from "@angular/core";
3
+ export declare class PropertyEditorGridComponent {
4
+ readonly grid: import("@angular/core").InputSignal<ReportGridDefinition | undefined>;
5
+ readonly addColumn: import("@angular/core").OutputEmitterRef<void>;
6
+ readonly removeColumn: import("@angular/core").OutputEmitterRef<number>;
7
+ readonly updateColumn: import("@angular/core").OutputEmitterRef<{
8
+ index: number;
9
+ field: string;
10
+ value: unknown;
11
+ }>;
12
+ readonly updateOption: import("@angular/core").OutputEmitterRef<{
13
+ field: string;
14
+ value: unknown;
15
+ }>;
16
+ readonly columns: import("@angular/core").Signal<GridColumnDefinition[]>;
17
+ onUpdateCol(index: number, field: string, value: unknown): void;
18
+ static ɵfac: i0.ɵɵFactoryDeclaration<PropertyEditorGridComponent, never>;
19
+ static ɵcmp: i0.ɵɵComponentDeclaration<PropertyEditorGridComponent, "rpt-property-editor-grid", never, { "grid": { "alias": "grid"; "required": false; "isSignal": true; }; }, { "addColumn": "addColumn"; "removeColumn": "removeColumn"; "updateColumn": "updateColumn"; "updateOption": "updateOption"; }, never, never, true, never>;
20
+ }
@@ -0,0 +1,18 @@
1
+ import { ReportComponentDefinition } from '../../../../core/models/report-component.model';
2
+ import { ComponentLayoutDefinition } from '../../../../core/models/report-layout.model';
3
+ import * as i0 from "@angular/core";
4
+ export declare class PropertyEditorLayoutComponent {
5
+ readonly comp: import("@angular/core").InputSignal<ReportComponentDefinition>;
6
+ readonly maxColumns: import("@angular/core").InputSignal<number>;
7
+ readonly updateLayout: import("@angular/core").OutputEmitterRef<{
8
+ key: keyof ComponentLayoutDefinition;
9
+ value: unknown;
10
+ }>;
11
+ readonly updateHeight: import("@angular/core").OutputEmitterRef<string>;
12
+ readonly resetDimensions: import("@angular/core").OutputEmitterRef<void>;
13
+ readonly columnList: import("@angular/core").Signal<number[]>;
14
+ onLayoutChange(key: keyof ComponentLayoutDefinition, value: unknown): void;
15
+ alignRight(): void;
16
+ static ɵfac: i0.ɵɵFactoryDeclaration<PropertyEditorLayoutComponent, never>;
17
+ static ɵcmp: i0.ɵɵComponentDeclaration<PropertyEditorLayoutComponent, "rpt-property-editor-layout", never, { "comp": { "alias": "comp"; "required": true; "isSignal": true; }; "maxColumns": { "alias": "maxColumns"; "required": false; "isSignal": true; }; }, { "updateLayout": "updateLayout"; "updateHeight": "updateHeight"; "resetDimensions": "resetDimensions"; }, never, never, true, never>;
18
+ }
@@ -0,0 +1,15 @@
1
+ import { ReportDefinition } from '../../../../core/models/report-definition.model';
2
+ import * as i0 from "@angular/core";
3
+ export declare class PropertyEditorReportComponent {
4
+ readonly definition: import("@angular/core").InputSignal<ReportDefinition>;
5
+ readonly updateReport: import("@angular/core").OutputEmitterRef<{
6
+ field: string;
7
+ value: unknown;
8
+ }>;
9
+ readonly updateLayout: import("@angular/core").OutputEmitterRef<{
10
+ field: string;
11
+ value: unknown;
12
+ }>;
13
+ static ɵfac: i0.ɵɵFactoryDeclaration<PropertyEditorReportComponent, never>;
14
+ static ɵcmp: i0.ɵɵComponentDeclaration<PropertyEditorReportComponent, "rpt-property-editor-report", never, { "definition": { "alias": "definition"; "required": true; "isSignal": true; }; }, { "updateReport": "updateReport"; "updateLayout": "updateLayout"; }, never, never, true, never>;
15
+ }
@@ -0,0 +1,12 @@
1
+ import { ReportComponentDefinition } from '../../../../core/models/report-component.model';
2
+ import * as i0 from "@angular/core";
3
+ export declare class PropertyEditorValidationComponent {
4
+ readonly comp: import("@angular/core").InputSignal<ReportComponentDefinition>;
5
+ readonly updateValidation: import("@angular/core").OutputEmitterRef<{
6
+ key: string;
7
+ value: unknown;
8
+ }>;
9
+ onMessageChange(val: string): void;
10
+ static ɵfac: i0.ɵɵFactoryDeclaration<PropertyEditorValidationComponent, never>;
11
+ static ɵcmp: i0.ɵɵComponentDeclaration<PropertyEditorValidationComponent, "rpt-property-editor-validation", never, { "comp": { "alias": "comp"; "required": true; "isSignal": true; }; }, { "updateValidation": "updateValidation"; }, never, never, true, never>;
12
+ }
@@ -0,0 +1,44 @@
1
+ import { DesignerActiveTab } from '../../services/designer-state.service';
2
+ import { PropertyDefinition } from '../../../../core/registry/property-definition.model';
3
+ import { ComponentLayoutDefinition } from '../../../../core/models/report-layout.model';
4
+ import { ComponentDataSourceDefinition, ReportComponentDefinition } from '../../../../core/models/report-component.model';
5
+ import * as i0 from "@angular/core";
6
+ /**
7
+ * Property Editor coordinator component.
8
+ *
9
+ * Decomposed into focused child presentational components per Rule 18 & 19 (Composition Over Giant Components)
10
+ * and Rule 32 (Avoid God Components).
11
+ */
12
+ export declare class PropertyEditorComponent {
13
+ private readonly designerState;
14
+ private readonly registry;
15
+ readonly definition: import("@angular/core").WritableSignal<import("bways-report").ReportDefinition>;
16
+ readonly activeTab: import("@angular/core").WritableSignal<DesignerActiveTab>;
17
+ readonly selectedComponent: import("@angular/core").Signal<ReportComponentDefinition | null>;
18
+ readonly maxColumns: import("@angular/core").Signal<number>;
19
+ readonly allComponents: import("@angular/core").Signal<ReportComponentDefinition[]>;
20
+ readonly propertySchema: import("@angular/core").Signal<PropertyDefinition[]>;
21
+ setTab(tab: DesignerActiveTab): void;
22
+ updateCompDataSource(id: string, dataSource: ComponentDataSourceDefinition): void;
23
+ deselect(): void;
24
+ updateComp(field: string, value: unknown): void;
25
+ updateProp(id: string, key: string, value: unknown): void;
26
+ updateLayout(key: keyof ComponentLayoutDefinition, value: unknown): void;
27
+ updateComponentHeight(val: string): void;
28
+ resetComponentDimensions(id: string, type: string): void;
29
+ updateValidation(key: string, value: unknown): void;
30
+ updateReport(key: string, value: unknown): void;
31
+ updateLayoutProp(key: string, value: unknown): void;
32
+ addColumn(): void;
33
+ removeColumn(index: number): void;
34
+ updateColumn(index: number, field: string, value: unknown): void;
35
+ updateGridOption(field: string, value: unknown): void;
36
+ readonly expandedSections: import("@angular/core").WritableSignal<Record<string, boolean>>;
37
+ toggleSection(section: string): void;
38
+ isSectionExpanded(section: string): boolean;
39
+ getDatasourceBadge(comp: ReportComponentDefinition): string;
40
+ getLayoutBadge(comp: ReportComponentDefinition): string;
41
+ getValidationBadge(comp: ReportComponentDefinition): string;
42
+ static ɵfac: i0.ɵɵFactoryDeclaration<PropertyEditorComponent, never>;
43
+ static ɵcmp: i0.ɵɵComponentDeclaration<PropertyEditorComponent, "rpt-property-editor", never, {}, {}, never, never, true, never>;
44
+ }
@@ -0,0 +1,18 @@
1
+ import { DesignerViewMode } from '../../services/designer-state.service';
2
+ import * as i0 from "@angular/core";
3
+ export declare class DesignerToolbarComponent {
4
+ private readonly designerState;
5
+ readonly definition: import("@angular/core").WritableSignal<import("bways-report").ReportDefinition>;
6
+ readonly viewMode: import("@angular/core").WritableSignal<DesignerViewMode>;
7
+ readonly isDirty: import("@angular/core").WritableSignal<boolean>;
8
+ readonly canUndo: import("@angular/core").Signal<boolean>;
9
+ readonly canRedo: import("@angular/core").Signal<boolean>;
10
+ readonly saveRequested: import("@angular/core").OutputEmitterRef<void>;
11
+ setMode(mode: DesignerViewMode): void;
12
+ undo(): void;
13
+ redo(): void;
14
+ saveReport(): void;
15
+ exportJson(): void;
16
+ static ɵfac: i0.ɵɵFactoryDeclaration<DesignerToolbarComponent, never>;
17
+ static ɵcmp: i0.ɵɵComponentDeclaration<DesignerToolbarComponent, "rpt-designer-toolbar", never, {}, { "saveRequested": "saveRequested"; }, never, never, true, never>;
18
+ }
@@ -0,0 +1,36 @@
1
+ import { OnInit } from '@angular/core';
2
+ import { ReportDefinition } from '../../core/models/report-definition.model';
3
+ import { DesignerStateService } from './services/designer-state.service';
4
+ import * as i0 from "@angular/core";
5
+ export declare class DesignerComponent implements OnInit {
6
+ readonly designerState: DesignerStateService;
7
+ private readonly persistenceAdapter;
8
+ private readonly dataSourceAdapter;
9
+ private readonly sessionService;
10
+ /** Optional reportId to load from persistence adapter */
11
+ readonly reportId: import("@angular/core").InputSignal<string | undefined>;
12
+ /** Optional definition to load directly */
13
+ readonly definition: import("@angular/core").InputSignal<ReportDefinition | null | undefined>;
14
+ /** Emitted when the user saves the report */
15
+ readonly reportSaved: import("@angular/core").OutputEmitterRef<ReportDefinition>;
16
+ /** Emitted whenever the report definition changes in the visual designer */
17
+ readonly definitionChanged: import("@angular/core").OutputEmitterRef<ReportDefinition>;
18
+ readonly currentDefinition: import("@angular/core").WritableSignal<ReportDefinition>;
19
+ readonly viewMode: import("@angular/core").WritableSignal<import("./services/designer-state.service").DesignerViewMode>;
20
+ readonly previewData: import("@angular/core").WritableSignal<unknown[] | null>;
21
+ readonly saveMessage: import("@angular/core").WritableSignal<string | null>;
22
+ readonly copyStatus: import("@angular/core").WritableSignal<string>;
23
+ readonly formattedJson: import("@angular/core").Signal<string>;
24
+ private loadedReportId;
25
+ constructor();
26
+ ngOnInit(): void;
27
+ onSave(): void;
28
+ onPreviewExecute(event: {
29
+ definition: ReportDefinition;
30
+ parameters: Record<string, unknown>;
31
+ }): void;
32
+ copyJson(): void;
33
+ private showToast;
34
+ static ɵfac: i0.ɵɵFactoryDeclaration<DesignerComponent, never>;
35
+ static ɵcmp: i0.ɵɵComponentDeclaration<DesignerComponent, "rpt-designer", never, { "reportId": { "alias": "reportId"; "required": false; "isSignal": true; }; "definition": { "alias": "initialReport"; "required": false; "isSignal": true; }; }, { "reportSaved": "save"; "definitionChanged": "definitionChange"; }, never, never, true, never>;
36
+ }
@@ -0,0 +1,7 @@
1
+ export { DesignerComponent } from './designer.component';
2
+ export { DesignerStateService, } from './services';
3
+ export type { DesignerViewMode, DesignerActiveTab, } from './services';
4
+ export { ComponentPaletteComponent } from './components/component-palette/component-palette.component';
5
+ export { DesignCanvasComponent } from './components/design-canvas/design-canvas.component';
6
+ export { PropertyEditorComponent } from './components/property-editor/property-editor.component';
7
+ export { DesignerToolbarComponent } from './components/toolbar/designer-toolbar.component';
@@ -0,0 +1,103 @@
1
+ import { ReportDefinition } from '../../../core/models/report-definition.model';
2
+ import { ReportComponentDefinition } from '../../../core/models/report-component.model';
3
+ import { ComponentLayoutDefinition } from '../../../core/models/report-layout.model';
4
+ import { ReportGridDefinition } from '../../../core/models/report-grid.model';
5
+ import * as i0 from "@angular/core";
6
+ export type DesignerViewMode = 'design' | 'preview' | 'json';
7
+ export type DesignerActiveTab = 'properties' | 'report' | 'grid';
8
+ /**
9
+ * DesignerStateService coordinates state for the visual report designer.
10
+ *
11
+ * Scoped at the Designer component level (not root) to ensure multiple designer
12
+ * instances or navigation flows remain strictly isolated.
13
+ */
14
+ export declare class DesignerStateService {
15
+ private readonly registry;
16
+ /** Current active report definition */
17
+ readonly definition: import("@angular/core").WritableSignal<ReportDefinition>;
18
+ /** Selected component ID in canvas */
19
+ readonly selectedComponentId: import("@angular/core").WritableSignal<string | null>;
20
+ /** Active property editor tab */
21
+ readonly activeTab: import("@angular/core").WritableSignal<DesignerActiveTab>;
22
+ /** Current view mode (design, preview, or raw json) */
23
+ readonly viewMode: import("@angular/core").WritableSignal<DesignerViewMode>;
24
+ /** Dirty flag indicating unsaved changes */
25
+ readonly isDirty: import("@angular/core").WritableSignal<boolean>;
26
+ private readonly history;
27
+ private readonly historyIndex;
28
+ readonly canUndo: import("@angular/core").Signal<boolean>;
29
+ readonly canRedo: import("@angular/core").Signal<boolean>;
30
+ /** Currently selected component instance, or null if none */
31
+ readonly selectedComponent: import("@angular/core").Signal<ReportComponentDefinition | null>;
32
+ /**
33
+ * Initializes or reloads a report definition into the designer.
34
+ */
35
+ loadDefinition(def: ReportDefinition): void;
36
+ /**
37
+ * Selects a component for property editing.
38
+ */
39
+ selectComponent(id: string | null): void;
40
+ /**
41
+ * Sets the active view mode (design, live preview, json schema).
42
+ */
43
+ setViewMode(mode: DesignerViewMode): void;
44
+ /**
45
+ * Sets the active editor tab.
46
+ */
47
+ setActiveTab(tab: DesignerActiveTab): void;
48
+ /**
49
+ * Adds a new component of the specified type onto the canvas.
50
+ */
51
+ addComponent(type: string, targetIndex?: number): ReportComponentDefinition;
52
+ /**
53
+ * Removes a component by its ID.
54
+ */
55
+ removeComponent(id: string): void;
56
+ /**
57
+ * Duplicates an existing component.
58
+ */
59
+ duplicateComponent(id: string): ReportComponentDefinition | null;
60
+ /**
61
+ * Moves a component from previous index to current index (e.g. from CDK drag drop).
62
+ */
63
+ moveComponent(previousIndex: number, currentIndex: number): void;
64
+ /**
65
+ * Updates partial properties of a component.
66
+ */
67
+ updateComponent(id: string, updates: Partial<ReportComponentDefinition>): void;
68
+ /**
69
+ * Updates a single component property value within `properties`.
70
+ */
71
+ updateComponentProperty(id: string, propKey: string, value: unknown): void;
72
+ /**
73
+ * Updates layout properties for a component (e.g. columnSpan).
74
+ */
75
+ updateComponentLayout(id: string, layout: Partial<ComponentLayoutDefinition>): void;
76
+ /**
77
+ * Updates report-level settings (name, description, layout).
78
+ */
79
+ updateReportSettings(settings: Partial<ReportDefinition>): void;
80
+ /**
81
+ * Updates grid definition settings.
82
+ */
83
+ updateGridSettings(grid: ReportGridDefinition | undefined): void;
84
+ /**
85
+ * Reverts to the previous state in history.
86
+ */
87
+ undo(): void;
88
+ /**
89
+ * Advances to the next state in history.
90
+ */
91
+ redo(): void;
92
+ /**
93
+ * Marks the current definition state as saved.
94
+ */
95
+ markSaved(): void;
96
+ /**
97
+ * Applies an immutable state change and pushes to history.
98
+ */
99
+ private mutateDefinition;
100
+ private pushHistory;
101
+ static ɵfac: i0.ɵɵFactoryDeclaration<DesignerStateService, never>;
102
+ static ɵprov: i0.ɵɵInjectableDeclaration<DesignerStateService>;
103
+ }
@@ -0,0 +1,2 @@
1
+ export { DesignerStateService } from './designer-state.service';
2
+ export type { DesignerViewMode, DesignerActiveTab, } from './designer-state.service';
@@ -0,0 +1,55 @@
1
+ import { ReportComponentDefinition } from '../../../core/models/report-component.model';
2
+ /**
3
+ * Pure utility functions for design canvas layout, grid calculations, and sizing.
4
+ *
5
+ * Implemented as framework-independent pure functions per Rule 10 & 11 (Pure Logic First).
6
+ */
7
+ /**
8
+ * Resolves the effective column span for a component.
9
+ * Uses layout.columnSpan if specified, otherwise defaults based on component type (e.g. 2 for button, 4 for others).
10
+ */
11
+ export declare function resolveComponentSpan(comp: ReportComponentDefinition, totalColumns?: number, overrideSpan?: number | null): number;
12
+ /**
13
+ * Computes the CSS `grid-column` specification string for a component.
14
+ */
15
+ export declare function calculateGridColumn(comp: ReportComponentDefinition, totalColumns?: number, span?: number): string;
16
+ /**
17
+ * Computes the CSS `grid-row` specification string for a component.
18
+ */
19
+ export declare function calculateGridRow(comp: ReportComponentDefinition): string;
20
+ /**
21
+ * Overhead in pixels for the Visual Canvas card (card header 32px + card body vertical padding 16px).
22
+ * Adding this overhead to the component's logical height ensures that the canvas card body
23
+ * renders at the exact same pixel dimensions as the live preview component.
24
+ */
25
+ export declare const CANVAS_CARD_OVERHEAD = 48;
26
+ /**
27
+ * Resolves the CSS height property for the canvas component card.
28
+ * Accounts for the card header and padding overhead so the inner mock body
29
+ * accurately mirrors the runtime component height.
30
+ */
31
+ export declare function resolveCanvasCardHeight(comp: ReportComponentDefinition, overrideComponentHeight?: number | null, overhead?: number): string;
32
+ /**
33
+ * Resolves the CSS min-height property for the canvas component card.
34
+ */
35
+ export declare function resolveCanvasCardMinHeight(comp: ReportComponentDefinition, overrideComponentHeight?: number | null, overhead?: number): string;
36
+ /**
37
+ * Resolves the CSS height property for a runtime component.
38
+ */
39
+ export declare function resolveComponentHeight(comp: ReportComponentDefinition, overrideHeight?: number | null): string;
40
+ /**
41
+ * Resolves the CSS min-height property for a runtime component.
42
+ */
43
+ export declare function resolveComponentMinHeight(comp: ReportComponentDefinition, overrideHeight?: number | null): string;
44
+ /**
45
+ * Calculates new snapped span given drag deltaX, column width, and grid gap.
46
+ */
47
+ export declare function calculateSnappedSpan(deltaX: number, startSpan: number, colWidth: number, gap: number, totalCols: number): number;
48
+ /**
49
+ * Calculates new height given drag deltaY and minimum height constraint.
50
+ */
51
+ export declare function calculateSnappedHeight(deltaY: number, startHeight: number, minHeight?: number): number;
52
+ /**
53
+ * Maps component type to standard icon identifier.
54
+ */
55
+ export declare function getComponentIconName(type: string): string;
@@ -0,0 +1,2 @@
1
+ export type { ExportColumn, CsvExportOptions, JsonExportOptions } from './models/export.models';
2
+ export { ReportExportService, sanitizeCsvCell, generateCsvContent } from './services/report-export.service';
@@ -0,0 +1,16 @@
1
+ export interface ExportColumn {
2
+ field: string;
3
+ header: string;
4
+ formatter?: (value: any, row?: Record<string, unknown>) => string;
5
+ }
6
+ export interface CsvExportOptions {
7
+ fileName?: string;
8
+ columns?: ExportColumn[];
9
+ includeHeader?: boolean;
10
+ delimiter?: string;
11
+ addBom?: boolean;
12
+ }
13
+ export interface JsonExportOptions {
14
+ fileName?: string;
15
+ pretty?: boolean;
16
+ }
@@ -0,0 +1,27 @@
1
+ import { CsvExportOptions, ExportColumn, JsonExportOptions } from '../models/export.models';
2
+ import * as i0 from "@angular/core";
3
+ /**
4
+ * Sanitizes and escapes a single cell value for CSV output.
5
+ */
6
+ export declare function sanitizeCsvCell(value: unknown, delimiter?: string): string;
7
+ /**
8
+ * Pure generator function to create CSV content string from row data and columns.
9
+ */
10
+ export declare function generateCsvContent(rows: Record<string, unknown>[], columns: ExportColumn[], delimiter?: string, includeHeader?: boolean, addBom?: boolean): string;
11
+ export declare class ReportExportService {
12
+ private readonly document;
13
+ /**
14
+ * Generates and triggers browser download of a CSV file.
15
+ */
16
+ exportCsv(rows: Record<string, unknown>[], options?: CsvExportOptions): void;
17
+ /**
18
+ * Generates and triggers browser download of a JSON file.
19
+ */
20
+ exportJson(data: unknown, options?: JsonExportOptions): void;
21
+ /**
22
+ * Safe file download trigger via temporary anchor tag.
23
+ */
24
+ private downloadBlob;
25
+ static ɵfac: i0.ɵɵFactoryDeclaration<ReportExportService, never>;
26
+ static ɵprov: i0.ɵɵInjectableDeclaration<ReportExportService>;
27
+ }
@@ -0,0 +1,5 @@
1
+ export * from './runtime';
2
+ export * from './designer';
3
+ export * from './persistence';
4
+ export * from './routing';
5
+ export * from './export';
@@ -0,0 +1 @@
1
+ export * from './services';
@@ -0,0 +1,5 @@
1
+ export { SchemaValidatorService, validateReportSchema, } from './schema-validator.service';
2
+ export type { SchemaValidationResult } from './schema-validator.service';
3
+ export { ReportVersioningService } from './report-versioning.service';
4
+ export type { ReportDiffSummary } from './report-versioning.service';
5
+ export { ReportStoreService } from './report-store.service';