@memberjunction/ng-entity-viewer 6.2.0-edge.0 → 6.2.0-edge.1
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.
- package/dist/lib/aggregate-setup-dialog/aggregate-setup-dialog.component.d.ts +22 -0
- package/dist/lib/aggregate-setup-dialog/aggregate-setup-dialog.component.d.ts.map +1 -1
- package/dist/lib/aggregate-setup-dialog/aggregate-setup-dialog.component.js +57 -13
- package/dist/lib/aggregate-setup-dialog/aggregate-setup-dialog.component.js.map +1 -1
- package/dist/lib/entity-cards/entity-cards.component.d.ts +67 -5
- package/dist/lib/entity-cards/entity-cards.component.d.ts.map +1 -1
- package/dist/lib/entity-cards/entity-cards.component.js +202 -71
- package/dist/lib/entity-cards/entity-cards.component.js.map +1 -1
- package/dist/lib/entity-data-grid/entity-data-grid.component.d.ts +159 -16
- package/dist/lib/entity-data-grid/entity-data-grid.component.d.ts.map +1 -1
- package/dist/lib/entity-data-grid/entity-data-grid.component.js +446 -147
- package/dist/lib/entity-data-grid/entity-data-grid.component.js.map +1 -1
- package/dist/lib/entity-data-grid/events/grid-events.js +67 -67
- package/dist/lib/entity-data-grid/events/grid-events.js.map +1 -1
- package/dist/lib/entity-record-detail-panel/entity-record-detail-panel.component.d.ts +112 -8
- package/dist/lib/entity-record-detail-panel/entity-record-detail-panel.component.d.ts.map +1 -1
- package/dist/lib/entity-record-detail-panel/entity-record-detail-panel.component.js +245 -61
- package/dist/lib/entity-record-detail-panel/entity-record-detail-panel.component.js.map +1 -1
- package/dist/lib/entity-viewer/entity-viewer.component.d.ts +6 -0
- package/dist/lib/entity-viewer/entity-viewer.component.d.ts.map +1 -1
- package/dist/lib/entity-viewer/entity-viewer.component.js +28 -9
- package/dist/lib/entity-viewer/entity-viewer.component.js.map +1 -1
- package/dist/lib/pill/pill.component.d.ts +13 -3
- package/dist/lib/pill/pill.component.d.ts.map +1 -1
- package/dist/lib/pill/pill.component.js +34 -10
- package/dist/lib/pill/pill.component.js.map +1 -1
- package/dist/lib/quick-save-dialog/quick-save-dialog.component.d.ts +29 -3
- package/dist/lib/quick-save-dialog/quick-save-dialog.component.d.ts.map +1 -1
- package/dist/lib/quick-save-dialog/quick-save-dialog.component.js +173 -114
- package/dist/lib/quick-save-dialog/quick-save-dialog.component.js.map +1 -1
- package/dist/lib/recycle-bin/recycle-bin.component.d.ts +4 -0
- package/dist/lib/recycle-bin/recycle-bin.component.d.ts.map +1 -1
- package/dist/lib/recycle-bin/recycle-bin.component.js +10 -2
- package/dist/lib/recycle-bin/recycle-bin.component.js.map +1 -1
- package/dist/lib/utils/highlight.util.d.ts +6 -0
- package/dist/lib/utils/highlight.util.d.ts.map +1 -1
- package/dist/lib/utils/highlight.util.js +23 -11
- package/dist/lib/utils/highlight.util.js.map +1 -1
- package/dist/lib/utils/record.util.d.ts +10 -0
- package/dist/lib/utils/record.util.d.ts.map +1 -1
- package/dist/lib/utils/record.util.js +20 -4
- package/dist/lib/utils/record.util.js.map +1 -1
- package/dist/lib/view-config-panel/view-config-panel.component.d.ts +17 -1
- package/dist/lib/view-config-panel/view-config-panel.component.d.ts.map +1 -1
- package/dist/lib/view-config-panel/view-config-panel.component.js +39 -6
- package/dist/lib/view-config-panel/view-config-panel.component.js.map +1 -1
- package/dist/lib/view-selector/view-selector.component.js +2 -2
- package/dist/lib/view-types/renderers/cards-view-renderer.component.d.ts +15 -3
- package/dist/lib/view-types/renderers/cards-view-renderer.component.d.ts.map +1 -1
- package/dist/lib/view-types/renderers/cards-view-renderer.component.js +33 -5
- package/dist/lib/view-types/renderers/cards-view-renderer.component.js.map +1 -1
- package/dist/lib/view-types/renderers/grid-view-renderer.component.d.ts +70 -2
- package/dist/lib/view-types/renderers/grid-view-renderer.component.d.ts.map +1 -1
- package/dist/lib/view-types/renderers/grid-view-renderer.component.js +155 -33
- package/dist/lib/view-types/renderers/grid-view-renderer.component.js.map +1 -1
- package/dist/lib/view-types/renderers/map-view-renderer.component.d.ts +16 -2
- package/dist/lib/view-types/renderers/map-view-renderer.component.d.ts.map +1 -1
- package/dist/lib/view-types/renderers/map-view-renderer.component.js +37 -9
- package/dist/lib/view-types/renderers/map-view-renderer.component.js.map +1 -1
- package/dist/lib/view-types/view-type.contracts.d.ts +8 -0
- package/dist/lib/view-types/view-type.contracts.d.ts.map +1 -1
- package/dist/lib/view-types/view-type.contracts.js.map +1 -1
- package/dist/lib/view-workspace/view-workspace.component.d.ts +243 -25
- package/dist/lib/view-workspace/view-workspace.component.d.ts.map +1 -1
- package/dist/lib/view-workspace/view-workspace.component.js +631 -180
- package/dist/lib/view-workspace/view-workspace.component.js.map +1 -1
- package/package.json +21 -20
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entity-data-grid.component.js","sourceRoot":"","sources":["../../../src/lib/entity-data-grid/entity-data-grid.component.ts","../../../src/lib/entity-data-grid/entity-data-grid.component.html"],"names":[],"mappings":"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","sourcesContent":["import {\n Component,\n Input,\n Output,\n EventEmitter,\n OnInit,\n OnDestroy,\n ChangeDetectorRef,\n ElementRef,\n ViewChild,\n NgZone\n} from '@angular/core';\nimport { trigger, transition, style, animate } from '@angular/animations';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport type { EntityActionUXContext, EntityActionUXResult } from '@memberjunction/ng-entity-action-ux';\nimport { Subject } from 'rxjs';\nimport { debounceTime, takeUntil } from 'rxjs/operators';\nimport { LogError, RunView, RunViewParams, Metadata, EntityInfo, EntityFieldInfo, AggregateResult, AggregateValue, AggregateExpression, CoerceImageSrc, ParseCssHexColor, CompositeKey, IsDateOnlySQLType, FormatDateOnly, EntityFieldTSType } from '@memberjunction/core';\nimport { UUIDsEqual } from '@memberjunction/global';\nimport { EntityActionEngineBase } from '@memberjunction/actions-base';\nimport { PageChangeEvent } from '@memberjunction/ng-pagination';\nimport { buildPkString, canonicalizeColumnFields, computeFieldsList } from '../utils/record.util';\nimport { AggregateField } from '../utils/aggregate-field.util';\nimport {\n MJUserViewEntityExtended,\n ViewInfo,\n ViewGridState,\n UserViewEngine,\n UserInfoEngine,\n MJUserViewEntity_IColumnFormat as ColumnFormat,\n MJUserViewEntity_IColumnTextStyle as ColumnTextStyle,\n MJUserViewEntity_IGridAggregatesConfig as ViewGridAggregatesConfig,\n MJUserViewEntity_IGridAggregate as ViewGridAggregate\n} from '@memberjunction/core-entities';\nimport {\n ColDef,\n GridReadyEvent,\n RowClickedEvent,\n GridApi,\n RowDoubleClickedEvent,\n ModuleRegistry,\n AllCommunityModule,\n RowSelectionOptions,\n GetRowIdParams,\n themeAlpine,\n SortChangedEvent as AgSortChangedEvent,\n type Theme,\n ColumnResizedEvent,\n ColumnMovedEvent,\n SelectionChangedEvent,\n CellClickedEvent,\n ICellRendererParams,\n IDatasource,\n IGetRowsParams,\n GridOptions\n} from 'ag-grid-community';\n// Use the existing HighlightUtil from entity-viewer package\nimport { HighlightUtil } from '../utils/highlight.util';\nimport {\n GridSelectionMode,\n GridEditMode,\n GridLinesMode,\n GridColumnConfig,\n GridToolbarConfig,\n GridToolbarButton,\n DataGridSortState,\n FilterState,\n PendingChange,\n GridState,\n GridRowData,\n ColumnRuntimeState,\n GridRunViewParams,\n ViewGridColumnSetting,\n ViewGridSortSetting,\n GridStateChangedEvent,\n EntityActionConfig,\n GridVisualConfig,\n DEFAULT_VISUAL_CONFIG,\n ForeignKeyClickEvent\n} from './models/grid-types';\nimport {\n BeforeRowSelectEventArgs,\n AfterRowSelectEventArgs,\n BeforeRowDeselectEventArgs,\n AfterRowDeselectEventArgs,\n BeforeRowClickEventArgs,\n AfterRowClickEventArgs,\n BeforeRowDoubleClickEventArgs,\n AfterRowDoubleClickEventArgs,\n BeforeCellEditEventArgs,\n AfterCellEditBeginEventArgs,\n BeforeCellEditCommitEventArgs,\n AfterCellEditCommitEventArgs,\n BeforeCellEditCancelEventArgs,\n AfterCellEditCancelEventArgs,\n BeforeRowSaveEventArgs,\n AfterRowSaveEventArgs,\n BeforeRowDeleteEventArgs,\n AfterRowDeleteEventArgs,\n BeforeDataLoadEventArgs,\n AfterDataLoadEventArgs,\n BeforeDataRefreshEventArgs,\n AfterDataRefreshEventArgs,\n BeforeSortEventArgs,\n AfterSortEventArgs,\n BeforeColumnReorderEventArgs,\n AfterColumnReorderEventArgs,\n BeforeColumnResizeEventArgs,\n AfterColumnResizeEventArgs,\n BeforeColumnVisibilityChangeEventArgs,\n AfterColumnVisibilityChangeEventArgs\n} from './events/grid-events';\nimport {\n ExportService,\n ExportDialogConfig,\n ExportDialogResult\n} from '@memberjunction/ng-export-service';\nimport {\n ExportOptions,\n ExportResult,\n ExportColumn,\n ExportData\n} from '@memberjunction/export-engine';\n\n// Register AG Grid modules (required for v34+)\nModuleRegistry.registerModules([AllCommunityModule]);\n\n/**\n * A modern, flexible data grid component for displaying and managing entity data.\n * Built on AG Grid Community edition with a rich Before/After cancelable event system.\n *\n * Features:\n * - RunView-based data loading with automatic refresh\n * - AG Grid for high-performance rendering\n * - Rich event system with Before/After cancelable patterns\n * - Column configuration with type-aware formatters\n * - Row selection (single, multiple, checkbox modes)\n * - Inline cell and row editing\n * - Column reordering, resizing, and visibility toggle\n * - State persistence to User Settings\n * - Compatible with ViewGridState from User Views\n *\n * @example\n * ```html\n * <mj-entity-data-grid\n * [entityName]=\"'Contacts'\"\n * [showToolbar]=\"true\"\n * [allowSorting]=\"true\"\n * [selectionMode]=\"'multiple'\"\n * (afterRowDoubleClick)=\"onRowDoubleClick($event)\">\n * </mj-entity-data-grid>\n * ```\n */\n\n/**\n * Floor for a column declared `width: 'auto'` (see `mapColumnConfigToColDef`). A flex column with no\n * `minWidth` collapses toward zero once its fixed siblings claim the row, so the \"fill the slack\"\n * column would paradoxically become the narrowest one on a crowded grid. 160px is roughly the width\n * at which a text cell still reads as a sentence rather than a fragment. Overridable per column via\n * `GridColumnConfig.minWidth`.\n */\nconst AUTO_WIDTH_COLUMN_MIN_PX = 160;\n\n/** Column id of the inert width-filler appended when `FillWidth` is on. See `buildFillerColumnDef`. */\nconst FILLER_COLUMN_ID = '__mjFill';\n\n/**\n * Flex weight given to a `width: 'auto'` column so it outranks the filler when leftover row width is\n * shared out. Any value that dwarfs the filler's weight of 1 works; the effect is \"this column takes\n * what it needs (up to its maxWidth) and the filler takes the remainder\", rather than a 50/50 split.\n */\nconst AUTO_WIDTH_FLEX_WEIGHT = 1000;\n\n@Component({\n standalone: false,\n selector: 'mj-entity-data-grid',\n templateUrl: './entity-data-grid.component.html',\n styleUrls: ['./entity-data-grid.component.css'],\n animations: [\n trigger('fadeIn', [\n transition(':enter', [\n style({ opacity: 0, transform: 'translateY(-8px)' }),\n animate('150ms ease-out', style({ opacity: 1, transform: 'translateY(0)' }))\n ]),\n transition(':leave', [\n animate('100ms ease-in', style({ opacity: 0, transform: 'translateY(-8px)' }))\n ])\n ])\n ]\n})\nexport class EntityDataGridComponent extends BaseAngularComponent implements OnInit, OnDestroy {\n // ========================================\n // Data Source Inputs (RunViewParams-based)\n // ========================================\n\n private _params: RunViewParams | null = null;\n /**\n * RunViewParams for data loading - the primary way to specify data source.\n * Supports stored views (ViewID, ViewName, ViewEntity) and dynamic views (EntityName + filters).\n * Mutually exclusive with the legacy entityName/extraFilter inputs.\n * When Params is provided, it takes precedence over legacy inputs.\n */\n @Input()\n set Params(value: RunViewParams | null) {\n const previousValue = this._params;\n this._params = value;\n // Use deep comparison to avoid triggering changes when the same params are passed\n // as a new object reference (common with template bindings like BuildRelationshipViewParamsByEntityName)\n if (!RunViewParams.Equals(value, previousValue)) {\n this.onParamsChanged();\n }\n }\n get Params(): RunViewParams | null {\n return this._params;\n }\n\n private _allowLoad: boolean = true;\n /**\n * Controls whether data loading is allowed.\n * Set to false to defer loading until ready (useful for complex forms where params may change multiple times).\n * When set to true and Params is provided, triggers a data load.\n */\n @Input()\n set AllowLoad(value: boolean) {\n const previousValue = this._allowLoad;\n this._allowLoad = value;\n if (value && !previousValue && this._params) {\n // AllowLoad was just enabled and we have params - load now\n this.loadData(false);\n }\n }\n get AllowLoad(): boolean {\n return this._allowLoad;\n }\n\n private _autoRefreshOnParamsChange: boolean = true;\n /**\n * When true, automatically refreshes data when Params changes.\n * When false, you must call Refresh() manually after changing Params.\n */\n @Input()\n set AutoRefreshOnParamsChange(value: boolean) {\n this._autoRefreshOnParamsChange = value;\n }\n get AutoRefreshOnParamsChange(): boolean {\n return this._autoRefreshOnParamsChange;\n }\n\n // ========================================\n // Pagination Inputs\n // ========================================\n\n private _paginationMode: 'client' | 'infinite' = 'client';\n /**\n * Pagination mode for the grid:\n * - 'client': All data loaded upfront (default, legacy behavior)\n * - 'infinite': Server-side pagination with infinite scroll (recommended for large datasets)\n */\n @Input()\n set PaginationMode(value: 'client' | 'infinite') {\n this._paginationMode = value;\n }\n get PaginationMode(): 'client' | 'infinite' {\n return this._paginationMode;\n }\n\n private _pageSize: number = 100;\n /**\n * Number of rows to fetch per page when using infinite pagination mode.\n * Default is 100 rows per page.\n */\n @Input()\n set PageSize(value: number) {\n this._pageSize = value;\n }\n get PageSize(): number {\n return this._pageSize;\n }\n\n private _cacheBlockSize: number = 100;\n /**\n * Size of each cache block in infinite scroll mode.\n * Should match or be a multiple of PageSize for optimal performance.\n */\n @Input()\n set CacheBlockSize(value: number) {\n this._cacheBlockSize = value;\n }\n get CacheBlockSize(): number {\n return this._cacheBlockSize;\n }\n\n private _maxBlocksInCache: number = 10;\n /**\n * Maximum number of blocks to keep in cache.\n * When exceeded, oldest blocks are purged.\n */\n @Input()\n set MaxBlocksInCache(value: number) {\n this._maxBlocksInCache = value;\n }\n get MaxBlocksInCache(): number {\n return this._maxBlocksInCache;\n }\n\n /**\n * Whether to show the shared PaginationComponent below the grid.\n * When true, displays page-based navigation (first/prev/next/last) using the\n * TotalRowCount from server responses. The pager auto-hides when there's only one page.\n */\n @Input() ShowPager: boolean = false;\n\n /**\n * Optional provider that returns the FULL result set for export. Because the grid is server-side\n * paged, `Data`/`rowData` only hold the current page (default 100 rows), so exporting them would\n * silently cap the export at the page size (bug C1). The host (entity-viewer) supplies this callback\n * to fetch every matching row (honoring the active filter/sort) on demand; the grid awaits it when\n * the user opens the export dialog. When not provided, export falls back to the loaded page.\n */\n @Input() ExportDataProvider: (() => Promise<Record<string, unknown>[]>) | null = null;\n\n /** True while an export is fetching the full result set via ExportDataProvider. */\n public IsPreparingExport: boolean = false;\n\n /** True while \"Add to List\" (with no explicit selection) is fetching the full result set. */\n public IsPreparingAddToList: boolean = false;\n\n /**\n * Whether to render the Recycle Bin chip in the toolbar. The chip\n * auto-hides itself when the entity has no deleted records, doesn't\n * track changes, or the user lacks Delete permission — so it stays\n * out of the way on entities where it's not relevant.\n * @default true\n */\n @Input() ShowRecycleBin: boolean = true;\n\n /**\n * Convenience accessor for the resolved entity name. Returns null when\n * the entity hasn't been resolved yet (e.g., before data loads).\n */\n public get entityInfoName(): string | null {\n return this._entityInfo?.Name ?? null;\n }\n\n /**\n * Current page number for the shared pager (1-based).\n * Set by parent when using external data with server-side paging.\n */\n @Input() PagerPageNumber: number = 1;\n\n /**\n * Total row count from server for the shared pager.\n * When using external data ([Data] input), the parent must set this\n * so the pager knows the total number of rows across all pages.\n */\n @Input()\n set TotalRowCount(value: number) {\n this.totalRowCount = value;\n }\n\n /**\n * Emits when the user navigates to a different page via the shared PaginationComponent.\n * Parent components should handle this by re-fetching data with updated StartRow/MaxRows.\n */\n @Output() PageChange = new EventEmitter<PageChangeEvent>();\n\n // ========================================\n // External Data Input\n // ========================================\n\n private _data: Record<string, unknown>[] = [];\n /**\n * Pre-loaded data (bypass RunView, use provided data).\n * When provided, the grid displays this data instead of loading via RunView.\n * Parent component is responsible for data loading and passing results here.\n */\n @Input()\n set Data(value: Record<string, unknown>[]) {\n const hadData = this._data.length > 0;\n this._data = value || [];\n this._useExternalData = this._data.length > 0;\n if (this._useExternalData || hadData) {\n // Suppress sort events during data update to prevent AG Grid from clearing\n // our saved sort state when it processes the new row data\n const savedSortState = [...this._sortState];\n this.suppressSortEvents = true;\n\n try {\n this.processData();\n } finally {\n this.suppressSortEvents = false;\n }\n\n // Reapply sort state to grid after data changes to maintain visual indicators\n // Use microtask to ensure AG Grid has processed the new row data first\n if (this.gridApi && savedSortState.length > 0) {\n // Restore sort state in case it was cleared during processData\n this._sortState = savedSortState;\n Promise.resolve().then(() => {\n this.applySortStateToGrid();\n });\n }\n }\n }\n get Data(): Record<string, unknown>[] {\n return this._data;\n }\n\n // ========================================\n // Column Configuration Inputs\n // ========================================\n\n private _columns: GridColumnConfig[] = [];\n\n /**\n * True when `_columns` holds a list the HOST supplied via `[Columns]`, as opposed to one derived\n * from a saved view or generated from entity metadata. Both origins share `_columns`, and a\n * host-supplied list is an explicit instruction that must outlive view/params churn — whereas a\n * derived one is disposable and should be rebuilt when the view changes.\n */\n private _columnsFromHost: boolean = false;\n\n /**\n * True when `_gridState` was adopted from this user's saved entity-browser default rather than\n * supplied by the host. Such a state is a convenience, not an instruction, so an explicit\n * `[Columns]` may discard it; a host-passed `[GridState]` never is.\n */\n private _gridStateFromUserDefault: boolean = false;\n /**\n * Column definitions - if not provided, auto-generates from entity metadata\n */\n @Input()\n set Columns(value: GridColumnConfig[]) {\n this._columns = value || [];\n // Remember that THIS list came from the host, not from metadata/a saved view. `_columns` is\n // shared by both origins, and code that resets it needs to tell them apart — see the reset in\n // the dynamic-view branch of the params handler.\n this._columnsFromHost = this._columns.length > 0;\n // Angular assigns inputs in template order, and `[Params]` is conventionally bound before\n // `[Columns]`. That means the params handler may already have adopted this user's saved\n // entity-browser default into `_gridState` while `_columnsFromHost` was still false — and\n // `buildAgColumnDefs()` prefers `_gridState`, so the host's list would lose despite the guard\n // there. An explicit `[Columns]` arriving at ANY point supersedes a merely-inherited default,\n // so drop it. A `_gridState` the host passed deliberately via `[GridState]` is left alone.\n if (this._columnsFromHost && this._gridStateFromUserDefault) {\n this._gridState = null;\n this._gridStateFromUserDefault = false;\n }\n // Put the host's field names into the entity's spelling before anything derives from them.\n // No-op when `[Params]` has not resolved the entity yet — the params handler repeats it.\n this.canonicalizeHostColumns();\n if (this._columns.length > 0) {\n this.initializeColumnStates();\n this.buildAgColumnDefs();\n }\n }\n get Columns(): GridColumnConfig[] {\n return this._columns;\n }\n\n private _gridState: ViewGridState | null = null;\n /**\n * Grid state from a User View - controls columns, widths, order, sort\n * When provided, this takes precedence over auto-generated columns\n */\n @Input()\n set GridState(value: ViewGridState | null) {\n const previousValue = this._gridState;\n this._gridState = value;\n if (value !== previousValue) {\n if (value) {\n this.onGridStateChanged();\n } else if (previousValue) {\n // Grid state was cleared (e.g. switching to entity with no saved view) -\n // rebuild columns from entity metadata instead of retaining stale columns\n this.buildAgColumnDefs();\n }\n }\n }\n get GridState(): ViewGridState | null {\n return this._gridState;\n }\n\n private _allowColumnReorder: boolean = true;\n @Input()\n set AllowColumnReorder(value: boolean) {\n this._allowColumnReorder = value;\n }\n get AllowColumnReorder(): boolean {\n return this._allowColumnReorder;\n }\n\n private _allowColumnResize: boolean = true;\n @Input()\n set AllowColumnResize(value: boolean) {\n this._allowColumnResize = value;\n }\n get AllowColumnResize(): boolean {\n return this._allowColumnResize;\n }\n\n private _allowColumnToggle: boolean = true;\n @Input()\n set AllowColumnToggle(value: boolean) {\n this._allowColumnToggle = value;\n }\n get AllowColumnToggle(): boolean {\n return this._allowColumnToggle;\n }\n\n private _showHeader: boolean = true;\n @Input()\n set ShowHeader(value: boolean) {\n this._showHeader = value;\n }\n get ShowHeader(): boolean {\n return this._showHeader;\n }\n\n // ========================================\n // Sorting & Filtering Inputs\n // ========================================\n\n private _allowSorting: boolean = true;\n @Input()\n set AllowSorting(value: boolean) {\n this._allowSorting = value;\n }\n get AllowSorting(): boolean {\n return this._allowSorting;\n }\n\n private _allowMultiSort: boolean = true;\n @Input()\n set AllowMultiSort(value: boolean) {\n this._allowMultiSort = value;\n }\n get AllowMultiSort(): boolean {\n return this._allowMultiSort;\n }\n\n private _serverSideSorting: boolean = true;\n /**\n * Whether sorting is handled server-side\n * When true, sort changes trigger a new data load\n */\n @Input()\n set ServerSideSorting(value: boolean) {\n this._serverSideSorting = value;\n }\n get ServerSideSorting(): boolean {\n return this._serverSideSorting;\n }\n\n private _allowColumnFilters: boolean = false;\n @Input()\n set AllowColumnFilters(value: boolean) {\n this._allowColumnFilters = value;\n }\n get AllowColumnFilters(): boolean {\n return this._allowColumnFilters;\n }\n\n private _showSearch: boolean = true;\n @Input()\n set ShowSearch(value: boolean) {\n this._showSearch = value;\n }\n get ShowSearch(): boolean {\n return this._showSearch;\n }\n\n // ========================================\n // Selection Inputs\n // ========================================\n\n private _selectionMode: GridSelectionMode = 'single';\n @Input()\n set SelectionMode(value: GridSelectionMode) {\n this._selectionMode = value;\n this.updateAgRowSelection();\n if (value === 'none') {\n this.ClearSelection();\n }\n }\n get SelectionMode(): GridSelectionMode {\n return this._selectionMode;\n }\n\n private _selectedKeys: string[] = [];\n @Input()\n set SelectedKeys(value: string[]) {\n this._selectedKeys = value || [];\n this.updateRowSelectionState();\n }\n get SelectedKeys(): string[] {\n return this._selectedKeys;\n }\n\n private _keyField: string = 'ID';\n @Input()\n set KeyField(value: string) {\n this._keyField = value || 'ID';\n }\n get KeyField(): string {\n return this._keyField;\n }\n\n // ========================================\n // Editing Inputs\n // ========================================\n\n private _editMode: GridEditMode = 'none';\n @Input()\n set EditMode(value: GridEditMode) {\n this._editMode = value;\n }\n get EditMode(): GridEditMode {\n return this._editMode;\n }\n\n private _allowAdd: boolean = false;\n @Input()\n set AllowAdd(value: boolean) {\n this._allowAdd = value;\n }\n get AllowAdd(): boolean {\n return this._allowAdd;\n }\n\n private _allowDelete: boolean = false;\n @Input()\n set AllowDelete(value: boolean) {\n this._allowDelete = value;\n }\n get AllowDelete(): boolean {\n return this._allowDelete;\n }\n\n // ========================================\n // Display Inputs\n // ========================================\n\n private _height: number | 'auto' | 'fit-content' = 'auto';\n @Input()\n set Height(value: number | 'auto' | 'fit-content') {\n this._height = value;\n }\n get Height(): number | 'auto' | 'fit-content' {\n return this._height;\n }\n\n /** Hug-height related grids get a top-aligned inline empty, not a padded hero. */\n get EmptyStateSize(): 'inline' | 'default' {\n return typeof this._height === 'number' ? 'inline' : 'default';\n }\n\n private _rowHeight: number = 40;\n @Input()\n set RowHeight(value: number) {\n this._rowHeight = value;\n }\n get RowHeight(): number {\n return this._rowHeight;\n }\n\n /**\n * Enable text wrapping in grid cells\n * When true, long text will wrap to multiple lines and rows will auto-size\n * Note: This disables fixed row height and may impact performance with large datasets\n */\n private _wrapText: boolean = false;\n @Input()\n set WrapText(value: boolean) {\n if (this._wrapText !== value) {\n this._wrapText = value;\n this.updateDefaultColDefForWrapping();\n }\n }\n get WrapText(): boolean {\n return this._wrapText;\n }\n\n private _virtualScroll: boolean = true;\n @Input()\n set VirtualScroll(value: boolean) {\n this._virtualScroll = value;\n }\n get VirtualScroll(): boolean {\n return this._virtualScroll;\n }\n\n private _showRowNumbers: boolean = false;\n @Input()\n set ShowRowNumbers(value: boolean) {\n this._showRowNumbers = value;\n this.buildAgColumnDefs();\n }\n get ShowRowNumbers(): boolean {\n return this._showRowNumbers;\n }\n\n /**\n * Append an inert trailing column that soaks up leftover row width, so the row backgrounds, banding\n * and horizontal rules reach the container's right edge rather than stopping wherever the last real\n * column happens to end (which reads as a half-drawn table inside its own card).\n *\n * Off by default: it is purely cosmetic, it changes the look of EVERY grid it is enabled on, and\n * existing layouts were built against the current behaviour. Opt in per grid; flipping the default\n * is a product-wide styling decision, not a per-page one.\n *\n * Composes with `width: 'auto'`: give the text column `width: 'auto'` plus a `maxWidth` so it grows\n * only as far as its content warrants, and the filler takes whatever is left over.\n */\n private _fillWidth: boolean = false;\n @Input()\n set FillWidth(value: boolean) {\n this._fillWidth = value;\n this.buildAgColumnDefs();\n }\n get FillWidth(): boolean {\n return this._fillWidth;\n }\n\n private _striped: boolean = true;\n @Input()\n set Striped(value: boolean) {\n this._striped = value;\n }\n get Striped(): boolean {\n return this._striped;\n }\n\n private _gridLines: GridLinesMode = 'horizontal';\n @Input()\n set GridLines(value: GridLinesMode) {\n this._gridLines = value;\n }\n get GridLines(): GridLinesMode {\n return this._gridLines;\n }\n\n // ========================================\n // Visual Customization Inputs\n // ========================================\n\n private _visualConfig: GridVisualConfig = {};\n /**\n * Visual configuration for the grid appearance.\n * Allows customization of header styles, row colors, cell formatting, and more.\n * All properties are optional - unset properties use attractive defaults.\n */\n @Input()\n set VisualConfig(value: GridVisualConfig) {\n this._visualConfig = value || {};\n this.applyVisualConfig();\n }\n get VisualConfig(): GridVisualConfig {\n return this._visualConfig;\n }\n\n /**\n * Get the effective visual config (user config merged with defaults)\n */\n get effectiveVisualConfig(): Required<GridVisualConfig> {\n return { ...DEFAULT_VISUAL_CONFIG, ...this._visualConfig };\n }\n\n // ========================================\n // Toolbar Inputs\n // ========================================\n\n private _showToolbar: boolean = true;\n @Input()\n set ShowToolbar(value: boolean) {\n this._showToolbar = value;\n }\n get ShowToolbar(): boolean {\n return this._showToolbar;\n }\n\n private _toolbarConfig: GridToolbarConfig = {};\n @Input()\n set ToolbarConfig(value: GridToolbarConfig) {\n this._toolbarConfig = value || {};\n }\n get ToolbarConfig(): GridToolbarConfig {\n return this._toolbarConfig;\n }\n\n // ========================================\n // State Inputs\n // ========================================\n\n private _stateKey: string = '';\n @Input()\n set StateKey(value: string) {\n this._stateKey = value || '';\n if (this._stateKey) {\n this.loadPersistedState();\n }\n }\n get StateKey(): string {\n return this._stateKey;\n }\n\n private _autoPersistState: boolean = true;\n /**\n * When true and using a stored view (ViewID/ViewName/ViewEntity in Params),\n * automatically persists grid state changes (column widths, order, sort) to the UserView entity.\n * Only saves if the user has edit permission on the view.\n * For dynamic views, only emits the gridStateChanged event.\n */\n @Input()\n set AutoPersistState(value: boolean) {\n this._autoPersistState = value;\n }\n get AutoPersistState(): boolean {\n return this._autoPersistState;\n }\n\n private _statePersistDebounce: number = 5000;\n /**\n * Debounce time in milliseconds before persisting state changes to the server.\n * Default is 5000ms (5 seconds) to avoid excessive server calls during rapid column adjustments.\n */\n @Input()\n set StatePersistDebounce(value: number) {\n this._statePersistDebounce = value;\n // Re-setup the debounce subscription with new timing\n this.setupStatePersistDebounce();\n }\n get StatePersistDebounce(): number {\n return this._statePersistDebounce;\n }\n\n private _refreshDebounce: number = 300;\n @Input()\n set RefreshDebounce(value: number) {\n this._refreshDebounce = value;\n }\n get RefreshDebounce(): number {\n return this._refreshDebounce;\n }\n\n // ========================================\n // Highlighting Input\n // ========================================\n\n private _filterText: string = '';\n /**\n * Text to highlight in grid cells.\n * Supports SQL-style % wildcards for pattern matching.\n */\n @Input()\n set FilterText(value: string) {\n const previousValue = this._filterText;\n this._filterText = value || '';\n if (value !== previousValue) {\n this.onFilterTextChanged();\n }\n }\n get FilterText(): string {\n return this._filterText;\n }\n\n // ========================================\n // Predefined Toolbar Button Inputs\n // ========================================\n\n private _showNewButton: boolean = true;\n /**\n * Show the \"New\" button in toolbar (creates new record)\n */\n @Input()\n set ShowNewButton(value: boolean) {\n this._showNewButton = value;\n }\n get ShowNewButton(): boolean {\n return this._showNewButton;\n }\n\n private _showRefreshButton: boolean = true;\n /**\n * Show the \"Refresh\" button in toolbar\n */\n @Input()\n set ShowRefreshButton(value: boolean) {\n this._showRefreshButton = value;\n }\n get ShowRefreshButton(): boolean {\n return this._showRefreshButton;\n }\n\n private _showExportButton: boolean = true;\n /**\n * Show the \"Export\" button in toolbar (opens the export dialog — Excel/CSV/JSON)\n */\n @Input()\n set ShowExportButton(value: boolean) {\n this._showExportButton = value;\n }\n get ShowExportButton(): boolean {\n return this._showExportButton;\n }\n\n private _showDeleteButton: boolean = false;\n /**\n * Show the \"Delete\" button in toolbar (deletes selected rows)\n */\n @Input()\n set ShowDeleteButton(value: boolean) {\n this._showDeleteButton = value;\n }\n get ShowDeleteButton(): boolean {\n return this._showDeleteButton;\n }\n\n private _showCompareButton: boolean = false;\n /**\n * Show the \"Compare\" button in toolbar (compare selected records)\n */\n @Input()\n set ShowCompareButton(value: boolean) {\n this._showCompareButton = value;\n }\n get ShowCompareButton(): boolean {\n return this._showCompareButton;\n }\n\n private _showMergeButton: boolean = false;\n /**\n * Show the \"Merge\" button in toolbar (merge selected records)\n */\n @Input()\n set ShowMergeButton(value: boolean) {\n this._showMergeButton = value;\n }\n get ShowMergeButton(): boolean {\n return this._showMergeButton;\n }\n\n private _showAddToListButton: boolean = false;\n /**\n * Show the \"Add to List\" button in toolbar\n */\n @Input()\n set ShowAddToListButton(value: boolean) {\n this._showAddToListButton = value;\n }\n get ShowAddToListButton(): boolean {\n return this._showAddToListButton;\n }\n\n private _showDuplicateSearchButton: boolean = false;\n /**\n * Show the \"Search for Duplicates\" button in toolbar\n */\n @Input()\n set ShowDuplicateSearchButton(value: boolean) {\n this._showDuplicateSearchButton = value;\n }\n get ShowDuplicateSearchButton(): boolean {\n return this._showDuplicateSearchButton;\n }\n\n private _showCommunicationButton: boolean = false;\n /**\n * Show the \"Send Message\" button in toolbar (if entity supports communication)\n */\n @Input()\n set ShowCommunicationButton(value: boolean) {\n this._showCommunicationButton = value;\n }\n get ShowCommunicationButton(): boolean {\n return this._showCommunicationButton;\n }\n\n // ========================================\n // Navigation Inputs\n // ========================================\n\n private _autoNavigate: boolean = true;\n /**\n * When true, clicking or double-clicking a row will emit a navigation request.\n * The parent component can handle the navigationRequested event to open the record.\n */\n @Input()\n set AutoNavigate(value: boolean) {\n this._autoNavigate = value;\n }\n get AutoNavigate(): boolean {\n return this._autoNavigate;\n }\n\n private _navigateOnDoubleClick: boolean = true;\n /**\n * When true, navigation is triggered on double-click only.\n * When false, navigation is triggered on single click.\n * Only applies when AutoNavigate is true.\n */\n @Input()\n set NavigateOnDoubleClick(value: boolean) {\n this._navigateOnDoubleClick = value;\n }\n get NavigateOnDoubleClick(): boolean {\n return this._navigateOnDoubleClick;\n }\n\n private _createRecordMode: 'Dialog' | 'Tab' = 'Tab';\n /**\n * How to open new records when the \"New\" button is clicked:\n * - 'Tab': Emit event to open in a new tab (default)\n * - 'Dialog': Emit event to open in a dialog\n */\n @Input()\n set CreateRecordMode(value: 'Dialog' | 'Tab') {\n this._createRecordMode = value;\n }\n get CreateRecordMode(): 'Dialog' | 'Tab' {\n return this._createRecordMode;\n }\n\n private _newRecordValues: Record<string, unknown> = {};\n /**\n * Default values to set on new records.\n * These values are passed with the newRecordDialogRequested event.\n */\n @Input()\n set NewRecordValues(value: Record<string, unknown>) {\n this._newRecordValues = value || {};\n }\n get NewRecordValues(): Record<string, unknown> {\n return this._newRecordValues;\n }\n\n // ========================================\n // Entity Actions Inputs\n // ========================================\n\n private _showEntityActionButtons: boolean = false;\n /**\n * When true, displays entity action buttons in the toolbar overflow menu.\n * Entity actions are loaded dynamically based on the current entity.\n * The entityActionsLoaded event is emitted when actions are ready.\n */\n @Input()\n set ShowEntityActionButtons(value: boolean) {\n this._showEntityActionButtons = value;\n if (value && this._entityInfo) {\n this.LoadEntityActionsRequested.emit({ entityInfo: this._entityInfo });\n }\n }\n get ShowEntityActionButtons(): boolean {\n return this._showEntityActionButtons;\n }\n\n private _entityActions: EntityActionConfig[] = [];\n /**\n * Array of entity actions to display in the toolbar.\n * Set this after receiving the entityActionsLoaded event.\n */\n @Input()\n set EntityActions(value: EntityActionConfig[]) {\n this._entityActions = value || [];\n }\n get EntityActions(): EntityActionConfig[] {\n return this._entityActions;\n }\n\n private _autoLoadEntityActions = false;\n private _entityActionsAutoLoaded = false;\n /**\n * When true, the grid resolves the current entity's active EntityActions itself (via the metadata-only\n * `EntityActionEngineBase`) and shows them — no parent wiring or `LoadEntityActionsRequested` handler\n * needed. Buttons appear only when the entity actually has active actions (data-driven). Actions whose\n * invocation names a `RuntimeUXDriverClass` mount that interactive driver in-place when clicked.\n */\n @Input()\n set AutoLoadEntityActions(value: boolean) {\n this._autoLoadEntityActions = value;\n void this.maybeAutoLoadEntityActions();\n }\n get AutoLoadEntityActions(): boolean {\n return this._autoLoadEntityActions;\n }\n\n /** Loads + maps the entity's active actions once, when auto-load is on and the entity is known. */\n private async maybeAutoLoadEntityActions(): Promise<void> {\n if (!this._autoLoadEntityActions || !this._entityInfo || this._entityActionsAutoLoaded) {\n return;\n }\n this._entityActionsAutoLoaded = true;\n try {\n const provider = this.ProviderToUse;\n await EntityActionEngineBase.Instance.Config(false, provider?.CurrentUser, provider);\n const configs = this.mapEntityActionsToConfigs(this._entityInfo.Name);\n if (configs.length > 0) {\n this._entityActions = configs;\n this._showEntityActionButtons = true;\n this.cdr.detectChanges();\n }\n } catch {\n // Non-fatal: leave the action bar empty if the engine can't load.\n this._entityActionsAutoLoaded = false;\n }\n }\n\n /** Maps the entity's active EntityActions to grid configs, carrying the driver key + RecordProcessID. */\n private mapEntityActionsToConfigs(entityName: string): EntityActionConfig[] {\n const engine = EntityActionEngineBase.Instance;\n return engine.GetActionsByEntityName(entityName, 'Active').map((ea): EntityActionConfig => {\n const driverInvocation = engine.Invocations.find(i => UUIDsEqual(i.EntityActionID, ea.ID) && !!i.RuntimeUXDriverClass);\n const recordProcessParam = engine.Params.find(p => UUIDsEqual(p.EntityActionID, ea.ID) && p.ActionParam?.trim().toLowerCase() === 'recordprocessid');\n const config: EntityActionConfig = {\n id: ea.ID,\n name: ea.Action ?? 'Action',\n icon: 'fa-solid fa-bolt',\n runtimeUXDriverClass: driverInvocation?.RuntimeUXDriverClass ?? undefined,\n };\n if (recordProcessParam?.Value) {\n config.metadata = { RecordProcessID: recordProcessParam.Value };\n }\n return config;\n });\n }\n\n // ========================================\n // Aggregate Inputs\n // ========================================\n\n /**\n * Aggregate configuration for the grid.\n * When provided, aggregate expressions are calculated alongside data and displayed:\n * - Column-bound aggregates appear in a pinned bottom row\n * - Card-bound aggregates are exposed via AggregateValues for use with AggregatePanelComponent\n */\n @Input()\n set AggregatesConfig(value: ViewGridAggregatesConfig | null) {\n this._aggregatesConfig = value;\n }\n get AggregatesConfig(): ViewGridAggregatesConfig | null {\n return this._aggregatesConfig;\n }\n\n /**\n * Returns the aggregate values map, keyed by expression or id.\n * Use this to pass values to AggregatePanelComponent.\n */\n public get AggregateValuesMap(): Map<string, AggregateValue> {\n return this._aggregateValues;\n }\n\n /**\n * Returns the raw aggregate results from the last RunView call.\n */\n public get AggregateResultsList(): AggregateResult[] {\n return this._aggregateResults;\n }\n\n /**\n * Whether aggregates are currently loading.\n */\n public get AggregatesLoading(): boolean {\n return this._aggregatesLoading;\n }\n\n /**\n * Returns the effective aggregates config, preferring _aggregatesConfig but falling back to _gridState.aggregates.\n * This ensures aggregates work regardless of whether they came from explicit config or from view's GridState.\n */\n private get EffectiveAggregatesConfig(): ViewGridAggregatesConfig | null | undefined {\n return this._aggregatesConfig || this._gridState?.aggregates;\n }\n\n /**\n * Returns enabled aggregates configured for card display.\n */\n public get CardAggregates(): ViewGridAggregate[] {\n const config = this.EffectiveAggregatesConfig;\n if (!config?.expressions) return [];\n return config.expressions\n .filter(a => a.enabled !== false && a.displayType === 'card')\n .sort((a, b) => (a.order || 0) - (b.order || 0));\n }\n\n /**\n * Returns enabled aggregates configured for column footer display.\n */\n public get ColumnAggregates(): ViewGridAggregate[] {\n const config = this.EffectiveAggregatesConfig;\n if (!config?.expressions) return [];\n return config.expressions\n .filter(a => a.enabled !== false && a.displayType === 'column')\n .sort((a, b) => (a.order || 0) - (b.order || 0));\n }\n\n /**\n * Whether to show aggregate summary row (has column-type aggregates with values).\n */\n public get ShowAggregateSummary(): boolean {\n const hasColumnAggs = this.ColumnAggregates.length > 0;\n const hasValues = this._aggregateValues.size > 0;\n return hasColumnAggs && hasValues;\n }\n\n /**\n * Whether to show aggregate panel (has card-type aggregates with values).\n */\n public get ShowAggregatePanel(): boolean {\n return this.CardAggregates.length > 0 && this._aggregateValues.size > 0;\n }\n\n /**\n * Get formatted aggregate value for display\n */\n public getAggregateValue(agg: ViewGridAggregate): string {\n const key = agg.id || agg.expression;\n const value = this._aggregateValues.get(key);\n if (value == null) return '—';\n\n // Format based on value type\n if (typeof value === 'number') {\n return value.toLocaleString('en-US', {\n maximumFractionDigits: 2,\n minimumFractionDigits: 0\n });\n }\n // A date aggregate reaches the browser as an ISO string: the server JSON-stringifies the value\n // and the client parses it back, which turns a Date into text. Resolve the column's type first\n // so a `date` column renders as its stored day whether the value is a Date or that string.\n if (typeof value !== 'boolean' && this.aggregateIsDateOnly(agg)) {\n return FormatDateOnly(value);\n }\n if (value instanceof Date) {\n return value.toLocaleDateString();\n }\n // A timestamp aggregate arrives as the same ISO string. It names an instant, so it is rendered\n // in local time, as a Date instance would be — not printed as the wire text.\n if (typeof value === 'string' && AggregateField(agg, this._entityInfo)?.TSType === EntityFieldTSType.Date) {\n const date = new Date(value);\n if (!isNaN(date.getTime())) return date.toLocaleDateString();\n }\n return String(value);\n }\n\n /**\n * Whether an aggregate summarises a date-only column. An aggregate carries no field metadata of\n * its own, so the column is read from a single-field expression such as `MIN(IntakeDate)` or\n * from the column the aggregate is pinned under. A `date` column is a calendar day and must not\n * be shifted into the reader's zone (MJ#4210).\n */\n private aggregateIsDateOnly(agg: ViewGridAggregate): boolean {\n return IsDateOnlySQLType(AggregateField(agg, this._entityInfo)?.Type);\n }\n\n // ========================================\n // Event Outputs\n // ========================================\n\n // Aggregate Results\n /**\n * Emitted when aggregate results are loaded.\n * Contains the array of AggregateResult objects and a values map for easy lookup.\n */\n @Output() AggregatesLoaded = new EventEmitter<{ results: AggregateResult[]; values: Map<string, AggregateValue>; executionTime?: number }>();\n\n // Row Selection\n @Output() BeforeRowSelect = new EventEmitter<BeforeRowSelectEventArgs>();\n @Output() AfterRowSelect = new EventEmitter<AfterRowSelectEventArgs>();\n @Output() BeforeRowDeselect = new EventEmitter<BeforeRowDeselectEventArgs>();\n @Output() AfterRowDeselect = new EventEmitter<AfterRowDeselectEventArgs>();\n @Output() SelectionChange = new EventEmitter<string[]>();\n\n // Row Click\n @Output() BeforeRowClick = new EventEmitter<BeforeRowClickEventArgs>();\n @Output() AfterRowClick = new EventEmitter<AfterRowClickEventArgs>();\n @Output() BeforeRowDoubleClick = new EventEmitter<BeforeRowDoubleClickEventArgs>();\n @Output() AfterRowDoubleClick = new EventEmitter<AfterRowDoubleClickEventArgs>();\n\n // Foreign Key Link Click\n /**\n * Emitted when a foreign key link is clicked in the grid.\n * Parent components should handle this to navigate to the related record.\n */\n @Output() ForeignKeyClick = new EventEmitter<ForeignKeyClickEvent>();\n\n // Editing\n @Output() BeforeCellEdit = new EventEmitter<BeforeCellEditEventArgs>();\n @Output() AfterCellEditBegin = new EventEmitter<AfterCellEditBeginEventArgs>();\n @Output() BeforeCellEditCommit = new EventEmitter<BeforeCellEditCommitEventArgs>();\n @Output() AfterCellEditCommit = new EventEmitter<AfterCellEditCommitEventArgs>();\n @Output() BeforeCellEditCancel = new EventEmitter<BeforeCellEditCancelEventArgs>();\n @Output() AfterCellEditCancel = new EventEmitter<AfterCellEditCancelEventArgs>();\n @Output() BeforeRowSave = new EventEmitter<BeforeRowSaveEventArgs>();\n @Output() AfterRowSave = new EventEmitter<AfterRowSaveEventArgs>();\n @Output() BeforeRowDelete = new EventEmitter<BeforeRowDeleteEventArgs>();\n @Output() AfterRowDelete = new EventEmitter<AfterRowDeleteEventArgs>();\n\n // Data Loading\n @Output() BeforeDataLoad = new EventEmitter<BeforeDataLoadEventArgs>();\n @Output() AfterDataLoad = new EventEmitter<AfterDataLoadEventArgs>();\n @Output() BeforeDataRefresh = new EventEmitter<BeforeDataRefreshEventArgs>();\n @Output() AfterDataRefresh = new EventEmitter<AfterDataRefreshEventArgs>();\n\n // Sorting\n @Output() BeforeSort = new EventEmitter<BeforeSortEventArgs>();\n @Output() AfterSort = new EventEmitter<AfterSortEventArgs>();\n\n // Column Management\n @Output() BeforeColumnReorder = new EventEmitter<BeforeColumnReorderEventArgs>();\n @Output() AfterColumnReorder = new EventEmitter<AfterColumnReorderEventArgs>();\n @Output() BeforeColumnResize = new EventEmitter<BeforeColumnResizeEventArgs>();\n @Output() AfterColumnResize = new EventEmitter<AfterColumnResizeEventArgs>();\n @Output() BeforeColumnVisibilityChange = new EventEmitter<BeforeColumnVisibilityChangeEventArgs>();\n @Output() AfterColumnVisibilityChange = new EventEmitter<AfterColumnVisibilityChangeEventArgs>();\n\n // Grid State\n @Output() GridStateChanged = new EventEmitter<GridStateChangedEvent>();\n\n // Toolbar Actions (legacy names)\n @Output() AddRequested = new EventEmitter<void>();\n @Output() DeleteRequested = new EventEmitter<Record<string, unknown>[]>();\n @Output() ExportRequested = new EventEmitter<void>();\n\n // Predefined Toolbar Button Events\n @Output() NewButtonClick = new EventEmitter<void>();\n @Output() RefreshButtonClick = new EventEmitter<void>();\n @Output() ExportButtonClick = new EventEmitter<void>();\n @Output() DeleteButtonClick = new EventEmitter<Record<string, unknown>[]>();\n @Output() CompareButtonClick = new EventEmitter<Record<string, unknown>[]>();\n @Output() MergeButtonClick = new EventEmitter<Record<string, unknown>[]>();\n @Output() AddToListButtonClick = new EventEmitter<Record<string, unknown>[]>();\n @Output() DuplicateSearchButtonClick = new EventEmitter<Record<string, unknown>[]>();\n @Output() CommunicationButtonClick = new EventEmitter<Record<string, unknown>[]>();\n /** Raised when the user clicks the column-chooser / \"Manage Columns\" toolbar affordance. The host opens its column-management UI (see {@link onColumnChooserClick}). */\n @Output() ManageColumnsRequested = new EventEmitter<void>();\n\n // Navigation Events\n /**\n * Emitted when a row is clicked/double-clicked and AutoNavigate is enabled.\n * Parent components should handle this to open the entity record.\n */\n @Output() NavigationRequested = new EventEmitter<{\n entityInfo: EntityInfo;\n record: Record<string, unknown>;\n compositeKey: string;\n }>();\n\n /**\n * Emitted when the \"New\" button is clicked and CreateRecordMode is 'Dialog'.\n * Parent components should handle this to show a new record dialog.\n */\n @Output() NewRecordDialogRequested = new EventEmitter<{\n entityInfo: EntityInfo;\n defaultValues: Record<string, unknown>;\n }>();\n\n /**\n * Emitted when the \"New\" button is clicked and CreateRecordMode is 'Tab'.\n * Parent components should handle this to open a new record in a tab.\n */\n @Output() NewRecordTabRequested = new EventEmitter<{\n entityInfo: EntityInfo;\n defaultValues: Record<string, unknown>;\n }>();\n\n // Dialog Request Events (for Explorer-specific dialogs)\n /**\n * Emitted when Compare Records functionality is requested.\n * Parent components should handle this to show the compare dialog.\n */\n @Output() CompareRecordsRequested = new EventEmitter<{\n entityInfo: EntityInfo;\n records: Record<string, unknown>[];\n }>();\n\n /**\n * Emitted when Merge Records functionality is requested.\n * Parent components should handle this to show the merge dialog.\n */\n @Output() MergeRecordsRequested = new EventEmitter<{\n entityInfo: EntityInfo;\n records: Record<string, unknown>[];\n }>();\n\n /**\n * Emitted when Communication/Send Message functionality is requested.\n * Parent components should handle this to show the communication dialog.\n */\n @Output() CommunicationRequested = new EventEmitter<{\n entityInfo: EntityInfo;\n records: Record<string, unknown>[];\n viewParams: RunViewParams | null;\n }>();\n\n /**\n * Emitted when duplicate search functionality is requested.\n * Parent components should handle this to show the duplicate search results.\n */\n @Output() DuplicateSearchRequested = new EventEmitter<{\n entityInfo: EntityInfo;\n records: Record<string, unknown>[];\n }>();\n\n /**\n * Emitted when the Add to List button is clicked.\n * Parent components should handle this to show the list management dialog.\n */\n @Output() AddToListRequested = new EventEmitter<{\n entityInfo: EntityInfo;\n records: Record<string, unknown>[];\n recordIds: string[];\n }>();\n\n // Entity Action Events\n /**\n * Emitted when entity actions need to be loaded.\n * Parent components should load actions and set the EntityActions input.\n */\n @Output() LoadEntityActionsRequested = new EventEmitter<{\n entityInfo: EntityInfo;\n }>();\n\n /**\n * Emitted when an entity action is selected for execution.\n * Parent components should handle the action execution.\n */\n @Output() EntityActionRequested = new EventEmitter<{\n entityInfo: EntityInfo;\n action: EntityActionConfig;\n selectedRecords: Record<string, unknown>[];\n }>();\n\n // ========================================\n // View Children\n // ========================================\n\n @ViewChild('gridContainer') gridContainer!: ElementRef<HTMLDivElement>;\n\n // ========================================\n // AG Grid Properties\n // ========================================\n\n /** AG Grid column definitions */\n public agColumnDefs: ColDef[] = [];\n\n /** AG Grid row data */\n public rowData: Record<string, unknown>[] = [];\n\n /** AG Grid API reference */\n private gridApi: GridApi | null = null;\n\n /** AG Grid theme (v34+) with custom selection colors */\n public agGridTheme: Theme = themeAlpine.withParams({\n backgroundColor: 'var(--mj-bg-surface)',\n foregroundColor: 'var(--mj-text-primary)',\n textColor: 'var(--mj-text-primary)',\n borderColor: 'var(--mj-border-default)',\n chromeBackgroundColor: 'var(--mj-bg-surface-card)',\n headerBackgroundColor: 'var(--mj-bg-surface-card)',\n headerTextColor: 'var(--mj-text-secondary)',\n cellTextColor: 'var(--mj-text-primary)',\n subtleTextColor: 'var(--mj-text-muted)',\n dataBackgroundColor: 'var(--mj-bg-surface)',\n oddRowBackgroundColor: 'var(--mj-bg-surface-card)',\n rowHoverColor: 'var(--mj-bg-surface-hover, color-mix(in srgb, var(--mj-brand-primary) 5%, var(--mj-bg-surface)))',\n selectedRowBackgroundColor: 'color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface))',\n accentColor: 'var(--mj-brand-primary)',\n borderRadius: 'var(--mj-radius-sm)',\n browserColorScheme: 'inherit',\n });\n\n /** AG Grid row selection configuration */\n public agRowSelection: RowSelectionOptions = { mode: 'singleRow' };\n\n /** Default column settings */\n public defaultColDef: ColDef = {\n sortable: true,\n filter: false,\n resizable: true,\n minWidth: 80\n };\n\n /**\n * Update defaultColDef when text wrapping setting changes\n * Enables/disables auto row height and cell text wrapping\n */\n private updateDefaultColDefForWrapping(): void {\n if (this._wrapText) {\n this.defaultColDef = {\n ...this.defaultColDef,\n wrapText: true,\n autoHeight: true,\n cellClass: 'cell-wrap-text'\n };\n } else {\n // Remove wrapping properties\n const { wrapText, autoHeight, cellClass, ...rest } = this.defaultColDef;\n this.defaultColDef = rest;\n }\n\n // Refresh the grid to apply changes\n if (this.gridApi) {\n this.gridApi.setGridOption('defaultColDef', this.defaultColDef);\n this.gridApi.refreshCells({ force: true });\n }\n }\n\n /** Get row ID function for AG Grid */\n public getRowId = (params: GetRowIdParams<Record<string, unknown>>) =>\n params.data['__pk'] as string;\n\n /** Suppress sort changed events during programmatic updates */\n private suppressSortEvents: boolean = false;\n\n /** AG Grid options for infinite scroll mode */\n public gridOptions: GridOptions = {};\n\n /** Datasource for infinite scroll mode */\n private infiniteDatasource: IDatasource | null = null;\n\n // ========================================\n // Internal State\n // ========================================\n\n private _useExternalData: boolean = false;\n private _allData: Record<string, unknown>[] = [];\n private _rowDataMap = new Map<string, GridRowData>();\n private _entityInfo: EntityInfo | null = null;\n private _viewEntity: MJUserViewEntityExtended | null = null;\n private _columnStates: ColumnRuntimeState[] = [];\n private _sortState: DataGridSortState[] = [];\n private _filterState: FilterState[] = [];\n private _editingRowKey: string | null = null;\n private _editingField: string | null = null;\n private _pendingChanges: PendingChange[] = [];\n\n // Aggregate state\n private _aggregatesConfig: ViewGridAggregatesConfig | null = null;\n private _aggregateResults: AggregateResult[] = [];\n private _aggregateValues: Map<string, AggregateValue> = new Map();\n private _aggregatesLoading: boolean = false;\n\n // ========================================\n // Public Read-Only Properties\n // ========================================\n\n /**\n * The loaded view entity if using a stored view (ViewID, ViewName, or ViewEntity in Params).\n * Null for dynamic views or when using legacy entityName input.\n */\n public get ViewEntity(): MJUserViewEntityExtended | null {\n return this._viewEntity;\n }\n\n /**\n * The entity metadata for the current data source.\n * Available after Params is set and data is loaded.\n */\n public get EntityInfo(): EntityInfo | null {\n return this._entityInfo;\n }\n\n /**\n * True if using a dynamic view (EntityName only) rather than a stored view.\n * False if using ViewID, ViewName, ViewEntity in Params, or viewEntity input.\n */\n public get IsDynamicView(): boolean {\n // If we have a viewEntity (from either Params or input), it's a stored view\n if (this._viewEntity) return false;\n\n // Check Params for stored view indicators\n if (this._params) {\n return !this._params.ViewID && !this._params.ViewName && !this._params.ViewEntity;\n }\n\n // Legacy mode without viewEntity is considered dynamic\n return true;\n }\n\n // Loading state\n loading: boolean = false;\n private _errorMessage: string = '';\n /**\n * Raw technical error from the last failed load. Kept for callers and the\n * console; the error STATE shown to users leads with FriendlyErrorMessage.\n * Setting a non-empty value logs the technical detail.\n */\n get errorMessage(): string {\n return this._errorMessage;\n }\n set errorMessage(value: string) {\n this._errorMessage = value;\n if (value) {\n LogError(`EntityDataGrid data load failed: ${value}`);\n }\n }\n /**\n * Human-first message for the error empty-state. Users see what happened and\n * what to do; the raw error rides along as a de-emphasized parenthetical so a\n * screenshot still carries the detail support needs.\n */\n get FriendlyErrorMessage(): string {\n const friendly = 'The server may be busy or briefly unreachable — retrying usually fixes this.';\n return this._errorMessage ? `${friendly} (Detail: ${this._errorMessage})` : friendly;\n }\n totalRowCount: number = 0;\n private _loadDataPromise: Promise<void> | null = null;\n\n // Cleanup\n private destroy$ = new Subject<void>();\n private refreshSubject = new Subject<void>();\n private statesSaveSubject = new Subject<void>();\n private statePersistSubject = new Subject<ViewGridState>();\n private userDefaultsPersistSubject = new Subject<ViewGridState>();\n\n // Persist state tracking\n private pendingStateToSave: ViewGridState | null = null;\n private isSavingState: boolean = false;\n\n /**\n * Pending state waiting to be persisted (for flushing on destroy).\n * Tracks state for both saved views and user defaults separately.\n */\n private _pendingViewStateToPersist: ViewGridState | null = null;\n private _pendingUserDefaultsToPersist: ViewGridState | null = null;\n\n /**\n * Flag to suppress state persistence during view transitions.\n * When true, emitGridStateChanged will not trigger persistence.\n * This prevents the old view's column state from being saved to the new view.\n */\n private _suppressPersist: boolean = false;\n\n /**\n * Dirty flag to track if grid state has actually been modified by user actions.\n * Only set to true when: column resize, column move, or sort change.\n * Reset to false: when view loads, after successful persistence.\n * This prevents emitting gridStateChanged events when no real change occurred.\n */\n private _isGridStateDirty: boolean = false;\n\n /**\n * Whether the current user can edit the view.\n * For dynamic views, always true (persists to user settings).\n * For saved views, depends on view ownership and permissions.\n */\n public get canEditCurrentView(): boolean {\n if (this.IsDynamicView) {\n return true; // Dynamic views persist to user settings\n }\n return this._viewEntity?.UserCanEdit ?? false;\n }\n\n // Overflow menu state\n public showOverflowMenu: boolean = false;\n\n // Export dialog state\n public showExportDialog: boolean = false;\n public exportDialogConfig: ExportDialogConfig | null = null;\n\n constructor(\n private cdr: ChangeDetectorRef,\n private elementRef: ElementRef,\n private exportService: ExportService,\n private ngZone: NgZone\n ) {\n super();}\n\n // ========================================\n // Lifecycle Hooks\n // ========================================\n\n async ngOnInit() {\n this.setupRefreshDebounce();\n this.setupStatePersistDebounce();\n this.setupUserDefaultsPersistDebounce();\n this.updateAgRowSelection();\n }\n\n ngOnDestroy(): void {\n // Flush any pending state persistence immediately before destroying\n this.EnsurePendingChangesSaved();\n\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n /**\n * Immediately persists any pending state changes without waiting for debounce.\n * Called on component destroy to ensure changes aren't lost.\n * Also exposed publicly so parent components can flush before view/entity switches.\n */\n public EnsurePendingChangesSaved(): void {\n // Flush pending view state\n if (this._pendingViewStateToPersist && this._viewEntity) {\n this.persistGridStateToView(this._pendingViewStateToPersist);\n this._pendingViewStateToPersist = null;\n }\n\n // Flush pending user defaults\n if (this._pendingUserDefaultsToPersist && this._entityInfo) {\n this.persistUserDefaultGridState(this._pendingUserDefaultsToPersist);\n this._pendingUserDefaultsToPersist = null;\n }\n }\n\n // ========================================\n // Setup Methods\n // ========================================\n\n private setupRefreshDebounce(): void {\n this.refreshSubject.pipe(\n debounceTime(this._refreshDebounce),\n takeUntil(this.destroy$)\n ).subscribe(() => {\n this.loadData(true);\n });\n }\n\n private setupStatePersistDebounce(): void {\n this.statePersistSubject.pipe(\n debounceTime(this._statePersistDebounce),\n takeUntil(this.destroy$)\n ).subscribe((state) => {\n this.persistGridStateToView(state);\n });\n }\n\n private setupUserDefaultsPersistDebounce(): void {\n this.userDefaultsPersistSubject.pipe(\n debounceTime(this._statePersistDebounce),\n takeUntil(this.destroy$)\n ).subscribe((state) => {\n this.persistUserDefaultGridState(state);\n });\n }\n\n /**\n * Called when Params input changes. Handles loading view entity metadata\n * and triggering data load if allowed.\n */\n private async onParamsChanged(): Promise<void> {\n if (!this._params) {\n // Params cleared - reset view entity\n this._viewEntity = null;\n return;\n }\n\n // Suppress persistence during view transition to prevent old view's state\n // from being saved to the new view's storage\n this._suppressPersist = true;\n\n // Reset dirty flag - no changes have been made to the new view yet\n this._isGridStateDirty = false;\n\n // Reset internal grid state when params change - this ensures we don't\n // carry over column/sort settings from a previous view when switching views\n this._gridState = null;\n this._sortState = [];\n\n // Reset aggregates when switching views - don't carry over from previous view\n this._aggregatesConfig = null;\n this._aggregateResults = [];\n this._aggregateValues.clear();\n\n // NOTE: Do NOT reset _allowLoad here. When a parent (e.g., entity-viewer) explicitly\n // sets [AllowLoad]=\"false\" to manage data loading itself, resetting it to true here\n // causes a duplicate RunView because the Params setter fires before the AllowLoad\n // binding in Angular's template binding order.\n\n try {\n // If using a stored view, load the view entity first\n if (this._params.ViewEntity) {\n // ViewEntity was provided directly\n this._viewEntity = this._params.ViewEntity as MJUserViewEntityExtended;\n this._entityInfo = this.getEntityInfoFromViewEntity(this._viewEntity);\n this.applyViewEntitySettings();\n } else if (this._params.ViewID) {\n // Load view entity by ID from engine\n const cachedView = this.getViewFromEngine(this._params.ViewID);\n if (cachedView) {\n this._viewEntity = cachedView;\n } else {\n // View not in cache - use ViewInfo (which also uses engine)\n this._viewEntity = await ViewInfo.GetViewEntity(this._params.ViewID);\n }\n this._entityInfo = this.getEntityInfoFromViewEntity(this._viewEntity);\n this.applyViewEntitySettings();\n } else if (this._params.ViewName) {\n // Load view entity by name from engine\n const cachedView = this.getViewFromEngineByName(this._params.ViewName);\n if (cachedView) {\n this._viewEntity = cachedView;\n } else {\n // View not in cache - use ViewInfo (which also uses engine)\n this._viewEntity = await ViewInfo.GetViewEntityByName(this._params.ViewName);\n }\n this._entityInfo = this.getEntityInfoFromViewEntity(this._viewEntity);\n this.applyViewEntitySettings();\n } else if (this._params.EntityName) {\n // Dynamic view - just get entity metadata\n this._viewEntity = null;\n const md = this.ProviderToUse;\n this._entityInfo = md.Entities.find(e => e.Name === this._params!.EntityName) || null;\n\n // Reset columns to force regeneration from metadata when switching to dynamic view.\n // This ensures we don't carry over column config from a previous saved view.\n //\n // ...but ONLY when those columns were themselves derived from a view or from metadata. A\n // list the HOST passed via `[Columns]` must survive: `Params` is re-assigned on every filter\n // change, so wiping unconditionally meant a page's declared columns were destroyed the first\n // time the user touched a filter — the grid silently reverted to metadata-generated columns\n // (entity display names, estimated widths, `width: 'auto'` lost). It presents as \"my column\n // config works on load and then randomly stops\", which is near-impossible to trace back here.\n if (!this._columnsFromHost) {\n this._columns = [];\n }\n\n // For dynamic views, try to load user's saved defaults\n if (this._entityInfo && this._autoPersistState) {\n this.loadUserDefaultGridState(this._entityInfo.Name);\n }\n }\n\n // The entity is only known now, and `[Columns]` is commonly bound BEFORE `[Params]` — so this\n // is the first point at which a host's field names can be checked against real metadata.\n // Idempotent, so the repeat on every params change costs nothing.\n if (this.canonicalizeHostColumns()) {\n this.initializeColumnStates();\n }\n\n // Generate columns if not already set\n if (this._columns.length === 0 && this._entityInfo) {\n this.generateColumnsFromMetadata();\n }\n\n // Rebuild AG Grid column definitions to reflect the new view's settings\n this.buildAgColumnDefs();\n\n // If the parent already supplied external [Data] BEFORE [Params] resolved the entity,\n // the earlier processData() ran with a null _entityInfo and produced rows with no field\n // values (empty cells). This happens when the grid is dynamic-mounted by the view-type\n // plug-in host, where Angular applies the batched inputs in template order ([Data] before\n // [Params]). Now that _entityInfo + columns exist, re-map the rows so values render.\n if (this._useExternalData && this._entityInfo) {\n this.processData();\n }\n\n // Load data if auto-refresh is enabled and parent hasn't disabled loading.\n // Defer the AllowLoad check to a microtask: Angular applies @Input setters synchronously\n // in template order, and [Params] is commonly bound before [AllowLoad] (see the wrapper in\n // explorer-entity-data-grid). Reading _allowLoad synchronously here would see its default\n // (true) before a later [AllowLoad]=\"false\" binding lands, causing collapsed/deferred panels\n // to fire a RunView anyway. Yielding lets all sibling input setters apply first so the check\n // reflects the final AllowLoad value.\n if (this._autoRefreshOnParamsChange) {\n await Promise.resolve();\n if (this._allowLoad) {\n await this.loadData(false);\n }\n }\n } catch (error) {\n this.errorMessage = error instanceof Error ? error.message : 'Failed to load view';\n this.cdr.detectChanges();\n } finally {\n // Re-enable persistence now that the new view is fully loaded\n this._suppressPersist = false;\n // Entity is resolved by now — self-load its actions if auto-load is enabled.\n void this.maybeAutoLoadEntityActions();\n }\n }\n\n /**\n * Gets a view from the UserViewEngine cache by ID.\n * Returns undefined if not found or engine not initialized.\n */\n private getViewFromEngine(viewId: string): MJUserViewEntityExtended | undefined {\n try {\n return UserViewEngine.Instance.GetViewById(viewId);\n } catch {\n // Engine may not be initialized yet\n return undefined;\n }\n }\n\n /**\n * Gets a view from the UserViewEngine cache by name.\n * Returns undefined if not found or engine not initialized.\n */\n private getViewFromEngineByName(viewName: string): MJUserViewEntityExtended | undefined {\n try {\n return UserViewEngine.Instance.GetViewByName(viewName);\n } catch {\n // Engine may not be initialized yet\n return undefined;\n }\n }\n\n /**\n * Gets EntityInfo from a ViewEntity with multiple fallback strategies.\n * Priority: 1) ViewEntityInfo property (set by Load)\n * 2) Entity name lookup (virtual field)\n * 3) EntityID lookup\n * Returns null if entity cannot be determined.\n */\n private getEntityInfoFromViewEntity(viewEntity: MJUserViewEntityExtended | null): EntityInfo | null {\n if (!viewEntity) return null;\n\n // First try: ViewEntityInfo is the preferred source (set by MJUserViewEntityExtended.Load)\n if (viewEntity.ViewEntityInfo) {\n return viewEntity.ViewEntityInfo;\n }\n\n const md = this.ProviderToUse;\n\n // Second try: Look up by Entity name (virtual field that returns entity name)\n if (viewEntity.Entity) {\n const entityByName = md.Entities.find(e => e.Name === viewEntity.Entity);\n if (entityByName) {\n return entityByName;\n }\n }\n\n // Third try: Look up by EntityID\n if (viewEntity.EntityID) {\n const entityById = md.Entities.find(e => UUIDsEqual(e.ID, viewEntity.EntityID));\n if (entityById) {\n return entityById;\n }\n }\n\n console.warn(`[EntityDataGrid] Could not determine entity for view \"${viewEntity.Name}\" (ID: ${viewEntity.ID})`);\n return null;\n }\n\n /**\n * Loads user's saved grid state defaults for a dynamic view.\n * Uses UserInfoEngine to retrieve settings stored with key format: \"default-view-setting/{entityName}\"\n */\n private loadUserDefaultGridState(entityName: string): void {\n try {\n const settingKey = `default-view-setting/${entityName}`;\n const savedState = UserInfoEngine.Instance.GetSetting(settingKey);\n\n if (savedState) {\n const gridState = JSON.parse(savedState) as ViewGridState;\n\n // Only apply if not already set via props (props take precedence).\n //\n // `Columns` is one of those props. It used to be missed here, and the effect was severe but\n // silent: this default is saved per USER per ENTITY from the generic entity browser, so the\n // moment anyone tweaked columns while browsing an entity there, EVERY bespoke page grid over\n // that same entity silently adopted those columns — overriding the page author's explicit\n // `[Columns]` titles, widths and order, for that user only. Symptoms look like anything but\n // the cause: a page's declared column titles never appear, widths edited in code have no\n // effect, and it reproduces for one user and not another.\n //\n // A page that hands the grid an explicit column list has stated exactly what it wants; a\n // user's entity-browser preference is not an instruction about that page. An explicitly\n // passed `[GridState]` still wins, as it always did — that is a deliberate act by the host.\n if (!this._gridState && !this._columnsFromHost && gridState.columnSettings?.length) {\n // Validate column settings against the current entity's fields to prevent\n // stale columns from a previously viewed entity leaking into the query.\n // This can happen when user defaults were saved for a different view of\n // the same entity with different columns, or when settings are mismatched.\n const validColumns = this.filterToExistingFields(gridState.columnSettings, col => col.Name);\n\n if (validColumns.length > 0) {\n this._gridState = {\n columnSettings: validColumns,\n sortSettings: gridState.sortSettings || [],\n aggregates: gridState.aggregates\n };\n this._gridStateFromUserDefault = true;\n }\n }\n\n // Apply sort state if not already set — validate sort fields exist on current entity\n if (this._sortState.length === 0 && gridState.sortSettings?.length) {\n const validSorts = this.filterToSortableFields(gridState.sortSettings, s => s.field);\n this._sortState = validSorts.map((s, index) => ({\n field: s.field,\n direction: s.dir,\n index\n }));\n }\n\n // Apply aggregates from user defaults if present and not already set\n if (gridState.aggregates && !this._aggregatesConfig) {\n this._aggregatesConfig = gridState.aggregates;\n }\n }\n } catch (error) {\n console.error('[entity-data-grid] Failed to load user default grid state:', error);\n }\n }\n\n /**\n * Persists the current grid state as user defaults for a dynamic view.\n * Uses UserInfoEngine to store settings with key format: \"default-view-setting/{entityName}\"\n */\n private async persistUserDefaultGridState(state: ViewGridState): Promise<void> {\n if (!this._entityInfo) {\n this._pendingUserDefaultsToPersist = null;\n return;\n }\n\n try {\n const settingKey = `default-view-setting/${this._entityInfo.Name}`;\n const gridStateJson: ViewGridState = {\n columnSettings: state.columnSettings,\n sortSettings: state.sortSettings,\n aggregates: state.aggregates\n };\n\n await UserInfoEngine.Instance.SetSetting(settingKey, JSON.stringify(gridStateJson));\n // Clear pending state and reset dirty flag after successful save\n this._pendingUserDefaultsToPersist = null;\n this._isGridStateDirty = false;\n } catch (error) {\n console.error('[entity-data-grid] Failed to persist user default grid state:', error);\n }\n }\n\n /**\n * Applies settings from a loaded ViewEntity (column configuration, sort state, etc.)\n *\n * Precedence rules (highest to lowest):\n * 1. Props passed directly (gridState, orderBy, etc.) - always take precedence\n * 2. Settings from ViewEntity.GridState (persisted column/sort configuration)\n * 3. Settings from ViewEntity.SortInfo (legacy sort configuration)\n * 4. Auto-generated defaults from entity metadata\n */\n private applyViewEntitySettings(): void {\n if (!this._viewEntity) return;\n\n // Only apply grid state from view entity if not already set via props\n // (gridState input takes precedence)\n if (!this._gridState && this._viewEntity.GridState) {\n const gridState = this._viewEntity.GridStateObject;\n if (gridState) {\n if (gridState.columnSettings?.length) {\n this._gridState = {\n columnSettings: gridState.columnSettings,\n sortSettings: gridState.sortSettings || [],\n aggregates: gridState.aggregates\n };\n }\n // Apply aggregates from view's GridState if present\n if (gridState.aggregates && !this._aggregatesConfig) {\n this._aggregatesConfig = gridState.aggregates;\n }\n }\n }\n\n // Only apply sort state if:\n // 1. No explicit OrderBy in Params\n // 2. No sort already set via gridState (either prop or from view)\n const orderByValue = this._params?.OrderBy;\n const hasExplicitOrderBy = orderByValue != null && (typeof orderByValue === 'string' ? orderByValue.trim().length > 0 : !!orderByValue.default);\n const hasSortFromGridState = this._gridState?.sortSettings && this._gridState.sortSettings.length > 0;\n\n if (!hasExplicitOrderBy && !hasSortFromGridState && this._sortState.length === 0) {\n const sortInfo = this._viewEntity.ViewSortInfo;\n if (sortInfo?.length) {\n // Validate sort fields exist on the current entity to prevent stale\n // sort fields from a previously viewed entity leaking into ORDER BY\n const validSorts = this.filterToSortableFields(sortInfo, s => s.field);\n this._sortState = validSorts.map((s, index) => ({\n field: s.field,\n direction: (typeof s.direction === 'string' ? s.direction.toLowerCase() : s.direction === 2 ? 'desc' : 'asc') === 'desc' ? 'desc' : 'asc',\n index\n }));\n }\n } else if (!hasExplicitOrderBy && hasSortFromGridState) {\n // Apply GridState sort settings to _sortState so the initial data load\n // includes the correct ORDER BY clause. Without this, _sortState remains\n // empty and buildOrderByClause() returns '' — causing the SQL to omit\n // ORDER BY on the first page load.\n // Validate sort fields exist on the current entity\n const validSorts = this.filterToSortableFields(this._gridState!.sortSettings!, s => s.field);\n this._sortState = validSorts.map((sortSetting, index) => ({\n field: sortSetting.field,\n direction: sortSetting.dir,\n index: index\n }));\n }\n }\n\n private onGridStateChanged(): void {\n if (this._gridState && this._entityInfo) {\n // Suppress sort events for the entire operation. AG Grid fires sortChanged\n // asynchronously when columnDefs are rebuilt (clears sort model) and when\n // applyColumnState re-applies sort. Without this, those async events leak\n // through to the parent (entity-viewer) and trigger redundant unsorted reloads.\n // setTimeout clears the flag after AG Grid's async events have been processed.\n this.suppressSortEvents = true;\n\n this.buildAgColumnDefs();\n\n // Update AG Grid with new column definitions to apply header styles\n if (this.gridApi && !this.gridApi.isDestroyed()) {\n this.gridApi.setGridOption('columnDefs', this.agColumnDefs);\n // Refresh header to apply new header styles\n this.gridApi.refreshHeader();\n }\n\n // Apply sort if present - support multi-column sort\n // Validate sort fields against current entity to prevent stale sort from a previous entity\n if (this._gridState.sortSettings?.length && this.gridApi && !this.gridApi.isDestroyed()) {\n const validSorts = this.filterToSortableFields(this._gridState.sortSettings, s => s.field);\n this._sortState = validSorts.map((sortSetting, index) => ({\n field: sortSetting.field,\n direction: sortSetting.dir,\n index: index\n }));\n // Apply directly — suppressSortEvents is already true for the whole operation\n if (this.gridApi && !this.gridApi.isDestroyed()) {\n const currentColumnState = this.gridApi.getColumnState();\n if (currentColumnState) {\n const columnState = currentColumnState.map(col => {\n const sort = this._sortState.find(s => s.field === col.colId);\n return {\n ...col,\n sort: sort ? sort.direction : null,\n sortIndex: sort ? sort.index : null\n };\n });\n this.gridApi.applyColumnState({ state: columnState });\n }\n }\n }\n\n // Apply aggregates from GridState if present and fetch their values\n if (this._gridState.aggregates) {\n this._aggregatesConfig = this._gridState.aggregates;\n // Fetch aggregate values when gridState aggregates change\n this.refreshAggregates();\n }\n\n // Clear suppression after AG Grid's async events have been processed.\n // setTimeout(0) fires after microtasks and rAF, catching all async sort events.\n setTimeout(() => { this.suppressSortEvents = false; }, 0);\n }\n }\n\n /**\n * Fetch aggregate values without reloading data.\n * Used when gridState changes and includes new aggregate config.\n * This runs a RunView with MaxRows=0 to get only aggregate results.\n */\n public async refreshAggregates(): Promise<void> {\n const effectiveAggConfig = this.EffectiveAggregatesConfig;\n if (!effectiveAggConfig?.expressions?.length) {\n this._aggregateResults = [];\n this._aggregateValues.clear();\n this._aggregatesLoading = false;\n this.cdr.detectChanges();\n return;\n }\n\n // Need entity info to run the query\n if (!this._entityInfo) {\n return;\n }\n\n this._aggregatesLoading = true;\n this.cdr.detectChanges();\n\n try {\n // Build aggregate expressions\n const aggregateExpressions: AggregateExpression[] = effectiveAggConfig.expressions\n .filter(agg => agg.enabled !== false && agg.expression)\n .map(agg => ({\n expression: agg.expression,\n alias: agg.id || agg.label || agg.expression\n }));\n\n if (aggregateExpressions.length === 0) {\n this._aggregateResults = [];\n this._aggregateValues.clear();\n this._aggregatesLoading = false;\n this.cdr.detectChanges();\n return;\n }\n\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n\n // Build the ExtraFilter from params or view entity\n let extraFilter: string | undefined;\n if (this._params?.ExtraFilter) {\n extraFilter = typeof this._params.ExtraFilter === 'string' ? this._params.ExtraFilter : this._params.ExtraFilter.default;\n } else if (this._viewEntity?.WhereClause) {\n extraFilter = this._viewEntity.WhereClause;\n }\n\n const result = await rv.RunView({\n EntityName: this._entityInfo.Name,\n MaxRows: 0, // Only get aggregates, no row data\n ExtraFilter: extraFilter,\n Aggregates: aggregateExpressions\n });\n\n if (result.Success) {\n this.ngZone.run(() => {\n this.processAggregateResults(result.AggregateResults, result.AggregateExecutionTime);\n });\n } else {\n this.ngZone.run(() => {\n this._aggregatesLoading = false;\n this.cdr.detectChanges();\n });\n }\n } catch (error) {\n console.error('[EntityDataGrid] Error fetching aggregates:', error);\n this.ngZone.run(() => {\n this._aggregatesLoading = false;\n this.cdr.detectChanges();\n });\n }\n }\n\n private onFilterTextChanged(): void {\n // Rebuild column defs to update cell renderers with new filter text\n this.buildAgColumnDefs();\n\n // Update AG Grid with new column definitions and refresh cells\n if (this.gridApi) {\n // Update the column definitions in AG Grid\n this.gridApi.setGridOption('columnDefs', this.agColumnDefs);\n // Force refresh all cells to apply new highlighting\n this.gridApi.refreshCells({ force: true });\n // Apply AG Grid quick filter to actually filter rows client-side\n this.gridApi.setGridOption('quickFilterText', this._filterText || undefined);\n }\n }\n\n private generateColumnsFromMetadata(): void {\n if (!this._entityInfo) return;\n\n this._columns = this._entityInfo.Fields\n .filter(f => this.shouldShowField(f))\n .map(field => ({\n field: field.Name,\n title: field.DisplayName || field.Name,\n type: this.mapFieldTypeToGridType(field.Type),\n sortable: true,\n filterable: true,\n visible: true,\n width: this.estimateColumnWidth(field)\n }));\n\n this.initializeColumnStates();\n this.buildAgColumnDefs();\n }\n\n /**\n * Determines if a field should be shown by default when no saved view exists.\n * This logic is aligned with MJUserViewEntity.SetDefaultsFromEntity() to ensure\n * consistent column visibility between initial load and saved views.\n */\n /**\n * NOTE: field security is deliberately NOT applied here. This decides the column MODEL, and\n * the user's saved column preference is captured from what ends up rendered — so filtering a\n * denied field out at this level writes a temporary restriction into a durable preference,\n * and the column never returns when access is restored. The denial is applied where columns\n * are RENDERED ({@link buildAgColumnDefs}), and {@link buildCurrentGridState} carries the\n * hidden entries forward so the saved preference stays complete.\n */\n private shouldShowField(field: EntityFieldInfo): boolean {\n // Always exclude system fields\n if (field.Name.startsWith('__mj_')) return false;\n\n // Always exclude UUID primary keys (they're not useful to display)\n if (field.IsPrimaryKey && field.SQLFullType?.toLowerCase() === 'uniqueidentifier') {\n return false;\n }\n\n // Only show fields explicitly marked as DefaultInView\n // This aligns with MJUserViewEntity.SetDefaultsFromEntity() behavior\n // ensuring users see the same columns before and after saving a view\n return field.DefaultInView === true;\n }\n\n /**\n * Field names field-level security denies the current user READ on, lowercased — empty when\n * there is no entity or no resolved user, when the entity has field security switched off,\n * or when nothing is denied, so callers can treat it as \"nothing to filter\".\n *\n * Deliberately the BULK primitive: `EntityInfo.GetDeniedReadFields` documents that the\n * per-field form costs `fields x rows` aggregations when called inside a loop, and every\n * caller here is a loop over fields or saved settings.\n */\n private deniedReadFieldsFor(entity: EntityInfo | null | undefined): Set<string> {\n const user = this.ProviderToUse?.CurrentUser;\n if (!entity || !user) {\n return new Set<string>();\n }\n return entity.GetDeniedReadFields(user);\n }\n\n /**\n * Drops saved settings naming a field that no longer EXISTS on the current entity — stale\n * state from another view, or a column the schema lost.\n *\n * Deliberately does NOT drop denied fields. A denial is temporary and reversible, so removing\n * the column here would launder a restriction into the user's saved column PREFERENCE and the\n * column would not return when access was restored. Field security is applied where the\n * columns are RENDERED ({@link buildAgColumnDefs}), which hides the column while leaving the\n * preference that mentions it intact.\n */\n private filterToExistingFields<T>(items: T[], nameOf: (item: T) => string): T[] {\n const entity = this._entityInfo;\n if (!entity) {\n return items;\n }\n return items.filter(item => entity.Fields.some(f => f.Name === nameOf(item)));\n }\n\n /**\n * The same existence check, plus dropping fields the user cannot read — for SORT settings\n * only. A denied field in ORDER BY is rejected outright by the server, so unlike a column it\n * cannot be carried along harmlessly; the query would fail rather than degrade. A user also\n * cannot meaningfully sort by a column they cannot see.\n */\n private filterToSortableFields<T>(items: T[], nameOf: (item: T) => string): T[] {\n const denied = this.deniedReadFieldsFor(this._entityInfo);\n return this.filterToExistingFields(items, nameOf)\n .filter(item => !denied.has(nameOf(item)?.trim().toLowerCase()));\n }\n\n /**\n * Estimate an appropriate column width based on field metadata.\n * Takes into account: metadata DefaultColumnWidth, header text length, data type, and field patterns.\n */\n private estimateColumnWidth(field: EntityFieldInfo): number {\n // Priority 1: Use metadata-defined width if set\n if (field.DefaultColumnWidth && field.DefaultColumnWidth > 0) {\n return field.DefaultColumnWidth;\n }\n\n // Calculate minimum width needed for header text\n const headerText = field.DisplayName || field.Name;\n const headerWidth = this.calculateHeaderWidth(headerText);\n\n // Calculate estimated data width based on field type\n const dataWidth = this.calculateDataWidth(field);\n\n // Use the larger of header or data width, with bounds\n const estimatedWidth = Math.max(headerWidth, dataWidth);\n\n // Apply min/max bounds: minimum 80px, maximum 350px\n return Math.max(Math.min(estimatedWidth, 350), 80);\n }\n\n /**\n * Calculate minimum width needed to display header text without truncation.\n */\n private calculateHeaderWidth(text: string): number {\n // Average char width ~7.5px for typical grid font\n const charWidth = 7.5;\n // Padding for sort icon and cell padding\n const sortIconPadding = 24;\n const cellPadding = 16;\n return Math.ceil(text.length * charWidth + sortIconPadding + cellPadding);\n }\n\n /**\n * Calculate estimated data width based on field type and patterns.\n */\n private calculateDataWidth(field: EntityFieldInfo): number {\n const fieldNameLower = field.Name.toLowerCase();\n const tsType = field.TSType;\n\n // Fixed-width types\n if (tsType === 'boolean') return 90;\n if (tsType === 'Date') return 130;\n\n // Numeric fields - compact\n if (tsType === 'number') {\n if (fieldNameLower.includes('year') || fieldNameLower.includes('age')) return 80;\n if (fieldNameLower.includes('amount') || fieldNameLower.includes('price') ||\n fieldNameLower.includes('cost') || fieldNameLower.includes('total')) return 130;\n return 100;\n }\n\n // ID fields (typically UUIDs shown truncated or as links)\n if (fieldNameLower.endsWith('id') && field.Length <= 50) return 100;\n\n // Email - needs more space\n if (fieldNameLower.includes('email')) return 220;\n\n // Phone numbers\n if (fieldNameLower.includes('phone') || fieldNameLower.includes('mobile') || fieldNameLower.includes('fax')) return 140;\n\n // Description fields - give them adequate room (increased from 150)\n if (fieldNameLower.includes('description')) return 250;\n\n // Name fields - medium width\n if (fieldNameLower.includes('name') || fieldNameLower.includes('title')) {\n if (fieldNameLower === 'firstname' || fieldNameLower === 'lastname' ||\n fieldNameLower === 'first name' || fieldNameLower === 'last name') return 130;\n return 180;\n }\n\n // Location fields\n if (fieldNameLower.includes('city')) return 130;\n if (fieldNameLower.includes('state') || fieldNameLower.includes('country')) return 110;\n if (fieldNameLower.includes('zip') || fieldNameLower.includes('postal')) return 100;\n if (fieldNameLower.includes('address')) return 220;\n\n // Date-like strings\n if (fieldNameLower.includes('date') || fieldNameLower.includes('time')) return 130;\n\n // Status/Type/Category fields\n if (fieldNameLower.includes('status') || fieldNameLower.includes('type') ||\n fieldNameLower.includes('category') || fieldNameLower.includes('mode')) return 130;\n\n // Code/abbreviation fields\n if (fieldNameLower.includes('code') || fieldNameLower.includes('abbr')) return 110;\n\n // Long text fields - give them more room (nvarchar(max) has Length < 0)\n if (field.Length < 0) return 250; // nvarchar(max)\n if (field.Length > 500) return 220;\n if (field.Length > 200) return 200;\n\n // Default: estimate based on field length with reasonable bounds\n const estimatedChars = Math.min(field.Length || 50, 40);\n return Math.max(estimatedChars * 6 + 24, 100);\n }\n\n private mapFieldTypeToGridType(fieldType: string): 'string' | 'number' | 'boolean' | 'date' | 'datetime' {\n switch (fieldType.toLowerCase()) {\n case 'int':\n case 'bigint':\n case 'smallint':\n case 'tinyint':\n case 'decimal':\n case 'numeric':\n case 'float':\n case 'real':\n case 'money':\n case 'smallmoney':\n return 'number';\n case 'bit':\n return 'boolean';\n case 'date':\n return 'date';\n case 'datetime':\n case 'datetime2':\n case 'smalldatetime':\n case 'datetimeoffset':\n return 'datetime';\n default:\n return 'string';\n }\n }\n\n private initializeColumnStates(): void {\n this._columnStates = this._columns.map((config, index) => ({\n config,\n computedWidth: typeof config.width === 'number' ? config.width : 150,\n sortDirection: config.sortDirection || 'none',\n sortIndex: config.sortIndex || 0,\n filterValue: undefined,\n visible: config.visible !== false,\n order: index\n }));\n }\n\n // ========================================\n // AG Grid Column Building\n // ========================================\n\n private buildAgColumnDefs(): void {\n // A grid state whose settings name NONE of this entity's fields is not a column preference —\n // it is evidence the state belongs to a different entity. `_gridState` outlives an entity\n // change when one viewer is rebound from entity A to entity B (`EntityName` is a rebindable\n // input), every setting is then dropped for naming a field B does not have, and taking that\n // empty array as the answer rendered a grid with no header and no cells while the rows loaded\n // and the row count read correctly — no error, no warning. So treat an empty result as NO\n // usable state and fall through to the sources that describe the entity actually in hand.\n // This is the floor `generateAgColumnDefs()` already has for an entity with no DefaultInView\n // fields; the grid-state branch was the one path without one.\n //\n // Only a TOTAL miss is treated this way. One surviving setting is a real preference — a saved\n // view whose entity has since lost a field — and discarding it would throw away the user's\n // columns to guess at state that is legitimately theirs.\n const fromGridState = (this._gridState?.columnSettings?.length && this._entityInfo)\n ? this.buildAgColumnDefsFromGridState(this._gridState.columnSettings)\n : [];\n\n if (fromGridState.length > 0) {\n this.agColumnDefs = fromGridState;\n } else if (this._columns.length > 0) {\n this.agColumnDefs = this._columns.map(col => this.mapColumnConfigToColDef(col));\n } else if (this._entityInfo) {\n this.agColumnDefs = this.generateAgColumnDefs(this._entityInfo);\n } else {\n this.agColumnDefs = [];\n }\n\n // Field security, applied to EVERY branch above rather than inside each one. This is the\n // only point all three column sources meet: a saved view's `columnSettings` (the usual path\n // in the entity browser) and a host-supplied `[Columns]` array both bypass the metadata\n // filter in shouldShowField(), so gating only there leaves the denied column rendered in\n // exactly the case that matters most. Runs BEFORE the row-number and filler columns are\n // appended — those are synthetic and have no entity field to check.\n\n const deniedReadFields = this.deniedReadFieldsFor(this._entityInfo);\n if (deniedReadFields.size > 0) {\n this.agColumnDefs = this.agColumnDefs.filter(\n c => !c.field || !deniedReadFields.has(c.field.trim().toLowerCase())\n );\n }\n\n // Add row number column if enabled\n if (this._showRowNumbers && this.agColumnDefs.length > 0) {\n this.agColumnDefs.unshift({\n headerName: '#',\n field: '__rowNumber',\n width: 60,\n minWidth: 50,\n maxWidth: 80,\n sortable: false,\n resizable: false,\n valueGetter: (params) => params.node ? params.node.rowIndex! + 1 : ''\n });\n }\n\n if (this._fillWidth && this.agColumnDefs.length > 0) {\n this.agColumnDefs.push(this.buildFillerColumnDef());\n }\n }\n\n /**\n * An inert trailing column whose only job is to soak up leftover row width so the row backgrounds,\n * banding and horizontal rules reach the container's edge instead of stopping mid-card.\n *\n * Why a filler rather than stretching a real column: a real column that grows to absorb slack is\n * either a short/numeric one — whose value then sits marooned in a sea of empty cell (or, if\n * right-aligned, drifts far from its neighbours) — or a text column blown out well past the width\n * its content needs, which reads as one enormous mostly-empty column. Neither is what \"the table\n * should reach the edge\" means. Growing something DELIBERATELY empty moves nothing and stretches\n * nothing: every real column keeps the width it earned.\n *\n * It is styled to disappear as a column (no header text, no left rule, no sort/menu/resize/move\n * affordances) so it reads as table background, not as an empty field the user should wonder about.\n */\n /**\n * Make a column absorb leftover row width, but only up to the ceiling the page gave it.\n *\n * The weighting is the point. Both this column and the filler are flex, and AG Grid splits leftover\n * space between flex columns in proportion to their weights — so an even 1:1 split would hand this\n * column only half the slack no matter how much it needed (that was a real bug: a memo column and\n * the filler each took ~160px of a 320px remainder). A dominant weight makes the real column the\n * FIRST claimant: it grows until it hits its own `maxWidth`, and only what it cannot use overflows\n * to the filler. AG Grid enforces `maxWidth` on flex columns, which is what makes the hand-off work.\n *\n * `maxWidth` is therefore load-bearing, not decoration — it is what stops \"fill the row\" from\n * becoming \"one enormous mostly-empty column\". It matters most for a RIGHT-ALIGNED column, where an\n * over-wide column pushes its values away from the columns they are read against; cap such a column\n * near its widest value and the drift cannot happen. A `width: 'auto'` column with no `maxWidth`\n * takes all remaining width, which is only the right call for a genuinely long free-text column.\n */\n private registerAutoWidthColumn(colDef: ColDef): void {\n colDef.colId ??= colDef.field;\n colDef.flex = AUTO_WIDTH_FLEX_WEIGHT;\n }\n\n /**\n * Field names from a host-supplied `[Columns]`, so the query fetches what the host chose to show.\n * Empty when the columns were generated from metadata or a view — those origins are already\n * reflected in the grid state / DefaultInView that `computeFieldsList` consults.\n *\n * Includes columns declared `visible: false`. Hiding a column is a DISPLAY decision, not a\n * statement that the data isn't wanted: this grid deliberately keeps hidden columns in its column\n * model as col defs with `hide: true` rather than omitting them (see `buildAgColumnDefsFromGridState`),\n * precisely so a saved `[GridState]` that marks one visible can bring it back. A column that\n * reappears with no data behind it renders every cell empty, which reads as a data bug rather\n * than a missing SELECT. The cost of the alternative is one column in the query that the host\n * itself asked for by name.\n */\n private hostColumnFieldNames(): string[] {\n if (!this._columnsFromHost) return [];\n return this._columns.map(c => c.field);\n }\n\n /**\n * Put host-supplied `[Columns]` into the entity's own field spelling — see\n * {@link canonicalizeColumnFields} for why the spelling is load-bearing rather than cosmetic.\n * Returns true when something actually changed, so the caller can rebuild derived state.\n *\n * Deliberately the ONLY place this normalisation happens. Everything downstream — the colDef's\n * `field` and hence its `colId`, `_columnStates`, captured grid state, sort settings, the export\n * column list, the fetched field list — reads `_columns`, so fixing it here keeps all of them\n * speaking one vocabulary instead of each needing its own case-insensitive comparison.\n */\n private canonicalizeHostColumns(): boolean {\n if (!this._columnsFromHost || !this._entityInfo || this._columns.length === 0) {\n return false;\n }\n const next = canonicalizeColumnFields(this._entityInfo, this._columns);\n const changed = next.some((col, i) => col !== this._columns[i]);\n if (changed) {\n this._columns = next;\n }\n return changed;\n }\n\n private buildFillerColumnDef(): ColDef {\n return {\n colId: FILLER_COLUMN_ID,\n headerName: '',\n flex: 1,\n // No floor: this column is the one thing that SHOULD yield when real columns need the room —\n // it shrinks to nothing and the grid falls back to horizontal scrolling, exactly as before.\n minWidth: 0,\n sortable: false,\n resizable: false,\n suppressMovable: true,\n // Never let a filler participate in anything a real column does.\n suppressHeaderMenuButton: true,\n suppressColumnsToolPanel: true,\n lockPosition: 'right',\n valueGetter: () => '',\n headerClass: 'mj-grid-filler-header',\n cellClass: 'mj-grid-filler-cell'\n };\n }\n\n private buildAgColumnDefsFromGridState(columnSettings: ViewGridColumnSetting[]): ColDef[] {\n if (!this._entityInfo) return [];\n\n const sortedColumns = [...columnSettings].sort((a, b) =>\n (a.orderIndex ?? 0) - (b.orderIndex ?? 0)\n );\n\n const cols: ColDef[] = [];\n\n for (const colConfig of sortedColumns) {\n const field = this._entityInfo.Fields.find(f =>\n f.Name.toLowerCase() === colConfig.Name.toLowerCase()\n );\n\n if (!field) continue;\n\n // A saved grid state carries pixel widths only, so restoring one would otherwise drop the\n // `width: 'auto'` fill declared by the host page — the dead-space-on-the-right bug would come\n // back the moment a user resized any column and the state was persisted. Treat 'auto' as a\n // LAYOUT decision owned by the page author, not a user preference the saved state overrides:\n // everything else (order, visibility, the other columns' widths) still comes from the state.\n const declared = this._columns.find(c => c.field.toLowerCase() === colConfig.Name.toLowerCase());\n const isAutoWidth = declared?.width === 'auto';\n\n const colDef: ColDef = {\n field: field.Name,\n // Use userDisplayName if set, otherwise fall back to DisplayName or field name\n headerName: colConfig.userDisplayName || colConfig.DisplayName || field.DisplayNameOrName,\n width: isAutoWidth ? undefined : (colConfig.width || this.estimateColumnWidth(field)),\n // The declared min/max travel with the 'auto' decision. Dropping them here was a real bug:\n // the saved state has no notion of either, so the column lost its ceiling and its floor and\n // sized itself off whatever space happened to be left.\n minWidth: isAutoWidth ? (declared?.minWidth ?? AUTO_WIDTH_COLUMN_MIN_PX) : undefined,\n maxWidth: isAutoWidth ? declared?.maxWidth : undefined,\n sortable: this._allowSorting,\n resizable: this._allowColumnResize,\n // Hidden columns are still added as col defs with hide:true rather than omitted\n // entirely (bug C2). A column omitted from the col defs is invisible to AG Grid's\n // quick filter, so search couldn't match values in columns the user had hidden.\n // Adding it with hide:true keeps it out of the visible layout and CSV export while\n // making its values quick-filterable. (Server-side filtered grids additionally need\n // the field flagged IncludeInUserSearchAPI for the server to return matching rows.)\n hide: colConfig.hidden === true\n };\n\n if (isAutoWidth) {\n this.registerAutoWidthColumn(colDef);\n }\n\n // Add type-specific formatters with optional custom format\n this.applyFieldFormatter(colDef, field, colConfig.format);\n\n cols.push(colDef);\n }\n\n return cols;\n }\n\n private mapColumnConfigToColDef(col: GridColumnConfig): ColDef {\n // `width: 'auto'` means \"this column absorbs the leftover row width\". It is part of the public\n // GridColumnConfig contract (`width?: number | 'auto'`) but was previously mapped to `undefined`,\n // so it silently did nothing and AG Grid fell back to its default width.\n //\n // Why it matters, and why this is the RIGHT place to fix it: `autoSizeColumnsSmartly()` below\n // deliberately declines to stretch when the pane is much wider than the columns (its `maxRatio`\n // guard), so a narrow `Status` column is never blown up to 400px on a wide monitor. That guard is\n // correct — but combined with `estimateColumnWidth()`'s hard 350px cap it meant a grid with a few\n // columns on a wide screen could NEVER fill, leaving permanent dead space to the right while a\n // text column truncated. `'auto'` is the per-column escape hatch for exactly that case: fixed\n // columns keep their pixel widths (what the guard protects) and only the column the page author\n // designated grows. AG Grid's `flex` is the native mechanism, so map straight onto it.\n const isAutoWidth = col.width === 'auto';\n const colDef: ColDef = {\n field: col.field,\n headerName: col.title || col.field,\n width: typeof col.width === 'number' ? col.width : undefined,\n // An auto-width column still needs a floor, or a column whose visible rows are all empty\n // measures to nothing and the header ends up unreadable.\n minWidth: col.minWidth ?? (isAutoWidth ? AUTO_WIDTH_COLUMN_MIN_PX : undefined),\n maxWidth: col.maxWidth,\n sortable: col.sortable !== false && this._allowSorting,\n filter: false,\n resizable: col.resizable !== false && this._allowColumnResize,\n hide: col.visible === false\n };\n\n if (isAutoWidth) {\n this.registerAutoWidthColumn(colDef);\n }\n\n // Apply field formatter for highlighting and type-specific formatting\n // if we have entity metadata for this field\n if (this._entityInfo) {\n const field = this._entityInfo.Fields.find(f =>\n f.Name.toLowerCase() === col.field.toLowerCase()\n );\n if (field) {\n this.applyFieldFormatter(colDef, field);\n }\n }\n\n return colDef;\n }\n\n private generateAgColumnDefs(entity: EntityInfo): ColDef[] {\n const cols: ColDef[] = [];\n let visibleFields = entity.Fields.filter(f => this.shouldShowField(f));\n\n // Fallback: if no DefaultInView fields are defined, show first 10 non-system fields\n // sorted by importance to give users a reasonable starting point\n if (visibleFields.length === 0) {\n visibleFields = this.getDefaultFieldsFallback(entity);\n }\n\n // Sort fields by importance for better default ordering\n visibleFields = this.sortFieldsByImportance(visibleFields);\n\n for (const field of visibleFields) {\n const colDef: ColDef = {\n field: field.Name,\n headerName: field.DisplayNameOrName,\n width: this.estimateColumnWidth(field),\n sortable: this._allowSorting,\n resizable: this._allowColumnResize,\n headerTooltip: this.buildHeaderTooltip(field)\n };\n\n this.applyFieldFormatter(colDef, field);\n cols.push(colDef);\n }\n\n return cols;\n }\n\n /**\n * When no DefaultInView fields are set, fall back to showing the first 10\n * non-system, non-PK fields to give users something reasonable to start with.\n */\n private getDefaultFieldsFallback(entity: EntityInfo): EntityFieldInfo[] {\n return entity.Fields\n .filter(f =>\n !f.Name.startsWith('__mj_') &&\n !(f.IsPrimaryKey && f.SQLFullType?.toLowerCase() === 'uniqueidentifier') &&\n (f.Length <= 500 || f.Length < 0) // Exclude very long text unless nvarchar(max)\n )\n .slice(0, 10);\n }\n\n /**\n * Sort fields by importance for better default column ordering.\n * Name fields first, then status/type, then other fields, with system fields last.\n */\n private sortFieldsByImportance(fields: EntityFieldInfo[]): EntityFieldInfo[] {\n return [...fields].sort((a, b) => {\n const priorityA = this.getFieldPriority(a);\n const priorityB = this.getFieldPriority(b);\n return priorityA - priorityB;\n });\n }\n\n private getFieldPriority(field: EntityFieldInfo): number {\n const nameLower = field.Name.toLowerCase();\n\n // Name fields first\n if (field.IsNameField) return 0;\n if (nameLower === 'name' || nameLower === 'title') return 1;\n\n // Status and type fields are important\n if (nameLower === 'status') return 2;\n if (nameLower === 'type' || nameLower === 'category') return 3;\n\n // Other name-like fields\n if (nameLower.endsWith('name') && !nameLower.endsWith('typename')) return 4;\n\n // Description fields\n if (nameLower.includes('description')) return 5;\n\n // Date fields\n if (field.TSType === 'Date') return 50;\n\n // Foreign keys (usually IDs pointing to other entities)\n if (field.RelatedEntityID) return 60;\n\n // Numbers\n if (field.TSType === 'number') return 70;\n\n // Booleans toward the end\n if (field.TSType === 'boolean') return 80;\n\n // Long text fields at the end\n if ((field.Length > 500 || field.Length < 0)) return 90;\n\n // System fields last (though they should be filtered out already)\n if (field.Name.startsWith('__mj_')) return 100;\n\n // Default priority\n return 40;\n }\n\n /**\n * Build a tooltip for the column header showing field details.\n */\n private buildHeaderTooltip(field: EntityFieldInfo): string {\n const parts: string[] = [];\n\n // Show internal field name if different from display name\n if (field.DisplayName && field.DisplayName !== field.Name) {\n parts.push(`Field: ${field.Name}`);\n }\n\n // Show description if available\n if (field.Description) {\n parts.push(field.Description);\n }\n\n // Show type info\n const typeInfo = field.Type + (field.Length && field.Length > 0 ? `(${field.Length})` : '');\n parts.push(`Type: ${typeInfo}`);\n\n return parts.join('\\n');\n }\n\n private applyFieldFormatter(colDef: ColDef, field: EntityFieldInfo, customFormat?: ColumnFormat): void {\n // Store type info for use in cell renderer\n const fieldType = field.TSType;\n const fieldNameLower = field.Name.toLowerCase();\n const extendedType = field.ExtendedType?.toLowerCase() || '';\n const vc = this.effectiveVisualConfig;\n\n // Determine special field types using ExtendedType metadata first, then field name patterns as fallback\n const isCurrency = customFormat?.type === 'currency' ||\n fieldNameLower.includes('amount') ||\n fieldNameLower.includes('price') ||\n fieldNameLower.includes('cost') ||\n fieldNameLower.includes('total');\n // Use ExtendedType='Email' from metadata, fallback to field name pattern\n const isEmail = extendedType === 'email' ||\n (!extendedType && fieldNameLower.includes('email'));\n // Use ExtendedType='URL' from metadata, fallback to field name pattern\n const isUrl = extendedType === 'url' ||\n (!extendedType && (fieldNameLower.includes('url') ||\n fieldNameLower.includes('website') ||\n fieldNameLower.includes('link')));\n // Image cells key off ExtendedType (or a User View format override). Field-name\n // heuristics (PhotoURL/LogoURL) are not used — those columns are classified as\n // ExtendedType='Image' in metadata.\n const isImage = (customFormat?.type as string | undefined) === 'image' ||\n extendedType === 'image';\n const isColor = extendedType === 'color';\n // Use ExtendedType='Tel' from metadata, fallback to field name pattern\n const isPhone = extendedType === 'tel' ||\n (!extendedType && (fieldNameLower.includes('phone') ||\n fieldNameLower.includes('mobile') ||\n fieldNameLower.includes('fax')));\n\n // Check if this is a foreign key field (has a related entity)\n // Also check if this is a virtual display field that corresponds to an FK field\n let isForeignKey = !!field.RelatedEntityID;\n let fkField: EntityFieldInfo | undefined = field;\n let relatedEntityName = isForeignKey ? field.RelatedEntity : undefined;\n\n // If this field doesn't have RelatedEntityID but is virtual, check for a corresponding FK field\n // Pattern: for a field named \"Category\", look for \"CategoryID\" with RelatedEntityID\n if (!isForeignKey && field.IsVirtual && this._entityInfo) {\n const potentialFkFieldName = field.Name + 'ID';\n const correspondingFkField = this._entityInfo.Fields.find(\n f => f.Name.toLowerCase() === potentialFkFieldName.toLowerCase() && f.RelatedEntityID\n );\n if (correspondingFkField) {\n isForeignKey = true;\n fkField = correspondingFkField;\n relatedEntityName = correspondingFkField.RelatedEntity;\n }\n }\n\n // Apply alignment - use custom format alignment if provided, otherwise default to right for numbers\n const customAlign = customFormat?.align;\n if (customAlign) {\n colDef.cellClass = `cell-align-${customAlign}`;\n colDef.headerClass = `header-align-${customAlign}`;\n } else if (vc.rightAlignNumbers && (fieldType === 'number' || isCurrency)) {\n colDef.cellClass = 'cell-align-right';\n colDef.headerClass = 'header-align-right';\n }\n\n if (isImage) {\n colDef.cellClass = `${colDef.cellClass || ''} mj-grid-image-cell`.trim();\n colDef.headerClass = `${colDef.headerClass || ''} mj-grid-image-header`.trim();\n colDef.width = 48;\n colDef.minWidth = 44;\n colDef.maxWidth = 56;\n colDef.resizable = false;\n }\n\n // Apply custom header style if provided\n if (customFormat?.headerStyle) {\n const headerStyle = this.buildCssStyle(customFormat.headerStyle);\n if (headerStyle) {\n colDef.headerClass = (colDef.headerClass || '') + ' custom-header-style';\n // AG Grid uses headerStyle for inline styles\n (colDef as ColDef & { headerStyle: Record<string, string> }).headerStyle = this.buildStyleObject(customFormat.headerStyle);\n }\n }\n\n // Use cellRenderer for highlighting support and enhanced formatting\n colDef.cellRenderer = (params: ICellRendererParams) => {\n if (params.value === null || params.value === undefined) {\n return '<span class=\"cell-empty\">—</span>';\n }\n\n if (isImage) {\n const raw = String(params.value).trim();\n const src = CoerceImageSrc(raw);\n if (src) {\n const escaped = HighlightUtil.escapeHtml(src);\n const img = `<img src=\"${escaped}\" alt=\"\" class=\"cell-image\" width=\"28\" height=\"28\" style=\"width:28px;height:28px;max-width:28px;max-height:28px;object-fit:cover;object-position:center;border-radius:50%;display:block\" />`;\n const inner = src.startsWith('data:')\n ? img\n : `<a href=\"${escaped}\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"cell-image-link\" onclick=\"event.stopPropagation()\">${img}</a>`;\n return this.wrapWithStyle(\n inner,\n customFormat?.cellStyle ? this.buildCssStyle(customFormat.cellStyle) : '',\n );\n }\n }\n\n if (isColor) {\n const raw = String(params.value).trim();\n const hex = ParseCssHexColor(raw);\n const escaped = HighlightUtil.escapeHtml(raw);\n const swatch = hex\n ? `<span style=\"width:14px;height:14px;border-radius:3px;background:${HighlightUtil.escapeHtml(hex)};border:1px solid rgba(0,0,0,.2);display:inline-block;flex-shrink:0\"></span>`\n : '';\n return this.wrapWithStyle(\n `<span style=\"display:inline-flex;align-items:center;gap:6px\">${swatch}${escaped}</span>`,\n customFormat?.cellStyle ? this.buildCssStyle(customFormat.cellStyle) : '',\n );\n }\n\n // Handle foreign key fields - render as clickable links\n // Only apply FK rendering if no custom format is specified\n if (isForeignKey && !customFormat && fkField?.RelatedEntityID) {\n // For virtual display fields, we show the display value but link to the FK value\n // For direct FK fields, the value IS the FK value\n const isVirtualDisplay = field.IsVirtual && fkField !== field;\n const displayValue = String(params.value);\n\n // Get the actual FK value - for virtual fields, look it up from row data\n let fkValue: string;\n if (isVirtualDisplay && params.data) {\n // Get the FK value from the corresponding FK field in the row data\n fkValue = String(params.data[fkField.Name] ?? '');\n } else {\n fkValue = displayValue;\n }\n\n // Skip if we don't have a valid FK value\n if (!fkValue) {\n return `<span>${HighlightUtil.escapeHtml(displayValue)}</span>`;\n }\n\n const escapedDisplayValue = HighlightUtil.escapeHtml(displayValue);\n const escapedFieldName = HighlightUtil.escapeHtml(fkField.Name);\n const escapedRelatedEntityId = HighlightUtil.escapeHtml(fkField.RelatedEntityID);\n const escapedRelatedEntityName = relatedEntityName ? HighlightUtil.escapeHtml(relatedEntityName) : '';\n\n // Build data attributes for the click handler\n const dataAttrs = `data-related-entity-id=\"${escapedRelatedEntityId}\" data-record-id=\"${fkValue}\" data-field-name=\"${escapedFieldName}\"${relatedEntityName ? ` data-related-entity-name=\"${escapedRelatedEntityName}\"` : ''}`;\n\n // Apply highlighting if filter text is set\n const displayText = this._filterText\n ? HighlightUtil.highlight(displayValue, this._filterText, true)\n : escapedDisplayValue;\n\n // NOTE: Do NOT add onclick=\"event.stopPropagation()\" here - it prevents AG Grid's cellClicked from firing\n const linkHtml = `<a href=\"javascript:void(0)\" class=\"cell-link cell-fk-link\" ${dataAttrs}>${displayText}</a>`;\n\n return linkHtml;\n }\n\n let displayValue = '';\n let extraClass = '';\n let inlineStyle = '';\n let isHtmlContent = false; // Track if displayValue contains HTML (icons, links)\n\n // Build inline style from custom cell style\n if (customFormat?.cellStyle) {\n inlineStyle = this.buildCssStyle(customFormat.cellStyle);\n }\n\n // Check if custom format is provided and has a non-auto type\n const useCustomFormat = customFormat && customFormat.type && customFormat.type !== 'auto';\n\n if (useCustomFormat) {\n // Use custom formatting\n displayValue = this.formatValueWithCustomFormat(params.value, customFormat, field);\n // Check if formatCustomBoolean returned HTML (icon or checkbox)\n if (customFormat.type === 'boolean' &&\n (customFormat.booleanDisplay === 'icon' || customFormat.booleanDisplay === 'checkbox')) {\n isHtmlContent = true;\n }\n } else {\n // Use default formatting based on field type\n // Boolean formatting\n if (fieldType === 'boolean') {\n if (vc.booleanIcons) {\n const iconClass = params.value\n ? 'fa-solid fa-check cell-boolean-true'\n : 'fa-solid fa-xmark cell-boolean-false';\n displayValue = `<i class=\"${iconClass}\"></i>`;\n isHtmlContent = true;\n } else {\n displayValue = params.value ? 'Yes' : 'No';\n }\n }\n // Date formatting\n else if (fieldType === 'Date') {\n displayValue = this.formatDefaultDate(params.value, field, !!vc.friendlyDates);\n }\n // Currency formatting\n else if (fieldType === 'number' && isCurrency) {\n const num = Number(params.value);\n displayValue = isNaN(num) ? String(params.value) : `$${num.toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 })}`;\n }\n // Regular number formatting\n else if (fieldType === 'number') {\n const num = Number(params.value);\n if (isNaN(num)) {\n displayValue = String(params.value);\n } else if (field.IsPrimaryKey) {\n // Primary-key integers are identifiers, not quantities — never group them with\n // thousands separators (an ID of 12345 must render as \"12345\", not \"12,345\").\n displayValue = String(params.value);\n } else {\n displayValue = num.toLocaleString();\n }\n }\n // Email formatting\n else if (isEmail && vc.clickableEmails) {\n const email = String(params.value);\n const escapedEmail = HighlightUtil.escapeHtml(email);\n if (this._filterText) {\n const highlighted = HighlightUtil.highlight(email, this._filterText, true);\n return this.wrapWithStyle(`<a href=\"mailto:${escapedEmail}\" class=\"cell-link cell-email\" onclick=\"event.stopPropagation()\">${highlighted}</a>`, inlineStyle);\n }\n return this.wrapWithStyle(`<a href=\"mailto:${escapedEmail}\" class=\"cell-link cell-email\" onclick=\"event.stopPropagation()\">${escapedEmail}</a>`, inlineStyle);\n }\n // URL formatting\n else if (isUrl && vc.clickableUrls) {\n let url = String(params.value);\n if (url && !url.startsWith('http')) {\n url = 'https://' + url;\n }\n const displayUrl = url.replace(/^https?:\\/\\//, '').replace(/\\/$/, '');\n const escapedDisplay = HighlightUtil.escapeHtml(displayUrl);\n if (this._filterText) {\n const highlighted = HighlightUtil.highlight(displayUrl, this._filterText, true);\n return this.wrapWithStyle(`<a href=\"${HighlightUtil.escapeHtml(url)}\" target=\"_blank\" class=\"cell-link cell-url\" onclick=\"event.stopPropagation()\">${highlighted}</a>`, inlineStyle);\n }\n return this.wrapWithStyle(`<a href=\"${HighlightUtil.escapeHtml(url)}\" target=\"_blank\" class=\"cell-link cell-url\" onclick=\"event.stopPropagation()\">${escapedDisplay}</a>`, inlineStyle);\n }\n // Phone formatting\n else if (isPhone) {\n displayValue = String(params.value);\n extraClass = 'cell-phone';\n }\n // Default string formatting\n else {\n displayValue = String(params.value);\n }\n }\n\n // Build the span with optional style and class\n const styleAttr = inlineStyle ? ` style=\"${inlineStyle}\"` : '';\n const classAttr = extraClass ? ` class=\"${extraClass}\"` : '';\n\n // Handle content that's already HTML (icons, etc.)\n if (isHtmlContent) {\n if (inlineStyle) {\n return `<span${styleAttr}>${displayValue}</span>`;\n }\n return displayValue;\n }\n\n // Apply highlighting if filterText is set\n if (this._filterText && displayValue) {\n return `<span${classAttr}${styleAttr}>${HighlightUtil.highlight(displayValue, this._filterText, true)}</span>`;\n }\n\n return `<span${classAttr}${styleAttr}>${HighlightUtil.escapeHtml(displayValue)}</span>`;\n };\n }\n\n /**\n * Helper to wrap content with an inline style span\n */\n private wrapWithStyle(content: string, style: string): string {\n if (!style) return content;\n return `<span style=\"${style}\">${content}</span>`;\n }\n\n\n\n /**\n * Build a CSS style string from a ColumnTextStyle object\n */\n private buildCssStyle(style: ColumnTextStyle): string {\n const parts: string[] = [];\n if (style.bold) parts.push('font-weight: bold');\n if (style.italic) parts.push('font-style: italic');\n if (style.underline) parts.push('text-decoration: underline');\n if (style.color) parts.push(`color: ${style.color}`);\n if (style.backgroundColor) parts.push(`background-color: ${style.backgroundColor}`);\n return parts.join('; ');\n }\n\n /**\n * Build a style object for AG Grid from a ColumnTextStyle object\n */\n private buildStyleObject(style: ColumnTextStyle): Record<string, string> {\n const obj: Record<string, string> = {};\n if (style.bold) obj['fontWeight'] = 'bold';\n if (style.italic) obj['fontStyle'] = 'italic';\n if (style.underline) obj['textDecoration'] = 'underline';\n if (style.color) obj['color'] = style.color;\n if (style.backgroundColor) obj['backgroundColor'] = style.backgroundColor;\n return obj;\n }\n\n /**\n * Format a value using custom ColumnFormat settings\n */\n /**\n * Default rendering of a date-family cell. A `date` column is a calendar day that arrives as UTC\n * midnight; a local-zone formatter would land on the previous day for every reader west of\n * Greenwich (MJ#4210). A timestamp names an instant and stays in local time.\n */\n private formatDefaultDate(value: unknown, field: EntityFieldInfo, friendlyDates: boolean): string {\n const date = value instanceof Date ? value : new Date(value as string);\n if (isNaN(date.getTime())) return String(value);\n if (!friendlyDates) return date.toISOString().split('T')[0];\n const options: Intl.DateTimeFormatOptions = { month: 'short', day: 'numeric', year: 'numeric' };\n return IsDateOnlySQLType(field.Type) ? FormatDateOnly(date, options) : date.toLocaleDateString(undefined, options);\n }\n\n private formatValueWithCustomFormat(value: unknown, format: ColumnFormat, field: EntityFieldInfo): string {\n if (value == null) return '—';\n\n switch (format.type) {\n case 'number':\n return this.formatCustomNumber(value as number, format);\n case 'currency':\n return this.formatCustomCurrency(value as number, format);\n case 'percent':\n return this.formatCustomPercent(value as number, format);\n case 'date':\n case 'datetime':\n return this.formatCustomDate(value, format, IsDateOnlySQLType(field.Type));\n case 'boolean':\n return this.formatCustomBoolean(value as boolean, format);\n default:\n return String(value);\n }\n }\n\n private formatCustomNumber(value: number, format: ColumnFormat): string {\n const num = Number(value);\n if (isNaN(num)) return String(value);\n\n const options: Intl.NumberFormatOptions = {\n minimumFractionDigits: format.decimals ?? 0,\n maximumFractionDigits: format.decimals ?? 0,\n useGrouping: format.thousandsSeparator ?? true\n };\n return new Intl.NumberFormat('en-US', options).format(num);\n }\n\n private formatCustomCurrency(value: number, format: ColumnFormat): string {\n const num = Number(value);\n if (isNaN(num)) return String(value);\n\n const options: Intl.NumberFormatOptions = {\n style: 'currency',\n currency: format.currencyCode || 'USD',\n minimumFractionDigits: format.decimals ?? 2,\n maximumFractionDigits: format.decimals ?? 2\n };\n return new Intl.NumberFormat('en-US', options).format(num);\n }\n\n private formatCustomPercent(value: number, format: ColumnFormat): string {\n const num = Number(value);\n if (isNaN(num)) return String(value);\n\n const options: Intl.NumberFormatOptions = {\n style: 'percent',\n minimumFractionDigits: format.decimals ?? 0,\n maximumFractionDigits: format.decimals ?? 0\n };\n // Assume value is already a percentage (e.g., 50 = 50%), divide by 100\n return new Intl.NumberFormat('en-US', options).format(num / 100);\n }\n\n /**\n * @param dateOnly The column is a SQL `date`: a calendar day at UTC midnight with no time to show.\n * It is rendered in UTC so the day does not shift west of Greenwich, and a `datetime` column\n * format cannot add a time of day to it (MJ#4210). A timestamp column keeps local rendering.\n */\n private formatCustomDate(value: unknown, format: ColumnFormat, dateOnly: boolean): string {\n const date = value instanceof Date ? value : new Date(value as string);\n if (isNaN(date.getTime())) return String(value);\n\n // Parse format string - check for weekday variants\n const formatStr = format.dateFormat || 'medium';\n const includeWeekday = formatStr.includes('-weekday');\n const baseFormat = formatStr.replace('-weekday', '') as 'short' | 'medium' | 'long';\n const withTime = format.type === 'datetime' && !dateOnly;\n\n let options: Intl.DateTimeFormatOptions;\n\n // Intl.DateTimeFormat doesn't allow combining dateStyle with weekday\n // So we must use individual components when weekday is requested\n if (includeWeekday) {\n if (baseFormat === 'short') {\n options = { weekday: 'short', month: 'numeric', day: 'numeric', year: '2-digit' };\n } else if (baseFormat === 'long') {\n options = { weekday: 'long', month: 'long', day: 'numeric', year: 'numeric' };\n } else {\n // medium\n options = { weekday: 'short', month: 'short', day: 'numeric', year: 'numeric' };\n }\n if (withTime) {\n options.hour = 'numeric';\n options.minute = '2-digit';\n }\n } else {\n // No weekday - can use dateStyle shorthand\n options = {\n dateStyle: baseFormat === 'short' ? 'short' : baseFormat === 'long' ? 'long' : 'medium'\n };\n if (withTime) {\n options.timeStyle = 'short';\n }\n }\n\n return dateOnly ? FormatDateOnly(date, options, 'en-US') : new Intl.DateTimeFormat('en-US', options).format(date);\n }\n\n private formatCustomBoolean(value: boolean, format: ColumnFormat): string {\n if (format.booleanDisplay === 'icon') {\n const iconClass = value\n ? 'fa-solid fa-check cell-boolean-true'\n : 'fa-solid fa-xmark cell-boolean-false';\n return `<i class=\"${iconClass}\"></i>`;\n }\n if (format.booleanDisplay === 'checkbox') {\n return value\n ? '<i class=\"fa-regular fa-square-check cell-boolean-true\"></i>'\n : '<i class=\"fa-regular fa-square cell-boolean-false\"></i>';\n }\n return value ? (format.trueLabel || 'Yes') : (format.falseLabel || 'No');\n }\n\n // ========================================\n // AG Grid Row Selection Configuration\n // ========================================\n\n private updateAgRowSelection(): void {\n switch (this._selectionMode) {\n case 'none':\n this.agRowSelection = { mode: 'singleRow', enableClickSelection: false, checkboxes: false };\n break;\n case 'single':\n this.agRowSelection = { mode: 'singleRow', enableClickSelection: true, checkboxes: false };\n break;\n case 'multiple':\n // enableSelectionWithoutKeys replaces deprecated rowMultiSelectWithClick (as of AG Grid v32.2)\n this.agRowSelection = { mode: 'multiRow', enableClickSelection: true, checkboxes: false, enableSelectionWithoutKeys: true };\n break;\n case 'checkbox':\n this.agRowSelection = {\n mode: 'multiRow',\n enableClickSelection: true,\n checkboxes: true,\n headerCheckbox: true,\n enableSelectionWithoutKeys: true\n };\n break;\n }\n\n // Update the grid if it's already initialized\n if (this.gridApi) {\n this.gridApi.setGridOption('rowSelection', this.agRowSelection);\n }\n }\n\n // ========================================\n // Data Loading\n // ========================================\n\n async loadData(isAutoRefresh: boolean = false): Promise<void> {\n if (this._useExternalData) {\n console.debug(`[entity-data-grid] loadData() skipped: using external data`);\n this.processData();\n return;\n }\n\n // Check if we have a valid data source via Params\n const hasDataSource = this._params && (\n this._params.ViewID ||\n this._params.ViewName ||\n this._params.ViewEntity ||\n this._params.EntityName\n );\n\n if (!hasDataSource) {\n console.debug(`[entity-data-grid] loadData() skipped: no data source in params`);\n return;\n }\n\n // Check AllowLoad for deferred loading\n if (!this._allowLoad) {\n console.debug(`[entity-data-grid] loadData() skipped: allowLoad=false`);\n return;\n }\n\n console.debug(`[entity-data-grid] loadData() proceeding: entity=${this._entityInfo?.Name}, isAutoRefresh=${isAutoRefresh}, allowLoad=${this._allowLoad}`);\n\n // For infinite scroll mode, setup or refresh the datasource\n if (this._paginationMode === 'infinite') {\n if (this.gridApi) {\n if (!this.infiniteDatasource) {\n this.setupInfiniteScroll();\n } else {\n this.refreshInfiniteCache();\n }\n }\n // In infinite mode, the datasource handles loading, so we're done\n return;\n }\n\n // If a load is already in progress, return the existing promise\n // This prevents redundant API calls when loadData is called multiple times\n if (this._loadDataPromise) {\n return this._loadDataPromise;\n }\n\n // Wrap the actual loading logic in a promise we can track\n this._loadDataPromise = this.executeLoadData(isAutoRefresh);\n\n try {\n await this._loadDataPromise;\n } finally {\n this._loadDataPromise = null;\n }\n }\n\n /**\n * Internal method that performs the actual data loading.\n * Called by loadData() which handles promise deduplication.\n */\n private async executeLoadData(isAutoRefresh: boolean): Promise<void> {\n // Client-side mode - load all data upfront\n const beforeRefreshEvent = new BeforeDataRefreshEventArgs(this, isAutoRefresh);\n this.BeforeDataRefresh.emit(beforeRefreshEvent);\n if (beforeRefreshEvent.cancel) {\n return;\n }\n\n // Build the RunViewParams - prefer new Params input over legacy inputs\n const runViewParams = this.buildRunViewParams();\n\n // Create GridRunViewParams for events (backward compatibility)\n const gridParams: GridRunViewParams = {\n entityName: runViewParams.EntityName || this._entityInfo?.Name || '',\n extraFilter: (typeof runViewParams.ExtraFilter === 'string' ? runViewParams.ExtraFilter : runViewParams.ExtraFilter?.default) || '',\n orderBy: (typeof runViewParams.OrderBy === 'string' ? runViewParams.OrderBy : runViewParams.OrderBy?.default) || '',\n maxRows: runViewParams.MaxRows || 0,\n fields: runViewParams.Fields,\n searchString: runViewParams.UserSearchString || ''\n };\n\n const beforeLoadEvent = new BeforeDataLoadEventArgs(this, gridParams);\n this.BeforeDataLoad.emit(beforeLoadEvent);\n if (beforeLoadEvent.cancel) {\n return;\n }\n\n // Apply any modifications from beforeLoadEvent\n if (beforeLoadEvent.modifiedParams) {\n if (beforeLoadEvent.modifiedParams.extraFilter) {\n runViewParams.ExtraFilter = beforeLoadEvent.modifiedParams.extraFilter;\n }\n if (beforeLoadEvent.modifiedParams.orderBy) {\n runViewParams.OrderBy = beforeLoadEvent.modifiedParams.orderBy;\n }\n if (beforeLoadEvent.modifiedParams.maxRows) {\n runViewParams.MaxRows = beforeLoadEvent.modifiedParams.maxRows;\n }\n if (beforeLoadEvent.modifiedParams.fields) {\n runViewParams.Fields = beforeLoadEvent.modifiedParams.fields;\n }\n if (beforeLoadEvent.modifiedParams.searchString) {\n runViewParams.UserSearchString = beforeLoadEvent.modifiedParams.searchString;\n }\n }\n\n this.loading = true;\n this._aggregatesLoading = true;\n this.errorMessage = '';\n this.cdr.detectChanges();\n\n const startTime = performance.now();\n\n try {\n // Build aggregate expressions from config if present\n // Use EffectiveAggregatesConfig to check both _aggregatesConfig and _gridState.aggregates\n const effectiveAggConfig = this.EffectiveAggregatesConfig;\n let aggregateExpressions: AggregateExpression[] | undefined;\n if (effectiveAggConfig?.expressions?.length) {\n aggregateExpressions = effectiveAggConfig.expressions\n .filter(agg => agg.enabled !== false && agg.expression)\n .map(agg => ({\n expression: agg.expression,\n alias: agg.id || agg.label || agg.expression\n }));\n }\n\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView<Record<string, unknown>>({\n ...runViewParams,\n ResultType: 'simple',\n Fields: this._entityInfo ? computeFieldsList(this._entityInfo, this._gridState, this.hostColumnFieldNames()) : undefined,\n Aggregates: aggregateExpressions\n });\n\n const loadTimeMs = performance.now() - startTime;\n\n if (result.Success) {\n this._allData = result.Results || [];\n this.totalRowCount = result.TotalRowCount || this._allData.length;\n this.processData();\n\n // Process aggregate results\n this.processAggregateResults(result.AggregateResults, result.AggregateExecutionTime);\n\n // Reapply sort state to grid after data load to maintain visual indicators\n // Use Promise.resolve() to defer until after Angular's change detection cycle\n // has completed and AG Grid has processed the new row data\n if (this._sortState.length > 0) {\n Promise.resolve().then(() => {\n this.applySortStateToGrid();\n });\n }\n\n const afterLoadEvent = new AfterDataLoadEventArgs(\n this,\n gridParams,\n true,\n this.totalRowCount,\n this._allData.length,\n loadTimeMs\n );\n this.AfterDataLoad.emit(afterLoadEvent);\n\n const afterRefreshEvent = new AfterDataRefreshEventArgs(\n this,\n true,\n this.totalRowCount,\n loadTimeMs\n );\n this.AfterDataRefresh.emit(afterRefreshEvent);\n } else {\n this.errorMessage = result.ErrorMessage || 'Failed to load data';\n\n const afterLoadEvent = new AfterDataLoadEventArgs(\n this,\n gridParams,\n false,\n 0,\n 0,\n loadTimeMs,\n this.errorMessage\n );\n this.AfterDataLoad.emit(afterLoadEvent);\n }\n } catch (error) {\n const loadTimeMs = performance.now() - startTime;\n this.errorMessage = error instanceof Error ? error.message : 'Unknown error occurred';\n\n const afterLoadEvent = new AfterDataLoadEventArgs(\n this,\n gridParams,\n false,\n 0,\n 0,\n loadTimeMs,\n this.errorMessage\n );\n this.AfterDataLoad.emit(afterLoadEvent);\n } finally {\n this.ngZone.run(() => {\n this.loading = false;\n this.cdr.detectChanges();\n });\n }\n }\n\n /**\n * Builds RunViewParams from the Params input.\n * Requires Params to be set - the grid needs a data source configured.\n */\n private buildRunViewParams(): RunViewParams {\n if (!this._params) {\n throw new Error('Params must be set before loading data');\n }\n\n const params: RunViewParams = { ...this._params };\n\n // Apply sort state (may be modified by user interactions)\n const orderBy = this.buildOrderByClause();\n if (orderBy) {\n params.OrderBy = orderBy;\n }\n\n return params;\n }\n\n private buildOrderByClause(): string {\n if (this._sortState.length > 0) {\n return this._sortState\n .sort((a, b) => a.index - b.index)\n .map(s => `${s.field} ${s.direction.toUpperCase()}`)\n .join(', ');\n }\n // Fall back to OrderBy from Params if set\n const orderByParam = this._params?.OrderBy;\n if (!orderByParam) return '';\n return typeof orderByParam === 'string' ? orderByParam : orderByParam.default;\n }\n\n // ========================================\n // Infinite Scroll Data Source\n // ========================================\n\n /**\n * Creates and returns an AG Grid IDatasource for infinite scroll mode.\n * This datasource fetches data in pages from the server as the user scrolls.\n */\n private createInfiniteDatasource(): IDatasource {\n return {\n getRows: async (params: IGetRowsParams) => {\n const startRow = params.startRow;\n const endRow = params.endRow;\n const blockSize = endRow - startRow;\n\n try {\n // Build params with pagination\n const runViewParams = this.buildRunViewParams();\n runViewParams.StartRow = startRow;\n runViewParams.MaxRows = blockSize;\n\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView<Record<string, unknown>>({\n ...runViewParams,\n ResultType: 'simple',\n Fields: this._entityInfo ? computeFieldsList(this._entityInfo, this._gridState, this.hostColumnFieldNames()) : undefined\n });\n\n if (result.Success) {\n const entities = result.Results || [];\n\n // Process entities into row data\n const rowData = entities.map((entity, index) => {\n return this.entityToRowData(entity, startRow + index);\n });\n\n // Update total row count\n this.totalRowCount = result.TotalRowCount || 0;\n this.cdr.detectChanges();\n\n // Determine if we've reached the last row\n const lastRow = result.TotalRowCount != null && startRow + entities.length >= result.TotalRowCount\n ? result.TotalRowCount\n : undefined;\n\n params.successCallback(rowData, lastRow);\n } else {\n this.errorMessage = result.ErrorMessage || 'Failed to load data';\n this.cdr.detectChanges();\n params.failCallback();\n }\n } catch (error) {\n this.errorMessage = error instanceof Error ? error.message : 'Unknown error occurred';\n this.cdr.detectChanges();\n params.failCallback();\n }\n }\n };\n }\n\n /**\n * Converts a Record<string, unknown> to AG Grid row data format.\n * This is used by both client and infinite scroll modes for consistent data formatting.\n */\n private entityToRowData(entity: Record<string, unknown>, index: number): Record<string, unknown> {\n const key = this.getRowKey(entity);\n\n // Store in row data map for later retrieval\n const rowData: GridRowData = {\n key,\n index,\n entity,\n selected: this._selectedKeys.includes(key),\n editing: this._editingRowKey === key,\n dirty: this._pendingChanges.some(c => c.rowKey === key),\n cssClasses: this.computeRowClasses(index, entity)\n };\n this._rowDataMap.set(key, rowData);\n\n // Build AG Grid row data\n const row: Record<string, unknown> = {\n __pk: key\n };\n\n if (this._entityInfo) {\n for (const field of this._entityInfo.Fields) {\n row[field.Name] = entity[field.Name];\n }\n }\n\n return row;\n }\n\n /**\n * Sets up the grid for infinite scroll mode.\n * Called when PaginationMode is 'infinite'.\n */\n private setupInfiniteScroll(): void {\n if (!this.gridApi) return;\n\n // Create datasource\n this.infiniteDatasource = this.createInfiniteDatasource();\n\n // Set datasource on grid\n this.gridApi.setGridOption('datasource', this.infiniteDatasource);\n }\n\n /**\n * Refreshes the infinite scroll cache.\n * Call this when data source parameters change.\n */\n private refreshInfiniteCache(): void {\n if (!this.gridApi || this._paginationMode !== 'infinite') return;\n\n // Clear the row data map since we're refreshing\n this._rowDataMap.clear();\n\n // Purge cache and refresh\n this.gridApi.refreshInfiniteCache();\n\n // Reapply sort state to grid after refresh to maintain visual indicators\n // Use Promise.resolve() to defer until after AG Grid has processed the cache refresh\n if (this._sortState.length > 0) {\n Promise.resolve().then(() => {\n this.applySortStateToGrid();\n });\n }\n }\n\n private processData(): void {\n this._rowDataMap.clear();\n const dataSource = this._useExternalData ? this._data : this._allData;\n\n this.rowData = dataSource.map((entity, index) => {\n const key = this.getRowKey(entity);\n\n const rowData: GridRowData = {\n key,\n index,\n entity,\n selected: this._selectedKeys.includes(key),\n editing: this._editingRowKey === key,\n dirty: this._pendingChanges.some(c => c.rowKey === key),\n cssClasses: this.computeRowClasses(index, entity)\n };\n\n this._rowDataMap.set(key, rowData);\n\n // Build AG Grid row data\n const row: Record<string, unknown> = {\n __pk: key\n };\n\n if (this._entityInfo) {\n for (const field of this._entityInfo.Fields) {\n row[field.Name] = entity[field.Name];\n }\n }\n\n return row;\n });\n\n this.cdr.detectChanges();\n }\n\n /**\n * Process aggregate results from RunView and emit the AggregatesLoaded event.\n * Builds the value map for easy lookup by expression or id.\n */\n private processAggregateResults(results: AggregateResult[] | undefined, executionTime?: number): void {\n this._aggregatesLoading = false;\n\n if (!results || results.length === 0) {\n this._aggregateResults = [];\n this._aggregateValues.clear();\n return;\n }\n\n this._aggregateResults = results;\n this._aggregateValues.clear();\n\n // Build the values map, keyed by alias (which is set to id or expression)\n for (const result of results) {\n if (!result.error) {\n this._aggregateValues.set(result.alias, result.value);\n }\n }\n\n // Also map by expression for easy lookup\n for (const result of results) {\n if (!result.error && result.expression !== result.alias) {\n this._aggregateValues.set(result.expression, result.value);\n }\n }\n\n // Emit the aggregates loaded event\n this.AggregatesLoaded.emit({\n results: this._aggregateResults,\n values: this._aggregateValues,\n executionTime\n });\n\n this.cdr.detectChanges();\n }\n\n private getRowKey(entity: Record<string, unknown>): string {\n // Build key from EntityInfo PK fields when available\n if (this._entityInfo) {\n return buildPkString(entity, this._entityInfo);\n }\n // Fallback to configured key field via direct property access\n const keyValue = entity[this._keyField];\n return keyValue != null ? String(keyValue) : '';\n }\n\n private computeRowClasses(index: number, _entity: Record<string, unknown>): string[] {\n const classes: string[] = [];\n if (this._striped && index % 2 === 1) {\n classes.push('grid-row-alt');\n }\n return classes;\n }\n\n // ========================================\n // AG Grid Event Handlers\n // ========================================\n\n onGridReady(event: GridReadyEvent): void {\n this.gridApi = event.api;\n // Let the quick filter (search box) match values in HIDDEN columns too (bug C2). AG Grid\n // defaults `includeHiddenColumnsInQuickFilter` to false, so without this a search term that\n // only exists in a column the user has hidden would match nothing — even though we now add\n // hidden columns to the col defs with hide:true precisely so they remain searchable.\n this.gridApi.setGridOption('includeHiddenColumnsInQuickFilter', true);\n this.updateSelection();\n\n if (this._sortState.length > 0) {\n this.applySortStateToGrid();\n }\n\n // Smart column sizing: use our estimated widths but ensure grid fills available space\n // without making columns excessively wide\n this.autoSizeColumnsSmartly(event.api);\n\n // Setup infinite scroll if in that mode and we have params\n if (this._paginationMode === 'infinite' && this._allowLoad && this._params) {\n this.setupInfiniteScroll();\n }\n }\n\n /**\n * Smart column auto-sizing that respects our width estimates\n * while ensuring the grid fills available space appropriately\n */\n private autoSizeColumnsSmartly(api: GridApi): void {\n // With a filler present, leftover width already has a home and it is deliberately an empty one.\n // The proportional stretch below would fight that: sizeColumnsToFit() assigns explicit widths to\n // every column, which clears the filler's flex and re-introduces the stretching of real columns\n // that the filler exists to avoid.\n if (this.agColumnDefs.some(col => col.flex)) return;\n\n // Get total estimated width from our column definitions\n const totalEstimatedWidth = this.agColumnDefs.reduce((sum, col) => sum + (col.width || 150), 0);\n\n // Get available width from the grid container\n const gridElement = this.elementRef.nativeElement.querySelector('.mj-ag-grid');\n const availableWidth = gridElement?.clientWidth || 0;\n\n if (availableWidth > 0 && totalEstimatedWidth < availableWidth) {\n // If our columns are narrower than available space, stretch proportionally\n // but cap individual column growth to prevent excessive widths\n const ratio = availableWidth / totalEstimatedWidth;\n const maxRatio = 1.5; // Don't let columns grow more than 50%\n\n if (ratio <= maxRatio) {\n // Moderate stretch - use sizeColumnsToFit\n api.sizeColumnsToFit();\n } else {\n // Too much stretch - just use our estimated widths\n // The grid will have some empty space on the right, which is fine\n }\n }\n // If our columns are wider than available space, let the user scroll horizontally\n // (AG Grid handles this automatically)\n }\n\n onAgRowClicked(event: RowClickedEvent): void {\n if (!this._entityInfo || !event.data) return;\n\n const pkString = event.data['__pk'] as string;\n const rowData = this._rowDataMap.get(pkString);\n if (!rowData) return;\n\n // Fire before click event\n const mouseEvent = event.event as MouseEvent;\n const beforeEvent = new BeforeRowClickEventArgs(\n this,\n rowData.entity,\n rowData.index,\n pkString,\n mouseEvent,\n undefined,\n undefined\n );\n this.BeforeRowClick.emit(beforeEvent);\n if (beforeEvent.cancel) return;\n\n // Fire after click event\n const afterEvent = new AfterRowClickEventArgs(\n this,\n rowData.entity,\n rowData.index,\n pkString,\n mouseEvent,\n undefined,\n undefined\n );\n this.AfterRowClick.emit(afterEvent);\n\n // Auto-navigate on single click (if enabled and not navigating on double-click only)\n if (this._autoNavigate && !this._navigateOnDoubleClick && this._editMode === 'none') {\n this.emitNavigationRequest(rowData.entity, pkString);\n }\n }\n\n onAgRowDoubleClicked(event: RowDoubleClickedEvent): void {\n if (!this._entityInfo || !event.data) return;\n\n const pkString = event.data['__pk'] as string;\n const rowData = this._rowDataMap.get(pkString);\n if (!rowData) return;\n\n // Fire before double-click event\n const mouseEvent = event.event as MouseEvent;\n const beforeEvent = new BeforeRowDoubleClickEventArgs(\n this,\n rowData.entity,\n rowData.index,\n pkString,\n mouseEvent,\n undefined,\n undefined\n );\n this.BeforeRowDoubleClick.emit(beforeEvent);\n if (beforeEvent.cancel) return;\n\n // Fire after double-click event\n const afterEvent = new AfterRowDoubleClickEventArgs(\n this,\n rowData.entity,\n rowData.index,\n pkString,\n mouseEvent,\n undefined,\n undefined\n );\n this.AfterRowDoubleClick.emit(afterEvent);\n\n // Auto-navigate on double-click (if enabled)\n if (this._autoNavigate && this._navigateOnDoubleClick && this._editMode === 'none') {\n this.emitNavigationRequest(rowData.entity, pkString);\n }\n }\n\n /**\n * Handles cell click events to detect FK link clicks.\n * When a user clicks on a foreign key link, emits ForeignKeyClick event\n * for the parent component to handle navigation.\n */\n onAgCellClicked(event: CellClickedEvent): void {\n // Check if the click was on an FK link\n const target = event.event?.target as HTMLElement;\n if (!target) {\n return;\n }\n\n // Look for the FK link element (may be the target or a parent)\n const fkLink = target.closest('.cell-fk-link') as HTMLElement;\n if (!fkLink) {\n return;\n }\n\n // Prevent the row click handler from firing\n event.event?.stopPropagation();\n\n // Extract FK data from data attributes\n const relatedEntityId = fkLink.dataset['relatedEntityId'];\n const recordId = fkLink.dataset['recordId'];\n const fieldName = fkLink.dataset['fieldName'];\n const relatedEntityName = fkLink.dataset['relatedEntityName'];\n\n if (relatedEntityId && recordId && fieldName) {\n this.ForeignKeyClick.emit({\n relatedEntityId,\n recordId,\n fieldName,\n relatedEntityName\n });\n } else {\n //console.log('[FK Debug] Missing required data attributes, not emitting');\n }\n }\n\n /**\n * Emits a navigation request for the given entity record.\n */\n private emitNavigationRequest(entity: Record<string, unknown>, compositeKey: string): void {\n if (!this._entityInfo) return;\n\n this.NavigationRequested.emit({\n entityInfo: this._entityInfo,\n record: entity,\n compositeKey\n });\n }\n\n onAgSortChanged(event: AgSortChangedEvent): void {\n if (this.suppressSortEvents) {\n return;\n }\n\n const sortModel = event.api.getColumnState()\n .filter(col => col.sort)\n .map(col => ({\n field: col.colId,\n direction: col.sort as 'asc' | 'desc',\n index: col.sortIndex ?? 0\n }));\n\n if (sortModel.length > 0) {\n // Find the column config\n const column = this._columnStates.find(c => c.config.field === sortModel[0].field);\n\n if (column) {\n // Fire before sort event\n const beforeEvent = new BeforeSortEventArgs(\n this,\n column.config,\n sortModel[0].direction,\n sortModel.length > 1,\n this._sortState\n );\n this.BeforeSort.emit(beforeEvent);\n if (beforeEvent.cancel) {\n // Revert to previous sort state\n this.applySortStateToGrid();\n return;\n }\n }\n\n this._sortState = sortModel;\n\n if (column) {\n // Fire after sort event\n const afterEvent = new AfterSortEventArgs(\n this,\n column.config,\n sortModel[0].direction,\n this._sortState\n );\n this.AfterSort.emit(afterEvent);\n }\n\n // User changed sort - mark as dirty and emit grid state changed\n this._isGridStateDirty = true;\n this.emitGridStateChanged('sort');\n\n // Determine if we need to reload data from server or can sort client-side\n // Client-side sorting is only possible if we have ALL the data loaded\n if (this._serverSideSorting && !this._useExternalData) {\n this.loadData(true);\n }\n // When using external data, parent receives afterSort event and can reload with new sort order\n // If we have all data, AG Grid handles client-side sorting automatically\n } else {\n this._sortState = [];\n // User cleared sort - mark as dirty and emit grid state changed\n this._isGridStateDirty = true;\n this.emitGridStateChanged('sort');\n }\n }\n\n onAgSelectionChanged(event: SelectionChangedEvent): void {\n const selectedNodes = event.api.getSelectedNodes();\n const previousSelection = [...this._selectedKeys];\n const newSelection = selectedNodes.map(node => node.data['__pk'] as string);\n\n // Find newly selected rows\n const addedKeys = newSelection.filter(k => !previousSelection.includes(k));\n const removedKeys = previousSelection.filter(k => !newSelection.includes(k));\n\n // Handle deselections\n for (const key of removedKeys) {\n const rowData = this._rowDataMap.get(key);\n if (rowData) {\n const beforeEvent = new BeforeRowDeselectEventArgs(\n this,\n rowData.entity,\n rowData.index,\n key,\n this._selectedKeys\n );\n this.BeforeRowDeselect.emit(beforeEvent);\n // Note: Can't cancel AG Grid's selection, but we emit the event\n }\n }\n\n // Handle selections\n for (const key of addedKeys) {\n const rowData = this._rowDataMap.get(key);\n if (rowData) {\n const beforeEvent = new BeforeRowSelectEventArgs(\n this,\n rowData.entity,\n rowData.index,\n key,\n addedKeys.length > 1,\n this._selectedKeys\n );\n this.BeforeRowSelect.emit(beforeEvent);\n // Note: Can't cancel AG Grid's selection, but we emit the event\n }\n }\n\n this._selectedKeys = newSelection;\n this.updateRowSelectionState();\n\n // Fire after events\n for (const key of removedKeys) {\n const rowData = this._rowDataMap.get(key);\n if (rowData) {\n const afterEvent = new AfterRowDeselectEventArgs(\n this,\n rowData.entity,\n rowData.index,\n key,\n this._selectedKeys,\n previousSelection\n );\n this.AfterRowDeselect.emit(afterEvent);\n }\n }\n\n for (const key of addedKeys) {\n const rowData = this._rowDataMap.get(key);\n if (rowData) {\n const afterEvent = new AfterRowSelectEventArgs(\n this,\n rowData.entity,\n rowData.index,\n key,\n addedKeys.length > 1,\n this._selectedKeys,\n previousSelection\n );\n this.AfterRowSelect.emit(afterEvent);\n }\n }\n\n this.SelectionChange.emit(this._selectedKeys);\n }\n\n onAgColumnResized(event: ColumnResizedEvent): void {\n if (event.finished && event.source !== 'api') {\n // User manually resized a column - mark as dirty\n this._isGridStateDirty = true;\n this.emitGridStateChanged('columns');\n }\n }\n\n onAgColumnMoved(event: ColumnMovedEvent): void {\n if (event.finished && event.source !== 'api') {\n // User manually moved a column - mark as dirty\n this._isGridStateDirty = true;\n this.emitGridStateChanged('columns');\n }\n }\n\n // ========================================\n // Grid State Management\n // ========================================\n\n private emitGridStateChanged(changeType: 'columns' | 'sort' | 'filter'): void {\n if (!this.gridApi || !this._entityInfo) return;\n\n // Only emit and persist if we're dirty (user made actual changes)\n // This prevents emitting stale state during view transitions\n if (!this._isGridStateDirty) {\n return;\n }\n\n const currentState = this.buildCurrentGridState();\n\n // Emit the event for external consumers\n this.GridStateChanged.emit({\n gridState: currentState,\n changeType\n });\n\n // Schedule auto-persist if enabled, but NOT during view transitions\n // (suppressPersist prevents old view's state from being saved to new view)\n if (this._autoPersistState && !this._suppressPersist && this.canEditCurrentView) {\n if (!this.IsDynamicView && this._viewEntity) {\n // Stored view - persist to UserView.GridState (debounced)\n // Track pending state for flush on destroy\n this._pendingViewStateToPersist = currentState;\n this.statePersistSubject.next(currentState);\n } else if (this.IsDynamicView) {\n // Dynamic view - persist to User Settings as defaults (debounced via same subject)\n // Track pending state for flush on destroy\n this._pendingUserDefaultsToPersist = currentState;\n this.userDefaultsPersistSubject.next(currentState);\n }\n }\n }\n\n /**\n * Persists the grid state to the UserView entity.\n * Only saves if the user has edit permission on the view.\n */\n private async persistGridStateToView(state: ViewGridState): Promise<void> {\n if (!this._viewEntity || this.isSavingState) {\n return;\n }\n\n // Check permission before saving\n if (!this._viewEntity.UserCanEdit) {\n this._pendingViewStateToPersist = null; // Clear pending since we can't save anyway\n return;\n }\n\n try {\n this.isSavingState = true;\n this.pendingStateToSave = state;\n\n // Mutate the existing GridState object and write back via typed setter\n const gridState = this._viewEntity.GridStateObject ?? {};\n gridState.columnSettings = state.columnSettings;\n gridState.sortSettings = state.sortSettings;\n gridState.aggregates = state.aggregates;\n this._viewEntity.GridStateObject = gridState;\n\n // Update SortState separately if changed\n if (state.sortSettings?.length) {\n this._viewEntity.SortStateObject = state.sortSettings.map(s => ({\n field: s.field,\n direction: s.dir\n }));\n }\n\n // Save the view entity\n const success = await this._viewEntity.Save();\n if (!success) {\n console.warn('[entity-data-grid] Failed to save view state:', this._viewEntity.LatestResult?.Message);\n } else {\n // Clear pending state and reset dirty flag after successful save\n this._pendingViewStateToPersist = null;\n this._isGridStateDirty = false;\n }\n } catch (error) {\n console.error('[entity-data-grid] Error persisting grid state:', error);\n } finally {\n this.isSavingState = false;\n this.pendingStateToSave = null;\n }\n }\n\n private buildCurrentGridState(): ViewGridState {\n if (!this.gridApi || !this._entityInfo || !this._entityInfo.Fields) {\n return { columnSettings: [], sortSettings: [] };\n }\n\n const columnState = this.gridApi.getColumnState();\n if (!columnState) {\n return { columnSettings: [], sortSettings: [] };\n }\n\n // Build lookup maps for existing custom properties to preserve them\n // AG Grid's column state doesn't track our custom format/userDisplayName properties,\n // so we need to carry them over from the current gridState\n const existingFormatsByName = new Map<string, ColumnFormat | undefined>();\n const existingUserDisplayNames = new Map<string, string | undefined>();\n if (this._gridState?.columnSettings) {\n for (const col of this._gridState.columnSettings) {\n const keyLower = col.Name.toLowerCase();\n if (col.format) {\n existingFormatsByName.set(keyLower, col.format);\n }\n if (col.userDisplayName) {\n existingUserDisplayNames.set(keyLower, col.userDisplayName);\n }\n }\n }\n\n const columnSettings: ViewGridColumnSetting[] = [];\n // Collect sorted columns with their sortIndex for proper ordering\n const sortedColumns: Array<{ field: string; dir: 'asc' | 'desc'; sortIndex: number }> = [];\n\n for (let i = 0; i < columnState.length; i++) {\n const col = columnState[i];\n if (col.colId === '__rowNumber') continue; // Skip row number column\n\n // Case-insensitive: `colId` originates from a colDef's `field`, which for host-supplied\n // columns is whatever the page wrote. `canonicalizeHostColumns()` normally settles that\n // before we get here, but an exact-case miss silently DROPS the column from the captured\n // state — and that state is what the grid is rebuilt from, so the column would disappear\n // entirely the first time a user resized anything. Too quiet a failure to leave to one guard.\n const field = this._entityInfo.Fields.find(f => f.Name.toLowerCase() === col.colId?.toLowerCase());\n\n if (field) {\n const keyLower = field.Name.toLowerCase();\n const colConfig: ViewGridColumnSetting = {\n ID: field.ID,\n Name: field.Name,\n DisplayName: field.DisplayNameOrName,\n hidden: col.hide ?? false,\n width: col.width ?? undefined,\n orderIndex: i\n };\n\n // Preserve format from existing gridState if present\n const existingFormat = existingFormatsByName.get(keyLower);\n if (existingFormat) {\n colConfig.format = existingFormat;\n }\n\n // Preserve userDisplayName from existing gridState if present\n const existingUserDisplayName = existingUserDisplayNames.get(keyLower);\n if (existingUserDisplayName) {\n colConfig.userDisplayName = existingUserDisplayName;\n }\n\n columnSettings.push(colConfig);\n }\n\n if (col.sort) {\n sortedColumns.push({\n field: col.colId,\n dir: col.sort as 'asc' | 'desc',\n sortIndex: col.sortIndex ?? 0\n });\n }\n }\n\n // Carry forward the settings for columns FIELD SECURITY hid from this user.\n //\n // This state is captured from the rendered AG Grid, and a denied column is not rendered —\n // so without this it would be missing from the captured state, that state is persisted as\n // the user's column PREFERENCE, and the column is gone permanently. It would not come back\n // when the denial was lifted, because by then the saved preference genuinely no longer\n // lists it. A temporary restriction must never be recorded as a durable preference.\n //\n // Ordering is intentionally not recomputed: the retained entries keep their previous\n // orderIndex, so restoring access puts the column back roughly where it was rather than\n // appending it to the end.\n const deniedReadFields = this.deniedReadFieldsFor(this._entityInfo);\n if (deniedReadFields.size > 0) {\n const captured = new Set(columnSettings.map(c => c.Name.toLowerCase()));\n // Prefer the settings the user already had; fall back to the column MODEL, which still\n // lists denied fields, for the case where they are saving grid state for the first time\n // while the restriction is in force and there is no prior entry to preserve.\n const priorByName = new Map<string, ViewGridColumnSetting>();\n for (const prior of this._gridState?.columnSettings ?? []) {\n priorByName.set(prior.Name.trim().toLowerCase(), prior);\n }\n // Position is resolved against the column that preceded it in the PRIOR state, not by its\n // own old orderIndex: the captured entries were renumbered by render position, so the two\n // index spaces no longer line up once a hidden column has been removed from the middle.\n // A fractional index slots the retained column back between its old neighbours; the whole\n // list is renumbered to integers afterwards.\n const capturedIndexByName = new Map(columnSettings.map((c, i) => [c.Name.toLowerCase(), i]));\n const priorOrdered = [...(this._gridState?.columnSettings ?? [])]\n .sort((a, b) => (a.orderIndex ?? 0) - (b.orderIndex ?? 0));\n\n const positionFor = (name: string): number => {\n const priorIndex = priorOrdered.findIndex(c => c.Name.trim().toLowerCase() === name);\n for (let back = priorIndex - 1; back >= 0; back--) {\n const anchor = capturedIndexByName.get(priorOrdered[back].Name.toLowerCase());\n if (anchor !== undefined) {\n return anchor + 0.5;\n }\n }\n return priorIndex >= 0 ? -0.5 : columnSettings.length;\n };\n\n for (const denied of deniedReadFields) {\n if (captured.has(denied)) {\n continue;\n }\n const prior = priorByName.get(denied);\n if (prior) {\n columnSettings.push({ ...prior, orderIndex: positionFor(denied) });\n continue;\n }\n const modelled = this._columns.find(c => c.field.trim().toLowerCase() === denied);\n const field = this._entityInfo.Fields.find(f => f.Name.trim().toLowerCase() === denied);\n if (modelled && field) {\n columnSettings.push({\n ID: field.ID,\n Name: field.Name,\n DisplayName: field.DisplayNameOrName,\n hidden: false,\n orderIndex: columnSettings.length\n });\n }\n }\n columnSettings.sort((a, b) => (a.orderIndex ?? 0) - (b.orderIndex ?? 0));\n columnSettings.forEach((c, i) => { c.orderIndex = i; });\n }\n\n // Sort by sortIndex to maintain correct multi-sort priority order\n sortedColumns.sort((a, b) => a.sortIndex - b.sortIndex);\n const sortSettings: ViewGridSortSetting[] = sortedColumns.map(s => ({\n field: s.field,\n dir: s.dir\n }));\n\n // Include current aggregates config in the state\n return {\n columnSettings,\n sortSettings,\n aggregates: this._aggregatesConfig || this._gridState?.aggregates\n };\n }\n\n private applySortStateToGrid(): void {\n if (!this.gridApi || this.gridApi.isDestroyed() || this._sortState.length === 0) {\n return;\n }\n\n const currentColumnState = this.gridApi.getColumnState();\n if (!currentColumnState) {\n return;\n }\n\n // Suppress sort events while we programmatically apply sort state.\n // AG Grid fires sortChanged ASYNCHRONOUSLY (via setTimeout) after applyColumnState,\n // so we must keep the flag true across the async boundary and clear it with setTimeout(0).\n this.suppressSortEvents = true;\n const columnState = currentColumnState.map(col => {\n const sort = this._sortState.find(s => s.field === col.colId);\n return {\n ...col,\n sort: sort ? sort.direction : null,\n sortIndex: sort ? sort.index : null\n };\n });\n this.gridApi.applyColumnState({ state: columnState });\n // Clear after AG Grid's async event queue drains\n setTimeout(() => { this.suppressSortEvents = false; }, 0);\n }\n\n private updateSelection(): void {\n if (!this.gridApi || this._selectedKeys.length === 0) {\n this.gridApi?.deselectAll();\n return;\n }\n\n for (const key of this._selectedKeys) {\n const node = this.gridApi.getRowNode(key);\n if (node) {\n node.setSelected(true);\n }\n }\n }\n\n private updateRowSelectionState(): void {\n for (const rowData of this._rowDataMap.values()) {\n rowData.selected = this._selectedKeys.includes(rowData.key);\n }\n this.cdr.detectChanges();\n }\n\n // ========================================\n // Selection Public Methods\n // ========================================\n\n SelectRows(keys: string[], additive: boolean = false): void {\n if (!this.gridApi) return;\n\n if (!additive) {\n this.gridApi.deselectAll();\n }\n\n for (const key of keys) {\n const node = this.gridApi.getRowNode(key);\n if (node) {\n node.setSelected(true, !additive);\n }\n }\n }\n\n DeselectRows(keys: string[]): void {\n if (!this.gridApi) return;\n\n for (const key of keys) {\n const node = this.gridApi.getRowNode(key);\n if (node) {\n node.setSelected(false);\n }\n }\n }\n\n SelectAll(): void {\n this.gridApi?.selectAll();\n }\n\n ClearSelection(): void {\n this.gridApi?.deselectAll();\n }\n\n GetSelectedRows(): Record<string, unknown>[] {\n return this._selectedKeys\n .map(key => this._rowDataMap.get(key)?.entity)\n .filter((e): e is Record<string, unknown> => e !== undefined);\n }\n\n IsRowSelected(key: string): boolean {\n return this._selectedKeys.includes(key);\n }\n\n /**\n * Scrolls the grid to make the specified row visible.\n * @param key The primary key of the row to scroll to\n * @param position Where to position the row: 'top', 'middle', or 'bottom'\n */\n EnsureRowVisible(key: string, position: 'top' | 'middle' | 'bottom' = 'middle'): void {\n if (!this.gridApi) return;\n\n const node = this.gridApi.getRowNode(key);\n if (node) {\n this.gridApi.ensureNodeVisible(node, position);\n }\n }\n\n // ========================================\n // Public Methods\n // ========================================\n\n async Refresh(): Promise<void> {\n await this.loadData(false);\n }\n\n Clear(): void {\n this._allData = [];\n this._data = [];\n this._rowDataMap.clear();\n this._selectedKeys = [];\n this.rowData = [];\n this.totalRowCount = 0;\n this.cdr.detectChanges();\n }\n\n GetData(): Record<string, unknown>[] {\n return this._useExternalData ? [...this._data] : [...this._allData];\n }\n\n GetRowByKey(key: string): Record<string, unknown> | undefined {\n return this._rowDataMap.get(key)?.entity;\n }\n\n GetRowByIndex(index: number): Record<string, unknown> | undefined {\n const dataSource = this._useExternalData ? this._data : this._allData;\n return dataSource[index];\n }\n\n GetState(): GridState {\n return {\n columns: this._columnStates.map(c => ({\n field: c.config.field,\n width: c.computedWidth,\n visible: c.visible,\n order: c.order\n })),\n sort: [...this._sortState],\n filters: [...this._filterState],\n selection: [...this._selectedKeys]\n };\n }\n\n SetState(state: GridState): void {\n for (const colState of state.columns) {\n const column = this._columnStates.find(c => c.config.field === colState.field);\n if (column) {\n column.computedWidth = colState.width;\n column.visible = colState.visible;\n column.order = colState.order;\n }\n }\n\n this._sortState = [...state.sort];\n for (const sort of this._sortState) {\n const column = this._columnStates.find(c => c.config.field === sort.field);\n if (column) {\n column.sortDirection = sort.direction;\n column.sortIndex = sort.index;\n }\n }\n\n this._filterState = [...state.filters];\n this._selectedKeys = [...state.selection];\n this.updateRowSelectionState();\n\n this.buildAgColumnDefs();\n this.cdr.detectChanges();\n }\n\n ResetState(): void {\n this.initializeColumnStates();\n this._sortState = [];\n this._filterState = [];\n this.ClearSelection();\n this.buildAgColumnDefs();\n this.cdr.detectChanges();\n }\n\n // ========================================\n // State Persistence\n // ========================================\n\n private scheduleStateSave(): void {\n if (!this._stateKey) return;\n this.statesSaveSubject.next();\n }\n\n private async loadPersistedState(): Promise<void> {\n // TODO: Load state from User Settings entity\n }\n\n // ========================================\n // Toolbar Click Handlers\n // ========================================\n\n onAddClick(): void {\n // Emit legacy events for backward compatibility\n this.AddRequested.emit();\n this.NewButtonClick.emit();\n\n // Emit navigation events based on CreateRecordMode\n if (this._entityInfo) {\n if (this._createRecordMode === 'Dialog') {\n this.NewRecordDialogRequested.emit({\n entityInfo: this._entityInfo,\n defaultValues: this._newRecordValues\n });\n } else {\n this.NewRecordTabRequested.emit({\n entityInfo: this._entityInfo,\n defaultValues: this._newRecordValues\n });\n }\n }\n }\n\n onDeleteClick(): void {\n const selectedRows = this.GetSelectedRows();\n if (selectedRows.length > 0) {\n this.DeleteRequested.emit(selectedRows);\n this.DeleteButtonClick.emit(selectedRows);\n }\n }\n\n onExportClick(): void {\n this.ExportRequested.emit();\n this.ExportButtonClick.emit();\n // Show the export dialog\n void this.showExportDialogForCurrentData();\n }\n\n /**\n * Shows the export dialog for the full result set (falling back to the loaded page when no\n * ExportDataProvider is supplied).\n */\n private async showExportDialogForCurrentData(): Promise<void> {\n this.IsPreparingExport = true;\n this.cdr.detectChanges();\n let data: ExportData;\n try {\n data = await this.resolveExportData();\n } finally {\n this.IsPreparingExport = false;\n }\n const columns = this.getExportColumns();\n const fileName = this.getDefaultExportFileName();\n\n this.exportDialogConfig = {\n data,\n columns,\n defaultFileName: fileName,\n availableFormats: ['excel', 'csv', 'json'],\n defaultFormat: 'excel',\n showSamplingOptions: true,\n defaultSamplingMode: 'all',\n dialogTitle: `Export ${this._entityInfo?.Name || 'Data'}`\n };\n this.showExportDialog = true;\n this.cdr.detectChanges();\n }\n\n /**\n * Handle export dialog close\n */\n onExportDialogClosed(result: ExportDialogResult): void {\n this.showExportDialog = false;\n this.exportDialogConfig = null;\n this.cdr.detectChanges();\n }\n\n /**\n * Export grid data directly without showing dialog.\n * Use this for programmatic export with specific options.\n * @param options Export options (format, sampling, etc.)\n * @param download If true, automatically downloads the file. Default true.\n * @returns Export result with data buffer and metadata\n */\n async Export(options?: Partial<ExportOptions>, download: boolean = true): Promise<ExportResult> {\n const data = await this.resolveExportData();\n const columns = this.getExportColumns();\n const fileName = options?.fileName || this.getDefaultExportFileName();\n\n const exportOptions: Partial<ExportOptions> = {\n format: 'excel',\n fileName,\n columns,\n includeHeaders: true,\n ...options\n };\n\n const result = await this.exportService.export(data, exportOptions);\n\n if (result.success && download) {\n this.exportService.downloadResult(result);\n }\n\n return result;\n }\n\n /**\n * Export to Excel format directly (convenience method)\n * @param download If true, automatically downloads the file. Default true.\n */\n async ExportToExcel(download: boolean = true): Promise<ExportResult> {\n return this.Export({ format: 'excel' }, download);\n }\n\n /**\n * Export to CSV format directly (convenience method)\n * @param download If true, automatically downloads the file. Default true.\n */\n async ExportToCSV(download: boolean = true): Promise<ExportResult> {\n return this.Export({ format: 'csv' }, download);\n }\n\n /**\n * Export to JSON format directly (convenience method)\n * @param download If true, automatically downloads the file. Default true.\n */\n async ExportToJSON(download: boolean = true): Promise<ExportResult> {\n return this.Export({ format: 'json' }, download);\n }\n\n /**\n * Resolves the rows to export. An explicit row selection always wins — export exactly the rows the\n * user picked (matches the Query viewer's behavior). With NO selection, the FULL result set is\n * fetched via the host's ExportDataProvider so export isn't silently capped at the current page\n * (bug C1). So: \"export these\" = select rows first; \"export everything\" = export with nothing\n * selected. If no provider is supplied or the fetch yields nothing, falls back to the loaded page.\n */\n private async resolveExportData(): Promise<ExportData> {\n const selected = this.GetSelectedRows();\n if (selected.length > 0) {\n return selected.map(row => row as Record<string, unknown>);\n }\n if (this.ExportDataProvider) {\n try {\n const allRows = await this.ExportDataProvider();\n if (allRows && allRows.length > 0) {\n return allRows.map(row => row as Record<string, unknown>);\n }\n } catch {\n // Fall through to the loaded page on any fetch failure.\n }\n }\n // rowData is already plain Record<string, unknown>[] objects - return directly\n return this.rowData.map(row => row as Record<string, unknown>);\n }\n\n /**\n * Get column definitions for export based on current grid columns\n */\n private getExportColumns(): ExportColumn[] {\n if (!this._entityInfo) {\n // Fallback: use AG Grid column definitions\n return this.agColumnDefs\n .filter(col => col.field && !col.hide)\n .map(col => ({\n name: col.field as string,\n displayName: (col.headerName || col.field) as string\n }));\n }\n\n // Use entity field info for better column metadata\n return this._columns\n .filter(col => col.visible !== false)\n .map(col => {\n // Case-insensitive, matching how col defs and auto-width resolve a host's field name.\n // An exact-case match here silently cost the export column its data type.\n const field = this._entityInfo?.Fields.find(f => f.Name.toLowerCase() === col.field.toLowerCase());\n return {\n // The entity's spelling, because `name` is the KEY the export engine reads each row by\n // (`row[col.name]`) and rows are keyed from entity metadata. The host's spelling here\n // exported a correctly-headed column of blank cells.\n name: field?.Name ?? col.field,\n displayName: col.title || field?.DisplayName || col.field,\n dataType: this.mapFieldTypeToExportType(field?.Type),\n width: typeof col.width === 'number' ? col.width : undefined\n };\n });\n }\n\n /**\n * Map MemberJunction field types to export column types\n */\n private mapFieldTypeToExportType(fieldType?: string): ExportColumn['dataType'] {\n if (!fieldType) return 'string';\n\n const type = fieldType.toLowerCase();\n if (type.includes('int') || type.includes('decimal') || type.includes('float') || type.includes('numeric')) {\n return 'number';\n }\n if (type.includes('date') || type.includes('time')) {\n return 'date';\n }\n if (type.includes('bit') || type.includes('bool')) {\n return 'boolean';\n }\n if (type.includes('money') || type.includes('currency')) {\n return 'currency';\n }\n return 'string';\n }\n\n /**\n * Generate default file name for export\n */\n private getDefaultExportFileName(): string {\n const entityName = this._entityInfo?.Name || 'export';\n const timestamp = new Date().toISOString().slice(0, 10);\n return `${entityName}_${timestamp}`;\n }\n\n onRefreshClick(): void {\n this.RefreshButtonClick.emit();\n this.Refresh();\n }\n\n onCompareClick(): void {\n const selectedRows = this.GetSelectedRows();\n if (selectedRows.length >= 2) {\n // Emit legacy event for backward compatibility\n this.CompareButtonClick.emit(selectedRows);\n\n // Emit new structured event for Explorer dialogs\n if (this._entityInfo) {\n this.CompareRecordsRequested.emit({\n entityInfo: this._entityInfo,\n records: selectedRows\n });\n }\n }\n }\n\n onMergeClick(): void {\n const selectedRows = this.GetSelectedRows();\n if (selectedRows.length >= 2) {\n // Emit legacy event for backward compatibility\n this.MergeButtonClick.emit(selectedRows);\n\n // Emit new structured event for Explorer dialogs\n if (this._entityInfo) {\n this.MergeRecordsRequested.emit({\n entityInfo: this._entityInfo,\n records: selectedRows\n });\n }\n }\n }\n\n async onAddToListClick(): Promise<void> {\n let rows = this.GetSelectedRows();\n\n // No explicit selection → add EVERY matching record, not just the loaded page. Without this,\n // building a list from a sizeable view meant selecting-all page by page (bug E3). We fetch the\n // full result set via the host-supplied provider; the downstream list dialog still requires the\n // user to pick a target list and confirm, so nothing is committed implicitly.\n if (rows.length === 0 && this.ExportDataProvider) {\n this.IsPreparingAddToList = true;\n this.cdr.detectChanges();\n try {\n rows = await this.ExportDataProvider();\n } catch {\n rows = [];\n } finally {\n this.IsPreparingAddToList = false;\n this.cdr.detectChanges();\n }\n }\n\n if (rows.length > 0) {\n // Emit legacy event for backward compatibility\n this.AddToListButtonClick.emit(rows);\n\n // Emit new structured event with record IDs for list management\n if (this._entityInfo) {\n const recordIds = rows.map(r => {\n return buildPkString(r, this._entityInfo!);\n });\n this.AddToListRequested.emit({\n entityInfo: this._entityInfo,\n records: rows,\n recordIds\n });\n }\n }\n }\n\n onDuplicateSearchClick(): void {\n const selectedRows = this.GetSelectedRows();\n if (selectedRows.length >= 2) {\n // Emit legacy event for backward compatibility\n this.DuplicateSearchButtonClick.emit(selectedRows);\n\n // Emit new structured event for Explorer dialogs\n if (this._entityInfo) {\n this.DuplicateSearchRequested.emit({\n entityInfo: this._entityInfo,\n records: selectedRows\n });\n }\n }\n }\n\n onCommunicationClick(): void {\n const selectedRows = this.GetSelectedRows();\n if (selectedRows.length > 0) {\n // Emit legacy event for backward compatibility\n this.CommunicationButtonClick.emit(selectedRows);\n\n // Emit new structured event for Explorer dialogs\n if (this._entityInfo) {\n this.CommunicationRequested.emit({\n entityInfo: this._entityInfo,\n records: selectedRows,\n viewParams: this._params\n });\n }\n }\n }\n\n /**\n * \"Manage Columns\" / column-chooser toolbar affordance. The grid is generic and doesn't own a\n * column-management UI, so it raises {@link ManageColumnsRequested} for its host to handle —\n * in the entity-viewer/workspace this opens the view's config panel (Columns tab), the canonical\n * column editor backed by `UserView.GridState`. Hosts that embed the grid standalone can handle\n * this to surface their own column UI.\n */\n onColumnChooserClick(): void {\n this.ManageColumnsRequested.emit();\n }\n\n /**\n * The runtime-UX driver currently mounted over the grid (e.g. the Record Process bulk-update runner),\n * or null when none. Set when an action whose invocation names a `RuntimeUXDriverClass` is clicked.\n */\n public ActiveRuntimeDriver: { DriverClass: string; Context: EntityActionUXContext } | null = null;\n\n /**\n * Handles entity action click from the overflow menu. When the action names a runtime-UX driver, the\n * grid mounts that interactive driver in-place (no parent wiring required); otherwise it emits\n * `EntityActionRequested` for the host to invoke the action the classic way.\n */\n onEntityActionClick(action: EntityActionConfig): void {\n if (!this._entityInfo) return;\n\n if (action.runtimeUXDriverClass) {\n this.mountRuntimeDriver(action);\n return;\n }\n\n this.EntityActionRequested.emit({\n entityInfo: this._entityInfo,\n action,\n selectedRecords: this.GetSelectedRows()\n });\n }\n\n /** Builds the driver context from the current entity + selection and mounts the named driver. */\n private mountRuntimeDriver(action: EntityActionConfig): void {\n const entity = this._entityInfo!;\n // The grid's entity is arbitrary (any key column name, possibly composite), so each selected row's\n // identity is its full primary key in the compact record-id form the record-process engine reads\n // back with CompositeKey.FromURLSegment — a bare value for single-column keys, `F1|v1||F2|v2` otherwise.\n const selectedRecordIDs = this.GetSelectedRows()\n .map(r => CompositeKey.FromEntityRecord(entity, r).ToCompactURLSegment())\n .filter(id => id.length > 0);\n this.ActiveRuntimeDriver = {\n DriverClass: action.runtimeUXDriverClass!,\n Context: {\n EntityInfo: entity,\n ScopeKind: 'records',\n SelectedRecordIDs: selectedRecordIDs,\n Config: action.metadata ?? {},\n Provider: this.ProviderToUse,\n ContextUser: this.ProviderToUse?.CurrentUser,\n ActionLabel: action.name\n }\n };\n }\n\n /** The mounted driver finished — refresh the grid when it changed data, then unmount. */\n async OnRuntimeDriverCompleted(result: EntityActionUXResult): Promise<void> {\n this.ActiveRuntimeDriver = null;\n if (result?.RefreshData) {\n await this.Refresh();\n }\n }\n\n /** The user dismissed the mounted driver without applying — just unmount. */\n OnRuntimeDriverCancelled(): void {\n this.ActiveRuntimeDriver = null;\n }\n\n /**\n * Checks if an entity action is currently enabled based on selection requirements\n */\n isEntityActionEnabled(action: EntityActionConfig): boolean {\n if (!action.requiresSelection) return true;\n\n const selectedCount = this._selectedKeys.length;\n if (selectedCount === 0) return false;\n\n if (action.minSelectedRecords && selectedCount < action.minSelectedRecords) return false;\n if (action.maxSelectedRecords && selectedCount > action.maxSelectedRecords) return false;\n\n return true;\n }\n\n // ========================================\n // Overflow Menu Methods\n // ========================================\n\n toggleOverflowMenu(): void {\n this.showOverflowMenu = !this.showOverflowMenu;\n this.cdr.detectChanges();\n\n // Add click outside listener when menu is open\n if (this.showOverflowMenu) {\n setTimeout(() => {\n document.addEventListener('click', this.handleOutsideClick);\n }, 0);\n } else {\n document.removeEventListener('click', this.handleOutsideClick);\n }\n }\n\n closeOverflowMenu(): void {\n this.showOverflowMenu = false;\n document.removeEventListener('click', this.handleOutsideClick);\n this.cdr.detectChanges();\n }\n\n private handleOutsideClick = (): void => {\n this.closeOverflowMenu();\n };\n\n // Overflow menu visibility helpers\n get hasOverflowMenuItems(): boolean {\n return this.showExportInOverflow ||\n this.showColumnChooserInOverflow ||\n (this._showEntityActionButtons && this._entityActions.length > 0) ||\n this.hasSelectionDependentOverflowActions;\n }\n\n get showExportInOverflow(): boolean {\n // Export is in overflow when it's not shown as a primary button\n return !this.ShowExportButton && !!this.ToolbarConfig.showExport;\n }\n\n get showColumnChooserInOverflow(): boolean {\n return this.AllowColumnToggle && !this.ToolbarConfig.showColumnChooser;\n }\n\n get hasSelectionDependentOverflowActions(): boolean {\n return this.showCommunicationInOverflow;\n }\n\n get showCommunicationInOverflow(): boolean {\n // Communication is in overflow when it's not shown as a primary button\n return !this.ShowCommunicationButton && this.HasSelection;\n }\n\n // ========================================\n // Toolbar Button State Helpers\n // ========================================\n\n get HasSelection(): boolean {\n return this._selectedKeys.length > 0;\n }\n\n get HasMultipleSelection(): boolean {\n return this._selectedKeys.length >= 2;\n }\n\n // ========================================\n // CSS Helpers\n // ========================================\n\n get gridContainerClasses(): string[] {\n const classes = ['mj-grid-container'];\n classes.push(`grid-lines-${this._gridLines}`);\n if (this._striped) classes.push('grid-striped');\n\n // Add visual config classes\n const vc = this.effectiveVisualConfig;\n classes.push(`header-style-${vc.headerStyle}`);\n if (vc.headerShadow) classes.push('header-shadow');\n if (vc.alternateRows) classes.push(`alternate-rows-${vc.alternateRowContrast}`);\n if (vc.hoverTransitions) classes.push('hover-transitions');\n classes.push(`cell-padding-${vc.cellPadding}`);\n if (vc.checkboxStyle !== 'default') classes.push(`checkbox-style-${vc.checkboxStyle}`);\n\n return classes;\n }\n\n /**\n * Apply visual configuration by setting CSS custom properties\n */\n private applyVisualConfig(): void {\n const vc = this.effectiveVisualConfig;\n const el = this.elementRef.nativeElement;\n\n // Set CSS custom properties for dynamic values\n if (vc.headerBackground) {\n el.style.setProperty('--grid-header-bg', vc.headerBackground);\n }\n if (vc.headerTextColor) {\n el.style.setProperty('--grid-header-text', vc.headerTextColor);\n }\n if (vc.selectionIndicatorColor) {\n el.style.setProperty('--grid-selection-indicator-color', vc.selectionIndicatorColor);\n }\n if (vc.selectionIndicatorWidth) {\n el.style.setProperty('--grid-selection-indicator-width', `${vc.selectionIndicatorWidth}px`);\n }\n if (vc.selectionBackground) {\n el.style.setProperty('--grid-row-selected-bg', vc.selectionBackground);\n }\n if (vc.checkboxColor) {\n el.style.setProperty('--grid-checkbox-color', vc.checkboxColor);\n }\n if (vc.borderRadius !== undefined) {\n el.style.setProperty('--grid-border-radius', `${vc.borderRadius}px`);\n }\n if (vc.accentColor) {\n el.style.setProperty('--grid-accent-color', vc.accentColor);\n el.style.setProperty('--grid-sort-indicator-color', vc.accentColor);\n }\n if (vc.hoverTransitionDuration) {\n el.style.setProperty('--grid-hover-transition', `${vc.hoverTransitionDuration}ms`);\n }\n\n // Rebuild column defs if formatting options changed\n if (this._entityInfo) {\n this.buildAgColumnDefs();\n }\n }\n\n get gridHeightStyle(): string {\n if (typeof this._height === 'number') {\n return `${this._height}px`;\n }\n return this._height === 'auto' ? '100%' : 'fit-content';\n }\n\n // ========================================\n // Toolbar Button Helpers\n // ========================================\n\n isButtonVisible(button: GridToolbarButton): boolean {\n if (button.visible === undefined) return true;\n if (typeof button.visible === 'boolean') return button.visible;\n if (typeof button.visible === 'function') return button.visible();\n return true;\n }\n\n isButtonDisabled(button: GridToolbarButton): boolean {\n if (button.disabled === undefined) return false;\n if (typeof button.disabled === 'boolean') return button.disabled;\n if (typeof button.disabled === 'function') return button.disabled();\n return false;\n }\n\n onToolbarButtonClick(button: GridToolbarButton): void {\n if (button.onClick) {\n button.onClick();\n }\n }\n\n // ========================================\n // Public Getters\n // ========================================\n\n get VisibleRows(): GridRowData[] {\n return Array.from(this._rowDataMap.values());\n }\n\n get VisibleColumnStates(): ColumnRuntimeState[] {\n return this._columnStates\n .filter(c => c.visible)\n .sort((a, b) => a.order - b.order);\n }\n}\n\n","<!-- Grid Container -->\n<div\n #gridContainer\n [class]=\"gridContainerClasses.join(' ')\"\n [style.height]=\"gridHeightStyle\">\n\n <!-- Toolbar -->\n @if (ShowToolbar) {\n <div class=\"mj-grid-toolbar\">\n <div class=\"toolbar-left\">\n <!-- Search -->\n @if (ShowSearch) {\n <div class=\"toolbar-search\">\n <i class=\"fa-solid fa-search search-icon\"></i>\n <input\n type=\"text\"\n class=\"search-input\"\n [placeholder]=\"ToolbarConfig.searchPlaceholder || 'Search...'\"\n [value]=\"FilterText\"\n (input)=\"FilterText = $any($event.target).value\" />\n @if (FilterText) {\n <button\n class=\"search-clear\"\n (click)=\"FilterText = ''\"\n aria-label=\"Clear search\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n }\n </div>\n }\n <!-- Custom Left Buttons -->\n @for (button of ToolbarConfig.customButtons; track button) {\n @if (button.position !== 'right' && isButtonVisible(button)) {\n <button\n class=\"toolbar-button\"\n [class]=\"button.cssClass\"\n [disabled]=\"isButtonDisabled(button)\"\n [title]=\"button.tooltip || ''\"\n (click)=\"onToolbarButtonClick(button)\">\n @if (button.icon) {\n <i [class]=\"button.icon\"></i>\n }\n @if (button.text) {\n <span>{{ button.text }}</span>\n }\n </button>\n }\n }\n </div>\n <div class=\"toolbar-center\">\n <!-- Row Count -->\n @if (ToolbarConfig.showRowCount !== false) {\n <span class=\"row-count\">\n {{ totalRowCount }} {{ totalRowCount === 1 ? 'row' : 'rows' }}\n </span>\n }\n <!-- Selection Count -->\n @if (ToolbarConfig.showSelectionCount && SelectedKeys.length > 0) {\n <span class=\"selection-count\">\n ({{ SelectedKeys.length }} selected)\n </span>\n }\n </div>\n <div class=\"toolbar-right\">\n <!-- Recycle Bin chip — auto-hides when no deleted records, no tracking,\n or user lacks Delete permission. -->\n @if (ShowRecycleBin) {\n <mj-recycle-bin-chip [EntityName]=\"entityInfoName\"></mj-recycle-bin-chip>\n }\n <!-- New/Add Button (predefined) -->\n @if (ShowNewButton) {\n <button\n class=\"toolbar-button\"\n title=\"Create new record\"\n (click)=\"onAddClick()\">\n <i class=\"fa-solid fa-plus\"></i>\n <span class=\"button-text\">New</span>\n </button>\n }\n <!-- Refresh Button (predefined) -->\n @if (ShowRefreshButton) {\n <button\n class=\"toolbar-button\"\n title=\"Refresh data\"\n [disabled]=\"loading\"\n (click)=\"onRefreshClick()\">\n <i class=\"fa-solid fa-arrows-rotate\" [class.fa-spin]=\"loading\"></i>\n <span class=\"button-text\">Refresh</span>\n </button>\n }\n <!-- Export Button (predefined) -->\n @if (ShowExportButton) {\n <button\n class=\"toolbar-button\"\n title=\"Export\"\n [disabled]=\"IsPreparingExport\"\n (click)=\"onExportClick()\">\n <i class=\"fa-solid\" [class.fa-file-excel]=\"!IsPreparingExport\" [class.fa-spinner]=\"IsPreparingExport\" [class.fa-spin]=\"IsPreparingExport\"></i>\n <span class=\"button-text\">Export</span>\n </button>\n }\n <!-- Delete Button (predefined) -->\n @if (ShowDeleteButton && HasSelection) {\n <button\n class=\"toolbar-button toolbar-button-danger\"\n title=\"Delete selected records\"\n (click)=\"onDeleteClick()\">\n <i class=\"fa-solid fa-trash\"></i>\n <span class=\"button-text\">Delete</span>\n </button>\n }\n <!-- Compare Button (predefined) -->\n @if (ShowCompareButton) {\n <button\n class=\"toolbar-button\"\n title=\"Compare selected records\"\n [disabled]=\"!HasMultipleSelection\"\n (click)=\"onCompareClick()\">\n <i class=\"fa-solid fa-code-compare\"></i>\n <span class=\"button-text\">Compare</span>\n </button>\n }\n <!-- Merge Button (predefined) -->\n @if (ShowMergeButton) {\n <button\n class=\"toolbar-button\"\n title=\"Merge selected records\"\n [disabled]=\"!HasMultipleSelection\"\n (click)=\"onMergeClick()\">\n <i class=\"fa-solid fa-code-merge\"></i>\n <span class=\"button-text\">Merge</span>\n </button>\n }\n <!-- Add to List Button (predefined) -->\n @if (ShowAddToListButton) {\n <button\n class=\"toolbar-button\"\n [title]=\"HasSelection ? 'Add selected records to a list' : 'Add all matching records to a list'\"\n [disabled]=\"(!HasSelection && !ExportDataProvider) || IsPreparingAddToList\"\n (click)=\"onAddToListClick()\">\n <i class=\"fa-solid\" [class.fa-list-check]=\"!IsPreparingAddToList\" [class.fa-spinner]=\"IsPreparingAddToList\" [class.fa-spin]=\"IsPreparingAddToList\"></i>\n <span class=\"button-text\">Add to List</span>\n </button>\n }\n <!-- Search for Duplicates Button (predefined) -->\n @if (ShowDuplicateSearchButton) {\n <button\n class=\"toolbar-button\"\n title=\"Search for duplicate records\"\n [disabled]=\"!HasMultipleSelection\"\n (click)=\"onDuplicateSearchClick()\">\n <i class=\"fa-solid fa-magnifying-glass-plus\"></i>\n <span class=\"button-text\">Find Duplicates</span>\n </button>\n }\n <!-- Communication Button (predefined) -->\n @if (ShowCommunicationButton) {\n <button\n class=\"toolbar-button\"\n title=\"Send message to selected records\"\n [disabled]=\"!HasSelection\"\n (click)=\"onCommunicationClick()\">\n <i class=\"fa-solid fa-envelope\"></i>\n <span class=\"button-text\">Send Message</span>\n </button>\n }\n <!-- Legacy ToolbarConfig buttons -->\n <!-- Add Button (legacy) -->\n @if (ToolbarConfig.showAdd && AllowAdd && !ShowNewButton) {\n <button\n class=\"toolbar-button\"\n title=\"Add New\"\n (click)=\"onAddClick()\">\n <i class=\"fa-solid fa-plus\"></i>\n </button>\n }\n <!-- Refresh Button (legacy) -->\n @if (ToolbarConfig.showRefresh !== false && !ShowRefreshButton) {\n <button\n class=\"toolbar-button\"\n title=\"Refresh\"\n [disabled]=\"loading\"\n (click)=\"onRefreshClick()\">\n <i class=\"fa-solid fa-refresh\" [class.fa-spin]=\"loading\"></i>\n </button>\n }\n <!-- Delete Button (legacy) -->\n @if (ToolbarConfig.showDelete && AllowDelete && HasSelection && !ShowDeleteButton) {\n <button\n class=\"toolbar-button toolbar-button-danger\"\n title=\"Delete Selected\"\n (click)=\"onDeleteClick()\">\n <i class=\"fa-solid fa-trash\"></i>\n </button>\n }\n <!-- Export Button (legacy) -->\n @if (ToolbarConfig.showExport && !ShowExportButton) {\n <button\n class=\"toolbar-button\"\n title=\"Export\"\n (click)=\"onExportClick()\">\n <i class=\"fa-solid fa-download\"></i>\n </button>\n }\n <!-- Column Chooser Button -->\n @if (ToolbarConfig.showColumnChooser && AllowColumnToggle) {\n <button\n class=\"toolbar-button\"\n title=\"Column Chooser\"\n (click)=\"onColumnChooserClick()\">\n <i class=\"fa-solid fa-columns\"></i>\n </button>\n }\n <!-- Custom Right Buttons -->\n @for (button of ToolbarConfig.customButtons; track button) {\n @if (button.position === 'right' && isButtonVisible(button)) {\n <button\n class=\"toolbar-button\"\n [class]=\"button.cssClass\"\n [disabled]=\"isButtonDisabled(button)\"\n [title]=\"button.tooltip || ''\"\n (click)=\"onToolbarButtonClick(button)\">\n @if (button.icon) {\n <i [class]=\"button.icon\"></i>\n }\n @if (button.text) {\n <span>{{ button.text }}</span>\n }\n </button>\n }\n }\n <!-- Overflow Menu -->\n @if (hasOverflowMenuItems) {\n <div class=\"toolbar-overflow\" (click)=\"$event.stopPropagation()\">\n <button\n class=\"toolbar-button overflow-trigger\"\n title=\"More actions\"\n (click)=\"toggleOverflowMenu()\">\n <i class=\"fa-solid fa-ellipsis-vertical\"></i>\n </button>\n @if (showOverflowMenu) {\n <div class=\"overflow-menu\" [@fadeIn]>\n <!-- Export (if in overflow) -->\n @if (showExportInOverflow) {\n <button class=\"overflow-item\" (click)=\"onExportClick(); closeOverflowMenu()\">\n <i class=\"fa-solid fa-file-excel\"></i>\n <span>Export</span>\n </button>\n }\n <!-- Entity Actions -->\n @if (ShowEntityActionButtons && EntityActions.length > 0) {\n <div class=\"overflow-divider\"></div>\n <div class=\"overflow-section-label\">Actions</div>\n @for (action of EntityActions; track action) {\n <button\n class=\"overflow-item\"\n [disabled]=\"!isEntityActionEnabled(action)\"\n (click)=\"onEntityActionClick(action); closeOverflowMenu()\">\n <i [class]=\"action.icon || 'fa-solid fa-bolt'\"></i>\n <span>{{ action.name }}</span>\n </button>\n }\n }\n <!-- Column Chooser (if in overflow) -->\n @if (showColumnChooserInOverflow) {\n <div class=\"overflow-divider\"></div>\n }\n @if (showColumnChooserInOverflow) {\n <button class=\"overflow-item\" (click)=\"onColumnChooserClick(); closeOverflowMenu()\">\n <i class=\"fa-solid fa-columns\"></i>\n <span>Manage Columns</span>\n </button>\n }\n <!-- Selection-dependent actions in overflow -->\n @if (HasSelection && hasSelectionDependentOverflowActions) {\n <div class=\"overflow-divider\"></div>\n @if (showCommunicationInOverflow) {\n <button class=\"overflow-item\" (click)=\"onCommunicationClick(); closeOverflowMenu()\">\n <i class=\"fa-solid fa-envelope\"></i>\n <span>Send Message</span>\n </button>\n }\n }\n </div>\n }\n </div>\n }\n </div>\n </div>\n }\n\n <!-- Aggregate Cards (displayed as summary cards above the grid) -->\n @if (ShowAggregatePanel) {\n <div class=\"mj-aggregate-cards\">\n @for (agg of CardAggregates; track agg) {\n <div class=\"aggregate-card\">\n @if (agg.icon) {\n <div class=\"aggregate-card-icon\">\n <i [class]=\"agg.icon\"></i>\n </div>\n }\n <div class=\"aggregate-card-content\">\n <span class=\"aggregate-card-label\">{{ agg.label }}</span>\n <span class=\"aggregate-card-value\">{{ getAggregateValue(agg) }}</span>\n </div>\n </div>\n }\n @if (AggregatesLoading) {\n <div class=\"aggregate-card-loading\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n </div>\n }\n </div>\n }\n\n <!-- Grid Content -->\n <div class=\"mj-grid-content\">\n <!-- Loading Overlay -->\n @if (loading && rowData.length === 0) {\n <div class=\"mj-grid-loading-overlay\">\n <mj-loading text=\"Loading...\"></mj-loading>\n </div>\n }\n\n <!-- Error State -->\n @if (errorMessage && !loading) {\n <mj-empty-state\n class=\"mj-grid-state-fill\"\n [Size]=\"EmptyStateSize\"\n Variant=\"error\"\n Icon=\"fa-solid fa-triangle-exclamation\"\n Title=\"Couldn't load this data\"\n [Message]=\"FriendlyErrorMessage\"\n ActionText=\"Retry\"\n ActionIcon=\"fa-solid fa-arrows-rotate\"\n (Action)=\"Refresh()\" />\n }\n\n <!-- Empty State -->\n @if (!loading && !errorMessage && rowData.length === 0) {\n <mj-empty-state\n class=\"mj-grid-state-fill\"\n [Size]=\"EmptyStateSize\"\n Icon=\"fa-solid fa-inbox\"\n Title=\"No data to display\" />\n }\n\n <!-- AG Grid (Client-side mode) -->\n @if (!errorMessage && PaginationMode === 'client' && (rowData.length > 0 || loading)) {\n <ag-grid-angular\n class=\"mj-ag-grid ag-theme-alpine\"\n [theme]=\"agGridTheme\"\n [columnDefs]=\"agColumnDefs\"\n [rowData]=\"rowData\"\n [defaultColDef]=\"defaultColDef\"\n [rowSelection]=\"agRowSelection\"\n [getRowId]=\"getRowId\"\n [suppressCellFocus]=\"true\"\n [rowHeight]=\"RowHeight\"\n [headerHeight]=\"ShowHeader ? undefined : 0\"\n (gridReady)=\"onGridReady($event)\"\n (cellClicked)=\"onAgCellClicked($event)\"\n (rowClicked)=\"onAgRowClicked($event)\"\n (rowDoubleClicked)=\"onAgRowDoubleClicked($event)\"\n (sortChanged)=\"onAgSortChanged($event)\"\n (selectionChanged)=\"onAgSelectionChanged($event)\"\n (columnResized)=\"onAgColumnResized($event)\"\n (columnMoved)=\"onAgColumnMoved($event)\">\n </ag-grid-angular>\n }\n\n <!-- AG Grid (Infinite Scroll mode) -->\n @if (!errorMessage && PaginationMode === 'infinite') {\n <ag-grid-angular\n class=\"mj-ag-grid ag-theme-alpine\"\n [theme]=\"agGridTheme\"\n [columnDefs]=\"agColumnDefs\"\n [defaultColDef]=\"defaultColDef\"\n [rowSelection]=\"agRowSelection\"\n [getRowId]=\"getRowId\"\n [suppressCellFocus]=\"true\"\n [rowHeight]=\"RowHeight\"\n [headerHeight]=\"ShowHeader ? undefined : 0\"\n [rowModelType]=\"'infinite'\"\n [cacheBlockSize]=\"CacheBlockSize\"\n [maxBlocksInCache]=\"MaxBlocksInCache\"\n [infiniteInitialRowCount]=\"1\"\n [cacheOverflowSize]=\"2\"\n (gridReady)=\"onGridReady($event)\"\n (cellClicked)=\"onAgCellClicked($event)\"\n (rowClicked)=\"onAgRowClicked($event)\"\n (rowDoubleClicked)=\"onAgRowDoubleClicked($event)\"\n (sortChanged)=\"onAgSortChanged($event)\"\n (selectionChanged)=\"onAgSelectionChanged($event)\"\n (columnResized)=\"onAgColumnResized($event)\"\n (columnMoved)=\"onAgColumnMoved($event)\">\n </ag-grid-angular>\n }\n\n </div>\n\n <!-- Pagination (opt-in via ShowPager input) -->\n @if (ShowPager) {\n <mj-pagination\n [TotalRowCount]=\"totalRowCount\"\n [PageNumber]=\"PagerPageNumber\"\n [PageSize]=\"PageSize\"\n [IsLoading]=\"loading\"\n (PageChange)=\"PageChange.emit($event)\">\n </mj-pagination>\n }\n\n <!-- Aggregate Summary Row (outside mj-grid-content so it's always visible) -->\n @if (ShowAggregateSummary) {\n <div class=\"mj-aggregate-summary\">\n <div class=\"aggregate-summary-content\">\n @for (agg of ColumnAggregates; track agg) {\n <div class=\"aggregate-summary-item\">\n @if (agg.icon) {\n <i [class]=\"agg.icon\"></i>\n }\n <span class=\"agg-summary-label\">{{ agg.label }}:</span>\n <span class=\"agg-summary-value\">{{ getAggregateValue(agg) }}</span>\n </div>\n }\n </div>\n @if (AggregatesLoading) {\n <div class=\"aggregate-loading\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n </div>\n }\n </div>\n }\n</div>\n\n<!-- Export Dialog -->\n<mj-export-dialog\n [visible]=\"showExportDialog\"\n [config]=\"exportDialogConfig\"\n (closed)=\"onExportDialogClosed($event)\">\n</mj-export-dialog>\n\n<!-- Runtime-UX driver for an entity action that names a RuntimeUXDriverClass (e.g. the Record Process\n bulk-update runner). Mounted in-place over the grid — no parent wiring required. -->\n@if (ActiveRuntimeDriver) {\n <mj-entity-action-ux-host\n [DriverClass]=\"ActiveRuntimeDriver.DriverClass\"\n [Context]=\"ActiveRuntimeDriver.Context\"\n (Completed)=\"OnRuntimeDriverCompleted($event)\"\n (Cancelled)=\"OnRuntimeDriverCancelled()\">\n </mj-entity-action-ux-host>\n}\n"]}
|
|
1
|
+
{"version":3,"file":"entity-data-grid.component.js","sourceRoot":"","sources":["../../../src/lib/entity-data-grid/entity-data-grid.component.ts","../../../src/lib/entity-data-grid/entity-data-grid.component.html"],"names":[],"mappings":"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","sourcesContent":["import {\n Component,\n Input,\n Output,\n EventEmitter,\n OnInit,\n OnDestroy,\n ChangeDetectorRef,\n ElementRef,\n ViewChild,\n NgZone\n} from '@angular/core';\nimport { trigger, transition, style, animate } from '@angular/animations';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport type { EntityActionUXContext, EntityActionUXResult } from '@memberjunction/ng-entity-action-ux';\nimport { Subject } from 'rxjs';\nimport { debounceTime, takeUntil } from 'rxjs/operators';\nimport { LogError, RunView, RunViewParams, Metadata, EntityInfo, EntityFieldInfo, AggregateResult, AggregateValue, AggregateExpression, CoerceImageSrc, ParseCssHexColor, CompositeKey, IsDateOnlySQLType, FormatDateOnly, EntityFieldTSType } from '@memberjunction/core';\nimport { UUIDsEqual } from '@memberjunction/global';\nimport { EntityActionEngineBase } from '@memberjunction/actions-base';\nimport { CommunicationEngineBase } from '@memberjunction/communication-types';\nimport { PageChangeEvent } from '@memberjunction/ng-pagination';\nimport { BuildPkString, CanonicalizeColumnFields, ComputeFieldsList } from '../utils/record.util';\nimport { AggregateField } from '../utils/aggregate-field.util';\nimport {\n MJUserViewEntityExtended,\n ViewInfo,\n ViewGridState,\n UserViewEngine,\n UserInfoEngine,\n MJUserViewEntity_IColumnFormat as ColumnFormat,\n MJUserViewEntity_IColumnTextStyle as ColumnTextStyle,\n MJUserViewEntity_IGridAggregatesConfig as ViewGridAggregatesConfig,\n MJUserViewEntity_IGridAggregate as ViewGridAggregate\n} from '@memberjunction/core-entities';\nimport {\n ColDef,\n GridReadyEvent,\n RowClickedEvent,\n GridApi,\n RowDoubleClickedEvent,\n ModuleRegistry,\n AllCommunityModule,\n RowSelectionOptions,\n GetRowIdParams,\n themeAlpine,\n SortChangedEvent as AgSortChangedEvent,\n type Theme,\n ColumnResizedEvent,\n ColumnMovedEvent,\n SelectionChangedEvent,\n CellClickedEvent,\n ICellRendererParams,\n IDatasource,\n IGetRowsParams,\n GridOptions\n} from 'ag-grid-community';\n// Use the existing HighlightUtil from entity-viewer package\nimport { HighlightUtil } from '../utils/highlight.util';\nimport {\n GridSelectionMode,\n GridEditMode,\n GridLinesMode,\n GridColumnConfig,\n GridToolbarConfig,\n GridToolbarButton,\n DataGridSortState,\n FilterState,\n PendingChange,\n GridState,\n GridRowData,\n ColumnRuntimeState,\n GridRunViewParams,\n ViewGridColumnSetting,\n ViewGridSortSetting,\n GridStateChangedEvent,\n EntityActionConfig,\n GridVisualConfig,\n DEFAULT_VISUAL_CONFIG,\n ForeignKeyClickEvent\n} from './models/grid-types';\nimport {\n BeforeRowSelectEventArgs,\n AfterRowSelectEventArgs,\n BeforeRowDeselectEventArgs,\n AfterRowDeselectEventArgs,\n BeforeRowClickEventArgs,\n AfterRowClickEventArgs,\n BeforeRowDoubleClickEventArgs,\n AfterRowDoubleClickEventArgs,\n BeforeCellEditEventArgs,\n AfterCellEditBeginEventArgs,\n BeforeCellEditCommitEventArgs,\n AfterCellEditCommitEventArgs,\n BeforeCellEditCancelEventArgs,\n AfterCellEditCancelEventArgs,\n BeforeRowSaveEventArgs,\n AfterRowSaveEventArgs,\n BeforeRowDeleteEventArgs,\n AfterRowDeleteEventArgs,\n BeforeDataLoadEventArgs,\n AfterDataLoadEventArgs,\n BeforeDataRefreshEventArgs,\n AfterDataRefreshEventArgs,\n BeforeSortEventArgs,\n AfterSortEventArgs,\n BeforeColumnReorderEventArgs,\n AfterColumnReorderEventArgs,\n BeforeColumnResizeEventArgs,\n AfterColumnResizeEventArgs,\n BeforeColumnVisibilityChangeEventArgs,\n AfterColumnVisibilityChangeEventArgs\n} from './events/grid-events';\nimport {\n ExportService,\n ExportDialogConfig,\n ExportDialogResult\n} from '@memberjunction/ng-export-service';\nimport {\n ExportOptions,\n ExportResult,\n ExportColumn,\n ExportData\n} from '@memberjunction/export-engine';\n\n// Register AG Grid modules (required for v34+)\nModuleRegistry.registerModules([AllCommunityModule]);\n\n/**\n * A modern, flexible data grid component for displaying and managing entity data.\n * Built on AG Grid Community edition with a rich Before/After cancelable event system.\n *\n * Features:\n * - RunView-based data loading with automatic refresh\n * - AG Grid for high-performance rendering\n * - Rich event system with Before/After cancelable patterns\n * - Column configuration with type-aware formatters\n * - Row selection (single, multiple, checkbox modes)\n * - Inline cell and row editing\n * - Column reordering, resizing, and visibility toggle\n * - State persistence to User Settings\n * - Compatible with ViewGridState from User Views\n *\n * @example\n * ```html\n * <mj-entity-data-grid\n * [entityName]=\"'Contacts'\"\n * [showToolbar]=\"true\"\n * [allowSorting]=\"true\"\n * [selectionMode]=\"'multiple'\"\n * (afterRowDoubleClick)=\"onRowDoubleClick($event)\">\n * </mj-entity-data-grid>\n * ```\n */\n\n/**\n * Floor for a column declared `width: 'auto'` (see `mapColumnConfigToColDef`). A flex column with no\n * `minWidth` collapses toward zero once its fixed siblings claim the row, so the \"fill the slack\"\n * column would paradoxically become the narrowest one on a crowded grid. 160px is roughly the width\n * at which a text cell still reads as a sentence rather than a fragment. Overridable per column via\n * `GridColumnConfig.minWidth`.\n */\nconst AUTO_WIDTH_COLUMN_MIN_PX = 160;\n\n/** Column id of the inert width-filler appended when `FillWidth` is on. See `buildFillerColumnDef`. */\nconst FILLER_COLUMN_ID = '__mjFill';\n/** Field (and column id) of the row-number column added when `ShowRowNumbers` is on. */\nconst ROW_NUMBER_FIELD = '__rowNumber';\n\n/**\n * Flex weight given to a `width: 'auto'` column so it outranks the filler when leftover row width is\n * shared out. Any value that dwarfs the filler's weight of 1 works; the effect is \"this column takes\n * what it needs (up to its maxWidth) and the filler takes the remainder\", rather than a 50/50 split.\n */\nconst AUTO_WIDTH_FLEX_WEIGHT = 1000;\n\n@Component({\n standalone: false,\n selector: 'mj-entity-data-grid',\n templateUrl: './entity-data-grid.component.html',\n styleUrls: ['./entity-data-grid.component.css'],\n animations: [\n trigger('fadeIn', [\n transition(':enter', [\n style({ opacity: 0, transform: 'translateY(-8px)' }),\n animate('150ms ease-out', style({ opacity: 1, transform: 'translateY(0)' }))\n ]),\n transition(':leave', [\n animate('100ms ease-in', style({ opacity: 0, transform: 'translateY(-8px)' }))\n ])\n ])\n ]\n})\nexport class EntityDataGridComponent extends BaseAngularComponent implements OnInit, OnDestroy {\n // ========================================\n // Data Source Inputs (RunViewParams-based)\n // ========================================\n\n private _params: RunViewParams | null = null;\n /**\n * RunViewParams for data loading - the primary way to specify data source.\n * Supports stored views (ViewID, ViewName, ViewEntity) and dynamic views (EntityName + filters).\n * Mutually exclusive with the legacy entityName/extraFilter inputs.\n * When Params is provided, it takes precedence over legacy inputs.\n */\n @Input()\n set Params(value: RunViewParams | null) {\n const previousValue = this._params;\n this._params = value;\n // Use deep comparison to avoid triggering changes when the same params are passed\n // as a new object reference (common with template bindings like BuildRelationshipViewParamsByEntityName)\n if (!RunViewParams.Equals(value, previousValue)) {\n this.onParamsChanged();\n }\n }\n get Params(): RunViewParams | null {\n return this._params;\n }\n\n private _allowLoad: boolean = true;\n /**\n * Controls whether data loading is allowed.\n * Set to false to defer loading until ready (useful for complex forms where params may change multiple times).\n * When set to true and Params is provided, triggers a data load.\n */\n @Input()\n set AllowLoad(value: boolean) {\n const previousValue = this._allowLoad;\n this._allowLoad = value;\n if (value && !previousValue && this._params) {\n // AllowLoad was just enabled and we have params - load now\n this.loadData(false);\n }\n }\n get AllowLoad(): boolean {\n return this._allowLoad;\n }\n\n private _autoRefreshOnParamsChange: boolean = true;\n /**\n * When true, automatically refreshes data when Params changes.\n * When false, you must call Refresh() manually after changing Params.\n */\n @Input()\n set AutoRefreshOnParamsChange(value: boolean) {\n this._autoRefreshOnParamsChange = value;\n }\n get AutoRefreshOnParamsChange(): boolean {\n return this._autoRefreshOnParamsChange;\n }\n\n // ========================================\n // Pagination Inputs\n // ========================================\n\n private _paginationMode: 'client' | 'infinite' = 'client';\n /**\n * Pagination mode for the grid:\n * - 'client': All data loaded upfront (default, legacy behavior)\n * - 'infinite': Server-side pagination with infinite scroll (recommended for large datasets)\n */\n @Input()\n set PaginationMode(value: 'client' | 'infinite') {\n this._paginationMode = value;\n }\n get PaginationMode(): 'client' | 'infinite' {\n return this._paginationMode;\n }\n\n private _pageSize: number = 100;\n /**\n * Number of rows to fetch per page when using infinite pagination mode.\n * Default is 100 rows per page.\n */\n @Input()\n set PageSize(value: number) {\n this._pageSize = value;\n }\n get PageSize(): number {\n return this._pageSize;\n }\n\n private _cacheBlockSize: number = 100;\n /**\n * Size of each cache block in infinite scroll mode.\n * Should match or be a multiple of PageSize for optimal performance.\n */\n @Input()\n set CacheBlockSize(value: number) {\n this._cacheBlockSize = value;\n }\n get CacheBlockSize(): number {\n return this._cacheBlockSize;\n }\n\n private _maxBlocksInCache: number = 10;\n /**\n * Maximum number of blocks to keep in cache.\n * When exceeded, oldest blocks are purged.\n */\n @Input()\n set MaxBlocksInCache(value: number) {\n this._maxBlocksInCache = value;\n }\n get MaxBlocksInCache(): number {\n return this._maxBlocksInCache;\n }\n\n /**\n * Whether to show the shared PaginationComponent below the grid.\n * When true, displays page-based navigation (first/prev/next/last) using the\n * TotalRowCount from server responses. The pager auto-hides when there's only one page.\n */\n @Input() ShowPager: boolean = false;\n\n /**\n * Optional provider that returns the FULL result set for export. Because the grid is server-side\n * paged, `Data`/`rowData` only hold the current page (default 100 rows), so exporting them would\n * silently cap the export at the page size (bug C1). The host (entity-viewer) supplies this callback\n * to fetch every matching row (honoring the active filter/sort) on demand; the grid awaits it when\n * the user opens the export dialog. When not provided, export falls back to the loaded page.\n */\n @Input() ExportDataProvider: (() => Promise<Record<string, unknown>[]>) | null = null;\n\n /** True while an export is fetching the full result set via ExportDataProvider. */\n public IsPreparingExport: boolean = false;\n\n /** True while \"Add to List\" (with no explicit selection) is fetching the full result set. */\n public IsPreparingAddToList: boolean = false;\n\n /**\n * Whether to render the Recycle Bin chip in the toolbar. The chip\n * auto-hides itself when the entity has no deleted records, doesn't\n * track changes, or the user lacks Delete permission — so it stays\n * out of the way on entities where it's not relevant.\n * @default true\n */\n @Input() ShowRecycleBin: boolean = true;\n\n /**\n * Convenience accessor for the resolved entity name. Returns null when\n * the entity hasn't been resolved yet (e.g., before data loads).\n */\n public get EntityInfoName(): string | null {\n return this._entityInfo?.Name ?? null;\n }\n\n /** @deprecated Use {@link EntityInfoName}. */\n public get entityInfoName(): string | null {\n return this.EntityInfoName;\n }\n\n /**\n * Current page number for the shared pager (1-based).\n * Set by parent when using external data with server-side paging.\n */\n @Input() PagerPageNumber: number = 1;\n\n /**\n * Total row count from server for the shared pager.\n * When using external data ([Data] input), the parent must set this\n * so the pager knows the total number of rows across all pages.\n */\n @Input()\n set TotalRowCount(value: number) {\n this.totalRowCount = value;\n }\n\n /**\n * Emits when the user navigates to a different page via the shared PaginationComponent.\n * Parent components should handle this by re-fetching data with updated StartRow/MaxRows.\n */\n @Output() PageChange = new EventEmitter<PageChangeEvent>();\n\n // ========================================\n // External Data Input\n // ========================================\n\n private _data: Record<string, unknown>[] = [];\n /**\n * Pre-loaded data (bypass RunView, use provided data).\n * When provided, the grid displays this data instead of loading via RunView.\n * Parent component is responsible for data loading and passing results here.\n */\n @Input()\n set Data(value: Record<string, unknown>[]) {\n const hadData = this._data.length > 0;\n this._data = value || [];\n this._useExternalData = this._data.length > 0;\n if (this._useExternalData || hadData) {\n // Suppress sort events during data update to prevent AG Grid from clearing\n // our saved sort state when it processes the new row data\n const savedSortState = [...this._sortState];\n this.suppressSortEvents = true;\n\n try {\n this.processData();\n } finally {\n this.suppressSortEvents = false;\n }\n\n // Reapply sort state to grid after data changes to maintain visual indicators\n // Use microtask to ensure AG Grid has processed the new row data first\n if (this.gridApi && savedSortState.length > 0) {\n // Restore sort state in case it was cleared during processData\n this._sortState = savedSortState;\n Promise.resolve().then(() => {\n this.applySortStateToGrid();\n });\n }\n }\n }\n get Data(): Record<string, unknown>[] {\n return this._data;\n }\n\n // ========================================\n // Column Configuration Inputs\n // ========================================\n\n private _columns: GridColumnConfig[] = [];\n\n /**\n * True when `_columns` holds a list the HOST supplied via `[Columns]`, as opposed to one derived\n * from a saved view or generated from entity metadata. Both origins share `_columns`, and a\n * host-supplied list is an explicit instruction that must outlive view/params churn — whereas a\n * derived one is disposable and should be rebuilt when the view changes.\n */\n private _columnsFromHost: boolean = false;\n\n /**\n * True when `_gridState` was adopted from this user's saved entity-browser default rather than\n * supplied by the host. Such a state is a convenience, not an instruction, so an explicit\n * `[Columns]` may discard it; a host-passed `[GridState]` never is.\n */\n private _gridStateFromUserDefault: boolean = false;\n /**\n * Column definitions - if not provided, auto-generates from entity metadata\n */\n @Input()\n set Columns(value: GridColumnConfig[]) {\n this._columns = value || [];\n // Remember that THIS list came from the host, not from metadata/a saved view. `_columns` is\n // shared by both origins, and code that resets it needs to tell them apart — see the reset in\n // the dynamic-view branch of the params handler.\n this._columnsFromHost = this._columns.length > 0;\n // Angular assigns inputs in template order, and `[Params]` is conventionally bound before\n // `[Columns]`. That means the params handler may already have adopted this user's saved\n // entity-browser default into `_gridState` while `_columnsFromHost` was still false — and\n // `buildAgColumnDefs()` prefers `_gridState`, so the host's list would lose despite the guard\n // there. An explicit `[Columns]` arriving at ANY point supersedes a merely-inherited default,\n // so drop it. A `_gridState` the host passed deliberately via `[GridState]` is left alone.\n if (this._columnsFromHost && this._gridStateFromUserDefault) {\n this._gridState = null;\n this._gridStateFromUserDefault = false;\n }\n // Put the host's field names into the entity's spelling before anything derives from them.\n // No-op when `[Params]` has not resolved the entity yet — the params handler repeats it.\n this.canonicalizeHostColumns();\n if (this._columns.length > 0) {\n this.initializeColumnStates();\n this.buildAgColumnDefs();\n }\n }\n get Columns(): GridColumnConfig[] {\n return this._columns;\n }\n\n private _gridState: ViewGridState | null = null;\n /**\n * Grid state from a User View - controls columns, widths, order, sort\n * When provided, this takes precedence over auto-generated columns\n */\n @Input()\n set GridState(value: ViewGridState | null) {\n const previousValue = this._gridState;\n this._gridState = value;\n if (value !== previousValue) {\n if (value) {\n this.onGridStateChanged();\n } else if (previousValue) {\n // Grid state was cleared (e.g. switching to entity with no saved view) -\n // rebuild columns from entity metadata instead of retaining stale columns\n this.buildAgColumnDefs();\n }\n }\n }\n get GridState(): ViewGridState | null {\n return this._gridState;\n }\n\n private _allowColumnReorder: boolean = true;\n @Input()\n set AllowColumnReorder(value: boolean) {\n this._allowColumnReorder = value;\n }\n get AllowColumnReorder(): boolean {\n return this._allowColumnReorder;\n }\n\n private _allowColumnResize: boolean = true;\n @Input()\n set AllowColumnResize(value: boolean) {\n this._allowColumnResize = value;\n }\n get AllowColumnResize(): boolean {\n return this._allowColumnResize;\n }\n\n private _allowColumnToggle: boolean = true;\n @Input()\n set AllowColumnToggle(value: boolean) {\n this._allowColumnToggle = value;\n }\n get AllowColumnToggle(): boolean {\n return this._allowColumnToggle;\n }\n\n private _showHeader: boolean = true;\n @Input()\n set ShowHeader(value: boolean) {\n this._showHeader = value;\n }\n get ShowHeader(): boolean {\n return this._showHeader;\n }\n\n // ========================================\n // Sorting & Filtering Inputs\n // ========================================\n\n private _allowSorting: boolean = true;\n @Input()\n set AllowSorting(value: boolean) {\n this._allowSorting = value;\n }\n get AllowSorting(): boolean {\n return this._allowSorting;\n }\n\n private _allowMultiSort: boolean = true;\n @Input()\n set AllowMultiSort(value: boolean) {\n this._allowMultiSort = value;\n }\n get AllowMultiSort(): boolean {\n return this._allowMultiSort;\n }\n\n private _serverSideSorting: boolean = true;\n /**\n * Whether sorting is handled server-side\n * When true, sort changes trigger a new data load\n */\n @Input()\n set ServerSideSorting(value: boolean) {\n this._serverSideSorting = value;\n }\n get ServerSideSorting(): boolean {\n return this._serverSideSorting;\n }\n\n private _allowColumnFilters: boolean = false;\n @Input()\n set AllowColumnFilters(value: boolean) {\n this._allowColumnFilters = value;\n }\n get AllowColumnFilters(): boolean {\n return this._allowColumnFilters;\n }\n\n private _showSearch: boolean = true;\n @Input()\n set ShowSearch(value: boolean) {\n this._showSearch = value;\n }\n get ShowSearch(): boolean {\n return this._showSearch;\n }\n\n // ========================================\n // Selection Inputs\n // ========================================\n\n private _selectionMode: GridSelectionMode = 'single';\n @Input()\n set SelectionMode(value: GridSelectionMode) {\n this._selectionMode = value;\n this.updateAgRowSelection();\n if (value === 'none') {\n this.ClearSelection();\n }\n }\n get SelectionMode(): GridSelectionMode {\n return this._selectionMode;\n }\n\n private _selectedKeys: string[] = [];\n @Input()\n set SelectedKeys(value: string[]) {\n this._selectedKeys = value || [];\n this.updateRowSelectionState();\n }\n get SelectedKeys(): string[] {\n return this._selectedKeys;\n }\n\n private _keyField: string = 'ID';\n @Input()\n set KeyField(value: string) {\n this._keyField = value || 'ID';\n }\n get KeyField(): string {\n return this._keyField;\n }\n\n // ========================================\n // Editing Inputs\n // ========================================\n\n private _editMode: GridEditMode = 'none';\n @Input()\n set EditMode(value: GridEditMode) {\n this._editMode = value;\n }\n get EditMode(): GridEditMode {\n return this._editMode;\n }\n\n private _allowAdd: boolean = false;\n @Input()\n set AllowAdd(value: boolean) {\n this._allowAdd = value;\n }\n get AllowAdd(): boolean {\n return this._allowAdd;\n }\n\n private _allowDelete: boolean = false;\n @Input()\n set AllowDelete(value: boolean) {\n this._allowDelete = value;\n }\n get AllowDelete(): boolean {\n return this._allowDelete;\n }\n\n // ========================================\n // Display Inputs\n // ========================================\n\n private _height: number | 'auto' | 'fit-content' = 'auto';\n @Input()\n set Height(value: number | 'auto' | 'fit-content') {\n this._height = value;\n }\n get Height(): number | 'auto' | 'fit-content' {\n return this._height;\n }\n\n /** Hug-height related grids get a top-aligned inline empty, not a padded hero. */\n get EmptyStateSize(): 'inline' | 'default' {\n return typeof this._height === 'number' ? 'inline' : 'default';\n }\n\n private _rowHeight: number = 40;\n @Input()\n set RowHeight(value: number) {\n this._rowHeight = value;\n }\n get RowHeight(): number {\n return this._rowHeight;\n }\n\n /**\n * Enable text wrapping in grid cells\n * When true, long text will wrap to multiple lines and rows will auto-size\n * Note: This disables fixed row height and may impact performance with large datasets\n */\n private _wrapText: boolean = false;\n @Input()\n set WrapText(value: boolean) {\n if (this._wrapText !== value) {\n this._wrapText = value;\n this.updateDefaultColDefForWrapping();\n }\n }\n get WrapText(): boolean {\n return this._wrapText;\n }\n\n private _virtualScroll: boolean = true;\n @Input()\n set VirtualScroll(value: boolean) {\n this._virtualScroll = value;\n }\n get VirtualScroll(): boolean {\n return this._virtualScroll;\n }\n\n private _showRowNumbers: boolean = false;\n @Input()\n set ShowRowNumbers(value: boolean) {\n this._showRowNumbers = value;\n this.buildAgColumnDefs();\n }\n get ShowRowNumbers(): boolean {\n return this._showRowNumbers;\n }\n\n /**\n * Append an inert trailing column that soaks up leftover row width, so the row backgrounds, banding\n * and horizontal rules reach the container's right edge rather than stopping wherever the last real\n * column happens to end (which reads as a half-drawn table inside its own card).\n *\n * Off by default: it is purely cosmetic, it changes the look of EVERY grid it is enabled on, and\n * existing layouts were built against the current behaviour. Opt in per grid; flipping the default\n * is a product-wide styling decision, not a per-page one.\n *\n * Composes with `width: 'auto'`: give the text column `width: 'auto'` plus a `maxWidth` so it grows\n * only as far as its content warrants, and the filler takes whatever is left over.\n */\n private _fillWidth: boolean = false;\n @Input()\n set FillWidth(value: boolean) {\n this._fillWidth = value;\n this.buildAgColumnDefs();\n }\n get FillWidth(): boolean {\n return this._fillWidth;\n }\n\n private _striped: boolean = true;\n @Input()\n set Striped(value: boolean) {\n this._striped = value;\n }\n get Striped(): boolean {\n return this._striped;\n }\n\n private _gridLines: GridLinesMode = 'horizontal';\n @Input()\n set GridLines(value: GridLinesMode) {\n this._gridLines = value;\n }\n get GridLines(): GridLinesMode {\n return this._gridLines;\n }\n\n // ========================================\n // Visual Customization Inputs\n // ========================================\n\n private _visualConfig: GridVisualConfig = {};\n /**\n * Visual configuration for the grid appearance.\n * Allows customization of header styles, row colors, cell formatting, and more.\n * All properties are optional - unset properties use attractive defaults.\n */\n @Input()\n set VisualConfig(value: GridVisualConfig) {\n this._visualConfig = value || {};\n this.applyVisualConfig();\n }\n get VisualConfig(): GridVisualConfig {\n return this._visualConfig;\n }\n\n /**\n * Get the effective visual config (user config merged with defaults)\n */\n get EffectiveVisualConfig(): Required<GridVisualConfig> {\n return { ...DEFAULT_VISUAL_CONFIG, ...this._visualConfig };\n }\n\n /** @deprecated Use {@link EffectiveVisualConfig}. */\n get effectiveVisualConfig(): Required<GridVisualConfig> {\n return this.EffectiveVisualConfig;\n }\n\n // ========================================\n // Toolbar Inputs\n // ========================================\n\n private _showToolbar: boolean = true;\n @Input()\n set ShowToolbar(value: boolean) {\n this._showToolbar = value;\n }\n get ShowToolbar(): boolean {\n return this._showToolbar;\n }\n\n private _toolbarConfig: GridToolbarConfig = {};\n @Input()\n set ToolbarConfig(value: GridToolbarConfig) {\n this._toolbarConfig = value || {};\n }\n get ToolbarConfig(): GridToolbarConfig {\n return this._toolbarConfig;\n }\n\n // ========================================\n // State Inputs\n // ========================================\n\n private _stateKey: string = '';\n @Input()\n set StateKey(value: string) {\n this._stateKey = value || '';\n if (this._stateKey) {\n this.loadPersistedState();\n }\n }\n get StateKey(): string {\n return this._stateKey;\n }\n\n private _autoPersistState: boolean = true;\n /**\n * When true and using a stored view (ViewID/ViewName/ViewEntity in Params),\n * automatically persists grid state changes (column widths, order, sort) to the UserView entity.\n * Only saves if the user has edit permission on the view.\n * For dynamic views, only emits the gridStateChanged event.\n */\n @Input()\n set AutoPersistState(value: boolean) {\n this._autoPersistState = value;\n }\n get AutoPersistState(): boolean {\n return this._autoPersistState;\n }\n\n private _statePersistDebounce: number = 5000;\n /**\n * Debounce time in milliseconds before persisting state changes to the server.\n * Default is 5000ms (5 seconds) to avoid excessive server calls during rapid column adjustments.\n */\n @Input()\n set StatePersistDebounce(value: number) {\n this._statePersistDebounce = value;\n // Re-setup the debounce subscription with new timing\n this.setupStatePersistDebounce();\n }\n get StatePersistDebounce(): number {\n return this._statePersistDebounce;\n }\n\n private _refreshDebounce: number = 300;\n @Input()\n set RefreshDebounce(value: number) {\n this._refreshDebounce = value;\n }\n get RefreshDebounce(): number {\n return this._refreshDebounce;\n }\n\n // ========================================\n // Highlighting Input\n // ========================================\n\n private _filterText: string = '';\n /**\n * Text to highlight in grid cells.\n * Supports SQL-style % wildcards for pattern matching.\n */\n @Input()\n set FilterText(value: string) {\n const previousValue = this._filterText;\n this._filterText = value || '';\n if (value !== previousValue) {\n this.onFilterTextChanged();\n }\n }\n get FilterText(): string {\n return this._filterText;\n }\n\n // ========================================\n // Predefined Toolbar Button Inputs\n // ========================================\n\n private _showNewButton: boolean = true;\n /**\n * Show the \"New\" button in toolbar (creates new record)\n */\n @Input()\n set ShowNewButton(value: boolean) {\n this._showNewButton = value;\n }\n get ShowNewButton(): boolean {\n return this._showNewButton;\n }\n\n private _showRefreshButton: boolean = true;\n /**\n * Show the \"Refresh\" button in toolbar\n */\n @Input()\n set ShowRefreshButton(value: boolean) {\n this._showRefreshButton = value;\n }\n get ShowRefreshButton(): boolean {\n return this._showRefreshButton;\n }\n\n private _showExportButton: boolean = true;\n /**\n * Show the \"Export\" button in toolbar (opens the export dialog — Excel/CSV/JSON)\n */\n @Input()\n set ShowExportButton(value: boolean) {\n this._showExportButton = value;\n }\n get ShowExportButton(): boolean {\n return this._showExportButton;\n }\n\n private _showDeleteButton: boolean = false;\n /**\n * Show the \"Delete\" button in toolbar (deletes selected rows)\n */\n @Input()\n set ShowDeleteButton(value: boolean) {\n this._showDeleteButton = value;\n }\n get ShowDeleteButton(): boolean {\n return this._showDeleteButton;\n }\n\n private _showCompareButton: boolean = false;\n /**\n * Show the \"Compare\" button in toolbar (compare selected records)\n */\n @Input()\n set ShowCompareButton(value: boolean) {\n this._showCompareButton = value;\n }\n get ShowCompareButton(): boolean {\n return this._showCompareButton;\n }\n\n private _showMergeButton: boolean = false;\n /**\n * Show the \"Merge\" button in toolbar (merge selected records)\n */\n @Input()\n set ShowMergeButton(value: boolean) {\n this._showMergeButton = value;\n }\n get ShowMergeButton(): boolean {\n return this._showMergeButton;\n }\n\n private _showAddToListButton: boolean = false;\n /**\n * Show the \"Add to List\" button in toolbar\n */\n @Input()\n set ShowAddToListButton(value: boolean) {\n this._showAddToListButton = value;\n }\n get ShowAddToListButton(): boolean {\n return this._showAddToListButton;\n }\n\n private _showDuplicateSearchButton: boolean = false;\n /**\n * Show the \"Search for Duplicates\" button in toolbar\n */\n @Input()\n set ShowDuplicateSearchButton(value: boolean) {\n this._showDuplicateSearchButton = value;\n }\n get ShowDuplicateSearchButton(): boolean {\n return this._showDuplicateSearchButton;\n }\n\n private _showCommunicationButton: boolean = false;\n /**\n * Show the \"Send Message\" button in toolbar (if entity supports communication)\n */\n @Input()\n set ShowCommunicationButton(value: boolean) {\n this._showCommunicationButton = value;\n }\n get ShowCommunicationButton(): boolean {\n return this._showCommunicationButton;\n }\n\n private _entitySupportsCommunication = false;\n private _communicationCheckedForEntityID: string | null = null;\n /**\n * True when the current entity has at least one active Entity Communication Message Type. \"Send\n * Message\" is offered — as a toolbar button or in the overflow menu — only when this is true, so an\n * entity with no communication setup never shows a control that cannot do anything.\n */\n get EntitySupportsCommunication(): boolean {\n return this._entitySupportsCommunication;\n }\n\n /** Resolves {@link EntitySupportsCommunication} for the current entity, once per entity. */\n private async resolveCommunicationSupport(): Promise<void> {\n const entity = this._entityInfo;\n if (!entity) {\n this._entitySupportsCommunication = false;\n this._communicationCheckedForEntityID = null;\n return;\n }\n if (this._communicationCheckedForEntityID && UUIDsEqual(this._communicationCheckedForEntityID, entity.ID)) {\n return;\n }\n this._communicationCheckedForEntityID = entity.ID;\n this._entitySupportsCommunication = false;\n try {\n const provider = this.ProviderToUse;\n const engine = <CommunicationEngineBase>CommunicationEngineBase.GetProviderInstance(provider, CommunicationEngineBase);\n await engine.Config(false, provider.CurrentUser, provider);\n if (this._entityInfo !== entity) {\n return; // the grid moved to another entity while the engine loaded\n }\n this._entitySupportsCommunication = engine.Metadata.EntityCommunicationMessageTypes\n .some(m => m.IsActive && UUIDsEqual(m.EntityID, entity.ID));\n this.cdr.detectChanges();\n } catch {\n // Non-fatal: leave Send Message hidden, and retry on the next entity resolution.\n this._communicationCheckedForEntityID = null;\n }\n }\n\n // ========================================\n // Navigation Inputs\n // ========================================\n\n private _autoNavigate: boolean = true;\n /**\n * When true, clicking or double-clicking a row will emit a navigation request.\n * The parent component can handle the navigationRequested event to open the record.\n */\n @Input()\n set AutoNavigate(value: boolean) {\n this._autoNavigate = value;\n }\n get AutoNavigate(): boolean {\n return this._autoNavigate;\n }\n\n private _navigateOnDoubleClick: boolean = true;\n /**\n * When true, navigation is triggered on double-click only.\n * When false, navigation is triggered on single click.\n * Only applies when AutoNavigate is true.\n */\n @Input()\n set NavigateOnDoubleClick(value: boolean) {\n this._navigateOnDoubleClick = value;\n }\n get NavigateOnDoubleClick(): boolean {\n return this._navigateOnDoubleClick;\n }\n\n private _createRecordMode: 'Dialog' | 'Tab' = 'Tab';\n /**\n * How to open new records when the \"New\" button is clicked:\n * - 'Tab': Emit event to open in a new tab (default)\n * - 'Dialog': Emit event to open in a dialog\n */\n @Input()\n set CreateRecordMode(value: 'Dialog' | 'Tab') {\n this._createRecordMode = value;\n }\n get CreateRecordMode(): 'Dialog' | 'Tab' {\n return this._createRecordMode;\n }\n\n private _newRecordValues: Record<string, unknown> = {};\n /**\n * Default values to set on new records.\n * These values are passed with the newRecordDialogRequested event.\n */\n @Input()\n set NewRecordValues(value: Record<string, unknown>) {\n this._newRecordValues = value || {};\n }\n get NewRecordValues(): Record<string, unknown> {\n return this._newRecordValues;\n }\n\n // ========================================\n // Entity Actions Inputs\n // ========================================\n\n private _showEntityActionButtons: boolean = false;\n /**\n * When true, displays entity action buttons in the toolbar overflow menu.\n * Entity actions are loaded dynamically based on the current entity.\n * The entityActionsLoaded event is emitted when actions are ready.\n */\n @Input()\n set ShowEntityActionButtons(value: boolean) {\n this._showEntityActionButtons = value;\n if (value && this._entityInfo) {\n this.LoadEntityActionsRequested.emit({ entityInfo: this._entityInfo });\n }\n }\n get ShowEntityActionButtons(): boolean {\n return this._showEntityActionButtons;\n }\n\n private _entityActions: EntityActionConfig[] = [];\n /**\n * Array of entity actions to display in the toolbar.\n * Set this after receiving the entityActionsLoaded event.\n */\n @Input()\n set EntityActions(value: EntityActionConfig[]) {\n this._entityActions = value || [];\n }\n get EntityActions(): EntityActionConfig[] {\n return this._entityActions;\n }\n\n private _autoLoadEntityActions = false;\n private _entityActionsAutoLoaded = false;\n /**\n * When true, the grid resolves the current entity's active EntityActions itself (via the metadata-only\n * `EntityActionEngineBase`) and shows them — no parent wiring or `LoadEntityActionsRequested` handler\n * needed. Buttons appear only when the entity actually has active actions (data-driven). Actions whose\n * invocation names a `RuntimeUXDriverClass` mount that interactive driver in-place when clicked.\n */\n @Input()\n set AutoLoadEntityActions(value: boolean) {\n this._autoLoadEntityActions = value;\n void this.maybeAutoLoadEntityActions();\n }\n get AutoLoadEntityActions(): boolean {\n return this._autoLoadEntityActions;\n }\n\n /** Loads + maps the entity's active actions once, when auto-load is on and the entity is known. */\n private async maybeAutoLoadEntityActions(): Promise<void> {\n if (!this._autoLoadEntityActions || !this._entityInfo || this._entityActionsAutoLoaded) {\n return;\n }\n this._entityActionsAutoLoaded = true;\n try {\n const provider = this.ProviderToUse;\n const engine = this.entityActionEngine();\n await engine.Config(false, provider.CurrentUser, provider);\n const configs = this.mapEntityActionsToConfigs(engine, this._entityInfo.Name);\n if (configs.length > 0) {\n this._entityActions = configs;\n this._showEntityActionButtons = true;\n this.cdr.detectChanges();\n }\n } catch {\n // Non-fatal: leave the action bar empty if the engine can't load.\n this._entityActionsAutoLoaded = false;\n }\n }\n\n /** The EntityAction engine for this grid's provider, so a multi-provider client reads the right server's actions. */\n private entityActionEngine(): EntityActionEngineBase {\n return <EntityActionEngineBase>EntityActionEngineBase.GetProviderInstance(this.ProviderToUse, EntityActionEngineBase);\n }\n\n /** Maps the entity's active EntityActions to grid configs, carrying the driver key + RecordProcessID. */\n private mapEntityActionsToConfigs(engine: EntityActionEngineBase, entityName: string): EntityActionConfig[] {\n return engine.GetActionsByEntityName(entityName, 'Active').map((ea): EntityActionConfig => {\n const driverInvocation = engine.Invocations.find(i => UUIDsEqual(i.EntityActionID, ea.ID) && !!i.RuntimeUXDriverClass);\n const recordProcessParam = engine.Params.find(p => UUIDsEqual(p.EntityActionID, ea.ID) && p.ActionParam?.trim().toLowerCase() === 'recordprocessid');\n const config: EntityActionConfig = {\n id: ea.ID,\n name: ea.Action ?? 'Action',\n icon: 'fa-solid fa-bolt',\n runtimeUXDriverClass: driverInvocation?.RuntimeUXDriverClass ?? undefined,\n };\n if (recordProcessParam?.Value) {\n config.metadata = { RecordProcessID: recordProcessParam.Value };\n }\n return config;\n });\n }\n\n // ========================================\n // Aggregate Inputs\n // ========================================\n\n /**\n * Aggregate configuration for the grid.\n * When provided, aggregate expressions are calculated alongside data and displayed:\n * - Column-bound aggregates appear in a pinned bottom row\n * - Card-bound aggregates are exposed via AggregateValues for use with AggregatePanelComponent\n */\n @Input()\n set AggregatesConfig(value: ViewGridAggregatesConfig | null) {\n this._aggregatesConfig = value;\n }\n get AggregatesConfig(): ViewGridAggregatesConfig | null {\n return this._aggregatesConfig;\n }\n\n /**\n * Returns the aggregate values map, keyed by expression or id.\n * Use this to pass values to AggregatePanelComponent.\n */\n public get AggregateValuesMap(): Map<string, AggregateValue> {\n return this._aggregateValues;\n }\n\n /**\n * Returns the raw aggregate results from the last RunView call.\n */\n public get AggregateResultsList(): AggregateResult[] {\n return this._aggregateResults;\n }\n\n /**\n * Whether aggregates are currently loading.\n */\n public get AggregatesLoading(): boolean {\n return this._aggregatesLoading;\n }\n\n /**\n * Returns the effective aggregates config, preferring _aggregatesConfig but falling back to _gridState.aggregates.\n * This ensures aggregates work regardless of whether they came from explicit config or from view's GridState.\n */\n private get effectiveAggregatesConfig(): ViewGridAggregatesConfig | null | undefined {\n return this._aggregatesConfig || this._gridState?.aggregates;\n }\n\n /**\n * Returns enabled aggregates configured for card display.\n */\n public get CardAggregates(): ViewGridAggregate[] {\n const config = this.effectiveAggregatesConfig;\n if (!config?.expressions) return [];\n return config.expressions\n .filter(a => a.enabled !== false && a.displayType === 'card')\n .sort((a, b) => (a.order || 0) - (b.order || 0));\n }\n\n /**\n * Returns enabled aggregates configured for column footer display.\n */\n public get ColumnAggregates(): ViewGridAggregate[] {\n const config = this.effectiveAggregatesConfig;\n if (!config?.expressions) return [];\n return config.expressions\n .filter(a => a.enabled !== false && a.displayType === 'column')\n .sort((a, b) => (a.order || 0) - (b.order || 0));\n }\n\n /**\n * Whether to show aggregate summary row (has column-type aggregates with values).\n */\n public get ShowAggregateSummary(): boolean {\n const hasColumnAggs = this.ColumnAggregates.length > 0;\n const hasValues = this._aggregateValues.size > 0;\n return hasColumnAggs && hasValues;\n }\n\n /**\n * Whether to show aggregate panel (has card-type aggregates with values).\n */\n public get ShowAggregatePanel(): boolean {\n return this.CardAggregates.length > 0 && this._aggregateValues.size > 0;\n }\n\n /**\n * Get formatted aggregate value for display\n */\n public GetAggregateValue(agg: ViewGridAggregate): string {\n const key = agg.id || agg.expression;\n const value = this._aggregateValues.get(key);\n if (value == null) return '—';\n\n // Format based on value type\n if (typeof value === 'number') {\n return value.toLocaleString('en-US', {\n maximumFractionDigits: 2,\n minimumFractionDigits: 0\n });\n }\n // A date aggregate reaches the browser as an ISO string: the server JSON-stringifies the value\n // and the client parses it back, which turns a Date into text. Resolve the column's type first\n // so a `date` column renders as its stored day whether the value is a Date or that string.\n if (typeof value !== 'boolean' && this.aggregateIsDateOnly(agg)) {\n return FormatDateOnly(value);\n }\n if (value instanceof Date) {\n return value.toLocaleDateString();\n }\n // A timestamp aggregate arrives as the same ISO string. It names an instant, so it is rendered\n // in local time, as a Date instance would be — not printed as the wire text.\n if (typeof value === 'string' && AggregateField(agg, this._entityInfo)?.TSType === EntityFieldTSType.Date) {\n const date = new Date(value);\n if (!isNaN(date.getTime())) return date.toLocaleDateString();\n }\n return String(value);\n }\n\n /** @deprecated Use {@link GetAggregateValue}. */\n public getAggregateValue(agg: ViewGridAggregate): string {\n return this.GetAggregateValue(agg);\n }\n\n /**\n * Whether an aggregate summarises a date-only column. An aggregate carries no field metadata of\n * its own, so the column is read from a single-field expression such as `MIN(IntakeDate)` or\n * from the column the aggregate is pinned under. A `date` column is a calendar day and must not\n * be shifted into the reader's zone (MJ#4210).\n */\n private aggregateIsDateOnly(agg: ViewGridAggregate): boolean {\n return IsDateOnlySQLType(AggregateField(agg, this._entityInfo)?.Type);\n }\n\n // ========================================\n // Event Outputs\n // ========================================\n\n // Aggregate Results\n /**\n * Emitted when aggregate results are loaded.\n * Contains the array of AggregateResult objects and a values map for easy lookup.\n */\n @Output() AggregatesLoaded = new EventEmitter<{ results: AggregateResult[]; values: Map<string, AggregateValue>; executionTime?: number }>();\n\n // Row Selection\n @Output() BeforeRowSelect = new EventEmitter<BeforeRowSelectEventArgs>();\n @Output() AfterRowSelect = new EventEmitter<AfterRowSelectEventArgs>();\n @Output() BeforeRowDeselect = new EventEmitter<BeforeRowDeselectEventArgs>();\n @Output() AfterRowDeselect = new EventEmitter<AfterRowDeselectEventArgs>();\n @Output() SelectionChange = new EventEmitter<string[]>();\n\n // Row Click\n @Output() BeforeRowClick = new EventEmitter<BeforeRowClickEventArgs>();\n @Output() AfterRowClick = new EventEmitter<AfterRowClickEventArgs>();\n @Output() BeforeRowDoubleClick = new EventEmitter<BeforeRowDoubleClickEventArgs>();\n @Output() AfterRowDoubleClick = new EventEmitter<AfterRowDoubleClickEventArgs>();\n\n // Foreign Key Link Click\n /**\n * Emitted when a foreign key link is clicked in the grid.\n * Parent components should handle this to navigate to the related record.\n */\n @Output() ForeignKeyClick = new EventEmitter<ForeignKeyClickEvent>();\n\n // Editing\n @Output() BeforeCellEdit = new EventEmitter<BeforeCellEditEventArgs>();\n @Output() AfterCellEditBegin = new EventEmitter<AfterCellEditBeginEventArgs>();\n @Output() BeforeCellEditCommit = new EventEmitter<BeforeCellEditCommitEventArgs>();\n @Output() AfterCellEditCommit = new EventEmitter<AfterCellEditCommitEventArgs>();\n @Output() BeforeCellEditCancel = new EventEmitter<BeforeCellEditCancelEventArgs>();\n @Output() AfterCellEditCancel = new EventEmitter<AfterCellEditCancelEventArgs>();\n @Output() BeforeRowSave = new EventEmitter<BeforeRowSaveEventArgs>();\n @Output() AfterRowSave = new EventEmitter<AfterRowSaveEventArgs>();\n @Output() BeforeRowDelete = new EventEmitter<BeforeRowDeleteEventArgs>();\n @Output() AfterRowDelete = new EventEmitter<AfterRowDeleteEventArgs>();\n\n // Data Loading\n @Output() BeforeDataLoad = new EventEmitter<BeforeDataLoadEventArgs>();\n @Output() AfterDataLoad = new EventEmitter<AfterDataLoadEventArgs>();\n @Output() BeforeDataRefresh = new EventEmitter<BeforeDataRefreshEventArgs>();\n @Output() AfterDataRefresh = new EventEmitter<AfterDataRefreshEventArgs>();\n\n // Sorting\n @Output() BeforeSort = new EventEmitter<BeforeSortEventArgs>();\n @Output() AfterSort = new EventEmitter<AfterSortEventArgs>();\n\n // Column Management\n @Output() BeforeColumnReorder = new EventEmitter<BeforeColumnReorderEventArgs>();\n @Output() AfterColumnReorder = new EventEmitter<AfterColumnReorderEventArgs>();\n @Output() BeforeColumnResize = new EventEmitter<BeforeColumnResizeEventArgs>();\n @Output() AfterColumnResize = new EventEmitter<AfterColumnResizeEventArgs>();\n @Output() BeforeColumnVisibilityChange = new EventEmitter<BeforeColumnVisibilityChangeEventArgs>();\n @Output() AfterColumnVisibilityChange = new EventEmitter<AfterColumnVisibilityChangeEventArgs>();\n\n // Grid State\n @Output() GridStateChanged = new EventEmitter<GridStateChangedEvent>();\n\n // Toolbar Actions (legacy names)\n @Output() AddRequested = new EventEmitter<void>();\n @Output() DeleteRequested = new EventEmitter<Record<string, unknown>[]>();\n @Output() ExportRequested = new EventEmitter<void>();\n\n // Predefined Toolbar Button Events\n @Output() NewButtonClick = new EventEmitter<void>();\n @Output() RefreshButtonClick = new EventEmitter<void>();\n @Output() ExportButtonClick = new EventEmitter<void>();\n @Output() DeleteButtonClick = new EventEmitter<Record<string, unknown>[]>();\n @Output() CompareButtonClick = new EventEmitter<Record<string, unknown>[]>();\n @Output() MergeButtonClick = new EventEmitter<Record<string, unknown>[]>();\n @Output() AddToListButtonClick = new EventEmitter<Record<string, unknown>[]>();\n @Output() DuplicateSearchButtonClick = new EventEmitter<Record<string, unknown>[]>();\n @Output() CommunicationButtonClick = new EventEmitter<Record<string, unknown>[]>();\n /** Raised when the user clicks the column-chooser / \"Manage Columns\" toolbar affordance. The host opens its column-management UI (see {@link onColumnChooserClick}). */\n @Output() ManageColumnsRequested = new EventEmitter<void>();\n\n // Navigation Events\n /**\n * Emitted when a row is clicked/double-clicked and AutoNavigate is enabled.\n * Parent components should handle this to open the entity record.\n */\n @Output() NavigationRequested = new EventEmitter<{\n entityInfo: EntityInfo;\n record: Record<string, unknown>;\n compositeKey: string;\n }>();\n\n /**\n * Emitted when the \"New\" button is clicked and CreateRecordMode is 'Dialog'.\n * Parent components should handle this to show a new record dialog.\n */\n @Output() NewRecordDialogRequested = new EventEmitter<{\n entityInfo: EntityInfo;\n defaultValues: Record<string, unknown>;\n }>();\n\n /**\n * Emitted when the \"New\" button is clicked and CreateRecordMode is 'Tab'.\n * Parent components should handle this to open a new record in a tab.\n */\n @Output() NewRecordTabRequested = new EventEmitter<{\n entityInfo: EntityInfo;\n defaultValues: Record<string, unknown>;\n }>();\n\n // Dialog Request Events (for Explorer-specific dialogs)\n /**\n * Emitted when Compare Records functionality is requested.\n * Parent components should handle this to show the compare dialog.\n */\n @Output() CompareRecordsRequested = new EventEmitter<{\n entityInfo: EntityInfo;\n records: Record<string, unknown>[];\n }>();\n\n /**\n * Emitted when Merge Records functionality is requested.\n * Parent components should handle this to show the merge dialog.\n */\n @Output() MergeRecordsRequested = new EventEmitter<{\n entityInfo: EntityInfo;\n records: Record<string, unknown>[];\n }>();\n\n /**\n * Emitted when Communication/Send Message functionality is requested.\n * Parent components should handle this to show the communication dialog.\n */\n @Output() CommunicationRequested = new EventEmitter<{\n entityInfo: EntityInfo;\n records: Record<string, unknown>[];\n viewParams: RunViewParams | null;\n }>();\n\n /**\n * Emitted when duplicate search functionality is requested.\n * Parent components should handle this to show the duplicate search results.\n */\n @Output() DuplicateSearchRequested = new EventEmitter<{\n entityInfo: EntityInfo;\n records: Record<string, unknown>[];\n }>();\n\n /**\n * Emitted when the Add to List button is clicked.\n * Parent components should handle this to show the list management dialog.\n */\n @Output() AddToListRequested = new EventEmitter<{\n entityInfo: EntityInfo;\n records: Record<string, unknown>[];\n recordIds: string[];\n }>();\n\n // Entity Action Events\n /**\n * Emitted when entity actions need to be loaded.\n * Parent components should load actions and set the EntityActions input.\n */\n @Output() LoadEntityActionsRequested = new EventEmitter<{\n entityInfo: EntityInfo;\n }>();\n\n /**\n * Emitted when an entity action is selected for execution.\n * Parent components should handle the action execution.\n */\n @Output() EntityActionRequested = new EventEmitter<{\n entityInfo: EntityInfo;\n action: EntityActionConfig;\n selectedRecords: Record<string, unknown>[];\n }>();\n\n // ========================================\n // View Children\n // ========================================\n\n @ViewChild('gridContainer') GridContainer!: ElementRef<HTMLDivElement>;\n\n /** @deprecated Use {@link GridContainer}. */\n get gridContainer(): ElementRef<HTMLDivElement> {\n return this.GridContainer;\n }\n /** @deprecated Use {@link GridContainer}. */\n set gridContainer(value: ElementRef<HTMLDivElement>) {\n this.GridContainer = value;\n }\n\n // ========================================\n // AG Grid Properties\n // ========================================\n\n /** AG Grid column definitions */\n public AgColumnDefs: ColDef[] = [];\n\n /** @deprecated Use {@link AgColumnDefs}. */\n public get agColumnDefs(): ColDef[] {\n return this.AgColumnDefs;\n }\n /** @deprecated Use {@link AgColumnDefs}. */\n public set agColumnDefs(value: ColDef[]) {\n this.AgColumnDefs = value;\n }\n\n /** AG Grid row data */\n public RowData: Record<string, unknown>[] = [];\n\n /** @deprecated Use {@link RowData}. */\n public get rowData(): Record<string, unknown>[] {\n return this.RowData;\n }\n /** @deprecated Use {@link RowData}. */\n public set rowData(value: Record<string, unknown>[]) {\n this.RowData = value;\n }\n\n /** AG Grid API reference */\n private gridApi: GridApi | null = null;\n\n /** AG Grid theme (v34+) with custom selection colors */\n public AgGridTheme: Theme = themeAlpine.withParams({\n backgroundColor: 'var(--mj-bg-surface)',\n foregroundColor: 'var(--mj-text-primary)',\n textColor: 'var(--mj-text-primary)',\n borderColor: 'var(--mj-border-default)',\n chromeBackgroundColor: 'var(--mj-bg-surface-card)',\n headerBackgroundColor: 'var(--mj-bg-surface-card)',\n headerTextColor: 'var(--mj-text-secondary)',\n cellTextColor: 'var(--mj-text-primary)',\n subtleTextColor: 'var(--mj-text-muted)',\n dataBackgroundColor: 'var(--mj-bg-surface)',\n oddRowBackgroundColor: 'var(--mj-bg-surface-card)',\n rowHoverColor: 'var(--mj-bg-surface-hover, color-mix(in srgb, var(--mj-brand-primary) 5%, var(--mj-bg-surface)))',\n selectedRowBackgroundColor: 'color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface))',\n accentColor: 'var(--mj-brand-primary)',\n borderRadius: 'var(--mj-radius-sm)',\n browserColorScheme: 'inherit',\n });\n\n /** @deprecated Use {@link AgGridTheme}. */\n public get agGridTheme(): Theme {\n return this.AgGridTheme;\n }\n /** @deprecated Use {@link AgGridTheme}. */\n public set agGridTheme(value: Theme) {\n this.AgGridTheme = value;\n }\n\n /** AG Grid row selection configuration */\n public AgRowSelection: RowSelectionOptions = { mode: 'singleRow' };\n\n /** @deprecated Use {@link AgRowSelection}. */\n public get agRowSelection(): RowSelectionOptions {\n return this.AgRowSelection;\n }\n /** @deprecated Use {@link AgRowSelection}. */\n public set agRowSelection(value: RowSelectionOptions) {\n this.AgRowSelection = value;\n }\n\n /** Default column settings */\n public DefaultColDef: ColDef = {\n sortable: true,\n filter: false,\n resizable: true,\n minWidth: 80\n };\n\n /** @deprecated Use {@link DefaultColDef}. */\n public get defaultColDef(): ColDef {\n return this.DefaultColDef;\n }\n /** @deprecated Use {@link DefaultColDef}. */\n public set defaultColDef(value: ColDef) {\n this.DefaultColDef = value;\n }\n\n /**\n * Update defaultColDef when text wrapping setting changes\n * Enables/disables auto row height and cell text wrapping\n */\n private updateDefaultColDefForWrapping(): void {\n if (this._wrapText) {\n this.DefaultColDef = {\n ...this.DefaultColDef,\n wrapText: true,\n autoHeight: true,\n cellClass: 'cell-wrap-text'\n };\n } else {\n // Remove wrapping properties\n const { wrapText, autoHeight, cellClass, ...rest } = this.DefaultColDef;\n this.DefaultColDef = rest;\n }\n\n // Refresh the grid to apply changes\n if (this.gridApi) {\n this.gridApi.setGridOption('defaultColDef', this.DefaultColDef);\n this.gridApi.refreshCells({ force: true });\n }\n }\n\n /** Get row ID function for AG Grid */\n public GetRowId = (params: GetRowIdParams<Record<string, unknown>>) =>\n params.data['__pk'] as string;\n\n /** @deprecated Use {@link GetRowId}. */\n public get getRowId() {\n return this.GetRowId;\n }\n /** @deprecated Use {@link GetRowId}. */\n public set getRowId(value) {\n this.GetRowId = value;\n }\n\n /** Suppress sort changed events during programmatic updates */\n private suppressSortEvents: boolean = false;\n\n /** AG Grid options for infinite scroll mode */\n public GridOptions: GridOptions = {};\n\n /** @deprecated Use {@link GridOptions}. */\n public get gridOptions(): GridOptions {\n return this.GridOptions;\n }\n /** @deprecated Use {@link GridOptions}. */\n public set gridOptions(value: GridOptions) {\n this.GridOptions = value;\n }\n\n /** Datasource for infinite scroll mode */\n private infiniteDatasource: IDatasource | null = null;\n\n // ========================================\n // Internal State\n // ========================================\n\n private _useExternalData: boolean = false;\n private _allData: Record<string, unknown>[] = [];\n private _rowDataMap = new Map<string, GridRowData>();\n private _entityInfo: EntityInfo | null = null;\n private _viewEntity: MJUserViewEntityExtended | null = null;\n private _columnStates: ColumnRuntimeState[] = [];\n private _sortState: DataGridSortState[] = [];\n private _filterState: FilterState[] = [];\n private _editingRowKey: string | null = null;\n private _editingField: string | null = null;\n private _pendingChanges: PendingChange[] = [];\n\n // Aggregate state\n private _aggregatesConfig: ViewGridAggregatesConfig | null = null;\n private _aggregateResults: AggregateResult[] = [];\n private _aggregateValues: Map<string, AggregateValue> = new Map();\n private _aggregatesLoading: boolean = false;\n\n // ========================================\n // Public Read-Only Properties\n // ========================================\n\n /**\n * The loaded view entity if using a stored view (ViewID, ViewName, or ViewEntity in Params).\n * Null for dynamic views or when using legacy entityName input.\n */\n public get ViewEntity(): MJUserViewEntityExtended | null {\n return this._viewEntity;\n }\n\n /**\n * The entity metadata for the current data source.\n * Available after Params is set and data is loaded.\n */\n public get EntityInfo(): EntityInfo | null {\n return this._entityInfo;\n }\n\n /**\n * True if using a dynamic view (EntityName only) rather than a stored view.\n * False if using ViewID, ViewName, ViewEntity in Params, or viewEntity input.\n */\n public get IsDynamicView(): boolean {\n // If we have a viewEntity (from either Params or input), it's a stored view\n if (this._viewEntity) return false;\n\n // Check Params for stored view indicators\n if (this._params) {\n return !this._params.ViewID && !this._params.ViewName && !this._params.ViewEntity;\n }\n\n // Legacy mode without viewEntity is considered dynamic\n return true;\n }\n\n // Loading state\n Loading: boolean = false;\n\n /** @deprecated Use {@link Loading}. */\n get loading(): boolean {\n return this.Loading;\n }\n /** @deprecated Use {@link Loading}. */\n set loading(value: boolean) {\n this.Loading = value;\n }\n private _errorMessage: string = '';\n /**\n * Raw technical error from the last failed load. Kept for callers and the\n * console; the error STATE shown to users leads with FriendlyErrorMessage.\n * Setting a non-empty value logs the technical detail.\n */\n get errorMessage(): string {\n return this._errorMessage;\n }\n set errorMessage(value: string) {\n this._errorMessage = value;\n if (value) {\n LogError(`EntityDataGrid data load failed: ${value}`);\n }\n }\n /**\n * Human-first message for the error empty-state. Users see what happened and\n * what to do; the raw error rides along as a de-emphasized parenthetical so a\n * screenshot still carries the detail support needs.\n */\n get FriendlyErrorMessage(): string {\n const friendly = 'The server may be busy or briefly unreachable — retrying usually fixes this.';\n return this._errorMessage ? `${friendly} (Detail: ${this._errorMessage})` : friendly;\n }\n totalRowCount: number = 0; // case-violation-ok-legacy-back-compat: the PascalCase name is already taken in this scope\n private _loadDataPromise: Promise<void> | null = null;\n\n // Cleanup\n private destroy$ = new Subject<void>();\n private refreshSubject = new Subject<void>();\n private statesSaveSubject = new Subject<void>();\n private statePersistSubject = new Subject<ViewGridState>();\n private userDefaultsPersistSubject = new Subject<ViewGridState>();\n\n // Persist state tracking\n private pendingStateToSave: ViewGridState | null = null;\n private isSavingState: boolean = false;\n\n /**\n * Pending state waiting to be persisted (for flushing on destroy).\n * Tracks state for both saved views and user defaults separately.\n */\n private _pendingViewStateToPersist: ViewGridState | null = null;\n private _pendingUserDefaultsToPersist: ViewGridState | null = null;\n\n /**\n * Flag to suppress state persistence during view transitions.\n * When true, emitGridStateChanged will not trigger persistence.\n * This prevents the old view's column state from being saved to the new view.\n */\n private _suppressPersist: boolean = false;\n\n /**\n * Dirty flag to track if grid state has actually been modified by user actions.\n * Only set to true when: column resize, column move, or sort change.\n * Reset to false: when view loads, after successful persistence.\n * This prevents emitting gridStateChanged events when no real change occurred.\n */\n private _isGridStateDirty: boolean = false;\n\n /**\n * Whether the current user can edit the view.\n * For dynamic views, always true (persists to user settings).\n * For saved views, depends on view ownership and permissions.\n */\n public get CanEditCurrentView(): boolean {\n if (this.IsDynamicView) {\n return true; // Dynamic views persist to user settings\n }\n return this._viewEntity?.UserCanEdit ?? false;\n }\n\n /** @deprecated Use {@link CanEditCurrentView}. */\n public get canEditCurrentView(): boolean {\n return this.CanEditCurrentView;\n }\n\n // Overflow menu state\n public ShowOverflowMenu: boolean = false;\n\n /** @deprecated Use {@link ShowOverflowMenu}. */\n public get showOverflowMenu(): boolean {\n return this.ShowOverflowMenu;\n }\n /** @deprecated Use {@link ShowOverflowMenu}. */\n public set showOverflowMenu(value: boolean) {\n this.ShowOverflowMenu = value;\n }\n\n // Export dialog state\n public ShowExportDialog: boolean = false;\n\n /** @deprecated Use {@link ShowExportDialog}. */\n public get showExportDialog(): boolean {\n return this.ShowExportDialog;\n }\n /** @deprecated Use {@link ShowExportDialog}. */\n public set showExportDialog(value: boolean) {\n this.ShowExportDialog = value;\n }\n public ExportDialogConfig: ExportDialogConfig | null = null;\n\n /** @deprecated Use {@link ExportDialogConfig}. */\n public get exportDialogConfig(): ExportDialogConfig | null {\n return this.ExportDialogConfig;\n }\n /** @deprecated Use {@link ExportDialogConfig}. */\n public set exportDialogConfig(value: ExportDialogConfig | null) {\n this.ExportDialogConfig = value;\n }\n\n constructor(\n private cdr: ChangeDetectorRef,\n private elementRef: ElementRef,\n private exportService: ExportService,\n private ngZone: NgZone\n ) {\n super();}\n\n // ========================================\n // Lifecycle Hooks\n // ========================================\n\n async ngOnInit() {\n this.setupRefreshDebounce();\n this.setupStatePersistDebounce();\n this.setupUserDefaultsPersistDebounce();\n this.updateAgRowSelection();\n }\n\n ngOnDestroy(): void {\n // Flush any pending state persistence immediately before destroying\n this.EnsurePendingChangesSaved();\n\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n /**\n * Immediately persists any pending state changes without waiting for debounce.\n * Called on component destroy to ensure changes aren't lost.\n * Also exposed publicly so parent components can flush before view/entity switches.\n */\n public EnsurePendingChangesSaved(): void {\n // Flush pending view state\n if (this._pendingViewStateToPersist && this._viewEntity) {\n this.persistGridStateToView(this._pendingViewStateToPersist);\n this._pendingViewStateToPersist = null;\n }\n\n // Flush pending user defaults\n if (this._pendingUserDefaultsToPersist && this._entityInfo) {\n this.persistUserDefaultGridState(this._pendingUserDefaultsToPersist);\n this._pendingUserDefaultsToPersist = null;\n }\n }\n\n // ========================================\n // Setup Methods\n // ========================================\n\n private setupRefreshDebounce(): void {\n this.refreshSubject.pipe(\n debounceTime(this._refreshDebounce),\n takeUntil(this.destroy$)\n ).subscribe(() => {\n this.loadData(true);\n });\n }\n\n private setupStatePersistDebounce(): void {\n this.statePersistSubject.pipe(\n debounceTime(this._statePersistDebounce),\n takeUntil(this.destroy$)\n ).subscribe((state) => {\n this.persistGridStateToView(state);\n });\n }\n\n private setupUserDefaultsPersistDebounce(): void {\n this.userDefaultsPersistSubject.pipe(\n debounceTime(this._statePersistDebounce),\n takeUntil(this.destroy$)\n ).subscribe((state) => {\n this.persistUserDefaultGridState(state);\n });\n }\n\n /**\n * Called when Params input changes. Handles loading view entity metadata\n * and triggering data load if allowed.\n */\n private async onParamsChanged(): Promise<void> {\n if (!this._params) {\n // Params cleared - reset view entity\n this._viewEntity = null;\n return;\n }\n\n // Suppress persistence during view transition to prevent old view's state\n // from being saved to the new view's storage\n this._suppressPersist = true;\n\n // Reset dirty flag - no changes have been made to the new view yet\n this._isGridStateDirty = false;\n\n // Reset internal grid state when params change - this ensures we don't\n // carry over column/sort settings from a previous view when switching views\n this._gridState = null;\n this._sortState = [];\n\n // Reset aggregates when switching views - don't carry over from previous view\n this._aggregatesConfig = null;\n this._aggregateResults = [];\n this._aggregateValues.clear();\n\n // NOTE: Do NOT reset _allowLoad here. When a parent (e.g., entity-viewer) explicitly\n // sets [AllowLoad]=\"false\" to manage data loading itself, resetting it to true here\n // causes a duplicate RunView because the Params setter fires before the AllowLoad\n // binding in Angular's template binding order.\n\n try {\n // If using a stored view, load the view entity first\n if (this._params.ViewEntity) {\n // ViewEntity was provided directly\n this._viewEntity = this._params.ViewEntity as MJUserViewEntityExtended;\n this._entityInfo = this.getEntityInfoFromViewEntity(this._viewEntity);\n this.applyViewEntitySettings();\n } else if (this._params.ViewID) {\n // Load view entity by ID from engine\n const cachedView = this.getViewFromEngine(this._params.ViewID);\n if (cachedView) {\n this._viewEntity = cachedView;\n } else {\n // View not in cache - use ViewInfo (which also uses engine)\n this._viewEntity = await ViewInfo.GetViewEntity(this._params.ViewID);\n }\n this._entityInfo = this.getEntityInfoFromViewEntity(this._viewEntity);\n this.applyViewEntitySettings();\n } else if (this._params.ViewName) {\n // Load view entity by name from engine\n const cachedView = this.getViewFromEngineByName(this._params.ViewName);\n if (cachedView) {\n this._viewEntity = cachedView;\n } else {\n // View not in cache - use ViewInfo (which also uses engine)\n this._viewEntity = await ViewInfo.GetViewEntityByName(this._params.ViewName);\n }\n this._entityInfo = this.getEntityInfoFromViewEntity(this._viewEntity);\n this.applyViewEntitySettings();\n } else if (this._params.EntityName) {\n // Dynamic view - just get entity metadata\n this._viewEntity = null;\n const md = this.ProviderToUse;\n this._entityInfo = md.Entities.find(e => e.Name === this._params!.EntityName) || null;\n\n // Reset columns to force regeneration from metadata when switching to dynamic view.\n // This ensures we don't carry over column config from a previous saved view.\n //\n // ...but ONLY when those columns were themselves derived from a view or from metadata. A\n // list the HOST passed via `[Columns]` must survive: `Params` is re-assigned on every filter\n // change, so wiping unconditionally meant a page's declared columns were destroyed the first\n // time the user touched a filter — the grid silently reverted to metadata-generated columns\n // (entity display names, estimated widths, `width: 'auto'` lost). It presents as \"my column\n // config works on load and then randomly stops\", which is near-impossible to trace back here.\n if (!this._columnsFromHost) {\n this._columns = [];\n }\n\n // For dynamic views, try to load user's saved defaults\n if (this._entityInfo && this._autoPersistState) {\n this.loadUserDefaultGridState(this._entityInfo.Name);\n }\n }\n\n // The entity is only known now, and `[Columns]` is commonly bound BEFORE `[Params]` — so this\n // is the first point at which a host's field names can be checked against real metadata.\n // Idempotent, so the repeat on every params change costs nothing.\n if (this.canonicalizeHostColumns()) {\n this.initializeColumnStates();\n }\n\n // Generate columns if not already set\n if (this._columns.length === 0 && this._entityInfo) {\n this.generateColumnsFromMetadata();\n }\n\n // Rebuild AG Grid column definitions to reflect the new view's settings\n this.buildAgColumnDefs();\n\n // If the parent already supplied external [Data] BEFORE [Params] resolved the entity,\n // the earlier processData() ran with a null _entityInfo and produced rows with no field\n // values (empty cells). This happens when the grid is dynamic-mounted by the view-type\n // plug-in host, where Angular applies the batched inputs in template order ([Data] before\n // [Params]). Now that _entityInfo + columns exist, re-map the rows so values render.\n if (this._useExternalData && this._entityInfo) {\n this.processData();\n }\n\n // Load data if auto-refresh is enabled and parent hasn't disabled loading.\n // Defer the AllowLoad check to a microtask: Angular applies @Input setters synchronously\n // in template order, and [Params] is commonly bound before [AllowLoad] (see the wrapper in\n // explorer-entity-data-grid). Reading _allowLoad synchronously here would see its default\n // (true) before a later [AllowLoad]=\"false\" binding lands, causing collapsed/deferred panels\n // to fire a RunView anyway. Yielding lets all sibling input setters apply first so the check\n // reflects the final AllowLoad value.\n if (this._autoRefreshOnParamsChange) {\n await Promise.resolve();\n if (this._allowLoad) {\n await this.loadData(false);\n }\n }\n } catch (error) {\n this.errorMessage = error instanceof Error ? error.message : 'Failed to load view';\n this.cdr.detectChanges();\n } finally {\n // Re-enable persistence now that the new view is fully loaded\n this._suppressPersist = false;\n // Entity is resolved by now — self-load its actions if auto-load is enabled.\n void this.maybeAutoLoadEntityActions();\n void this.resolveCommunicationSupport();\n }\n }\n\n /**\n * Gets a view from the UserViewEngine cache by ID.\n * Returns undefined if not found or engine not initialized.\n */\n private getViewFromEngine(viewId: string): MJUserViewEntityExtended | undefined {\n try {\n return UserViewEngine.Instance.GetViewById(viewId);\n } catch {\n // Engine may not be initialized yet\n return undefined;\n }\n }\n\n /**\n * Gets a view from the UserViewEngine cache by name.\n * Returns undefined if not found or engine not initialized.\n */\n private getViewFromEngineByName(viewName: string): MJUserViewEntityExtended | undefined {\n try {\n return UserViewEngine.Instance.GetViewByName(viewName);\n } catch {\n // Engine may not be initialized yet\n return undefined;\n }\n }\n\n /**\n * Gets EntityInfo from a ViewEntity with multiple fallback strategies.\n * Priority: 1) ViewEntityInfo property (set by Load)\n * 2) Entity name lookup (virtual field)\n * 3) EntityID lookup\n * Returns null if entity cannot be determined.\n */\n private getEntityInfoFromViewEntity(viewEntity: MJUserViewEntityExtended | null): EntityInfo | null {\n if (!viewEntity) return null;\n\n // First try: ViewEntityInfo is the preferred source (set by MJUserViewEntityExtended.Load)\n if (viewEntity.ViewEntityInfo) {\n return viewEntity.ViewEntityInfo;\n }\n\n const md = this.ProviderToUse;\n\n // Second try: Look up by Entity name (virtual field that returns entity name)\n if (viewEntity.Entity) {\n const entityByName = md.Entities.find(e => e.Name === viewEntity.Entity);\n if (entityByName) {\n return entityByName;\n }\n }\n\n // Third try: Look up by EntityID\n if (viewEntity.EntityID) {\n const entityById = md.Entities.find(e => UUIDsEqual(e.ID, viewEntity.EntityID));\n if (entityById) {\n return entityById;\n }\n }\n\n console.warn(`[EntityDataGrid] Could not determine entity for view \"${viewEntity.Name}\" (ID: ${viewEntity.ID})`);\n return null;\n }\n\n /**\n * Loads user's saved grid state defaults for a dynamic view.\n * Uses UserInfoEngine to retrieve settings stored with key format: \"default-view-setting/{entityName}\"\n */\n private loadUserDefaultGridState(entityName: string): void {\n try {\n const settingKey = `default-view-setting/${entityName}`;\n const savedState = UserInfoEngine.Instance.GetSetting(settingKey);\n\n if (savedState) {\n const gridState = JSON.parse(savedState) as ViewGridState;\n\n // Only apply if not already set via props (props take precedence).\n //\n // `Columns` is one of those props. It used to be missed here, and the effect was severe but\n // silent: this default is saved per USER per ENTITY from the generic entity browser, so the\n // moment anyone tweaked columns while browsing an entity there, EVERY bespoke page grid over\n // that same entity silently adopted those columns — overriding the page author's explicit\n // `[Columns]` titles, widths and order, for that user only. Symptoms look like anything but\n // the cause: a page's declared column titles never appear, widths edited in code have no\n // effect, and it reproduces for one user and not another.\n //\n // A page that hands the grid an explicit column list has stated exactly what it wants; a\n // user's entity-browser preference is not an instruction about that page. An explicitly\n // passed `[GridState]` still wins, as it always did — that is a deliberate act by the host.\n if (!this._gridState && !this._columnsFromHost && gridState.columnSettings?.length) {\n // Validate column settings against the current entity's fields to prevent\n // stale columns from a previously viewed entity leaking into the query.\n // This can happen when user defaults were saved for a different view of\n // the same entity with different columns, or when settings are mismatched.\n const validColumns = this.filterToExistingFields(gridState.columnSettings, col => col.Name);\n\n if (validColumns.length > 0) {\n this._gridState = {\n columnSettings: validColumns,\n sortSettings: gridState.sortSettings || [],\n aggregates: gridState.aggregates\n };\n this._gridStateFromUserDefault = true;\n }\n }\n\n // Apply sort state if not already set — validate sort fields exist on current entity\n if (this._sortState.length === 0 && gridState.sortSettings?.length) {\n const validSorts = this.filterToSortableFields(gridState.sortSettings, s => s.field);\n this._sortState = validSorts.map((s, index) => ({\n field: s.field,\n direction: s.dir,\n index\n }));\n }\n\n // Apply aggregates from user defaults if present and not already set\n if (gridState.aggregates && !this._aggregatesConfig) {\n this._aggregatesConfig = gridState.aggregates;\n }\n }\n } catch (error) {\n console.error('[entity-data-grid] Failed to load user default grid state:', error);\n }\n }\n\n /**\n * Persists the current grid state as user defaults for a dynamic view.\n * Uses UserInfoEngine to store settings with key format: \"default-view-setting/{entityName}\"\n */\n private async persistUserDefaultGridState(state: ViewGridState): Promise<void> {\n if (!this._entityInfo) {\n this._pendingUserDefaultsToPersist = null;\n return;\n }\n\n try {\n const settingKey = `default-view-setting/${this._entityInfo.Name}`;\n const gridStateJson: ViewGridState = {\n columnSettings: state.columnSettings,\n sortSettings: state.sortSettings,\n aggregates: state.aggregates\n };\n\n await UserInfoEngine.Instance.SetSetting(settingKey, JSON.stringify(gridStateJson));\n // Clear pending state and reset dirty flag after successful save\n this._pendingUserDefaultsToPersist = null;\n this._isGridStateDirty = false;\n } catch (error) {\n console.error('[entity-data-grid] Failed to persist user default grid state:', error);\n }\n }\n\n /**\n * Applies settings from a loaded ViewEntity (column configuration, sort state, etc.)\n *\n * Precedence rules (highest to lowest):\n * 1. Props passed directly (gridState, orderBy, etc.) - always take precedence\n * 2. Settings from ViewEntity.GridState (persisted column/sort configuration)\n * 3. Settings from ViewEntity.SortInfo (legacy sort configuration)\n * 4. Auto-generated defaults from entity metadata\n */\n private applyViewEntitySettings(): void {\n if (!this._viewEntity) return;\n\n // Only apply grid state from view entity if not already set via props\n // (gridState input takes precedence)\n if (!this._gridState && this._viewEntity.GridState) {\n const gridState = this._viewEntity.GridStateObject;\n if (gridState) {\n if (gridState.columnSettings?.length) {\n this._gridState = {\n columnSettings: gridState.columnSettings,\n sortSettings: gridState.sortSettings || [],\n aggregates: gridState.aggregates\n };\n }\n // Apply aggregates from view's GridState if present\n if (gridState.aggregates && !this._aggregatesConfig) {\n this._aggregatesConfig = gridState.aggregates;\n }\n }\n }\n\n // Only apply sort state if:\n // 1. No explicit OrderBy in Params\n // 2. No sort already set via gridState (either prop or from view)\n const orderByValue = this._params?.OrderBy;\n const hasExplicitOrderBy = orderByValue != null && (typeof orderByValue === 'string' ? orderByValue.trim().length > 0 : !!orderByValue.default);\n const hasSortFromGridState = this._gridState?.sortSettings && this._gridState.sortSettings.length > 0;\n\n if (!hasExplicitOrderBy && !hasSortFromGridState && this._sortState.length === 0) {\n const sortInfo = this._viewEntity.ViewSortInfo;\n if (sortInfo?.length) {\n // Validate sort fields exist on the current entity to prevent stale\n // sort fields from a previously viewed entity leaking into ORDER BY\n const validSorts = this.filterToSortableFields(sortInfo, s => s.field);\n this._sortState = validSorts.map((s, index) => ({\n field: s.field,\n direction: (typeof s.direction === 'string' ? s.direction.toLowerCase() : s.direction === 2 ? 'desc' : 'asc') === 'desc' ? 'desc' : 'asc',\n index\n }));\n }\n } else if (!hasExplicitOrderBy && hasSortFromGridState) {\n // Apply GridState sort settings to _sortState so the initial data load\n // includes the correct ORDER BY clause. Without this, _sortState remains\n // empty and buildOrderByClause() returns '' — causing the SQL to omit\n // ORDER BY on the first page load.\n // Validate sort fields exist on the current entity\n const validSorts = this.filterToSortableFields(this._gridState!.sortSettings!, s => s.field);\n this._sortState = validSorts.map((sortSetting, index) => ({\n field: sortSetting.field,\n direction: sortSetting.dir,\n index: index\n }));\n }\n }\n\n private onGridStateChanged(): void {\n if (this._gridState && this._entityInfo) {\n // Suppress sort events for the entire operation. AG Grid fires sortChanged\n // asynchronously when columnDefs are rebuilt (clears sort model) and when\n // applyColumnState re-applies sort. Without this, those async events leak\n // through to the parent (entity-viewer) and trigger redundant unsorted reloads.\n // setTimeout clears the flag after AG Grid's async events have been processed.\n this.suppressSortEvents = true;\n\n this.buildAgColumnDefs();\n\n // Update AG Grid with new column definitions to apply header styles\n if (this.gridApi && !this.gridApi.isDestroyed()) {\n this.gridApi.setGridOption('columnDefs', this.AgColumnDefs);\n // Refresh header to apply new header styles\n this.gridApi.refreshHeader();\n }\n\n // Apply sort if present - support multi-column sort\n // Validate sort fields against current entity to prevent stale sort from a previous entity\n if (this._gridState.sortSettings?.length && this.gridApi && !this.gridApi.isDestroyed()) {\n const validSorts = this.filterToSortableFields(this._gridState.sortSettings, s => s.field);\n this._sortState = validSorts.map((sortSetting, index) => ({\n field: sortSetting.field,\n direction: sortSetting.dir,\n index: index\n }));\n // Apply directly — suppressSortEvents is already true for the whole operation\n if (this.gridApi && !this.gridApi.isDestroyed()) {\n const currentColumnState = this.gridApi.getColumnState();\n if (currentColumnState) {\n const columnState = currentColumnState.map(col => {\n const sort = this._sortState.find(s => s.field === col.colId);\n return {\n ...col,\n sort: sort ? sort.direction : null,\n sortIndex: sort ? sort.index : null\n };\n });\n this.gridApi.applyColumnState({ state: columnState });\n }\n }\n }\n\n // Apply aggregates from GridState if present and fetch their values\n if (this._gridState.aggregates) {\n this._aggregatesConfig = this._gridState.aggregates;\n // Fetch aggregate values when gridState aggregates change\n this.RefreshAggregates();\n }\n\n // Clear suppression after AG Grid's async events have been processed.\n // setTimeout(0) fires after microtasks and rAF, catching all async sort events.\n setTimeout(() => { this.suppressSortEvents = false; }, 0);\n }\n }\n\n /**\n * Fetch aggregate values without reloading data.\n * Used when gridState changes and includes new aggregate config.\n * This runs a RunView with MaxRows=0 to get only aggregate results.\n */\n public async RefreshAggregates(): Promise<void> {\n const effectiveAggConfig = this.effectiveAggregatesConfig;\n if (!effectiveAggConfig?.expressions?.length) {\n this._aggregateResults = [];\n this._aggregateValues.clear();\n this._aggregatesLoading = false;\n this.cdr.detectChanges();\n return;\n }\n\n // Need entity info to run the query\n if (!this._entityInfo) {\n return;\n }\n\n this._aggregatesLoading = true;\n this.cdr.detectChanges();\n\n try {\n // Build aggregate expressions\n const aggregateExpressions: AggregateExpression[] = effectiveAggConfig.expressions\n .filter(agg => agg.enabled !== false && agg.expression)\n .map(agg => ({\n expression: agg.expression,\n alias: agg.id || agg.label || agg.expression\n }));\n\n if (aggregateExpressions.length === 0) {\n this._aggregateResults = [];\n this._aggregateValues.clear();\n this._aggregatesLoading = false;\n this.cdr.detectChanges();\n return;\n }\n\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n\n // Build the ExtraFilter from params or view entity\n let extraFilter: string | undefined;\n if (this._params?.ExtraFilter) {\n extraFilter = typeof this._params.ExtraFilter === 'string' ? this._params.ExtraFilter : this._params.ExtraFilter.default;\n } else if (this._viewEntity?.WhereClause) {\n extraFilter = this._viewEntity.WhereClause;\n }\n\n const result = await rv.RunView({\n EntityName: this._entityInfo.Name,\n MaxRows: 0, // Only get aggregates, no row data\n ExtraFilter: extraFilter,\n Aggregates: aggregateExpressions\n });\n\n if (result.Success) {\n this.ngZone.run(() => {\n this.processAggregateResults(result.AggregateResults, result.AggregateExecutionTime);\n });\n } else {\n this.ngZone.run(() => {\n this._aggregatesLoading = false;\n this.cdr.detectChanges();\n });\n }\n } catch (error) {\n console.error('[EntityDataGrid] Error fetching aggregates:', error);\n this.ngZone.run(() => {\n this._aggregatesLoading = false;\n this.cdr.detectChanges();\n });\n }\n }\n\n /** @deprecated Use {@link RefreshAggregates}. */\n public async refreshAggregates(): Promise<void> {\n return this.RefreshAggregates();\n }\n\n private onFilterTextChanged(): void {\n // Rebuild column defs to update cell renderers with new filter text\n this.buildAgColumnDefs();\n\n // Update AG Grid with new column definitions and refresh cells\n if (this.gridApi) {\n // Update the column definitions in AG Grid\n this.gridApi.setGridOption('columnDefs', this.AgColumnDefs);\n // Force refresh all cells to apply new highlighting\n this.gridApi.refreshCells({ force: true });\n // Apply AG Grid quick filter to actually filter rows client-side\n this.gridApi.setGridOption('quickFilterText', this._filterText || undefined);\n }\n }\n\n private generateColumnsFromMetadata(): void {\n if (!this._entityInfo) return;\n\n this._columns = this._entityInfo.Fields\n .filter(f => this.shouldShowField(f))\n .map(field => ({\n field: field.Name,\n title: field.DisplayName || field.Name,\n type: this.mapFieldTypeToGridType(field.Type),\n sortable: true,\n filterable: true,\n visible: true,\n width: this.estimateColumnWidth(field)\n }));\n\n this.initializeColumnStates();\n this.buildAgColumnDefs();\n }\n\n /**\n * Determines if a field should be shown by default when no saved view exists.\n * This logic is aligned with MJUserViewEntity.SetDefaultsFromEntity() to ensure\n * consistent column visibility between initial load and saved views.\n */\n /**\n * NOTE: field security is deliberately NOT applied here. This decides the column MODEL, and\n * the user's saved column preference is captured from what ends up rendered — so filtering a\n * denied field out at this level writes a temporary restriction into a durable preference,\n * and the column never returns when access is restored. The denial is applied where columns\n * are RENDERED ({@link buildAgColumnDefs}), and {@link buildCurrentGridState} carries the\n * hidden entries forward so the saved preference stays complete.\n */\n private shouldShowField(field: EntityFieldInfo): boolean {\n // Always exclude system fields\n if (field.Name.startsWith('__mj_')) return false;\n\n // Always exclude UUID primary keys (they're not useful to display)\n if (field.IsPrimaryKey && field.SQLFullType?.toLowerCase() === 'uniqueidentifier') {\n return false;\n }\n\n // Only show fields explicitly marked as DefaultInView\n // This aligns with MJUserViewEntity.SetDefaultsFromEntity() behavior\n // ensuring users see the same columns before and after saving a view\n return field.DefaultInView === true;\n }\n\n /**\n * Field names field-level security denies the current user READ on, lowercased — empty when\n * there is no entity or no resolved user, when the entity has field security switched off,\n * or when nothing is denied, so callers can treat it as \"nothing to filter\".\n *\n * Deliberately the BULK primitive: `EntityInfo.GetDeniedReadFields` documents that the\n * per-field form costs `fields x rows` aggregations when called inside a loop, and every\n * caller here is a loop over fields or saved settings.\n */\n private deniedReadFieldsFor(entity: EntityInfo | null | undefined): Set<string> {\n const user = this.ProviderToUse?.CurrentUser;\n if (!entity || !user) {\n return new Set<string>();\n }\n return entity.GetDeniedReadFields(user);\n }\n\n /**\n * Drops saved settings naming a field that no longer EXISTS on the current entity — stale\n * state from another view, or a column the schema lost.\n *\n * Deliberately does NOT drop denied fields. A denial is temporary and reversible, so removing\n * the column here would launder a restriction into the user's saved column PREFERENCE and the\n * column would not return when access was restored. Field security is applied where the\n * columns are RENDERED ({@link buildAgColumnDefs}), which hides the column while leaving the\n * preference that mentions it intact.\n */\n private filterToExistingFields<T>(items: T[], nameOf: (item: T) => string): T[] {\n const entity = this._entityInfo;\n if (!entity) {\n return items;\n }\n return items.filter(item => entity.Fields.some(f => f.Name === nameOf(item)));\n }\n\n /**\n * The same existence check, plus dropping fields the user cannot read — for SORT settings\n * only. A denied field in ORDER BY is rejected outright by the server, so unlike a column it\n * cannot be carried along harmlessly; the query would fail rather than degrade. A user also\n * cannot meaningfully sort by a column they cannot see.\n */\n private filterToSortableFields<T>(items: T[], nameOf: (item: T) => string): T[] {\n const denied = this.deniedReadFieldsFor(this._entityInfo);\n return this.filterToExistingFields(items, nameOf)\n .filter(item => !denied.has(nameOf(item)?.trim().toLowerCase()));\n }\n\n /**\n * Estimate an appropriate column width based on field metadata.\n * Takes into account: metadata DefaultColumnWidth, header text length, data type, and field patterns.\n */\n private estimateColumnWidth(field: EntityFieldInfo): number {\n // Priority 1: Use metadata-defined width if set\n if (field.DefaultColumnWidth && field.DefaultColumnWidth > 0) {\n return field.DefaultColumnWidth;\n }\n\n // Calculate minimum width needed for header text\n const headerText = field.DisplayName || field.Name;\n const headerWidth = this.calculateHeaderWidth(headerText);\n\n // Calculate estimated data width based on field type\n const dataWidth = this.calculateDataWidth(field);\n\n // Use the larger of header or data width, with bounds\n const estimatedWidth = Math.max(headerWidth, dataWidth);\n\n // Apply min/max bounds: minimum 80px, maximum 350px\n return Math.max(Math.min(estimatedWidth, 350), 80);\n }\n\n /**\n * Calculate minimum width needed to display header text without truncation.\n */\n private calculateHeaderWidth(text: string): number {\n // Average char width ~7.5px for typical grid font\n const charWidth = 7.5;\n // Padding for sort icon and cell padding\n const sortIconPadding = 24;\n const cellPadding = 16;\n return Math.ceil(text.length * charWidth + sortIconPadding + cellPadding);\n }\n\n /**\n * Calculate estimated data width based on field type and patterns.\n */\n private calculateDataWidth(field: EntityFieldInfo): number {\n const fieldNameLower = field.Name.toLowerCase();\n const tsType = field.TSType;\n\n // Fixed-width types\n if (tsType === 'boolean') return 90;\n if (tsType === 'Date') return 130;\n\n // Numeric fields - compact\n if (tsType === 'number') {\n if (fieldNameLower.includes('year') || fieldNameLower.includes('age')) return 80;\n if (fieldNameLower.includes('amount') || fieldNameLower.includes('price') ||\n fieldNameLower.includes('cost') || fieldNameLower.includes('total')) return 130;\n return 100;\n }\n\n // ID fields (typically UUIDs shown truncated or as links)\n if (fieldNameLower.endsWith('id') && field.Length <= 50) return 100;\n\n // Email - needs more space\n if (fieldNameLower.includes('email')) return 220;\n\n // Phone numbers\n if (fieldNameLower.includes('phone') || fieldNameLower.includes('mobile') || fieldNameLower.includes('fax')) return 140;\n\n // Description fields - give them adequate room (increased from 150)\n if (fieldNameLower.includes('description')) return 250;\n\n // Name fields - medium width\n if (fieldNameLower.includes('name') || fieldNameLower.includes('title')) {\n if (fieldNameLower === 'firstname' || fieldNameLower === 'lastname' ||\n fieldNameLower === 'first name' || fieldNameLower === 'last name') return 130;\n return 180;\n }\n\n // Location fields\n if (fieldNameLower.includes('city')) return 130;\n if (fieldNameLower.includes('state') || fieldNameLower.includes('country')) return 110;\n if (fieldNameLower.includes('zip') || fieldNameLower.includes('postal')) return 100;\n if (fieldNameLower.includes('address')) return 220;\n\n // Date-like strings\n if (fieldNameLower.includes('date') || fieldNameLower.includes('time')) return 130;\n\n // Status/Type/Category fields\n if (fieldNameLower.includes('status') || fieldNameLower.includes('type') ||\n fieldNameLower.includes('category') || fieldNameLower.includes('mode')) return 130;\n\n // Code/abbreviation fields\n if (fieldNameLower.includes('code') || fieldNameLower.includes('abbr')) return 110;\n\n // Long text fields - give them more room (nvarchar(max) has Length < 0)\n if (field.Length < 0) return 250; // nvarchar(max)\n if (field.Length > 500) return 220;\n if (field.Length > 200) return 200;\n\n // Default: estimate based on field length with reasonable bounds\n const estimatedChars = Math.min(field.Length || 50, 40);\n return Math.max(estimatedChars * 6 + 24, 100);\n }\n\n private mapFieldTypeToGridType(fieldType: string): 'string' | 'number' | 'boolean' | 'date' | 'datetime' {\n switch (fieldType.toLowerCase()) {\n case 'int':\n case 'bigint':\n case 'smallint':\n case 'tinyint':\n case 'decimal':\n case 'numeric':\n case 'float':\n case 'real':\n case 'money':\n case 'smallmoney':\n return 'number';\n case 'bit':\n return 'boolean';\n case 'date':\n return 'date';\n case 'datetime':\n case 'datetime2':\n case 'smalldatetime':\n case 'datetimeoffset':\n return 'datetime';\n default:\n return 'string';\n }\n }\n\n private initializeColumnStates(): void {\n this._columnStates = this._columns.map((config, index) => ({\n config,\n computedWidth: typeof config.width === 'number' ? config.width : 150,\n sortDirection: config.sortDirection || 'none',\n sortIndex: config.sortIndex || 0,\n filterValue: undefined,\n visible: config.visible !== false,\n order: index\n }));\n }\n\n // ========================================\n // AG Grid Column Building\n // ========================================\n\n private buildAgColumnDefs(): void {\n // A grid state whose settings name NONE of this entity's fields is not a column preference —\n // it is evidence the state belongs to a different entity. `_gridState` outlives an entity\n // change when one viewer is rebound from entity A to entity B (`EntityName` is a rebindable\n // input), every setting is then dropped for naming a field B does not have, and taking that\n // empty array as the answer rendered a grid with no header and no cells while the rows loaded\n // and the row count read correctly — no error, no warning. So treat an empty result as NO\n // usable state and fall through to the sources that describe the entity actually in hand.\n // This is the floor `generateAgColumnDefs()` already has for an entity with no DefaultInView\n // fields; the grid-state branch was the one path without one.\n //\n // Only a TOTAL miss is treated this way. One surviving setting is a real preference — a saved\n // view whose entity has since lost a field — and discarding it would throw away the user's\n // columns to guess at state that is legitimately theirs.\n const fromGridState = (this._gridState?.columnSettings?.length && this._entityInfo)\n ? this.buildAgColumnDefsFromGridState(this._gridState.columnSettings)\n : [];\n\n if (fromGridState.length > 0) {\n this.AgColumnDefs = fromGridState;\n } else if (this._columns.length > 0) {\n this.AgColumnDefs = this._columns.map(col => this.mapColumnConfigToColDef(col));\n } else if (this._entityInfo) {\n this.AgColumnDefs = this.generateAgColumnDefs(this._entityInfo);\n } else {\n this.AgColumnDefs = [];\n }\n\n // Field security, applied to EVERY branch above rather than inside each one. This is the\n // only point all three column sources meet: a saved view's `columnSettings` (the usual path\n // in the entity browser) and a host-supplied `[Columns]` array both bypass the metadata\n // filter in shouldShowField(), so gating only there leaves the denied column rendered in\n // exactly the case that matters most. Runs BEFORE the row-number and filler columns are\n // appended — those are synthetic and have no entity field to check.\n\n const deniedReadFields = this.deniedReadFieldsFor(this._entityInfo);\n if (deniedReadFields.size > 0) {\n this.AgColumnDefs = this.AgColumnDefs.filter(\n c => !c.field || !deniedReadFields.has(c.field.trim().toLowerCase())\n );\n }\n\n // Add row number column if enabled\n if (this._showRowNumbers && this.AgColumnDefs.length > 0) {\n this.AgColumnDefs.unshift({\n headerName: '#',\n field: ROW_NUMBER_FIELD,\n width: 60,\n minWidth: 50,\n maxWidth: 80,\n sortable: false,\n resizable: false,\n valueGetter: (params) => params.node ? params.node.rowIndex! + 1 : ''\n });\n }\n\n if (this._fillWidth && this.AgColumnDefs.length > 0) {\n this.AgColumnDefs.push(this.buildFillerColumnDef());\n }\n }\n\n /**\n * An inert trailing column whose only job is to soak up leftover row width so the row backgrounds,\n * banding and horizontal rules reach the container's edge instead of stopping mid-card.\n *\n * Why a filler rather than stretching a real column: a real column that grows to absorb slack is\n * either a short/numeric one — whose value then sits marooned in a sea of empty cell (or, if\n * right-aligned, drifts far from its neighbours) — or a text column blown out well past the width\n * its content needs, which reads as one enormous mostly-empty column. Neither is what \"the table\n * should reach the edge\" means. Growing something DELIBERATELY empty moves nothing and stretches\n * nothing: every real column keeps the width it earned.\n *\n * It is styled to disappear as a column (no header text, no left rule, no sort/menu/resize/move\n * affordances) so it reads as table background, not as an empty field the user should wonder about.\n */\n /**\n * Make a column absorb leftover row width, but only up to the ceiling the page gave it.\n *\n * The weighting is the point. Both this column and the filler are flex, and AG Grid splits leftover\n * space between flex columns in proportion to their weights — so an even 1:1 split would hand this\n * column only half the slack no matter how much it needed (that was a real bug: a memo column and\n * the filler each took ~160px of a 320px remainder). A dominant weight makes the real column the\n * FIRST claimant: it grows until it hits its own `maxWidth`, and only what it cannot use overflows\n * to the filler. AG Grid enforces `maxWidth` on flex columns, which is what makes the hand-off work.\n *\n * `maxWidth` is therefore load-bearing, not decoration — it is what stops \"fill the row\" from\n * becoming \"one enormous mostly-empty column\". It matters most for a RIGHT-ALIGNED column, where an\n * over-wide column pushes its values away from the columns they are read against; cap such a column\n * near its widest value and the drift cannot happen. A `width: 'auto'` column with no `maxWidth`\n * takes all remaining width, which is only the right call for a genuinely long free-text column.\n */\n private registerAutoWidthColumn(colDef: ColDef): void {\n colDef.colId ??= colDef.field;\n colDef.flex = AUTO_WIDTH_FLEX_WEIGHT;\n }\n\n /**\n * Field names from a host-supplied `[Columns]`, so the query fetches what the host chose to show.\n * Empty when the columns were generated from metadata or a view — those origins are already\n * reflected in the grid state / DefaultInView that `computeFieldsList` consults.\n *\n * Includes columns declared `visible: false`. Hiding a column is a DISPLAY decision, not a\n * statement that the data isn't wanted: this grid deliberately keeps hidden columns in its column\n * model as col defs with `hide: true` rather than omitting them (see `buildAgColumnDefsFromGridState`),\n * precisely so a saved `[GridState]` that marks one visible can bring it back. A column that\n * reappears with no data behind it renders every cell empty, which reads as a data bug rather\n * than a missing SELECT. The cost of the alternative is one column in the query that the host\n * itself asked for by name.\n */\n private hostColumnFieldNames(): string[] {\n if (!this._columnsFromHost) return [];\n return this._columns.map(c => c.field);\n }\n\n /**\n * Put host-supplied `[Columns]` into the entity's own field spelling — see\n * {@link canonicalizeColumnFields} for why the spelling is load-bearing rather than cosmetic.\n * Returns true when something actually changed, so the caller can rebuild derived state.\n *\n * Deliberately the ONLY place this normalisation happens. Everything downstream — the colDef's\n * `field` and hence its `colId`, `_columnStates`, captured grid state, sort settings, the export\n * column list, the fetched field list — reads `_columns`, so fixing it here keeps all of them\n * speaking one vocabulary instead of each needing its own case-insensitive comparison.\n */\n private canonicalizeHostColumns(): boolean {\n if (!this._columnsFromHost || !this._entityInfo || this._columns.length === 0) {\n return false;\n }\n const next = CanonicalizeColumnFields(this._entityInfo, this._columns);\n const changed = next.some((col, i) => col !== this._columns[i]);\n if (changed) {\n this._columns = next;\n }\n return changed;\n }\n\n private buildFillerColumnDef(): ColDef {\n return {\n colId: FILLER_COLUMN_ID,\n headerName: '',\n flex: 1,\n // No floor: this column is the one thing that SHOULD yield when real columns need the room —\n // it shrinks to nothing and the grid falls back to horizontal scrolling, exactly as before.\n minWidth: 0,\n sortable: false,\n resizable: false,\n suppressMovable: true,\n // Never let a filler participate in anything a real column does.\n suppressHeaderMenuButton: true,\n suppressColumnsToolPanel: true,\n lockPosition: 'right',\n valueGetter: () => '',\n headerClass: 'mj-grid-filler-header',\n cellClass: 'mj-grid-filler-cell'\n };\n }\n\n private buildAgColumnDefsFromGridState(columnSettings: ViewGridColumnSetting[]): ColDef[] {\n if (!this._entityInfo) return [];\n\n const sortedColumns = [...columnSettings].sort((a, b) =>\n (a.orderIndex ?? 0) - (b.orderIndex ?? 0)\n );\n\n const cols: ColDef[] = [];\n\n for (const colConfig of sortedColumns) {\n const field = this._entityInfo.Fields.find(f =>\n f.Name.toLowerCase() === colConfig.Name.toLowerCase()\n );\n\n if (!field) continue;\n\n // A saved grid state carries pixel widths only, so restoring one would otherwise drop the\n // `width: 'auto'` fill declared by the host page — the dead-space-on-the-right bug would come\n // back the moment a user resized any column and the state was persisted. Treat 'auto' as a\n // LAYOUT decision owned by the page author, not a user preference the saved state overrides:\n // everything else (order, visibility, the other columns' widths) still comes from the state.\n const declared = this._columns.find(c => c.field.toLowerCase() === colConfig.Name.toLowerCase());\n const isAutoWidth = declared?.width === 'auto';\n\n const colDef: ColDef = {\n field: field.Name,\n // Use userDisplayName if set, otherwise fall back to DisplayName or field name\n headerName: colConfig.userDisplayName || colConfig.DisplayName || field.DisplayNameOrName,\n width: isAutoWidth ? undefined : (colConfig.width || this.estimateColumnWidth(field)),\n // The declared min/max travel with the 'auto' decision. Dropping them here was a real bug:\n // the saved state has no notion of either, so the column lost its ceiling and its floor and\n // sized itself off whatever space happened to be left.\n minWidth: isAutoWidth ? (declared?.minWidth ?? AUTO_WIDTH_COLUMN_MIN_PX) : undefined,\n maxWidth: isAutoWidth ? declared?.maxWidth : undefined,\n sortable: this._allowSorting,\n resizable: this._allowColumnResize,\n // Hidden columns are still added as col defs with hide:true rather than omitted\n // entirely (bug C2). A column omitted from the col defs is invisible to AG Grid's\n // quick filter, so search couldn't match values in columns the user had hidden.\n // Adding it with hide:true keeps it out of the visible layout and CSV export while\n // making its values quick-filterable. (Server-side filtered grids additionally need\n // the field flagged IncludeInUserSearchAPI for the server to return matching rows.)\n hide: colConfig.hidden === true\n };\n\n if (isAutoWidth) {\n this.registerAutoWidthColumn(colDef);\n }\n\n // Add type-specific formatters with optional custom format\n this.applyFieldFormatter(colDef, field, colConfig.format);\n\n cols.push(colDef);\n }\n\n return cols;\n }\n\n private mapColumnConfigToColDef(col: GridColumnConfig): ColDef {\n // `width: 'auto'` means \"this column absorbs the leftover row width\". It is part of the public\n // GridColumnConfig contract (`width?: number | 'auto'`) but was previously mapped to `undefined`,\n // so it silently did nothing and AG Grid fell back to its default width.\n //\n // Why it matters, and why this is the RIGHT place to fix it: `autoSizeColumnsSmartly()` below\n // deliberately declines to stretch when the pane is much wider than the columns (its `maxRatio`\n // guard), so a narrow `Status` column is never blown up to 400px on a wide monitor. That guard is\n // correct — but combined with `estimateColumnWidth()`'s hard 350px cap it meant a grid with a few\n // columns on a wide screen could NEVER fill, leaving permanent dead space to the right while a\n // text column truncated. `'auto'` is the per-column escape hatch for exactly that case: fixed\n // columns keep their pixel widths (what the guard protects) and only the column the page author\n // designated grows. AG Grid's `flex` is the native mechanism, so map straight onto it.\n const isAutoWidth = col.width === 'auto';\n const colDef: ColDef = {\n field: col.field,\n headerName: col.title || col.field,\n width: typeof col.width === 'number' ? col.width : undefined,\n // An auto-width column still needs a floor, or a column whose visible rows are all empty\n // measures to nothing and the header ends up unreadable.\n minWidth: col.minWidth ?? (isAutoWidth ? AUTO_WIDTH_COLUMN_MIN_PX : undefined),\n maxWidth: col.maxWidth,\n sortable: col.sortable !== false && this._allowSorting,\n filter: false,\n resizable: col.resizable !== false && this._allowColumnResize,\n hide: col.visible === false\n };\n\n if (isAutoWidth) {\n this.registerAutoWidthColumn(colDef);\n }\n\n // Apply field formatter for highlighting and type-specific formatting\n // if we have entity metadata for this field\n if (this._entityInfo) {\n const field = this._entityInfo.Fields.find(f =>\n f.Name.toLowerCase() === col.field.toLowerCase()\n );\n if (field) {\n this.applyFieldFormatter(colDef, field);\n }\n }\n\n return colDef;\n }\n\n private generateAgColumnDefs(entity: EntityInfo): ColDef[] {\n const cols: ColDef[] = [];\n let visibleFields = entity.Fields.filter(f => this.shouldShowField(f));\n\n // Fallback: if no DefaultInView fields are defined, show first 10 non-system fields\n // sorted by importance to give users a reasonable starting point\n if (visibleFields.length === 0) {\n visibleFields = this.getDefaultFieldsFallback(entity);\n }\n\n // Sort fields by importance for better default ordering\n visibleFields = this.sortFieldsByImportance(visibleFields);\n\n for (const field of visibleFields) {\n const colDef: ColDef = {\n field: field.Name,\n headerName: field.DisplayNameOrName,\n width: this.estimateColumnWidth(field),\n sortable: this._allowSorting,\n resizable: this._allowColumnResize,\n headerTooltip: this.buildHeaderTooltip(field)\n };\n\n this.applyFieldFormatter(colDef, field);\n cols.push(colDef);\n }\n\n return cols;\n }\n\n /**\n * When no DefaultInView fields are set, fall back to showing the first 10\n * non-system, non-PK fields to give users something reasonable to start with.\n */\n private getDefaultFieldsFallback(entity: EntityInfo): EntityFieldInfo[] {\n return entity.Fields\n .filter(f =>\n !f.Name.startsWith('__mj_') &&\n !(f.IsPrimaryKey && f.SQLFullType?.toLowerCase() === 'uniqueidentifier') &&\n (f.Length <= 500 || f.Length < 0) // Exclude very long text unless nvarchar(max)\n )\n .slice(0, 10);\n }\n\n /**\n * Sort fields by importance for better default column ordering.\n * Name fields first, then status/type, then other fields, with system fields last.\n */\n private sortFieldsByImportance(fields: EntityFieldInfo[]): EntityFieldInfo[] {\n return [...fields].sort((a, b) => {\n const priorityA = this.getFieldPriority(a);\n const priorityB = this.getFieldPriority(b);\n return priorityA - priorityB;\n });\n }\n\n private getFieldPriority(field: EntityFieldInfo): number {\n const nameLower = field.Name.toLowerCase();\n\n // Name fields first\n if (field.IsNameField) return 0;\n if (nameLower === 'name' || nameLower === 'title') return 1;\n\n // Status and type fields are important\n if (nameLower === 'status') return 2;\n if (nameLower === 'type' || nameLower === 'category') return 3;\n\n // Other name-like fields\n if (nameLower.endsWith('name') && !nameLower.endsWith('typename')) return 4;\n\n // Description fields\n if (nameLower.includes('description')) return 5;\n\n // Date fields\n if (field.TSType === 'Date') return 50;\n\n // Foreign keys (usually IDs pointing to other entities)\n if (field.RelatedEntityID) return 60;\n\n // Numbers\n if (field.TSType === 'number') return 70;\n\n // Booleans toward the end\n if (field.TSType === 'boolean') return 80;\n\n // Long text fields at the end\n if ((field.Length > 500 || field.Length < 0)) return 90;\n\n // System fields last (though they should be filtered out already)\n if (field.Name.startsWith('__mj_')) return 100;\n\n // Default priority\n return 40;\n }\n\n /**\n * Build a tooltip for the column header showing field details.\n */\n private buildHeaderTooltip(field: EntityFieldInfo): string {\n const parts: string[] = [];\n\n // Show internal field name if different from display name\n if (field.DisplayName && field.DisplayName !== field.Name) {\n parts.push(`Field: ${field.Name}`);\n }\n\n // Show description if available\n if (field.Description) {\n parts.push(field.Description);\n }\n\n // Show type info\n const typeInfo = field.Type + (field.Length && field.Length > 0 ? `(${field.Length})` : '');\n parts.push(`Type: ${typeInfo}`);\n\n return parts.join('\\n');\n }\n\n private applyFieldFormatter(colDef: ColDef, field: EntityFieldInfo, customFormat?: ColumnFormat): void {\n // Store type info for use in cell renderer\n const fieldType = field.TSType;\n const fieldNameLower = field.Name.toLowerCase();\n const extendedType = field.ExtendedType?.toLowerCase() || '';\n const vc = this.EffectiveVisualConfig;\n\n // Determine special field types using ExtendedType metadata first, then field name patterns as fallback\n const isCurrency = customFormat?.type === 'currency' ||\n fieldNameLower.includes('amount') ||\n fieldNameLower.includes('price') ||\n fieldNameLower.includes('cost') ||\n fieldNameLower.includes('total');\n // Use ExtendedType='Email' from metadata, fallback to field name pattern\n const isEmail = extendedType === 'email' ||\n (!extendedType && fieldNameLower.includes('email'));\n // Use ExtendedType='URL' from metadata, fallback to field name pattern\n const isUrl = extendedType === 'url' ||\n (!extendedType && (fieldNameLower.includes('url') ||\n fieldNameLower.includes('website') ||\n fieldNameLower.includes('link')));\n // Image cells key off ExtendedType (or a User View format override). Field-name\n // heuristics (PhotoURL/LogoURL) are not used — those columns are classified as\n // ExtendedType='Image' in metadata.\n const isImage = (customFormat?.type as string | undefined) === 'image' ||\n extendedType === 'image';\n const isColor = extendedType === 'color';\n // Use ExtendedType='Tel' from metadata, fallback to field name pattern\n const isPhone = extendedType === 'tel' ||\n (!extendedType && (fieldNameLower.includes('phone') ||\n fieldNameLower.includes('mobile') ||\n fieldNameLower.includes('fax')));\n\n // Check if this is a foreign key field (has a related entity)\n // Also check if this is a virtual display field that corresponds to an FK field\n let isForeignKey = !!field.RelatedEntityID;\n let fkField: EntityFieldInfo | undefined = field;\n let relatedEntityName = isForeignKey ? field.RelatedEntity : undefined;\n\n // If this field doesn't have RelatedEntityID but is virtual, check for a corresponding FK field\n // Pattern: for a field named \"Category\", look for \"CategoryID\" with RelatedEntityID\n if (!isForeignKey && field.IsVirtual && this._entityInfo) {\n const potentialFkFieldName = field.Name + 'ID';\n const correspondingFkField = this._entityInfo.Fields.find(\n f => f.Name.toLowerCase() === potentialFkFieldName.toLowerCase() && f.RelatedEntityID\n );\n if (correspondingFkField) {\n isForeignKey = true;\n fkField = correspondingFkField;\n relatedEntityName = correspondingFkField.RelatedEntity;\n }\n }\n\n // Apply alignment - use custom format alignment if provided, otherwise default to right for numbers\n const customAlign = customFormat?.align;\n if (customAlign) {\n colDef.cellClass = `cell-align-${customAlign}`;\n colDef.headerClass = `header-align-${customAlign}`;\n } else if (vc.rightAlignNumbers && (fieldType === 'number' || isCurrency)) {\n colDef.cellClass = 'cell-align-right';\n colDef.headerClass = 'header-align-right';\n }\n\n if (isImage) {\n colDef.cellClass = `${colDef.cellClass || ''} mj-grid-image-cell`.trim();\n colDef.headerClass = `${colDef.headerClass || ''} mj-grid-image-header`.trim();\n colDef.width = 48;\n colDef.minWidth = 44;\n colDef.maxWidth = 56;\n colDef.resizable = false;\n }\n\n // Apply custom header style if provided\n if (customFormat?.headerStyle) {\n const headerStyle = this.buildCssStyle(customFormat.headerStyle);\n if (headerStyle) {\n colDef.headerClass = (colDef.headerClass || '') + ' custom-header-style';\n // AG Grid uses headerStyle for inline styles\n (colDef as ColDef & { headerStyle: Record<string, string> }).headerStyle = this.buildStyleObject(customFormat.headerStyle);\n }\n }\n\n // Use cellRenderer for highlighting support and enhanced formatting\n colDef.cellRenderer = (params: ICellRendererParams) => {\n if (params.value === null || params.value === undefined) {\n return '<span class=\"cell-empty\">—</span>';\n }\n\n if (isImage) {\n const raw = String(params.value).trim();\n const src = CoerceImageSrc(raw);\n if (src) {\n const escaped = HighlightUtil.escapeHtml(src);\n const img = `<img src=\"${escaped}\" alt=\"\" class=\"cell-image\" width=\"28\" height=\"28\" style=\"width:28px;height:28px;max-width:28px;max-height:28px;object-fit:cover;object-position:center;border-radius:50%;display:block\" />`;\n const inner = src.startsWith('data:')\n ? img\n : `<a href=\"${escaped}\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"cell-image-link\" onclick=\"event.stopPropagation()\">${img}</a>`;\n return this.wrapWithStyle(\n inner,\n customFormat?.cellStyle ? this.buildCssStyle(customFormat.cellStyle) : '',\n );\n }\n }\n\n if (isColor) {\n const raw = String(params.value).trim();\n const hex = ParseCssHexColor(raw);\n const escaped = HighlightUtil.escapeHtml(raw);\n const swatch = hex\n ? `<span style=\"width:14px;height:14px;border-radius:3px;background:${HighlightUtil.escapeHtml(hex)};border:1px solid rgba(0,0,0,.2);display:inline-block;flex-shrink:0\"></span>`\n : '';\n return this.wrapWithStyle(\n `<span style=\"display:inline-flex;align-items:center;gap:6px\">${swatch}${escaped}</span>`,\n customFormat?.cellStyle ? this.buildCssStyle(customFormat.cellStyle) : '',\n );\n }\n\n // Handle foreign key fields - render as clickable links\n // Only apply FK rendering if no custom format is specified\n if (isForeignKey && !customFormat && fkField?.RelatedEntityID) {\n // For virtual display fields, we show the display value but link to the FK value\n // For direct FK fields, the value IS the FK value\n const isVirtualDisplay = field.IsVirtual && fkField !== field;\n const displayValue = String(params.value);\n\n // Get the actual FK value - for virtual fields, look it up from row data\n let fkValue: string;\n if (isVirtualDisplay && params.data) {\n // Get the FK value from the corresponding FK field in the row data\n fkValue = String(params.data[fkField.Name] ?? '');\n } else {\n fkValue = displayValue;\n }\n\n // Skip if we don't have a valid FK value\n if (!fkValue) {\n return `<span>${HighlightUtil.escapeHtml(displayValue)}</span>`;\n }\n\n const escapedDisplayValue = HighlightUtil.escapeHtml(displayValue);\n const escapedFieldName = HighlightUtil.escapeHtml(fkField.Name);\n const escapedRelatedEntityId = HighlightUtil.escapeHtml(fkField.RelatedEntityID);\n const escapedRelatedEntityName = relatedEntityName ? HighlightUtil.escapeHtml(relatedEntityName) : '';\n\n // Build data attributes for the click handler\n const dataAttrs = `data-related-entity-id=\"${escapedRelatedEntityId}\" data-record-id=\"${fkValue}\" data-field-name=\"${escapedFieldName}\"${relatedEntityName ? ` data-related-entity-name=\"${escapedRelatedEntityName}\"` : ''}`;\n\n // Apply highlighting if filter text is set\n const displayText = this._filterText\n ? HighlightUtil.highlight(displayValue, this._filterText, true)\n : escapedDisplayValue;\n\n // NOTE: Do NOT add onclick=\"event.stopPropagation()\" here - it prevents AG Grid's cellClicked from firing\n const linkHtml = `<a href=\"javascript:void(0)\" class=\"cell-link cell-fk-link\" ${dataAttrs}>${displayText}</a>`;\n\n return linkHtml;\n }\n\n let displayValue = '';\n let extraClass = '';\n let inlineStyle = '';\n let isHtmlContent = false; // Track if displayValue contains HTML (icons, links)\n\n // Build inline style from custom cell style\n if (customFormat?.cellStyle) {\n inlineStyle = this.buildCssStyle(customFormat.cellStyle);\n }\n\n // Check if custom format is provided and has a non-auto type\n const useCustomFormat = customFormat && customFormat.type && customFormat.type !== 'auto';\n\n if (useCustomFormat) {\n // Use custom formatting\n displayValue = this.formatValueWithCustomFormat(params.value, customFormat, field);\n // Check if formatCustomBoolean returned HTML (icon or checkbox)\n if (customFormat.type === 'boolean' &&\n (customFormat.booleanDisplay === 'icon' || customFormat.booleanDisplay === 'checkbox')) {\n isHtmlContent = true;\n }\n } else {\n // Use default formatting based on field type\n // Boolean formatting\n if (fieldType === 'boolean') {\n if (vc.booleanIcons) {\n const iconClass = params.value\n ? 'fa-solid fa-check cell-boolean-true'\n : 'fa-solid fa-xmark cell-boolean-false';\n displayValue = `<i class=\"${iconClass}\"></i>`;\n isHtmlContent = true;\n } else {\n displayValue = params.value ? 'Yes' : 'No';\n }\n }\n // Date formatting\n else if (fieldType === 'Date') {\n displayValue = this.formatDefaultDate(params.value, field, !!vc.friendlyDates);\n }\n // Currency formatting\n else if (fieldType === 'number' && isCurrency) {\n const num = Number(params.value);\n displayValue = isNaN(num) ? String(params.value) : `$${num.toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 })}`;\n }\n // Regular number formatting\n else if (fieldType === 'number') {\n const num = Number(params.value);\n if (isNaN(num)) {\n displayValue = String(params.value);\n } else if (field.IsPrimaryKey) {\n // Primary-key integers are identifiers, not quantities — never group them with\n // thousands separators (an ID of 12345 must render as \"12345\", not \"12,345\").\n displayValue = String(params.value);\n } else {\n displayValue = num.toLocaleString();\n }\n }\n // Email formatting\n else if (isEmail && vc.clickableEmails) {\n const email = String(params.value);\n const escapedEmail = HighlightUtil.escapeHtml(email);\n if (this._filterText) {\n const highlighted = HighlightUtil.highlight(email, this._filterText, true);\n return this.wrapWithStyle(`<a href=\"mailto:${escapedEmail}\" class=\"cell-link cell-email\" onclick=\"event.stopPropagation()\">${highlighted}</a>`, inlineStyle);\n }\n return this.wrapWithStyle(`<a href=\"mailto:${escapedEmail}\" class=\"cell-link cell-email\" onclick=\"event.stopPropagation()\">${escapedEmail}</a>`, inlineStyle);\n }\n // URL formatting\n else if (isUrl && vc.clickableUrls) {\n let url = String(params.value);\n if (url && !url.startsWith('http')) {\n url = 'https://' + url;\n }\n const displayUrl = url.replace(/^https?:\\/\\//, '').replace(/\\/$/, '');\n const escapedDisplay = HighlightUtil.escapeHtml(displayUrl);\n if (this._filterText) {\n const highlighted = HighlightUtil.highlight(displayUrl, this._filterText, true);\n return this.wrapWithStyle(`<a href=\"${HighlightUtil.escapeHtml(url)}\" target=\"_blank\" class=\"cell-link cell-url\" onclick=\"event.stopPropagation()\">${highlighted}</a>`, inlineStyle);\n }\n return this.wrapWithStyle(`<a href=\"${HighlightUtil.escapeHtml(url)}\" target=\"_blank\" class=\"cell-link cell-url\" onclick=\"event.stopPropagation()\">${escapedDisplay}</a>`, inlineStyle);\n }\n // Phone formatting\n else if (isPhone) {\n displayValue = String(params.value);\n extraClass = 'cell-phone';\n }\n // Default string formatting\n else {\n displayValue = String(params.value);\n }\n }\n\n // Build the span with optional style and class\n const styleAttr = inlineStyle ? ` style=\"${inlineStyle}\"` : '';\n const classAttr = extraClass ? ` class=\"${extraClass}\"` : '';\n\n // Handle content that's already HTML (icons, etc.)\n if (isHtmlContent) {\n if (inlineStyle) {\n return `<span${styleAttr}>${displayValue}</span>`;\n }\n return displayValue;\n }\n\n // Apply highlighting if filterText is set\n if (this._filterText && displayValue) {\n return `<span${classAttr}${styleAttr}>${HighlightUtil.highlight(displayValue, this._filterText, true)}</span>`;\n }\n\n return `<span${classAttr}${styleAttr}>${HighlightUtil.escapeHtml(displayValue)}</span>`;\n };\n }\n\n /**\n * Helper to wrap content with an inline style span\n */\n private wrapWithStyle(content: string, style: string): string {\n if (!style) return content;\n return `<span style=\"${style}\">${content}</span>`;\n }\n\n\n\n /**\n * Build a CSS style string from a ColumnTextStyle object\n */\n private buildCssStyle(style: ColumnTextStyle): string {\n const parts: string[] = [];\n if (style.bold) parts.push('font-weight: bold');\n if (style.italic) parts.push('font-style: italic');\n if (style.underline) parts.push('text-decoration: underline');\n if (style.color) parts.push(`color: ${style.color}`);\n if (style.backgroundColor) parts.push(`background-color: ${style.backgroundColor}`);\n return parts.join('; ');\n }\n\n /**\n * Build a style object for AG Grid from a ColumnTextStyle object\n */\n private buildStyleObject(style: ColumnTextStyle): Record<string, string> {\n const obj: Record<string, string> = {};\n if (style.bold) obj['fontWeight'] = 'bold';\n if (style.italic) obj['fontStyle'] = 'italic';\n if (style.underline) obj['textDecoration'] = 'underline';\n if (style.color) obj['color'] = style.color;\n if (style.backgroundColor) obj['backgroundColor'] = style.backgroundColor;\n return obj;\n }\n\n /**\n * Format a value using custom ColumnFormat settings\n */\n /**\n * Default rendering of a date-family cell. A `date` column is a calendar day that arrives as UTC\n * midnight; a local-zone formatter would land on the previous day for every reader west of\n * Greenwich (MJ#4210). A timestamp names an instant and stays in local time.\n */\n private formatDefaultDate(value: unknown, field: EntityFieldInfo, friendlyDates: boolean): string {\n const date = value instanceof Date ? value : new Date(value as string);\n if (isNaN(date.getTime())) return String(value);\n if (!friendlyDates) return date.toISOString().split('T')[0];\n const options: Intl.DateTimeFormatOptions = { month: 'short', day: 'numeric', year: 'numeric' };\n return IsDateOnlySQLType(field.Type) ? FormatDateOnly(date, options) : date.toLocaleDateString(undefined, options);\n }\n\n private formatValueWithCustomFormat(value: unknown, format: ColumnFormat, field: EntityFieldInfo): string {\n if (value == null) return '—';\n\n switch (format.type) {\n case 'number':\n return this.formatCustomNumber(value as number, format);\n case 'currency':\n return this.formatCustomCurrency(value as number, format);\n case 'percent':\n return this.formatCustomPercent(value as number, format);\n case 'date':\n case 'datetime':\n return this.formatCustomDate(value, format, IsDateOnlySQLType(field.Type));\n case 'boolean':\n return this.formatCustomBoolean(value as boolean, format);\n default:\n return String(value);\n }\n }\n\n private formatCustomNumber(value: number, format: ColumnFormat): string {\n const num = Number(value);\n if (isNaN(num)) return String(value);\n\n const options: Intl.NumberFormatOptions = {\n minimumFractionDigits: format.decimals ?? 0,\n maximumFractionDigits: format.decimals ?? 0,\n useGrouping: format.thousandsSeparator ?? true\n };\n return new Intl.NumberFormat('en-US', options).format(num);\n }\n\n private formatCustomCurrency(value: number, format: ColumnFormat): string {\n const num = Number(value);\n if (isNaN(num)) return String(value);\n\n const options: Intl.NumberFormatOptions = {\n style: 'currency',\n currency: format.currencyCode || 'USD',\n minimumFractionDigits: format.decimals ?? 2,\n maximumFractionDigits: format.decimals ?? 2\n };\n return new Intl.NumberFormat('en-US', options).format(num);\n }\n\n private formatCustomPercent(value: number, format: ColumnFormat): string {\n const num = Number(value);\n if (isNaN(num)) return String(value);\n\n const options: Intl.NumberFormatOptions = {\n style: 'percent',\n minimumFractionDigits: format.decimals ?? 0,\n maximumFractionDigits: format.decimals ?? 0\n };\n // Assume value is already a percentage (e.g., 50 = 50%), divide by 100\n return new Intl.NumberFormat('en-US', options).format(num / 100);\n }\n\n /**\n * @param dateOnly The column is a SQL `date`: a calendar day at UTC midnight with no time to show.\n * It is rendered in UTC so the day does not shift west of Greenwich, and a `datetime` column\n * format cannot add a time of day to it (MJ#4210). A timestamp column keeps local rendering.\n */\n private formatCustomDate(value: unknown, format: ColumnFormat, dateOnly: boolean): string {\n const date = value instanceof Date ? value : new Date(value as string);\n if (isNaN(date.getTime())) return String(value);\n\n // Parse format string - check for weekday variants\n const formatStr = format.dateFormat || 'medium';\n const includeWeekday = formatStr.includes('-weekday');\n const baseFormat = formatStr.replace('-weekday', '') as 'short' | 'medium' | 'long';\n const withTime = format.type === 'datetime' && !dateOnly;\n\n let options: Intl.DateTimeFormatOptions;\n\n // Intl.DateTimeFormat doesn't allow combining dateStyle with weekday\n // So we must use individual components when weekday is requested\n if (includeWeekday) {\n if (baseFormat === 'short') {\n options = { weekday: 'short', month: 'numeric', day: 'numeric', year: '2-digit' };\n } else if (baseFormat === 'long') {\n options = { weekday: 'long', month: 'long', day: 'numeric', year: 'numeric' };\n } else {\n // medium\n options = { weekday: 'short', month: 'short', day: 'numeric', year: 'numeric' };\n }\n if (withTime) {\n options.hour = 'numeric';\n options.minute = '2-digit';\n }\n } else {\n // No weekday - can use dateStyle shorthand\n options = {\n dateStyle: baseFormat === 'short' ? 'short' : baseFormat === 'long' ? 'long' : 'medium'\n };\n if (withTime) {\n options.timeStyle = 'short';\n }\n }\n\n return dateOnly ? FormatDateOnly(date, options, 'en-US') : new Intl.DateTimeFormat('en-US', options).format(date);\n }\n\n private formatCustomBoolean(value: boolean, format: ColumnFormat): string {\n if (format.booleanDisplay === 'icon') {\n const iconClass = value\n ? 'fa-solid fa-check cell-boolean-true'\n : 'fa-solid fa-xmark cell-boolean-false';\n return `<i class=\"${iconClass}\"></i>`;\n }\n if (format.booleanDisplay === 'checkbox') {\n return value\n ? '<i class=\"fa-regular fa-square-check cell-boolean-true\"></i>'\n : '<i class=\"fa-regular fa-square cell-boolean-false\"></i>';\n }\n return value ? (format.trueLabel || 'Yes') : (format.falseLabel || 'No');\n }\n\n // ========================================\n // AG Grid Row Selection Configuration\n // ========================================\n\n private updateAgRowSelection(): void {\n switch (this._selectionMode) {\n case 'none':\n this.AgRowSelection = { mode: 'singleRow', enableClickSelection: false, checkboxes: false };\n break;\n case 'single':\n this.AgRowSelection = { mode: 'singleRow', enableClickSelection: true, checkboxes: false };\n break;\n case 'multiple':\n // enableSelectionWithoutKeys replaces deprecated rowMultiSelectWithClick (as of AG Grid v32.2)\n this.AgRowSelection = { mode: 'multiRow', enableClickSelection: true, checkboxes: false, enableSelectionWithoutKeys: true };\n break;\n case 'checkbox':\n this.AgRowSelection = {\n mode: 'multiRow',\n enableClickSelection: true,\n checkboxes: true,\n headerCheckbox: true,\n enableSelectionWithoutKeys: true\n };\n break;\n }\n\n // Update the grid if it's already initialized\n if (this.gridApi) {\n this.gridApi.setGridOption('rowSelection', this.AgRowSelection);\n }\n }\n\n // ========================================\n // Data Loading\n // ========================================\n\n async loadData(isAutoRefresh: boolean = false): Promise<void> {\n if (this._useExternalData) {\n console.debug(`[entity-data-grid] loadData() skipped: using external data`);\n this.processData();\n return;\n }\n\n // Check if we have a valid data source via Params\n const hasDataSource = this._params && (\n this._params.ViewID ||\n this._params.ViewName ||\n this._params.ViewEntity ||\n this._params.EntityName\n );\n\n if (!hasDataSource) {\n console.debug(`[entity-data-grid] loadData() skipped: no data source in params`);\n return;\n }\n\n // Check AllowLoad for deferred loading\n if (!this._allowLoad) {\n console.debug(`[entity-data-grid] loadData() skipped: allowLoad=false`);\n return;\n }\n\n console.debug(`[entity-data-grid] loadData() proceeding: entity=${this._entityInfo?.Name}, isAutoRefresh=${isAutoRefresh}, allowLoad=${this._allowLoad}`);\n\n // For infinite scroll mode, setup or refresh the datasource\n if (this._paginationMode === 'infinite') {\n if (this.gridApi) {\n if (!this.infiniteDatasource) {\n this.setupInfiniteScroll();\n } else {\n this.refreshInfiniteCache();\n }\n }\n // In infinite mode, the datasource handles loading, so we're done\n return;\n }\n\n // If a load is already in progress, return the existing promise\n // This prevents redundant API calls when loadData is called multiple times\n if (this._loadDataPromise) {\n return this._loadDataPromise;\n }\n\n // Wrap the actual loading logic in a promise we can track\n this._loadDataPromise = this.executeLoadData(isAutoRefresh);\n\n try {\n await this._loadDataPromise;\n } finally {\n this._loadDataPromise = null;\n }\n }\n\n /**\n * Internal method that performs the actual data loading.\n * Called by loadData() which handles promise deduplication.\n */\n private async executeLoadData(isAutoRefresh: boolean): Promise<void> {\n // Client-side mode - load all data upfront\n const beforeRefreshEvent = new BeforeDataRefreshEventArgs(this, isAutoRefresh);\n this.BeforeDataRefresh.emit(beforeRefreshEvent);\n if (beforeRefreshEvent.cancel) {\n return;\n }\n\n // Build the RunViewParams - prefer new Params input over legacy inputs\n const runViewParams = this.buildRunViewParams();\n\n // Create GridRunViewParams for events (backward compatibility)\n const gridParams: GridRunViewParams = {\n entityName: runViewParams.EntityName || this._entityInfo?.Name || '',\n extraFilter: (typeof runViewParams.ExtraFilter === 'string' ? runViewParams.ExtraFilter : runViewParams.ExtraFilter?.default) || '',\n orderBy: (typeof runViewParams.OrderBy === 'string' ? runViewParams.OrderBy : runViewParams.OrderBy?.default) || '',\n maxRows: runViewParams.MaxRows || 0,\n fields: runViewParams.Fields,\n searchString: runViewParams.UserSearchString || ''\n };\n\n const beforeLoadEvent = new BeforeDataLoadEventArgs(this, gridParams);\n this.BeforeDataLoad.emit(beforeLoadEvent);\n if (beforeLoadEvent.cancel) {\n return;\n }\n\n // Apply any modifications from beforeLoadEvent\n if (beforeLoadEvent.modifiedParams) {\n if (beforeLoadEvent.modifiedParams.extraFilter) {\n runViewParams.ExtraFilter = beforeLoadEvent.modifiedParams.extraFilter;\n }\n if (beforeLoadEvent.modifiedParams.orderBy) {\n runViewParams.OrderBy = beforeLoadEvent.modifiedParams.orderBy;\n }\n if (beforeLoadEvent.modifiedParams.maxRows) {\n runViewParams.MaxRows = beforeLoadEvent.modifiedParams.maxRows;\n }\n if (beforeLoadEvent.modifiedParams.fields) {\n runViewParams.Fields = beforeLoadEvent.modifiedParams.fields;\n }\n if (beforeLoadEvent.modifiedParams.searchString) {\n runViewParams.UserSearchString = beforeLoadEvent.modifiedParams.searchString;\n }\n }\n\n this.Loading = true;\n this._aggregatesLoading = true;\n this.errorMessage = '';\n this.cdr.detectChanges();\n\n const startTime = performance.now();\n\n try {\n // Build aggregate expressions from config if present\n // Use EffectiveAggregatesConfig to check both _aggregatesConfig and _gridState.aggregates\n const effectiveAggConfig = this.effectiveAggregatesConfig;\n let aggregateExpressions: AggregateExpression[] | undefined;\n if (effectiveAggConfig?.expressions?.length) {\n aggregateExpressions = effectiveAggConfig.expressions\n .filter(agg => agg.enabled !== false && agg.expression)\n .map(agg => ({\n expression: agg.expression,\n alias: agg.id || agg.label || agg.expression\n }));\n }\n\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView<Record<string, unknown>>({\n ...runViewParams,\n ResultType: 'simple',\n Fields: this._entityInfo ? ComputeFieldsList(this._entityInfo, this._gridState, this.hostColumnFieldNames()) : undefined,\n Aggregates: aggregateExpressions\n });\n\n const loadTimeMs = performance.now() - startTime;\n\n if (result.Success) {\n this._allData = result.Results || [];\n this.totalRowCount = result.TotalRowCount || this._allData.length;\n this.processData();\n\n // Process aggregate results\n this.processAggregateResults(result.AggregateResults, result.AggregateExecutionTime);\n\n // Reapply sort state to grid after data load to maintain visual indicators\n // Use Promise.resolve() to defer until after Angular's change detection cycle\n // has completed and AG Grid has processed the new row data\n if (this._sortState.length > 0) {\n Promise.resolve().then(() => {\n this.applySortStateToGrid();\n });\n }\n\n const afterLoadEvent = new AfterDataLoadEventArgs(\n this,\n gridParams,\n true,\n this.totalRowCount,\n this._allData.length,\n loadTimeMs\n );\n this.AfterDataLoad.emit(afterLoadEvent);\n\n const afterRefreshEvent = new AfterDataRefreshEventArgs(\n this,\n true,\n this.totalRowCount,\n loadTimeMs\n );\n this.AfterDataRefresh.emit(afterRefreshEvent);\n } else {\n this.errorMessage = result.ErrorMessage || 'Failed to load data';\n\n const afterLoadEvent = new AfterDataLoadEventArgs(\n this,\n gridParams,\n false,\n 0,\n 0,\n loadTimeMs,\n this.errorMessage\n );\n this.AfterDataLoad.emit(afterLoadEvent);\n }\n } catch (error) {\n const loadTimeMs = performance.now() - startTime;\n this.errorMessage = error instanceof Error ? error.message : 'Unknown error occurred';\n\n const afterLoadEvent = new AfterDataLoadEventArgs(\n this,\n gridParams,\n false,\n 0,\n 0,\n loadTimeMs,\n this.errorMessage\n );\n this.AfterDataLoad.emit(afterLoadEvent);\n } finally {\n this.ngZone.run(() => {\n this.Loading = false;\n this.cdr.detectChanges();\n });\n }\n }\n\n /**\n * Builds RunViewParams from the Params input.\n * Requires Params to be set - the grid needs a data source configured.\n */\n private buildRunViewParams(): RunViewParams {\n if (!this._params) {\n throw new Error('Params must be set before loading data');\n }\n\n const params: RunViewParams = { ...this._params };\n\n // Apply sort state (may be modified by user interactions)\n const orderBy = this.buildOrderByClause();\n if (orderBy) {\n params.OrderBy = orderBy;\n }\n\n return params;\n }\n\n private buildOrderByClause(): string {\n if (this._sortState.length > 0) {\n return this._sortState\n .sort((a, b) => a.index - b.index)\n .map(s => `${s.field} ${s.direction.toUpperCase()}`)\n .join(', ');\n }\n // Fall back to OrderBy from Params if set\n const orderByParam = this._params?.OrderBy;\n if (!orderByParam) return '';\n return typeof orderByParam === 'string' ? orderByParam : orderByParam.default;\n }\n\n // ========================================\n // Infinite Scroll Data Source\n // ========================================\n\n /**\n * Creates and returns an AG Grid IDatasource for infinite scroll mode.\n * This datasource fetches data in pages from the server as the user scrolls.\n */\n private createInfiniteDatasource(): IDatasource {\n return {\n getRows: async (params: IGetRowsParams) => {\n const startRow = params.startRow;\n const endRow = params.endRow;\n const blockSize = endRow - startRow;\n\n try {\n // Build params with pagination\n const runViewParams = this.buildRunViewParams();\n runViewParams.StartRow = startRow;\n runViewParams.MaxRows = blockSize;\n\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView<Record<string, unknown>>({\n ...runViewParams,\n ResultType: 'simple',\n Fields: this._entityInfo ? ComputeFieldsList(this._entityInfo, this._gridState, this.hostColumnFieldNames()) : undefined\n });\n\n if (result.Success) {\n const entities = result.Results || [];\n\n // Process entities into row data\n const rowData = entities.map((entity, index) => {\n return this.entityToRowData(entity, startRow + index);\n });\n\n // Update total row count\n this.totalRowCount = result.TotalRowCount || 0;\n this.cdr.detectChanges();\n\n // Determine if we've reached the last row\n const lastRow = result.TotalRowCount != null && startRow + entities.length >= result.TotalRowCount\n ? result.TotalRowCount\n : undefined;\n\n params.successCallback(rowData, lastRow);\n } else {\n this.errorMessage = result.ErrorMessage || 'Failed to load data';\n this.cdr.detectChanges();\n params.failCallback();\n }\n } catch (error) {\n this.errorMessage = error instanceof Error ? error.message : 'Unknown error occurred';\n this.cdr.detectChanges();\n params.failCallback();\n }\n }\n };\n }\n\n /**\n * Converts a Record<string, unknown> to AG Grid row data format.\n * This is used by both client and infinite scroll modes for consistent data formatting.\n */\n private entityToRowData(entity: Record<string, unknown>, index: number): Record<string, unknown> {\n const key = this.getRowKey(entity);\n\n // Store in row data map for later retrieval\n const rowData: GridRowData = {\n key,\n index,\n entity,\n selected: this._selectedKeys.includes(key),\n editing: this._editingRowKey === key,\n dirty: this._pendingChanges.some(c => c.rowKey === key),\n cssClasses: this.computeRowClasses(index, entity)\n };\n this._rowDataMap.set(key, rowData);\n\n // Build AG Grid row data\n const row: Record<string, unknown> = {\n __pk: key\n };\n\n if (this._entityInfo) {\n for (const field of this._entityInfo.Fields) {\n row[field.Name] = entity[field.Name];\n }\n }\n\n return row;\n }\n\n /**\n * Sets up the grid for infinite scroll mode.\n * Called when PaginationMode is 'infinite'.\n */\n private setupInfiniteScroll(): void {\n if (!this.gridApi) return;\n\n // Create datasource\n this.infiniteDatasource = this.createInfiniteDatasource();\n\n // Set datasource on grid\n this.gridApi.setGridOption('datasource', this.infiniteDatasource);\n }\n\n /**\n * Refreshes the infinite scroll cache.\n * Call this when data source parameters change.\n */\n private refreshInfiniteCache(): void {\n if (!this.gridApi || this._paginationMode !== 'infinite') return;\n\n // Clear the row data map since we're refreshing\n this._rowDataMap.clear();\n\n // Purge cache and refresh\n this.gridApi.refreshInfiniteCache();\n\n // Reapply sort state to grid after refresh to maintain visual indicators\n // Use Promise.resolve() to defer until after AG Grid has processed the cache refresh\n if (this._sortState.length > 0) {\n Promise.resolve().then(() => {\n this.applySortStateToGrid();\n });\n }\n }\n\n private processData(): void {\n this._rowDataMap.clear();\n const dataSource = this._useExternalData ? this._data : this._allData;\n\n this.RowData = dataSource.map((entity, index) => {\n const key = this.getRowKey(entity);\n\n const rowData: GridRowData = {\n key,\n index,\n entity,\n selected: this._selectedKeys.includes(key),\n editing: this._editingRowKey === key,\n dirty: this._pendingChanges.some(c => c.rowKey === key),\n cssClasses: this.computeRowClasses(index, entity)\n };\n\n this._rowDataMap.set(key, rowData);\n\n // Build AG Grid row data\n const row: Record<string, unknown> = {\n __pk: key\n };\n\n if (this._entityInfo) {\n for (const field of this._entityInfo.Fields) {\n row[field.Name] = entity[field.Name];\n }\n }\n\n return row;\n });\n\n this.cdr.detectChanges();\n }\n\n /**\n * Process aggregate results from RunView and emit the AggregatesLoaded event.\n * Builds the value map for easy lookup by expression or id.\n */\n private processAggregateResults(results: AggregateResult[] | undefined, executionTime?: number): void {\n this._aggregatesLoading = false;\n\n if (!results || results.length === 0) {\n this._aggregateResults = [];\n this._aggregateValues.clear();\n return;\n }\n\n this._aggregateResults = results;\n this._aggregateValues.clear();\n\n // Build the values map, keyed by alias (which is set to id or expression)\n for (const result of results) {\n if (!result.error) {\n this._aggregateValues.set(result.alias, result.value);\n }\n }\n\n // Also map by expression for easy lookup\n for (const result of results) {\n if (!result.error && result.expression !== result.alias) {\n this._aggregateValues.set(result.expression, result.value);\n }\n }\n\n // Emit the aggregates loaded event\n this.AggregatesLoaded.emit({\n results: this._aggregateResults,\n values: this._aggregateValues,\n executionTime\n });\n\n this.cdr.detectChanges();\n }\n\n private getRowKey(entity: Record<string, unknown>): string {\n // Build key from EntityInfo PK fields when available\n if (this._entityInfo) {\n return BuildPkString(entity, this._entityInfo);\n }\n // Fallback to configured key field via direct property access\n const keyValue = entity[this._keyField];\n return keyValue != null ? String(keyValue) : '';\n }\n\n private computeRowClasses(index: number, _entity: Record<string, unknown>): string[] {\n const classes: string[] = [];\n if (this._striped && index % 2 === 1) {\n classes.push('grid-row-alt');\n }\n return classes;\n }\n\n // ========================================\n // AG Grid Event Handlers\n // ========================================\n\n OnGridReady(event: GridReadyEvent): void {\n this.gridApi = event.api;\n // Let the quick filter (search box) match values in HIDDEN columns too (bug C2). AG Grid\n // defaults `includeHiddenColumnsInQuickFilter` to false, so without this a search term that\n // only exists in a column the user has hidden would match nothing — even though we now add\n // hidden columns to the col defs with hide:true precisely so they remain searchable.\n this.gridApi.setGridOption('includeHiddenColumnsInQuickFilter', true);\n this.updateSelection();\n\n if (this._sortState.length > 0) {\n this.applySortStateToGrid();\n }\n\n // Smart column sizing: use our estimated widths but ensure grid fills available space\n // without making columns excessively wide\n this.autoSizeColumnsSmartly(event.api);\n\n // Setup infinite scroll if in that mode and we have params\n if (this._paginationMode === 'infinite' && this._allowLoad && this._params) {\n this.setupInfiniteScroll();\n }\n }\n\n /** @deprecated Use {@link OnGridReady}. */\n onGridReady(event: GridReadyEvent): void {\n return this.OnGridReady(event);\n }\n\n /**\n * Smart column auto-sizing that respects our width estimates\n * while ensuring the grid fills available space appropriately\n */\n private autoSizeColumnsSmartly(api: GridApi): void {\n // With a filler present, leftover width already has a home and it is deliberately an empty one.\n // The proportional stretch below would fight that: sizeColumnsToFit() assigns explicit widths to\n // every column, which clears the filler's flex and re-introduces the stretching of real columns\n // that the filler exists to avoid.\n if (this.AgColumnDefs.some(col => col.flex)) return;\n\n // Get total estimated width from our column definitions\n const totalEstimatedWidth = this.AgColumnDefs.reduce((sum, col) => sum + (col.width || 150), 0);\n\n // Get available width from the grid container\n const gridElement = this.elementRef.nativeElement.querySelector('.mj-ag-grid');\n const availableWidth = gridElement?.clientWidth || 0;\n\n if (availableWidth > 0 && totalEstimatedWidth < availableWidth) {\n // If our columns are narrower than available space, stretch proportionally\n // but cap individual column growth to prevent excessive widths\n const ratio = availableWidth / totalEstimatedWidth;\n const maxRatio = 1.5; // Don't let columns grow more than 50%\n\n if (ratio <= maxRatio) {\n // Moderate stretch - use sizeColumnsToFit\n api.sizeColumnsToFit();\n } else {\n // Too much stretch - just use our estimated widths\n // The grid will have some empty space on the right, which is fine\n }\n }\n // If our columns are wider than available space, let the user scroll horizontally\n // (AG Grid handles this automatically)\n }\n\n OnAgRowClicked(event: RowClickedEvent): void {\n if (!this._entityInfo || !event.data) return;\n\n const pkString = event.data['__pk'] as string;\n const rowData = this._rowDataMap.get(pkString);\n if (!rowData) return;\n\n // Fire before click event\n const mouseEvent = event.event as MouseEvent;\n const beforeEvent = new BeforeRowClickEventArgs(\n this,\n rowData.entity,\n rowData.index,\n pkString,\n mouseEvent,\n undefined,\n undefined\n );\n this.BeforeRowClick.emit(beforeEvent);\n if (beforeEvent.cancel) return;\n\n // Fire after click event\n const afterEvent = new AfterRowClickEventArgs(\n this,\n rowData.entity,\n rowData.index,\n pkString,\n mouseEvent,\n undefined,\n undefined\n );\n this.AfterRowClick.emit(afterEvent);\n\n // Auto-navigate on single click (if enabled and not navigating on double-click only)\n if (this._autoNavigate && !this._navigateOnDoubleClick && this._editMode === 'none') {\n this.emitNavigationRequest(rowData.entity, pkString);\n }\n }\n\n /** @deprecated Use {@link OnAgRowClicked}. */\n onAgRowClicked(event: RowClickedEvent): void {\n return this.OnAgRowClicked(event);\n }\n\n OnAgRowDoubleClicked(event: RowDoubleClickedEvent): void {\n if (!this._entityInfo || !event.data) return;\n\n const pkString = event.data['__pk'] as string;\n const rowData = this._rowDataMap.get(pkString);\n if (!rowData) return;\n\n // Fire before double-click event\n const mouseEvent = event.event as MouseEvent;\n const beforeEvent = new BeforeRowDoubleClickEventArgs(\n this,\n rowData.entity,\n rowData.index,\n pkString,\n mouseEvent,\n undefined,\n undefined\n );\n this.BeforeRowDoubleClick.emit(beforeEvent);\n if (beforeEvent.cancel) return;\n\n // Fire after double-click event\n const afterEvent = new AfterRowDoubleClickEventArgs(\n this,\n rowData.entity,\n rowData.index,\n pkString,\n mouseEvent,\n undefined,\n undefined\n );\n this.AfterRowDoubleClick.emit(afterEvent);\n\n // Auto-navigate on double-click (if enabled)\n if (this._autoNavigate && this._navigateOnDoubleClick && this._editMode === 'none') {\n this.emitNavigationRequest(rowData.entity, pkString);\n }\n }\n\n /** @deprecated Use {@link OnAgRowDoubleClicked}. */\n onAgRowDoubleClicked(event: RowDoubleClickedEvent): void {\n return this.OnAgRowDoubleClicked(event);\n }\n\n /**\n * Handles cell click events to detect FK link clicks.\n * When a user clicks on a foreign key link, emits ForeignKeyClick event\n * for the parent component to handle navigation.\n */\n OnAgCellClicked(event: CellClickedEvent): void {\n // Check if the click was on an FK link\n const target = event.event?.target as HTMLElement;\n if (!target) {\n return;\n }\n\n // Look for the FK link element (may be the target or a parent)\n const fkLink = target.closest('.cell-fk-link') as HTMLElement;\n if (!fkLink) {\n return;\n }\n\n // Prevent the row click handler from firing\n event.event?.stopPropagation();\n\n // Extract FK data from data attributes\n const relatedEntityId = fkLink.dataset['relatedEntityId'];\n const recordId = fkLink.dataset['recordId'];\n const fieldName = fkLink.dataset['fieldName'];\n const relatedEntityName = fkLink.dataset['relatedEntityName'];\n\n if (relatedEntityId && recordId && fieldName) {\n this.ForeignKeyClick.emit({\n relatedEntityId,\n recordId,\n fieldName,\n relatedEntityName\n });\n } else {\n //console.log('[FK Debug] Missing required data attributes, not emitting');\n }\n }\n\n /** @deprecated Use {@link OnAgCellClicked}. */\n onAgCellClicked(event: CellClickedEvent): void {\n return this.OnAgCellClicked(event);\n }\n\n /**\n * Emits a navigation request for the given entity record.\n */\n private emitNavigationRequest(entity: Record<string, unknown>, compositeKey: string): void {\n if (!this._entityInfo) return;\n\n this.NavigationRequested.emit({\n entityInfo: this._entityInfo,\n record: entity,\n compositeKey\n });\n }\n\n OnAgSortChanged(event: AgSortChangedEvent): void {\n if (this.suppressSortEvents) {\n return;\n }\n\n const sortModel = event.api.getColumnState()\n .filter(col => col.sort)\n .map(col => ({\n field: col.colId,\n direction: col.sort as 'asc' | 'desc',\n index: col.sortIndex ?? 0\n }));\n\n if (sortModel.length > 0) {\n // Find the column config\n const column = this._columnStates.find(c => c.config.field === sortModel[0].field);\n\n if (column) {\n // Fire before sort event\n const beforeEvent = new BeforeSortEventArgs(\n this,\n column.config,\n sortModel[0].direction,\n sortModel.length > 1,\n this._sortState\n );\n this.BeforeSort.emit(beforeEvent);\n if (beforeEvent.cancel) {\n // Revert to previous sort state\n this.applySortStateToGrid();\n return;\n }\n }\n\n this._sortState = sortModel;\n\n if (column) {\n // Fire after sort event\n const afterEvent = new AfterSortEventArgs(\n this,\n column.config,\n sortModel[0].direction,\n this._sortState\n );\n this.AfterSort.emit(afterEvent);\n }\n\n // User changed sort - mark as dirty and emit grid state changed\n this._isGridStateDirty = true;\n this.emitGridStateChanged('sort');\n\n // Determine if we need to reload data from server or can sort client-side\n // Client-side sorting is only possible if we have ALL the data loaded\n if (this._serverSideSorting && !this._useExternalData) {\n this.loadData(true);\n }\n // When using external data, parent receives afterSort event and can reload with new sort order\n // If we have all data, AG Grid handles client-side sorting automatically\n } else {\n this._sortState = [];\n // User cleared sort - mark as dirty and emit grid state changed\n this._isGridStateDirty = true;\n this.emitGridStateChanged('sort');\n }\n }\n\n /** @deprecated Use {@link OnAgSortChanged}. */\n onAgSortChanged(event: AgSortChangedEvent): void {\n return this.OnAgSortChanged(event);\n }\n\n OnAgSelectionChanged(event: SelectionChangedEvent): void {\n const selectedNodes = event.api.getSelectedNodes();\n const previousSelection = [...this._selectedKeys];\n const newSelection = selectedNodes.map(node => node.data['__pk'] as string);\n\n // Find newly selected rows\n const addedKeys = newSelection.filter(k => !previousSelection.includes(k));\n const removedKeys = previousSelection.filter(k => !newSelection.includes(k));\n\n // Handle deselections\n for (const key of removedKeys) {\n const rowData = this._rowDataMap.get(key);\n if (rowData) {\n const beforeEvent = new BeforeRowDeselectEventArgs(\n this,\n rowData.entity,\n rowData.index,\n key,\n this._selectedKeys\n );\n this.BeforeRowDeselect.emit(beforeEvent);\n // Note: Can't cancel AG Grid's selection, but we emit the event\n }\n }\n\n // Handle selections\n for (const key of addedKeys) {\n const rowData = this._rowDataMap.get(key);\n if (rowData) {\n const beforeEvent = new BeforeRowSelectEventArgs(\n this,\n rowData.entity,\n rowData.index,\n key,\n addedKeys.length > 1,\n this._selectedKeys\n );\n this.BeforeRowSelect.emit(beforeEvent);\n // Note: Can't cancel AG Grid's selection, but we emit the event\n }\n }\n\n this._selectedKeys = newSelection;\n this.updateRowSelectionState();\n\n // Fire after events\n for (const key of removedKeys) {\n const rowData = this._rowDataMap.get(key);\n if (rowData) {\n const afterEvent = new AfterRowDeselectEventArgs(\n this,\n rowData.entity,\n rowData.index,\n key,\n this._selectedKeys,\n previousSelection\n );\n this.AfterRowDeselect.emit(afterEvent);\n }\n }\n\n for (const key of addedKeys) {\n const rowData = this._rowDataMap.get(key);\n if (rowData) {\n const afterEvent = new AfterRowSelectEventArgs(\n this,\n rowData.entity,\n rowData.index,\n key,\n addedKeys.length > 1,\n this._selectedKeys,\n previousSelection\n );\n this.AfterRowSelect.emit(afterEvent);\n }\n }\n\n this.SelectionChange.emit(this._selectedKeys);\n }\n\n /** @deprecated Use {@link OnAgSelectionChanged}. */\n onAgSelectionChanged(event: SelectionChangedEvent): void {\n return this.OnAgSelectionChanged(event);\n }\n\n OnAgColumnResized(event: ColumnResizedEvent): void {\n if (event.finished && event.source !== 'api') {\n // User manually resized a column - mark as dirty\n this._isGridStateDirty = true;\n this.emitGridStateChanged('columns');\n }\n }\n\n /** @deprecated Use {@link OnAgColumnResized}. */\n onAgColumnResized(event: ColumnResizedEvent): void {\n return this.OnAgColumnResized(event);\n }\n\n OnAgColumnMoved(event: ColumnMovedEvent): void {\n if (event.finished && event.source !== 'api') {\n // User manually moved a column - mark as dirty\n this._isGridStateDirty = true;\n this.emitGridStateChanged('columns');\n }\n }\n\n /** @deprecated Use {@link OnAgColumnMoved}. */\n onAgColumnMoved(event: ColumnMovedEvent): void {\n return this.OnAgColumnMoved(event);\n }\n\n // ========================================\n // Grid State Management\n // ========================================\n\n private emitGridStateChanged(changeType: 'columns' | 'sort' | 'filter'): void {\n if (!this.gridApi || !this._entityInfo) return;\n\n // Only emit and persist if we're dirty (user made actual changes)\n // This prevents emitting stale state during view transitions\n if (!this._isGridStateDirty) {\n return;\n }\n\n const currentState = this.buildCurrentGridState();\n\n // Emit the event for external consumers\n this.GridStateChanged.emit({\n gridState: currentState,\n changeType\n });\n\n // Schedule auto-persist if enabled, but NOT during view transitions\n // (suppressPersist prevents old view's state from being saved to new view)\n if (this._autoPersistState && !this._suppressPersist && this.CanEditCurrentView) {\n if (!this.IsDynamicView && this._viewEntity) {\n // Stored view - persist to UserView.GridState (debounced)\n // Track pending state for flush on destroy\n this._pendingViewStateToPersist = currentState;\n this.statePersistSubject.next(currentState);\n } else if (this.IsDynamicView) {\n // Dynamic view - persist to User Settings as defaults (debounced via same subject)\n // Track pending state for flush on destroy\n this._pendingUserDefaultsToPersist = currentState;\n this.userDefaultsPersistSubject.next(currentState);\n }\n }\n }\n\n /**\n * Persists the grid state to the UserView entity.\n * Only saves if the user has edit permission on the view.\n */\n private async persistGridStateToView(state: ViewGridState): Promise<void> {\n if (!this._viewEntity || this.isSavingState) {\n return;\n }\n\n // Check permission before saving\n if (!this._viewEntity.UserCanEdit) {\n this._pendingViewStateToPersist = null; // Clear pending since we can't save anyway\n return;\n }\n\n try {\n this.isSavingState = true;\n this.pendingStateToSave = state;\n\n // Mutate the existing GridState object and write back via typed setter\n const gridState = this._viewEntity.GridStateObject ?? {};\n gridState.columnSettings = state.columnSettings;\n gridState.sortSettings = state.sortSettings;\n gridState.aggregates = state.aggregates;\n this._viewEntity.GridStateObject = gridState;\n\n // Update SortState separately if changed\n if (state.sortSettings?.length) {\n this._viewEntity.SortStateObject = state.sortSettings.map(s => ({\n field: s.field,\n direction: s.dir\n }));\n }\n\n // Save the view entity\n const success = await this._viewEntity.Save();\n if (!success) {\n console.warn('[entity-data-grid] Failed to save view state:', this._viewEntity.LatestResult?.Message);\n } else {\n // Clear pending state and reset dirty flag after successful save\n this._pendingViewStateToPersist = null;\n this._isGridStateDirty = false;\n }\n } catch (error) {\n console.error('[entity-data-grid] Error persisting grid state:', error);\n } finally {\n this.isSavingState = false;\n this.pendingStateToSave = null;\n }\n }\n\n private buildCurrentGridState(): ViewGridState {\n if (!this.gridApi || !this._entityInfo || !this._entityInfo.Fields) {\n return { columnSettings: [], sortSettings: [] };\n }\n\n const columnState = this.gridApi.getColumnState();\n if (!columnState) {\n return { columnSettings: [], sortSettings: [] };\n }\n\n // Build lookup maps for existing custom properties to preserve them\n // AG Grid's column state doesn't track our custom format/userDisplayName properties,\n // so we need to carry them over from the current gridState\n const existingFormatsByName = new Map<string, ColumnFormat | undefined>();\n const existingUserDisplayNames = new Map<string, string | undefined>();\n if (this._gridState?.columnSettings) {\n for (const col of this._gridState.columnSettings) {\n const keyLower = col.Name.toLowerCase();\n if (col.format) {\n existingFormatsByName.set(keyLower, col.format);\n }\n if (col.userDisplayName) {\n existingUserDisplayNames.set(keyLower, col.userDisplayName);\n }\n }\n }\n\n const columnSettings: ViewGridColumnSetting[] = [];\n // Collect sorted columns with their sortIndex for proper ordering\n const sortedColumns: Array<{ field: string; dir: 'asc' | 'desc'; sortIndex: number }> = [];\n\n for (let i = 0; i < columnState.length; i++) {\n const col = columnState[i];\n if (col.colId === ROW_NUMBER_FIELD) continue; // Skip row number column\n\n // Case-insensitive: `colId` originates from a colDef's `field`, which for host-supplied\n // columns is whatever the page wrote. `canonicalizeHostColumns()` normally settles that\n // before we get here, but an exact-case miss silently DROPS the column from the captured\n // state — and that state is what the grid is rebuilt from, so the column would disappear\n // entirely the first time a user resized anything. Too quiet a failure to leave to one guard.\n const field = this._entityInfo.Fields.find(f => f.Name.toLowerCase() === col.colId?.toLowerCase());\n\n if (field) {\n const keyLower = field.Name.toLowerCase();\n const colConfig: ViewGridColumnSetting = {\n ID: field.ID,\n Name: field.Name,\n DisplayName: field.DisplayNameOrName,\n hidden: col.hide ?? false,\n width: col.width ?? undefined,\n orderIndex: i\n };\n\n // Preserve format from existing gridState if present\n const existingFormat = existingFormatsByName.get(keyLower);\n if (existingFormat) {\n colConfig.format = existingFormat;\n }\n\n // Preserve userDisplayName from existing gridState if present\n const existingUserDisplayName = existingUserDisplayNames.get(keyLower);\n if (existingUserDisplayName) {\n colConfig.userDisplayName = existingUserDisplayName;\n }\n\n columnSettings.push(colConfig);\n }\n\n if (col.sort) {\n sortedColumns.push({\n field: col.colId,\n dir: col.sort as 'asc' | 'desc',\n sortIndex: col.sortIndex ?? 0\n });\n }\n }\n\n // Carry forward the settings for columns FIELD SECURITY hid from this user.\n //\n // This state is captured from the rendered AG Grid, and a denied column is not rendered —\n // so without this it would be missing from the captured state, that state is persisted as\n // the user's column PREFERENCE, and the column is gone permanently. It would not come back\n // when the denial was lifted, because by then the saved preference genuinely no longer\n // lists it. A temporary restriction must never be recorded as a durable preference.\n //\n // Ordering is intentionally not recomputed: the retained entries keep their previous\n // orderIndex, so restoring access puts the column back roughly where it was rather than\n // appending it to the end.\n const deniedReadFields = this.deniedReadFieldsFor(this._entityInfo);\n if (deniedReadFields.size > 0) {\n const captured = new Set(columnSettings.map(c => c.Name.toLowerCase()));\n // Prefer the settings the user already had; fall back to the column MODEL, which still\n // lists denied fields, for the case where they are saving grid state for the first time\n // while the restriction is in force and there is no prior entry to preserve.\n const priorByName = new Map<string, ViewGridColumnSetting>();\n for (const prior of this._gridState?.columnSettings ?? []) {\n priorByName.set(prior.Name.trim().toLowerCase(), prior);\n }\n // Position is resolved against the column that preceded it in the PRIOR state, not by its\n // own old orderIndex: the captured entries were renumbered by render position, so the two\n // index spaces no longer line up once a hidden column has been removed from the middle.\n // A fractional index slots the retained column back between its old neighbours; the whole\n // list is renumbered to integers afterwards.\n const capturedIndexByName = new Map(columnSettings.map((c, i) => [c.Name.toLowerCase(), i]));\n const priorOrdered = [...(this._gridState?.columnSettings ?? [])]\n .sort((a, b) => (a.orderIndex ?? 0) - (b.orderIndex ?? 0));\n\n const positionFor = (name: string): number => {\n const priorIndex = priorOrdered.findIndex(c => c.Name.trim().toLowerCase() === name);\n for (let back = priorIndex - 1; back >= 0; back--) {\n const anchor = capturedIndexByName.get(priorOrdered[back].Name.toLowerCase());\n if (anchor !== undefined) {\n return anchor + 0.5;\n }\n }\n return priorIndex >= 0 ? -0.5 : columnSettings.length;\n };\n\n for (const denied of deniedReadFields) {\n if (captured.has(denied)) {\n continue;\n }\n const prior = priorByName.get(denied);\n if (prior) {\n columnSettings.push({ ...prior, orderIndex: positionFor(denied) });\n continue;\n }\n const modelled = this._columns.find(c => c.field.trim().toLowerCase() === denied);\n const field = this._entityInfo.Fields.find(f => f.Name.trim().toLowerCase() === denied);\n if (modelled && field) {\n columnSettings.push({\n ID: field.ID,\n Name: field.Name,\n DisplayName: field.DisplayNameOrName,\n hidden: false,\n orderIndex: columnSettings.length\n });\n }\n }\n columnSettings.sort((a, b) => (a.orderIndex ?? 0) - (b.orderIndex ?? 0));\n columnSettings.forEach((c, i) => { c.orderIndex = i; });\n }\n\n // Sort by sortIndex to maintain correct multi-sort priority order\n sortedColumns.sort((a, b) => a.sortIndex - b.sortIndex);\n const sortSettings: ViewGridSortSetting[] = sortedColumns.map(s => ({\n field: s.field,\n dir: s.dir\n }));\n\n // Include current aggregates config in the state\n return {\n columnSettings,\n sortSettings,\n aggregates: this._aggregatesConfig || this._gridState?.aggregates\n };\n }\n\n private applySortStateToGrid(): void {\n if (!this.gridApi || this.gridApi.isDestroyed() || this._sortState.length === 0) {\n return;\n }\n\n const currentColumnState = this.gridApi.getColumnState();\n if (!currentColumnState) {\n return;\n }\n\n // Suppress sort events while we programmatically apply sort state.\n // AG Grid fires sortChanged ASYNCHRONOUSLY (via setTimeout) after applyColumnState,\n // so we must keep the flag true across the async boundary and clear it with setTimeout(0).\n this.suppressSortEvents = true;\n const columnState = currentColumnState.map(col => {\n const sort = this._sortState.find(s => s.field === col.colId);\n return {\n ...col,\n sort: sort ? sort.direction : null,\n sortIndex: sort ? sort.index : null\n };\n });\n this.gridApi.applyColumnState({ state: columnState });\n // Clear after AG Grid's async event queue drains\n setTimeout(() => { this.suppressSortEvents = false; }, 0);\n }\n\n private updateSelection(): void {\n if (!this.gridApi || this._selectedKeys.length === 0) {\n this.gridApi?.deselectAll();\n return;\n }\n\n for (const key of this._selectedKeys) {\n const node = this.gridApi.getRowNode(key);\n if (node) {\n node.setSelected(true);\n }\n }\n }\n\n private updateRowSelectionState(): void {\n for (const rowData of this._rowDataMap.values()) {\n rowData.selected = this._selectedKeys.includes(rowData.key);\n }\n this.cdr.detectChanges();\n }\n\n // ========================================\n // Selection Public Methods\n // ========================================\n\n SelectRows(keys: string[], additive: boolean = false): void {\n if (!this.gridApi) return;\n\n if (!additive) {\n this.gridApi.deselectAll();\n }\n\n for (const key of keys) {\n const node = this.gridApi.getRowNode(key);\n if (node) {\n node.setSelected(true, !additive);\n }\n }\n }\n\n DeselectRows(keys: string[]): void {\n if (!this.gridApi) return;\n\n for (const key of keys) {\n const node = this.gridApi.getRowNode(key);\n if (node) {\n node.setSelected(false);\n }\n }\n }\n\n SelectAll(): void {\n this.gridApi?.selectAll();\n }\n\n ClearSelection(): void {\n this.gridApi?.deselectAll();\n }\n\n GetSelectedRows(): Record<string, unknown>[] {\n return this._selectedKeys\n .map(key => this._rowDataMap.get(key)?.entity)\n .filter((e): e is Record<string, unknown> => e !== undefined);\n }\n\n IsRowSelected(key: string): boolean {\n return this._selectedKeys.includes(key);\n }\n\n /**\n * Scrolls the grid to make the specified row visible.\n * @param key The primary key of the row to scroll to\n * @param position Where to position the row: 'top', 'middle', or 'bottom'\n */\n EnsureRowVisible(key: string, position: 'top' | 'middle' | 'bottom' = 'middle'): void {\n if (!this.gridApi) return;\n\n const node = this.gridApi.getRowNode(key);\n if (node) {\n this.gridApi.ensureNodeVisible(node, position);\n }\n }\n\n // ========================================\n // Public Methods\n // ========================================\n\n async Refresh(): Promise<void> {\n await this.loadData(false);\n }\n\n Clear(): void {\n this._allData = [];\n this._data = [];\n this._rowDataMap.clear();\n this._selectedKeys = [];\n this.RowData = [];\n this.totalRowCount = 0;\n this.cdr.detectChanges();\n }\n\n GetData(): Record<string, unknown>[] {\n return this._useExternalData ? [...this._data] : [...this._allData];\n }\n\n GetRowByKey(key: string): Record<string, unknown> | undefined {\n return this._rowDataMap.get(key)?.entity;\n }\n\n GetRowByIndex(index: number): Record<string, unknown> | undefined {\n const dataSource = this._useExternalData ? this._data : this._allData;\n return dataSource[index];\n }\n\n GetState(): GridState {\n return {\n columns: this._columnStates.map(c => ({\n field: c.config.field,\n width: c.computedWidth,\n visible: c.visible,\n order: c.order\n })),\n sort: [...this._sortState],\n filters: [...this._filterState],\n selection: [...this._selectedKeys]\n };\n }\n\n SetState(state: GridState): void {\n for (const colState of state.columns) {\n const column = this._columnStates.find(c => c.config.field === colState.field);\n if (column) {\n column.computedWidth = colState.width;\n column.visible = colState.visible;\n column.order = colState.order;\n }\n }\n\n this._sortState = [...state.sort];\n for (const sort of this._sortState) {\n const column = this._columnStates.find(c => c.config.field === sort.field);\n if (column) {\n column.sortDirection = sort.direction;\n column.sortIndex = sort.index;\n }\n }\n\n this._filterState = [...state.filters];\n this._selectedKeys = [...state.selection];\n this.updateRowSelectionState();\n\n this.buildAgColumnDefs();\n this.cdr.detectChanges();\n }\n\n ResetState(): void {\n this.initializeColumnStates();\n this._sortState = [];\n this._filterState = [];\n this.ClearSelection();\n this.buildAgColumnDefs();\n this.cdr.detectChanges();\n }\n\n // ========================================\n // State Persistence\n // ========================================\n\n private scheduleStateSave(): void {\n if (!this._stateKey) return;\n this.statesSaveSubject.next();\n }\n\n private async loadPersistedState(): Promise<void> {\n // TODO: Load state from User Settings entity\n }\n\n // ========================================\n // Toolbar Click Handlers\n // ========================================\n\n OnAddClick(): void {\n // Emit legacy events for backward compatibility\n this.AddRequested.emit();\n this.NewButtonClick.emit();\n\n // Emit navigation events based on CreateRecordMode\n if (this._entityInfo) {\n if (this._createRecordMode === 'Dialog') {\n this.NewRecordDialogRequested.emit({\n entityInfo: this._entityInfo,\n defaultValues: this._newRecordValues\n });\n } else {\n this.NewRecordTabRequested.emit({\n entityInfo: this._entityInfo,\n defaultValues: this._newRecordValues\n });\n }\n }\n }\n\n /** @deprecated Use {@link OnAddClick}. */\n onAddClick(): void {\n return this.OnAddClick();\n }\n\n OnDeleteClick(): void {\n const selectedRows = this.GetSelectedRows();\n if (selectedRows.length > 0) {\n this.DeleteRequested.emit(selectedRows);\n this.DeleteButtonClick.emit(selectedRows);\n }\n }\n\n /** @deprecated Use {@link OnDeleteClick}. */\n onDeleteClick(): void {\n return this.OnDeleteClick();\n }\n\n OnExportClick(): void {\n this.ExportRequested.emit();\n this.ExportButtonClick.emit();\n // Show the export dialog\n void this.showExportDialogForCurrentData();\n }\n\n /** @deprecated Use {@link OnExportClick}. */\n onExportClick(): void {\n return this.OnExportClick();\n }\n\n /**\n * Shows the export dialog for the full result set (falling back to the loaded page when no\n * ExportDataProvider is supplied).\n */\n private async showExportDialogForCurrentData(): Promise<void> {\n this.IsPreparingExport = true;\n this.cdr.detectChanges();\n let data: ExportData;\n try {\n data = await this.resolveExportData();\n } finally {\n this.IsPreparingExport = false;\n }\n const columns = this.GetExportColumns();\n const fileName = this.getDefaultExportFileName();\n\n this.ExportDialogConfig = {\n data,\n columns,\n defaultFileName: fileName,\n availableFormats: ['excel', 'csv', 'json'],\n defaultFormat: 'excel',\n showSamplingOptions: true,\n defaultSamplingMode: 'all',\n dialogTitle: `Export ${this._entityInfo?.Name || 'Data'}`\n };\n this.ShowExportDialog = true;\n this.cdr.detectChanges();\n }\n\n /**\n * Handle export dialog close\n */\n OnExportDialogClosed(result: ExportDialogResult): void {\n this.ShowExportDialog = false;\n this.ExportDialogConfig = null;\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link OnExportDialogClosed}. */\n onExportDialogClosed(result: ExportDialogResult): void {\n return this.OnExportDialogClosed(result);\n }\n\n /**\n * Export grid data directly without showing dialog.\n * Use this for programmatic export with specific options.\n * @param options Export options (format, sampling, etc.)\n * @param download If true, automatically downloads the file. Default true.\n * @returns Export result with data buffer and metadata\n */\n async Export(options?: Partial<ExportOptions>, download: boolean = true): Promise<ExportResult> {\n const data = await this.resolveExportData();\n const columns = this.GetExportColumns();\n const fileName = options?.fileName || this.getDefaultExportFileName();\n\n const exportOptions: Partial<ExportOptions> = {\n format: 'excel',\n fileName,\n columns,\n includeHeaders: true,\n ...options\n };\n\n const result = await this.exportService.export(data, exportOptions);\n\n if (result.success && download) {\n this.exportService.downloadResult(result);\n }\n\n return result;\n }\n\n /**\n * Export to Excel format directly (convenience method)\n * @param download If true, automatically downloads the file. Default true.\n */\n async ExportToExcel(download: boolean = true): Promise<ExportResult> {\n return this.Export({ format: 'excel' }, download);\n }\n\n /**\n * Export to CSV format directly (convenience method)\n * @param download If true, automatically downloads the file. Default true.\n */\n async ExportToCSV(download: boolean = true): Promise<ExportResult> {\n return this.Export({ format: 'csv' }, download);\n }\n\n /**\n * Export to JSON format directly (convenience method)\n * @param download If true, automatically downloads the file. Default true.\n */\n async ExportToJSON(download: boolean = true): Promise<ExportResult> {\n return this.Export({ format: 'json' }, download);\n }\n\n /**\n * Resolves the rows to export. An explicit row selection always wins — export exactly the rows the\n * user picked (matches the Query viewer's behavior). With NO selection, the FULL result set is\n * fetched via the host's ExportDataProvider so export isn't silently capped at the current page\n * (bug C1). So: \"export these\" = select rows first; \"export everything\" = export with nothing\n * selected. If no provider is supplied or the fetch yields nothing, falls back to the loaded page.\n */\n private async resolveExportData(): Promise<ExportData> {\n const selected = this.GetSelectedRows();\n if (selected.length > 0) {\n return selected.map(row => row as Record<string, unknown>);\n }\n if (this.ExportDataProvider) {\n try {\n const allRows = await this.ExportDataProvider();\n if (allRows && allRows.length > 0) {\n return allRows.map(row => row as Record<string, unknown>);\n }\n } catch {\n // Fall through to the loaded page on any fetch failure.\n }\n }\n // rowData is already plain Record<string, unknown>[] objects - return directly\n return this.RowData.map(row => row as Record<string, unknown>);\n }\n\n /**\n * The columns the grid is showing, in the order it shows them, with the headers it shows. This is the\n * single source for every export path — the toolbar's Export button, {@link Export}, and hosts such as\n * the view workspace — so an export always matches the screen. It reads the rendered AG Grid columns\n * rather than the host-declared `Columns` or a saved grid state, because either of those can differ\n * from the screen in order, visibility or header text. Before the grid has rendered, it falls back to\n * the column definitions it is about to render.\n */\n public GetExportColumns(): ExportColumn[] {\n const displayed = this.gridApi?.getAllDisplayedColumns() ?? [];\n const defs = displayed.length > 0\n ? displayed.map(c => c.getColDef())\n : this.AgColumnDefs.filter(d => !d.hide);\n\n // No `width`: ExportColumn.width is in characters, while grid widths are pixels, so passing them\n // made a 150px column 150 characters wide. Left unset, the Excel exporter auto-fits each column.\n return defs\n .filter(def => this.isExportableColumn(def))\n .map(def => {\n const colField = def.field as string;\n // Case-insensitive, matching how col defs and auto-width resolve a host's field name.\n const field = this._entityInfo?.Fields.find(f => f.Name.toLowerCase() === colField.toLowerCase());\n return {\n // The entity's spelling, because `name` is the KEY the export engine reads each row by\n // (`row[col.name]`) and rows are keyed from entity metadata. The host's spelling here\n // exported a correctly-headed column of blank cells.\n name: field?.Name ?? colField,\n displayName: def.headerName || field?.DisplayNameOrName || colField,\n dataType: this.mapFieldTypeToExportType(field?.Type)\n };\n });\n }\n\n /** A data column: not the layout filler, not the row-number column, and bound to a field. */\n private isExportableColumn(def: ColDef): boolean {\n return !!def.field && def.field !== ROW_NUMBER_FIELD && def.colId !== FILLER_COLUMN_ID;\n }\n\n /**\n * Map MemberJunction field types to export column types\n */\n private mapFieldTypeToExportType(fieldType?: string): ExportColumn['dataType'] {\n if (!fieldType) return 'string';\n\n const type = fieldType.toLowerCase();\n if (type.includes('int') || type.includes('decimal') || type.includes('float') || type.includes('numeric')) {\n return 'number';\n }\n if (type.includes('date') || type.includes('time')) {\n return 'date';\n }\n if (type.includes('bit') || type.includes('bool')) {\n return 'boolean';\n }\n if (type.includes('money') || type.includes('currency')) {\n return 'currency';\n }\n return 'string';\n }\n\n /**\n * Generate default file name for export\n */\n private getDefaultExportFileName(): string {\n const entityName = this._entityInfo?.Name || 'export';\n const timestamp = new Date().toISOString().slice(0, 10);\n return `${entityName}_${timestamp}`;\n }\n\n OnRefreshClick(): void {\n this.RefreshButtonClick.emit();\n this.Refresh();\n }\n\n /** @deprecated Use {@link OnRefreshClick}. */\n onRefreshClick(): void {\n return this.OnRefreshClick();\n }\n\n OnCompareClick(): void {\n const selectedRows = this.GetSelectedRows();\n if (selectedRows.length >= 2) {\n // Emit legacy event for backward compatibility\n this.CompareButtonClick.emit(selectedRows);\n\n // Emit new structured event for Explorer dialogs\n if (this._entityInfo) {\n this.CompareRecordsRequested.emit({\n entityInfo: this._entityInfo,\n records: selectedRows\n });\n }\n }\n }\n\n /** @deprecated Use {@link OnCompareClick}. */\n onCompareClick(): void {\n return this.OnCompareClick();\n }\n\n OnMergeClick(): void {\n const selectedRows = this.GetSelectedRows();\n if (selectedRows.length >= 2) {\n // Emit legacy event for backward compatibility\n this.MergeButtonClick.emit(selectedRows);\n\n // Emit new structured event for Explorer dialogs\n if (this._entityInfo) {\n this.MergeRecordsRequested.emit({\n entityInfo: this._entityInfo,\n records: selectedRows\n });\n }\n }\n }\n\n /** @deprecated Use {@link OnMergeClick}. */\n onMergeClick(): void {\n return this.OnMergeClick();\n }\n\n async OnAddToListClick(): Promise<void> {\n let rows = this.GetSelectedRows();\n\n // No explicit selection → add EVERY matching record, not just the loaded page. Without this,\n // building a list from a sizeable view meant selecting-all page by page (bug E3). We fetch the\n // full result set via the host-supplied provider; the downstream list dialog still requires the\n // user to pick a target list and confirm, so nothing is committed implicitly.\n if (rows.length === 0 && this.ExportDataProvider) {\n this.IsPreparingAddToList = true;\n this.cdr.detectChanges();\n try {\n rows = await this.ExportDataProvider();\n } catch {\n rows = [];\n } finally {\n this.IsPreparingAddToList = false;\n this.cdr.detectChanges();\n }\n }\n\n if (rows.length > 0) {\n // Emit legacy event for backward compatibility\n this.AddToListButtonClick.emit(rows);\n\n // Emit new structured event with record IDs for list management\n if (this._entityInfo) {\n const recordIds = rows.map(r => {\n return BuildPkString(r, this._entityInfo!);\n });\n this.AddToListRequested.emit({\n entityInfo: this._entityInfo,\n records: rows,\n recordIds\n });\n }\n }\n }\n\n /** @deprecated Use {@link OnAddToListClick}. */\n async onAddToListClick(): Promise<void> {\n return this.OnAddToListClick();\n }\n\n OnDuplicateSearchClick(): void {\n const selectedRows = this.GetSelectedRows();\n if (selectedRows.length >= 2) {\n // Emit legacy event for backward compatibility\n this.DuplicateSearchButtonClick.emit(selectedRows);\n\n // Emit new structured event for Explorer dialogs\n if (this._entityInfo) {\n this.DuplicateSearchRequested.emit({\n entityInfo: this._entityInfo,\n records: selectedRows\n });\n }\n }\n }\n\n /** @deprecated Use {@link OnDuplicateSearchClick}. */\n onDuplicateSearchClick(): void {\n return this.OnDuplicateSearchClick();\n }\n\n OnCommunicationClick(): void {\n const selectedRows = this.GetSelectedRows();\n if (selectedRows.length > 0) {\n // Emit legacy event for backward compatibility\n this.CommunicationButtonClick.emit(selectedRows);\n\n // Emit new structured event for Explorer dialogs\n if (this._entityInfo) {\n this.CommunicationRequested.emit({\n entityInfo: this._entityInfo,\n records: selectedRows,\n viewParams: this._params\n });\n }\n }\n }\n\n /** @deprecated Use {@link OnCommunicationClick}. */\n onCommunicationClick(): void {\n return this.OnCommunicationClick();\n }\n\n /**\n * \"Manage Columns\" / column-chooser toolbar affordance. The grid is generic and doesn't own a\n * column-management UI, so it raises {@link ManageColumnsRequested} for its host to handle —\n * in the entity-viewer/workspace this opens the view's config panel (Columns tab), the canonical\n * column editor backed by `UserView.GridState`. Hosts that embed the grid standalone can handle\n * this to surface their own column UI.\n */\n OnColumnChooserClick(): void {\n this.ManageColumnsRequested.emit();\n }\n\n /** @deprecated Use {@link OnColumnChooserClick}. */\n onColumnChooserClick(): void {\n return this.OnColumnChooserClick();\n }\n\n /**\n * The runtime-UX driver currently mounted over the grid (e.g. the Record Process bulk-update runner),\n * or null when none. Set when an action whose invocation names a `RuntimeUXDriverClass` is clicked.\n */\n public ActiveRuntimeDriver: { DriverClass: string; Context: EntityActionUXContext } | null = null;\n\n /**\n * Handles entity action click from the overflow menu. When the action names a runtime-UX driver, the\n * grid mounts that interactive driver in-place (no parent wiring required); otherwise it emits\n * `EntityActionRequested` for the host to invoke the action the classic way.\n */\n OnEntityActionClick(action: EntityActionConfig): void {\n if (!this._entityInfo) return;\n\n if (action.runtimeUXDriverClass) {\n this.mountRuntimeDriver(action);\n return;\n }\n\n this.EntityActionRequested.emit({\n entityInfo: this._entityInfo,\n action,\n selectedRecords: this.GetSelectedRows()\n });\n }\n\n /** @deprecated Use {@link OnEntityActionClick}. */\n onEntityActionClick(action: EntityActionConfig): void {\n return this.OnEntityActionClick(action);\n }\n\n /** Builds the driver context from the current entity + selection and mounts the named driver. */\n private mountRuntimeDriver(action: EntityActionConfig): void {\n const entity = this._entityInfo!;\n // The grid's entity is arbitrary (any key column name, possibly composite), so each selected row's\n // identity is its full primary key in the compact record-id form the record-process engine reads\n // back with CompositeKey.FromURLSegment — a bare value for single-column keys, `F1|v1||F2|v2` otherwise.\n const selectedRecordIDs = this.GetSelectedRows()\n .map(r => CompositeKey.FromEntityRecord(entity, r).ToCompactURLSegment())\n .filter(id => id.length > 0);\n this.ActiveRuntimeDriver = {\n DriverClass: action.runtimeUXDriverClass!,\n Context: {\n EntityInfo: entity,\n ScopeKind: 'records',\n SelectedRecordIDs: selectedRecordIDs,\n Config: action.metadata ?? {},\n Provider: this.ProviderToUse,\n ContextUser: this.ProviderToUse?.CurrentUser,\n ActionLabel: action.name\n }\n };\n }\n\n /** The mounted driver finished — refresh the grid when it changed data, then unmount. */\n async OnRuntimeDriverCompleted(result: EntityActionUXResult): Promise<void> {\n this.ActiveRuntimeDriver = null;\n if (result?.RefreshData) {\n await this.Refresh();\n }\n }\n\n /** The user dismissed the mounted driver without applying — just unmount. */\n OnRuntimeDriverCancelled(): void {\n this.ActiveRuntimeDriver = null;\n }\n\n /**\n * Checks if an entity action is currently enabled based on selection requirements\n */\n IsEntityActionEnabled(action: EntityActionConfig): boolean {\n if (!action.requiresSelection) return true;\n\n const selectedCount = this._selectedKeys.length;\n if (selectedCount === 0) return false;\n\n if (action.minSelectedRecords && selectedCount < action.minSelectedRecords) return false;\n if (action.maxSelectedRecords && selectedCount > action.maxSelectedRecords) return false;\n\n return true;\n }\n\n /** @deprecated Use {@link IsEntityActionEnabled}. */\n isEntityActionEnabled(action: EntityActionConfig): boolean {\n return this.IsEntityActionEnabled(action);\n }\n\n // ========================================\n // Overflow Menu Methods\n // ========================================\n\n ToggleOverflowMenu(): void {\n this.ShowOverflowMenu = !this.ShowOverflowMenu;\n this.cdr.detectChanges();\n\n // Add click outside listener when menu is open\n if (this.ShowOverflowMenu) {\n setTimeout(() => {\n document.addEventListener('click', this.handleOutsideClick);\n }, 0);\n } else {\n document.removeEventListener('click', this.handleOutsideClick);\n }\n }\n\n /** @deprecated Use {@link ToggleOverflowMenu}. */\n toggleOverflowMenu(): void {\n return this.ToggleOverflowMenu();\n }\n\n CloseOverflowMenu(): void {\n this.ShowOverflowMenu = false;\n document.removeEventListener('click', this.handleOutsideClick);\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link CloseOverflowMenu}. */\n closeOverflowMenu(): void {\n return this.CloseOverflowMenu();\n }\n\n private handleOutsideClick = (): void => {\n this.CloseOverflowMenu();\n };\n\n // Overflow menu visibility helpers\n get HasOverflowMenuItems(): boolean {\n return this.ShowExportInOverflow ||\n this.ShowColumnChooserInOverflow ||\n (this._showEntityActionButtons && this._entityActions.length > 0) ||\n this.HasSelectionDependentOverflowActions;\n }\n\n /** @deprecated Use {@link HasOverflowMenuItems}. */\n get hasOverflowMenuItems(): boolean {\n return this.HasOverflowMenuItems;\n }\n\n get ShowExportInOverflow(): boolean {\n // Export is in overflow when it's not shown as a primary button\n return !this.ShowExportButton && !!this.ToolbarConfig.showExport;\n }\n\n /** @deprecated Use {@link ShowExportInOverflow}. */\n get showExportInOverflow(): boolean {\n return this.ShowExportInOverflow;\n }\n\n get ShowColumnChooserInOverflow(): boolean {\n return this.AllowColumnToggle && !this.ToolbarConfig.showColumnChooser;\n }\n\n /** @deprecated Use {@link ShowColumnChooserInOverflow}. */\n get showColumnChooserInOverflow(): boolean {\n return this.ShowColumnChooserInOverflow;\n }\n\n get HasSelectionDependentOverflowActions(): boolean {\n return this.ShowCommunicationInOverflow;\n }\n\n /** @deprecated Use {@link HasSelectionDependentOverflowActions}. */\n get hasSelectionDependentOverflowActions(): boolean {\n return this.HasSelectionDependentOverflowActions;\n }\n\n get ShowCommunicationInOverflow(): boolean {\n // Communication is in overflow when it's not shown as a primary button\n return !this.ShowCommunicationButton && this.HasSelection && this.EntitySupportsCommunication;\n }\n\n /** @deprecated Use {@link ShowCommunicationInOverflow}. */\n get showCommunicationInOverflow(): boolean {\n return this.ShowCommunicationInOverflow;\n }\n\n // ========================================\n // Toolbar Button State Helpers\n // ========================================\n\n get HasSelection(): boolean {\n return this._selectedKeys.length > 0;\n }\n\n get HasMultipleSelection(): boolean {\n return this._selectedKeys.length >= 2;\n }\n\n // ========================================\n // CSS Helpers\n // ========================================\n\n get GridContainerClasses(): string[] {\n const classes = ['mj-grid-container'];\n classes.push(`grid-lines-${this._gridLines}`);\n if (this._striped) classes.push('grid-striped');\n\n // Add visual config classes\n const vc = this.EffectiveVisualConfig;\n classes.push(`header-style-${vc.headerStyle}`);\n if (vc.headerShadow) classes.push('header-shadow');\n if (vc.alternateRows) classes.push(`alternate-rows-${vc.alternateRowContrast}`);\n if (vc.hoverTransitions) classes.push('hover-transitions');\n classes.push(`cell-padding-${vc.cellPadding}`);\n if (vc.checkboxStyle !== 'default') classes.push(`checkbox-style-${vc.checkboxStyle}`);\n\n return classes;\n }\n\n /** @deprecated Use {@link GridContainerClasses}. */\n get gridContainerClasses(): string[] {\n return this.GridContainerClasses;\n }\n\n /**\n * Apply visual configuration by setting CSS custom properties\n */\n private applyVisualConfig(): void {\n const vc = this.EffectiveVisualConfig;\n const el = this.elementRef.nativeElement;\n\n // Set CSS custom properties for dynamic values\n if (vc.headerBackground) {\n el.style.setProperty('--grid-header-bg', vc.headerBackground);\n }\n if (vc.headerTextColor) {\n el.style.setProperty('--grid-header-text', vc.headerTextColor);\n }\n if (vc.selectionIndicatorColor) {\n el.style.setProperty('--grid-selection-indicator-color', vc.selectionIndicatorColor);\n }\n if (vc.selectionIndicatorWidth) {\n el.style.setProperty('--grid-selection-indicator-width', `${vc.selectionIndicatorWidth}px`);\n }\n if (vc.selectionBackground) {\n el.style.setProperty('--grid-row-selected-bg', vc.selectionBackground);\n }\n if (vc.checkboxColor) {\n el.style.setProperty('--grid-checkbox-color', vc.checkboxColor);\n }\n if (vc.borderRadius !== undefined) {\n el.style.setProperty('--grid-border-radius', `${vc.borderRadius}px`);\n }\n if (vc.accentColor) {\n el.style.setProperty('--grid-accent-color', vc.accentColor);\n el.style.setProperty('--grid-sort-indicator-color', vc.accentColor);\n }\n if (vc.hoverTransitionDuration) {\n el.style.setProperty('--grid-hover-transition', `${vc.hoverTransitionDuration}ms`);\n }\n\n // Rebuild column defs if formatting options changed\n if (this._entityInfo) {\n this.buildAgColumnDefs();\n }\n }\n\n get GridHeightStyle(): string {\n if (typeof this._height === 'number') {\n return `${this._height}px`;\n }\n return this._height === 'auto' ? '100%' : 'fit-content';\n }\n\n /** @deprecated Use {@link GridHeightStyle}. */\n get gridHeightStyle(): string {\n return this.GridHeightStyle;\n }\n\n // ========================================\n // Toolbar Button Helpers\n // ========================================\n\n IsButtonVisible(button: GridToolbarButton): boolean {\n if (button.visible === undefined) return true;\n if (typeof button.visible === 'boolean') return button.visible;\n if (typeof button.visible === 'function') return button.visible();\n return true;\n }\n\n /** @deprecated Use {@link IsButtonVisible}. */\n isButtonVisible(button: GridToolbarButton): boolean {\n return this.IsButtonVisible(button);\n }\n\n IsButtonDisabled(button: GridToolbarButton): boolean {\n if (button.disabled === undefined) return false;\n if (typeof button.disabled === 'boolean') return button.disabled;\n if (typeof button.disabled === 'function') return button.disabled();\n return false;\n }\n\n /** @deprecated Use {@link IsButtonDisabled}. */\n isButtonDisabled(button: GridToolbarButton): boolean {\n return this.IsButtonDisabled(button);\n }\n\n OnToolbarButtonClick(button: GridToolbarButton): void {\n if (button.onClick) {\n button.onClick();\n }\n }\n\n /** @deprecated Use {@link OnToolbarButtonClick}. */\n onToolbarButtonClick(button: GridToolbarButton): void {\n return this.OnToolbarButtonClick(button);\n }\n\n // ========================================\n // Public Getters\n // ========================================\n\n get VisibleRows(): GridRowData[] {\n return Array.from(this._rowDataMap.values());\n }\n\n get VisibleColumnStates(): ColumnRuntimeState[] {\n return this._columnStates\n .filter(c => c.visible)\n .sort((a, b) => a.order - b.order);\n }\n}\n\n","<!-- Grid Container -->\n<div\n #gridContainer\n [class]=\"gridContainerClasses.join(' ')\"\n [style.height]=\"gridHeightStyle\">\n\n <!-- Toolbar -->\n @if (ShowToolbar) {\n <div class=\"mj-grid-toolbar\">\n <div class=\"toolbar-left\">\n <!-- Search -->\n @if (ShowSearch) {\n <div class=\"toolbar-search\">\n <i class=\"fa-solid fa-search search-icon\"></i>\n <input\n type=\"text\"\n class=\"search-input\"\n [placeholder]=\"ToolbarConfig.searchPlaceholder || 'Search...'\"\n [value]=\"FilterText\"\n (input)=\"FilterText = $any($event.target).value\" />\n @if (FilterText) {\n <button\n class=\"search-clear\"\n (click)=\"FilterText = ''\"\n aria-label=\"Clear search\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n }\n </div>\n }\n <!-- Custom Left Buttons -->\n @for (button of ToolbarConfig.customButtons; track button) {\n @if (button.position !== 'right' && isButtonVisible(button)) {\n <button\n class=\"toolbar-button\"\n [class]=\"button.cssClass\"\n [disabled]=\"isButtonDisabled(button)\"\n [title]=\"button.tooltip || ''\"\n (click)=\"onToolbarButtonClick(button)\">\n @if (button.icon) {\n <i [class]=\"button.icon\"></i>\n }\n @if (button.text) {\n <span>{{ button.text }}</span>\n }\n </button>\n }\n }\n </div>\n <div class=\"toolbar-center\">\n <!-- Row Count -->\n @if (ToolbarConfig.showRowCount !== false) {\n <span class=\"row-count\">\n {{ totalRowCount }} {{ totalRowCount === 1 ? 'row' : 'rows' }}\n </span>\n }\n <!-- Selection Count -->\n @if (ToolbarConfig.showSelectionCount && SelectedKeys.length > 0) {\n <span class=\"selection-count\">\n ({{ SelectedKeys.length }} selected)\n </span>\n }\n </div>\n <div class=\"toolbar-right\">\n <!-- Recycle Bin chip — auto-hides when no deleted records, no tracking,\n or user lacks Delete permission. -->\n @if (ShowRecycleBin) {\n <mj-recycle-bin-chip [EntityName]=\"entityInfoName\"></mj-recycle-bin-chip>\n }\n <!-- New/Add Button (predefined) -->\n @if (ShowNewButton) {\n <button\n class=\"toolbar-button\"\n title=\"Create new record\"\n (click)=\"onAddClick()\">\n <i class=\"fa-solid fa-plus\"></i>\n <span class=\"button-text\">New</span>\n </button>\n }\n <!-- Refresh Button (predefined) -->\n @if (ShowRefreshButton) {\n <button\n class=\"toolbar-button\"\n title=\"Refresh data\"\n [disabled]=\"loading\"\n (click)=\"onRefreshClick()\">\n <i class=\"fa-solid fa-arrows-rotate\" [class.fa-spin]=\"loading\"></i>\n <span class=\"button-text\">Refresh</span>\n </button>\n }\n <!-- Export Button (predefined) -->\n @if (ShowExportButton) {\n <button\n class=\"toolbar-button\"\n title=\"Export\"\n [disabled]=\"IsPreparingExport\"\n (click)=\"onExportClick()\">\n <i class=\"fa-solid\" [class.fa-file-excel]=\"!IsPreparingExport\" [class.fa-spinner]=\"IsPreparingExport\" [class.fa-spin]=\"IsPreparingExport\"></i>\n <span class=\"button-text\">Export</span>\n </button>\n }\n <!-- Delete Button (predefined) -->\n @if (ShowDeleteButton && HasSelection) {\n <button\n class=\"toolbar-button toolbar-button-danger\"\n title=\"Delete selected records\"\n (click)=\"onDeleteClick()\">\n <i class=\"fa-solid fa-trash\"></i>\n <span class=\"button-text\">Delete</span>\n </button>\n }\n <!-- Compare Button (predefined) -->\n @if (ShowCompareButton) {\n <button\n class=\"toolbar-button\"\n title=\"Compare selected records\"\n [disabled]=\"!HasMultipleSelection\"\n (click)=\"onCompareClick()\">\n <i class=\"fa-solid fa-code-compare\"></i>\n <span class=\"button-text\">Compare</span>\n </button>\n }\n <!-- Merge Button (predefined) -->\n @if (ShowMergeButton) {\n <button\n class=\"toolbar-button\"\n title=\"Merge selected records\"\n [disabled]=\"!HasMultipleSelection\"\n (click)=\"onMergeClick()\">\n <i class=\"fa-solid fa-code-merge\"></i>\n <span class=\"button-text\">Merge</span>\n </button>\n }\n <!-- Add to List Button (predefined) -->\n @if (ShowAddToListButton) {\n <button\n class=\"toolbar-button\"\n [title]=\"HasSelection ? 'Add selected records to a list' : 'Add all matching records to a list'\"\n [disabled]=\"(!HasSelection && !ExportDataProvider) || IsPreparingAddToList\"\n (click)=\"onAddToListClick()\">\n <i class=\"fa-solid\" [class.fa-list-check]=\"!IsPreparingAddToList\" [class.fa-spinner]=\"IsPreparingAddToList\" [class.fa-spin]=\"IsPreparingAddToList\"></i>\n <span class=\"button-text\">Add to List</span>\n </button>\n }\n <!-- Search for Duplicates Button (predefined) -->\n @if (ShowDuplicateSearchButton) {\n <button\n class=\"toolbar-button\"\n title=\"Search for duplicate records\"\n [disabled]=\"!HasMultipleSelection\"\n (click)=\"onDuplicateSearchClick()\">\n <i class=\"fa-solid fa-magnifying-glass-plus\"></i>\n <span class=\"button-text\">Find Duplicates</span>\n </button>\n }\n <!-- Communication Button (predefined) -->\n @if (ShowCommunicationButton && EntitySupportsCommunication) {\n <button\n class=\"toolbar-button\"\n title=\"Send message to selected records\"\n [disabled]=\"!HasSelection\"\n (click)=\"onCommunicationClick()\">\n <i class=\"fa-solid fa-envelope\"></i>\n <span class=\"button-text\">Send Message</span>\n </button>\n }\n <!-- Legacy ToolbarConfig buttons -->\n <!-- Add Button (legacy) -->\n @if (ToolbarConfig.showAdd && AllowAdd && !ShowNewButton) {\n <button\n class=\"toolbar-button\"\n title=\"Add New\"\n (click)=\"onAddClick()\">\n <i class=\"fa-solid fa-plus\"></i>\n </button>\n }\n <!-- Refresh Button (legacy) -->\n @if (ToolbarConfig.showRefresh !== false && !ShowRefreshButton) {\n <button\n class=\"toolbar-button\"\n title=\"Refresh\"\n [disabled]=\"loading\"\n (click)=\"onRefreshClick()\">\n <i class=\"fa-solid fa-refresh\" [class.fa-spin]=\"loading\"></i>\n </button>\n }\n <!-- Delete Button (legacy) -->\n @if (ToolbarConfig.showDelete && AllowDelete && HasSelection && !ShowDeleteButton) {\n <button\n class=\"toolbar-button toolbar-button-danger\"\n title=\"Delete Selected\"\n (click)=\"onDeleteClick()\">\n <i class=\"fa-solid fa-trash\"></i>\n </button>\n }\n <!-- Export Button (legacy) -->\n @if (ToolbarConfig.showExport && !ShowExportButton) {\n <button\n class=\"toolbar-button\"\n title=\"Export\"\n (click)=\"onExportClick()\">\n <i class=\"fa-solid fa-download\"></i>\n </button>\n }\n <!-- Column Chooser Button -->\n @if (ToolbarConfig.showColumnChooser && AllowColumnToggle) {\n <button\n class=\"toolbar-button\"\n title=\"Column Chooser\"\n (click)=\"onColumnChooserClick()\">\n <i class=\"fa-solid fa-columns\"></i>\n </button>\n }\n <!-- Custom Right Buttons -->\n @for (button of ToolbarConfig.customButtons; track button) {\n @if (button.position === 'right' && isButtonVisible(button)) {\n <button\n class=\"toolbar-button\"\n [class]=\"button.cssClass\"\n [disabled]=\"isButtonDisabled(button)\"\n [title]=\"button.tooltip || ''\"\n (click)=\"onToolbarButtonClick(button)\">\n @if (button.icon) {\n <i [class]=\"button.icon\"></i>\n }\n @if (button.text) {\n <span>{{ button.text }}</span>\n }\n </button>\n }\n }\n <!-- Overflow Menu -->\n @if (hasOverflowMenuItems) {\n <div class=\"toolbar-overflow\" (click)=\"$event.stopPropagation()\">\n <button\n class=\"toolbar-button overflow-trigger\"\n title=\"More actions\"\n (click)=\"toggleOverflowMenu()\">\n <i class=\"fa-solid fa-ellipsis-vertical\"></i>\n </button>\n @if (showOverflowMenu) {\n <div class=\"overflow-menu\" [@fadeIn]>\n <!-- Export (if in overflow) -->\n @if (showExportInOverflow) {\n <button class=\"overflow-item\" (click)=\"onExportClick(); closeOverflowMenu()\">\n <i class=\"fa-solid fa-file-excel\"></i>\n <span>Export</span>\n </button>\n }\n <!-- Entity Actions -->\n @if (ShowEntityActionButtons && EntityActions.length > 0) {\n <div class=\"overflow-divider\"></div>\n <div class=\"overflow-section-label\">Actions</div>\n @for (action of EntityActions; track action) {\n <button\n class=\"overflow-item\"\n [disabled]=\"!isEntityActionEnabled(action)\"\n (click)=\"onEntityActionClick(action); closeOverflowMenu()\">\n <i [class]=\"action.icon || 'fa-solid fa-bolt'\"></i>\n <span>{{ action.name }}</span>\n </button>\n }\n }\n <!-- Column Chooser (if in overflow) -->\n @if (showColumnChooserInOverflow) {\n <div class=\"overflow-divider\"></div>\n }\n @if (showColumnChooserInOverflow) {\n <button class=\"overflow-item\" (click)=\"onColumnChooserClick(); closeOverflowMenu()\">\n <i class=\"fa-solid fa-columns\"></i>\n <span>Manage Columns</span>\n </button>\n }\n <!-- Selection-dependent actions in overflow -->\n @if (HasSelection && hasSelectionDependentOverflowActions) {\n <div class=\"overflow-divider\"></div>\n @if (showCommunicationInOverflow) {\n <button class=\"overflow-item\" (click)=\"onCommunicationClick(); closeOverflowMenu()\">\n <i class=\"fa-solid fa-envelope\"></i>\n <span>Send Message</span>\n </button>\n }\n }\n </div>\n }\n </div>\n }\n </div>\n </div>\n }\n\n <!-- Aggregate Cards (displayed as summary cards above the grid) -->\n @if (ShowAggregatePanel) {\n <div class=\"mj-aggregate-cards\">\n @for (agg of CardAggregates; track agg) {\n <div class=\"aggregate-card\">\n @if (agg.icon) {\n <div class=\"aggregate-card-icon\">\n <i [class]=\"agg.icon\"></i>\n </div>\n }\n <div class=\"aggregate-card-content\">\n <span class=\"aggregate-card-label\">{{ agg.label }}</span>\n <span class=\"aggregate-card-value\">{{ getAggregateValue(agg) }}</span>\n </div>\n </div>\n }\n @if (AggregatesLoading) {\n <div class=\"aggregate-card-loading\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n </div>\n }\n </div>\n }\n\n <!-- Grid Content -->\n <div class=\"mj-grid-content\">\n <!-- Loading Overlay -->\n @if (loading && rowData.length === 0) {\n <div class=\"mj-grid-loading-overlay\">\n <mj-loading text=\"Loading...\"></mj-loading>\n </div>\n }\n\n <!-- Error State -->\n @if (errorMessage && !loading) {\n <mj-empty-state\n class=\"mj-grid-state-fill\"\n [Size]=\"EmptyStateSize\"\n Variant=\"error\"\n Icon=\"fa-solid fa-triangle-exclamation\"\n Title=\"Couldn't load this data\"\n [Message]=\"FriendlyErrorMessage\"\n ActionText=\"Retry\"\n ActionIcon=\"fa-solid fa-arrows-rotate\"\n (Action)=\"Refresh()\" />\n }\n\n <!-- Empty State -->\n @if (!loading && !errorMessage && rowData.length === 0) {\n <mj-empty-state\n class=\"mj-grid-state-fill\"\n [Size]=\"EmptyStateSize\"\n Icon=\"fa-solid fa-inbox\"\n [Title]=\"EntityInfo ? 'No ' + EntityInfo.DisplayNamePlural + ' to display' : 'No data to display'\" />\n }\n\n <!-- AG Grid (Client-side mode) -->\n @if (!errorMessage && PaginationMode === 'client' && (rowData.length > 0 || loading)) {\n <ag-grid-angular\n class=\"mj-ag-grid ag-theme-alpine\"\n [theme]=\"agGridTheme\"\n [columnDefs]=\"agColumnDefs\"\n [rowData]=\"rowData\"\n [defaultColDef]=\"defaultColDef\"\n [rowSelection]=\"agRowSelection\"\n [getRowId]=\"getRowId\"\n [suppressCellFocus]=\"true\"\n [rowHeight]=\"RowHeight\"\n [headerHeight]=\"ShowHeader ? undefined : 0\"\n (gridReady)=\"onGridReady($event)\"\n (cellClicked)=\"onAgCellClicked($event)\"\n (rowClicked)=\"onAgRowClicked($event)\"\n (rowDoubleClicked)=\"onAgRowDoubleClicked($event)\"\n (sortChanged)=\"onAgSortChanged($event)\"\n (selectionChanged)=\"onAgSelectionChanged($event)\"\n (columnResized)=\"onAgColumnResized($event)\"\n (columnMoved)=\"onAgColumnMoved($event)\">\n </ag-grid-angular>\n }\n\n <!-- AG Grid (Infinite Scroll mode) -->\n @if (!errorMessage && PaginationMode === 'infinite') {\n <ag-grid-angular\n class=\"mj-ag-grid ag-theme-alpine\"\n [theme]=\"agGridTheme\"\n [columnDefs]=\"agColumnDefs\"\n [defaultColDef]=\"defaultColDef\"\n [rowSelection]=\"agRowSelection\"\n [getRowId]=\"getRowId\"\n [suppressCellFocus]=\"true\"\n [rowHeight]=\"RowHeight\"\n [headerHeight]=\"ShowHeader ? undefined : 0\"\n [rowModelType]=\"'infinite'\"\n [cacheBlockSize]=\"CacheBlockSize\"\n [maxBlocksInCache]=\"MaxBlocksInCache\"\n [infiniteInitialRowCount]=\"1\"\n [cacheOverflowSize]=\"2\"\n (gridReady)=\"onGridReady($event)\"\n (cellClicked)=\"onAgCellClicked($event)\"\n (rowClicked)=\"onAgRowClicked($event)\"\n (rowDoubleClicked)=\"onAgRowDoubleClicked($event)\"\n (sortChanged)=\"onAgSortChanged($event)\"\n (selectionChanged)=\"onAgSelectionChanged($event)\"\n (columnResized)=\"onAgColumnResized($event)\"\n (columnMoved)=\"onAgColumnMoved($event)\">\n </ag-grid-angular>\n }\n\n </div>\n\n <!-- Pagination (opt-in via ShowPager input) -->\n @if (ShowPager) {\n <mj-pagination\n [TotalRowCount]=\"totalRowCount\"\n [PageNumber]=\"PagerPageNumber\"\n [PageSize]=\"PageSize\"\n [IsLoading]=\"loading\"\n (PageChange)=\"PageChange.emit($event)\">\n </mj-pagination>\n }\n\n <!-- Aggregate Summary Row (outside mj-grid-content so it's always visible) -->\n @if (ShowAggregateSummary) {\n <div class=\"mj-aggregate-summary\">\n <div class=\"aggregate-summary-content\">\n @for (agg of ColumnAggregates; track agg) {\n <div class=\"aggregate-summary-item\">\n @if (agg.icon) {\n <i [class]=\"agg.icon\"></i>\n }\n <span class=\"agg-summary-label\">{{ agg.label }}:</span>\n <span class=\"agg-summary-value\">{{ getAggregateValue(agg) }}</span>\n </div>\n }\n </div>\n @if (AggregatesLoading) {\n <div class=\"aggregate-loading\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n </div>\n }\n </div>\n }\n</div>\n\n<!-- Export Dialog -->\n<mj-export-dialog\n [visible]=\"showExportDialog\"\n [config]=\"exportDialogConfig\"\n (closed)=\"onExportDialogClosed($event)\">\n</mj-export-dialog>\n\n<!-- Runtime-UX driver for an entity action that names a RuntimeUXDriverClass (e.g. the Record Process\n bulk-update runner). Mounted in-place over the grid — no parent wiring required. -->\n@if (ActiveRuntimeDriver) {\n <mj-entity-action-ux-host\n [DriverClass]=\"ActiveRuntimeDriver.DriverClass\"\n [Context]=\"ActiveRuntimeDriver.Context\"\n (Completed)=\"OnRuntimeDriverCompleted($event)\"\n (Cancelled)=\"OnRuntimeDriverCancelled()\">\n </mj-entity-action-ux-host>\n}\n"]}
|