bways-report 0.1.4 → 0.1.6

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 (42) hide show
  1. package/README.md +75 -35
  2. package/esm2022/lib/core/services/index.mjs +3 -1
  3. package/esm2022/lib/core/services/report-data-discovery.service.mjs +135 -0
  4. package/esm2022/lib/core/services/report-storage.service.mjs +63 -0
  5. package/esm2022/lib/core/tokens/index.mjs +2 -1
  6. package/esm2022/lib/core/tokens/reporting-config.token.mjs +1 -1
  7. package/esm2022/lib/core/tokens/storage.token.mjs +128 -0
  8. package/esm2022/lib/core/utils/identifier-humanizer.mjs +15 -4
  9. package/esm2022/lib/data-access/adapters/http-lookup.adapter.mjs +17 -8
  10. package/esm2022/lib/data-access/adapters/local-storage-persistence.adapter.mjs +16 -44
  11. package/esm2022/lib/features/designer/components/component-palette/component-palette.component.mjs +3 -371
  12. package/esm2022/lib/features/designer/components/design-canvas/design-canvas.component.mjs +69 -1023
  13. package/esm2022/lib/features/designer/components/property-editor/parameter-binding-editor.component.mjs +345 -213
  14. package/esm2022/lib/features/designer/components/property-editor/property-editor-action.component.mjs +39 -32
  15. package/esm2022/lib/features/designer/components/property-editor/property-editor-datasource.component.mjs +35 -679
  16. package/esm2022/lib/features/designer/components/property-editor/property-editor-grid.component.mjs +97 -949
  17. package/esm2022/lib/features/designer/components/property-editor/property-editor.component.mjs +112 -585
  18. package/esm2022/lib/features/designer/designer.component.mjs +3 -3
  19. package/esm2022/lib/features/designer/services/designer-state.service.mjs +62 -2
  20. package/esm2022/lib/features/runtime/report-grid-bridge.component.mjs +115 -19
  21. package/esm2022/lib/primitives/components/dropdown/rpt-dropdown.component.mjs +31 -423
  22. package/esm2022/lib/provide-reporting.mjs +20 -5
  23. package/fesm2022/bways-report.mjs +2263 -5342
  24. package/fesm2022/bways-report.mjs.map +1 -1
  25. package/lib/core/services/index.d.ts +2 -0
  26. package/lib/core/services/report-data-discovery.service.d.ts +38 -0
  27. package/lib/core/services/report-storage.service.d.ts +26 -0
  28. package/lib/core/tokens/index.d.ts +2 -0
  29. package/lib/core/tokens/reporting-config.token.d.ts +2 -0
  30. package/lib/core/tokens/storage.token.d.ts +48 -0
  31. package/lib/data-access/adapters/http-lookup.adapter.d.ts +2 -1
  32. package/lib/data-access/adapters/local-storage-persistence.adapter.d.ts +1 -0
  33. package/lib/features/designer/components/design-canvas/design-canvas.component.d.ts +5 -1
  34. package/lib/features/designer/components/property-editor/parameter-binding-editor.component.d.ts +5 -0
  35. package/lib/features/designer/components/property-editor/property-editor-action.component.d.ts +3 -0
  36. package/lib/features/designer/components/property-editor/property-editor-grid.component.d.ts +31 -1
  37. package/lib/features/designer/components/property-editor/property-editor.component.d.ts +19 -0
  38. package/lib/features/designer/services/designer-state.service.d.ts +12 -1
  39. package/lib/features/runtime/report-grid-bridge.component.d.ts +8 -58
  40. package/lib/primitives/components/dropdown/rpt-dropdown.component.d.ts +3 -0
  41. package/lib/provide-reporting.d.ts +6 -0
  42. package/package.json +9 -1
@@ -1,3 +1,5 @@
1
1
  export { DynamicFormBuilder } from './dynamic-form-builder.service';
2
2
  export { ReportSessionContextService } from './report-session-context.service';
3
3
  export type { SessionParamMatch, DerivedParametersResult, } from './report-session-context.service';
4
+ export { ReportStorageService } from './report-storage.service';
5
+ export { ReportDataDiscoveryService } from './report-data-discovery.service';
@@ -0,0 +1,38 @@
1
+ import { Observable } from 'rxjs';
2
+ import { DatabaseEntityMetadata, DatabaseEntityType, ProcedureParameterMetadata } from '../../data-access/contracts/schema-discovery.contract';
3
+ import { GridColumnDefinition } from '../models/report-grid.model';
4
+ import * as i0 from "@angular/core";
5
+ /**
6
+ * Centralized service for discovering database schema entities, parameters,
7
+ * and column definitions.
8
+ *
9
+ * Provides a unified static + dynamic detection pipeline:
10
+ * If static schema metadata discovery fails (e.g. SQL Server stored procedures
11
+ * using #temp tables that cannot be analyzed statically), it automatically
12
+ * falls back to executing a safe dynamic sample query with the active parameter
13
+ * values and extracting column definitions from the result dataset.
14
+ */
15
+ export declare class ReportDataDiscoveryService {
16
+ private readonly discoveryAdapter;
17
+ private readonly lookupAdapter;
18
+ private readonly sessionService;
19
+ /**
20
+ * Retrieves all database tables, views, and stored procedures.
21
+ */
22
+ getEntities(types?: DatabaseEntityType[]): Observable<DatabaseEntityMetadata[]>;
23
+ /**
24
+ * Retrieves stored procedure parameter metadata.
25
+ */
26
+ getParameters(procedureName: string, schema?: string): Observable<ProcedureParameterMetadata[]>;
27
+ /**
28
+ * Unified column detection:
29
+ * 1. Attempts static schema discovery via ReportSchemaDiscoveryAdapter.
30
+ * 2. If static discovery returns 0 columns or throws an error (e.g. SQL Error 11526 with #temp tables),
31
+ * automatically runs dynamic sample query via ReportLookupAdapter using resolved parameters.
32
+ */
33
+ autoDetectColumns(entityName: string, entityType?: 'table' | 'stored_procedure', mappings?: Record<string, unknown>, schema?: string): Observable<GridColumnDefinition[]>;
34
+ private mapStaticColumnsToGrid;
35
+ private fallbackDynamicDetection;
36
+ static ɵfac: i0.ɵɵFactoryDeclaration<ReportDataDiscoveryService, never>;
37
+ static ɵprov: i0.ɵɵInjectableDeclaration<ReportDataDiscoveryService>;
38
+ }
@@ -0,0 +1,26 @@
1
+ import { ReportStorage } from '../tokens/storage.token';
2
+ import * as i0 from "@angular/core";
3
+ /**
4
+ * Angular injectable service wrapping report storage operations.
5
+ * Provides type-safe JSON serialization/deserialization and environment-agnostic access.
6
+ */
7
+ export declare class ReportStorageService implements ReportStorage {
8
+ private readonly storage;
9
+ getItem(key: string): string | null;
10
+ setItem(key: string, value: string): void;
11
+ removeItem(key: string): void;
12
+ clear(): void;
13
+ key(index: number): string | null;
14
+ get length(): number;
15
+ /**
16
+ * Safely retrieves and parses a JSON value from storage.
17
+ * Returns fallback if key is missing or parsing fails.
18
+ */
19
+ getJSON<T>(key: string, fallback: T): T;
20
+ /**
21
+ * Safely serializes and stores a JSON value in storage.
22
+ */
23
+ setJSON<T>(key: string, value: T): void;
24
+ static ɵfac: i0.ɵɵFactoryDeclaration<ReportStorageService, never>;
25
+ static ɵprov: i0.ɵɵInjectableDeclaration<ReportStorageService>;
26
+ }
@@ -2,3 +2,5 @@ export { REPORTING_CONFIG, GRID_COMPONENT, CHART_COMPONENT, } from './reporting-
2
2
  export type { ReportingConfig, } from './reporting-config.token';
3
3
  export { REPORT_SESSION_CONTEXT, REPORT_SESSION_PROVIDER, SessionContextProvider, } from './session-context.token';
4
4
  export type { SessionParamPrimitive, SessionContextMap, SessionContextProviderFn, SessionContextSource, } from './session-context.token';
5
+ export { REPORT_STORAGE, BrowserReportStorage, MemoryReportStorage, } from './storage.token';
6
+ export type { ReportStorage, } from './storage.token';
@@ -21,6 +21,8 @@ export interface ReportingConfig {
21
21
  apiBaseUrl?: string;
22
22
  /** Whether automatic backend schema discovery (SPs & Tables) is enabled. */
23
23
  enableSchemaDiscovery?: boolean;
24
+ /** Optional timeout in milliseconds for dropdown lookup queries (defaults to 300000ms / 5 minutes). */
25
+ lookupTimeoutMs?: number;
24
26
  }
25
27
  /**
26
28
  * Injection token for the grid component.
@@ -0,0 +1,48 @@
1
+ import { InjectionToken } from '@angular/core';
2
+ /**
3
+ * Storage contract for reading and writing report configurations,
4
+ * presets, and layout states across environments (Browser, SSR, sandboxed iframes).
5
+ */
6
+ export interface ReportStorage {
7
+ getItem(key: string): string | null;
8
+ setItem(key: string, value: string): void;
9
+ removeItem(key: string): void;
10
+ clear(): void;
11
+ key?(index: number): string | null;
12
+ readonly length?: number;
13
+ }
14
+ /**
15
+ * In-memory fallback implementation of ReportStorage.
16
+ * Safe for SSR, unit tests, and sandboxed iframes where localStorage access is denied.
17
+ */
18
+ export declare class MemoryReportStorage implements ReportStorage {
19
+ private readonly store;
20
+ getItem(key: string): string | null;
21
+ setItem(key: string, value: string): void;
22
+ removeItem(key: string): void;
23
+ clear(): void;
24
+ key(index: number): string | null;
25
+ get length(): number;
26
+ }
27
+ /**
28
+ * Browser localStorage-backed implementation of ReportStorage
29
+ * with transparent in-memory fallback on DOMException or SSR.
30
+ */
31
+ export declare class BrowserReportStorage implements ReportStorage {
32
+ private readonly memory;
33
+ private readonly isSupported;
34
+ constructor();
35
+ private checkStorageSupport;
36
+ getItem(key: string): string | null;
37
+ setItem(key: string, value: string): void;
38
+ removeItem(key: string): void;
39
+ clear(): void;
40
+ key(index: number): string | null;
41
+ get length(): number;
42
+ }
43
+ /**
44
+ * Injection token for the report storage engine.
45
+ * Defaults to `BrowserReportStorage`, which transparently falls back to
46
+ * `MemoryReportStorage` when browser localStorage is unavailable or restricted.
47
+ */
48
+ export declare const REPORT_STORAGE: InjectionToken<ReportStorage>;
@@ -3,13 +3,14 @@ import { LookupOptionItem, LookupQueryRequest, ReportLookupAdapter } from '../co
3
3
  import * as i0 from "@angular/core";
4
4
  /**
5
5
  * Built-in HTTP adapter for fetching dropdown options from backend database tables and SPs.
6
- * Includes in-memory caching with TTL and rich fallback mock data for testing.
6
+ * Includes in-memory caching with TTL, in-flight request deduplication, and fallback mock data.
7
7
  */
8
8
  export declare class HttpReportLookupAdapter extends ReportLookupAdapter {
9
9
  private readonly http;
10
10
  private readonly config;
11
11
  private readonly sessionService;
12
12
  private readonly cache;
13
+ private readonly inFlight;
13
14
  private readonly mockDataStore;
14
15
  fetchOptions(request: LookupQueryRequest): Observable<LookupOptionItem[]>;
15
16
  private setCache;
@@ -4,6 +4,7 @@ import { ReportDefinition, ReportSummary } from '../../core/models/report-defini
4
4
  import * as i0 from "@angular/core";
5
5
  export declare class LocalStorageReportPersistenceAdapter extends ReportPersistenceAdapter {
6
6
  private readonly templateService;
7
+ private readonly storage;
7
8
  constructor();
8
9
  private seedDefaultBlueprintsIfEmpty;
9
10
  private getIndex;
@@ -1,10 +1,13 @@
1
+ import { OnDestroy } from '@angular/core';
1
2
  import { FormControl, FormGroup } from '@angular/forms';
2
3
  import { CdkDragDrop } from '@angular/cdk/drag-drop';
3
4
  import { ReportComponentDefinition } from '../../../../core/models/report-component.model';
4
5
  import { getComponentIconName } from '../../utilities/canvas-layout.util';
5
6
  import * as i0 from "@angular/core";
6
- export declare class DesignCanvasComponent {
7
+ export declare class DesignCanvasComponent implements OnDestroy {
7
8
  private readonly designerState;
9
+ private gridFilterDebounceTimer;
10
+ private pendingGridState;
8
11
  private readonly templateService;
9
12
  private readonly formBuilder;
10
13
  private readonly executionService;
@@ -56,6 +59,7 @@ export declare class DesignCanvasComponent {
56
59
  addResultGrid(event?: MouseEvent): void;
57
60
  executeCanvasReport(event?: MouseEvent): void;
58
61
  onCanvasButtonClick(comp: ReportComponentDefinition, event: MouseEvent): void;
62
+ ngOnDestroy(): void;
59
63
  onCanvasGridStateChange(state: any): void;
60
64
  onCanvasColumnDefsChange(defs: any[]): void;
61
65
  removeGrid(event?: MouseEvent): void;
@@ -19,6 +19,11 @@ export declare class ParameterBindingEditorComponent {
19
19
  readonly sessionMatch: import("@angular/core").Signal<import("../../../../core/services/report-session-context.service").SessionParamMatch | null>;
20
20
  readonly friendlyLabel: import("@angular/core").Signal<string>;
21
21
  readonly displayType: import("@angular/core").Signal<"Date" | "Text" | "Number" | "Yes / No">;
22
+ readonly isCurrentValue: (val: string | number) => boolean;
23
+ readonly paramQuickSuggestions: import("@angular/core").Signal<{
24
+ label: string;
25
+ value: string | number;
26
+ }[]>;
22
27
  readonly compatibleControls: import("@angular/core").Signal<ReportComponentDefinition[]>;
23
28
  readonly hasValue: import("@angular/core").Signal<boolean>;
24
29
  readonly activeMode: import("@angular/core").Signal<ParameterBindingMode>;
@@ -14,6 +14,9 @@ export interface ActionTypeOption {
14
14
  export declare class PropertyEditorActionComponent {
15
15
  private readonly designerState;
16
16
  private readonly discoveryAdapter;
17
+ private readonly lookupAdapter;
18
+ private readonly sessionService;
19
+ private readonly dataDiscovery;
17
20
  readonly comp: import("@angular/core").InputSignal<ReportComponentDefinition>;
18
21
  readonly updateProperty: import("@angular/core").OutputEmitterRef<{
19
22
  key: string;
@@ -1,7 +1,18 @@
1
1
  import { GridColumnDefinition, GridRowClickAction, ReportGridDefinition } from '../../../../core/models/report-grid.model';
2
+ import { ReportDataSourceDefinition } from '../../../../core/models/report-datasource.model';
3
+ import { ReportComponentDefinition } from '../../../../core/models/report-component.model';
4
+ import { DatabaseEntityMetadata, ProcedureParameterMetadata } from '../../../../data-access/contracts/schema-discovery.contract';
2
5
  import * as i0 from "@angular/core";
3
6
  export declare class PropertyEditorGridComponent {
7
+ private readonly dataDiscovery;
4
8
  readonly grid: import("@angular/core").InputSignal<ReportGridDefinition | undefined>;
9
+ readonly dataSource: import("@angular/core").InputSignal<ReportDataSourceDefinition | undefined>;
10
+ readonly availableEntities: import("@angular/core").InputSignal<DatabaseEntityMetadata[]>;
11
+ readonly procedureParameters: import("@angular/core").InputSignal<ProcedureParameterMetadata[]>;
12
+ readonly allComponents: import("@angular/core").InputSignal<ReportComponentDefinition[]>;
13
+ readonly isDetecting: import("@angular/core").InputSignal<boolean>;
14
+ readonly statusMessage: import("@angular/core").InputSignal<string | null>;
15
+ readonly statusKind: import("@angular/core").InputSignal<"error" | "success" | "info" | null>;
5
16
  readonly addGrid: import("@angular/core").OutputEmitterRef<void>;
6
17
  readonly removeGrid: import("@angular/core").OutputEmitterRef<void>;
7
18
  readonly addColumn: import("@angular/core").OutputEmitterRef<void>;
@@ -17,6 +28,21 @@ export declare class PropertyEditorGridComponent {
17
28
  value: unknown;
18
29
  }>;
19
30
  readonly updateRowClickAction: import("@angular/core").OutputEmitterRef<GridRowClickAction | undefined>;
31
+ readonly setDataSource: import("@angular/core").OutputEmitterRef<ReportDataSourceDefinition>;
32
+ readonly updateDataSourceParameters: import("@angular/core").OutputEmitterRef<Record<string, unknown>>;
33
+ readonly entityChanged: import("@angular/core").OutputEmitterRef<{
34
+ name: string;
35
+ type: "stored_procedure" | "table";
36
+ }>;
37
+ readonly internalParameters: import("@angular/core").WritableSignal<ProcedureParameterMetadata[]>;
38
+ readonly effectiveParameters: import("@angular/core").Signal<ProcedureParameterMetadata[]>;
39
+ readonly selectedSourceType: import("@angular/core").WritableSignal<"table" | "stored_procedure">;
40
+ constructor();
41
+ readonly currentSourceType: import("@angular/core").Signal<"table" | "stored_procedure">;
42
+ readonly activeEntityName: import("@angular/core").Signal<string>;
43
+ readonly availableTables: import("@angular/core").Signal<DatabaseEntityMetadata[]>;
44
+ readonly availableProcedures: import("@angular/core").Signal<DatabaseEntityMetadata[]>;
45
+ readonly activeEntityList: import("@angular/core").Signal<DatabaseEntityMetadata[]>;
20
46
  readonly columns: import("@angular/core").Signal<GridColumnDefinition[]>;
21
47
  readonly rowClickAction: import("@angular/core").Signal<GridRowClickAction | undefined>;
22
48
  readonly hasRowClickAction: import("@angular/core").Signal<boolean>;
@@ -24,6 +50,10 @@ export declare class PropertyEditorGridComponent {
24
50
  key: string;
25
51
  value: string;
26
52
  }[]>;
53
+ onSourceTypeChange(type: 'stored_procedure' | 'table'): void;
54
+ onSelectEntity(entityName: string): void;
55
+ getParameterValue(paramName: string): string | number | boolean;
56
+ onParameterChange(paramName: string, value: string | number | boolean): void;
27
57
  onUpdateCol(index: number, field: string, value: unknown): void;
28
58
  toggleRowClickAction(enabled: boolean): void;
29
59
  updateRowActionField(field: keyof GridRowClickAction, value: unknown): void;
@@ -32,5 +62,5 @@ export declare class PropertyEditorGridComponent {
32
62
  updateMappingValue(index: number, newValue: string): void;
33
63
  removeMapping(index: number): void;
34
64
  static ɵfac: i0.ɵɵFactoryDeclaration<PropertyEditorGridComponent, never>;
35
- static ɵcmp: i0.ɵɵComponentDeclaration<PropertyEditorGridComponent, "rpt-property-editor-grid", never, { "grid": { "alias": "grid"; "required": false; "isSignal": true; }; }, { "addGrid": "addGrid"; "removeGrid": "removeGrid"; "addColumn": "addColumn"; "autoDetectColumns": "autoDetectColumns"; "removeColumn": "removeColumn"; "updateColumn": "updateColumn"; "updateOption": "updateOption"; "updateRowClickAction": "updateRowClickAction"; }, never, never, true, never>;
65
+ static ɵcmp: i0.ɵɵComponentDeclaration<PropertyEditorGridComponent, "rpt-property-editor-grid", never, { "grid": { "alias": "grid"; "required": false; "isSignal": true; }; "dataSource": { "alias": "dataSource"; "required": false; "isSignal": true; }; "availableEntities": { "alias": "availableEntities"; "required": false; "isSignal": true; }; "procedureParameters": { "alias": "procedureParameters"; "required": false; "isSignal": true; }; "allComponents": { "alias": "allComponents"; "required": false; "isSignal": true; }; "isDetecting": { "alias": "isDetecting"; "required": false; "isSignal": true; }; "statusMessage": { "alias": "statusMessage"; "required": false; "isSignal": true; }; "statusKind": { "alias": "statusKind"; "required": false; "isSignal": true; }; }, { "addGrid": "addGrid"; "removeGrid": "removeGrid"; "addColumn": "addColumn"; "autoDetectColumns": "autoDetectColumns"; "removeColumn": "removeColumn"; "updateColumn": "updateColumn"; "updateOption": "updateOption"; "updateRowClickAction": "updateRowClickAction"; "setDataSource": "setDataSource"; "updateDataSourceParameters": "updateDataSourceParameters"; "entityChanged": "entityChanged"; }, never, never, true, never>;
36
66
  }
@@ -3,6 +3,8 @@ import { PropertyDefinition } from '../../../../core/registry/property-definitio
3
3
  import { ComponentLayoutDefinition } from '../../../../core/models/report-layout.model';
4
4
  import { GridRowClickAction } from '../../../../core/models/report-grid.model';
5
5
  import { ComponentDataSourceDefinition, ReportComponentDefinition } from '../../../../core/models/report-component.model';
6
+ import { DatabaseEntityMetadata, ProcedureParameterMetadata } from '../../../../data-access/contracts/schema-discovery.contract';
7
+ import { ReportDataSourceDefinition } from '../../../../core/models/report-datasource.model';
6
8
  import * as i0 from "@angular/core";
7
9
  /**
8
10
  * Property Editor coordinator component.
@@ -14,12 +16,24 @@ export declare class PropertyEditorComponent {
14
16
  private readonly designerState;
15
17
  private readonly registry;
16
18
  private readonly discoveryAdapter;
19
+ private readonly lookupAdapter;
20
+ private readonly sessionService;
21
+ private readonly dataDiscovery;
22
+ readonly isDetectingColumns: import("@angular/core").WritableSignal<boolean>;
23
+ readonly gridDetectionStatus: import("@angular/core").WritableSignal<{
24
+ message: string;
25
+ kind: "info" | "success" | "error";
26
+ } | null>;
27
+ readonly availableEntities: import("@angular/core").WritableSignal<DatabaseEntityMetadata[]>;
28
+ readonly gridProcedureParameters: import("@angular/core").WritableSignal<ProcedureParameterMetadata[]>;
17
29
  readonly definition: import("@angular/core").WritableSignal<import("bways-report").ReportDefinition>;
18
30
  readonly activeTab: import("@angular/core").WritableSignal<DesignerActiveTab>;
19
31
  readonly selectedComponent: import("@angular/core").Signal<ReportComponentDefinition | null>;
20
32
  readonly collapseRequested: import("@angular/core").OutputEmitterRef<void>;
21
33
  readonly maxColumns: import("@angular/core").Signal<number>;
22
34
  readonly allComponents: import("@angular/core").Signal<ReportComponentDefinition[]>;
35
+ readonly gridDataSource: import("@angular/core").Signal<ReportDataSourceDefinition | undefined>;
36
+ constructor();
23
37
  readonly propertySchema: import("@angular/core").Signal<PropertyDefinition[]>;
24
38
  setTab(tab: DesignerActiveTab): void;
25
39
  updateCompDataSource(id: string, dataSource: ComponentDataSourceDefinition): void;
@@ -41,6 +55,11 @@ export declare class PropertyEditorComponent {
41
55
  updateColumn(index: number, field: string, value: unknown): void;
42
56
  updateGridOption(field: string, value: unknown): void;
43
57
  updateGridRowClickAction(action: GridRowClickAction | undefined): void;
58
+ onGridEntityChanged(event: {
59
+ name: string;
60
+ type: 'stored_procedure' | 'table';
61
+ }): void;
62
+ onGridDataSourceParametersChanged(mappings: Record<string, unknown>): void;
44
63
  autoDetectGridColumns(): void;
45
64
  readonly expandedSections: import("@angular/core").WritableSignal<Record<string, boolean>>;
46
65
  toggleSection(section: string): void;
@@ -2,6 +2,7 @@ import { ReportDefinition } from '../../../core/models/report-definition.model';
2
2
  import { ReportComponentDefinition } from '../../../core/models/report-component.model';
3
3
  import { ComponentLayoutDefinition } from '../../../core/models/report-layout.model';
4
4
  import { ReportGridDefinition } from '../../../core/models/report-grid.model';
5
+ import { ReportDataSourceDefinition } from '../../../core/models/report-datasource.model';
5
6
  import * as i0 from "@angular/core";
6
7
  export type DesignerViewMode = 'design' | 'preview' | 'json';
7
8
  export type DesignerActiveTab = 'properties' | 'report' | 'grid';
@@ -80,7 +81,17 @@ export declare class DesignerStateService {
80
81
  /**
81
82
  * Updates grid definition settings.
82
83
  */
83
- updateGridSettings(grid: ReportGridDefinition | undefined): void;
84
+ updateGridSettings(grid: ReportGridDefinition | undefined, options?: {
85
+ skipHistory?: boolean;
86
+ }): void;
87
+ /**
88
+ * Sets or updates the primary data source for the report's result grid.
89
+ */
90
+ setGridDataSource(ds: ReportDataSourceDefinition): void;
91
+ /**
92
+ * Updates the parameter mappings for the primary grid data source.
93
+ */
94
+ updateGridDataSourceParameters(mappings: Record<string, unknown>): void;
84
95
  /**
85
96
  * Reverts to the previous state in history.
86
97
  */
@@ -5,6 +5,9 @@ export declare class RptGridOutletDirective implements OnDestroy {
5
5
  private readonly vcr;
6
6
  private compRef;
7
7
  private subs;
8
+ private lastEmittedReportState;
9
+ private lastEmittedColumnDefs;
10
+ private readonly appliedInputs;
8
11
  readonly componentType: import("@angular/core").InputSignal<Type<any> | null>;
9
12
  readonly inputs: import("@angular/core").InputSignal<Record<string, unknown>>;
10
13
  readonly gridStateChange: import("@angular/core").OutputEmitterRef<any>;
@@ -16,6 +19,8 @@ export declare class RptGridOutletDirective implements OnDestroy {
16
19
  }>;
17
20
  readonly selectionChange: import("@angular/core").OutputEmitterRef<any[]>;
18
21
  constructor();
22
+ private isReportStateMatching;
23
+ private isColumnDefsMatching;
19
24
  private recreateComponent;
20
25
  private clear;
21
26
  ngOnDestroy(): void;
@@ -24,6 +29,7 @@ export declare class RptGridOutletDirective implements OnDestroy {
24
29
  }
25
30
  export declare class ReportGridBridgeComponent {
26
31
  private readonly injectedGrid;
32
+ private readonly storage;
27
33
  constructor();
28
34
  readonly gridDefinition: import("@angular/core").InputSignal<ReportGridDefinition>;
29
35
  readonly data: import("@angular/core").InputSignal<unknown[]>;
@@ -97,35 +103,7 @@ export declare class ReportGridBridgeComponent {
97
103
  statusBar: boolean;
98
104
  rowClickAction?: import("../../core/models/report-grid.model").GridRowClickAction;
99
105
  }>;
100
- readonly gridReportState: import("@angular/core").Signal<{
101
- columnGroupDefs: null;
102
- columnDefs: {
103
- headerName: string;
104
- header: string;
105
- title: string;
106
- hide: boolean;
107
- width: number | undefined;
108
- aggFunc: "sum" | "avg" | "count" | "min" | "max" | undefined;
109
- checkboxSelection: boolean | undefined;
110
- headerCheckboxSelection: boolean | undefined;
111
- field: string;
112
- label: string;
113
- dataType?: "string" | "number" | "date" | "boolean" | "currency";
114
- format?: string;
115
- sortable?: boolean;
116
- filterable?: boolean;
117
- align?: "left" | "center" | "right";
118
- visible?: boolean;
119
- pinned?: "left" | "right" | false;
120
- order?: number;
121
- aggregate?: "sum" | "avg" | "count" | "min" | "max" | "none";
122
- action?: import("../../core/models/report-grid.model").GridRowClickAction;
123
- }[];
124
- sortModel: any;
125
- groupModel: string[];
126
- activeFilters: {};
127
- highlightRules: never[];
128
- }>;
106
+ readonly gridReportState: import("@angular/core").Signal<any>;
129
107
  readonly gridInputs: import("@angular/core").Signal<{
130
108
  columns: {
131
109
  headerName: string;
@@ -199,35 +177,7 @@ export declare class ReportGridBridgeComponent {
199
177
  statusBar: boolean;
200
178
  rowClickAction?: import("../../core/models/report-grid.model").GridRowClickAction;
201
179
  };
202
- reportState: {
203
- columnGroupDefs: null;
204
- columnDefs: {
205
- headerName: string;
206
- header: string;
207
- title: string;
208
- hide: boolean;
209
- width: number | undefined;
210
- aggFunc: "sum" | "avg" | "count" | "min" | "max" | undefined;
211
- checkboxSelection: boolean | undefined;
212
- headerCheckboxSelection: boolean | undefined;
213
- field: string;
214
- label: string;
215
- dataType?: "string" | "number" | "date" | "boolean" | "currency";
216
- format?: string;
217
- sortable?: boolean;
218
- filterable?: boolean;
219
- align?: "left" | "center" | "right";
220
- visible?: boolean;
221
- pinned?: "left" | "right" | false;
222
- order?: number;
223
- aggregate?: "sum" | "avg" | "count" | "min" | "max" | "none";
224
- action?: import("../../core/models/report-grid.model").GridRowClickAction;
225
- }[];
226
- sortModel: any;
227
- groupModel: string[];
228
- activeFilters: {};
229
- highlightRules: never[];
230
- };
180
+ reportState: any;
231
181
  pagination: boolean;
232
182
  pageSize: number;
233
183
  rowSelection: "single" | "multiple";
@@ -10,6 +10,7 @@ export declare class RptDropdownComponent implements OnDestroy {
10
10
  private readonly masterDataProvider;
11
11
  private readonly lookupAdapter;
12
12
  private readonly sessionService;
13
+ private readonly reportingConfig;
13
14
  private readonly elementRef;
14
15
  readonly config: import("@angular/core").InputSignal<ReportComponentDefinition>;
15
16
  readonly control: import("@angular/core").InputSignal<FormControl<any> | null | undefined>;
@@ -66,6 +67,8 @@ export declare class RptDropdownComponent implements OnDestroy {
66
67
  closeDropdown(): void;
67
68
  selectOption(opt: DropdownOption): void;
68
69
  clearSelection(event: Event): void;
70
+ /** Manually retry loading dynamic lookup options (e.g. after database timeout). */
71
+ retryLookup(event?: Event): void;
69
72
  clearSearch(event: Event): void;
70
73
  onSearchInput(event: Event): void;
71
74
  onTriggerKeydown(event: KeyboardEvent): void;
@@ -23,6 +23,7 @@ export declare enum ReportingFeatureKind {
23
23
  */
24
24
  export interface ReportingFeature<KindT extends ReportingFeatureKind = ReportingFeatureKind> {
25
25
  ɵkind: KindT;
26
+ ɵconfig?: Partial<ReportingConfig>;
26
27
  ɵproviders: Provider[];
27
28
  }
28
29
  /**
@@ -34,6 +35,11 @@ export interface HttpAdaptersOptions {
34
35
  * @example 'http://localhost:3000/api/reporting'
35
36
  */
36
37
  apiBaseUrl: string;
38
+ /**
39
+ * Optional custom timeout in milliseconds for database lookup queries.
40
+ * Defaults to 300000ms (5 minutes).
41
+ */
42
+ lookupTimeoutMs?: number;
37
43
  }
38
44
  /**
39
45
  * Configures the built-in HTTP adapters for backend execution, persistence,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bways-report",
3
- "version": "0.1.4",
3
+ "version": "0.1.6",
4
4
  "description": "Enterprise-grade, metadata-driven reporting engine and visual page builder for Angular 18+ ERP applications.",
5
5
  "keywords": [
6
6
  "angular",
@@ -15,6 +15,14 @@
15
15
  ],
16
16
  "author": "CCPL / BWays Team",
17
17
  "license": "SEE LICENSE IN LICENSE",
18
+ "repository": {
19
+ "type": "git",
20
+ "url": "git+https://github.com/ccplProject/BWays-CustomeReport.git"
21
+ },
22
+ "homepage": "https://github.com/ccplProject/BWays-CustomeReport#readme",
23
+ "bugs": {
24
+ "url": "https://github.com/ccplProject/BWays-CustomeReport/issues"
25
+ },
18
26
  "peerDependencies": {
19
27
  "@angular/common": ">=18.0.0",
20
28
  "@angular/core": ">=18.0.0",