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 @@
1
+ {"version":3,"file":"bways-report.mjs","sources":["../../../projects/bways-report/src/lib/core/models/index.ts","../../../projects/bways-report/src/lib/core/registry/component-registry.ts","../../../projects/bways-report/src/lib/core/tokens/reporting-config.token.ts","../../../projects/bways-report/src/lib/core/tokens/session-context.token.ts","../../../projects/bways-report/src/lib/core/errors/reporting-errors.ts","../../../projects/bways-report/src/lib/core/validation/validation-factory.ts","../../../projects/bways-report/src/lib/core/services/dynamic-form-builder.service.ts","../../../projects/bways-report/src/lib/core/utils/identifier-humanizer.ts","../../../projects/bways-report/src/lib/core/services/report-session-context.service.ts","../../../projects/bways-report/src/lib/core/utilities/id-generator.ts","../../../projects/bways-report/src/lib/core/utilities/schema-migration.ts","../../../projects/bways-report/src/lib/data-access/contracts/data-source.contract.ts","../../../projects/bways-report/src/lib/data-access/contracts/master-data.provider.ts","../../../projects/bways-report/src/lib/data-access/contracts/report-persistence.contract.ts","../../../projects/bways-report/src/lib/data-access/contracts/translation.contract.ts","../../../projects/bways-report/src/lib/data-access/contracts/schema-discovery.contract.ts","../../../projects/bways-report/src/lib/data-access/contracts/lookup.contract.ts","../../../projects/bways-report/src/lib/data-access/adapters/http-schema-discovery.adapter.ts","../../../projects/bways-report/src/lib/data-access/adapters/http-lookup.adapter.ts","../../../projects/bways-report/src/lib/primitives/components/input/rpt-input.component.ts","../../../projects/bways-report/src/lib/primitives/components/dropdown/rpt-dropdown.component.ts","../../../projects/bways-report/src/lib/primitives/components/date/rpt-date.component.ts","../../../projects/bways-report/src/lib/primitives/components/number/rpt-number.component.ts","../../../projects/bways-report/src/lib/primitives/components/checkbox/rpt-checkbox.component.ts","../../../projects/bways-report/src/lib/primitives/components/icon/rpt-icon.component.ts","../../../projects/bways-report/src/lib/primitives/components/button/rpt-button.component.ts","../../../projects/bways-report/src/lib/primitives/components/kpi-card/rpt-kpi-card.component.ts","../../../projects/bways-report/src/lib/primitives/components/chart-bridge/report-chart-bridge.component.ts","../../../projects/bways-report/src/lib/primitives/register-builtins.ts","../../../projects/bways-report/src/lib/features/runtime/report-grid-bridge.component.ts","../../../projects/bways-report/src/lib/features/designer/utilities/canvas-layout.util.ts","../../../projects/bways-report/src/lib/features/runtime/dynamic-renderer.component.ts","../../../projects/bways-report/src/lib/features/runtime/report-runtime.component.ts","../../../projects/bways-report/src/lib/features/designer/services/designer-state.service.ts","../../../projects/bways-report/src/lib/features/designer/components/toolbar/designer-toolbar.component.ts","../../../projects/bways-report/src/lib/features/designer/components/component-palette/component-palette.component.ts","../../../projects/bways-report/src/lib/features/designer/components/design-canvas/design-canvas.component.ts","../../../projects/bways-report/src/lib/features/designer/components/property-editor/property-editor-general.component.ts","../../../projects/bways-report/src/lib/features/designer/components/property-editor/property-editor-layout.component.ts","../../../projects/bways-report/src/lib/features/designer/components/property-editor/property-editor-validation.component.ts","../../../projects/bways-report/src/lib/features/designer/components/property-editor/property-editor-grid.component.ts","../../../projects/bways-report/src/lib/features/designer/components/property-editor/property-editor-report.component.ts","../../../projects/bways-report/src/lib/features/designer/components/property-editor/parameter-binding-editor.component.ts","../../../projects/bways-report/src/lib/features/designer/components/property-editor/property-editor-datasource.component.ts","../../../projects/bways-report/src/lib/features/designer/components/property-editor/property-editor.component.ts","../../../projects/bways-report/src/lib/features/designer/designer.component.ts","../../../projects/bways-report/src/lib/features/persistence/services/schema-validator.service.ts","../../../projects/bways-report/src/lib/features/persistence/services/report-versioning.service.ts","../../../projects/bways-report/src/lib/features/persistence/services/report-store.service.ts","../../../projects/bways-report/src/lib/features/routing/resolvers/report.resolver.ts","../../../projects/bways-report/src/lib/features/routing/components/routed-report-runtime.component.ts","../../../projects/bways-report/src/lib/features/routing/components/routed-report-designer.component.ts","../../../projects/bways-report/src/lib/features/routing/report-routes.ts","../../../projects/bways-report/src/lib/features/routing/services/report-menu.service.ts","../../../projects/bways-report/src/lib/features/export/services/report-export.service.ts","../../../projects/bways-report/src/lib/provide-reporting.ts","../../../projects/bways-report/src/public-api.ts","../../../projects/bways-report/src/bways-report.ts"],"sourcesContent":["/**\n * Barrel export for all core domain models.\n */\n\nexport type {\n ReportDefinition,\n ReportSummary,\n ReportPermissionDefinition,\n} from './report-definition.model';\n\nexport type {\n ReportComponentDefinition,\n ComponentBindingDefinition,\n ComponentDataSourceDefinition,\n VisibilityDefinition,\n} from './report-component.model';\n\nexport type {\n ReportParameterDefinition,\n} from './report-parameter.model';\n\nexport type {\n ReportDataSourceDefinition,\n DataSourceCacheDefinition,\n} from './report-datasource.model';\n\nexport type {\n ReportGridDefinition,\n GridColumnDefinition,\n GridOptionsDefinition,\n} from './report-grid.model';\n\nexport type {\n ReportLayoutDefinition,\n ComponentLayoutDefinition,\n} from './report-layout.model';\n\nexport type {\n ValidationDefinition,\n} from './validation.model';\n\nexport type {\n ComponentEventDefinition,\n ComponentActionDefinition,\n} from './component-event.model';\n","/**\n * ComponentRegistry — the scalable alternative to a giant `@switch` block.\n *\n * Instead of hard-coding component types in the renderer template:\n * ```html\n * @switch (comp.type) {\n * @case ('input') { ... }\n * @case ('dropdown') { ... }\n * ...100 more cases...\n * }\n * ```\n *\n * The registry maps type strings to Angular component classes:\n * ```typescript\n * registry.register({ type: 'input', component: RptInputComponent, ... });\n * const meta = registry.resolve('input');\n * // Use meta.component with ngComponentOutlet\n * ```\n *\n * **Host override**: The host ERP can register its own component for any type.\n * If the host registers `type: 'dropdown'` with its PrimeNG-based dropdown,\n * that component wins over the library's built-in dropdown.\n */\n\nimport { Injectable, Type } from '@angular/core';\nimport { ComponentCategory } from './component-category';\nimport { PropertyDefinition } from './property-definition.model';\nimport { ReportComponentDefinition } from '../models/report-component.model';\n\n/**\n * Metadata describing a registered component type.\n */\nexport interface ReportingComponentMeta {\n /** Unique type key (e.g., 'input', 'dropdown', 'date', 'customer-selector'). */\n type: string;\n\n /** Human-readable name for the Designer palette. */\n displayName: string;\n\n /** Category for grouping in the Designer palette. */\n category: ComponentCategory;\n\n /** Optional icon identifier for the Designer palette. */\n icon?: string;\n\n /**\n * Factory function that creates a default `ReportComponentDefinition`\n * for this type. Used when dragging a new component onto the canvas.\n */\n createDefaultConfig(): Partial<ReportComponentDefinition>;\n\n /** The Angular component class to render at runtime. */\n component: Type<unknown>;\n\n /**\n * Property schema — describes configurable properties for the\n * Designer's property editor.\n */\n propertySchema: PropertyDefinition[];\n}\n\n/**\n * Central registry for all report component types.\n *\n * The registry is a simple `Map<string, ReportingComponentMeta>`.\n * It does not use DI for individual components — DI is used to\n * provide the registry itself.\n *\n * **Registration order**: Last registration wins. This allows the host\n * application to override built-in components by registering after\n * the library's built-in registration.\n */\n@Injectable({ providedIn: 'root' })\nexport class ComponentRegistry {\n private readonly registry = new Map<string, ReportingComponentMeta>();\n\n /**\n * Register a component type.\n *\n * If a component with the same `type` is already registered,\n * it is replaced. This enables host overrides.\n *\n * @param meta - Component metadata including the Angular component class.\n */\n register(meta: ReportingComponentMeta): void {\n this.registry.set(meta.type, meta);\n }\n\n /**\n * Resolve a component type to its metadata.\n *\n * @param type - The component type key.\n * @returns The metadata, or `undefined` if not registered.\n */\n resolve(type: string): ReportingComponentMeta | undefined {\n return this.registry.get(type);\n }\n\n /**\n * Check whether a component type is registered.\n */\n has(type: string): boolean {\n return this.registry.has(type);\n }\n\n /**\n * Get all registered component metadata entries.\n */\n getAll(): ReportingComponentMeta[] {\n return Array.from(this.registry.values());\n }\n\n /**\n * Get registered components filtered by category.\n */\n getByCategory(category: ComponentCategory): ReportingComponentMeta[] {\n return this.getAll().filter(meta => meta.category === category);\n }\n\n /**\n * Get all registered type keys.\n */\n getRegisteredTypes(): string[] {\n return Array.from(this.registry.keys());\n }\n}\n","/**\n * Reporting library configuration tokens.\n *\n * Core configuration models and injection tokens.\n * Decoupled from UI primitives and data-access adapters.\n */\n\nimport { InjectionToken, Type } from '@angular/core';\n\n/**\n * Library configuration options.\n */\nexport interface ReportingConfig {\n /** Default page size for grids. */\n defaultPageSize: number;\n\n /** Date format string used across the library. */\n dateFormat: string;\n\n /** Whether the Designer feature is enabled. */\n enableDesigner: boolean;\n\n /** Current schema version for new reports. */\n schemaVersion: number;\n\n /** Base URL for backend reporting endpoints (NestJS / .NET / REST API). */\n apiBaseUrl?: string;\n\n /** Whether automatic backend schema discovery (SPs & Tables) is enabled. */\n enableSchemaDiscovery?: boolean;\n}\n\n/**\n * Injection token for the grid component.\n *\n * The host provides their grid component (BWays-grid, AG Grid wrapper, etc.)\n * and the `ReportGridBridgeComponent` resolves it at runtime.\n */\nexport const GRID_COMPONENT = new InjectionToken<Type<unknown>>('GRID_COMPONENT');\n\n/**\n * Injection token for the chart component.\n *\n * The host can provide their preferred chart component (Chart.js, Highcharts, ApexCharts wrapper, etc.)\n * and the `ReportChartBridgeComponent` delegates rendering to it, or falls back to built-in SVG charts.\n */\nexport const CHART_COMPONENT = new InjectionToken<Type<unknown>>('CHART_COMPONENT');\n\n/**\n * Injection token for the reporting library configuration.\n */\nexport const REPORTING_CONFIG = new InjectionToken<ReportingConfig>('REPORTING_CONFIG');\n","import { InjectionToken, Signal } from '@angular/core';\nimport { Observable } from 'rxjs';\n\n/**\n * Primitive types allowable as session parameter values.\n */\nexport type SessionParamPrimitive = string | number | boolean | null | undefined;\n\n/**\n * Map of session parameters (e.g. { branchId: 1, companyId: 10, userId: 'usr-1' }).\n */\nexport type SessionContextMap = Record<string, SessionParamPrimitive>;\n\n/**\n * Flexible session context provider source:\n * - Plain object: `{ branchId: 1, companyId: 10 }`\n * - Dynamic getter function: `() => authService.currentUserSession()`\n * - Angular Signal: `authService.sessionSignal`\n * - RxJS Observable: `authService.session$`\n */\nexport type SessionContextProviderFn = () =>\n | SessionContextMap\n | Signal<SessionContextMap>\n | Observable<SessionContextMap>;\n\nexport type SessionContextSource =\n | SessionContextMap\n | SessionContextProviderFn\n | Observable<SessionContextMap>\n | Signal<SessionContextMap>;\n\n/**\n * Injection token for host application session parameters.\n * When configuring `provideReporting({ sessionContext: ... })`, the host app\n * supplies their current session context (e.g. branchId, companyId, userId, tenantId).\n */\nexport const REPORT_SESSION_CONTEXT = new InjectionToken<SessionContextSource>('REPORT_SESSION_CONTEXT');\n\n/**\n * Service contract for host applications providing runtime session parameters.\n * A host service (e.g. AuthService, SessionService) can implement this interface/class.\n */\nexport abstract class SessionContextProvider {\n abstract getSessionContext():\n | SessionContextMap\n | Observable<SessionContextMap>\n | Signal<SessionContextMap>\n | Promise<SessionContextMap>;\n}\n\n/**\n * Injection token for host application session provider service class.\n */\nexport const REPORT_SESSION_PROVIDER = new InjectionToken<SessionContextProvider>('REPORT_SESSION_PROVIDER');\n","/**\n * Reporting library error types.\n *\n * Each error type has a distinct class for targeted catching\n * and clear stack traces.\n */\n\n/**\n * Thrown when a report definition fails validation.\n */\nexport class ReportDefinitionError extends Error {\n constructor(message: string, public readonly reportId?: string) {\n super(`[BWays-Report] Report definition error${reportId ? ` (${reportId})` : ''}: ${message}`);\n this.name = 'ReportDefinitionError';\n }\n}\n\n/**\n * Thrown when a component type is not found in the registry.\n */\nexport class ComponentNotRegisteredError extends Error {\n constructor(public readonly componentType: string) {\n super(`[BWays-Report] Component type \"${componentType}\" is not registered. Did you forget to register it via ComponentRegistry?`);\n this.name = 'ComponentNotRegisteredError';\n }\n}\n\n/**\n * Thrown when a data source execution fails.\n */\nexport class DataSourceError extends Error {\n constructor(message: string, public readonly dataSourceId?: string) {\n super(`[BWays-Report] Data source error${dataSourceId ? ` (${dataSourceId})` : ''}: ${message}`);\n this.name = 'DataSourceError';\n }\n}\n\n/**\n * Thrown when a report definition's schema version is not supported.\n */\nexport class SchemaVersionError extends Error {\n constructor(\n public readonly currentVersion: number,\n public readonly supportedVersion: number,\n customMessage?: string\n ) {\n super(\n customMessage ??\n `[BWays-Report] Schema version ${currentVersion} is not supported. Current supported version: ${supportedVersion}`\n );\n this.name = 'SchemaVersionError';\n }\n}\n\n/**\n * Thrown when a required adapter/provider is not configured.\n */\nexport class AdapterNotProvidedError extends Error {\n constructor(public readonly adapterName: string) {\n super(`[BWays-Report] ${adapterName} is not provided. Configure it via provideReporting({ ... }).`);\n this.name = 'AdapterNotProvidedError';\n }\n}\n","/**\n * Validation factory — converts `ValidationDefinition` metadata\n * into Angular `ValidatorFn[]`.\n *\n * This is a **pure function** — no DI, no Angular TestBed needed.\n * Easily unit-testable.\n */\n\nimport { ValidatorFn, Validators } from '@angular/forms';\nimport { ValidationDefinition } from '../models/validation.model';\n\n/**\n * Converts a `ValidationDefinition` into an array of Angular validator functions.\n *\n * @param definition - Validation metadata from the report definition.\n * @returns Array of Angular `ValidatorFn` to apply to a form control.\n *\n * @example\n * ```typescript\n * const validators = createValidators({ required: true, maxLength: 100 });\n * const control = new FormControl('', validators);\n * ```\n */\nexport function createValidators(definition?: ValidationDefinition): ValidatorFn[] {\n if (!definition) {\n return [];\n }\n\n const validators: ValidatorFn[] = [];\n\n if (definition.required) {\n validators.push(Validators.required);\n }\n\n if (definition.min !== undefined) {\n validators.push(Validators.min(definition.min));\n }\n\n if (definition.max !== undefined) {\n validators.push(Validators.max(definition.max));\n }\n\n if (definition.minLength !== undefined) {\n validators.push(Validators.minLength(definition.minLength));\n }\n\n if (definition.maxLength !== undefined) {\n validators.push(Validators.maxLength(definition.maxLength));\n }\n\n if (definition.pattern) {\n validators.push(Validators.pattern(definition.pattern));\n }\n\n return validators;\n}\n\n/**\n * Extracts a user-facing validation error message from a validation definition\n * and error key.\n *\n * @param definition - Validation metadata.\n * @param errorKey - The validation error key (e.g., 'required', 'maxlength').\n * @returns The custom message if defined, or a default message.\n */\nexport function getValidationMessage(\n definition: ValidationDefinition | undefined,\n errorKey: string\n): string {\n // Check for custom message first\n if (definition?.messages?.[errorKey]) {\n return definition.messages[errorKey];\n }\n\n // Default messages\n const defaults: Record<string, string> = {\n required: 'This field is required',\n min: `Minimum value is ${definition?.min}`,\n max: `Maximum value is ${definition?.max}`,\n minlength: `Minimum length is ${definition?.minLength}`,\n maxlength: `Maximum length is ${definition?.maxLength}`,\n pattern: 'Invalid format',\n };\n\n return defaults[errorKey] ?? 'Invalid value';\n}\n","import { Injectable } from '@angular/core';\nimport { FormControl, FormGroup } from '@angular/forms';\nimport { ReportComponentDefinition } from '../models/report-component.model';\nimport { createValidators } from '../validation/validation-factory';\n\n/**\n * DynamicFormBuilder converts metadata definitions into Angular Reactive Form controls.\n *\n * Follows the official Angular Dynamic Forms pattern:\n * ReportComponentDefinition[] (metadata) -> DynamicFormBuilder -> FormGroup (runtime model)\n */\n@Injectable({ providedIn: 'root' })\nexport class DynamicFormBuilder {\n /**\n * Constructs an Angular FormGroup from a list of component definitions.\n *\n * Only components with a valid `key` property generate form controls.\n *\n * @param components - Array of report component definitions.\n * @param initialValues - Optional dictionary of initial control values by key.\n * @returns Configured Angular FormGroup.\n */\n toFormGroup(\n components: ReportComponentDefinition[],\n initialValues: Record<string, unknown> = {}\n ): FormGroup {\n const group: Record<string, FormControl> = {};\n\n for (const comp of components) {\n if (!comp.key) {\n continue;\n }\n\n const defaultValue =\n initialValues[comp.key] ??\n comp.properties?.['defaultValue'] ??\n (comp.type === 'checkbox' ? false : '');\n\n const isDisabled = comp.enabled === false;\n\n const validators = createValidators(comp.validation);\n\n group[comp.key] = new FormControl(\n {\n value: defaultValue,\n disabled: isDisabled,\n },\n { validators }\n );\n }\n\n return new FormGroup(group);\n }\n\n /**\n * Extracts raw values from a FormGroup, including disabled controls.\n *\n * @param form - The FormGroup to extract from.\n * @returns Key-value dictionary of all control values.\n */\n extractValues(form: FormGroup): Record<string, unknown> {\n return form.getRawValue();\n }\n}\n","import { EntityColumnMetadata } from '../../data-access/contracts/schema-discovery.contract';\n\n/**\n * Strips technical SQL prefixes (usp_, sp_, tbl_, vw_, @), removes schema if present,\n * and converts snake_case, PascalCase, or camelCase into clean, human-readable Title Case.\n *\n * Examples:\n * - 'dbo.usp_GetCustomerList' -> 'Customer List'\n * - 'usp_GetBranches' -> 'Branches'\n * - '@BranchId' -> 'Branch'\n * - '@ActiveOnly' -> 'Active Only'\n * - 'tbl_Products' -> 'Products'\n * - 'customer_name_en' -> 'Customer Name En'\n */\nexport function humanizeIdentifier(raw: string): string {\n if (!raw || typeof raw !== 'string') return '';\n\n // 1. Remove schema (e.g. 'dbo.')\n let text = raw.includes('.') ? raw.split('.').pop()! : raw;\n\n // 2. Remove leading @, and prefixes like sp_, usp_, tbl_, vw_, get_ repeatedly\n text = text.replace(/^@+/, '');\n while (/^(usp_|sp_|tbl_|vw_|get_)/i.test(text)) {\n text = text.replace(/^(usp_|sp_|tbl_|vw_|get_)/i, '');\n }\n\n // 3. If it starts with 'Get' followed by uppercase (e.g. 'GetCustomerList'), strip 'Get'\n if (/^get[A-Z]/i.test(text)) {\n text = text.slice(3);\n }\n\n // 4. Split snake_case and kebab-case\n text = text.replace(/[_-]+/g, ' ');\n\n // 5. Split PascalCase and camelCase (e.g. 'CustomerList' -> 'Customer List', 'BranchId' -> 'Branch Id')\n text = text.replace(/([a-z0-9])([A-Z])/g, '$1 $2');\n text = text.replace(/([A-Z]+)([A-Z][a-z])/g, '$1 $2');\n\n // 6. Clean up trailing ' Id' if it's a parameter label (e.g. 'Branch Id' -> 'Branch')\n // We keep it natural for parameters: 'Branch' is clearer than 'Branch Id' for non-technical users\n if (text.endsWith(' Id') && text.length > 3) {\n text = text.slice(0, -3);\n }\n\n // 7. Title-case each word\n return text\n .split(' ')\n .filter(Boolean)\n .map((w) => w.charAt(0).toUpperCase() + w.slice(1).toLowerCase())\n .join(' ');\n}\n\n/**\n * Detects the most probable column to use as the value/key (e.g. ID, Code, Key, Guid).\n */\nexport function detectDefaultValueField(columns: EntityColumnMetadata[]): string | undefined {\n if (!columns || columns.length === 0) return undefined;\n\n // 1. Check exact matches for 'id' or 'key' or 'code'\n const exactMatch = columns.find((c) =>\n ['id', 'key', 'code', 'guid', 'uuid'].includes(c.field.toLowerCase())\n );\n if (exactMatch) return exactMatch.field;\n\n // 2. Check columns ending with 'id' or 'code' or 'key'\n const suffixMatch = columns.find((c) => {\n const f = c.field.toLowerCase();\n return f.endsWith('_id') || f.endsWith('id') || f.endsWith('_code') || f.endsWith('code');\n });\n if (suffixMatch) return suffixMatch.field;\n\n // 3. Fallback to first column\n return columns[0]?.field;\n}\n\n/**\n * Detects the most probable column to use as the display text (e.g. Name, Title, Label, Description).\n */\nexport function detectDefaultDisplayField(columns: EntityColumnMetadata[]): string | undefined {\n if (!columns || columns.length === 0) return undefined;\n\n // 1. Look for text fields containing 'name', 'title', 'label', 'desc'\n const nameMatch = columns.find((c) => {\n const f = c.field.toLowerCase();\n return (\n f.includes('name') ||\n f.includes('title') ||\n f.includes('label') ||\n f.includes('description') ||\n f.includes('desc')\n );\n });\n if (nameMatch) return nameMatch.field;\n\n // 2. Look for any string dataType column\n const stringMatch = columns.find((c) => c.dataType === 'string');\n if (stringMatch) return stringMatch.field;\n\n // 3. Fallback to second column or first column\n return columns.length > 1 ? columns[1].field : columns[0]?.field;\n}\n","import {\n computed,\n inject,\n Injectable,\n OnDestroy,\n signal,\n Signal,\n} from '@angular/core';\nimport { toObservable } from '@angular/core/rxjs-interop';\nimport { isObservable, Observable, Subscription } from 'rxjs';\nimport {\n REPORT_SESSION_CONTEXT,\n REPORT_SESSION_PROVIDER,\n SessionContextMap,\n SessionContextProvider,\n SessionContextSource,\n SessionParamPrimitive,\n} from '../tokens/session-context.token';\nimport { ProcedureParameterMetadata } from '../../data-access/contracts/schema-discovery.contract';\nimport { humanizeIdentifier } from '../utils/identifier-humanizer';\n\nexport interface SessionParamMatch {\n isMatched: boolean;\n sessionKey: string;\n value: SessionParamPrimitive;\n friendlyLabel: string;\n}\n\nexport interface DerivedParametersResult {\n /** The consolidated parameter payload for stored procedure execution */\n parameters: Record<string, unknown>;\n /** Map of which SP parameters were auto-derived from session context */\n autoDerivedParams: Record<string, SessionParamMatch>;\n /** Any required parameters that were neither in session context nor explicitly mapped */\n unresolvedRequiredParams: ProcedureParameterMetadata[];\n}\n\n/**\n * Service that manages host application session context parameters (e.g. branchId, companyId, userId)\n * at runtime and automatically detects and binds them to Stored Procedure parameters.\n *\n * Designed to completely shield end users from entering technical session parameters while\n * eliminating silent failures or thread crashes in host integrations.\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class ReportSessionContextService implements OnDestroy {\n private readonly rawSource = inject<SessionContextSource | null>(REPORT_SESSION_CONTEXT, {\n optional: true,\n });\n private readonly sessionProvider = inject<SessionContextProvider | null>(REPORT_SESSION_PROVIDER, {\n optional: true,\n });\n\n /** Internal manual runtime session overrides (e.g. set via setSessionContext or setSessionParameter) */\n private readonly manualRuntimeContext = signal<SessionContextMap>({});\n private readonly latestObservableValue = signal<SessionContextMap>({});\n private readonly providerObservableValue = signal<SessionContextMap>({});\n\n private observableSub?: Subscription;\n private providerSub?: Subscription;\n\n /**\n * Reactive signal exposing the live session context parameters.\n * Updates automatically when host app mutates runtime state, when observables emit,\n * or when reactive signals update.\n */\n readonly sessionContext: Signal<SessionContextMap> = computed(() => {\n let providerMap: SessionContextMap = {};\n if (this.sessionProvider) {\n try {\n const res = this.sessionProvider.getSessionContext();\n if (typeof res === 'function') {\n const val = (res as () => SessionContextMap)();\n if (val && typeof val === 'object') {\n providerMap = val;\n }\n } else if (isObservable(res)) {\n providerMap = this.providerObservableValue();\n } else if (res && typeof res === 'object' && !('then' in res)) {\n providerMap = res as SessionContextMap;\n }\n } catch (err) {\n console.warn('[ReportSessionContextService] Error reading SessionContextProvider:', err);\n }\n }\n\n let tokenMap: SessionContextMap = {};\n if (this.rawSource) {\n try {\n if (isObservable(this.rawSource)) {\n tokenMap = this.latestObservableValue();\n } else if (typeof this.rawSource === 'function') {\n const res = this.rawSource();\n if (typeof res === 'function') {\n const innerRes = (res as () => unknown)();\n tokenMap = innerRes && typeof innerRes === 'object' ? (innerRes as SessionContextMap) : {};\n } else if (isObservable(res)) {\n tokenMap = this.latestObservableValue();\n } else {\n tokenMap = res && typeof res === 'object' ? (res as SessionContextMap) : {};\n }\n } else if (typeof this.rawSource === 'object' && this.rawSource !== null) {\n tokenMap = this.rawSource;\n }\n } catch (err) {\n console.warn('[ReportSessionContextService] Error evaluating raw session source:', err);\n }\n }\n\n const manualMap = this.manualRuntimeContext();\n\n return {\n ...providerMap,\n ...tokenMap,\n ...manualMap,\n };\n });\n\n /**\n * Observable stream of live session parameters for RxJS-based integrations.\n */\n readonly sessionContext$: Observable<SessionContextMap> = toObservable(this.sessionContext);\n\n constructor() {\n this.initSubscriptions();\n }\n\n ngOnDestroy(): void {\n this.observableSub?.unsubscribe();\n this.providerSub?.unsubscribe();\n }\n\n private initSubscriptions(): void {\n if (this.rawSource && isObservable(this.rawSource)) {\n this.observableSub = this.rawSource.subscribe({\n next: (val) => {\n if (val && typeof val === 'object') {\n this.latestObservableValue.set({ ...val });\n }\n },\n error: (err) => {\n console.warn('[ReportSessionContextService] Error from session context observable:', err);\n },\n });\n }\n\n if (this.sessionProvider) {\n try {\n const res = this.sessionProvider.getSessionContext();\n if (isObservable(res)) {\n this.providerSub = res.subscribe({\n next: (val) => {\n if (val && typeof val === 'object') {\n this.providerObservableValue.set({ ...val });\n }\n },\n error: (err) => {\n console.warn('[ReportSessionContextService] Error from session provider observable:', err);\n },\n });\n } else if (\n res &&\n typeof res === 'object' &&\n 'then' in res &&\n typeof (res as Promise<unknown>).then === 'function'\n ) {\n (res as Promise<SessionContextMap>)\n .then((val) => {\n if (val && typeof val === 'object') {\n this.providerObservableValue.set({ ...val });\n }\n })\n .catch((err) => {\n console.warn('[ReportSessionContextService] Error from session provider promise:', err);\n });\n }\n } catch (err) {\n console.warn('[ReportSessionContextService] Error initializing session provider:', err);\n }\n }\n }\n\n /**\n * Sets or replaces the runtime session context.\n * Can be called dynamically after user authentication, branch change, etc.\n */\n setSessionContext(context: SessionContextMap): void {\n if (context && typeof context === 'object') {\n this.manualRuntimeContext.set({ ...context });\n } else {\n this.manualRuntimeContext.set({});\n }\n }\n\n /**\n * Updates or sets a specific session parameter at runtime (e.g. branchId = 2).\n */\n setSessionParameter(key: string, value: SessionParamPrimitive): void {\n if (!key) return;\n this.manualRuntimeContext.update((current) => ({\n ...current,\n [key]: value,\n }));\n }\n\n /**\n * Clears any runtime session parameters set via `setSessionContext` or `setSessionParameter`.\n */\n clearSessionContext(): void {\n this.manualRuntimeContext.set({});\n }\n\n /**\n * Safely returns the current session context map.\n * Always pulls the latest runtime state. Never throws or crashes the thread.\n */\n getCurrentSessionContext(): SessionContextMap {\n try {\n return this.sessionContext();\n } catch (err) {\n console.warn('[ReportSessionContextService] Failed to evaluate session context:', err);\n return {};\n }\n }\n\n /**\n * Normalizes a parameter or session key into a lowercase alphanumeric string\n * for reliable, case-insensitive, and symbol-insensitive matching.\n * E.g. '@BranchId' -> 'branchid', 'branch_id' -> 'branchid', 'BranchID' -> 'branchid'\n */\n normalizeKey(key: string): string {\n if (!key || typeof key !== 'string') return '';\n return key\n .replace(/^@+/, '')\n .replace(/[_\\-\\s]+/g, '')\n .toLowerCase();\n }\n\n /**\n * Checks whether a stored procedure parameter matches any key in the active session context.\n * Supports exact, normalized, and common ERP synonyms.\n */\n matchParameter(paramName: string): SessionParamMatch | null {\n const session = this.getCurrentSessionContext();\n const sessionKeys = Object.keys(session);\n if (sessionKeys.length === 0) return null;\n\n const normalizedParam = this.normalizeKey(paramName);\n\n // 1. Exact match on raw name\n if (paramName in session) {\n return {\n isMatched: true,\n sessionKey: paramName,\n value: session[paramName],\n friendlyLabel: humanizeIdentifier(paramName),\n };\n }\n\n // 2. Direct normalized match\n for (const key of sessionKeys) {\n if (this.normalizeKey(key) === normalizedParam) {\n return {\n isMatched: true,\n sessionKey: key,\n value: session[key],\n friendlyLabel: humanizeIdentifier(key),\n };\n }\n }\n\n // 3. Common ERP synonym groups (bidirectional matching)\n const synonymGroups: string[][] = [\n ['branch', 'branchid', 'bid', 'branchcode', 'locationid', 'location'],\n ['company', 'companyid', 'cid', 'companycode', 'tenant', 'tenantid'],\n ['user', 'userid', 'uid', 'usercode', 'operatorid', 'loginuser'],\n ['financialyear', 'financialyearid', 'yearid', 'fyear', 'fiscalyear'],\n ['org', 'orgid', 'organization', 'organizationid'],\n ];\n\n for (const group of synonymGroups) {\n if (group.includes(normalizedParam)) {\n for (const key of sessionKeys) {\n if (group.includes(this.normalizeKey(key))) {\n return {\n isMatched: true,\n sessionKey: key,\n value: session[key],\n friendlyLabel: humanizeIdentifier(key),\n };\n }\n }\n }\n }\n\n return null;\n }\n\n /**\n * Resolves and derives all stored procedure parameters:\n * - Preserves explicit overrides (e.g. from canvas form controls or manual inputs)\n * - Automatically injects matched session parameters\n * - Validates whether required parameters are fulfilled\n */\n deriveParameters(\n spParams: ProcedureParameterMetadata[],\n explicitMappings: Record<string, unknown> = {}\n ): DerivedParametersResult {\n const session = this.getCurrentSessionContext();\n const finalParams: Record<string, unknown> = {};\n const autoDerived: Record<string, SessionParamMatch> = {};\n const unresolvedRequired: ProcedureParameterMetadata[] = [];\n\n for (const param of spParams) {\n const paramName = param.name;\n const explicitVal = explicitMappings[paramName];\n\n // Check if user or canvas explicitly provided a value (and not an empty placeholder)\n const hasExplicit = explicitVal !== undefined && explicitVal !== '' && explicitVal !== null;\n\n if (hasExplicit) {\n finalParams[paramName] = explicitVal;\n continue;\n }\n\n // Check for session context match\n const sessionMatch = this.matchParameter(paramName);\n if (sessionMatch && sessionMatch.value !== undefined && sessionMatch.value !== null) {\n finalParams[paramName] = sessionMatch.value;\n autoDerived[paramName] = sessionMatch;\n continue;\n }\n\n // If default value is provided in SP metadata\n if (param.defaultValue !== undefined && param.defaultValue !== null) {\n finalParams[paramName] = param.defaultValue;\n continue;\n }\n\n // If required but not satisfied\n if (param.required) {\n unresolvedRequired.push(param);\n }\n }\n\n // Also include any extra explicit mappings that didn't match parameter list\n for (const [key, val] of Object.entries(explicitMappings)) {\n if (!(key in finalParams) && val !== undefined && val !== null && val !== '') {\n finalParams[key] = val;\n }\n }\n\n return {\n parameters: finalParams,\n autoDerivedParams: autoDerived,\n unresolvedRequiredParams: unresolvedRequired,\n };\n }\n}\n","/**\n * Generates a unique identifier with a given prefix.\n *\n * Safe for modern browser and Node environments.\n *\n * @param prefix - Prefix for the ID (default 'cmp').\n * @returns Unique string ID (e.g. 'cmp-4a7b2c9d').\n */\nexport function generateId(prefix = 'cmp'): string {\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n return `${prefix}-${crypto.randomUUID().slice(0, 8)}`;\n }\n\n // Fallback random generation\n const random = Math.random().toString(36).substring(2, 10);\n return `${prefix}-${random}`;\n}\n","import { ReportDefinition } from '../models/report-definition.model';\nimport { SchemaVersionError } from '../errors/reporting-errors';\n\nexport type MigrationFn = (def: ReportDefinition) => ReportDefinition;\n\n/**\n * Migration registry mapping sourceVersion -> targetVersion migration function.\n */\nconst MIGRATIONS: Record<number, MigrationFn> = {\n // Example migration for v1 to v2 in future:\n // 1: (def) => ({ ...def, schemaVersion: 2, ... }),\n};\n\n/**\n * Migrates a ReportDefinition to a target schema version.\n *\n * @param definition - Source report definition.\n * @param targetVersion - Desired schema version (default current version = 1).\n * @returns Migrated ReportDefinition.\n */\nexport function migrateDefinition(\n definition: ReportDefinition,\n targetVersion = 1\n): ReportDefinition {\n if (!definition) {\n throw new SchemaVersionError(0, targetVersion, 'Invalid report definition provided');\n }\n\n const currentVersion = definition.schemaVersion ?? 1;\n\n if (currentVersion === targetVersion) {\n return { ...definition, schemaVersion: targetVersion };\n }\n\n if (currentVersion > targetVersion) {\n throw new SchemaVersionError(\n currentVersion,\n targetVersion,\n `Cannot downgrade report schema from version ${currentVersion} to ${targetVersion}`\n );\n }\n\n let migrated = { ...definition };\n for (let v = currentVersion; v < targetVersion; v++) {\n const migrationFn = MIGRATIONS[v];\n if (!migrationFn) {\n throw new SchemaVersionError(\n v,\n v + 1,\n `No migration path defined from schema version ${v} to ${v + 1}`\n );\n }\n migrated = migrationFn(migrated);\n }\n\n migrated.schemaVersion = targetVersion;\n return migrated;\n}\n","/**\n * Data-access contracts — abstract classes the host application implements.\n *\n * The library defines WHAT data it needs; the host defines HOW to get it.\n * This keeps the library host-independent.\n */\n\nimport { Observable } from 'rxjs';\nimport { ReportDataSourceDefinition } from '../../core/models/report-datasource.model';\n\n/**\n * Contract for executing report data source queries.\n *\n * The host application provides a concrete implementation that\n * calls the appropriate backend (REST API, stored procedures, etc.).\n *\n * @example\n * ```typescript\n * // Host implementation\n * @Injectable()\n * export class MyDataSourceAdapter extends ReportDataSourceAdapter {\n * constructor(private http: HttpClient) { super(); }\n *\n * execute(dataSource, parameters) {\n * return this.http.post(dataSource.endpoint, parameters);\n * }\n * }\n * ```\n */\nexport abstract class ReportDataSourceAdapter {\n /**\n * Execute a data source query and return the result rows.\n *\n * @param dataSource - The data source definition from the report metadata.\n * @param parameters - Current parameter values from the report form.\n * @returns Observable of result rows.\n */\n abstract execute(\n dataSource: ReportDataSourceDefinition,\n parameters: Record<string, unknown>\n ): Observable<unknown[]>;\n}\n","/**\n * Master data provider contract.\n *\n * Provides lookup/reference data for report components\n * (e.g., dropdown options for customers, products, branches).\n */\n\nimport { Observable } from 'rxjs';\n\n/**\n * Options for querying master data.\n */\nexport interface MasterDataOptions {\n /** Search/filter text. */\n searchText?: string;\n\n /** Maximum number of items to return. */\n limit?: number;\n\n /** Additional filter parameters. */\n filter?: Record<string, unknown>;\n}\n\n/**\n * A single master data item.\n */\nexport interface MasterDataItem {\n /** The value to store. */\n value: unknown;\n\n /** The display label. */\n label: string;\n\n /** Additional data fields. */\n [key: string]: unknown;\n}\n\n/**\n * Contract for providing master/lookup data to report components.\n *\n * @example\n * ```typescript\n * @Injectable()\n * export class MyMasterDataProvider extends MasterDataProvider {\n * constructor(private http: HttpClient) { super(); }\n *\n * getMasterData(masterName, options) {\n * return this.http.get(`/api/master/${masterName}`, { params: options });\n * }\n * }\n * ```\n */\nexport abstract class MasterDataProvider {\n /**\n * Fetch master data items by name.\n *\n * @param masterName - The master data set name (e.g., 'customers', 'products').\n * @param options - Optional filtering/pagination.\n * @returns Observable of master data items.\n */\n abstract getMasterData(\n masterName: string,\n options?: MasterDataOptions\n ): Observable<MasterDataItem[]>;\n}\n","/**\n * Report persistence contract.\n *\n * The host application implements this to save/load report definitions\n * to/from their backend (database, file system, API, etc.).\n */\n\nimport { Observable } from 'rxjs';\nimport { ReportDefinition, ReportSummary } from '../../core/models/report-definition.model';\n\n/**\n * Contract for persisting report definitions.\n *\n * @example\n * ```typescript\n * @Injectable()\n * export class MyPersistenceAdapter extends ReportPersistenceAdapter {\n * constructor(private http: HttpClient) { super(); }\n *\n * load(reportId) {\n * return this.http.get<ReportDefinition>(`/api/reports/${reportId}`);\n * }\n * // ... other methods\n * }\n * ```\n */\nexport abstract class ReportPersistenceAdapter {\n /** Load a full report definition by ID. */\n abstract load(reportId: string): Observable<ReportDefinition>;\n\n /** Save (create or update) a report definition. */\n abstract save(report: ReportDefinition): Observable<ReportDefinition>;\n\n /** List available reports (summaries only). */\n abstract list(): Observable<ReportSummary[]>;\n\n /** Delete a report by ID. */\n abstract delete(reportId: string): Observable<void>;\n\n /** Publish a specific version of a report. */\n abstract publish(reportId: string, version: number): Observable<void>;\n}\n","/**\n * Translation adapter contract.\n *\n * Allows host ERP applications to plug in their own i18n/translation\n * system (e.g. @ngx-translate, Transloco, or custom backend dictionary).\n */\nexport abstract class ReportTranslationAdapter {\n /**\n * Translate a given key into the current active language.\n *\n * @param key - Translation key or default label.\n * @param params - Optional interpolation parameters.\n * @returns Translated string, or key if no translation found.\n */\n abstract translate(key: string, params?: Record<string, string | number>): string;\n}\n","import { Observable } from 'rxjs';\n\nexport type DatabaseEntityType = 'table' | 'view' | 'stored_procedure';\n\n/**\n * Metadata for a database entity (table, view, or stored procedure)\n */\nexport interface DatabaseEntityMetadata {\n name: string;\n schema: string;\n type: DatabaseEntityType;\n friendlyName?: string;\n category?: string;\n description?: string;\n}\n\n/**\n * Metadata for an entity column or stored procedure return field\n */\nexport interface EntityColumnMetadata {\n field: string;\n label: string;\n dataType: 'string' | 'number' | 'date' | 'boolean';\n nullable?: boolean;\n}\n\n/**\n * Metadata for stored procedure parameters\n */\nexport interface ProcedureParameterMetadata {\n name: string;\n friendlyLabel?: string;\n description?: string;\n dataType: 'string' | 'number' | 'date' | 'boolean';\n sqlType: string;\n required: boolean;\n defaultValue?: unknown;\n}\n\n/**\n * Abstract contract for discovering backend database schemas, entities, columns, and parameters.\n * Enables the Visual Designer to discover tables and procedures without tight coupling.\n */\nexport abstract class ReportSchemaDiscoveryAdapter {\n /**\n * Retrieves list of database tables, views, or stored procedures.\n */\n abstract getEntities(types?: DatabaseEntityType[]): Observable<DatabaseEntityMetadata[]>;\n\n /**\n * Retrieves columns for a specific table, view, or stored procedure.\n */\n abstract getColumns(\n entityName: string,\n schema?: string,\n type?: DatabaseEntityType\n ): Observable<EntityColumnMetadata[]>;\n\n /**\n * Retrieves parameters for a stored procedure.\n */\n abstract getParameters(\n entityName: string,\n schema?: string\n ): Observable<ProcedureParameterMetadata[]>;\n}\n","import { Observable } from 'rxjs';\nimport { DropdownSourceType } from '../../core/models/report-component.model';\n\n/**\n * Request payload for querying lookup data from the host backend\n */\nexport interface LookupQueryRequest {\n sourceType: DropdownSourceType;\n entityName?: string;\n schema?: string;\n valueField: string;\n displayField: string;\n filter?: Record<string, unknown>;\n parameters?: Record<string, unknown>;\n limit?: number;\n}\n\n/**\n * Normalized option item for dropdowns and selectors\n */\nexport interface LookupOptionItem {\n value: string | number;\n label: string;\n raw?: Record<string, unknown>;\n}\n\n/**\n * Abstract contract for fetching dynamic lookup/option data for report dropdown components.\n */\nexport abstract class ReportLookupAdapter {\n /**\n * Fetches dropdown option rows from database table or stored procedure.\n */\n abstract fetchOptions(request: LookupQueryRequest): Observable<LookupOptionItem[]>;\n}\n","import { inject, Injectable } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { Observable, of } from 'rxjs';\nimport { catchError } from 'rxjs/operators';\nimport {\n DatabaseEntityMetadata,\n DatabaseEntityType,\n EntityColumnMetadata,\n ProcedureParameterMetadata,\n ReportSchemaDiscoveryAdapter,\n} from '../contracts/schema-discovery.contract';\nimport { REPORTING_CONFIG } from '../../core/tokens/reporting-config.token';\n\n/**\n * Built-in HTTP adapter for backend database schema discovery.\n * Connects to NestJS / REST backend endpoints, with fallback mock schema for development.\n */\n@Injectable()\nexport class HttpReportSchemaDiscoveryAdapter extends ReportSchemaDiscoveryAdapter {\n private readonly http = inject(HttpClient, { optional: true });\n private readonly config = inject(REPORTING_CONFIG, { optional: true });\n\n private readonly mockEntities: DatabaseEntityMetadata[] = [\n { name: 'Customers', schema: 'dbo', type: 'table', friendlyName: 'Customer Directory', category: 'Sales & CRM', description: 'Active customer accounts and profiles' },\n { name: 'Branches', schema: 'dbo', type: 'table', friendlyName: 'Branch Locations', category: 'Master Data', description: 'Company branches and regional offices' },\n { name: 'Products', schema: 'dbo', type: 'table', friendlyName: 'Product Catalog', category: 'Inventory', description: 'Product catalog with category codes' },\n { name: 'PaymentMethods', schema: 'dbo', type: 'table', friendlyName: 'Payment Methods', category: 'Finance', description: 'Available payment modes' },\n { name: 'usp_GetCustomerList', schema: 'dbo', type: 'stored_procedure', friendlyName: 'Customer Directory (SP)', category: 'Sales & CRM', description: 'Returns filtered customers by branch' },\n { name: 'usp_GetBranchLookup', schema: 'dbo', type: 'stored_procedure', friendlyName: 'Active Branches (SP)', category: 'Master Data', description: 'Returns active branches' },\n ];\n\n private readonly mockColumns: Record<string, EntityColumnMetadata[]> = {\n Customers: [\n { field: 'customerId', label: 'Customer ID', dataType: 'number', nullable: false },\n { field: 'customerName', label: 'Customer Name', dataType: 'string', nullable: false },\n { field: 'email', label: 'Email Address', dataType: 'string', nullable: true },\n { field: 'branchId', label: 'Branch ID', dataType: 'number', nullable: true },\n { field: 'isActive', label: 'Active Status', dataType: 'boolean', nullable: false },\n ],\n Branches: [\n { field: 'branchId', label: 'Branch ID', dataType: 'number', nullable: false },\n { field: 'branchName', label: 'Branch Name', dataType: 'string', nullable: false },\n { field: 'region', label: 'Region', dataType: 'string', nullable: true },\n ],\n Products: [\n { field: 'productId', label: 'Product ID', dataType: 'number', nullable: false },\n { field: 'productName', label: 'Product Name', dataType: 'string', nullable: false },\n { field: 'category', label: 'Category', dataType: 'string', nullable: true },\n { field: 'unitPrice', label: 'Unit Price', dataType: 'number', nullable: false },\n ],\n PaymentMethods: [\n { field: 'code', label: 'Payment Code', dataType: 'string', nullable: false },\n { field: 'title', label: 'Method Title', dataType: 'string', nullable: false },\n ],\n usp_GetCustomerList: [\n { field: 'id', label: 'ID', dataType: 'number', nullable: false },\n { field: 'name', label: 'Customer Name', dataType: 'string', nullable: false },\n { field: 'branch', label: 'Branch Code', dataType: 'string', nullable: true },\n ],\n usp_GetBranchLookup: [\n { field: 'id', label: 'Branch ID', dataType: 'number', nullable: false },\n { field: 'name', label: 'Branch Name', dataType: 'string', nullable: false },\n ],\n };\n\n private readonly mockParameters: Record<string, ProcedureParameterMetadata[]> = {\n usp_GetCustomerList: [\n { name: '@BranchId', friendlyLabel: 'Branch Location', dataType: 'number', sqlType: 'INT', required: false, description: 'Filter customers belonging to this branch' },\n { name: '@ActiveOnly', friendlyLabel: 'Active Only', dataType: 'boolean', sqlType: 'BIT', required: false, defaultValue: true, description: 'Only show active customers' },\n ],\n usp_GetBranchLookup: [\n { name: '@Region', friendlyLabel: 'Geographical Region', dataType: 'string', sqlType: 'VARCHAR(50)', required: false, description: 'Filter by geographical region' },\n ],\n };\n\n getEntities(types?: DatabaseEntityType[]): Observable<DatabaseEntityMetadata[]> {\n const baseUrl = this.config?.apiBaseUrl;\n if (baseUrl && this.http) {\n const typeParam = types ? types.join(',') : '';\n return this.http\n .get<DatabaseEntityMetadata[]>(`${baseUrl}/schema/entities`, {\n params: typeParam ? { types: typeParam } : {},\n })\n .pipe(\n catchError((err) => {\n console.warn('[HttpSchemaDiscovery] API request failed, falling back to mock schema:', err);\n return of(this.filterMockEntities(types));\n })\n );\n }\n return of(this.filterMockEntities(types));\n }\n\n getColumns(\n entityName: string,\n schema = 'dbo',\n type?: DatabaseEntityType\n ): Observable<EntityColumnMetadata[]> {\n const baseUrl = this.config?.apiBaseUrl;\n if (baseUrl && this.http) {\n return this.http\n .get<EntityColumnMetadata[]>(`${baseUrl}/schema/columns`, {\n params: { entityName, schema, ...(type ? { type } : {}) },\n })\n .pipe(\n catchError((err) => {\n console.warn(`[HttpSchemaDiscovery] Failed to get columns for ${entityName}:`, err);\n return of(this.mockColumns[entityName] ?? []);\n })\n );\n }\n return of(this.mockColumns[entityName] ?? []);\n }\n\n getParameters(entityName: string, schema = 'dbo'): Observable<ProcedureParameterMetadata[]> {\n const baseUrl = this.config?.apiBaseUrl;\n if (baseUrl && this.http) {\n return this.http\n .get<ProcedureParameterMetadata[]>(`${baseUrl}/schema/parameters`, {\n params: { entityName, schema },\n })\n .pipe(\n catchError((err) => {\n console.warn(`[HttpSchemaDiscovery] Failed to get parameters for ${entityName}:`, err);\n return of(this.mockParameters[entityName] ?? []);\n })\n );\n }\n return of(this.mockParameters[entityName] ?? []);\n }\n\n private filterMockEntities(types?: DatabaseEntityType[]): DatabaseEntityMetadata[] {\n if (!types || types.length === 0) return this.mockEntities;\n return this.mockEntities.filter((e) => types.includes(e.type));\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { Observable, of } from 'rxjs';\nimport { catchError, map, tap } from 'rxjs/operators';\nimport {\n LookupOptionItem,\n LookupQueryRequest,\n ReportLookupAdapter,\n} from '../contracts/lookup.contract';\nimport { REPORTING_CONFIG } from '../../core/tokens/reporting-config.token';\n\ninterface CacheEntry {\n expiresAt: number;\n data: LookupOptionItem[];\n}\n\n/**\n * Built-in HTTP adapter for fetching dropdown options from backend database tables and SPs.\n * Includes in-memory caching with TTL and rich fallback mock data for testing.\n */\n@Injectable()\nexport class HttpReportLookupAdapter extends ReportLookupAdapter {\n private readonly http = inject(HttpClient, { optional: true });\n private readonly config = inject(REPORTING_CONFIG, { optional: true });\n\n private readonly cache = new Map<string, CacheEntry>();\n\n private readonly mockDataStore: Record<string, Array<{ [key: string]: unknown }>> = {\n Customers: [\n { customerId: 101, customerName: 'Acme Corporation', branchId: 1, isActive: true },\n { customerId: 102, customerName: 'Globex Industries', branchId: 2, isActive: true },\n { customerId: 103, customerName: 'Initech Software', branchId: 1, isActive: true },\n { customerId: 104, customerName: 'Umbrella Corporation', branchId: 3, isActive: true },\n { customerId: 105, customerName: 'Wayne Enterprises', branchId: 2, isActive: true },\n { customerId: 106, customerName: 'Stark Industries', branchId: 1, isActive: true },\n ],\n Branches: [\n { branchId: 1, branchName: 'North America HQ (New York)', region: 'North America' },\n { branchId: 2, branchName: 'EMEA Division (London)', region: 'Europe' },\n { branchId: 3, branchName: 'APAC Hub (Singapore)', region: 'Asia Pacific' },\n { branchId: 4, branchName: 'LATAM Office (São Paulo)', region: 'Latin America' },\n ],\n Products: [\n { productId: 1, productName: 'Enterprise ERP Suite', category: 'Software', unitPrice: 2400 },\n { productId: 2, productName: 'Cloud Analytics Pro', category: 'SaaS', unitPrice: 1200 },\n { productId: 3, productName: 'Security Shield Endpoint', category: 'Security', unitPrice: 850 },\n { productId: 4, productName: 'Dedicated API Gateway', category: 'Infrastructure', unitPrice: 3100 },\n ],\n PaymentMethods: [\n { code: 'BANK_TRANSFER', title: 'Direct Bank Wire' },\n { code: 'CREDIT_CARD', title: 'Corporate Credit Card' },\n { code: 'PAYPAL', title: 'PayPal Corporate' },\n { code: 'NET_30', title: 'Net 30 Invoicing' },\n ],\n usp_GetCustomerList: [\n { id: 101, name: 'Acme Corporation (SP)', branchId: 1, branch: 'NA' },\n { id: 102, name: 'Globex Industries (SP)', branchId: 2, branch: 'EMEA' },\n { id: 105, name: 'Wayne Enterprises (SP)', branchId: 1, branch: 'NA' },\n { id: 106, name: 'Stark Industries (SP)', branchId: 3, branch: 'APAC' },\n ],\n usp_GetBranchLookup: [\n { id: 1, name: 'North America HQ' },\n { id: 2, name: 'EMEA Division' },\n { id: 3, name: 'APAC Hub' },\n ],\n };\n\n fetchOptions(request: LookupQueryRequest): Observable<LookupOptionItem[]> {\n const cacheKey = this.generateCacheKey(request);\n const cached = this.cache.get(cacheKey);\n const now = Date.now();\n\n if (cached && cached.expiresAt > now) {\n return of(cached.data);\n }\n\n const baseUrl = this.config?.apiBaseUrl;\n if (baseUrl && this.http) {\n return this.http.post<LookupOptionItem[]>(`${baseUrl}/lookup`, request).pipe(\n tap((items) => this.setCache(cacheKey, items)),\n catchError((err) => {\n console.warn('[HttpLookupAdapter] Remote lookup failed, falling back to mock:', err);\n const fallback = this.resolveMockOptions(request);\n this.setCache(cacheKey, fallback);\n return of(fallback);\n })\n );\n }\n\n const fallback = this.resolveMockOptions(request);\n this.setCache(cacheKey, fallback);\n return of(fallback);\n }\n\n private setCache(key: string, data: LookupOptionItem[], ttlSeconds = 300): void {\n this.cache.set(key, {\n expiresAt: Date.now() + ttlSeconds * 1000,\n data,\n });\n }\n\n private generateCacheKey(req: LookupQueryRequest): string {\n return `${req.sourceType}:${req.entityName}:${req.valueField}:${req.displayField}:${JSON.stringify(req.filter ?? {})}:${JSON.stringify(req.parameters ?? {})}`;\n }\n\n private resolveMockOptions(req: LookupQueryRequest): LookupOptionItem[] {\n const entity = req.entityName || '';\n const records = this.mockDataStore[entity] ?? [];\n const valKey = req.valueField;\n const labelKey = req.displayField;\n\n let filteredRecords = records;\n const branchParam = req.parameters?.['@BranchId'] ?? req.parameters?.['branchId'];\n if (branchParam !== undefined && branchParam !== null && branchParam !== '') {\n const matchNum = Number(branchParam);\n filteredRecords = records.filter(\n (r) => r['branchId'] === undefined || r['branchId'] === matchNum || r['branch'] === String(branchParam)\n );\n }\n\n return filteredRecords.map((r) => ({\n value: (r[valKey] as string | number) ?? String(r['id'] ?? r['code'] ?? ''),\n label: (r[labelKey] as string) ?? String(r['name'] ?? r['title'] ?? ''),\n raw: r,\n }));\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\nimport { ReportComponentDefinition } from '../../../core/models/report-component.model';\nimport { getValidationMessage } from '../../../core/validation/validation-factory';\n\n@Component({\n selector: 'rpt-input',\n standalone: true,\n imports: [ReactiveFormsModule],\n template: `\n <div class=\"rpt-field-group\">\n @if (config().label) {\n <label [for]=\"elementId()\" class=\"rpt-label\">\n {{ config().label }}\n @if (config().validation?.required) {\n <span class=\"rpt-required-marker\">*</span>\n }\n </label>\n }\n\n <div class=\"rpt-input-wrapper\">\n <input\n [id]=\"elementId()\"\n [type]=\"inputType()\"\n [formControl]=\"formControl()\"\n [placeholder]=\"placeholder()\"\n [class.rpt-invalid]=\"isInvalid()\"\n class=\"rpt-input\"\n />\n </div>\n\n @if (errorMessage()) {\n <span class=\"rpt-error-text\">{{ errorMessage() }}</span>\n }\n </div>\n `,\n styles: [`\n :host {\n display: block;\n width: 100%;\n height: 100%;\n box-sizing: border-box;\n font-family: var(--rpt-font-family, inherit);\n }\n .rpt-field-group {\n display: flex;\n flex-direction: column;\n height: 100%;\n gap: 4px;\n box-sizing: border-box;\n }\n .rpt-label {\n font-size: var(--rpt-font-size-sm, 0.75rem);\n font-weight: 500;\n color: var(--rpt-color-text, #0f172a);\n flex-shrink: 0;\n }\n .rpt-required-marker {\n color: var(--rpt-color-danger, #ef4444);\n margin-left: 2px;\n }\n .rpt-input-wrapper {\n position: relative;\n width: 100%;\n flex: 1;\n min-height: 0;\n display: flex;\n }\n .rpt-input {\n width: 100%;\n height: 100%;\n min-height: 38px;\n box-sizing: border-box;\n padding: 6px 12px;\n font-size: var(--rpt-font-size-base, 0.875rem);\n color: var(--rpt-color-text, #0f172a);\n background-color: var(--rpt-color-bg, #ffffff);\n border: 1px solid var(--rpt-color-border, #cbd5e1);\n border-radius: var(--rpt-border-radius, 6px);\n transition: border-color var(--rpt-transition-speed, 150ms) ease,\n box-shadow var(--rpt-transition-speed, 150ms) ease;\n outline: none;\n }\n .rpt-input:hover:not(:disabled) {\n border-color: var(--rpt-color-border-hover, #94a3b8);\n }\n .rpt-input:focus {\n border-color: var(--rpt-color-border-focus, #2563eb);\n box-shadow: var(--rpt-box-shadow-focus, 0 0 0 3px rgba(37, 99, 235, 0.25));\n }\n .rpt-input:disabled {\n background-color: var(--rpt-color-surface, #f8fafc);\n color: var(--rpt-color-text-muted, #64748b);\n cursor: not-allowed;\n }\n .rpt-input.rpt-invalid {\n border-color: var(--rpt-color-danger, #ef4444);\n }\n .rpt-input.rpt-invalid:focus {\n box-shadow: 0 0 0 3px rgba(239, 68, 68, 0.25);\n }\n .rpt-error-text {\n font-size: var(--rpt-font-size-sm, 0.75rem);\n color: var(--rpt-color-danger, #ef4444);\n margin-top: 2px;\n }\n `],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class RptInputComponent {\n readonly config = input.required<ReportComponentDefinition>();\n readonly control = input<FormControl>();\n\n private readonly fallbackControl = new FormControl('');\n\n readonly formControl = computed(() => this.control() ?? this.fallbackControl);\n\n readonly elementId = computed(() => this.config().key || this.config().id);\n readonly inputType = computed(() => (this.config().properties?.['type'] as string) || 'text');\n readonly placeholder = computed(() => (this.config().properties?.['placeholder'] as string) || '');\n\n readonly isInvalid = computed(() => {\n const ctrl = this.formControl();\n return ctrl.invalid && (ctrl.dirty || ctrl.touched);\n });\n\n readonly errorMessage = computed(() => {\n const ctrl = this.formControl();\n if (!ctrl.invalid || (!ctrl.dirty && !ctrl.touched)) {\n return '';\n }\n const errors = ctrl.errors;\n if (!errors) return '';\n const firstKey = Object.keys(errors)[0];\n return getValidationMessage(this.config().validation, firstKey);\n });\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n inject,\n input,\n OnDestroy,\n OnInit,\n signal,\n} from '@angular/core';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\nimport { Subscription } from 'rxjs';\nimport { ReportComponentDefinition } from '../../../core/models/report-component.model';\nimport { getValidationMessage } from '../../../core/validation/validation-factory';\nimport { MasterDataProvider } from '../../../data-access/contracts/master-data.provider';\nimport { ReportLookupAdapter } from '../../../data-access/contracts/lookup.contract';\nimport { ReportSessionContextService } from '../../../core/services/report-session-context.service';\nimport { SessionContextMap } from '../../../core/tokens/session-context.token';\n\nexport interface DropdownOption {\n key: string | number;\n label: string;\n}\n\n@Component({\n selector: 'rpt-dropdown',\n standalone: true,\n imports: [ReactiveFormsModule],\n template: `\n <div class=\"rpt-field-group\">\n @if (config().label) {\n <label [for]=\"elementId()\" class=\"rpt-label\">\n {{ config().label }}\n @if (config().validation?.required) {\n <span class=\"rpt-required-marker\">*</span>\n }\n </label>\n }\n\n <div class=\"rpt-select-wrapper\">\n <select\n [id]=\"elementId()\"\n [formControl]=\"formControl()\"\n [class.rpt-invalid]=\"isInvalid()\"\n class=\"rpt-select\"\n >\n @if (placeholder()) {\n <option value=\"\" [disabled]=\"config().validation?.required\">{{ placeholder() }}</option>\n }\n @for (opt of allOptions(); track opt.key) {\n <option [value]=\"opt.key\">{{ opt.label }}</option>\n }\n </select>\n <div class=\"rpt-select-arrow\" aria-hidden=\"true\">\n <svg width=\"12\" height=\"8\" viewBox=\"0 0 12 8\" fill=\"none\">\n <path d=\"M1 1.5L6 6.5L11 1.5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n </div>\n\n @if (errorMessage()) {\n <span class=\"rpt-error-text\">{{ errorMessage() }}</span>\n }\n </div>\n `,\n styles: [`\n :host {\n display: block;\n width: 100%;\n height: 100%;\n box-sizing: border-box;\n font-family: var(--rpt-font-family, inherit);\n }\n .rpt-field-group {\n display: flex;\n flex-direction: column;\n height: 100%;\n gap: 4px;\n box-sizing: border-box;\n }\n .rpt-label {\n font-size: var(--rpt-font-size-sm, 0.75rem);\n font-weight: 500;\n color: var(--rpt-color-text, #0f172a);\n flex-shrink: 0;\n }\n .rpt-required-marker {\n color: var(--rpt-color-danger, #ef4444);\n margin-left: 2px;\n }\n .rpt-select-wrapper {\n position: relative;\n width: 100%;\n flex: 1;\n min-height: 0;\n display: flex;\n align-items: center;\n }\n .rpt-select {\n width: 100%;\n height: 100%;\n min-height: 38px;\n box-sizing: border-box;\n padding: 6px 36px 6px 12px;\n font-size: var(--rpt-font-size-base, 0.875rem);\n color: var(--rpt-color-text, #0f172a);\n background-color: var(--rpt-color-bg, #ffffff);\n border: 1px solid var(--rpt-color-border, #cbd5e1);\n border-radius: var(--rpt-border-radius, 6px);\n appearance: none;\n -webkit-appearance: none;\n outline: none;\n cursor: pointer;\n transition: border-color var(--rpt-transition-speed, 150ms) ease,\n box-shadow var(--rpt-transition-speed, 150ms) ease;\n }\n .rpt-select:hover:not(:disabled) {\n border-color: var(--rpt-color-border-hover, #94a3b8);\n }\n .rpt-select:focus {\n border-color: var(--rpt-color-border-focus, #2563eb);\n box-shadow: var(--rpt-box-shadow-focus, 0 0 0 3px rgba(37, 99, 235, 0.25));\n }\n .rpt-select:disabled {\n background-color: var(--rpt-color-surface, #f8fafc);\n color: var(--rpt-color-text-muted, #64748b);\n cursor: not-allowed;\n }\n .rpt-select.rpt-invalid {\n border-color: var(--rpt-color-danger, #ef4444);\n }\n .rpt-select.rpt-invalid:focus {\n box-shadow: 0 0 0 3px rgba(239, 68, 68, 0.25);\n }\n .rpt-select-arrow {\n position: absolute;\n right: 12px;\n top: 50%;\n transform: translateY(-50%);\n pointer-events: none;\n color: var(--rpt-color-text-muted, #64748b);\n display: flex;\n align-items: center;\n }\n .rpt-error-text {\n font-size: var(--rpt-font-size-sm, 0.75rem);\n color: var(--rpt-color-danger, #ef4444);\n margin-top: 2px;\n }\n `],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class RptDropdownComponent implements OnInit, OnDestroy {\n private readonly masterDataProvider = inject(MasterDataProvider, { optional: true });\n private readonly lookupAdapter = inject(ReportLookupAdapter, { optional: true });\n private readonly sessionService = inject(ReportSessionContextService, { optional: true });\n\n readonly config = input.required<ReportComponentDefinition>();\n readonly control = input<FormControl>();\n\n private readonly fallbackControl = new FormControl('');\n private readonly dynamicOptions = signal<DropdownOption[]>([]);\n private lookupSub?: Subscription;\n private masterDataSub?: Subscription;\n\n readonly formControl = computed(() => this.control() ?? this.fallbackControl);\n readonly elementId = computed(() => this.config().key || this.config().id);\n readonly placeholder = computed(\n () => (this.config().properties?.['placeholder'] as string) ?? '-- Select --'\n );\n\n readonly staticOptions = computed<DropdownOption[]>(() => {\n const opts = this.config().properties?.['options'];\n if (Array.isArray(opts)) {\n return opts;\n }\n return [];\n });\n\n readonly allOptions = computed<DropdownOption[]>(() => {\n const dynamic = this.dynamicOptions();\n if (dynamic.length > 0) {\n return dynamic;\n }\n return this.staticOptions();\n });\n\n readonly isInvalid = computed(() => {\n const ctrl = this.formControl();\n return ctrl.invalid && (ctrl.dirty || ctrl.touched);\n });\n\n readonly errorMessage = computed(() => {\n const ctrl = this.formControl();\n if (!ctrl.invalid || (!ctrl.dirty && !ctrl.touched)) {\n return '';\n }\n const errors = ctrl.errors;\n if (!errors) return '';\n const firstKey = Object.keys(errors)[0];\n return getValidationMessage(this.config().validation, firstKey);\n });\n\n constructor() {\n effect(\n () => {\n const session = this.sessionService?.sessionContext() ?? {};\n // Reading config registers dependency on component configuration\n const _ = this.config();\n this.reloadDataSourceOptions(session);\n },\n { allowSignalWrites: true }\n );\n }\n\n ngOnInit(): void {\n // Initial fetch handled cleanly by the constructor effect\n }\n\n ngOnDestroy(): void {\n this.lookupSub?.unsubscribe();\n this.masterDataSub?.unsubscribe();\n }\n\n private reloadDataSourceOptions(session: SessionContextMap): void {\n const ds = this.config().dataSource;\n if (!ds) return;\n\n // 1. Database Table / Stored Procedure Lookup\n if ((ds.sourceType === 'table' || ds.sourceType === 'procedure' || ds.entityName) && this.lookupAdapter) {\n let resolvedParams: Record<string, unknown> = { ...session };\n\n if (ds.parameterMappings) {\n for (const [key, rawVal] of Object.entries(ds.parameterMappings)) {\n if (typeof rawVal === 'string' && rawVal.startsWith('{{session.') && rawVal.endsWith('}}')) {\n const sessionKey = rawVal.slice(10, -2).trim();\n const sessionVal = session[sessionKey];\n if (sessionVal !== undefined) {\n resolvedParams[key] = sessionVal;\n continue;\n }\n }\n resolvedParams[key] = rawVal;\n }\n }\n\n this.lookupSub?.unsubscribe();\n this.lookupSub = this.lookupAdapter\n .fetchOptions({\n sourceType: ds.sourceType ?? 'table',\n entityName: ds.entityName,\n schema: ds.schema ?? 'dbo',\n valueField: ds.valueField || 'id',\n displayField: ds.displayField || 'name',\n filter: ds.filter,\n parameters: resolvedParams,\n })\n .subscribe({\n next: (items) => {\n this.dynamicOptions.set(\n items.map((it) => ({\n key: String(it.value),\n label: it.label,\n }))\n );\n },\n error: (err) => {\n console.error(`[RptDropdown] Failed to load lookup options for ${ds.entityName}:`, err);\n },\n });\n return;\n }\n\n // 2. Legacy Master Data Provider\n if (ds.masterName && this.masterDataProvider && !this.masterDataSub) {\n this.masterDataSub = this.masterDataProvider.getMasterData(ds.masterName).subscribe({\n next: (items) => {\n this.dynamicOptions.set(\n items.map((it) => ({\n key: String(it.value ?? it['id'] ?? ''),\n label: String(it.label ?? it['name'] ?? ''),\n }))\n );\n },\n error: (err) => {\n console.error(`[RptDropdown] Failed to load master data for ${ds.masterName}:`, err);\n },\n });\n }\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\nimport { ReportComponentDefinition } from '../../../core/models/report-component.model';\nimport { getValidationMessage } from '../../../core/validation/validation-factory';\n\n@Component({\n selector: 'rpt-date',\n standalone: true,\n imports: [ReactiveFormsModule],\n template: `\n <div class=\"rpt-field-group\">\n @if (config().label) {\n <label [for]=\"elementId()\" class=\"rpt-label\">\n {{ config().label }}\n @if (config().validation?.required) {\n <span class=\"rpt-required-marker\">*</span>\n }\n </label>\n }\n\n <div class=\"rpt-date-wrapper\">\n <input\n [id]=\"elementId()\"\n [type]=\"dateType()\"\n [formControl]=\"formControl()\"\n [min]=\"minDate()\"\n [max]=\"maxDate()\"\n [class.rpt-invalid]=\"isInvalid()\"\n class=\"rpt-date-input\"\n />\n </div>\n\n @if (errorMessage()) {\n <span class=\"rpt-error-text\">{{ errorMessage() }}</span>\n }\n </div>\n `,\n styles: [`\n :host {\n display: block;\n width: 100%;\n height: 100%;\n box-sizing: border-box;\n font-family: var(--rpt-font-family, inherit);\n }\n .rpt-field-group {\n display: flex;\n flex-direction: column;\n height: 100%;\n gap: 4px;\n box-sizing: border-box;\n }\n .rpt-label {\n font-size: var(--rpt-font-size-sm, 0.75rem);\n font-weight: 500;\n color: var(--rpt-color-text, #0f172a);\n flex-shrink: 0;\n }\n .rpt-required-marker {\n color: var(--rpt-color-danger, #ef4444);\n margin-left: 2px;\n }\n .rpt-date-wrapper {\n position: relative;\n width: 100%;\n flex: 1;\n min-height: 0;\n display: flex;\n }\n .rpt-date-input {\n width: 100%;\n height: 100%;\n min-height: 38px;\n box-sizing: border-box;\n padding: 6px 12px;\n font-size: var(--rpt-font-size-base, 0.875rem);\n color: var(--rpt-color-text, #0f172a);\n background-color: var(--rpt-color-bg, #ffffff);\n border: 1px solid var(--rpt-color-border, #cbd5e1);\n border-radius: var(--rpt-border-radius, 6px);\n transition: border-color var(--rpt-transition-speed, 150ms) ease,\n box-shadow var(--rpt-transition-speed, 150ms) ease;\n outline: none;\n }\n .rpt-date-input:hover:not(:disabled) {\n border-color: var(--rpt-color-border-hover, #94a3b8);\n }\n .rpt-date-input:focus {\n border-color: var(--rpt-color-border-focus, #2563eb);\n box-shadow: var(--rpt-box-shadow-focus, 0 0 0 3px rgba(37, 99, 235, 0.25));\n }\n .rpt-date-input:disabled {\n background-color: var(--rpt-color-surface, #f8fafc);\n color: var(--rpt-color-text-muted, #64748b);\n cursor: not-allowed;\n }\n .rpt-date-input.rpt-invalid {\n border-color: var(--rpt-color-danger, #ef4444);\n }\n .rpt-date-input.rpt-invalid:focus {\n box-shadow: 0 0 0 3px rgba(239, 68, 68, 0.25);\n }\n .rpt-error-text {\n font-size: var(--rpt-font-size-sm, 0.75rem);\n color: var(--rpt-color-danger, #ef4444);\n margin-top: 2px;\n }\n `],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class RptDateComponent {\n readonly config = input.required<ReportComponentDefinition>();\n readonly control = input<FormControl>();\n\n private readonly fallbackControl = new FormControl('');\n\n readonly formControl = computed(() => this.control() ?? this.fallbackControl);\n readonly elementId = computed(() => this.config().key || this.config().id);\n readonly dateType = computed(() => (this.config().properties?.['includeTime'] ? 'datetime-local' : 'date'));\n readonly minDate = computed(() => (this.config().properties?.['minDate'] as string) || null);\n readonly maxDate = computed(() => (this.config().properties?.['maxDate'] as string) || null);\n\n readonly isInvalid = computed(() => {\n const ctrl = this.formControl();\n return ctrl.invalid && (ctrl.dirty || ctrl.touched);\n });\n\n readonly errorMessage = computed(() => {\n const ctrl = this.formControl();\n if (!ctrl.invalid || (!ctrl.dirty && !ctrl.touched)) {\n return '';\n }\n const errors = ctrl.errors;\n if (!errors) return '';\n const firstKey = Object.keys(errors)[0];\n return getValidationMessage(this.config().validation, firstKey);\n });\n}\n","import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\nimport { ReportComponentDefinition } from '../../../core/models/report-component.model';\nimport { getValidationMessage } from '../../../core/validation/validation-factory';\n\n@Component({\n selector: 'rpt-number',\n standalone: true,\n imports: [ReactiveFormsModule],\n template: `\n <div class=\"rpt-field-group\">\n @if (config().label) {\n <label [for]=\"elementId()\" class=\"rpt-label\">\n {{ config().label }}\n @if (config().validation?.required) {\n <span class=\"rpt-required-marker\">*</span>\n }\n </label>\n }\n\n <div class=\"rpt-input-wrapper\" [class.has-prefix]=\"prefix()\" [class.has-suffix]=\"suffix()\">\n @if (prefix()) {\n <span class=\"rpt-affix rpt-prefix\">{{ prefix() }}</span>\n }\n <input\n [id]=\"elementId()\"\n type=\"number\"\n [formControl]=\"formControl()\"\n [min]=\"minVal()\"\n [max]=\"maxVal()\"\n [step]=\"stepVal()\"\n [placeholder]=\"placeholder()\"\n [class.rpt-invalid]=\"isInvalid()\"\n class=\"rpt-number-input\"\n />\n @if (suffix()) {\n <span class=\"rpt-affix rpt-suffix\">{{ suffix() }}</span>\n }\n </div>\n\n @if (errorMessage()) {\n <span class=\"rpt-error-text\">{{ errorMessage() }}</span>\n }\n </div>\n `,\n styles: [`\n :host {\n display: block;\n width: 100%;\n height: 100%;\n box-sizing: border-box;\n font-family: var(--rpt-font-family, inherit);\n }\n .rpt-field-group {\n display: flex;\n flex-direction: column;\n height: 100%;\n gap: 4px;\n box-sizing: border-box;\n }\n .rpt-label {\n font-size: var(--rpt-font-size-sm, 0.75rem);\n font-weight: 500;\n color: var(--rpt-color-text, #0f172a);\n flex-shrink: 0;\n }\n .rpt-required-marker {\n color: var(--rpt-color-danger, #ef4444);\n margin-left: 2px;\n }\n .rpt-input-wrapper {\n position: relative;\n display: flex;\n align-items: stretch;\n width: 100%;\n flex: 1;\n min-height: 0;\n }\n .rpt-affix {\n font-size: var(--rpt-font-size-sm, 0.75rem);\n color: var(--rpt-color-text-muted, #64748b);\n background-color: var(--rpt-color-surface, #f8fafc);\n padding: 0 10px;\n height: 100%;\n min-height: 38px;\n display: flex;\n align-items: center;\n border: 1px solid var(--rpt-color-border, #cbd5e1);\n user-select: none;\n box-sizing: border-box;\n }\n .rpt-prefix {\n border-right: none;\n border-top-left-radius: var(--rpt-border-radius, 6px);\n border-bottom-left-radius: var(--rpt-border-radius, 6px);\n }\n .rpt-suffix {\n border-left: none;\n border-top-right-radius: var(--rpt-border-radius, 6px);\n border-bottom-right-radius: var(--rpt-border-radius, 6px);\n }\n .rpt-number-input {\n width: 100%;\n box-sizing: border-box;\n height: 100%;\n min-height: 38px;\n padding: 6px 12px;\n font-size: var(--rpt-font-size-base, 0.875rem);\n color: var(--rpt-color-text, #0f172a);\n background-color: var(--rpt-color-bg, #ffffff);\n border: 1px solid var(--rpt-color-border, #cbd5e1);\n border-radius: var(--rpt-border-radius, 6px);\n transition: border-color var(--rpt-transition-speed, 150ms) ease,\n box-shadow var(--rpt-transition-speed, 150ms) ease;\n outline: none;\n }\n .has-prefix .rpt-number-input {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n }\n .has-suffix .rpt-number-input {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n }\n .rpt-number-input:hover:not(:disabled) {\n border-color: var(--rpt-color-border-hover, #94a3b8);\n }\n .rpt-number-input:focus {\n border-color: var(--rpt-color-border-focus, #2563eb);\n box-shadow: var(--rpt-box-shadow-focus, 0 0 0 3px rgba(37, 99, 235, 0.25));\n }\n .rpt-number-input:disabled {\n background-color: var(--rpt-color-surface, #f8fafc);\n color: var(--rpt-color-text-muted, #64748b);\n cursor: not-allowed;\n }\n .rpt-number-input.rpt-invalid {\n border-color: var(--rpt-color-danger, #ef4444);\n }\n .rpt-number-input.rpt-invalid:focus {\n box-shadow: 0 0 0 3px rgba(239, 68, 68, 0.25);\n }\n .rpt-error-text {\n font-size: var(--rpt-font-size-sm, 0.75rem);\n color: var(--rpt-color-danger, #ef4444);\n margin-top: 2px;\n }\n `],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class RptNumberComponent {\n readonly config = input.required<ReportComponentDefinition>();\n readonly control = input<FormControl>();\n\n private readonly fallbackControl = new FormControl<number | null>(null);\n\n readonly formControl = computed(() => this.control() ?? this.fallbackControl);\n readonly elementId = computed(() => this.config().key || this.config().id);\n readonly placeholder = computed(() => (this.config().properties?.['placeholder'] as string) || '');\n readonly prefix = computed(() => (this.config().properties?.['prefix'] as string) || '');\n readonly suffix = computed(() => (this.config().properties?.['suffix'] as string) || '');\n\n readonly minVal = computed(() => this.config().validation?.min ?? (this.config().properties?.['min'] as number) ?? null);\n readonly maxVal = computed(() => this.config().validation?.max ?? (this.config().properties?.['max'] as number) ?? null);\n readonly stepVal = computed(() => (this.config().properties?.['step'] as number) ?? 1);\n\n readonly isInvalid = computed(() => {\n const ctrl = this.formControl();\n return ctrl.invalid && (ctrl.dirty || ctrl.touched);\n });\n\n readonly errorMessage = computed(() => {\n const ctrl = this.formControl();\n if (!ctrl.invalid || (!ctrl.dirty && !ctrl.touched)) {\n return '';\n }\n const errors = ctrl.errors;\n if (!errors) return '';\n const firstKey = Object.keys(errors)[0];\n return getValidationMessage(this.config().validation, firstKey);\n });\n}\n","import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\nimport { ReportComponentDefinition } from '../../../core/models/report-component.model';\nimport { getValidationMessage } from '../../../core/validation/validation-factory';\n\n@Component({\n selector: 'rpt-checkbox',\n standalone: true,\n imports: [ReactiveFormsModule],\n template: `\n <div class=\"rpt-checkbox-field\">\n <label [for]=\"elementId()\" class=\"rpt-checkbox-label\">\n <input\n [id]=\"elementId()\"\n type=\"checkbox\"\n [formControl]=\"formControl()\"\n class=\"rpt-checkbox-input\"\n />\n <span class=\"rpt-custom-checkbox\" aria-hidden=\"true\">\n <svg class=\"rpt-check-icon\" width=\"12\" height=\"10\" viewBox=\"0 0 12 10\" fill=\"none\">\n <path d=\"M1 5L4.5 8.5L11 1.5\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n <span class=\"rpt-checkbox-text\">\n {{ config().label }}\n @if (config().validation?.required) {\n <span class=\"rpt-required-marker\">*</span>\n }\n </span>\n </label>\n\n @if (errorMessage()) {\n <span class=\"rpt-error-text\">{{ errorMessage() }}</span>\n }\n </div>\n `,\n styles: [`\n :host {\n display: block;\n width: 100%;\n height: 100%;\n box-sizing: border-box;\n font-family: var(--rpt-font-family, inherit);\n }\n .rpt-checkbox-field {\n display: flex;\n flex-direction: column;\n justify-content: flex-end;\n height: 100%;\n gap: 4px;\n padding-bottom: 8px; /* align with labeled inputs baseline */\n box-sizing: border-box;\n }\n .rpt-checkbox-label {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n cursor: pointer;\n user-select: none;\n }\n .rpt-checkbox-input {\n position: absolute;\n opacity: 0;\n width: 0;\n height: 0;\n margin: 0;\n }\n .rpt-custom-checkbox {\n width: 18px;\n height: 18px;\n border: 1px solid var(--rpt-color-border, #cbd5e1);\n border-radius: var(--rpt-border-radius-sm, 4px);\n background-color: var(--rpt-color-bg, #ffffff);\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all var(--rpt-transition-speed, 150ms) ease;\n color: var(--rpt-color-text-inverse, #ffffff);\n flex-shrink: 0;\n }\n .rpt-checkbox-label:hover .rpt-custom-checkbox {\n border-color: var(--rpt-color-border-hover, #94a3b8);\n }\n .rpt-checkbox-input:focus-visible + .rpt-custom-checkbox {\n border-color: var(--rpt-color-border-focus, #2563eb);\n box-shadow: var(--rpt-box-shadow-focus, 0 0 0 3px rgba(37, 99, 235, 0.25));\n }\n .rpt-checkbox-input:checked + .rpt-custom-checkbox {\n background-color: var(--rpt-color-primary, #2563eb);\n border-color: var(--rpt-color-primary, #2563eb);\n }\n .rpt-check-icon {\n opacity: 0;\n transform: scale(0.6);\n transition: all var(--rpt-transition-speed, 150ms) ease;\n }\n .rpt-checkbox-input:checked + .rpt-custom-checkbox .rpt-check-icon {\n opacity: 1;\n transform: scale(1);\n }\n .rpt-checkbox-input:disabled + .rpt-custom-checkbox {\n background-color: var(--rpt-color-surface, #f8fafc);\n border-color: var(--rpt-color-border, #cbd5e1);\n cursor: not-allowed;\n }\n .rpt-checkbox-text {\n font-size: var(--rpt-font-size-base, 0.875rem);\n color: var(--rpt-color-text, #0f172a);\n }\n .rpt-required-marker {\n color: var(--rpt-color-danger, #ef4444);\n margin-left: 2px;\n }\n .rpt-error-text {\n font-size: var(--rpt-font-size-sm, 0.75rem);\n color: var(--rpt-color-danger, #ef4444);\n }\n `],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class RptCheckboxComponent {\n readonly config = input.required<ReportComponentDefinition>();\n readonly control = input<FormControl>();\n\n private readonly fallbackControl = new FormControl(false);\n\n readonly formControl = computed(() => this.control() ?? this.fallbackControl);\n readonly elementId = computed(() => this.config().key || this.config().id);\n\n readonly isInvalid = computed(() => {\n const ctrl = this.formControl();\n return ctrl.invalid && (ctrl.dirty || ctrl.touched);\n });\n\n readonly errorMessage = computed(() => {\n const ctrl = this.formControl();\n if (!ctrl.invalid || (!ctrl.dirty && !ctrl.touched)) {\n return '';\n }\n const errors = ctrl.errors;\n if (!errors) return '';\n const firstKey = Object.keys(errors)[0];\n return getValidationMessage(this.config().validation, firstKey);\n });\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\n/**\n * Enterprise SVG Icon component for BWays-Report.\n * Provides crisp, scalable vector icons without external font dependencies.\n */\n@Component({\n selector: 'rpt-icon',\n standalone: true,\n imports: [CommonModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <svg\n class=\"rpt-svg-icon\"\n [attr.width]=\"size()\"\n [attr.height]=\"size()\"\n [attr.viewBox]=\"viewBox()\"\n [attr.stroke]=\"stroke()\"\n [attr.fill]=\"fill()\"\n [attr.stroke-width]=\"strokeWidth()\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n [style.color]=\"color()\"\n aria-hidden=\"true\"\n >\n @for (d of paths(); track d) {\n <path [attr.d]=\"d\" />\n }\n @for (c of circles(); track c.cx + '-' + c.cy) {\n <circle [attr.cx]=\"c.cx\" [attr.cy]=\"c.cy\" [attr.r]=\"c.r\" />\n }\n @for (r of rects(); track r.x + '-' + r.y) {\n <rect\n [attr.x]=\"r.x\"\n [attr.y]=\"r.y\"\n [attr.width]=\"r.width\"\n [attr.height]=\"r.height\"\n [attr.rx]=\"r.rx || 0\"\n />\n }\n @for (l of lines(); track l.x1 + '-' + l.y1) {\n <line\n [attr.x1]=\"l.x1\"\n [attr.y1]=\"l.y1\"\n [attr.x2]=\"l.x2\"\n [attr.y2]=\"l.y2\"\n />\n }\n @for (p of polylines(); track p) {\n <polyline [attr.points]=\"p\" />\n }\n </svg>\n `,\n styles: [`\n :host {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n vertical-align: middle;\n line-height: 1;\n }\n\n .rpt-svg-icon {\n display: inline-block;\n flex-shrink: 0;\n color: inherit;\n }\n `]\n})\nexport class RptIconComponent {\n /** Icon name (e.g. 'search', 'edit', 'save', 'kpi', 'chart-bar', 'trend-up') */\n readonly name = input.required<string>();\n\n /** Icon dimension in pixels. Defaults to 16. */\n readonly size = input<number>(16);\n\n /** Stroke/fill color. Defaults to 'currentColor'. */\n readonly color = input<string>('currentColor');\n\n /** Stroke width for line-based icons. Defaults to 2. */\n readonly strokeWidth = input<number>(2);\n\n readonly viewBox = computed(() => '0 0 24 24');\n readonly stroke = computed(() => 'currentColor');\n readonly fill = computed(() => 'none');\n\n private readonly iconData = computed(() => {\n const n = this.name()?.toLowerCase().trim() || 'box';\n return ICON_REGISTRY[n] || ICON_REGISTRY['box'] || { paths: [] };\n });\n\n readonly paths = computed(() => this.iconData().paths || []);\n readonly circles = computed(() => this.iconData().circles || []);\n readonly rects = computed(() => this.iconData().rects || []);\n readonly lines = computed(() => this.iconData().lines || []);\n readonly polylines = computed(() => this.iconData().polylines || []);\n}\n\ninterface IconDefinition {\n paths?: string[];\n circles?: { cx: number; cy: number; r: number }[];\n rects?: { x: number; y: number; width: number; height: number; rx?: number }[];\n lines?: { x1: number; y1: number; x2: number; y2: number }[];\n polylines?: string[];\n}\n\nconst ICON_REGISTRY: Record<string, IconDefinition> = {\n // Input / Text\n 'input': {\n paths: ['M17 3a2.828 2.828 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5L17 3z']\n },\n 'text-fields': {\n lines: [\n { x1: 4, y1: 7, x2: 4, y2: 4 },\n { x1: 4, y1: 4, x2: 20, y2: 4 },\n { x1: 20, y1: 4, x2: 20, y2: 7 },\n { x1: 12, y1: 4, x2: 12, y2: 20 },\n { x1: 9, y1: 20, x2: 15, y2: 20 }\n ]\n },\n 'edit': {\n paths: [\n 'M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7',\n 'M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z'\n ]\n },\n 'design': {\n rects: [{ x: 3, y: 3, width: 18, height: 18, rx: 2 }],\n lines: [\n { x1: 3, y1: 9, x2: 21, y2: 9 },\n { x1: 9, y1: 21, x2: 9, y2: 9 }\n ]\n },\n\n // Dropdown / Select\n 'dropdown': {\n rects: [{ x: 3, y: 3, width: 18, height: 18, rx: 4 }],\n polylines: ['8 10 12 14 16 10']\n },\n 'chevron-down': {\n polylines: ['6 9 12 15 18 9']\n },\n 'chevron-up': {\n polylines: ['18 15 12 9 6 15']\n },\n\n // Date / Calendar\n 'date': {\n rects: [{ x: 3, y: 4, width: 18, height: 18, rx: 3 }],\n lines: [\n { x1: 16, y1: 2, x2: 16, y2: 6 },\n { x1: 8, y1: 2, x2: 8, y2: 6 },\n { x1: 3, y1: 10, x2: 21, y2: 10 }\n ]\n },\n 'calendar': {\n rects: [{ x: 3, y: 4, width: 18, height: 18, rx: 3 }],\n lines: [\n { x1: 16, y1: 2, x2: 16, y2: 6 },\n { x1: 8, y1: 2, x2: 8, y2: 6 },\n { x1: 3, y1: 10, x2: 21, y2: 10 }\n ]\n },\n 'calendar-today': {\n rects: [{ x: 3, y: 4, width: 18, height: 18, rx: 3 }],\n lines: [\n { x1: 16, y1: 2, x2: 16, y2: 6 },\n { x1: 8, y1: 2, x2: 8, y2: 6 },\n { x1: 3, y1: 10, x2: 21, y2: 10 }\n ]\n },\n\n // Number / Hash\n 'number': {\n lines: [\n { x1: 4, y1: 9, x2: 20, y2: 9 },\n { x1: 4, y1: 15, x2: 20, y2: 15 },\n { x1: 10, y1: 3, x2: 8, y2: 21 },\n { x1: 16, y1: 3, x2: 14, y2: 21 }\n ]\n },\n\n // Checkbox\n 'checkbox': {\n rects: [{ x: 3, y: 3, width: 18, height: 18, rx: 4 }],\n polylines: ['9 12 11 14 15 10']\n },\n\n // Button\n 'button': {\n rects: [{ x: 3, y: 7, width: 18, height: 10, rx: 4 }],\n lines: [{ x1: 8, y1: 12, x2: 16, y2: 12 }]\n },\n\n // KPI & Trends\n 'kpi': {\n paths: ['M22 12h-4l-3 9L9 3l-3 9H2']\n },\n 'monitoring': {\n paths: ['M22 12h-4l-3 9L9 3l-3 9H2']\n },\n 'trend-up': {\n polylines: ['23 6 13.5 15.5 8.5 10.5 1 18', '17 6 23 6 23 12']\n },\n 'trend-down': {\n polylines: ['23 18 13.5 8.5 8.5 13.5 1 6', '17 18 23 18 23 12']\n },\n\n // Charts\n 'chart': {\n lines: [\n { x1: 18, y1: 20, x2: 18, y2: 10 },\n { x1: 12, y1: 20, x2: 12, y2: 4 },\n { x1: 6, y1: 20, x2: 6, y2: 14 }\n ]\n },\n 'chart-bar': {\n lines: [\n { x1: 18, y1: 20, x2: 18, y2: 10 },\n { x1: 12, y1: 20, x2: 12, y2: 4 },\n { x1: 6, y1: 20, x2: 6, y2: 14 }\n ]\n },\n 'bar-chart': {\n lines: [\n { x1: 18, y1: 20, x2: 18, y2: 10 },\n { x1: 12, y1: 20, x2: 12, y2: 4 },\n { x1: 6, y1: 20, x2: 6, y2: 14 }\n ]\n },\n 'chart-line': {\n polylines: ['22 12 18 12 15 21 9 3 6 12 2 12']\n },\n 'chart-donut': {\n circles: [\n { cx: 12, cy: 12, r: 10 },\n { cx: 12, cy: 12, r: 4 }\n ]\n },\n\n // Grid / Table / Layout\n 'grid': {\n rects: [{ x: 3, y: 3, width: 18, height: 18, rx: 3 }],\n lines: [\n { x1: 3, y1: 9, x2: 21, y2: 9 },\n { x1: 3, y1: 15, x2: 21, y2: 15 },\n { x1: 9, y1: 3, x2: 9, y2: 21 },\n { x1: 15, y1: 3, x2: 15, y2: 21 }\n ]\n },\n 'database': {\n paths: [\n 'M3 5c0-1.657 4.03-3 9-3s9 1.343 9 3v14c0 1.657-4.03 3-9 3s-9-1.343-9-3V5z',\n 'M3 12c0 1.657 4.03 3 9 3s9-1.343 9-3'\n ]\n },\n 'table': {\n rects: [{ x: 3, y: 3, width: 18, height: 18, rx: 3 }],\n lines: [\n { x1: 3, y1: 9, x2: 21, y2: 9 },\n { x1: 9, y1: 9, x2: 9, y2: 21 }\n ]\n },\n 'layout': {\n rects: [{ x: 3, y: 3, width: 18, height: 18, rx: 3 }],\n lines: [\n { x1: 3, y1: 9, x2: 21, y2: 9 },\n { x1: 9, y1: 21, x2: 9, y2: 9 }\n ]\n },\n 'list': {\n lines: [\n { x1: 8, y1: 6, x2: 21, y2: 6 },\n { x1: 8, y1: 12, x2: 21, y2: 12 },\n { x1: 8, y1: 18, x2: 21, y2: 18 },\n { x1: 3, y1: 6, x2: 4, y2: 6 },\n { x1: 3, y1: 12, x2: 4, y2: 12 },\n { x1: 3, y1: 18, x2: 4, y2: 18 }\n ]\n },\n\n // Selection / Cursor\n 'cursor': {\n paths: ['M3 3l7.07 16.97 2.51-7.39 7.39-2.51L3 3z'],\n lines: [{ x1: 13, y1: 13, x2: 19, y2: 19 }]\n },\n 'mouse-pointer': {\n paths: ['M3 3l7.07 16.97 2.51-7.39 7.39-2.51L3 3z'],\n lines: [{ x1: 13, y1: 13, x2: 19, y2: 19 }]\n },\n\n // Alert / Warning\n 'warning': {\n paths: ['M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z'],\n lines: [{ x1: 12, y1: 9, x2: 12, y2: 13 }, { x1: 12, y1: 17, x2: 12.01, y2: 17 }]\n },\n 'alert-triangle': {\n paths: ['M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z'],\n lines: [{ x1: 12, y1: 9, x2: 12, y2: 13 }, { x1: 12, y1: 17, x2: 12.01, y2: 17 }]\n },\n\n // Actions\n 'undo': {\n paths: ['M3 7v6h6', 'M21 17a9 9 0 0 0-9-9 9 9 0 0 0-6 2.3L3 13']\n },\n 'redo': {\n paths: ['M21 7v6h-6', 'M3 17a9 9 0 0 1 9-9 9 9 0 0 1 6 2.3L21 13']\n },\n 'save': {\n paths: [\n 'M19 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11l5 5v11a2 2 0 0 1-2 2z',\n 'M17 21v-8H7v8',\n 'M7 3v5h8'\n ]\n },\n 'download': {\n paths: [\n 'M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4',\n 'M7 10l5 5 5-5',\n 'M12 15V3'\n ]\n },\n 'export': {\n paths: [\n 'M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4',\n 'M7 10l5 5 5-5',\n 'M12 15V3'\n ]\n },\n 'search': {\n circles: [{ cx: 11, cy: 11, r: 8 }],\n lines: [{ x1: 21, y1: 21, x2: 16.65, y2: 16.65 }]\n },\n 'filter': {\n polylines: ['22 3 2 3 10 12.46 10 19 14 21 14 12.46 22 3']\n },\n 'copy': {\n rects: [{ x: 9, y: 9, width: 13, height: 13, rx: 2 }],\n paths: ['M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1']\n },\n 'duplicate': {\n rects: [{ x: 9, y: 9, width: 13, height: 13, rx: 2 }],\n paths: ['M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1']\n },\n 'trash': {\n paths: [\n 'M3 6h18',\n 'M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2',\n 'M10 11v6',\n 'M14 11v6'\n ]\n },\n 'delete': {\n paths: [\n 'M3 6h18',\n 'M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2'\n ]\n },\n 'settings': {\n circles: [{ cx: 12, cy: 12, r: 3 }],\n paths: [\n 'M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z'\n ]\n },\n 'gear': {\n circles: [{ cx: 12, cy: 12, r: 3 }],\n paths: [\n 'M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z'\n ]\n },\n 'eye': {\n paths: ['M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z'],\n circles: [{ cx: 12, cy: 12, r: 3 }]\n },\n 'preview': {\n paths: ['M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z'],\n circles: [{ cx: 12, cy: 12, r: 3 }]\n },\n 'code': {\n polylines: ['16 18 22 12 16 6', '8 6 2 12 8 18']\n },\n 'json': {\n polylines: ['16 18 22 12 16 6', '8 6 2 12 8 18']\n },\n\n // Navigation & Direction\n 'arrow-left': {\n lines: [{ x1: 19, y1: 12, x2: 5, y2: 12 }],\n polylines: ['12 19 5 12 12 5']\n },\n 'arrow-right': {\n lines: [{ x1: 5, y1: 12, x2: 19, y2: 12 }],\n polylines: ['12 5 19 12 12 19']\n },\n 'arrow-up': {\n lines: [{ x1: 12, y1: 19, x2: 12, y2: 5 }],\n polylines: ['5 12 12 5 19 12']\n },\n 'arrow-down': {\n lines: [{ x1: 12, y1: 5, x2: 12, y2: 19 }],\n polylines: ['19 12 12 19 5 12']\n },\n 'corner-down-right': {\n polylines: ['15 10 20 15 15 20'],\n paths: ['M4 4v7a4 4 0 0 0 4 4h12']\n },\n 'new-row': {\n polylines: ['15 10 20 15 15 20'],\n paths: ['M4 4v7a4 4 0 0 0 4 4h12']\n },\n\n // General Status & Common\n 'check': {\n polylines: ['20 6 9 17 4 12']\n },\n 'close': {\n lines: [\n { x1: 18, y1: 6, x2: 6, y2: 18 },\n { x1: 6, y1: 6, x2: 18, y2: 18 }\n ]\n },\n 'plus': {\n lines: [\n { x1: 12, y1: 5, x2: 12, y2: 19 },\n { x1: 5, y1: 12, x2: 19, y2: 12 }\n ]\n },\n 'minus': {\n lines: [{ x1: 5, y1: 12, x2: 19, y2: 12 }]\n },\n 'dollar': {\n lines: [{ x1: 12, y1: 1, x2: 12, y2: 23 }],\n paths: ['M17 5H9.5a3.5 3.5 0 0 0 0 7h5a3.5 3.5 0 0 1 0 7H6']\n },\n 'clock': {\n circles: [{ cx: 12, cy: 12, r: 10 }],\n polylines: ['12 6 12 12 16 14']\n },\n 'box': {\n paths: [\n 'M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z',\n 'M3.27 6.96L12 12.01l8.73-5.05',\n 'M12 22.08V12'\n ]\n },\n 'lightning': {\n polylines: ['13 2 3 14 12 14 11 22 21 10 12 10 13 2']\n },\n 'link': {\n paths: [\n 'M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71',\n 'M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71'\n ]\n },\n 'user': {\n paths: ['M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2'],\n circles: [{ cx: 12, cy: 7, r: 4 }]\n },\n 'sliders': {\n lines: [\n { x1: 4, y1: 21, x2: 4, y2: 14 },\n { x1: 4, y1: 10, x2: 4, y2: 3 },\n { x1: 12, y1: 21, x2: 12, y2: 12 },\n { x1: 12, y1: 8, x2: 12, y2: 3 },\n { x1: 20, y1: 21, x2: 20, y2: 16 },\n { x1: 20, y1: 12, x2: 20, y2: 3 },\n { x1: 1, y1: 14, x2: 7, y2: 14 },\n { x1: 9, y1: 8, x2: 15, y2: 8 },\n { x1: 17, y1: 16, x2: 23, y2: 16 }\n ]\n },\n 'sparkles': {\n paths: [\n 'M12 3v3m0 12v3M3 12h3m12 0h3M5.6 5.6l2.1 2.1m8.6 8.6l2.1 2.1M5.6 18.4l2.1-2.1m8.6-8.6l2.1-2.1'\n ]\n }\n};\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n output,\n} from '@angular/core';\nimport { ReportComponentDefinition } from '../../../core/models/report-component.model';\nimport { ComponentActionDefinition } from '../../../core/models/component-event.model';\nimport { RptIconComponent } from '../icon/rpt-icon.component';\n\n@Component({\n selector: 'rpt-button',\n standalone: true,\n imports: [RptIconComponent],\n template: `\n <div class=\"rpt-button-container\">\n <button\n [id]=\"elementId()\"\n [type]=\"buttonHtmlType()\"\n [class]=\"buttonClasses()\"\n [class.rpt-btn-full]=\"isFullWidth()\"\n [disabled]=\"isDisabled()\"\n [style.height]=\"customHeight()\"\n [style.width]=\"customWidth()\"\n (click)=\"onClick($event)\"\n >\n @if (icon()) {\n <rpt-icon [name]=\"icon()\" [size]=\"15\" />\n }\n <span>{{ buttonLabel() }}</span>\n </button>\n </div>\n `,\n\n styles: [`\n :host {\n display: block;\n width: 100%;\n height: 100%;\n box-sizing: border-box;\n font-family: var(--rpt-font-family, inherit);\n }\n .rpt-button-container {\n display: flex;\n align-items: flex-end;\n height: 100%;\n width: 100%;\n box-sizing: border-box;\n padding-bottom: 2px;\n }\n .rpt-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n height: 38px;\n width: auto;\n max-width: 100%;\n box-sizing: border-box;\n padding: 0 20px;\n font-size: var(--rpt-font-size-base, 0.875rem);\n font-weight: 500;\n border-radius: var(--rpt-border-radius, 6px);\n border: 1px solid transparent;\n cursor: pointer;\n user-select: none;\n transition: all var(--rpt-transition-speed, 150ms) ease;\n white-space: nowrap;\n }\n .rpt-btn:focus-visible {\n outline: none;\n box-shadow: var(--rpt-box-shadow-focus, 0 0 0 3px rgba(37, 99, 235, 0.25));\n }\n .rpt-btn:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n /* Variants */\n .rpt-btn-primary {\n background-color: var(--rpt-color-primary, #2563eb);\n color: var(--rpt-color-text-inverse, #ffffff);\n border-color: var(--rpt-color-primary, #2563eb);\n }\n .rpt-btn-primary:hover:not(:disabled) {\n background-color: var(--rpt-color-primary-hover, #1d4ed8);\n border-color: var(--rpt-color-primary-hover, #1d4ed8);\n }\n .rpt-btn-secondary {\n background-color: var(--rpt-color-surface, #f8fafc);\n color: var(--rpt-color-text, #0f172a);\n border-color: var(--rpt-color-border, #cbd5e1);\n }\n .rpt-btn-secondary:hover:not(:disabled) {\n background-color: var(--rpt-color-surface-hover, #f1f5f9);\n border-color: var(--rpt-color-border-hover, #94a3b8);\n }\n .rpt-btn-outline {\n background-color: transparent;\n color: var(--rpt-color-primary, #2563eb);\n border-color: var(--rpt-color-primary, #2563eb);\n }\n .rpt-btn-outline:hover:not(:disabled) {\n background-color: var(--rpt-color-primary-focus, rgba(37, 99, 235, 0.1));\n }\n .rpt-btn-danger {\n background-color: var(--rpt-color-danger, #ef4444);\n color: var(--rpt-color-text-inverse, #ffffff);\n border-color: var(--rpt-color-danger, #ef4444);\n }\n .rpt-btn-danger:hover:not(:disabled) {\n background-color: #dc2626;\n border-color: #dc2626;\n }\n .rpt-btn.rpt-btn-full {\n width: 100%;\n }\n .rpt-btn-icon {\n display: flex;\n align-items: center;\n }\n `],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class RptButtonComponent {\n readonly config = input.required<ReportComponentDefinition>();\n\n readonly actionTriggered = output<ComponentActionDefinition>();\n\n readonly elementId = computed(() => this.config().id);\n readonly buttonLabel = computed(\n () => this.config().label || (this.config().properties?.['text'] as string) || 'Submit'\n );\n readonly buttonHtmlType = computed(() => {\n const action = this.config().properties?.['action'] as string;\n return action === 'submit' ? 'submit' : 'button';\n });\n readonly isDisabled = computed(() => this.config().enabled === false);\n readonly icon = computed(() => (this.config().properties?.['icon'] as string) || '');\n\n readonly buttonClasses = computed(() => {\n const variant = (this.config().properties?.['variant'] as string) || 'primary';\n return `rpt-btn rpt-btn-${variant}`;\n });\n\n readonly isFullWidth = computed(() => {\n return (\n this.config().properties?.['fullWidth'] === true ||\n this.config().layout?.width === '100%'\n );\n });\n\n readonly customHeight = computed<string | null>(() => {\n const h = this.config().layout?.height;\n return h && h !== 'auto' ? h : null;\n });\n\n readonly customWidth = computed<string | null>(() => {\n const w = this.config().layout?.width;\n return w && w !== 'auto' ? w : null;\n });\n\n onClick(event: MouseEvent): void {\n const events = this.config().events;\n if (events && events.length > 0) {\n const clickEvent = events.find((e) => e.event === 'click');\n if (clickEvent) {\n this.actionTriggered.emit(clickEvent.action);\n }\n } else {\n // Default action if configured in properties\n const actionType = (this.config().properties?.['action'] as string) || 'execute-report';\n this.actionTriggered.emit({ type: actionType, target: this.config().id });\n }\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReportComponentDefinition } from '../../../core/models/report-component.model';\nimport { RptIconComponent } from '../icon/rpt-icon.component';\n\nexport type KpiTheme = 'primary' | 'success' | 'warning' | 'danger' | 'info' | 'neutral';\nexport type TrendDirection = 'up' | 'down' | 'neutral';\n\n@Component({\n selector: 'rpt-kpi-card',\n standalone: true,\n imports: [CommonModule, RptIconComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div\n class=\"rpt-kpi-card\"\n [class]=\"'rpt-kpi-card--' + theme()\"\n [attr.role]=\"'region'\"\n [attr.aria-label]=\"title()\"\n >\n <div class=\"rpt-kpi-header\">\n <span class=\"rpt-kpi-title\">{{ title() }}</span>\n @if (icon()) {\n <span class=\"rpt-kpi-icon-badge\">\n <rpt-icon [name]=\"icon()\" [size]=\"18\" />\n </span>\n }\n </div>\n\n <div class=\"rpt-kpi-body\">\n <div class=\"rpt-kpi-value-row\">\n @if (prefix()) {\n <span class=\"rpt-kpi-prefix\">{{ prefix() }}</span>\n }\n <span class=\"rpt-kpi-value\">{{ formattedValue() }}</span>\n @if (suffix()) {\n <span class=\"rpt-kpi-suffix\">{{ suffix() }}</span>\n }\n </div>\n\n @if (hasTrend() || subtitle()) {\n <div class=\"rpt-kpi-footer\">\n @if (hasTrend()) {\n <span\n class=\"rpt-kpi-trend\"\n [class]=\"'rpt-kpi-trend--' + trendDirection()\"\n >\n <rpt-icon\n [name]=\"trendDirection() === 'up' ? 'trend-up' : (trendDirection() === 'down' ? 'trend-down' : 'minus')\"\n [size]=\"12\"\n />\n <span>{{ trendValue() }}%</span>\n </span>\n }\n @if (trendLabel() || subtitle()) {\n <span class=\"rpt-kpi-subtitle\">{{ trendLabel() || subtitle() }}</span>\n }\n </div>\n }\n\n </div>\n\n <!-- Subtle glowing gradient bar at card top -->\n <div class=\"rpt-kpi-accent-bar\"></div>\n </div>\n `,\n styles: [`\n :host {\n display: block;\n width: 100%;\n height: 100%;\n box-sizing: border-box;\n }\n\n .rpt-kpi-card {\n position: relative;\n background: var(--rpt-surface-bg, #ffffff);\n border: 1px solid var(--rpt-border-color, #e2e8f0);\n border-radius: var(--rpt-radius-lg, 12px);\n padding: var(--rpt-space-md, 20px);\n box-shadow: 0 2px 6px -1px rgba(0, 0, 0, 0.05), 0 1px 4px -2px rgba(0, 0, 0, 0.04);\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n height: 100%;\n box-sizing: border-box;\n gap: 12px;\n overflow: hidden;\n transition: transform 0.2s ease, box-shadow 0.2s ease, border-color 0.2s ease;\n user-select: none;\n }\n\n .rpt-kpi-card:hover {\n transform: translateY(-2px);\n box-shadow: 0 8px 20px -4px rgba(0, 0, 0, 0.08), 0 4px 10px -4px rgba(0, 0, 0, 0.05);\n border-color: var(--rpt-border-hover, #cbd5e1);\n }\n\n .rpt-kpi-accent-bar {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n height: 3px;\n background: var(--kpi-accent, var(--rpt-primary, #2563eb));\n }\n\n .rpt-kpi-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n }\n\n .rpt-kpi-title {\n font-size: 0.8125rem;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n color: var(--rpt-text-muted, #64748b);\n }\n\n .rpt-kpi-icon-badge {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n border-radius: 8px;\n background: var(--kpi-badge-bg, rgba(37, 99, 235, 0.08));\n color: var(--kpi-accent, var(--rpt-primary, #2563eb));\n font-size: 1rem;\n }\n\n .rpt-kpi-body {\n display: flex;\n flex-direction: column;\n gap: 6px;\n }\n\n .rpt-kpi-value-row {\n display: flex;\n align-items: baseline;\n gap: 4px;\n }\n\n .rpt-kpi-prefix,\n .rpt-kpi-suffix {\n font-size: 1.125rem;\n font-weight: 500;\n color: var(--rpt-text-muted, #64748b);\n }\n\n .rpt-kpi-value {\n font-size: 1.875rem;\n font-weight: 700;\n color: var(--rpt-text-color, #0f172a);\n line-height: 1.1;\n font-feature-settings: 'tnum';\n font-variant-numeric: tabular-nums;\n }\n\n .rpt-kpi-footer {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-wrap: wrap;\n margin-top: 2px;\n }\n\n .rpt-kpi-trend {\n display: inline-flex;\n align-items: center;\n gap: 2px;\n font-size: 0.75rem;\n font-weight: 600;\n padding: 2px 6px;\n border-radius: 4px;\n }\n\n .rpt-kpi-trend--up {\n background: rgba(16, 185, 129, 0.12);\n color: #059669;\n }\n\n .rpt-kpi-trend--down {\n background: rgba(239, 68, 68, 0.12);\n color: #dc2626;\n }\n\n .rpt-kpi-trend--neutral {\n background: rgba(100, 116, 139, 0.12);\n color: #475569;\n }\n\n .rpt-kpi-subtitle {\n font-size: 0.75rem;\n color: var(--rpt-text-muted, #64748b);\n }\n\n /* Themes */\n .rpt-kpi-card--primary {\n --kpi-accent: var(--rpt-primary, #2563eb);\n --kpi-badge-bg: rgba(37, 99, 235, 0.1);\n }\n\n .rpt-kpi-card--success {\n --kpi-accent: #10b981;\n --kpi-badge-bg: rgba(16, 185, 129, 0.1);\n }\n\n .rpt-kpi-card--warning {\n --kpi-accent: #f59e0b;\n --kpi-badge-bg: rgba(245, 158, 11, 0.1);\n }\n\n .rpt-kpi-card--danger {\n --kpi-accent: #ef4444;\n --kpi-badge-bg: rgba(239, 68, 68, 0.1);\n }\n\n .rpt-kpi-card--info {\n --kpi-accent: #06b6d4;\n --kpi-badge-bg: rgba(6, 182, 212, 0.1);\n }\n\n .rpt-kpi-card--neutral {\n --kpi-accent: #64748b;\n --kpi-badge-bg: rgba(100, 116, 139, 0.1);\n }\n `]\n})\nexport class RptKpiCardComponent {\n /** Optional metadata component definition. */\n readonly definition = input<ReportComponentDefinition>();\n\n /** Title of metric (e.g., 'Total Revenue'). */\n readonly customTitle = input<string | undefined>(undefined, { alias: 'title' });\n\n /** Metric value. */\n readonly customValue = input<string | number | undefined>(undefined, { alias: 'value' });\n\n /** Currency or unit prefix (e.g. '$'). */\n readonly customPrefix = input<string | undefined>(undefined, { alias: 'prefix' });\n\n /** Unit suffix (e.g. '%', 'items'). */\n readonly customSuffix = input<string | undefined>(undefined, { alias: 'suffix' });\n\n /** Theme accent color. */\n readonly customTheme = input<KpiTheme | undefined>(undefined, { alias: 'theme' });\n\n /** Icon symbol or emoji. */\n readonly customIcon = input<string | undefined>(undefined, { alias: 'icon' });\n\n /** Trend direction: up | down | neutral */\n readonly customTrendDirection = input<TrendDirection | undefined>(undefined, { alias: 'trendDirection' });\n\n /** Trend percentage value. */\n readonly customTrendValue = input<number | undefined>(undefined, { alias: 'trendValue' });\n\n /** Trend contextual label. */\n readonly customTrendLabel = input<string | undefined>(undefined, { alias: 'trendLabel' });\n\n /** Subtitle. */\n readonly customSubtitle = input<string | undefined>(undefined, { alias: 'subtitle' });\n\n // Computed properties merging definition properties and inputs\n readonly title = computed(() => {\n return this.customTitle() ?? (this.definition()?.properties?.['title'] as string) ?? this.definition()?.label ?? 'Metric';\n });\n\n readonly rawValue = computed(() => {\n const val = this.customValue();\n if (val !== undefined && val !== '') return val;\n return (this.definition()?.properties?.['value'] as string | number) ?? '0';\n });\n\n readonly formattedValue = computed(() => {\n const v = this.rawValue();\n if (typeof v === 'number') {\n return v.toLocaleString();\n }\n return String(v);\n });\n\n readonly prefix = computed(() => {\n return this.customPrefix() ?? (this.definition()?.properties?.['prefix'] as string) ?? '';\n });\n\n readonly suffix = computed(() => {\n return this.customSuffix() ?? (this.definition()?.properties?.['suffix'] as string) ?? '';\n });\n\n readonly theme = computed<KpiTheme>(() => {\n return (this.customTheme() ?? (this.definition()?.properties?.['theme'] as KpiTheme) ?? 'primary') as KpiTheme;\n });\n\n readonly icon = computed(() => {\n return this.customIcon() ?? (this.definition()?.properties?.['icon'] as string) ?? '';\n });\n\n\n readonly trendDirection = computed<TrendDirection>(() => {\n return (\n this.customTrendDirection() ||\n (this.definition()?.properties?.['trendDirection'] as TrendDirection) ||\n 'neutral'\n );\n });\n\n readonly trendValue = computed<number | undefined>(() => {\n if (this.customTrendValue() !== undefined) return this.customTrendValue();\n return this.definition()?.properties?.['trendValue'] as number | undefined;\n });\n\n readonly hasTrend = computed<boolean>(() => {\n return this.trendValue() !== undefined;\n });\n\n readonly trendArrow = computed<string>(() => {\n switch (this.trendDirection()) {\n case 'up':\n return 'trend-up';\n case 'down':\n return 'trend-down';\n default:\n return 'minus';\n }\n });\n\n readonly trendLabel = computed(() => {\n return this.customTrendLabel() || (this.definition()?.properties?.['trendLabel'] as string) || '';\n });\n\n readonly subtitle = computed(() => {\n return this.customSubtitle() || (this.definition()?.properties?.['subtitle'] as string) || '';\n });\n}\n\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n Type,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { CHART_COMPONENT } from '../../../core/tokens/reporting-config.token';\nimport { ReportComponentDefinition } from '../../../core/models/report-component.model';\n\nexport interface ChartDataItem {\n label: string;\n value: number;\n color?: string;\n}\n\nexport type ChartType = 'bar' | 'line' | 'donut';\n\n@Component({\n selector: 'rpt-chart-bridge',\n standalone: true,\n imports: [CommonModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"rpt-chart-bridge-container\">\n @if (hostChartComponent) {\n <ng-container\n *ngComponentOutlet=\"\n hostChartComponent;\n inputs: {\n data: data(),\n chartType: chartType(),\n title: title(),\n options: options()\n }\n \"\n />\n } @else {\n <!-- Built-in fallback SVG/CSS chart -->\n <div class=\"rpt-chart-fallback-card\">\n <div class=\"rpt-chart-fallback-header\">\n <h3 class=\"rpt-chart-title\">{{ title() }}</h3>\n <span class=\"rpt-chart-badge\">{{ chartType() | uppercase }}</span>\n </div>\n\n <div class=\"rpt-chart-canvas-area\">\n @if (data().length === 0) {\n <div class=\"rpt-chart-empty\">No chart data available</div>\n } @else if (chartType() === 'bar') {\n <!-- Vertical Bar Chart -->\n <div class=\"rpt-bar-chart\">\n @for (item of data(); track item.label) {\n <div class=\"rpt-bar-column\">\n <div class=\"rpt-bar-track\">\n <div\n class=\"rpt-bar-fill\"\n [style.height.%]=\"getBarPercentage(item.value)\"\n [style.background-color]=\"item.color || defaultColors[$index % defaultColors.length]\"\n [title]=\"item.label + ': ' + item.value\"\n >\n <span class=\"rpt-bar-tooltip\">{{ item.value }}</span>\n </div>\n </div>\n <span class=\"rpt-bar-label\" [title]=\"item.label\">{{ item.label }}</span>\n </div>\n }\n </div>\n } @else if (chartType() === 'donut') {\n <!-- SVG Donut Chart -->\n <div class=\"rpt-donut-chart-container\">\n <svg class=\"rpt-donut-svg\" viewBox=\"0 0 160 160\">\n @for (segment of donutSegments(); track segment.label) {\n <circle\n cx=\"80\"\n cy=\"80\"\n r=\"60\"\n fill=\"transparent\"\n [attr.stroke]=\"segment.color\"\n stroke-width=\"24\"\n [attr.stroke-dasharray]=\"segment.dashArray\"\n [attr.stroke-dashoffset]=\"segment.dashOffset\"\n />\n }\n <text x=\"80\" y=\"76\" text-anchor=\"middle\" class=\"rpt-donut-total-val\">\n {{ totalValue() }}\n </text>\n <text x=\"80\" y=\"92\" text-anchor=\"middle\" class=\"rpt-donut-total-lbl\">\n Total\n </text>\n </svg>\n\n <div class=\"rpt-chart-legend\">\n @for (item of data(); track item.label) {\n <div class=\"rpt-legend-item\">\n <span\n class=\"rpt-legend-dot\"\n [style.background-color]=\"item.color || defaultColors[$index % defaultColors.length]\"\n ></span>\n <span class=\"rpt-legend-label\">{{ item.label }}</span>\n <span class=\"rpt-legend-value\">{{ item.value }}</span>\n </div>\n }\n </div>\n </div>\n } @else {\n <!-- SVG Line / Area Chart -->\n <div class=\"rpt-line-chart-container\">\n <svg class=\"rpt-line-svg\" viewBox=\"0 0 400 160\" preserveAspectRatio=\"none\">\n <defs>\n <linearGradient id=\"rptLineGrad\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stop-color=\"var(--rpt-primary, #2563eb)\" stop-opacity=\"0.3\" />\n <stop offset=\"100%\" stop-color=\"var(--rpt-primary, #2563eb)\" stop-opacity=\"0.0\" />\n </linearGradient>\n </defs>\n @if (linePoints().areaPath) {\n <path [attr.d]=\"linePoints().areaPath\" fill=\"url(#rptLineGrad)\" />\n }\n @if (linePoints().linePath) {\n <path\n [attr.d]=\"linePoints().linePath\"\n fill=\"none\"\n stroke=\"var(--rpt-primary, #2563eb)\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n }\n @for (pt of linePoints().points; track pt.label) {\n <circle\n [attr.cx]=\"pt.x\"\n [attr.cy]=\"pt.y\"\n r=\"4\"\n fill=\"#ffffff\"\n stroke=\"var(--rpt-primary, #2563eb)\"\n stroke-width=\"2\"\n />\n }\n </svg>\n <div class=\"rpt-line-labels\">\n @for (item of data(); track item.label) {\n <span class=\"rpt-line-label\">{{ item.label }}</span>\n }\n </div>\n </div>\n }\n </div>\n </div>\n }\n </div>\n `,\n styles: [`\n :host {\n display: block;\n width: 100%;\n height: 100%;\n box-sizing: border-box;\n }\n\n .rpt-chart-bridge-container {\n width: 100%;\n }\n\n .rpt-chart-fallback-card {\n background: var(--rpt-surface-bg, #ffffff);\n border: 1px solid var(--rpt-border-color, #e2e8f0);\n border-radius: var(--rpt-radius-lg, 12px);\n padding: var(--rpt-space-md, 20px);\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);\n display: flex;\n flex-direction: column;\n height: 100%;\n box-sizing: border-box;\n gap: 16px;\n }\n\n .rpt-chart-fallback-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n flex-shrink: 0;\n }\n\n .rpt-chart-title {\n font-size: 1rem;\n font-weight: 600;\n color: var(--rpt-text-color, #0f172a);\n margin: 0;\n }\n\n .rpt-chart-badge {\n font-size: 0.6875rem;\n font-weight: 700;\n padding: 2px 8px;\n border-radius: 9999px;\n background: var(--rpt-bg-subtle, #f1f5f9);\n color: var(--rpt-text-muted, #64748b);\n letter-spacing: 0.05em;\n }\n\n .rpt-chart-canvas-area {\n min-height: 140px;\n height: 100%;\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .rpt-chart-empty {\n color: var(--rpt-text-muted, #94a3b8);\n font-size: 0.875rem;\n }\n\n /* Bar Chart */\n .rpt-bar-chart {\n display: flex;\n align-items: flex-end;\n justify-content: space-around;\n gap: 12px;\n width: 100%;\n height: 180px;\n padding-top: 20px;\n }\n\n .rpt-bar-column {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n height: 100%;\n max-width: 48px;\n }\n\n .rpt-bar-track {\n flex: 1;\n width: 100%;\n background: var(--rpt-bg-subtle, #f8fafc);\n border-radius: 6px 6px 0 0;\n display: flex;\n align-items: flex-end;\n overflow: hidden;\n }\n\n .rpt-bar-fill {\n position: relative;\n width: 100%;\n min-height: 4px;\n border-radius: 6px 6px 0 0;\n transition: height 0.4s cubic-bezier(0.16, 1, 0.3, 1);\n cursor: pointer;\n }\n\n .rpt-bar-fill:hover .rpt-bar-tooltip {\n opacity: 1;\n visibility: visible;\n transform: translateY(-8px);\n }\n\n .rpt-bar-tooltip {\n position: absolute;\n top: -24px;\n left: 50%;\n transform: translateX(-50%);\n background: #0f172a;\n color: #ffffff;\n font-size: 0.6875rem;\n padding: 2px 6px;\n border-radius: 4px;\n white-space: nowrap;\n opacity: 0;\n visibility: hidden;\n transition: all 0.15s ease;\n pointer-events: none;\n z-index: 10;\n }\n\n .rpt-bar-label {\n font-size: 0.75rem;\n color: var(--rpt-text-muted, #64748b);\n margin-top: 8px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n max-width: 100%;\n text-align: center;\n }\n\n /* Donut Chart */\n .rpt-donut-chart-container {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 32px;\n width: 100%;\n flex-wrap: wrap;\n }\n\n .rpt-donut-svg {\n width: 150px;\n height: 150px;\n transform: rotate(-90deg);\n }\n\n .rpt-donut-total-val {\n transform: rotate(90deg);\n transform-origin: 80px 80px;\n font-size: 1.25rem;\n font-weight: 700;\n fill: var(--rpt-text-color, #0f172a);\n }\n\n .rpt-donut-total-lbl {\n transform: rotate(90deg);\n transform-origin: 80px 80px;\n font-size: 0.6875rem;\n fill: var(--rpt-text-muted, #64748b);\n text-transform: uppercase;\n letter-spacing: 0.05em;\n }\n\n .rpt-chart-legend {\n display: flex;\n flex-direction: column;\n gap: 8px;\n min-width: 140px;\n }\n\n .rpt-legend-item {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 0.8125rem;\n }\n\n .rpt-legend-dot {\n width: 10px;\n height: 10px;\n border-radius: 50%;\n flex-shrink: 0;\n }\n\n .rpt-legend-label {\n flex: 1;\n color: var(--rpt-text-color, #334155);\n }\n\n .rpt-legend-value {\n font-weight: 600;\n color: var(--rpt-text-muted, #64748b);\n }\n\n /* Line Chart */\n .rpt-line-chart-container {\n width: 100%;\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .rpt-line-svg {\n width: 100%;\n height: 140px;\n }\n\n .rpt-line-labels {\n display: flex;\n justify-content: space-between;\n font-size: 0.75rem;\n color: var(--rpt-text-muted, #64748b);\n padding: 0 8px;\n }\n `]\n})\nexport class ReportChartBridgeComponent {\n readonly hostChartComponent: Type<unknown> | null = inject(CHART_COMPONENT, { optional: true });\n\n readonly definition = input<ReportComponentDefinition>();\n readonly customData = input<ChartDataItem[] | undefined>(undefined, { alias: 'data' });\n readonly customChartType = input<ChartType | undefined>(undefined, { alias: 'chartType' });\n readonly customTitle = input<string | undefined>(undefined, { alias: 'title' });\n readonly customOptions = input<Record<string, any>>({}, { alias: 'options' });\n\n readonly defaultColors = [\n '#2563eb',\n '#10b981',\n '#f59e0b',\n '#ef4444',\n '#8b5cf6',\n '#06b6d4',\n '#ec4899'\n ];\n\n readonly title = computed(() => {\n return (\n this.customTitle() ??\n (this.definition()?.properties?.['title'] as string) ??\n this.definition()?.label ??\n 'Chart'\n );\n });\n\n readonly chartType = computed<ChartType>(() => {\n return (\n this.customChartType() ??\n (this.definition()?.properties?.['chartType'] as ChartType) ??\n 'bar'\n );\n });\n\n readonly data = computed<ChartDataItem[]>(() => {\n if (this.customData() && this.customData()!.length > 0) return this.customData()!;\n const configData = this.definition()?.properties?.['data'] as ChartDataItem[];\n return configData || [];\n });\n\n\n readonly options = computed(() => {\n return {\n ...(this.definition()?.properties || {}),\n ...this.customOptions()\n };\n });\n\n\n readonly maxValue = computed(() => {\n const items = this.data();\n if (items.length === 0) return 1;\n return Math.max(...items.map((d) => d.value), 1);\n });\n\n readonly totalValue = computed(() => {\n return this.data().reduce((acc, curr) => acc + curr.value, 0);\n });\n\n getBarPercentage(value: number): number {\n const max = this.maxValue();\n return Math.round((value / max) * 100);\n }\n\n readonly donutSegments = computed(() => {\n const items = this.data();\n const total = this.totalValue();\n if (total === 0) return [];\n\n const circumference = 2 * Math.PI * 60; // radius = 60 => ~376.99\n let accumulated = 0;\n\n return items.map((item, idx) => {\n const ratio = item.value / total;\n const strokeLength = ratio * circumference;\n const dashOffset = -(accumulated * circumference);\n accumulated += ratio;\n\n return {\n label: item.label,\n color: item.color || this.defaultColors[idx % this.defaultColors.length],\n dashArray: `${strokeLength} ${circumference}`,\n dashOffset\n };\n });\n });\n\n readonly linePoints = computed(() => {\n const items = this.data();\n if (items.length === 0) return { linePath: '', areaPath: '', points: [] };\n\n const max = this.maxValue();\n const width = 400;\n const height = 140;\n const padding = 20;\n\n const usableWidth = width - padding * 2;\n const usableHeight = height - padding * 2;\n const step = items.length > 1 ? usableWidth / (items.length - 1) : 0;\n\n const pts = items.map((item, idx) => {\n const x = padding + idx * step;\n const y = height - padding - (item.value / max) * usableHeight;\n return { x, y, label: item.label, value: item.value };\n });\n\n const linePath = pts.reduce((acc, pt, i) => {\n return i === 0 ? `M ${pt.x} ${pt.y}` : `${acc} L ${pt.x} ${pt.y}`;\n }, '');\n\n const firstPt = pts[0];\n const lastPt = pts[pts.length - 1];\n const areaPath = `${linePath} L ${lastPt.x} ${height - padding} L ${firstPt.x} ${height - padding} Z`;\n\n return { linePath, areaPath, points: pts };\n });\n}\n","import { ComponentRegistry } from '../core/registry/component-registry';\nimport { generateId } from '../core/utilities/id-generator';\nimport {\n RptButtonComponent,\n RptCheckboxComponent,\n RptDateComponent,\n RptDropdownComponent,\n RptInputComponent,\n RptNumberComponent,\n RptKpiCardComponent,\n ReportChartBridgeComponent,\n} from './components';\n\n\n/**\n * Registers all built-in primitive components with the ComponentRegistry.\n *\n * This provides the baseline components for any reporting page.\n * Host applications can override any of these by calling `registry.register()`\n * with their own custom component after calling this function.\n *\n * @param registry - The ComponentRegistry instance to populate.\n */\nexport function registerBuiltinComponents(registry: ComponentRegistry): void {\n // 1. Text Input\n registry.register({\n type: 'input',\n displayName: 'Text Input',\n category: 'input',\n icon: 'text_fields',\n createDefaultConfig: () => ({\n id: generateId('input'),\n type: 'input',\n key: 'textInput',\n label: 'Text Input',\n properties: {\n placeholder: 'Enter value...',\n type: 'text',\n },\n }),\n component: RptInputComponent,\n propertySchema: [\n { key: 'label', label: 'Label', type: 'string', required: true, group: 'General' },\n { key: 'key', label: 'Field Name (Key)', type: 'string', required: true, group: 'General' },\n { key: 'placeholder', label: 'Placeholder', type: 'string', group: 'General' },\n {\n key: 'type',\n label: 'Input Type',\n type: 'select',\n defaultValue: 'text',\n options: [\n { key: 'text', label: 'Text' },\n { key: 'email', label: 'Email' },\n { key: 'tel', label: 'Phone' },\n { key: 'url', label: 'URL' },\n ],\n group: 'General',\n },\n { key: 'required', label: 'Required', type: 'boolean', group: 'Validation' },\n { key: 'minLength', label: 'Min Length', type: 'number', group: 'Validation' },\n { key: 'maxLength', label: 'Max Length', type: 'number', group: 'Validation' },\n ],\n });\n\n // 2. Dropdown\n registry.register({\n type: 'dropdown',\n displayName: 'Dropdown',\n category: 'input',\n icon: 'arrow_drop_down_circle',\n createDefaultConfig: () => ({\n id: generateId('dropdown'),\n type: 'dropdown',\n key: 'dropdownField',\n label: 'Dropdown',\n properties: {\n placeholder: '-- Select --',\n options: [\n { key: '1', label: 'Option 1' },\n { key: '2', label: 'Option 2' },\n ],\n },\n }),\n component: RptDropdownComponent,\n propertySchema: [\n { key: 'label', label: 'Label', type: 'string', required: true, group: 'General' },\n { key: 'key', label: 'Field Name (Key)', type: 'string', required: true, group: 'General' },\n { key: 'placeholder', label: 'Placeholder', type: 'string', group: 'General' },\n { key: 'required', label: 'Required', type: 'boolean', group: 'Validation' },\n ],\n });\n\n // 3. Date Picker\n registry.register({\n type: 'date',\n displayName: 'Date Picker',\n category: 'input',\n icon: 'calendar_today',\n createDefaultConfig: () => ({\n id: generateId('date'),\n type: 'date',\n key: 'dateField',\n label: 'Date',\n properties: {\n includeTime: false,\n },\n }),\n component: RptDateComponent,\n propertySchema: [\n { key: 'label', label: 'Label', type: 'string', required: true, group: 'General' },\n { key: 'key', label: 'Field Name (Key)', type: 'string', required: true, group: 'General' },\n { key: 'includeTime', label: 'Include Time', type: 'boolean', group: 'General' },\n { key: 'minDate', label: 'Min Date', type: 'string', group: 'Validation' },\n { key: 'maxDate', label: 'Max Date', type: 'string', group: 'Validation' },\n { key: 'required', label: 'Required', type: 'boolean', group: 'Validation' },\n ],\n });\n\n // 4. Number Input\n registry.register({\n type: 'number',\n displayName: 'Number Input',\n category: 'input',\n icon: 'numbers',\n createDefaultConfig: () => ({\n id: generateId('number'),\n type: 'number',\n key: 'numberField',\n label: 'Number',\n properties: {\n placeholder: '0',\n step: 1,\n },\n }),\n component: RptNumberComponent,\n propertySchema: [\n { key: 'label', label: 'Label', type: 'string', required: true, group: 'General' },\n { key: 'key', label: 'Field Name (Key)', type: 'string', required: true, group: 'General' },\n { key: 'placeholder', label: 'Placeholder', type: 'string', group: 'General' },\n { key: 'prefix', label: 'Prefix (e.g. $)', type: 'string', group: 'Display' },\n { key: 'suffix', label: 'Suffix (e.g. %)', type: 'string', group: 'Display' },\n { key: 'step', label: 'Step', type: 'number', group: 'General' },\n { key: 'min', label: 'Min Value', type: 'number', group: 'Validation' },\n { key: 'max', label: 'Max Value', type: 'number', group: 'Validation' },\n { key: 'required', label: 'Required', type: 'boolean', group: 'Validation' },\n ],\n });\n\n // 5. Checkbox\n registry.register({\n type: 'checkbox',\n displayName: 'Checkbox',\n category: 'input',\n icon: 'check_box',\n createDefaultConfig: () => ({\n id: generateId('chk'),\n type: 'checkbox',\n key: 'checkboxField',\n label: 'Active',\n properties: {\n defaultValue: false,\n },\n }),\n component: RptCheckboxComponent,\n propertySchema: [\n { key: 'label', label: 'Label', type: 'string', required: true, group: 'General' },\n { key: 'key', label: 'Field Name (Key)', type: 'string', required: true, group: 'General' },\n { key: 'defaultValue', label: 'Default Value', type: 'boolean', group: 'General' },\n { key: 'required', label: 'Must be checked', type: 'boolean', group: 'Validation' },\n ],\n });\n\n // 6. Button\n registry.register({\n type: 'button',\n displayName: 'Action Button',\n category: 'action',\n icon: 'smart_button',\n createDefaultConfig: () => ({\n id: generateId('btn'),\n type: 'button',\n label: 'Run Report',\n properties: {\n variant: 'primary',\n action: 'execute-report',\n },\n }),\n component: RptButtonComponent,\n propertySchema: [\n { key: 'label', label: 'Button Text', type: 'string', required: true, group: 'General' },\n {\n key: 'icon',\n label: 'Button Icon',\n type: 'select',\n defaultValue: '',\n options: [\n { key: '', label: 'None (No Icon)' },\n { key: 'search', label: 'Search' },\n { key: 'download', label: 'Download' },\n { key: 'filter', label: 'Filter' },\n { key: 'refresh', label: 'Refresh' },\n { key: 'check', label: 'Check' },\n { key: 'plus', label: 'Plus' },\n ],\n group: 'Display',\n },\n {\n key: 'fullWidth',\n label: 'Full Width (Fill Column)',\n type: 'boolean',\n defaultValue: false,\n group: 'Display',\n },\n {\n key: 'variant',\n label: 'Style Variant',\n type: 'select',\n defaultValue: 'primary',\n options: [\n { key: 'primary', label: 'Primary' },\n { key: 'secondary', label: 'Secondary' },\n { key: 'outline', label: 'Outline' },\n { key: 'danger', label: 'Danger' },\n ],\n group: 'Display',\n },\n {\n key: 'action',\n label: 'Action Type',\n type: 'select',\n defaultValue: 'execute-report',\n options: [\n { key: 'execute-report', label: 'Execute Report' },\n { key: 'reset', label: 'Reset Form' },\n { key: 'custom', label: 'Custom Event' },\n ],\n group: 'Action',\n },\n ],\n });\n\n // 7. KPI Metric Card\n registry.register({\n type: 'kpi-card',\n displayName: 'KPI Metric Card',\n category: 'display',\n icon: 'monitoring',\n createDefaultConfig: () => ({\n id: generateId('kpi'),\n type: 'kpi-card',\n label: 'Total Revenue',\n properties: {\n title: 'Total Revenue',\n value: 125400,\n prefix: '$',\n theme: 'primary',\n icon: 'dollar',\n trendValue: 12.8,\n trendDirection: 'up',\n trendLabel: 'vs last month'\n },\n layout: {\n columnSpan: 3,\n }\n }),\n component: RptKpiCardComponent,\n propertySchema: [\n { key: 'title', label: 'Metric Title', type: 'string', required: true, group: 'General' },\n { key: 'value', label: 'Value', type: 'string', required: true, group: 'General' },\n { key: 'prefix', label: 'Prefix (e.g. $)', type: 'string', group: 'Display' },\n { key: 'suffix', label: 'Suffix (e.g. %)', type: 'string', group: 'Display' },\n {\n key: 'theme',\n label: 'Theme Accent',\n type: 'select',\n defaultValue: 'primary',\n options: [\n { key: 'primary', label: 'Primary (Blue)' },\n { key: 'success', label: 'Success (Green)' },\n { key: 'warning', label: 'Warning (Amber)' },\n { key: 'danger', label: 'Danger (Red)' },\n { key: 'info', label: 'Info (Cyan)' },\n { key: 'neutral', label: 'Neutral (Slate)' },\n ],\n group: 'Display',\n },\n { key: 'icon', label: 'Icon (e.g. dollar, check, chart-bar, box)', type: 'string', group: 'Display' },\n { key: 'trendValue', label: 'Trend Value (%)', type: 'number', group: 'Trend' },\n {\n key: 'trendDirection',\n label: 'Trend Direction',\n type: 'select',\n defaultValue: 'neutral',\n options: [\n { key: 'up', label: 'Up (Growth)' },\n { key: 'down', label: 'Down (Decline)' },\n { key: 'neutral', label: 'Neutral' },\n ],\n group: 'Trend',\n },\n { key: 'trendLabel', label: 'Trend Label', type: 'string', group: 'Trend' },\n ],\n });\n\n // 8. Chart Bridge\n registry.register({\n type: 'chart',\n displayName: 'Chart Visualization',\n category: 'display',\n icon: 'bar_chart',\n createDefaultConfig: () => ({\n id: generateId('chart'),\n type: 'chart',\n label: 'Performance Breakdown',\n properties: {\n title: 'Monthly Performance',\n chartType: 'bar',\n data: [\n { label: 'Q1', value: 45 },\n { label: 'Q2', value: 68 },\n { label: 'Q3', value: 85 },\n { label: 'Q4', value: 110 }\n ]\n },\n layout: {\n columnSpan: 6,\n }\n }),\n component: ReportChartBridgeComponent,\n propertySchema: [\n { key: 'title', label: 'Chart Title', type: 'string', required: true, group: 'General' },\n {\n key: 'chartType',\n label: 'Chart Type',\n type: 'select',\n defaultValue: 'bar',\n options: [\n { key: 'bar', label: 'Bar Chart' },\n { key: 'donut', label: 'Donut Chart' },\n { key: 'line', label: 'Line / Area Chart' },\n ],\n group: 'General',\n },\n ],\n });\n}\n\n\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n signal,\n Type,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { GRID_COMPONENT } from '../../core/tokens/reporting-config.token';\nimport {\n GridColumnDefinition,\n ReportGridDefinition,\n} from '../../core/models/report-grid.model';\nimport { RptIconComponent } from '../../primitives/components/icon/rpt-icon.component';\n\n@Component({\n selector: 'rpt-grid-bridge',\n standalone: true,\n imports: [CommonModule, RptIconComponent],\n template: `\n <div class=\"rpt-grid-container\">\n @if (customGridComponent()) {\n <!-- Host-provided grid component (e.g. BWays-grid or custom AG Grid wrapper) -->\n <ng-container\n [ngComponentOutlet]=\"customGridComponent()!\"\n [ngComponentOutletInputs]=\"gridInputs()\"\n />\n } @else {\n <!-- Built-in fallback table when no external grid is provided -->\n <div class=\"rpt-table-card\">\n <div class=\"rpt-table-toolbar\">\n <span class=\"rpt-table-title\">Results ({{ data().length }} rows)</span>\n </div>\n\n <div class=\"rpt-table-responsive\">\n <table class=\"rpt-table\">\n <thead>\n <tr>\n @if (showRowNumbers()) {\n <th class=\"rpt-th rpt-th-num\">#</th>\n }\n @for (col of visibleColumns(); track col.field) {\n <th\n class=\"rpt-th\"\n [style.width]=\"col.width || 'auto'\"\n [style.text-align]=\"col.align || 'left'\"\n [class.sortable]=\"col.sortable !== false\"\n (click)=\"toggleSort(col)\"\n >\n <div class=\"rpt-th-content\" [style.justify-content]=\"getJustifyContent(col.align)\">\n <span>{{ col.label }}</span>\n @if (col.sortable !== false && sortColumn() === col.field) {\n <span class=\"rpt-sort-indicator\">\n <rpt-icon [name]=\"sortDirection() === 'asc' ? 'chevron-up' : 'chevron-down'\" [size]=\"12\" />\n </span>\n }\n </div>\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @if (paginatedData().length === 0) {\n <tr>\n <td [attr.colspan]=\"colSpan()\" class=\"rpt-empty-message\">\n No data found matching criteria\n </td>\n </tr>\n } @else {\n @for (row of paginatedData(); track $index) {\n <tr class=\"rpt-tr\">\n @if (showRowNumbers()) {\n <td class=\"rpt-td rpt-td-num\">{{ (currentPage() - 1) * pageSize() + $index + 1 }}</td>\n }\n @for (col of visibleColumns(); track col.field) {\n <td class=\"rpt-td\" [style.text-align]=\"col.align || 'left'\">\n {{ formatValue(row[col.field], col) }}\n </td>\n }\n </tr>\n }\n }\n </tbody>\n @if (hasAggregates()) {\n <tfoot>\n <tr class=\"rpt-tfoot-row\">\n @if (showRowNumbers()) {\n <td class=\"rpt-td-num\"></td>\n }\n @for (col of visibleColumns(); track col.field) {\n <td class=\"rpt-td-aggregate\" [style.text-align]=\"col.align || 'left'\">\n @if (col.aggregate && col.aggregate !== 'none') {\n <strong>{{ col.aggregate | uppercase }}: {{ computeAggregate(col) }}</strong>\n }\n </td>\n }\n </tr>\n </tfoot>\n }\n </table>\n </div>\n\n @if (isPaginationEnabled() && totalPages() > 1) {\n <div class=\"rpt-pagination-bar\">\n <span class=\"rpt-page-info\">\n Page {{ currentPage() }} of {{ totalPages() }}\n </span>\n <div class=\"rpt-page-buttons\">\n <button\n type=\"button\"\n class=\"rpt-page-btn\"\n [disabled]=\"currentPage() === 1\"\n (click)=\"prevPage()\"\n >\n <rpt-icon name=\"arrow-left\" [size]=\"12\" />\n <span>Previous</span>\n </button>\n <button\n type=\"button\"\n class=\"rpt-page-btn\"\n [disabled]=\"currentPage() === totalPages()\"\n (click)=\"nextPage()\"\n >\n <span>Next</span>\n <rpt-icon name=\"arrow-right\" [size]=\"12\" />\n </button>\n </div>\n </div>\n }\n </div>\n }\n </div>\n `,\n styles: [`\n :host {\n display: block;\n width: 100%;\n margin-top: 16px;\n font-family: var(--rpt-font-family, inherit);\n }\n .rpt-grid-container {\n width: 100%;\n }\n .rpt-table-card {\n background: var(--rpt-color-bg, #ffffff);\n border: 1px solid var(--rpt-color-border, #cbd5e1);\n border-radius: var(--rpt-border-radius-lg, 8px);\n box-shadow: var(--rpt-box-shadow, 0 1px 3px rgba(0, 0, 0, 0.05));\n overflow: hidden;\n }\n .rpt-table-toolbar {\n padding: 12px 16px;\n background-color: var(--rpt-color-surface, #f8fafc);\n border-bottom: 1px solid var(--rpt-color-border, #cbd5e1);\n display: flex;\n align-items: center;\n justify-content: space-between;\n }\n .rpt-table-title {\n font-size: var(--rpt-font-size-sm, 0.75rem);\n font-weight: 600;\n color: var(--rpt-color-text-muted, #64748b);\n text-transform: uppercase;\n letter-spacing: 0.05em;\n }\n .rpt-table-responsive {\n width: 100%;\n overflow-x: auto;\n }\n .rpt-table {\n width: 100%;\n border-collapse: collapse;\n font-size: var(--rpt-font-size-base, 0.875rem);\n text-align: left;\n }\n .rpt-th {\n background-color: var(--rpt-color-surface, #f8fafc);\n padding: 10px 14px;\n font-weight: 600;\n font-size: var(--rpt-font-size-sm, 0.75rem);\n color: var(--rpt-color-text-muted, #475569);\n border-bottom: 1px solid var(--rpt-color-border, #cbd5e1);\n white-space: nowrap;\n user-select: none;\n }\n .rpt-th.sortable {\n cursor: pointer;\n }\n .rpt-th.sortable:hover {\n background-color: var(--rpt-color-surface-hover, #f1f5f9);\n }\n .rpt-th-content {\n display: flex;\n align-items: center;\n gap: 4px;\n }\n .rpt-sort-indicator {\n display: inline-flex;\n align-items: center;\n color: var(--rpt-color-primary, #2563eb);\n }\n .rpt-th-num, .rpt-td-num {\n width: 48px;\n text-align: center;\n color: var(--rpt-color-text-muted, #94a3b8);\n font-size: var(--rpt-font-size-sm, 0.75rem);\n }\n .rpt-td {\n padding: 10px 14px;\n border-bottom: 1px solid var(--rpt-color-border, #e2e8f0);\n color: var(--rpt-color-text, #1e293b);\n }\n .rpt-tr:hover {\n background-color: var(--rpt-color-surface-hover, #f8fafc);\n }\n .rpt-empty-message {\n text-align: center;\n padding: 40px 20px;\n color: var(--rpt-color-text-muted, #94a3b8);\n font-style: italic;\n }\n .rpt-tfoot-row {\n background-color: var(--rpt-color-surface, #f8fafc);\n border-top: 2px solid var(--rpt-color-border, #cbd5e1);\n }\n .rpt-td-aggregate {\n padding: 10px 14px;\n color: var(--rpt-color-text, #0f172a);\n font-size: var(--rpt-font-size-sm, 0.75rem);\n }\n .rpt-pagination-bar {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px 16px;\n border-top: 1px solid var(--rpt-color-border, #e2e8f0);\n background-color: var(--rpt-color-surface, #f8fafc);\n }\n .rpt-page-info {\n font-size: var(--rpt-font-size-sm, 0.75rem);\n color: var(--rpt-color-text-muted, #64748b);\n }\n .rpt-page-buttons {\n display: flex;\n gap: 8px;\n }\n .rpt-page-btn {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 4px 10px;\n font-size: var(--rpt-font-size-sm, 0.75rem);\n background-color: var(--rpt-color-bg, #ffffff);\n border: 1px solid var(--rpt-color-border, #cbd5e1);\n border-radius: var(--rpt-border-radius-sm, 4px);\n cursor: pointer;\n transition: all var(--rpt-transition-speed, 150ms) ease;\n }\n .rpt-page-btn:hover:not(:disabled) {\n background-color: var(--rpt-color-surface-hover, #f1f5f9);\n border-color: var(--rpt-color-border-hover, #94a3b8);\n }\n .rpt-page-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n `],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ReportGridBridgeComponent {\n private readonly injectedGrid = inject(GRID_COMPONENT, { optional: true });\n\n readonly gridDefinition = input.required<ReportGridDefinition>();\n readonly data = input<unknown[]>([]);\n\n readonly customGridComponent = computed<Type<unknown> | null>(() => this.injectedGrid ?? null);\n\n readonly sortColumn = signal<string | null>(null);\n readonly sortDirection = signal<'asc' | 'desc'>('asc');\n readonly currentPage = signal<number>(1);\n readonly bridgedColumns = computed(() => {\n return this.gridDefinition().columns.map((col) => {\n let widthNum: number | undefined;\n if (typeof col.width === 'string' && col.width.endsWith('px')) {\n widthNum = parseInt(col.width, 10);\n } else if (typeof (col.width as unknown) === 'number') {\n widthNum = col.width as unknown as number;\n }\n\n return {\n ...col,\n headerName: col.label, // BWays-grid / AG Grid standard\n header: col.label,\n title: col.label,\n hide: col.visible === false,\n width: widthNum,\n aggFunc: col.aggregate && col.aggregate !== 'none' ? col.aggregate : undefined,\n };\n });\n });\n\n readonly gridInputs = computed(() => ({\n columns: this.bridgedColumns(),\n columnDefs: this.bridgedColumns(),\n data: this.data(),\n rowData: this.data(),\n options: this.gridDefinition().options,\n config: this.gridDefinition().options,\n pagination: this.gridDefinition().options?.pagination !== false,\n pageSize: this.gridDefinition().options?.pageSize ?? 10,\n }));\n\n readonly visibleColumns = computed<GridColumnDefinition[]>(() => {\n return this.gridDefinition().columns.filter((c) => c.visible !== false);\n });\n\n readonly showRowNumbers = computed(() => {\n return !!this.gridDefinition().options?.showRowNumbers;\n });\n\n readonly isPaginationEnabled = computed(() => {\n return this.gridDefinition().options?.pagination !== false;\n });\n\n readonly pageSize = computed(() => {\n return this.gridDefinition().options?.pageSize ?? 10;\n });\n\n readonly colSpan = computed(() => {\n return this.visibleColumns().length + (this.showRowNumbers() ? 1 : 0);\n });\n\n readonly hasAggregates = computed(() => {\n return (\n this.gridDefinition().options?.showFooter &&\n this.visibleColumns().some((c) => c.aggregate && c.aggregate !== 'none')\n );\n });\n\n readonly sortedData = computed<Record<string, unknown>[]>(() => {\n const raw = (this.data() as Record<string, unknown>[]) || [];\n const col = this.sortColumn();\n const dir = this.sortDirection();\n\n if (!col) return raw;\n\n return [...raw].sort((a, b) => {\n const valA = a[col];\n const valB = b[col];\n if (valA == null && valB == null) return 0;\n if (valA == null) return 1;\n if (valB == null) return -1;\n if (valA < valB) return dir === 'asc' ? -1 : 1;\n if (valA > valB) return dir === 'asc' ? 1 : -1;\n return 0;\n });\n });\n\n readonly totalPages = computed(() => {\n if (!this.isPaginationEnabled()) return 1;\n const len = this.sortedData().length;\n return Math.max(1, Math.ceil(len / this.pageSize()));\n });\n\n readonly paginatedData = computed<Record<string, unknown>[]>(() => {\n const sorted = this.sortedData();\n if (!this.isPaginationEnabled()) {\n return sorted;\n }\n const start = (this.currentPage() - 1) * this.pageSize();\n return sorted.slice(start, start + this.pageSize());\n });\n\n getJustifyContent(align?: 'left' | 'center' | 'right'): string {\n if (align === 'right') return 'flex-end';\n if (align === 'center') return 'center';\n return 'flex-start';\n }\n\n toggleSort(col: GridColumnDefinition): void {\n if (col.sortable === false) return;\n if (this.sortColumn() === col.field) {\n this.sortDirection.set(this.sortDirection() === 'asc' ? 'desc' : 'asc');\n } else {\n this.sortColumn.set(col.field);\n this.sortDirection.set('asc');\n }\n this.currentPage.set(1);\n }\n\n prevPage(): void {\n if (this.currentPage() > 1) {\n this.currentPage.update((p) => p - 1);\n }\n }\n\n nextPage(): void {\n if (this.currentPage() < this.totalPages()) {\n this.currentPage.update((p) => p + 1);\n }\n }\n\n formatValue(value: unknown, col: GridColumnDefinition): string {\n if (value == null) return '';\n if (col.dataType === 'currency') {\n const num = Number(value);\n return isNaN(num) ? String(value) : `$${num.toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 })}`;\n }\n if (col.dataType === 'number') {\n const num = Number(value);\n return isNaN(num) ? String(value) : num.toLocaleString();\n }\n if (col.dataType === 'date' && typeof value === 'string') {\n const d = new Date(value);\n return isNaN(d.getTime()) ? String(value) : d.toLocaleDateString();\n }\n return String(value);\n }\n\n computeAggregate(col: GridColumnDefinition): string {\n const data = this.sortedData();\n if (data.length === 0) return '0';\n\n if (col.aggregate === 'count') {\n return String(data.length);\n }\n\n const numbers = data\n .map((row) => Number(row[col.field]))\n .filter((n) => !isNaN(n));\n\n if (numbers.length === 0) return '0';\n\n if (col.aggregate === 'sum') {\n const sum = numbers.reduce((acc, n) => acc + n, 0);\n return col.dataType === 'currency' ? `$${sum.toFixed(2)}` : sum.toLocaleString();\n }\n\n if (col.aggregate === 'avg') {\n const avg = numbers.reduce((acc, n) => acc + n, 0) / numbers.length;\n return col.dataType === 'currency' ? `$${avg.toFixed(2)}` : avg.toFixed(2);\n }\n\n if (col.aggregate === 'min') {\n const min = Math.min(...numbers);\n return col.dataType === 'currency' ? `$${min.toFixed(2)}` : String(min);\n }\n\n if (col.aggregate === 'max') {\n const max = Math.max(...numbers);\n return col.dataType === 'currency' ? `$${max.toFixed(2)}` : String(max);\n }\n\n return '';\n }\n}\n","import { ReportComponentDefinition } from '../../../core/models/report-component.model';\n\n/**\n * Pure utility functions for design canvas layout, grid calculations, and sizing.\n *\n * Implemented as framework-independent pure functions per Rule 10 & 11 (Pure Logic First).\n */\n\n/**\n * Resolves the effective column span for a component.\n * Uses layout.columnSpan if specified, otherwise defaults based on component type (e.g. 2 for button, 4 for others).\n */\nexport function resolveComponentSpan(\n comp: ReportComponentDefinition,\n totalColumns: number = 12,\n overrideSpan?: number | null\n): number {\n if (overrideSpan !== undefined && overrideSpan !== null) {\n return Math.max(1, Math.min(totalColumns, overrideSpan));\n }\n const defaultSpan = comp.type === 'button' ? 2 : 4;\n const rawSpan = comp.layout?.columnSpan ?? defaultSpan;\n return Math.max(1, Math.min(totalColumns, rawSpan));\n}\n\n/**\n * Computes the CSS `grid-column` specification string for a component.\n */\nexport function calculateGridColumn(\n comp: ReportComponentDefinition,\n totalColumns: number = 12,\n span?: number\n): string {\n const effectiveSpan = span ?? resolveComponentSpan(comp, totalColumns);\n const clamped = Math.max(1, Math.min(effectiveSpan, totalColumns));\n const col = comp.layout?.column;\n\n if (col && col >= 1 && col <= totalColumns) {\n return `${col} / span ${clamped}`;\n }\n\n return comp.layout?.newRow ? `1 / span ${clamped}` : `span ${clamped}`;\n}\n\n/**\n * Computes the CSS `grid-row` specification string for a component.\n */\nexport function calculateGridRow(comp: ReportComponentDefinition): string {\n const rowSpan = comp.layout?.rowSpan;\n if (rowSpan && rowSpan > 1) {\n return `span ${rowSpan}`;\n }\n return 'auto';\n}\n\n/**\n * Overhead in pixels for the Visual Canvas card (card header 32px + card body vertical padding 16px).\n * Adding this overhead to the component's logical height ensures that the canvas card body\n * renders at the exact same pixel dimensions as the live preview component.\n */\nexport const CANVAS_CARD_OVERHEAD = 48;\n\n/**\n * Resolves the CSS height property for the canvas component card.\n * Accounts for the card header and padding overhead so the inner mock body\n * accurately mirrors the runtime component height.\n */\nexport function resolveCanvasCardHeight(\n comp: ReportComponentDefinition,\n overrideComponentHeight?: number | null,\n overhead: number = CANVAS_CARD_OVERHEAD\n): string {\n if (overrideComponentHeight !== undefined && overrideComponentHeight !== null) {\n return `${overrideComponentHeight + overhead}px`;\n }\n const h = comp.layout?.height;\n if (!h || h === 'auto') return 'auto';\n const parsed = parseInt(h, 10);\n return isNaN(parsed) ? h : `${parsed + overhead}px`;\n}\n\n/**\n * Resolves the CSS min-height property for the canvas component card.\n */\nexport function resolveCanvasCardMinHeight(\n comp: ReportComponentDefinition,\n overrideComponentHeight?: number | null,\n overhead: number = CANVAS_CARD_OVERHEAD\n): string {\n if (overrideComponentHeight !== undefined && overrideComponentHeight !== null) {\n return `${overrideComponentHeight + overhead}px`;\n }\n const minH = comp.layout?.minHeight;\n if (!minH || minH === 'auto') return 'auto';\n const parsed = parseInt(minH, 10);\n return isNaN(parsed) ? minH : `${parsed + overhead}px`;\n}\n\n/**\n * Resolves the CSS height property for a runtime component.\n */\nexport function resolveComponentHeight(\n comp: ReportComponentDefinition,\n overrideHeight?: number | null\n): string {\n if (overrideHeight !== undefined && overrideHeight !== null) {\n return `${overrideHeight}px`;\n }\n return comp.layout?.height || 'auto';\n}\n\n/**\n * Resolves the CSS min-height property for a runtime component.\n */\nexport function resolveComponentMinHeight(\n comp: ReportComponentDefinition,\n overrideHeight?: number | null\n): string {\n if (overrideHeight !== undefined && overrideHeight !== null) {\n return `${overrideHeight}px`;\n }\n return comp.layout?.minHeight || 'auto';\n}\n\n/**\n * Calculates new snapped span given drag deltaX, column width, and grid gap.\n */\nexport function calculateSnappedSpan(\n deltaX: number,\n startSpan: number,\n colWidth: number,\n gap: number,\n totalCols: number\n): number {\n const step = colWidth + gap;\n if (step <= 0) return startSpan;\n const spanDelta = Math.round(deltaX / step);\n return Math.max(1, Math.min(totalCols, startSpan + spanDelta));\n}\n\n/**\n * Calculates new height given drag deltaY and minimum height constraint.\n */\nexport function calculateSnappedHeight(\n deltaY: number,\n startHeight: number,\n minHeight: number = 50\n): number {\n return Math.max(minHeight, Math.round(startHeight + deltaY));\n}\n\n/**\n * Maps component type to standard icon identifier.\n */\nexport function getComponentIconName(type: string): string {\n switch (type) {\n case 'input': return 'text-fields';\n case 'dropdown': return 'dropdown';\n case 'date': return 'calendar';\n case 'number': return 'number';\n case 'checkbox': return 'checkbox';\n case 'button': return 'button';\n case 'kpi-card': return 'kpi';\n case 'chart': return 'chart-bar';\n default: return 'box';\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n output,\n Type,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule, FormGroup } from '@angular/forms';\nimport { ReportDefinition } from '../../core/models/report-definition.model';\nimport { ReportComponentDefinition } from '../../core/models/report-component.model';\nimport { ComponentActionDefinition } from '../../core/models/component-event.model';\nimport { ComponentRegistry } from '../../core/registry/component-registry';\nimport { DynamicFormBuilder } from '../../core/services/dynamic-form-builder.service';\nimport { ReportGridBridgeComponent } from './report-grid-bridge.component';\nimport { calculateGridColumn, calculateGridRow } from '../designer/utilities/canvas-layout.util';\n\n@Component({\n selector: 'rpt-dynamic-renderer',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule, ReportGridBridgeComponent],\n template: `\n <div\n class=\"rpt-renderer-root\"\n [style.direction]=\"definition().layout.direction || 'ltr'\"\n [style.padding.px]=\"definition().layout.padding ?? 24\"\n >\n <!-- Report Header -->\n <div class=\"rpt-header\">\n <h2 class=\"rpt-title\">{{ definition().name }}</h2>\n @if (definition().description) {\n <p class=\"rpt-description\">{{ definition().description }}</p>\n }\n </div>\n\n <!-- Controls Form / Parameter Filter Bar -->\n @if (definition().components.length > 0) {\n <form [formGroup]=\"form()\" (ngSubmit)=\"onSubmit()\" class=\"rpt-form\">\n <div\n class=\"rpt-layout-grid\"\n [style.grid-template-columns]=\"gridColumnsTemplate()\"\n [style.gap.px]=\"definition().layout.gap ?? 16\"\n >\n @for (comp of sortedComponents(); track comp.id) {\n @if (isComponentVisible(comp)) {\n <div\n class=\"rpt-cell\"\n [style.grid-column]=\"getGridColumn(comp)\"\n [style.grid-row]=\"getGridRow(comp)\"\n [style.width]=\"comp.layout?.width || 'auto'\"\n [style.height]=\"comp.layout?.height || 'auto'\"\n [style.min-height]=\"comp.layout?.minHeight || 'auto'\"\n [style.max-height]=\"comp.layout?.maxHeight || 'none'\"\n >\n @if (resolveComponent(comp.type); as compClass) {\n <ng-container\n [ngComponentOutlet]=\"compClass\"\n [ngComponentOutletInputs]=\"getComponentInputs(comp)\"\n />\n } @else {\n <div class=\"rpt-unregistered-placeholder\">\n Unknown component: <code>{{ comp.type }}</code>\n </div>\n }\n </div>\n }\n }\n </div>\n </form>\n }\n\n <!-- Result Grid Section -->\n @if (definition().grid && resultData() !== null && resultData() !== undefined) {\n <div class=\"rpt-grid-section\">\n <rpt-grid-bridge\n [gridDefinition]=\"definition().grid!\"\n [data]=\"resultData()!\"\n />\n </div>\n }\n </div>\n `,\n styles: [`\n :host {\n display: block;\n width: 100%;\n box-sizing: border-box;\n font-family: var(--rpt-font-family, inherit);\n }\n .rpt-renderer-root {\n width: 100%;\n box-sizing: border-box;\n }\n .rpt-header {\n margin-bottom: 20px;\n }\n .rpt-title {\n font-size: var(--rpt-font-size-xl, 1.5rem);\n font-weight: 700;\n color: var(--rpt-color-text, #0f172a);\n margin: 0 0 6px 0;\n letter-spacing: -0.02em;\n }\n .rpt-description {\n font-size: var(--rpt-font-size-base, 0.875rem);\n color: var(--rpt-color-text-muted, #64748b);\n margin: 0;\n }\n .rpt-form {\n margin-bottom: 24px;\n }\n .rpt-layout-grid {\n display: grid;\n width: 100%;\n align-items: stretch;\n }\n .rpt-cell {\n box-sizing: border-box;\n min-width: 0;\n display: flex;\n flex-direction: column;\n height: 100%;\n }\n .rpt-cell > * {\n width: 100%;\n height: 100%;\n flex: 1;\n display: flex;\n flex-direction: column;\n min-height: 0;\n box-sizing: border-box;\n }\n .rpt-unregistered-placeholder {\n padding: 8px 12px;\n font-size: var(--rpt-font-size-sm, 0.75rem);\n color: var(--rpt-color-danger, #ef4444);\n background-color: var(--rpt-color-danger-bg, #fef2f2);\n border: 1px dashed var(--rpt-color-danger, #ef4444);\n border-radius: var(--rpt-border-radius, 6px);\n }\n .rpt-grid-section {\n width: 100%;\n margin-top: 16px;\n }\n `],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class DynamicRendererComponent {\n private readonly registry = inject(ComponentRegistry);\n private readonly formBuilder = inject(DynamicFormBuilder);\n\n readonly definition = input.required<ReportDefinition>();\n readonly initialValues = input<Record<string, unknown>>({});\n readonly resultData = input<unknown[] | null>(null);\n\n readonly executeRequested = output<{\n definition: ReportDefinition;\n parameters: Record<string, unknown>;\n }>();\n\n readonly form = computed<FormGroup>(() => {\n return this.formBuilder.toFormGroup(\n this.definition().components,\n this.initialValues()\n );\n });\n\n readonly sortedComponents = computed<ReportComponentDefinition[]>(() => {\n return [...this.definition().components].sort(\n (a, b) => (a.order ?? 0) - (b.order ?? 0)\n );\n });\n\n readonly totalGridColumns = computed<number>(() => {\n return this.definition().layout.columns || 12;\n });\n\n readonly gridColumnsTemplate = computed<string>(() => {\n return `repeat(${this.totalGridColumns()}, minmax(0, 1fr))`;\n });\n\n resolveComponent(type: string): Type<unknown> | null {\n const meta = this.registry.resolve(type);\n return (meta?.component as Type<unknown>) ?? null;\n }\n\n getComponentInputs(comp: ReportComponentDefinition): Record<string, unknown> {\n const inputs: Record<string, unknown> = {\n config: comp,\n definition: comp,\n };\n\n if (comp.key) {\n inputs['control'] = this.form().get(comp.key);\n }\n\n return inputs;\n }\n\n\n getGridColumn(comp: ReportComponentDefinition): string {\n return calculateGridColumn(comp, this.totalGridColumns());\n }\n\n getGridRow(comp: ReportComponentDefinition): string {\n return calculateGridRow(comp);\n }\n\n isComponentVisible(comp: ReportComponentDefinition): boolean {\n const vis = comp.visibility;\n if (!vis) return true;\n const ctrl = this.form().get(vis.dependsOn);\n const val = ctrl ? ctrl.value : undefined;\n switch (vis.operator) {\n case 'equals':\n return val === vis.value;\n case 'notEquals':\n return val !== vis.value;\n case 'contains':\n return typeof val === 'string' && val.includes(String(vis.value));\n case 'greaterThan':\n return Number(val) > Number(vis.value);\n case 'lessThan':\n return Number(val) < Number(vis.value);\n case 'isNotEmpty':\n return val !== null && val !== undefined && val !== '';\n case 'isEmpty':\n return val === null || val === undefined || val === '';\n default:\n return true;\n }\n }\n\n onSubmit(): void {\n const f = this.form();\n if (f.invalid) {\n f.markAllAsTouched();\n return;\n }\n\n const parameters = this.formBuilder.extractValues(f);\n this.executeRequested.emit({\n definition: this.definition(),\n parameters,\n });\n }\n\n handleAction(action: ComponentActionDefinition): void {\n if (action.type === 'execute-report') {\n this.onSubmit();\n } else if (action.type === 'reset') {\n this.form().reset();\n }\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n inject,\n input,\n signal,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReportDefinition } from '../../core/models/report-definition.model';\nimport { ReportPersistenceAdapter } from '../../data-access/contracts/report-persistence.contract';\nimport { ReportDataSourceAdapter } from '../../data-access/contracts/data-source.contract';\nimport { ReportSessionContextService } from '../../core/services/report-session-context.service';\nimport { DynamicRendererComponent } from './dynamic-renderer.component';\nimport { RptIconComponent } from '../../primitives/components/icon/rpt-icon.component';\n\n@Component({\n selector: 'rpt-report-runtime, rpt-runtime',\n standalone: true,\n imports: [CommonModule, DynamicRendererComponent, RptIconComponent],\n\n template: `\n <div class=\"rpt-runtime-container\">\n @if (isLoading()) {\n <div class=\"rpt-state-card rpt-loading-state\">\n <div class=\"rpt-spinner\" aria-hidden=\"true\"></div>\n <p class=\"rpt-state-text\">{{ loadingMessage() }}</p>\n </div>\n } @else if (errorMessage()) {\n <div class=\"rpt-state-card rpt-error-state\">\n <div class=\"rpt-error-icon\"><rpt-icon name=\"alert-triangle\" [size]=\"32\" color=\"#ef4444\" /></div>\n <p class=\"rpt-error-title\">Unable to run report</p>\n <p class=\"rpt-state-text\">{{ errorMessage() }}</p>\n <button type=\"button\" class=\"rpt-retry-btn\" (click)=\"retry()\">Retry</button>\n </div>\n } @else if (currentDefinition()) {\n <rpt-dynamic-renderer\n [definition]=\"currentDefinition()!\"\n [resultData]=\"resultData()\"\n (executeRequested)=\"onExecuteReport($event)\"\n />\n } @else {\n <div class=\"rpt-state-card rpt-empty-state\">\n <p class=\"rpt-state-text\">No report definition available.</p>\n </div>\n }\n </div>\n `,\n styles: [`\n :host {\n display: block;\n width: 100%;\n font-family: var(--rpt-font-family, inherit);\n }\n .rpt-runtime-container {\n width: 100%;\n box-sizing: border-box;\n }\n .rpt-state-card {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 48px 24px;\n text-align: center;\n background: var(--rpt-color-bg, #ffffff);\n border: 1px solid var(--rpt-color-border, #cbd5e1);\n border-radius: var(--rpt-border-radius-lg, 8px);\n margin: 24px 0;\n }\n .rpt-state-text {\n color: var(--rpt-color-text-muted, #64748b);\n font-size: var(--rpt-font-size-base, 0.875rem);\n margin: 8px 0 0 0;\n }\n .rpt-error-title {\n font-weight: 600;\n color: var(--rpt-color-danger, #ef4444);\n margin: 8px 0 0 0;\n font-size: var(--rpt-font-size-base, 0.875rem);\n }\n .rpt-spinner {\n width: 36px;\n height: 36px;\n border: 3px solid var(--rpt-color-border, #cbd5e1);\n border-top-color: var(--rpt-color-primary, #2563eb);\n border-radius: 50%;\n animation: rpt-spin 800ms linear infinite;\n }\n @keyframes rpt-spin {\n to { transform: rotate(360deg); }\n }\n .rpt-retry-btn {\n margin-top: 16px;\n padding: 6px 16px;\n font-size: var(--rpt-font-size-sm, 0.75rem);\n background-color: var(--rpt-color-primary, #2563eb);\n color: var(--rpt-color-text-inverse, #ffffff);\n border: none;\n border-radius: var(--rpt-border-radius, 6px);\n cursor: pointer;\n }\n `],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ReportRuntimeComponent {\n private readonly persistenceAdapter = inject(ReportPersistenceAdapter, { optional: true });\n private readonly dataSourceAdapter = inject(ReportDataSourceAdapter, { optional: true });\n private readonly sessionService = inject(ReportSessionContextService, { optional: true });\n\n /** Report ID to load via persistence adapter */\n readonly reportId = input<string>();\n\n /** Directly passed report definition (skips persistence adapter) */\n readonly definition = input<ReportDefinition | null>(null, { alias: 'report' });\n\n\n readonly internalDefinition = signal<ReportDefinition | null>(null);\n readonly resultData = signal<unknown[] | null>(null);\n readonly isLoading = signal<boolean>(false);\n readonly loadingMessage = signal<string>('Loading report...');\n readonly errorMessage = signal<string | null>(null);\n\n readonly currentDefinition = computed<ReportDefinition | null>(() => {\n return this.definition() ?? this.internalDefinition();\n });\n\n constructor() {\n effect(\n () => {\n const id = this.reportId();\n if (id && !this.definition()) {\n this.loadReport(id);\n }\n },\n { allowSignalWrites: true }\n );\n }\n\n\n loadReport(id: string): void {\n if (!this.persistenceAdapter) {\n this.errorMessage.set(\n `Report persistence adapter not provided to load report \"${id}\".`\n );\n return;\n }\n\n this.isLoading.set(true);\n this.loadingMessage.set('Loading report definition...');\n this.errorMessage.set(null);\n\n this.persistenceAdapter.load(id).subscribe({\n next: (def) => {\n this.internalDefinition.set(def);\n this.isLoading.set(false);\n },\n error: (err) => {\n this.errorMessage.set(\n err?.message ?? `Failed to load report definition with ID: ${id}`\n );\n this.isLoading.set(false);\n },\n });\n }\n\n onExecuteReport(event: {\n definition: ReportDefinition;\n parameters: Record<string, unknown>;\n }): void {\n const grid = event.definition.grid;\n if (!grid) {\n return;\n }\n\n const ds = event.definition.dataSources.find(\n (d) => d.id === grid.dataSourceId\n );\n\n if (!ds) {\n this.errorMessage.set(\n `Data source \"${grid.dataSourceId}\" referenced by grid not found in report definition.`\n );\n return;\n }\n\n if (!this.dataSourceAdapter) {\n this.errorMessage.set(\n 'No ReportDataSourceAdapter provided to execute the data source.'\n );\n return;\n }\n\n this.isLoading.set(true);\n this.loadingMessage.set('Executing report query...');\n this.errorMessage.set(null);\n\n const session = this.sessionService?.getCurrentSessionContext() ?? {};\n const executionParams = { ...session, ...event.parameters };\n\n this.dataSourceAdapter.execute(ds, executionParams).subscribe({\n next: (data) => {\n this.resultData.set(data);\n this.isLoading.set(false);\n },\n error: (err) => {\n this.errorMessage.set(\n err?.message ?? 'An error occurred while executing report data source.'\n );\n this.isLoading.set(false);\n },\n });\n }\n\n retry(): void {\n const id = this.reportId();\n if (id) {\n this.loadReport(id);\n }\n }\n}\n","import { computed, inject, Injectable, signal } from '@angular/core';\nimport { ReportDefinition } from '../../../core/models/report-definition.model';\nimport { ReportComponentDefinition } from '../../../core/models/report-component.model';\nimport { ComponentLayoutDefinition } from '../../../core/models/report-layout.model';\nimport { ReportGridDefinition } from '../../../core/models/report-grid.model';\nimport { ComponentRegistry } from '../../../core/registry/component-registry';\nimport { generateId } from '../../../core/utilities/id-generator';\n\nexport type DesignerViewMode = 'design' | 'preview' | 'json';\nexport type DesignerActiveTab = 'properties' | 'report' | 'grid';\n\nconst MAX_HISTORY = 30;\n\n/**\n * DesignerStateService coordinates state for the visual report designer.\n *\n * Scoped at the Designer component level (not root) to ensure multiple designer\n * instances or navigation flows remain strictly isolated.\n */\n@Injectable()\nexport class DesignerStateService {\n private readonly registry = inject(ComponentRegistry);\n\n /** Current active report definition */\n readonly definition = signal<ReportDefinition>({\n id: generateId('rpt'),\n name: 'Untitled Report',\n schemaVersion: 1,\n version: 1,\n layout: { columns: 12, gap: 16, padding: 24, direction: 'ltr' },\n components: [],\n parameters: [],\n dataSources: [],\n });\n\n /** Selected component ID in canvas */\n readonly selectedComponentId = signal<string | null>(null);\n\n /** Active property editor tab */\n readonly activeTab = signal<DesignerActiveTab>('properties');\n\n /** Current view mode (design, preview, or raw json) */\n readonly viewMode = signal<DesignerViewMode>('design');\n\n /** Dirty flag indicating unsaved changes */\n readonly isDirty = signal<boolean>(false);\n\n // History stack for Undo / Redo\n private readonly history = signal<ReportDefinition[]>([]);\n private readonly historyIndex = signal<number>(-1);\n\n readonly canUndo = computed(() => this.historyIndex() > 0);\n readonly canRedo = computed(() => this.historyIndex() >= 0 && this.historyIndex() < this.history().length - 1);\n\n /** Currently selected component instance, or null if none */\n readonly selectedComponent = computed<ReportComponentDefinition | null>(() => {\n const id = this.selectedComponentId();\n if (!id) return null;\n return this.definition().components.find((c) => c.id === id) ?? null;\n });\n\n /**\n * Initializes or reloads a report definition into the designer.\n */\n loadDefinition(def: ReportDefinition): void {\n const cloned = JSON.parse(JSON.stringify(def)) as ReportDefinition;\n this.definition.set(cloned);\n this.selectedComponentId.set(null);\n this.isDirty.set(false);\n this.history.set([JSON.parse(JSON.stringify(cloned))]);\n this.historyIndex.set(0);\n }\n\n /**\n * Selects a component for property editing.\n */\n selectComponent(id: string | null): void {\n this.selectedComponentId.set(id);\n if (id) {\n this.activeTab.set('properties');\n }\n }\n\n /**\n * Sets the active view mode (design, live preview, json schema).\n */\n setViewMode(mode: DesignerViewMode): void {\n this.viewMode.set(mode);\n }\n\n /**\n * Sets the active editor tab.\n */\n setActiveTab(tab: DesignerActiveTab): void {\n this.activeTab.set(tab);\n }\n\n /**\n * Adds a new component of the specified type onto the canvas.\n */\n addComponent(type: string, targetIndex?: number): ReportComponentDefinition {\n const meta = this.registry.resolve(type);\n const defaultConfig = meta?.createDefaultConfig() ?? {\n id: generateId(type),\n type,\n label: meta?.displayName ?? type,\n key: `${type}_${Math.random().toString(36).substring(2, 6)}`,\n };\n\n const newComponent: ReportComponentDefinition = {\n id: generateId(type),\n type,\n label: defaultConfig.label ?? meta?.displayName ?? type,\n key: defaultConfig.key ?? `${type}_${Math.random().toString(36).substring(2, 6)}`,\n order: 0,\n layout: {\n columnSpan: defaultConfig.layout?.columnSpan ?? (type === 'button' ? 2 : 4),\n ...defaultConfig.layout,\n },\n properties: { ...(defaultConfig.properties ?? {}) },\n validation: defaultConfig.validation ? { ...defaultConfig.validation } : undefined,\n dataSource: defaultConfig.dataSource ? { ...defaultConfig.dataSource } : undefined,\n enabled: defaultConfig.enabled ?? true,\n };\n\n const currentComponents = [...this.definition().components].sort(\n (a, b) => (a.order ?? 0) - (b.order ?? 0)\n );\n if (targetIndex !== undefined && targetIndex >= 0 && targetIndex <= currentComponents.length) {\n currentComponents.splice(targetIndex, 0, newComponent);\n } else {\n currentComponents.push(newComponent);\n }\n\n // Recalculate order indices\n currentComponents.forEach((c, idx) => (c.order = idx + 1));\n\n this.mutateDefinition((def) => ({\n ...def,\n components: currentComponents,\n }));\n\n this.selectComponent(newComponent.id);\n return newComponent;\n }\n\n /**\n * Removes a component by its ID.\n */\n removeComponent(id: string): void {\n const currentComponents = this.definition().components.filter((c) => c.id !== id);\n currentComponents.forEach((c, idx) => (c.order = idx + 1));\n\n if (this.selectedComponentId() === id) {\n this.selectedComponentId.set(null);\n }\n\n this.mutateDefinition((def) => ({\n ...def,\n components: currentComponents,\n }));\n }\n\n /**\n * Duplicates an existing component.\n */\n duplicateComponent(id: string): ReportComponentDefinition | null {\n const existing = this.definition().components.find((c) => c.id === id);\n if (!existing) return null;\n\n const duplicated: ReportComponentDefinition = {\n ...JSON.parse(JSON.stringify(existing)),\n id: generateId(existing.type),\n key: existing.key ? `${existing.key}_copy` : undefined,\n label: existing.label ? `${existing.label} (Copy)` : undefined,\n };\n\n const currentComponents = [...this.definition().components].sort(\n (a, b) => (a.order ?? 0) - (b.order ?? 0)\n );\n const index = currentComponents.findIndex((c) => c.id === id);\n currentComponents.splice(index + 1, 0, duplicated);\n currentComponents.forEach((c, idx) => (c.order = idx + 1));\n\n this.mutateDefinition((def) => ({\n ...def,\n components: currentComponents,\n }));\n\n this.selectComponent(duplicated.id);\n return duplicated;\n }\n\n /**\n * Moves a component from previous index to current index (e.g. from CDK drag drop).\n */\n moveComponent(previousIndex: number, currentIndex: number): void {\n if (previousIndex === currentIndex) return;\n\n const currentComponents = [...this.definition().components].sort(\n (a, b) => (a.order ?? 0) - (b.order ?? 0)\n );\n if (previousIndex < 0 || previousIndex >= currentComponents.length) return;\n const targetIdx = Math.max(0, Math.min(currentIndex, currentComponents.length - 1));\n\n const [moved] = currentComponents.splice(previousIndex, 1);\n currentComponents.splice(targetIdx, 0, moved);\n currentComponents.forEach((c, idx) => (c.order = idx + 1));\n\n this.mutateDefinition((def) => ({\n ...def,\n components: currentComponents,\n }));\n }\n\n /**\n * Updates partial properties of a component.\n */\n updateComponent(id: string, updates: Partial<ReportComponentDefinition>): void {\n const currentComponents = this.definition().components.map((c) => {\n if (c.id === id) {\n return { ...c, ...updates };\n }\n return c;\n });\n\n this.mutateDefinition((def) => ({\n ...def,\n components: currentComponents,\n }));\n }\n\n /**\n * Updates a single component property value within `properties`.\n */\n updateComponentProperty(id: string, propKey: string, value: unknown): void {\n const currentComponents = this.definition().components.map((c) => {\n if (c.id === id) {\n return {\n ...c,\n properties: {\n ...(c.properties ?? {}),\n [propKey]: value,\n },\n };\n }\n return c;\n });\n\n this.mutateDefinition((def) => ({\n ...def,\n components: currentComponents,\n }));\n }\n\n /**\n * Updates layout properties for a component (e.g. columnSpan).\n */\n updateComponentLayout(id: string, layout: Partial<ComponentLayoutDefinition>): void {\n const currentComponents = this.definition().components.map((c) => {\n if (c.id === id) {\n const nextLayout = {\n ...(c.layout ?? {}),\n ...layout,\n };\n for (const key of Object.keys(layout) as (keyof ComponentLayoutDefinition)[]) {\n if (layout[key] === undefined) {\n delete nextLayout[key];\n }\n }\n return {\n ...c,\n layout: nextLayout,\n };\n }\n return c;\n });\n\n this.mutateDefinition((def) => ({\n ...def,\n components: currentComponents,\n }));\n }\n\n /**\n * Updates report-level settings (name, description, layout).\n */\n updateReportSettings(settings: Partial<ReportDefinition>): void {\n this.mutateDefinition((def) => ({\n ...def,\n ...settings,\n }));\n }\n\n /**\n * Updates grid definition settings.\n */\n updateGridSettings(grid: ReportGridDefinition | undefined): void {\n this.mutateDefinition((def) => ({\n ...def,\n grid,\n }));\n }\n\n /**\n * Reverts to the previous state in history.\n */\n undo(): void {\n if (!this.canUndo()) return;\n const newIndex = this.historyIndex() - 1;\n this.historyIndex.set(newIndex);\n const restored = JSON.parse(JSON.stringify(this.history()[newIndex])) as ReportDefinition;\n this.definition.set(restored);\n this.isDirty.set(true);\n }\n\n /**\n * Advances to the next state in history.\n */\n redo(): void {\n if (!this.canRedo()) return;\n const newIndex = this.historyIndex() + 1;\n this.historyIndex.set(newIndex);\n const restored = JSON.parse(JSON.stringify(this.history()[newIndex])) as ReportDefinition;\n this.definition.set(restored);\n this.isDirty.set(true);\n }\n\n /**\n * Marks the current definition state as saved.\n */\n markSaved(): void {\n this.isDirty.set(false);\n }\n\n /**\n * Applies an immutable state change and pushes to history.\n */\n private mutateDefinition(updater: (current: ReportDefinition) => ReportDefinition): void {\n const next = updater(this.definition());\n this.definition.set(next);\n this.isDirty.set(true);\n this.pushHistory(next);\n }\n\n private pushHistory(def: ReportDefinition): void {\n const currentHist = this.history().slice(0, this.historyIndex() + 1);\n currentHist.push(JSON.parse(JSON.stringify(def)));\n if (currentHist.length > MAX_HISTORY) {\n currentHist.shift();\n }\n this.history.set(currentHist);\n this.historyIndex.set(currentHist.length - 1);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n inject,\n output,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { DesignerStateService, DesignerViewMode } from '../../services/designer-state.service';\nimport { RptIconComponent } from '../../../../primitives/components/icon/rpt-icon.component';\n\n@Component({\n selector: 'rpt-designer-toolbar',\n standalone: true,\n imports: [CommonModule, RptIconComponent],\n template: `\n <div class=\"toolbar-root\">\n <!-- Left: Title & Dirty indicator -->\n <div class=\"toolbar-left\">\n <div class=\"report-identity\">\n <span class=\"report-name\">{{ definition().name || 'Untitled Report' }}</span>\n @if (isDirty()) {\n <span class=\"dirty-badge\" title=\"Unsaved changes\">● Unsaved</span>\n }\n </div>\n </div>\n\n <!-- Center: Mode Switcher -->\n <div class=\"toolbar-center\">\n <div class=\"mode-pill-group\">\n <button\n type=\"button\"\n class=\"mode-btn\"\n [class.active]=\"viewMode() === 'design'\"\n (click)=\"setMode('design')\"\n >\n <rpt-icon name=\"edit\" [size]=\"14\" />\n <span>Design</span>\n </button>\n <button\n type=\"button\"\n class=\"mode-btn\"\n [class.active]=\"viewMode() === 'preview'\"\n (click)=\"setMode('preview')\"\n >\n <rpt-icon name=\"eye\" [size]=\"14\" />\n <span>Live Preview</span>\n </button>\n <button\n type=\"button\"\n class=\"mode-btn\"\n [class.active]=\"viewMode() === 'json'\"\n (click)=\"setMode('json')\"\n >\n <rpt-icon name=\"code\" [size]=\"14\" />\n <span>JSON Schema</span>\n </button>\n </div>\n </div>\n\n <!-- Right: Undo, Redo, Save, Export -->\n <div class=\"toolbar-right\">\n <div class=\"history-group\">\n <button\n type=\"button\"\n class=\"tool-btn\"\n [disabled]=\"!canUndo()\"\n (click)=\"undo()\"\n title=\"Undo (Ctrl+Z)\"\n >\n <rpt-icon name=\"undo\" [size]=\"14\" />\n </button>\n <button\n type=\"button\"\n class=\"tool-btn\"\n [disabled]=\"!canRedo()\"\n (click)=\"redo()\"\n title=\"Redo (Ctrl+Y)\"\n >\n <rpt-icon name=\"redo\" [size]=\"14\" />\n </button>\n </div>\n\n <div class=\"actions-divider\"></div>\n\n <button\n type=\"button\"\n class=\"tool-btn btn-export\"\n (click)=\"exportJson()\"\n title=\"Download JSON Definition\"\n >\n <rpt-icon name=\"download\" [size]=\"14\" />\n <span>Export</span>\n </button>\n\n <button\n type=\"button\"\n class=\"tool-btn btn-save\"\n (click)=\"saveReport()\"\n title=\"Save Report Definition\"\n >\n <rpt-icon name=\"save\" [size]=\"14\" />\n <span>Save Changes</span>\n </button>\n </div>\n </div>\n `,\n\n styles: [`\n :host {\n display: block;\n background: #0f172a;\n color: #ffffff;\n height: 56px;\n font-family: var(--rpt-font-family, inherit);\n border-bottom: 1px solid #1e293b;\n box-sizing: border-box;\n }\n .toolbar-root {\n display: flex;\n align-items: center;\n justify-content: space-between;\n height: 100%;\n padding: 0 20px;\n }\n .toolbar-left, .toolbar-right {\n display: flex;\n align-items: center;\n gap: 12px;\n min-width: 240px;\n }\n .toolbar-right {\n justify-content: flex-end;\n }\n .toolbar-center {\n display: flex;\n justify-content: center;\n flex: 1;\n }\n .report-identity {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n .report-name {\n font-size: 0.95rem;\n font-weight: 700;\n color: #ffffff;\n letter-spacing: -0.01em;\n }\n .dirty-badge {\n font-size: 0.65rem;\n font-weight: 600;\n color: #f59e0b;\n background: rgba(245, 158, 11, 0.15);\n padding: 2px 6px;\n border-radius: 4px;\n }\n .mode-pill-group {\n display: flex;\n background: #1e293b;\n padding: 3px;\n border-radius: 8px;\n gap: 2px;\n }\n .mode-btn {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 14px;\n border: none;\n background: transparent;\n color: #94a3b8;\n font-size: 0.75rem;\n font-weight: 600;\n border-radius: 6px;\n cursor: pointer;\n transition: all 150ms ease;\n }\n .mode-btn:hover {\n color: #ffffff;\n }\n .mode-btn.active {\n background: #2563eb;\n color: #ffffff;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);\n }\n .history-group {\n display: flex;\n gap: 4px;\n }\n .tool-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n height: 32px;\n padding: 0 12px;\n font-size: 0.75rem;\n font-weight: 600;\n border-radius: 6px;\n cursor: pointer;\n border: 1px solid rgba(255, 255, 255, 0.15);\n background: rgba(255, 255, 255, 0.05);\n color: #e2e8f0;\n transition: all 150ms ease;\n }\n .tool-btn:hover:not(:disabled) {\n background: rgba(255, 255, 255, 0.15);\n color: #ffffff;\n }\n .tool-btn:disabled {\n opacity: 0.3;\n cursor: not-allowed;\n }\n .actions-divider {\n width: 1px;\n height: 20px;\n background: rgba(255, 255, 255, 0.15);\n }\n .btn-save {\n background: #2563eb;\n border-color: #2563eb;\n color: #ffffff;\n }\n .btn-save:hover:not(:disabled) {\n background: #1d4ed8;\n border-color: #1d4ed8;\n }\n .btn-export {\n background: transparent;\n }\n `],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class DesignerToolbarComponent {\n private readonly designerState = inject(DesignerStateService);\n\n readonly definition = this.designerState.definition;\n readonly viewMode = this.designerState.viewMode;\n readonly isDirty = this.designerState.isDirty;\n readonly canUndo = this.designerState.canUndo;\n readonly canRedo = this.designerState.canRedo;\n\n readonly saveRequested = output<void>();\n\n setMode(mode: DesignerViewMode): void {\n this.designerState.setViewMode(mode);\n }\n\n undo(): void {\n this.designerState.undo();\n }\n\n redo(): void {\n this.designerState.redo();\n }\n\n saveReport(): void {\n this.saveRequested.emit();\n }\n\n exportJson(): void {\n const dataStr =\n 'data:text/json;charset=utf-8,' +\n encodeURIComponent(JSON.stringify(this.definition(), null, 2));\n const downloadAnchor = document.createElement('a');\n downloadAnchor.setAttribute('href', dataStr);\n downloadAnchor.setAttribute(\n 'download',\n `${this.definition().id || 'report-definition'}.json`\n );\n document.body.appendChild(downloadAnchor);\n downloadAnchor.click();\n downloadAnchor.remove();\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n signal,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { CdkDrag, CdkDragDrop, DragDropModule } from '@angular/cdk/drag-drop';\nimport { ComponentRegistry, ReportingComponentMeta } from '../../../../core/registry/component-registry';\nimport { DesignerStateService } from '../../services/designer-state.service';\nimport { RptIconComponent } from '../../../../primitives/components/icon/rpt-icon.component';\n\n@Component({\n selector: 'rpt-component-palette',\n standalone: true,\n imports: [CommonModule, FormsModule, DragDropModule, RptIconComponent],\n template: `\n <div class=\"palette-container\">\n <div class=\"palette-header\">\n <div class=\"palette-title-area\">\n <h3 class=\"palette-title\">Components</h3>\n <span class=\"palette-count\" [title]=\"totalComponentCount() + ' components available'\">\n {{ totalComponentCount() }}\n </span>\n </div>\n\n <div class=\"palette-actions\">\n <!-- View Mode Toggle: 2-Column Grid vs 1-Column List -->\n <div class=\"view-mode-toggle\" role=\"group\" aria-label=\"Palette layout view\">\n <button\n type=\"button\"\n class=\"toggle-btn\"\n [class.active]=\"layoutMode() === 'grid'\"\n [attr.aria-pressed]=\"layoutMode() === 'grid'\"\n (click)=\"layoutMode.set('grid')\"\n title=\"2-Column Grid View\"\n aria-label=\"2-Column Grid View\"\n >\n <rpt-icon name=\"grid\" [size]=\"12\" />\n </button>\n <button\n type=\"button\"\n class=\"toggle-btn\"\n [class.active]=\"layoutMode() === 'list'\"\n [attr.aria-pressed]=\"layoutMode() === 'list'\"\n (click)=\"layoutMode.set('list')\"\n title=\"Compact List View\"\n aria-label=\"Compact List View\"\n >\n <rpt-icon name=\"list\" [size]=\"12\" />\n </button>\n </div>\n\n <button\n type=\"button\"\n class=\"palette-action-btn icon-only\"\n (click)=\"toggleAllCategories()\"\n [title]=\"allExpanded() ? 'Collapse All Sections' : 'Expand All Sections'\"\n [attr.aria-label]=\"allExpanded() ? 'Collapse All Sections' : 'Expand All Sections'\"\n >\n <rpt-icon [name]=\"allExpanded() ? 'chevron-up' : 'chevron-down'\" [size]=\"13\" />\n </button>\n </div>\n </div>\n\n <!-- Search Filter -->\n <div class=\"palette-search-wrapper\">\n <div class=\"search-input-box\">\n <rpt-icon name=\"search\" [size]=\"13\" class=\"search-prefix-icon\" />\n <input\n type=\"text\"\n class=\"palette-search-input\"\n placeholder=\"Search controls...\"\n [ngModel]=\"searchQuery()\"\n (ngModelChange)=\"searchQuery.set($event)\"\n aria-label=\"Search components\"\n />\n @if (searchQuery()) {\n <button\n type=\"button\"\n class=\"clear-search-btn\"\n (click)=\"searchQuery.set('')\"\n title=\"Clear search\"\n aria-label=\"Clear search\"\n >\n <rpt-icon name=\"close\" [size]=\"12\" />\n </button>\n }\n </div>\n </div>\n\n <!-- Palette Categories Drop List with Accordion -->\n <div\n class=\"palette-scroll-area\"\n cdkDropList\n id=\"designer-palette-drop-list\"\n [cdkDropListSortingDisabled]=\"true\"\n >\n @for (category of filteredCategories(); track category.name) {\n <div class=\"accordion-item\" [class.is-expanded]=\"isCategoryExpanded(category.name)\">\n <button\n type=\"button\"\n class=\"accordion-header\"\n (click)=\"toggleCategory(category.name)\"\n [attr.aria-expanded]=\"isCategoryExpanded(category.name)\"\n [attr.aria-controls]=\"'palette-section-' + category.name\"\n [id]=\"'palette-header-' + category.name\"\n >\n <div class=\"accordion-header-left\">\n <span class=\"accordion-chevron\" [class.rotated]=\"!isCategoryExpanded(category.name)\">\n <rpt-icon name=\"chevron-down\" [size]=\"12\" />\n </span>\n <div class=\"category-icon-indicator\">\n <rpt-icon [name]=\"category.icon\" [size]=\"13\" />\n </div>\n <span class=\"category-name\">{{ category.label }}</span>\n </div>\n <span class=\"category-badge\">{{ category.items.length }}</span>\n </button>\n\n <div\n class=\"accordion-collapse-wrapper\"\n [class.expanded]=\"isCategoryExpanded(category.name)\"\n [attr.aria-hidden]=\"!isCategoryExpanded(category.name)\"\n [id]=\"'palette-section-' + category.name\"\n role=\"region\"\n [attr.aria-labelledby]=\"'palette-header-' + category.name\"\n >\n <div class=\"accordion-content\">\n <div\n class=\"category-items\"\n [class.grid-view]=\"layoutMode() === 'grid'\"\n [class.list-view]=\"layoutMode() === 'list'\"\n >\n @for (item of category.items; track item.type) {\n <div\n class=\"palette-item\"\n tabindex=\"0\"\n role=\"button\"\n [attr.aria-label]=\"'Add ' + item.displayName + ' to canvas'\"\n cdkDrag\n [cdkDragData]=\"item.type\"\n (dblclick)=\"onItemDoubleClick(item.type)\"\n (keydown.enter)=\"onItemDoubleClick(item.type)\"\n (keydown.space)=\"onItemDoubleClick(item.type)\"\n [title]=\"'Drag onto canvas or double-click to add ' + item.displayName\"\n >\n <div class=\"item-icon-box\">\n <rpt-icon [name]=\"getIconName(item)\" [size]=\"layoutMode() === 'grid' ? 16 : 15\" />\n </div>\n <div class=\"item-info\">\n <span class=\"item-title\" [title]=\"item.displayName\">{{ item.displayName }}</span>\n <span class=\"item-type-code\">{{ item.type }}</span>\n </div>\n <button\n type=\"button\"\n class=\"item-add-btn\"\n (click)=\"onAddClick($event, item.type)\"\n tabindex=\"0\"\n title=\"Add to canvas\"\n aria-label=\"Add to canvas\"\n >\n <rpt-icon name=\"plus\" [size]=\"layoutMode() === 'grid' ? 12 : 13\" />\n </button>\n\n <!-- CDK Drag Placeholder / Preview -->\n <div *cdkDragPlaceholder class=\"drag-placeholder\"></div>\n <div *cdkDragPreview class=\"drag-preview\">\n <rpt-icon [name]=\"getIconName(item)\" [size]=\"16\" />\n <span>{{ item.displayName }}</span>\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n }\n\n @if (filteredCategories().length === 0) {\n <div class=\"no-results\">\n <rpt-icon name=\"search\" [size]=\"20\" class=\"no-results-icon\" />\n <span class=\"no-results-text\">No components matching \"{{ searchQuery() }}\"</span>\n <button type=\"button\" class=\"no-results-clear-btn\" (click)=\"searchQuery.set('')\">\n Clear Search\n </button>\n </div>\n }\n </div>\n </div>\n `,\n styles: [`\n :host {\n display: block;\n height: 100%;\n background: var(--rpt-color-bg, #ffffff);\n border-right: 1px solid var(--rpt-color-border, #cbd5e1);\n box-sizing: border-box;\n font-family: var(--rpt-font-family, inherit);\n }\n .palette-container {\n display: flex;\n flex-direction: column;\n height: 100%;\n }\n .palette-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 14px 10px 14px;\n border-bottom: 1px solid var(--rpt-color-border, #cbd5e1);\n gap: 6px;\n }\n .palette-title-area {\n display: flex;\n align-items: center;\n gap: 6px;\n }\n .palette-title {\n font-size: var(--rpt-font-size-base, 0.8125rem);\n font-weight: 700;\n color: var(--rpt-color-text, #0f172a);\n margin: 0;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n }\n .palette-count {\n font-size: var(--rpt-font-size-sm, 0.6875rem);\n background: var(--rpt-color-surface, #f1f5f9);\n color: var(--rpt-color-text-muted, #475569);\n padding: 1px 6px;\n border-radius: 10px;\n font-weight: 600;\n }\n .palette-actions {\n display: flex;\n align-items: center;\n gap: 5px;\n }\n .view-mode-toggle {\n display: inline-flex;\n align-items: center;\n background: var(--rpt-color-surface, #f1f5f9);\n border: 1px solid var(--rpt-color-border, #cbd5e1);\n border-radius: 4px;\n padding: 1px;\n }\n .toggle-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 22px;\n height: 20px;\n border: none;\n background: transparent;\n color: var(--rpt-color-text-muted, #64748b);\n border-radius: 3px;\n cursor: pointer;\n transition: all 120ms ease;\n padding: 0;\n }\n .toggle-btn:focus-visible {\n outline: 2px solid var(--rpt-color-primary, #2563eb);\n outline-offset: 1px;\n }\n .toggle-btn.active {\n background: #ffffff;\n color: var(--rpt-color-primary, #2563eb);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.08);\n }\n .toggle-btn:hover:not(.active) {\n color: var(--rpt-color-text, #0f172a);\n }\n .palette-action-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 22px;\n padding: 0;\n color: var(--rpt-color-primary, #2563eb);\n background: rgba(37, 99, 235, 0.06);\n border: 1px solid rgba(37, 99, 235, 0.18);\n border-radius: 4px;\n cursor: pointer;\n transition: all 150ms ease;\n font-family: inherit;\n flex-shrink: 0;\n }\n .palette-action-btn:hover {\n background: var(--rpt-color-primary, #2563eb);\n color: #ffffff;\n border-color: var(--rpt-color-primary, #2563eb);\n }\n .palette-action-btn:focus-visible {\n outline: 2px solid var(--rpt-color-primary, #2563eb);\n outline-offset: 1px;\n }\n\n /* Search Bar */\n .palette-search-wrapper {\n padding: 10px 14px;\n border-bottom: 1px solid var(--rpt-color-border, #e2e8f0);\n }\n .search-input-box {\n position: relative;\n display: flex;\n align-items: center;\n width: 100%;\n }\n .search-prefix-icon {\n position: absolute;\n left: 9px;\n color: var(--rpt-color-text-muted, #64748b);\n pointer-events: none;\n }\n .palette-search-input {\n width: 100%;\n box-sizing: border-box;\n height: 32px;\n padding: 4px 28px 4px 28px;\n font-size: var(--rpt-font-size-sm, 0.75rem);\n border: 1px solid var(--rpt-color-border, #cbd5e1);\n border-radius: var(--rpt-border-radius, 6px);\n background: var(--rpt-color-surface, #f8fafc);\n color: var(--rpt-color-text, #0f172a);\n outline: none;\n transition: all var(--rpt-transition-speed, 150ms) ease;\n }\n .palette-search-input:focus {\n background: #ffffff;\n border-color: var(--rpt-color-primary, #2563eb);\n box-shadow: var(--rpt-box-shadow-focus, 0 0 0 3px rgba(37, 99, 235, 0.22));\n }\n .clear-search-btn {\n position: absolute;\n right: 8px;\n background: none;\n border: none;\n color: var(--rpt-color-text-muted, #64748b);\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 2px;\n border-radius: 3px;\n transition: all 150ms ease;\n }\n .clear-search-btn:hover {\n color: var(--rpt-color-text, #0f172a);\n }\n .clear-search-btn:focus-visible {\n outline: 2px solid var(--rpt-color-primary, #2563eb);\n outline-offset: 1px;\n }\n\n /* Scroll Area */\n .palette-scroll-area {\n flex: 1;\n overflow-y: auto;\n padding: 8px 10px 16px 10px;\n }\n\n /* Accordion Item */\n .accordion-item {\n border-bottom: 1px solid var(--rpt-color-border, #f1f5f9);\n margin-bottom: 4px;\n }\n .accordion-item:last-child {\n border-bottom: none;\n }\n\n /* Accordion Header */\n .accordion-header {\n width: 100%;\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 7px 8px;\n background: transparent;\n border: none;\n border-radius: var(--rpt-border-radius, 5px);\n cursor: pointer;\n text-align: left;\n user-select: none;\n transition: background-color var(--rpt-transition-speed, 150ms) ease;\n font-family: inherit;\n }\n .accordion-header:hover {\n background: var(--rpt-color-surface, #f1f5f9);\n }\n .accordion-header:focus-visible {\n outline: 2px solid var(--rpt-color-primary, #2563eb);\n outline-offset: 1px;\n }\n .accordion-header-left {\n display: flex;\n align-items: center;\n gap: 7px;\n min-width: 0;\n }\n .accordion-chevron {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n transition: transform 200ms cubic-bezier(0.4, 0, 0.2, 1);\n color: var(--rpt-color-text-muted, #64748b);\n }\n .accordion-chevron.rotated {\n transform: rotate(-90deg);\n }\n .category-icon-indicator {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n border-radius: 4px;\n background: rgba(37, 99, 235, 0.08);\n color: var(--rpt-color-primary, #2563eb);\n flex-shrink: 0;\n }\n .category-name {\n font-size: 0.72rem;\n font-weight: 700;\n color: var(--rpt-color-text, #1e293b);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n .category-badge {\n font-size: 0.65rem;\n font-weight: 700;\n color: var(--rpt-color-text, #334155);\n background: var(--rpt-color-surface, #e2e8f0);\n padding: 1px 6px;\n border-radius: 10px;\n flex-shrink: 0;\n }\n\n /* Accordion Collapse Transition via CSS Grid */\n .accordion-collapse-wrapper {\n display: grid;\n grid-template-rows: 0fr;\n transition: grid-template-rows 200ms cubic-bezier(0.4, 0, 0.2, 1), visibility 200ms ease;\n visibility: hidden;\n }\n .accordion-collapse-wrapper.expanded {\n grid-template-rows: 1fr;\n visibility: visible;\n }\n .accordion-content {\n overflow: hidden;\n min-height: 0;\n }\n\n /* Category Items Container */\n .category-items {\n padding: 4px 2px 8px 2px;\n }\n\n /* ========================================================== */\n /* 1. 2-COLUMN GRID VIEW (Active Default for fast scanning) */\n /* ========================================================== */\n .category-items.grid-view {\n display: grid;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: 6px;\n }\n .category-items.grid-view .palette-item {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n text-align: center;\n padding: 10px 4px 8px 4px;\n gap: 5px;\n background: var(--rpt-color-surface, #f8fafc);\n border: 1px solid var(--rpt-color-border, #e2e8f0);\n border-radius: var(--rpt-border-radius, 6px);\n cursor: grab;\n user-select: none;\n position: relative;\n transition: all var(--rpt-transition-speed, 150ms) ease;\n min-width: 0;\n outline: none;\n }\n .category-items.grid-view .palette-item:hover {\n background: #ffffff;\n border-color: var(--rpt-color-primary, #2563eb);\n box-shadow: 0 4px 6px -1px rgba(37, 99, 235, 0.12), 0 2px 4px -2px rgba(37, 99, 235, 0.08);\n transform: translateY(-2px);\n }\n .category-items.grid-view .palette-item:focus-visible {\n border-color: var(--rpt-color-primary, #2563eb);\n box-shadow: 0 0 0 2px var(--rpt-color-primary, #2563eb);\n background: #ffffff;\n }\n .category-items.grid-view .palette-item:active {\n cursor: grabbing;\n }\n .category-items.grid-view .item-icon-box {\n width: 32px;\n height: 32px;\n border-radius: 6px;\n background: #ffffff;\n border: 1px solid var(--rpt-color-border, #e2e8f0);\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--rpt-color-primary, #2563eb);\n transition: transform 150ms ease, background-color 150ms ease;\n flex-shrink: 0;\n }\n .category-items.grid-view .palette-item:hover .item-icon-box,\n .category-items.grid-view .palette-item:focus-visible .item-icon-box {\n background: rgba(37, 99, 235, 0.08);\n transform: scale(1.08);\n }\n .category-items.grid-view .item-info {\n display: flex;\n flex-direction: column;\n align-items: center;\n width: 100%;\n min-width: 0;\n padding: 0 2px;\n }\n .category-items.grid-view .item-title {\n font-size: 0.6875rem;\n font-weight: 600;\n color: var(--rpt-color-text, #0f172a);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n width: 100%;\n text-align: center;\n }\n .category-items.grid-view .item-type-code {\n font-size: 0.58rem;\n color: var(--rpt-color-text-muted, #475569);\n font-family: monospace;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n width: 100%;\n text-align: center;\n }\n .category-items.grid-view .item-add-btn {\n position: absolute;\n top: 3px;\n right: 3px;\n width: 18px;\n height: 18px;\n border-radius: 3px;\n border: 1px solid var(--rpt-color-border, #cbd5e1);\n background: #ffffff;\n color: var(--rpt-color-primary, #2563eb);\n font-weight: 700;\n font-size: 0.75rem;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n opacity: 0;\n transition: all var(--rpt-transition-speed, 150ms) ease;\n }\n .category-items.grid-view .palette-item:hover .item-add-btn,\n .category-items.grid-view .palette-item:focus-visible .item-add-btn,\n .category-items.grid-view .item-add-btn:focus-visible {\n opacity: 1;\n }\n .category-items.grid-view .item-add-btn:hover,\n .category-items.grid-view .item-add-btn:focus-visible {\n background: var(--rpt-color-primary, #2563eb);\n color: #ffffff;\n border-color: var(--rpt-color-primary, #2563eb);\n outline: none;\n }\n .grid-view .drag-placeholder {\n border: 2px dashed var(--rpt-color-primary, #2563eb);\n background: rgba(37, 99, 235, 0.05);\n border-radius: var(--rpt-border-radius, 6px);\n min-height: 72px;\n box-sizing: border-box;\n opacity: 0.6;\n }\n\n /* ========================================================== */\n /* 2. COMPACT LIST VIEW (Alternative single-column layout) */\n /* ========================================================== */\n .category-items.list-view {\n display: flex;\n flex-direction: column;\n gap: 6px;\n }\n .category-items.list-view .palette-item {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 7px 9px;\n background: var(--rpt-color-surface, #f8fafc);\n border: 1px solid var(--rpt-color-border, #e2e8f0);\n border-radius: var(--rpt-border-radius, 6px);\n cursor: grab;\n user-select: none;\n transition: all var(--rpt-transition-speed, 150ms) ease;\n outline: none;\n }\n .category-items.list-view .palette-item:hover {\n background: #ffffff;\n border-color: var(--rpt-color-primary, #2563eb);\n box-shadow: 0 2px 4px rgba(37, 99, 235, 0.08);\n transform: translateY(-1px);\n }\n .category-items.list-view .palette-item:focus-visible {\n border-color: var(--rpt-color-primary, #2563eb);\n box-shadow: 0 0 0 2px var(--rpt-color-primary, #2563eb);\n background: #ffffff;\n }\n .category-items.list-view .palette-item:active {\n cursor: grabbing;\n }\n .category-items.list-view .item-icon-box {\n width: 26px;\n height: 26px;\n border-radius: 4px;\n background: #ffffff;\n border: 1px solid var(--rpt-color-border, #e2e8f0);\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--rpt-color-primary, #2563eb);\n flex-shrink: 0;\n }\n .category-items.list-view .item-info {\n flex: 1;\n display: flex;\n flex-direction: column;\n min-width: 0;\n }\n .category-items.list-view .item-title {\n font-size: var(--rpt-font-size-sm, 0.75rem);\n font-weight: 600;\n color: var(--rpt-color-text, #0f172a);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n .category-items.list-view .item-type-code {\n font-size: 0.65rem;\n color: var(--rpt-color-text-muted, #475569);\n font-family: monospace;\n }\n .category-items.list-view .item-add-btn {\n width: 24px;\n height: 24px;\n border-radius: 4px;\n border: 1px solid var(--rpt-color-border, #cbd5e1);\n background: #ffffff;\n color: var(--rpt-color-primary, #2563eb);\n font-weight: 700;\n font-size: 0.85rem;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n opacity: 0;\n transition: all var(--rpt-transition-speed, 150ms) ease;\n }\n .category-items.list-view .palette-item:hover .item-add-btn,\n .category-items.list-view .palette-item:focus-visible .item-add-btn,\n .category-items.list-view .item-add-btn:focus-visible {\n opacity: 1;\n }\n .category-items.list-view .item-add-btn:hover,\n .category-items.list-view .item-add-btn:focus-visible {\n background: var(--rpt-color-primary, #2563eb);\n color: #ffffff;\n border-color: var(--rpt-color-primary, #2563eb);\n outline: none;\n }\n .list-view .drag-placeholder {\n border: 2px dashed var(--rpt-color-primary, #2563eb);\n background: rgba(37, 99, 235, 0.05);\n border-radius: var(--rpt-border-radius, 6px);\n min-height: 40px;\n box-sizing: border-box;\n opacity: 0.6;\n }\n\n /* Drag Preview & Placeholder */\n .drag-preview,\n ::ng-deep .drag-preview {\n background: #ffffff;\n border: 2px solid var(--rpt-color-primary, #2563eb);\n border-radius: 6px;\n padding: 8px 14px;\n display: flex;\n align-items: center;\n gap: 8px;\n font-family: var(--rpt-font-family, system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif) !important;\n font-size: 0.8rem;\n font-weight: 600;\n color: var(--rpt-color-text, #0f172a);\n box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.2);\n z-index: 10000;\n }\n .drag-preview *,\n ::ng-deep .drag-preview * {\n font-family: inherit !important;\n }\n\n /* No Results View */\n .no-results {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 8px;\n padding: 32px 12px;\n text-align: center;\n }\n .no-results-icon {\n color: var(--rpt-color-text-muted, #64748b);\n opacity: 0.7;\n }\n .no-results-text {\n font-size: 0.75rem;\n color: var(--rpt-color-text-muted, #475569);\n word-break: break-word;\n }\n .no-results-clear-btn {\n margin-top: 4px;\n padding: 4px 10px;\n font-size: 0.7rem;\n font-weight: 600;\n color: var(--rpt-color-primary, #2563eb);\n background: rgba(37, 99, 235, 0.08);\n border: 1px solid rgba(37, 99, 235, 0.2);\n border-radius: 4px;\n cursor: pointer;\n transition: all 150ms ease;\n }\n .no-results-clear-btn:hover {\n background: var(--rpt-color-primary, #2563eb);\n color: #ffffff;\n }\n .no-results-clear-btn:focus-visible {\n outline: 2px solid var(--rpt-color-primary, #2563eb);\n outline-offset: 1px;\n }\n\n @media (prefers-reduced-motion: reduce) {\n .accordion-collapse-wrapper,\n .accordion-chevron,\n .palette-item,\n .item-icon-box,\n .item-add-btn,\n .toggle-btn,\n .palette-action-btn {\n transition: none !important;\n transform: none !important;\n }\n }\n `],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ComponentPaletteComponent {\n private readonly registry = inject(ComponentRegistry);\n private readonly designerState = inject(DesignerStateService);\n\n readonly searchQuery = signal<string>('');\n\n /** Layout view mode: 'grid' (2-column side-by-side grid) or 'list' (compact row list). Defaults to 'grid'. */\n readonly layoutMode = signal<'grid' | 'list'>('grid');\n\n /** Set of expanded category IDs */\n readonly expandedCategories = signal<Set<string>>(\n new Set(['input', 'action', 'display', 'data', 'layout'])\n );\n\n readonly totalComponentCount = computed(() => this.registry.getAll().length);\n\n readonly categoryMeta: Record<string, { label: string; icon: string }> = {\n input: { label: 'Form Inputs', icon: 'text-fields' },\n action: { label: 'Action Buttons', icon: 'lightning' },\n display: { label: 'Display & Labels', icon: 'chart-bar' },\n data: { label: 'Data & Lookups', icon: 'grid' },\n layout: { label: 'Layout & Containers', icon: 'layout' },\n };\n\n readonly filteredCategories = computed(() => {\n const all = this.registry.getAll();\n const query = this.searchQuery();\n\n const filtered = query\n ? all.filter((c) => matchesSearchQuery(c, query))\n : all;\n\n const groups = new Map<string, ReportingComponentMeta[]>();\n for (const item of filtered) {\n const cat = item.category || 'input';\n if (!groups.has(cat)) {\n groups.set(cat, []);\n }\n groups.get(cat)!.push(item);\n }\n\n return Array.from(groups.entries()).map(([cat, items]) => {\n const meta = this.categoryMeta[cat];\n return {\n name: cat,\n label: meta?.label ?? cat,\n icon: meta?.icon ?? 'box',\n items,\n };\n });\n });\n\n readonly allExpanded = computed(() => {\n const cats = this.filteredCategories();\n if (cats.length === 0) return false;\n const expanded = this.expandedCategories();\n return cats.every((c) => expanded.has(c.name));\n });\n\n isCategoryExpanded(categoryName: string): boolean {\n // When searching, auto-expand categories that contain matching results\n if (this.searchQuery().trim()) {\n return true;\n }\n return this.expandedCategories().has(categoryName);\n }\n\n toggleCategory(categoryName: string): void {\n const current = new Set(this.expandedCategories());\n if (current.has(categoryName)) {\n current.delete(categoryName);\n } else {\n current.add(categoryName);\n }\n this.expandedCategories.set(current);\n }\n\n toggleAllCategories(): void {\n const cats = this.filteredCategories();\n if (this.allExpanded()) {\n this.expandedCategories.set(new Set());\n } else {\n this.expandedCategories.set(new Set(cats.map((c) => c.name)));\n }\n }\n\n getIconName(item: ReportingComponentMeta): string {\n switch (item.type) {\n case 'input':\n return 'text-fields';\n case 'dropdown':\n return 'dropdown';\n case 'date':\n return 'calendar';\n case 'number':\n return 'number';\n case 'checkbox':\n return 'checkbox';\n case 'button':\n return 'button';\n case 'kpi-card':\n return 'kpi';\n case 'chart':\n return 'chart-bar';\n default:\n return 'box';\n }\n }\n\n\n onItemDoubleClick(type: string): void {\n this.designerState.addComponent(type);\n }\n\n onAddClick(event: MouseEvent, type: string): void {\n event.stopPropagation();\n this.designerState.addComponent(type);\n }\n}\n\n/** Dictionary of synonyms for component types and UI concepts */\nexport const COMPONENT_SYNONYMS: Record<string, string[]> = {\n input: ['textbox', 'text', 'field', 'string', 'entry', 'prompt'],\n dropdown: ['select', 'combobox', 'picker', 'options', 'choice', 'menu', 'list'],\n date: ['calendar', 'time', 'datetime', 'day', 'month', 'year', 'schedule', 'picker'],\n number: ['numeric', 'integer', 'float', 'amount', 'currency', 'price', 'quantity', 'counter', 'digits', 'sum'],\n checkbox: ['toggle', 'switch', 'boolean', 'check', 'tick', 'flag', 'yes/no'],\n button: ['action', 'submit', 'trigger', 'click', 'cta', 'press', 'execute'],\n 'kpi-card': ['kpi', 'metric', 'stat', 'card', 'indicator', 'summary', 'figure', 'analytics', 'measure', 'total'],\n chart: ['graph', 'bar', 'donut', 'line', 'visual', 'analytics', 'plot', 'pie', 'diagram'],\n};\n\n/** Compute Levenshtein distance between two strings for typo tolerance */\nexport function levenshteinDistance(a: string, b: string): number {\n if (a === b) return 0;\n if (!a.length) return b.length;\n if (!b.length) return a.length;\n\n const row = Array.from({ length: b.length + 1 }, (_, i) => i);\n for (let i = 1; i <= a.length; i++) {\n let prev = i;\n for (let j = 1; j <= b.length; j++) {\n const val = a[i - 1] === b[j - 1] ? row[j - 1] : Math.min(row[j - 1], row[j], prev) + 1;\n row[j - 1] = prev;\n prev = val;\n }\n row[b.length] = prev;\n }\n return row[b.length];\n}\n\n/** Check if a search term matches a target word (substring or misspelling) */\nexport function fuzzyMatchWord(target: string, term: string): boolean {\n if (target.includes(term) || term.includes(target)) {\n return true;\n }\n if (term.length >= 4 && target.length >= 4) {\n const maxDist = term.length >= 7 ? 2 : 1;\n if (levenshteinDistance(target, term) <= maxDist) {\n return true;\n }\n }\n return false;\n}\n\n/** Pure predicate to check if a component metadata item matches a search query */\nexport function matchesSearchQuery(item: ReportingComponentMeta, rawQuery: string): boolean {\n if (!rawQuery) return true;\n const clean = rawQuery.trim();\n if (!clean) return true;\n\n const lower = clean.toLowerCase();\n\n // Tokenize by punctuation and whitespace\n const tokens = lower\n .replace(/[^\\w\\s-]/g, ' ')\n .split(/[\\s-]+/)\n .filter((t) => t.length > 0);\n\n // If query consists only of special characters (e.g., \"$$$\" or \"***\")\n if (tokens.length === 0) {\n return (\n item.displayName.toLowerCase().includes(lower) ||\n item.type.toLowerCase().includes(lower) ||\n item.category.toLowerCase().includes(lower)\n );\n }\n\n const synonyms = COMPONENT_SYNONYMS[item.type] || [];\n const targetWords = [\n item.displayName.toLowerCase(),\n item.type.toLowerCase(),\n item.category.toLowerCase(),\n ...item.displayName.toLowerCase().split(/\\s+/),\n ...item.type.toLowerCase().split(/[-_]+/),\n ...synonyms,\n ];\n\n return tokens.every((token) => targetWords.some((word) => fuzzyMatchWord(word, token)));\n}\n\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n HostListener,\n inject,\n signal,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport {\n CdkDrag,\n CdkDragDrop,\n CdkDragHandle,\n CdkDragPlaceholder,\n CdkDragPreview,\n CdkDropList,\n DragDropModule,\n} from '@angular/cdk/drag-drop';\nimport { DesignerStateService } from '../../services/designer-state.service';\nimport { ReportComponentDefinition } from '../../../../core/models/report-component.model';\nimport { ComponentLayoutDefinition } from '../../../../core/models/report-layout.model';\nimport { RptIconComponent } from '../../../../primitives/components/icon/rpt-icon.component';\nimport {\n calculateGridColumn,\n calculateGridRow,\n calculateSnappedHeight,\n calculateSnappedSpan,\n CANVAS_CARD_OVERHEAD,\n getComponentIconName,\n resolveCanvasCardHeight,\n resolveCanvasCardMinHeight,\n resolveComponentSpan,\n} from '../../utilities/canvas-layout.util';\n\n@Component({\n selector: 'rpt-design-canvas',\n standalone: true,\n imports: [CommonModule, DragDropModule, RptIconComponent],\n\n template: `\n <div class=\"canvas-wrapper\" (click)=\"onCanvasBackgroundClick($event)\">\n <!-- Canvas Status / Quick Controls -->\n <div class=\"canvas-toolbar\">\n <div class=\"canvas-info\">\n <span class=\"info-label\">Grid Layout:</span>\n <span class=\"info-value\">{{ totalColumns() }} Columns</span>\n <span class=\"info-divider\">•</span>\n <span class=\"info-label\">Components:</span>\n <span class=\"info-value\">{{ components().length }}</span>\n </div>\n\n <button\n type=\"button\"\n class=\"canvas-action-btn\"\n (click)=\"selectReportSettings($event)\"\n title=\"Configure Page Layout & Grid Settings\"\n >\n <rpt-icon name=\"settings\" [size]=\"15\" />\n <span>Report Settings</span>\n </button>\n </div>\n\n <!-- Canvas Drop Area -->\n <div class=\"canvas-scroll-area\">\n <div\n class=\"canvas-artboard\"\n [style.padding.px]=\"definition().layout.padding ?? 24\"\n >\n <!-- Report Header Preview -->\n <div class=\"canvas-report-header\">\n <h2 class=\"canvas-report-title\">{{ definition().name || 'Untitled Report' }}</h2>\n @if (definition().description) {\n <p class=\"canvas-report-desc\">{{ definition().description }}</p>\n }\n </div>\n\n <!-- Component Drop List Grid with 2D mixed orientation and data binding -->\n <div\n cdkDropList\n id=\"designer-canvas-drop-list\"\n class=\"canvas-grid\"\n cdkDropListOrientation=\"mixed\"\n [cdkDropListData]=\"sortedComponents()\"\n [style.grid-template-columns]=\"gridTemplateColumns()\"\n [style.gap.px]=\"definition().layout.gap ?? 16\"\n (cdkDropListDropped)=\"onDrop($event)\"\n >\n @for (comp of sortedComponents(); track comp.id; let idx = $index) {\n <div\n cdkDrag\n [cdkDragData]=\"comp\"\n [cdkDragDisabled]=\"isAnyResizing()\"\n class=\"canvas-component-card\"\n [class.is-selected]=\"isSelected(comp.id)\"\n [class.is-resizing]=\"resizingCompId() === comp.id\"\n [class.is-narrow]=\"getSpan(comp) <= 2\"\n [class.is-compact]=\"getSpan(comp) === 1\"\n [style.grid-column]=\"getGridColumn(comp)\"\n [style.grid-row]=\"getGridRow(comp)\"\n [style.width]=\"comp.layout?.width || 'auto'\"\n [style.height]=\"getComponentHeight(comp)\"\n [style.min-height]=\"getComponentMinHeight(comp)\"\n (click)=\"onSelect(comp.id, $event)\"\n >\n <!-- Card Header with Drag Handle & Actions -->\n <div class=\"card-header\">\n <div class=\"card-title-group\" cdkDragHandle title=\"Drag to reorder\">\n <span class=\"drag-handle-dots\">⋮⋮</span>\n <rpt-icon [name]=\"getComponentIconName(comp.type)\" [size]=\"14\" />\n <span class=\"comp-title\" [title]=\"comp.label || comp.key || comp.type\">\n {{ comp.label || comp.key || comp.type }}\n </span>\n </div>\n\n <div class=\"card-actions\">\n <!-- Static span pill & new row / start col pill when not hovered / not selected -->\n @if (comp.layout?.column; as col) {\n <span class=\"new-row-pill-static\" title=\"Starts at Column {{ col }}\">Col {{ col }}</span>\n } @else if (comp.layout?.newRow) {\n <span class=\"new-row-pill-static\" title=\"Starts on separate row\">↳ Row</span>\n }\n <span\n class=\"span-pill-static\"\n title=\"Column span: {{ getSpan(comp) }} of {{ totalColumns() }} columns\"\n >\n {{ getSpan(comp) }}/{{ totalColumns() }}\n </span>\n\n <!-- Quick Action Stepper & Buttons (revealed on hover or selection) -->\n <div class=\"card-quick-controls\">\n <button\n type=\"button\"\n class=\"card-action-btn\"\n [class.btn-active-toggle]=\"comp.layout?.newRow\"\n (click)=\"toggleNewRow(comp, $event)\"\n title=\"{{ comp.layout?.newRow ? 'Starts on new row (Click to place inline)' : 'Start on separate row (Row Break)' }}\"\n >\n <rpt-icon name=\"corner-down-right\" [size]=\"11\" />\n </button>\n\n <div class=\"span-control-group\" title=\"Adjust Column Span\">\n <button\n type=\"button\"\n class=\"span-btn\"\n [disabled]=\"getSpan(comp) <= 1\"\n (click)=\"adjustSpan(comp, -1, $event)\"\n title=\"Shrink Column Span\"\n >\n <rpt-icon name=\"minus\" [size]=\"9\" />\n </button>\n <span class=\"span-badge\">{{ getSpan(comp) <= 2 ? getSpan(comp) : (getSpan(comp) + '/' + totalColumns()) }}</span>\n <button\n type=\"button\"\n class=\"span-btn\"\n [disabled]=\"getSpan(comp) >= totalColumns()\"\n (click)=\"adjustSpan(comp, 1, $event)\"\n title=\"Expand Column Span\"\n >\n <rpt-icon name=\"plus\" [size]=\"9\" />\n </button>\n </div>\n\n <button\n type=\"button\"\n class=\"card-action-btn\"\n (click)=\"onDuplicate(comp.id, $event)\"\n title=\"Duplicate component\"\n >\n <rpt-icon name=\"copy\" [size]=\"12\" />\n </button>\n <button\n type=\"button\"\n class=\"card-action-btn btn-delete\"\n (click)=\"onDelete(comp.id, $event)\"\n title=\"Remove component\"\n >\n <rpt-icon name=\"trash\" [size]=\"12\" />\n </button>\n </div>\n </div>\n </div>\n\n <!-- Card Body Visual Preview -->\n <div class=\"card-body\">\n\n @switch (comp.type) {\n @case ('input') {\n <div class=\"mock-input-field\">\n <span class=\"mock-label\">{{ comp.label || 'Input' }}</span>\n <div class=\"mock-input-box\">{{ comp.properties?.['placeholder'] || 'Enter text...' }}</div>\n </div>\n }\n @case ('dropdown') {\n <div class=\"mock-input-field\">\n <span class=\"mock-label\">{{ comp.label || 'Dropdown' }}</span>\n <div class=\"mock-select-box\">\n <span>{{ comp.properties?.['placeholder'] || '-- Select --' }}</span>\n <rpt-icon name=\"chevron-down\" [size]=\"12\" />\n </div>\n </div>\n }\n @case ('date') {\n <div class=\"mock-input-field\">\n <span class=\"mock-label\">{{ comp.label || 'Date' }}</span>\n <div class=\"mock-select-box\">\n <span>YYYY-MM-DD</span>\n <rpt-icon name=\"calendar\" [size]=\"12\" />\n </div>\n </div>\n }\n @case ('number') {\n <div class=\"mock-input-field\">\n <span class=\"mock-label\">{{ comp.label || 'Number' }}</span>\n <div class=\"mock-input-box\">\n {{ comp.properties?.['prefix'] || '' }} 0.00 {{ comp.properties?.['suffix'] || '' }}\n </div>\n </div>\n }\n @case ('checkbox') {\n <div class=\"mock-checkbox-field\">\n <span class=\"mock-check-box\">\n <rpt-icon name=\"check\" [size]=\"10\" />\n </span>\n <span class=\"mock-label\">{{ comp.label || 'Checkbox' }}</span>\n </div>\n }\n @case ('button') {\n <div class=\"mock-btn-wrapper\">\n <button\n type=\"button\"\n class=\"mock-btn\"\n [class]=\"'btn-' + (comp.properties?.['variant'] || 'primary')\"\n [class.mock-btn-full]=\"comp.properties?.['fullWidth'] === true || comp.layout?.width === '100%'\"\n [style.height]=\"getCustomBtnHeight(comp)\"\n [style.width]=\"getCustomBtnWidth(comp)\"\n >\n @if (getCustomBtnIcon(comp); as btnIcon) {\n <rpt-icon [name]=\"btnIcon\" [size]=\"15\" />\n }\n <span>{{ comp.label || 'Button' }}</span>\n </button>\n </div>\n }\n @case ('kpi-card') {\n <div class=\"mock-kpi-field\">\n <div class=\"mock-kpi-header\">\n <span class=\"mock-label\">{{ comp.label || 'KPI Metric' }}</span>\n <rpt-icon name=\"kpi\" [size]=\"14\" />\n </div>\n <div class=\"mock-kpi-value\">{{ comp.properties?.['value'] || '$128,450' }}</div>\n <div class=\"mock-kpi-footer\">\n <span class=\"mock-kpi-trend\">+12.5%</span>\n <span class=\"mock-kpi-sub\">vs last period</span>\n </div>\n </div>\n }\n @case ('chart') {\n <div class=\"mock-chart-field\">\n <div class=\"mock-chart-header\">\n <span class=\"mock-label\">{{ comp.label || 'Chart Visualization' }}</span>\n </div>\n <div class=\"mock-chart-bars\">\n <div class=\"mock-chart-bar\" style=\"height: 55%\"></div>\n <div class=\"mock-chart-bar\" style=\"height: 80%\"></div>\n <div class=\"mock-chart-bar\" style=\"height: 45%\"></div>\n <div class=\"mock-chart-bar\" style=\"height: 95%\"></div>\n <div class=\"mock-chart-bar\" style=\"height: 70%\"></div>\n </div>\n </div>\n }\n @default {\n <div class=\"mock-generic-box\">\n <span>{{ comp.type }}</span>\n </div>\n }\n }\n </div>\n\n <!-- Resizing Handles (East, South, South-East) -->\n <div\n class=\"resize-handle handle-e\"\n (pointerdown)=\"startResize($event, comp, 'e')\"\n (dblclick)=\"resetDimensions(comp, $event)\"\n title=\"Drag to resize column width • Double-click to reset\"\n ></div>\n <div\n class=\"resize-handle handle-s\"\n (pointerdown)=\"startResize($event, comp, 's')\"\n (dblclick)=\"resetDimensions(comp, $event)\"\n title=\"Drag to resize height • Double-click to reset\"\n ></div>\n <div\n class=\"resize-handle handle-se\"\n (pointerdown)=\"startResize($event, comp, 'se')\"\n (dblclick)=\"resetDimensions(comp, $event)\"\n title=\"Drag to resize width and height • Double-click to reset\"\n ></div>\n\n <!-- Resizing Dimension Ghost / Badge -->\n @if (resizingCompId() === comp.id) {\n <div class=\"resize-dimension-tooltip\">\n {{ resizingTooltip(comp) }}\n </div>\n }\n\n <!-- Drag placeholder with matched grid column span -->\n <div\n *cdkDragPlaceholder\n class=\"canvas-drag-placeholder\"\n [style.grid-column]=\"getGridColumn(comp)\"\n ></div>\n\n <!-- Drag preview -->\n <div *cdkDragPreview class=\"canvas-drag-preview\">\n <span class=\"drag-handle-dots\">⋮⋮</span>\n <rpt-icon [name]=\"getComponentIconName(comp.type)\" [size]=\"14\" />\n <span class=\"preview-title\">{{ comp.label || comp.key || comp.type }}</span>\n <span class=\"preview-span\">{{ getSpan(comp) }}/{{ totalColumns() }}</span>\n </div>\n </div>\n }\n\n @if (components().length === 0) {\n <div class=\"canvas-empty-state\">\n <div class=\"empty-icon\"><rpt-icon name=\"design\" [size]=\"40\" /></div>\n <h3>Visual Canvas is Empty</h3>\n <p>Drag components from the palette on the left or double-click to add them to this report.</p>\n </div>\n }\n </div>\n\n <!-- Result Grid Preview Placeholder -->\n @if (definition().grid) {\n <div class=\"canvas-grid-preview-box\" (click)=\"selectGridSettings($event)\">\n <div class=\"grid-preview-header\">\n <div style=\"display: flex; align-items: center; gap: 8px;\">\n <rpt-icon name=\"table\" [size]=\"15\" />\n <span>Result Grid Preview ({{ definition().grid?.columns?.length ?? 0 }} columns)</span>\n </div>\n <span class=\"grid-click-hint\">Click to edit columns</span>\n </div>\n <div class=\"grid-preview-columns\">\n\n @for (col of definition().grid?.columns; track col.field) {\n <div class=\"grid-col-pill\">\n <span class=\"col-pill-name\">{{ col.label }}</span>\n <span class=\"col-pill-type\">{{ col.dataType || 'string' }}</span>\n </div>\n }\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n `,\n styles: [`\n :host {\n display: block;\n height: 100%;\n background-color: #f1f5f9;\n font-family: var(--rpt-font-family, inherit);\n box-sizing: border-box;\n }\n .canvas-wrapper {\n display: flex;\n flex-direction: column;\n height: 100%;\n }\n .canvas-toolbar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n min-height: 46px;\n padding: 6px 20px;\n background: #ffffff;\n border-bottom: 1px solid var(--rpt-color-border, #cbd5e1);\n box-sizing: border-box;\n }\n .canvas-info {\n display: flex;\n align-items: center;\n gap: 8px;\n color: var(--rpt-color-text-muted, #64748b);\n font-size: 0.8125rem;\n }\n .info-label {\n color: #64748b;\n }\n .info-value {\n font-weight: 600;\n color: var(--rpt-color-text, #0f172a);\n }\n .info-divider {\n color: var(--rpt-color-border, #cbd5e1);\n margin: 0 2px;\n }\n .canvas-action-btn {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n height: 32px;\n padding: 0 14px;\n background: #ffffff;\n border: 1px solid var(--rpt-color-border, #cbd5e1);\n border-radius: 6px;\n font-size: 0.8125rem;\n font-weight: 500;\n color: #1e293b;\n cursor: pointer;\n line-height: 1;\n white-space: nowrap;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.04);\n transition: all var(--rpt-transition-speed, 150ms) ease;\n }\n .canvas-action-btn rpt-icon {\n color: #64748b;\n transition: color 150ms ease;\n }\n .canvas-action-btn:hover {\n background: var(--rpt-color-surface, #f8fafc);\n border-color: var(--rpt-color-primary, #2563eb);\n color: var(--rpt-color-primary, #2563eb);\n box-shadow: 0 2px 4px rgba(37, 99, 235, 0.08);\n }\n .canvas-action-btn:hover rpt-icon {\n color: var(--rpt-color-primary, #2563eb);\n }\n .canvas-action-btn:active {\n transform: translateY(1px);\n }\n .canvas-scroll-area {\n flex: 1;\n overflow-y: auto;\n padding: 16px;\n }\n .canvas-artboard {\n width: 100%;\n max-width: 1400px;\n margin: 0 auto;\n background: #ffffff;\n border: 1px solid var(--rpt-color-border, #cbd5e1);\n border-radius: var(--rpt-border-radius-lg, 8px);\n box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.05);\n min-height: 480px;\n box-sizing: border-box;\n }\n .canvas-report-header {\n margin-bottom: 24px;\n padding-bottom: 16px;\n border-bottom: 1px solid var(--rpt-color-border, #e2e8f0);\n }\n .canvas-report-title {\n font-size: var(--rpt-font-size-xl, 1.5rem);\n font-weight: 700;\n color: var(--rpt-color-text, #0f172a);\n margin: 0 0 6px 0;\n }\n .canvas-report-desc {\n font-size: var(--rpt-font-size-base, 0.875rem);\n color: var(--rpt-color-text-muted, #64748b);\n margin: 0;\n }\n .canvas-grid {\n display: grid;\n width: 100%;\n min-height: 180px;\n align-items: start;\n border-radius: 6px;\n transition: all var(--rpt-transition-speed, 150ms) ease;\n }\n .canvas-component-card {\n background: #ffffff;\n border: 1.5px solid var(--rpt-color-border, #cbd5e1);\n border-radius: var(--rpt-border-radius, 6px);\n box-shadow: var(--rpt-box-shadow, 0 1px 2px rgba(0, 0, 0, 0.05));\n box-sizing: border-box;\n transition: all var(--rpt-transition-speed, 150ms) ease;\n cursor: pointer;\n position: relative;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n min-height: 96px;\n }\n .canvas-component-card:hover {\n border-color: var(--rpt-color-primary, #2563eb);\n box-shadow: 0 4px 6px -1px rgba(37, 99, 235, 0.1);\n }\n .canvas-component-card.is-selected {\n border-color: var(--rpt-color-primary, #2563eb);\n box-shadow: 0 0 0 2px rgba(37, 99, 235, 0.25);\n }\n .canvas-component-card.is-resizing {\n user-select: none;\n border-color: var(--rpt-color-primary, #2563eb);\n box-shadow: 0 0 0 2px rgba(37, 99, 235, 0.35);\n z-index: 30;\n transition: none !important;\n }\n .resize-handle {\n position: absolute;\n z-index: 40;\n touch-action: none;\n opacity: 0;\n transition: opacity 150ms ease;\n }\n .canvas-component-card.is-selected .resize-handle,\n .canvas-component-card:hover .resize-handle {\n opacity: 1;\n }\n .resize-handle.handle-e {\n top: 0;\n right: 0;\n width: 6px;\n height: 100%;\n cursor: ew-resize;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n .resize-handle.handle-e::after {\n content: '';\n width: 3px;\n height: 24px;\n background: #cbd5e1;\n border-radius: 2px;\n transition: background 150ms ease;\n }\n .resize-handle.handle-e:hover::after,\n .canvas-component-card.is-selected .resize-handle.handle-e::after {\n background: var(--rpt-color-primary, #2563eb);\n }\n .resize-handle.handle-s {\n bottom: 0;\n left: 0;\n height: 6px;\n width: 100%;\n cursor: ns-resize;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n .resize-handle.handle-s::after {\n content: '';\n height: 3px;\n width: 24px;\n background: #cbd5e1;\n border-radius: 2px;\n transition: background 150ms ease;\n }\n .resize-handle.handle-s:hover::after,\n .canvas-component-card.is-selected .resize-handle.handle-s::after {\n background: var(--rpt-color-primary, #2563eb);\n }\n .resize-handle.handle-se {\n bottom: 0;\n right: 0;\n width: 12px;\n height: 12px;\n cursor: nwse-resize;\n display: flex;\n align-items: flex-end;\n justify-content: flex-end;\n padding: 2px;\n }\n .resize-handle.handle-se::after {\n content: '';\n width: 5px;\n height: 5px;\n border-right: 2px solid #cbd5e1;\n border-bottom: 2px solid #cbd5e1;\n transition: border-color 150ms ease;\n }\n .resize-handle.handle-se:hover::after,\n .canvas-component-card.is-selected .resize-handle.handle-se::after {\n border-color: var(--rpt-color-primary, #2563eb);\n }\n .resize-dimension-tooltip {\n position: absolute;\n top: 38px;\n right: 8px;\n background: rgba(15, 23, 42, 0.9);\n color: #ffffff;\n font-size: 0.7rem;\n font-weight: 600;\n padding: 3px 8px;\n border-radius: 4px;\n white-space: nowrap;\n pointer-events: none;\n z-index: 50;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);\n }\n .card-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 6px;\n padding: 5px 8px;\n background: var(--rpt-color-surface, #f8fafc);\n border-bottom: 1px solid var(--rpt-color-border, #e2e8f0);\n min-height: 32px;\n box-sizing: border-box;\n overflow: hidden;\n }\n .card-title-group {\n display: flex;\n align-items: center;\n gap: 5px;\n cursor: grab;\n min-width: 0;\n flex: 1;\n overflow: hidden;\n }\n .drag-handle-dots {\n color: var(--rpt-color-text-muted, #94a3b8);\n font-size: 0.85rem;\n letter-spacing: -2px;\n flex-shrink: 0;\n user-select: none;\n }\n .comp-title {\n font-size: 0.75rem;\n font-weight: 600;\n color: var(--rpt-color-text, #0f172a);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n user-select: none;\n }\n .card-actions {\n display: flex;\n align-items: center;\n gap: 4px;\n flex-shrink: 0;\n margin-left: auto;\n }\n .new-row-pill-static {\n font-size: 0.65rem;\n font-weight: 600;\n color: #7c3aed;\n background: #f5f3ff;\n border: 1px solid #ddd6fe;\n padding: 1px 5px;\n border-radius: 9999px;\n white-space: nowrap;\n line-height: 1;\n flex-shrink: 0;\n }\n .span-pill-static {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n font-size: 0.65rem;\n font-weight: 600;\n color: var(--rpt-color-text-muted, #64748b);\n background: var(--rpt-color-surface, #f1f5f9);\n border: 1px solid var(--rpt-color-border, #e2e8f0);\n padding: 1px 6px;\n border-radius: 9999px;\n line-height: 1.2;\n white-space: nowrap;\n user-select: none;\n }\n .card-quick-controls {\n display: none;\n align-items: center;\n gap: 3px;\n }\n .canvas-component-card:hover .span-pill-static,\n .canvas-component-card.is-selected .span-pill-static,\n .canvas-component-card:hover .new-row-pill-static,\n .canvas-component-card.is-selected .new-row-pill-static {\n display: none;\n }\n .canvas-component-card:hover .card-quick-controls,\n .canvas-component-card.is-selected .card-quick-controls {\n display: inline-flex;\n }\n .canvas-component-card.is-narrow .card-header {\n padding: 4px 6px;\n gap: 3px;\n }\n .canvas-component-card.is-narrow:hover .comp-title,\n .canvas-component-card.is-narrow.is-selected .comp-title,\n .canvas-component-card.is-narrow:hover .drag-handle-dots,\n .canvas-component-card.is-narrow.is-selected .drag-handle-dots {\n display: none;\n }\n .canvas-component-card.is-narrow .card-quick-controls {\n gap: 2px;\n }\n .canvas-component-card.is-narrow .span-control-group {\n height: 18px;\n }\n .canvas-component-card.is-narrow .span-btn {\n width: 14px;\n height: 16px;\n }\n .canvas-component-card.is-narrow .span-badge {\n font-size: 0.6rem;\n padding: 0 2px;\n }\n .canvas-component-card.is-narrow .card-action-btn {\n width: 18px;\n height: 18px;\n }\n .canvas-component-card.is-compact:hover .card-action-btn:not(.btn-delete),\n .canvas-component-card.is-compact.is-selected .card-action-btn:not(.btn-delete) {\n display: none;\n }\n .span-control-group {\n display: inline-flex;\n align-items: center;\n background: #ffffff;\n border: 1px solid var(--rpt-color-border, #cbd5e1);\n border-radius: 4px;\n height: 20px;\n padding: 0 1px;\n white-space: nowrap;\n flex-shrink: 0;\n }\n .span-btn {\n width: 16px;\n height: 18px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border: none;\n background: transparent;\n padding: 0;\n color: var(--rpt-color-text-muted, #64748b);\n cursor: pointer;\n border-radius: 2px;\n transition: all 120ms ease;\n }\n .span-btn:hover:not(:disabled) {\n background: var(--rpt-color-surface-hover, #f1f5f9);\n color: var(--rpt-color-primary, #2563eb);\n }\n .span-btn:disabled {\n opacity: 0.3;\n cursor: not-allowed;\n }\n .span-badge {\n font-size: 0.65rem;\n font-weight: 600;\n color: var(--rpt-color-text, #0f172a);\n padding: 0 3px;\n white-space: nowrap;\n user-select: none;\n line-height: 1;\n }\n .card-action-btn {\n width: 20px;\n height: 20px;\n border: none;\n background: transparent;\n border-radius: 4px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0;\n cursor: pointer;\n color: var(--rpt-color-text-muted, #64748b);\n transition: all 120ms ease;\n flex-shrink: 0;\n }\n .card-action-btn:hover {\n background: #e2e8f0;\n color: var(--rpt-color-text, #0f172a);\n }\n .card-action-btn.btn-active-toggle {\n background: #7c3aed;\n color: #ffffff;\n border-color: #7c3aed;\n }\n .card-action-btn.btn-active-toggle:hover {\n background: #6d28d9;\n color: #ffffff;\n }\n .btn-delete:hover {\n background: #fee2e2;\n color: #ef4444;\n }\n .card-body {\n padding: 8px 12px 8px 10px;\n flex: 1;\n display: flex;\n flex-direction: column;\n min-height: 0;\n box-sizing: border-box;\n overflow: hidden;\n }\n .mock-input-field {\n display: flex;\n flex-direction: column;\n gap: 4px;\n flex: 1;\n height: 100%;\n min-height: 0;\n }\n .mock-label {\n font-size: 0.7rem;\n font-weight: 600;\n color: var(--rpt-color-text-muted, #475569);\n flex-shrink: 0;\n }\n .mock-input-box, .mock-select-box {\n border: 1px solid var(--rpt-color-border, #cbd5e1);\n border-radius: 6px;\n padding: 6px 12px;\n font-size: var(--rpt-font-size-base, 0.875rem);\n color: var(--rpt-color-text-muted, #94a3b8);\n background: #ffffff;\n flex: 1;\n min-height: 38px;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: space-between;\n box-sizing: border-box;\n }\n .mock-checkbox-field {\n display: flex;\n align-items: center;\n gap: 6px;\n flex: 1;\n height: 100%;\n min-height: 0;\n padding-top: 14px;\n }\n .mock-check-box {\n width: 18px;\n height: 18px;\n border: 1px solid var(--rpt-color-border, #cbd5e1);\n border-radius: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 0.65rem;\n color: var(--rpt-color-primary, #2563eb);\n flex-shrink: 0;\n }\n .mock-btn-wrapper {\n display: flex;\n flex: 1;\n height: 100%;\n min-height: 38px;\n align-items: center;\n justify-content: flex-start;\n width: 100%;\n min-width: 0;\n box-sizing: border-box;\n }\n .mock-btn {\n border-radius: var(--rpt-border-radius, 6px);\n padding: 0 16px;\n height: 36px;\n font-size: var(--rpt-font-size-base, 0.875rem);\n font-weight: 500;\n border: 1px solid transparent;\n cursor: pointer;\n width: auto;\n max-width: 100%;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n box-sizing: border-box;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n transition: all 150ms ease;\n }\n .mock-btn.mock-btn-full {\n width: 100%;\n }\n .canvas-component-card.is-narrow .mock-btn {\n padding: 0 6px;\n font-size: 0.775rem;\n width: 100%;\n height: 34px;\n }\n .mock-kpi-field {\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n flex: 1;\n height: 100%;\n min-height: 0;\n }\n .mock-kpi-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n }\n .mock-kpi-value {\n font-size: 1.25rem;\n font-weight: 700;\n color: var(--rpt-color-text, #0f172a);\n margin: 2px 0;\n }\n .mock-kpi-footer {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 0.65rem;\n }\n .mock-kpi-trend {\n color: #16a34a;\n font-weight: 600;\n }\n .mock-kpi-sub {\n color: #64748b;\n }\n .mock-chart-field {\n display: flex;\n flex-direction: column;\n flex: 1;\n height: 100%;\n min-height: 0;\n }\n .mock-chart-bars {\n display: flex;\n align-items: flex-end;\n justify-content: space-around;\n gap: 8px;\n flex: 1;\n min-height: 36px;\n padding-top: 6px;\n }\n .mock-chart-bar {\n width: 16%;\n background: var(--rpt-color-primary, #2563eb);\n border-radius: 3px 3px 0 0;\n opacity: 0.85;\n min-height: 10px;\n }\n .btn-primary {\n background: var(--rpt-color-primary, #2563eb);\n color: #ffffff;\n }\n .btn-secondary {\n background: #f1f5f9;\n color: #0f172a;\n border: 1px solid #cbd5e1;\n }\n .btn-outline {\n background: transparent;\n color: #2563eb;\n border: 1px solid #2563eb;\n }\n .btn-danger {\n background: #ef4444;\n color: #ffffff;\n }\n .mock-generic-box {\n border: 1px dashed #cbd5e1;\n border-radius: 4px;\n padding: 8px;\n font-size: 0.75rem;\n text-align: center;\n color: #64748b;\n }\n .canvas-drag-placeholder {\n background: rgba(37, 99, 235, 0.06);\n border: 2px dashed var(--rpt-color-primary, #2563eb);\n border-radius: 6px;\n min-height: 80px;\n box-sizing: border-box;\n transition: transform 150ms ease;\n }\n .canvas-drag-preview,\n ::ng-deep .canvas-drag-preview {\n background: #ffffff;\n border: 2px solid var(--rpt-color-primary, #2563eb);\n border-radius: 6px;\n padding: 8px 14px;\n display: inline-flex;\n align-items: center;\n gap: 8px;\n font-family: var(--rpt-font-family, system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif) !important;\n font-size: 0.8rem;\n font-weight: 600;\n color: var(--rpt-color-text, #0f172a);\n box-shadow: 0 12px 24px -4px rgba(0, 0, 0, 0.25);\n z-index: 10000;\n }\n .preview-title,\n ::ng-deep .preview-title {\n font-family: inherit !important;\n max-width: 160px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n .preview-span,\n ::ng-deep .preview-span {\n font-family: inherit !important;\n font-size: 0.65rem;\n font-weight: 600;\n color: var(--rpt-color-primary, #2563eb);\n background: #eff6ff;\n border: 1px solid #bfdbfe;\n padding: 1px 6px;\n border-radius: 9999px;\n }\n .canvas-empty-state {\n grid-column: 1 / -1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 60px 20px;\n border: 2px dashed var(--rpt-color-border, #cbd5e1);\n border-radius: 8px;\n background: var(--rpt-color-surface, #f8fafc);\n text-align: center;\n }\n .empty-icon {\n font-size: 2.5rem;\n margin-bottom: 12px;\n }\n .canvas-empty-state h3 {\n font-size: 1rem;\n font-weight: 600;\n color: var(--rpt-color-text, #0f172a);\n margin: 0 0 6px 0;\n }\n .canvas-empty-state p {\n font-size: 0.8rem;\n color: var(--rpt-color-text-muted, #64748b);\n max-width: 380px;\n margin: 0;\n }\n .canvas-grid-preview-box {\n margin-top: 32px;\n border: 1px dashed var(--rpt-color-border, #cbd5e1);\n border-radius: 8px;\n background: var(--rpt-color-surface, #f8fafc);\n padding: 16px;\n cursor: pointer;\n transition: all var(--rpt-transition-speed, 150ms) ease;\n }\n .canvas-grid-preview-box:hover {\n border-color: var(--rpt-color-primary, #2563eb);\n background: #ffffff;\n }\n .grid-preview-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n font-size: 0.8rem;\n font-weight: 600;\n color: var(--rpt-color-text, #0f172a);\n margin-bottom: 10px;\n }\n .grid-click-hint {\n font-size: 0.7rem;\n color: var(--rpt-color-primary, #2563eb);\n font-weight: 500;\n }\n .grid-preview-columns {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n }\n .grid-col-pill {\n display: flex;\n align-items: center;\n gap: 4px;\n background: #ffffff;\n border: 1px solid var(--rpt-color-border, #e2e8f0);\n border-radius: 4px;\n padding: 4px 8px;\n font-size: 0.75rem;\n }\n .col-pill-name {\n font-weight: 600;\n color: var(--rpt-color-text, #0f172a);\n }\n .col-pill-type {\n font-size: 0.65rem;\n color: var(--rpt-color-text-muted, #94a3b8);\n background: var(--rpt-color-surface, #f1f5f9);\n padding: 1px 4px;\n border-radius: 3px;\n }\n `],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class DesignCanvasComponent {\n private readonly designerState = inject(DesignerStateService);\n\n readonly definition = this.designerState.definition;\n readonly components = computed(() => this.definition().components);\n readonly selectedId = this.designerState.selectedComponentId;\n\n readonly totalColumns = computed(() => this.definition().layout.columns || 12);\n\n readonly gridTemplateColumns = computed(() => {\n return `repeat(${this.totalColumns()}, minmax(0, 1fr))`;\n });\n\n readonly sortedComponents = computed(() => {\n return [...this.components()].sort((a, b) => (a.order ?? 0) - (b.order ?? 0));\n });\n\n readonly resizingCompId = signal<string | null>(null);\n readonly resizingSpan = signal<number | null>(null);\n readonly resizingHeight = signal<number | null>(null);\n readonly isAnyResizing = computed(() => this.resizingCompId() !== null);\n\n isSelected(id: string): boolean {\n return this.selectedId() === id;\n }\n\n getSpan(comp: ReportComponentDefinition): number {\n return resolveComponentSpan(\n comp,\n this.totalColumns(),\n this.resizingCompId() === comp.id ? this.resizingSpan() : null\n );\n }\n\n getGridColumn(comp: ReportComponentDefinition): string {\n return calculateGridColumn(comp, this.totalColumns(), this.getSpan(comp));\n }\n\n toggleNewRow(comp: ReportComponentDefinition, event: MouseEvent): void {\n event.stopPropagation();\n const current = !!comp.layout?.newRow;\n this.designerState.updateComponentLayout(comp.id, { newRow: !current });\n }\n\n getGridRow(comp: ReportComponentDefinition): string {\n return calculateGridRow(comp);\n }\n\n getComponentHeight(comp: ReportComponentDefinition): string {\n return resolveCanvasCardHeight(\n comp,\n this.resizingCompId() === comp.id ? this.resizingHeight() : null\n );\n }\n\n getComponentMinHeight(comp: ReportComponentDefinition): string {\n return resolveCanvasCardMinHeight(\n comp,\n this.resizingCompId() === comp.id ? this.resizingHeight() : null\n );\n }\n\n getCustomBtnHeight(comp: ReportComponentDefinition): string | null {\n const h = comp.layout?.height;\n return h && h !== 'auto' ? h : null;\n }\n\n getCustomBtnWidth(comp: ReportComponentDefinition): string | null {\n const w = comp.layout?.width;\n return w && w !== 'auto' ? w : null;\n }\n\n getCustomBtnIcon(comp: ReportComponentDefinition): string {\n return (comp.properties?.['icon'] as string) || '';\n }\n\n resizingTooltip(comp: ReportComponentDefinition): string {\n const span = this.getSpan(comp);\n const height = this.resizingHeight() ?? (comp.layout?.height ? parseInt(comp.layout.height, 10) : 58);\n return `${span} cols × ${height}px`;\n }\n\n readonly getComponentIconName = getComponentIconName;\n\n onSelect(id: string, event: MouseEvent): void {\n if (this.isAnyResizing()) return;\n event.stopPropagation();\n this.designerState.selectComponent(id);\n }\n\n adjustSpan(comp: ReportComponentDefinition, delta: number, event: MouseEvent): void {\n event.stopPropagation();\n const current = this.getSpan(comp);\n const next = Math.max(1, Math.min(this.totalColumns(), current + delta));\n this.designerState.updateComponentLayout(comp.id, { columnSpan: next });\n }\n\n onDuplicate(id: string, event: MouseEvent): void {\n event.stopPropagation();\n this.designerState.duplicateComponent(id);\n }\n\n onDelete(id: string, event: MouseEvent): void {\n event.stopPropagation();\n this.designerState.removeComponent(id);\n }\n\n @HostListener('document:keydown.escape')\n onEscape(): void {\n if (this.selectedId()) {\n this.designerState.selectComponent(null);\n }\n }\n\n onCanvasBackgroundClick(event: MouseEvent): void {\n if (this.isAnyResizing()) return;\n const target = event.target as HTMLElement;\n if (\n target.closest('.canvas-component-card') ||\n target.closest('.canvas-action-btn') ||\n target.closest('.canvas-grid-preview-box')\n ) {\n return;\n }\n this.designerState.selectComponent(null);\n }\n\n selectReportSettings(event?: MouseEvent): void {\n event?.stopPropagation();\n this.designerState.selectComponent(null);\n this.designerState.setActiveTab('report');\n }\n\n selectGridSettings(event?: MouseEvent): void {\n event?.stopPropagation();\n this.designerState.selectComponent(null);\n this.designerState.setActiveTab('grid');\n }\n\n startResize(event: PointerEvent, comp: ReportComponentDefinition, direction: 'e' | 's' | 'se'): void {\n event.preventDefault();\n event.stopPropagation();\n\n this.designerState.selectComponent(comp.id);\n\n const handle = event.target as HTMLElement;\n handle.setPointerCapture(event.pointerId);\n\n const card = handle.closest('.canvas-component-card') as HTMLElement;\n const grid = handle.closest('.canvas-grid') as HTMLElement;\n if (!card || !grid) return;\n\n const startX = event.clientX;\n const startY = event.clientY;\n const startSpan = comp.layout?.columnSpan ?? (comp.type === 'button' ? 2 : 4);\n const existingCompHeight = comp.layout?.height ? parseInt(comp.layout.height, 10) : null;\n const startHeight = existingCompHeight ?? Math.max(38, card.offsetHeight - CANVAS_CARD_OVERHEAD);\n const totalCols = this.totalColumns();\n const gap = this.definition().layout.gap ?? 16;\n const colWidth = (grid.offsetWidth - (totalCols - 1) * gap) / totalCols;\n\n this.resizingCompId.set(comp.id);\n this.resizingSpan.set(startSpan);\n this.resizingHeight.set(startHeight);\n\n let currentSpan = startSpan;\n let currentHeight = startHeight;\n\n const onPointerMove = (moveEvent: PointerEvent) => {\n if (direction === 'e' || direction === 'se') {\n const deltaX = moveEvent.clientX - startX;\n currentSpan = calculateSnappedSpan(deltaX, startSpan, colWidth, gap, totalCols);\n this.resizingSpan.set(currentSpan);\n }\n\n if (direction === 's' || direction === 'se') {\n const deltaY = moveEvent.clientY - startY;\n currentHeight = calculateSnappedHeight(deltaY, startHeight, 38);\n this.resizingHeight.set(currentHeight);\n }\n };\n\n const onPointerUp = (upEvent: PointerEvent) => {\n try {\n handle.releasePointerCapture(upEvent.pointerId);\n } catch {}\n\n handle.removeEventListener('pointermove', onPointerMove);\n handle.removeEventListener('pointerup', onPointerUp);\n handle.removeEventListener('pointercancel', onPointerUp);\n\n const layoutChanges: Partial<ComponentLayoutDefinition> = {};\n if (direction === 'e' || direction === 'se') {\n layoutChanges.columnSpan = currentSpan;\n }\n const deltaY = Math.abs(upEvent.clientY - startY);\n if (direction === 's' || (direction === 'se' && deltaY > 8)) {\n layoutChanges.height = `${currentHeight}px`;\n layoutChanges.minHeight = `${currentHeight}px`;\n }\n\n this.designerState.updateComponentLayout(comp.id, layoutChanges);\n\n this.resizingCompId.set(null);\n this.resizingSpan.set(null);\n this.resizingHeight.set(null);\n };\n\n handle.addEventListener('pointermove', onPointerMove);\n handle.addEventListener('pointerup', onPointerUp);\n handle.addEventListener('pointercancel', onPointerUp);\n }\n\n resetDimensions(comp: ReportComponentDefinition, event?: MouseEvent): void {\n if (event) {\n event.stopPropagation();\n event.preventDefault();\n }\n const defaultSpan = comp.type === 'button' ? 2 : 4;\n this.designerState.updateComponentLayout(comp.id, {\n columnSpan: defaultSpan,\n height: undefined,\n minHeight: undefined,\n width: undefined,\n });\n }\n\n onDrop(event: CdkDragDrop<ReportComponentDefinition[], unknown, unknown>): void {\n if (this.isAnyResizing()) return;\n\n if (event.previousContainer === event.container) {\n // Reordering within canvas\n this.designerState.moveComponent(event.previousIndex, event.currentIndex);\n } else {\n // Dragged from palette into canvas\n const rawData = event.item.data as string | { type?: string } | undefined;\n const componentType = typeof rawData === 'string' ? rawData : rawData?.type;\n if (componentType) {\n this.designerState.addComponent(componentType, event.currentIndex);\n }\n }\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, input, output } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { ReportComponentDefinition } from '../../../../core/models/report-component.model';\nimport { PropertyDefinition } from '../../../../core/registry/property-definition.model';\n\n@Component({\n selector: 'rpt-property-editor-general',\n standalone: true,\n imports: [CommonModule, FormsModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n styleUrls: ['./property-editor.common.css'],\n template: `\n <div class=\"props-form\">\n <!-- General Properties Group -->\n <div class=\"property-group\">\n <div class=\"group-title\">General</div>\n\n <div class=\"field-row\">\n <label class=\"field-label\">Label</label>\n <input\n type=\"text\"\n class=\"field-input\"\n [ngModel]=\"comp().label\"\n (ngModelChange)=\"update.emit({ field: 'label', value: $event })\"\n />\n </div>\n\n <div class=\"field-row\">\n <label class=\"field-label\">Field Name (Key)</label>\n <input\n type=\"text\"\n class=\"field-input\"\n [ngModel]=\"comp().key\"\n (ngModelChange)=\"update.emit({ field: 'key', value: $event })\"\n />\n </div>\n </div>\n\n <!-- Component Type Specific Schema Properties -->\n @if (filteredPropertySchema().length > 0) {\n <div class=\"property-group\">\n <div class=\"group-title\">{{ comp().type }} Properties</div>\n\n @for (prop of filteredPropertySchema(); track prop.key) {\n <div class=\"field-row\">\n <label class=\"field-label\">{{ prop.label }}</label>\n\n @switch (prop.type) {\n @case ('string') {\n <input\n type=\"text\"\n class=\"field-input\"\n [placeholder]=\"prop.description ?? ''\"\n [ngModel]=\"getPropValue(prop.key)\"\n (ngModelChange)=\"updateProperty.emit({ key: prop.key, value: $event })\"\n />\n }\n @case ('number') {\n <input\n type=\"number\"\n class=\"field-input\"\n [ngModel]=\"getPropValue(prop.key)\"\n (ngModelChange)=\"updateProperty.emit({ key: prop.key, value: +$event })\"\n />\n }\n @case ('boolean') {\n <label class=\"checkbox-toggle\">\n <input\n type=\"checkbox\"\n [ngModel]=\"getPropValue(prop.key)\"\n (ngModelChange)=\"updateProperty.emit({ key: prop.key, value: $event })\"\n />\n <span>{{ prop.label }}</span>\n </label>\n }\n @case ('select') {\n <select\n class=\"field-select\"\n [ngModel]=\"getPropValue(prop.key)\"\n (ngModelChange)=\"updateProperty.emit({ key: prop.key, value: $event })\"\n >\n @for (opt of prop.options ?? []; track opt.key) {\n <option [value]=\"opt.key\">{{ opt.label }}</option>\n }\n </select>\n }\n }\n </div>\n }\n </div>\n }\n </div>\n `,\n styles: [`\n .props-form {\n display: flex;\n flex-direction: column;\n gap: 20px;\n }\n .comp-badge-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 8px 12px;\n background: var(--rpt-color-surface, #f1f5f9);\n border-radius: 6px;\n border: 1px solid var(--rpt-color-border, #e2e8f0);\n }\n .badge-title {\n display: flex;\n align-items: center;\n }\n .badge-type {\n font-size: 0.75rem;\n font-weight: 700;\n color: var(--rpt-color-primary, #2563eb);\n text-transform: uppercase;\n margin-right: 8px;\n }\n .badge-id {\n font-size: 0.7rem;\n color: var(--rpt-color-text-muted, #94a3b8);\n font-family: monospace;\n }\n .btn-deselect {\n background: none;\n border: none;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--rpt-color-text-muted, #64748b);\n cursor: pointer;\n padding: 3px;\n border-radius: 4px;\n transition: all 150ms ease;\n }\n .btn-deselect:hover {\n color: var(--rpt-color-danger, #ef4444);\n background: #fee2e2;\n }\n `],\n})\nexport class PropertyEditorGeneralComponent {\n readonly comp = input.required<ReportComponentDefinition>();\n readonly propertySchema = input<PropertyDefinition[]>([]);\n\n readonly filteredPropertySchema = computed(() =>\n this.propertySchema().filter((prop) => prop.key !== 'label' && prop.key !== 'key')\n );\n\n readonly update = output<{ field: string; value: unknown }>();\n readonly updateProperty = output<{ key: string; value: unknown }>();\n readonly deselect = output<void>();\n\n getPropValue(key: string): unknown {\n return this.comp().properties?.[key] ?? '';\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n output,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { ReportComponentDefinition } from '../../../../core/models/report-component.model';\nimport { ComponentLayoutDefinition } from '../../../../core/models/report-layout.model';\n\n@Component({\n selector: 'rpt-property-editor-layout',\n standalone: true,\n imports: [CommonModule, FormsModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n styleUrls: ['./property-editor.common.css'],\n template: `\n <div class=\"property-group\">\n <div class=\"group-title\">Layout & Dimensions</div>\n\n <!-- Column Span -->\n <div class=\"field-row\">\n <div class=\"field-label-row\">\n <label class=\"field-label\">Column Span</label>\n <span class=\"field-badge-val\">{{ comp().layout?.columnSpan || (comp().type === 'button' ? 2 : 4) }} / {{ maxColumns() }} cols</span>\n </div>\n <div class=\"span-slider-row\">\n <input\n type=\"range\"\n class=\"field-slider\"\n min=\"1\"\n [max]=\"maxColumns()\"\n [ngModel]=\"comp().layout?.columnSpan || (comp().type === 'button' ? 2 : 4)\"\n (ngModelChange)=\"onLayoutChange('columnSpan', +$event)\"\n />\n <input\n type=\"number\"\n class=\"field-input field-input-sm\"\n min=\"1\"\n [max]=\"maxColumns()\"\n [ngModel]=\"comp().layout?.columnSpan || (comp().type === 'button' ? 2 : 4)\"\n (ngModelChange)=\"onLayoutChange('columnSpan', +$event)\"\n />\n </div>\n </div>\n\n <!-- Start Column Position (Independent Placement) -->\n <div class=\"field-row\">\n <div class=\"field-label-row\">\n <label class=\"field-label\">Start Column (Position)</label>\n <span class=\"field-badge-val\">{{ comp().layout?.column ? 'Col ' + comp().layout?.column : 'Auto' }}</span>\n </div>\n <select\n class=\"field-select\"\n [ngModel]=\"comp().layout?.column ?? 0\"\n (ngModelChange)=\"onLayoutChange('column', +$event === 0 ? undefined : +$event)\"\n >\n <option [value]=\"0\">Auto (Flow naturally)</option>\n @for (colNum of columnList(); track colNum) {\n <option [value]=\"colNum\">Column {{ colNum }}</option>\n }\n </select>\n <div class=\"preset-pill-group\">\n <button type=\"button\" class=\"preset-pill\" (click)=\"onLayoutChange('column', undefined)\">Auto Flow</button>\n <button type=\"button\" class=\"preset-pill\" (click)=\"onLayoutChange('column', 1)\">Start (Col 1)</button>\n <button type=\"button\" class=\"preset-pill\" (click)=\"alignRight()\">Align Right</button>\n </div>\n </div>\n\n <!-- Row Span for multi-row items -->\n <div class=\"field-row\">\n <div class=\"field-label-row\">\n <label class=\"field-label\">Row Span</label>\n <span class=\"field-badge-val\">{{ comp().layout?.rowSpan || 1 }} {{ (comp().layout?.rowSpan || 1) === 1 ? 'row' : 'rows' }}</span>\n </div>\n <input\n type=\"number\"\n class=\"field-input\"\n min=\"1\"\n max=\"6\"\n [ngModel]=\"comp().layout?.rowSpan || 1\"\n (ngModelChange)=\"onLayoutChange('rowSpan', +$event)\"\n />\n </div>\n\n <!-- Component Width -->\n <div class=\"field-row\">\n <label class=\"field-label\">Component Width</label>\n <input\n type=\"text\"\n class=\"field-input\"\n placeholder=\"e.g. 100% or 200px\"\n [ngModel]=\"comp().layout?.width || ''\"\n (ngModelChange)=\"onLayoutChange('width', $event || undefined)\"\n />\n </div>\n\n <!-- Component Height Control -->\n <div class=\"field-row\">\n <div class=\"field-label-row\">\n <label class=\"field-label\">Component Height</label>\n <span class=\"field-badge-val\">{{ comp().layout?.height || 'Auto' }}</span>\n </div>\n <div class=\"preset-pill-group\">\n <button\n type=\"button\"\n class=\"preset-pill\"\n [class.preset-pill-active]=\"!comp().layout?.height || comp().layout?.height === 'auto'\"\n (click)=\"updateHeight.emit('auto')\"\n >\n Auto\n </button>\n <button\n type=\"button\"\n class=\"preset-pill\"\n [class.preset-pill-active]=\"comp().layout?.height === '36px'\"\n (click)=\"updateHeight.emit('36px')\"\n >\n 36px\n </button>\n <button\n type=\"button\"\n class=\"preset-pill\"\n [class.preset-pill-active]=\"comp().layout?.height === '44px'\"\n (click)=\"updateHeight.emit('44px')\"\n >\n 44px\n </button>\n <button\n type=\"button\"\n class=\"preset-pill\"\n [class.preset-pill-active]=\"comp().layout?.height === '60px'\"\n (click)=\"updateHeight.emit('60px')\"\n >\n 60px\n </button>\n <button\n type=\"button\"\n class=\"preset-pill\"\n [class.preset-pill-active]=\"comp().layout?.height === '80px'\"\n (click)=\"updateHeight.emit('80px')\"\n >\n 80px\n </button>\n <button\n type=\"button\"\n class=\"preset-pill\"\n [class.preset-pill-active]=\"comp().layout?.height === '120px'\"\n (click)=\"updateHeight.emit('120px')\"\n >\n 120px\n </button>\n </div>\n <input\n type=\"text\"\n class=\"field-input\"\n placeholder=\"e.g. 80px or 100%\"\n style=\"margin-top: 4px;\"\n [ngModel]=\"comp().layout?.height || ''\"\n (ngModelChange)=\"updateHeight.emit($event)\"\n />\n </div>\n\n <!-- Reset Dimensions Pill Button -->\n <div class=\"field-row\" style=\"margin-top: 4px;\">\n <button\n type=\"button\"\n class=\"preset-pill preset-pill-reset\"\n style=\"width: 100%; text-align: center; padding: 6px 10px; font-size: 0.725rem;\"\n (click)=\"resetDimensions.emit()\"\n title=\"Reset column span and height to standard defaults\"\n >\n ↺ Reset Size & Height\n </button>\n </div>\n </div>\n `,\n styles: [`\n .span-slider-row {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n .field-slider {\n flex: 1;\n height: 4px;\n accent-color: var(--rpt-color-primary, #2563eb);\n cursor: pointer;\n }\n .field-input-sm {\n width: 50px !important;\n text-align: center;\n padding: 4px 6px !important;\n }\n `],\n})\nexport class PropertyEditorLayoutComponent {\n readonly comp = input.required<ReportComponentDefinition>();\n readonly maxColumns = input<number>(12);\n\n readonly updateLayout = output<{ key: keyof ComponentLayoutDefinition; value: unknown }>();\n readonly updateHeight = output<string>();\n readonly resetDimensions = output<void>();\n\n readonly columnList = computed<number[]>(() => {\n return Array.from({ length: this.maxColumns() }, (_, i) => i + 1);\n });\n\n onLayoutChange(key: keyof ComponentLayoutDefinition, value: unknown): void {\n this.updateLayout.emit({ key, value });\n }\n\n alignRight(): void {\n const span = this.comp().layout?.columnSpan || (this.comp().type === 'button' ? 2 : 4);\n const startCol = Math.max(1, this.maxColumns() - span + 1);\n this.onLayoutChange('column', startCol);\n }\n}\n","import { ChangeDetectionStrategy, Component, input, output } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { ReportComponentDefinition } from '../../../../core/models/report-component.model';\n\n@Component({\n selector: 'rpt-property-editor-validation',\n standalone: true,\n imports: [CommonModule, FormsModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n styleUrls: ['./property-editor.common.css'],\n template: `\n <div class=\"property-group\">\n <div class=\"group-title\">Validation</div>\n\n <div class=\"field-row\">\n <label class=\"checkbox-toggle\">\n <input\n type=\"checkbox\"\n [ngModel]=\"comp().validation?.required ?? false\"\n (ngModelChange)=\"updateValidation.emit({ key: 'required', value: $event })\"\n />\n <span>Required</span>\n </label>\n </div>\n\n <div class=\"field-row\">\n <label class=\"field-label\">Min Value / Length</label>\n <input\n type=\"number\"\n class=\"field-input\"\n [ngModel]=\"comp().validation?.min\"\n (ngModelChange)=\"updateValidation.emit({ key: 'min', value: $event ? +$event : undefined })\"\n />\n </div>\n\n <div class=\"field-row\">\n <label class=\"field-label\">Max Value / Length</label>\n <input\n type=\"number\"\n class=\"field-input\"\n [ngModel]=\"comp().validation?.max\"\n (ngModelChange)=\"updateValidation.emit({ key: 'max', value: $event ? +$event : undefined })\"\n />\n </div>\n\n <div class=\"field-row\">\n <label class=\"field-label\">Pattern (RegEx)</label>\n <input\n type=\"text\"\n class=\"field-input\"\n placeholder=\"e.g. ^[0-9]+$\"\n [ngModel]=\"comp().validation?.pattern\"\n (ngModelChange)=\"updateValidation.emit({ key: 'pattern', value: $event })\"\n />\n </div>\n\n <div class=\"field-row\">\n <label class=\"field-label\">Custom Error Message</label>\n <input\n type=\"text\"\n class=\"field-input\"\n placeholder=\"e.g. Please enter a valid value\"\n [ngModel]=\"comp().validation?.messages?.['required'] || ''\"\n (ngModelChange)=\"onMessageChange($event)\"\n />\n </div>\n </div>\n `,\n})\nexport class PropertyEditorValidationComponent {\n readonly comp = input.required<ReportComponentDefinition>();\n readonly updateValidation = output<{ key: string; value: unknown }>();\n\n onMessageChange(val: string): void {\n const current = this.comp().validation?.messages ?? {};\n this.updateValidation.emit({\n key: 'messages',\n value: { ...current, required: val },\n });\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, input, output } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { GridColumnDefinition, ReportGridDefinition } from '../../../../core/models/report-grid.model';\nimport { RptIconComponent } from '../../../../primitives/components/icon/rpt-icon.component';\n\n@Component({\n selector: 'rpt-property-editor-grid',\n standalone: true,\n imports: [CommonModule, FormsModule, RptIconComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n styleUrls: ['./property-editor.common.css'],\n template: `\n <div class=\"props-form\">\n <div class=\"property-group\">\n <div class=\"group-header-with-btn\">\n <span class=\"group-title\">Columns ({{ columns().length }})</span>\n <button type=\"button\" class=\"btn-add-col\" (click)=\"addColumn.emit()\">\n <rpt-icon name=\"plus\" [size]=\"12\" />\n <span>Add Column</span>\n </button>\n </div>\n\n <div class=\"columns-editor-list\">\n @for (col of columns(); track col.field; let idx = $index) {\n <div class=\"col-edit-card\">\n <div class=\"col-card-header\">\n <div class=\"col-header-title-group\">\n <span class=\"col-drag-dots\">⋮⋮</span>\n <span class=\"col-idx-badge\">#{{ idx + 1 }}</span>\n <input\n type=\"text\"\n class=\"col-title-input\"\n placeholder=\"Column Label\"\n [ngModel]=\"col.label\"\n (ngModelChange)=\"onUpdateCol(idx, 'label', $event)\"\n />\n </div>\n <div class=\"col-card-actions\">\n <span class=\"col-type-pill\">{{ col.dataType || 'string' }}</span>\n <button\n type=\"button\"\n class=\"col-action-btn btn-delete\"\n (click)=\"removeColumn.emit(idx)\"\n title=\"Remove Column\"\n >\n <rpt-icon name=\"trash\" [size]=\"12\" />\n </button>\n </div>\n </div>\n\n <div class=\"col-card-body\">\n <div class=\"col-edit-fields\">\n <div class=\"col-field-item\">\n <span class=\"mini-label\">Field</span>\n <input\n type=\"text\"\n class=\"col-mini-input\"\n placeholder=\"field\"\n [ngModel]=\"col.field\"\n (ngModelChange)=\"onUpdateCol(idx, 'field', $event)\"\n />\n </div>\n <div class=\"col-field-item\">\n <span class=\"mini-label\">Type</span>\n <select\n class=\"col-mini-select\"\n [ngModel]=\"col.dataType || 'string'\"\n (ngModelChange)=\"onUpdateCol(idx, 'dataType', $event)\"\n >\n <option value=\"string\">String</option>\n <option value=\"number\">Number</option>\n <option value=\"currency\">Currency</option>\n <option value=\"date\">Date</option>\n <option value=\"boolean\">Boolean</option>\n </select>\n </div>\n <div class=\"col-field-item\">\n <span class=\"mini-label\">Format</span>\n <input\n type=\"text\"\n class=\"col-mini-input\"\n placeholder=\"e.g. dd/MM/yyyy\"\n [ngModel]=\"col.format\"\n (ngModelChange)=\"onUpdateCol(idx, 'format', $event)\"\n />\n </div>\n <div class=\"col-field-item\">\n <span class=\"mini-label\">Align</span>\n <select\n class=\"col-mini-select\"\n [ngModel]=\"col.align || 'left'\"\n (ngModelChange)=\"onUpdateCol(idx, 'align', $event)\"\n >\n <option value=\"left\">Left</option>\n <option value=\"center\">Center</option>\n <option value=\"right\">Right</option>\n </select>\n </div>\n <div class=\"col-field-item\">\n <span class=\"mini-label\">Aggregate</span>\n <select\n class=\"col-mini-select\"\n [ngModel]=\"col.aggregate || 'none'\"\n (ngModelChange)=\"onUpdateCol(idx, 'aggregate', $event === 'none' ? undefined : $event)\"\n >\n <option value=\"none\">None</option>\n <option value=\"sum\">Sum</option>\n <option value=\"avg\">Average</option>\n <option value=\"count\">Count</option>\n <option value=\"min\">Min</option>\n <option value=\"max\">Max</option>\n </select>\n </div>\n <div class=\"col-field-item\">\n <span class=\"mini-label\">Width</span>\n <input\n type=\"text\"\n class=\"col-mini-input\"\n placeholder=\"auto\"\n [ngModel]=\"col.width || ''\"\n (ngModelChange)=\"onUpdateCol(idx, 'width', $event || undefined)\"\n />\n </div>\n </div>\n\n <div class=\"col-card-footer\">\n <label class=\"col-checkbox-toggle\">\n <input\n type=\"checkbox\"\n [ngModel]=\"col.visible !== false\"\n (ngModelChange)=\"onUpdateCol(idx, 'visible', $event)\"\n />\n <span>Visible</span>\n </label>\n </div>\n </div>\n </div>\n }\n </div>\n </div>\n\n <!-- Grid Table Options Group -->\n <div class=\"property-group\">\n <div class=\"group-title\">Table Options</div>\n\n <div class=\"field-row\">\n <label class=\"checkbox-toggle\">\n <input\n type=\"checkbox\"\n [ngModel]=\"grid()?.options?.pagination ?? true\"\n (ngModelChange)=\"updateOption.emit({ field: 'pagination', value: $event })\"\n />\n <span>Enable Pagination</span>\n </label>\n </div>\n\n <div class=\"field-row\">\n <label class=\"checkbox-toggle\">\n <input\n type=\"checkbox\"\n [ngModel]=\"grid()?.options?.selectable ?? false\"\n (ngModelChange)=\"updateOption.emit({ field: 'selectable', value: $event })\"\n />\n <span>Row Selection</span>\n </label>\n </div>\n\n <div class=\"field-row\">\n <label class=\"checkbox-toggle\">\n <input\n type=\"checkbox\"\n [ngModel]=\"grid()?.options?.allowColumnReorder ?? true\"\n (ngModelChange)=\"updateOption.emit({ field: 'allowColumnReorder', value: $event })\"\n />\n <span>Allow Column Reorder</span>\n </label>\n </div>\n\n <div class=\"field-row\">\n <label class=\"checkbox-toggle\">\n <input\n type=\"checkbox\"\n [ngModel]=\"grid()?.options?.allowExport ?? true\"\n (ngModelChange)=\"updateOption.emit({ field: 'allowExport', value: $event })\"\n />\n <span>Allow Export</span>\n </label>\n </div>\n\n <div class=\"field-row\">\n <label class=\"field-label\">Page Size</label>\n <input\n type=\"number\"\n class=\"field-input\"\n min=\"5\"\n max=\"100\"\n [ngModel]=\"grid()?.options?.pageSize ?? 10\"\n (ngModelChange)=\"updateOption.emit({ field: 'pageSize', value: +$event })\"\n />\n </div>\n\n <div class=\"field-row\">\n <label class=\"checkbox-toggle\">\n <input\n type=\"checkbox\"\n [ngModel]=\"grid()?.options?.showRowNumbers ?? true\"\n (ngModelChange)=\"updateOption.emit({ field: 'showRowNumbers', value: $event })\"\n />\n <span>Show Row Numbers</span>\n </label>\n </div>\n\n <div class=\"field-row\">\n <label class=\"checkbox-toggle\">\n <input\n type=\"checkbox\"\n [ngModel]=\"grid()?.options?.showFooter ?? true\"\n (ngModelChange)=\"updateOption.emit({ field: 'showFooter', value: $event })\"\n />\n <span>Show Footer Totals</span>\n </label>\n </div>\n </div>\n </div>\n `,\n styles: [`\n .props-form {\n display: flex;\n flex-direction: column;\n gap: 20px;\n }\n .group-header-with-btn {\n display: flex;\n align-items: center;\n justify-content: space-between;\n border-bottom: 1px solid var(--rpt-color-border, #e2e8f0);\n padding-bottom: 8px;\n margin-bottom: 4px;\n }\n .btn-add-col {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n background: #eff6ff;\n border: 1px solid #bfdbfe;\n border-radius: 4px;\n padding: 4px 10px;\n font-size: 0.725rem;\n font-weight: 600;\n color: var(--rpt-color-primary, #2563eb);\n cursor: pointer;\n transition: all 150ms ease;\n }\n .btn-add-col:hover {\n background: var(--rpt-color-primary, #2563eb);\n color: #ffffff;\n border-color: var(--rpt-color-primary, #2563eb);\n }\n .columns-editor-list {\n display: flex;\n flex-direction: column;\n gap: 10px;\n }\n .col-edit-card {\n background: #ffffff;\n border: 1.5px solid var(--rpt-color-border, #cbd5e1);\n border-radius: var(--rpt-border-radius, 6px);\n box-shadow: var(--rpt-box-shadow, 0 1px 2px rgba(0, 0, 0, 0.05));\n box-sizing: border-box;\n transition: all var(--rpt-transition-speed, 150ms) ease;\n position: relative;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n }\n .col-edit-card:hover {\n border-color: var(--rpt-color-primary, #2563eb);\n box-shadow: 0 4px 6px -1px rgba(37, 99, 235, 0.1);\n }\n .col-card-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 6px;\n padding: 5px 8px;\n background: var(--rpt-color-surface, #f8fafc);\n border-bottom: 1px solid var(--rpt-color-border, #e2e8f0);\n min-height: 32px;\n box-sizing: border-box;\n }\n .col-header-title-group {\n display: flex;\n align-items: center;\n gap: 5px;\n min-width: 0;\n flex: 1;\n }\n .col-drag-dots {\n color: #94a3b8;\n font-size: 0.8rem;\n cursor: grab;\n user-select: none;\n line-height: 1;\n padding-left: 2px;\n }\n .col-idx-badge {\n font-size: 0.65rem;\n font-weight: 700;\n color: #64748b;\n background: #e2e8f0;\n padding: 1px 5px;\n border-radius: 3px;\n letter-spacing: 0.02em;\n }\n .col-title-input {\n flex: 1;\n border: 1px solid transparent;\n background: transparent;\n font-size: 0.75rem;\n font-weight: 600;\n color: var(--rpt-color-text, #0f172a);\n padding: 2px 6px;\n border-radius: 4px;\n outline: none;\n transition: all 150ms ease;\n }\n .col-title-input:hover {\n border-color: #cbd5e1;\n background: #ffffff;\n }\n .col-title-input:focus {\n border-color: var(--rpt-color-primary, #2563eb);\n background: #ffffff;\n box-shadow: 0 0 0 2px rgba(37, 99, 235, 0.15);\n }\n .col-card-actions {\n display: flex;\n align-items: center;\n gap: 4px;\n }\n .col-type-pill {\n font-size: 0.625rem;\n font-weight: 700;\n color: #1e40af;\n background: #dbeafe;\n border: 1px solid #bfdbfe;\n padding: 1px 5px;\n border-radius: 3px;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n }\n .col-action-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n background: none;\n border: none;\n color: var(--rpt-color-text-muted, #64748b);\n cursor: pointer;\n padding: 3px;\n border-radius: 4px;\n transition: all 150ms ease;\n }\n .col-action-btn.btn-delete:hover {\n color: var(--rpt-color-danger, #ef4444);\n background: #fee2e2;\n }\n .col-card-body {\n padding: 8px 10px;\n display: flex;\n flex-direction: column;\n gap: 6px;\n background: #ffffff;\n }\n .col-edit-fields {\n display: grid;\n grid-template-columns: repeat(3, minmax(0, 1fr));\n gap: 6px 8px;\n }\n .col-field-item {\n display: flex;\n flex-direction: column;\n gap: 2px;\n min-width: 0;\n }\n .mini-label {\n font-size: 0.625rem;\n font-weight: 600;\n color: #64748b;\n letter-spacing: 0.02em;\n }\n .col-mini-input, .col-mini-select {\n width: 100%;\n box-sizing: border-box;\n border: 1px solid var(--rpt-color-border, #cbd5e1);\n border-radius: 3px;\n padding: 3px 5px;\n font-size: 0.7rem;\n color: var(--rpt-color-text, #0f172a);\n background: #ffffff;\n outline: none;\n transition: all 120ms ease;\n }\n .col-mini-select {\n appearance: none;\n -webkit-appearance: none;\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2364748b' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n background-position: right 4px center;\n background-size: 10px 10px;\n padding-right: 16px;\n cursor: pointer;\n }\n .col-mini-input:focus, .col-mini-select:focus {\n border-color: var(--rpt-color-primary, #2563eb);\n box-shadow: 0 0 0 2px rgba(37, 99, 235, 0.15);\n }\n .col-card-footer {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n padding-top: 4px;\n border-top: 1px dashed #e2e8f0;\n margin-top: 2px;\n }\n .col-checkbox-toggle {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n font-size: 0.675rem;\n font-weight: 500;\n color: #475569;\n cursor: pointer;\n user-select: none;\n }\n `],\n})\nexport class PropertyEditorGridComponent {\n readonly grid = input<ReportGridDefinition | undefined>();\n\n readonly addColumn = output<void>();\n readonly removeColumn = output<number>();\n readonly updateColumn = output<{ index: number; field: string; value: unknown }>();\n readonly updateOption = output<{ field: string; value: unknown }>();\n\n readonly columns = computed<GridColumnDefinition[]>(() => {\n return this.grid()?.columns ?? [];\n });\n\n onUpdateCol(index: number, field: string, value: unknown): void {\n this.updateColumn.emit({ index, field, value });\n }\n}\n","import { ChangeDetectionStrategy, Component, input, output } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { ReportDefinition } from '../../../../core/models/report-definition.model';\n\n@Component({\n selector: 'rpt-property-editor-report',\n standalone: true,\n imports: [CommonModule, FormsModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n styleUrls: ['./property-editor.common.css'],\n template: `\n <div class=\"props-form\">\n <div class=\"property-group\">\n <div class=\"group-title\">Report Definition</div>\n\n <div class=\"field-row\">\n <label class=\"field-label\">Report Name</label>\n <input\n type=\"text\"\n class=\"field-input\"\n [ngModel]=\"definition().name\"\n (ngModelChange)=\"updateReport.emit({ field: 'name', value: $event })\"\n />\n </div>\n\n <div class=\"field-row\">\n <label class=\"field-label\">Description</label>\n <textarea\n class=\"field-textarea\"\n rows=\"3\"\n [ngModel]=\"definition().description\"\n (ngModelChange)=\"updateReport.emit({ field: 'description', value: $event })\"\n ></textarea>\n </div>\n </div>\n\n <div class=\"property-group\">\n <div class=\"group-title\">Page Grid Layout</div>\n\n <div class=\"field-row\">\n <label class=\"field-label\">Total Columns</label>\n <select\n class=\"field-select\"\n [ngModel]=\"definition().layout.columns\"\n (ngModelChange)=\"updateLayout.emit({ field: 'columns', value: +$event })\"\n >\n <option [value]=\"12\">12 Columns (Standard)</option>\n <option [value]=\"16\">16 Columns (Dense)</option>\n <option [value]=\"24\">24 Columns (Ultra-wide)</option>\n </select>\n </div>\n\n <div class=\"field-row\">\n <label class=\"field-label\">Cell Gap (px)</label>\n <input\n type=\"number\"\n class=\"field-input\"\n min=\"0\"\n max=\"64\"\n [ngModel]=\"definition().layout.gap ?? 16\"\n (ngModelChange)=\"updateLayout.emit({ field: 'gap', value: +$event })\"\n />\n </div>\n\n <div class=\"field-row\">\n <label class=\"field-label\">Padding (px)</label>\n <input\n type=\"number\"\n class=\"field-input\"\n min=\"0\"\n max=\"64\"\n [ngModel]=\"definition().layout.padding ?? 24\"\n (ngModelChange)=\"updateLayout.emit({ field: 'padding', value: +$event })\"\n />\n </div>\n\n <div class=\"field-row\">\n <label class=\"field-label\">Direction</label>\n <select\n class=\"field-select\"\n [ngModel]=\"definition().layout.direction ?? 'ltr'\"\n (ngModelChange)=\"updateLayout.emit({ field: 'direction', value: $event })\"\n >\n <option value=\"ltr\">Left to Right (LTR)</option>\n <option value=\"rtl\">Right to Left (RTL)</option>\n </select>\n </div>\n </div>\n </div>\n `,\n styles: [`\n .props-form {\n display: flex;\n flex-direction: column;\n gap: 20px;\n }\n `],\n})\nexport class PropertyEditorReportComponent {\n readonly definition = input.required<ReportDefinition>();\n\n readonly updateReport = output<{ field: string; value: unknown }>();\n readonly updateLayout = output<{ field: string; value: unknown }>();\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { ProcedureParameterMetadata } from '../../../../data-access/contracts/schema-discovery.contract';\nimport { ReportComponentDefinition } from '../../../../core/models/report-component.model';\nimport { humanizeIdentifier } from '../../../../core/utils/identifier-humanizer';\nimport { ReportSessionContextService } from '../../../../core/services/report-session-context.service';\nimport { RptIconComponent } from '../../../../primitives/components/icon/rpt-icon.component';\n\nexport type ParameterBindingMode = 'session' | 'control' | 'fixed' | 'context' | 'custom';\n\n@Component({\n selector: 'rpt-parameter-binding-editor',\n standalone: true,\n imports: [CommonModule, FormsModule, RptIconComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"param-card\" [class.session-bound]=\"isAutoSessionDerived()\">\n <div class=\"param-header\">\n <div class=\"param-title-wrap\">\n <span class=\"param-label\">{{ friendlyLabel() }}</span>\n @if (isAdvancedMode()) {\n <span class=\"param-tech-badge\">{{ param().name }} ({{ param().sqlType }})</span>\n } @else {\n <span class=\"param-type-badge\">{{ displayType() }}</span>\n }\n @if (isAutoSessionDerived()) {\n <span class=\"session-auto-badge\">Auto Session</span>\n } @else if (param().required && !hasValue()) {\n <span class=\"required-warn-badge\">Required</span>\n }\n </div>\n\n <!-- Binding Mode Toggle Buttons (Always in Advanced mode, or when not auto session in Simple mode) -->\n @if (isAdvancedMode() || !isAutoSessionDerived()) {\n <div class=\"binding-mode-tabs\">\n @if (sessionMatch()) {\n <button\n type=\"button\"\n class=\"mode-btn\"\n [class.active]=\"activeMode() === 'session'\"\n (click)=\"setMode('session')\"\n title=\"Auto-bound to host session context\"\n >\n <rpt-icon name=\"user\" [size]=\"10\" />\n <span>Session</span>\n </button>\n }\n <button\n type=\"button\"\n class=\"mode-btn\"\n [class.active]=\"activeMode() === 'control'\"\n (click)=\"setMode('control')\"\n title=\"Link value to another field on canvas (e.g. Branch dropdown)\"\n >\n <rpt-icon name=\"link\" [size]=\"10\" />\n <span>Form Field</span>\n </button>\n <button\n type=\"button\"\n class=\"mode-btn\"\n [class.active]=\"activeMode() === 'fixed'\"\n (click)=\"setMode('fixed')\"\n title=\"Use a static fixed value\"\n >\n <rpt-icon name=\"edit\" [size]=\"10\" />\n <span>Fixed</span>\n </button>\n <button\n type=\"button\"\n class=\"mode-btn\"\n [class.active]=\"activeMode() === 'context'\"\n (click)=\"setMode('context')\"\n title=\"Use system context presets (e.g. Today, Month Start)\"\n >\n <rpt-icon name=\"clock\" [size]=\"10\" />\n <span>Preset</span>\n </button>\n @if (isAdvancedMode()) {\n <button\n type=\"button\"\n class=\"mode-btn\"\n [class.active]=\"activeMode() === 'custom'\"\n (click)=\"setMode('custom')\"\n title=\"Manual expression with {{ '{{' }}mustache{{ '}}' }}\"\n >\n <rpt-icon name=\"code\" [size]=\"10\" />\n <span>Expr</span>\n </button>\n }\n </div>\n }\n </div>\n\n <!-- Mode-specific Input Controls -->\n <div class=\"param-body\">\n <!-- 0. AUTO SESSION DERIVED (Simple Mode default or Session mode) -->\n @if (activeMode() === 'session' && sessionMatch()) {\n <div class=\"session-box\">\n <div class=\"session-box-text\">\n <rpt-icon name=\"user\" [size]=\"12\" class=\"session-icon\" />\n <span>\n Derived from <strong>{{ sessionMatch()?.sessionKey }}</strong> ({{ sessionMatch()?.friendlyLabel }})\n </span>\n </div>\n <div class=\"session-val-tag\">\n Current: <strong>{{ sessionMatch()?.value ?? '(none)' }}</strong>\n </div>\n </div>\n }\n\n <!-- 1. FORM CONTROL LINKER -->\n @if (activeMode() === 'control') {\n <div class=\"linker-row\">\n <rpt-icon name=\"link\" [size]=\"12\" class=\"linker-icon\" />\n <select\n class=\"field-select linker-select\"\n [ngModel]=\"selectedControlKey()\"\n (ngModelChange)=\"onControlSelected($event)\"\n >\n <option value=\"\">-- Choose Form Field on Canvas --</option>\n @for (field of compatibleControls(); track field.key || field.id) {\n <option [value]=\"field.key || field.id\">\n {{ field.label || field.key }} ({{ field.type }})\n </option>\n }\n </select>\n </div>\n @if (!selectedControlKey() && compatibleControls().length === 0) {\n <div class=\"empty-hint\">No other controls on canvas. Add a dropdown or input first.</div>\n }\n }\n\n <!-- 2. FIXED VALUE -->\n @if (activeMode() === 'fixed') {\n @switch (param().dataType) {\n @case ('boolean') {\n <label class=\"toggle-switch\">\n <input\n type=\"checkbox\"\n [ngModel]=\"booleanFixedValue()\"\n (ngModelChange)=\"onBooleanChanged($event)\"\n />\n <span class=\"toggle-text\">{{ booleanFixedValue() ? 'Active / Yes' : 'Inactive / No' }}</span>\n </label>\n }\n @case ('number') {\n <input\n type=\"number\"\n class=\"field-input\"\n placeholder=\"Enter number (e.g. 100)\"\n [ngModel]=\"currentValue()\"\n (ngModelChange)=\"onFixedValueChanged($event)\"\n />\n }\n @case ('date') {\n <input\n type=\"date\"\n class=\"field-input\"\n [ngModel]=\"currentValue()\"\n (ngModelChange)=\"onFixedValueChanged($event)\"\n />\n }\n @default {\n <input\n type=\"text\"\n class=\"field-input\"\n placeholder=\"Enter fixed value\"\n [ngModel]=\"currentValue()\"\n (ngModelChange)=\"onFixedValueChanged($event)\"\n />\n }\n }\n }\n\n <!-- 3. SYSTEM CONTEXT -->\n @if (activeMode() === 'context') {\n <select\n class=\"field-select\"\n [ngModel]=\"selectedContextKey()\"\n (ngModelChange)=\"onContextSelected($event)\"\n >\n <option value=\"\">-- Choose System Context Value --</option>\n <option value=\"{{ '{{' }}context.branchId{{ '}}' }}\">Current User's Branch</option>\n <option value=\"{{ '{{' }}context.userId{{ '}}' }}\">Current User ID</option>\n <option value=\"{{ '{{' }}context.tenantId{{ '}}' }}\">Current Company / Tenant</option>\n <option value=\"{{ '{{' }}context.today{{ '}}' }}\">Today's Date</option>\n <option value=\"{{ '{{' }}context.startOfMonth{{ '}}' }}\">First Day of Current Month</option>\n </select>\n }\n\n <!-- 4. CUSTOM EXPRESSION -->\n @if (activeMode() === 'custom') {\n <input\n type=\"text\"\n class=\"field-input monospace-input\"\n placeholder=\"e.g. {{ '{{' }}form.branchField ?? 1{{ '}}' }}\"\n [ngModel]=\"currentValue()\"\n (ngModelChange)=\"onFixedValueChanged($event)\"\n />\n }\n </div>\n\n @if (param().description && isAdvancedMode()) {\n <div class=\"param-desc\">{{ param().description }}</div>\n }\n </div>\n `,\n styles: [`\n .param-card {\n background: #f8fafc;\n border: 1px solid var(--rpt-color-border, #e2e8f0);\n border-radius: 6px;\n padding: 8px 10px;\n display: flex;\n flex-direction: column;\n gap: 6px;\n transition: all 120ms ease;\n }\n .param-card:hover {\n border-color: #cbd5e1;\n }\n .param-card.session-bound {\n background: #f0fdf4;\n border-color: #bbf7d0;\n }\n .param-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n flex-wrap: wrap;\n }\n .param-title-wrap {\n display: flex;\n align-items: center;\n gap: 6px;\n }\n .param-label {\n font-size: 0.76rem;\n font-weight: 600;\n color: #1e293b;\n }\n .param-type-badge {\n font-size: 0.65rem;\n padding: 1px 5px;\n border-radius: 4px;\n background: #e2e8f0;\n color: #475569;\n text-transform: capitalize;\n }\n .session-auto-badge {\n font-size: 0.62rem;\n font-weight: 600;\n padding: 1px 5px;\n border-radius: 4px;\n background: #dcfce7;\n color: #15803d;\n border: 1px solid #bbf7d0;\n }\n .required-warn-badge {\n font-size: 0.62rem;\n font-weight: 600;\n padding: 1px 5px;\n border-radius: 4px;\n background: #fef2f2;\n color: #b91c1c;\n border: 1px solid #fecaca;\n }\n .session-box {\n display: flex;\n align-items: center;\n justify-content: space-between;\n background: #ffffff;\n border: 1px solid #bbf7d0;\n border-radius: 5px;\n padding: 5px 8px;\n gap: 8px;\n }\n .session-box-text {\n display: flex;\n align-items: center;\n gap: 5px;\n font-size: 0.7rem;\n color: #166534;\n }\n .session-icon {\n color: #16a34a;\n }\n .session-val-tag {\n font-size: 0.68rem;\n color: #15803d;\n background: #dcfce7;\n padding: 1px 6px;\n border-radius: 4px;\n }\n .param-tech-badge {\n font-size: 0.65rem;\n font-family: monospace;\n padding: 1px 5px;\n border-radius: 4px;\n background: #eff6ff;\n color: #2563eb;\n }\n .binding-mode-tabs {\n display: inline-flex;\n background: #e2e8f0;\n border-radius: 4px;\n padding: 2px;\n gap: 2px;\n }\n .mode-btn {\n display: inline-flex;\n align-items: center;\n gap: 3px;\n padding: 3px 6px;\n font-size: 0.65rem;\n font-weight: 500;\n background: transparent;\n color: #64748b;\n border: none;\n border-radius: 3px;\n cursor: pointer;\n transition: all 100ms ease;\n }\n .mode-btn:hover {\n color: #0f172a;\n }\n .mode-btn.active {\n background: #ffffff;\n color: var(--rpt-color-primary, #2563eb);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n font-weight: 600;\n }\n .param-body {\n display: flex;\n flex-direction: column;\n gap: 4px;\n }\n .linker-row {\n display: flex;\n align-items: center;\n gap: 6px;\n position: relative;\n }\n .linker-icon {\n color: #2563eb;\n flex-shrink: 0;\n }\n .linker-select {\n flex: 1;\n border-color: #bfdbfe;\n background-color: #eff6ff;\n font-weight: 500;\n color: #1e40af;\n }\n .empty-hint {\n font-size: 0.68rem;\n color: #94a3b8;\n font-style: italic;\n }\n .toggle-switch {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n cursor: pointer;\n font-size: 0.72rem;\n color: #334155;\n }\n .monospace-input {\n font-family: monospace;\n font-size: 0.72rem;\n }\n .param-desc {\n font-size: 0.65rem;\n color: #64748b;\n }\n `],\n})\nexport class ParameterBindingEditorComponent {\n private readonly sessionService = inject(ReportSessionContextService);\n\n readonly param = input.required<ProcedureParameterMetadata>();\n readonly currentValue = input<string | number | boolean>('');\n readonly allComponents = input<ReportComponentDefinition[]>([]);\n readonly currentComponentId = input<string>('');\n readonly isAdvancedMode = input<boolean>(false);\n\n readonly valueChange = output<string | number | boolean>();\n readonly linkedFieldChange = output<{ paramName: string; fieldKey: string; isLinked: boolean }>();\n\n readonly internalMode = signal<ParameterBindingMode | null>(null);\n\n readonly sessionMatch = computed(() => this.sessionService.matchParameter(this.param().name));\n\n readonly friendlyLabel = computed(() => {\n return this.param().friendlyLabel || humanizeIdentifier(this.param().name);\n });\n\n readonly displayType = computed(() => {\n switch (this.param().dataType) {\n case 'boolean':\n return 'Yes / No';\n case 'number':\n return 'Number';\n case 'date':\n return 'Date';\n default:\n return 'Text';\n }\n });\n\n readonly compatibleControls = computed(() => {\n return this.allComponents().filter((c) => c.id !== this.currentComponentId());\n });\n\n readonly hasValue = computed(() => {\n const v = this.currentValue();\n return v !== undefined && v !== null && v !== '';\n });\n\n readonly activeMode = computed<ParameterBindingMode>(() => {\n if (this.internalMode() !== null) {\n return this.internalMode()!;\n }\n\n const val = String(this.currentValue() ?? '');\n\n // If matches session context and has no explicit manual override, default to session\n if (this.sessionMatch() !== null && (!val || val.startsWith('{{session.'))) {\n return 'session';\n }\n\n if (!val) {\n return this.compatibleControls().length > 0 ? 'control' : 'fixed';\n }\n\n if (val.startsWith('{{context.')) {\n return 'context';\n }\n\n if (val.startsWith('{{session.')) {\n return 'session';\n }\n\n if (val.startsWith('{{') && val.endsWith('}}')) {\n const inner = val.slice(2, -2).trim();\n const match = this.compatibleControls().find((c) => (c.key || c.id) === inner);\n if (match) {\n return 'control';\n }\n return 'custom';\n }\n\n const plainMatch = this.compatibleControls().find((c) => (c.key || c.id) === val);\n if (plainMatch) {\n return 'control';\n }\n\n return 'fixed';\n });\n\n readonly isAutoSessionDerived = computed(() => {\n return this.sessionMatch() !== null && this.activeMode() === 'session';\n });\n\n readonly selectedControlKey = computed(() => {\n const val = String(this.currentValue() ?? '');\n if (val.startsWith('{{') && val.endsWith('}}')) {\n return val.slice(2, -2).trim();\n }\n return val;\n });\n\n readonly selectedContextKey = computed(() => {\n const val = String(this.currentValue() ?? '');\n if (val.startsWith('{{context.')) {\n return val;\n }\n return '';\n });\n\n readonly booleanFixedValue = computed(() => {\n const v = this.currentValue();\n return v === true || v === 'true' || v === 1 || v === '1';\n });\n\n setMode(mode: ParameterBindingMode): void {\n this.internalMode.set(mode);\n if (mode === 'session') {\n const match = this.sessionMatch();\n if (match) {\n this.valueChange.emit(`{{session.${match.sessionKey}}}`);\n }\n this.linkedFieldChange.emit({\n paramName: this.param().name,\n fieldKey: '',\n isLinked: false,\n });\n return;\n }\n if (mode === 'fixed') {\n if (this.param().dataType === 'boolean') {\n const def = this.param().defaultValue !== undefined ? Boolean(this.param().defaultValue) : true;\n this.valueChange.emit(def);\n } else {\n this.valueChange.emit('');\n }\n this.linkedFieldChange.emit({\n paramName: this.param().name,\n fieldKey: '',\n isLinked: false,\n });\n }\n }\n\n onControlSelected(key: string): void {\n if (key) {\n const expr = `{{${key}}}`;\n this.valueChange.emit(expr);\n this.linkedFieldChange.emit({\n paramName: this.param().name,\n fieldKey: key,\n isLinked: true,\n });\n } else {\n this.valueChange.emit('');\n this.linkedFieldChange.emit({\n paramName: this.param().name,\n fieldKey: '',\n isLinked: false,\n });\n }\n }\n\n onBooleanChanged(checked: boolean): void {\n this.valueChange.emit(checked);\n this.linkedFieldChange.emit({\n paramName: this.param().name,\n fieldKey: '',\n isLinked: false,\n });\n }\n\n onFixedValueChanged(val: unknown): void {\n this.valueChange.emit(val as string | number);\n this.linkedFieldChange.emit({\n paramName: this.param().name,\n fieldKey: '',\n isLinked: false,\n });\n }\n\n onContextSelected(ctxKey: string): void {\n this.valueChange.emit(ctxKey);\n this.linkedFieldChange.emit({\n paramName: this.param().name,\n fieldKey: '',\n isLinked: false,\n });\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n inject,\n input,\n OnInit,\n output,\n signal,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport {\n ComponentDataSourceDefinition,\n DropdownSourceType,\n ReportComponentDefinition,\n} from '../../../../core/models/report-component.model';\nimport {\n DatabaseEntityMetadata,\n EntityColumnMetadata,\n ProcedureParameterMetadata,\n ReportSchemaDiscoveryAdapter,\n} from '../../../../data-access/contracts/schema-discovery.contract';\nimport {\n detectDefaultDisplayField,\n detectDefaultValueField,\n humanizeIdentifier,\n} from '../../../../core/utils/identifier-humanizer';\nimport { RptIconComponent } from '../../../../primitives/components/icon/rpt-icon.component';\nimport { ParameterBindingEditorComponent } from './parameter-binding-editor.component';\n\nexport interface StaticOptionItem {\n key: string;\n label: string;\n}\n\n@Component({\n selector: 'rpt-property-editor-datasource',\n standalone: true,\n imports: [CommonModule, FormsModule, RptIconComponent, ParameterBindingEditorComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n styleUrls: ['./property-editor.common.css'],\n template: `\n <div class=\"property-group\">\n <!-- 1. Header with Simple / Advanced Mode Toggle -->\n <div class=\"datasource-header-bar\">\n <div class=\"group-title\">Options Data Source</div>\n <div class=\"mode-toggle-pill\">\n <button\n type=\"button\"\n class=\"pill-btn\"\n [class.active]=\"!isAdvancedMode()\"\n (click)=\"isAdvancedMode.set(false)\"\n title=\"Simplified view for business users with friendly names\"\n >\n Simple\n </button>\n <button\n type=\"button\"\n class=\"pill-btn\"\n [class.active]=\"isAdvancedMode()\"\n (click)=\"isAdvancedMode.set(true)\"\n title=\"Technical view with SQL types and expressions\"\n >\n Advanced\n </button>\n </div>\n </div>\n\n <!-- 2. Source Type Segmented Switcher -->\n <div class=\"source-type-switcher\">\n <button\n type=\"button\"\n class=\"source-tab-btn\"\n [class.active]=\"currentSourceType() === 'table'\"\n (click)=\"setSourceType('table')\"\n >\n <rpt-icon name=\"table\" [size]=\"12\" />\n <span>{{ isAdvancedMode() ? 'Table / View' : 'Database Table' }}</span>\n </button>\n <button\n type=\"button\"\n class=\"source-tab-btn\"\n [class.active]=\"currentSourceType() === 'procedure'\"\n (click)=\"setSourceType('procedure')\"\n >\n <rpt-icon name=\"code\" [size]=\"12\" />\n <span>{{ isAdvancedMode() ? 'Stored Proc' : 'Data Query' }}</span>\n </button>\n <button\n type=\"button\"\n class=\"source-tab-btn\"\n [class.active]=\"currentSourceType() === 'static'\"\n (click)=\"setSourceType('static')\"\n >\n <rpt-icon name=\"edit\" [size]=\"12\" />\n <span>Static List</span>\n </button>\n </div>\n\n <!-- 3A. DATABASE TABLE / VIEW CONFIGURATION -->\n @if (currentSourceType() === 'table') {\n <div class=\"field-row\">\n <div class=\"field-label-row\">\n <label class=\"field-label\">\n {{ isAdvancedMode() ? 'Database Table / View' : 'Select Data Source' }}\n </label>\n <button\n type=\"button\"\n class=\"btn-refresh-entities\"\n (click)=\"loadEntities()\"\n title=\"Refresh available tables from backend\"\n >\n <rpt-icon name=\"refresh\" [size]=\"11\" />\n <span>Refresh</span>\n </button>\n </div>\n <select\n class=\"field-select\"\n [ngModel]=\"selectedEntity()\"\n (ngModelChange)=\"onEntitySelected($event)\"\n >\n <option value=\"\">-- Choose Data Table --</option>\n @for (tbl of availableTables(); track tbl.name) {\n <option [value]=\"tbl.name\">\n @if (isAdvancedMode()) {\n {{ tbl.schema }}.{{ tbl.name }} ({{ tbl.type }})\n } @else {\n {{ tbl.displayName }}{{ tbl.category ? ' • ' + tbl.category : '' }}\n }\n </option>\n }\n </select>\n </div>\n\n @if (selectedEntity()) {\n <!-- Display Field (Visible text) -->\n <div class=\"field-row\">\n <div class=\"field-label-row\">\n <label class=\"field-label\">\n {{ isAdvancedMode() ? 'Display Field (Visible Text)' : 'Text Shown in Dropdown' }}\n </label>\n @if (!isAdvancedMode()) {\n <span class=\"auto-badge\" title=\"Auto-detected column for text label\">Auto-detected</span>\n }\n </div>\n <select\n class=\"field-select\"\n [ngModel]=\"selectedDisplayField()\"\n (ngModelChange)=\"onDisplayFieldChanged($event)\"\n >\n <option value=\"\">-- Select Display Column --</option>\n @for (col of entityColumns(); track col.field) {\n <option [value]=\"col.field\">\n {{ col.label }} {{ isAdvancedMode() ? '(' + col.dataType + ')' : '' }}\n </option>\n }\n </select>\n </div>\n\n <!-- Value Field (Stored key) -->\n <div class=\"field-row\">\n <div class=\"field-label-row\">\n <label class=\"field-label\">\n {{ isAdvancedMode() ? 'Value Field (Stored Key)' : 'Internal Value / Key' }}\n </label>\n @if (!isAdvancedMode()) {\n <span class=\"auto-badge\" title=\"Auto-detected column for primary ID\">Auto-detected</span>\n }\n </div>\n <select\n class=\"field-select\"\n [ngModel]=\"selectedValueField()\"\n (ngModelChange)=\"onValueFieldChanged($event)\"\n >\n <option value=\"\">-- Select Key Column --</option>\n @for (col of entityColumns(); track col.field) {\n <option [value]=\"col.field\">\n {{ col.label }} {{ isAdvancedMode() ? '(' + col.dataType + ')' : '' }}\n </option>\n }\n </select>\n </div>\n\n <!-- Cascading Dropdown Dependency -->\n <div class=\"field-row\">\n <label class=\"field-label\">\n {{ isAdvancedMode() ? 'Dependent On (Cascading Parent Field)' : 'Filter by Another Field' }}\n </label>\n <select\n class=\"field-select\"\n [ngModel]=\"selectedDependsOn()\"\n (ngModelChange)=\"onDependsOnChanged($event)\"\n >\n <option value=\"\">-- None (Independent) --</option>\n @for (other of availableParentFields(); track other.key || other.id) {\n <option [value]=\"other.key || other.id\">{{ other.label || other.key }}</option>\n }\n </select>\n <span class=\"field-hint\">\n {{ isAdvancedMode() ? 'Automatically re-queries options when parent field changes.' : 'Only loads options when the selected field changes.' }}\n </span>\n </div>\n }\n }\n\n <!-- 3B. STORED PROCEDURE CONFIGURATION -->\n @if (currentSourceType() === 'procedure') {\n <div class=\"field-row\">\n <div class=\"field-label-row\">\n <label class=\"field-label\">\n {{ isAdvancedMode() ? 'Stored Procedure' : 'Select Data Procedure' }}\n </label>\n <button\n type=\"button\"\n class=\"btn-refresh-entities\"\n (click)=\"loadEntities()\"\n title=\"Refresh available procedures from backend\"\n >\n <rpt-icon name=\"refresh\" [size]=\"11\" />\n <span>Refresh</span>\n </button>\n </div>\n <select\n class=\"field-select\"\n [ngModel]=\"selectedEntity()\"\n (ngModelChange)=\"onEntitySelected($event)\"\n >\n <option value=\"\">-- Choose Data Query / SP --</option>\n @for (sp of availableProcedures(); track sp.name) {\n <option [value]=\"sp.name\">\n @if (isAdvancedMode()) {\n {{ sp.schema }}.{{ sp.name }}\n } @else {\n {{ sp.displayName }}{{ sp.category ? ' • ' + sp.category : '' }}\n }\n </option>\n }\n </select>\n </div>\n\n @if (selectedEntity()) {\n <!-- Visual Parameter Linkers -->\n @if (procedureParameters().length > 0) {\n <div class=\"sp-params-group\">\n <div class=\"params-header-row\">\n <label class=\"field-label\">\n {{ isAdvancedMode() ? 'Procedure Input Parameters' : 'Filter Inputs & Parameters' }}\n </label>\n @if (!isAdvancedMode()) {\n <span class=\"params-hint\">Link to canvas controls or set fixed values</span>\n }\n </div>\n\n @for (param of procedureParameters(); track param.name) {\n <rpt-parameter-binding-editor\n [param]=\"param\"\n [currentValue]=\"getParamValue(param.name)\"\n [allComponents]=\"allComponents()\"\n [currentComponentId]=\"comp().id\"\n [isAdvancedMode]=\"isAdvancedMode()\"\n (valueChange)=\"setParamValue(param.name, $event)\"\n (linkedFieldChange)=\"onParamLinkedFieldChange($event)\"\n />\n }\n </div>\n }\n\n <!-- Display Field (Visible text) -->\n <div class=\"field-row\">\n <div class=\"field-label-row\">\n <label class=\"field-label\">\n {{ isAdvancedMode() ? 'Display Field (from SP result)' : 'Text Shown in Dropdown' }}\n </label>\n @if (!isAdvancedMode()) {\n <span class=\"auto-badge\">Auto-detected</span>\n }\n </div>\n <select\n class=\"field-select\"\n [ngModel]=\"selectedDisplayField()\"\n (ngModelChange)=\"onDisplayFieldChanged($event)\"\n >\n <option value=\"\">-- Select Display Column --</option>\n @for (col of entityColumns(); track col.field) {\n <option [value]=\"col.field\">\n {{ col.label }} {{ isAdvancedMode() ? '(' + col.dataType + ')' : '' }}\n </option>\n }\n </select>\n </div>\n\n <!-- Value Field (Stored key) -->\n <div class=\"field-row\">\n <div class=\"field-label-row\">\n <label class=\"field-label\">\n {{ isAdvancedMode() ? 'Value Field (from SP result)' : 'Internal Value / Key' }}\n </label>\n @if (!isAdvancedMode()) {\n <span class=\"auto-badge\">Auto-detected</span>\n }\n </div>\n <select\n class=\"field-select\"\n [ngModel]=\"selectedValueField()\"\n (ngModelChange)=\"onValueFieldChanged($event)\"\n >\n <option value=\"\">-- Select Key Column --</option>\n @for (col of entityColumns(); track col.field) {\n <option [value]=\"col.field\">\n {{ col.label }} {{ isAdvancedMode() ? '(' + col.dataType + ')' : '' }}\n </option>\n }\n </select>\n </div>\n }\n }\n\n <!-- 3C. STATIC OPTIONS EDITOR -->\n @if (currentSourceType() === 'static') {\n <div class=\"static-options-wrapper\">\n <div class=\"static-options-header\">\n <span class=\"field-label\">Static Options</span>\n <button type=\"button\" class=\"btn-add-option\" (click)=\"addStaticOption()\">\n <rpt-icon name=\"plus\" [size]=\"11\" />\n <span>Add Option</span>\n </button>\n </div>\n\n <div class=\"static-options-list\">\n @for (opt of staticOptions(); track $index) {\n <div class=\"static-option-row\">\n <input\n type=\"text\"\n class=\"field-input opt-key\"\n placeholder=\"Key\"\n [ngModel]=\"opt.key\"\n (ngModelChange)=\"updateStaticOption($index, 'key', $event)\"\n />\n <input\n type=\"text\"\n class=\"field-input opt-label\"\n placeholder=\"Label\"\n [ngModel]=\"opt.label\"\n (ngModelChange)=\"updateStaticOption($index, 'label', $event)\"\n />\n <button\n type=\"button\"\n class=\"btn-remove-option\"\n (click)=\"removeStaticOption($index)\"\n title=\"Remove option\"\n >\n <rpt-icon name=\"trash\" [size]=\"12\" />\n </button>\n </div>\n }\n </div>\n </div>\n }\n </div>\n `,\n styles: [`\n .datasource-header-bar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 8px;\n }\n .mode-toggle-pill {\n display: inline-flex;\n background: #e2e8f0;\n border-radius: 12px;\n padding: 2px;\n gap: 2px;\n }\n .pill-btn {\n border: none;\n background: transparent;\n padding: 2px 8px;\n font-size: 0.65rem;\n font-weight: 500;\n color: #64748b;\n border-radius: 10px;\n cursor: pointer;\n transition: all 120ms ease;\n }\n .pill-btn:hover {\n color: #0f172a;\n }\n .pill-btn.active {\n background: #ffffff;\n color: var(--rpt-color-primary, #2563eb);\n font-weight: 700;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.08);\n }\n .source-type-switcher {\n display: flex;\n background: #f1f5f9;\n border: 1px solid var(--rpt-color-border, #cbd5e1);\n border-radius: 6px;\n padding: 2px;\n gap: 2px;\n margin-bottom: 6px;\n }\n .source-tab-btn {\n flex: 1;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 5px;\n padding: 6px 4px;\n font-size: 0.7rem;\n font-weight: 600;\n color: var(--rpt-color-text-muted, #64748b);\n background: transparent;\n border: none;\n border-radius: 4px;\n cursor: pointer;\n transition: all 120ms ease;\n }\n .source-tab-btn:hover {\n color: var(--rpt-color-text, #0f172a);\n }\n .source-tab-btn.active {\n background: #ffffff;\n color: var(--rpt-color-primary, #2563eb);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n }\n .btn-refresh-entities {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n border: none;\n background: transparent;\n color: var(--rpt-color-primary, #2563eb);\n font-size: 0.65rem;\n font-weight: 600;\n cursor: pointer;\n padding: 0;\n }\n .btn-refresh-entities:hover {\n text-decoration: underline;\n }\n .auto-badge {\n font-size: 0.62rem;\n font-weight: 600;\n background: #dcfce7;\n color: #166534;\n padding: 1px 5px;\n border-radius: 4px;\n }\n .field-hint {\n font-size: 0.65rem;\n color: var(--rpt-color-text-muted, #94a3b8);\n margin-top: 2px;\n }\n .sp-params-group {\n display: flex;\n flex-direction: column;\n gap: 6px;\n background: #f8fafc;\n padding: 8px;\n border-radius: 6px;\n border: 1px solid #e2e8f0;\n margin-bottom: 6px;\n }\n .params-header-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n }\n .params-hint {\n font-size: 0.64rem;\n color: #64748b;\n font-style: italic;\n }\n .static-options-wrapper {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n .static-options-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n }\n .btn-add-option {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n border: 1px solid var(--rpt-color-border, #cbd5e1);\n background: #ffffff;\n border-radius: 4px;\n padding: 3px 8px;\n font-size: 0.65rem;\n font-weight: 600;\n color: var(--rpt-color-primary, #2563eb);\n cursor: pointer;\n transition: all 120ms ease;\n }\n .btn-add-option:hover {\n background: #eff6ff;\n }\n .static-options-list {\n display: flex;\n flex-direction: column;\n gap: 6px;\n }\n .static-option-row {\n display: flex;\n align-items: center;\n gap: 6px;\n }\n .opt-key {\n flex: 1;\n }\n .opt-label {\n flex: 1.5;\n }\n .btn-remove-option {\n width: 24px;\n height: 24px;\n border: none;\n background: transparent;\n color: #94a3b8;\n border-radius: 4px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n flex-shrink: 0;\n padding: 0;\n transition: all 120ms ease;\n }\n .btn-remove-option:hover {\n background: #fee2e2;\n color: #ef4444;\n }\n `],\n})\nexport class PropertyEditorDatasourceComponent implements OnInit {\n private readonly discoveryAdapter = inject(ReportSchemaDiscoveryAdapter, { optional: true });\n\n readonly comp = input.required<ReportComponentDefinition>();\n readonly allComponents = input<ReportComponentDefinition[]>([]);\n\n readonly updateDataSource = output<ComponentDataSourceDefinition>();\n readonly updateProperty = output<{ key: string; value: unknown }>();\n\n readonly isAdvancedMode = signal<boolean>(false);\n readonly allEntities = signal<DatabaseEntityMetadata[]>([]);\n readonly entityColumns = signal<EntityColumnMetadata[]>([]);\n readonly procedureParameters = signal<ProcedureParameterMetadata[]>([]);\n\n readonly currentSourceType = computed<DropdownSourceType>(() => {\n const ds = this.comp().dataSource;\n if (ds?.sourceType) return ds.sourceType;\n if (ds?.entityName) return 'table';\n return 'static';\n });\n\n readonly selectedEntity = computed(() => this.comp().dataSource?.entityName || '');\n readonly selectedValueField = computed(() => this.comp().dataSource?.valueField || '');\n readonly selectedDisplayField = computed(() => this.comp().dataSource?.displayField || '');\n readonly selectedDependsOn = computed(() => this.comp().dataSource?.dependsOn?.[0] || '');\n\n readonly availableTables = computed(() => {\n return this.allEntities()\n .filter((e) => e.type === 'table' || e.type === 'view')\n .map((e) => ({\n ...e,\n displayName: e.friendlyName || humanizeIdentifier(e.name),\n }));\n });\n\n readonly availableProcedures = computed(() => {\n return this.allEntities()\n .filter((e) => e.type === 'stored_procedure')\n .map((e) => ({\n ...e,\n displayName: e.friendlyName || humanizeIdentifier(e.name),\n }));\n });\n\n readonly availableParentFields = computed(() => {\n return this.allComponents().filter((c) => c.id !== this.comp().id);\n });\n\n readonly staticOptions = computed<StaticOptionItem[]>(() => {\n const opts = this.comp().properties?.['options'];\n if (Array.isArray(opts)) {\n return opts.map((o) => ({ key: String(o.key ?? o.value ?? ''), label: String(o.label ?? '') }));\n }\n return [\n { key: '1', label: 'Option 1' },\n { key: '2', label: 'Option 2' },\n ];\n });\n\n constructor() {\n effect(\n () => {\n const entity = this.selectedEntity();\n const type = this.currentSourceType();\n if (entity && (type === 'table' || type === 'procedure')) {\n this.loadEntityDetails(entity, type);\n }\n },\n { allowSignalWrites: true }\n );\n }\n\n ngOnInit(): void {\n this.loadEntities();\n }\n\n loadEntities(): void {\n if (!this.discoveryAdapter) return;\n this.discoveryAdapter.getEntities().subscribe({\n next: (entities) => {\n this.allEntities.set(entities);\n },\n error: (err) => console.error('[PropertyEditorDatasource] Failed to load entities:', err),\n });\n }\n\n loadEntityDetails(entityName: string, type: DropdownSourceType): void {\n if (!this.discoveryAdapter) return;\n\n const dbType = type === 'procedure' ? 'stored_procedure' : 'table';\n this.discoveryAdapter.getColumns(entityName, 'dbo', dbType).subscribe({\n next: (cols) => {\n this.entityColumns.set(cols);\n\n // Auto-detect default valueField and displayField if not yet set\n const currentVal = this.selectedValueField();\n const currentDisp = this.selectedDisplayField();\n const suggestedVal = detectDefaultValueField(cols);\n const suggestedDisp = detectDefaultDisplayField(cols);\n\n if (!currentVal || !currentDisp) {\n this.updateDataSource.emit({\n ...(this.comp().dataSource ?? { displayField: '', valueField: '' }),\n sourceType: type,\n entityName,\n valueField: currentVal || suggestedVal || cols[0]?.field || '',\n displayField: currentDisp || suggestedDisp || cols[1]?.field || cols[0]?.field || '',\n });\n }\n },\n error: (err) => console.error(`[PropertyEditorDatasource] Failed to load columns for ${entityName}:`, err),\n });\n\n if (type === 'procedure') {\n this.discoveryAdapter.getParameters(entityName, 'dbo').subscribe({\n next: (params) => this.procedureParameters.set(params),\n error: (err) => console.error(`[PropertyEditorDatasource] Failed to load params for ${entityName}:`, err),\n });\n }\n }\n\n setSourceType(type: DropdownSourceType): void {\n if (type === 'static') {\n this.updateDataSource.emit({\n sourceType: 'static',\n displayField: '',\n valueField: '',\n });\n return;\n }\n\n const firstEntity = type === 'table' ? this.availableTables()[0]?.name : this.availableProcedures()[0]?.name;\n this.updateDataSource.emit({\n sourceType: type,\n entityName: firstEntity || '',\n schema: 'dbo',\n displayField: '',\n valueField: '',\n });\n }\n\n onEntitySelected(entityName: string): void {\n this.updateDataSource.emit({\n ...(this.comp().dataSource ?? { displayField: '', valueField: '' }),\n sourceType: this.currentSourceType(),\n entityName,\n schema: 'dbo',\n valueField: '',\n displayField: '',\n });\n }\n\n onValueFieldChanged(valueField: string): void {\n this.updateDataSource.emit({\n ...(this.comp().dataSource ?? { displayField: '', valueField: '' }),\n valueField,\n });\n }\n\n onDisplayFieldChanged(displayField: string): void {\n this.updateDataSource.emit({\n ...(this.comp().dataSource ?? { displayField: '', valueField: '' }),\n displayField,\n });\n }\n\n onDependsOnChanged(parentKey: string): void {\n this.updateDataSource.emit({\n ...(this.comp().dataSource ?? { displayField: '', valueField: '' }),\n dependsOn: parentKey ? [parentKey] : [],\n });\n }\n\n getParamValue(paramName: string): string | number | boolean {\n return this.comp().dataSource?.parameterMappings?.[paramName] ?? '';\n }\n\n setParamValue(paramName: string, value: string | number | boolean): void {\n const existing = this.comp().dataSource?.parameterMappings ?? {};\n this.updateDataSource.emit({\n ...(this.comp().dataSource ?? { displayField: '', valueField: '' }),\n parameterMappings: {\n ...existing,\n [paramName]: value,\n },\n });\n }\n\n onParamLinkedFieldChange(evt: { paramName: string; fieldKey: string; isLinked: boolean }): void {\n const currentDependsOn = [...(this.comp().dataSource?.dependsOn ?? [])];\n if (evt.isLinked && evt.fieldKey) {\n if (!currentDependsOn.includes(evt.fieldKey)) {\n currentDependsOn.push(evt.fieldKey);\n this.updateDataSource.emit({\n ...(this.comp().dataSource ?? { displayField: '', valueField: '' }),\n dependsOn: currentDependsOn,\n });\n }\n }\n }\n\n addStaticOption(): void {\n const current = [...this.staticOptions()];\n const nextIdx = current.length + 1;\n current.push({ key: String(nextIdx), label: `Option ${nextIdx}` });\n this.updateProperty.emit({ key: 'options', value: current });\n }\n\n updateStaticOption(index: number, field: 'key' | 'label', val: string): void {\n const current = [...this.staticOptions()];\n if (current[index]) {\n current[index] = { ...current[index], [field]: val };\n this.updateProperty.emit({ key: 'options', value: current });\n }\n }\n\n removeStaticOption(index: number): void {\n const current = this.staticOptions().filter((_, i) => i !== index);\n this.updateProperty.emit({ key: 'options', value: current });\n }\n}\n\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n signal,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { DesignerActiveTab, DesignerStateService } from '../../services/designer-state.service';\nimport { ComponentRegistry } from '../../../../core/registry/component-registry';\nimport { PropertyDefinition } from '../../../../core/registry/property-definition.model';\nimport { ComponentLayoutDefinition } from '../../../../core/models/report-layout.model';\nimport { GridColumnDefinition } from '../../../../core/models/report-grid.model';\nimport { RptIconComponent } from '../../../../primitives/components/icon/rpt-icon.component';\nimport { PropertyEditorGeneralComponent } from './property-editor-general.component';\nimport { PropertyEditorLayoutComponent } from './property-editor-layout.component';\nimport { PropertyEditorValidationComponent } from './property-editor-validation.component';\nimport { PropertyEditorGridComponent } from './property-editor-grid.component';\nimport { PropertyEditorReportComponent } from './property-editor-report.component';\nimport { PropertyEditorDatasourceComponent } from './property-editor-datasource.component';\nimport {\n ComponentDataSourceDefinition,\n ReportComponentDefinition,\n} from '../../../../core/models/report-component.model';\n\n/**\n * Property Editor coordinator component.\n *\n * Decomposed into focused child presentational components per Rule 18 & 19 (Composition Over Giant Components)\n * and Rule 32 (Avoid God Components).\n */\n@Component({\n selector: 'rpt-property-editor',\n standalone: true,\n imports: [\n CommonModule,\n RptIconComponent,\n PropertyEditorGeneralComponent,\n PropertyEditorLayoutComponent,\n PropertyEditorValidationComponent,\n PropertyEditorGridComponent,\n PropertyEditorReportComponent,\n PropertyEditorDatasourceComponent,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"editor-container\">\n <!-- Editor Header & Tabs -->\n <div class=\"editor-tabs\">\n <button\n type=\"button\"\n class=\"tab-btn\"\n [class.active]=\"activeTab() === 'properties'\"\n (click)=\"setTab('properties')\"\n [disabled]=\"!selectedComponent()\"\n >\n <rpt-icon name=\"edit\" [size]=\"13\" />\n <span>Properties</span>\n </button>\n <button\n type=\"button\"\n class=\"tab-btn\"\n [class.active]=\"activeTab() === 'report'\"\n (click)=\"setTab('report')\"\n >\n <rpt-icon name=\"design\" [size]=\"13\" />\n <span>Layout</span>\n </button>\n <button\n type=\"button\"\n class=\"tab-btn\"\n [class.active]=\"activeTab() === 'grid'\"\n (click)=\"setTab('grid')\"\n >\n <rpt-icon name=\"table\" [size]=\"13\" />\n <span>Grid</span>\n </button>\n </div>\n\n <!-- Editor Body -->\n <div class=\"editor-body\">\n <!-- 1. COMPONENT PROPERTIES TAB -->\n @if (activeTab() === 'properties') {\n @if (selectedComponent(); as comp) {\n <div class=\"component-sections-wrapper\">\n <!-- Component Identifier Header (Pinned at Top) -->\n <div class=\"comp-badge-header\">\n <div class=\"badge-title\">\n <span class=\"badge-type\">{{ comp.type }}</span>\n <span class=\"badge-id\">{{ comp.id }}</span>\n </div>\n <button type=\"button\" class=\"btn-deselect\" (click)=\"deselect()\" title=\"Deselect component\">\n <rpt-icon name=\"close\" [size]=\"13\" />\n </button>\n </div>\n\n <!-- Accordion Container -->\n <div class=\"property-accordion\">\n <!-- 1. OPTIONS DATA SOURCE ACCORDION (FIRST for Dropdown) -->\n @if (comp.type === 'dropdown') {\n <div class=\"accordion-item\" [class.is-expanded]=\"isSectionExpanded('datasource')\">\n <button\n type=\"button\"\n class=\"accordion-header\"\n (click)=\"toggleSection('datasource')\"\n title=\"Toggle Options Data Source section\"\n >\n <div class=\"header-left\">\n <rpt-icon name=\"database\" [size]=\"14\" />\n <span class=\"header-title\">Options Data Source</span>\n <span class=\"header-badge\">{{ getDatasourceBadge(comp) }}</span>\n </div>\n <div class=\"header-right\">\n <rpt-icon name=\"chevron-down\" [size]=\"13\" class=\"accordion-chevron\" />\n </div>\n </button>\n @if (isSectionExpanded('datasource')) {\n <div class=\"accordion-content\">\n <rpt-property-editor-datasource\n [comp]=\"comp\"\n [allComponents]=\"allComponents()\"\n (updateDataSource)=\"updateCompDataSource(comp.id, $event)\"\n (updateProperty)=\"updateProp(comp.id, $event.key, $event.value)\"\n />\n </div>\n }\n </div>\n }\n\n <!-- 2. GENERAL PROPERTIES ACCORDION -->\n <div class=\"accordion-item\" [class.is-expanded]=\"isSectionExpanded('general')\">\n <button\n type=\"button\"\n class=\"accordion-header\"\n (click)=\"toggleSection('general')\"\n title=\"Toggle General Properties section\"\n >\n <div class=\"header-left\">\n <rpt-icon name=\"edit\" [size]=\"14\" />\n <span class=\"header-title\">General Properties</span>\n @if (comp.label) {\n <span class=\"header-badge\">{{ comp.label }}</span>\n }\n </div>\n <div class=\"header-right\">\n <rpt-icon name=\"chevron-down\" [size]=\"13\" class=\"accordion-chevron\" />\n </div>\n </button>\n @if (isSectionExpanded('general')) {\n <div class=\"accordion-content\">\n <rpt-property-editor-general\n [comp]=\"comp\"\n [propertySchema]=\"propertySchema()\"\n (update)=\"updateComp($event.field, $event.value)\"\n (updateProperty)=\"updateProp(comp.id, $event.key, $event.value)\"\n (deselect)=\"deselect()\"\n />\n </div>\n }\n </div>\n\n <!-- 3. LAYOUT & GRID ACCORDION -->\n <div class=\"accordion-item\" [class.is-expanded]=\"isSectionExpanded('layout')\">\n <button\n type=\"button\"\n class=\"accordion-header\"\n (click)=\"toggleSection('layout')\"\n title=\"Toggle Layout & Dimensions section\"\n >\n <div class=\"header-left\">\n <rpt-icon name=\"design\" [size]=\"14\" />\n <span class=\"header-title\">Layout & Grid</span>\n <span class=\"header-badge\">{{ getLayoutBadge(comp) }}</span>\n </div>\n <div class=\"header-right\">\n <rpt-icon name=\"chevron-down\" [size]=\"13\" class=\"accordion-chevron\" />\n </div>\n </button>\n @if (isSectionExpanded('layout')) {\n <div class=\"accordion-content\">\n <rpt-property-editor-layout\n [comp]=\"comp\"\n [maxColumns]=\"maxColumns()\"\n (updateLayout)=\"updateLayout($event.key, $event.value)\"\n (updateHeight)=\"updateComponentHeight($event)\"\n (resetDimensions)=\"resetComponentDimensions(comp.id, comp.type)\"\n />\n </div>\n }\n </div>\n\n <!-- 4. VALIDATION ACCORDION -->\n <div class=\"accordion-item\" [class.is-expanded]=\"isSectionExpanded('validation')\">\n <button\n type=\"button\"\n class=\"accordion-header\"\n (click)=\"toggleSection('validation')\"\n title=\"Toggle Validation Rules section\"\n >\n <div class=\"header-left\">\n <rpt-icon name=\"check\" [size]=\"14\" />\n <span class=\"header-title\">Validation Rules</span>\n <span class=\"header-badge\">{{ getValidationBadge(comp) }}</span>\n </div>\n <div class=\"header-right\">\n <rpt-icon name=\"chevron-down\" [size]=\"13\" class=\"accordion-chevron\" />\n </div>\n </button>\n @if (isSectionExpanded('validation')) {\n <div class=\"accordion-content\">\n <rpt-property-editor-validation\n [comp]=\"comp\"\n (updateValidation)=\"updateValidation($event.key, $event.value)\"\n />\n </div>\n }\n </div>\n </div>\n </div>\n } @else {\n <div class=\"empty-selection\">\n <div class=\"empty-icon-wrap\">\n <rpt-icon name=\"cursor\" [size]=\"24\" color=\"#64748b\" />\n </div>\n <p class=\"empty-text\">Select a component on the canvas to configure its properties.</p>\n </div>\n }\n }\n\n <!-- 2. REPORT SETTINGS TAB -->\n @if (activeTab() === 'report') {\n <rpt-property-editor-report\n [definition]=\"definition()\"\n (updateReport)=\"updateReport($event.field, $event.value)\"\n (updateLayout)=\"updateLayoutProp($event.field, $event.value)\"\n />\n }\n\n <!-- 3. RESULT GRID SETTINGS TAB -->\n @if (activeTab() === 'grid') {\n <rpt-property-editor-grid\n [grid]=\"definition().grid\"\n (addColumn)=\"addColumn()\"\n (removeColumn)=\"removeColumn($event)\"\n (updateColumn)=\"updateColumn($event.index, $event.field, $event.value)\"\n (updateOption)=\"updateGridOption($event.field, $event.value)\"\n />\n }\n </div>\n </div>\n `,\n styles: [`\n :host {\n display: block;\n height: 100%;\n background: #ffffff;\n border-left: 1px solid var(--rpt-color-border, #cbd5e1);\n box-sizing: border-box;\n font-family: var(--rpt-font-family, inherit);\n }\n .editor-container {\n display: flex;\n flex-direction: column;\n height: 100%;\n }\n .editor-tabs {\n display: flex;\n flex-shrink: 0;\n border-bottom: 1px solid var(--rpt-color-border, #cbd5e1);\n background: var(--rpt-color-surface, #f8fafc);\n }\n .tab-btn {\n flex: 1;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n padding: 12px 8px;\n font-size: var(--rpt-font-size-sm, 0.75rem);\n font-weight: 600;\n color: var(--rpt-color-text-muted, #64748b);\n background: transparent;\n border: none;\n border-bottom: 2px solid transparent;\n cursor: pointer;\n transition: all var(--rpt-transition-speed, 150ms) ease;\n }\n .tab-btn:hover:not(:disabled) {\n color: var(--rpt-color-text, #0f172a);\n }\n .tab-btn.active {\n color: var(--rpt-color-primary, #2563eb);\n border-bottom-color: var(--rpt-color-primary, #2563eb);\n background: #ffffff;\n }\n .tab-btn:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n }\n .editor-body {\n flex: 1;\n overflow-y: auto;\n padding: 12px 14px;\n }\n .component-sections-wrapper {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n .comp-badge-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 8px 12px;\n background: var(--rpt-color-surface, #f8fafc);\n border-radius: 6px;\n border: 1px solid var(--rpt-color-border, #e2e8f0);\n }\n .badge-title {\n display: flex;\n align-items: center;\n }\n .badge-type {\n font-size: 0.75rem;\n font-weight: 700;\n color: var(--rpt-color-primary, #2563eb);\n text-transform: uppercase;\n margin-right: 8px;\n }\n .badge-id {\n font-size: 0.7rem;\n color: var(--rpt-color-text-muted, #94a3b8);\n font-family: monospace;\n }\n .btn-deselect {\n background: none;\n border: none;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--rpt-color-text-muted, #64748b);\n cursor: pointer;\n padding: 3px;\n border-radius: 4px;\n transition: all 150ms ease;\n }\n .btn-deselect:hover {\n color: var(--rpt-color-danger, #ef4444);\n background: #fee2e2;\n }\n .property-accordion {\n display: flex;\n flex-direction: column;\n gap: 10px;\n }\n .accordion-item {\n border: 1px solid var(--rpt-color-border, #e2e8f0);\n border-radius: 6px;\n background: #ffffff;\n overflow: hidden;\n transition: all 150ms ease;\n }\n .accordion-item.is-expanded {\n border-color: #cbd5e1;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.04);\n }\n .accordion-header {\n width: 100%;\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 10px 12px;\n background: var(--rpt-color-surface, #f8fafc);\n border: none;\n cursor: pointer;\n text-align: left;\n user-select: none;\n transition: background 150ms ease;\n }\n .accordion-header:hover {\n background: #f1f5f9;\n }\n .accordion-item.is-expanded .accordion-header {\n background: #f8fafc;\n border-bottom: 1px solid var(--rpt-color-border, #e2e8f0);\n }\n .header-left {\n display: flex;\n align-items: center;\n gap: 8px;\n min-width: 0;\n flex: 1;\n }\n .header-title {\n font-size: 0.72rem;\n font-weight: 700;\n color: var(--rpt-color-text, #0f172a);\n text-transform: uppercase;\n letter-spacing: 0.03em;\n white-space: nowrap;\n }\n .header-badge {\n font-size: 0.65rem;\n font-weight: 600;\n color: var(--rpt-color-primary, #2563eb);\n background: #eff6ff;\n border: 1px solid #bfdbfe;\n padding: 1px 6px;\n border-radius: 9999px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n max-width: 120px;\n }\n .header-right {\n display: flex;\n align-items: center;\n color: var(--rpt-color-text-muted, #64748b);\n margin-left: 8px;\n }\n .accordion-chevron {\n transition: transform 200ms ease;\n }\n .accordion-item.is-expanded .accordion-chevron {\n transform: rotate(180deg);\n }\n .accordion-content {\n padding: 12px;\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n ::ng-deep .accordion-content .group-title {\n display: none;\n }\n ::ng-deep .accordion-content .comp-badge-header {\n display: none;\n }\n .empty-selection {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 60px 20px;\n text-align: center;\n box-sizing: border-box;\n }\n .empty-icon-wrap {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 52px;\n height: 52px;\n border-radius: 50%;\n background: #f1f5f9;\n margin-bottom: 16px;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.04);\n }\n .empty-text {\n font-size: 0.8125rem;\n line-height: 1.5;\n max-width: 220px;\n margin: 0;\n color: var(--rpt-color-text-muted, #64748b);\n }\n `],\n})\nexport class PropertyEditorComponent {\n private readonly designerState = inject(DesignerStateService);\n private readonly registry = inject(ComponentRegistry);\n\n readonly definition = this.designerState.definition;\n readonly activeTab = this.designerState.activeTab;\n readonly selectedComponent = this.designerState.selectedComponent;\n\n readonly maxColumns = computed(() => this.definition().layout.columns || 12);\n readonly allComponents = computed(() => this.definition().components);\n\n readonly propertySchema = computed<PropertyDefinition[]>(() => {\n const comp = this.selectedComponent();\n if (!comp) return [];\n const meta = this.registry.resolve(comp.type);\n return meta?.propertySchema ?? [];\n });\n\n setTab(tab: DesignerActiveTab): void {\n this.designerState.setActiveTab(tab);\n }\n\n updateCompDataSource(id: string, dataSource: ComponentDataSourceDefinition): void {\n this.designerState.updateComponent(id, { dataSource });\n }\n\n deselect(): void {\n this.designerState.selectComponent(null);\n }\n\n updateComp(field: string, value: unknown): void {\n const comp = this.selectedComponent();\n if (comp) {\n this.designerState.updateComponent(comp.id, { [field]: value });\n }\n }\n\n updateProp(id: string, key: string, value: unknown): void {\n this.designerState.updateComponentProperty(id, key, value);\n }\n\n updateLayout(key: keyof ComponentLayoutDefinition, value: unknown): void {\n const comp = this.selectedComponent();\n if (comp) {\n this.designerState.updateComponentLayout(comp.id, { [key]: value });\n }\n }\n\n updateComponentHeight(val: string): void {\n const comp = this.selectedComponent();\n if (!comp) return;\n const height = !val || val === 'auto' || !val.trim() ? undefined : val.trim();\n this.designerState.updateComponentLayout(comp.id, {\n height,\n minHeight: height,\n });\n }\n\n resetComponentDimensions(id: string, type: string): void {\n const defaultSpan = type === 'button' ? 2 : 4;\n this.designerState.updateComponentLayout(id, {\n columnSpan: defaultSpan,\n height: undefined,\n minHeight: undefined,\n width: undefined,\n });\n }\n\n updateValidation(key: string, value: unknown): void {\n const comp = this.selectedComponent();\n if (comp) {\n const nextValidation = { ...(comp.validation ?? {}), [key]: value };\n this.designerState.updateComponent(comp.id, { validation: nextValidation });\n }\n }\n\n updateReport(key: string, value: unknown): void {\n this.designerState.updateReportSettings({ [key]: value });\n }\n\n updateLayoutProp(key: string, value: unknown): void {\n const currentLayout = this.definition().layout;\n this.designerState.updateReportSettings({\n layout: { ...currentLayout, [key]: value },\n });\n }\n\n addColumn(): void {\n const current = this.definition().grid ?? {\n dataSourceId: 'default',\n columns: [],\n };\n const colCount = current.columns.length + 1;\n const newCol: GridColumnDefinition = {\n field: `field_${colCount}`,\n label: `Column ${colCount}`,\n dataType: 'string',\n sortable: true,\n align: 'left',\n };\n this.designerState.updateGridSettings({\n ...current,\n columns: [...current.columns, newCol],\n });\n }\n\n removeColumn(index: number): void {\n const current = this.definition().grid;\n if (!current) return;\n const nextCols = [...current.columns];\n nextCols.splice(index, 1);\n this.designerState.updateGridSettings({\n ...current,\n columns: nextCols,\n });\n }\n\n updateColumn(index: number, field: string, value: unknown): void {\n const current = this.definition().grid;\n if (!current) return;\n const nextCols = current.columns.map((c, idx) => {\n if (idx === index) {\n return { ...c, [field]: value };\n }\n return c;\n });\n this.designerState.updateGridSettings({\n ...current,\n columns: nextCols,\n });\n }\n\n updateGridOption(field: string, value: unknown): void {\n const current = this.definition().grid ?? {\n dataSourceId: 'default',\n columns: [],\n };\n const nextOptions = { ...(current.options ?? {}), [field]: value };\n this.designerState.updateGridSettings({\n ...current,\n options: nextOptions,\n });\n }\n\n readonly expandedSections = signal<Record<string, boolean>>({\n datasource: true,\n general: true,\n layout: false,\n validation: false,\n });\n\n toggleSection(section: string): void {\n this.expandedSections.update((prev) => ({\n ...prev,\n [section]: !prev[section],\n }));\n }\n\n isSectionExpanded(section: string): boolean {\n return !!this.expandedSections()[section];\n }\n\n getDatasourceBadge(comp: ReportComponentDefinition): string {\n const ds = comp.dataSource;\n if (!ds || ds.sourceType === 'static') return 'Static List';\n if (ds.sourceType === 'table' || ds.entityName) {\n return ds.entityName ? `Table: ${ds.entityName}` : 'Table / View';\n }\n if (ds.sourceType === 'procedure') {\n return ds.entityName ? `SP: ${ds.entityName}` : 'Stored Proc';\n }\n return 'Static List';\n }\n\n getLayoutBadge(comp: ReportComponentDefinition): string {\n const span = comp.layout?.columnSpan || (comp.type === 'button' ? 2 : 4);\n return `${span}/${this.maxColumns()} cols`;\n }\n\n getValidationBadge(comp: ReportComponentDefinition): string {\n return comp.validation?.required ? 'Required' : 'Optional';\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n inject,\n input,\n OnInit,\n output,\n signal,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { ReportDefinition } from '../../core/models/report-definition.model';\nimport { ReportPersistenceAdapter } from '../../data-access/contracts/report-persistence.contract';\nimport { ReportDataSourceAdapter } from '../../data-access/contracts/data-source.contract';\nimport { ReportSessionContextService } from '../../core/services/report-session-context.service';\nimport { DesignerStateService } from './services/designer-state.service';\nimport { DesignerToolbarComponent } from './components/toolbar/designer-toolbar.component';\nimport { ComponentPaletteComponent } from './components/component-palette/component-palette.component';\nimport { DesignCanvasComponent } from './components/design-canvas/design-canvas.component';\nimport { PropertyEditorComponent } from './components/property-editor/property-editor.component';\nimport { DynamicRendererComponent } from '../runtime/dynamic-renderer.component';\nimport { RptIconComponent } from '../../primitives/components/icon/rpt-icon.component';\n\nimport { DragDropModule } from '@angular/cdk/drag-drop';\n\n@Component({\n selector: 'rpt-designer',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n DragDropModule,\n DesignerToolbarComponent,\n ComponentPaletteComponent,\n DesignCanvasComponent,\n PropertyEditorComponent,\n DynamicRendererComponent,\n RptIconComponent,\n ],\n providers: [DesignerStateService],\n template: `\n <div class=\"designer-shell\">\n <!-- Top Actions Toolbar -->\n <rpt-designer-toolbar (saveRequested)=\"onSave()\" />\n\n <!-- Main 3-Panel Layout with CDK Drop List Group connecting Palette & Canvas -->\n <div class=\"designer-workbench\" cdkDropListGroup>\n <!-- 1. Left Panel: Component Palette (only shown in design mode) -->\n @if (viewMode() === 'design') {\n <aside class=\"workbench-left-panel\">\n <rpt-component-palette />\n </aside>\n }\n\n <!-- 2. Center Panel: Design Canvas OR Live Preview OR JSON Schema -->\n <section class=\"workbench-center-panel\">\n @switch (viewMode()) {\n @case ('design') {\n <rpt-design-canvas />\n }\n @case ('preview') {\n <div class=\"preview-mode-container\">\n <div class=\"preview-banner\">\n <rpt-icon name=\"eye\" [size]=\"15\" />\n <span>Live Preview Mode — Running with actual Reactive Forms & Dynamic Grid</span>\n </div>\n <div class=\"preview-content\">\n <rpt-dynamic-renderer\n [definition]=\"currentDefinition()\"\n [resultData]=\"previewData()\"\n (executeRequested)=\"onPreviewExecute($event)\"\n />\n </div>\n </div>\n }\n @case ('json') {\n <div class=\"json-mode-container\">\n <div class=\"json-banner\">\n <div style=\"display: flex; align-items: center; gap: 8px;\">\n <rpt-icon name=\"code\" [size]=\"15\" />\n <span>Live ReportDefinition Metadata Schema</span>\n </div>\n <button type=\"button\" class=\"btn-copy-json\" (click)=\"copyJson()\">\n <rpt-icon [name]=\"copyStatus() === 'Copied!' ? 'check' : 'copy'\" [size]=\"13\" />\n <span>{{ copyStatus() }}</span>\n </button>\n </div>\n <pre class=\"json-display\"><code>{{ formattedJson() }}</code></pre>\n </div>\n }\n }\n </section>\n\n <!-- 3. Right Panel: Property Editor (only shown in design mode) -->\n @if (viewMode() === 'design') {\n <aside class=\"workbench-right-panel\">\n <rpt-property-editor />\n </aside>\n }\n </div>\n\n <!-- Save Notification Toast -->\n @if (saveMessage()) {\n <div class=\"save-toast\">\n <rpt-icon name=\"check\" [size]=\"14\" />\n <span>{{ saveMessage() }}</span>\n </div>\n }\n </div>\n `,\n\n styles: [`\n :host {\n display: block;\n width: 100%;\n height: 100%;\n min-height: 600px;\n font-family: var(--rpt-font-family, inherit);\n box-sizing: border-box;\n }\n .designer-shell {\n display: flex;\n flex-direction: column;\n height: 100%;\n background-color: #f8fafc;\n position: relative;\n }\n .designer-workbench {\n display: flex;\n flex: 1;\n overflow: hidden;\n position: relative;\n }\n .workbench-left-panel {\n width: 250px;\n flex-shrink: 0;\n height: 100%;\n overflow: hidden;\n z-index: 10;\n }\n .workbench-center-panel {\n flex: 1;\n height: 100%;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n min-width: 0;\n }\n .workbench-right-panel {\n width: 320px;\n flex-shrink: 0;\n height: 100%;\n overflow: hidden;\n z-index: 10;\n }\n /* Preview Mode */\n .preview-mode-container {\n flex: 1;\n overflow-y: auto;\n padding: 16px;\n background-color: #f1f5f9;\n box-sizing: border-box;\n }\n .preview-banner {\n max-width: 1400px;\n margin: 0 auto 16px auto;\n background: linear-gradient(135deg, #1e293b, #0f172a);\n color: #38bdf8;\n padding: 10px 18px;\n border-radius: 8px;\n font-size: 0.8rem;\n font-weight: 600;\n display: flex;\n align-items: center;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.08);\n box-sizing: border-box;\n }\n .preview-content {\n max-width: 1400px;\n margin: 0 auto;\n background: #ffffff;\n border-radius: var(--rpt-border-radius-lg, 8px);\n border: 1px solid var(--rpt-color-border, #cbd5e1);\n box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.05);\n padding: 0;\n min-height: 480px;\n box-sizing: border-box;\n }\n /* JSON Schema Mode */\n .json-mode-container {\n flex: 1;\n overflow-y: auto;\n padding: 24px;\n background-color: #0f172a;\n display: flex;\n flex-direction: column;\n }\n .json-banner {\n display: flex;\n align-items: center;\n justify-content: space-between;\n color: #94a3b8;\n font-size: 0.8rem;\n font-weight: 600;\n margin-bottom: 16px;\n padding-bottom: 12px;\n border-bottom: 1px solid #1e293b;\n }\n .btn-copy-json {\n background: rgba(255, 255, 255, 0.1);\n color: #ffffff;\n border: 1px solid rgba(255, 255, 255, 0.2);\n border-radius: 4px;\n padding: 4px 12px;\n font-size: 0.75rem;\n cursor: pointer;\n transition: all 150ms ease;\n }\n .btn-copy-json:hover {\n background: rgba(255, 255, 255, 0.2);\n }\n .json-display {\n flex: 1;\n margin: 0;\n padding: 20px;\n background: #090d16;\n border-radius: 8px;\n border: 1px solid #1e293b;\n color: #38bdf8;\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;\n font-size: 0.85rem;\n line-height: 1.5;\n overflow-x: auto;\n }\n /* Save Toast Notification */\n .save-toast {\n position: absolute;\n bottom: 24px;\n right: 24px;\n background: #10b981;\n color: #ffffff;\n padding: 10px 20px;\n border-radius: 6px;\n font-size: 0.85rem;\n font-weight: 600;\n box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1);\n z-index: 100;\n animation: rpt-fade-in 200ms ease;\n }\n @keyframes rpt-fade-in {\n from { opacity: 0; transform: translateY(10px); }\n to { opacity: 1; transform: translateY(0); }\n }\n `],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class DesignerComponent implements OnInit {\n readonly designerState = inject(DesignerStateService);\n private readonly persistenceAdapter = inject(ReportPersistenceAdapter, { optional: true });\n private readonly dataSourceAdapter = inject(ReportDataSourceAdapter, { optional: true });\n private readonly sessionService = inject(ReportSessionContextService, { optional: true });\n\n /** Optional reportId to load from persistence adapter */\n readonly reportId = input<string>();\n\n /** Optional definition to load directly */\n readonly definition = input<ReportDefinition | null | undefined>(undefined, { alias: 'initialReport' });\n\n /** Emitted when the user saves the report */\n readonly reportSaved = output<ReportDefinition>({ alias: 'save' });\n\n /** Emitted whenever the report definition changes in the visual designer */\n readonly definitionChanged = output<ReportDefinition>({ alias: 'definitionChange' });\n\n readonly currentDefinition = this.designerState.definition;\n readonly viewMode = this.designerState.viewMode;\n\n readonly previewData = signal<unknown[] | null>(null);\n readonly saveMessage = signal<string | null>(null);\n readonly copyStatus = signal<string>('Copy JSON');\n\n readonly formattedJson = computed(() => {\n return JSON.stringify(this.currentDefinition(), null, 2);\n });\n\n private loadedReportId: string | null = null;\n\n constructor() {\n effect(\n () => {\n const def = this.definition();\n if (def && def.id !== this.loadedReportId) {\n this.loadedReportId = def.id;\n this.designerState.loadDefinition(def);\n }\n },\n { allowSignalWrites: true }\n );\n\n effect(\n () => {\n const id = this.reportId();\n if (id && id !== this.loadedReportId && !this.definition() && this.persistenceAdapter) {\n this.loadedReportId = id;\n this.persistenceAdapter.load(id).subscribe((def) => {\n this.designerState.loadDefinition(def);\n });\n }\n },\n { allowSignalWrites: true }\n );\n\n effect(() => {\n const current = this.designerState.definition();\n if (this.designerState.isDirty()) {\n this.definitionChanged.emit(current);\n }\n });\n }\n\n\n ngOnInit(): void {\n if (!this.definition() && !this.reportId()) {\n // Start with a clean report definition\n this.designerState.loadDefinition({\n id: `rpt-${Math.random().toString(36).substring(2, 8)}`,\n name: 'New Custom Report',\n description: 'Visually designed reporting page created with BWays-Report.',\n schemaVersion: 1,\n version: 1,\n layout: { columns: 12, gap: 16, padding: 24, direction: 'ltr' },\n components: [],\n parameters: [],\n dataSources: [],\n });\n }\n }\n\n onSave(): void {\n const current = this.currentDefinition();\n if (this.persistenceAdapter) {\n this.persistenceAdapter.save(current).subscribe({\n next: (savedDef) => {\n this.designerState.markSaved();\n this.reportSaved.emit(savedDef);\n this.showToast('Report saved successfully');\n },\n error: (err) => {\n console.error('[Designer] Save failed:', err);\n this.showToast('Failed to save report');\n },\n });\n } else {\n this.designerState.markSaved();\n this.reportSaved.emit(current);\n this.showToast('Report state saved');\n }\n }\n\n onPreviewExecute(event: {\n definition: ReportDefinition;\n parameters: Record<string, unknown>;\n }): void {\n const grid = event.definition.grid;\n if (!grid) return;\n\n const ds = event.definition.dataSources.find((d) => d.id === grid.dataSourceId);\n if (!ds || !this.dataSourceAdapter) return;\n\n const session = this.sessionService?.getCurrentSessionContext() ?? {};\n const executionParams = { ...session, ...event.parameters };\n\n this.dataSourceAdapter.execute(ds, executionParams).subscribe({\n next: (data) => {\n this.previewData.set(data);\n },\n error: (err) => {\n console.error('[Designer Preview] Execution failed:', err);\n },\n });\n }\n\n copyJson(): void {\n if (navigator.clipboard) {\n navigator.clipboard.writeText(this.formattedJson()).then(() => {\n this.copyStatus.set('Copied!');\n setTimeout(() => this.copyStatus.set('Copy JSON'), 2000);\n });\n }\n }\n\n private showToast(message: string): void {\n this.saveMessage.set(message);\n setTimeout(() => this.saveMessage.set(null), 3000);\n }\n}\n","import { Injectable } from '@angular/core';\nimport { ReportDefinition } from '../../../core/models/report-definition.model';\nimport { ReportDefinitionError } from '../../../core/errors/reporting-errors';\n\nexport interface SchemaValidationResult {\n valid: boolean;\n errors: string[];\n warnings: string[];\n}\n\n/**\n * Pure function that validates the integrity and constraints of a ReportDefinition.\n *\n * Checks:\n * - ID and Name presence\n * - Unique component IDs\n * - Unique parameter/input keys\n * - Grid data source references\n * - Column span boundary violations\n */\nexport function validateReportSchema(definition: ReportDefinition): SchemaValidationResult {\n const errors: string[] = [];\n const warnings: string[] = [];\n\n if (!definition) {\n return { valid: false, errors: ['Report definition is null or undefined.'], warnings: [] };\n }\n\n if (!definition.id || !definition.id.trim()) {\n errors.push('Report definition missing required \"id\".');\n }\n\n if (!definition.name || !definition.name.trim()) {\n errors.push('Report definition missing required \"name\".');\n }\n\n const columns = definition.layout?.columns ?? 12;\n if (columns < 1 || columns > 36) {\n errors.push(`Invalid layout columns count: ${columns}. Must be between 1 and 36.`);\n }\n\n // Verify component IDs and keys\n const componentIds = new Set<string>();\n const componentKeys = new Set<string>();\n\n for (const comp of definition.components ?? []) {\n if (!comp.id) {\n errors.push('Encountered component missing unique \"id\".');\n } else if (componentIds.has(comp.id)) {\n errors.push(`Duplicate component ID found: \"${comp.id}\".`);\n } else {\n componentIds.add(comp.id);\n }\n\n if (comp.key) {\n if (componentKeys.has(comp.key)) {\n errors.push(`Duplicate form field key found: \"${comp.key}\".`);\n } else {\n componentKeys.add(comp.key);\n }\n } else if (comp.type !== 'button' && comp.type !== 'display') {\n warnings.push(`Input component \"${comp.id}\" (${comp.type}) has no \"key\" defined for form binding.`);\n }\n\n if (comp.layout?.columnSpan && comp.layout.columnSpan > columns) {\n warnings.push(\n `Component \"${comp.id}\" columnSpan (${comp.layout.columnSpan}) exceeds page total columns (${columns}).`\n );\n }\n }\n\n // Verify grid & data source integrity\n if (definition.grid) {\n const dsId = definition.grid.dataSourceId;\n const dsExists = (definition.dataSources ?? []).some((ds) => ds.id === dsId);\n\n if (!dsExists) {\n errors.push(`Grid references dataSourceId \"${dsId}\", but no matching data source was found.`);\n }\n\n if (!definition.grid.columns || definition.grid.columns.length === 0) {\n warnings.push('Grid definition has no columns configured.');\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n };\n}\n\n/**\n * SchemaValidatorService provides schema verification methods.\n */\n@Injectable({ providedIn: 'root' })\nexport class SchemaValidatorService {\n /**\n * Validates a report definition and returns errors/warnings without throwing.\n */\n validate(definition: ReportDefinition): SchemaValidationResult {\n return validateReportSchema(definition);\n }\n\n /**\n * Asserts that a report definition is valid.\n * Throws `ReportDefinitionError` if any validation error is detected.\n */\n assertValid(definition: ReportDefinition): void {\n const result = this.validate(definition);\n if (!result.valid) {\n throw new ReportDefinitionError(result.errors.join('; '), definition?.id);\n }\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { ReportDefinition } from '../../../core/models/report-definition.model';\nimport { SchemaValidatorService } from './schema-validator.service';\n\nexport interface ReportDiffSummary {\n hasLayoutChanges: boolean;\n hasGridChanges: boolean;\n addedComponentIds: string[];\n removedComponentIds: string[];\n modifiedComponentIds: string[];\n}\n\n/**\n * ReportVersioningService manages the draft and publishing lifecycle of report definitions.\n */\n@Injectable({ providedIn: 'root' })\nexport class ReportVersioningService {\n private readonly validator = inject(SchemaValidatorService);\n\n /**\n * Prepares a new draft version from an existing definition.\n */\n createDraft(report: ReportDefinition): ReportDefinition {\n return {\n ...JSON.parse(JSON.stringify(report)),\n metadata: {\n ...(report.metadata ?? {}),\n isDraft: true,\n draftCreatedAt: new Date().toISOString(),\n },\n };\n }\n\n /**\n * Publishes a draft report definition, validating its integrity and incrementing its version.\n */\n publish(report: ReportDefinition): ReportDefinition {\n this.validator.assertValid(report);\n\n const nextVersion = (report.version ?? 1) + 1;\n const publishedMeta = {\n ...(report.metadata ?? {}),\n isDraft: false,\n publishedAt: new Date().toISOString(),\n };\n\n return {\n ...JSON.parse(JSON.stringify(report)),\n version: nextVersion,\n metadata: publishedMeta,\n };\n }\n\n /**\n * Compares two versions of a report definition to produce a structured diff summary.\n */\n compareVersions(v1: ReportDefinition, v2: ReportDefinition): ReportDiffSummary {\n const v1CompMap = new Map(v1.components.map((c) => [c.id, c]));\n const v2CompMap = new Map(v2.components.map((c) => [c.id, c]));\n\n const addedComponentIds: string[] = [];\n const removedComponentIds: string[] = [];\n const modifiedComponentIds: string[] = [];\n\n for (const [id, comp] of v2CompMap) {\n if (!v1CompMap.has(id)) {\n addedComponentIds.push(id);\n } else {\n const original = v1CompMap.get(id)!;\n if (JSON.stringify(original) !== JSON.stringify(comp)) {\n modifiedComponentIds.push(id);\n }\n }\n }\n\n for (const id of v1CompMap.keys()) {\n if (!v2CompMap.has(id)) {\n removedComponentIds.push(id);\n }\n }\n\n const hasLayoutChanges =\n JSON.stringify(v1.layout) !== JSON.stringify(v2.layout);\n\n const hasGridChanges =\n JSON.stringify(v1.grid) !== JSON.stringify(v2.grid);\n\n return {\n hasLayoutChanges,\n hasGridChanges,\n addedComponentIds,\n removedComponentIds,\n modifiedComponentIds,\n };\n }\n}\n","import {\n computed,\n inject,\n Injectable,\n signal,\n} from '@angular/core';\nimport { Observable, of, tap, throwError } from 'rxjs';\nimport {\n ReportDefinition,\n ReportSummary,\n} from '../../../core/models/report-definition.model';\nimport { ReportPersistenceAdapter } from '../../../data-access/contracts/report-persistence.contract';\nimport { SchemaValidatorService } from './schema-validator.service';\n\n/**\n * ReportStoreService manages application-wide cached report states,\n * listing, and reactive access via Angular signals.\n */\n@Injectable({ providedIn: 'root' })\nexport class ReportStoreService {\n private readonly adapter = inject(ReportPersistenceAdapter, { optional: true });\n private readonly validator = inject(SchemaValidatorService);\n\n /** List of all known report summaries */\n readonly summaries = signal<ReportSummary[]>([]);\n\n /** In-memory cache of loaded full report definitions by ID */\n private readonly cache = signal<Map<string, ReportDefinition>>(new Map());\n\n /** Currently selected report ID */\n readonly activeReportId = signal<string | null>(null);\n\n /** Loading state indicator */\n readonly isLoading = signal<boolean>(false);\n\n /** Current error message */\n readonly error = signal<string | null>(null);\n\n /** Active report definition computed from cache */\n readonly activeReport = computed<ReportDefinition | null>(() => {\n const id = this.activeReportId();\n if (!id) return null;\n return this.cache().get(id) ?? null;\n });\n\n /**\n * Fetches the list of all available reports.\n */\n loadSummaries(): Observable<ReportSummary[]> {\n if (!this.adapter) {\n return of(this.summaries());\n }\n\n this.isLoading.set(true);\n this.error.set(null);\n\n return this.adapter.list().pipe(\n tap({\n next: (list) => {\n this.summaries.set(list);\n this.isLoading.set(false);\n },\n error: (err) => {\n this.error.set(err?.message ?? 'Failed to load report list.');\n this.isLoading.set(false);\n },\n })\n );\n }\n\n /**\n * Loads a report definition by ID, using cached instance if available.\n *\n * @param reportId - ID of the report to load.\n * @param forceRefresh - If true, bypasses the in-memory cache.\n */\n loadReport(reportId: string, forceRefresh = false): Observable<ReportDefinition> {\n if (!forceRefresh) {\n const cached = this.cache().get(reportId);\n if (cached) {\n this.activeReportId.set(reportId);\n return of(cached);\n }\n }\n\n if (!this.adapter) {\n return throwError(() => new Error('ReportPersistenceAdapter not configured.'));\n }\n\n this.isLoading.set(true);\n this.error.set(null);\n\n return this.adapter.load(reportId).pipe(\n tap({\n next: (def) => {\n this.validator.assertValid(def);\n const nextCache = new Map(this.cache());\n nextCache.set(reportId, def);\n this.cache.set(nextCache);\n this.activeReportId.set(reportId);\n this.isLoading.set(false);\n },\n error: (err) => {\n this.error.set(err?.message ?? `Failed to load report \"${reportId}\".`);\n this.isLoading.set(false);\n },\n })\n );\n }\n\n /**\n * Saves a report definition, validates it, and updates local cache.\n */\n saveReport(report: ReportDefinition): Observable<ReportDefinition> {\n this.validator.assertValid(report);\n\n if (!this.adapter) {\n // In-memory update if no adapter configured\n const nextCache = new Map(this.cache());\n nextCache.set(report.id, report);\n this.cache.set(nextCache);\n this.updateSummaryInList(report);\n return of(report);\n }\n\n this.isLoading.set(true);\n this.error.set(null);\n\n return this.adapter.save(report).pipe(\n tap({\n next: (saved) => {\n const nextCache = new Map(this.cache());\n nextCache.set(saved.id, saved);\n this.cache.set(nextCache);\n this.updateSummaryInList(saved);\n this.isLoading.set(false);\n },\n error: (err) => {\n this.error.set(err?.message ?? `Failed to save report \"${report.id}\".`);\n this.isLoading.set(false);\n },\n })\n );\n }\n\n /**\n * Deletes a report definition by ID.\n */\n deleteReport(reportId: string): Observable<void> {\n if (!this.adapter) {\n const nextCache = new Map(this.cache());\n nextCache.delete(reportId);\n this.cache.set(nextCache);\n this.summaries.set(this.summaries().filter((s) => s.id !== reportId));\n if (this.activeReportId() === reportId) {\n this.activeReportId.set(null);\n }\n return of(void 0);\n }\n\n this.isLoading.set(true);\n return this.adapter.delete(reportId).pipe(\n tap({\n next: () => {\n const nextCache = new Map(this.cache());\n nextCache.delete(reportId);\n this.cache.set(nextCache);\n this.summaries.set(this.summaries().filter((s) => s.id !== reportId));\n if (this.activeReportId() === reportId) {\n this.activeReportId.set(null);\n }\n this.isLoading.set(false);\n },\n error: (err) => {\n this.error.set(err?.message ?? `Failed to delete report \"${reportId}\".`);\n this.isLoading.set(false);\n },\n })\n );\n }\n\n /**\n * Sets the active report ID.\n */\n setActiveReport(id: string | null): void {\n this.activeReportId.set(id);\n }\n\n /**\n * Clears the in-memory cache.\n */\n clearCache(): void {\n this.cache.set(new Map());\n }\n\n private updateSummaryInList(def: ReportDefinition): void {\n const list = [...this.summaries()];\n const idx = list.findIndex((s) => s.id === def.id);\n const summary: ReportSummary = {\n id: def.id,\n name: def.name,\n description: def.description,\n version: def.version,\n isPublished: !def.metadata?.['isDraft'],\n lastModified: new Date().toISOString(),\n };\n\n if (idx >= 0) {\n list[idx] = summary;\n } else {\n list.push(summary);\n }\n this.summaries.set(list);\n }\n}\n","import { inject } from '@angular/core';\nimport { ActivatedRouteSnapshot, ResolveFn, Router, RouterStateSnapshot } from '@angular/router';\nimport { Observable, of } from 'rxjs';\nimport { catchError, map } from 'rxjs/operators';\nimport { ReportDefinition } from '../../../core/models';\nimport { ReportStoreService } from '../../persistence/services/report-store.service';\n\n/**\n * Functional resolver that fetches a ReportDefinition using ReportStoreService\n * based on the :reportId route parameter.\n */\nexport const reportResolver: ResolveFn<ReportDefinition | null> = (\n route: ActivatedRouteSnapshot,\n _state: RouterStateSnapshot\n): Observable<ReportDefinition | null> => {\n const store = inject(ReportStoreService);\n const router = inject(Router);\n const reportId = route.paramMap.get('reportId');\n\n if (!reportId) {\n return of(null);\n }\n\n return store.loadReport(reportId).pipe(\n catchError((err) => {\n console.error(`[bways-report] Failed to resolve report with id '${reportId}':`, err);\n return of(null);\n })\n );\n};\n","import {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n OnInit,\n computed,\n inject,\n signal\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ActivatedRoute, Router, RouterModule } from '@angular/router';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { ReportDefinition } from '../../../core/models';\nimport { ReportStoreService } from '../../persistence/services/report-store.service';\nimport { ReportRuntimeComponent } from '../../runtime/report-runtime.component';\nimport { RptIconComponent } from '../../../primitives/components/icon/rpt-icon.component';\n\n@Component({\n selector: 'rpt-routed-runtime',\n standalone: true,\n imports: [CommonModule, RouterModule, ReportRuntimeComponent, RptIconComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"rpt-routed-container\">\n @if (loading()) {\n <div class=\"rpt-routed-loading\">\n <div class=\"rpt-spinner\"></div>\n <p>Loading report definition...</p>\n </div>\n } @else if (report()) {\n <div class=\"rpt-routed-header\">\n <div class=\"rpt-routed-title-row\">\n <button\n type=\"button\"\n class=\"rpt-btn rpt-btn-ghost rpt-btn-sm\"\n (click)=\"goBack()\"\n title=\"Go back\"\n >\n <rpt-icon name=\"arrow-left\" [size]=\"14\" />\n <span>Back</span>\n </button>\n <h1 class=\"rpt-routed-title\">{{ report()?.name }}</h1>\n <span class=\"rpt-routed-version\">v{{ report()?.version ?? 1 }}</span>\n </div>\n\n @if (canEdit()) {\n <button\n type=\"button\"\n class=\"rpt-btn rpt-btn-secondary rpt-btn-sm\"\n (click)=\"editReport()\"\n >\n <rpt-icon name=\"settings\" [size]=\"14\" />\n <span>Edit Report</span>\n </button>\n }\n </div>\n\n <rpt-runtime [report]=\"report()!\" (execute)=\"onReportExecuted($event)\" />\n } @else {\n <div class=\"rpt-routed-error\">\n <div class=\"rpt-error-card\">\n <h3>Report Not Found</h3>\n <p>The requested report could not be found or has not been published yet.</p>\n <button type=\"button\" class=\"rpt-btn rpt-btn-primary\" (click)=\"goBack()\">\n Return to Previous Page\n </button>\n </div>\n </div>\n }\n </div>\n `,\n styles: [`\n .rpt-routed-container {\n display: flex;\n flex-direction: column;\n gap: var(--rpt-space-md, 16px);\n width: 100%;\n min-height: 100%;\n box-sizing: border-box;\n padding: var(--rpt-space-md, 16px);\n }\n\n .rpt-routed-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding-bottom: var(--rpt-space-sm, 8px);\n border-bottom: 1px solid var(--rpt-border-color, #e2e8f0);\n }\n\n .rpt-routed-title-row {\n display: flex;\n align-items: center;\n gap: 12px;\n }\n\n .rpt-routed-title {\n font-size: 1.25rem;\n font-weight: 700;\n color: var(--rpt-text-color, #0f172a);\n margin: 0;\n }\n\n .rpt-routed-version {\n font-size: 0.75rem;\n font-weight: 600;\n padding: 2px 8px;\n border-radius: 9999px;\n background: var(--rpt-bg-subtle, #f1f5f9);\n color: var(--rpt-text-muted, #64748b);\n }\n\n .rpt-routed-loading,\n .rpt-routed-error {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 60px 20px;\n text-align: center;\n color: var(--rpt-text-muted, #64748b);\n }\n\n .rpt-error-card {\n background: var(--rpt-surface-bg, #ffffff);\n border: 1px solid var(--rpt-border-color, #e2e8f0);\n border-radius: var(--rpt-radius-md, 8px);\n padding: 32px 40px;\n box-shadow: var(--rpt-shadow-sm, 0 1px 3px rgba(0,0,0,0.05));\n }\n\n .rpt-error-card h3 {\n color: var(--rpt-error-color, #ef4444);\n margin-top: 0;\n }\n\n .rpt-spinner {\n width: 36px;\n height: 36px;\n border: 3px solid var(--rpt-border-color, #e2e8f0);\n border-top-color: var(--rpt-primary, #2563eb);\n border-radius: 50%;\n animation: rpt-spin 0.8s linear infinite;\n margin-bottom: 12px;\n }\n\n @keyframes rpt-spin {\n to { transform: rotate(360deg); }\n }\n\n .rpt-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n padding: 8px 14px;\n font-size: 0.875rem;\n font-weight: 500;\n border-radius: var(--rpt-radius-md, 6px);\n cursor: pointer;\n border: 1px solid transparent;\n transition: all 0.15s ease;\n }\n\n .rpt-btn-sm {\n padding: 5px 10px;\n font-size: 0.8125rem;\n }\n\n .rpt-btn-primary {\n background: var(--rpt-primary, #2563eb);\n color: #ffffff;\n }\n .rpt-btn-primary:hover {\n background: var(--rpt-primary-hover, #1d4ed8);\n }\n\n .rpt-btn-secondary {\n background: var(--rpt-surface-bg, #ffffff);\n color: var(--rpt-text-color, #1e293b);\n border-color: var(--rpt-border-color, #cbd5e1);\n }\n .rpt-btn-secondary:hover {\n background: var(--rpt-bg-subtle, #f8fafc);\n }\n\n .rpt-btn-ghost {\n background: transparent;\n color: var(--rpt-text-muted, #64748b);\n }\n .rpt-btn-ghost:hover {\n color: var(--rpt-text-color, #1e293b);\n background: var(--rpt-bg-subtle, #f1f5f9);\n }\n `]\n})\nexport class RoutedReportRuntimeComponent implements OnInit {\n private readonly route = inject(ActivatedRoute);\n private readonly router = inject(Router);\n private readonly store = inject(ReportStoreService);\n private readonly destroyRef = inject(DestroyRef);\n\n readonly report = signal<ReportDefinition | null>(null);\n readonly loading = signal<boolean>(true);\n readonly canEdit = signal<boolean>(true);\n\n ngOnInit(): void {\n // Check if route resolved the report\n this.route.data\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((data) => {\n if (data && data['report']) {\n this.report.set(data['report']);\n this.loading.set(false);\n return;\n }\n\n // Otherwise fallback to resolving via paramMap\n const reportId = this.route.snapshot.paramMap.get('reportId');\n if (reportId) {\n this.store.loadReport(reportId)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (rep) => {\n this.report.set(rep);\n this.loading.set(false);\n },\n error: () => {\n this.report.set(null);\n this.loading.set(false);\n }\n });\n } else {\n this.loading.set(false);\n }\n });\n }\n\n onReportExecuted(filters: Record<string, any>): void {\n // Host can observe or handle executions if needed\n }\n\n editReport(): void {\n const rep = this.report();\n if (rep) {\n this.router.navigate(['edit'], { relativeTo: this.route });\n }\n }\n\n goBack(): void {\n this.router.navigate(['../'], { relativeTo: this.route });\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n OnInit,\n inject,\n signal\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { ReportDefinition } from '../../../core/models';\nimport { ReportStoreService } from '../../persistence/services/report-store.service';\nimport { DesignerComponent } from '../../designer/designer.component';\nimport { RptIconComponent } from '../../../primitives/components/icon/rpt-icon.component';\n\n\n@Component({\n selector: 'rpt-routed-designer',\n standalone: true,\n imports: [CommonModule, DesignerComponent, RptIconComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"rpt-routed-designer-host\">\n @if (loading()) {\n <div class=\"rpt-routed-loading\">\n <div class=\"rpt-spinner\"></div>\n <p>Loading report designer...</p>\n </div>\n } @else {\n <div class=\"rpt-routed-designer-bar\">\n <button\n type=\"button\"\n class=\"rpt-btn rpt-btn-ghost rpt-btn-sm\"\n (click)=\"goBack()\"\n title=\"Return to report view\"\n >\n <rpt-icon name=\"arrow-left\" [size]=\"14\" />\n <span>Exit Designer</span>\n </button>\n @if (savedFeedback()) {\n <span class=\"rpt-saved-pill\">\n <rpt-icon name=\"check\" [size]=\"14\" />\n <span>Saved successfully</span>\n </span>\n }\n </div>\n <rpt-designer\n [initialReport]=\"report()\"\n (save)=\"onSaveReport($event)\"\n />\n }\n </div>\n `,\n styles: [`\n .rpt-routed-designer-host {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: calc(100vh - 80px);\n box-sizing: border-box;\n }\n\n .rpt-routed-designer-bar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 6px 16px;\n background: var(--rpt-surface-bg, #ffffff);\n border-bottom: 1px solid var(--rpt-border-color, #e2e8f0);\n }\n\n .rpt-saved-pill {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n font-size: 0.8125rem;\n color: #166534;\n background: #dcfce7;\n padding: 3px 10px;\n border-radius: 9999px;\n font-weight: 500;\n animation: rptFadeInOut 2.5s ease-in-out forwards;\n }\n\n @keyframes rptFadeInOut {\n 0% { opacity: 0; transform: translateY(-4px); }\n 15% { opacity: 1; transform: translateY(0); }\n 85% { opacity: 1; transform: translateY(0); }\n 100% { opacity: 0; transform: translateY(-4px); }\n }\n\n .rpt-routed-loading {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 300px;\n color: var(--rpt-text-muted, #64748b);\n }\n\n .rpt-spinner {\n width: 36px;\n height: 36px;\n border: 3px solid var(--rpt-border-color, #e2e8f0);\n border-top-color: var(--rpt-primary, #2563eb);\n border-radius: 50%;\n animation: rpt-spin 0.8s linear infinite;\n margin-bottom: 12px;\n }\n\n @keyframes rpt-spin {\n to { transform: rotate(360deg); }\n }\n\n .rpt-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n padding: 6px 12px;\n font-size: 0.8125rem;\n font-weight: 500;\n border-radius: var(--rpt-radius-md, 6px);\n cursor: pointer;\n border: 1px solid transparent;\n background: transparent;\n color: var(--rpt-text-muted, #64748b);\n transition: all 0.15s ease;\n }\n\n .rpt-btn:hover {\n color: var(--rpt-text-color, #1e293b);\n background: var(--rpt-bg-subtle, #f1f5f9);\n }\n `]\n})\nexport class RoutedReportDesignerComponent implements OnInit {\n private readonly route = inject(ActivatedRoute);\n private readonly router = inject(Router);\n private readonly store = inject(ReportStoreService);\n private readonly destroyRef = inject(DestroyRef);\n\n readonly report = signal<ReportDefinition | null>(null);\n readonly loading = signal<boolean>(true);\n readonly savedFeedback = signal<boolean>(false);\n\n ngOnInit(): void {\n const reportId = this.route.snapshot.paramMap.get('reportId');\n\n if (!reportId || reportId === 'new') {\n // Create blank report\n this.report.set(this.createBlankReport());\n this.loading.set(false);\n return;\n }\n\n this.store.loadReport(reportId)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (rep) => {\n this.report.set(rep ?? this.createBlankReport());\n this.loading.set(false);\n },\n error: () => {\n this.report.set(this.createBlankReport());\n this.loading.set(false);\n }\n });\n }\n\n onSaveReport(updatedReport: ReportDefinition): void {\n this.store.saveReport(updatedReport)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: () => {\n this.savedFeedback.set(true);\n setTimeout(() => this.savedFeedback.set(false), 2500);\n },\n error: (err) => {\n console.error('[bways-report] Save report failed:', err);\n }\n });\n }\n\n goBack(): void {\n const reportId = this.route.snapshot.paramMap.get('reportId');\n if (reportId && reportId !== 'new') {\n this.router.navigate(['../'], { relativeTo: this.route });\n } else {\n this.router.navigate(['../'], { relativeTo: this.route });\n }\n }\n\n private createBlankReport(): ReportDefinition {\n return {\n id: `report-${Date.now()}`,\n name: 'Untitled Report',\n description: 'Newly created report',\n category: 'General',\n schemaVersion: 1,\n version: 1,\n components: [],\n parameters: [],\n dataSources: [\n {\n id: 'ds-default',\n name: 'Default Data Source',\n endpoint: '/api/reports/data'\n }\n ],\n grid: {\n dataSourceId: 'ds-default',\n columns: []\n },\n layout: {\n columns: 12,\n gap: 16\n }\n };\n }\n}\n\n\n","import { Routes } from '@angular/router';\nimport { ReportRoutingConfig } from './models/report-route.models';\nimport { reportResolver } from './resolvers/report.resolver';\nimport { RoutedReportRuntimeComponent } from './components/routed-report-runtime.component';\nimport { RoutedReportDesignerComponent } from './components/routed-report-designer.component';\n\n/**\n * Generates Angular Route definitions for dynamic reporting pages in a host application.\n *\n * Example usage in host app's app.routes.ts:\n * ```typescript\n * export const routes: Routes = [\n * {\n * path: 'reports',\n * children: createReportRoutes()\n * }\n * ];\n * ```\n */\nexport function createReportRoutes(config?: ReportRoutingConfig): Routes {\n const reportParam = config?.reportIdParam ?? 'reportId';\n const enableDesigner = config?.enableDesignerRoutes !== false;\n const runtimeGuards = config?.runtimeGuards ?? [];\n const designerGuards = config?.designerGuards ?? [];\n const extraData = config?.extraRouteData ?? {};\n\n const routes: Routes = [];\n\n if (enableDesigner) {\n routes.push({\n path: 'new',\n component: RoutedReportDesignerComponent,\n canActivate: designerGuards,\n data: { isNew: true, ...extraData }\n });\n\n routes.push({\n path: `:${reportParam}/edit`,\n component: RoutedReportDesignerComponent,\n canActivate: designerGuards,\n data: { isEdit: true, ...extraData }\n });\n }\n\n routes.push({\n path: `:${reportParam}`,\n component: RoutedReportRuntimeComponent,\n resolve: {\n report: reportResolver\n },\n canActivate: runtimeGuards,\n data: { ...extraData }\n });\n\n return routes;\n}\n","import { Injectable, computed, inject, signal } from '@angular/core';\nimport { ReportSummary } from '../../../core/models';\nimport { ReportStoreService } from '../../persistence/services/report-store.service';\nimport { ReportMenuGroup, ReportMenuItem } from '../models/report-route.models';\n\n/**\n * Pure helper function to transform flat ReportSummary array into hierarchical\n * menu groups for host ERP navigation sidebars or dropdowns.\n */\nexport function groupReportsByCategory(\n reports: ReportSummary[],\n basePath: string = '/reports'\n): ReportMenuGroup[] {\n const groupsMap = new Map<string, ReportMenuItem[]>();\n\n for (const report of reports) {\n const category = report.category || 'General';\n const items = groupsMap.get(category) ?? [];\n\n const cleanBase = basePath.endsWith('/') ? basePath.slice(0, -1) : basePath;\n const item: ReportMenuItem = {\n id: report.id,\n code: report.id,\n name: report.name,\n category,\n route: `${cleanBase}/${report.id}`,\n isDraft: !report.isPublished,\n version: report.version\n };\n\n\n items.push(item);\n groupsMap.set(category, items);\n }\n\n return Array.from(groupsMap.entries()).map(([category, items]) => ({\n category,\n displayName: category,\n items: items.sort((a, b) => a.name.localeCompare(b.name))\n })).sort((a, b) => a.displayName.localeCompare(b.displayName));\n}\n\n/**\n * Reactive service providing dynamically computed menu groups and items\n * from the active ReportStoreService for host ERP sidebar navigation.\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class ReportMenuService {\n private readonly store = inject(ReportStoreService);\n\n readonly basePath = signal<string>('/reports');\n readonly searchQuery = signal<string>('');\n\n /**\n * Computed hierarchical menu groups grouped by report category.\n */\n readonly menuGroups = computed<ReportMenuGroup[]>(() => {\n const allReports = this.store.summaries();\n const query = this.searchQuery().trim().toLowerCase();\n\n const filtered = query\n ? allReports.filter(\n (r: ReportSummary) =>\n r.name.toLowerCase().includes(query) ||\n r.id.toLowerCase().includes(query) ||\n r.category?.toLowerCase().includes(query)\n )\n : allReports;\n\n return groupReportsByCategory(filtered, this.basePath());\n });\n\n /**\n * Total count of available reports in the menu.\n */\n readonly totalReportsCount = computed<number>(() => {\n return this.store.summaries().length;\n });\n\n setBasePath(path: string): void {\n this.basePath.set(path);\n }\n\n setSearchQuery(query: string): void {\n this.searchQuery.set(query);\n }\n\n refreshMenu(): void {\n this.store.loadSummaries().subscribe();\n }\n}\n\n","import { Injectable, inject } from '@angular/core';\nimport { DOCUMENT } from '@angular/common';\nimport { CsvExportOptions, ExportColumn, JsonExportOptions } from '../models/export.models';\n\n/**\n * Sanitizes and escapes a single cell value for CSV output.\n */\nexport function sanitizeCsvCell(value: unknown, delimiter: string = ','): string {\n if (value === null || value === undefined) {\n return '';\n }\n\n let str = String(value);\n\n // If value contains delimiter, quote, or newline, escape and wrap in quotes\n const mustQuote =\n str.includes(delimiter) ||\n str.includes('\"') ||\n str.includes('\\n') ||\n str.includes('\\r');\n\n if (mustQuote) {\n str = '\"' + str.replace(/\"/g, '\"\"') + '\"';\n }\n\n return str;\n}\n\n/**\n * Pure generator function to create CSV content string from row data and columns.\n */\nexport function generateCsvContent(\n rows: Record<string, unknown>[],\n columns: ExportColumn[],\n delimiter: string = ',',\n includeHeader: boolean = true,\n addBom: boolean = true\n): string {\n const lines: string[] = [];\n\n if (includeHeader) {\n const headerLine = columns\n .map((col) => sanitizeCsvCell(col.header, delimiter))\n .join(delimiter);\n lines.push(headerLine);\n }\n\n for (const row of rows) {\n const rowValues = columns.map((col) => {\n const val = row[col.field];\n const formatted = col.formatter ? col.formatter(val, row) : val;\n return sanitizeCsvCell(formatted, delimiter);\n });\n lines.push(rowValues.join(delimiter));\n }\n\n const csvBody = lines.join('\\r\\n');\n return addBom ? '\\uFEFF' + csvBody : csvBody;\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ReportExportService {\n private readonly document = inject(DOCUMENT);\n\n /**\n * Generates and triggers browser download of a CSV file.\n */\n exportCsv(rows: Record<string, unknown>[], options: CsvExportOptions = {}): void {\n if (!rows || rows.length === 0) {\n console.warn('[bways-report] No rows to export');\n return;\n }\n\n const delimiter = options.delimiter ?? ',';\n const includeHeader = options.includeHeader !== false;\n const addBom = options.addBom !== false;\n const fileName = options.fileName || `report-export-${Date.now()}.csv`;\n\n // If columns not provided, infer from first row keys\n const columns: ExportColumn[] =\n options.columns && options.columns.length > 0\n ? options.columns\n : Object.keys(rows[0]).map((key) => ({\n field: key,\n header: key\n }));\n\n const csvContent = generateCsvContent(rows, columns, delimiter, includeHeader, addBom);\n const blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8;' });\n this.downloadBlob(blob, fileName);\n }\n\n /**\n * Generates and triggers browser download of a JSON file.\n */\n exportJson(data: unknown, options: JsonExportOptions = {}): void {\n const fileName = options.fileName || `report-export-${Date.now()}.json`;\n const pretty = options.pretty !== false;\n const jsonString = pretty ? JSON.stringify(data, null, 2) : JSON.stringify(data);\n\n const blob = new Blob([jsonString], { type: 'application/json;charset=utf-8;' });\n this.downloadBlob(blob, fileName);\n }\n\n /**\n * Safe file download trigger via temporary anchor tag.\n */\n private downloadBlob(blob: Blob, fileName: string): void {\n if (!this.document || !this.document.createElement) {\n return;\n }\n\n const url = URL.createObjectURL(blob);\n const link = this.document.createElement('a');\n link.href = url;\n link.download = fileName;\n link.style.display = 'none';\n\n this.document.body.appendChild(link);\n link.click();\n\n setTimeout(() => {\n this.document.body.removeChild(link);\n URL.revokeObjectURL(url);\n }, 100);\n }\n}\n","/**\n * Reporting library root provider function.\n *\n * Configures the library, its tokens, and registers built-in primitives.\n */\n\nimport {\n ENVIRONMENT_INITIALIZER,\n EnvironmentProviders,\n inject,\n makeEnvironmentProviders,\n Provider,\n Type,\n} from '@angular/core';\nimport {\n CHART_COMPONENT,\n GRID_COMPONENT,\n REPORTING_CONFIG,\n ReportingConfig,\n} from './core/tokens/reporting-config.token';\nimport {\n REPORT_SESSION_CONTEXT,\n REPORT_SESSION_PROVIDER,\n SessionContextProvider,\n SessionContextSource,\n} from './core/tokens/session-context.token';\nimport { ReportDataSourceAdapter } from './data-access/contracts/data-source.contract';\nimport { MasterDataProvider } from './data-access/contracts/master-data.provider';\nimport { ReportPersistenceAdapter } from './data-access/contracts/report-persistence.contract';\nimport { ReportSchemaDiscoveryAdapter } from './data-access/contracts/schema-discovery.contract';\nimport { ReportLookupAdapter } from './data-access/contracts/lookup.contract';\nimport { HttpReportSchemaDiscoveryAdapter } from './data-access/adapters/http-schema-discovery.adapter';\nimport { HttpReportLookupAdapter } from './data-access/adapters/http-lookup.adapter';\nimport { ComponentRegistry } from './core/registry/component-registry';\nimport { registerBuiltinComponents } from './primitives/register-builtins';\n\n/** Default configuration values. */\nconst DEFAULT_CONFIG: ReportingConfig = {\n defaultPageSize: 25,\n dateFormat: 'dd/MM/yyyy',\n enableDesigner: false,\n schemaVersion: 1,\n};\n\n/**\n * Configuration options for `provideReporting()`.\n */\nexport interface ProvideReportingOptions extends Partial<ReportingConfig> {\n /**\n * The Angular component to use for rendering report result grids.\n * BWays-grid is the recommended default. Host can provide any grid component.\n */\n gridComponent?: Type<unknown>;\n\n /**\n * The Angular component to use for rendering report visual charts.\n * Host can provide their preferred chart component, or use the built-in SVG charts.\n */\n chartComponent?: Type<unknown>;\n\n /** Host's implementation of the data source adapter. */\n dataSourceAdapter?: Type<ReportDataSourceAdapter>;\n\n /** Host's implementation of the master data provider. */\n masterDataProvider?: Type<MasterDataProvider>;\n\n /** Host's implementation of the persistence adapter. */\n persistenceAdapter?: Type<ReportPersistenceAdapter>;\n\n /** Host's implementation of the schema discovery adapter (defaults to HttpReportSchemaDiscoveryAdapter). */\n schemaDiscoveryAdapter?: Type<ReportSchemaDiscoveryAdapter>;\n\n /** Host's implementation of the lookup adapter (defaults to HttpReportLookupAdapter). */\n lookupAdapter?: Type<ReportLookupAdapter>;\n\n /**\n * Host application's session context parameters (e.g. { branchId: 1, companyId: 10, userId: 'usr-1' }).\n * Can be a static object, an Angular Signal, an Observable, or a dynamic getter function.\n * Stored procedures automatically bind matching parameters (like @BranchId, @CompanyId) to this context.\n */\n sessionContext?: SessionContextSource;\n\n /**\n * Host application service class implementing `SessionContextProvider`.\n * Resolves session parameters dynamically at runtime (e.g. from user auth state, active branch switcher).\n */\n sessionContextProvider?: Type<SessionContextProvider>;\n\n /**\n * Factory function that returns a SessionContextSource with dependency injection context.\n * E.g. `sessionContextFactory: () => inject(AuthService).currentSessionSignal`\n */\n sessionContextFactory?: () => SessionContextSource;\n}\n\n/**\n * Provides the BWays-Report library to the application.\n *\n * @param options - Configuration and adapter implementations.\n * @returns Environment providers for the reporting library.\n *\n * @example\n * ```typescript\n * // app.config.ts\n * export const appConfig: ApplicationConfig = {\n * providers: [\n * provideReporting({\n * apiBaseUrl: 'http://localhost:3000/api/reporting',\n * gridComponent: BwaysGridComponent,\n * defaultPageSize: 50,\n * }),\n * ],\n * };\n * ```\n */\nexport function provideReporting(options: ProvideReportingOptions = {}): EnvironmentProviders {\n const config: ReportingConfig = { ...DEFAULT_CONFIG, ...options };\n const providers: Provider[] = [\n { provide: REPORTING_CONFIG, useValue: config },\n {\n provide: ENVIRONMENT_INITIALIZER,\n multi: true,\n useValue: () => {\n const registry = inject(ComponentRegistry);\n registerBuiltinComponents(registry);\n },\n },\n {\n provide: ReportSchemaDiscoveryAdapter,\n useClass: options.schemaDiscoveryAdapter ?? HttpReportSchemaDiscoveryAdapter,\n },\n {\n provide: ReportLookupAdapter,\n useClass: options.lookupAdapter ?? HttpReportLookupAdapter,\n },\n ];\n\n if (options.gridComponent) {\n providers.push({ provide: GRID_COMPONENT, useValue: options.gridComponent });\n }\n\n if (options.chartComponent) {\n providers.push({ provide: CHART_COMPONENT, useValue: options.chartComponent });\n }\n\n if (options.dataSourceAdapter) {\n providers.push({ provide: ReportDataSourceAdapter, useClass: options.dataSourceAdapter });\n }\n\n if (options.masterDataProvider) {\n providers.push({ provide: MasterDataProvider, useClass: options.masterDataProvider });\n }\n\n if (options.persistenceAdapter) {\n providers.push({ provide: ReportPersistenceAdapter, useClass: options.persistenceAdapter });\n }\n\n if (options.sessionContextProvider) {\n providers.push({ provide: REPORT_SESSION_PROVIDER, useClass: options.sessionContextProvider });\n }\n\n if (options.sessionContextFactory) {\n providers.push({ provide: REPORT_SESSION_CONTEXT, useFactory: options.sessionContextFactory });\n } else if (options.sessionContext !== undefined) {\n providers.push({ provide: REPORT_SESSION_CONTEXT, useValue: options.sessionContext });\n }\n\n return makeEnvironmentProviders(providers);\n}\n","/*\n * Public API Surface of bways-report\n */\n\nexport * from './lib/core';\nexport * from './lib/data-access';\nexport * from './lib/primitives';\nexport * from './lib/features';\nexport * from './lib/provide-reporting';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i2","tap"],"mappings":"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"}