@memberjunction/ng-versions 6.1.0-edge.6 → 6.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/label-detail/label-detail.component.d.ts.map +1 -1
- package/dist/lib/label-detail/label-detail.component.js +8 -2
- package/dist/lib/label-detail/label-detail.component.js.map +1 -1
- package/dist/lib/record-micro-view/record-micro-view.component.d.ts.map +1 -1
- package/dist/lib/record-micro-view/record-micro-view.component.js +4 -1
- package/dist/lib/record-micro-view/record-micro-view.component.js.map +1 -1
- package/package.json +9 -9
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"label-detail.component.d.ts","sourceRoot":"","sources":["../../../src/lib/label-detail/label-detail.component.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"label-detail.component.d.ts","sourceRoot":"","sources":["../../../src/lib/label-detail/label-detail.component.ts"],"names":[],"mappings":"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"}
|
|
@@ -1483,13 +1483,19 @@ export class MjLabelDetailComponent extends BaseAngularComponent {
|
|
|
1483
1483
|
{
|
|
1484
1484
|
EntityName: 'MJ: Record Changes',
|
|
1485
1485
|
ExtraFilter: `ID = '${oldChangeId}'`,
|
|
1486
|
-
|
|
1486
|
+
// 'EntityID' is required, not decorative: field-level security projects a Record Change's
|
|
1487
|
+
// payload against the entity the row is ABOUT, and a row arriving without EntityID cannot
|
|
1488
|
+
// be resolved — so the payload is withheld. See guides/FIELD_LEVEL_SECURITY_GUIDE.md §3.2.
|
|
1489
|
+
Fields: ['EntityID', 'FullRecordJSON'],
|
|
1487
1490
|
ResultType: 'simple'
|
|
1488
1491
|
},
|
|
1489
1492
|
{
|
|
1490
1493
|
EntityName: 'MJ: Record Changes',
|
|
1491
1494
|
ExtraFilter: `ID = '${newChangeId}'`,
|
|
1492
|
-
|
|
1495
|
+
// 'EntityID' is required, not decorative: field-level security projects a Record Change's
|
|
1496
|
+
// payload against the entity the row is ABOUT, and a row arriving without EntityID cannot
|
|
1497
|
+
// be resolved — so the payload is withheld. See guides/FIELD_LEVEL_SECURITY_GUIDE.md §3.2.
|
|
1498
|
+
Fields: ['EntityID', 'FullRecordJSON'],
|
|
1493
1499
|
ResultType: 'simple'
|
|
1494
1500
|
}
|
|
1495
1501
|
]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"label-detail.component.js","sourceRoot":"","sources":["../../../src/lib/label-detail/label-detail.component.ts","../../../src/lib/label-detail/label-detail.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, OnInit, OnDestroy, ChangeDetectorRef, ChangeDetectionStrategy, HostListener, ElementRef, NgZone } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { RunView, EntityInfo, CompositeKey, UserInfo, EntityRecordNameInput } from '@memberjunction/core';\nimport { UserInfoEngine } from '@memberjunction/core-entities';\nimport { UUIDsEqual } from '@memberjunction/global';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { MJVersionLabelEntityType, MJVersionLabelItemEntityType, MJVersionLabelRestoreEntityType, MJVersionLabelEntity } from '@memberjunction/core-entities';\nimport { MicroViewData, FieldChangeView } from '../types';\nimport { EntityLinkClickEvent } from '../record-micro-view/record-micro-view.component';\n\n// =========================================================================\n// Interfaces\n// =========================================================================\n\ntype DetailTab = 'overview' | 'snapshots' | 'dependencies' | 'changes' | 'history';\n\ninterface SnapshotEntityGroup {\n EntityName: string;\n EntityID: string;\n EntityIcon: string;\n Items: SnapshotItemView[];\n IsExpanded: boolean;\n IsLoadingNames: boolean;\n NamesLoaded: boolean;\n}\n\ninterface SnapshotItemView {\n RecordID: string;\n RecordChangeID: string;\n DisplayName: string;\n FieldPreview: string;\n FullRecordJSON: Record<string, unknown> | null;\n}\n\ninterface ClientDiffResult {\n Summary: { Changed: number; Unchanged: number; EntitiesAffected: number };\n EntityGroups: ClientDiffEntityGroup[];\n}\n\ninterface ClientDiffEntityGroup {\n EntityName: string;\n Records: ClientRecordDiff[];\n IsExpanded: boolean;\n}\n\ninterface ClientRecordDiff {\n RecordID: string;\n ChangeType: 'Modified' | 'Unchanged';\n FieldChanges: FieldChangeView[];\n}\n\ninterface DependencyEntityView {\n EntityName: string;\n RelationshipField: string;\n Children: DependencyEntityView[];\n Depth: number;\n IsExpanded: boolean;\n}\n\ninterface RecordChangeRow {\n ID: string;\n EntityID: string;\n RecordID: string;\n FullRecordJSON: string;\n ChangedAt: string;\n}\n\n// =========================================================================\n// Component\n// =========================================================================\n\n@Component({\n standalone: false,\n selector: 'mj-label-detail-panel',\n templateUrl: './label-detail.component.html',\n styleUrls: ['./label-detail.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class MjLabelDetailComponent extends BaseAngularComponent implements OnInit, OnDestroy {\n @Input() Label!: MJVersionLabelEntityType;\n @Input() AllLabels: MJVersionLabelEntityType[] = [];\n @Input() ItemCountMap = new Map<string, number>();\n @Output() Close = new EventEmitter<void>();\n @Output() LabelUpdated = new EventEmitter<void>();\n @Output() EntityLinkClick = new EventEmitter<EntityLinkClickEvent>();\n\n // Tab state\n public ActiveTab: DetailTab = 'overview';\n\n // Animation\n public IsVisible = false;\n\n // Data\n public LabelItems: MJVersionLabelItemEntityType[] = [];\n public ChildLabels: MJVersionLabelEntityType[] = [];\n public IsLoadingItems = true;\n public IsArchiving = false;\n\n // Overview stats\n public UniqueEntityCount = 0;\n public CreatorName = '';\n\n /** Record display name resolved via IsNameField (shown on overview when Scope=Record) */\n public OverviewRecordName = '';\n /** Entity icon for the overview tab */\n public OverviewEntityIcon = 'fa-solid fa-table';\n\n // Snapshot tab\n public SnapshotGroups: SnapshotEntityGroup[] = [];\n public SnapshotViewMode: 'card' | 'list' = 'list';\n public SnapshotSearch = '';\n public SnapshotSortBy: 'name' | 'count' = 'count';\n public SnapshotSortDir: 'asc' | 'desc' = 'desc';\n public FilteredSnapshotGroups: SnapshotEntityGroup[] = [];\n\n // Changes tab (lazy)\n public DiffResult: ClientDiffResult | null = null;\n public IsLoadingDiff = false;\n private diffLoaded = false;\n\n // Dependencies tab (lazy)\n public DependencyTree: DependencyEntityView[] = [];\n public IsLoadingDependencies = false;\n private dependenciesLoaded = false;\n\n // History tab (lazy)\n public Restores: MJVersionLabelRestoreEntityType[] = [];\n public RelatedLabels: MJVersionLabelEntityType[] = [];\n public IsLoadingHistory = false;\n private historyLoaded = false;\n\n // Micro view (inline)\n public MicroViewRecord: MicroViewData | null = null;\n public ShowMicroView = false;\n public BreadcrumbLabel = '';\n\n // Resize\n public PanelWidthPx = 0;\n private isResizing = false;\n private resizeMinWidth = 400;\n private resizeMaxWidthRatio = 0.92;\n private static readonly PREFS_KEY = 'VersionHistory.DetailPanel.UserPreferences';\n\n private get metadata() { return this.ProviderToUse; }\n private destroy$ = new Subject<void>();\n\n // Bound handlers for resize (need references for removeEventListener)\n private boundOnResizeMove = this.onResizeMove.bind(this);\n private boundOnResizeEnd = this.onResizeEnd.bind(this);\n\n constructor(private cdr: ChangeDetectorRef, private ngZone: NgZone, private elRef: ElementRef) { super(); }\n\n // =========================================================================\n // Lifecycle\n // =========================================================================\n\n ngOnInit(): void {\n this.loadPanelPreferences();\n // Animate in on next microtask\n Promise.resolve().then(() => {\n this.IsVisible = true;\n this.cdr.markForCheck();\n });\n this.computeChildLabels();\n this.loadLabelItems();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n // Clean up any in-progress resize\n document.removeEventListener('mousemove', this.boundOnResizeMove);\n document.removeEventListener('mouseup', this.boundOnResizeEnd);\n }\n\n @HostListener('document:keydown.escape')\n public OnEscapeKey(): void {\n if (this.ShowMicroView) {\n this.OnBackFromMicroView();\n } else {\n this.OnClose();\n }\n }\n\n // =========================================================================\n // Panel actions\n // =========================================================================\n\n public OnClose(): void {\n this.IsVisible = false;\n this.cdr.markForCheck();\n // Wait for CSS transition to complete\n setTimeout(() => this.Close.emit(), 300);\n }\n\n public OnBackdropClick(): void {\n if (!this.ShowMicroView) {\n this.OnClose();\n }\n }\n\n public OnTabChange(tab: DetailTab): void {\n this.ActiveTab = tab;\n this.loadTabData(tab);\n this.cdr.markForCheck();\n }\n\n // =========================================================================\n // Label actions\n // =========================================================================\n\n public async OnArchive(): Promise<void> {\n if (this.IsArchiving || this.Label.Status === 'Archived') return;\n\n this.IsArchiving = true;\n this.cdr.markForCheck();\n\n try {\n const md = this.ProviderToUse;\n const label = await md.GetEntityObject<MJVersionLabelEntity>('MJ: Version Labels');\n await label.InnerLoad(CompositeKey.FromID(this.Label.ID));\n label.Status = 'Archived';\n const saved = await label.Save();\n if (saved) {\n this.Label.Status = 'Archived';\n this.LabelUpdated.emit();\n }\n } catch (e) {\n console.error('Error archiving label:', e);\n } finally {\n this.ngZone.run(() => {\n this.IsArchiving = false;\n this.cdr.markForCheck();\n });\n }\n }\n\n // =========================================================================\n // Data loading\n // =========================================================================\n\n private computeChildLabels(): void {\n this.ChildLabels = this.AllLabels.filter(l => UUIDsEqual(l.ParentID, this.Label.ID));\n }\n\n private async loadLabelItems(): Promise<void> {\n this.IsLoadingItems = true;\n this.cdr.markForCheck();\n\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView<MJVersionLabelItemEntityType>({\n EntityName: 'MJ: Version Label Items',\n ExtraFilter: `VersionLabelID = '${this.Label.ID}'`,\n ResultType: 'simple'\n });\n\n if (result.Success) {\n this.LabelItems = result.Results;\n this.computeOverviewStats();\n this.buildSnapshotGroups();\n }\n } catch (e) {\n console.error('Error loading label items:', e);\n } finally {\n this.ngZone.run(() => {\n this.IsLoadingItems = false;\n this.cdr.markForCheck();\n });\n }\n }\n\n private computeOverviewStats(): void {\n const entityIds = new Set(this.LabelItems.map(i => i.EntityID ?? '').filter(Boolean));\n this.UniqueEntityCount = entityIds.size;\n this.CreatorName = this.Label.CreatedByUser ?? '';\n\n // Resolve entity icon for overview\n if (this.Label.EntityID) {\n this.OverviewEntityIcon = this.resolveEntityIcon(this.Label.EntityID);\n }\n\n // Resolve record display name for Record-scoped labels\n if (this.Label.Scope === 'Record' && this.Label.RecordID && this.Label.EntityID) {\n this.loadOverviewRecordName();\n }\n }\n\n /**\n * For Record-scoped labels, load the record's display name via GetEntityRecordNames.\n */\n private async loadOverviewRecordName(): Promise<void> {\n const entityName = this.resolveEntityName(this.Label.EntityID ?? '');\n if (!entityName || entityName === 'Unknown') return;\n\n const rawId = this.extractRawRecordId(this.Label.RecordID ?? '');\n if (!rawId) return;\n\n try {\n const input = new EntityRecordNameInput();\n input.EntityName = entityName;\n // RecordID is a CompositeKey segment (\"ID|<uuid>\", or composite) — parse it against the\n // entity's real key column(s) rather than stripping the prefix and assuming `ID`.\n input.CompositeKey = CompositeKey.FromURLSegment(this.metadata.EntityByName(entityName), this.Label.RecordID ?? '');\n\n const results = await this.metadata.GetEntityRecordNames([input]);\n const recordName = results.length > 0 && results[0].Success ? results[0].RecordName : undefined;\n if (recordName) {\n this.ngZone.run(() => {\n this.OverviewRecordName = recordName;\n this.cdr.markForCheck();\n });\n }\n } catch (e) {\n console.error('Error loading overview record name:', e);\n }\n }\n\n private buildSnapshotGroups(): void {\n const groupMap = new Map<string, { entityId: string; items: SnapshotItemView[] }>();\n\n for (const item of this.LabelItems) {\n const entityId = item.EntityID ?? '';\n const entityName = this.resolveEntityName(entityId);\n const key = entityName || entityId;\n\n if (!groupMap.has(key)) {\n groupMap.set(key, { entityId, items: [] });\n }\n\n const displayName = this.buildInitialDisplayName(item);\n groupMap.get(key)!.items.push({\n RecordID: item.RecordID ?? '',\n RecordChangeID: item.RecordChangeID ?? '',\n DisplayName: displayName,\n FieldPreview: '',\n FullRecordJSON: null\n });\n }\n\n this.SnapshotGroups = Array.from(groupMap.entries())\n .map(([name, group]) => ({\n EntityName: name,\n EntityID: group.entityId,\n EntityIcon: this.resolveEntityIcon(group.entityId),\n Items: group.items,\n IsExpanded: false,\n IsLoadingNames: false,\n NamesLoaded: false\n }));\n\n this.applySortAndFilter();\n }\n\n /**\n * Initial display name before lazy-loading (just the shortened raw ID).\n * Real names are loaded via loadGroupRecordNames() when the group is expanded.\n */\n private buildInitialDisplayName(item: MJVersionLabelItemEntityType): string {\n const rawId = this.extractRawRecordId(item.RecordID ?? '');\n return rawId.length > 20 ? rawId.substring(0, 20) + '...' : rawId;\n }\n\n /** Extract the raw ID value from a potentially formatted \"ID|<uuid>\" string. */\n private extractRawRecordId(recordId: string): string {\n if (!recordId) return '';\n const parts = recordId.split('||');\n if (parts.length === 1) {\n const singleParts = recordId.split('|');\n if (singleParts.length === 2) {\n return singleParts[1];\n }\n }\n return recordId;\n }\n\n /** Apply current sort + search filter to snapshot groups. */\n private applySortAndFilter(): void {\n const sorted = [...this.SnapshotGroups].sort((a, b) => {\n if (this.SnapshotSortBy === 'name') {\n const cmp = a.EntityName.localeCompare(b.EntityName);\n return this.SnapshotSortDir === 'asc' ? cmp : -cmp;\n }\n // sort by count\n const cmp = a.Items.length - b.Items.length;\n return this.SnapshotSortDir === 'asc' ? cmp : -cmp;\n });\n\n if (!this.SnapshotSearch) {\n this.FilteredSnapshotGroups = sorted;\n return;\n }\n\n const search = this.SnapshotSearch.toLowerCase();\n this.FilteredSnapshotGroups = sorted\n .filter(g => g.EntityName.toLowerCase().includes(search) ||\n g.Items.some(i => i.RecordID.toLowerCase().includes(search) || i.DisplayName.toLowerCase().includes(search)))\n .map(g => ({\n ...g,\n Items: g.Items.filter(i =>\n i.RecordID.toLowerCase().includes(search) ||\n i.DisplayName.toLowerCase().includes(search) ||\n g.EntityName.toLowerCase().includes(search)\n )\n }));\n }\n\n private loadTabData(tab: DetailTab): void {\n switch (tab) {\n case 'changes':\n if (!this.diffLoaded) {\n this.loadDiffData();\n }\n break;\n case 'dependencies':\n if (!this.dependenciesLoaded) {\n this.loadDependencyData();\n }\n break;\n case 'history':\n if (!this.historyLoaded) {\n this.loadHistoryData();\n }\n break;\n }\n }\n\n // =========================================================================\n // Changes tab\n // =========================================================================\n\n private async loadDiffData(): Promise<void> {\n this.IsLoadingDiff = true;\n this.cdr.markForCheck();\n\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const entityGroups: ClientDiffEntityGroup[] = [];\n let totalChanged = 0;\n let totalUnchanged = 0;\n\n // Group label items by entity\n const entityItemMap = new Map<string, MJVersionLabelItemEntityType[]>();\n for (const item of this.LabelItems) {\n const entityId = item.EntityID ?? '';\n if (!entityItemMap.has(entityId)) {\n entityItemMap.set(entityId, []);\n }\n entityItemMap.get(entityId)!.push(item);\n }\n\n // For each entity group, load latest RecordChanges and compare\n for (const [entityId, items] of entityItemMap) {\n const entityName = this.resolveEntityName(entityId);\n const records: ClientRecordDiff[] = [];\n\n for (const item of items) {\n const latestChange = await this.loadLatestRecordChange(rv, entityId, item.RecordID ?? '');\n const isModified = latestChange != null && latestChange !== item.RecordChangeID;\n\n if (isModified) {\n totalChanged++;\n records.push({\n RecordID: item.RecordID ?? '',\n ChangeType: 'Modified',\n FieldChanges: await this.computeFieldChanges(rv, item.RecordChangeID ?? '', latestChange)\n });\n } else {\n totalUnchanged++;\n records.push({\n RecordID: item.RecordID ?? '',\n ChangeType: 'Unchanged',\n FieldChanges: []\n });\n }\n }\n\n if (records.some(r => r.ChangeType === 'Modified')) {\n entityGroups.push({\n EntityName: entityName,\n Records: records.filter(r => r.ChangeType === 'Modified'),\n IsExpanded: false\n });\n }\n }\n\n this.DiffResult = {\n Summary: {\n Changed: totalChanged,\n Unchanged: totalUnchanged,\n EntitiesAffected: entityGroups.length\n },\n EntityGroups: entityGroups\n };\n\n this.diffLoaded = true;\n } catch (e) {\n console.error('Error loading diff data:', e);\n } finally {\n this.ngZone.run(() => {\n this.IsLoadingDiff = false;\n this.cdr.markForCheck();\n });\n }\n }\n\n private async loadLatestRecordChange(rv: RunView, entityId: string, recordId: string): Promise<string | null> {\n if (!entityId || !recordId) return null;\n\n const result = await rv.RunView<RecordChangeRow>({\n EntityName: 'MJ: Record Changes',\n ExtraFilter: `EntityID = '${entityId}' AND RecordID = '${recordId}'`,\n OrderBy: 'ChangedAt DESC',\n MaxRows: 1,\n Fields: ['ID'],\n ResultType: 'simple'\n });\n\n if (result.Success && result.Results.length > 0) {\n return result.Results[0].ID;\n }\n return null;\n }\n\n private async computeFieldChanges(rv: RunView, oldChangeId: string, newChangeId: string): Promise<FieldChangeView[]> {\n if (!oldChangeId || !newChangeId) return [];\n\n try {\n const [oldResult, newResult] = await rv.RunViews([\n {\n EntityName: 'MJ: Record Changes',\n ExtraFilter: `ID = '${oldChangeId}'`,\n Fields: ['FullRecordJSON'],\n ResultType: 'simple'\n },\n {\n EntityName: 'MJ: Record Changes',\n ExtraFilter: `ID = '${newChangeId}'`,\n Fields: ['FullRecordJSON'],\n ResultType: 'simple'\n }\n ]);\n\n if (!oldResult.Success || !newResult.Success) return [];\n if (oldResult.Results.length === 0 || newResult.Results.length === 0) return [];\n\n const oldRow = oldResult.Results[0] as RecordChangeRow;\n const newRow = newResult.Results[0] as RecordChangeRow;\n\n return this.diffRecordJson(oldRow.FullRecordJSON, newRow.FullRecordJSON);\n } catch {\n return [];\n }\n }\n\n private diffRecordJson(oldJson: string, newJson: string): FieldChangeView[] {\n const changes: FieldChangeView[] = [];\n\n try {\n const oldData = JSON.parse(oldJson || '{}') as Record<string, unknown>;\n const newData = JSON.parse(newJson || '{}') as Record<string, unknown>;\n const allKeys = new Set([...Object.keys(oldData), ...Object.keys(newData)]);\n\n for (const key of allKeys) {\n // Skip MJ system fields\n if (key.startsWith('__mj_')) continue;\n\n const oldVal = oldData[key];\n const newVal = newData[key];\n\n if (oldVal === undefined && newVal !== undefined) {\n changes.push({ FieldName: key, OldValue: '', NewValue: this.formatFieldValue(newVal), ChangeType: 'Added' });\n } else if (oldVal !== undefined && newVal === undefined) {\n changes.push({ FieldName: key, OldValue: this.formatFieldValue(oldVal), NewValue: '', ChangeType: 'Removed' });\n } else if (JSON.stringify(oldVal) !== JSON.stringify(newVal)) {\n changes.push({ FieldName: key, OldValue: this.formatFieldValue(oldVal), NewValue: this.formatFieldValue(newVal), ChangeType: 'Modified' });\n }\n }\n } catch {\n // Invalid JSON - skip\n }\n\n return changes;\n }\n\n // =========================================================================\n // Dependencies tab\n // =========================================================================\n\n private loadDependencyData(): void {\n this.IsLoadingDependencies = true;\n this.cdr.markForCheck();\n\n try {\n const entityId = this.Label.EntityID;\n if (!entityId) {\n this.DependencyTree = [];\n this.dependenciesLoaded = true;\n return;\n }\n\n const entityInfo = this.metadata.Entities.find(e => UUIDsEqual(e.ID, entityId));\n if (!entityInfo) {\n this.DependencyTree = [];\n this.dependenciesLoaded = true;\n return;\n }\n\n // Build set of entity names that are actually in the snapshot\n const snapshotEntityNames = this.buildSnapshotEntityNameSet();\n\n this.DependencyTree = this.buildDependencyTree(entityInfo, 0, new Set<string>(), snapshotEntityNames);\n this.dependenciesLoaded = true;\n } catch (e) {\n console.error('Error loading dependency data:', e);\n } finally {\n this.IsLoadingDependencies = false;\n this.cdr.markForCheck();\n }\n }\n\n /**\n * Build a set of entity names that have at least one item in the snapshot.\n * Used to filter the dependency tree to only show entities with captured records.\n */\n private buildSnapshotEntityNameSet(): Set<string> {\n const names = new Set<string>();\n for (const item of this.LabelItems) {\n const entityName = this.resolveEntityName(item.EntityID ?? '');\n if (entityName && entityName !== 'Unknown') {\n names.add(entityName);\n }\n }\n return names;\n }\n\n /**\n * Build the dependency tree, but only include entities that are in the\n * actual snapshot (snapshotEntities). This prevents showing relationship\n * paths that weren't captured (e.g., Conversation Details when there are\n * no conversation records in the snapshot).\n */\n private buildDependencyTree(\n entity: EntityInfo,\n depth: number,\n visited: Set<string>,\n snapshotEntities: Set<string>\n ): DependencyEntityView[] {\n if (depth > 3 || visited.has(entity.Name)) return [];\n visited.add(entity.Name);\n\n const deps: DependencyEntityView[] = [];\n\n // Get One-To-Many relationships (entities that depend on this one)\n const dependents = entity.RelatedEntities.filter(r =>\n r.Type.trim().toUpperCase() === 'ONE TO MANY' &&\n r.RelatedEntity !== entity.Name\n );\n\n for (const rel of dependents) {\n // Only include entities that are actually in the snapshot\n if (!snapshotEntities.has(rel.RelatedEntity)) continue;\n\n const childEntity = this.metadata.Entities.find(e => e.Name === rel.RelatedEntity);\n const children = childEntity\n ? this.buildDependencyTree(childEntity, depth + 1, new Set(visited), snapshotEntities)\n : [];\n\n deps.push({\n EntityName: rel.RelatedEntity,\n RelationshipField: rel.RelatedEntityJoinField,\n Children: children,\n Depth: depth + 1,\n IsExpanded: depth < 1\n });\n }\n\n return deps.sort((a, b) => a.EntityName.localeCompare(b.EntityName));\n }\n\n // =========================================================================\n // History tab\n // =========================================================================\n\n private async loadHistoryData(): Promise<void> {\n this.IsLoadingHistory = true;\n this.cdr.markForCheck();\n\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView<MJVersionLabelRestoreEntityType>({\n EntityName: 'MJ: Version Label Restores',\n ExtraFilter: `VersionLabelID = '${this.Label.ID}'`,\n OrderBy: '__mj_CreatedAt DESC',\n MaxRows: 50,\n ResultType: 'simple'\n });\n\n if (result.Success) {\n this.Restores = result.Results;\n }\n\n // Find related labels (same entity + record)\n this.RelatedLabels = this.AllLabels.filter(l =>\n !UUIDsEqual(l.ID, this.Label.ID) &&\n UUIDsEqual(l.EntityID, this.Label.EntityID) &&\n UUIDsEqual(l.RecordID, this.Label.RecordID) &&\n l.RecordID != null\n );\n\n this.historyLoaded = true;\n } catch (e) {\n console.error('Error loading history data:', e);\n } finally {\n this.ngZone.run(() => {\n this.IsLoadingHistory = false;\n this.cdr.markForCheck();\n });\n }\n }\n\n // =========================================================================\n // Snapshot interactions\n // =========================================================================\n\n public ToggleSnapshotGroup(group: SnapshotEntityGroup): void {\n group.IsExpanded = !group.IsExpanded;\n if (group.IsExpanded && !group.NamesLoaded) {\n this.loadGroupRecordNames(group);\n }\n this.cdr.markForCheck();\n }\n\n /**\n * Lazy-load record display names for a group using Metadata.GetEntityRecordNames.\n * Only called when a group is first expanded.\n */\n private async loadGroupRecordNames(group: SnapshotEntityGroup): Promise<void> {\n group.IsLoadingNames = true;\n this.cdr.markForCheck();\n\n try {\n const groupEntity = this.metadata.EntityByName(group.EntityName);\n const inputs: EntityRecordNameInput[] = group.Items.map(item => {\n const input = new EntityRecordNameInput();\n input.EntityName = group.EntityName;\n input.CompositeKey = CompositeKey.FromURLSegment(groupEntity, item.RecordID);\n return input;\n });\n\n const results = await this.metadata.GetEntityRecordNames(inputs);\n\n for (const result of results) {\n if (result.Success && result.RecordName) {\n // Match result back to the item by composite key value\n const resultId = result.CompositeKey?.KeyValuePairs?.[0]?.Value;\n if (resultId) {\n const item = group.Items.find(i =>\n this.extractRawRecordId(i.RecordID) === String(resultId)\n );\n if (item) {\n item.DisplayName = result.RecordName;\n }\n }\n }\n }\n } catch (e) {\n console.error('Error loading record names for group:', group.EntityName, e);\n } finally {\n this.ngZone.run(() => {\n group.IsLoadingNames = false;\n group.NamesLoaded = true;\n this.cdr.markForCheck();\n });\n }\n }\n\n public OnSnapshotSearchChange(text: string): void {\n this.SnapshotSearch = text;\n this.applySortAndFilter();\n this.cdr.markForCheck();\n }\n\n public OnSnapshotSortChange(sortBy: 'name' | 'count'): void {\n if (this.SnapshotSortBy === sortBy) {\n // Toggle direction if clicking same sort\n this.SnapshotSortDir = this.SnapshotSortDir === 'asc' ? 'desc' : 'asc';\n } else {\n this.SnapshotSortBy = sortBy;\n this.SnapshotSortDir = sortBy === 'name' ? 'asc' : 'desc';\n }\n this.applySortAndFilter();\n this.cdr.markForCheck();\n }\n\n public ToggleSnapshotViewMode(): void {\n this.SnapshotViewMode = this.SnapshotViewMode === 'card' ? 'list' : 'card';\n this.cdr.markForCheck();\n }\n\n // =========================================================================\n // Diff interactions\n // =========================================================================\n\n public ToggleDiffGroup(group: ClientDiffEntityGroup): void {\n group.IsExpanded = !group.IsExpanded;\n this.cdr.markForCheck();\n }\n\n public ExpandAllDiffGroups(): void {\n if (!this.DiffResult) return;\n for (const group of this.DiffResult.EntityGroups) {\n group.IsExpanded = true;\n }\n this.cdr.markForCheck();\n }\n\n public CollapseAllDiffGroups(): void {\n if (!this.DiffResult) return;\n for (const group of this.DiffResult.EntityGroups) {\n group.IsExpanded = false;\n }\n this.cdr.markForCheck();\n }\n\n // =========================================================================\n // Dependency interactions\n // =========================================================================\n\n public ToggleDependencyNode(node: DependencyEntityView): void {\n node.IsExpanded = !node.IsExpanded;\n this.cdr.markForCheck();\n }\n\n // =========================================================================\n // Micro view (inline navigation)\n // =========================================================================\n\n public OpenMicroView(entityName: string, recordId: string, recordChangeId: string, displayName?: string): void {\n const label = displayName || this.extractRawRecordId(recordId).substring(0, 12) + '...';\n this.BreadcrumbLabel = `${entityName} / ${label}`;\n this.MicroViewRecord = {\n EntityName: entityName,\n EntityID: '',\n RecordID: recordId,\n RecordChangeID: recordChangeId,\n FullRecordJSON: null,\n FieldDiffs: null\n };\n this.ShowMicroView = true;\n this.cdr.markForCheck();\n }\n\n public OnBackFromMicroView(): void {\n this.ShowMicroView = false;\n this.MicroViewRecord = null;\n this.cdr.markForCheck();\n }\n\n public OnEntityLinkClick(event: EntityLinkClickEvent): void {\n this.EntityLinkClick.emit(event);\n }\n\n public OnOpenRecordClick(event: EntityLinkClickEvent): void {\n this.EntityLinkClick.emit(event);\n }\n\n /** Open the record referenced by a Record-scoped label via navigation. */\n public OnOpenOverviewRecord(): void {\n if (!this.Label.EntityID || !this.Label.RecordID) return;\n const entityName = this.resolveEntityName(this.Label.EntityID);\n const rawId = this.extractRawRecordId(this.Label.RecordID);\n const pkey = CompositeKey.FromURLSegment(this.metadata.EntityByName(entityName), this.Label.RecordID);\n this.EntityLinkClick.emit({\n EntityName: entityName,\n RecordID: rawId,\n CompositeKey: pkey\n });\n }\n\n // =========================================================================\n // Resize handling\n // =========================================================================\n\n public OnResizeStart(event: MouseEvent): void {\n event.preventDefault();\n this.isResizing = true;\n document.body.style.cursor = 'col-resize';\n document.body.style.userSelect = 'none';\n\n // Run outside Angular zone for performance during drag\n this.ngZone.runOutsideAngular(() => {\n document.addEventListener('mousemove', this.boundOnResizeMove);\n document.addEventListener('mouseup', this.boundOnResizeEnd);\n });\n }\n\n private onResizeMove(event: MouseEvent): void {\n if (!this.isResizing) return;\n\n const viewportWidth = window.innerWidth;\n const maxWidth = viewportWidth * this.resizeMaxWidthRatio;\n const newWidth = Math.max(this.resizeMinWidth, Math.min(maxWidth, viewportWidth - event.clientX));\n\n this.PanelWidthPx = newWidth;\n this.ngZone.run(() => this.cdr.markForCheck());\n }\n\n private onResizeEnd(): void {\n if (!this.isResizing) return;\n this.isResizing = false;\n document.body.style.cursor = '';\n document.body.style.userSelect = '';\n document.removeEventListener('mousemove', this.boundOnResizeMove);\n document.removeEventListener('mouseup', this.boundOnResizeEnd);\n this.savePanelPreferences();\n }\n\n // =========================================================================\n // Panel preferences\n // =========================================================================\n\n private loadPanelPreferences(): void {\n // Default to 65% of viewport\n this.PanelWidthPx = Math.max(this.resizeMinWidth, Math.min(window.innerWidth * 0.65, 1000));\n\n try {\n const raw = UserInfoEngine.Instance.GetSetting(MjLabelDetailComponent.PREFS_KEY);\n if (raw) {\n const prefs = JSON.parse(raw) as { PanelWidthPx?: number };\n if (prefs.PanelWidthPx && prefs.PanelWidthPx >= this.resizeMinWidth) {\n this.PanelWidthPx = Math.min(prefs.PanelWidthPx, window.innerWidth * this.resizeMaxWidthRatio);\n }\n }\n } catch {\n // Use defaults\n }\n }\n\n private savePanelPreferences(): void {\n try {\n const prefs = JSON.stringify({ PanelWidthPx: Math.round(this.PanelWidthPx) });\n UserInfoEngine.Instance.SetSettingDebounced(MjLabelDetailComponent.PREFS_KEY, prefs);\n } catch {\n // Ignore save errors\n }\n }\n\n // =========================================================================\n // Display helpers\n // =========================================================================\n\n /** Check if a label is the parent of the current Label (case-insensitive UUID comparison). */\n public IsParentLabel(pl: MJVersionLabelEntityType): boolean {\n return UUIDsEqual(pl.ID, this.Label.ParentID);\n }\n\n public resolveEntityName(entityId: string | null | undefined): string {\n if (!entityId) return 'Unknown';\n const entity = this.metadata.Entities.find(e => UUIDsEqual(e.ID, entityId));\n return entity ? entity.Name : 'Unknown';\n }\n\n /** Resolve icon CSS class for an entity by ID, falling back to generic table icon. */\n public resolveEntityIcon(entityId: string): string {\n if (!entityId) return 'fa-solid fa-table';\n const entity = this.metadata.Entities.find(e => UUIDsEqual(e.ID, entityId));\n return entity?.Icon || 'fa-solid fa-table';\n }\n\n /** Resolve icon CSS class for an entity by name, falling back to generic table icon. */\n public resolveEntityIconByName(entityName: string): string {\n if (!entityName) return 'fa-solid fa-table';\n const entity = this.metadata.Entities.find(e => e.Name === entityName);\n return entity?.Icon || 'fa-solid fa-table';\n }\n\n /** Format a record ID for display — strips 'ID|' prefix for single-value PKs. */\n public FormatRecordID(recordId: string | undefined): string {\n return this.extractRawRecordId(recordId ?? '');\n }\n\n public GetScopeIcon(scope: string | undefined): string {\n const icons: Record<string, string> = {\n 'System': 'fa-solid fa-globe',\n 'Entity': 'fa-solid fa-table',\n 'Record': 'fa-solid fa-file'\n };\n return icons[scope ?? ''] ?? 'fa-solid fa-tag';\n }\n\n public GetStatusClass(status: string | undefined): string {\n const classes: Record<string, string> = {\n 'Active': 'status-active',\n 'Archived': 'status-archived',\n 'Restored': 'status-restored'\n };\n return classes[status ?? ''] ?? '';\n }\n\n public GetChangeTypeClass(changeType: string): string {\n const classes: Record<string, string> = {\n 'Added': 'change-added',\n 'Modified': 'change-modified',\n 'Removed': 'change-removed'\n };\n return classes[changeType] ?? '';\n }\n\n public GetChangeTypeIcon(changeType: string): string {\n const icons: Record<string, string> = {\n 'Added': 'fa-solid fa-plus-circle',\n 'Modified': 'fa-solid fa-pen-to-square',\n 'Removed': 'fa-solid fa-minus-circle'\n };\n return icons[changeType] ?? 'fa-solid fa-circle';\n }\n\n public FormatDate(date: Date | string | undefined): string {\n if (!date) return '';\n const d = date instanceof Date ? date : new Date(date);\n return d.toLocaleDateString('en-US', {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n hour: '2-digit',\n minute: '2-digit'\n });\n }\n\n public FormatRelativeDate(date: Date | string | undefined): string {\n if (!date) return '';\n const d = date instanceof Date ? date : new Date(date);\n const now = new Date();\n const diffMs = now.getTime() - d.getTime();\n const diffMins = Math.floor(diffMs / 60000);\n const diffHours = Math.floor(diffMs / 3600000);\n const diffDays = Math.floor(diffMs / 86400000);\n\n if (diffMins < 1) return 'Just now';\n if (diffMins < 60) return `${diffMins}m ago`;\n if (diffHours < 24) return `${diffHours}h ago`;\n if (diffDays < 7) return `${diffDays}d ago`;\n\n return d.toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric' });\n }\n\n public FormatDuration(ms: number | undefined): string {\n if (!ms) return '';\n if (ms < 1000) return `${ms}ms`;\n return `${(ms / 1000).toFixed(1)}s`;\n }\n\n public GetItemCount(labelId: string | undefined): number {\n return this.ItemCountMap.get(labelId ?? '') ?? 0;\n }\n\n private formatFieldValue(value: unknown): string {\n if (value == null) return 'null';\n if (typeof value === 'object') return JSON.stringify(value);\n return String(value);\n }\n}\n","<!-- Backdrop overlay -->\n<div class=\"panel-backdrop\" [class.visible]=\"IsVisible\" (click)=\"OnBackdropClick()\"></div>\n\n<!-- Slide-in panel -->\n<div class=\"detail-panel\" [class.visible]=\"IsVisible\" [style.width.px]=\"PanelWidthPx\">\n <!-- Resize handle -->\n <div class=\"resize-handle\" (mousedown)=\"OnResizeStart($event)\">\n <div class=\"resize-handle-grip\"></div>\n </div>\n\n <!-- ============================================================ -->\n <!-- HEADER -->\n <!-- ============================================================ -->\n <div class=\"panel-header\">\n <div class=\"header-info\">\n <div class=\"header-title-row\">\n <i [class]=\"GetScopeIcon(Label.Scope)\" class=\"header-scope-icon\"></i>\n <h2 class=\"header-title\">{{Label.Name}}</h2>\n <span class=\"header-status\" [ngClass]=\"GetStatusClass(Label.Status)\">\n {{Label.Status}}\n </span>\n <span class=\"header-scope-badge\">{{Label.Scope}}</span>\n </div>\n @if (Label.Description) {\n <p class=\"header-description\">{{Label.Description}}</p>\n }\n </div>\n <div class=\"header-actions\">\n <button class=\"header-action-btn\" (click)=\"OnArchive()\"\n [disabled]=\"IsArchiving || Label.Status === 'Archived'\"\n title=\"Archive this label\">\n <i class=\"fa-solid fa-box-archive\"></i>\n </button>\n <button class=\"header-action-btn\" (click)=\"OnTabChange('changes')\" title=\"View changes\">\n <i class=\"fa-solid fa-code-compare\"></i>\n </button>\n <button class=\"close-btn\" (click)=\"OnClose()\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n </div>\n\n <!-- ============================================================ -->\n <!-- SUMMARY KPIs -->\n <!-- ============================================================ -->\n <div class=\"summary-kpis\">\n <div class=\"summary-kpi\">\n <div class=\"kpi-mini-icon\" style=\"background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent); color: var(--mj-brand-primary);\">\n <i class=\"fa-solid fa-camera\"></i>\n </div>\n <div class=\"kpi-mini-content\">\n <span class=\"kpi-mini-value\">{{LabelItems.length || Label.ItemCount || GetItemCount(Label.ID)}}</span>\n <span class=\"kpi-mini-label\">Items</span>\n </div>\n </div>\n <div class=\"summary-kpi\">\n <div class=\"kpi-mini-icon\" style=\"background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent); color: var(--mj-brand-primary);\">\n <i class=\"fa-solid fa-table\"></i>\n </div>\n <div class=\"kpi-mini-content\">\n <span class=\"kpi-mini-value\">{{UniqueEntityCount}}</span>\n <span class=\"kpi-mini-label\">Entities</span>\n </div>\n </div>\n @if (Label.CreationDurationMS) {\n <div class=\"summary-kpi\">\n <div class=\"kpi-mini-icon\" style=\"background: rgba(16, 185, 129, 0.1); color: #10b981;\">\n <i class=\"fa-solid fa-stopwatch\"></i>\n </div>\n <div class=\"kpi-mini-content\">\n <span class=\"kpi-mini-value\">{{FormatDuration(Label.CreationDurationMS)}}</span>\n <span class=\"kpi-mini-label\">Duration</span>\n </div>\n </div>\n }\n @if (ChildLabels.length > 0) {\n <div class=\"summary-kpi\">\n <div class=\"kpi-mini-icon\" style=\"background: rgba(245, 158, 11, 0.1); color: #f59e0b;\">\n <i class=\"fa-solid fa-layer-group\"></i>\n </div>\n <div class=\"kpi-mini-content\">\n <span class=\"kpi-mini-value\">{{ChildLabels.length}}</span>\n <span class=\"kpi-mini-label\">Children</span>\n </div>\n </div>\n }\n </div>\n\n <!-- ============================================================ -->\n <!-- TAB BAR (hidden when micro-view is active) -->\n <!-- ============================================================ -->\n @if (!ShowMicroView) {\n <div class=\"tab-bar\">\n <button class=\"tab\" [class.active]=\"ActiveTab === 'overview'\" (click)=\"OnTabChange('overview')\">\n <i class=\"fa-solid fa-info-circle tab-icon\"></i> Overview\n </button>\n <button class=\"tab\" [class.active]=\"ActiveTab === 'snapshots'\" (click)=\"OnTabChange('snapshots')\">\n <i class=\"fa-solid fa-camera tab-icon\"></i> Snapshots\n @if (LabelItems.length > 0) {\n <span class=\"tab-count\">{{LabelItems.length}}</span>\n }\n </button>\n <button class=\"tab\" [class.active]=\"ActiveTab === 'dependencies'\" (click)=\"OnTabChange('dependencies')\">\n <i class=\"fa-solid fa-diagram-project tab-icon\"></i> Dependencies\n </button>\n <button class=\"tab\" [class.active]=\"ActiveTab === 'changes'\" (click)=\"OnTabChange('changes')\">\n <i class=\"fa-solid fa-code-compare tab-icon\"></i> Changes\n </button>\n <button class=\"tab\" [class.active]=\"ActiveTab === 'history'\" (click)=\"OnTabChange('history')\">\n <i class=\"fa-solid fa-clock-rotate-left tab-icon\"></i> History\n </button>\n </div>\n }\n\n <!-- ============================================================ -->\n <!-- BREADCRUMB (shown when micro-view is active) -->\n <!-- ============================================================ -->\n @if (ShowMicroView) {\n <div class=\"breadcrumb-bar\">\n <button class=\"breadcrumb-back\" (click)=\"OnBackFromMicroView()\">\n <i class=\"fa-solid fa-arrow-left\"></i>\n </button>\n <div class=\"breadcrumb-trail\">\n <span class=\"breadcrumb-item clickable\" (click)=\"OnBackFromMicroView()\">\n <i class=\"fa-solid fa-camera breadcrumb-icon\"></i> Snapshots\n </span>\n <i class=\"fa-solid fa-chevron-right breadcrumb-separator\"></i>\n <span class=\"breadcrumb-item current\">\n <i class=\"fa-solid fa-file-lines breadcrumb-icon\"></i> {{BreadcrumbLabel}}\n </span>\n </div>\n </div>\n }\n\n <!-- ============================================================ -->\n <!-- TAB CONTENT (scrollable) - or inline micro-view -->\n <!-- ============================================================ -->\n @if (!ShowMicroView) {\n <div class=\"tab-content\">\n <!-- Loading state for items -->\n @if (IsLoadingItems && ActiveTab !== 'dependencies') {\n <mj-loading text=\"Loading label data...\"></mj-loading>\n }\n <!-- ======================================================== -->\n <!-- OVERVIEW TAB -->\n <!-- ======================================================== -->\n @if (ActiveTab === 'overview' && !IsLoadingItems) {\n <div class=\"tab-pane\">\n <!-- Metadata section -->\n <div class=\"detail-section\">\n <h3 class=\"section-title\">\n <i class=\"fa-solid fa-info-circle section-icon\"></i> Label Details\n </h3>\n <div class=\"detail-grid\">\n <div class=\"detail-field\">\n <span class=\"field-label\">Name</span>\n <span class=\"field-value\">{{Label.Name}}</span>\n </div>\n <div class=\"detail-field\">\n <span class=\"field-label\">Status</span>\n <span class=\"field-value\">\n <span class=\"inline-badge\" [ngClass]=\"GetStatusClass(Label.Status)\">{{Label.Status}}</span>\n </span>\n </div>\n <div class=\"detail-field\">\n <span class=\"field-label\">Scope</span>\n <span class=\"field-value\">\n <i [class]=\"GetScopeIcon(Label.Scope)\" style=\"margin-right: 6px;\"></i>{{Label.Scope}}\n </span>\n </div>\n @if (Label.EntityID) {\n <div class=\"detail-field\">\n <span class=\"field-label\">Entity</span>\n <span class=\"field-value\">\n <i [class]=\"OverviewEntityIcon\" style=\"margin-right: 6px; color: var(--mj-brand-primary);\"></i>{{Label.Entity ?? resolveEntityName(Label.EntityID)}}\n </span>\n </div>\n }\n @if (Label.RecordID && Label.Scope !== 'Record') {\n <div class=\"detail-field\">\n <span class=\"field-label\">Record ID</span>\n <span class=\"field-value field-mono\">{{FormatRecordID(Label.RecordID)}}</span>\n </div>\n }\n @if (Label.ExternalSystemID) {\n <div class=\"detail-field\">\n <span class=\"field-label\">External Ref</span>\n <span class=\"field-value field-mono\">{{Label.ExternalSystemID}}</span>\n </div>\n }\n </div>\n </div>\n <!-- Record card (Record-scoped labels) -->\n @if (Label.Scope === 'Record' && Label.RecordID) {\n <div class=\"record-card\">\n <div class=\"record-card-main\">\n <i [class]=\"OverviewEntityIcon\" class=\"record-card-icon\"></i>\n <div class=\"record-card-info\">\n @if (OverviewRecordName) {\n <span class=\"record-card-name\">{{OverviewRecordName}}</span>\n }\n @if (!OverviewRecordName) {\n <span class=\"record-card-name record-card-name-loading\">Loading...</span>\n }\n <span class=\"record-card-entity\">{{Label.Entity ?? resolveEntityName(Label.EntityID)}}</span>\n <span class=\"record-card-id\">{{FormatRecordID(Label.RecordID)}}</span>\n </div>\n </div>\n <button class=\"record-card-open-btn\" (click)=\"OnOpenOverviewRecord()\" title=\"Open record\">\n <i class=\"fa-solid fa-arrow-up-right-from-square\"></i> Open\n </button>\n </div>\n }\n <!-- Description -->\n @if (Label.Description) {\n <div class=\"detail-section\">\n <h3 class=\"section-title\">\n <i class=\"fa-solid fa-align-left section-icon\"></i> Description\n </h3>\n <p class=\"description-text\">{{Label.Description}}</p>\n </div>\n }\n <!-- Creation info -->\n <div class=\"detail-section\">\n <h3 class=\"section-title\">\n <i class=\"fa-solid fa-clock section-icon\"></i> Creation\n </h3>\n <div class=\"detail-grid\">\n <div class=\"detail-field\">\n <span class=\"field-label\">Created</span>\n <span class=\"field-value\">{{FormatDate(Label.__mj_CreatedAt)}}</span>\n </div>\n @if (Label.CreatedByUser) {\n <div class=\"detail-field\">\n <span class=\"field-label\">Created By</span>\n <span class=\"field-value\">\n <i class=\"fa-solid fa-user\" style=\"margin-right: 6px; opacity: 0.5;\"></i>{{Label.CreatedByUser}}\n </span>\n </div>\n }\n @if (Label.CreationDurationMS) {\n <div class=\"detail-field\">\n <span class=\"field-label\">Capture Duration</span>\n <span class=\"field-value\">{{FormatDuration(Label.CreationDurationMS)}}</span>\n </div>\n }\n <div class=\"detail-field\">\n <span class=\"field-label\">Items Captured</span>\n <span class=\"field-value\">{{LabelItems.length}}</span>\n </div>\n </div>\n </div>\n <!-- Parent / Children -->\n @if (Label.ParentID || ChildLabels.length > 0) {\n <div class=\"detail-section\">\n <h3 class=\"section-title\">\n <i class=\"fa-solid fa-sitemap section-icon\"></i> Hierarchy\n </h3>\n <!-- Parent reference -->\n @if (Label.ParentID) {\n <div class=\"hierarchy-item parent\">\n <i class=\"fa-solid fa-arrow-up hierarchy-icon\"></i>\n <span class=\"hierarchy-label\">Parent:</span>\n <span class=\"hierarchy-name\">\n @for (pl of AllLabels; track pl) {\n @if (IsParentLabel(pl)) {\n <span>{{pl.Name}}</span>\n }\n }\n </span>\n </div>\n }\n <!-- Children -->\n @if (ChildLabels.length > 0) {\n <div class=\"hierarchy-children\">\n @for (child of ChildLabels; track child) {\n <div class=\"hierarchy-item child\">\n <i class=\"fa-solid fa-arrow-turn-down-right hierarchy-icon\"></i>\n <span class=\"hierarchy-name\">{{child.Name}}</span>\n @if (child.RecordID) {\n <span class=\"hierarchy-meta\">{{child.RecordID | slice:0:12}}...</span>\n }\n @if (child.ItemCount) {\n <span class=\"hierarchy-meta\">{{child.ItemCount}} items</span>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n <!-- ======================================================== -->\n <!-- SNAPSHOTS TAB -->\n <!-- ======================================================== -->\n @if (ActiveTab === 'snapshots' && !IsLoadingItems) {\n <div class=\"tab-pane\">\n <!-- Snapshot toolbar -->\n <div class=\"snapshot-toolbar\">\n <div class=\"snapshot-search\">\n <i class=\"fa-solid fa-search snapshot-search-icon\"></i>\n <input type=\"text\" class=\"snapshot-search-input\"\n placeholder=\"Search by entity or record...\"\n [ngModel]=\"SnapshotSearch\"\n (ngModelChange)=\"OnSnapshotSearchChange($event)\" />\n </div>\n <div class=\"snapshot-sort-toggle\">\n <button class=\"toggle-btn-sm\" [class.active]=\"SnapshotSortBy === 'name'\"\n (click)=\"OnSnapshotSortChange('name')\" title=\"Sort by name\">\n @if (SnapshotSortBy === 'name' && SnapshotSortDir === 'asc') {\n <i class=\"fa-solid fa-arrow-down-a-z\"></i>\n }\n @if (SnapshotSortBy === 'name' && SnapshotSortDir === 'desc') {\n <i class=\"fa-solid fa-arrow-up-z-a\"></i>\n }\n @if (SnapshotSortBy !== 'name') {\n <i class=\"fa-solid fa-arrow-down-a-z\"></i>\n }\n </button>\n <button class=\"toggle-btn-sm\" [class.active]=\"SnapshotSortBy === 'count'\"\n (click)=\"OnSnapshotSortChange('count')\" title=\"Sort by record count\">\n @if (SnapshotSortBy === 'count' && SnapshotSortDir === 'desc') {\n <i class=\"fa-solid fa-arrow-down-9-1\"></i>\n }\n @if (SnapshotSortBy === 'count' && SnapshotSortDir === 'asc') {\n <i class=\"fa-solid fa-arrow-up-1-9\"></i>\n }\n @if (SnapshotSortBy !== 'count') {\n <i class=\"fa-solid fa-arrow-down-9-1\"></i>\n }\n </button>\n </div>\n <div class=\"snapshot-view-toggle\">\n <button class=\"toggle-btn-sm\" [class.active]=\"SnapshotViewMode === 'list'\" (click)=\"SnapshotViewMode = 'list'\">\n <i class=\"fa-solid fa-list\"></i>\n </button>\n <button class=\"toggle-btn-sm\" [class.active]=\"SnapshotViewMode === 'card'\" (click)=\"SnapshotViewMode = 'card'\">\n <i class=\"fa-solid fa-grip\"></i>\n </button>\n </div>\n </div>\n <!-- Entity groups -->\n <div class=\"snapshot-groups\">\n @for (group of FilteredSnapshotGroups; track group) {\n <mj-accordion-panel Size=\"sm\" [FlushBody]=\"true\"\n [Expanded]=\"group.IsExpanded\" (ExpandedChange)=\"ToggleSnapshotGroup(group)\">\n <ng-template mjAccordionTitle>\n <i [class]=\"group.EntityIcon\" class=\"group-entity-icon\"></i>\n <span class=\"group-name\">{{group.EntityName}}</span>\n <span class=\"mj-accordion-badge mj-accordion-badge--right\">{{group.Items.length}}</span>\n </ng-template>\n <ng-template mjAccordionBody>\n <div class=\"group-content\">\n <!-- Loading names indicator -->\n @if (group.IsLoadingNames) {\n <div class=\"group-names-loading\">\n <mj-loading text=\"Loading record names...\" size=\"small\"></mj-loading>\n </div>\n }\n <!-- List mode -->\n @if (SnapshotViewMode === 'list') {\n @for (item of group.Items; track item) {\n <div class=\"snapshot-list-item\"\n (click)=\"OpenMicroView(group.EntityName, item.RecordID, item.RecordChangeID, item.DisplayName)\">\n <i class=\"fa-solid fa-file-lines snapshot-item-icon\"></i>\n <span class=\"snapshot-item-name\">{{item.DisplayName}}</span>\n <i class=\"fa-solid fa-chevron-right snapshot-item-arrow\"></i>\n </div>\n }\n }\n <!-- Card mode -->\n @if (SnapshotViewMode === 'card') {\n <div class=\"snapshot-cards\">\n @for (item of group.Items; track item) {\n <div class=\"snapshot-card\"\n (click)=\"OpenMicroView(group.EntityName, item.RecordID, item.RecordChangeID, item.DisplayName)\">\n <div class=\"snapshot-card-header\">\n <i class=\"fa-solid fa-file-lines\"></i>\n <span class=\"snapshot-card-name\">{{item.DisplayName}}</span>\n </div>\n </div>\n }\n </div>\n }\n </div>\n </ng-template>\n </mj-accordion-panel>\n }\n </div>\n <!-- Empty state -->\n @if (FilteredSnapshotGroups.length === 0) {\n <mj-empty-state\n Size=\"compact\"\n Icon=\"fa-solid fa-camera\"\n Title=\"No snapshot items found.\" />\n }\n </div>\n }\n <!-- ======================================================== -->\n <!-- DEPENDENCIES TAB -->\n <!-- ======================================================== -->\n @if (ActiveTab === 'dependencies') {\n <div class=\"tab-pane\">\n @if (IsLoadingDependencies) {\n <mj-loading text=\"Loading dependencies...\"></mj-loading>\n }\n @if (!IsLoadingDependencies && Label.EntityID) {\n <div class=\"dep-root\">\n <div class=\"dep-root-entity\">\n <i [class]=\"GetScopeIcon(Label.Scope)\" class=\"dep-root-icon\"></i>\n <span class=\"dep-root-name\">{{Label.Entity ?? resolveEntityName(Label.EntityID)}}</span>\n <span class=\"dep-root-badge\">Root</span>\n </div>\n @if (DependencyTree.length > 0) {\n @for (node of DependencyTree; track node) {\n <ng-container *ngTemplateOutlet=\"depNode; context: { $implicit: node }\"></ng-container>\n }\n }\n @if (DependencyTree.length === 0) {\n <mj-empty-state\n Size=\"compact\"\n Icon=\"fa-solid fa-diagram-project\"\n Title=\"No dependent entities found.\" />\n }\n </div>\n }\n @if (!IsLoadingDependencies && !Label.EntityID) {\n <mj-empty-state\n Size=\"compact\"\n Icon=\"fa-solid fa-diagram-project\"\n Title=\"No entity associated with this label.\" />\n }\n </div>\n }\n <!-- Dependency tree node template -->\n <ng-template #depNode let-node>\n <div class=\"dep-node\" [style.padding-left.px]=\"node.Depth * 24\">\n <div class=\"dep-node-header\" (click)=\"ToggleDependencyNode(node)\">\n @if (node.Children.length > 0) {\n <i class=\"fa-solid fa-chevron-right dep-chevron\"\n [class.expanded]=\"node.IsExpanded\"\n ></i>\n }\n @if (node.Children.length === 0) {\n <span class=\"dep-node-spacer\"></span>\n }\n <i [class]=\"resolveEntityIconByName(node.EntityName)\" class=\"dep-node-icon\"></i>\n <span class=\"dep-node-name\">{{node.EntityName}}</span>\n <span class=\"dep-node-field\">via {{node.RelationshipField}}</span>\n @if (node.Children.length > 0) {\n <span class=\"dep-node-count\">\n {{node.Children.length}} dep{{node.Children.length !== 1 ? 's' : ''}}\n </span>\n }\n </div>\n @if (node.IsExpanded && node.Children.length > 0) {\n @for (child of node.Children; track child) {\n <ng-container *ngTemplateOutlet=\"depNode; context: { $implicit: child }\"></ng-container>\n }\n }\n </div>\n </ng-template>\n <!-- ======================================================== -->\n <!-- CHANGES TAB -->\n <!-- ======================================================== -->\n @if (ActiveTab === 'changes') {\n <div class=\"tab-pane\">\n @if (IsLoadingDiff) {\n <mj-loading text=\"Computing differences...\"></mj-loading>\n }\n @if (!IsLoadingDiff && DiffResult) {\n <!-- Diff summary -->\n <div class=\"diff-summary\">\n <div class=\"diff-stat\">\n <span class=\"diff-stat-value change-modified\">{{DiffResult.Summary.Changed}}</span>\n <span class=\"diff-stat-label\">Changed</span>\n </div>\n <div class=\"diff-stat\">\n <span class=\"diff-stat-value\">{{DiffResult.Summary.Unchanged}}</span>\n <span class=\"diff-stat-label\">Unchanged</span>\n </div>\n <div class=\"diff-stat\">\n <span class=\"diff-stat-value\">{{DiffResult.Summary.EntitiesAffected}}</span>\n <span class=\"diff-stat-label\">Entities</span>\n </div>\n </div>\n <!-- Expand/collapse all -->\n @if (DiffResult.EntityGroups.length > 0) {\n <div class=\"diff-toolbar\">\n <button class=\"toolbar-action-btn\" (click)=\"ExpandAllDiffGroups()\" title=\"Expand all\">\n <i class=\"fa-solid fa-angles-down\"></i>\n <span>Expand All</span>\n </button>\n <button class=\"toolbar-action-btn\" (click)=\"CollapseAllDiffGroups()\" title=\"Collapse all\">\n <i class=\"fa-solid fa-angles-up\"></i>\n <span>Collapse All</span>\n </button>\n </div>\n }\n <!-- Entity diff groups -->\n @if (DiffResult.EntityGroups.length > 0) {\n <div class=\"diff-groups\">\n @for (group of DiffResult.EntityGroups; track group) {\n <mj-accordion-panel Size=\"sm\" [FlushBody]=\"true\"\n [Expanded]=\"group.IsExpanded\" (ExpandedChange)=\"ToggleDiffGroup(group)\">\n <ng-template mjAccordionTitle>\n <i [class]=\"resolveEntityIconByName(group.EntityName)\" class=\"diff-group-icon\"></i>\n <span class=\"diff-group-name\">{{group.EntityName}}</span>\n <span class=\"mj-accordion-badge mj-accordion-badge--warning mj-accordion-badge--right\">\n {{group.Records.length}} modified\n </span>\n </ng-template>\n <ng-template mjAccordionBody>\n <div class=\"diff-group-content\">\n @for (record of group.Records; track record) {\n <div class=\"diff-record\">\n <div class=\"diff-record-header\">\n <i [class]=\"GetChangeTypeIcon(record.ChangeType)\" [ngClass]=\"GetChangeTypeClass(record.ChangeType)\"></i>\n <span class=\"diff-record-id\">{{record.RecordID | slice:0:20}}...</span>\n </div>\n @if (record.FieldChanges.length > 0) {\n <div class=\"diff-fields\">\n @for (field of record.FieldChanges; track field) {\n <div class=\"diff-field\"\n [ngClass]=\"GetChangeTypeClass(field.ChangeType)\">\n <span class=\"diff-field-name\">{{field.FieldName}}</span>\n @if (field.OldValue) {\n <span class=\"diff-field-old\">{{field.OldValue | slice:0:40}}</span>\n }\n @if (field.OldValue && field.NewValue) {\n <i class=\"fa-solid fa-arrow-right diff-field-arrow\"></i>\n }\n @if (field.NewValue) {\n <span class=\"diff-field-new\">{{field.NewValue | slice:0:40}}</span>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n </ng-template>\n </mj-accordion-panel>\n }\n </div>\n }\n <!-- No changes -->\n @if (DiffResult.EntityGroups.length === 0 && DiffResult.Summary.Changed === 0) {\n <mj-empty-state\n Size=\"compact\"\n Variant=\"success\"\n Title=\"No changes detected since this label was created.\" />\n }\n }\n </div>\n }\n <!-- ======================================================== -->\n <!-- HISTORY TAB -->\n <!-- ======================================================== -->\n @if (ActiveTab === 'history') {\n <div class=\"tab-pane\">\n @if (IsLoadingHistory) {\n <mj-loading text=\"Loading history...\"></mj-loading>\n }\n @if (!IsLoadingHistory) {\n <!-- Restores -->\n @if (Restores.length > 0) {\n <div class=\"detail-section\">\n <h3 class=\"section-title\">\n <i class=\"fa-solid fa-clock-rotate-left section-icon\"></i> Restore Operations\n </h3>\n <div class=\"history-list\">\n @for (restore of Restores; track restore) {\n <div class=\"history-item\">\n <div class=\"history-item-icon\" [ngClass]=\"'status-' + (restore.Status ?? '').toLowerCase().replace(' ', '-')\">\n <i class=\"fa-solid fa-clock-rotate-left\"></i>\n </div>\n <div class=\"history-item-content\">\n <span class=\"history-item-title\">Restore {{restore.Status}}</span>\n <span class=\"history-item-meta\">\n {{restore.CompletedItems ?? 0}}/{{restore.TotalItems ?? 0}} items\n @if (restore.FailedItems) {\n <span> · {{restore.FailedItems}} failed</span>\n }\n </span>\n </div>\n <span class=\"history-item-date\">{{FormatRelativeDate(restore.__mj_CreatedAt)}}</span>\n </div>\n }\n </div>\n </div>\n }\n <!-- Related labels -->\n @if (RelatedLabels.length > 0) {\n <div class=\"detail-section\">\n <h3 class=\"section-title\">\n <i class=\"fa-solid fa-tags section-icon\"></i> Related Labels\n </h3>\n <div class=\"history-list\">\n @for (related of RelatedLabels; track related) {\n <div class=\"history-item\">\n <div class=\"history-item-icon\" style=\"background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent); color: var(--mj-brand-primary);\">\n <i class=\"fa-solid fa-tag\"></i>\n </div>\n <div class=\"history-item-content\">\n <span class=\"history-item-title\">{{related.Name}}</span>\n <span class=\"history-item-meta\">\n <span class=\"inline-badge small\" [ngClass]=\"GetStatusClass(related.Status)\">{{related.Status}}</span>\n </span>\n </div>\n <span class=\"history-item-date\">{{FormatRelativeDate(related.__mj_CreatedAt)}}</span>\n </div>\n }\n </div>\n </div>\n }\n <!-- Empty -->\n @if (Restores.length === 0 && RelatedLabels.length === 0) {\n <mj-empty-state\n Size=\"compact\"\n Icon=\"fa-solid fa-clock-rotate-left\"\n Title=\"No restore history or related labels found.\" />\n }\n }\n </div>\n }\n </div>\n }\n\n <!-- ============================================================ -->\n <!-- INLINE MICRO VIEW (replaces tab content when active) -->\n <!-- ============================================================ -->\n @if (ShowMicroView && MicroViewRecord) {\n <div class=\"tab-content\">\n <mj-record-micro-view\n [Data]=\"MicroViewRecord\"\n [Inline]=\"true\"\n (Close)=\"OnBackFromMicroView()\"\n (EntityLinkClick)=\"OnEntityLinkClick($event)\"\n (OpenRecord)=\"OnOpenRecordClick($event)\">\n </mj-record-micro-view>\n </div>\n }\n</div>\n"]}
|
|
1
|
+
{"version":3,"file":"label-detail.component.js","sourceRoot":"","sources":["../../../src/lib/label-detail/label-detail.component.ts","../../../src/lib/label-detail/label-detail.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, OnInit, OnDestroy, ChangeDetectorRef, ChangeDetectionStrategy, HostListener, ElementRef, NgZone } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { RunView, EntityInfo, CompositeKey, UserInfo, EntityRecordNameInput } from '@memberjunction/core';\nimport { UserInfoEngine } from '@memberjunction/core-entities';\nimport { UUIDsEqual } from '@memberjunction/global';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { MJVersionLabelEntityType, MJVersionLabelItemEntityType, MJVersionLabelRestoreEntityType, MJVersionLabelEntity } from '@memberjunction/core-entities';\nimport { MicroViewData, FieldChangeView } from '../types';\nimport { EntityLinkClickEvent } from '../record-micro-view/record-micro-view.component';\n\n// =========================================================================\n// Interfaces\n// =========================================================================\n\ntype DetailTab = 'overview' | 'snapshots' | 'dependencies' | 'changes' | 'history';\n\ninterface SnapshotEntityGroup {\n EntityName: string;\n EntityID: string;\n EntityIcon: string;\n Items: SnapshotItemView[];\n IsExpanded: boolean;\n IsLoadingNames: boolean;\n NamesLoaded: boolean;\n}\n\ninterface SnapshotItemView {\n RecordID: string;\n RecordChangeID: string;\n DisplayName: string;\n FieldPreview: string;\n FullRecordJSON: Record<string, unknown> | null;\n}\n\ninterface ClientDiffResult {\n Summary: { Changed: number; Unchanged: number; EntitiesAffected: number };\n EntityGroups: ClientDiffEntityGroup[];\n}\n\ninterface ClientDiffEntityGroup {\n EntityName: string;\n Records: ClientRecordDiff[];\n IsExpanded: boolean;\n}\n\ninterface ClientRecordDiff {\n RecordID: string;\n ChangeType: 'Modified' | 'Unchanged';\n FieldChanges: FieldChangeView[];\n}\n\ninterface DependencyEntityView {\n EntityName: string;\n RelationshipField: string;\n Children: DependencyEntityView[];\n Depth: number;\n IsExpanded: boolean;\n}\n\ninterface RecordChangeRow {\n ID: string;\n EntityID: string;\n RecordID: string;\n FullRecordJSON: string;\n ChangedAt: string;\n}\n\n// =========================================================================\n// Component\n// =========================================================================\n\n@Component({\n standalone: false,\n selector: 'mj-label-detail-panel',\n templateUrl: './label-detail.component.html',\n styleUrls: ['./label-detail.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class MjLabelDetailComponent extends BaseAngularComponent implements OnInit, OnDestroy {\n @Input() Label!: MJVersionLabelEntityType;\n @Input() AllLabels: MJVersionLabelEntityType[] = [];\n @Input() ItemCountMap = new Map<string, number>();\n @Output() Close = new EventEmitter<void>();\n @Output() LabelUpdated = new EventEmitter<void>();\n @Output() EntityLinkClick = new EventEmitter<EntityLinkClickEvent>();\n\n // Tab state\n public ActiveTab: DetailTab = 'overview';\n\n // Animation\n public IsVisible = false;\n\n // Data\n public LabelItems: MJVersionLabelItemEntityType[] = [];\n public ChildLabels: MJVersionLabelEntityType[] = [];\n public IsLoadingItems = true;\n public IsArchiving = false;\n\n // Overview stats\n public UniqueEntityCount = 0;\n public CreatorName = '';\n\n /** Record display name resolved via IsNameField (shown on overview when Scope=Record) */\n public OverviewRecordName = '';\n /** Entity icon for the overview tab */\n public OverviewEntityIcon = 'fa-solid fa-table';\n\n // Snapshot tab\n public SnapshotGroups: SnapshotEntityGroup[] = [];\n public SnapshotViewMode: 'card' | 'list' = 'list';\n public SnapshotSearch = '';\n public SnapshotSortBy: 'name' | 'count' = 'count';\n public SnapshotSortDir: 'asc' | 'desc' = 'desc';\n public FilteredSnapshotGroups: SnapshotEntityGroup[] = [];\n\n // Changes tab (lazy)\n public DiffResult: ClientDiffResult | null = null;\n public IsLoadingDiff = false;\n private diffLoaded = false;\n\n // Dependencies tab (lazy)\n public DependencyTree: DependencyEntityView[] = [];\n public IsLoadingDependencies = false;\n private dependenciesLoaded = false;\n\n // History tab (lazy)\n public Restores: MJVersionLabelRestoreEntityType[] = [];\n public RelatedLabels: MJVersionLabelEntityType[] = [];\n public IsLoadingHistory = false;\n private historyLoaded = false;\n\n // Micro view (inline)\n public MicroViewRecord: MicroViewData | null = null;\n public ShowMicroView = false;\n public BreadcrumbLabel = '';\n\n // Resize\n public PanelWidthPx = 0;\n private isResizing = false;\n private resizeMinWidth = 400;\n private resizeMaxWidthRatio = 0.92;\n private static readonly PREFS_KEY = 'VersionHistory.DetailPanel.UserPreferences';\n\n private get metadata() { return this.ProviderToUse; }\n private destroy$ = new Subject<void>();\n\n // Bound handlers for resize (need references for removeEventListener)\n private boundOnResizeMove = this.onResizeMove.bind(this);\n private boundOnResizeEnd = this.onResizeEnd.bind(this);\n\n constructor(private cdr: ChangeDetectorRef, private ngZone: NgZone, private elRef: ElementRef) { super(); }\n\n // =========================================================================\n // Lifecycle\n // =========================================================================\n\n ngOnInit(): void {\n this.loadPanelPreferences();\n // Animate in on next microtask\n Promise.resolve().then(() => {\n this.IsVisible = true;\n this.cdr.markForCheck();\n });\n this.computeChildLabels();\n this.loadLabelItems();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n // Clean up any in-progress resize\n document.removeEventListener('mousemove', this.boundOnResizeMove);\n document.removeEventListener('mouseup', this.boundOnResizeEnd);\n }\n\n @HostListener('document:keydown.escape')\n public OnEscapeKey(): void {\n if (this.ShowMicroView) {\n this.OnBackFromMicroView();\n } else {\n this.OnClose();\n }\n }\n\n // =========================================================================\n // Panel actions\n // =========================================================================\n\n public OnClose(): void {\n this.IsVisible = false;\n this.cdr.markForCheck();\n // Wait for CSS transition to complete\n setTimeout(() => this.Close.emit(), 300);\n }\n\n public OnBackdropClick(): void {\n if (!this.ShowMicroView) {\n this.OnClose();\n }\n }\n\n public OnTabChange(tab: DetailTab): void {\n this.ActiveTab = tab;\n this.loadTabData(tab);\n this.cdr.markForCheck();\n }\n\n // =========================================================================\n // Label actions\n // =========================================================================\n\n public async OnArchive(): Promise<void> {\n if (this.IsArchiving || this.Label.Status === 'Archived') return;\n\n this.IsArchiving = true;\n this.cdr.markForCheck();\n\n try {\n const md = this.ProviderToUse;\n const label = await md.GetEntityObject<MJVersionLabelEntity>('MJ: Version Labels');\n await label.InnerLoad(CompositeKey.FromID(this.Label.ID));\n label.Status = 'Archived';\n const saved = await label.Save();\n if (saved) {\n this.Label.Status = 'Archived';\n this.LabelUpdated.emit();\n }\n } catch (e) {\n console.error('Error archiving label:', e);\n } finally {\n this.ngZone.run(() => {\n this.IsArchiving = false;\n this.cdr.markForCheck();\n });\n }\n }\n\n // =========================================================================\n // Data loading\n // =========================================================================\n\n private computeChildLabels(): void {\n this.ChildLabels = this.AllLabels.filter(l => UUIDsEqual(l.ParentID, this.Label.ID));\n }\n\n private async loadLabelItems(): Promise<void> {\n this.IsLoadingItems = true;\n this.cdr.markForCheck();\n\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView<MJVersionLabelItemEntityType>({\n EntityName: 'MJ: Version Label Items',\n ExtraFilter: `VersionLabelID = '${this.Label.ID}'`,\n ResultType: 'simple'\n });\n\n if (result.Success) {\n this.LabelItems = result.Results;\n this.computeOverviewStats();\n this.buildSnapshotGroups();\n }\n } catch (e) {\n console.error('Error loading label items:', e);\n } finally {\n this.ngZone.run(() => {\n this.IsLoadingItems = false;\n this.cdr.markForCheck();\n });\n }\n }\n\n private computeOverviewStats(): void {\n const entityIds = new Set(this.LabelItems.map(i => i.EntityID ?? '').filter(Boolean));\n this.UniqueEntityCount = entityIds.size;\n this.CreatorName = this.Label.CreatedByUser ?? '';\n\n // Resolve entity icon for overview\n if (this.Label.EntityID) {\n this.OverviewEntityIcon = this.resolveEntityIcon(this.Label.EntityID);\n }\n\n // Resolve record display name for Record-scoped labels\n if (this.Label.Scope === 'Record' && this.Label.RecordID && this.Label.EntityID) {\n this.loadOverviewRecordName();\n }\n }\n\n /**\n * For Record-scoped labels, load the record's display name via GetEntityRecordNames.\n */\n private async loadOverviewRecordName(): Promise<void> {\n const entityName = this.resolveEntityName(this.Label.EntityID ?? '');\n if (!entityName || entityName === 'Unknown') return;\n\n const rawId = this.extractRawRecordId(this.Label.RecordID ?? '');\n if (!rawId) return;\n\n try {\n const input = new EntityRecordNameInput();\n input.EntityName = entityName;\n // RecordID is a CompositeKey segment (\"ID|<uuid>\", or composite) — parse it against the\n // entity's real key column(s) rather than stripping the prefix and assuming `ID`.\n input.CompositeKey = CompositeKey.FromURLSegment(this.metadata.EntityByName(entityName), this.Label.RecordID ?? '');\n\n const results = await this.metadata.GetEntityRecordNames([input]);\n const recordName = results.length > 0 && results[0].Success ? results[0].RecordName : undefined;\n if (recordName) {\n this.ngZone.run(() => {\n this.OverviewRecordName = recordName;\n this.cdr.markForCheck();\n });\n }\n } catch (e) {\n console.error('Error loading overview record name:', e);\n }\n }\n\n private buildSnapshotGroups(): void {\n const groupMap = new Map<string, { entityId: string; items: SnapshotItemView[] }>();\n\n for (const item of this.LabelItems) {\n const entityId = item.EntityID ?? '';\n const entityName = this.resolveEntityName(entityId);\n const key = entityName || entityId;\n\n if (!groupMap.has(key)) {\n groupMap.set(key, { entityId, items: [] });\n }\n\n const displayName = this.buildInitialDisplayName(item);\n groupMap.get(key)!.items.push({\n RecordID: item.RecordID ?? '',\n RecordChangeID: item.RecordChangeID ?? '',\n DisplayName: displayName,\n FieldPreview: '',\n FullRecordJSON: null\n });\n }\n\n this.SnapshotGroups = Array.from(groupMap.entries())\n .map(([name, group]) => ({\n EntityName: name,\n EntityID: group.entityId,\n EntityIcon: this.resolveEntityIcon(group.entityId),\n Items: group.items,\n IsExpanded: false,\n IsLoadingNames: false,\n NamesLoaded: false\n }));\n\n this.applySortAndFilter();\n }\n\n /**\n * Initial display name before lazy-loading (just the shortened raw ID).\n * Real names are loaded via loadGroupRecordNames() when the group is expanded.\n */\n private buildInitialDisplayName(item: MJVersionLabelItemEntityType): string {\n const rawId = this.extractRawRecordId(item.RecordID ?? '');\n return rawId.length > 20 ? rawId.substring(0, 20) + '...' : rawId;\n }\n\n /** Extract the raw ID value from a potentially formatted \"ID|<uuid>\" string. */\n private extractRawRecordId(recordId: string): string {\n if (!recordId) return '';\n const parts = recordId.split('||');\n if (parts.length === 1) {\n const singleParts = recordId.split('|');\n if (singleParts.length === 2) {\n return singleParts[1];\n }\n }\n return recordId;\n }\n\n /** Apply current sort + search filter to snapshot groups. */\n private applySortAndFilter(): void {\n const sorted = [...this.SnapshotGroups].sort((a, b) => {\n if (this.SnapshotSortBy === 'name') {\n const cmp = a.EntityName.localeCompare(b.EntityName);\n return this.SnapshotSortDir === 'asc' ? cmp : -cmp;\n }\n // sort by count\n const cmp = a.Items.length - b.Items.length;\n return this.SnapshotSortDir === 'asc' ? cmp : -cmp;\n });\n\n if (!this.SnapshotSearch) {\n this.FilteredSnapshotGroups = sorted;\n return;\n }\n\n const search = this.SnapshotSearch.toLowerCase();\n this.FilteredSnapshotGroups = sorted\n .filter(g => g.EntityName.toLowerCase().includes(search) ||\n g.Items.some(i => i.RecordID.toLowerCase().includes(search) || i.DisplayName.toLowerCase().includes(search)))\n .map(g => ({\n ...g,\n Items: g.Items.filter(i =>\n i.RecordID.toLowerCase().includes(search) ||\n i.DisplayName.toLowerCase().includes(search) ||\n g.EntityName.toLowerCase().includes(search)\n )\n }));\n }\n\n private loadTabData(tab: DetailTab): void {\n switch (tab) {\n case 'changes':\n if (!this.diffLoaded) {\n this.loadDiffData();\n }\n break;\n case 'dependencies':\n if (!this.dependenciesLoaded) {\n this.loadDependencyData();\n }\n break;\n case 'history':\n if (!this.historyLoaded) {\n this.loadHistoryData();\n }\n break;\n }\n }\n\n // =========================================================================\n // Changes tab\n // =========================================================================\n\n private async loadDiffData(): Promise<void> {\n this.IsLoadingDiff = true;\n this.cdr.markForCheck();\n\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const entityGroups: ClientDiffEntityGroup[] = [];\n let totalChanged = 0;\n let totalUnchanged = 0;\n\n // Group label items by entity\n const entityItemMap = new Map<string, MJVersionLabelItemEntityType[]>();\n for (const item of this.LabelItems) {\n const entityId = item.EntityID ?? '';\n if (!entityItemMap.has(entityId)) {\n entityItemMap.set(entityId, []);\n }\n entityItemMap.get(entityId)!.push(item);\n }\n\n // For each entity group, load latest RecordChanges and compare\n for (const [entityId, items] of entityItemMap) {\n const entityName = this.resolveEntityName(entityId);\n const records: ClientRecordDiff[] = [];\n\n for (const item of items) {\n const latestChange = await this.loadLatestRecordChange(rv, entityId, item.RecordID ?? '');\n const isModified = latestChange != null && latestChange !== item.RecordChangeID;\n\n if (isModified) {\n totalChanged++;\n records.push({\n RecordID: item.RecordID ?? '',\n ChangeType: 'Modified',\n FieldChanges: await this.computeFieldChanges(rv, item.RecordChangeID ?? '', latestChange)\n });\n } else {\n totalUnchanged++;\n records.push({\n RecordID: item.RecordID ?? '',\n ChangeType: 'Unchanged',\n FieldChanges: []\n });\n }\n }\n\n if (records.some(r => r.ChangeType === 'Modified')) {\n entityGroups.push({\n EntityName: entityName,\n Records: records.filter(r => r.ChangeType === 'Modified'),\n IsExpanded: false\n });\n }\n }\n\n this.DiffResult = {\n Summary: {\n Changed: totalChanged,\n Unchanged: totalUnchanged,\n EntitiesAffected: entityGroups.length\n },\n EntityGroups: entityGroups\n };\n\n this.diffLoaded = true;\n } catch (e) {\n console.error('Error loading diff data:', e);\n } finally {\n this.ngZone.run(() => {\n this.IsLoadingDiff = false;\n this.cdr.markForCheck();\n });\n }\n }\n\n private async loadLatestRecordChange(rv: RunView, entityId: string, recordId: string): Promise<string | null> {\n if (!entityId || !recordId) return null;\n\n const result = await rv.RunView<RecordChangeRow>({\n EntityName: 'MJ: Record Changes',\n ExtraFilter: `EntityID = '${entityId}' AND RecordID = '${recordId}'`,\n OrderBy: 'ChangedAt DESC',\n MaxRows: 1,\n Fields: ['ID'],\n ResultType: 'simple'\n });\n\n if (result.Success && result.Results.length > 0) {\n return result.Results[0].ID;\n }\n return null;\n }\n\n private async computeFieldChanges(rv: RunView, oldChangeId: string, newChangeId: string): Promise<FieldChangeView[]> {\n if (!oldChangeId || !newChangeId) return [];\n\n try {\n const [oldResult, newResult] = await rv.RunViews([\n {\n EntityName: 'MJ: Record Changes',\n ExtraFilter: `ID = '${oldChangeId}'`,\n // 'EntityID' is required, not decorative: field-level security projects a Record Change's\n // payload against the entity the row is ABOUT, and a row arriving without EntityID cannot\n // be resolved — so the payload is withheld. See guides/FIELD_LEVEL_SECURITY_GUIDE.md §3.2.\n Fields: ['EntityID', 'FullRecordJSON'],\n ResultType: 'simple'\n },\n {\n EntityName: 'MJ: Record Changes',\n ExtraFilter: `ID = '${newChangeId}'`,\n // 'EntityID' is required, not decorative: field-level security projects a Record Change's\n // payload against the entity the row is ABOUT, and a row arriving without EntityID cannot\n // be resolved — so the payload is withheld. See guides/FIELD_LEVEL_SECURITY_GUIDE.md §3.2.\n Fields: ['EntityID', 'FullRecordJSON'],\n ResultType: 'simple'\n }\n ]);\n\n if (!oldResult.Success || !newResult.Success) return [];\n if (oldResult.Results.length === 0 || newResult.Results.length === 0) return [];\n\n const oldRow = oldResult.Results[0] as RecordChangeRow;\n const newRow = newResult.Results[0] as RecordChangeRow;\n\n return this.diffRecordJson(oldRow.FullRecordJSON, newRow.FullRecordJSON);\n } catch {\n return [];\n }\n }\n\n private diffRecordJson(oldJson: string, newJson: string): FieldChangeView[] {\n const changes: FieldChangeView[] = [];\n\n try {\n const oldData = JSON.parse(oldJson || '{}') as Record<string, unknown>;\n const newData = JSON.parse(newJson || '{}') as Record<string, unknown>;\n const allKeys = new Set([...Object.keys(oldData), ...Object.keys(newData)]);\n\n for (const key of allKeys) {\n // Skip MJ system fields\n if (key.startsWith('__mj_')) continue;\n\n const oldVal = oldData[key];\n const newVal = newData[key];\n\n if (oldVal === undefined && newVal !== undefined) {\n changes.push({ FieldName: key, OldValue: '', NewValue: this.formatFieldValue(newVal), ChangeType: 'Added' });\n } else if (oldVal !== undefined && newVal === undefined) {\n changes.push({ FieldName: key, OldValue: this.formatFieldValue(oldVal), NewValue: '', ChangeType: 'Removed' });\n } else if (JSON.stringify(oldVal) !== JSON.stringify(newVal)) {\n changes.push({ FieldName: key, OldValue: this.formatFieldValue(oldVal), NewValue: this.formatFieldValue(newVal), ChangeType: 'Modified' });\n }\n }\n } catch {\n // Invalid JSON - skip\n }\n\n return changes;\n }\n\n // =========================================================================\n // Dependencies tab\n // =========================================================================\n\n private loadDependencyData(): void {\n this.IsLoadingDependencies = true;\n this.cdr.markForCheck();\n\n try {\n const entityId = this.Label.EntityID;\n if (!entityId) {\n this.DependencyTree = [];\n this.dependenciesLoaded = true;\n return;\n }\n\n const entityInfo = this.metadata.Entities.find(e => UUIDsEqual(e.ID, entityId));\n if (!entityInfo) {\n this.DependencyTree = [];\n this.dependenciesLoaded = true;\n return;\n }\n\n // Build set of entity names that are actually in the snapshot\n const snapshotEntityNames = this.buildSnapshotEntityNameSet();\n\n this.DependencyTree = this.buildDependencyTree(entityInfo, 0, new Set<string>(), snapshotEntityNames);\n this.dependenciesLoaded = true;\n } catch (e) {\n console.error('Error loading dependency data:', e);\n } finally {\n this.IsLoadingDependencies = false;\n this.cdr.markForCheck();\n }\n }\n\n /**\n * Build a set of entity names that have at least one item in the snapshot.\n * Used to filter the dependency tree to only show entities with captured records.\n */\n private buildSnapshotEntityNameSet(): Set<string> {\n const names = new Set<string>();\n for (const item of this.LabelItems) {\n const entityName = this.resolveEntityName(item.EntityID ?? '');\n if (entityName && entityName !== 'Unknown') {\n names.add(entityName);\n }\n }\n return names;\n }\n\n /**\n * Build the dependency tree, but only include entities that are in the\n * actual snapshot (snapshotEntities). This prevents showing relationship\n * paths that weren't captured (e.g., Conversation Details when there are\n * no conversation records in the snapshot).\n */\n private buildDependencyTree(\n entity: EntityInfo,\n depth: number,\n visited: Set<string>,\n snapshotEntities: Set<string>\n ): DependencyEntityView[] {\n if (depth > 3 || visited.has(entity.Name)) return [];\n visited.add(entity.Name);\n\n const deps: DependencyEntityView[] = [];\n\n // Get One-To-Many relationships (entities that depend on this one)\n const dependents = entity.RelatedEntities.filter(r =>\n r.Type.trim().toUpperCase() === 'ONE TO MANY' &&\n r.RelatedEntity !== entity.Name\n );\n\n for (const rel of dependents) {\n // Only include entities that are actually in the snapshot\n if (!snapshotEntities.has(rel.RelatedEntity)) continue;\n\n const childEntity = this.metadata.Entities.find(e => e.Name === rel.RelatedEntity);\n const children = childEntity\n ? this.buildDependencyTree(childEntity, depth + 1, new Set(visited), snapshotEntities)\n : [];\n\n deps.push({\n EntityName: rel.RelatedEntity,\n RelationshipField: rel.RelatedEntityJoinField,\n Children: children,\n Depth: depth + 1,\n IsExpanded: depth < 1\n });\n }\n\n return deps.sort((a, b) => a.EntityName.localeCompare(b.EntityName));\n }\n\n // =========================================================================\n // History tab\n // =========================================================================\n\n private async loadHistoryData(): Promise<void> {\n this.IsLoadingHistory = true;\n this.cdr.markForCheck();\n\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView<MJVersionLabelRestoreEntityType>({\n EntityName: 'MJ: Version Label Restores',\n ExtraFilter: `VersionLabelID = '${this.Label.ID}'`,\n OrderBy: '__mj_CreatedAt DESC',\n MaxRows: 50,\n ResultType: 'simple'\n });\n\n if (result.Success) {\n this.Restores = result.Results;\n }\n\n // Find related labels (same entity + record)\n this.RelatedLabels = this.AllLabels.filter(l =>\n !UUIDsEqual(l.ID, this.Label.ID) &&\n UUIDsEqual(l.EntityID, this.Label.EntityID) &&\n UUIDsEqual(l.RecordID, this.Label.RecordID) &&\n l.RecordID != null\n );\n\n this.historyLoaded = true;\n } catch (e) {\n console.error('Error loading history data:', e);\n } finally {\n this.ngZone.run(() => {\n this.IsLoadingHistory = false;\n this.cdr.markForCheck();\n });\n }\n }\n\n // =========================================================================\n // Snapshot interactions\n // =========================================================================\n\n public ToggleSnapshotGroup(group: SnapshotEntityGroup): void {\n group.IsExpanded = !group.IsExpanded;\n if (group.IsExpanded && !group.NamesLoaded) {\n this.loadGroupRecordNames(group);\n }\n this.cdr.markForCheck();\n }\n\n /**\n * Lazy-load record display names for a group using Metadata.GetEntityRecordNames.\n * Only called when a group is first expanded.\n */\n private async loadGroupRecordNames(group: SnapshotEntityGroup): Promise<void> {\n group.IsLoadingNames = true;\n this.cdr.markForCheck();\n\n try {\n const groupEntity = this.metadata.EntityByName(group.EntityName);\n const inputs: EntityRecordNameInput[] = group.Items.map(item => {\n const input = new EntityRecordNameInput();\n input.EntityName = group.EntityName;\n input.CompositeKey = CompositeKey.FromURLSegment(groupEntity, item.RecordID);\n return input;\n });\n\n const results = await this.metadata.GetEntityRecordNames(inputs);\n\n for (const result of results) {\n if (result.Success && result.RecordName) {\n // Match result back to the item by composite key value\n const resultId = result.CompositeKey?.KeyValuePairs?.[0]?.Value;\n if (resultId) {\n const item = group.Items.find(i =>\n this.extractRawRecordId(i.RecordID) === String(resultId)\n );\n if (item) {\n item.DisplayName = result.RecordName;\n }\n }\n }\n }\n } catch (e) {\n console.error('Error loading record names for group:', group.EntityName, e);\n } finally {\n this.ngZone.run(() => {\n group.IsLoadingNames = false;\n group.NamesLoaded = true;\n this.cdr.markForCheck();\n });\n }\n }\n\n public OnSnapshotSearchChange(text: string): void {\n this.SnapshotSearch = text;\n this.applySortAndFilter();\n this.cdr.markForCheck();\n }\n\n public OnSnapshotSortChange(sortBy: 'name' | 'count'): void {\n if (this.SnapshotSortBy === sortBy) {\n // Toggle direction if clicking same sort\n this.SnapshotSortDir = this.SnapshotSortDir === 'asc' ? 'desc' : 'asc';\n } else {\n this.SnapshotSortBy = sortBy;\n this.SnapshotSortDir = sortBy === 'name' ? 'asc' : 'desc';\n }\n this.applySortAndFilter();\n this.cdr.markForCheck();\n }\n\n public ToggleSnapshotViewMode(): void {\n this.SnapshotViewMode = this.SnapshotViewMode === 'card' ? 'list' : 'card';\n this.cdr.markForCheck();\n }\n\n // =========================================================================\n // Diff interactions\n // =========================================================================\n\n public ToggleDiffGroup(group: ClientDiffEntityGroup): void {\n group.IsExpanded = !group.IsExpanded;\n this.cdr.markForCheck();\n }\n\n public ExpandAllDiffGroups(): void {\n if (!this.DiffResult) return;\n for (const group of this.DiffResult.EntityGroups) {\n group.IsExpanded = true;\n }\n this.cdr.markForCheck();\n }\n\n public CollapseAllDiffGroups(): void {\n if (!this.DiffResult) return;\n for (const group of this.DiffResult.EntityGroups) {\n group.IsExpanded = false;\n }\n this.cdr.markForCheck();\n }\n\n // =========================================================================\n // Dependency interactions\n // =========================================================================\n\n public ToggleDependencyNode(node: DependencyEntityView): void {\n node.IsExpanded = !node.IsExpanded;\n this.cdr.markForCheck();\n }\n\n // =========================================================================\n // Micro view (inline navigation)\n // =========================================================================\n\n public OpenMicroView(entityName: string, recordId: string, recordChangeId: string, displayName?: string): void {\n const label = displayName || this.extractRawRecordId(recordId).substring(0, 12) + '...';\n this.BreadcrumbLabel = `${entityName} / ${label}`;\n this.MicroViewRecord = {\n EntityName: entityName,\n EntityID: '',\n RecordID: recordId,\n RecordChangeID: recordChangeId,\n FullRecordJSON: null,\n FieldDiffs: null\n };\n this.ShowMicroView = true;\n this.cdr.markForCheck();\n }\n\n public OnBackFromMicroView(): void {\n this.ShowMicroView = false;\n this.MicroViewRecord = null;\n this.cdr.markForCheck();\n }\n\n public OnEntityLinkClick(event: EntityLinkClickEvent): void {\n this.EntityLinkClick.emit(event);\n }\n\n public OnOpenRecordClick(event: EntityLinkClickEvent): void {\n this.EntityLinkClick.emit(event);\n }\n\n /** Open the record referenced by a Record-scoped label via navigation. */\n public OnOpenOverviewRecord(): void {\n if (!this.Label.EntityID || !this.Label.RecordID) return;\n const entityName = this.resolveEntityName(this.Label.EntityID);\n const rawId = this.extractRawRecordId(this.Label.RecordID);\n const pkey = CompositeKey.FromURLSegment(this.metadata.EntityByName(entityName), this.Label.RecordID);\n this.EntityLinkClick.emit({\n EntityName: entityName,\n RecordID: rawId,\n CompositeKey: pkey\n });\n }\n\n // =========================================================================\n // Resize handling\n // =========================================================================\n\n public OnResizeStart(event: MouseEvent): void {\n event.preventDefault();\n this.isResizing = true;\n document.body.style.cursor = 'col-resize';\n document.body.style.userSelect = 'none';\n\n // Run outside Angular zone for performance during drag\n this.ngZone.runOutsideAngular(() => {\n document.addEventListener('mousemove', this.boundOnResizeMove);\n document.addEventListener('mouseup', this.boundOnResizeEnd);\n });\n }\n\n private onResizeMove(event: MouseEvent): void {\n if (!this.isResizing) return;\n\n const viewportWidth = window.innerWidth;\n const maxWidth = viewportWidth * this.resizeMaxWidthRatio;\n const newWidth = Math.max(this.resizeMinWidth, Math.min(maxWidth, viewportWidth - event.clientX));\n\n this.PanelWidthPx = newWidth;\n this.ngZone.run(() => this.cdr.markForCheck());\n }\n\n private onResizeEnd(): void {\n if (!this.isResizing) return;\n this.isResizing = false;\n document.body.style.cursor = '';\n document.body.style.userSelect = '';\n document.removeEventListener('mousemove', this.boundOnResizeMove);\n document.removeEventListener('mouseup', this.boundOnResizeEnd);\n this.savePanelPreferences();\n }\n\n // =========================================================================\n // Panel preferences\n // =========================================================================\n\n private loadPanelPreferences(): void {\n // Default to 65% of viewport\n this.PanelWidthPx = Math.max(this.resizeMinWidth, Math.min(window.innerWidth * 0.65, 1000));\n\n try {\n const raw = UserInfoEngine.Instance.GetSetting(MjLabelDetailComponent.PREFS_KEY);\n if (raw) {\n const prefs = JSON.parse(raw) as { PanelWidthPx?: number };\n if (prefs.PanelWidthPx && prefs.PanelWidthPx >= this.resizeMinWidth) {\n this.PanelWidthPx = Math.min(prefs.PanelWidthPx, window.innerWidth * this.resizeMaxWidthRatio);\n }\n }\n } catch {\n // Use defaults\n }\n }\n\n private savePanelPreferences(): void {\n try {\n const prefs = JSON.stringify({ PanelWidthPx: Math.round(this.PanelWidthPx) });\n UserInfoEngine.Instance.SetSettingDebounced(MjLabelDetailComponent.PREFS_KEY, prefs);\n } catch {\n // Ignore save errors\n }\n }\n\n // =========================================================================\n // Display helpers\n // =========================================================================\n\n /** Check if a label is the parent of the current Label (case-insensitive UUID comparison). */\n public IsParentLabel(pl: MJVersionLabelEntityType): boolean {\n return UUIDsEqual(pl.ID, this.Label.ParentID);\n }\n\n public resolveEntityName(entityId: string | null | undefined): string {\n if (!entityId) return 'Unknown';\n const entity = this.metadata.Entities.find(e => UUIDsEqual(e.ID, entityId));\n return entity ? entity.Name : 'Unknown';\n }\n\n /** Resolve icon CSS class for an entity by ID, falling back to generic table icon. */\n public resolveEntityIcon(entityId: string): string {\n if (!entityId) return 'fa-solid fa-table';\n const entity = this.metadata.Entities.find(e => UUIDsEqual(e.ID, entityId));\n return entity?.Icon || 'fa-solid fa-table';\n }\n\n /** Resolve icon CSS class for an entity by name, falling back to generic table icon. */\n public resolveEntityIconByName(entityName: string): string {\n if (!entityName) return 'fa-solid fa-table';\n const entity = this.metadata.Entities.find(e => e.Name === entityName);\n return entity?.Icon || 'fa-solid fa-table';\n }\n\n /** Format a record ID for display — strips 'ID|' prefix for single-value PKs. */\n public FormatRecordID(recordId: string | undefined): string {\n return this.extractRawRecordId(recordId ?? '');\n }\n\n public GetScopeIcon(scope: string | undefined): string {\n const icons: Record<string, string> = {\n 'System': 'fa-solid fa-globe',\n 'Entity': 'fa-solid fa-table',\n 'Record': 'fa-solid fa-file'\n };\n return icons[scope ?? ''] ?? 'fa-solid fa-tag';\n }\n\n public GetStatusClass(status: string | undefined): string {\n const classes: Record<string, string> = {\n 'Active': 'status-active',\n 'Archived': 'status-archived',\n 'Restored': 'status-restored'\n };\n return classes[status ?? ''] ?? '';\n }\n\n public GetChangeTypeClass(changeType: string): string {\n const classes: Record<string, string> = {\n 'Added': 'change-added',\n 'Modified': 'change-modified',\n 'Removed': 'change-removed'\n };\n return classes[changeType] ?? '';\n }\n\n public GetChangeTypeIcon(changeType: string): string {\n const icons: Record<string, string> = {\n 'Added': 'fa-solid fa-plus-circle',\n 'Modified': 'fa-solid fa-pen-to-square',\n 'Removed': 'fa-solid fa-minus-circle'\n };\n return icons[changeType] ?? 'fa-solid fa-circle';\n }\n\n public FormatDate(date: Date | string | undefined): string {\n if (!date) return '';\n const d = date instanceof Date ? date : new Date(date);\n return d.toLocaleDateString('en-US', {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n hour: '2-digit',\n minute: '2-digit'\n });\n }\n\n public FormatRelativeDate(date: Date | string | undefined): string {\n if (!date) return '';\n const d = date instanceof Date ? date : new Date(date);\n const now = new Date();\n const diffMs = now.getTime() - d.getTime();\n const diffMins = Math.floor(diffMs / 60000);\n const diffHours = Math.floor(diffMs / 3600000);\n const diffDays = Math.floor(diffMs / 86400000);\n\n if (diffMins < 1) return 'Just now';\n if (diffMins < 60) return `${diffMins}m ago`;\n if (diffHours < 24) return `${diffHours}h ago`;\n if (diffDays < 7) return `${diffDays}d ago`;\n\n return d.toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric' });\n }\n\n public FormatDuration(ms: number | undefined): string {\n if (!ms) return '';\n if (ms < 1000) return `${ms}ms`;\n return `${(ms / 1000).toFixed(1)}s`;\n }\n\n public GetItemCount(labelId: string | undefined): number {\n return this.ItemCountMap.get(labelId ?? '') ?? 0;\n }\n\n private formatFieldValue(value: unknown): string {\n if (value == null) return 'null';\n if (typeof value === 'object') return JSON.stringify(value);\n return String(value);\n }\n}\n","<!-- Backdrop overlay -->\n<div class=\"panel-backdrop\" [class.visible]=\"IsVisible\" (click)=\"OnBackdropClick()\"></div>\n\n<!-- Slide-in panel -->\n<div class=\"detail-panel\" [class.visible]=\"IsVisible\" [style.width.px]=\"PanelWidthPx\">\n <!-- Resize handle -->\n <div class=\"resize-handle\" (mousedown)=\"OnResizeStart($event)\">\n <div class=\"resize-handle-grip\"></div>\n </div>\n\n <!-- ============================================================ -->\n <!-- HEADER -->\n <!-- ============================================================ -->\n <div class=\"panel-header\">\n <div class=\"header-info\">\n <div class=\"header-title-row\">\n <i [class]=\"GetScopeIcon(Label.Scope)\" class=\"header-scope-icon\"></i>\n <h2 class=\"header-title\">{{Label.Name}}</h2>\n <span class=\"header-status\" [ngClass]=\"GetStatusClass(Label.Status)\">\n {{Label.Status}}\n </span>\n <span class=\"header-scope-badge\">{{Label.Scope}}</span>\n </div>\n @if (Label.Description) {\n <p class=\"header-description\">{{Label.Description}}</p>\n }\n </div>\n <div class=\"header-actions\">\n <button class=\"header-action-btn\" (click)=\"OnArchive()\"\n [disabled]=\"IsArchiving || Label.Status === 'Archived'\"\n title=\"Archive this label\">\n <i class=\"fa-solid fa-box-archive\"></i>\n </button>\n <button class=\"header-action-btn\" (click)=\"OnTabChange('changes')\" title=\"View changes\">\n <i class=\"fa-solid fa-code-compare\"></i>\n </button>\n <button class=\"close-btn\" (click)=\"OnClose()\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n </div>\n\n <!-- ============================================================ -->\n <!-- SUMMARY KPIs -->\n <!-- ============================================================ -->\n <div class=\"summary-kpis\">\n <div class=\"summary-kpi\">\n <div class=\"kpi-mini-icon\" style=\"background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent); color: var(--mj-brand-primary);\">\n <i class=\"fa-solid fa-camera\"></i>\n </div>\n <div class=\"kpi-mini-content\">\n <span class=\"kpi-mini-value\">{{LabelItems.length || Label.ItemCount || GetItemCount(Label.ID)}}</span>\n <span class=\"kpi-mini-label\">Items</span>\n </div>\n </div>\n <div class=\"summary-kpi\">\n <div class=\"kpi-mini-icon\" style=\"background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent); color: var(--mj-brand-primary);\">\n <i class=\"fa-solid fa-table\"></i>\n </div>\n <div class=\"kpi-mini-content\">\n <span class=\"kpi-mini-value\">{{UniqueEntityCount}}</span>\n <span class=\"kpi-mini-label\">Entities</span>\n </div>\n </div>\n @if (Label.CreationDurationMS) {\n <div class=\"summary-kpi\">\n <div class=\"kpi-mini-icon\" style=\"background: rgba(16, 185, 129, 0.1); color: #10b981;\">\n <i class=\"fa-solid fa-stopwatch\"></i>\n </div>\n <div class=\"kpi-mini-content\">\n <span class=\"kpi-mini-value\">{{FormatDuration(Label.CreationDurationMS)}}</span>\n <span class=\"kpi-mini-label\">Duration</span>\n </div>\n </div>\n }\n @if (ChildLabels.length > 0) {\n <div class=\"summary-kpi\">\n <div class=\"kpi-mini-icon\" style=\"background: rgba(245, 158, 11, 0.1); color: #f59e0b;\">\n <i class=\"fa-solid fa-layer-group\"></i>\n </div>\n <div class=\"kpi-mini-content\">\n <span class=\"kpi-mini-value\">{{ChildLabels.length}}</span>\n <span class=\"kpi-mini-label\">Children</span>\n </div>\n </div>\n }\n </div>\n\n <!-- ============================================================ -->\n <!-- TAB BAR (hidden when micro-view is active) -->\n <!-- ============================================================ -->\n @if (!ShowMicroView) {\n <div class=\"tab-bar\">\n <button class=\"tab\" [class.active]=\"ActiveTab === 'overview'\" (click)=\"OnTabChange('overview')\">\n <i class=\"fa-solid fa-info-circle tab-icon\"></i> Overview\n </button>\n <button class=\"tab\" [class.active]=\"ActiveTab === 'snapshots'\" (click)=\"OnTabChange('snapshots')\">\n <i class=\"fa-solid fa-camera tab-icon\"></i> Snapshots\n @if (LabelItems.length > 0) {\n <span class=\"tab-count\">{{LabelItems.length}}</span>\n }\n </button>\n <button class=\"tab\" [class.active]=\"ActiveTab === 'dependencies'\" (click)=\"OnTabChange('dependencies')\">\n <i class=\"fa-solid fa-diagram-project tab-icon\"></i> Dependencies\n </button>\n <button class=\"tab\" [class.active]=\"ActiveTab === 'changes'\" (click)=\"OnTabChange('changes')\">\n <i class=\"fa-solid fa-code-compare tab-icon\"></i> Changes\n </button>\n <button class=\"tab\" [class.active]=\"ActiveTab === 'history'\" (click)=\"OnTabChange('history')\">\n <i class=\"fa-solid fa-clock-rotate-left tab-icon\"></i> History\n </button>\n </div>\n }\n\n <!-- ============================================================ -->\n <!-- BREADCRUMB (shown when micro-view is active) -->\n <!-- ============================================================ -->\n @if (ShowMicroView) {\n <div class=\"breadcrumb-bar\">\n <button class=\"breadcrumb-back\" (click)=\"OnBackFromMicroView()\">\n <i class=\"fa-solid fa-arrow-left\"></i>\n </button>\n <div class=\"breadcrumb-trail\">\n <span class=\"breadcrumb-item clickable\" (click)=\"OnBackFromMicroView()\">\n <i class=\"fa-solid fa-camera breadcrumb-icon\"></i> Snapshots\n </span>\n <i class=\"fa-solid fa-chevron-right breadcrumb-separator\"></i>\n <span class=\"breadcrumb-item current\">\n <i class=\"fa-solid fa-file-lines breadcrumb-icon\"></i> {{BreadcrumbLabel}}\n </span>\n </div>\n </div>\n }\n\n <!-- ============================================================ -->\n <!-- TAB CONTENT (scrollable) - or inline micro-view -->\n <!-- ============================================================ -->\n @if (!ShowMicroView) {\n <div class=\"tab-content\">\n <!-- Loading state for items -->\n @if (IsLoadingItems && ActiveTab !== 'dependencies') {\n <mj-loading text=\"Loading label data...\"></mj-loading>\n }\n <!-- ======================================================== -->\n <!-- OVERVIEW TAB -->\n <!-- ======================================================== -->\n @if (ActiveTab === 'overview' && !IsLoadingItems) {\n <div class=\"tab-pane\">\n <!-- Metadata section -->\n <div class=\"detail-section\">\n <h3 class=\"section-title\">\n <i class=\"fa-solid fa-info-circle section-icon\"></i> Label Details\n </h3>\n <div class=\"detail-grid\">\n <div class=\"detail-field\">\n <span class=\"field-label\">Name</span>\n <span class=\"field-value\">{{Label.Name}}</span>\n </div>\n <div class=\"detail-field\">\n <span class=\"field-label\">Status</span>\n <span class=\"field-value\">\n <span class=\"inline-badge\" [ngClass]=\"GetStatusClass(Label.Status)\">{{Label.Status}}</span>\n </span>\n </div>\n <div class=\"detail-field\">\n <span class=\"field-label\">Scope</span>\n <span class=\"field-value\">\n <i [class]=\"GetScopeIcon(Label.Scope)\" style=\"margin-right: 6px;\"></i>{{Label.Scope}}\n </span>\n </div>\n @if (Label.EntityID) {\n <div class=\"detail-field\">\n <span class=\"field-label\">Entity</span>\n <span class=\"field-value\">\n <i [class]=\"OverviewEntityIcon\" style=\"margin-right: 6px; color: var(--mj-brand-primary);\"></i>{{Label.Entity ?? resolveEntityName(Label.EntityID)}}\n </span>\n </div>\n }\n @if (Label.RecordID && Label.Scope !== 'Record') {\n <div class=\"detail-field\">\n <span class=\"field-label\">Record ID</span>\n <span class=\"field-value field-mono\">{{FormatRecordID(Label.RecordID)}}</span>\n </div>\n }\n @if (Label.ExternalSystemID) {\n <div class=\"detail-field\">\n <span class=\"field-label\">External Ref</span>\n <span class=\"field-value field-mono\">{{Label.ExternalSystemID}}</span>\n </div>\n }\n </div>\n </div>\n <!-- Record card (Record-scoped labels) -->\n @if (Label.Scope === 'Record' && Label.RecordID) {\n <div class=\"record-card\">\n <div class=\"record-card-main\">\n <i [class]=\"OverviewEntityIcon\" class=\"record-card-icon\"></i>\n <div class=\"record-card-info\">\n @if (OverviewRecordName) {\n <span class=\"record-card-name\">{{OverviewRecordName}}</span>\n }\n @if (!OverviewRecordName) {\n <span class=\"record-card-name record-card-name-loading\">Loading...</span>\n }\n <span class=\"record-card-entity\">{{Label.Entity ?? resolveEntityName(Label.EntityID)}}</span>\n <span class=\"record-card-id\">{{FormatRecordID(Label.RecordID)}}</span>\n </div>\n </div>\n <button class=\"record-card-open-btn\" (click)=\"OnOpenOverviewRecord()\" title=\"Open record\">\n <i class=\"fa-solid fa-arrow-up-right-from-square\"></i> Open\n </button>\n </div>\n }\n <!-- Description -->\n @if (Label.Description) {\n <div class=\"detail-section\">\n <h3 class=\"section-title\">\n <i class=\"fa-solid fa-align-left section-icon\"></i> Description\n </h3>\n <p class=\"description-text\">{{Label.Description}}</p>\n </div>\n }\n <!-- Creation info -->\n <div class=\"detail-section\">\n <h3 class=\"section-title\">\n <i class=\"fa-solid fa-clock section-icon\"></i> Creation\n </h3>\n <div class=\"detail-grid\">\n <div class=\"detail-field\">\n <span class=\"field-label\">Created</span>\n <span class=\"field-value\">{{FormatDate(Label.__mj_CreatedAt)}}</span>\n </div>\n @if (Label.CreatedByUser) {\n <div class=\"detail-field\">\n <span class=\"field-label\">Created By</span>\n <span class=\"field-value\">\n <i class=\"fa-solid fa-user\" style=\"margin-right: 6px; opacity: 0.5;\"></i>{{Label.CreatedByUser}}\n </span>\n </div>\n }\n @if (Label.CreationDurationMS) {\n <div class=\"detail-field\">\n <span class=\"field-label\">Capture Duration</span>\n <span class=\"field-value\">{{FormatDuration(Label.CreationDurationMS)}}</span>\n </div>\n }\n <div class=\"detail-field\">\n <span class=\"field-label\">Items Captured</span>\n <span class=\"field-value\">{{LabelItems.length}}</span>\n </div>\n </div>\n </div>\n <!-- Parent / Children -->\n @if (Label.ParentID || ChildLabels.length > 0) {\n <div class=\"detail-section\">\n <h3 class=\"section-title\">\n <i class=\"fa-solid fa-sitemap section-icon\"></i> Hierarchy\n </h3>\n <!-- Parent reference -->\n @if (Label.ParentID) {\n <div class=\"hierarchy-item parent\">\n <i class=\"fa-solid fa-arrow-up hierarchy-icon\"></i>\n <span class=\"hierarchy-label\">Parent:</span>\n <span class=\"hierarchy-name\">\n @for (pl of AllLabels; track pl) {\n @if (IsParentLabel(pl)) {\n <span>{{pl.Name}}</span>\n }\n }\n </span>\n </div>\n }\n <!-- Children -->\n @if (ChildLabels.length > 0) {\n <div class=\"hierarchy-children\">\n @for (child of ChildLabels; track child) {\n <div class=\"hierarchy-item child\">\n <i class=\"fa-solid fa-arrow-turn-down-right hierarchy-icon\"></i>\n <span class=\"hierarchy-name\">{{child.Name}}</span>\n @if (child.RecordID) {\n <span class=\"hierarchy-meta\">{{child.RecordID | slice:0:12}}...</span>\n }\n @if (child.ItemCount) {\n <span class=\"hierarchy-meta\">{{child.ItemCount}} items</span>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n <!-- ======================================================== -->\n <!-- SNAPSHOTS TAB -->\n <!-- ======================================================== -->\n @if (ActiveTab === 'snapshots' && !IsLoadingItems) {\n <div class=\"tab-pane\">\n <!-- Snapshot toolbar -->\n <div class=\"snapshot-toolbar\">\n <div class=\"snapshot-search\">\n <i class=\"fa-solid fa-search snapshot-search-icon\"></i>\n <input type=\"text\" class=\"snapshot-search-input\"\n placeholder=\"Search by entity or record...\"\n [ngModel]=\"SnapshotSearch\"\n (ngModelChange)=\"OnSnapshotSearchChange($event)\" />\n </div>\n <div class=\"snapshot-sort-toggle\">\n <button class=\"toggle-btn-sm\" [class.active]=\"SnapshotSortBy === 'name'\"\n (click)=\"OnSnapshotSortChange('name')\" title=\"Sort by name\">\n @if (SnapshotSortBy === 'name' && SnapshotSortDir === 'asc') {\n <i class=\"fa-solid fa-arrow-down-a-z\"></i>\n }\n @if (SnapshotSortBy === 'name' && SnapshotSortDir === 'desc') {\n <i class=\"fa-solid fa-arrow-up-z-a\"></i>\n }\n @if (SnapshotSortBy !== 'name') {\n <i class=\"fa-solid fa-arrow-down-a-z\"></i>\n }\n </button>\n <button class=\"toggle-btn-sm\" [class.active]=\"SnapshotSortBy === 'count'\"\n (click)=\"OnSnapshotSortChange('count')\" title=\"Sort by record count\">\n @if (SnapshotSortBy === 'count' && SnapshotSortDir === 'desc') {\n <i class=\"fa-solid fa-arrow-down-9-1\"></i>\n }\n @if (SnapshotSortBy === 'count' && SnapshotSortDir === 'asc') {\n <i class=\"fa-solid fa-arrow-up-1-9\"></i>\n }\n @if (SnapshotSortBy !== 'count') {\n <i class=\"fa-solid fa-arrow-down-9-1\"></i>\n }\n </button>\n </div>\n <div class=\"snapshot-view-toggle\">\n <button class=\"toggle-btn-sm\" [class.active]=\"SnapshotViewMode === 'list'\" (click)=\"SnapshotViewMode = 'list'\">\n <i class=\"fa-solid fa-list\"></i>\n </button>\n <button class=\"toggle-btn-sm\" [class.active]=\"SnapshotViewMode === 'card'\" (click)=\"SnapshotViewMode = 'card'\">\n <i class=\"fa-solid fa-grip\"></i>\n </button>\n </div>\n </div>\n <!-- Entity groups -->\n <div class=\"snapshot-groups\">\n @for (group of FilteredSnapshotGroups; track group) {\n <mj-accordion-panel Size=\"sm\" [FlushBody]=\"true\"\n [Expanded]=\"group.IsExpanded\" (ExpandedChange)=\"ToggleSnapshotGroup(group)\">\n <ng-template mjAccordionTitle>\n <i [class]=\"group.EntityIcon\" class=\"group-entity-icon\"></i>\n <span class=\"group-name\">{{group.EntityName}}</span>\n <span class=\"mj-accordion-badge mj-accordion-badge--right\">{{group.Items.length}}</span>\n </ng-template>\n <ng-template mjAccordionBody>\n <div class=\"group-content\">\n <!-- Loading names indicator -->\n @if (group.IsLoadingNames) {\n <div class=\"group-names-loading\">\n <mj-loading text=\"Loading record names...\" size=\"small\"></mj-loading>\n </div>\n }\n <!-- List mode -->\n @if (SnapshotViewMode === 'list') {\n @for (item of group.Items; track item) {\n <div class=\"snapshot-list-item\"\n (click)=\"OpenMicroView(group.EntityName, item.RecordID, item.RecordChangeID, item.DisplayName)\">\n <i class=\"fa-solid fa-file-lines snapshot-item-icon\"></i>\n <span class=\"snapshot-item-name\">{{item.DisplayName}}</span>\n <i class=\"fa-solid fa-chevron-right snapshot-item-arrow\"></i>\n </div>\n }\n }\n <!-- Card mode -->\n @if (SnapshotViewMode === 'card') {\n <div class=\"snapshot-cards\">\n @for (item of group.Items; track item) {\n <div class=\"snapshot-card\"\n (click)=\"OpenMicroView(group.EntityName, item.RecordID, item.RecordChangeID, item.DisplayName)\">\n <div class=\"snapshot-card-header\">\n <i class=\"fa-solid fa-file-lines\"></i>\n <span class=\"snapshot-card-name\">{{item.DisplayName}}</span>\n </div>\n </div>\n }\n </div>\n }\n </div>\n </ng-template>\n </mj-accordion-panel>\n }\n </div>\n <!-- Empty state -->\n @if (FilteredSnapshotGroups.length === 0) {\n <mj-empty-state\n Size=\"compact\"\n Icon=\"fa-solid fa-camera\"\n Title=\"No snapshot items found.\" />\n }\n </div>\n }\n <!-- ======================================================== -->\n <!-- DEPENDENCIES TAB -->\n <!-- ======================================================== -->\n @if (ActiveTab === 'dependencies') {\n <div class=\"tab-pane\">\n @if (IsLoadingDependencies) {\n <mj-loading text=\"Loading dependencies...\"></mj-loading>\n }\n @if (!IsLoadingDependencies && Label.EntityID) {\n <div class=\"dep-root\">\n <div class=\"dep-root-entity\">\n <i [class]=\"GetScopeIcon(Label.Scope)\" class=\"dep-root-icon\"></i>\n <span class=\"dep-root-name\">{{Label.Entity ?? resolveEntityName(Label.EntityID)}}</span>\n <span class=\"dep-root-badge\">Root</span>\n </div>\n @if (DependencyTree.length > 0) {\n @for (node of DependencyTree; track node) {\n <ng-container *ngTemplateOutlet=\"depNode; context: { $implicit: node }\"></ng-container>\n }\n }\n @if (DependencyTree.length === 0) {\n <mj-empty-state\n Size=\"compact\"\n Icon=\"fa-solid fa-diagram-project\"\n Title=\"No dependent entities found.\" />\n }\n </div>\n }\n @if (!IsLoadingDependencies && !Label.EntityID) {\n <mj-empty-state\n Size=\"compact\"\n Icon=\"fa-solid fa-diagram-project\"\n Title=\"No entity associated with this label.\" />\n }\n </div>\n }\n <!-- Dependency tree node template -->\n <ng-template #depNode let-node>\n <div class=\"dep-node\" [style.padding-left.px]=\"node.Depth * 24\">\n <div class=\"dep-node-header\" (click)=\"ToggleDependencyNode(node)\">\n @if (node.Children.length > 0) {\n <i class=\"fa-solid fa-chevron-right dep-chevron\"\n [class.expanded]=\"node.IsExpanded\"\n ></i>\n }\n @if (node.Children.length === 0) {\n <span class=\"dep-node-spacer\"></span>\n }\n <i [class]=\"resolveEntityIconByName(node.EntityName)\" class=\"dep-node-icon\"></i>\n <span class=\"dep-node-name\">{{node.EntityName}}</span>\n <span class=\"dep-node-field\">via {{node.RelationshipField}}</span>\n @if (node.Children.length > 0) {\n <span class=\"dep-node-count\">\n {{node.Children.length}} dep{{node.Children.length !== 1 ? 's' : ''}}\n </span>\n }\n </div>\n @if (node.IsExpanded && node.Children.length > 0) {\n @for (child of node.Children; track child) {\n <ng-container *ngTemplateOutlet=\"depNode; context: { $implicit: child }\"></ng-container>\n }\n }\n </div>\n </ng-template>\n <!-- ======================================================== -->\n <!-- CHANGES TAB -->\n <!-- ======================================================== -->\n @if (ActiveTab === 'changes') {\n <div class=\"tab-pane\">\n @if (IsLoadingDiff) {\n <mj-loading text=\"Computing differences...\"></mj-loading>\n }\n @if (!IsLoadingDiff && DiffResult) {\n <!-- Diff summary -->\n <div class=\"diff-summary\">\n <div class=\"diff-stat\">\n <span class=\"diff-stat-value change-modified\">{{DiffResult.Summary.Changed}}</span>\n <span class=\"diff-stat-label\">Changed</span>\n </div>\n <div class=\"diff-stat\">\n <span class=\"diff-stat-value\">{{DiffResult.Summary.Unchanged}}</span>\n <span class=\"diff-stat-label\">Unchanged</span>\n </div>\n <div class=\"diff-stat\">\n <span class=\"diff-stat-value\">{{DiffResult.Summary.EntitiesAffected}}</span>\n <span class=\"diff-stat-label\">Entities</span>\n </div>\n </div>\n <!-- Expand/collapse all -->\n @if (DiffResult.EntityGroups.length > 0) {\n <div class=\"diff-toolbar\">\n <button class=\"toolbar-action-btn\" (click)=\"ExpandAllDiffGroups()\" title=\"Expand all\">\n <i class=\"fa-solid fa-angles-down\"></i>\n <span>Expand All</span>\n </button>\n <button class=\"toolbar-action-btn\" (click)=\"CollapseAllDiffGroups()\" title=\"Collapse all\">\n <i class=\"fa-solid fa-angles-up\"></i>\n <span>Collapse All</span>\n </button>\n </div>\n }\n <!-- Entity diff groups -->\n @if (DiffResult.EntityGroups.length > 0) {\n <div class=\"diff-groups\">\n @for (group of DiffResult.EntityGroups; track group) {\n <mj-accordion-panel Size=\"sm\" [FlushBody]=\"true\"\n [Expanded]=\"group.IsExpanded\" (ExpandedChange)=\"ToggleDiffGroup(group)\">\n <ng-template mjAccordionTitle>\n <i [class]=\"resolveEntityIconByName(group.EntityName)\" class=\"diff-group-icon\"></i>\n <span class=\"diff-group-name\">{{group.EntityName}}</span>\n <span class=\"mj-accordion-badge mj-accordion-badge--warning mj-accordion-badge--right\">\n {{group.Records.length}} modified\n </span>\n </ng-template>\n <ng-template mjAccordionBody>\n <div class=\"diff-group-content\">\n @for (record of group.Records; track record) {\n <div class=\"diff-record\">\n <div class=\"diff-record-header\">\n <i [class]=\"GetChangeTypeIcon(record.ChangeType)\" [ngClass]=\"GetChangeTypeClass(record.ChangeType)\"></i>\n <span class=\"diff-record-id\">{{record.RecordID | slice:0:20}}...</span>\n </div>\n @if (record.FieldChanges.length > 0) {\n <div class=\"diff-fields\">\n @for (field of record.FieldChanges; track field) {\n <div class=\"diff-field\"\n [ngClass]=\"GetChangeTypeClass(field.ChangeType)\">\n <span class=\"diff-field-name\">{{field.FieldName}}</span>\n @if (field.OldValue) {\n <span class=\"diff-field-old\">{{field.OldValue | slice:0:40}}</span>\n }\n @if (field.OldValue && field.NewValue) {\n <i class=\"fa-solid fa-arrow-right diff-field-arrow\"></i>\n }\n @if (field.NewValue) {\n <span class=\"diff-field-new\">{{field.NewValue | slice:0:40}}</span>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n </ng-template>\n </mj-accordion-panel>\n }\n </div>\n }\n <!-- No changes -->\n @if (DiffResult.EntityGroups.length === 0 && DiffResult.Summary.Changed === 0) {\n <mj-empty-state\n Size=\"compact\"\n Variant=\"success\"\n Title=\"No changes detected since this label was created.\" />\n }\n }\n </div>\n }\n <!-- ======================================================== -->\n <!-- HISTORY TAB -->\n <!-- ======================================================== -->\n @if (ActiveTab === 'history') {\n <div class=\"tab-pane\">\n @if (IsLoadingHistory) {\n <mj-loading text=\"Loading history...\"></mj-loading>\n }\n @if (!IsLoadingHistory) {\n <!-- Restores -->\n @if (Restores.length > 0) {\n <div class=\"detail-section\">\n <h3 class=\"section-title\">\n <i class=\"fa-solid fa-clock-rotate-left section-icon\"></i> Restore Operations\n </h3>\n <div class=\"history-list\">\n @for (restore of Restores; track restore) {\n <div class=\"history-item\">\n <div class=\"history-item-icon\" [ngClass]=\"'status-' + (restore.Status ?? '').toLowerCase().replace(' ', '-')\">\n <i class=\"fa-solid fa-clock-rotate-left\"></i>\n </div>\n <div class=\"history-item-content\">\n <span class=\"history-item-title\">Restore {{restore.Status}}</span>\n <span class=\"history-item-meta\">\n {{restore.CompletedItems ?? 0}}/{{restore.TotalItems ?? 0}} items\n @if (restore.FailedItems) {\n <span> · {{restore.FailedItems}} failed</span>\n }\n </span>\n </div>\n <span class=\"history-item-date\">{{FormatRelativeDate(restore.__mj_CreatedAt)}}</span>\n </div>\n }\n </div>\n </div>\n }\n <!-- Related labels -->\n @if (RelatedLabels.length > 0) {\n <div class=\"detail-section\">\n <h3 class=\"section-title\">\n <i class=\"fa-solid fa-tags section-icon\"></i> Related Labels\n </h3>\n <div class=\"history-list\">\n @for (related of RelatedLabels; track related) {\n <div class=\"history-item\">\n <div class=\"history-item-icon\" style=\"background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent); color: var(--mj-brand-primary);\">\n <i class=\"fa-solid fa-tag\"></i>\n </div>\n <div class=\"history-item-content\">\n <span class=\"history-item-title\">{{related.Name}}</span>\n <span class=\"history-item-meta\">\n <span class=\"inline-badge small\" [ngClass]=\"GetStatusClass(related.Status)\">{{related.Status}}</span>\n </span>\n </div>\n <span class=\"history-item-date\">{{FormatRelativeDate(related.__mj_CreatedAt)}}</span>\n </div>\n }\n </div>\n </div>\n }\n <!-- Empty -->\n @if (Restores.length === 0 && RelatedLabels.length === 0) {\n <mj-empty-state\n Size=\"compact\"\n Icon=\"fa-solid fa-clock-rotate-left\"\n Title=\"No restore history or related labels found.\" />\n }\n }\n </div>\n }\n </div>\n }\n\n <!-- ============================================================ -->\n <!-- INLINE MICRO VIEW (replaces tab content when active) -->\n <!-- ============================================================ -->\n @if (ShowMicroView && MicroViewRecord) {\n <div class=\"tab-content\">\n <mj-record-micro-view\n [Data]=\"MicroViewRecord\"\n [Inline]=\"true\"\n (Close)=\"OnBackFromMicroView()\"\n (EntityLinkClick)=\"OnEntityLinkClick($event)\"\n (OpenRecord)=\"OnOpenRecordClick($event)\">\n </mj-record-micro-view>\n </div>\n }\n</div>\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"record-micro-view.component.d.ts","sourceRoot":"","sources":["../../../src/lib/record-micro-view/record-micro-view.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,YAAY,EAAE,MAAM,EAAE,iBAAiB,EAAyC,MAAM,eAAe,CAAC;AACzI,OAAO,EAAuB,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEzE,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;;AAEzC,UAAU,YAAY;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,EAAE,OAAO,CAAC;IACtB,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,kGAAkG;IAClG,sBAAsB,EAAE,MAAM,CAAC;IAC/B,kEAAkE;IAClE,oBAAoB,EAAE,MAAM,CAAC;IAC7B,+CAA+C;IAC/C,kBAAkB,EAAE,MAAM,CAAC;CAC9B;AAMD,uEAAuE;AACvE,MAAM,WAAW,oBAAoB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,YAAY,CAAC;CAC9B;AAED,qBAOa,0BAA2B,SAAQ,oBAAqB,YAAW,MAAM;IAwBtE,OAAO,CAAC,GAAG;IAvBd,IAAI,EAAG,aAAa,CAAC;IACrB,MAAM,UAAS;IACd,KAAK,qBAA4B;IACjC,eAAe,qCAA4C;IAC3D,UAAU,qCAA4C;IAEzD,SAAS,UAAQ;IACjB,SAAS,UAAS;IAClB,MAAM,EAAE,YAAY,EAAE,CAAM;IAC5B,YAAY,SAAM;IAClB,cAAc,UAAS;IAE9B,oFAAoF;IAC7E,eAAe,SAAM;IAE5B,6DAA6D;IACtD,iBAAiB,SAAM;IAE9B,6EAA6E;IACtE,UAAU,SAAuB;IAExC,OAAO,KAAK,QAAQ,GAAiC;gBAEjC,GAAG,EAAE,iBAAiB;IAE1C,QAAQ,IAAI,IAAI;IAcT,WAAW,IAAI,IAAI;IAMnB,OAAO,IAAI,IAAI;IAUf,eAAe,IAAI,IAAI;IAIvB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IA0BxC,IAAW,QAAQ,IAAI,OAAO,CAE7B;IAED,IAAW,aAAa,IAAI,YAAY,EAAE,CAKzC;IAED,IAAW,eAAe,IAAI,MAAM,CAEnC;IAEM,eAAe,IAAI,IAAI;IAKvB,mBAAmB,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,YAAY,GAAG,IAAI;IAajE,YAAY,IAAI,IAAI;YAiBb,cAAc;YA2Bd,oBAAoB;
|
|
1
|
+
{"version":3,"file":"record-micro-view.component.d.ts","sourceRoot":"","sources":["../../../src/lib/record-micro-view/record-micro-view.component.ts"],"names":[],"mappings":"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"}
|
|
@@ -489,7 +489,10 @@ export class MjRecordMicroViewComponent extends BaseAngularComponent {
|
|
|
489
489
|
const result = await rv.RunView({
|
|
490
490
|
EntityName: 'MJ: Record Changes',
|
|
491
491
|
ExtraFilter: `ID = '${changeId}'`,
|
|
492
|
-
|
|
492
|
+
// 'EntityID' is required, not decorative: field-level security projects a Record Change's
|
|
493
|
+
// payload against the entity the row is ABOUT, and a row arriving without EntityID cannot
|
|
494
|
+
// be resolved — so the payload is withheld. See guides/FIELD_LEVEL_SECURITY_GUIDE.md §3.2.
|
|
495
|
+
Fields: ['EntityID', 'FullRecordJSON'],
|
|
493
496
|
ResultType: 'simple'
|
|
494
497
|
});
|
|
495
498
|
if (result.Success && result.Results.length > 0) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"record-micro-view.component.js","sourceRoot":"","sources":["../../../src/lib/record-micro-view/record-micro-view.component.ts","../../../src/lib/record-micro-view/record-micro-view.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, OnInit, ChangeDetectorRef, ChangeDetectionStrategy, HostListener } from '@angular/core';\nimport { RunView, EntityInfo, CompositeKey } from '@memberjunction/core';\nimport { UUIDsEqual } from '@memberjunction/global';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { MicroViewData } from '../types';\n\ninterface FieldDisplay {\n Name: string;\n DisplayName: string;\n Value: string;\n Type: string;\n Description: string;\n DiffClass: string;\n OldValue: string;\n IsNull: boolean;\n IsBoolean: boolean;\n BooleanValue: boolean;\n IsJson: boolean;\n Sequence: number;\n /** When set, the field is a FK and this holds the display value from the related virtual field */\n ForeignKeyDisplayValue: string;\n /** When set, user can click to navigate to this related record */\n ForeignKeyEntityName: string;\n /** The raw FK value (a GUID) for navigation */\n ForeignKeyRecordId: string;\n}\n\ninterface RecordChangeSimple {\n FullRecordJSON: string;\n}\n\n/** Event emitted when user wants to navigate to a related FK record */\nexport interface EntityLinkClickEvent {\n EntityName: string;\n RecordID: string;\n CompositeKey: CompositeKey;\n}\n\n@Component({\n standalone: false,\n selector: 'mj-record-micro-view',\n templateUrl: './record-micro-view.component.html',\n styleUrls: ['./record-micro-view.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class MjRecordMicroViewComponent extends BaseAngularComponent implements OnInit {\n @Input() Data!: MicroViewData;\n @Input() Inline = false;\n @Output() Close = new EventEmitter<void>();\n @Output() EntityLinkClick = new EventEmitter<EntityLinkClickEvent>();\n @Output() OpenRecord = new EventEmitter<EntityLinkClickEvent>();\n\n public IsLoading = true;\n public IsVisible = false;\n public Fields: FieldDisplay[] = [];\n public ErrorMessage = '';\n public ShowNullValues = false;\n\n /** Formatted display of the record primary key (simplified for single-value PKs) */\n public DisplayRecordID = '';\n\n /** The value of the IsNameField for display in the header */\n public RecordDisplayName = '';\n\n /** Icon CSS class from EntityInfo.Icon, falls back to 'fa-solid fa-table' */\n public EntityIcon = 'fa-solid fa-table';\n\n private get metadata() { return this.ProviderToUse; }\n\n constructor(private cdr: ChangeDetectorRef) { super(); }\n\n ngOnInit(): void {\n if (this.Inline) {\n this.IsVisible = true;\n } else {\n Promise.resolve().then(() => {\n this.IsVisible = true;\n this.cdr.markForCheck();\n });\n }\n this.DisplayRecordID = this.formatRecordId(this.Data.RecordID);\n this.loadRecordData();\n }\n\n @HostListener('document:keydown.escape')\n public OnEscapeKey(): void {\n if (!this.Inline) {\n this.OnClose();\n }\n }\n\n public OnClose(): void {\n if (this.Inline) {\n this.Close.emit();\n } else {\n this.IsVisible = false;\n this.cdr.markForCheck();\n setTimeout(() => this.Close.emit(), 250);\n }\n }\n\n public OnBackdropClick(): void {\n this.OnClose();\n }\n\n public GetTypeIcon(type: string): string {\n const icons: Record<string, string> = {\n 'uniqueidentifier': 'fa-solid fa-fingerprint',\n 'datetime': 'fa-solid fa-calendar',\n 'datetimeoffset': 'fa-solid fa-calendar',\n 'date': 'fa-solid fa-calendar-day',\n 'time': 'fa-solid fa-clock',\n 'bit': 'fa-solid fa-toggle-on',\n 'boolean': 'fa-solid fa-toggle-on',\n 'int': 'fa-solid fa-hashtag',\n 'bigint': 'fa-solid fa-hashtag',\n 'float': 'fa-solid fa-hashtag',\n 'decimal': 'fa-solid fa-hashtag',\n 'money': 'fa-solid fa-hashtag',\n 'number': 'fa-solid fa-hashtag',\n 'nvarchar': 'fa-solid fa-font',\n 'varchar': 'fa-solid fa-font',\n 'ntext': 'fa-solid fa-align-left',\n 'text': 'fa-solid fa-align-left',\n 'string': 'fa-solid fa-font',\n 'object': 'fa-solid fa-code',\n 'null': 'fa-solid fa-circle-xmark'\n };\n return icons[type.toLowerCase()] ?? 'fa-solid fa-font';\n }\n\n public get HasDiffs(): boolean {\n return this.Data.FieldDiffs != null && this.Data.FieldDiffs.length > 0;\n }\n\n public get VisibleFields(): FieldDisplay[] {\n if (this.ShowNullValues) {\n return this.Fields;\n }\n return this.Fields.filter(f => !f.IsNull);\n }\n\n public get HiddenNullCount(): number {\n return this.Fields.filter(f => f.IsNull).length;\n }\n\n public ToggleShowNulls(): void {\n this.ShowNullValues = !this.ShowNullValues;\n this.cdr.markForCheck();\n }\n\n public OnEntityLinkClicked(event: MouseEvent, field: FieldDisplay): void {\n event.stopPropagation();\n if (field.ForeignKeyEntityName && field.ForeignKeyRecordId) {\n // The FK target is any entity — resolve its key column from metadata, not a hardcoded ID.\n const pkey = CompositeKey.FromURLSegment(this.metadata.EntityByName(field.ForeignKeyEntityName), field.ForeignKeyRecordId);\n this.EntityLinkClick.emit({\n EntityName: field.ForeignKeyEntityName,\n RecordID: field.ForeignKeyRecordId,\n CompositeKey: pkey\n });\n }\n }\n\n public OnOpenRecord(): void {\n if (this.Data.EntityName && this.Data.RecordID) {\n const rawId = this.extractRawId(this.Data.RecordID);\n // RecordID is a CompositeKey segment — parse it against the entity's real key column(s).\n const pkey = CompositeKey.FromURLSegment(this.metadata.EntityByName(this.Data.EntityName), this.Data.RecordID);\n this.OpenRecord.emit({\n EntityName: this.Data.EntityName,\n RecordID: rawId,\n CompositeKey: pkey\n });\n }\n }\n\n // =========================================================================\n // Data loading\n // =========================================================================\n\n private async loadRecordData(): Promise<void> {\n this.IsLoading = true;\n this.cdr.markForCheck();\n\n try {\n let recordData = this.Data.FullRecordJSON;\n\n if (!recordData && this.Data.RecordChangeID) {\n recordData = await this.loadRecordChangeJson(this.Data.RecordChangeID);\n }\n\n if (recordData) {\n const entityInfo = this.findEntityInfo();\n this.EntityIcon = entityInfo?.Icon || 'fa-solid fa-table';\n this.RecordDisplayName = this.extractNameFieldValue(entityInfo, recordData);\n this.Fields = this.buildFieldList(recordData, entityInfo);\n } else {\n this.ErrorMessage = 'Unable to load record data.';\n }\n } catch (e) {\n this.ErrorMessage = e instanceof Error ? e.message : 'Failed to load record data.';\n } finally {\n this.IsLoading = false;\n this.cdr.markForCheck();\n }\n }\n\n private async loadRecordChangeJson(changeId: string): Promise<Record<string, unknown> | null> {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView<RecordChangeSimple>({\n EntityName: 'MJ: Record Changes',\n ExtraFilter: `ID = '${changeId}'`,\n Fields: ['FullRecordJSON'],\n ResultType: 'simple'\n });\n\n if (result.Success && result.Results.length > 0) {\n const json = result.Results[0].FullRecordJSON;\n if (json) {\n return JSON.parse(json) as Record<string, unknown>;\n }\n }\n return null;\n }\n\n // =========================================================================\n // Field building\n // =========================================================================\n\n private buildFieldList(data: Record<string, unknown>, entityInfo: EntityInfo | undefined): FieldDisplay[] {\n const diffMap = this.buildDiffMap();\n const fkMap = this.buildForeignKeyMap(entityInfo, data);\n const virtualFieldNames = this.getVirtualFieldNames(entityInfo);\n const fields: FieldDisplay[] = [];\n\n for (const [key, value] of Object.entries(data)) {\n if (key.startsWith('__mj_')) continue;\n // Skip virtual fields that we've merged into their FK counterpart\n if (virtualFieldNames.has(key)) continue;\n\n const fieldMeta = entityInfo?.Fields.find(f => f.Name === key);\n const diff = diffMap.get(key);\n const fkInfo = fkMap.get(key);\n const fieldType = fieldMeta?.Type ?? this.inferType(value);\n const isBooleanField = this.isBooleanType(fieldType, value);\n const isJsonField = this.isJsonValue(value);\n\n fields.push({\n Name: key,\n DisplayName: fieldMeta?.DisplayNameOrName ?? key,\n Value: this.formatValue(value, isJsonField),\n Type: fieldType,\n Description: fieldMeta?.Description ?? '',\n DiffClass: diff?.ChangeType ? `diff-${diff.ChangeType.toLowerCase()}` : '',\n OldValue: diff?.OldValue ?? '',\n IsNull: value == null,\n IsBoolean: isBooleanField,\n BooleanValue: this.toBooleanValue(value),\n IsJson: isJsonField,\n Sequence: fieldMeta?.Sequence ?? 9999,\n ForeignKeyDisplayValue: fkInfo?.DisplayValue ?? '',\n ForeignKeyEntityName: fkInfo?.EntityName ?? '',\n ForeignKeyRecordId: fkInfo?.RecordId ?? ''\n });\n }\n\n return fields.sort((a, b) => a.Sequence - b.Sequence);\n }\n\n /**\n * Find the entity's NameField (uses EntityInfo.NameField getter which checks\n * IsNameField first, then falls back to a field called \"Name\").\n */\n private extractNameFieldValue(entityInfo: EntityInfo | undefined, data: Record<string, unknown>): string {\n if (!entityInfo) return '';\n const nameField = entityInfo.NameField;\n if (nameField && data[nameField.Name] != null) {\n return String(data[nameField.Name]);\n }\n return '';\n }\n\n private findEntityInfo(): EntityInfo | undefined {\n if (this.Data.EntityName && this.Data.EntityName !== 'Unknown') {\n return this.metadata.Entities.find(e => e.Name === this.Data.EntityName);\n }\n if (this.Data.EntityID) {\n return this.metadata.Entities.find(e => UUIDsEqual(e.ID, this.Data.EntityID));\n }\n return undefined;\n }\n\n private buildDiffMap(): Map<string, { ChangeType: string; OldValue: string }> {\n const map = new Map<string, { ChangeType: string; OldValue: string }>();\n if (this.Data.FieldDiffs) {\n for (const diff of this.Data.FieldDiffs) {\n map.set(diff.FieldName, { ChangeType: diff.ChangeType, OldValue: diff.OldValue });\n }\n }\n return map;\n }\n\n /**\n * Build a map of FK field name -> { DisplayValue, EntityName, RecordId }\n * by matching FK fields to their associated virtual (display) fields.\n */\n private buildForeignKeyMap(\n entityInfo: EntityInfo | undefined,\n data: Record<string, unknown>\n ): Map<string, { DisplayValue: string; EntityName: string; RecordId: string }> {\n const map = new Map<string, { DisplayValue: string; EntityName: string; RecordId: string }>();\n if (!entityInfo) return map;\n\n for (const field of entityInfo.Fields) {\n if (!field.RelatedEntityID || field.Name === 'ID') continue;\n\n // Find the related entity name\n const relatedEntity = this.metadata.Entities.find(e => UUIDsEqual(e.ID, field.RelatedEntityID));\n if (!relatedEntity) continue;\n\n const fkValue = data[field.Name];\n if (fkValue == null) continue;\n\n // Find display value from the associated virtual field\n const displayValue = this.findFkDisplayValue(entityInfo, field.Name, data);\n\n map.set(field.Name, {\n DisplayValue: displayValue,\n EntityName: relatedEntity.Name,\n RecordId: String(fkValue)\n });\n }\n\n return map;\n }\n\n /**\n * Find the display value for a FK field by checking multiple strategies:\n * 1. Look for a virtual field with RelatedEntityNameFieldMap pointing to this FK\n * 2. Look for any virtual field whose name is derived from the FK name\n * 3. Scan data keys for common naming patterns (e.g., \"TypeID\" -> \"Type\")\n */\n private findFkDisplayValue(entityInfo: EntityInfo, fkFieldName: string, data: Record<string, unknown>): string {\n // Strategy 1: Metadata-linked virtual field via RelatedEntityNameFieldMap\n const linkedVirtual = entityInfo.Fields.find(f =>\n f.RelatedEntityNameFieldMap === fkFieldName && f.IsVirtual\n );\n if (linkedVirtual && data[linkedVirtual.Name] != null) {\n return String(data[linkedVirtual.Name]);\n }\n\n // Strategy 2: Find any virtual field that looks like a display field for this FK\n // by checking all virtual fields and matching via naming patterns\n const virtualFields = entityInfo.Fields.filter(f => f.IsVirtual);\n for (const vf of virtualFields) {\n // Check if this virtual field's RelatedEntityNameFieldMap matches (case-insensitive)\n if (vf.RelatedEntityNameFieldMap &&\n vf.RelatedEntityNameFieldMap.toLowerCase() === fkFieldName.toLowerCase() &&\n data[vf.Name] != null) {\n return String(data[vf.Name]);\n }\n }\n\n // Strategy 3: Try common naming conventions in the data itself\n // e.g., \"TypeID\" -> look for \"Type\" key in data\n // \"OwnerUserID\" -> look for \"Owner User\" or \"OwnerUser\"\n // Strip trailing \"ID\" from the FK name and try variations\n if (fkFieldName.endsWith('ID') && fkFieldName.length > 2) {\n const baseName = fkFieldName.slice(0, -2);\n\n // Direct match in data (e.g., \"CategoryID\" -> \"Category\")\n if (data[baseName] != null && typeof data[baseName] === 'string' &&\n !this.looksLikeGuid(data[baseName] as string)) {\n return String(data[baseName]);\n }\n\n // Try with space before capitals (e.g., \"OwnerUserID\" -> \"Owner User\")\n const spacedName = baseName.replace(/([a-z])([A-Z])/g, '$1 $2');\n if (spacedName !== baseName && data[spacedName] != null &&\n typeof data[spacedName] === 'string' &&\n !this.looksLikeGuid(data[spacedName] as string)) {\n return String(data[spacedName]);\n }\n }\n\n return '';\n }\n\n /** Quick check if a string looks like a GUID (to avoid using GUIDs as display values). */\n private looksLikeGuid(value: string): boolean {\n return /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(value);\n }\n\n /**\n * Get the set of virtual field names so we can skip them in the main field list.\n * Virtual fields are display-only fields whose values are merged into FK rows.\n * We skip ALL virtual fields — not just ones with RelatedEntityNameFieldMap —\n * because they are derived/computed and don't represent stored data.\n */\n private getVirtualFieldNames(entityInfo: EntityInfo | undefined): Set<string> {\n const names = new Set<string>();\n if (!entityInfo) return names;\n\n for (const field of entityInfo.Fields) {\n if (field.IsVirtual) {\n names.add(field.Name);\n }\n }\n\n return names;\n }\n\n // =========================================================================\n // Record ID formatting\n // =========================================================================\n\n /**\n * For single-value PKs like \"ID|<uuid>\", extract just the uuid.\n * For composite keys, show the full concatenated string.\n */\n private formatRecordId(recordId: string): string {\n if (!recordId) return '';\n const parts = recordId.split('||');\n if (parts.length === 1) {\n const singleParts = recordId.split('|');\n if (singleParts.length === 2) {\n return singleParts[1];\n }\n }\n return recordId;\n }\n\n /**\n * Extract the raw ID value from a potentially formatted record ID string.\n */\n private extractRawId(recordId: string): string {\n if (!recordId) return '';\n const parts = recordId.split('||');\n if (parts.length === 1) {\n const singleParts = recordId.split('|');\n if (singleParts.length === 2) {\n return singleParts[1];\n }\n }\n return recordId;\n }\n\n // =========================================================================\n // Type helpers\n // =========================================================================\n\n private isBooleanType(type: string, value: unknown): boolean {\n const t = type.toLowerCase();\n if (t === 'bit' || t === 'boolean') return true;\n if (value === true || value === false) return true;\n return false;\n }\n\n private toBooleanValue(value: unknown): boolean {\n if (value === true || value === 1 || value === '1' || value === 'true') return true;\n return false;\n }\n\n private isJsonValue(value: unknown): boolean {\n if (typeof value === 'object' && value != null) return true;\n if (typeof value === 'string') {\n const trimmed = value.trim();\n return (trimmed.startsWith('{') && trimmed.endsWith('}')) ||\n (trimmed.startsWith('[') && trimmed.endsWith(']'));\n }\n return false;\n }\n\n // =========================================================================\n // Formatting helpers\n // =========================================================================\n\n private formatValue(value: unknown, isJson: boolean): string {\n if (value == null) return 'null';\n if (typeof value === 'boolean') return value ? 'true' : 'false';\n if (typeof value === 'number') return String(value);\n if (typeof value === 'string') {\n if (this.isDateString(value)) return this.formatDate(value);\n // Try to pretty-print JSON strings\n if (isJson) return this.formatJsonString(value);\n if (value.length > 300) return value.substring(0, 300) + '...';\n return value;\n }\n if (typeof value === 'object') {\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n }\n return String(value);\n }\n\n private formatJsonString(value: string): string {\n try {\n const parsed = JSON.parse(value);\n return JSON.stringify(parsed, null, 2);\n } catch {\n return value;\n }\n }\n\n private isDateString(value: string): boolean {\n return /^\\d{4}-\\d{2}-\\d{2}T/.test(value);\n }\n\n private formatDate(value: string): string {\n try {\n const d = new Date(value);\n return d.toLocaleDateString('en-US', {\n month: 'short', day: 'numeric', year: 'numeric',\n hour: '2-digit', minute: '2-digit'\n });\n } catch {\n return value;\n }\n }\n\n private inferType(value: unknown): string {\n if (value == null) return 'null';\n if (typeof value === 'boolean') return 'bit';\n if (typeof value === 'number') return 'int';\n if (typeof value === 'string') {\n if (this.isDateString(value)) return 'datetime';\n if (/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(value)) return 'uniqueidentifier';\n return 'nvarchar';\n }\n return 'object';\n }\n}\n","<!-- Overlay mode -->\n@if (!Inline) {\n <div class=\"micro-backdrop\" [class.visible]=\"IsVisible\" (click)=\"OnBackdropClick()\"></div>\n <div class=\"micro-panel\" [class.visible]=\"IsVisible\">\n <ng-container *ngTemplateOutlet=\"microContent\"></ng-container>\n </div>\n}\n\n<!-- Inline mode (embedded in parent panel) -->\n@if (Inline) {\n <div class=\"micro-inline\">\n <ng-container *ngTemplateOutlet=\"microContent\"></ng-container>\n </div>\n}\n\n<!-- Shared content template -->\n<ng-template #microContent>\n <!-- Header (overlay mode only) -->\n @if (!Inline) {\n <div class=\"micro-header\">\n <div class=\"micro-header-info\">\n <div class=\"micro-entity\">\n <i [class]=\"EntityIcon\" class=\"micro-entity-icon\"></i>\n <span>{{Data.EntityName}}</span>\n @if (RecordDisplayName) {\n <span class=\"micro-record-name\">{{RecordDisplayName}}</span>\n }\n </div>\n <div class=\"micro-record-id\">\n <i class=\"fa-solid fa-fingerprint\"></i>\n <span>{{DisplayRecordID}}</span>\n </div>\n </div>\n <div class=\"micro-header-actions\">\n <button class=\"micro-open-btn\" (click)=\"OnOpenRecord()\" title=\"Open this record\">\n <i class=\"fa-solid fa-arrow-up-right-from-square\"></i> Open\n </button>\n <button class=\"micro-close\" (click)=\"OnClose()\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n </div>\n }\n\n <!-- Inline header -->\n @if (Inline) {\n <div class=\"micro-inline-header\">\n <div class=\"micro-header-left\">\n <div class=\"micro-entity\">\n <i [class]=\"EntityIcon\" class=\"micro-entity-icon\"></i>\n <span>{{Data.EntityName}}</span>\n @if (RecordDisplayName) {\n <span class=\"micro-record-name\">{{RecordDisplayName}}</span>\n }\n </div>\n <div class=\"micro-record-id\">\n <i class=\"fa-solid fa-fingerprint\"></i>\n <span>{{DisplayRecordID}}</span>\n </div>\n </div>\n <button class=\"micro-open-btn\" (click)=\"OnOpenRecord()\" title=\"Open this record\">\n <i class=\"fa-solid fa-arrow-up-right-from-square\"></i> Open\n </button>\n </div>\n }\n\n <!-- Content -->\n <div class=\"micro-content\" [class.micro-content-inline]=\"Inline\">\n @if (IsLoading) {\n <mj-loading text=\"Loading record data...\"></mj-loading>\n }\n\n <!-- Error -->\n @if (!IsLoading && ErrorMessage) {\n <div class=\"micro-error\">\n <i class=\"fa-solid fa-circle-exclamation\"></i>\n <span>{{ErrorMessage}}</span>\n </div>\n }\n\n <!-- Field table -->\n @if (!IsLoading && !ErrorMessage && Fields.length > 0) {\n <div class=\"micro-fields\">\n <!-- Null toggle toolbar -->\n @if (HiddenNullCount > 0) {\n <div class=\"micro-toolbar\">\n <label class=\"null-toggle\">\n <input type=\"checkbox\" [checked]=\"ShowNullValues\" (change)=\"ToggleShowNulls()\" />\n <span class=\"null-toggle-label\">Show null values ({{HiddenNullCount}})</span>\n </label>\n </div>\n }\n <div class=\"micro-field-header\">\n <span class=\"mf-col-name\">Field</span>\n @if (!HasDiffs) {\n <span class=\"mf-col-value\">Value</span>\n }\n @if (HasDiffs) {\n <span class=\"mf-col-old\">Old</span>\n <span class=\"mf-col-new\">New</span>\n }\n </div>\n @for (field of VisibleFields; track field; let odd = $odd) {\n <div class=\"micro-field-row\"\n [class.odd]=\"odd\" [ngClass]=\"field.DiffClass\">\n <span class=\"mf-col-name\" [title]=\"field.Description\">\n <i [class]=\"GetTypeIcon(field.Type)\" class=\"mf-type-icon\"></i>\n <span class=\"mf-field-name\">{{field.DisplayName}}</span>\n </span>\n @if (!HasDiffs) {\n <span class=\"mf-col-value\" [title]=\"field.Value\">\n <!-- Boolean field -->\n @if (field.IsBoolean && !field.IsNull) {\n <i [class]=\"field.BooleanValue ? 'fa-solid fa-square-check mf-bool-true' : 'fa-regular fa-square mf-bool-false'\"\n class=\"mf-bool-icon\"></i>\n <span class=\"mf-bool-label\">{{field.BooleanValue ? 'Yes' : 'No'}}</span>\n }\n <!-- FK field with display value — show display name (ID) with open icon -->\n @if (!field.IsBoolean && field.ForeignKeyEntityName && field.ForeignKeyDisplayValue) {\n <a class=\"mf-fk-link\" (click)=\"OnEntityLinkClicked($event, field)\"\n [title]=\"field.ForeignKeyEntityName + ': ' + field.ForeignKeyRecordId\">\n {{field.ForeignKeyDisplayValue}}\n <span class=\"mf-fk-id\">({{field.ForeignKeyRecordId | slice:0:8}}...)</span>\n <i class=\"fa-solid fa-arrow-up-right-from-square mf-fk-icon\"></i>\n </a>\n }\n <!-- FK field without display value — show raw ID with open icon -->\n @if (!field.IsBoolean && field.ForeignKeyEntityName && !field.ForeignKeyDisplayValue) {\n <a class=\"mf-fk-link\" (click)=\"OnEntityLinkClicked($event, field)\"\n [title]=\"'Open ' + field.ForeignKeyEntityName\">\n {{field.Value}}\n <i class=\"fa-solid fa-arrow-up-right-from-square mf-fk-icon\"></i>\n </a>\n }\n <!-- JSON field — formatted -->\n @if (!field.IsBoolean && !field.ForeignKeyEntityName && field.IsJson) {\n <pre class=\"mf-json-value\">{{field.Value}}</pre>\n }\n <!-- Regular value -->\n @if (!field.IsBoolean && !field.ForeignKeyEntityName && !field.IsJson) {\n {{field.Value}}\n }\n </span>\n }\n @if (HasDiffs) {\n <span class=\"mf-col-old\" [title]=\"field.OldValue\">\n {{field.OldValue || field.Value}}\n </span>\n <span class=\"mf-col-new\" [title]=\"field.Value\">\n {{field.Value}}\n </span>\n }\n </div>\n }\n </div>\n }\n\n <!-- Empty -->\n @if (!IsLoading && !ErrorMessage && Fields.length === 0) {\n <mj-empty-state class=\"micro-empty\" Size=\"compact\"\n Icon=\"\" Title=\"No field data available.\" />\n }\n </div>\n</ng-template>\n"]}
|
|
1
|
+
{"version":3,"file":"record-micro-view.component.js","sourceRoot":"","sources":["../../../src/lib/record-micro-view/record-micro-view.component.ts","../../../src/lib/record-micro-view/record-micro-view.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, OnInit, ChangeDetectorRef, ChangeDetectionStrategy, HostListener } from '@angular/core';\nimport { RunView, EntityInfo, CompositeKey } from '@memberjunction/core';\nimport { UUIDsEqual } from '@memberjunction/global';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { MicroViewData } from '../types';\n\ninterface FieldDisplay {\n Name: string;\n DisplayName: string;\n Value: string;\n Type: string;\n Description: string;\n DiffClass: string;\n OldValue: string;\n IsNull: boolean;\n IsBoolean: boolean;\n BooleanValue: boolean;\n IsJson: boolean;\n Sequence: number;\n /** When set, the field is a FK and this holds the display value from the related virtual field */\n ForeignKeyDisplayValue: string;\n /** When set, user can click to navigate to this related record */\n ForeignKeyEntityName: string;\n /** The raw FK value (a GUID) for navigation */\n ForeignKeyRecordId: string;\n}\n\ninterface RecordChangeSimple {\n FullRecordJSON: string;\n}\n\n/** Event emitted when user wants to navigate to a related FK record */\nexport interface EntityLinkClickEvent {\n EntityName: string;\n RecordID: string;\n CompositeKey: CompositeKey;\n}\n\n@Component({\n standalone: false,\n selector: 'mj-record-micro-view',\n templateUrl: './record-micro-view.component.html',\n styleUrls: ['./record-micro-view.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class MjRecordMicroViewComponent extends BaseAngularComponent implements OnInit {\n @Input() Data!: MicroViewData;\n @Input() Inline = false;\n @Output() Close = new EventEmitter<void>();\n @Output() EntityLinkClick = new EventEmitter<EntityLinkClickEvent>();\n @Output() OpenRecord = new EventEmitter<EntityLinkClickEvent>();\n\n public IsLoading = true;\n public IsVisible = false;\n public Fields: FieldDisplay[] = [];\n public ErrorMessage = '';\n public ShowNullValues = false;\n\n /** Formatted display of the record primary key (simplified for single-value PKs) */\n public DisplayRecordID = '';\n\n /** The value of the IsNameField for display in the header */\n public RecordDisplayName = '';\n\n /** Icon CSS class from EntityInfo.Icon, falls back to 'fa-solid fa-table' */\n public EntityIcon = 'fa-solid fa-table';\n\n private get metadata() { return this.ProviderToUse; }\n\n constructor(private cdr: ChangeDetectorRef) { super(); }\n\n ngOnInit(): void {\n if (this.Inline) {\n this.IsVisible = true;\n } else {\n Promise.resolve().then(() => {\n this.IsVisible = true;\n this.cdr.markForCheck();\n });\n }\n this.DisplayRecordID = this.formatRecordId(this.Data.RecordID);\n this.loadRecordData();\n }\n\n @HostListener('document:keydown.escape')\n public OnEscapeKey(): void {\n if (!this.Inline) {\n this.OnClose();\n }\n }\n\n public OnClose(): void {\n if (this.Inline) {\n this.Close.emit();\n } else {\n this.IsVisible = false;\n this.cdr.markForCheck();\n setTimeout(() => this.Close.emit(), 250);\n }\n }\n\n public OnBackdropClick(): void {\n this.OnClose();\n }\n\n public GetTypeIcon(type: string): string {\n const icons: Record<string, string> = {\n 'uniqueidentifier': 'fa-solid fa-fingerprint',\n 'datetime': 'fa-solid fa-calendar',\n 'datetimeoffset': 'fa-solid fa-calendar',\n 'date': 'fa-solid fa-calendar-day',\n 'time': 'fa-solid fa-clock',\n 'bit': 'fa-solid fa-toggle-on',\n 'boolean': 'fa-solid fa-toggle-on',\n 'int': 'fa-solid fa-hashtag',\n 'bigint': 'fa-solid fa-hashtag',\n 'float': 'fa-solid fa-hashtag',\n 'decimal': 'fa-solid fa-hashtag',\n 'money': 'fa-solid fa-hashtag',\n 'number': 'fa-solid fa-hashtag',\n 'nvarchar': 'fa-solid fa-font',\n 'varchar': 'fa-solid fa-font',\n 'ntext': 'fa-solid fa-align-left',\n 'text': 'fa-solid fa-align-left',\n 'string': 'fa-solid fa-font',\n 'object': 'fa-solid fa-code',\n 'null': 'fa-solid fa-circle-xmark'\n };\n return icons[type.toLowerCase()] ?? 'fa-solid fa-font';\n }\n\n public get HasDiffs(): boolean {\n return this.Data.FieldDiffs != null && this.Data.FieldDiffs.length > 0;\n }\n\n public get VisibleFields(): FieldDisplay[] {\n if (this.ShowNullValues) {\n return this.Fields;\n }\n return this.Fields.filter(f => !f.IsNull);\n }\n\n public get HiddenNullCount(): number {\n return this.Fields.filter(f => f.IsNull).length;\n }\n\n public ToggleShowNulls(): void {\n this.ShowNullValues = !this.ShowNullValues;\n this.cdr.markForCheck();\n }\n\n public OnEntityLinkClicked(event: MouseEvent, field: FieldDisplay): void {\n event.stopPropagation();\n if (field.ForeignKeyEntityName && field.ForeignKeyRecordId) {\n // The FK target is any entity — resolve its key column from metadata, not a hardcoded ID.\n const pkey = CompositeKey.FromURLSegment(this.metadata.EntityByName(field.ForeignKeyEntityName), field.ForeignKeyRecordId);\n this.EntityLinkClick.emit({\n EntityName: field.ForeignKeyEntityName,\n RecordID: field.ForeignKeyRecordId,\n CompositeKey: pkey\n });\n }\n }\n\n public OnOpenRecord(): void {\n if (this.Data.EntityName && this.Data.RecordID) {\n const rawId = this.extractRawId(this.Data.RecordID);\n // RecordID is a CompositeKey segment — parse it against the entity's real key column(s).\n const pkey = CompositeKey.FromURLSegment(this.metadata.EntityByName(this.Data.EntityName), this.Data.RecordID);\n this.OpenRecord.emit({\n EntityName: this.Data.EntityName,\n RecordID: rawId,\n CompositeKey: pkey\n });\n }\n }\n\n // =========================================================================\n // Data loading\n // =========================================================================\n\n private async loadRecordData(): Promise<void> {\n this.IsLoading = true;\n this.cdr.markForCheck();\n\n try {\n let recordData = this.Data.FullRecordJSON;\n\n if (!recordData && this.Data.RecordChangeID) {\n recordData = await this.loadRecordChangeJson(this.Data.RecordChangeID);\n }\n\n if (recordData) {\n const entityInfo = this.findEntityInfo();\n this.EntityIcon = entityInfo?.Icon || 'fa-solid fa-table';\n this.RecordDisplayName = this.extractNameFieldValue(entityInfo, recordData);\n this.Fields = this.buildFieldList(recordData, entityInfo);\n } else {\n this.ErrorMessage = 'Unable to load record data.';\n }\n } catch (e) {\n this.ErrorMessage = e instanceof Error ? e.message : 'Failed to load record data.';\n } finally {\n this.IsLoading = false;\n this.cdr.markForCheck();\n }\n }\n\n private async loadRecordChangeJson(changeId: string): Promise<Record<string, unknown> | null> {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView<RecordChangeSimple>({\n EntityName: 'MJ: Record Changes',\n ExtraFilter: `ID = '${changeId}'`,\n // 'EntityID' is required, not decorative: field-level security projects a Record Change's\n // payload against the entity the row is ABOUT, and a row arriving without EntityID cannot\n // be resolved — so the payload is withheld. See guides/FIELD_LEVEL_SECURITY_GUIDE.md §3.2.\n Fields: ['EntityID', 'FullRecordJSON'],\n ResultType: 'simple'\n });\n\n if (result.Success && result.Results.length > 0) {\n const json = result.Results[0].FullRecordJSON;\n if (json) {\n return JSON.parse(json) as Record<string, unknown>;\n }\n }\n return null;\n }\n\n // =========================================================================\n // Field building\n // =========================================================================\n\n private buildFieldList(data: Record<string, unknown>, entityInfo: EntityInfo | undefined): FieldDisplay[] {\n const diffMap = this.buildDiffMap();\n const fkMap = this.buildForeignKeyMap(entityInfo, data);\n const virtualFieldNames = this.getVirtualFieldNames(entityInfo);\n const fields: FieldDisplay[] = [];\n\n for (const [key, value] of Object.entries(data)) {\n if (key.startsWith('__mj_')) continue;\n // Skip virtual fields that we've merged into their FK counterpart\n if (virtualFieldNames.has(key)) continue;\n\n const fieldMeta = entityInfo?.Fields.find(f => f.Name === key);\n const diff = diffMap.get(key);\n const fkInfo = fkMap.get(key);\n const fieldType = fieldMeta?.Type ?? this.inferType(value);\n const isBooleanField = this.isBooleanType(fieldType, value);\n const isJsonField = this.isJsonValue(value);\n\n fields.push({\n Name: key,\n DisplayName: fieldMeta?.DisplayNameOrName ?? key,\n Value: this.formatValue(value, isJsonField),\n Type: fieldType,\n Description: fieldMeta?.Description ?? '',\n DiffClass: diff?.ChangeType ? `diff-${diff.ChangeType.toLowerCase()}` : '',\n OldValue: diff?.OldValue ?? '',\n IsNull: value == null,\n IsBoolean: isBooleanField,\n BooleanValue: this.toBooleanValue(value),\n IsJson: isJsonField,\n Sequence: fieldMeta?.Sequence ?? 9999,\n ForeignKeyDisplayValue: fkInfo?.DisplayValue ?? '',\n ForeignKeyEntityName: fkInfo?.EntityName ?? '',\n ForeignKeyRecordId: fkInfo?.RecordId ?? ''\n });\n }\n\n return fields.sort((a, b) => a.Sequence - b.Sequence);\n }\n\n /**\n * Find the entity's NameField (uses EntityInfo.NameField getter which checks\n * IsNameField first, then falls back to a field called \"Name\").\n */\n private extractNameFieldValue(entityInfo: EntityInfo | undefined, data: Record<string, unknown>): string {\n if (!entityInfo) return '';\n const nameField = entityInfo.NameField;\n if (nameField && data[nameField.Name] != null) {\n return String(data[nameField.Name]);\n }\n return '';\n }\n\n private findEntityInfo(): EntityInfo | undefined {\n if (this.Data.EntityName && this.Data.EntityName !== 'Unknown') {\n return this.metadata.Entities.find(e => e.Name === this.Data.EntityName);\n }\n if (this.Data.EntityID) {\n return this.metadata.Entities.find(e => UUIDsEqual(e.ID, this.Data.EntityID));\n }\n return undefined;\n }\n\n private buildDiffMap(): Map<string, { ChangeType: string; OldValue: string }> {\n const map = new Map<string, { ChangeType: string; OldValue: string }>();\n if (this.Data.FieldDiffs) {\n for (const diff of this.Data.FieldDiffs) {\n map.set(diff.FieldName, { ChangeType: diff.ChangeType, OldValue: diff.OldValue });\n }\n }\n return map;\n }\n\n /**\n * Build a map of FK field name -> { DisplayValue, EntityName, RecordId }\n * by matching FK fields to their associated virtual (display) fields.\n */\n private buildForeignKeyMap(\n entityInfo: EntityInfo | undefined,\n data: Record<string, unknown>\n ): Map<string, { DisplayValue: string; EntityName: string; RecordId: string }> {\n const map = new Map<string, { DisplayValue: string; EntityName: string; RecordId: string }>();\n if (!entityInfo) return map;\n\n for (const field of entityInfo.Fields) {\n if (!field.RelatedEntityID || field.Name === 'ID') continue;\n\n // Find the related entity name\n const relatedEntity = this.metadata.Entities.find(e => UUIDsEqual(e.ID, field.RelatedEntityID));\n if (!relatedEntity) continue;\n\n const fkValue = data[field.Name];\n if (fkValue == null) continue;\n\n // Find display value from the associated virtual field\n const displayValue = this.findFkDisplayValue(entityInfo, field.Name, data);\n\n map.set(field.Name, {\n DisplayValue: displayValue,\n EntityName: relatedEntity.Name,\n RecordId: String(fkValue)\n });\n }\n\n return map;\n }\n\n /**\n * Find the display value for a FK field by checking multiple strategies:\n * 1. Look for a virtual field with RelatedEntityNameFieldMap pointing to this FK\n * 2. Look for any virtual field whose name is derived from the FK name\n * 3. Scan data keys for common naming patterns (e.g., \"TypeID\" -> \"Type\")\n */\n private findFkDisplayValue(entityInfo: EntityInfo, fkFieldName: string, data: Record<string, unknown>): string {\n // Strategy 1: Metadata-linked virtual field via RelatedEntityNameFieldMap\n const linkedVirtual = entityInfo.Fields.find(f =>\n f.RelatedEntityNameFieldMap === fkFieldName && f.IsVirtual\n );\n if (linkedVirtual && data[linkedVirtual.Name] != null) {\n return String(data[linkedVirtual.Name]);\n }\n\n // Strategy 2: Find any virtual field that looks like a display field for this FK\n // by checking all virtual fields and matching via naming patterns\n const virtualFields = entityInfo.Fields.filter(f => f.IsVirtual);\n for (const vf of virtualFields) {\n // Check if this virtual field's RelatedEntityNameFieldMap matches (case-insensitive)\n if (vf.RelatedEntityNameFieldMap &&\n vf.RelatedEntityNameFieldMap.toLowerCase() === fkFieldName.toLowerCase() &&\n data[vf.Name] != null) {\n return String(data[vf.Name]);\n }\n }\n\n // Strategy 3: Try common naming conventions in the data itself\n // e.g., \"TypeID\" -> look for \"Type\" key in data\n // \"OwnerUserID\" -> look for \"Owner User\" or \"OwnerUser\"\n // Strip trailing \"ID\" from the FK name and try variations\n if (fkFieldName.endsWith('ID') && fkFieldName.length > 2) {\n const baseName = fkFieldName.slice(0, -2);\n\n // Direct match in data (e.g., \"CategoryID\" -> \"Category\")\n if (data[baseName] != null && typeof data[baseName] === 'string' &&\n !this.looksLikeGuid(data[baseName] as string)) {\n return String(data[baseName]);\n }\n\n // Try with space before capitals (e.g., \"OwnerUserID\" -> \"Owner User\")\n const spacedName = baseName.replace(/([a-z])([A-Z])/g, '$1 $2');\n if (spacedName !== baseName && data[spacedName] != null &&\n typeof data[spacedName] === 'string' &&\n !this.looksLikeGuid(data[spacedName] as string)) {\n return String(data[spacedName]);\n }\n }\n\n return '';\n }\n\n /** Quick check if a string looks like a GUID (to avoid using GUIDs as display values). */\n private looksLikeGuid(value: string): boolean {\n return /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(value);\n }\n\n /**\n * Get the set of virtual field names so we can skip them in the main field list.\n * Virtual fields are display-only fields whose values are merged into FK rows.\n * We skip ALL virtual fields — not just ones with RelatedEntityNameFieldMap —\n * because they are derived/computed and don't represent stored data.\n */\n private getVirtualFieldNames(entityInfo: EntityInfo | undefined): Set<string> {\n const names = new Set<string>();\n if (!entityInfo) return names;\n\n for (const field of entityInfo.Fields) {\n if (field.IsVirtual) {\n names.add(field.Name);\n }\n }\n\n return names;\n }\n\n // =========================================================================\n // Record ID formatting\n // =========================================================================\n\n /**\n * For single-value PKs like \"ID|<uuid>\", extract just the uuid.\n * For composite keys, show the full concatenated string.\n */\n private formatRecordId(recordId: string): string {\n if (!recordId) return '';\n const parts = recordId.split('||');\n if (parts.length === 1) {\n const singleParts = recordId.split('|');\n if (singleParts.length === 2) {\n return singleParts[1];\n }\n }\n return recordId;\n }\n\n /**\n * Extract the raw ID value from a potentially formatted record ID string.\n */\n private extractRawId(recordId: string): string {\n if (!recordId) return '';\n const parts = recordId.split('||');\n if (parts.length === 1) {\n const singleParts = recordId.split('|');\n if (singleParts.length === 2) {\n return singleParts[1];\n }\n }\n return recordId;\n }\n\n // =========================================================================\n // Type helpers\n // =========================================================================\n\n private isBooleanType(type: string, value: unknown): boolean {\n const t = type.toLowerCase();\n if (t === 'bit' || t === 'boolean') return true;\n if (value === true || value === false) return true;\n return false;\n }\n\n private toBooleanValue(value: unknown): boolean {\n if (value === true || value === 1 || value === '1' || value === 'true') return true;\n return false;\n }\n\n private isJsonValue(value: unknown): boolean {\n if (typeof value === 'object' && value != null) return true;\n if (typeof value === 'string') {\n const trimmed = value.trim();\n return (trimmed.startsWith('{') && trimmed.endsWith('}')) ||\n (trimmed.startsWith('[') && trimmed.endsWith(']'));\n }\n return false;\n }\n\n // =========================================================================\n // Formatting helpers\n // =========================================================================\n\n private formatValue(value: unknown, isJson: boolean): string {\n if (value == null) return 'null';\n if (typeof value === 'boolean') return value ? 'true' : 'false';\n if (typeof value === 'number') return String(value);\n if (typeof value === 'string') {\n if (this.isDateString(value)) return this.formatDate(value);\n // Try to pretty-print JSON strings\n if (isJson) return this.formatJsonString(value);\n if (value.length > 300) return value.substring(0, 300) + '...';\n return value;\n }\n if (typeof value === 'object') {\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n }\n return String(value);\n }\n\n private formatJsonString(value: string): string {\n try {\n const parsed = JSON.parse(value);\n return JSON.stringify(parsed, null, 2);\n } catch {\n return value;\n }\n }\n\n private isDateString(value: string): boolean {\n return /^\\d{4}-\\d{2}-\\d{2}T/.test(value);\n }\n\n private formatDate(value: string): string {\n try {\n const d = new Date(value);\n return d.toLocaleDateString('en-US', {\n month: 'short', day: 'numeric', year: 'numeric',\n hour: '2-digit', minute: '2-digit'\n });\n } catch {\n return value;\n }\n }\n\n private inferType(value: unknown): string {\n if (value == null) return 'null';\n if (typeof value === 'boolean') return 'bit';\n if (typeof value === 'number') return 'int';\n if (typeof value === 'string') {\n if (this.isDateString(value)) return 'datetime';\n if (/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(value)) return 'uniqueidentifier';\n return 'nvarchar';\n }\n return 'object';\n }\n}\n","<!-- Overlay mode -->\n@if (!Inline) {\n <div class=\"micro-backdrop\" [class.visible]=\"IsVisible\" (click)=\"OnBackdropClick()\"></div>\n <div class=\"micro-panel\" [class.visible]=\"IsVisible\">\n <ng-container *ngTemplateOutlet=\"microContent\"></ng-container>\n </div>\n}\n\n<!-- Inline mode (embedded in parent panel) -->\n@if (Inline) {\n <div class=\"micro-inline\">\n <ng-container *ngTemplateOutlet=\"microContent\"></ng-container>\n </div>\n}\n\n<!-- Shared content template -->\n<ng-template #microContent>\n <!-- Header (overlay mode only) -->\n @if (!Inline) {\n <div class=\"micro-header\">\n <div class=\"micro-header-info\">\n <div class=\"micro-entity\">\n <i [class]=\"EntityIcon\" class=\"micro-entity-icon\"></i>\n <span>{{Data.EntityName}}</span>\n @if (RecordDisplayName) {\n <span class=\"micro-record-name\">{{RecordDisplayName}}</span>\n }\n </div>\n <div class=\"micro-record-id\">\n <i class=\"fa-solid fa-fingerprint\"></i>\n <span>{{DisplayRecordID}}</span>\n </div>\n </div>\n <div class=\"micro-header-actions\">\n <button class=\"micro-open-btn\" (click)=\"OnOpenRecord()\" title=\"Open this record\">\n <i class=\"fa-solid fa-arrow-up-right-from-square\"></i> Open\n </button>\n <button class=\"micro-close\" (click)=\"OnClose()\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n </div>\n }\n\n <!-- Inline header -->\n @if (Inline) {\n <div class=\"micro-inline-header\">\n <div class=\"micro-header-left\">\n <div class=\"micro-entity\">\n <i [class]=\"EntityIcon\" class=\"micro-entity-icon\"></i>\n <span>{{Data.EntityName}}</span>\n @if (RecordDisplayName) {\n <span class=\"micro-record-name\">{{RecordDisplayName}}</span>\n }\n </div>\n <div class=\"micro-record-id\">\n <i class=\"fa-solid fa-fingerprint\"></i>\n <span>{{DisplayRecordID}}</span>\n </div>\n </div>\n <button class=\"micro-open-btn\" (click)=\"OnOpenRecord()\" title=\"Open this record\">\n <i class=\"fa-solid fa-arrow-up-right-from-square\"></i> Open\n </button>\n </div>\n }\n\n <!-- Content -->\n <div class=\"micro-content\" [class.micro-content-inline]=\"Inline\">\n @if (IsLoading) {\n <mj-loading text=\"Loading record data...\"></mj-loading>\n }\n\n <!-- Error -->\n @if (!IsLoading && ErrorMessage) {\n <div class=\"micro-error\">\n <i class=\"fa-solid fa-circle-exclamation\"></i>\n <span>{{ErrorMessage}}</span>\n </div>\n }\n\n <!-- Field table -->\n @if (!IsLoading && !ErrorMessage && Fields.length > 0) {\n <div class=\"micro-fields\">\n <!-- Null toggle toolbar -->\n @if (HiddenNullCount > 0) {\n <div class=\"micro-toolbar\">\n <label class=\"null-toggle\">\n <input type=\"checkbox\" [checked]=\"ShowNullValues\" (change)=\"ToggleShowNulls()\" />\n <span class=\"null-toggle-label\">Show null values ({{HiddenNullCount}})</span>\n </label>\n </div>\n }\n <div class=\"micro-field-header\">\n <span class=\"mf-col-name\">Field</span>\n @if (!HasDiffs) {\n <span class=\"mf-col-value\">Value</span>\n }\n @if (HasDiffs) {\n <span class=\"mf-col-old\">Old</span>\n <span class=\"mf-col-new\">New</span>\n }\n </div>\n @for (field of VisibleFields; track field; let odd = $odd) {\n <div class=\"micro-field-row\"\n [class.odd]=\"odd\" [ngClass]=\"field.DiffClass\">\n <span class=\"mf-col-name\" [title]=\"field.Description\">\n <i [class]=\"GetTypeIcon(field.Type)\" class=\"mf-type-icon\"></i>\n <span class=\"mf-field-name\">{{field.DisplayName}}</span>\n </span>\n @if (!HasDiffs) {\n <span class=\"mf-col-value\" [title]=\"field.Value\">\n <!-- Boolean field -->\n @if (field.IsBoolean && !field.IsNull) {\n <i [class]=\"field.BooleanValue ? 'fa-solid fa-square-check mf-bool-true' : 'fa-regular fa-square mf-bool-false'\"\n class=\"mf-bool-icon\"></i>\n <span class=\"mf-bool-label\">{{field.BooleanValue ? 'Yes' : 'No'}}</span>\n }\n <!-- FK field with display value — show display name (ID) with open icon -->\n @if (!field.IsBoolean && field.ForeignKeyEntityName && field.ForeignKeyDisplayValue) {\n <a class=\"mf-fk-link\" (click)=\"OnEntityLinkClicked($event, field)\"\n [title]=\"field.ForeignKeyEntityName + ': ' + field.ForeignKeyRecordId\">\n {{field.ForeignKeyDisplayValue}}\n <span class=\"mf-fk-id\">({{field.ForeignKeyRecordId | slice:0:8}}...)</span>\n <i class=\"fa-solid fa-arrow-up-right-from-square mf-fk-icon\"></i>\n </a>\n }\n <!-- FK field without display value — show raw ID with open icon -->\n @if (!field.IsBoolean && field.ForeignKeyEntityName && !field.ForeignKeyDisplayValue) {\n <a class=\"mf-fk-link\" (click)=\"OnEntityLinkClicked($event, field)\"\n [title]=\"'Open ' + field.ForeignKeyEntityName\">\n {{field.Value}}\n <i class=\"fa-solid fa-arrow-up-right-from-square mf-fk-icon\"></i>\n </a>\n }\n <!-- JSON field — formatted -->\n @if (!field.IsBoolean && !field.ForeignKeyEntityName && field.IsJson) {\n <pre class=\"mf-json-value\">{{field.Value}}</pre>\n }\n <!-- Regular value -->\n @if (!field.IsBoolean && !field.ForeignKeyEntityName && !field.IsJson) {\n {{field.Value}}\n }\n </span>\n }\n @if (HasDiffs) {\n <span class=\"mf-col-old\" [title]=\"field.OldValue\">\n {{field.OldValue || field.Value}}\n </span>\n <span class=\"mf-col-new\" [title]=\"field.Value\">\n {{field.Value}}\n </span>\n }\n </div>\n }\n </div>\n }\n\n <!-- Empty -->\n @if (!IsLoading && !ErrorMessage && Fields.length === 0) {\n <mj-empty-state class=\"micro-empty\" Size=\"compact\"\n Icon=\"\" Title=\"No field data available.\" />\n }\n </div>\n</ng-template>\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@memberjunction/ng-versions",
|
|
3
|
-
"version": "6.1.0
|
|
3
|
+
"version": "6.1.0",
|
|
4
4
|
"description": "MemberJunction: Angular Version History Components - Label creation, detail viewing, and slide panel",
|
|
5
5
|
"main": "./dist/public-api.js",
|
|
6
6
|
"typings": "./dist/public-api.d.ts",
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
"devDependencies": {
|
|
14
14
|
"@angular/compiler": "21.2.22",
|
|
15
15
|
"@angular/compiler-cli": "21.2.22",
|
|
16
|
-
"@memberjunction/ng-test-utils": "6.1.0
|
|
16
|
+
"@memberjunction/ng-test-utils": "6.1.0",
|
|
17
17
|
"vitest": "^4.0.18"
|
|
18
18
|
},
|
|
19
19
|
"peerDependencies": {
|
|
@@ -22,13 +22,13 @@
|
|
|
22
22
|
"@angular/forms": "^21.2.22"
|
|
23
23
|
},
|
|
24
24
|
"dependencies": {
|
|
25
|
-
"@memberjunction/ng-ui-components": "6.1.0
|
|
26
|
-
"@memberjunction/core": "6.1.0
|
|
27
|
-
"@memberjunction/ng-base-types": "6.1.0
|
|
28
|
-
"@memberjunction/core-entities": "6.1.0
|
|
29
|
-
"@memberjunction/global": "6.1.0
|
|
30
|
-
"@memberjunction/graphql-dataprovider": "6.1.0
|
|
31
|
-
"@memberjunction/ng-shared-generic": "6.1.0
|
|
25
|
+
"@memberjunction/ng-ui-components": "6.1.0",
|
|
26
|
+
"@memberjunction/core": "6.1.0",
|
|
27
|
+
"@memberjunction/ng-base-types": "6.1.0",
|
|
28
|
+
"@memberjunction/core-entities": "6.1.0",
|
|
29
|
+
"@memberjunction/global": "6.1.0",
|
|
30
|
+
"@memberjunction/graphql-dataprovider": "6.1.0",
|
|
31
|
+
"@memberjunction/ng-shared-generic": "6.1.0",
|
|
32
32
|
"rxjs": "^7.8.2",
|
|
33
33
|
"tslib": "^2.8.1"
|
|
34
34
|
},
|