@memberjunction/ng-query-viewer 6.1.4 → 6.1.5

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.
@@ -1 +1 @@
1
- {"version":3,"file":"query-data-grid.component.d.ts","sourceRoot":"","sources":["../../../src/lib/query-data-grid/query-data-grid.component.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"query-data-grid.component.d.ts","sourceRoot":"","sources":["../../../src/lib/query-data-grid/query-data-grid.component.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,7 @@ import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy } from
2
2
  import { trigger, transition, style, animate } from '@angular/animations';
3
3
  import { Subject } from 'rxjs';
4
4
  import { debounceTime, takeUntil } from 'rxjs/operators';
5
+ import { FormatDateOnly, IsDateOnlySQLType } from '@memberjunction/core';
5
6
  import { UserInfoEngine } from '@memberjunction/core-entities';
6
7
  import { ModuleRegistry, AllCommunityModule, themeAlpine } from 'ag-grid-community';
7
8
  import { DEFAULT_QUERY_VISUAL_CONFIG, buildColumnsFromQueryFields, buildColumnsFromData, getQueryGridStateKey } from './models/query-grid-types';
@@ -570,10 +571,14 @@ export class QueryDataGridComponent {
570
571
  const date = new Date(value);
571
572
  if (isNaN(date.getTime()))
572
573
  return String(value);
574
+ // A SQL `date` is a calendar day delivered as UTC midnight: format it in UTC, or a
575
+ // reader west of Greenwich sees the day before.
576
+ if (IsDateOnlySQLType(baseType)) {
577
+ return this._mergedVisualConfig.friendlyDates
578
+ ? FormatDateOnly(date, { year: 'numeric', month: 'short', day: 'numeric' }, 'en-US')
579
+ : date.toISOString().slice(0, 10);
580
+ }
573
581
  if (this._mergedVisualConfig.friendlyDates) {
574
- if (baseType === 'date') {
575
- return date.toLocaleDateString('en-US', { year: 'numeric', month: 'short', day: 'numeric' });
576
- }
577
582
  return date.toLocaleString('en-US', {
578
583
  year: 'numeric', month: 'short', day: 'numeric',
579
584
  hour: 'numeric', minute: '2-digit'
@@ -1004,7 +1009,7 @@ export class QueryDataGridComponent {
1004
1009
  .map(c => ({
1005
1010
  name: c.field,
1006
1011
  displayName: c.title,
1007
- type: this.mapSqlTypeToExportType(c.sqlBaseType)
1012
+ dataType: this.mapSqlTypeToExportType(c.sqlBaseType)
1008
1013
  }));
1009
1014
  }
1010
1015
  mapSqlTypeToExportType(sqlType) {
@@ -1015,7 +1020,10 @@ export class QueryDataGridComponent {
1015
1020
  if (['bit'].includes(baseType)) {
1016
1021
  return 'boolean';
1017
1022
  }
1018
- if (['date', 'datetime', 'datetime2', 'smalldatetime', 'datetimeoffset'].includes(baseType)) {
1023
+ if (IsDateOnlySQLType(baseType)) {
1024
+ return 'dateonly';
1025
+ }
1026
+ if (['datetime', 'datetime2', 'smalldatetime', 'datetimeoffset'].includes(baseType)) {
1019
1027
  return 'date';
1020
1028
  }
1021
1029
  return 'string';
@@ -1261,5 +1269,5 @@ export class QueryDataGridComponent {
1261
1269
  }], PageChange: [{
1262
1270
  type: Output
1263
1271
  }] }); })();
1264
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(QueryDataGridComponent, { className: "QueryDataGridComponent", filePath: "src/lib/query-data-grid/query-data-grid.component.ts", lineNumber: 108 }); })();
1272
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(QueryDataGridComponent, { className: "QueryDataGridComponent", filePath: "src/lib/query-data-grid/query-data-grid.component.ts", lineNumber: 109 }); })();
1265
1273
  //# sourceMappingURL=query-data-grid.component.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"query-data-grid.component.js","sourceRoot":"","sources":["../../../src/lib/query-data-grid/query-data-grid.component.ts","../../../src/lib/query-data-grid/query-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 ChangeDetectionStrategy,\n ElementRef,\n ViewChild\n} from '@angular/core';\nimport { trigger, transition, style, animate } from '@angular/animations';\nimport { Subject } from 'rxjs';\nimport { debounceTime, takeUntil } from 'rxjs/operators';\nimport { MJQueryEntityExtended } from '@memberjunction/core-entities';\nimport { PageChangeEvent } from '@memberjunction/ng-pagination';\nimport { UserInfoEngine } from '@memberjunction/core-entities';\nimport {\n ColDef,\n GridReadyEvent,\n RowClickedEvent,\n GridApi,\n RowDoubleClickedEvent,\n ModuleRegistry,\n AllCommunityModule,\n RowSelectionOptions,\n GetRowIdParams,\n themeAlpine,\n SortChangedEvent as AgSortChangedEvent,\n type Theme,\n ColumnResizedEvent,\n ColumnMovedEvent,\n SelectionChangedEvent,\n ICellRendererParams,\n GridOptions\n} from 'ag-grid-community';\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';\nimport {\n QueryGridSelectionMode,\n QueryGridColumnConfig,\n QueryGridSortState,\n QueryGridState,\n QueryGridVisualConfig,\n DEFAULT_QUERY_VISUAL_CONFIG,\n QueryRowClickEvent,\n QueryEntityLinkClickEvent,\n QueryGridStateChangedEvent,\n QuerySelectionChangedEvent,\n QueryExportOptions,\n buildColumnsFromQueryFields,\n buildColumnsFromData,\n getQueryGridStateKey\n} from './models/query-grid-types';\nimport { RowDetailEntityLinkEvent } from '../query-row-detail/query-row-detail.component';\n\n// Register AG Grid modules\nModuleRegistry.registerModules([AllCommunityModule]);\n\n/**\n * A data grid component for displaying query results with full interactivity.\n * Features:\n * - Client-side sorting with multi-column support\n * - Column resizing, reordering, and visibility toggle\n * - Entity linking for columns with SourceEntityID\n * - State persistence to User Settings\n * - Export to Excel/CSV\n * - Row selection (single, multiple, checkbox modes)\n *\n * @example\n * ```html\n * <mj-query-data-grid\n * [queryInfo]=\"query\"\n * [data]=\"queryResults\"\n * [selectionMode]=\"'multiple'\"\n * (entityLinkClick)=\"onEntityLinkClick($event)\">\n * </mj-query-data-grid>\n * ```\n */\n@Component({\n standalone: false,\n selector: 'mj-query-data-grid',\n templateUrl: './query-data-grid.component.html',\n styleUrls: ['./query-data-grid.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\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 QueryDataGridComponent implements OnInit, OnDestroy {\n // ========================================\n // Inputs\n // ========================================\n\n private _queryInfo: MJQueryEntityExtended | null = null;\n /**\n * The QueryInfo metadata for the query being displayed.\n * Used to derive column configurations and entity linking.\n */\n @Input()\n set QueryInfo(value: MJQueryEntityExtended | null) {\n const previous = this._queryInfo;\n // Flush state for the previous query before switching\n if (previous && value !== previous) {\n this.FlushState();\n }\n this._queryInfo = value;\n if (value && value !== previous) {\n this.onQueryInfoChanged();\n }\n }\n get QueryInfo(): MJQueryEntityExtended | null {\n return this._queryInfo;\n }\n\n private _columnConfigs: QueryGridColumnConfig[] | null = null;\n /**\n * Optional pre-built column configurations for ad-hoc queries without saved metadata.\n * When provided, overrides both QueryInfo-derived columns and auto-inferred columns.\n * Enables entity linking without requiring a saved Query or QueryInfo object.\n *\n * Set this BEFORE setting Data to ensure columns are configured before the grid renders.\n */\n @Input()\n set ColumnConfigs(value: QueryGridColumnConfig[] | null) {\n this._columnConfigs = value;\n if (value && value.length > 0) {\n this.Columns = value;\n this.buildColumnDefs();\n this.cdr.markForCheck();\n }\n }\n get ColumnConfigs(): QueryGridColumnConfig[] | null {\n return this._columnConfigs;\n }\n\n private _data: Record<string, unknown>[] = [];\n\n /**\n * Per-row synthetic identity for rows that have no natural key column, so the\n * `getRowId` fallback can never return duplicate ids (ag-Grid silently merges\n * rows that share an id). Keyed by the row object reference; entries are added\n * as Data is assigned. A WeakMap so it never retains rows past their lifetime.\n */\n private _syntheticRowIds = new WeakMap<object, string>();\n private _syntheticRowIdSeq = 0;\n\n /**\n * The query result data to display in the grid.\n */\n @Input()\n set Data(value: Record<string, unknown>[]) {\n this._data = value || [];\n\n // Assign a stable synthetic id to each row up front, so the getRowId\n // fallback (used only when a row has no natural key column) is\n // collision-proof — rows with identical column values must NOT be merged.\n for (const row of this._data) {\n if (row && !this._syntheticRowIds.has(row)) {\n this._syntheticRowIds.set(row, `mjrow_${this._syntheticRowIdSeq++}`);\n }\n }\n\n // If we have data but no columns from metadata or explicit configs, build from data\n if (this._data.length > 0 && this.Columns.length === 0 && !this._columnConfigs) {\n this.Columns = buildColumnsFromData(this._data);\n this.buildColumnDefs();\n }\n\n if (this.GridApi) {\n this.GridApi.setGridOption('rowData', this._data);\n }\n this.cdr.markForCheck();\n }\n get Data(): Record<string, unknown>[] {\n return this._data;\n }\n\n /**\n * Selection mode for the grid\n */\n @Input() SelectionMode: QueryGridSelectionMode = 'multiple';\n\n /**\n * Whether to show the toolbar\n */\n @Input() ShowToolbar: boolean = true;\n\n /**\n * Whether to show row count in toolbar\n */\n @Input() ShowRowCount: boolean = true;\n\n /**\n * Whether to show selection count in toolbar\n */\n @Input() ShowSelectionCount: boolean = true;\n\n /**\n * Whether to show export button\n */\n @Input() ShowExport: boolean = true;\n\n /**\n * Whether to show refresh button\n */\n @Input() ShowRefresh: boolean = true;\n\n /**\n * Whether to allow sorting\n */\n @Input() AllowSorting: boolean = true;\n\n /**\n * Whether to allow column resizing\n */\n @Input() AllowColumnResize: boolean = true;\n\n /**\n * Whether to allow column reordering\n */\n @Input() AllowColumnReorder: boolean = true;\n\n /**\n * Visual configuration\n */\n @Input() VisualConfig: QueryGridVisualConfig = {};\n\n /**\n * External loading state - when true, shows loading overlay\n */\n @Input() IsLoading: boolean = false;\n\n /**\n * Height of the grid container\n */\n @Input() Height: string = '100%';\n\n /**\n * Initial grid state (for restoring from persistence)\n */\n @Input() InitialGridState: QueryGridState | null = null;\n\n /**\n * Whether to automatically persist grid state (column widths, order, sort) to User Settings\n */\n @Input() PersistState: boolean = true;\n\n // ========================================\n // Outputs\n // ========================================\n\n /**\n * Fired when a row is clicked\n */\n @Output() RowClick = new EventEmitter<QueryRowClickEvent>();\n\n /**\n * Fired when a row is double-clicked\n */\n @Output() RowDoubleClick = new EventEmitter<QueryRowClickEvent>();\n\n /**\n * Fired when an entity link is clicked\n */\n @Output() EntityLinkClick = new EventEmitter<QueryEntityLinkClickEvent>();\n\n /**\n * Fired when selection changes\n */\n @Output() SelectionChange = new EventEmitter<QuerySelectionChangedEvent>();\n\n /**\n * Fired when grid state changes (for persistence)\n */\n @Output() GridStateChange = new EventEmitter<QueryGridStateChangedEvent>();\n\n /**\n * Fired when refresh is requested\n */\n @Output() RefreshRequest = new EventEmitter<void>();\n\n /**\n * Total row count for server-side paging (from RunQueryResult.TotalRowCount).\n * When > 0 and TotalPages > 1, the data pager is displayed below the grid.\n */\n @Input() TotalRowCount: number = 0;\n\n /** Current page number (1-based) for server-side paging */\n @Input() PageNumber: number = 1;\n\n /** Page size for server-side paging */\n @Input() PageSize: number = 100;\n\n /**\n * Optional provider that returns the FULL result set for export. When the grid is server-side\n * paged, `Data` only holds the current page (default 100 rows), so exporting `Data` would silently\n * cap the export at the page size (bug B3/C1). A host that owns the query (with its parameters) can\n * supply this callback to fetch every matching row on demand; the grid awaits it when the user\n * exports without an explicit row selection. When not provided, export falls back to the loaded page.\n */\n @Input() ExportDataProvider: (() => Promise<Record<string, unknown>[]>) | null = null;\n\n /** True while an export is fetching the full result set via ExportDataProvider. */\n public IsPreparingExport: boolean = false;\n\n /** Fired when the user navigates to a different page */\n @Output() PageChange = new EventEmitter<PageChangeEvent>();\n\n // ========================================\n // Internal State\n // ========================================\n\n public GridApi: GridApi | null = null;\n public ColumnDefs: ColDef[] = [];\n public Columns: QueryGridColumnConfig[] = [];\n public SortState: QueryGridSortState[] = [];\n public SelectedRows: Record<string, unknown>[] = [];\n public Theme: Theme = themeAlpine.withParams({\n backgroundColor: 'var(--mj-bg-surface)',\n foregroundColor: 'var(--mj-text-primary)',\n textColor: 'var(--mj-text-primary)',\n borderColor: 'var(--mj-border-default)',\n chromeBackgroundColor: 'var(--mj-bg-surface-card)',\n headerBackgroundColor: 'var(--mj-bg-surface-card)',\n headerTextColor: 'var(--mj-text-secondary)',\n cellTextColor: 'var(--mj-text-primary)',\n subtleTextColor: 'var(--mj-text-muted)',\n dataBackgroundColor: 'var(--mj-bg-surface)',\n oddRowBackgroundColor: 'var(--mj-bg-surface-card)',\n rowHoverColor: 'var(--mj-bg-surface-hover, color-mix(in srgb, var(--mj-brand-primary) 5%, var(--mj-bg-surface)))',\n selectedRowBackgroundColor: 'color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface))',\n accentColor: 'var(--mj-brand-primary)',\n borderRadius: 'var(--mj-radius-sm)',\n browserColorScheme: 'inherit',\n });\n\n private destroy$ = new Subject<void>();\n private stateChangeSubject = new Subject<QueryGridStateChangedEvent>();\n private statePersistSubject = new Subject<QueryGridState>();\n private _mergedVisualConfig: Required<QueryGridVisualConfig> = DEFAULT_QUERY_VISUAL_CONFIG;\n private _pendingState: QueryGridState | null = null;\n\n // Grid options\n public GridOptions: GridOptions = {\n animateRows: true,\n rowHeight: 36,\n headerHeight: 40,\n suppressCellFocus: false,\n enableCellTextSelection: true,\n ensureDomOrder: true,\n suppressNoRowsOverlay: true\n };\n\n /** Default column settings - enables sorting, resizing */\n public DefaultColDef: ColDef = {\n sortable: true,\n resizable: true,\n minWidth: 50\n };\n\n constructor(\n private cdr: ChangeDetectorRef,\n private elementRef: ElementRef,\n private exportService: ExportService\n ) {\n // Debounce state changes for persistence\n this.stateChangeSubject.pipe(\n debounceTime(500),\n takeUntil(this.destroy$)\n ).subscribe(event => {\n this.GridStateChange.emit(event);\n // Also persist to User Settings if enabled\n if (this.PersistState && this._queryInfo) {\n this.statePersistSubject.next(event.state);\n }\n });\n\n // Debounce state persistence to User Settings\n this.statePersistSubject.pipe(\n debounceTime(1000),\n takeUntil(this.destroy$)\n ).subscribe(state => {\n this.persistGridState(state);\n });\n }\n\n ngOnInit(): void {\n this._mergedVisualConfig = { ...DEFAULT_QUERY_VISUAL_CONFIG, ...this.VisualConfig };\n this.applyVisualConfig();\n }\n\n ngOnDestroy(): void {\n // Flush any pending state changes before destroy\n this.FlushState();\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n // ========================================\n // Grid Setup\n // ========================================\n\n public OnGridReady(event: GridReadyEvent): void {\n this.GridApi = event.api;\n\n // Apply initial data if available\n if (this._data.length > 0) {\n this.GridApi.setGridOption('rowData', this._data);\n }\n\n // Apply initial state if provided via Input\n if (this.InitialGridState) {\n this.applyFullGridState(this.InitialGridState);\n }\n // Otherwise apply pending state from persistence\n else if (this._pendingState) {\n this.applyFullGridState(this._pendingState);\n this._pendingState = null;\n }\n // Only auto-size if no persisted state was applied\n else {\n setTimeout(() => {\n if (this.GridApi) {\n this.GridApi.autoSizeAllColumns();\n }\n }, 100);\n }\n }\n\n private onQueryInfoChanged(): void {\n if (!this._queryInfo) {\n this.Columns = [];\n this.ColumnDefs = [];\n return;\n }\n\n // Build columns from query fields\n this.Columns = buildColumnsFromQueryFields(this._queryInfo.QueryFields);\n\n // Apply initial state if provided via prop (takes precedence)\n if (this.InitialGridState) {\n this.applyColumnStateFromGridState(this.InitialGridState);\n } else {\n // Otherwise try to load from User Settings\n this.loadPersistedState();\n }\n\n // Build AG Grid column definitions\n this.buildColumnDefs();\n\n // If grid is already initialized and we have pending state, apply it now\n if (this.GridApi && this._pendingState) {\n this.applyFullGridState(this._pendingState);\n this._pendingState = null;\n }\n\n this.cdr.markForCheck();\n }\n\n private applyColumnStateFromGridState(state: QueryGridState): void {\n if (!state.columns) return;\n\n for (const colState of state.columns) {\n const column = this.Columns.find(c => c.field === colState.field);\n if (column) {\n if (colState.width !== undefined) column.width = colState.width;\n column.visible = colState.visible;\n column.order = colState.order;\n column.pinned = colState.pinned || null;\n }\n }\n\n // Apply sort state\n if (state.sort) {\n this.SortState = [...state.sort];\n }\n\n // Re-sort columns by order\n this.Columns.sort((a, b) => a.order - b.order);\n }\n\n private buildColumnDefs(): void {\n const visibleColumns = this.Columns.filter(c => c.visible);\n\n // Add checkbox column if needed\n const defs: ColDef[] = [];\n\n if (this.SelectionMode === 'checkbox') {\n defs.push({\n headerName: '',\n field: '__checkbox',\n width: 50,\n minWidth: 50,\n maxWidth: 50,\n checkboxSelection: true,\n headerCheckboxSelection: true,\n pinned: 'left',\n suppressSizeToFit: true,\n sortable: false,\n filter: false,\n resizable: false\n });\n }\n\n // Add data columns\n for (const col of visibleColumns) {\n const colDef: ColDef = {\n field: col.field,\n headerName: col.title,\n headerTooltip: col.description || undefined,\n width: col.width,\n minWidth: col.minWidth,\n maxWidth: col.maxWidth,\n sortable: this.AllowSorting && col.sortable,\n resizable: this.AllowColumnResize && col.resizable,\n pinned: col.pinned || undefined,\n flex: col.flex,\n cellStyle: this.getCellStyle(col),\n headerClass: this.getHeaderClass(col),\n comparator: (a, b) => this.defaultComparator(a, b, col)\n };\n\n // Add entity link cell renderer if applicable\n if (col.isEntityLink && col.targetEntityName) {\n colDef.cellRenderer = (params: ICellRendererParams) =>\n this.renderEntityLinkCell(params, col);\n // Add custom header with entity icon and column name\n colDef.headerComponentParams = {\n template: this.getEntityLinkHeaderTemplate(col)\n };\n } else {\n // Apply type-specific formatting\n colDef.valueFormatter = (params) => this.formatCellValue(params.value, col);\n }\n\n defs.push(colDef);\n }\n\n this.ColumnDefs = defs;\n\n // Apply to grid if ready\n if (this.GridApi) {\n this.GridApi.setGridOption('columnDefs', this.ColumnDefs);\n }\n }\n\n // ========================================\n // Cell Rendering\n // ========================================\n\n private getCellStyle(col: QueryGridColumnConfig): Record<string, string> {\n const style: Record<string, string> = {};\n\n if (col.align === 'right') {\n style['text-align'] = 'right';\n style['justify-content'] = 'flex-end';\n } else if (col.align === 'center') {\n style['text-align'] = 'center';\n style['justify-content'] = 'center';\n }\n\n return style;\n }\n\n private getHeaderClass(col: QueryGridColumnConfig): string {\n const classes: string[] = [];\n\n if (col.align === 'right') {\n classes.push('header-right');\n } else if (col.align === 'center') {\n classes.push('header-center');\n }\n\n return classes.join(' ');\n }\n\n private formatCellValue(value: unknown, col: QueryGridColumnConfig): string {\n if (value === null || value === undefined) {\n return '';\n }\n\n const baseType = col.sqlBaseType.toLowerCase();\n\n // Boolean formatting\n if (baseType === 'bit') {\n if (this._mergedVisualConfig.booleanIcons) {\n return value ? '✓' : '✗';\n }\n return value ? 'Yes' : 'No';\n }\n\n // Date formatting\n if (['date', 'datetime', 'datetime2', 'smalldatetime', 'datetimeoffset'].includes(baseType)) {\n const date = new Date(value as string);\n if (isNaN(date.getTime())) return String(value);\n\n if (this._mergedVisualConfig.friendlyDates) {\n if (baseType === 'date') {\n return date.toLocaleDateString('en-US', { year: 'numeric', month: 'short', day: 'numeric' });\n }\n return date.toLocaleString('en-US', {\n year: 'numeric', month: 'short', day: 'numeric',\n hour: 'numeric', minute: '2-digit'\n });\n }\n return date.toISOString();\n }\n\n // Number formatting - check if value is actually numeric first\n if (['int', 'bigint', 'smallint', 'tinyint'].includes(baseType)) {\n const num = Number(value);\n if (isNaN(num)) return String(value);\n return num.toLocaleString();\n }\n\n if (['decimal', 'numeric', 'float', 'real'].includes(baseType)) {\n const num = Number(value);\n if (isNaN(num)) return String(value);\n return num.toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 4 });\n }\n\n if (['money', 'smallmoney'].includes(baseType)) {\n const num = Number(value);\n if (isNaN(num)) return String(value);\n return new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD' }).format(num);\n }\n\n return String(value);\n }\n\n private renderEntityLinkCell(params: ICellRendererParams, col: QueryGridColumnConfig): HTMLElement {\n const container = document.createElement('div');\n container.className = 'entity-link-cell';\n\n if (params.value === null || params.value === undefined) {\n return container;\n }\n\n const link = document.createElement('a');\n link.href = 'javascript:void(0)';\n link.className = 'entity-link';\n link.textContent = String(params.value);\n link.title = `Open ${col.targetEntityName} record`;\n\n link.addEventListener('click', (e) => {\n e.preventDefault();\n e.stopPropagation();\n this.EntityLinkClick.emit({\n entityName: col.targetEntityName!,\n recordId: String(params.value),\n column: col,\n rowData: params.data\n });\n });\n\n container.appendChild(link);\n\n const icon = document.createElement('i');\n icon.className = 'fa-solid fa-arrow-up-right-from-square entity-link-icon';\n container.appendChild(icon);\n\n return container;\n }\n\n /**\n * Generates header template HTML with entity icon from metadata\n * Shows: [Entity Icon] Column Name [Sort Icons]\n */\n private getEntityLinkHeaderTemplate(col: QueryGridColumnConfig): string {\n // Use the target entity's icon from metadata, fallback to generic icons\n const entityIcon = col.targetEntityIcon || (col.isPrimaryKey ? 'fa-solid fa-key' : 'fa-solid fa-link');\n const tooltip = col.isPrimaryKey\n ? `Primary key - links to ${col.targetEntityName}`\n : `Foreign key - links to ${col.targetEntityName}`;\n // Escape the title for safe HTML insertion\n const escapedTitle = col.title.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;');\n\n return `\n <div class=\"ag-cell-label-container\" role=\"presentation\">\n <span ref=\"eMenu\" class=\"ag-header-icon ag-header-cell-menu-button\" aria-hidden=\"true\"></span>\n <div ref=\"eLabel\" class=\"ag-header-cell-label\" role=\"presentation\">\n <i class=\"${entityIcon} entity-header-icon\" style=\"color: #5c6bc0; margin-right: 6px; font-size: 12px;\" title=\"${tooltip}\"></i>\n <span ref=\"eText\" class=\"ag-header-cell-text\">${escapedTitle}</span>\n <span ref=\"eFilter\" class=\"ag-header-icon ag-header-label-icon ag-filter-icon\" aria-hidden=\"true\"></span>\n <span ref=\"eSortOrder\" class=\"ag-header-icon ag-header-label-icon ag-sort-order\" aria-hidden=\"true\"></span>\n <span ref=\"eSortAsc\" class=\"ag-header-icon ag-header-label-icon ag-sort-ascending-icon\" aria-hidden=\"true\"></span>\n <span ref=\"eSortDesc\" class=\"ag-header-icon ag-header-label-icon ag-sort-descending-icon\" aria-hidden=\"true\"></span>\n <span ref=\"eSortNone\" class=\"ag-header-icon ag-header-label-icon ag-sort-none-icon\" aria-hidden=\"true\"></span>\n </div>\n </div>\n `;\n }\n\n private defaultComparator(a: unknown, b: unknown, col: QueryGridColumnConfig): number {\n if (a === null || a === undefined) return 1;\n if (b === null || b === undefined) return -1;\n\n const baseType = col.sqlBaseType.toLowerCase();\n\n // Numeric comparison\n if (['int', 'bigint', 'smallint', 'tinyint', 'decimal', 'numeric', 'float', 'real', 'money', 'smallmoney'].includes(baseType)) {\n return Number(a) - Number(b);\n }\n\n // Date comparison\n if (['date', 'datetime', 'datetime2', 'smalldatetime', 'datetimeoffset'].includes(baseType)) {\n return new Date(a as string).getTime() - new Date(b as string).getTime();\n }\n\n // String comparison (case-insensitive)\n return String(a).toLowerCase().localeCompare(String(b).toLowerCase());\n }\n\n // ========================================\n // Event Handlers\n // ========================================\n\n public OnRowClicked(event: RowClickedEvent): void {\n const clickEvent: QueryRowClickEvent = {\n rowData: event.data,\n rowIndex: event.rowIndex!,\n mouseEvent: event.event as MouseEvent\n };\n this.RowClick.emit(clickEvent);\n\n // Open row detail panel on single click\n this.OpenRowDetailPanel(event.data, event.rowIndex!);\n }\n\n public OnRowDoubleClicked(event: RowDoubleClickedEvent): void {\n const clickEvent: QueryRowClickEvent = {\n rowData: event.data,\n rowIndex: event.rowIndex!,\n mouseEvent: event.event as MouseEvent\n };\n this.RowDoubleClick.emit(clickEvent);\n }\n\n public OnSelectionChanged(event: SelectionChangedEvent): void {\n if (!this.GridApi) return;\n\n this.SelectedRows = this.GridApi.getSelectedRows();\n const selectedIndices: number[] = [];\n\n this.GridApi.forEachNode((node, index) => {\n if (node.isSelected()) {\n selectedIndices.push(index);\n }\n });\n\n this.SelectionChange.emit({\n selectedIndices,\n selectedRows: this.SelectedRows\n });\n\n this.cdr.markForCheck();\n }\n\n public OnSortChanged(event: AgSortChangedEvent): void {\n if (!this.GridApi) return;\n\n const columnState = this.GridApi.getColumnState();\n const newSortState: QueryGridSortState[] = [];\n\n columnState\n .filter(cs => cs.sort)\n .sort((a, b) => (a.sortIndex || 0) - (b.sortIndex || 0))\n .forEach((cs, index) => {\n newSortState.push({\n field: cs.colId,\n direction: cs.sort as 'asc' | 'desc',\n index\n });\n });\n\n this.SortState = newSortState;\n this.emitStateChange('sort');\n }\n\n public OnColumnResized(event: ColumnResizedEvent): void {\n if (!event.finished || !event.column) return;\n\n const field = event.column.getColId();\n const column = this.Columns.find(c => c.field === field);\n if (column) {\n column.width = event.column.getActualWidth();\n this.emitStateChange('column-resize');\n }\n }\n\n public OnColumnMoved(event: ColumnMovedEvent): void {\n if (!this.GridApi || !event.finished) return;\n\n // Update column order from grid state\n const columnState = this.GridApi.getColumnState();\n columnState.forEach((cs, index) => {\n const column = this.Columns.find(c => c.field === cs.colId);\n if (column) {\n column.order = index;\n }\n });\n\n this.emitStateChange('column-move');\n }\n\n // ========================================\n // State Management\n // ========================================\n\n private emitStateChange(changeType: 'column-resize' | 'column-move' | 'column-visibility' | 'sort'): void {\n const state = this.GetGridState();\n this.stateChangeSubject.next({ state, changeType });\n }\n\n public GetGridState(): QueryGridState {\n return {\n columns: this.Columns.map(c => ({\n field: c.field,\n width: c.width,\n visible: c.visible,\n order: c.order,\n pinned: c.pinned\n })),\n sort: this.SortState\n };\n }\n\n public ApplyGridState(state: QueryGridState): void {\n this.applyColumnStateFromGridState(state);\n this.buildColumnDefs();\n\n // Apply sort state to grid\n if (this.GridApi && state.sort.length > 0) {\n const columnState = state.sort.map(s => ({\n colId: s.field,\n sort: s.direction,\n sortIndex: s.index\n }));\n this.GridApi.applyColumnState({ state: columnState });\n }\n }\n\n /**\n * Loads persisted grid state from User Settings\n */\n private loadPersistedState(): void {\n if (!this.PersistState || !this._queryInfo) {\n return;\n }\n\n try {\n const settingKey = getQueryGridStateKey(this._queryInfo.ID);\n const savedState = UserInfoEngine.Instance.GetSetting(settingKey);\n\n if (savedState) {\n const state = JSON.parse(savedState) as QueryGridState;\n\n // Apply column state immediately (affects buildColumnDefs)\n this.applyColumnStateFromGridState(state);\n\n // Store for applying via Grid API when ready\n this._pendingState = state;\n\n // If grid is already ready, apply full state now\n if (this.GridApi) {\n this.applyFullGridState(state);\n this._pendingState = null;\n }\n }\n } catch (error) {\n console.error('[query-data-grid] Failed to load persisted state:', error);\n }\n }\n\n /**\n * Applies the full grid state (column widths, order, and sort) via the Grid API.\n * This is called after grid is ready to ensure all state is applied correctly.\n */\n private applyFullGridState(state: QueryGridState): void {\n if (!this.GridApi) {\n return;\n }\n\n // Build column state array that includes widths and sort\n const columnState: Array<{\n colId: string;\n width?: number;\n sort?: 'asc' | 'desc' | null;\n sortIndex?: number | null;\n }> = [];\n\n // First, add column widths from saved state\n if (state.columns) {\n for (const col of state.columns) {\n const stateItem: {\n colId: string;\n width?: number;\n sort?: 'asc' | 'desc' | null;\n sortIndex?: number | null;\n } = { colId: col.field };\n\n if (col.width !== undefined) {\n stateItem.width = col.width;\n }\n\n // Check if this column has sort state\n const sortInfo = state.sort?.find(s => s.field === col.field);\n if (sortInfo) {\n stateItem.sort = sortInfo.direction;\n stateItem.sortIndex = sortInfo.index;\n }\n\n columnState.push(stateItem);\n }\n }\n\n // Apply all column state at once\n if (columnState.length > 0) {\n this.GridApi.applyColumnState({\n state: columnState,\n applyOrder: true // Apply column order as well\n });\n }\n }\n\n /**\n * Persists grid state to User Settings\n */\n private async persistGridState(state: QueryGridState): Promise<void> {\n if (!this.PersistState || !this._queryInfo) {\n return;\n }\n\n try {\n const settingKey = getQueryGridStateKey(this._queryInfo.ID);\n await UserInfoEngine.Instance.SetSetting(settingKey, JSON.stringify(state));\n } catch (error) {\n console.error('[query-data-grid] Failed to persist grid state:', error);\n }\n }\n\n /**\n * Flushes any pending state changes immediately.\n * Call this before destroying the component or switching queries\n * to ensure all state changes are persisted.\n */\n public FlushState(): void {\n if (!this.PersistState || !this._queryInfo) {\n return;\n }\n\n // Get current state and persist immediately\n const state = this.GetGridState();\n this.persistGridState(state);\n }\n\n // ========================================\n // Visual Config\n // ========================================\n\n private applyVisualConfig(): void {\n const el = this.elementRef.nativeElement;\n\n // Apply CSS variables\n if (this._mergedVisualConfig.accentColor) {\n el.style.setProperty('--grid-accent-color', this._mergedVisualConfig.accentColor);\n }\n if (this._mergedVisualConfig.selectionIndicatorColor) {\n el.style.setProperty('--grid-selection-indicator', this._mergedVisualConfig.selectionIndicatorColor);\n }\n if (this._mergedVisualConfig.selectionBackground) {\n el.style.setProperty('--grid-selection-bg', this._mergedVisualConfig.selectionBackground);\n }\n }\n\n /**\n * Returns CSS classes for the container based on visual config\n */\n public GetContainerClasses(): Record<string, boolean> {\n const contrast = this._mergedVisualConfig.alternateRowContrast || 'medium';\n return {\n [`alternate-rows-${contrast}`]: true\n };\n }\n\n // ========================================\n // Export Dialog\n // ========================================\n\n public ShowExportDialog: boolean = false;\n public ExportDialogConfig: ExportDialogConfig | null = null;\n\n // ========================================\n // Row Detail Panel State\n // ========================================\n\n public ShowRowDetailPanel: boolean = false;\n public RowDetailData: Record<string, unknown> | null = null;\n public RowDetailIndex: number = 0;\n\n // ========================================\n // Toolbar Actions\n // ========================================\n\n public Refresh(): void {\n this.RefreshRequest.emit();\n }\n\n /**\n * Opens the export dialog with current grid data\n */\n public async OpenExportDialog(): Promise<void> {\n if (!this._data.length) return;\n\n this.IsPreparingExport = true;\n this.cdr.detectChanges();\n let data: ExportData;\n try {\n data = await this.resolveExportData();\n } finally {\n this.IsPreparingExport = false;\n }\n const columns = this.getExportColumns();\n const fileName = this._queryInfo?.Name || 'query-export';\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._queryInfo?.Name || 'Query Results'}`\n };\n this.ShowExportDialog = true;\n this.cdr.detectChanges();\n }\n\n /**\n * Handle export dialog close\n */\n public 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 */\n public async Export(options?: Partial<ExportOptions>, download: boolean = true): Promise<ExportResult> {\n const data = await this.resolveExportData();\n const columns = this.getExportColumns();\n const fileName = options?.fileName || this._queryInfo?.Name || 'query-export';\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 * Resolves the rows to export. An explicit row selection always wins. Otherwise, if a host\n * supplied an ExportDataProvider, the full result set is fetched (so export isn't silently\n * capped at the current page — bug B3/C1); if it isn't supplied or the fetch yields nothing,\n * export falls back to the loaded page (`_data`).\n */\n private async resolveExportData(): Promise<ExportData> {\n if (this.SelectedRows.length > 0) {\n return this.SelectedRows as ExportData;\n }\n if (this.ExportDataProvider) {\n try {\n const allRows = await this.ExportDataProvider();\n if (allRows && allRows.length > 0) {\n return allRows as ExportData;\n }\n } catch {\n // Fall through to the loaded page on any fetch failure.\n }\n }\n return this._data as ExportData;\n }\n\n /**\n * Get column definitions for export based on current grid columns\n */\n private getExportColumns(): ExportColumn[] {\n return this.Columns\n .filter(c => c.visible)\n .map(c => ({\n name: c.field,\n displayName: c.title,\n type: this.mapSqlTypeToExportType(c.sqlBaseType)\n }));\n }\n\n private mapSqlTypeToExportType(sqlType: string): 'string' | 'number' | 'boolean' | 'date' {\n const baseType = sqlType.toLowerCase();\n if (['int', 'bigint', 'smallint', 'tinyint', 'decimal', 'numeric', 'float', 'real', 'money', 'smallmoney'].includes(baseType)) {\n return 'number';\n }\n if (['bit'].includes(baseType)) {\n return 'boolean';\n }\n if (['date', 'datetime', 'datetime2', 'smalldatetime', 'datetimeoffset'].includes(baseType)) {\n return 'date';\n }\n return 'string';\n }\n\n public ClearSelection(): void {\n if (this.GridApi) {\n this.GridApi.deselectAll();\n }\n }\n\n // ========================================\n // Public API\n // ========================================\n\n public GetSelectedRows(): Record<string, unknown>[] {\n return this.SelectedRows;\n }\n\n public get RowCount(): number {\n return this._data.length;\n }\n\n public get SelectionCount(): number {\n return this.SelectedRows.length;\n }\n\n // ========================================\n // AG Grid Configuration\n // ========================================\n\n public GetRowSelectionConfig(): RowSelectionOptions | undefined {\n if (this.SelectionMode === 'none') {\n return undefined;\n }\n\n if (this.SelectionMode === 'single') {\n return {\n mode: 'singleRow',\n enableClickSelection: true\n };\n }\n\n // Multi-row selection (both 'multiple' and 'checkbox' modes)\n return {\n mode: 'multiRow',\n enableClickSelection: true,\n checkboxes: this.SelectionMode === 'checkbox',\n enableSelectionWithoutKeys: this.SelectionMode === 'multiple'\n };\n }\n\n public GetRowId = (params: GetRowIdParams): string => {\n const data = params.data as Record<string, unknown>;\n if (!data) return `mjrow_${this._syntheticRowIdSeq++}`;\n\n // Prefer a natural unique key when the result exposes one — this keeps row\n // identity (and selection) stable across data refreshes.\n const idFields = ['ID', 'Id', 'id', 'RowNumber', 'RowNum', '__row_index'];\n for (const field of idFields) {\n if (data[field] !== undefined && data[field] !== null) {\n return String(data[field]);\n }\n }\n\n // No natural key — use the per-row synthetic id assigned when Data was set.\n // The previous fallback hashed only the first 3 columns, so any rows that\n // matched on those columns collided to the same id and ag-Grid dropped all\n // but one (silently collapsing aggregate/GROUP BY results, or any query\n // without an ID column). A per-row synthetic id can never collide.\n // Trade-off: the id is per-object (not value-derived), so an id-less row\n // loses its selection across a data refresh — acceptable for query results,\n // where NOT dropping rows matters far more than preserving a selection.\n let synthetic = this._syntheticRowIds.get(data);\n if (!synthetic) {\n synthetic = `mjrow_${this._syntheticRowIdSeq++}`;\n this._syntheticRowIds.set(data, synthetic);\n }\n return synthetic;\n };\n\n // ========================================\n // Row Detail Panel\n // ========================================\n\n /**\n * Opens the row detail panel with the given row data\n */\n public OpenRowDetailPanel(rowData: Record<string, unknown>, rowIndex: number): void {\n this.RowDetailData = rowData;\n this.RowDetailIndex = rowIndex;\n this.ShowRowDetailPanel = true;\n this.cdr.markForCheck();\n }\n\n /**\n * Closes the row detail panel\n */\n public CloseRowDetailPanel(): void {\n this.ShowRowDetailPanel = false;\n this.RowDetailData = null;\n this.cdr.markForCheck();\n }\n\n /**\n * Navigate to the previous row in the detail panel\n */\n public NavigateRowDetail(direction: 'prev' | 'next'): void {\n if (!this._data.length) return;\n\n if (direction === 'prev' && this.RowDetailIndex > 0) {\n this.RowDetailIndex--;\n this.RowDetailData = this._data[this.RowDetailIndex];\n } else if (direction === 'next' && this.RowDetailIndex < this._data.length - 1) {\n this.RowDetailIndex++;\n this.RowDetailData = this._data[this.RowDetailIndex];\n }\n\n // Select the row in the grid\n if (this.GridApi) {\n this.GridApi.deselectAll();\n const node = this.GridApi.getRowNode(String(this.RowDetailIndex));\n if (node) {\n node.setSelected(true);\n this.GridApi.ensureNodeVisible(node);\n }\n }\n\n this.cdr.markForCheck();\n }\n\n /**\n * Handle entity link click from the row detail panel\n */\n public OnRowDetailEntityLinkClick(event: RowDetailEntityLinkEvent): void {\n // Find the column config to include in the entity link event\n const column = this.Columns.find(c => c.field === event.fieldName);\n\n this.EntityLinkClick.emit({\n entityName: event.entityName,\n recordId: event.recordId,\n column: column || null,\n rowData: this.RowDetailData || {}\n });\n }\n}\n","<!-- Query Data Grid Component -->\n<div class=\"query-data-grid-container\" [ngClass]=\"GetContainerClasses()\" [style.height]=\"Height\">\n <!-- Toolbar -->\n @if (ShowToolbar) {\n <div class=\"grid-toolbar\">\n <div class=\"toolbar-left\">\n <!-- Row count -->\n @if (ShowRowCount) {\n <span class=\"row-count\">\n <i class=\"fa-solid fa-table-list\"></i>\n @if (TotalRowCount > RowCount) {\n {{ RowCount | number }} of {{ TotalRowCount | number }} {{ TotalRowCount === 1 ? 'row' : 'rows' }}\n } @else {\n {{ RowCount | number }} {{ RowCount === 1 ? 'row' : 'rows' }}\n }\n </span>\n }\n <!-- Selection count -->\n @if (ShowSelectionCount && SelectionCount > 0) {\n <span class=\"selection-count\">\n <i class=\"fa-solid fa-check-square\"></i>\n {{ SelectionCount }} selected\n <button class=\"clear-selection-btn\" (click)=\"ClearSelection()\" title=\"Clear selection\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </span>\n }\n </div>\n <div class=\"toolbar-right\">\n <!-- Refresh button -->\n @if (ShowRefresh) {\n <button\n (click)=\"Refresh()\"\n [disabled]=\"IsLoading\"\n title=\"Refresh data\"\n class=\"toolbar-btn icon-only\">\n <i class=\"fa-solid fa-sync-alt\" [class.fa-spin]=\"IsLoading\"></i>\n </button>\n }\n <!-- Export button -->\n @if (ShowExport) {\n <button\n [disabled]=\"RowCount === 0 || IsPreparingExport\"\n title=\"Export data\"\n class=\"toolbar-btn\"\n (click)=\"OpenExportDialog()\">\n <i class=\"fa-solid\" [class.fa-file-export]=\"!IsPreparingExport\" [class.fa-spinner]=\"IsPreparingExport\" [class.fa-spin]=\"IsPreparingExport\"></i>\n <span class=\"button-text\">Export</span>\n </button>\n }\n </div>\n </div>\n }\n\n <!-- Loading overlay -->\n @if (IsLoading) {\n <div class=\"loading-overlay\" @fadeIn>\n <mj-loading text=\"Loading query results...\"></mj-loading>\n </div>\n }\n\n <!-- AG Grid -->\n <div class=\"grid-wrapper\" [class.loading]=\"IsLoading\">\n <ag-grid-angular\n class=\"query-grid\"\n [theme]=\"Theme\"\n [rowData]=\"Data\"\n [columnDefs]=\"ColumnDefs\"\n [defaultColDef]=\"DefaultColDef\"\n [gridOptions]=\"GridOptions\"\n [rowSelection]=\"GetRowSelectionConfig()\"\n [getRowId]=\"GetRowId\"\n (gridReady)=\"OnGridReady($event)\"\n (rowClicked)=\"OnRowClicked($event)\"\n (rowDoubleClicked)=\"OnRowDoubleClicked($event)\"\n (selectionChanged)=\"OnSelectionChanged($event)\"\n (sortChanged)=\"OnSortChanged($event)\"\n (columnResized)=\"OnColumnResized($event)\"\n (columnMoved)=\"OnColumnMoved($event)\">\n </ag-grid-angular>\n </div>\n\n <!-- Pagination (only shown when server-side paging is active) -->\n @if (TotalRowCount > 0) {\n <mj-pagination\n [TotalRowCount]=\"TotalRowCount\"\n [PageNumber]=\"PageNumber\"\n [PageSize]=\"PageSize\"\n [IsLoading]=\"IsLoading\"\n (PageChange)=\"PageChange.emit($event)\">\n </mj-pagination>\n }\n\n <!-- Empty state -->\n @if (!IsLoading && RowCount === 0) {\n <mj-empty-state\n class=\"empty-state\"\n @fadeIn\n Icon=\"fa-solid fa-database\"\n Title=\"No results\"\n Message=\"Run the query to see results\" />\n }\n</div>\n\n<!-- Export Dialog -->\n<mj-export-dialog\n [visible]=\"ShowExportDialog\"\n [config]=\"ExportDialogConfig\"\n (closed)=\"OnExportDialogClosed($event)\">\n</mj-export-dialog>\n\n<!-- Row Detail Panel -->\n<mj-query-row-detail\n [RowData]=\"RowDetailData\"\n [Columns]=\"Columns\"\n [QueryInfo]=\"QueryInfo\"\n [Visible]=\"ShowRowDetailPanel\"\n [RowIndex]=\"RowDetailIndex\"\n [TotalRows]=\"RowCount\"\n (Close)=\"CloseRowDetailPanel()\"\n (EntityLinkClick)=\"OnRowDetailEntityLinkClick($event)\"\n (NavigateRow)=\"NavigateRowDetail($event)\">\n</mj-query-row-detail>\n"]}
1
+ {"version":3,"file":"query-data-grid.component.js","sourceRoot":"","sources":["../../../src/lib/query-data-grid/query-data-grid.component.ts","../../../src/lib/query-data-grid/query-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 ChangeDetectionStrategy,\n ElementRef,\n ViewChild\n} from '@angular/core';\nimport { trigger, transition, style, animate } from '@angular/animations';\nimport { Subject } from 'rxjs';\nimport { debounceTime, takeUntil } from 'rxjs/operators';\nimport { MJQueryEntityExtended } from '@memberjunction/core-entities';\nimport { FormatDateOnly, IsDateOnlySQLType } from '@memberjunction/core';\nimport { PageChangeEvent } from '@memberjunction/ng-pagination';\nimport { UserInfoEngine } from '@memberjunction/core-entities';\nimport {\n ColDef,\n GridReadyEvent,\n RowClickedEvent,\n GridApi,\n RowDoubleClickedEvent,\n ModuleRegistry,\n AllCommunityModule,\n RowSelectionOptions,\n GetRowIdParams,\n themeAlpine,\n SortChangedEvent as AgSortChangedEvent,\n type Theme,\n ColumnResizedEvent,\n ColumnMovedEvent,\n SelectionChangedEvent,\n ICellRendererParams,\n GridOptions\n} from 'ag-grid-community';\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';\nimport {\n QueryGridSelectionMode,\n QueryGridColumnConfig,\n QueryGridSortState,\n QueryGridState,\n QueryGridVisualConfig,\n DEFAULT_QUERY_VISUAL_CONFIG,\n QueryRowClickEvent,\n QueryEntityLinkClickEvent,\n QueryGridStateChangedEvent,\n QuerySelectionChangedEvent,\n QueryExportOptions,\n buildColumnsFromQueryFields,\n buildColumnsFromData,\n getQueryGridStateKey\n} from './models/query-grid-types';\nimport { RowDetailEntityLinkEvent } from '../query-row-detail/query-row-detail.component';\n\n// Register AG Grid modules\nModuleRegistry.registerModules([AllCommunityModule]);\n\n/**\n * A data grid component for displaying query results with full interactivity.\n * Features:\n * - Client-side sorting with multi-column support\n * - Column resizing, reordering, and visibility toggle\n * - Entity linking for columns with SourceEntityID\n * - State persistence to User Settings\n * - Export to Excel/CSV\n * - Row selection (single, multiple, checkbox modes)\n *\n * @example\n * ```html\n * <mj-query-data-grid\n * [queryInfo]=\"query\"\n * [data]=\"queryResults\"\n * [selectionMode]=\"'multiple'\"\n * (entityLinkClick)=\"onEntityLinkClick($event)\">\n * </mj-query-data-grid>\n * ```\n */\n@Component({\n standalone: false,\n selector: 'mj-query-data-grid',\n templateUrl: './query-data-grid.component.html',\n styleUrls: ['./query-data-grid.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\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 QueryDataGridComponent implements OnInit, OnDestroy {\n // ========================================\n // Inputs\n // ========================================\n\n private _queryInfo: MJQueryEntityExtended | null = null;\n /**\n * The QueryInfo metadata for the query being displayed.\n * Used to derive column configurations and entity linking.\n */\n @Input()\n set QueryInfo(value: MJQueryEntityExtended | null) {\n const previous = this._queryInfo;\n // Flush state for the previous query before switching\n if (previous && value !== previous) {\n this.FlushState();\n }\n this._queryInfo = value;\n if (value && value !== previous) {\n this.onQueryInfoChanged();\n }\n }\n get QueryInfo(): MJQueryEntityExtended | null {\n return this._queryInfo;\n }\n\n private _columnConfigs: QueryGridColumnConfig[] | null = null;\n /**\n * Optional pre-built column configurations for ad-hoc queries without saved metadata.\n * When provided, overrides both QueryInfo-derived columns and auto-inferred columns.\n * Enables entity linking without requiring a saved Query or QueryInfo object.\n *\n * Set this BEFORE setting Data to ensure columns are configured before the grid renders.\n */\n @Input()\n set ColumnConfigs(value: QueryGridColumnConfig[] | null) {\n this._columnConfigs = value;\n if (value && value.length > 0) {\n this.Columns = value;\n this.buildColumnDefs();\n this.cdr.markForCheck();\n }\n }\n get ColumnConfigs(): QueryGridColumnConfig[] | null {\n return this._columnConfigs;\n }\n\n private _data: Record<string, unknown>[] = [];\n\n /**\n * Per-row synthetic identity for rows that have no natural key column, so the\n * `getRowId` fallback can never return duplicate ids (ag-Grid silently merges\n * rows that share an id). Keyed by the row object reference; entries are added\n * as Data is assigned. A WeakMap so it never retains rows past their lifetime.\n */\n private _syntheticRowIds = new WeakMap<object, string>();\n private _syntheticRowIdSeq = 0;\n\n /**\n * The query result data to display in the grid.\n */\n @Input()\n set Data(value: Record<string, unknown>[]) {\n this._data = value || [];\n\n // Assign a stable synthetic id to each row up front, so the getRowId\n // fallback (used only when a row has no natural key column) is\n // collision-proof — rows with identical column values must NOT be merged.\n for (const row of this._data) {\n if (row && !this._syntheticRowIds.has(row)) {\n this._syntheticRowIds.set(row, `mjrow_${this._syntheticRowIdSeq++}`);\n }\n }\n\n // If we have data but no columns from metadata or explicit configs, build from data\n if (this._data.length > 0 && this.Columns.length === 0 && !this._columnConfigs) {\n this.Columns = buildColumnsFromData(this._data);\n this.buildColumnDefs();\n }\n\n if (this.GridApi) {\n this.GridApi.setGridOption('rowData', this._data);\n }\n this.cdr.markForCheck();\n }\n get Data(): Record<string, unknown>[] {\n return this._data;\n }\n\n /**\n * Selection mode for the grid\n */\n @Input() SelectionMode: QueryGridSelectionMode = 'multiple';\n\n /**\n * Whether to show the toolbar\n */\n @Input() ShowToolbar: boolean = true;\n\n /**\n * Whether to show row count in toolbar\n */\n @Input() ShowRowCount: boolean = true;\n\n /**\n * Whether to show selection count in toolbar\n */\n @Input() ShowSelectionCount: boolean = true;\n\n /**\n * Whether to show export button\n */\n @Input() ShowExport: boolean = true;\n\n /**\n * Whether to show refresh button\n */\n @Input() ShowRefresh: boolean = true;\n\n /**\n * Whether to allow sorting\n */\n @Input() AllowSorting: boolean = true;\n\n /**\n * Whether to allow column resizing\n */\n @Input() AllowColumnResize: boolean = true;\n\n /**\n * Whether to allow column reordering\n */\n @Input() AllowColumnReorder: boolean = true;\n\n /**\n * Visual configuration\n */\n @Input() VisualConfig: QueryGridVisualConfig = {};\n\n /**\n * External loading state - when true, shows loading overlay\n */\n @Input() IsLoading: boolean = false;\n\n /**\n * Height of the grid container\n */\n @Input() Height: string = '100%';\n\n /**\n * Initial grid state (for restoring from persistence)\n */\n @Input() InitialGridState: QueryGridState | null = null;\n\n /**\n * Whether to automatically persist grid state (column widths, order, sort) to User Settings\n */\n @Input() PersistState: boolean = true;\n\n // ========================================\n // Outputs\n // ========================================\n\n /**\n * Fired when a row is clicked\n */\n @Output() RowClick = new EventEmitter<QueryRowClickEvent>();\n\n /**\n * Fired when a row is double-clicked\n */\n @Output() RowDoubleClick = new EventEmitter<QueryRowClickEvent>();\n\n /**\n * Fired when an entity link is clicked\n */\n @Output() EntityLinkClick = new EventEmitter<QueryEntityLinkClickEvent>();\n\n /**\n * Fired when selection changes\n */\n @Output() SelectionChange = new EventEmitter<QuerySelectionChangedEvent>();\n\n /**\n * Fired when grid state changes (for persistence)\n */\n @Output() GridStateChange = new EventEmitter<QueryGridStateChangedEvent>();\n\n /**\n * Fired when refresh is requested\n */\n @Output() RefreshRequest = new EventEmitter<void>();\n\n /**\n * Total row count for server-side paging (from RunQueryResult.TotalRowCount).\n * When > 0 and TotalPages > 1, the data pager is displayed below the grid.\n */\n @Input() TotalRowCount: number = 0;\n\n /** Current page number (1-based) for server-side paging */\n @Input() PageNumber: number = 1;\n\n /** Page size for server-side paging */\n @Input() PageSize: number = 100;\n\n /**\n * Optional provider that returns the FULL result set for export. When the grid is server-side\n * paged, `Data` only holds the current page (default 100 rows), so exporting `Data` would silently\n * cap the export at the page size (bug B3/C1). A host that owns the query (with its parameters) can\n * supply this callback to fetch every matching row on demand; the grid awaits it when the user\n * exports without an explicit row selection. When not provided, export falls back to the loaded page.\n */\n @Input() ExportDataProvider: (() => Promise<Record<string, unknown>[]>) | null = null;\n\n /** True while an export is fetching the full result set via ExportDataProvider. */\n public IsPreparingExport: boolean = false;\n\n /** Fired when the user navigates to a different page */\n @Output() PageChange = new EventEmitter<PageChangeEvent>();\n\n // ========================================\n // Internal State\n // ========================================\n\n public GridApi: GridApi | null = null;\n public ColumnDefs: ColDef[] = [];\n public Columns: QueryGridColumnConfig[] = [];\n public SortState: QueryGridSortState[] = [];\n public SelectedRows: Record<string, unknown>[] = [];\n public Theme: Theme = themeAlpine.withParams({\n backgroundColor: 'var(--mj-bg-surface)',\n foregroundColor: 'var(--mj-text-primary)',\n textColor: 'var(--mj-text-primary)',\n borderColor: 'var(--mj-border-default)',\n chromeBackgroundColor: 'var(--mj-bg-surface-card)',\n headerBackgroundColor: 'var(--mj-bg-surface-card)',\n headerTextColor: 'var(--mj-text-secondary)',\n cellTextColor: 'var(--mj-text-primary)',\n subtleTextColor: 'var(--mj-text-muted)',\n dataBackgroundColor: 'var(--mj-bg-surface)',\n oddRowBackgroundColor: 'var(--mj-bg-surface-card)',\n rowHoverColor: 'var(--mj-bg-surface-hover, color-mix(in srgb, var(--mj-brand-primary) 5%, var(--mj-bg-surface)))',\n selectedRowBackgroundColor: 'color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface))',\n accentColor: 'var(--mj-brand-primary)',\n borderRadius: 'var(--mj-radius-sm)',\n browserColorScheme: 'inherit',\n });\n\n private destroy$ = new Subject<void>();\n private stateChangeSubject = new Subject<QueryGridStateChangedEvent>();\n private statePersistSubject = new Subject<QueryGridState>();\n private _mergedVisualConfig: Required<QueryGridVisualConfig> = DEFAULT_QUERY_VISUAL_CONFIG;\n private _pendingState: QueryGridState | null = null;\n\n // Grid options\n public GridOptions: GridOptions = {\n animateRows: true,\n rowHeight: 36,\n headerHeight: 40,\n suppressCellFocus: false,\n enableCellTextSelection: true,\n ensureDomOrder: true,\n suppressNoRowsOverlay: true\n };\n\n /** Default column settings - enables sorting, resizing */\n public DefaultColDef: ColDef = {\n sortable: true,\n resizable: true,\n minWidth: 50\n };\n\n constructor(\n private cdr: ChangeDetectorRef,\n private elementRef: ElementRef,\n private exportService: ExportService\n ) {\n // Debounce state changes for persistence\n this.stateChangeSubject.pipe(\n debounceTime(500),\n takeUntil(this.destroy$)\n ).subscribe(event => {\n this.GridStateChange.emit(event);\n // Also persist to User Settings if enabled\n if (this.PersistState && this._queryInfo) {\n this.statePersistSubject.next(event.state);\n }\n });\n\n // Debounce state persistence to User Settings\n this.statePersistSubject.pipe(\n debounceTime(1000),\n takeUntil(this.destroy$)\n ).subscribe(state => {\n this.persistGridState(state);\n });\n }\n\n ngOnInit(): void {\n this._mergedVisualConfig = { ...DEFAULT_QUERY_VISUAL_CONFIG, ...this.VisualConfig };\n this.applyVisualConfig();\n }\n\n ngOnDestroy(): void {\n // Flush any pending state changes before destroy\n this.FlushState();\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n // ========================================\n // Grid Setup\n // ========================================\n\n public OnGridReady(event: GridReadyEvent): void {\n this.GridApi = event.api;\n\n // Apply initial data if available\n if (this._data.length > 0) {\n this.GridApi.setGridOption('rowData', this._data);\n }\n\n // Apply initial state if provided via Input\n if (this.InitialGridState) {\n this.applyFullGridState(this.InitialGridState);\n }\n // Otherwise apply pending state from persistence\n else if (this._pendingState) {\n this.applyFullGridState(this._pendingState);\n this._pendingState = null;\n }\n // Only auto-size if no persisted state was applied\n else {\n setTimeout(() => {\n if (this.GridApi) {\n this.GridApi.autoSizeAllColumns();\n }\n }, 100);\n }\n }\n\n private onQueryInfoChanged(): void {\n if (!this._queryInfo) {\n this.Columns = [];\n this.ColumnDefs = [];\n return;\n }\n\n // Build columns from query fields\n this.Columns = buildColumnsFromQueryFields(this._queryInfo.QueryFields);\n\n // Apply initial state if provided via prop (takes precedence)\n if (this.InitialGridState) {\n this.applyColumnStateFromGridState(this.InitialGridState);\n } else {\n // Otherwise try to load from User Settings\n this.loadPersistedState();\n }\n\n // Build AG Grid column definitions\n this.buildColumnDefs();\n\n // If grid is already initialized and we have pending state, apply it now\n if (this.GridApi && this._pendingState) {\n this.applyFullGridState(this._pendingState);\n this._pendingState = null;\n }\n\n this.cdr.markForCheck();\n }\n\n private applyColumnStateFromGridState(state: QueryGridState): void {\n if (!state.columns) return;\n\n for (const colState of state.columns) {\n const column = this.Columns.find(c => c.field === colState.field);\n if (column) {\n if (colState.width !== undefined) column.width = colState.width;\n column.visible = colState.visible;\n column.order = colState.order;\n column.pinned = colState.pinned || null;\n }\n }\n\n // Apply sort state\n if (state.sort) {\n this.SortState = [...state.sort];\n }\n\n // Re-sort columns by order\n this.Columns.sort((a, b) => a.order - b.order);\n }\n\n private buildColumnDefs(): void {\n const visibleColumns = this.Columns.filter(c => c.visible);\n\n // Add checkbox column if needed\n const defs: ColDef[] = [];\n\n if (this.SelectionMode === 'checkbox') {\n defs.push({\n headerName: '',\n field: '__checkbox',\n width: 50,\n minWidth: 50,\n maxWidth: 50,\n checkboxSelection: true,\n headerCheckboxSelection: true,\n pinned: 'left',\n suppressSizeToFit: true,\n sortable: false,\n filter: false,\n resizable: false\n });\n }\n\n // Add data columns\n for (const col of visibleColumns) {\n const colDef: ColDef = {\n field: col.field,\n headerName: col.title,\n headerTooltip: col.description || undefined,\n width: col.width,\n minWidth: col.minWidth,\n maxWidth: col.maxWidth,\n sortable: this.AllowSorting && col.sortable,\n resizable: this.AllowColumnResize && col.resizable,\n pinned: col.pinned || undefined,\n flex: col.flex,\n cellStyle: this.getCellStyle(col),\n headerClass: this.getHeaderClass(col),\n comparator: (a, b) => this.defaultComparator(a, b, col)\n };\n\n // Add entity link cell renderer if applicable\n if (col.isEntityLink && col.targetEntityName) {\n colDef.cellRenderer = (params: ICellRendererParams) =>\n this.renderEntityLinkCell(params, col);\n // Add custom header with entity icon and column name\n colDef.headerComponentParams = {\n template: this.getEntityLinkHeaderTemplate(col)\n };\n } else {\n // Apply type-specific formatting\n colDef.valueFormatter = (params) => this.formatCellValue(params.value, col);\n }\n\n defs.push(colDef);\n }\n\n this.ColumnDefs = defs;\n\n // Apply to grid if ready\n if (this.GridApi) {\n this.GridApi.setGridOption('columnDefs', this.ColumnDefs);\n }\n }\n\n // ========================================\n // Cell Rendering\n // ========================================\n\n private getCellStyle(col: QueryGridColumnConfig): Record<string, string> {\n const style: Record<string, string> = {};\n\n if (col.align === 'right') {\n style['text-align'] = 'right';\n style['justify-content'] = 'flex-end';\n } else if (col.align === 'center') {\n style['text-align'] = 'center';\n style['justify-content'] = 'center';\n }\n\n return style;\n }\n\n private getHeaderClass(col: QueryGridColumnConfig): string {\n const classes: string[] = [];\n\n if (col.align === 'right') {\n classes.push('header-right');\n } else if (col.align === 'center') {\n classes.push('header-center');\n }\n\n return classes.join(' ');\n }\n\n private formatCellValue(value: unknown, col: QueryGridColumnConfig): string {\n if (value === null || value === undefined) {\n return '';\n }\n\n const baseType = col.sqlBaseType.toLowerCase();\n\n // Boolean formatting\n if (baseType === 'bit') {\n if (this._mergedVisualConfig.booleanIcons) {\n return value ? '✓' : '✗';\n }\n return value ? 'Yes' : 'No';\n }\n\n // Date formatting\n if (['date', 'datetime', 'datetime2', 'smalldatetime', 'datetimeoffset'].includes(baseType)) {\n const date = new Date(value as string);\n if (isNaN(date.getTime())) return String(value);\n\n // A SQL `date` is a calendar day delivered as UTC midnight: format it in UTC, or a\n // reader west of Greenwich sees the day before.\n if (IsDateOnlySQLType(baseType)) {\n return this._mergedVisualConfig.friendlyDates\n ? FormatDateOnly(date, { year: 'numeric', month: 'short', day: 'numeric' }, 'en-US')\n : date.toISOString().slice(0, 10);\n }\n\n if (this._mergedVisualConfig.friendlyDates) {\n return date.toLocaleString('en-US', {\n year: 'numeric', month: 'short', day: 'numeric',\n hour: 'numeric', minute: '2-digit'\n });\n }\n return date.toISOString();\n }\n\n // Number formatting - check if value is actually numeric first\n if (['int', 'bigint', 'smallint', 'tinyint'].includes(baseType)) {\n const num = Number(value);\n if (isNaN(num)) return String(value);\n return num.toLocaleString();\n }\n\n if (['decimal', 'numeric', 'float', 'real'].includes(baseType)) {\n const num = Number(value);\n if (isNaN(num)) return String(value);\n return num.toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 4 });\n }\n\n if (['money', 'smallmoney'].includes(baseType)) {\n const num = Number(value);\n if (isNaN(num)) return String(value);\n return new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD' }).format(num);\n }\n\n return String(value);\n }\n\n private renderEntityLinkCell(params: ICellRendererParams, col: QueryGridColumnConfig): HTMLElement {\n const container = document.createElement('div');\n container.className = 'entity-link-cell';\n\n if (params.value === null || params.value === undefined) {\n return container;\n }\n\n const link = document.createElement('a');\n link.href = 'javascript:void(0)';\n link.className = 'entity-link';\n link.textContent = String(params.value);\n link.title = `Open ${col.targetEntityName} record`;\n\n link.addEventListener('click', (e) => {\n e.preventDefault();\n e.stopPropagation();\n this.EntityLinkClick.emit({\n entityName: col.targetEntityName!,\n recordId: String(params.value),\n column: col,\n rowData: params.data\n });\n });\n\n container.appendChild(link);\n\n const icon = document.createElement('i');\n icon.className = 'fa-solid fa-arrow-up-right-from-square entity-link-icon';\n container.appendChild(icon);\n\n return container;\n }\n\n /**\n * Generates header template HTML with entity icon from metadata\n * Shows: [Entity Icon] Column Name [Sort Icons]\n */\n private getEntityLinkHeaderTemplate(col: QueryGridColumnConfig): string {\n // Use the target entity's icon from metadata, fallback to generic icons\n const entityIcon = col.targetEntityIcon || (col.isPrimaryKey ? 'fa-solid fa-key' : 'fa-solid fa-link');\n const tooltip = col.isPrimaryKey\n ? `Primary key - links to ${col.targetEntityName}`\n : `Foreign key - links to ${col.targetEntityName}`;\n // Escape the title for safe HTML insertion\n const escapedTitle = col.title.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;');\n\n return `\n <div class=\"ag-cell-label-container\" role=\"presentation\">\n <span ref=\"eMenu\" class=\"ag-header-icon ag-header-cell-menu-button\" aria-hidden=\"true\"></span>\n <div ref=\"eLabel\" class=\"ag-header-cell-label\" role=\"presentation\">\n <i class=\"${entityIcon} entity-header-icon\" style=\"color: #5c6bc0; margin-right: 6px; font-size: 12px;\" title=\"${tooltip}\"></i>\n <span ref=\"eText\" class=\"ag-header-cell-text\">${escapedTitle}</span>\n <span ref=\"eFilter\" class=\"ag-header-icon ag-header-label-icon ag-filter-icon\" aria-hidden=\"true\"></span>\n <span ref=\"eSortOrder\" class=\"ag-header-icon ag-header-label-icon ag-sort-order\" aria-hidden=\"true\"></span>\n <span ref=\"eSortAsc\" class=\"ag-header-icon ag-header-label-icon ag-sort-ascending-icon\" aria-hidden=\"true\"></span>\n <span ref=\"eSortDesc\" class=\"ag-header-icon ag-header-label-icon ag-sort-descending-icon\" aria-hidden=\"true\"></span>\n <span ref=\"eSortNone\" class=\"ag-header-icon ag-header-label-icon ag-sort-none-icon\" aria-hidden=\"true\"></span>\n </div>\n </div>\n `;\n }\n\n private defaultComparator(a: unknown, b: unknown, col: QueryGridColumnConfig): number {\n if (a === null || a === undefined) return 1;\n if (b === null || b === undefined) return -1;\n\n const baseType = col.sqlBaseType.toLowerCase();\n\n // Numeric comparison\n if (['int', 'bigint', 'smallint', 'tinyint', 'decimal', 'numeric', 'float', 'real', 'money', 'smallmoney'].includes(baseType)) {\n return Number(a) - Number(b);\n }\n\n // Date comparison\n if (['date', 'datetime', 'datetime2', 'smalldatetime', 'datetimeoffset'].includes(baseType)) {\n return new Date(a as string).getTime() - new Date(b as string).getTime();\n }\n\n // String comparison (case-insensitive)\n return String(a).toLowerCase().localeCompare(String(b).toLowerCase());\n }\n\n // ========================================\n // Event Handlers\n // ========================================\n\n public OnRowClicked(event: RowClickedEvent): void {\n const clickEvent: QueryRowClickEvent = {\n rowData: event.data,\n rowIndex: event.rowIndex!,\n mouseEvent: event.event as MouseEvent\n };\n this.RowClick.emit(clickEvent);\n\n // Open row detail panel on single click\n this.OpenRowDetailPanel(event.data, event.rowIndex!);\n }\n\n public OnRowDoubleClicked(event: RowDoubleClickedEvent): void {\n const clickEvent: QueryRowClickEvent = {\n rowData: event.data,\n rowIndex: event.rowIndex!,\n mouseEvent: event.event as MouseEvent\n };\n this.RowDoubleClick.emit(clickEvent);\n }\n\n public OnSelectionChanged(event: SelectionChangedEvent): void {\n if (!this.GridApi) return;\n\n this.SelectedRows = this.GridApi.getSelectedRows();\n const selectedIndices: number[] = [];\n\n this.GridApi.forEachNode((node, index) => {\n if (node.isSelected()) {\n selectedIndices.push(index);\n }\n });\n\n this.SelectionChange.emit({\n selectedIndices,\n selectedRows: this.SelectedRows\n });\n\n this.cdr.markForCheck();\n }\n\n public OnSortChanged(event: AgSortChangedEvent): void {\n if (!this.GridApi) return;\n\n const columnState = this.GridApi.getColumnState();\n const newSortState: QueryGridSortState[] = [];\n\n columnState\n .filter(cs => cs.sort)\n .sort((a, b) => (a.sortIndex || 0) - (b.sortIndex || 0))\n .forEach((cs, index) => {\n newSortState.push({\n field: cs.colId,\n direction: cs.sort as 'asc' | 'desc',\n index\n });\n });\n\n this.SortState = newSortState;\n this.emitStateChange('sort');\n }\n\n public OnColumnResized(event: ColumnResizedEvent): void {\n if (!event.finished || !event.column) return;\n\n const field = event.column.getColId();\n const column = this.Columns.find(c => c.field === field);\n if (column) {\n column.width = event.column.getActualWidth();\n this.emitStateChange('column-resize');\n }\n }\n\n public OnColumnMoved(event: ColumnMovedEvent): void {\n if (!this.GridApi || !event.finished) return;\n\n // Update column order from grid state\n const columnState = this.GridApi.getColumnState();\n columnState.forEach((cs, index) => {\n const column = this.Columns.find(c => c.field === cs.colId);\n if (column) {\n column.order = index;\n }\n });\n\n this.emitStateChange('column-move');\n }\n\n // ========================================\n // State Management\n // ========================================\n\n private emitStateChange(changeType: 'column-resize' | 'column-move' | 'column-visibility' | 'sort'): void {\n const state = this.GetGridState();\n this.stateChangeSubject.next({ state, changeType });\n }\n\n public GetGridState(): QueryGridState {\n return {\n columns: this.Columns.map(c => ({\n field: c.field,\n width: c.width,\n visible: c.visible,\n order: c.order,\n pinned: c.pinned\n })),\n sort: this.SortState\n };\n }\n\n public ApplyGridState(state: QueryGridState): void {\n this.applyColumnStateFromGridState(state);\n this.buildColumnDefs();\n\n // Apply sort state to grid\n if (this.GridApi && state.sort.length > 0) {\n const columnState = state.sort.map(s => ({\n colId: s.field,\n sort: s.direction,\n sortIndex: s.index\n }));\n this.GridApi.applyColumnState({ state: columnState });\n }\n }\n\n /**\n * Loads persisted grid state from User Settings\n */\n private loadPersistedState(): void {\n if (!this.PersistState || !this._queryInfo) {\n return;\n }\n\n try {\n const settingKey = getQueryGridStateKey(this._queryInfo.ID);\n const savedState = UserInfoEngine.Instance.GetSetting(settingKey);\n\n if (savedState) {\n const state = JSON.parse(savedState) as QueryGridState;\n\n // Apply column state immediately (affects buildColumnDefs)\n this.applyColumnStateFromGridState(state);\n\n // Store for applying via Grid API when ready\n this._pendingState = state;\n\n // If grid is already ready, apply full state now\n if (this.GridApi) {\n this.applyFullGridState(state);\n this._pendingState = null;\n }\n }\n } catch (error) {\n console.error('[query-data-grid] Failed to load persisted state:', error);\n }\n }\n\n /**\n * Applies the full grid state (column widths, order, and sort) via the Grid API.\n * This is called after grid is ready to ensure all state is applied correctly.\n */\n private applyFullGridState(state: QueryGridState): void {\n if (!this.GridApi) {\n return;\n }\n\n // Build column state array that includes widths and sort\n const columnState: Array<{\n colId: string;\n width?: number;\n sort?: 'asc' | 'desc' | null;\n sortIndex?: number | null;\n }> = [];\n\n // First, add column widths from saved state\n if (state.columns) {\n for (const col of state.columns) {\n const stateItem: {\n colId: string;\n width?: number;\n sort?: 'asc' | 'desc' | null;\n sortIndex?: number | null;\n } = { colId: col.field };\n\n if (col.width !== undefined) {\n stateItem.width = col.width;\n }\n\n // Check if this column has sort state\n const sortInfo = state.sort?.find(s => s.field === col.field);\n if (sortInfo) {\n stateItem.sort = sortInfo.direction;\n stateItem.sortIndex = sortInfo.index;\n }\n\n columnState.push(stateItem);\n }\n }\n\n // Apply all column state at once\n if (columnState.length > 0) {\n this.GridApi.applyColumnState({\n state: columnState,\n applyOrder: true // Apply column order as well\n });\n }\n }\n\n /**\n * Persists grid state to User Settings\n */\n private async persistGridState(state: QueryGridState): Promise<void> {\n if (!this.PersistState || !this._queryInfo) {\n return;\n }\n\n try {\n const settingKey = getQueryGridStateKey(this._queryInfo.ID);\n await UserInfoEngine.Instance.SetSetting(settingKey, JSON.stringify(state));\n } catch (error) {\n console.error('[query-data-grid] Failed to persist grid state:', error);\n }\n }\n\n /**\n * Flushes any pending state changes immediately.\n * Call this before destroying the component or switching queries\n * to ensure all state changes are persisted.\n */\n public FlushState(): void {\n if (!this.PersistState || !this._queryInfo) {\n return;\n }\n\n // Get current state and persist immediately\n const state = this.GetGridState();\n this.persistGridState(state);\n }\n\n // ========================================\n // Visual Config\n // ========================================\n\n private applyVisualConfig(): void {\n const el = this.elementRef.nativeElement;\n\n // Apply CSS variables\n if (this._mergedVisualConfig.accentColor) {\n el.style.setProperty('--grid-accent-color', this._mergedVisualConfig.accentColor);\n }\n if (this._mergedVisualConfig.selectionIndicatorColor) {\n el.style.setProperty('--grid-selection-indicator', this._mergedVisualConfig.selectionIndicatorColor);\n }\n if (this._mergedVisualConfig.selectionBackground) {\n el.style.setProperty('--grid-selection-bg', this._mergedVisualConfig.selectionBackground);\n }\n }\n\n /**\n * Returns CSS classes for the container based on visual config\n */\n public GetContainerClasses(): Record<string, boolean> {\n const contrast = this._mergedVisualConfig.alternateRowContrast || 'medium';\n return {\n [`alternate-rows-${contrast}`]: true\n };\n }\n\n // ========================================\n // Export Dialog\n // ========================================\n\n public ShowExportDialog: boolean = false;\n public ExportDialogConfig: ExportDialogConfig | null = null;\n\n // ========================================\n // Row Detail Panel State\n // ========================================\n\n public ShowRowDetailPanel: boolean = false;\n public RowDetailData: Record<string, unknown> | null = null;\n public RowDetailIndex: number = 0;\n\n // ========================================\n // Toolbar Actions\n // ========================================\n\n public Refresh(): void {\n this.RefreshRequest.emit();\n }\n\n /**\n * Opens the export dialog with current grid data\n */\n public async OpenExportDialog(): Promise<void> {\n if (!this._data.length) return;\n\n this.IsPreparingExport = true;\n this.cdr.detectChanges();\n let data: ExportData;\n try {\n data = await this.resolveExportData();\n } finally {\n this.IsPreparingExport = false;\n }\n const columns = this.getExportColumns();\n const fileName = this._queryInfo?.Name || 'query-export';\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._queryInfo?.Name || 'Query Results'}`\n };\n this.ShowExportDialog = true;\n this.cdr.detectChanges();\n }\n\n /**\n * Handle export dialog close\n */\n public 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 */\n public async Export(options?: Partial<ExportOptions>, download: boolean = true): Promise<ExportResult> {\n const data = await this.resolveExportData();\n const columns = this.getExportColumns();\n const fileName = options?.fileName || this._queryInfo?.Name || 'query-export';\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 * Resolves the rows to export. An explicit row selection always wins. Otherwise, if a host\n * supplied an ExportDataProvider, the full result set is fetched (so export isn't silently\n * capped at the current page — bug B3/C1); if it isn't supplied or the fetch yields nothing,\n * export falls back to the loaded page (`_data`).\n */\n private async resolveExportData(): Promise<ExportData> {\n if (this.SelectedRows.length > 0) {\n return this.SelectedRows as ExportData;\n }\n if (this.ExportDataProvider) {\n try {\n const allRows = await this.ExportDataProvider();\n if (allRows && allRows.length > 0) {\n return allRows as ExportData;\n }\n } catch {\n // Fall through to the loaded page on any fetch failure.\n }\n }\n return this._data as ExportData;\n }\n\n /**\n * Get column definitions for export based on current grid columns\n */\n private getExportColumns(): ExportColumn[] {\n return this.Columns\n .filter(c => c.visible)\n .map(c => ({\n name: c.field,\n displayName: c.title,\n dataType: this.mapSqlTypeToExportType(c.sqlBaseType)\n }));\n }\n\n private mapSqlTypeToExportType(sqlType: string): ExportColumn['dataType'] {\n const baseType = sqlType.toLowerCase();\n if (['int', 'bigint', 'smallint', 'tinyint', 'decimal', 'numeric', 'float', 'real', 'money', 'smallmoney'].includes(baseType)) {\n return 'number';\n }\n if (['bit'].includes(baseType)) {\n return 'boolean';\n }\n if (IsDateOnlySQLType(baseType)) {\n return 'dateonly';\n }\n if (['datetime', 'datetime2', 'smalldatetime', 'datetimeoffset'].includes(baseType)) {\n return 'date';\n }\n return 'string';\n }\n\n public ClearSelection(): void {\n if (this.GridApi) {\n this.GridApi.deselectAll();\n }\n }\n\n // ========================================\n // Public API\n // ========================================\n\n public GetSelectedRows(): Record<string, unknown>[] {\n return this.SelectedRows;\n }\n\n public get RowCount(): number {\n return this._data.length;\n }\n\n public get SelectionCount(): number {\n return this.SelectedRows.length;\n }\n\n // ========================================\n // AG Grid Configuration\n // ========================================\n\n public GetRowSelectionConfig(): RowSelectionOptions | undefined {\n if (this.SelectionMode === 'none') {\n return undefined;\n }\n\n if (this.SelectionMode === 'single') {\n return {\n mode: 'singleRow',\n enableClickSelection: true\n };\n }\n\n // Multi-row selection (both 'multiple' and 'checkbox' modes)\n return {\n mode: 'multiRow',\n enableClickSelection: true,\n checkboxes: this.SelectionMode === 'checkbox',\n enableSelectionWithoutKeys: this.SelectionMode === 'multiple'\n };\n }\n\n public GetRowId = (params: GetRowIdParams): string => {\n const data = params.data as Record<string, unknown>;\n if (!data) return `mjrow_${this._syntheticRowIdSeq++}`;\n\n // Prefer a natural unique key when the result exposes one — this keeps row\n // identity (and selection) stable across data refreshes.\n const idFields = ['ID', 'Id', 'id', 'RowNumber', 'RowNum', '__row_index'];\n for (const field of idFields) {\n if (data[field] !== undefined && data[field] !== null) {\n return String(data[field]);\n }\n }\n\n // No natural key — use the per-row synthetic id assigned when Data was set.\n // The previous fallback hashed only the first 3 columns, so any rows that\n // matched on those columns collided to the same id and ag-Grid dropped all\n // but one (silently collapsing aggregate/GROUP BY results, or any query\n // without an ID column). A per-row synthetic id can never collide.\n // Trade-off: the id is per-object (not value-derived), so an id-less row\n // loses its selection across a data refresh — acceptable for query results,\n // where NOT dropping rows matters far more than preserving a selection.\n let synthetic = this._syntheticRowIds.get(data);\n if (!synthetic) {\n synthetic = `mjrow_${this._syntheticRowIdSeq++}`;\n this._syntheticRowIds.set(data, synthetic);\n }\n return synthetic;\n };\n\n // ========================================\n // Row Detail Panel\n // ========================================\n\n /**\n * Opens the row detail panel with the given row data\n */\n public OpenRowDetailPanel(rowData: Record<string, unknown>, rowIndex: number): void {\n this.RowDetailData = rowData;\n this.RowDetailIndex = rowIndex;\n this.ShowRowDetailPanel = true;\n this.cdr.markForCheck();\n }\n\n /**\n * Closes the row detail panel\n */\n public CloseRowDetailPanel(): void {\n this.ShowRowDetailPanel = false;\n this.RowDetailData = null;\n this.cdr.markForCheck();\n }\n\n /**\n * Navigate to the previous row in the detail panel\n */\n public NavigateRowDetail(direction: 'prev' | 'next'): void {\n if (!this._data.length) return;\n\n if (direction === 'prev' && this.RowDetailIndex > 0) {\n this.RowDetailIndex--;\n this.RowDetailData = this._data[this.RowDetailIndex];\n } else if (direction === 'next' && this.RowDetailIndex < this._data.length - 1) {\n this.RowDetailIndex++;\n this.RowDetailData = this._data[this.RowDetailIndex];\n }\n\n // Select the row in the grid\n if (this.GridApi) {\n this.GridApi.deselectAll();\n const node = this.GridApi.getRowNode(String(this.RowDetailIndex));\n if (node) {\n node.setSelected(true);\n this.GridApi.ensureNodeVisible(node);\n }\n }\n\n this.cdr.markForCheck();\n }\n\n /**\n * Handle entity link click from the row detail panel\n */\n public OnRowDetailEntityLinkClick(event: RowDetailEntityLinkEvent): void {\n // Find the column config to include in the entity link event\n const column = this.Columns.find(c => c.field === event.fieldName);\n\n this.EntityLinkClick.emit({\n entityName: event.entityName,\n recordId: event.recordId,\n column: column || null,\n rowData: this.RowDetailData || {}\n });\n }\n}\n","<!-- Query Data Grid Component -->\n<div class=\"query-data-grid-container\" [ngClass]=\"GetContainerClasses()\" [style.height]=\"Height\">\n <!-- Toolbar -->\n @if (ShowToolbar) {\n <div class=\"grid-toolbar\">\n <div class=\"toolbar-left\">\n <!-- Row count -->\n @if (ShowRowCount) {\n <span class=\"row-count\">\n <i class=\"fa-solid fa-table-list\"></i>\n @if (TotalRowCount > RowCount) {\n {{ RowCount | number }} of {{ TotalRowCount | number }} {{ TotalRowCount === 1 ? 'row' : 'rows' }}\n } @else {\n {{ RowCount | number }} {{ RowCount === 1 ? 'row' : 'rows' }}\n }\n </span>\n }\n <!-- Selection count -->\n @if (ShowSelectionCount && SelectionCount > 0) {\n <span class=\"selection-count\">\n <i class=\"fa-solid fa-check-square\"></i>\n {{ SelectionCount }} selected\n <button class=\"clear-selection-btn\" (click)=\"ClearSelection()\" title=\"Clear selection\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </span>\n }\n </div>\n <div class=\"toolbar-right\">\n <!-- Refresh button -->\n @if (ShowRefresh) {\n <button\n (click)=\"Refresh()\"\n [disabled]=\"IsLoading\"\n title=\"Refresh data\"\n class=\"toolbar-btn icon-only\">\n <i class=\"fa-solid fa-sync-alt\" [class.fa-spin]=\"IsLoading\"></i>\n </button>\n }\n <!-- Export button -->\n @if (ShowExport) {\n <button\n [disabled]=\"RowCount === 0 || IsPreparingExport\"\n title=\"Export data\"\n class=\"toolbar-btn\"\n (click)=\"OpenExportDialog()\">\n <i class=\"fa-solid\" [class.fa-file-export]=\"!IsPreparingExport\" [class.fa-spinner]=\"IsPreparingExport\" [class.fa-spin]=\"IsPreparingExport\"></i>\n <span class=\"button-text\">Export</span>\n </button>\n }\n </div>\n </div>\n }\n\n <!-- Loading overlay -->\n @if (IsLoading) {\n <div class=\"loading-overlay\" @fadeIn>\n <mj-loading text=\"Loading query results...\"></mj-loading>\n </div>\n }\n\n <!-- AG Grid -->\n <div class=\"grid-wrapper\" [class.loading]=\"IsLoading\">\n <ag-grid-angular\n class=\"query-grid\"\n [theme]=\"Theme\"\n [rowData]=\"Data\"\n [columnDefs]=\"ColumnDefs\"\n [defaultColDef]=\"DefaultColDef\"\n [gridOptions]=\"GridOptions\"\n [rowSelection]=\"GetRowSelectionConfig()\"\n [getRowId]=\"GetRowId\"\n (gridReady)=\"OnGridReady($event)\"\n (rowClicked)=\"OnRowClicked($event)\"\n (rowDoubleClicked)=\"OnRowDoubleClicked($event)\"\n (selectionChanged)=\"OnSelectionChanged($event)\"\n (sortChanged)=\"OnSortChanged($event)\"\n (columnResized)=\"OnColumnResized($event)\"\n (columnMoved)=\"OnColumnMoved($event)\">\n </ag-grid-angular>\n </div>\n\n <!-- Pagination (only shown when server-side paging is active) -->\n @if (TotalRowCount > 0) {\n <mj-pagination\n [TotalRowCount]=\"TotalRowCount\"\n [PageNumber]=\"PageNumber\"\n [PageSize]=\"PageSize\"\n [IsLoading]=\"IsLoading\"\n (PageChange)=\"PageChange.emit($event)\">\n </mj-pagination>\n }\n\n <!-- Empty state -->\n @if (!IsLoading && RowCount === 0) {\n <mj-empty-state\n class=\"empty-state\"\n @fadeIn\n Icon=\"fa-solid fa-database\"\n Title=\"No results\"\n Message=\"Run the query to see results\" />\n }\n</div>\n\n<!-- Export Dialog -->\n<mj-export-dialog\n [visible]=\"ShowExportDialog\"\n [config]=\"ExportDialogConfig\"\n (closed)=\"OnExportDialogClosed($event)\">\n</mj-export-dialog>\n\n<!-- Row Detail Panel -->\n<mj-query-row-detail\n [RowData]=\"RowDetailData\"\n [Columns]=\"Columns\"\n [QueryInfo]=\"QueryInfo\"\n [Visible]=\"ShowRowDetailPanel\"\n [RowIndex]=\"RowDetailIndex\"\n [TotalRows]=\"RowCount\"\n (Close)=\"CloseRowDetailPanel()\"\n (EntityLinkClick)=\"OnRowDetailEntityLinkClick($event)\"\n (NavigateRow)=\"NavigateRowDetail($event)\">\n</mj-query-row-detail>\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"query-row-detail.component.d.ts","sourceRoot":"","sources":["../../../src/lib/query-row-detail/query-row-detail.component.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"query-row-detail.component.d.ts","sourceRoot":"","sources":["../../../src/lib/query-row-detail/query-row-detail.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAIH,YAAY,EACZ,MAAM,EACN,SAAS,EACT,iBAAiB,EAEjB,UAAU,EAEb,MAAM,eAAe,CAAC;AAIvB,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAGtE,OAAO,EAAE,qBAAqB,EAAE,MAAM,4CAA4C,CAAC;;AAEnF;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,UAAU,WAAW;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,OAAO,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,OAAO,CAAC;IACtB,YAAY,EAAE,OAAO,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,OAAO,CAAC;CACvB;AAYD;;;GAGG;AACH,qBAkBa,uBAAwB,YAAW,MAAM,EAAE,SAAS;IA2DzD,OAAO,CAAC,GAAG;IACX,OAAO,CAAC,UAAU;IAvDtB,OAAO,CAAC,QAAQ,CAAwC;IACxD,IACI,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,EAKhD;IACD,IAAI,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAE5C;IAED,OAAO,CAAC,QAAQ,CAA+B;IAC/C,IACI,OAAO,CAAC,KAAK,EAAE,qBAAqB,EAAE,EAKzC;IACD,IAAI,OAAO,IAAI,qBAAqB,EAAE,CAErC;IAEQ,SAAS,EAAE,qBAAqB,GAAG,IAAI,CAAQ;IAC/C,OAAO,EAAE,OAAO,CAAS;IACzB,QAAQ,EAAE,MAAM,CAAK;IACrB,SAAS,EAAE,MAAM,CAAK;IAMrB,KAAK,qBAA4B;IACjC,eAAe,yCAAgD;IAC/D,WAAW,gCAAuC;IAMrD,gBAAgB,EAAE,WAAW,EAAE,CAAM;IACrC,gBAAgB,EAAE,WAAW,EAAE,CAAM;IACrC,aAAa,EAAE,WAAW,EAAE,CAAM;IAClC,UAAU,EAAE,MAAM,CAAO;IACzB,UAAU,EAAE,OAAO,CAAS;IAC5B,eAAe,EAAE,OAAO,CAAQ;IAEvC,OAAO,CAAC,QAAQ,CAAuB;IACvC,OAAO,CAAC,mBAAmB,CAAyB;IACpD,OAAO,CAAC,QAAQ,CAAO;IACvB,OAAO,CAAC,QAAQ,CAAO;gBAGX,GAAG,EAAE,iBAAiB,EACtB,UAAU,EAAE,UAAU;IAWlC,QAAQ,IAAI,IAAI;IAKhB,WAAW,IAAI,IAAI;IASnB,OAAO,CAAC,iBAAiB;IA+BzB,OAAO,CAAC,gBAAgB;IAoBxB,OAAO,CAAC,WAAW;IAkFZ,OAAO,IAAI,IAAI;IAIf,iBAAiB,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI;IAU3C,cAAc,IAAI,IAAI;IAItB,cAAc,IAAI,IAAI;IAItB,iBAAiB,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI;IAK3C,SAAS,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI;IAKnC,aAAa,IAAI,IAAI;IAOrB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAO9B,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAYjC,aAAa,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAQ7C,WAAW,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAYpC,SAAS,IAAI,IAAI;IAajB,OAAO,CAAC,kBAAkB;YAcZ,iBAAiB;IAQ/B,OAAO,CAAC,6BAA6B;YAWvB,gCAAgC;IAQvC,qBAAqB,IAAI,IAAI;IAMpC;;OAEG;IACI,gBAAgB,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,WAAW,EAAE;IAO7D;;OAEG;IACI,kBAAkB,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM;IASxD,SAAS,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI;yCA1X5B,uBAAuB;2CAAvB,uBAAuB;CAyYnC"}
@@ -2,6 +2,7 @@ import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, HostLi
2
2
  import { trigger, transition, style, animate } from '@angular/animations';
3
3
  import { Subject } from 'rxjs';
4
4
  import { takeUntil, debounceTime } from 'rxjs/operators';
5
+ import { FormatDateOnly, IsDateOnlySQLType } from '@memberjunction/core';
5
6
  import { UserInfoEngine } from '@memberjunction/core-entities';
6
7
  import * as i0 from "@angular/core";
7
8
  function QueryRowDetailComponent_Conditional_0_Conditional_8_Template(rf, ctx) { if (rf & 1) {
@@ -473,6 +474,11 @@ export class QueryRowDetailComponent {
473
474
  const date = new Date(value);
474
475
  if (isNaN(date.getTime()))
475
476
  return String(value);
477
+ // A SQL `date` is a calendar day delivered as UTC midnight. Format it in UTC, and give it
478
+ // no "hours ago": measured from UTC midnight, a day has no time of its own to be ago from.
479
+ if (IsDateOnlySQLType(baseType)) {
480
+ return FormatDateOnly(date, { year: 'numeric', month: 'short', day: 'numeric' }, 'en-US');
481
+ }
476
482
  const now = new Date();
477
483
  const diffMs = now.getTime() - date.getTime();
478
484
  const diffHours = Math.floor(diffMs / (1000 * 60 * 60));
@@ -487,12 +493,10 @@ export class QueryRowDetailComponent {
487
493
  else if (diffDays < 7) {
488
494
  relativeTime = `${diffDays} day${diffDays === 1 ? '' : 's'} ago`;
489
495
  }
490
- const formatted = baseType === 'date'
491
- ? date.toLocaleDateString('en-US', { year: 'numeric', month: 'short', day: 'numeric' })
492
- : date.toLocaleString('en-US', {
493
- year: 'numeric', month: 'short', day: 'numeric',
494
- hour: 'numeric', minute: '2-digit'
495
- });
496
+ const formatted = date.toLocaleString('en-US', {
497
+ year: 'numeric', month: 'short', day: 'numeric',
498
+ hour: 'numeric', minute: '2-digit'
499
+ });
496
500
  return relativeTime ? `${formatted} • ${relativeTime}` : formatted;
497
501
  }
498
502
  // Numbers
@@ -751,5 +755,5 @@ export class QueryRowDetailComponent {
751
755
  type: HostListener,
752
756
  args: ['document:keydown', ['$event']]
753
757
  }] }); })();
754
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(QueryRowDetailComponent, { className: "QueryRowDetailComponent", filePath: "src/lib/query-row-detail/query-row-detail.component.ts", lineNumber: 79 }); })();
758
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(QueryRowDetailComponent, { className: "QueryRowDetailComponent", filePath: "src/lib/query-row-detail/query-row-detail.component.ts", lineNumber: 80 }); })();
755
759
  //# sourceMappingURL=query-row-detail.component.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"query-row-detail.component.js","sourceRoot":"","sources":["../../../src/lib/query-row-detail/query-row-detail.component.ts","../../../src/lib/query-row-detail/query-row-detail.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 ChangeDetectionStrategy,\n ElementRef,\n HostListener\n} from '@angular/core';\nimport { trigger, transition, style, animate } from '@angular/animations';\nimport { Subject } from 'rxjs';\nimport { takeUntil, debounceTime } from 'rxjs/operators';\nimport { MJQueryEntityExtended } from '@memberjunction/core-entities';\nimport { UserInfoEngine } from '@memberjunction/core-entities';\nimport { QueryGridColumnConfig } from '../query-data-grid/models/query-grid-types';\n\n/**\n * Event emitted when navigating to a linked entity record\n */\nexport interface RowDetailEntityLinkEvent {\n entityName: string;\n recordId: string;\n fieldName: string;\n}\n\n/**\n * Field display configuration for the detail panel\n */\ninterface DetailField {\n name: string;\n displayName: string;\n value: unknown;\n formattedValue: string;\n sqlType: string;\n isPrimaryKey: boolean;\n isForeignKey: boolean;\n targetEntityName?: string;\n targetEntityIcon?: string;\n sourceEntityName?: string;\n isLongText: boolean;\n isExpanded: boolean;\n}\n\n/**\n * Settings key for panel width persistence\n */\nconst PANEL_WIDTH_SETTING_KEY = 'QueryViewer_RowDetailPanel_Width';\n\n/**\n * Settings key for hide empty fields preference\n */\nconst HIDE_EMPTY_FIELDS_KEY = 'QueryViewer_RowDetailPanel_HideEmptyFields';\n\n/**\n * Row detail slide-in panel component.\n * Displays a single row's data in a formatted, grouped view with entity links.\n */\n@Component({\n standalone: false,\n selector: 'mj-query-row-detail',\n templateUrl: './query-row-detail.component.html',\n styleUrls: ['./query-row-detail.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n animations: [\n trigger('slideIn', [\n transition(':enter', [\n style({ transform: 'translateX(100%)', opacity: 0 }),\n animate('200ms ease-out', style({ transform: 'translateX(0)', opacity: 1 }))\n ]),\n transition(':leave', [\n animate('150ms ease-in', style({ transform: 'translateX(100%)', opacity: 0 }))\n ])\n ])\n ]\n})\nexport class QueryRowDetailComponent implements OnInit, OnDestroy {\n // ========================================\n // Inputs\n // ========================================\n\n private _rowData: Record<string, unknown> | null = null;\n @Input()\n set RowData(value: Record<string, unknown> | null) {\n this._rowData = value;\n if (value) {\n this.buildDetailFields();\n }\n }\n get RowData(): Record<string, unknown> | null {\n return this._rowData;\n }\n\n private _columns: QueryGridColumnConfig[] = [];\n @Input()\n set Columns(value: QueryGridColumnConfig[]) {\n this._columns = value || [];\n if (this._rowData) {\n this.buildDetailFields();\n }\n }\n get Columns(): QueryGridColumnConfig[] {\n return this._columns;\n }\n\n @Input() QueryInfo: MJQueryEntityExtended | null = null;\n @Input() Visible: boolean = false;\n @Input() RowIndex: number = 0;\n @Input() TotalRows: number = 0;\n\n // ========================================\n // Outputs\n // ========================================\n\n @Output() Close = new EventEmitter<void>();\n @Output() EntityLinkClick = new EventEmitter<RowDetailEntityLinkEvent>();\n @Output() NavigateRow = new EventEmitter<'prev' | 'next'>();\n\n // ========================================\n // Internal State\n // ========================================\n\n public PrimaryKeyFields: DetailField[] = [];\n public ForeignKeyFields: DetailField[] = [];\n public RegularFields: DetailField[] = [];\n public PanelWidth: number = 400;\n public IsResizing: boolean = false;\n public HideEmptyFields: boolean = true;\n\n private destroy$ = new Subject<void>();\n private widthPersistSubject = new Subject<number>();\n private minWidth = 300;\n private maxWidth = 800;\n\n constructor(\n private cdr: ChangeDetectorRef,\n private elementRef: ElementRef\n ) {\n // Debounce width persistence\n this.widthPersistSubject.pipe(\n debounceTime(500),\n takeUntil(this.destroy$)\n ).subscribe(width => {\n this.persistPanelWidth(width);\n });\n }\n\n ngOnInit(): void {\n this.loadPersistedWidth();\n this.loadHideEmptyFieldsPreference();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n // ========================================\n // Field Building\n // ========================================\n\n private buildDetailFields(): void {\n if (!this._rowData || !this._columns.length) {\n this.PrimaryKeyFields = [];\n this.ForeignKeyFields = [];\n this.RegularFields = [];\n return;\n }\n\n const primaryKeys: DetailField[] = [];\n const foreignKeys: DetailField[] = [];\n const regular: DetailField[] = [];\n\n for (const col of this._columns) {\n const value = this._rowData[col.field];\n const field = this.buildDetailField(col, value);\n\n if (field.isPrimaryKey) {\n primaryKeys.push(field);\n } else if (field.isForeignKey) {\n foreignKeys.push(field);\n } else {\n regular.push(field);\n }\n }\n\n this.PrimaryKeyFields = primaryKeys;\n this.ForeignKeyFields = foreignKeys;\n this.RegularFields = regular;\n this.cdr.markForCheck();\n }\n\n private buildDetailField(col: QueryGridColumnConfig, value: unknown): DetailField {\n const formattedValue = this.formatValue(value, col);\n const isLongText = typeof value === 'string' && value.length > 200;\n\n return {\n name: col.field,\n displayName: col.title,\n value,\n formattedValue,\n sqlType: col.sqlBaseType,\n isPrimaryKey: col.isPrimaryKey || false,\n isForeignKey: col.isForeignKey || false,\n targetEntityName: col.targetEntityName,\n targetEntityIcon: col.targetEntityIcon,\n sourceEntityName: col.sourceEntityName,\n isLongText,\n isExpanded: false\n };\n }\n\n private formatValue(value: unknown, col: QueryGridColumnConfig): string {\n if (value === null || value === undefined) {\n return '(empty)';\n }\n\n const baseType = col.sqlBaseType.toLowerCase();\n\n // Boolean\n if (baseType === 'bit') {\n return value ? 'Yes' : 'No';\n }\n\n // Date/Time\n if (['date', 'datetime', 'datetime2', 'smalldatetime', 'datetimeoffset'].includes(baseType)) {\n const date = new Date(value as string);\n if (isNaN(date.getTime())) return String(value);\n\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n const diffHours = Math.floor(diffMs / (1000 * 60 * 60));\n const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24));\n\n let relativeTime = '';\n if (diffHours < 1) {\n relativeTime = 'just now';\n } else if (diffHours < 24) {\n relativeTime = `${diffHours} hour${diffHours === 1 ? '' : 's'} ago`;\n } else if (diffDays < 7) {\n relativeTime = `${diffDays} day${diffDays === 1 ? '' : 's'} ago`;\n }\n\n const formatted = baseType === 'date'\n ? date.toLocaleDateString('en-US', { year: 'numeric', month: 'short', day: 'numeric' })\n : date.toLocaleString('en-US', {\n year: 'numeric', month: 'short', day: 'numeric',\n hour: 'numeric', minute: '2-digit'\n });\n\n return relativeTime ? `${formatted} • ${relativeTime}` : formatted;\n }\n\n // Numbers\n if (['int', 'bigint', 'smallint', 'tinyint'].includes(baseType)) {\n const num = Number(value);\n if (isNaN(num)) return String(value);\n return num.toLocaleString();\n }\n\n if (['decimal', 'numeric', 'float', 'real'].includes(baseType)) {\n const num = Number(value);\n if (isNaN(num)) return String(value);\n return num.toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 4 });\n }\n\n if (['money', 'smallmoney'].includes(baseType)) {\n const num = Number(value);\n if (isNaN(num)) return String(value);\n return new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD' }).format(num);\n }\n\n // JSON detection\n const strValue = String(value);\n if (strValue.startsWith('{') || strValue.startsWith('[')) {\n try {\n JSON.parse(strValue);\n return strValue; // Will be formatted as JSON in template\n } catch {\n // Not valid JSON, continue\n }\n }\n\n return strValue;\n }\n\n // ========================================\n // User Actions\n // ========================================\n\n public onClose(): void {\n this.Close.emit();\n }\n\n public onEntityLinkClick(field: DetailField): void {\n if (field.targetEntityName && field.value != null) {\n this.EntityLinkClick.emit({\n entityName: field.targetEntityName,\n recordId: String(field.value),\n fieldName: field.name\n });\n }\n }\n\n public onNavigatePrev(): void {\n this.NavigateRow.emit('prev');\n }\n\n public onNavigateNext(): void {\n this.NavigateRow.emit('next');\n }\n\n public toggleFieldExpand(field: DetailField): void {\n field.isExpanded = !field.isExpanded;\n this.cdr.markForCheck();\n }\n\n public copyValue(field: DetailField): void {\n const textToCopy = field.value != null ? String(field.value) : '';\n navigator.clipboard.writeText(textToCopy);\n }\n\n public copyRowAsJson(): void {\n if (this._rowData) {\n const json = JSON.stringify(this._rowData, null, 2);\n navigator.clipboard.writeText(json);\n }\n }\n\n public isJson(value: string): boolean {\n if (!value || typeof value !== 'string') return false;\n const trimmed = value.trim();\n return (trimmed.startsWith('{') && trimmed.endsWith('}')) ||\n (trimmed.startsWith('[') && trimmed.endsWith(']'));\n }\n\n public formatJson(value: string): string {\n try {\n return JSON.stringify(JSON.parse(value), null, 2);\n } catch {\n return value;\n }\n }\n\n // ========================================\n // Resize Handling\n // ========================================\n\n public onResizeStart(event: MouseEvent): void {\n event.preventDefault();\n this.IsResizing = true;\n document.body.style.cursor = 'ew-resize';\n document.body.style.userSelect = 'none';\n }\n\n @HostListener('document:mousemove', ['$event'])\n onMouseMove(event: MouseEvent): void {\n if (!this.IsResizing) return;\n\n const containerRect = this.elementRef.nativeElement.parentElement?.getBoundingClientRect();\n if (!containerRect) return;\n\n const newWidth = containerRect.right - event.clientX;\n this.PanelWidth = Math.min(Math.max(newWidth, this.minWidth), this.maxWidth);\n this.cdr.markForCheck();\n }\n\n @HostListener('document:mouseup')\n onMouseUp(): void {\n if (this.IsResizing) {\n this.IsResizing = false;\n document.body.style.cursor = '';\n document.body.style.userSelect = '';\n this.widthPersistSubject.next(this.PanelWidth);\n }\n }\n\n // ========================================\n // Persistence\n // ========================================\n\n private loadPersistedWidth(): void {\n try {\n const savedWidth = UserInfoEngine.Instance.GetSetting(PANEL_WIDTH_SETTING_KEY);\n if (savedWidth) {\n const width = parseInt(savedWidth, 10);\n if (!isNaN(width) && width >= this.minWidth && width <= this.maxWidth) {\n this.PanelWidth = width;\n }\n }\n } catch (error) {\n console.error('[query-row-detail] Failed to load persisted width:', error);\n }\n }\n\n private async persistPanelWidth(width: number): Promise<void> {\n try {\n await UserInfoEngine.Instance.SetSetting(PANEL_WIDTH_SETTING_KEY, String(width));\n } catch (error) {\n console.error('[query-row-detail] Failed to persist panel width:', error);\n }\n }\n\n private loadHideEmptyFieldsPreference(): void {\n try {\n const saved = UserInfoEngine.Instance.GetSetting(HIDE_EMPTY_FIELDS_KEY);\n if (saved !== undefined) {\n this.HideEmptyFields = saved === 'true';\n }\n } catch (error) {\n console.error('[query-row-detail] Failed to load hide empty fields preference:', error);\n }\n }\n\n private async persistHideEmptyFieldsPreference(): Promise<void> {\n try {\n await UserInfoEngine.Instance.SetSetting(HIDE_EMPTY_FIELDS_KEY, String(this.HideEmptyFields));\n } catch (error) {\n console.error('[query-row-detail] Failed to persist hide empty fields preference:', error);\n }\n }\n\n public toggleHideEmptyFields(): void {\n this.HideEmptyFields = !this.HideEmptyFields;\n this.persistHideEmptyFieldsPreference();\n this.cdr.markForCheck();\n }\n\n /**\n * Returns visible fields based on HideEmptyFields setting\n */\n public getVisibleFields(fields: DetailField[]): DetailField[] {\n if (!this.HideEmptyFields) {\n return fields;\n }\n return fields.filter(f => f.value !== null && f.value !== undefined && f.value !== '');\n }\n\n /**\n * Returns count of empty fields for display\n */\n public getEmptyFieldCount(fields: DetailField[]): number {\n return fields.filter(f => f.value === null || f.value === undefined || f.value === '').length;\n }\n\n // ========================================\n // Keyboard Navigation\n // ========================================\n\n @HostListener('document:keydown', ['$event'])\n onKeyDown(event: KeyboardEvent): void {\n if (!this.Visible) return;\n\n if (event.key === 'Escape') {\n this.onClose();\n } else if (event.key === 'ArrowUp' || event.key === 'k') {\n if (this.RowIndex > 0) {\n this.onNavigatePrev();\n }\n } else if (event.key === 'ArrowDown' || event.key === 'j') {\n if (this.RowIndex < this.TotalRows - 1) {\n this.onNavigateNext();\n }\n }\n }\n}\n","<!-- Row Detail Slide-in Panel -->\n@if (Visible) {\n <div class=\"row-detail-panel\"\n @slideIn\n [style.width.px]=\"PanelWidth\">\n <!-- Resize handle -->\n <div class=\"resize-handle\"\n (mousedown)=\"onResizeStart($event)\"\n [class.resizing]=\"IsResizing\">\n </div>\n <!-- Header -->\n <div class=\"panel-header\">\n <div class=\"header-left\">\n <i class=\"fa-solid fa-table-cells-large header-icon\"></i>\n <h3 class=\"panel-title\">Row Details</h3>\n </div>\n <div class=\"header-right\">\n <!-- Row navigation -->\n @if (TotalRows > 1) {\n <div class=\"row-nav\">\n <button class=\"nav-btn\"\n [disabled]=\"RowIndex === 0\"\n (click)=\"onNavigatePrev()\"\n title=\"Previous row (↑ or K)\">\n <i class=\"fa-solid fa-chevron-up\"></i>\n </button>\n <span class=\"row-indicator\">{{ RowIndex + 1 }} / {{ TotalRows }}</span>\n <button class=\"nav-btn\"\n [disabled]=\"RowIndex >= TotalRows - 1\"\n (click)=\"onNavigateNext()\"\n title=\"Next row (↓ or J)\">\n <i class=\"fa-solid fa-chevron-down\"></i>\n </button>\n </div>\n }\n <!-- Toggle empty fields -->\n <button class=\"action-btn\"\n (click)=\"toggleHideEmptyFields()\"\n [class.active]=\"HideEmptyFields\"\n [title]=\"HideEmptyFields ? 'Show empty fields' : 'Hide empty fields'\">\n <i class=\"fa-solid\" [class.fa-eye]=\"!HideEmptyFields\" [class.fa-eye-slash]=\"HideEmptyFields\"></i>\n </button>\n <!-- Copy JSON button -->\n <button class=\"action-btn\" (click)=\"copyRowAsJson()\" title=\"Copy row as JSON\">\n <i class=\"fa-solid fa-copy\"></i>\n </button>\n <!-- Close button -->\n <button class=\"close-btn\" (click)=\"onClose()\" title=\"Close (Esc)\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n </div>\n <!-- Content -->\n <div class=\"panel-content\">\n <!-- Primary Keys Section -->\n @if (getVisibleFields(PrimaryKeyFields).length > 0) {\n <div class=\"field-section\">\n <h4 class=\"section-title\">\n <i class=\"fa-solid fa-key section-icon pk-icon\"></i>\n Primary Key\n </h4>\n <div class=\"field-list\">\n @for (field of getVisibleFields(PrimaryKeyFields); track field) {\n <div class=\"field-item\">\n <div class=\"field-header\">\n <span class=\"field-name\">{{ field.displayName }}</span>\n <button class=\"copy-btn\" (click)=\"copyValue(field)\" title=\"Copy value\">\n <i class=\"fa-solid fa-copy\"></i>\n </button>\n </div>\n <div class=\"field-value\"\n [class.clickable]=\"field.targetEntityName\"\n (click)=\"field.targetEntityName && onEntityLinkClick(field)\">\n @if (field.targetEntityIcon) {\n <i\n [class]=\"field.targetEntityIcon\"\n class=\"entity-icon\"></i>\n }\n <span class=\"value-text monospace\">{{ field.formattedValue }}</span>\n @if (field.targetEntityName) {\n <i\n class=\"fa-solid fa-arrow-up-right-from-square link-icon\"></i>\n }\n </div>\n </div>\n }\n </div>\n </div>\n }\n <!-- Foreign Keys Section -->\n @if (getVisibleFields(ForeignKeyFields).length > 0) {\n <div class=\"field-section\">\n <h4 class=\"section-title\">\n <i class=\"fa-solid fa-link section-icon fk-icon\"></i>\n Related Records\n </h4>\n <div class=\"field-list\">\n @for (field of getVisibleFields(ForeignKeyFields); track field) {\n <div class=\"field-item\">\n <div class=\"field-header\">\n <span class=\"field-name\">{{ field.displayName }}</span>\n @if (field.targetEntityName) {\n <span class=\"target-entity\">\n <i class=\"fa-solid fa-arrow-right\"></i>\n {{ field.targetEntityName }}\n </span>\n }\n <button class=\"copy-btn\" (click)=\"copyValue(field)\" title=\"Copy value\">\n <i class=\"fa-solid fa-copy\"></i>\n </button>\n </div>\n @if (field.value != null) {\n <div class=\"field-value clickable\"\n (click)=\"onEntityLinkClick(field)\">\n @if (field.targetEntityIcon) {\n <i\n [class]=\"field.targetEntityIcon\"\n class=\"entity-icon\"></i>\n }\n <span class=\"value-text monospace\">{{ field.formattedValue }}</span>\n <i class=\"fa-solid fa-arrow-up-right-from-square link-icon\"></i>\n </div>\n }\n @if (field.value == null) {\n <div class=\"field-value empty\">\n <span class=\"value-text\">(empty)</span>\n </div>\n }\n </div>\n }\n </div>\n </div>\n }\n <!-- Regular Fields Section -->\n @if (getVisibleFields(RegularFields).length > 0) {\n <div class=\"field-section\">\n <h4 class=\"section-title\">\n <i class=\"fa-solid fa-list section-icon\"></i>\n Fields\n @if (HideEmptyFields && getEmptyFieldCount(RegularFields) > 0) {\n <span class=\"hidden-count\">\n ({{ getEmptyFieldCount(RegularFields) }} empty hidden)\n </span>\n }\n </h4>\n <div class=\"field-list\">\n @for (field of getVisibleFields(RegularFields); track field) {\n <div class=\"field-item\">\n <div class=\"field-header\">\n <span class=\"field-name\">{{ field.displayName }}</span>\n <span class=\"field-type\">{{ field.sqlType }}</span>\n <button class=\"copy-btn\" (click)=\"copyValue(field)\" title=\"Copy value\">\n <i class=\"fa-solid fa-copy\"></i>\n </button>\n </div>\n <!-- JSON value -->\n @if (isJson(field.formattedValue)) {\n <div class=\"field-value json-value\"\n [class.expanded]=\"field.isExpanded\">\n <pre class=\"json-content\">{{ formatJson(field.formattedValue) }}</pre>\n <button class=\"expand-btn\" (click)=\"toggleFieldExpand(field)\">\n {{ field.isExpanded ? 'Collapse' : 'Expand' }}\n </button>\n </div>\n }\n <!-- Long text value -->\n @if (!isJson(field.formattedValue) && field.isLongText) {\n <div class=\"field-value long-text\"\n [class.expanded]=\"field.isExpanded\">\n <span class=\"value-text\">{{ field.formattedValue }}</span>\n <button class=\"expand-btn\" (click)=\"toggleFieldExpand(field)\">\n {{ field.isExpanded ? 'Show less' : 'Show more' }}\n </button>\n </div>\n }\n <!-- Boolean value -->\n @if (field.sqlType.toLowerCase() === 'bit' && !isJson(field.formattedValue)) {\n <div class=\"field-value boolean-value\"\n >\n <i [class]=\"field.value ? 'fa-solid fa-check-circle bool-true' : 'fa-solid fa-times-circle bool-false'\"></i>\n <span class=\"value-text\">{{ field.formattedValue }}</span>\n </div>\n }\n <!-- Empty value -->\n @if (field.value == null && !isJson(field.formattedValue)) {\n <div class=\"field-value empty\"\n >\n <span class=\"value-text\">(empty)</span>\n </div>\n }\n <!-- Regular value -->\n @if (field.value != null && !isJson(field.formattedValue) && !field.isLongText && field.sqlType.toLowerCase() !== 'bit') {\n <div class=\"field-value\"\n >\n <span class=\"value-text\"\n [class.monospace]=\"field.sqlType.toLowerCase().includes('uniqueidentifier') || field.name.toLowerCase().includes('id')\">\n {{ field.formattedValue }}\n </span>\n </div>\n }\n </div>\n }\n </div>\n </div>\n }\n </div>\n </div>\n}\n\n<!-- Backdrop -->\n@if (Visible) {\n <div class=\"panel-backdrop\"\n (click)=\"onClose()\">\n </div>\n}\n"]}
1
+ {"version":3,"file":"query-row-detail.component.js","sourceRoot":"","sources":["../../../src/lib/query-row-detail/query-row-detail.component.ts","../../../src/lib/query-row-detail/query-row-detail.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 ChangeDetectionStrategy,\n ElementRef,\n HostListener\n} from '@angular/core';\nimport { trigger, transition, style, animate } from '@angular/animations';\nimport { Subject } from 'rxjs';\nimport { takeUntil, debounceTime } from 'rxjs/operators';\nimport { MJQueryEntityExtended } from '@memberjunction/core-entities';\nimport { FormatDateOnly, IsDateOnlySQLType } from '@memberjunction/core';\nimport { UserInfoEngine } from '@memberjunction/core-entities';\nimport { QueryGridColumnConfig } from '../query-data-grid/models/query-grid-types';\n\n/**\n * Event emitted when navigating to a linked entity record\n */\nexport interface RowDetailEntityLinkEvent {\n entityName: string;\n recordId: string;\n fieldName: string;\n}\n\n/**\n * Field display configuration for the detail panel\n */\ninterface DetailField {\n name: string;\n displayName: string;\n value: unknown;\n formattedValue: string;\n sqlType: string;\n isPrimaryKey: boolean;\n isForeignKey: boolean;\n targetEntityName?: string;\n targetEntityIcon?: string;\n sourceEntityName?: string;\n isLongText: boolean;\n isExpanded: boolean;\n}\n\n/**\n * Settings key for panel width persistence\n */\nconst PANEL_WIDTH_SETTING_KEY = 'QueryViewer_RowDetailPanel_Width';\n\n/**\n * Settings key for hide empty fields preference\n */\nconst HIDE_EMPTY_FIELDS_KEY = 'QueryViewer_RowDetailPanel_HideEmptyFields';\n\n/**\n * Row detail slide-in panel component.\n * Displays a single row's data in a formatted, grouped view with entity links.\n */\n@Component({\n standalone: false,\n selector: 'mj-query-row-detail',\n templateUrl: './query-row-detail.component.html',\n styleUrls: ['./query-row-detail.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n animations: [\n trigger('slideIn', [\n transition(':enter', [\n style({ transform: 'translateX(100%)', opacity: 0 }),\n animate('200ms ease-out', style({ transform: 'translateX(0)', opacity: 1 }))\n ]),\n transition(':leave', [\n animate('150ms ease-in', style({ transform: 'translateX(100%)', opacity: 0 }))\n ])\n ])\n ]\n})\nexport class QueryRowDetailComponent implements OnInit, OnDestroy {\n // ========================================\n // Inputs\n // ========================================\n\n private _rowData: Record<string, unknown> | null = null;\n @Input()\n set RowData(value: Record<string, unknown> | null) {\n this._rowData = value;\n if (value) {\n this.buildDetailFields();\n }\n }\n get RowData(): Record<string, unknown> | null {\n return this._rowData;\n }\n\n private _columns: QueryGridColumnConfig[] = [];\n @Input()\n set Columns(value: QueryGridColumnConfig[]) {\n this._columns = value || [];\n if (this._rowData) {\n this.buildDetailFields();\n }\n }\n get Columns(): QueryGridColumnConfig[] {\n return this._columns;\n }\n\n @Input() QueryInfo: MJQueryEntityExtended | null = null;\n @Input() Visible: boolean = false;\n @Input() RowIndex: number = 0;\n @Input() TotalRows: number = 0;\n\n // ========================================\n // Outputs\n // ========================================\n\n @Output() Close = new EventEmitter<void>();\n @Output() EntityLinkClick = new EventEmitter<RowDetailEntityLinkEvent>();\n @Output() NavigateRow = new EventEmitter<'prev' | 'next'>();\n\n // ========================================\n // Internal State\n // ========================================\n\n public PrimaryKeyFields: DetailField[] = [];\n public ForeignKeyFields: DetailField[] = [];\n public RegularFields: DetailField[] = [];\n public PanelWidth: number = 400;\n public IsResizing: boolean = false;\n public HideEmptyFields: boolean = true;\n\n private destroy$ = new Subject<void>();\n private widthPersistSubject = new Subject<number>();\n private minWidth = 300;\n private maxWidth = 800;\n\n constructor(\n private cdr: ChangeDetectorRef,\n private elementRef: ElementRef\n ) {\n // Debounce width persistence\n this.widthPersistSubject.pipe(\n debounceTime(500),\n takeUntil(this.destroy$)\n ).subscribe(width => {\n this.persistPanelWidth(width);\n });\n }\n\n ngOnInit(): void {\n this.loadPersistedWidth();\n this.loadHideEmptyFieldsPreference();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n // ========================================\n // Field Building\n // ========================================\n\n private buildDetailFields(): void {\n if (!this._rowData || !this._columns.length) {\n this.PrimaryKeyFields = [];\n this.ForeignKeyFields = [];\n this.RegularFields = [];\n return;\n }\n\n const primaryKeys: DetailField[] = [];\n const foreignKeys: DetailField[] = [];\n const regular: DetailField[] = [];\n\n for (const col of this._columns) {\n const value = this._rowData[col.field];\n const field = this.buildDetailField(col, value);\n\n if (field.isPrimaryKey) {\n primaryKeys.push(field);\n } else if (field.isForeignKey) {\n foreignKeys.push(field);\n } else {\n regular.push(field);\n }\n }\n\n this.PrimaryKeyFields = primaryKeys;\n this.ForeignKeyFields = foreignKeys;\n this.RegularFields = regular;\n this.cdr.markForCheck();\n }\n\n private buildDetailField(col: QueryGridColumnConfig, value: unknown): DetailField {\n const formattedValue = this.formatValue(value, col);\n const isLongText = typeof value === 'string' && value.length > 200;\n\n return {\n name: col.field,\n displayName: col.title,\n value,\n formattedValue,\n sqlType: col.sqlBaseType,\n isPrimaryKey: col.isPrimaryKey || false,\n isForeignKey: col.isForeignKey || false,\n targetEntityName: col.targetEntityName,\n targetEntityIcon: col.targetEntityIcon,\n sourceEntityName: col.sourceEntityName,\n isLongText,\n isExpanded: false\n };\n }\n\n private formatValue(value: unknown, col: QueryGridColumnConfig): string {\n if (value === null || value === undefined) {\n return '(empty)';\n }\n\n const baseType = col.sqlBaseType.toLowerCase();\n\n // Boolean\n if (baseType === 'bit') {\n return value ? 'Yes' : 'No';\n }\n\n // Date/Time\n if (['date', 'datetime', 'datetime2', 'smalldatetime', 'datetimeoffset'].includes(baseType)) {\n const date = new Date(value as string);\n if (isNaN(date.getTime())) return String(value);\n\n // A SQL `date` is a calendar day delivered as UTC midnight. Format it in UTC, and give it\n // no \"hours ago\": measured from UTC midnight, a day has no time of its own to be ago from.\n if (IsDateOnlySQLType(baseType)) {\n return FormatDateOnly(date, { year: 'numeric', month: 'short', day: 'numeric' }, 'en-US');\n }\n\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n const diffHours = Math.floor(diffMs / (1000 * 60 * 60));\n const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24));\n\n let relativeTime = '';\n if (diffHours < 1) {\n relativeTime = 'just now';\n } else if (diffHours < 24) {\n relativeTime = `${diffHours} hour${diffHours === 1 ? '' : 's'} ago`;\n } else if (diffDays < 7) {\n relativeTime = `${diffDays} day${diffDays === 1 ? '' : 's'} ago`;\n }\n\n const formatted = date.toLocaleString('en-US', {\n year: 'numeric', month: 'short', day: 'numeric',\n hour: 'numeric', minute: '2-digit'\n });\n\n return relativeTime ? `${formatted} • ${relativeTime}` : formatted;\n }\n\n // Numbers\n if (['int', 'bigint', 'smallint', 'tinyint'].includes(baseType)) {\n const num = Number(value);\n if (isNaN(num)) return String(value);\n return num.toLocaleString();\n }\n\n if (['decimal', 'numeric', 'float', 'real'].includes(baseType)) {\n const num = Number(value);\n if (isNaN(num)) return String(value);\n return num.toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 4 });\n }\n\n if (['money', 'smallmoney'].includes(baseType)) {\n const num = Number(value);\n if (isNaN(num)) return String(value);\n return new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD' }).format(num);\n }\n\n // JSON detection\n const strValue = String(value);\n if (strValue.startsWith('{') || strValue.startsWith('[')) {\n try {\n JSON.parse(strValue);\n return strValue; // Will be formatted as JSON in template\n } catch {\n // Not valid JSON, continue\n }\n }\n\n return strValue;\n }\n\n // ========================================\n // User Actions\n // ========================================\n\n public onClose(): void {\n this.Close.emit();\n }\n\n public onEntityLinkClick(field: DetailField): void {\n if (field.targetEntityName && field.value != null) {\n this.EntityLinkClick.emit({\n entityName: field.targetEntityName,\n recordId: String(field.value),\n fieldName: field.name\n });\n }\n }\n\n public onNavigatePrev(): void {\n this.NavigateRow.emit('prev');\n }\n\n public onNavigateNext(): void {\n this.NavigateRow.emit('next');\n }\n\n public toggleFieldExpand(field: DetailField): void {\n field.isExpanded = !field.isExpanded;\n this.cdr.markForCheck();\n }\n\n public copyValue(field: DetailField): void {\n const textToCopy = field.value != null ? String(field.value) : '';\n navigator.clipboard.writeText(textToCopy);\n }\n\n public copyRowAsJson(): void {\n if (this._rowData) {\n const json = JSON.stringify(this._rowData, null, 2);\n navigator.clipboard.writeText(json);\n }\n }\n\n public isJson(value: string): boolean {\n if (!value || typeof value !== 'string') return false;\n const trimmed = value.trim();\n return (trimmed.startsWith('{') && trimmed.endsWith('}')) ||\n (trimmed.startsWith('[') && trimmed.endsWith(']'));\n }\n\n public formatJson(value: string): string {\n try {\n return JSON.stringify(JSON.parse(value), null, 2);\n } catch {\n return value;\n }\n }\n\n // ========================================\n // Resize Handling\n // ========================================\n\n public onResizeStart(event: MouseEvent): void {\n event.preventDefault();\n this.IsResizing = true;\n document.body.style.cursor = 'ew-resize';\n document.body.style.userSelect = 'none';\n }\n\n @HostListener('document:mousemove', ['$event'])\n onMouseMove(event: MouseEvent): void {\n if (!this.IsResizing) return;\n\n const containerRect = this.elementRef.nativeElement.parentElement?.getBoundingClientRect();\n if (!containerRect) return;\n\n const newWidth = containerRect.right - event.clientX;\n this.PanelWidth = Math.min(Math.max(newWidth, this.minWidth), this.maxWidth);\n this.cdr.markForCheck();\n }\n\n @HostListener('document:mouseup')\n onMouseUp(): void {\n if (this.IsResizing) {\n this.IsResizing = false;\n document.body.style.cursor = '';\n document.body.style.userSelect = '';\n this.widthPersistSubject.next(this.PanelWidth);\n }\n }\n\n // ========================================\n // Persistence\n // ========================================\n\n private loadPersistedWidth(): void {\n try {\n const savedWidth = UserInfoEngine.Instance.GetSetting(PANEL_WIDTH_SETTING_KEY);\n if (savedWidth) {\n const width = parseInt(savedWidth, 10);\n if (!isNaN(width) && width >= this.minWidth && width <= this.maxWidth) {\n this.PanelWidth = width;\n }\n }\n } catch (error) {\n console.error('[query-row-detail] Failed to load persisted width:', error);\n }\n }\n\n private async persistPanelWidth(width: number): Promise<void> {\n try {\n await UserInfoEngine.Instance.SetSetting(PANEL_WIDTH_SETTING_KEY, String(width));\n } catch (error) {\n console.error('[query-row-detail] Failed to persist panel width:', error);\n }\n }\n\n private loadHideEmptyFieldsPreference(): void {\n try {\n const saved = UserInfoEngine.Instance.GetSetting(HIDE_EMPTY_FIELDS_KEY);\n if (saved !== undefined) {\n this.HideEmptyFields = saved === 'true';\n }\n } catch (error) {\n console.error('[query-row-detail] Failed to load hide empty fields preference:', error);\n }\n }\n\n private async persistHideEmptyFieldsPreference(): Promise<void> {\n try {\n await UserInfoEngine.Instance.SetSetting(HIDE_EMPTY_FIELDS_KEY, String(this.HideEmptyFields));\n } catch (error) {\n console.error('[query-row-detail] Failed to persist hide empty fields preference:', error);\n }\n }\n\n public toggleHideEmptyFields(): void {\n this.HideEmptyFields = !this.HideEmptyFields;\n this.persistHideEmptyFieldsPreference();\n this.cdr.markForCheck();\n }\n\n /**\n * Returns visible fields based on HideEmptyFields setting\n */\n public getVisibleFields(fields: DetailField[]): DetailField[] {\n if (!this.HideEmptyFields) {\n return fields;\n }\n return fields.filter(f => f.value !== null && f.value !== undefined && f.value !== '');\n }\n\n /**\n * Returns count of empty fields for display\n */\n public getEmptyFieldCount(fields: DetailField[]): number {\n return fields.filter(f => f.value === null || f.value === undefined || f.value === '').length;\n }\n\n // ========================================\n // Keyboard Navigation\n // ========================================\n\n @HostListener('document:keydown', ['$event'])\n onKeyDown(event: KeyboardEvent): void {\n if (!this.Visible) return;\n\n if (event.key === 'Escape') {\n this.onClose();\n } else if (event.key === 'ArrowUp' || event.key === 'k') {\n if (this.RowIndex > 0) {\n this.onNavigatePrev();\n }\n } else if (event.key === 'ArrowDown' || event.key === 'j') {\n if (this.RowIndex < this.TotalRows - 1) {\n this.onNavigateNext();\n }\n }\n }\n}\n","<!-- Row Detail Slide-in Panel -->\n@if (Visible) {\n <div class=\"row-detail-panel\"\n @slideIn\n [style.width.px]=\"PanelWidth\">\n <!-- Resize handle -->\n <div class=\"resize-handle\"\n (mousedown)=\"onResizeStart($event)\"\n [class.resizing]=\"IsResizing\">\n </div>\n <!-- Header -->\n <div class=\"panel-header\">\n <div class=\"header-left\">\n <i class=\"fa-solid fa-table-cells-large header-icon\"></i>\n <h3 class=\"panel-title\">Row Details</h3>\n </div>\n <div class=\"header-right\">\n <!-- Row navigation -->\n @if (TotalRows > 1) {\n <div class=\"row-nav\">\n <button class=\"nav-btn\"\n [disabled]=\"RowIndex === 0\"\n (click)=\"onNavigatePrev()\"\n title=\"Previous row (↑ or K)\">\n <i class=\"fa-solid fa-chevron-up\"></i>\n </button>\n <span class=\"row-indicator\">{{ RowIndex + 1 }} / {{ TotalRows }}</span>\n <button class=\"nav-btn\"\n [disabled]=\"RowIndex >= TotalRows - 1\"\n (click)=\"onNavigateNext()\"\n title=\"Next row (↓ or J)\">\n <i class=\"fa-solid fa-chevron-down\"></i>\n </button>\n </div>\n }\n <!-- Toggle empty fields -->\n <button class=\"action-btn\"\n (click)=\"toggleHideEmptyFields()\"\n [class.active]=\"HideEmptyFields\"\n [title]=\"HideEmptyFields ? 'Show empty fields' : 'Hide empty fields'\">\n <i class=\"fa-solid\" [class.fa-eye]=\"!HideEmptyFields\" [class.fa-eye-slash]=\"HideEmptyFields\"></i>\n </button>\n <!-- Copy JSON button -->\n <button class=\"action-btn\" (click)=\"copyRowAsJson()\" title=\"Copy row as JSON\">\n <i class=\"fa-solid fa-copy\"></i>\n </button>\n <!-- Close button -->\n <button class=\"close-btn\" (click)=\"onClose()\" title=\"Close (Esc)\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n </div>\n <!-- Content -->\n <div class=\"panel-content\">\n <!-- Primary Keys Section -->\n @if (getVisibleFields(PrimaryKeyFields).length > 0) {\n <div class=\"field-section\">\n <h4 class=\"section-title\">\n <i class=\"fa-solid fa-key section-icon pk-icon\"></i>\n Primary Key\n </h4>\n <div class=\"field-list\">\n @for (field of getVisibleFields(PrimaryKeyFields); track field) {\n <div class=\"field-item\">\n <div class=\"field-header\">\n <span class=\"field-name\">{{ field.displayName }}</span>\n <button class=\"copy-btn\" (click)=\"copyValue(field)\" title=\"Copy value\">\n <i class=\"fa-solid fa-copy\"></i>\n </button>\n </div>\n <div class=\"field-value\"\n [class.clickable]=\"field.targetEntityName\"\n (click)=\"field.targetEntityName && onEntityLinkClick(field)\">\n @if (field.targetEntityIcon) {\n <i\n [class]=\"field.targetEntityIcon\"\n class=\"entity-icon\"></i>\n }\n <span class=\"value-text monospace\">{{ field.formattedValue }}</span>\n @if (field.targetEntityName) {\n <i\n class=\"fa-solid fa-arrow-up-right-from-square link-icon\"></i>\n }\n </div>\n </div>\n }\n </div>\n </div>\n }\n <!-- Foreign Keys Section -->\n @if (getVisibleFields(ForeignKeyFields).length > 0) {\n <div class=\"field-section\">\n <h4 class=\"section-title\">\n <i class=\"fa-solid fa-link section-icon fk-icon\"></i>\n Related Records\n </h4>\n <div class=\"field-list\">\n @for (field of getVisibleFields(ForeignKeyFields); track field) {\n <div class=\"field-item\">\n <div class=\"field-header\">\n <span class=\"field-name\">{{ field.displayName }}</span>\n @if (field.targetEntityName) {\n <span class=\"target-entity\">\n <i class=\"fa-solid fa-arrow-right\"></i>\n {{ field.targetEntityName }}\n </span>\n }\n <button class=\"copy-btn\" (click)=\"copyValue(field)\" title=\"Copy value\">\n <i class=\"fa-solid fa-copy\"></i>\n </button>\n </div>\n @if (field.value != null) {\n <div class=\"field-value clickable\"\n (click)=\"onEntityLinkClick(field)\">\n @if (field.targetEntityIcon) {\n <i\n [class]=\"field.targetEntityIcon\"\n class=\"entity-icon\"></i>\n }\n <span class=\"value-text monospace\">{{ field.formattedValue }}</span>\n <i class=\"fa-solid fa-arrow-up-right-from-square link-icon\"></i>\n </div>\n }\n @if (field.value == null) {\n <div class=\"field-value empty\">\n <span class=\"value-text\">(empty)</span>\n </div>\n }\n </div>\n }\n </div>\n </div>\n }\n <!-- Regular Fields Section -->\n @if (getVisibleFields(RegularFields).length > 0) {\n <div class=\"field-section\">\n <h4 class=\"section-title\">\n <i class=\"fa-solid fa-list section-icon\"></i>\n Fields\n @if (HideEmptyFields && getEmptyFieldCount(RegularFields) > 0) {\n <span class=\"hidden-count\">\n ({{ getEmptyFieldCount(RegularFields) }} empty hidden)\n </span>\n }\n </h4>\n <div class=\"field-list\">\n @for (field of getVisibleFields(RegularFields); track field) {\n <div class=\"field-item\">\n <div class=\"field-header\">\n <span class=\"field-name\">{{ field.displayName }}</span>\n <span class=\"field-type\">{{ field.sqlType }}</span>\n <button class=\"copy-btn\" (click)=\"copyValue(field)\" title=\"Copy value\">\n <i class=\"fa-solid fa-copy\"></i>\n </button>\n </div>\n <!-- JSON value -->\n @if (isJson(field.formattedValue)) {\n <div class=\"field-value json-value\"\n [class.expanded]=\"field.isExpanded\">\n <pre class=\"json-content\">{{ formatJson(field.formattedValue) }}</pre>\n <button class=\"expand-btn\" (click)=\"toggleFieldExpand(field)\">\n {{ field.isExpanded ? 'Collapse' : 'Expand' }}\n </button>\n </div>\n }\n <!-- Long text value -->\n @if (!isJson(field.formattedValue) && field.isLongText) {\n <div class=\"field-value long-text\"\n [class.expanded]=\"field.isExpanded\">\n <span class=\"value-text\">{{ field.formattedValue }}</span>\n <button class=\"expand-btn\" (click)=\"toggleFieldExpand(field)\">\n {{ field.isExpanded ? 'Show less' : 'Show more' }}\n </button>\n </div>\n }\n <!-- Boolean value -->\n @if (field.sqlType.toLowerCase() === 'bit' && !isJson(field.formattedValue)) {\n <div class=\"field-value boolean-value\"\n >\n <i [class]=\"field.value ? 'fa-solid fa-check-circle bool-true' : 'fa-solid fa-times-circle bool-false'\"></i>\n <span class=\"value-text\">{{ field.formattedValue }}</span>\n </div>\n }\n <!-- Empty value -->\n @if (field.value == null && !isJson(field.formattedValue)) {\n <div class=\"field-value empty\"\n >\n <span class=\"value-text\">(empty)</span>\n </div>\n }\n <!-- Regular value -->\n @if (field.value != null && !isJson(field.formattedValue) && !field.isLongText && field.sqlType.toLowerCase() !== 'bit') {\n <div class=\"field-value\"\n >\n <span class=\"value-text\"\n [class.monospace]=\"field.sqlType.toLowerCase().includes('uniqueidentifier') || field.name.toLowerCase().includes('id')\">\n {{ field.formattedValue }}\n </span>\n </div>\n }\n </div>\n }\n </div>\n </div>\n }\n </div>\n </div>\n}\n\n<!-- Backdrop -->\n@if (Visible) {\n <div class=\"panel-backdrop\"\n (click)=\"onClose()\">\n </div>\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@memberjunction/ng-query-viewer",
3
- "version": "6.1.4",
3
+ "version": "6.1.5",
4
4
  "description": "MemberJunction: Angular components for viewing and executing stored queries with parameter input, interactive results grid, and entity linking",
5
5
  "main": "./dist/public-api.js",
6
6
  "typings": "./dist/public-api.d.ts",
@@ -21,7 +21,7 @@
21
21
  "devDependencies": {
22
22
  "@angular/compiler": "21.2.22",
23
23
  "@angular/compiler-cli": "21.2.22",
24
- "@memberjunction/ng-test-utils": "6.1.4",
24
+ "@memberjunction/ng-test-utils": "6.1.5",
25
25
  "vitest": "^4.0.18"
26
26
  },
27
27
  "peerDependencies": {
@@ -33,18 +33,18 @@
33
33
  "ag-grid-community": "^35.0.1"
34
34
  },
35
35
  "dependencies": {
36
- "@memberjunction/ng-ui-components": "6.1.4",
37
- "@memberjunction/core-entities": "6.1.4",
38
- "@memberjunction/export-engine": "6.1.4",
39
- "@memberjunction/global": "6.1.4",
40
- "@memberjunction/core": "6.1.4",
41
- "@memberjunction/ng-base-types": "6.1.4",
42
- "@memberjunction/ng-pagination": "6.1.4",
43
- "@memberjunction/ng-shared-generic": "6.1.4",
44
- "@memberjunction/ng-export-service": "6.1.4",
45
- "@memberjunction/ng-markdown": "6.1.4",
46
- "@memberjunction/ng-code-editor": "6.1.4",
47
- "@memberjunction/ng-notifications": "6.1.4",
36
+ "@memberjunction/ng-ui-components": "6.1.5",
37
+ "@memberjunction/core-entities": "6.1.5",
38
+ "@memberjunction/export-engine": "6.1.5",
39
+ "@memberjunction/global": "6.1.5",
40
+ "@memberjunction/core": "6.1.5",
41
+ "@memberjunction/ng-base-types": "6.1.5",
42
+ "@memberjunction/ng-pagination": "6.1.5",
43
+ "@memberjunction/ng-shared-generic": "6.1.5",
44
+ "@memberjunction/ng-export-service": "6.1.5",
45
+ "@memberjunction/ng-markdown": "6.1.5",
46
+ "@memberjunction/ng-code-editor": "6.1.5",
47
+ "@memberjunction/ng-notifications": "6.1.5",
48
48
  "rxjs": "^7.8.2",
49
49
  "tslib": "^2.8.1"
50
50
  },