@memberjunction/ng-entity-viewer 5.9.0 → 5.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +86 -33
- package/dist/lib/entity-data-grid/entity-data-grid.component.js.map +1 -1
- package/dist/lib/entity-viewer/entity-viewer.component.d.ts +8 -0
- package/dist/lib/entity-viewer/entity-viewer.component.d.ts.map +1 -1
- package/dist/lib/entity-viewer/entity-viewer.component.js +63 -17
- package/dist/lib/entity-viewer/entity-viewer.component.js.map +1 -1
- package/package.json +9 -9
|
@@ -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 { Subject } from 'rxjs';\nimport { debounceTime, takeUntil } from 'rxjs/operators';\nimport { RunView, RunViewParams, Metadata, EntityInfo, EntityFieldInfo, AggregateResult, AggregateValue, AggregateExpression } from '@memberjunction/core';\nimport { UUIDsEqual } from '@memberjunction/global';\nimport { buildPkString, computeFieldsList } from '../utils/record.util';\nimport { MJUserViewEntityExtended, ViewInfo, ViewGridState, UserViewEngine, UserInfoEngine, ColumnFormat, ColumnTextStyle, ViewGridAggregatesConfig, ViewGridAggregate } 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 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@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 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 // 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 * Column definitions - if not provided, auto-generates from entity metadata\n */\n @Input()\n set Columns(value: GridColumnConfig[]) {\n this._columns = value || [];\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 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 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 to Excel\" button in toolbar\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 // ========================================\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 if (value instanceof Date) {\n return value.toLocaleDateString();\n }\n return String(value);\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\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 = themeAlpine.withParams({\n selectedRowBackgroundColor: '#fff3cd', // More visible mellow yellow selection\n rowHoverColor: '#f5f5f5'\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 errorMessage: string = '';\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\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 // Reset allowLoad to true when params change - this ensures the new view gets to load\n // (The parent may have set allowLoad=false for the previous view, which shouldn't prevent loading the new view)\n this._allowLoad = true;\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 = new Metadata();\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 this._columns = [];\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 // 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 // Load data if auto-refresh is enabled\n if (this._autoRefreshOnParamsChange) {\n await this.loadData(false);\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 }\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 = new Metadata();\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 if (!this._gridState && gridState.columnSettings?.length) {\n this._gridState = {\n columnSettings: gridState.columnSettings,\n sortSettings: gridState.sortSettings || [],\n aggregates: gridState.aggregates\n };\n }\n\n // Apply sort state if not already set\n if (this._sortState.length === 0 && gridState.sortSettings?.length) {\n this._sortState = gridState.sortSettings.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 try {\n const gridState = JSON.parse(this._viewEntity.GridState) as ViewGridState;\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 } catch (e) {\n console.warn('Failed to parse view GridState:', e);\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 this._sortState = sortInfo.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 this._sortState = this._gridState!.sortSettings!.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 this.buildAgColumnDefs();\n\n // Update AG Grid with new column definitions to apply header styles\n if (this.gridApi) {\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 if (this._gridState.sortSettings?.length && this.gridApi) {\n this._sortState = this._gridState.sortSettings.map((sortSetting, index) => ({\n field: sortSetting.field,\n direction: sortSetting.dir,\n index: index\n }));\n this.applySortStateToGrid();\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 }\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 = new RunView();\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 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 * 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 if (this._gridState?.columnSettings?.length && this._entityInfo) {\n this.agColumnDefs = this.buildAgColumnDefsFromGridState(this._gridState.columnSettings);\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 // 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\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 if (colConfig.hidden) continue;\n\n const field = this._entityInfo.Fields.find(f =>\n f.Name.toLowerCase() === colConfig.Name.toLowerCase()\n );\n\n if (!field) continue;\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: colConfig.width || this.estimateColumnWidth(field),\n sortable: this._allowSorting,\n resizable: this._allowColumnResize\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 const colDef: ColDef = {\n field: col.field,\n headerName: col.title || col.field,\n width: typeof col.width === 'number' ? col.width : undefined,\n minWidth: col.minWidth,\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 // 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 // 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 // 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 // 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);\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 const date = params.value instanceof Date ? params.value : new Date(params.value as string);\n if (isNaN(date.getTime())) {\n displayValue = String(params.value);\n } else if (vc.friendlyDates) {\n displayValue = date.toLocaleDateString(undefined, {\n month: 'short',\n day: 'numeric',\n year: 'numeric'\n });\n } else {\n displayValue = date.toISOString().split('T')[0];\n }\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 displayValue = isNaN(num) ? String(params.value) : num.toLocaleString();\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 * 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 private formatValueWithCustomFormat(value: unknown, format: ColumnFormat): 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);\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 private formatCustomDate(value: unknown, format: ColumnFormat): 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\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 (format.type === 'datetime') {\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 (format.type === 'datetime') {\n options.timeStyle = 'short';\n }\n }\n\n return 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 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 return;\n }\n\n // Check AllowLoad for deferred loading\n if (!this._allowLoad) {\n return;\n }\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 = new RunView();\n const result = await rv.RunView<Record<string, unknown>>({\n ...runViewParams,\n ResultType: 'simple',\n Fields: this._entityInfo ? computeFieldsList(this._entityInfo, this._gridState) : 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 = new RunView();\n const result = await rv.RunView<Record<string, unknown>>({\n ...runViewParams,\n ResultType: 'simple',\n Fields: this._entityInfo ? computeFieldsList(this._entityInfo, this._gridState) : 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 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 // 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 // Build the grid state JSON matching ViewGridState format\n const gridStateJson: ViewGridState = {\n columnSettings: state.columnSettings,\n sortSettings: state.sortSettings,\n aggregates: state.aggregates\n };\n\n // Update the view entity's GridState\n this._viewEntity.GridState = JSON.stringify(gridStateJson);\n\n // Update SortState separately if changed\n if (state.sortSettings?.length) {\n this._viewEntity.SortState = JSON.stringify(\n state.sortSettings.map(s => ({\n field: s.field,\n dir: s.dir\n }))\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 const field = this._entityInfo.Fields.find(f => f.Name === col.colId);\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 // 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._sortState.length === 0) {\n return;\n }\n\n const currentColumnState = this.gridApi.getColumnState();\n if (!currentColumnState) {\n return;\n }\n\n this.suppressSortEvents = true;\n try {\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 } finally {\n this.suppressSortEvents = false;\n }\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 this.showExportDialogForCurrentData();\n }\n\n /**\n * Shows the export dialog for the current grid data\n */\n private showExportDialogForCurrentData(): void {\n const data = this.getExportData();\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 = this.getExportData();\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 * Get the current grid data formatted for export\n */\n private getExportData(): ExportData {\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 const field = this._entityInfo?.Fields.find(f => f.Name === col.field);\n return {\n 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 onAddToListClick(): void {\n const selectedRows = this.GetSelectedRows();\n if (selectedRows.length > 0) {\n // Emit legacy event for backward compatibility\n this.AddToListButtonClick.emit(selectedRows);\n\n // Emit new structured event with record IDs for list management\n if (this._entityInfo) {\n const recordIds = selectedRows.map(r => {\n return buildPkString(r, this._entityInfo!);\n });\n this.AddToListRequested.emit({\n entityInfo: this._entityInfo,\n records: selectedRows,\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 onColumnChooserClick(): void {\n // TODO: Implement column chooser dialog\n }\n\n /**\n * Handles entity action click from the overflow menu\n */\n onEntityActionClick(action: EntityActionConfig): void {\n if (!this._entityInfo) return;\n\n this.EntityActionRequested.emit({\n entityInfo: this._entityInfo,\n action,\n selectedRecords: this.GetSelectedRows()\n });\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 <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 <!-- 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 to Excel\"\n (click)=\"onExportClick()\">\n <i class=\"fa-solid fa-file-excel\"></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=\"Add selected records to a list\"\n [disabled]=\"!HasSelection\"\n (click)=\"onAddToListClick()\">\n <i class=\"fa-solid fa-list-check\"></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 to Excel</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 <div class=\"mj-grid-error\">\n <i class=\"fa-solid fa-exclamation-triangle\"></i>\n <span>{{ errorMessage }}</span>\n <button class=\"error-retry\" (click)=\"Refresh()\">Retry</button>\n </div>\n }\n\n <!-- Empty State -->\n @if (!loading && !errorMessage && rowData.length === 0) {\n <div class=\"mj-grid-empty\">\n <i class=\"fa-solid fa-inbox\"></i>\n <span>No data to display</span>\n </div>\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 <!-- 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"]}
|
|
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 { Subject } from 'rxjs';\nimport { debounceTime, takeUntil } from 'rxjs/operators';\nimport { RunView, RunViewParams, Metadata, EntityInfo, EntityFieldInfo, AggregateResult, AggregateValue, AggregateExpression } from '@memberjunction/core';\nimport { UUIDsEqual } from '@memberjunction/global';\nimport { buildPkString, computeFieldsList } from '../utils/record.util';\nimport { MJUserViewEntityExtended, ViewInfo, ViewGridState, UserViewEngine, UserInfoEngine, ColumnFormat, ColumnTextStyle, ViewGridAggregatesConfig, ViewGridAggregate } 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 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@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 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 // 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 * Column definitions - if not provided, auto-generates from entity metadata\n */\n @Input()\n set Columns(value: GridColumnConfig[]) {\n this._columns = value || [];\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 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 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 to Excel\" button in toolbar\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 // ========================================\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 if (value instanceof Date) {\n return value.toLocaleDateString();\n }\n return String(value);\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\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 = themeAlpine.withParams({\n selectedRowBackgroundColor: '#fff3cd', // More visible mellow yellow selection\n rowHoverColor: '#f5f5f5'\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 errorMessage: string = '';\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\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 = new Metadata();\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 this._columns = [];\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 // 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 // Load data if auto-refresh is enabled and parent hasn't disabled loading\n if (this._autoRefreshOnParamsChange && this._allowLoad) {\n await this.loadData(false);\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 }\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 = new Metadata();\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 if (!this._gridState && 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._entityInfo\n ? gridState.columnSettings.filter(col =>\n this._entityInfo!.Fields.some(f => f.Name === col.Name)\n )\n : gridState.columnSettings;\n\n if (validColumns.length > 0) {\n this._gridState = {\n columnSettings: validColumns,\n sortSettings: gridState.sortSettings || [],\n aggregates: gridState.aggregates\n };\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._entityInfo\n ? gridState.sortSettings.filter(s =>\n this._entityInfo!.Fields.some(f => f.Name === s.field)\n )\n : gridState.sortSettings;\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 try {\n const gridState = JSON.parse(this._viewEntity.GridState) as ViewGridState;\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 } catch (e) {\n console.warn('Failed to parse view GridState:', e);\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._entityInfo\n ? sortInfo.filter(s => this._entityInfo!.Fields.some(f => f.Name === s.field))\n : sortInfo;\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._entityInfo\n ? this._gridState!.sortSettings!.filter(s => this._entityInfo!.Fields.some(f => f.Name === s.field))\n : this._gridState!.sortSettings!;\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._entityInfo\n ? this._gridState.sortSettings.filter(s => this._entityInfo!.Fields.some(f => f.Name === s.field))\n : this._gridState.sortSettings;\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 = new RunView();\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 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 * 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 if (this._gridState?.columnSettings?.length && this._entityInfo) {\n this.agColumnDefs = this.buildAgColumnDefsFromGridState(this._gridState.columnSettings);\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 // 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\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 if (colConfig.hidden) continue;\n\n const field = this._entityInfo.Fields.find(f =>\n f.Name.toLowerCase() === colConfig.Name.toLowerCase()\n );\n\n if (!field) continue;\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: colConfig.width || this.estimateColumnWidth(field),\n sortable: this._allowSorting,\n resizable: this._allowColumnResize\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 const colDef: ColDef = {\n field: col.field,\n headerName: col.title || col.field,\n width: typeof col.width === 'number' ? col.width : undefined,\n minWidth: col.minWidth,\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 // 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 // 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 // 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 // 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);\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 const date = params.value instanceof Date ? params.value : new Date(params.value as string);\n if (isNaN(date.getTime())) {\n displayValue = String(params.value);\n } else if (vc.friendlyDates) {\n displayValue = date.toLocaleDateString(undefined, {\n month: 'short',\n day: 'numeric',\n year: 'numeric'\n });\n } else {\n displayValue = date.toISOString().split('T')[0];\n }\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 displayValue = isNaN(num) ? String(params.value) : num.toLocaleString();\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 * 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 private formatValueWithCustomFormat(value: unknown, format: ColumnFormat): 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);\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 private formatCustomDate(value: unknown, format: ColumnFormat): 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\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 (format.type === 'datetime') {\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 (format.type === 'datetime') {\n options.timeStyle = 'short';\n }\n }\n\n return 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 = new RunView();\n const result = await rv.RunView<Record<string, unknown>>({\n ...runViewParams,\n ResultType: 'simple',\n Fields: this._entityInfo ? computeFieldsList(this._entityInfo, this._gridState) : 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 = new RunView();\n const result = await rv.RunView<Record<string, unknown>>({\n ...runViewParams,\n ResultType: 'simple',\n Fields: this._entityInfo ? computeFieldsList(this._entityInfo, this._gridState) : 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 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 // 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 // Build the grid state JSON matching ViewGridState format\n const gridStateJson: ViewGridState = {\n columnSettings: state.columnSettings,\n sortSettings: state.sortSettings,\n aggregates: state.aggregates\n };\n\n // Update the view entity's GridState\n this._viewEntity.GridState = JSON.stringify(gridStateJson);\n\n // Update SortState separately if changed\n if (state.sortSettings?.length) {\n this._viewEntity.SortState = JSON.stringify(\n state.sortSettings.map(s => ({\n field: s.field,\n dir: s.dir\n }))\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 const field = this._entityInfo.Fields.find(f => f.Name === col.colId);\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 // 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 this.showExportDialogForCurrentData();\n }\n\n /**\n * Shows the export dialog for the current grid data\n */\n private showExportDialogForCurrentData(): void {\n const data = this.getExportData();\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 = this.getExportData();\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 * Get the current grid data formatted for export\n */\n private getExportData(): ExportData {\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 const field = this._entityInfo?.Fields.find(f => f.Name === col.field);\n return {\n 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 onAddToListClick(): void {\n const selectedRows = this.GetSelectedRows();\n if (selectedRows.length > 0) {\n // Emit legacy event for backward compatibility\n this.AddToListButtonClick.emit(selectedRows);\n\n // Emit new structured event with record IDs for list management\n if (this._entityInfo) {\n const recordIds = selectedRows.map(r => {\n return buildPkString(r, this._entityInfo!);\n });\n this.AddToListRequested.emit({\n entityInfo: this._entityInfo,\n records: selectedRows,\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 onColumnChooserClick(): void {\n // TODO: Implement column chooser dialog\n }\n\n /**\n * Handles entity action click from the overflow menu\n */\n onEntityActionClick(action: EntityActionConfig): void {\n if (!this._entityInfo) return;\n\n this.EntityActionRequested.emit({\n entityInfo: this._entityInfo,\n action,\n selectedRecords: this.GetSelectedRows()\n });\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 <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 <!-- 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 to Excel\"\n (click)=\"onExportClick()\">\n <i class=\"fa-solid fa-file-excel\"></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=\"Add selected records to a list\"\n [disabled]=\"!HasSelection\"\n (click)=\"onAddToListClick()\">\n <i class=\"fa-solid fa-list-check\"></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 to Excel</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 <div class=\"mj-grid-error\">\n <i class=\"fa-solid fa-exclamation-triangle\"></i>\n <span>{{ errorMessage }}</span>\n <button class=\"error-retry\" (click)=\"Refresh()\">Retry</button>\n </div>\n }\n\n <!-- Empty State -->\n @if (!loading && !errorMessage && rowData.length === 0) {\n <div class=\"mj-grid-empty\">\n <i class=\"fa-solid fa-inbox\"></i>\n <span>No data to display</span>\n </div>\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 <!-- 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"]}
|