@memberjunction/ng-entity-viewer 5.8.0 → 5.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entity-viewer.component.d.ts","sourceRoot":"","sources":["../../../src/lib/entity-viewer/entity-viewer.component.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"entity-viewer.component.d.ts","sourceRoot":"","sources":["../../../src/lib/entity-viewer/entity-viewer.component.ts"],"names":[],"mappings":"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"}
|
|
@@ -1290,8 +1290,9 @@ export class EntityViewerComponent {
|
|
|
1290
1290
|
if (!relatedEntity) {
|
|
1291
1291
|
return;
|
|
1292
1292
|
}
|
|
1293
|
-
// Create composite key
|
|
1294
|
-
const
|
|
1293
|
+
// Create composite key using the target entity's actual primary key field name
|
|
1294
|
+
const pkFieldName = relatedEntity.FirstPrimaryKey?.Name || 'ID';
|
|
1295
|
+
const compositeKey = new CompositeKey([{ FieldName: pkFieldName, Value: event.recordId }]);
|
|
1295
1296
|
// Emit recordOpened for the related entity (record is undefined since it's not loaded)
|
|
1296
1297
|
this.recordOpened.emit({
|
|
1297
1298
|
entity: relatedEntity,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entity-viewer.component.js","sourceRoot":"","sources":["../../../src/lib/entity-viewer/entity-viewer.component.ts","../../../src/lib/entity-viewer/entity-viewer.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, OnInit, OnDestroy, ChangeDetectorRef, ViewChild, NgZone } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { debounceTime, distinctUntilChanged, takeUntil } from 'rxjs/operators';\nimport { EntityInfo, EntityFieldInfo, EntityFieldTSType, RunView, RunViewParams, Metadata, CompositeKey } from '@memberjunction/core';\nimport { UUIDsEqual } from '@memberjunction/global';\nimport { MJUserViewEntityExtended } from '@memberjunction/core-entities';\nimport { buildCompositeKey, buildPkString, computeFieldsList } from '../utils/record.util';\nimport { TimelineGroup, TimeSegmentGrouping, TimelineSortOrder, AfterEventClickArgs } from '@memberjunction/ng-timeline';\nimport {\n EntityViewMode,\n EntityViewerConfig,\n DEFAULT_VIEWER_CONFIG,\n RecordSelectedEvent,\n RecordOpenedEvent,\n DataLoadedEvent,\n FilteredCountChangedEvent,\n CardTemplate,\n GridColumnDef,\n SortState,\n SortChangedEvent,\n PaginationState,\n ViewGridState,\n GridStateChangedEvent,\n TimelineSegmentGrouping,\n TimelineOrientation,\n TimelineState\n} from '../types';\nimport {\n AfterRowClickEventArgs,\n AfterRowDoubleClickEventArgs,\n AfterSortEventArgs\n} from '../entity-data-grid/events/grid-events';\nimport { GridToolbarConfig, GridSelectionMode, ForeignKeyClickEvent } from '../entity-data-grid/models/grid-types';\nimport { EntityDataGridComponent } from '../entity-data-grid/entity-data-grid.component';\n\n/**\n * EntityViewerComponent - Full-featured composite component for viewing entity data\n *\n * This component provides a complete data viewing experience with:\n * - Switchable grid (AG Grid) and card views\n * - Server-side filtering with UserSearchString\n * - Server-side pagination with StartRow/MaxRows\n * - Server-side sorting with OrderBy\n * - Selection handling with configurable behavior\n * - Loading, empty, and error states\n * - Beautiful pagination UI with \"Load More\" pattern\n *\n * @example\n * ```html\n * <!-- Basic usage - loads data automatically -->\n * <mj-entity-viewer\n * [entity]=\"selectedEntity\"\n * (recordSelected)=\"onRecordSelected($event)\"\n * (recordOpened)=\"onRecordOpened($event)\">\n * </mj-entity-viewer>\n *\n * <!-- With external state control (like Data Explorer) -->\n * <mj-entity-viewer\n * [entity]=\"selectedEntity\"\n * [(viewMode)]=\"state.viewMode\"\n * [filterText]=\"state.filterText\"\n * [selectedRecordId]=\"state.selectedRecordId\"\n * (recordSelected)=\"onRecordSelected($event)\"\n * (recordOpened)=\"onRecordOpened($event)\"\n * (sortChanged)=\"onSortChanged($event)\">\n * </mj-entity-viewer>\n * ```\n */\n@Component({\n standalone: false,\n selector: 'mj-entity-viewer',\n templateUrl: './entity-viewer.component.html',\n styleUrls: ['./entity-viewer.component.css'],\n host: {\n 'style': 'display: block; height: 100%;'\n }\n})\nexport class EntityViewerComponent implements OnInit, OnDestroy {\n // ========================================\n // INPUTS (using getter/setter pattern)\n // ========================================\n\n private _entity: EntityInfo | null = null;\n private _records: Record<string, unknown>[] | null = null;\n private _config: Partial<EntityViewerConfig> = {};\n private _viewMode: EntityViewMode | null = null;\n private _filterText: string | null = null;\n private _sortState: SortState | null = null;\n private _viewEntity: MJUserViewEntityExtended | null = null;\n private _timelineConfig: TimelineState | null = null;\n private _initialized = false;\n\n /**\n * The entity to display records for\n */\n @Input()\n get entity(): EntityInfo | null {\n return this._entity;\n }\n set entity(value: EntityInfo | null) {\n const previousEntity = this._entity;\n this._entity = value;\n\n // Detect date fields for timeline support\n this.detectDateFields();\n\n if (this._initialized) {\n // If entity changed to a different entity, clear stale view entity\n // that belongs to the old entity (its WhereClause, SortState, etc. reference old fields)\n if (value && previousEntity && !UUIDsEqual(value.ID, previousEntity.ID)) {\n if (this._viewEntity && !UUIDsEqual(this._viewEntity.EntityID, value.ID)) {\n this._viewEntity = null;\n }\n }\n\n if (value && !this._records) {\n // Reset state for new entity - synchronously clear all data and force change detection\n // before starting the async load to prevent stale data display\n this.resetPaginationState();\n this.cdr.detectChanges();\n this.loadData();\n } else if (!value) {\n this.internalRecords = [];\n this.totalRecordCount = 0;\n this.filteredRecordCount = 0;\n this.resetPaginationState();\n this.cdr.detectChanges();\n }\n }\n }\n\n /**\n * Pre-loaded records (optional - if not provided, component loads data)\n */\n @Input()\n get records(): Record<string, unknown>[] | null {\n return this._records;\n }\n set records(value: Record<string, unknown>[] | null) {\n this._records = value;\n\n if (value) {\n this.internalRecords = value;\n this.totalRecordCount = value.length;\n this.filteredRecordCount = value.length;\n // Update timeline with new records\n this.updateTimelineGroups();\n }\n }\n\n /**\n * Configuration options for the viewer\n */\n @Input()\n get config(): Partial<EntityViewerConfig> {\n return this._config;\n }\n set config(value: Partial<EntityViewerConfig>) {\n this._config = value;\n this.applyConfig();\n }\n\n /**\n * Currently selected record ID (primary key string)\n */\n @Input() selectedRecordId: string | null = null;\n\n /**\n * External view mode - allows parent to control view mode\n * Supports two-way binding: [(viewMode)]=\"state.viewMode\"\n */\n @Input()\n get viewMode(): EntityViewMode | null {\n return this._viewMode;\n }\n set viewMode(value: EntityViewMode | null) {\n this._viewMode = value;\n if (value !== null) {\n this.internalViewMode = value;\n }\n }\n\n /**\n * External filter text - allows parent to control filter\n * Supports two-way binding: [(filterText)]=\"state.filterText\"\n */\n @Input()\n get filterText(): string | null {\n return this._filterText;\n }\n set filterText(value: string | null) {\n const oldFilter = this.debouncedFilterText;\n this._filterText = value;\n\n const newFilter = value ?? '';\n this.internalFilterText = newFilter;\n this.debouncedFilterText = newFilter;\n\n if (this._initialized) {\n // If server-side filtering and filter changed, reload from page 1\n // Keep existing records visible during refresh for better UX\n if (this.effectiveConfig.serverSideFiltering && newFilter !== oldFilter && !this._records) {\n this.resetPaginationState(false);\n this.loadData();\n } else {\n this.updateFilteredCount();\n }\n this.cdr.detectChanges();\n }\n }\n\n /**\n * External sort state - allows parent to control sorting\n */\n @Input()\n get sortState(): SortState | null {\n return this._sortState;\n }\n set sortState(value: SortState | null) {\n const oldSort = this.internalSortState;\n this._sortState = value;\n\n if (value !== null) {\n this.internalSortState = value;\n\n if (this._initialized) {\n // If sort changed and using server-side sorting, reload\n // Keep existing records visible during refresh for better UX\n if (this.effectiveConfig.serverSideSorting && !this._records) {\n const sortChanged = !oldSort || !value ||\n oldSort.field !== value.field ||\n oldSort.direction !== value.direction;\n\n if (sortChanged) {\n this.resetPaginationState(false);\n this.loadData();\n }\n }\n }\n }\n }\n\n /**\n * Custom grid column definitions\n */\n @Input() gridColumns: GridColumnDef[] = [];\n\n /**\n * Custom card template\n */\n @Input() cardTemplate: CardTemplate | null = null;\n\n /**\n * Optional User View entity that provides view configuration\n * When provided, the component will use the view's WhereClause, GridState, SortState, etc.\n * The view's filter is additive - UserSearchString is applied ON TOP of the view's WhereClause\n */\n @Input()\n get viewEntity(): MJUserViewEntityExtended | null {\n return this._viewEntity;\n }\n set viewEntity(value: MJUserViewEntityExtended | null) {\n this._viewEntity = value;\n\n if (this._initialized && this._entity && !this._records) {\n // Apply view's sort state if available, then reset pagination and reload\n this.applySortStateFromView(value);\n this.resetPaginationState();\n this.loadData();\n }\n }\n\n /**\n * Grid state configuration from a User View\n * Controls column visibility, widths, order, and sort settings\n */\n @Input() gridState: ViewGridState | null = null;\n\n /**\n * Timeline configuration state\n * Controls which date field is used and segment grouping\n */\n @Input()\n get timelineConfig(): TimelineState | null {\n return this._timelineConfig;\n }\n set timelineConfig(value: TimelineState | null) {\n const prev = this._timelineConfig;\n // Compare by value, not reference\n const isEqual = (prev === null && value === null) ||\n (prev !== null && value !== null &&\n prev.dateFieldName === value.dateFieldName &&\n prev.sortOrder === value.sortOrder &&\n prev.orientation === value.orientation &&\n prev.segmentGrouping === value.segmentGrouping);\n\n if (!isEqual) {\n this._timelineConfig = value;\n if (value && this._entity) {\n this.configureTimeline();\n this.cdr.markForCheck();\n }\n }\n }\n\n /**\n * Whether to show the grid toolbar.\n * When false, the grid is displayed without its own toolbar - useful when\n * entity-viewer provides its own filter/actions in the header.\n * @default false\n */\n @Input() showGridToolbar: boolean = false;\n\n /**\n * Grid toolbar configuration - controls which buttons are shown and their behavior\n * When not provided, uses sensible defaults\n */\n @Input() gridToolbarConfig: Partial<GridToolbarConfig> | null = null;\n\n /**\n * Grid selection mode\n * @default 'single'\n */\n @Input() gridSelectionMode: GridSelectionMode = 'single';\n\n /**\n * Show the \"Add to List\" button in the grid toolbar.\n * Requires gridSelectionMode to be 'multiple' for best UX.\n * @default false\n */\n @Input() showAddToListButton: boolean = false;\n\n // ========================================\n // OUTPUTS\n // ========================================\n\n /**\n * Emitted when a record is selected (single click)\n */\n @Output() recordSelected = new EventEmitter<RecordSelectedEvent>();\n\n /**\n * Emitted when a record should be opened (double-click or open button)\n */\n @Output() recordOpened = new EventEmitter<RecordOpenedEvent>();\n\n /**\n * Emitted when data is loaded\n */\n @Output() dataLoaded = new EventEmitter<DataLoadedEvent>();\n\n /**\n * Emitted when the view mode changes (for two-way binding)\n */\n @Output() viewModeChange = new EventEmitter<EntityViewMode>();\n\n /**\n * Emitted when filter text changes (for two-way binding)\n */\n @Output() filterTextChange = new EventEmitter<string>();\n\n /**\n * Emitted when filtered count changes\n */\n @Output() filteredCountChanged = new EventEmitter<FilteredCountChangedEvent>();\n\n /**\n * Emitted when sort state changes\n */\n @Output() sortChanged = new EventEmitter<SortChangedEvent>();\n\n /**\n * Emitted when grid state changes (column resize, reorder, etc.)\n */\n @Output() gridStateChanged = new EventEmitter<GridStateChangedEvent>();\n\n /**\n * Emitted when timeline configuration changes (date field, grouping, etc.)\n */\n @Output() timelineConfigChange = new EventEmitter<TimelineState>();\n\n /**\n * Emitted when the Add/New button is clicked in the grid toolbar\n */\n @Output() addRequested = new EventEmitter<void>();\n\n /**\n * Emitted when the Delete button is clicked in the grid toolbar\n * Includes the selected records to be deleted\n */\n @Output() deleteRequested = new EventEmitter<{ records: Record<string, unknown>[] }>();\n\n /**\n * Emitted when the Refresh button is clicked in the grid toolbar\n */\n @Output() refreshRequested = new EventEmitter<void>();\n\n /**\n * Emitted when the Export button is clicked in the grid toolbar\n */\n @Output() exportRequested = new EventEmitter<{ format: 'excel' | 'csv' | 'json' }>();\n\n /**\n * Emitted when the Add to List button is clicked in the grid toolbar.\n * Parent components should handle this to show the list management dialog.\n */\n @Output() addToListRequested = new EventEmitter<{\n entityInfo: EntityInfo;\n records: Record<string, unknown>[];\n recordIds: string[];\n }>();\n\n /**\n * Emitted when grid selection changes.\n * Parent components can use this to track selected records for their own toolbar buttons.\n */\n @Output() selectionChanged = new EventEmitter<{\n records: Record<string, unknown>[];\n recordIds: string[];\n }>();\n\n // ========================================\n // INTERNAL STATE\n // ========================================\n\n public internalViewMode: EntityViewMode = 'grid';\n public internalFilterText: string = '';\n public debouncedFilterText: string = '';\n public isLoading: boolean = false;\n public loadingMessage: string = 'Loading...';\n public internalRecords: Record<string, unknown>[] = [];\n public totalRecordCount: number = 0;\n public filteredRecordCount: number = 0;\n\n /** Track which records matched on hidden (non-visible) fields */\n public hiddenFieldMatches = new Map<string, string>();\n\n /** Current sort state */\n public internalSortState: SortState | null = null;\n\n /** Cached grid params to avoid recreating object on every change detection */\n private _cachedGridParams: RunViewParams | null = null;\n private _lastGridParamsEntity: string | null = null;\n private _lastGridParamsViewEntity: MJUserViewEntityExtended | null = null;\n\n /** Pagination state */\n public pagination: PaginationState = {\n currentPage: 0,\n pageSize: 100,\n totalRecords: 0,\n hasMore: false,\n isLoading: false\n };\n\n // ========================================\n // TIMELINE STATE\n // ========================================\n\n /** Whether the current entity has date fields available for timeline view */\n public hasDateFields: boolean = false;\n\n /** Available date fields from the entity (sorted by priority) */\n public availableDateFields: EntityFieldInfo[] = [];\n\n /** Timeline groups configuration for the timeline component */\n get timelineGroups(): TimelineGroup<Record<string, unknown>>[] {\n return this._timelineGroups;\n }\n set timelineGroups(value: TimelineGroup<Record<string, unknown>>[]) {\n const prev = this._timelineGroups;\n this._timelineGroups = value;\n\n // Detect meaningful changes to trigger refresh in child timeline component\n const hasChanged = prev !== value ||\n (prev.length > 0 && value.length > 0 &&\n (prev[0].EntityObjects !== value[0]?.EntityObjects ||\n prev[0].DateFieldName !== value[0]?.DateFieldName));\n\n if (hasChanged) {\n // Force change detection to propagate to child timeline component\n this.cdr.markForCheck();\n }\n }\n private _timelineGroups: TimelineGroup<Record<string, unknown>>[] = [];\n\n /** Timeline sort order */\n public timelineSortOrder: TimelineSortOrder = 'desc';\n\n /** Timeline segment grouping */\n public timelineSegmentGrouping: TimeSegmentGrouping = 'month';\n\n /** Timeline orientation (vertical or horizontal) */\n public timelineOrientation: TimelineOrientation = 'vertical';\n\n /** Currently selected date field for timeline */\n public selectedTimelineDateField: string | null = null;\n\n private destroy$ = new Subject<void>();\n private filterInput$ = new Subject<string>();\n\n /** Track if this is the first load (vs. load more) */\n private isInitialLoad: boolean = true;\n\n /** Reference to the data grid component for flushing pending changes */\n @ViewChild(EntityDataGridComponent) private dataGridRef: EntityDataGridComponent | undefined;\n\n constructor(private cdr: ChangeDetectorRef, private ngZone: NgZone) {}\n\n // ========================================\n // PUBLIC METHODS\n // ========================================\n\n /**\n * Ensures any pending grid state changes are saved immediately without waiting for debounce.\n * Call this before switching views or entities to ensure changes are saved.\n */\n public EnsurePendingChangesSaved(): void {\n this.dataGridRef?.EnsurePendingChangesSaved();\n }\n\n // ========================================\n // COMPUTED PROPERTIES\n // ========================================\n\n /**\n * Get the effective entity - uses entity input if provided, otherwise derives from viewEntity\n * This allows callers to provide just a viewEntity without explicitly setting the entity input.\n * Uses fallback resolution when ViewEntityInfo is not available.\n */\n get effectiveEntity(): EntityInfo | null {\n if (this.entity) {\n return this.entity;\n }\n // Auto-derive from viewEntity if available\n if (this.viewEntity) {\n return this.getEntityInfoFromViewEntity(this.viewEntity);\n }\n return null;\n }\n\n /**\n * Gets EntityInfo from a ViewEntity with multiple fallback strategies.\n * Priority: 1) ViewEntityInfo property (set by Load)\n * 2) Entity name lookup (virtual field)\n * 3) EntityID lookup\n * Returns null if entity cannot be determined.\n */\n private getEntityInfoFromViewEntity(viewEntity: MJUserViewEntityExtended): EntityInfo | null {\n // First try: ViewEntityInfo is the preferred source (set by MJUserViewEntityExtended.Load)\n if (viewEntity.ViewEntityInfo) {\n return viewEntity.ViewEntityInfo;\n }\n\n const md = new Metadata();\n\n // Second try: Look up by Entity name (virtual field that returns entity name)\n if (viewEntity.Entity) {\n const entityByName = md.Entities.find(e => e.Name === viewEntity.Entity);\n if (entityByName) {\n return entityByName;\n }\n }\n\n // Third try: Look up by EntityID\n if (viewEntity.EntityID) {\n const entityById = md.Entities.find(e => UUIDsEqual(e.ID, viewEntity.EntityID));\n if (entityById) {\n return entityById;\n }\n }\n\n console.warn(`[EntityViewer] Could not determine entity for view \"${viewEntity.Name}\" (ID: ${viewEntity.ID})`);\n return null;\n }\n\n /**\n * Get the effective view mode (external or internal)\n */\n get effectiveViewMode(): EntityViewMode {\n return this.viewMode ?? this.internalViewMode;\n }\n\n /**\n * Get the effective filter text (external or internal)\n */\n get effectiveFilterText(): string {\n return this.filterText ?? this.internalFilterText;\n }\n\n /**\n * Get the raw ID value from selectedRecordId for timeline selection.\n * The selectedRecordId is in composite key format (e.g., \"ID|abc-123\" or \"ID=abc-123\"),\n * but the timeline stores just the raw ID value.\n */\n get timelineSelectedEventId(): string | null {\n if (!this.selectedRecordId) return null;\n\n // Handle \"ID|value\" format (pipe separator)\n if (this.selectedRecordId.includes('|')) {\n const parts = this.selectedRecordId.split('|');\n return parts.length > 1 ? parts[1] : this.selectedRecordId;\n }\n\n // Handle \"ID=value\" format (equals separator)\n if (this.selectedRecordId.includes('=')) {\n const parts = this.selectedRecordId.split('=');\n return parts.length > 1 ? parts[1] : this.selectedRecordId;\n }\n\n // Return as-is if no separator found\n return this.selectedRecordId;\n }\n\n /**\n * Get the effective sort state (external or internal)\n */\n get effectiveSortState(): SortState | null {\n return this.sortState ?? this.internalSortState;\n }\n\n /**\n * Get the OrderBy string for mj-entity-data-grid from the effective sort state\n */\n get effectiveSortOrderBy(): string {\n const sortState = this.effectiveSortState;\n if (!sortState?.field || !sortState.direction) {\n return '';\n }\n return `${sortState.field} ${sortState.direction.toUpperCase()}`;\n }\n\n /**\n * Get merged configuration with defaults\n */\n get effectiveConfig(): Required<EntityViewerConfig> {\n return { ...DEFAULT_VIEWER_CONFIG, ...this.config };\n }\n\n /**\n * Get cached grid params - only recreates object when entity or viewEntity changes\n * This prevents Angular from seeing a new object reference on every change detection\n * which would cause the grid to reinitialize\n */\n get gridParams(): RunViewParams | null {\n const entity = this.effectiveEntity;\n if (!entity) {\n return null;\n }\n\n // Check if we need to recreate the params object\n const entityChanged = this._lastGridParamsEntity !== entity.Name;\n const viewEntityChanged = this._lastGridParamsViewEntity !== this.viewEntity;\n\n if (entityChanged || viewEntityChanged || !this._cachedGridParams) {\n this._lastGridParamsEntity = entity.Name;\n this._lastGridParamsViewEntity = this.viewEntity ?? null;\n this._cachedGridParams = {\n EntityName: entity.Name,\n ViewEntity: this.viewEntity || undefined\n };\n }\n\n return this._cachedGridParams;\n }\n\n /**\n * Get the effective grid toolbar configuration\n * Merges user-provided config with defaults appropriate for entity-viewer context\n */\n get effectiveGridToolbarConfig(): GridToolbarConfig {\n const defaults: GridToolbarConfig = {\n showSearch: false, // Entity-viewer has its own filter\n showRefresh: true,\n showAdd: true,\n showDelete: true,\n showExport: true,\n showColumnChooser: true,\n showRowCount: true,\n showSelectionCount: true\n };\n return { ...defaults, ...this.gridToolbarConfig };\n }\n\n /**\n * Get the records to display (external or internal)\n */\n get displayRecords(): Record<string, unknown>[] {\n return this.records ?? this.internalRecords;\n }\n\n /**\n * Get filtered records - when using server-side filtering, records are already filtered\n * When using client-side filtering, apply filter locally\n */\n get filteredRecords(): Record<string, unknown>[] {\n const records = this.displayRecords;\n\n // If server-side filtering is enabled, records are already filtered\n if (this.effectiveConfig.serverSideFiltering) {\n return records;\n }\n\n // Client-side filtering fallback\n const filterText = this.debouncedFilterText?.trim().toLowerCase();\n this.hiddenFieldMatches.clear();\n\n if (!filterText || !this.entity) {\n return records;\n }\n\n const visibleFields = this.getVisibleFieldNames();\n\n return records.filter(record => {\n const matchResult = this.recordMatchesFilter(record, filterText, visibleFields);\n if (matchResult.matches && matchResult.matchedField && !matchResult.matchedInVisibleField) {\n const recordKey = buildPkString(record, this.entity!);\n this.hiddenFieldMatches.set(recordKey, matchResult.matchedField);\n }\n return matchResult.matches;\n });\n }\n\n /**\n * Check if a record matches the filter text (client-side)\n */\n private recordMatchesFilter(\n record: Record<string, unknown>,\n filterText: string,\n visibleFields: Set<string>\n ): { matches: boolean; matchedField: string | null; matchedInVisibleField: boolean } {\n if (!this.entity) return { matches: true, matchedField: null, matchedInVisibleField: false };\n\n let matchedField: string | null = null;\n let matchedInVisibleField = false;\n\n for (const field of this.entity.Fields) {\n if (!this.shouldSearchField(field)) continue;\n\n const value = record[field.Name];\n if (value == null) continue;\n\n const stringValue = String(value).toLowerCase();\n if (this.matchesSearchTerm(stringValue, filterText)) {\n matchedField = field.Name;\n if (visibleFields.has(field.Name)) {\n matchedInVisibleField = true;\n break;\n }\n }\n }\n\n return {\n matches: matchedField !== null,\n matchedField,\n matchedInVisibleField\n };\n }\n\n /**\n * Determine if a field should be included in search\n */\n private shouldSearchField(field: EntityFieldInfo): boolean {\n if (field.Name.startsWith('__mj_')) return false;\n if (field.TSType === 'Date') return false;\n if (field.SQLFullType?.trim().toLowerCase() === 'uniqueidentifier') return false;\n return true;\n }\n\n /**\n * Check if a value matches the search term (supports SQL-style % wildcards)\n */\n private matchesSearchTerm(value: string, searchTerm: string): boolean {\n if (!searchTerm.includes('%')) {\n return value.includes(searchTerm);\n }\n\n const fragments = searchTerm.split('%').filter(s => s.length > 0);\n if (fragments.length === 0) return true;\n\n let searchStartIndex = 0;\n for (const fragment of fragments) {\n const foundIndex = value.indexOf(fragment, searchStartIndex);\n if (foundIndex === -1) return false;\n searchStartIndex = foundIndex + fragment.length;\n }\n return true;\n }\n\n /**\n * Get set of field names that are visible in the current view\n */\n private getVisibleFieldNames(): Set<string> {\n const visible = new Set<string>();\n if (!this.entity) return visible;\n\n for (const field of this.entity.Fields) {\n if (field.DefaultInView === true) {\n visible.add(field.Name);\n }\n }\n\n if (this.entity.NameField) {\n visible.add(this.entity.NameField.Name);\n }\n\n return visible;\n }\n\n /**\n * Check if a record matched on a hidden field\n */\n public hasHiddenFieldMatch(record: Record<string, unknown>): boolean {\n if (!this.debouncedFilterText || !this.entity) return false;\n return this.hiddenFieldMatches.has(buildPkString(record, this.entity));\n }\n\n /**\n * Get the name of the hidden field that matched for display\n */\n public getHiddenMatchFieldName(record: Record<string, unknown>): string {\n if (!this.entity) return '';\n const fieldName = this.hiddenFieldMatches.get(buildPkString(record, this.entity));\n if (!fieldName || !this.entity) return '';\n const field = this.entity.Fields.find(f => f.Name === fieldName);\n return field ? field.DisplayNameOrName : fieldName;\n }\n\n // ========================================\n // LIFECYCLE HOOKS\n // ========================================\n\n ngOnInit(): void {\n this.applyConfig();\n this.setupFilterDebounce();\n\n // Initialize debounced filter from external filter text if provided\n if (this.filterText !== null) {\n this.debouncedFilterText = this.filterText;\n }\n\n // Initialize sort state from config\n if (this.effectiveConfig.defaultSortField) {\n this.internalSortState = {\n field: this.effectiveConfig.defaultSortField,\n direction: this.effectiveConfig.defaultSortDirection ?? 'asc'\n };\n }\n\n // Mark as initialized - setters will now trigger data loading\n this._initialized = true;\n\n // If viewEntity was set before initialization, extract its sort state now.\n // The viewEntity setter skips this when _initialized is false.\n if (this._viewEntity) {\n this.applySortStateFromView(this._viewEntity);\n }\n\n // If entity was set before initialization, load data now\n if (this._entity && !this._records) {\n this.loadData();\n }\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n // ========================================\n // CONFIGURATION\n // ========================================\n\n /**\n * Extracts sort state from a view entity, checking ViewSortInfo first then\n * falling back to GridState.sortSettings. Resets internalSortState if the\n * view has no sort defined (prevents stale sort from a previous view).\n */\n private applySortStateFromView(view: MJUserViewEntityExtended | null): void {\n if (!view) {\n this.internalSortState = null;\n return;\n }\n\n // Priority 1: SortState column (via ViewSortInfo)\n const viewSortInfo = view.ViewSortInfo;\n if (viewSortInfo && viewSortInfo.length > 0) {\n this.internalSortState = {\n field: viewSortInfo[0].field,\n direction: viewSortInfo[0].direction?.toLowerCase() === 'desc' ? 'desc' : 'asc'\n };\n return;\n }\n\n // Priority 2: GridState.sortSettings (sort may only be stored here)\n if (view.GridState) {\n try {\n const gridState = JSON.parse(view.GridState) as ViewGridState;\n if (gridState.sortSettings && gridState.sortSettings.length > 0) {\n const firstSort = gridState.sortSettings[0];\n this.internalSortState = {\n field: firstSort.field,\n direction: firstSort.dir === 'desc' ? 'desc' : 'asc'\n };\n return;\n }\n } catch {\n // Invalid GridState JSON — ignore\n }\n }\n\n // No sort defined — reset to prevent stale sort from previous view\n this.internalSortState = null;\n }\n\n private applyConfig(): void {\n const config = this.effectiveConfig;\n this.pagination.pageSize = config.pageSize;\n\n if (this.viewMode === null) {\n this.internalViewMode = config.defaultViewMode;\n }\n }\n\n private setupFilterDebounce(): void {\n this.filterInput$\n .pipe(\n debounceTime(this.effectiveConfig.filterDebounceMs),\n distinctUntilChanged(),\n takeUntil(this.destroy$)\n )\n .subscribe(filterText => {\n const oldFilter = this.debouncedFilterText;\n this.debouncedFilterText = filterText;\n this.filterTextChange.emit(filterText);\n\n // If server-side filtering and filter changed, reload from page 1\n // Keep existing records visible during refresh for better UX\n if (this.effectiveConfig.serverSideFiltering && filterText !== oldFilter && !this.records) {\n this.resetPaginationState(false);\n this.loadData();\n } else {\n this.updateFilteredCount();\n }\n this.cdr.detectChanges();\n });\n }\n\n /**\n * Update the filtered record count and emit event\n */\n private updateFilteredCount(): void {\n const newCount = this.filteredRecords.length;\n if (this.filteredRecordCount !== newCount) {\n this.filteredRecordCount = newCount;\n this.filteredCountChanged.emit({\n filteredCount: newCount,\n totalCount: this.totalRecordCount\n });\n }\n }\n\n /**\n * Reset pagination state for a fresh load.\n * When clearRecords is true (default), clears all record data - use for entity switches.\n * When clearRecords is false, keeps existing records visible during refresh - use for sort/filter changes.\n */\n private resetPaginationState(clearRecords: boolean = true): void {\n this.pagination = {\n currentPage: 0,\n pageSize: this.effectiveConfig.pageSize,\n totalRecords: clearRecords ? 0 : this.pagination.totalRecords,\n hasMore: false,\n isLoading: false\n };\n if (clearRecords) {\n this.internalRecords = [];\n this.totalRecordCount = 0;\n this.filteredRecordCount = 0;\n }\n this.isInitialLoad = true;\n }\n\n // ========================================\n // DATA LOADING\n // ========================================\n\n // Sequence counter for tracking load requests and detecting stale responses\n private _loadSequence = 0;\n // Flag to indicate a reload is pending (requested while another load was in progress)\n private _pendingReload = false;\n\n /**\n * Load data for the current entity with server-side filtering/sorting/pagination\n */\n public async loadData(): Promise<void> {\n const entity = this.effectiveEntity;\n if (!entity) {\n this.internalRecords = [];\n this.totalRecordCount = 0;\n this.filteredRecordCount = 0;\n return;\n }\n\n // Increment sequence to track this load request\n const loadId = ++this._loadSequence;\n\n // If a load is already in progress, mark that we need to reload when it completes\n // This handles the case where view/filter changes occur during an active load\n if (this.isLoading) {\n this._pendingReload = true;\n return;\n }\n\n this.isLoading = true;\n this.pagination.isLoading = true;\n this.loadingMessage = this.isInitialLoad\n ? `Loading ${entity.Name}...`\n : 'Loading more records...';\n this.cdr.detectChanges();\n\n const startTime = Date.now();\n const config = this.effectiveConfig;\n\n try {\n const rv = new RunView();\n\n // Build OrderBy clause\n // Priority: 1) External sort state 2) View's OrderByClause 3) undefined\n let orderBy: string | undefined;\n const sortState = this.effectiveSortState;\n if (config.serverSideSorting && sortState?.field && sortState.direction) {\n orderBy = `${sortState.field} ${sortState.direction.toUpperCase()}`;\n } else if (this.viewEntity?.OrderByClause) {\n orderBy = this.viewEntity.OrderByClause;\n }\n\n // Calculate StartRow for pagination\n const startRow = this.pagination.currentPage * config.pageSize;\n\n // Build ExtraFilter from view's WhereClause if available\n // The view's WhereClause is the \"business filter\" - UserSearchString is additive\n const extraFilter = this.viewEntity?.WhereClause || undefined;\n\n const result = await rv.RunView<Record<string, unknown>>({\n EntityName: entity.Name,\n ResultType: 'simple',\n Fields: computeFieldsList(entity, this.gridState),\n MaxRows: config.pageSize,\n StartRow: startRow,\n OrderBy: orderBy,\n ExtraFilter: extraFilter,\n // Only use UserSearchString for regular text search, NOT for smart filters\n // Smart filters generate WhereClause via AI on the server, so the prompt text should not be passed as UserSearchString\n UserSearchString: config.serverSideFiltering && !this.viewEntity?.SmartFilterEnabled\n ? this.debouncedFilterText || undefined\n : undefined\n });\n\n // Check if this load is still the current one (detect stale responses)\n if (loadId !== this._loadSequence) {\n return;\n }\n\n if (result.Success) {\n\n // Append or replace records based on whether this is initial load\n if (this.isInitialLoad) {\n this.internalRecords = result.Results;\n } else {\n this.internalRecords = [...this.internalRecords, ...result.Results];\n }\n\n this.totalRecordCount = result.TotalRowCount;\n this.filteredRecordCount = this.internalRecords.length;\n\n // Update pagination state\n this.pagination.totalRecords = result.TotalRowCount;\n this.pagination.hasMore = this.internalRecords.length < result.TotalRowCount;\n\n this.dataLoaded.emit({\n totalRowCount: result.TotalRowCount,\n loadedRowCount: this.internalRecords.length,\n loadTime: Date.now() - startTime,\n records: this.internalRecords\n });\n\n this.filteredCountChanged.emit({\n filteredCount: this.internalRecords.length,\n totalCount: result.TotalRowCount\n });\n\n // Update timeline groups with new data\n this.updateTimelineGroups();\n } else {\n if (this.isInitialLoad) {\n this.internalRecords = [];\n }\n this.totalRecordCount = 0;\n this.filteredRecordCount = 0;\n }\n } catch (error) {\n if (this.isInitialLoad) {\n this.internalRecords = [];\n }\n this.totalRecordCount = 0;\n this.filteredRecordCount = 0;\n } finally {\n // Use ngZone.run() to ensure state changes trigger change detection.\n // With es2022 native async/await + zone.js 0.16, the await resumes\n // outside Angular's zone, so detectChanges() alone may not flush properly.\n this.ngZone.run(() => {\n this.isLoading = false;\n this.pagination.isLoading = false;\n this.isInitialLoad = false;\n this.cdr.detectChanges();\n });\n\n // If a reload was requested while we were loading, trigger it now\n if (this._pendingReload) {\n this._pendingReload = false;\n this.resetPaginationState();\n // Use setTimeout to break the call stack and allow Angular to process\n setTimeout(() => this.loadData(), 0);\n }\n }\n }\n\n /**\n * Load more records (next page)\n */\n public loadMore(): void {\n if (this.pagination.isLoading || !this.pagination.hasMore) {\n return;\n }\n\n this.pagination.currentPage++;\n this.loadData();\n }\n\n /**\n * Refresh data (re-load from server, starting at page 1)\n * Keeps existing records visible during refresh for better UX\n */\n public refresh(): void {\n if (!this.records) {\n this.resetPaginationState(false);\n this.loadData();\n }\n }\n\n // ========================================\n // VIEW MODE\n // ========================================\n\n /**\n * Set the view mode and emit change event\n */\n setViewMode(mode: EntityViewMode): void {\n if (this.effectiveViewMode !== mode) {\n this.internalViewMode = mode;\n this.viewModeChange.emit(mode);\n this.cdr.detectChanges();\n }\n }\n\n // ========================================\n // FILTERING\n // ========================================\n\n /**\n * Handle filter input change\n */\n onFilterChange(value: string): void {\n this.internalFilterText = value;\n this.filterInput$.next(value);\n }\n\n /**\n * Clear the filter\n */\n clearFilter(): void {\n this.internalFilterText = '';\n this.filterInput$.next('');\n this.cdr.detectChanges();\n }\n\n // ========================================\n // SORTING\n // ========================================\n\n /**\n * Handle sort change from grid component\n */\n onSortChanged(event: SortChangedEvent): void {\n const oldSort = this.internalSortState;\n this.internalSortState = event.sort;\n this.sortChanged.emit(event);\n\n // If server-side sorting, reload from page 1\n // Keep existing records visible during refresh for better UX\n if (this.effectiveConfig.serverSideSorting && !this.records) {\n const sortChanged = !oldSort || !event.sort ||\n oldSort.field !== event.sort?.field ||\n oldSort.direction !== event.sort?.direction;\n\n if (sortChanged) {\n this.resetPaginationState(false);\n this.loadData();\n }\n }\n }\n\n // ========================================\n // EVENT HANDLERS\n // ========================================\n\n /**\n * Handle record selection from child components (grid or cards)\n */\n onRecordSelected(event: RecordSelectedEvent): void {\n this.recordSelected.emit(event);\n }\n\n /**\n * Handle record opened from child components (grid or cards)\n */\n onRecordOpened(event: RecordOpenedEvent): void {\n this.recordOpened.emit(event);\n }\n\n /**\n * Handle grid state changes (column resize, reorder, etc.)\n */\n onGridStateChanged(event: GridStateChangedEvent): void {\n this.gridStateChanged.emit(event);\n }\n\n /**\n * Handle load more from pagination component\n */\n onLoadMore(): void {\n this.loadMore();\n }\n\n // ========================================\n // DATA GRID EVENT HANDLERS\n // ========================================\n\n /**\n * Handle row click from mj-entity-data-grid\n * Maps to recordSelected event for parent components\n */\n onDataGridRowClick(event: AfterRowClickEventArgs): void {\n const entity = this.effectiveEntity;\n if (!entity || !event.row) return;\n\n this.recordSelected.emit({\n record: event.row,\n entity: entity,\n compositeKey: buildCompositeKey(event.row, entity)\n });\n }\n\n /**\n * Handle row double-click from mj-entity-data-grid\n * Maps to recordOpened event for parent components\n */\n onDataGridRowDoubleClick(event: AfterRowDoubleClickEventArgs): void {\n const entity = this.effectiveEntity;\n if (!entity || !event.row) return;\n\n this.recordOpened.emit({\n record: event.row,\n entity: entity,\n compositeKey: buildCompositeKey(event.row, entity)\n });\n }\n\n /**\n * Handle sort changed from mj-entity-data-grid\n * Maps to sortChanged event for parent components\n */\n onDataGridSortChanged(event: AfterSortEventArgs): void {\n // Convert the data grid's sort state to our SortState format\n const newSort: SortState | null = event.newSortState && event.newSortState.length > 0\n ? {\n field: event.newSortState[0].field,\n direction: event.newSortState[0].direction\n }\n : null;\n\n this.internalSortState = newSort;\n this.sortChanged.emit({ sort: newSort });\n\n // If server-side sorting, reload from page 1\n // Keep existing records visible during refresh for better UX\n if (this.effectiveConfig.serverSideSorting && !this.records) {\n this.resetPaginationState(false);\n this.loadData();\n }\n }\n\n /**\n * Handle foreign key link click from mj-entity-data-grid\n * Bubbles the event up for parent components to handle navigation\n */\n /**\n * Handle foreign key link click from mj-entity-data-grid\n * Converts to recordOpened event for seamless navigation integration\n */\n onForeignKeyClick(event: ForeignKeyClickEvent): void {\n // Look up the related entity by name\n const md = new Metadata();\n const relatedEntity = event.relatedEntityName\n ? md.Entities.find(e => e.Name === event.relatedEntityName)\n : md.Entities.find(e => UUIDsEqual(e.ID, event.relatedEntityId));\n\n if (!relatedEntity) {\n return;\n }\n\n // Create composite key from the FK value using the static factory method\n const compositeKey = CompositeKey.FromID(event.recordId);\n\n // Emit recordOpened for the related entity (record is undefined since it's not loaded)\n this.recordOpened.emit({\n entity: relatedEntity,\n compositeKey\n });\n }\n\n /**\n * Handle Add/New button click from data grid toolbar\n */\n onGridAddRequested(): void {\n this.addRequested.emit();\n }\n\n /**\n * Handle Refresh button click from data grid toolbar\n */\n onGridRefreshRequested(): void {\n this.refreshRequested.emit();\n // Also trigger an internal refresh\n this.refresh();\n }\n\n /**\n * Handle Delete button click from data grid toolbar\n */\n onGridDeleteRequested(records: Record<string, unknown>[]): void {\n this.deleteRequested.emit({ records });\n }\n\n /**\n * Handle Export button click from data grid toolbar\n */\n onGridExportRequested(): void {\n this.exportRequested.emit({ format: 'excel' });\n }\n\n /**\n * Handle Add to List button click from data grid toolbar.\n * Forwards the event to parent components for list management.\n */\n onGridAddToListRequested(event: { entityInfo: EntityInfo; records: Record<string, unknown>[]; recordIds: string[] }): void {\n this.addToListRequested.emit(event);\n }\n\n /**\n * Handle selection change from data grid.\n * Converts selected keys to records and forwards to parent components.\n */\n onGridSelectionChange(selectedKeys: string[]): void {\n const entity = this.effectiveEntity;\n if (!entity) return;\n\n // Find the actual records from our filtered records\n const records = this.filteredRecords.filter(record => {\n const key = buildPkString(record, entity);\n return selectedKeys.includes(key);\n });\n\n // Get the raw primary key values for list management\n const recordIds = records.map(record =>\n String(record[entity.PrimaryKeys[0].Name])\n );\n\n this.selectionChanged.emit({ records, recordIds });\n }\n\n // ========================================\n // TIMELINE METHODS\n // ========================================\n\n /**\n * Handle timeline event click - emit as record selection\n */\n onTimelineEventClick(event: AfterEventClickArgs): void {\n const record = event.event.entity as Record<string, unknown>;\n const entity = this.effectiveEntity;\n if (record && entity) {\n this.recordSelected.emit({\n record,\n entity: entity,\n compositeKey: buildCompositeKey(record, entity)\n });\n }\n }\n\n /**\n * Toggle timeline orientation between vertical and horizontal\n */\n toggleTimelineOrientation(): void {\n this.timelineOrientation = this.timelineOrientation === 'vertical' ? 'horizontal' : 'vertical';\n\n // Emit config change so parent can persist the preference\n this.emitTimelineConfigChange();\n this.cdr.detectChanges();\n }\n\n /**\n * Toggle timeline sort order between newest first (desc) and oldest first (asc)\n */\n toggleTimelineSortOrder(): void {\n this.timelineSortOrder = this.timelineSortOrder === 'desc' ? 'asc' : 'desc';\n\n // Emit config change so parent can persist the preference\n this.emitTimelineConfigChange();\n this.cdr.detectChanges();\n }\n\n /**\n * Change the date field used for the timeline\n */\n setTimelineDateField(fieldName: string): void {\n if (this.availableDateFields.some(f => f.Name === fieldName)) {\n this.selectedTimelineDateField = fieldName;\n this.updateTimelineGroups();\n this.emitTimelineConfigChange();\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Get the display name of the currently selected timeline date field\n */\n get selectedDateFieldDisplayName(): string {\n if (!this.selectedTimelineDateField) return '';\n const field = this.availableDateFields.find(f => f.Name === this.selectedTimelineDateField);\n return field?.DisplayNameOrName || this.selectedTimelineDateField;\n }\n\n /**\n * Emit the current timeline configuration for persistence\n */\n private emitTimelineConfigChange(): void {\n if (this.selectedTimelineDateField) {\n this.timelineConfigChange.emit({\n dateFieldName: this.selectedTimelineDateField,\n sortOrder: this.timelineSortOrder,\n segmentGrouping: this.timelineSegmentGrouping as TimelineSegmentGrouping,\n orientation: this.timelineOrientation\n });\n }\n }\n\n /**\n * Detect and configure timeline based on entity's date fields\n * Called when entity changes\n */\n private detectDateFields(): void {\n if (!this.entity) {\n this.hasDateFields = false;\n this.availableDateFields = [];\n this.timelineGroups = [];\n this.fallbackFromTimelineIfNeeded();\n return;\n }\n\n // Find all date fields - include __mj_CreatedAt and __mj_UpdatedAt as they're useful for timelines\n const dateFields = this.entity.Fields.filter(\n f => f.TSType === EntityFieldTSType.Date\n );\n\n if (dateFields.length === 0) {\n this.hasDateFields = false;\n this.availableDateFields = [];\n this.timelineGroups = [];\n this.fallbackFromTimelineIfNeeded();\n return;\n }\n\n // Sort by priority: DefaultInView date fields first (by Sequence), then others (by Sequence)\n this.availableDateFields = this.sortDateFieldsByPriority(dateFields);\n this.hasDateFields = true;\n\n // Configure timeline with the best date field\n this.configureTimeline();\n }\n\n /**\n * If currently on timeline view but timeline is no longer available,\n * fall back to grid view\n */\n private fallbackFromTimelineIfNeeded(): void {\n if (this.effectiveViewMode === 'timeline' && !this.hasDateFields) {\n this.setViewMode('grid');\n }\n }\n\n /**\n * Sort date fields by priority:\n * 1. DefaultInView=true fields, sorted by Sequence (lowest first)\n * 2. Other date fields, sorted by Sequence (lowest first)\n */\n private sortDateFieldsByPriority(dateFields: EntityFieldInfo[]): EntityFieldInfo[] {\n const defaultInView = dateFields.filter(f => f.DefaultInView).sort((a, b) => a.Sequence - b.Sequence);\n const others = dateFields.filter(f => !f.DefaultInView).sort((a, b) => a.Sequence - b.Sequence);\n return [...defaultInView, ...others];\n }\n\n /**\n * Configure the timeline with the current date field and records\n */\n private configureTimeline(): void {\n if (!this.entity || !this.hasDateFields || this.availableDateFields.length === 0) {\n this.timelineGroups = [];\n return;\n }\n\n // Determine which date field to use\n const dateFieldName = this.getEffectiveTimelineDateField();\n this.selectedTimelineDateField = dateFieldName;\n\n // Apply timeline config if provided\n if (this.timelineConfig) {\n this.timelineSortOrder = (this.timelineConfig.sortOrder || 'desc') as TimelineSortOrder;\n this.timelineSegmentGrouping = (this.timelineConfig.segmentGrouping || 'month') as TimeSegmentGrouping;\n this.timelineOrientation = this.timelineConfig.orientation || 'vertical';\n }\n\n // Create a timeline group for the current entity's data\n this.updateTimelineGroups();\n }\n\n /**\n * Get the effective date field to use for timeline\n * Priority: timelineConfig > first available date field\n */\n private getEffectiveTimelineDateField(): string {\n // If we have a config with a specific date field, use it if valid\n if (this.timelineConfig?.dateFieldName) {\n const configField = this.availableDateFields.find(f => f.Name === this.timelineConfig!.dateFieldName);\n if (configField) {\n return configField.Name;\n }\n }\n\n // Otherwise use the first available date field (already sorted by priority)\n return this.availableDateFields[0].Name;\n }\n\n /**\n * Update timeline groups with current records\n * Called when records change\n */\n private updateTimelineGroups(): void {\n if (!this.entity || !this.selectedTimelineDateField) {\n this.timelineGroups = [];\n return;\n }\n\n // Find title field - prefer NameField, then first string field with DefaultInView\n const titleField = this.findTitleField();\n\n // Create a single group for the current data\n const group = new TimelineGroup<Record<string, unknown>>();\n group.DataSourceType = 'array';\n group.EntityObjects = this.filteredRecords;\n group.TitleFieldName = titleField;\n group.DateFieldName = this.selectedTimelineDateField;\n group.IdFieldName = 'ID';\n group.GroupLabel = this.entity.Name;\n\n // Find a suitable description field\n const descField = this.findDescriptionField();\n if (descField) {\n group.DescriptionFieldName = descField;\n }\n\n // Find a suitable subtitle field\n const subtitleField = this.findSubtitleField(titleField);\n if (subtitleField) {\n group.SubtitleFieldName = subtitleField;\n }\n\n // Configure card display\n group.CardConfig = {\n collapsible: true,\n defaultExpanded: false,\n showDate: true,\n dateFormat: 'MMM d, yyyy h:mm a'\n };\n\n this.timelineGroups = [group];\n }\n\n /**\n * Find the best field to use as the title\n */\n private findTitleField(): string {\n if (!this.entity) return 'ID';\n\n // Prefer the entity's NameField\n if (this.entity.NameField) {\n return this.entity.NameField.Name;\n }\n\n // Look for common name patterns in DefaultInView string fields\n const stringFields = this.entity.Fields.filter(\n f => f.TSType === EntityFieldTSType.String && f.DefaultInView && !f.Name.startsWith('__mj_')\n ).sort((a, b) => a.Sequence - b.Sequence);\n\n const namePatterns = ['name', 'title', 'subject', 'label'];\n for (const pattern of namePatterns) {\n const match = stringFields.find(f => f.Name.toLowerCase().includes(pattern));\n if (match) return match.Name;\n }\n\n // Fall back to first string field\n return stringFields.length > 0 ? stringFields[0].Name : 'ID';\n }\n\n /**\n * Find a suitable description field\n */\n private findDescriptionField(): string | null {\n if (!this.entity) return null;\n\n // Look for common description patterns\n const descPatterns = ['description', 'notes', 'summary', 'content', 'body', 'details'];\n const textFields = this.entity.Fields.filter(\n f => (f.TSType === EntityFieldTSType.String) && !f.Name.startsWith('__mj_')\n );\n\n for (const pattern of descPatterns) {\n const match = textFields.find(f => f.Name.toLowerCase().includes(pattern));\n if (match) return match.Name;\n }\n\n return null;\n }\n\n /**\n * Find a suitable subtitle field (different from title)\n */\n private findSubtitleField(excludeField: string): string | null {\n if (!this.entity) return null;\n\n // Look for status, type, category, or other short classification fields\n const patterns = ['status', 'type', 'category', 'state', 'priority'];\n const fields = this.entity.Fields.filter(\n f => f.TSType === EntityFieldTSType.String &&\n f.DefaultInView &&\n f.Name !== excludeField &&\n !f.Name.startsWith('__mj_')\n ).sort((a, b) => a.Sequence - b.Sequence);\n\n for (const pattern of patterns) {\n const match = fields.find(f => f.Name.toLowerCase().includes(pattern));\n if (match) return match.Name;\n }\n\n // Use the first string field that's not the title field\n const firstOther = fields.find(f => f.Name !== excludeField);\n return firstOther?.Name || null;\n }\n}\n\n","<div class=\"entity-viewer-container\" [style.height]=\"effectiveConfig.height\">\n <!-- Header -->\n @if (effectiveConfig.showFilter || effectiveConfig.showViewModeToggle || effectiveConfig.showRecordCount) {\n <div class=\"viewer-header\">\n <!-- Filter Input -->\n @if (effectiveConfig.showFilter) {\n <div class=\"filter-container\">\n <i class=\"fa-solid fa-search filter-icon\"></i>\n <input\n type=\"text\"\n class=\"filter-input\"\n [placeholder]=\"effectiveConfig.filterPlaceholder\"\n [value]=\"effectiveFilterText\"\n (input)=\"onFilterChange($any($event.target).value)\"\n />\n @if (effectiveFilterText) {\n <button class=\"clear-filter-btn\" (click)=\"clearFilter()\" title=\"Clear filter\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n }\n </div>\n }\n\n <!-- Record Count -->\n @if (effectiveConfig.showRecordCount && effectiveEntity) {\n <div class=\"record-count\">\n @if (filteredRecordCount !== totalRecordCount) {\n <span>{{ filteredRecordCount | number }} of {{ totalRecordCount | number }} records</span>\n } @else {\n <span>{{ totalRecordCount | number }} records</span>\n }\n </div>\n }\n\n <!-- View Mode Toggle -->\n @if (effectiveConfig.showViewModeToggle) {\n <div class=\"view-mode-toggle\">\n <button\n class=\"toggle-btn\"\n [class.active]=\"effectiveViewMode === 'grid'\"\n (click)=\"setViewMode('grid')\"\n title=\"Grid View\">\n <i class=\"fa-solid fa-list\"></i>\n </button>\n <button\n class=\"toggle-btn\"\n [class.active]=\"effectiveViewMode === 'cards'\"\n (click)=\"setViewMode('cards')\"\n title=\"Cards View\">\n <i class=\"fa-solid fa-grip\"></i>\n </button>\n @if (hasDateFields) {\n <button\n class=\"toggle-btn\"\n [class.active]=\"effectiveViewMode === 'timeline'\"\n (click)=\"setViewMode('timeline')\"\n title=\"Timeline View\">\n <i class=\"fa-solid fa-timeline\"></i>\n </button>\n }\n </div>\n }\n\n <!-- Timeline Controls (only shown when timeline is active) -->\n @if (effectiveViewMode === 'timeline' && hasDateFields) {\n <!-- Date Field Selector -->\n <div class=\"timeline-date-selector\">\n <i class=\"fa-solid fa-calendar-days\"></i>\n @if (availableDateFields.length === 1) {\n <span class=\"date-field-label\">{{ selectedDateFieldDisplayName }}</span>\n } @else {\n <select\n class=\"date-field-select\"\n [value]=\"selectedTimelineDateField\"\n (change)=\"setTimelineDateField($any($event.target).value)\">\n @for (field of availableDateFields; track field.Name) {\n <option [value]=\"field.Name\">{{ field.DisplayNameOrName }}</option>\n }\n </select>\n }\n </div>\n\n <!-- Orientation Toggle -->\n <div class=\"timeline-orientation-toggle\">\n <button\n class=\"toggle-btn\"\n (click)=\"toggleTimelineOrientation()\"\n [title]=\"timelineOrientation === 'vertical' ? 'Switch to Horizontal' : 'Switch to Vertical'\">\n <i [class]=\"timelineOrientation === 'vertical' ? 'fa-solid fa-ellipsis-vertical' : 'fa-solid fa-ellipsis'\"></i>\n </button>\n </div>\n\n <!-- Sort Order Toggle -->\n <div class=\"timeline-sort-toggle\">\n <button\n class=\"toggle-btn\"\n (click)=\"toggleTimelineSortOrder()\"\n [title]=\"timelineSortOrder === 'desc' ? 'Showing Newest First (click for Oldest First)' : 'Showing Oldest First (click for Newest First)'\">\n <i [class]=\"timelineSortOrder === 'desc' ? 'fa-solid fa-arrow-down-wide-short' : 'fa-solid fa-arrow-up-wide-short'\"></i>\n </button>\n </div>\n }\n </div>\n }\n\n <!-- Content -->\n <div class=\"viewer-content\">\n <!-- Loading container - full page when no data exists -->\n <div class=\"loading-container\" [hidden]=\"!(isLoading && filteredRecords.length === 0)\">\n <mj-loading [text]=\"loadingMessage\" size=\"medium\"></mj-loading>\n </div>\n\n <!-- Loading overlay - shown on top of content when loading with existing data -->\n <div class=\"loading-overlay\" [hidden]=\"!(isLoading && filteredRecords.length > 0)\">\n <mj-loading [text]=\"loadingMessage\" size=\"small\"></mj-loading>\n </div>\n\n <!-- Empty state: no entity selected -->\n <div class=\"empty-state\" [hidden]=\"!!effectiveEntity\">\n <i class=\"fa-solid fa-database\"></i>\n <p>Select an entity to view records</p>\n </div>\n\n <!-- Empty state: no records found -->\n <div class=\"empty-state\" [hidden]=\"!effectiveEntity || filteredRecords.length > 0 || isLoading\">\n <i class=\"fa-solid fa-inbox\"></i>\n <p>{{ debouncedFilterText ? 'No matching records' : 'No records found' }}</p>\n </div>\n\n <!-- Grid View - always rendered, visibility controlled by hidden -->\n <mj-entity-data-grid\n [hidden]=\"effectiveViewMode !== 'grid' || !effectiveEntity\"\n [Data]=\"filteredRecords\"\n [Params]=\"gridParams\"\n [FilterText]=\"debouncedFilterText\"\n [GridState]=\"gridState\"\n [Height]=\"'auto'\"\n [ShowToolbar]=\"showGridToolbar\"\n [ToolbarConfig]=\"effectiveGridToolbarConfig\"\n [SelectionMode]=\"gridSelectionMode\"\n [ShowAddToListButton]=\"showAddToListButton\"\n [AllowLoad]=\"false\"\n (AfterRowClick)=\"onDataGridRowClick($event)\"\n (AfterRowDoubleClick)=\"onDataGridRowDoubleClick($event)\"\n (AfterSort)=\"onDataGridSortChanged($event)\"\n (GridStateChanged)=\"onGridStateChanged($event)\"\n (SelectionChange)=\"onGridSelectionChange($event)\"\n (NewButtonClick)=\"onGridAddRequested()\"\n (RefreshButtonClick)=\"onGridRefreshRequested()\"\n (DeleteButtonClick)=\"onGridDeleteRequested($event)\"\n (ExportButtonClick)=\"onGridExportRequested()\"\n (AddToListRequested)=\"onGridAddToListRequested($event)\"\n (ForeignKeyClick)=\"onForeignKeyClick($event)\">\n </mj-entity-data-grid>\n\n <!-- Cards View - always rendered, visibility controlled by hidden -->\n <mj-entity-cards\n [hidden]=\"effectiveViewMode !== 'cards' || !effectiveEntity\"\n [entity]=\"effectiveEntity\"\n [records]=\"filteredRecords\"\n [selectedRecordId]=\"selectedRecordId\"\n [cardTemplate]=\"cardTemplate\"\n [hiddenFieldMatches]=\"hiddenFieldMatches\"\n [filterText]=\"debouncedFilterText\"\n (recordSelected)=\"onRecordSelected($event)\"\n (recordOpened)=\"onRecordOpened($event)\">\n </mj-entity-cards>\n\n <!-- Timeline View - always rendered when date fields exist, visibility controlled by hidden -->\n <mj-timeline\n [hidden]=\"effectiveViewMode !== 'timeline' || !hasDateFields\"\n [groups]=\"timelineGroups\"\n [orientation]=\"timelineOrientation\"\n [layout]=\"timelineOrientation === 'vertical' ? 'alternating' : 'single'\"\n [sortOrder]=\"timelineSortOrder\"\n [segmentGrouping]=\"timelineSegmentGrouping\"\n [segmentsCollapsible]=\"true\"\n [segmentsDefaultExpanded]=\"true\"\n [selectedEventId]=\"timelineSelectedEventId\"\n (afterEventClick)=\"onTimelineEventClick($event)\">\n </mj-timeline>\n </div>\n\n <!-- Pagination - only show when there's more data to load OR we've loaded more than one page -->\n @if (effectiveConfig.showPagination && effectiveEntity && (pagination.hasMore || pagination.totalRecords > effectiveConfig.pageSize)) {\n <mj-pagination\n [pagination]=\"pagination\"\n [loadedRecordCount]=\"filteredRecords.length\"\n (loadMore)=\"onLoadMore()\">\n </mj-pagination>\n }\n</div>\n"]}
|
|
1
|
+
{"version":3,"file":"entity-viewer.component.js","sourceRoot":"","sources":["../../../src/lib/entity-viewer/entity-viewer.component.ts","../../../src/lib/entity-viewer/entity-viewer.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, OnInit, OnDestroy, ChangeDetectorRef, ViewChild, NgZone } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { debounceTime, distinctUntilChanged, takeUntil } from 'rxjs/operators';\nimport { EntityInfo, EntityFieldInfo, EntityFieldTSType, RunView, RunViewParams, Metadata, CompositeKey } from '@memberjunction/core';\nimport { UUIDsEqual } from '@memberjunction/global';\nimport { MJUserViewEntityExtended } from '@memberjunction/core-entities';\nimport { buildCompositeKey, buildPkString, computeFieldsList } from '../utils/record.util';\nimport { TimelineGroup, TimeSegmentGrouping, TimelineSortOrder, AfterEventClickArgs } from '@memberjunction/ng-timeline';\nimport {\n EntityViewMode,\n EntityViewerConfig,\n DEFAULT_VIEWER_CONFIG,\n RecordSelectedEvent,\n RecordOpenedEvent,\n DataLoadedEvent,\n FilteredCountChangedEvent,\n CardTemplate,\n GridColumnDef,\n SortState,\n SortChangedEvent,\n PaginationState,\n ViewGridState,\n GridStateChangedEvent,\n TimelineSegmentGrouping,\n TimelineOrientation,\n TimelineState\n} from '../types';\nimport {\n AfterRowClickEventArgs,\n AfterRowDoubleClickEventArgs,\n AfterSortEventArgs\n} from '../entity-data-grid/events/grid-events';\nimport { GridToolbarConfig, GridSelectionMode, ForeignKeyClickEvent } from '../entity-data-grid/models/grid-types';\nimport { EntityDataGridComponent } from '../entity-data-grid/entity-data-grid.component';\n\n/**\n * EntityViewerComponent - Full-featured composite component for viewing entity data\n *\n * This component provides a complete data viewing experience with:\n * - Switchable grid (AG Grid) and card views\n * - Server-side filtering with UserSearchString\n * - Server-side pagination with StartRow/MaxRows\n * - Server-side sorting with OrderBy\n * - Selection handling with configurable behavior\n * - Loading, empty, and error states\n * - Beautiful pagination UI with \"Load More\" pattern\n *\n * @example\n * ```html\n * <!-- Basic usage - loads data automatically -->\n * <mj-entity-viewer\n * [entity]=\"selectedEntity\"\n * (recordSelected)=\"onRecordSelected($event)\"\n * (recordOpened)=\"onRecordOpened($event)\">\n * </mj-entity-viewer>\n *\n * <!-- With external state control (like Data Explorer) -->\n * <mj-entity-viewer\n * [entity]=\"selectedEntity\"\n * [(viewMode)]=\"state.viewMode\"\n * [filterText]=\"state.filterText\"\n * [selectedRecordId]=\"state.selectedRecordId\"\n * (recordSelected)=\"onRecordSelected($event)\"\n * (recordOpened)=\"onRecordOpened($event)\"\n * (sortChanged)=\"onSortChanged($event)\">\n * </mj-entity-viewer>\n * ```\n */\n@Component({\n standalone: false,\n selector: 'mj-entity-viewer',\n templateUrl: './entity-viewer.component.html',\n styleUrls: ['./entity-viewer.component.css'],\n host: {\n 'style': 'display: block; height: 100%;'\n }\n})\nexport class EntityViewerComponent implements OnInit, OnDestroy {\n // ========================================\n // INPUTS (using getter/setter pattern)\n // ========================================\n\n private _entity: EntityInfo | null = null;\n private _records: Record<string, unknown>[] | null = null;\n private _config: Partial<EntityViewerConfig> = {};\n private _viewMode: EntityViewMode | null = null;\n private _filterText: string | null = null;\n private _sortState: SortState | null = null;\n private _viewEntity: MJUserViewEntityExtended | null = null;\n private _timelineConfig: TimelineState | null = null;\n private _initialized = false;\n\n /**\n * The entity to display records for\n */\n @Input()\n get entity(): EntityInfo | null {\n return this._entity;\n }\n set entity(value: EntityInfo | null) {\n const previousEntity = this._entity;\n this._entity = value;\n\n // Detect date fields for timeline support\n this.detectDateFields();\n\n if (this._initialized) {\n // If entity changed to a different entity, clear stale view entity\n // that belongs to the old entity (its WhereClause, SortState, etc. reference old fields)\n if (value && previousEntity && !UUIDsEqual(value.ID, previousEntity.ID)) {\n if (this._viewEntity && !UUIDsEqual(this._viewEntity.EntityID, value.ID)) {\n this._viewEntity = null;\n }\n }\n\n if (value && !this._records) {\n // Reset state for new entity - synchronously clear all data and force change detection\n // before starting the async load to prevent stale data display\n this.resetPaginationState();\n this.cdr.detectChanges();\n this.loadData();\n } else if (!value) {\n this.internalRecords = [];\n this.totalRecordCount = 0;\n this.filteredRecordCount = 0;\n this.resetPaginationState();\n this.cdr.detectChanges();\n }\n }\n }\n\n /**\n * Pre-loaded records (optional - if not provided, component loads data)\n */\n @Input()\n get records(): Record<string, unknown>[] | null {\n return this._records;\n }\n set records(value: Record<string, unknown>[] | null) {\n this._records = value;\n\n if (value) {\n this.internalRecords = value;\n this.totalRecordCount = value.length;\n this.filteredRecordCount = value.length;\n // Update timeline with new records\n this.updateTimelineGroups();\n }\n }\n\n /**\n * Configuration options for the viewer\n */\n @Input()\n get config(): Partial<EntityViewerConfig> {\n return this._config;\n }\n set config(value: Partial<EntityViewerConfig>) {\n this._config = value;\n this.applyConfig();\n }\n\n /**\n * Currently selected record ID (primary key string)\n */\n @Input() selectedRecordId: string | null = null;\n\n /**\n * External view mode - allows parent to control view mode\n * Supports two-way binding: [(viewMode)]=\"state.viewMode\"\n */\n @Input()\n get viewMode(): EntityViewMode | null {\n return this._viewMode;\n }\n set viewMode(value: EntityViewMode | null) {\n this._viewMode = value;\n if (value !== null) {\n this.internalViewMode = value;\n }\n }\n\n /**\n * External filter text - allows parent to control filter\n * Supports two-way binding: [(filterText)]=\"state.filterText\"\n */\n @Input()\n get filterText(): string | null {\n return this._filterText;\n }\n set filterText(value: string | null) {\n const oldFilter = this.debouncedFilterText;\n this._filterText = value;\n\n const newFilter = value ?? '';\n this.internalFilterText = newFilter;\n this.debouncedFilterText = newFilter;\n\n if (this._initialized) {\n // If server-side filtering and filter changed, reload from page 1\n // Keep existing records visible during refresh for better UX\n if (this.effectiveConfig.serverSideFiltering && newFilter !== oldFilter && !this._records) {\n this.resetPaginationState(false);\n this.loadData();\n } else {\n this.updateFilteredCount();\n }\n this.cdr.detectChanges();\n }\n }\n\n /**\n * External sort state - allows parent to control sorting\n */\n @Input()\n get sortState(): SortState | null {\n return this._sortState;\n }\n set sortState(value: SortState | null) {\n const oldSort = this.internalSortState;\n this._sortState = value;\n\n if (value !== null) {\n this.internalSortState = value;\n\n if (this._initialized) {\n // If sort changed and using server-side sorting, reload\n // Keep existing records visible during refresh for better UX\n if (this.effectiveConfig.serverSideSorting && !this._records) {\n const sortChanged = !oldSort || !value ||\n oldSort.field !== value.field ||\n oldSort.direction !== value.direction;\n\n if (sortChanged) {\n this.resetPaginationState(false);\n this.loadData();\n }\n }\n }\n }\n }\n\n /**\n * Custom grid column definitions\n */\n @Input() gridColumns: GridColumnDef[] = [];\n\n /**\n * Custom card template\n */\n @Input() cardTemplate: CardTemplate | null = null;\n\n /**\n * Optional User View entity that provides view configuration\n * When provided, the component will use the view's WhereClause, GridState, SortState, etc.\n * The view's filter is additive - UserSearchString is applied ON TOP of the view's WhereClause\n */\n @Input()\n get viewEntity(): MJUserViewEntityExtended | null {\n return this._viewEntity;\n }\n set viewEntity(value: MJUserViewEntityExtended | null) {\n this._viewEntity = value;\n\n if (this._initialized && this._entity && !this._records) {\n // Apply view's sort state if available, then reset pagination and reload\n this.applySortStateFromView(value);\n this.resetPaginationState();\n this.loadData();\n }\n }\n\n /**\n * Grid state configuration from a User View\n * Controls column visibility, widths, order, and sort settings\n */\n @Input() gridState: ViewGridState | null = null;\n\n /**\n * Timeline configuration state\n * Controls which date field is used and segment grouping\n */\n @Input()\n get timelineConfig(): TimelineState | null {\n return this._timelineConfig;\n }\n set timelineConfig(value: TimelineState | null) {\n const prev = this._timelineConfig;\n // Compare by value, not reference\n const isEqual = (prev === null && value === null) ||\n (prev !== null && value !== null &&\n prev.dateFieldName === value.dateFieldName &&\n prev.sortOrder === value.sortOrder &&\n prev.orientation === value.orientation &&\n prev.segmentGrouping === value.segmentGrouping);\n\n if (!isEqual) {\n this._timelineConfig = value;\n if (value && this._entity) {\n this.configureTimeline();\n this.cdr.markForCheck();\n }\n }\n }\n\n /**\n * Whether to show the grid toolbar.\n * When false, the grid is displayed without its own toolbar - useful when\n * entity-viewer provides its own filter/actions in the header.\n * @default false\n */\n @Input() showGridToolbar: boolean = false;\n\n /**\n * Grid toolbar configuration - controls which buttons are shown and their behavior\n * When not provided, uses sensible defaults\n */\n @Input() gridToolbarConfig: Partial<GridToolbarConfig> | null = null;\n\n /**\n * Grid selection mode\n * @default 'single'\n */\n @Input() gridSelectionMode: GridSelectionMode = 'single';\n\n /**\n * Show the \"Add to List\" button in the grid toolbar.\n * Requires gridSelectionMode to be 'multiple' for best UX.\n * @default false\n */\n @Input() showAddToListButton: boolean = false;\n\n // ========================================\n // OUTPUTS\n // ========================================\n\n /**\n * Emitted when a record is selected (single click)\n */\n @Output() recordSelected = new EventEmitter<RecordSelectedEvent>();\n\n /**\n * Emitted when a record should be opened (double-click or open button)\n */\n @Output() recordOpened = new EventEmitter<RecordOpenedEvent>();\n\n /**\n * Emitted when data is loaded\n */\n @Output() dataLoaded = new EventEmitter<DataLoadedEvent>();\n\n /**\n * Emitted when the view mode changes (for two-way binding)\n */\n @Output() viewModeChange = new EventEmitter<EntityViewMode>();\n\n /**\n * Emitted when filter text changes (for two-way binding)\n */\n @Output() filterTextChange = new EventEmitter<string>();\n\n /**\n * Emitted when filtered count changes\n */\n @Output() filteredCountChanged = new EventEmitter<FilteredCountChangedEvent>();\n\n /**\n * Emitted when sort state changes\n */\n @Output() sortChanged = new EventEmitter<SortChangedEvent>();\n\n /**\n * Emitted when grid state changes (column resize, reorder, etc.)\n */\n @Output() gridStateChanged = new EventEmitter<GridStateChangedEvent>();\n\n /**\n * Emitted when timeline configuration changes (date field, grouping, etc.)\n */\n @Output() timelineConfigChange = new EventEmitter<TimelineState>();\n\n /**\n * Emitted when the Add/New button is clicked in the grid toolbar\n */\n @Output() addRequested = new EventEmitter<void>();\n\n /**\n * Emitted when the Delete button is clicked in the grid toolbar\n * Includes the selected records to be deleted\n */\n @Output() deleteRequested = new EventEmitter<{ records: Record<string, unknown>[] }>();\n\n /**\n * Emitted when the Refresh button is clicked in the grid toolbar\n */\n @Output() refreshRequested = new EventEmitter<void>();\n\n /**\n * Emitted when the Export button is clicked in the grid toolbar\n */\n @Output() exportRequested = new EventEmitter<{ format: 'excel' | 'csv' | 'json' }>();\n\n /**\n * Emitted when the Add to List button is clicked in the grid toolbar.\n * Parent components should handle this to show the list management dialog.\n */\n @Output() addToListRequested = new EventEmitter<{\n entityInfo: EntityInfo;\n records: Record<string, unknown>[];\n recordIds: string[];\n }>();\n\n /**\n * Emitted when grid selection changes.\n * Parent components can use this to track selected records for their own toolbar buttons.\n */\n @Output() selectionChanged = new EventEmitter<{\n records: Record<string, unknown>[];\n recordIds: string[];\n }>();\n\n // ========================================\n // INTERNAL STATE\n // ========================================\n\n public internalViewMode: EntityViewMode = 'grid';\n public internalFilterText: string = '';\n public debouncedFilterText: string = '';\n public isLoading: boolean = false;\n public loadingMessage: string = 'Loading...';\n public internalRecords: Record<string, unknown>[] = [];\n public totalRecordCount: number = 0;\n public filteredRecordCount: number = 0;\n\n /** Track which records matched on hidden (non-visible) fields */\n public hiddenFieldMatches = new Map<string, string>();\n\n /** Current sort state */\n public internalSortState: SortState | null = null;\n\n /** Cached grid params to avoid recreating object on every change detection */\n private _cachedGridParams: RunViewParams | null = null;\n private _lastGridParamsEntity: string | null = null;\n private _lastGridParamsViewEntity: MJUserViewEntityExtended | null = null;\n\n /** Pagination state */\n public pagination: PaginationState = {\n currentPage: 0,\n pageSize: 100,\n totalRecords: 0,\n hasMore: false,\n isLoading: false\n };\n\n // ========================================\n // TIMELINE STATE\n // ========================================\n\n /** Whether the current entity has date fields available for timeline view */\n public hasDateFields: boolean = false;\n\n /** Available date fields from the entity (sorted by priority) */\n public availableDateFields: EntityFieldInfo[] = [];\n\n /** Timeline groups configuration for the timeline component */\n get timelineGroups(): TimelineGroup<Record<string, unknown>>[] {\n return this._timelineGroups;\n }\n set timelineGroups(value: TimelineGroup<Record<string, unknown>>[]) {\n const prev = this._timelineGroups;\n this._timelineGroups = value;\n\n // Detect meaningful changes to trigger refresh in child timeline component\n const hasChanged = prev !== value ||\n (prev.length > 0 && value.length > 0 &&\n (prev[0].EntityObjects !== value[0]?.EntityObjects ||\n prev[0].DateFieldName !== value[0]?.DateFieldName));\n\n if (hasChanged) {\n // Force change detection to propagate to child timeline component\n this.cdr.markForCheck();\n }\n }\n private _timelineGroups: TimelineGroup<Record<string, unknown>>[] = [];\n\n /** Timeline sort order */\n public timelineSortOrder: TimelineSortOrder = 'desc';\n\n /** Timeline segment grouping */\n public timelineSegmentGrouping: TimeSegmentGrouping = 'month';\n\n /** Timeline orientation (vertical or horizontal) */\n public timelineOrientation: TimelineOrientation = 'vertical';\n\n /** Currently selected date field for timeline */\n public selectedTimelineDateField: string | null = null;\n\n private destroy$ = new Subject<void>();\n private filterInput$ = new Subject<string>();\n\n /** Track if this is the first load (vs. load more) */\n private isInitialLoad: boolean = true;\n\n /** Reference to the data grid component for flushing pending changes */\n @ViewChild(EntityDataGridComponent) private dataGridRef: EntityDataGridComponent | undefined;\n\n constructor(private cdr: ChangeDetectorRef, private ngZone: NgZone) {}\n\n // ========================================\n // PUBLIC METHODS\n // ========================================\n\n /**\n * Ensures any pending grid state changes are saved immediately without waiting for debounce.\n * Call this before switching views or entities to ensure changes are saved.\n */\n public EnsurePendingChangesSaved(): void {\n this.dataGridRef?.EnsurePendingChangesSaved();\n }\n\n // ========================================\n // COMPUTED PROPERTIES\n // ========================================\n\n /**\n * Get the effective entity - uses entity input if provided, otherwise derives from viewEntity\n * This allows callers to provide just a viewEntity without explicitly setting the entity input.\n * Uses fallback resolution when ViewEntityInfo is not available.\n */\n get effectiveEntity(): EntityInfo | null {\n if (this.entity) {\n return this.entity;\n }\n // Auto-derive from viewEntity if available\n if (this.viewEntity) {\n return this.getEntityInfoFromViewEntity(this.viewEntity);\n }\n return null;\n }\n\n /**\n * Gets EntityInfo from a ViewEntity with multiple fallback strategies.\n * Priority: 1) ViewEntityInfo property (set by Load)\n * 2) Entity name lookup (virtual field)\n * 3) EntityID lookup\n * Returns null if entity cannot be determined.\n */\n private getEntityInfoFromViewEntity(viewEntity: MJUserViewEntityExtended): EntityInfo | null {\n // First try: ViewEntityInfo is the preferred source (set by MJUserViewEntityExtended.Load)\n if (viewEntity.ViewEntityInfo) {\n return viewEntity.ViewEntityInfo;\n }\n\n const md = new Metadata();\n\n // Second try: Look up by Entity name (virtual field that returns entity name)\n if (viewEntity.Entity) {\n const entityByName = md.Entities.find(e => e.Name === viewEntity.Entity);\n if (entityByName) {\n return entityByName;\n }\n }\n\n // Third try: Look up by EntityID\n if (viewEntity.EntityID) {\n const entityById = md.Entities.find(e => UUIDsEqual(e.ID, viewEntity.EntityID));\n if (entityById) {\n return entityById;\n }\n }\n\n console.warn(`[EntityViewer] Could not determine entity for view \"${viewEntity.Name}\" (ID: ${viewEntity.ID})`);\n return null;\n }\n\n /**\n * Get the effective view mode (external or internal)\n */\n get effectiveViewMode(): EntityViewMode {\n return this.viewMode ?? this.internalViewMode;\n }\n\n /**\n * Get the effective filter text (external or internal)\n */\n get effectiveFilterText(): string {\n return this.filterText ?? this.internalFilterText;\n }\n\n /**\n * Get the raw ID value from selectedRecordId for timeline selection.\n * The selectedRecordId is in composite key format (e.g., \"ID|abc-123\" or \"ID=abc-123\"),\n * but the timeline stores just the raw ID value.\n */\n get timelineSelectedEventId(): string | null {\n if (!this.selectedRecordId) return null;\n\n // Handle \"ID|value\" format (pipe separator)\n if (this.selectedRecordId.includes('|')) {\n const parts = this.selectedRecordId.split('|');\n return parts.length > 1 ? parts[1] : this.selectedRecordId;\n }\n\n // Handle \"ID=value\" format (equals separator)\n if (this.selectedRecordId.includes('=')) {\n const parts = this.selectedRecordId.split('=');\n return parts.length > 1 ? parts[1] : this.selectedRecordId;\n }\n\n // Return as-is if no separator found\n return this.selectedRecordId;\n }\n\n /**\n * Get the effective sort state (external or internal)\n */\n get effectiveSortState(): SortState | null {\n return this.sortState ?? this.internalSortState;\n }\n\n /**\n * Get the OrderBy string for mj-entity-data-grid from the effective sort state\n */\n get effectiveSortOrderBy(): string {\n const sortState = this.effectiveSortState;\n if (!sortState?.field || !sortState.direction) {\n return '';\n }\n return `${sortState.field} ${sortState.direction.toUpperCase()}`;\n }\n\n /**\n * Get merged configuration with defaults\n */\n get effectiveConfig(): Required<EntityViewerConfig> {\n return { ...DEFAULT_VIEWER_CONFIG, ...this.config };\n }\n\n /**\n * Get cached grid params - only recreates object when entity or viewEntity changes\n * This prevents Angular from seeing a new object reference on every change detection\n * which would cause the grid to reinitialize\n */\n get gridParams(): RunViewParams | null {\n const entity = this.effectiveEntity;\n if (!entity) {\n return null;\n }\n\n // Check if we need to recreate the params object\n const entityChanged = this._lastGridParamsEntity !== entity.Name;\n const viewEntityChanged = this._lastGridParamsViewEntity !== this.viewEntity;\n\n if (entityChanged || viewEntityChanged || !this._cachedGridParams) {\n this._lastGridParamsEntity = entity.Name;\n this._lastGridParamsViewEntity = this.viewEntity ?? null;\n this._cachedGridParams = {\n EntityName: entity.Name,\n ViewEntity: this.viewEntity || undefined\n };\n }\n\n return this._cachedGridParams;\n }\n\n /**\n * Get the effective grid toolbar configuration\n * Merges user-provided config with defaults appropriate for entity-viewer context\n */\n get effectiveGridToolbarConfig(): GridToolbarConfig {\n const defaults: GridToolbarConfig = {\n showSearch: false, // Entity-viewer has its own filter\n showRefresh: true,\n showAdd: true,\n showDelete: true,\n showExport: true,\n showColumnChooser: true,\n showRowCount: true,\n showSelectionCount: true\n };\n return { ...defaults, ...this.gridToolbarConfig };\n }\n\n /**\n * Get the records to display (external or internal)\n */\n get displayRecords(): Record<string, unknown>[] {\n return this.records ?? this.internalRecords;\n }\n\n /**\n * Get filtered records - when using server-side filtering, records are already filtered\n * When using client-side filtering, apply filter locally\n */\n get filteredRecords(): Record<string, unknown>[] {\n const records = this.displayRecords;\n\n // If server-side filtering is enabled, records are already filtered\n if (this.effectiveConfig.serverSideFiltering) {\n return records;\n }\n\n // Client-side filtering fallback\n const filterText = this.debouncedFilterText?.trim().toLowerCase();\n this.hiddenFieldMatches.clear();\n\n if (!filterText || !this.entity) {\n return records;\n }\n\n const visibleFields = this.getVisibleFieldNames();\n\n return records.filter(record => {\n const matchResult = this.recordMatchesFilter(record, filterText, visibleFields);\n if (matchResult.matches && matchResult.matchedField && !matchResult.matchedInVisibleField) {\n const recordKey = buildPkString(record, this.entity!);\n this.hiddenFieldMatches.set(recordKey, matchResult.matchedField);\n }\n return matchResult.matches;\n });\n }\n\n /**\n * Check if a record matches the filter text (client-side)\n */\n private recordMatchesFilter(\n record: Record<string, unknown>,\n filterText: string,\n visibleFields: Set<string>\n ): { matches: boolean; matchedField: string | null; matchedInVisibleField: boolean } {\n if (!this.entity) return { matches: true, matchedField: null, matchedInVisibleField: false };\n\n let matchedField: string | null = null;\n let matchedInVisibleField = false;\n\n for (const field of this.entity.Fields) {\n if (!this.shouldSearchField(field)) continue;\n\n const value = record[field.Name];\n if (value == null) continue;\n\n const stringValue = String(value).toLowerCase();\n if (this.matchesSearchTerm(stringValue, filterText)) {\n matchedField = field.Name;\n if (visibleFields.has(field.Name)) {\n matchedInVisibleField = true;\n break;\n }\n }\n }\n\n return {\n matches: matchedField !== null,\n matchedField,\n matchedInVisibleField\n };\n }\n\n /**\n * Determine if a field should be included in search\n */\n private shouldSearchField(field: EntityFieldInfo): boolean {\n if (field.Name.startsWith('__mj_')) return false;\n if (field.TSType === 'Date') return false;\n if (field.SQLFullType?.trim().toLowerCase() === 'uniqueidentifier') return false;\n return true;\n }\n\n /**\n * Check if a value matches the search term (supports SQL-style % wildcards)\n */\n private matchesSearchTerm(value: string, searchTerm: string): boolean {\n if (!searchTerm.includes('%')) {\n return value.includes(searchTerm);\n }\n\n const fragments = searchTerm.split('%').filter(s => s.length > 0);\n if (fragments.length === 0) return true;\n\n let searchStartIndex = 0;\n for (const fragment of fragments) {\n const foundIndex = value.indexOf(fragment, searchStartIndex);\n if (foundIndex === -1) return false;\n searchStartIndex = foundIndex + fragment.length;\n }\n return true;\n }\n\n /**\n * Get set of field names that are visible in the current view\n */\n private getVisibleFieldNames(): Set<string> {\n const visible = new Set<string>();\n if (!this.entity) return visible;\n\n for (const field of this.entity.Fields) {\n if (field.DefaultInView === true) {\n visible.add(field.Name);\n }\n }\n\n if (this.entity.NameField) {\n visible.add(this.entity.NameField.Name);\n }\n\n return visible;\n }\n\n /**\n * Check if a record matched on a hidden field\n */\n public hasHiddenFieldMatch(record: Record<string, unknown>): boolean {\n if (!this.debouncedFilterText || !this.entity) return false;\n return this.hiddenFieldMatches.has(buildPkString(record, this.entity));\n }\n\n /**\n * Get the name of the hidden field that matched for display\n */\n public getHiddenMatchFieldName(record: Record<string, unknown>): string {\n if (!this.entity) return '';\n const fieldName = this.hiddenFieldMatches.get(buildPkString(record, this.entity));\n if (!fieldName || !this.entity) return '';\n const field = this.entity.Fields.find(f => f.Name === fieldName);\n return field ? field.DisplayNameOrName : fieldName;\n }\n\n // ========================================\n // LIFECYCLE HOOKS\n // ========================================\n\n ngOnInit(): void {\n this.applyConfig();\n this.setupFilterDebounce();\n\n // Initialize debounced filter from external filter text if provided\n if (this.filterText !== null) {\n this.debouncedFilterText = this.filterText;\n }\n\n // Initialize sort state from config\n if (this.effectiveConfig.defaultSortField) {\n this.internalSortState = {\n field: this.effectiveConfig.defaultSortField,\n direction: this.effectiveConfig.defaultSortDirection ?? 'asc'\n };\n }\n\n // Mark as initialized - setters will now trigger data loading\n this._initialized = true;\n\n // If viewEntity was set before initialization, extract its sort state now.\n // The viewEntity setter skips this when _initialized is false.\n if (this._viewEntity) {\n this.applySortStateFromView(this._viewEntity);\n }\n\n // If entity was set before initialization, load data now\n if (this._entity && !this._records) {\n this.loadData();\n }\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n // ========================================\n // CONFIGURATION\n // ========================================\n\n /**\n * Extracts sort state from a view entity, checking ViewSortInfo first then\n * falling back to GridState.sortSettings. Resets internalSortState if the\n * view has no sort defined (prevents stale sort from a previous view).\n */\n private applySortStateFromView(view: MJUserViewEntityExtended | null): void {\n if (!view) {\n this.internalSortState = null;\n return;\n }\n\n // Priority 1: SortState column (via ViewSortInfo)\n const viewSortInfo = view.ViewSortInfo;\n if (viewSortInfo && viewSortInfo.length > 0) {\n this.internalSortState = {\n field: viewSortInfo[0].field,\n direction: viewSortInfo[0].direction?.toLowerCase() === 'desc' ? 'desc' : 'asc'\n };\n return;\n }\n\n // Priority 2: GridState.sortSettings (sort may only be stored here)\n if (view.GridState) {\n try {\n const gridState = JSON.parse(view.GridState) as ViewGridState;\n if (gridState.sortSettings && gridState.sortSettings.length > 0) {\n const firstSort = gridState.sortSettings[0];\n this.internalSortState = {\n field: firstSort.field,\n direction: firstSort.dir === 'desc' ? 'desc' : 'asc'\n };\n return;\n }\n } catch {\n // Invalid GridState JSON — ignore\n }\n }\n\n // No sort defined — reset to prevent stale sort from previous view\n this.internalSortState = null;\n }\n\n private applyConfig(): void {\n const config = this.effectiveConfig;\n this.pagination.pageSize = config.pageSize;\n\n if (this.viewMode === null) {\n this.internalViewMode = config.defaultViewMode;\n }\n }\n\n private setupFilterDebounce(): void {\n this.filterInput$\n .pipe(\n debounceTime(this.effectiveConfig.filterDebounceMs),\n distinctUntilChanged(),\n takeUntil(this.destroy$)\n )\n .subscribe(filterText => {\n const oldFilter = this.debouncedFilterText;\n this.debouncedFilterText = filterText;\n this.filterTextChange.emit(filterText);\n\n // If server-side filtering and filter changed, reload from page 1\n // Keep existing records visible during refresh for better UX\n if (this.effectiveConfig.serverSideFiltering && filterText !== oldFilter && !this.records) {\n this.resetPaginationState(false);\n this.loadData();\n } else {\n this.updateFilteredCount();\n }\n this.cdr.detectChanges();\n });\n }\n\n /**\n * Update the filtered record count and emit event\n */\n private updateFilteredCount(): void {\n const newCount = this.filteredRecords.length;\n if (this.filteredRecordCount !== newCount) {\n this.filteredRecordCount = newCount;\n this.filteredCountChanged.emit({\n filteredCount: newCount,\n totalCount: this.totalRecordCount\n });\n }\n }\n\n /**\n * Reset pagination state for a fresh load.\n * When clearRecords is true (default), clears all record data - use for entity switches.\n * When clearRecords is false, keeps existing records visible during refresh - use for sort/filter changes.\n */\n private resetPaginationState(clearRecords: boolean = true): void {\n this.pagination = {\n currentPage: 0,\n pageSize: this.effectiveConfig.pageSize,\n totalRecords: clearRecords ? 0 : this.pagination.totalRecords,\n hasMore: false,\n isLoading: false\n };\n if (clearRecords) {\n this.internalRecords = [];\n this.totalRecordCount = 0;\n this.filteredRecordCount = 0;\n }\n this.isInitialLoad = true;\n }\n\n // ========================================\n // DATA LOADING\n // ========================================\n\n // Sequence counter for tracking load requests and detecting stale responses\n private _loadSequence = 0;\n // Flag to indicate a reload is pending (requested while another load was in progress)\n private _pendingReload = false;\n\n /**\n * Load data for the current entity with server-side filtering/sorting/pagination\n */\n public async loadData(): Promise<void> {\n const entity = this.effectiveEntity;\n if (!entity) {\n this.internalRecords = [];\n this.totalRecordCount = 0;\n this.filteredRecordCount = 0;\n return;\n }\n\n // Increment sequence to track this load request\n const loadId = ++this._loadSequence;\n\n // If a load is already in progress, mark that we need to reload when it completes\n // This handles the case where view/filter changes occur during an active load\n if (this.isLoading) {\n this._pendingReload = true;\n return;\n }\n\n this.isLoading = true;\n this.pagination.isLoading = true;\n this.loadingMessage = this.isInitialLoad\n ? `Loading ${entity.Name}...`\n : 'Loading more records...';\n this.cdr.detectChanges();\n\n const startTime = Date.now();\n const config = this.effectiveConfig;\n\n try {\n const rv = new RunView();\n\n // Build OrderBy clause\n // Priority: 1) External sort state 2) View's OrderByClause 3) undefined\n let orderBy: string | undefined;\n const sortState = this.effectiveSortState;\n if (config.serverSideSorting && sortState?.field && sortState.direction) {\n orderBy = `${sortState.field} ${sortState.direction.toUpperCase()}`;\n } else if (this.viewEntity?.OrderByClause) {\n orderBy = this.viewEntity.OrderByClause;\n }\n\n // Calculate StartRow for pagination\n const startRow = this.pagination.currentPage * config.pageSize;\n\n // Build ExtraFilter from view's WhereClause if available\n // The view's WhereClause is the \"business filter\" - UserSearchString is additive\n const extraFilter = this.viewEntity?.WhereClause || undefined;\n\n const result = await rv.RunView<Record<string, unknown>>({\n EntityName: entity.Name,\n ResultType: 'simple',\n Fields: computeFieldsList(entity, this.gridState),\n MaxRows: config.pageSize,\n StartRow: startRow,\n OrderBy: orderBy,\n ExtraFilter: extraFilter,\n // Only use UserSearchString for regular text search, NOT for smart filters\n // Smart filters generate WhereClause via AI on the server, so the prompt text should not be passed as UserSearchString\n UserSearchString: config.serverSideFiltering && !this.viewEntity?.SmartFilterEnabled\n ? this.debouncedFilterText || undefined\n : undefined\n });\n\n // Check if this load is still the current one (detect stale responses)\n if (loadId !== this._loadSequence) {\n return;\n }\n\n if (result.Success) {\n\n // Append or replace records based on whether this is initial load\n if (this.isInitialLoad) {\n this.internalRecords = result.Results;\n } else {\n this.internalRecords = [...this.internalRecords, ...result.Results];\n }\n\n this.totalRecordCount = result.TotalRowCount;\n this.filteredRecordCount = this.internalRecords.length;\n\n // Update pagination state\n this.pagination.totalRecords = result.TotalRowCount;\n this.pagination.hasMore = this.internalRecords.length < result.TotalRowCount;\n\n this.dataLoaded.emit({\n totalRowCount: result.TotalRowCount,\n loadedRowCount: this.internalRecords.length,\n loadTime: Date.now() - startTime,\n records: this.internalRecords\n });\n\n this.filteredCountChanged.emit({\n filteredCount: this.internalRecords.length,\n totalCount: result.TotalRowCount\n });\n\n // Update timeline groups with new data\n this.updateTimelineGroups();\n } else {\n if (this.isInitialLoad) {\n this.internalRecords = [];\n }\n this.totalRecordCount = 0;\n this.filteredRecordCount = 0;\n }\n } catch (error) {\n if (this.isInitialLoad) {\n this.internalRecords = [];\n }\n this.totalRecordCount = 0;\n this.filteredRecordCount = 0;\n } finally {\n // Use ngZone.run() to ensure state changes trigger change detection.\n // With es2022 native async/await + zone.js 0.16, the await resumes\n // outside Angular's zone, so detectChanges() alone may not flush properly.\n this.ngZone.run(() => {\n this.isLoading = false;\n this.pagination.isLoading = false;\n this.isInitialLoad = false;\n this.cdr.detectChanges();\n });\n\n // If a reload was requested while we were loading, trigger it now\n if (this._pendingReload) {\n this._pendingReload = false;\n this.resetPaginationState();\n // Use setTimeout to break the call stack and allow Angular to process\n setTimeout(() => this.loadData(), 0);\n }\n }\n }\n\n /**\n * Load more records (next page)\n */\n public loadMore(): void {\n if (this.pagination.isLoading || !this.pagination.hasMore) {\n return;\n }\n\n this.pagination.currentPage++;\n this.loadData();\n }\n\n /**\n * Refresh data (re-load from server, starting at page 1)\n * Keeps existing records visible during refresh for better UX\n */\n public refresh(): void {\n if (!this.records) {\n this.resetPaginationState(false);\n this.loadData();\n }\n }\n\n // ========================================\n // VIEW MODE\n // ========================================\n\n /**\n * Set the view mode and emit change event\n */\n setViewMode(mode: EntityViewMode): void {\n if (this.effectiveViewMode !== mode) {\n this.internalViewMode = mode;\n this.viewModeChange.emit(mode);\n this.cdr.detectChanges();\n }\n }\n\n // ========================================\n // FILTERING\n // ========================================\n\n /**\n * Handle filter input change\n */\n onFilterChange(value: string): void {\n this.internalFilterText = value;\n this.filterInput$.next(value);\n }\n\n /**\n * Clear the filter\n */\n clearFilter(): void {\n this.internalFilterText = '';\n this.filterInput$.next('');\n this.cdr.detectChanges();\n }\n\n // ========================================\n // SORTING\n // ========================================\n\n /**\n * Handle sort change from grid component\n */\n onSortChanged(event: SortChangedEvent): void {\n const oldSort = this.internalSortState;\n this.internalSortState = event.sort;\n this.sortChanged.emit(event);\n\n // If server-side sorting, reload from page 1\n // Keep existing records visible during refresh for better UX\n if (this.effectiveConfig.serverSideSorting && !this.records) {\n const sortChanged = !oldSort || !event.sort ||\n oldSort.field !== event.sort?.field ||\n oldSort.direction !== event.sort?.direction;\n\n if (sortChanged) {\n this.resetPaginationState(false);\n this.loadData();\n }\n }\n }\n\n // ========================================\n // EVENT HANDLERS\n // ========================================\n\n /**\n * Handle record selection from child components (grid or cards)\n */\n onRecordSelected(event: RecordSelectedEvent): void {\n this.recordSelected.emit(event);\n }\n\n /**\n * Handle record opened from child components (grid or cards)\n */\n onRecordOpened(event: RecordOpenedEvent): void {\n this.recordOpened.emit(event);\n }\n\n /**\n * Handle grid state changes (column resize, reorder, etc.)\n */\n onGridStateChanged(event: GridStateChangedEvent): void {\n this.gridStateChanged.emit(event);\n }\n\n /**\n * Handle load more from pagination component\n */\n onLoadMore(): void {\n this.loadMore();\n }\n\n // ========================================\n // DATA GRID EVENT HANDLERS\n // ========================================\n\n /**\n * Handle row click from mj-entity-data-grid\n * Maps to recordSelected event for parent components\n */\n onDataGridRowClick(event: AfterRowClickEventArgs): void {\n const entity = this.effectiveEntity;\n if (!entity || !event.row) return;\n\n this.recordSelected.emit({\n record: event.row,\n entity: entity,\n compositeKey: buildCompositeKey(event.row, entity)\n });\n }\n\n /**\n * Handle row double-click from mj-entity-data-grid\n * Maps to recordOpened event for parent components\n */\n onDataGridRowDoubleClick(event: AfterRowDoubleClickEventArgs): void {\n const entity = this.effectiveEntity;\n if (!entity || !event.row) return;\n\n this.recordOpened.emit({\n record: event.row,\n entity: entity,\n compositeKey: buildCompositeKey(event.row, entity)\n });\n }\n\n /**\n * Handle sort changed from mj-entity-data-grid\n * Maps to sortChanged event for parent components\n */\n onDataGridSortChanged(event: AfterSortEventArgs): void {\n // Convert the data grid's sort state to our SortState format\n const newSort: SortState | null = event.newSortState && event.newSortState.length > 0\n ? {\n field: event.newSortState[0].field,\n direction: event.newSortState[0].direction\n }\n : null;\n\n this.internalSortState = newSort;\n this.sortChanged.emit({ sort: newSort });\n\n // If server-side sorting, reload from page 1\n // Keep existing records visible during refresh for better UX\n if (this.effectiveConfig.serverSideSorting && !this.records) {\n this.resetPaginationState(false);\n this.loadData();\n }\n }\n\n /**\n * Handle foreign key link click from mj-entity-data-grid\n * Bubbles the event up for parent components to handle navigation\n */\n /**\n * Handle foreign key link click from mj-entity-data-grid\n * Converts to recordOpened event for seamless navigation integration\n */\n onForeignKeyClick(event: ForeignKeyClickEvent): void {\n // Look up the related entity by name\n const md = new Metadata();\n const relatedEntity = event.relatedEntityName\n ? md.Entities.find(e => e.Name === event.relatedEntityName)\n : md.Entities.find(e => UUIDsEqual(e.ID, event.relatedEntityId));\n\n if (!relatedEntity) {\n return;\n }\n\n // Create composite key using the target entity's actual primary key field name\n const pkFieldName = relatedEntity.FirstPrimaryKey?.Name || 'ID';\n const compositeKey = new CompositeKey([{ FieldName: pkFieldName, Value: event.recordId }]);\n\n // Emit recordOpened for the related entity (record is undefined since it's not loaded)\n this.recordOpened.emit({\n entity: relatedEntity,\n compositeKey\n });\n }\n\n /**\n * Handle Add/New button click from data grid toolbar\n */\n onGridAddRequested(): void {\n this.addRequested.emit();\n }\n\n /**\n * Handle Refresh button click from data grid toolbar\n */\n onGridRefreshRequested(): void {\n this.refreshRequested.emit();\n // Also trigger an internal refresh\n this.refresh();\n }\n\n /**\n * Handle Delete button click from data grid toolbar\n */\n onGridDeleteRequested(records: Record<string, unknown>[]): void {\n this.deleteRequested.emit({ records });\n }\n\n /**\n * Handle Export button click from data grid toolbar\n */\n onGridExportRequested(): void {\n this.exportRequested.emit({ format: 'excel' });\n }\n\n /**\n * Handle Add to List button click from data grid toolbar.\n * Forwards the event to parent components for list management.\n */\n onGridAddToListRequested(event: { entityInfo: EntityInfo; records: Record<string, unknown>[]; recordIds: string[] }): void {\n this.addToListRequested.emit(event);\n }\n\n /**\n * Handle selection change from data grid.\n * Converts selected keys to records and forwards to parent components.\n */\n onGridSelectionChange(selectedKeys: string[]): void {\n const entity = this.effectiveEntity;\n if (!entity) return;\n\n // Find the actual records from our filtered records\n const records = this.filteredRecords.filter(record => {\n const key = buildPkString(record, entity);\n return selectedKeys.includes(key);\n });\n\n // Get the raw primary key values for list management\n const recordIds = records.map(record =>\n String(record[entity.PrimaryKeys[0].Name])\n );\n\n this.selectionChanged.emit({ records, recordIds });\n }\n\n // ========================================\n // TIMELINE METHODS\n // ========================================\n\n /**\n * Handle timeline event click - emit as record selection\n */\n onTimelineEventClick(event: AfterEventClickArgs): void {\n const record = event.event.entity as Record<string, unknown>;\n const entity = this.effectiveEntity;\n if (record && entity) {\n this.recordSelected.emit({\n record,\n entity: entity,\n compositeKey: buildCompositeKey(record, entity)\n });\n }\n }\n\n /**\n * Toggle timeline orientation between vertical and horizontal\n */\n toggleTimelineOrientation(): void {\n this.timelineOrientation = this.timelineOrientation === 'vertical' ? 'horizontal' : 'vertical';\n\n // Emit config change so parent can persist the preference\n this.emitTimelineConfigChange();\n this.cdr.detectChanges();\n }\n\n /**\n * Toggle timeline sort order between newest first (desc) and oldest first (asc)\n */\n toggleTimelineSortOrder(): void {\n this.timelineSortOrder = this.timelineSortOrder === 'desc' ? 'asc' : 'desc';\n\n // Emit config change so parent can persist the preference\n this.emitTimelineConfigChange();\n this.cdr.detectChanges();\n }\n\n /**\n * Change the date field used for the timeline\n */\n setTimelineDateField(fieldName: string): void {\n if (this.availableDateFields.some(f => f.Name === fieldName)) {\n this.selectedTimelineDateField = fieldName;\n this.updateTimelineGroups();\n this.emitTimelineConfigChange();\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Get the display name of the currently selected timeline date field\n */\n get selectedDateFieldDisplayName(): string {\n if (!this.selectedTimelineDateField) return '';\n const field = this.availableDateFields.find(f => f.Name === this.selectedTimelineDateField);\n return field?.DisplayNameOrName || this.selectedTimelineDateField;\n }\n\n /**\n * Emit the current timeline configuration for persistence\n */\n private emitTimelineConfigChange(): void {\n if (this.selectedTimelineDateField) {\n this.timelineConfigChange.emit({\n dateFieldName: this.selectedTimelineDateField,\n sortOrder: this.timelineSortOrder,\n segmentGrouping: this.timelineSegmentGrouping as TimelineSegmentGrouping,\n orientation: this.timelineOrientation\n });\n }\n }\n\n /**\n * Detect and configure timeline based on entity's date fields\n * Called when entity changes\n */\n private detectDateFields(): void {\n if (!this.entity) {\n this.hasDateFields = false;\n this.availableDateFields = [];\n this.timelineGroups = [];\n this.fallbackFromTimelineIfNeeded();\n return;\n }\n\n // Find all date fields - include __mj_CreatedAt and __mj_UpdatedAt as they're useful for timelines\n const dateFields = this.entity.Fields.filter(\n f => f.TSType === EntityFieldTSType.Date\n );\n\n if (dateFields.length === 0) {\n this.hasDateFields = false;\n this.availableDateFields = [];\n this.timelineGroups = [];\n this.fallbackFromTimelineIfNeeded();\n return;\n }\n\n // Sort by priority: DefaultInView date fields first (by Sequence), then others (by Sequence)\n this.availableDateFields = this.sortDateFieldsByPriority(dateFields);\n this.hasDateFields = true;\n\n // Configure timeline with the best date field\n this.configureTimeline();\n }\n\n /**\n * If currently on timeline view but timeline is no longer available,\n * fall back to grid view\n */\n private fallbackFromTimelineIfNeeded(): void {\n if (this.effectiveViewMode === 'timeline' && !this.hasDateFields) {\n this.setViewMode('grid');\n }\n }\n\n /**\n * Sort date fields by priority:\n * 1. DefaultInView=true fields, sorted by Sequence (lowest first)\n * 2. Other date fields, sorted by Sequence (lowest first)\n */\n private sortDateFieldsByPriority(dateFields: EntityFieldInfo[]): EntityFieldInfo[] {\n const defaultInView = dateFields.filter(f => f.DefaultInView).sort((a, b) => a.Sequence - b.Sequence);\n const others = dateFields.filter(f => !f.DefaultInView).sort((a, b) => a.Sequence - b.Sequence);\n return [...defaultInView, ...others];\n }\n\n /**\n * Configure the timeline with the current date field and records\n */\n private configureTimeline(): void {\n if (!this.entity || !this.hasDateFields || this.availableDateFields.length === 0) {\n this.timelineGroups = [];\n return;\n }\n\n // Determine which date field to use\n const dateFieldName = this.getEffectiveTimelineDateField();\n this.selectedTimelineDateField = dateFieldName;\n\n // Apply timeline config if provided\n if (this.timelineConfig) {\n this.timelineSortOrder = (this.timelineConfig.sortOrder || 'desc') as TimelineSortOrder;\n this.timelineSegmentGrouping = (this.timelineConfig.segmentGrouping || 'month') as TimeSegmentGrouping;\n this.timelineOrientation = this.timelineConfig.orientation || 'vertical';\n }\n\n // Create a timeline group for the current entity's data\n this.updateTimelineGroups();\n }\n\n /**\n * Get the effective date field to use for timeline\n * Priority: timelineConfig > first available date field\n */\n private getEffectiveTimelineDateField(): string {\n // If we have a config with a specific date field, use it if valid\n if (this.timelineConfig?.dateFieldName) {\n const configField = this.availableDateFields.find(f => f.Name === this.timelineConfig!.dateFieldName);\n if (configField) {\n return configField.Name;\n }\n }\n\n // Otherwise use the first available date field (already sorted by priority)\n return this.availableDateFields[0].Name;\n }\n\n /**\n * Update timeline groups with current records\n * Called when records change\n */\n private updateTimelineGroups(): void {\n if (!this.entity || !this.selectedTimelineDateField) {\n this.timelineGroups = [];\n return;\n }\n\n // Find title field - prefer NameField, then first string field with DefaultInView\n const titleField = this.findTitleField();\n\n // Create a single group for the current data\n const group = new TimelineGroup<Record<string, unknown>>();\n group.DataSourceType = 'array';\n group.EntityObjects = this.filteredRecords;\n group.TitleFieldName = titleField;\n group.DateFieldName = this.selectedTimelineDateField;\n group.IdFieldName = 'ID';\n group.GroupLabel = this.entity.Name;\n\n // Find a suitable description field\n const descField = this.findDescriptionField();\n if (descField) {\n group.DescriptionFieldName = descField;\n }\n\n // Find a suitable subtitle field\n const subtitleField = this.findSubtitleField(titleField);\n if (subtitleField) {\n group.SubtitleFieldName = subtitleField;\n }\n\n // Configure card display\n group.CardConfig = {\n collapsible: true,\n defaultExpanded: false,\n showDate: true,\n dateFormat: 'MMM d, yyyy h:mm a'\n };\n\n this.timelineGroups = [group];\n }\n\n /**\n * Find the best field to use as the title\n */\n private findTitleField(): string {\n if (!this.entity) return 'ID';\n\n // Prefer the entity's NameField\n if (this.entity.NameField) {\n return this.entity.NameField.Name;\n }\n\n // Look for common name patterns in DefaultInView string fields\n const stringFields = this.entity.Fields.filter(\n f => f.TSType === EntityFieldTSType.String && f.DefaultInView && !f.Name.startsWith('__mj_')\n ).sort((a, b) => a.Sequence - b.Sequence);\n\n const namePatterns = ['name', 'title', 'subject', 'label'];\n for (const pattern of namePatterns) {\n const match = stringFields.find(f => f.Name.toLowerCase().includes(pattern));\n if (match) return match.Name;\n }\n\n // Fall back to first string field\n return stringFields.length > 0 ? stringFields[0].Name : 'ID';\n }\n\n /**\n * Find a suitable description field\n */\n private findDescriptionField(): string | null {\n if (!this.entity) return null;\n\n // Look for common description patterns\n const descPatterns = ['description', 'notes', 'summary', 'content', 'body', 'details'];\n const textFields = this.entity.Fields.filter(\n f => (f.TSType === EntityFieldTSType.String) && !f.Name.startsWith('__mj_')\n );\n\n for (const pattern of descPatterns) {\n const match = textFields.find(f => f.Name.toLowerCase().includes(pattern));\n if (match) return match.Name;\n }\n\n return null;\n }\n\n /**\n * Find a suitable subtitle field (different from title)\n */\n private findSubtitleField(excludeField: string): string | null {\n if (!this.entity) return null;\n\n // Look for status, type, category, or other short classification fields\n const patterns = ['status', 'type', 'category', 'state', 'priority'];\n const fields = this.entity.Fields.filter(\n f => f.TSType === EntityFieldTSType.String &&\n f.DefaultInView &&\n f.Name !== excludeField &&\n !f.Name.startsWith('__mj_')\n ).sort((a, b) => a.Sequence - b.Sequence);\n\n for (const pattern of patterns) {\n const match = fields.find(f => f.Name.toLowerCase().includes(pattern));\n if (match) return match.Name;\n }\n\n // Use the first string field that's not the title field\n const firstOther = fields.find(f => f.Name !== excludeField);\n return firstOther?.Name || null;\n }\n}\n\n","<div class=\"entity-viewer-container\" [style.height]=\"effectiveConfig.height\">\n <!-- Header -->\n @if (effectiveConfig.showFilter || effectiveConfig.showViewModeToggle || effectiveConfig.showRecordCount) {\n <div class=\"viewer-header\">\n <!-- Filter Input -->\n @if (effectiveConfig.showFilter) {\n <div class=\"filter-container\">\n <i class=\"fa-solid fa-search filter-icon\"></i>\n <input\n type=\"text\"\n class=\"filter-input\"\n [placeholder]=\"effectiveConfig.filterPlaceholder\"\n [value]=\"effectiveFilterText\"\n (input)=\"onFilterChange($any($event.target).value)\"\n />\n @if (effectiveFilterText) {\n <button class=\"clear-filter-btn\" (click)=\"clearFilter()\" title=\"Clear filter\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n }\n </div>\n }\n\n <!-- Record Count -->\n @if (effectiveConfig.showRecordCount && effectiveEntity) {\n <div class=\"record-count\">\n @if (filteredRecordCount !== totalRecordCount) {\n <span>{{ filteredRecordCount | number }} of {{ totalRecordCount | number }} records</span>\n } @else {\n <span>{{ totalRecordCount | number }} records</span>\n }\n </div>\n }\n\n <!-- View Mode Toggle -->\n @if (effectiveConfig.showViewModeToggle) {\n <div class=\"view-mode-toggle\">\n <button\n class=\"toggle-btn\"\n [class.active]=\"effectiveViewMode === 'grid'\"\n (click)=\"setViewMode('grid')\"\n title=\"Grid View\">\n <i class=\"fa-solid fa-list\"></i>\n </button>\n <button\n class=\"toggle-btn\"\n [class.active]=\"effectiveViewMode === 'cards'\"\n (click)=\"setViewMode('cards')\"\n title=\"Cards View\">\n <i class=\"fa-solid fa-grip\"></i>\n </button>\n @if (hasDateFields) {\n <button\n class=\"toggle-btn\"\n [class.active]=\"effectiveViewMode === 'timeline'\"\n (click)=\"setViewMode('timeline')\"\n title=\"Timeline View\">\n <i class=\"fa-solid fa-timeline\"></i>\n </button>\n }\n </div>\n }\n\n <!-- Timeline Controls (only shown when timeline is active) -->\n @if (effectiveViewMode === 'timeline' && hasDateFields) {\n <!-- Date Field Selector -->\n <div class=\"timeline-date-selector\">\n <i class=\"fa-solid fa-calendar-days\"></i>\n @if (availableDateFields.length === 1) {\n <span class=\"date-field-label\">{{ selectedDateFieldDisplayName }}</span>\n } @else {\n <select\n class=\"date-field-select\"\n [value]=\"selectedTimelineDateField\"\n (change)=\"setTimelineDateField($any($event.target).value)\">\n @for (field of availableDateFields; track field.Name) {\n <option [value]=\"field.Name\">{{ field.DisplayNameOrName }}</option>\n }\n </select>\n }\n </div>\n\n <!-- Orientation Toggle -->\n <div class=\"timeline-orientation-toggle\">\n <button\n class=\"toggle-btn\"\n (click)=\"toggleTimelineOrientation()\"\n [title]=\"timelineOrientation === 'vertical' ? 'Switch to Horizontal' : 'Switch to Vertical'\">\n <i [class]=\"timelineOrientation === 'vertical' ? 'fa-solid fa-ellipsis-vertical' : 'fa-solid fa-ellipsis'\"></i>\n </button>\n </div>\n\n <!-- Sort Order Toggle -->\n <div class=\"timeline-sort-toggle\">\n <button\n class=\"toggle-btn\"\n (click)=\"toggleTimelineSortOrder()\"\n [title]=\"timelineSortOrder === 'desc' ? 'Showing Newest First (click for Oldest First)' : 'Showing Oldest First (click for Newest First)'\">\n <i [class]=\"timelineSortOrder === 'desc' ? 'fa-solid fa-arrow-down-wide-short' : 'fa-solid fa-arrow-up-wide-short'\"></i>\n </button>\n </div>\n }\n </div>\n }\n\n <!-- Content -->\n <div class=\"viewer-content\">\n <!-- Loading container - full page when no data exists -->\n <div class=\"loading-container\" [hidden]=\"!(isLoading && filteredRecords.length === 0)\">\n <mj-loading [text]=\"loadingMessage\" size=\"medium\"></mj-loading>\n </div>\n\n <!-- Loading overlay - shown on top of content when loading with existing data -->\n <div class=\"loading-overlay\" [hidden]=\"!(isLoading && filteredRecords.length > 0)\">\n <mj-loading [text]=\"loadingMessage\" size=\"small\"></mj-loading>\n </div>\n\n <!-- Empty state: no entity selected -->\n <div class=\"empty-state\" [hidden]=\"!!effectiveEntity\">\n <i class=\"fa-solid fa-database\"></i>\n <p>Select an entity to view records</p>\n </div>\n\n <!-- Empty state: no records found -->\n <div class=\"empty-state\" [hidden]=\"!effectiveEntity || filteredRecords.length > 0 || isLoading\">\n <i class=\"fa-solid fa-inbox\"></i>\n <p>{{ debouncedFilterText ? 'No matching records' : 'No records found' }}</p>\n </div>\n\n <!-- Grid View - always rendered, visibility controlled by hidden -->\n <mj-entity-data-grid\n [hidden]=\"effectiveViewMode !== 'grid' || !effectiveEntity\"\n [Data]=\"filteredRecords\"\n [Params]=\"gridParams\"\n [FilterText]=\"debouncedFilterText\"\n [GridState]=\"gridState\"\n [Height]=\"'auto'\"\n [ShowToolbar]=\"showGridToolbar\"\n [ToolbarConfig]=\"effectiveGridToolbarConfig\"\n [SelectionMode]=\"gridSelectionMode\"\n [ShowAddToListButton]=\"showAddToListButton\"\n [AllowLoad]=\"false\"\n (AfterRowClick)=\"onDataGridRowClick($event)\"\n (AfterRowDoubleClick)=\"onDataGridRowDoubleClick($event)\"\n (AfterSort)=\"onDataGridSortChanged($event)\"\n (GridStateChanged)=\"onGridStateChanged($event)\"\n (SelectionChange)=\"onGridSelectionChange($event)\"\n (NewButtonClick)=\"onGridAddRequested()\"\n (RefreshButtonClick)=\"onGridRefreshRequested()\"\n (DeleteButtonClick)=\"onGridDeleteRequested($event)\"\n (ExportButtonClick)=\"onGridExportRequested()\"\n (AddToListRequested)=\"onGridAddToListRequested($event)\"\n (ForeignKeyClick)=\"onForeignKeyClick($event)\">\n </mj-entity-data-grid>\n\n <!-- Cards View - always rendered, visibility controlled by hidden -->\n <mj-entity-cards\n [hidden]=\"effectiveViewMode !== 'cards' || !effectiveEntity\"\n [entity]=\"effectiveEntity\"\n [records]=\"filteredRecords\"\n [selectedRecordId]=\"selectedRecordId\"\n [cardTemplate]=\"cardTemplate\"\n [hiddenFieldMatches]=\"hiddenFieldMatches\"\n [filterText]=\"debouncedFilterText\"\n (recordSelected)=\"onRecordSelected($event)\"\n (recordOpened)=\"onRecordOpened($event)\">\n </mj-entity-cards>\n\n <!-- Timeline View - always rendered when date fields exist, visibility controlled by hidden -->\n <mj-timeline\n [hidden]=\"effectiveViewMode !== 'timeline' || !hasDateFields\"\n [groups]=\"timelineGroups\"\n [orientation]=\"timelineOrientation\"\n [layout]=\"timelineOrientation === 'vertical' ? 'alternating' : 'single'\"\n [sortOrder]=\"timelineSortOrder\"\n [segmentGrouping]=\"timelineSegmentGrouping\"\n [segmentsCollapsible]=\"true\"\n [segmentsDefaultExpanded]=\"true\"\n [selectedEventId]=\"timelineSelectedEventId\"\n (afterEventClick)=\"onTimelineEventClick($event)\">\n </mj-timeline>\n </div>\n\n <!-- Pagination - only show when there's more data to load OR we've loaded more than one page -->\n @if (effectiveConfig.showPagination && effectiveEntity && (pagination.hasMore || pagination.totalRecords > effectiveConfig.pageSize)) {\n <mj-pagination\n [pagination]=\"pagination\"\n [loadedRecordCount]=\"filteredRecords.length\"\n (loadMore)=\"onLoadMore()\">\n </mj-pagination>\n }\n</div>\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@memberjunction/ng-entity-viewer",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.9.0",
|
|
4
4
|
"description": "MemberJunction: Angular components for viewing entity data in multiple formats (grid, cards) with filtering, selection, and shared data management",
|
|
5
5
|
"main": "./dist/public-api.js",
|
|
6
6
|
"typings": "./dist/public-api.d.ts",
|
|
@@ -37,14 +37,14 @@
|
|
|
37
37
|
"ag-grid-community": "^35.0.1"
|
|
38
38
|
},
|
|
39
39
|
"dependencies": {
|
|
40
|
-
"@memberjunction/core-entities": "5.
|
|
41
|
-
"@memberjunction/export-engine": "5.
|
|
42
|
-
"@memberjunction/global": "5.
|
|
43
|
-
"@memberjunction/core": "5.
|
|
44
|
-
"@memberjunction/ng-shared-generic": "5.
|
|
45
|
-
"@memberjunction/ng-timeline": "5.
|
|
46
|
-
"@memberjunction/ng-filter-builder": "5.
|
|
47
|
-
"@memberjunction/ng-export-service": "5.
|
|
40
|
+
"@memberjunction/core-entities": "5.9.0",
|
|
41
|
+
"@memberjunction/export-engine": "5.9.0",
|
|
42
|
+
"@memberjunction/global": "5.9.0",
|
|
43
|
+
"@memberjunction/core": "5.9.0",
|
|
44
|
+
"@memberjunction/ng-shared-generic": "5.9.0",
|
|
45
|
+
"@memberjunction/ng-timeline": "5.9.0",
|
|
46
|
+
"@memberjunction/ng-filter-builder": "5.9.0",
|
|
47
|
+
"@memberjunction/ng-export-service": "5.9.0",
|
|
48
48
|
"rxjs": "^7.8.2",
|
|
49
49
|
"tslib": "^2.8.1"
|
|
50
50
|
},
|