@memberjunction/ng-dashboards 5.4.1 → 5.6.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.
Files changed (123) hide show
  1. package/dist/AI/components/agents/agent-configuration.component.js +4 -4
  2. package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
  3. package/dist/AI/components/agents/agent-editor.component.d.ts.map +1 -1
  4. package/dist/AI/components/agents/agent-editor.component.js +5 -4
  5. package/dist/AI/components/agents/agent-editor.component.js.map +1 -1
  6. package/dist/AI/components/models/model-management.component.js +3 -3
  7. package/dist/AI/components/models/model-management.component.js.map +1 -1
  8. package/dist/AI/components/prompts/model-prompt-priority-matrix.component.d.ts.map +1 -1
  9. package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js +8 -7
  10. package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js.map +1 -1
  11. package/dist/AI/components/prompts/prompt-management.component.js +3 -3
  12. package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
  13. package/dist/AI/components/system/system-configuration.component.js +4 -4
  14. package/dist/AI/components/system/system-configuration.component.js.map +1 -1
  15. package/dist/APIKeys/api-applications-panel.component.d.ts.map +1 -1
  16. package/dist/APIKeys/api-applications-panel.component.js +3 -2
  17. package/dist/APIKeys/api-applications-panel.component.js.map +1 -1
  18. package/dist/APIKeys/api-keys-resource.component.js +2 -2
  19. package/dist/APIKeys/api-keys-resource.component.js.map +1 -1
  20. package/dist/APIKeys/api-scopes-panel.component.d.ts.map +1 -1
  21. package/dist/APIKeys/api-scopes-panel.component.js +4 -3
  22. package/dist/APIKeys/api-scopes-panel.component.js.map +1 -1
  23. package/dist/Actions/components/actions-overview.component.js +3 -3
  24. package/dist/Actions/components/actions-overview.component.js.map +1 -1
  25. package/dist/Actions/components/categories-list-view.component.d.ts.map +1 -1
  26. package/dist/Actions/components/categories-list-view.component.js +3 -2
  27. package/dist/Actions/components/categories-list-view.component.js.map +1 -1
  28. package/dist/Actions/components/execution-monitoring.component.js +2 -2
  29. package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
  30. package/dist/Actions/components/explorer/action-explorer.component.js +2 -2
  31. package/dist/Actions/components/explorer/action-explorer.component.js.map +1 -1
  32. package/dist/Actions/components/explorer/new-action-panel.component.d.ts.map +1 -1
  33. package/dist/Actions/components/explorer/new-action-panel.component.js +3 -2
  34. package/dist/Actions/components/explorer/new-action-panel.component.js.map +1 -1
  35. package/dist/Actions/components/explorer/new-category-panel.component.d.ts.map +1 -1
  36. package/dist/Actions/components/explorer/new-category-panel.component.js +3 -2
  37. package/dist/Actions/components/explorer/new-category-panel.component.js.map +1 -1
  38. package/dist/Communication/communication-templates-resource.component.js +2 -2
  39. package/dist/Communication/communication-templates-resource.component.js.map +1 -1
  40. package/dist/ComponentStudio/components/artifact-load-dialog.component.d.ts +6 -0
  41. package/dist/ComponentStudio/components/artifact-load-dialog.component.d.ts.map +1 -1
  42. package/dist/ComponentStudio/components/artifact-load-dialog.component.js +19 -6
  43. package/dist/ComponentStudio/components/artifact-load-dialog.component.js.map +1 -1
  44. package/dist/ComponentStudio/components/artifact-selection-dialog.component.d.ts +4 -0
  45. package/dist/ComponentStudio/components/artifact-selection-dialog.component.d.ts.map +1 -1
  46. package/dist/ComponentStudio/components/artifact-selection-dialog.component.js +13 -4
  47. package/dist/ComponentStudio/components/artifact-selection-dialog.component.js.map +1 -1
  48. package/dist/Credentials/components/credentials-categories-resource.component.d.ts +2 -0
  49. package/dist/Credentials/components/credentials-categories-resource.component.d.ts.map +1 -1
  50. package/dist/Credentials/components/credentials-categories-resource.component.js +13 -9
  51. package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
  52. package/dist/Credentials/components/credentials-list-resource.component.js +11 -11
  53. package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -1
  54. package/dist/Credentials/components/credentials-overview-resource.component.js +3 -3
  55. package/dist/Credentials/components/credentials-overview-resource.component.js.map +1 -1
  56. package/dist/Credentials/components/credentials-types-resource.component.d.ts +2 -0
  57. package/dist/Credentials/components/credentials-types-resource.component.d.ts.map +1 -1
  58. package/dist/Credentials/components/credentials-types-resource.component.js +13 -9
  59. package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
  60. package/dist/DashboardBrowser/dashboard-browser-resource.component.js +11 -11
  61. package/dist/DashboardBrowser/dashboard-browser-resource.component.js.map +1 -1
  62. package/dist/DashboardBrowser/dashboard-share-dialog.component.d.ts.map +1 -1
  63. package/dist/DashboardBrowser/dashboard-share-dialog.component.js +4 -3
  64. package/dist/DashboardBrowser/dashboard-share-dialog.component.js.map +1 -1
  65. package/dist/DataExplorer/components/view-selector/view-selector.component.d.ts.map +1 -1
  66. package/dist/DataExplorer/components/view-selector/view-selector.component.js +4 -3
  67. package/dist/DataExplorer/components/view-selector/view-selector.component.js.map +1 -1
  68. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts +11 -0
  69. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
  70. package/dist/DataExplorer/data-explorer-dashboard.component.js +140 -108
  71. package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
  72. package/dist/DataExplorer/data-explorer-resource.component.d.ts.map +1 -1
  73. package/dist/DataExplorer/data-explorer-resource.component.js +4 -1
  74. package/dist/DataExplorer/data-explorer-resource.component.js.map +1 -1
  75. package/dist/DataExplorer/services/explorer-state.service.d.ts.map +1 -1
  76. package/dist/DataExplorer/services/explorer-state.service.js +9 -8
  77. package/dist/DataExplorer/services/explorer-state.service.js.map +1 -1
  78. package/dist/EntityAdmin/entity-admin-dashboard.component.js +2 -2
  79. package/dist/EntityAdmin/entity-admin-dashboard.component.js.map +1 -1
  80. package/dist/Home/home-application.js +2 -2
  81. package/dist/Home/home-application.js.map +1 -1
  82. package/dist/Lists/components/lists-browse-resource.component.js +3 -3
  83. package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
  84. package/dist/Lists/components/lists-categories-resource.component.d.ts +1 -0
  85. package/dist/Lists/components/lists-categories-resource.component.d.ts.map +1 -1
  86. package/dist/Lists/components/lists-categories-resource.component.js +17 -14
  87. package/dist/Lists/components/lists-categories-resource.component.js.map +1 -1
  88. package/dist/Lists/components/lists-my-lists-resource.component.js +2 -2
  89. package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
  90. package/dist/Lists/components/lists-operations-resource.component.d.ts +1 -0
  91. package/dist/Lists/components/lists-operations-resource.component.d.ts.map +1 -1
  92. package/dist/Lists/components/lists-operations-resource.component.js +15 -12
  93. package/dist/Lists/components/lists-operations-resource.component.js.map +1 -1
  94. package/dist/MCP/components/mcp-connection-dialog.component.d.ts.map +1 -1
  95. package/dist/MCP/components/mcp-connection-dialog.component.js +3 -2
  96. package/dist/MCP/components/mcp-connection-dialog.component.js.map +1 -1
  97. package/dist/MCP/components/mcp-test-tool-dialog.component.d.ts.map +1 -1
  98. package/dist/MCP/components/mcp-test-tool-dialog.component.js +8 -7
  99. package/dist/MCP/components/mcp-test-tool-dialog.component.js.map +1 -1
  100. package/dist/MCP/mcp-dashboard.component.js +22 -22
  101. package/dist/MCP/mcp-dashboard.component.js.map +1 -1
  102. package/dist/QueryBrowser/query-browser-resource.component.d.ts +2 -0
  103. package/dist/QueryBrowser/query-browser-resource.component.d.ts.map +1 -1
  104. package/dist/QueryBrowser/query-browser-resource.component.js +14 -10
  105. package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
  106. package/dist/Scheduling/services/scheduling-instrumentation.service.d.ts.map +1 -1
  107. package/dist/Scheduling/services/scheduling-instrumentation.service.js +2 -1
  108. package/dist/Scheduling/services/scheduling-instrumentation.service.js.map +1 -1
  109. package/dist/Testing/components/testing-explorer.component.d.ts +1 -0
  110. package/dist/Testing/components/testing-explorer.component.d.ts.map +1 -1
  111. package/dist/Testing/components/testing-explorer.component.js +22 -18
  112. package/dist/Testing/components/testing-explorer.component.js.map +1 -1
  113. package/dist/Testing/components/testing-review.component.d.ts +1 -0
  114. package/dist/Testing/components/testing-review.component.d.ts.map +1 -1
  115. package/dist/Testing/components/testing-review.component.js +14 -10
  116. package/dist/Testing/components/testing-review.component.js.map +1 -1
  117. package/dist/VersionHistory/components/diff-resource.component.js +6 -6
  118. package/dist/VersionHistory/components/diff-resource.component.js.map +1 -1
  119. package/dist/VersionHistory/components/graph-resource.component.js +2 -2
  120. package/dist/VersionHistory/components/graph-resource.component.js.map +1 -1
  121. package/dist/VersionHistory/components/labels-resource.component.js +3 -3
  122. package/dist/VersionHistory/components/labels-resource.component.js.map +1 -1
  123. package/package.json +38 -38
@@ -1 +1 @@
1
- {"version":3,"file":"diff-resource.component.js","sourceRoot":"","sources":["../../../src/VersionHistory/components/diff-resource.component.ts","../../../src/VersionHistory/components/diff-resource.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, ChangeDetectorRef, ChangeDetectionStrategy } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { RegisterClass } from '@memberjunction/global';\nimport { BaseResourceComponent, NavigationService } from '@memberjunction/ng-shared';\nimport { RunView, Metadata, CompositeKey, EntityRecordNameInput } from '@memberjunction/core';\nimport { ResourceData, UserInfoEngine, MJVersionLabelEntityType, MJVersionLabelItemEntityType } from '@memberjunction/core-entities';\n\ninterface VersionDiffPreferences {\n DiffMode: 'label-to-label' | 'label-to-current';\n}\ninterface DiffItemView {\n EntityName: string;\n EntityID: string;\n RecordID: string;\n DisplayName: string;\n ChangeType: 'Added' | 'Removed' | 'Modified' | 'Unchanged';\n FieldChanges: FieldChangeView[];\n IsExpanded: boolean;\n IsLoadingFields: boolean;\n FieldsLoaded: boolean;\n /** RecordChangeID from the \"from\" label (for loading FullRecordJSON). */\n FromRecordChangeID: string;\n /** RecordChangeID from the \"to\" label (for loading FullRecordJSON). */\n ToRecordChangeID: string;\n}\n\ninterface FieldChangeView {\n FieldName: string;\n OldValue: string;\n NewValue: string;\n ChangeType: 'Added' | 'Modified' | 'Removed';\n}\n\ninterface RecordChangeRow {\n ID: string;\n FullRecordJSON: string;\n}\n\ninterface EntityGroupView {\n EntityName: string;\n EntityIcon: string;\n Items: DiffItemView[];\n AddedCount: number;\n RemovedCount: number;\n ModifiedCount: number;\n IsExpanded: boolean;\n NamesLoaded: boolean;\n IsLoadingNames: boolean;\n}\n\n@RegisterClass(BaseResourceComponent, 'VersionHistoryDiffResource')\n@Component({\n standalone: false,\n selector: 'mj-version-history-diff-resource',\n templateUrl: './diff-resource.component.html',\n styleUrls: ['./diff-resource.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class VersionHistoryDiffResourceComponent extends BaseResourceComponent implements OnInit, OnDestroy {\n public IsLoading = true;\n public IsDiffLoading = false;\n public HasDiffResult = false;\n\n // Label selection\n public AvailableLabels: MJVersionLabelEntityType[] = [];\n public FromLabelId = '';\n public ToLabelId = '';\n public DiffMode: 'label-to-label' | 'label-to-current' = 'label-to-current';\n\n // Diff results\n public EntityGroups: EntityGroupView[] = [];\n public FilteredEntityGroups: EntityGroupView[] = [];\n public TotalAdded = 0;\n public TotalRemoved = 0;\n public TotalModified = 0;\n public TotalUnchanged = 0;\n\n // Diff result filtering/sorting\n public DiffSortBy: 'name' | 'count' = 'count';\n public DiffSortDir: 'asc' | 'desc' = 'desc';\n public DiffFilterType: 'all' | 'added' | 'removed' | 'modified' = 'all';\n public DiffSearch = '';\n\n // UI state\n public ExpandedEntities = new Set<string>();\n\n private static readonly PREFS_KEY = 'VersionHistory.Diff.UserPreferences';\n private preferencesLoaded = false;\n private destroy$ = new Subject<void>();\n private metadata = new Metadata();\n\n constructor(private cdr: ChangeDetectorRef, private navigationService: NavigationService) {\n super();\n }\n\n ngOnInit(): void {\n this.loadUserPreferences();\n this.LoadLabels();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n async GetResourceDisplayName(data: ResourceData): Promise<string> {\n return 'Diff Viewer';\n }\n\n async GetResourceIconClass(data: ResourceData): Promise<string> {\n return 'fa-solid fa-code-compare';\n }\n\n public async LoadLabels(): Promise<void> {\n try {\n this.IsLoading = true;\n this.cdr.markForCheck();\n\n const rv = new RunView();\n const result = await rv.RunView<MJVersionLabelEntityType>({\n EntityName: 'MJ: Version Labels',\n ExtraFilter: \"Status = 'Active'\",\n OrderBy: '__mj_CreatedAt DESC',\n MaxRows: 200,\n ResultType: 'simple'\n });\n\n if (result.Success) {\n this.AvailableLabels = result.Results;\n }\n } catch (error) {\n console.error('Error loading labels for diff:', error);\n } finally {\n this.IsLoading = false;\n this.NotifyLoadComplete();\n this.cdr.markForCheck();\n }\n }\n\n public OnDiffModeChange(mode: 'label-to-label' | 'label-to-current'): void {\n this.DiffMode = mode;\n this.HasDiffResult = false;\n this.EntityGroups = [];\n this.cdr.markForCheck();\n this.persistPreferences();\n }\n\n private loadUserPreferences(): void {\n try {\n const raw = UserInfoEngine.Instance.GetSetting(VersionHistoryDiffResourceComponent.PREFS_KEY);\n if (raw) {\n const prefs: VersionDiffPreferences = JSON.parse(raw);\n if (prefs.DiffMode === 'label-to-label' || prefs.DiffMode === 'label-to-current') {\n this.DiffMode = prefs.DiffMode;\n }\n }\n } catch (error) {\n console.error('Error loading diff preferences:', error);\n this.DiffMode = 'label-to-current';\n }\n this.preferencesLoaded = true;\n }\n\n private persistPreferences(): void {\n if (!this.preferencesLoaded) return;\n const prefs: VersionDiffPreferences = {\n DiffMode: this.DiffMode\n };\n UserInfoEngine.Instance.SetSettingDebounced(VersionHistoryDiffResourceComponent.PREFS_KEY, JSON.stringify(prefs));\n }\n\n public async RunDiff(): Promise<void> {\n if (!this.FromLabelId) return;\n if (this.DiffMode === 'label-to-label' && !this.ToLabelId) return;\n\n try {\n this.IsDiffLoading = true;\n this.HasDiffResult = false;\n this.cdr.markForCheck();\n\n // Load label items for comparison\n const rv = new RunView();\n const fromItems = await this.loadLabelItems(rv, this.FromLabelId);\n\n if (this.DiffMode === 'label-to-label') {\n const toItems = await this.loadLabelItems(rv, this.ToLabelId);\n this.computeDiff(fromItems, toItems);\n } else {\n // Label-to-current: compare label state against live data\n await this.computeDiffToCurrentState(rv, fromItems);\n }\n\n this.HasDiffResult = true;\n } catch (error) {\n console.error('Error running diff:', error);\n } finally {\n this.IsDiffLoading = false;\n this.cdr.markForCheck();\n }\n }\n\n private async loadLabelItems(\n rv: RunView,\n labelId: string\n ): Promise<MJVersionLabelItemEntityType[]> {\n const result = await rv.RunView<MJVersionLabelItemEntityType>({\n EntityName: 'MJ: Version Label Items',\n ExtraFilter: `VersionLabelID = '${labelId}'`,\n ResultType: 'simple'\n });\n return result.Success ? result.Results : [];\n }\n\n private computeDiff(\n fromItems: MJVersionLabelItemEntityType[],\n toItems: MJVersionLabelItemEntityType[]\n ): void {\n const entityMap = new Map<string, DiffItemView[]>();\n\n // Build lookup maps keyed by EntityID + RecordID\n const fromMap = this.buildItemKeyMap(fromItems);\n const toMap = this.buildItemKeyMap(toItems);\n\n // Items in 'to' but not in 'from' = Added\n for (const [key, item] of toMap) {\n const entityName = this.resolveEntityName(item.EntityID ?? '');\n if (!entityMap.has(entityName)) entityMap.set(entityName, []);\n\n if (!fromMap.has(key)) {\n entityMap.get(entityName)!.push({\n EntityName: entityName,\n EntityID: item.EntityID ?? '',\n RecordID: item.RecordID ?? '',\n DisplayName: '',\n ChangeType: 'Added',\n FieldChanges: [],\n IsExpanded: false,\n IsLoadingFields: false,\n FieldsLoaded: false,\n FromRecordChangeID: '',\n ToRecordChangeID: item.RecordChangeID ?? ''\n });\n }\n }\n\n // Items in 'from' but not in 'to' = Removed\n for (const [key, item] of fromMap) {\n const entityName = this.resolveEntityName(item.EntityID ?? '');\n if (!entityMap.has(entityName)) entityMap.set(entityName, []);\n\n if (!toMap.has(key)) {\n entityMap.get(entityName)!.push({\n EntityName: entityName,\n EntityID: item.EntityID ?? '',\n RecordID: item.RecordID ?? '',\n DisplayName: '',\n ChangeType: 'Removed',\n FieldChanges: [],\n IsExpanded: false,\n IsLoadingFields: false,\n FieldsLoaded: false,\n FromRecordChangeID: item.RecordChangeID ?? '',\n ToRecordChangeID: ''\n });\n } else {\n // Both exist - check if RecordChangeID differs (= Modified)\n const toItem = toMap.get(key)!;\n const changeType = item.RecordChangeID !== toItem.RecordChangeID\n ? 'Modified' : 'Unchanged';\n entityMap.get(entityName)!.push({\n EntityName: entityName,\n EntityID: item.EntityID ?? '',\n RecordID: item.RecordID ?? '',\n DisplayName: '',\n ChangeType: changeType,\n FieldChanges: [],\n IsExpanded: false,\n IsLoadingFields: false,\n FieldsLoaded: false,\n FromRecordChangeID: item.RecordChangeID ?? '',\n ToRecordChangeID: toItem.RecordChangeID ?? ''\n });\n }\n }\n\n this.buildEntityGroups(entityMap);\n }\n\n private async computeDiffToCurrentState(\n rv: RunView,\n labelItems: MJVersionLabelItemEntityType[]\n ): Promise<void> {\n // For label-to-current, compare snapshot RecordChangeIDs against\n // the latest RecordChange for each entity/record combination.\n const entityMap = new Map<string, DiffItemView[]>();\n\n for (const item of labelItems) {\n const entityId = item.EntityID ?? '';\n const entityName = this.resolveEntityName(entityId);\n if (!entityMap.has(entityName)) entityMap.set(entityName, []);\n\n // Load the latest RecordChange for this record\n const latestChangeId = await this.loadLatestRecordChange(rv, entityId, item.RecordID ?? '');\n const isModified = latestChangeId != null && latestChangeId !== item.RecordChangeID;\n\n entityMap.get(entityName)!.push({\n EntityName: entityName,\n EntityID: entityId,\n RecordID: item.RecordID ?? '',\n DisplayName: '',\n ChangeType: isModified ? 'Modified' : 'Unchanged',\n FieldChanges: [],\n IsExpanded: false,\n IsLoadingFields: false,\n FieldsLoaded: false,\n FromRecordChangeID: item.RecordChangeID ?? '',\n ToRecordChangeID: latestChangeId ?? ''\n });\n }\n\n this.buildEntityGroups(entityMap);\n }\n\n private buildItemKeyMap(\n items: MJVersionLabelItemEntityType[]\n ): Map<string, MJVersionLabelItemEntityType> {\n const map = new Map<string, MJVersionLabelItemEntityType>();\n for (const item of items) {\n const key = `${item.EntityID ?? ''}|${item.RecordID ?? ''}`;\n map.set(key, item);\n }\n return map;\n }\n\n private buildEntityGroups(entityMap: Map<string, DiffItemView[]>): void {\n this.TotalAdded = 0;\n this.TotalRemoved = 0;\n this.TotalModified = 0;\n this.TotalUnchanged = 0;\n\n this.EntityGroups = Array.from(entityMap.entries()).map(([entityName, items]) => {\n const added = items.filter(i => i.ChangeType === 'Added').length;\n const removed = items.filter(i => i.ChangeType === 'Removed').length;\n const modified = items.filter(i => i.ChangeType === 'Modified').length;\n\n this.TotalAdded += added;\n this.TotalRemoved += removed;\n this.TotalModified += modified;\n this.TotalUnchanged += items.filter(i => i.ChangeType === 'Unchanged').length;\n\n // Resolve entity icon from first item's EntityID\n const firstItem = items[0];\n const entityIcon = this.resolveEntityIcon(firstItem?.EntityID ?? '');\n\n return {\n EntityName: entityName,\n EntityIcon: entityIcon,\n Items: items.filter(i => i.ChangeType !== 'Unchanged'),\n AddedCount: added,\n RemovedCount: removed,\n ModifiedCount: modified,\n IsExpanded: false,\n NamesLoaded: false,\n IsLoadingNames: false\n };\n }).filter(g => g.Items.length > 0)\n .sort((a, b) => b.Items.length - a.Items.length);\n\n this.ExpandedEntities.clear();\n this.applySortAndFilterDiff();\n }\n\n private resolveEntityName(entityId: string): string {\n if (!entityId) return 'Unknown';\n const entity = this.metadata.Entities.find(e => e.ID === entityId);\n return entity ? entity.Name : 'Unknown';\n }\n\n private resolveEntityIcon(entityId: string): string {\n if (!entityId) return 'fa-solid fa-table';\n const entity = this.metadata.Entities.find(e => e.ID === entityId);\n return entity?.Icon || 'fa-solid fa-table';\n }\n\n // =========================================================================\n // Expand / Collapse\n // =========================================================================\n\n public ToggleEntityGroup(group: EntityGroupView): void {\n group.IsExpanded = !group.IsExpanded;\n if (group.IsExpanded) {\n this.ExpandedEntities.add(group.EntityName);\n // Auto-expand all Modified items so field details show immediately\n for (const item of group.Items) {\n if (item.ChangeType === 'Modified') {\n item.IsExpanded = true;\n }\n }\n // Auto-load field changes for modified items when group opens\n this.loadFieldChangesForGroup(group);\n // Load record display names\n if (!group.NamesLoaded && !group.IsLoadingNames) {\n this.loadGroupRecordNames(group);\n }\n } else {\n this.ExpandedEntities.delete(group.EntityName);\n }\n this.cdr.markForCheck();\n }\n\n public ToggleItem(item: DiffItemView): void {\n if (item.ChangeType !== 'Modified') return;\n item.IsExpanded = !item.IsExpanded;\n if (item.IsExpanded && !item.FieldsLoaded) {\n this.loadFieldChangesForItem(item);\n }\n this.cdr.markForCheck();\n }\n\n public ExpandAllGroups(): void {\n for (const group of this.FilteredEntityGroups) {\n group.IsExpanded = true;\n this.ExpandedEntities.add(group.EntityName);\n this.loadFieldChangesForGroup(group);\n for (const item of group.Items) {\n if (item.ChangeType === 'Modified') {\n item.IsExpanded = true;\n }\n }\n if (!group.NamesLoaded && !group.IsLoadingNames) {\n this.loadGroupRecordNames(group);\n }\n }\n this.cdr.markForCheck();\n }\n\n public CollapseAllGroups(): void {\n for (const group of this.FilteredEntityGroups) {\n group.IsExpanded = false;\n this.ExpandedEntities.delete(group.EntityName);\n for (const item of group.Items) {\n item.IsExpanded = false;\n }\n }\n this.cdr.markForCheck();\n }\n\n public IsEntityExpanded(entityName: string): boolean {\n return this.ExpandedEntities.has(entityName);\n }\n\n /** Open a record in the explorer via NavigationService. */\n public OnOpenRecord(item: DiffItemView): void {\n const rawId = this.extractRawRecordId(item.RecordID);\n const pkey = new CompositeKey([{ FieldName: 'ID', Value: rawId }]);\n this.navigationService.OpenEntityRecord(item.EntityName, pkey);\n }\n\n // =========================================================================\n // Record name resolution\n // =========================================================================\n\n /** Lazy-load record display names for a group using Metadata.GetEntityRecordNames. */\n private async loadGroupRecordNames(group: EntityGroupView): Promise<void> {\n group.IsLoadingNames = true;\n this.cdr.markForCheck();\n\n try {\n const inputs: EntityRecordNameInput[] = group.Items.map(item => {\n const rawId = this.extractRawRecordId(item.RecordID);\n const input = new EntityRecordNameInput();\n input.EntityName = group.EntityName;\n input.CompositeKey = new CompositeKey([{ FieldName: 'ID', Value: rawId }]);\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 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 group.IsLoadingNames = false;\n group.NamesLoaded = true;\n this.cdr.markForCheck();\n }\n }\n\n /** Extract the raw UUID from a RecordID that may be in \"ID|<uuid>\" format. */\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 // =========================================================================\n // Field-level diff loading\n // =========================================================================\n\n /** Auto-load field changes for all modified items in a group (when first expanded). */\n private loadFieldChangesForGroup(group: EntityGroupView): void {\n for (const item of group.Items) {\n if (item.ChangeType === 'Modified' && !item.FieldsLoaded && !item.IsLoadingFields) {\n this.loadFieldChangesForItem(item);\n }\n }\n }\n\n /** Lazy-load field-level changes for a single modified item. */\n private async loadFieldChangesForItem(item: DiffItemView): Promise<void> {\n if (!item.FromRecordChangeID || !item.ToRecordChangeID) {\n item.FieldsLoaded = true;\n return;\n }\n\n item.IsLoadingFields = true;\n this.cdr.markForCheck();\n\n try {\n item.FieldChanges = await this.computeFieldChanges(item.FromRecordChangeID, item.ToRecordChangeID);\n } catch (e) {\n console.error('Error loading field changes:', e);\n } finally {\n item.IsLoadingFields = false;\n item.FieldsLoaded = true;\n this.cdr.markForCheck();\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(oldChangeId: string, newChangeId: string): Promise<FieldChangeView[]> {\n if (!oldChangeId || !newChangeId) return [];\n\n try {\n const rv = new RunView();\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 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 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 // =========================================================================\n // Display helpers\n // =========================================================================\n\n public GetChangeTypeClass(changeType: string): string {\n const classes: Record<string, string> = {\n 'Added': 'change-added',\n 'Removed': 'change-removed',\n 'Modified': 'change-modified',\n 'Unchanged': 'change-unchanged'\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',\n 'Removed': 'fa-solid fa-minus',\n 'Modified': 'fa-solid fa-pen',\n 'Unchanged': 'fa-solid fa-equals'\n };\n return icons[changeType] ?? 'fa-solid fa-circle';\n }\n\n public FormatRecordID(recordId: string): string {\n return this.extractRawRecordId(recordId);\n }\n\n public FormatLabelOption(label: MJVersionLabelEntityType): string {\n const dateVal = label.__mj_CreatedAt;\n const date = dateVal instanceof Date\n ? dateVal.toLocaleDateString('en-US', { month: 'short', day: 'numeric' })\n : new Date(dateVal as unknown as string).toLocaleDateString('en-US', { month: 'short', day: 'numeric' });\n return `${label.Name} (${label.Scope}, ${date})`;\n }\n\n public Refresh(): void {\n this.LoadLabels();\n }\n\n public get CanRunDiff(): boolean {\n if (!this.FromLabelId) return false;\n if (this.DiffMode === 'label-to-label' && !this.ToLabelId) return false;\n return true;\n }\n\n public get TotalChanges(): number {\n return this.TotalAdded + this.TotalRemoved + this.TotalModified;\n }\n\n // =========================================================================\n // Label selection helpers\n // =========================================================================\n\n /** From dropdown excludes the currently selected To label. */\n public get FilteredFromLabels(): MJVersionLabelEntityType[] {\n if (!this.ToLabelId) return this.AvailableLabels;\n return this.AvailableLabels.filter(l => l.ID !== this.ToLabelId);\n }\n\n /** To dropdown excludes the currently selected From label. */\n public get FilteredToLabels(): MJVersionLabelEntityType[] {\n if (!this.FromLabelId) return this.AvailableLabels;\n return this.AvailableLabels.filter(l => l.ID !== this.FromLabelId);\n }\n\n /** Swap From and To label selections. */\n public SwapLabels(): void {\n const temp = this.FromLabelId;\n this.FromLabelId = this.ToLabelId;\n this.ToLabelId = temp;\n this.cdr.markForCheck();\n }\n\n // =========================================================================\n // Diff result sorting & filtering\n // =========================================================================\n\n public OnDiffSortChange(sortBy: 'name' | 'count'): void {\n if (this.DiffSortBy === sortBy) {\n this.DiffSortDir = this.DiffSortDir === 'asc' ? 'desc' : 'asc';\n } else {\n this.DiffSortBy = sortBy;\n this.DiffSortDir = sortBy === 'name' ? 'asc' : 'desc';\n }\n this.applySortAndFilterDiff();\n this.cdr.markForCheck();\n }\n\n public OnDiffFilterChange(filterType: 'all' | 'added' | 'removed' | 'modified'): void {\n this.DiffFilterType = filterType;\n this.applySortAndFilterDiff();\n this.cdr.markForCheck();\n }\n\n public OnDiffSearchChange(text: string): void {\n this.DiffSearch = text;\n this.applySortAndFilterDiff();\n this.cdr.markForCheck();\n }\n\n private applySortAndFilterDiff(): void {\n let groups = [...this.EntityGroups];\n\n // Filter by change type\n if (this.DiffFilterType !== 'all') {\n groups = groups.map(g => ({\n ...g,\n Items: g.Items.filter(i => i.ChangeType.toLowerCase() === this.DiffFilterType)\n })).filter(g => g.Items.length > 0);\n }\n\n // Filter by search text\n if (this.DiffSearch) {\n const search = this.DiffSearch.toLowerCase();\n groups = groups\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 .filter(g => g.Items.length > 0);\n }\n\n // Sort\n groups.sort((a, b) => {\n if (this.DiffSortBy === 'name') {\n const cmp = a.EntityName.localeCompare(b.EntityName);\n return this.DiffSortDir === 'asc' ? cmp : -cmp;\n }\n const cmp = a.Items.length - b.Items.length;\n return this.DiffSortDir === 'asc' ? cmp : -cmp;\n });\n\n this.FilteredEntityGroups = groups;\n }\n}\n","<div class=\"diff-container\">\n @if (IsLoading) {\n <mj-loading text=\"Loading diff viewer...\"></mj-loading>\n }\n\n @if (!IsLoading) {\n <!-- Header -->\n <div class=\"page-header\">\n <div class=\"header-left\">\n <h2 class=\"page-title\">Diff Viewer</h2>\n <p class=\"page-subtitle\">Compare states between version labels or against current data</p>\n </div>\n </div>\n <!-- Diff Configuration Panel -->\n <div class=\"config-panel\">\n <!-- Mode Selector -->\n <div class=\"mode-selector\">\n <button class=\"mode-btn\"\n [class.active]=\"DiffMode === 'label-to-current'\"\n (click)=\"OnDiffModeChange('label-to-current')\">\n <i class=\"fa-solid fa-clock-rotate-left\"></i>\n Label vs Current\n </button>\n <button class=\"mode-btn\"\n [class.active]=\"DiffMode === 'label-to-label'\"\n (click)=\"OnDiffModeChange('label-to-label')\">\n <i class=\"fa-solid fa-code-compare\"></i>\n Label vs Label\n </button>\n </div>\n <!-- Label Selectors -->\n <div class=\"label-selectors\">\n <div class=\"selector-group\">\n <label class=\"selector-label\">\n {{DiffMode === 'label-to-current' ? 'Compare label' : 'From label'}}\n </label>\n <select class=\"selector-input\"\n [(ngModel)]=\"FromLabelId\">\n <option value=\"\">Select a label...</option>\n @for (label of FilteredFromLabels; track label) {\n <option\n [value]=\"label.ID\">\n {{FormatLabelOption(label)}}\n </option>\n }\n </select>\n </div>\n @if (DiffMode === 'label-to-label') {\n <div class=\"selector-arrow\">\n <button class=\"swap-btn\" (click)=\"SwapLabels()\" title=\"Swap direction\">\n <i class=\"fa-solid fa-arrows-rotate\"></i>\n </button>\n </div>\n }\n @if (DiffMode === 'label-to-current') {\n <div class=\"selector-arrow\">\n <i class=\"fa-solid fa-arrow-right\"></i>\n <span class=\"current-state-badge\">Current State</span>\n </div>\n }\n @if (DiffMode === 'label-to-label') {\n <div class=\"selector-group\">\n <label class=\"selector-label\">To label</label>\n <select class=\"selector-input\"\n [(ngModel)]=\"ToLabelId\">\n <option value=\"\">Select a label...</option>\n @for (label of FilteredToLabels; track label) {\n <option\n [value]=\"label.ID\">\n {{FormatLabelOption(label)}}\n </option>\n }\n </select>\n </div>\n }\n </div>\n <!-- Run Button -->\n <button class=\"btn-primary\"\n [disabled]=\"!CanRunDiff || IsDiffLoading\"\n (click)=\"RunDiff()\">\n @if (!IsDiffLoading) {\n <i class=\"fa-solid fa-play\"></i>\n }\n @if (IsDiffLoading) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n }\n <span>{{IsDiffLoading ? 'Comparing...' : 'Compare'}}</span>\n </button>\n </div>\n <!-- Diff Results -->\n @if (HasDiffResult) {\n <!-- Summary Stats -->\n <div class=\"diff-summary\">\n <div class=\"diff-stat change-added\">\n <i class=\"fa-solid fa-plus\"></i>\n <span class=\"diff-stat-value\">{{TotalAdded}}</span>\n <span class=\"diff-stat-label\">Added</span>\n </div>\n <div class=\"diff-stat change-removed\">\n <i class=\"fa-solid fa-minus\"></i>\n <span class=\"diff-stat-value\">{{TotalRemoved}}</span>\n <span class=\"diff-stat-label\">Removed</span>\n </div>\n <div class=\"diff-stat change-modified\">\n <i class=\"fa-solid fa-pen\"></i>\n <span class=\"diff-stat-value\">{{TotalModified}}</span>\n <span class=\"diff-stat-label\">Modified</span>\n </div>\n <div class=\"diff-stat change-unchanged\">\n <i class=\"fa-solid fa-equals\"></i>\n <span class=\"diff-stat-value\">{{TotalUnchanged}}</span>\n <span class=\"diff-stat-label\">Unchanged</span>\n </div>\n </div>\n <!-- Results toolbar -->\n @if (EntityGroups.length > 0) {\n <div class=\"diff-toolbar\">\n <div class=\"diff-search\">\n <i class=\"fa-solid fa-search diff-search-icon\"></i>\n <input type=\"text\" class=\"diff-search-input\"\n placeholder=\"Search by entity or record...\"\n [ngModel]=\"DiffSearch\"\n (ngModelChange)=\"OnDiffSearchChange($event)\" />\n </div>\n <div class=\"diff-filter-pills\">\n <button class=\"filter-pill\" [class.active]=\"DiffFilterType === 'all'\"\n (click)=\"OnDiffFilterChange('all')\">All</button>\n <button class=\"filter-pill change-added\" [class.active]=\"DiffFilterType === 'added'\"\n (click)=\"OnDiffFilterChange('added')\">Added</button>\n <button class=\"filter-pill change-removed\" [class.active]=\"DiffFilterType === 'removed'\"\n (click)=\"OnDiffFilterChange('removed')\">Removed</button>\n <button class=\"filter-pill change-modified\" [class.active]=\"DiffFilterType === 'modified'\"\n (click)=\"OnDiffFilterChange('modified')\">Modified</button>\n </div>\n <div class=\"diff-toolbar-right\">\n <button class=\"toolbar-action-btn\" (click)=\"ExpandAllGroups()\" title=\"Expand all\">\n <i class=\"fa-solid fa-angles-down\"></i>\n </button>\n <button class=\"toolbar-action-btn\" (click)=\"CollapseAllGroups()\" title=\"Collapse all\">\n <i class=\"fa-solid fa-angles-up\"></i>\n </button>\n <div class=\"diff-sort-toggle\">\n <button class=\"toggle-btn-sm\" [class.active]=\"DiffSortBy === 'name'\"\n (click)=\"OnDiffSortChange('name')\" title=\"Sort by name\">\n <i class=\"fa-solid\" [ngClass]=\"DiffSortBy === 'name' && DiffSortDir === 'desc' ? 'fa-arrow-up-z-a' : 'fa-arrow-down-a-z'\"></i>\n </button>\n <button class=\"toggle-btn-sm\" [class.active]=\"DiffSortBy === 'count'\"\n (click)=\"OnDiffSortChange('count')\" title=\"Sort by count\">\n <i class=\"fa-solid\" [ngClass]=\"DiffSortBy === 'count' && DiffSortDir === 'asc' ? 'fa-arrow-up-1-9' : 'fa-arrow-down-9-1'\"></i>\n </button>\n </div>\n </div>\n </div>\n }\n <!-- Entity Groups -->\n @if (FilteredEntityGroups.length > 0) {\n <div class=\"entity-groups\">\n @for (group of FilteredEntityGroups; track group) {\n <div class=\"entity-group\">\n <div class=\"entity-group-header\" (click)=\"ToggleEntityGroup(group)\">\n <div class=\"entity-group-left\">\n <i class=\"fa-solid fa-chevron-right entity-chevron\"\n [class.expanded]=\"group.IsExpanded\">\n </i>\n <i [class]=\"group.EntityIcon\" class=\"entity-icon\"></i>\n <span class=\"entity-group-name\">{{group.EntityName}}</span>\n </div>\n <div class=\"entity-group-badges\">\n @if (group.AddedCount > 0) {\n <span class=\"badge change-added\">\n +{{group.AddedCount}}\n </span>\n }\n @if (group.RemovedCount > 0) {\n <span class=\"badge change-removed\">\n -{{group.RemovedCount}}\n </span>\n }\n @if (group.ModifiedCount > 0) {\n <span class=\"badge change-modified\">\n ~{{group.ModifiedCount}}\n </span>\n }\n </div>\n </div>\n @if (group.IsExpanded) {\n <div class=\"entity-group-items\">\n @for (item of group.Items; track item) {\n <div class=\"diff-item-wrapper\">\n <div class=\"diff-item\" [ngClass]=\"GetChangeTypeClass(item.ChangeType)\"\n [class.clickable]=\"item.ChangeType === 'Modified'\"\n (click)=\"ToggleItem(item)\">\n <i [class]=\"GetChangeTypeIcon(item.ChangeType)\" class=\"diff-item-icon\"></i>\n <span class=\"diff-item-record\">\n {{FormatRecordID(item.RecordID)}}\n @if (item.DisplayName) {\n <span class=\"diff-item-display-name\"> ({{item.DisplayName}})</span>\n }\n </span>\n <span class=\"diff-item-type\">{{item.ChangeType}}</span>\n <button class=\"diff-item-open-btn\" (click)=\"OnOpenRecord(item); $event.stopPropagation()\"\n title=\"Open record\">\n <i class=\"fa-solid fa-arrow-up-right-from-square\"></i>\n </button>\n @if (item.ChangeType === 'Modified') {\n <i class=\"fa-solid fa-chevron-right diff-item-chevron\"\n [class.expanded]=\"item.IsExpanded\"\n ></i>\n }\n </div>\n <!-- Field-level changes -->\n @if (item.IsExpanded && item.ChangeType === 'Modified') {\n <div class=\"diff-fields\">\n @if (item.IsLoadingFields) {\n <mj-loading text=\"Loading changes...\" size=\"small\"></mj-loading>\n }\n @if (!item.IsLoadingFields && item.FieldChanges.length > 0) {\n @for (field of item.FieldChanges; track field) {\n <div class=\"diff-field\"\n [ngClass]=\"GetChangeTypeClass(field.ChangeType)\">\n <span class=\"diff-field-name\">{{field.FieldName}}</span>\n <span class=\"diff-field-values\">\n @if (field.OldValue) {\n <span class=\"diff-field-old\">{{field.OldValue | slice:0:60}}</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:60}}</span>\n }\n </span>\n </div>\n }\n }\n @if (!item.IsLoadingFields && item.FieldsLoaded && item.FieldChanges.length === 0) {\n <div class=\"diff-fields-empty\">\n <span>No field-level changes available</span>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n <!-- No changes -->\n @if (FilteredEntityGroups.length === 0 && TotalChanges === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-check-circle empty-icon\" style=\"color: #10b981;\"></i>\n <h3>No differences found</h3>\n <p>The compared states are identical.</p>\n </div>\n }\n }\n <!-- No results yet -->\n @if (!HasDiffResult && !IsDiffLoading) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-code-compare empty-icon\"></i>\n <h3>Select labels to compare</h3>\n <p>Choose a diff mode and select labels above, then click Compare.</p>\n </div>\n }\n }\n</div>\n"]}
1
+ {"version":3,"file":"diff-resource.component.js","sourceRoot":"","sources":["../../../src/VersionHistory/components/diff-resource.component.ts","../../../src/VersionHistory/components/diff-resource.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, ChangeDetectorRef, ChangeDetectionStrategy } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { RegisterClass , UUIDsEqual } from '@memberjunction/global';\nimport { BaseResourceComponent, NavigationService } from '@memberjunction/ng-shared';\nimport { RunView, Metadata, CompositeKey, EntityRecordNameInput } from '@memberjunction/core';\nimport { ResourceData, UserInfoEngine, MJVersionLabelEntityType, MJVersionLabelItemEntityType } from '@memberjunction/core-entities';\n\ninterface VersionDiffPreferences {\n DiffMode: 'label-to-label' | 'label-to-current';\n}\ninterface DiffItemView {\n EntityName: string;\n EntityID: string;\n RecordID: string;\n DisplayName: string;\n ChangeType: 'Added' | 'Removed' | 'Modified' | 'Unchanged';\n FieldChanges: FieldChangeView[];\n IsExpanded: boolean;\n IsLoadingFields: boolean;\n FieldsLoaded: boolean;\n /** RecordChangeID from the \"from\" label (for loading FullRecordJSON). */\n FromRecordChangeID: string;\n /** RecordChangeID from the \"to\" label (for loading FullRecordJSON). */\n ToRecordChangeID: string;\n}\n\ninterface FieldChangeView {\n FieldName: string;\n OldValue: string;\n NewValue: string;\n ChangeType: 'Added' | 'Modified' | 'Removed';\n}\n\ninterface RecordChangeRow {\n ID: string;\n FullRecordJSON: string;\n}\n\ninterface EntityGroupView {\n EntityName: string;\n EntityIcon: string;\n Items: DiffItemView[];\n AddedCount: number;\n RemovedCount: number;\n ModifiedCount: number;\n IsExpanded: boolean;\n NamesLoaded: boolean;\n IsLoadingNames: boolean;\n}\n\n@RegisterClass(BaseResourceComponent, 'VersionHistoryDiffResource')\n@Component({\n standalone: false,\n selector: 'mj-version-history-diff-resource',\n templateUrl: './diff-resource.component.html',\n styleUrls: ['./diff-resource.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class VersionHistoryDiffResourceComponent extends BaseResourceComponent implements OnInit, OnDestroy {\n public IsLoading = true;\n public IsDiffLoading = false;\n public HasDiffResult = false;\n\n // Label selection\n public AvailableLabels: MJVersionLabelEntityType[] = [];\n public FromLabelId = '';\n public ToLabelId = '';\n public DiffMode: 'label-to-label' | 'label-to-current' = 'label-to-current';\n\n // Diff results\n public EntityGroups: EntityGroupView[] = [];\n public FilteredEntityGroups: EntityGroupView[] = [];\n public TotalAdded = 0;\n public TotalRemoved = 0;\n public TotalModified = 0;\n public TotalUnchanged = 0;\n\n // Diff result filtering/sorting\n public DiffSortBy: 'name' | 'count' = 'count';\n public DiffSortDir: 'asc' | 'desc' = 'desc';\n public DiffFilterType: 'all' | 'added' | 'removed' | 'modified' = 'all';\n public DiffSearch = '';\n\n // UI state\n public ExpandedEntities = new Set<string>();\n\n private static readonly PREFS_KEY = 'VersionHistory.Diff.UserPreferences';\n private preferencesLoaded = false;\n private destroy$ = new Subject<void>();\n private metadata = new Metadata();\n\n constructor(private cdr: ChangeDetectorRef, private navigationService: NavigationService) {\n super();\n }\n\n ngOnInit(): void {\n this.loadUserPreferences();\n this.LoadLabels();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n async GetResourceDisplayName(data: ResourceData): Promise<string> {\n return 'Diff Viewer';\n }\n\n async GetResourceIconClass(data: ResourceData): Promise<string> {\n return 'fa-solid fa-code-compare';\n }\n\n public async LoadLabels(): Promise<void> {\n try {\n this.IsLoading = true;\n this.cdr.markForCheck();\n\n const rv = new RunView();\n const result = await rv.RunView<MJVersionLabelEntityType>({\n EntityName: 'MJ: Version Labels',\n ExtraFilter: \"Status = 'Active'\",\n OrderBy: '__mj_CreatedAt DESC',\n MaxRows: 200,\n ResultType: 'simple'\n });\n\n if (result.Success) {\n this.AvailableLabels = result.Results;\n }\n } catch (error) {\n console.error('Error loading labels for diff:', error);\n } finally {\n this.IsLoading = false;\n this.NotifyLoadComplete();\n this.cdr.markForCheck();\n }\n }\n\n public OnDiffModeChange(mode: 'label-to-label' | 'label-to-current'): void {\n this.DiffMode = mode;\n this.HasDiffResult = false;\n this.EntityGroups = [];\n this.cdr.markForCheck();\n this.persistPreferences();\n }\n\n private loadUserPreferences(): void {\n try {\n const raw = UserInfoEngine.Instance.GetSetting(VersionHistoryDiffResourceComponent.PREFS_KEY);\n if (raw) {\n const prefs: VersionDiffPreferences = JSON.parse(raw);\n if (prefs.DiffMode === 'label-to-label' || prefs.DiffMode === 'label-to-current') {\n this.DiffMode = prefs.DiffMode;\n }\n }\n } catch (error) {\n console.error('Error loading diff preferences:', error);\n this.DiffMode = 'label-to-current';\n }\n this.preferencesLoaded = true;\n }\n\n private persistPreferences(): void {\n if (!this.preferencesLoaded) return;\n const prefs: VersionDiffPreferences = {\n DiffMode: this.DiffMode\n };\n UserInfoEngine.Instance.SetSettingDebounced(VersionHistoryDiffResourceComponent.PREFS_KEY, JSON.stringify(prefs));\n }\n\n public async RunDiff(): Promise<void> {\n if (!this.FromLabelId) return;\n if (this.DiffMode === 'label-to-label' && !this.ToLabelId) return;\n\n try {\n this.IsDiffLoading = true;\n this.HasDiffResult = false;\n this.cdr.markForCheck();\n\n // Load label items for comparison\n const rv = new RunView();\n const fromItems = await this.loadLabelItems(rv, this.FromLabelId);\n\n if (this.DiffMode === 'label-to-label') {\n const toItems = await this.loadLabelItems(rv, this.ToLabelId);\n this.computeDiff(fromItems, toItems);\n } else {\n // Label-to-current: compare label state against live data\n await this.computeDiffToCurrentState(rv, fromItems);\n }\n\n this.HasDiffResult = true;\n } catch (error) {\n console.error('Error running diff:', error);\n } finally {\n this.IsDiffLoading = false;\n this.cdr.markForCheck();\n }\n }\n\n private async loadLabelItems(\n rv: RunView,\n labelId: string\n ): Promise<MJVersionLabelItemEntityType[]> {\n const result = await rv.RunView<MJVersionLabelItemEntityType>({\n EntityName: 'MJ: Version Label Items',\n ExtraFilter: `VersionLabelID = '${labelId}'`,\n ResultType: 'simple'\n });\n return result.Success ? result.Results : [];\n }\n\n private computeDiff(\n fromItems: MJVersionLabelItemEntityType[],\n toItems: MJVersionLabelItemEntityType[]\n ): void {\n const entityMap = new Map<string, DiffItemView[]>();\n\n // Build lookup maps keyed by EntityID + RecordID\n const fromMap = this.buildItemKeyMap(fromItems);\n const toMap = this.buildItemKeyMap(toItems);\n\n // Items in 'to' but not in 'from' = Added\n for (const [key, item] of toMap) {\n const entityName = this.resolveEntityName(item.EntityID ?? '');\n if (!entityMap.has(entityName)) entityMap.set(entityName, []);\n\n if (!fromMap.has(key)) {\n entityMap.get(entityName)!.push({\n EntityName: entityName,\n EntityID: item.EntityID ?? '',\n RecordID: item.RecordID ?? '',\n DisplayName: '',\n ChangeType: 'Added',\n FieldChanges: [],\n IsExpanded: false,\n IsLoadingFields: false,\n FieldsLoaded: false,\n FromRecordChangeID: '',\n ToRecordChangeID: item.RecordChangeID ?? ''\n });\n }\n }\n\n // Items in 'from' but not in 'to' = Removed\n for (const [key, item] of fromMap) {\n const entityName = this.resolveEntityName(item.EntityID ?? '');\n if (!entityMap.has(entityName)) entityMap.set(entityName, []);\n\n if (!toMap.has(key)) {\n entityMap.get(entityName)!.push({\n EntityName: entityName,\n EntityID: item.EntityID ?? '',\n RecordID: item.RecordID ?? '',\n DisplayName: '',\n ChangeType: 'Removed',\n FieldChanges: [],\n IsExpanded: false,\n IsLoadingFields: false,\n FieldsLoaded: false,\n FromRecordChangeID: item.RecordChangeID ?? '',\n ToRecordChangeID: ''\n });\n } else {\n // Both exist - check if RecordChangeID differs (= Modified)\n const toItem = toMap.get(key)!;\n const changeType = !UUIDsEqual(item.RecordChangeID, toItem.RecordChangeID)\n ? 'Modified' : 'Unchanged';\n entityMap.get(entityName)!.push({\n EntityName: entityName,\n EntityID: item.EntityID ?? '',\n RecordID: item.RecordID ?? '',\n DisplayName: '',\n ChangeType: changeType,\n FieldChanges: [],\n IsExpanded: false,\n IsLoadingFields: false,\n FieldsLoaded: false,\n FromRecordChangeID: item.RecordChangeID ?? '',\n ToRecordChangeID: toItem.RecordChangeID ?? ''\n });\n }\n }\n\n this.buildEntityGroups(entityMap);\n }\n\n private async computeDiffToCurrentState(\n rv: RunView,\n labelItems: MJVersionLabelItemEntityType[]\n ): Promise<void> {\n // For label-to-current, compare snapshot RecordChangeIDs against\n // the latest RecordChange for each entity/record combination.\n const entityMap = new Map<string, DiffItemView[]>();\n\n for (const item of labelItems) {\n const entityId = item.EntityID ?? '';\n const entityName = this.resolveEntityName(entityId);\n if (!entityMap.has(entityName)) entityMap.set(entityName, []);\n\n // Load the latest RecordChange for this record\n const latestChangeId = await this.loadLatestRecordChange(rv, entityId, item.RecordID ?? '');\n const isModified = latestChangeId != null && latestChangeId !== item.RecordChangeID;\n\n entityMap.get(entityName)!.push({\n EntityName: entityName,\n EntityID: entityId,\n RecordID: item.RecordID ?? '',\n DisplayName: '',\n ChangeType: isModified ? 'Modified' : 'Unchanged',\n FieldChanges: [],\n IsExpanded: false,\n IsLoadingFields: false,\n FieldsLoaded: false,\n FromRecordChangeID: item.RecordChangeID ?? '',\n ToRecordChangeID: latestChangeId ?? ''\n });\n }\n\n this.buildEntityGroups(entityMap);\n }\n\n private buildItemKeyMap(\n items: MJVersionLabelItemEntityType[]\n ): Map<string, MJVersionLabelItemEntityType> {\n const map = new Map<string, MJVersionLabelItemEntityType>();\n for (const item of items) {\n const key = `${item.EntityID ?? ''}|${item.RecordID ?? ''}`;\n map.set(key, item);\n }\n return map;\n }\n\n private buildEntityGroups(entityMap: Map<string, DiffItemView[]>): void {\n this.TotalAdded = 0;\n this.TotalRemoved = 0;\n this.TotalModified = 0;\n this.TotalUnchanged = 0;\n\n this.EntityGroups = Array.from(entityMap.entries()).map(([entityName, items]) => {\n const added = items.filter(i => i.ChangeType === 'Added').length;\n const removed = items.filter(i => i.ChangeType === 'Removed').length;\n const modified = items.filter(i => i.ChangeType === 'Modified').length;\n\n this.TotalAdded += added;\n this.TotalRemoved += removed;\n this.TotalModified += modified;\n this.TotalUnchanged += items.filter(i => i.ChangeType === 'Unchanged').length;\n\n // Resolve entity icon from first item's EntityID\n const firstItem = items[0];\n const entityIcon = this.resolveEntityIcon(firstItem?.EntityID ?? '');\n\n return {\n EntityName: entityName,\n EntityIcon: entityIcon,\n Items: items.filter(i => i.ChangeType !== 'Unchanged'),\n AddedCount: added,\n RemovedCount: removed,\n ModifiedCount: modified,\n IsExpanded: false,\n NamesLoaded: false,\n IsLoadingNames: false\n };\n }).filter(g => g.Items.length > 0)\n .sort((a, b) => b.Items.length - a.Items.length);\n\n this.ExpandedEntities.clear();\n this.applySortAndFilterDiff();\n }\n\n private resolveEntityName(entityId: string): 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 private 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 // =========================================================================\n // Expand / Collapse\n // =========================================================================\n\n public ToggleEntityGroup(group: EntityGroupView): void {\n group.IsExpanded = !group.IsExpanded;\n if (group.IsExpanded) {\n this.ExpandedEntities.add(group.EntityName);\n // Auto-expand all Modified items so field details show immediately\n for (const item of group.Items) {\n if (item.ChangeType === 'Modified') {\n item.IsExpanded = true;\n }\n }\n // Auto-load field changes for modified items when group opens\n this.loadFieldChangesForGroup(group);\n // Load record display names\n if (!group.NamesLoaded && !group.IsLoadingNames) {\n this.loadGroupRecordNames(group);\n }\n } else {\n this.ExpandedEntities.delete(group.EntityName);\n }\n this.cdr.markForCheck();\n }\n\n public ToggleItem(item: DiffItemView): void {\n if (item.ChangeType !== 'Modified') return;\n item.IsExpanded = !item.IsExpanded;\n if (item.IsExpanded && !item.FieldsLoaded) {\n this.loadFieldChangesForItem(item);\n }\n this.cdr.markForCheck();\n }\n\n public ExpandAllGroups(): void {\n for (const group of this.FilteredEntityGroups) {\n group.IsExpanded = true;\n this.ExpandedEntities.add(group.EntityName);\n this.loadFieldChangesForGroup(group);\n for (const item of group.Items) {\n if (item.ChangeType === 'Modified') {\n item.IsExpanded = true;\n }\n }\n if (!group.NamesLoaded && !group.IsLoadingNames) {\n this.loadGroupRecordNames(group);\n }\n }\n this.cdr.markForCheck();\n }\n\n public CollapseAllGroups(): void {\n for (const group of this.FilteredEntityGroups) {\n group.IsExpanded = false;\n this.ExpandedEntities.delete(group.EntityName);\n for (const item of group.Items) {\n item.IsExpanded = false;\n }\n }\n this.cdr.markForCheck();\n }\n\n public IsEntityExpanded(entityName: string): boolean {\n return this.ExpandedEntities.has(entityName);\n }\n\n /** Open a record in the explorer via NavigationService. */\n public OnOpenRecord(item: DiffItemView): void {\n const rawId = this.extractRawRecordId(item.RecordID);\n const pkey = new CompositeKey([{ FieldName: 'ID', Value: rawId }]);\n this.navigationService.OpenEntityRecord(item.EntityName, pkey);\n }\n\n // =========================================================================\n // Record name resolution\n // =========================================================================\n\n /** Lazy-load record display names for a group using Metadata.GetEntityRecordNames. */\n private async loadGroupRecordNames(group: EntityGroupView): Promise<void> {\n group.IsLoadingNames = true;\n this.cdr.markForCheck();\n\n try {\n const inputs: EntityRecordNameInput[] = group.Items.map(item => {\n const rawId = this.extractRawRecordId(item.RecordID);\n const input = new EntityRecordNameInput();\n input.EntityName = group.EntityName;\n input.CompositeKey = new CompositeKey([{ FieldName: 'ID', Value: rawId }]);\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 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 group.IsLoadingNames = false;\n group.NamesLoaded = true;\n this.cdr.markForCheck();\n }\n }\n\n /** Extract the raw UUID from a RecordID that may be in \"ID|<uuid>\" format. */\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 // =========================================================================\n // Field-level diff loading\n // =========================================================================\n\n /** Auto-load field changes for all modified items in a group (when first expanded). */\n private loadFieldChangesForGroup(group: EntityGroupView): void {\n for (const item of group.Items) {\n if (item.ChangeType === 'Modified' && !item.FieldsLoaded && !item.IsLoadingFields) {\n this.loadFieldChangesForItem(item);\n }\n }\n }\n\n /** Lazy-load field-level changes for a single modified item. */\n private async loadFieldChangesForItem(item: DiffItemView): Promise<void> {\n if (!item.FromRecordChangeID || !item.ToRecordChangeID) {\n item.FieldsLoaded = true;\n return;\n }\n\n item.IsLoadingFields = true;\n this.cdr.markForCheck();\n\n try {\n item.FieldChanges = await this.computeFieldChanges(item.FromRecordChangeID, item.ToRecordChangeID);\n } catch (e) {\n console.error('Error loading field changes:', e);\n } finally {\n item.IsLoadingFields = false;\n item.FieldsLoaded = true;\n this.cdr.markForCheck();\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(oldChangeId: string, newChangeId: string): Promise<FieldChangeView[]> {\n if (!oldChangeId || !newChangeId) return [];\n\n try {\n const rv = new RunView();\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 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 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 // =========================================================================\n // Display helpers\n // =========================================================================\n\n public GetChangeTypeClass(changeType: string): string {\n const classes: Record<string, string> = {\n 'Added': 'change-added',\n 'Removed': 'change-removed',\n 'Modified': 'change-modified',\n 'Unchanged': 'change-unchanged'\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',\n 'Removed': 'fa-solid fa-minus',\n 'Modified': 'fa-solid fa-pen',\n 'Unchanged': 'fa-solid fa-equals'\n };\n return icons[changeType] ?? 'fa-solid fa-circle';\n }\n\n public FormatRecordID(recordId: string): string {\n return this.extractRawRecordId(recordId);\n }\n\n public FormatLabelOption(label: MJVersionLabelEntityType): string {\n const dateVal = label.__mj_CreatedAt;\n const date = dateVal instanceof Date\n ? dateVal.toLocaleDateString('en-US', { month: 'short', day: 'numeric' })\n : new Date(dateVal as unknown as string).toLocaleDateString('en-US', { month: 'short', day: 'numeric' });\n return `${label.Name} (${label.Scope}, ${date})`;\n }\n\n public Refresh(): void {\n this.LoadLabels();\n }\n\n public get CanRunDiff(): boolean {\n if (!this.FromLabelId) return false;\n if (this.DiffMode === 'label-to-label' && !this.ToLabelId) return false;\n return true;\n }\n\n public get TotalChanges(): number {\n return this.TotalAdded + this.TotalRemoved + this.TotalModified;\n }\n\n // =========================================================================\n // Label selection helpers\n // =========================================================================\n\n /** From dropdown excludes the currently selected To label. */\n public get FilteredFromLabels(): MJVersionLabelEntityType[] {\n if (!this.ToLabelId) return this.AvailableLabels;\n return this.AvailableLabels.filter(l => !UUIDsEqual(l.ID, this.ToLabelId));\n }\n\n /** To dropdown excludes the currently selected From label. */\n public get FilteredToLabels(): MJVersionLabelEntityType[] {\n if (!this.FromLabelId) return this.AvailableLabels;\n return this.AvailableLabels.filter(l => !UUIDsEqual(l.ID, this.FromLabelId));\n }\n\n /** Swap From and To label selections. */\n public SwapLabels(): void {\n const temp = this.FromLabelId;\n this.FromLabelId = this.ToLabelId;\n this.ToLabelId = temp;\n this.cdr.markForCheck();\n }\n\n // =========================================================================\n // Diff result sorting & filtering\n // =========================================================================\n\n public OnDiffSortChange(sortBy: 'name' | 'count'): void {\n if (this.DiffSortBy === sortBy) {\n this.DiffSortDir = this.DiffSortDir === 'asc' ? 'desc' : 'asc';\n } else {\n this.DiffSortBy = sortBy;\n this.DiffSortDir = sortBy === 'name' ? 'asc' : 'desc';\n }\n this.applySortAndFilterDiff();\n this.cdr.markForCheck();\n }\n\n public OnDiffFilterChange(filterType: 'all' | 'added' | 'removed' | 'modified'): void {\n this.DiffFilterType = filterType;\n this.applySortAndFilterDiff();\n this.cdr.markForCheck();\n }\n\n public OnDiffSearchChange(text: string): void {\n this.DiffSearch = text;\n this.applySortAndFilterDiff();\n this.cdr.markForCheck();\n }\n\n private applySortAndFilterDiff(): void {\n let groups = [...this.EntityGroups];\n\n // Filter by change type\n if (this.DiffFilterType !== 'all') {\n groups = groups.map(g => ({\n ...g,\n Items: g.Items.filter(i => i.ChangeType.toLowerCase() === this.DiffFilterType)\n })).filter(g => g.Items.length > 0);\n }\n\n // Filter by search text\n if (this.DiffSearch) {\n const search = this.DiffSearch.toLowerCase();\n groups = groups\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 .filter(g => g.Items.length > 0);\n }\n\n // Sort\n groups.sort((a, b) => {\n if (this.DiffSortBy === 'name') {\n const cmp = a.EntityName.localeCompare(b.EntityName);\n return this.DiffSortDir === 'asc' ? cmp : -cmp;\n }\n const cmp = a.Items.length - b.Items.length;\n return this.DiffSortDir === 'asc' ? cmp : -cmp;\n });\n\n this.FilteredEntityGroups = groups;\n }\n}\n","<div class=\"diff-container\">\n @if (IsLoading) {\n <mj-loading text=\"Loading diff viewer...\"></mj-loading>\n }\n\n @if (!IsLoading) {\n <!-- Header -->\n <div class=\"page-header\">\n <div class=\"header-left\">\n <h2 class=\"page-title\">Diff Viewer</h2>\n <p class=\"page-subtitle\">Compare states between version labels or against current data</p>\n </div>\n </div>\n <!-- Diff Configuration Panel -->\n <div class=\"config-panel\">\n <!-- Mode Selector -->\n <div class=\"mode-selector\">\n <button class=\"mode-btn\"\n [class.active]=\"DiffMode === 'label-to-current'\"\n (click)=\"OnDiffModeChange('label-to-current')\">\n <i class=\"fa-solid fa-clock-rotate-left\"></i>\n Label vs Current\n </button>\n <button class=\"mode-btn\"\n [class.active]=\"DiffMode === 'label-to-label'\"\n (click)=\"OnDiffModeChange('label-to-label')\">\n <i class=\"fa-solid fa-code-compare\"></i>\n Label vs Label\n </button>\n </div>\n <!-- Label Selectors -->\n <div class=\"label-selectors\">\n <div class=\"selector-group\">\n <label class=\"selector-label\">\n {{DiffMode === 'label-to-current' ? 'Compare label' : 'From label'}}\n </label>\n <select class=\"selector-input\"\n [(ngModel)]=\"FromLabelId\">\n <option value=\"\">Select a label...</option>\n @for (label of FilteredFromLabels; track label) {\n <option\n [value]=\"label.ID\">\n {{FormatLabelOption(label)}}\n </option>\n }\n </select>\n </div>\n @if (DiffMode === 'label-to-label') {\n <div class=\"selector-arrow\">\n <button class=\"swap-btn\" (click)=\"SwapLabels()\" title=\"Swap direction\">\n <i class=\"fa-solid fa-arrows-rotate\"></i>\n </button>\n </div>\n }\n @if (DiffMode === 'label-to-current') {\n <div class=\"selector-arrow\">\n <i class=\"fa-solid fa-arrow-right\"></i>\n <span class=\"current-state-badge\">Current State</span>\n </div>\n }\n @if (DiffMode === 'label-to-label') {\n <div class=\"selector-group\">\n <label class=\"selector-label\">To label</label>\n <select class=\"selector-input\"\n [(ngModel)]=\"ToLabelId\">\n <option value=\"\">Select a label...</option>\n @for (label of FilteredToLabels; track label) {\n <option\n [value]=\"label.ID\">\n {{FormatLabelOption(label)}}\n </option>\n }\n </select>\n </div>\n }\n </div>\n <!-- Run Button -->\n <button class=\"btn-primary\"\n [disabled]=\"!CanRunDiff || IsDiffLoading\"\n (click)=\"RunDiff()\">\n @if (!IsDiffLoading) {\n <i class=\"fa-solid fa-play\"></i>\n }\n @if (IsDiffLoading) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n }\n <span>{{IsDiffLoading ? 'Comparing...' : 'Compare'}}</span>\n </button>\n </div>\n <!-- Diff Results -->\n @if (HasDiffResult) {\n <!-- Summary Stats -->\n <div class=\"diff-summary\">\n <div class=\"diff-stat change-added\">\n <i class=\"fa-solid fa-plus\"></i>\n <span class=\"diff-stat-value\">{{TotalAdded}}</span>\n <span class=\"diff-stat-label\">Added</span>\n </div>\n <div class=\"diff-stat change-removed\">\n <i class=\"fa-solid fa-minus\"></i>\n <span class=\"diff-stat-value\">{{TotalRemoved}}</span>\n <span class=\"diff-stat-label\">Removed</span>\n </div>\n <div class=\"diff-stat change-modified\">\n <i class=\"fa-solid fa-pen\"></i>\n <span class=\"diff-stat-value\">{{TotalModified}}</span>\n <span class=\"diff-stat-label\">Modified</span>\n </div>\n <div class=\"diff-stat change-unchanged\">\n <i class=\"fa-solid fa-equals\"></i>\n <span class=\"diff-stat-value\">{{TotalUnchanged}}</span>\n <span class=\"diff-stat-label\">Unchanged</span>\n </div>\n </div>\n <!-- Results toolbar -->\n @if (EntityGroups.length > 0) {\n <div class=\"diff-toolbar\">\n <div class=\"diff-search\">\n <i class=\"fa-solid fa-search diff-search-icon\"></i>\n <input type=\"text\" class=\"diff-search-input\"\n placeholder=\"Search by entity or record...\"\n [ngModel]=\"DiffSearch\"\n (ngModelChange)=\"OnDiffSearchChange($event)\" />\n </div>\n <div class=\"diff-filter-pills\">\n <button class=\"filter-pill\" [class.active]=\"DiffFilterType === 'all'\"\n (click)=\"OnDiffFilterChange('all')\">All</button>\n <button class=\"filter-pill change-added\" [class.active]=\"DiffFilterType === 'added'\"\n (click)=\"OnDiffFilterChange('added')\">Added</button>\n <button class=\"filter-pill change-removed\" [class.active]=\"DiffFilterType === 'removed'\"\n (click)=\"OnDiffFilterChange('removed')\">Removed</button>\n <button class=\"filter-pill change-modified\" [class.active]=\"DiffFilterType === 'modified'\"\n (click)=\"OnDiffFilterChange('modified')\">Modified</button>\n </div>\n <div class=\"diff-toolbar-right\">\n <button class=\"toolbar-action-btn\" (click)=\"ExpandAllGroups()\" title=\"Expand all\">\n <i class=\"fa-solid fa-angles-down\"></i>\n </button>\n <button class=\"toolbar-action-btn\" (click)=\"CollapseAllGroups()\" title=\"Collapse all\">\n <i class=\"fa-solid fa-angles-up\"></i>\n </button>\n <div class=\"diff-sort-toggle\">\n <button class=\"toggle-btn-sm\" [class.active]=\"DiffSortBy === 'name'\"\n (click)=\"OnDiffSortChange('name')\" title=\"Sort by name\">\n <i class=\"fa-solid\" [ngClass]=\"DiffSortBy === 'name' && DiffSortDir === 'desc' ? 'fa-arrow-up-z-a' : 'fa-arrow-down-a-z'\"></i>\n </button>\n <button class=\"toggle-btn-sm\" [class.active]=\"DiffSortBy === 'count'\"\n (click)=\"OnDiffSortChange('count')\" title=\"Sort by count\">\n <i class=\"fa-solid\" [ngClass]=\"DiffSortBy === 'count' && DiffSortDir === 'asc' ? 'fa-arrow-up-1-9' : 'fa-arrow-down-9-1'\"></i>\n </button>\n </div>\n </div>\n </div>\n }\n <!-- Entity Groups -->\n @if (FilteredEntityGroups.length > 0) {\n <div class=\"entity-groups\">\n @for (group of FilteredEntityGroups; track group) {\n <div class=\"entity-group\">\n <div class=\"entity-group-header\" (click)=\"ToggleEntityGroup(group)\">\n <div class=\"entity-group-left\">\n <i class=\"fa-solid fa-chevron-right entity-chevron\"\n [class.expanded]=\"group.IsExpanded\">\n </i>\n <i [class]=\"group.EntityIcon\" class=\"entity-icon\"></i>\n <span class=\"entity-group-name\">{{group.EntityName}}</span>\n </div>\n <div class=\"entity-group-badges\">\n @if (group.AddedCount > 0) {\n <span class=\"badge change-added\">\n +{{group.AddedCount}}\n </span>\n }\n @if (group.RemovedCount > 0) {\n <span class=\"badge change-removed\">\n -{{group.RemovedCount}}\n </span>\n }\n @if (group.ModifiedCount > 0) {\n <span class=\"badge change-modified\">\n ~{{group.ModifiedCount}}\n </span>\n }\n </div>\n </div>\n @if (group.IsExpanded) {\n <div class=\"entity-group-items\">\n @for (item of group.Items; track item) {\n <div class=\"diff-item-wrapper\">\n <div class=\"diff-item\" [ngClass]=\"GetChangeTypeClass(item.ChangeType)\"\n [class.clickable]=\"item.ChangeType === 'Modified'\"\n (click)=\"ToggleItem(item)\">\n <i [class]=\"GetChangeTypeIcon(item.ChangeType)\" class=\"diff-item-icon\"></i>\n <span class=\"diff-item-record\">\n {{FormatRecordID(item.RecordID)}}\n @if (item.DisplayName) {\n <span class=\"diff-item-display-name\"> ({{item.DisplayName}})</span>\n }\n </span>\n <span class=\"diff-item-type\">{{item.ChangeType}}</span>\n <button class=\"diff-item-open-btn\" (click)=\"OnOpenRecord(item); $event.stopPropagation()\"\n title=\"Open record\">\n <i class=\"fa-solid fa-arrow-up-right-from-square\"></i>\n </button>\n @if (item.ChangeType === 'Modified') {\n <i class=\"fa-solid fa-chevron-right diff-item-chevron\"\n [class.expanded]=\"item.IsExpanded\"\n ></i>\n }\n </div>\n <!-- Field-level changes -->\n @if (item.IsExpanded && item.ChangeType === 'Modified') {\n <div class=\"diff-fields\">\n @if (item.IsLoadingFields) {\n <mj-loading text=\"Loading changes...\" size=\"small\"></mj-loading>\n }\n @if (!item.IsLoadingFields && item.FieldChanges.length > 0) {\n @for (field of item.FieldChanges; track field) {\n <div class=\"diff-field\"\n [ngClass]=\"GetChangeTypeClass(field.ChangeType)\">\n <span class=\"diff-field-name\">{{field.FieldName}}</span>\n <span class=\"diff-field-values\">\n @if (field.OldValue) {\n <span class=\"diff-field-old\">{{field.OldValue | slice:0:60}}</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:60}}</span>\n }\n </span>\n </div>\n }\n }\n @if (!item.IsLoadingFields && item.FieldsLoaded && item.FieldChanges.length === 0) {\n <div class=\"diff-fields-empty\">\n <span>No field-level changes available</span>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n <!-- No changes -->\n @if (FilteredEntityGroups.length === 0 && TotalChanges === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-check-circle empty-icon\" style=\"color: #10b981;\"></i>\n <h3>No differences found</h3>\n <p>The compared states are identical.</p>\n </div>\n }\n }\n <!-- No results yet -->\n @if (!HasDiffResult && !IsDiffLoading) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-code-compare empty-icon\"></i>\n <h3>Select labels to compare</h3>\n <p>Choose a diff mode and select labels above, then click Compare.</p>\n </div>\n }\n }\n</div>\n"]}
@@ -7,7 +7,7 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
7
7
  var VersionHistoryGraphResourceComponent_1;
8
8
  import { Component, ChangeDetectionStrategy } from '@angular/core';
9
9
  import { Subject } from 'rxjs';
10
- import { RegisterClass } from '@memberjunction/global';
10
+ import { RegisterClass, UUIDsEqual } from '@memberjunction/global';
11
11
  import { BaseResourceComponent } from '@memberjunction/ng-shared';
12
12
  import { Metadata } from '@memberjunction/core';
13
13
  import { UserInfoEngine } from '@memberjunction/core-entities';
@@ -427,7 +427,7 @@ let VersionHistoryGraphResourceComponent = class VersionHistoryGraphResourceComp
427
427
  }
428
428
  entityNode.IsSelected = true;
429
429
  this.SelectedEntity = entityNode;
430
- const entityInfo = this.metadata.Entities.find(e => e.ID === entityNode.ID);
430
+ const entityInfo = this.metadata.Entities.find(e => UUIDsEqual(e.ID, entityNode.ID));
431
431
  this.SelectedEntityInfo = entityInfo ?? null;
432
432
  if (entityInfo) {
433
433
  this.ReferencedByEntities = this.buildReferencedByList(entityInfo);
@@ -1 +1 @@
1
- {"version":3,"file":"graph-resource.component.js","sourceRoot":"","sources":["../../../src/VersionHistory/components/graph-resource.component.ts","../../../src/VersionHistory/components/graph-resource.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, ChangeDetectorRef, ChangeDetectionStrategy } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { RegisterClass } from '@memberjunction/global';\nimport { BaseResourceComponent } from '@memberjunction/ng-shared';\nimport { Metadata, EntityInfo } from '@memberjunction/core';\nimport { ResourceData, UserInfoEngine } from '@memberjunction/core-entities';\n\ninterface VersionGraphPreferences {\n SchemaFilter: string;\n}\ninterface EntityNode {\n Name: string;\n ID: string;\n SchemaName: string;\n ReferencedByCount: number;\n DependsOnCount: number;\n IsSelected: boolean;\n}\n\ninterface RelationshipEdge {\n FromEntity: string;\n ToEntity: string;\n RelatedEntityJoinField: string;\n Type: string;\n}\n\n@RegisterClass(BaseResourceComponent, 'VersionHistoryGraphResource')\n@Component({\n standalone: false,\n selector: 'mj-version-history-graph-resource',\n templateUrl: './graph-resource.component.html',\n styleUrls: ['./graph-resource.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class VersionHistoryGraphResourceComponent extends BaseResourceComponent implements OnInit, OnDestroy {\n public IsLoading = true;\n\n // Entity browser\n public AllEntities: EntityNode[] = [];\n public FilteredEntities: EntityNode[] = [];\n public SearchText = '';\n public SchemaFilter = '';\n public AvailableSchemas: string[] = [];\n\n // Selected entity detail\n public SelectedEntity: EntityNode | null = null;\n public SelectedEntityInfo: EntityInfo | null = null;\n public ReferencedByEntities: RelationshipEdge[] = [];\n public DependsOnEntities: RelationshipEdge[] = [];\n\n // Stats\n public TotalEntities = 0;\n public EntitiesWithDependents = 0;\n public TotalRelationships = 0;\n\n private static readonly PREFS_KEY = 'VersionHistory.Graph.UserPreferences';\n private preferencesLoaded = false;\n private metadata = new Metadata();\n private destroy$ = new Subject<void>();\n\n constructor(private cdr: ChangeDetectorRef) {\n super();\n }\n\n ngOnInit(): void {\n this.loadUserPreferences();\n this.LoadData();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n async GetResourceDisplayName(data: ResourceData): Promise<string> {\n return 'Dependency Graph';\n }\n\n async GetResourceIconClass(data: ResourceData): Promise<string> {\n return 'fa-solid fa-diagram-project';\n }\n\n public LoadData(): void {\n try {\n this.IsLoading = true;\n this.cdr.markForCheck();\n\n const entities = this.metadata.Entities;\n\n this.AllEntities = entities.map(e => ({\n Name: e.Name,\n ID: e.ID,\n SchemaName: e.SchemaName,\n ReferencedByCount: this.countReferencedBy(e),\n DependsOnCount: this.countDependsOn(e),\n IsSelected: false\n })).sort((a, b) => a.Name.localeCompare(b.Name));\n\n // Extract unique schemas, sorted\n const schemaSet = new Set(this.AllEntities.map(e => e.SchemaName));\n this.AvailableSchemas = Array.from(schemaSet).sort();\n\n this.TotalEntities = this.AllEntities.length;\n this.EntitiesWithDependents = this.AllEntities.filter(e => e.ReferencedByCount > 0).length;\n this.TotalRelationships = this.AllEntities.reduce((sum, e) => sum + e.ReferencedByCount, 0);\n\n this.applyFilter();\n } catch (error) {\n console.error('Error loading dependency graph data:', error);\n } finally {\n this.IsLoading = false;\n this.NotifyLoadComplete();\n this.cdr.markForCheck();\n }\n }\n\n /** Count entities that reference this entity (have FKs pointing to it), excluding self-references */\n private countReferencedBy(entity: EntityInfo): number {\n return entity.RelatedEntities.filter(r =>\n r.Type.trim().toUpperCase() === 'ONE TO MANY' &&\n r.RelatedEntity !== entity.Name\n ).length;\n }\n\n /** Count entities this entity depends on (has FKs pointing to), excluding self-references */\n private countDependsOn(entity: EntityInfo): number {\n return this.metadata.Entities.filter(e =>\n e.Name !== entity.Name &&\n e.RelatedEntities.some(r =>\n r.Type.trim().toUpperCase() === 'ONE TO MANY' &&\n r.RelatedEntity === entity.Name\n )\n ).length;\n }\n\n public OnSearchChange(text: string): void {\n this.SearchText = text;\n this.applyFilter();\n }\n\n public OnSchemaFilterChange(schema: string): void {\n this.SchemaFilter = this.SchemaFilter === schema ? '' : schema;\n this.applyFilter();\n this.persistPreferences();\n }\n\n private loadUserPreferences(): void {\n try {\n const raw = UserInfoEngine.Instance.GetSetting(VersionHistoryGraphResourceComponent.PREFS_KEY);\n if (raw) {\n const prefs: VersionGraphPreferences = JSON.parse(raw);\n if (prefs.SchemaFilter != null) {\n this.SchemaFilter = prefs.SchemaFilter;\n }\n }\n } catch (error) {\n console.error('Error loading graph preferences:', error);\n this.SchemaFilter = '';\n }\n this.preferencesLoaded = true;\n }\n\n private persistPreferences(): void {\n if (!this.preferencesLoaded) return;\n const prefs: VersionGraphPreferences = {\n SchemaFilter: this.SchemaFilter\n };\n UserInfoEngine.Instance.SetSettingDebounced(VersionHistoryGraphResourceComponent.PREFS_KEY, JSON.stringify(prefs));\n }\n\n private applyFilter(): void {\n let result = this.AllEntities;\n\n if (this.SchemaFilter) {\n result = result.filter(e => e.SchemaName === this.SchemaFilter);\n }\n\n if (this.SearchText) {\n const search = this.SearchText.toLowerCase();\n result = result.filter(e => e.Name.toLowerCase().includes(search));\n }\n\n this.FilteredEntities = result;\n this.cdr.markForCheck();\n }\n\n public SelectEntity(entityNode: EntityNode): void {\n if (this.SelectedEntity) {\n this.SelectedEntity.IsSelected = false;\n }\n\n entityNode.IsSelected = true;\n this.SelectedEntity = entityNode;\n\n const entityInfo = this.metadata.Entities.find(e => e.ID === entityNode.ID);\n this.SelectedEntityInfo = entityInfo ?? null;\n\n if (entityInfo) {\n this.ReferencedByEntities = this.buildReferencedByList(entityInfo);\n this.DependsOnEntities = this.buildDependsOnList(entityInfo);\n } else {\n this.ReferencedByEntities = [];\n this.DependsOnEntities = [];\n }\n\n this.cdr.markForCheck();\n }\n\n /** Entities that have FKs pointing TO the selected entity (it is the \"one\" side) */\n private buildReferencedByList(entityInfo: EntityInfo): RelationshipEdge[] {\n return entityInfo.RelatedEntities\n .filter(r =>\n r.Type.trim().toUpperCase() === 'ONE TO MANY' &&\n r.RelatedEntity !== entityInfo.Name\n )\n .map(r => ({\n FromEntity: entityInfo.Name,\n ToEntity: r.RelatedEntity,\n RelatedEntityJoinField: r.RelatedEntityJoinField,\n Type: r.Type\n }))\n .sort((a, b) => a.ToEntity.localeCompare(b.ToEntity));\n }\n\n /** Entities the selected entity has FKs pointing to (it is the \"many\" side) */\n private buildDependsOnList(entityInfo: EntityInfo): RelationshipEdge[] {\n return this.metadata.Entities\n .filter(e =>\n e.Name !== entityInfo.Name &&\n e.RelatedEntities.some(r =>\n r.Type.trim().toUpperCase() === 'ONE TO MANY' &&\n r.RelatedEntity === entityInfo.Name\n )\n )\n .map(e => {\n const rel = e.RelatedEntities.find(r =>\n r.Type.trim().toUpperCase() === 'ONE TO MANY' &&\n r.RelatedEntity === entityInfo.Name\n )!;\n return {\n FromEntity: e.Name,\n ToEntity: entityInfo.Name,\n RelatedEntityJoinField: rel.RelatedEntityJoinField,\n Type: rel.Type\n };\n })\n .sort((a, b) => a.FromEntity.localeCompare(b.FromEntity));\n }\n\n public NavigateToEntity(entityName: string): void {\n const node = this.AllEntities.find(e => e.Name === entityName);\n if (node) {\n // Clear schema filter so the entity is visible\n if (this.SchemaFilter && node.SchemaName !== this.SchemaFilter) {\n this.SchemaFilter = '';\n this.applyFilter();\n }\n this.SelectEntity(node);\n }\n }\n\n public GetDependencyLevel(count: number): string {\n if (count === 0) return 'level-none';\n if (count <= 3) return 'level-low';\n if (count <= 10) return 'level-medium';\n return 'level-high';\n }\n\n public GetSchemaEntityCount(schema: string): number {\n return this.AllEntities.filter(e => e.SchemaName === schema).length;\n }\n\n public Refresh(): void {\n this.LoadData();\n }\n}\n","<div class=\"graph-container\">\n @if (IsLoading) {\n <mj-loading text=\"Loading dependency graph...\"></mj-loading>\n }\n\n @if (!IsLoading) {\n <!-- Header -->\n <div class=\"page-header\">\n <div class=\"header-left\">\n <h2 class=\"page-title\">Entity Dependency Graph</h2>\n <p class=\"page-subtitle\">Explore entity relationships used by the version history system</p>\n </div>\n <div class=\"header-actions\">\n <button class=\"btn-icon\" (click)=\"Refresh()\" title=\"Refresh\">\n <i class=\"fa-solid fa-refresh\"></i>\n </button>\n </div>\n </div>\n <!-- Stats Row -->\n <div class=\"stats-row\">\n <div class=\"stat-badge\">\n <i class=\"fa-solid fa-table\"></i>\n <span>{{TotalEntities}} Entities</span>\n </div>\n <div class=\"stat-badge\">\n <i class=\"fa-solid fa-diagram-project\"></i>\n <span>{{EntitiesWithDependents}} with Dependents</span>\n </div>\n <div class=\"stat-badge\">\n <i class=\"fa-solid fa-arrow-right-arrow-left\"></i>\n <span>{{TotalRelationships}} Relationships</span>\n </div>\n </div>\n <!-- Main Layout: Entity List + Detail -->\n <div class=\"graph-layout\">\n <!-- Entity List -->\n <div class=\"entity-list-panel\">\n <div class=\"panel-header\">\n <h3 class=\"panel-title\">Entities</h3>\n </div>\n <div class=\"search-bar\">\n <i class=\"fa-solid fa-search search-icon\"></i>\n <input type=\"text\"\n class=\"search-input\"\n placeholder=\"Filter entities...\"\n [ngModel]=\"SearchText\"\n (ngModelChange)=\"OnSearchChange($event)\" />\n </div>\n <!-- Schema Filter Chips -->\n @if (AvailableSchemas.length > 1) {\n <div class=\"schema-chips\">\n @for (schema of AvailableSchemas; track schema) {\n <button class=\"schema-chip\"\n [class.active]=\"SchemaFilter === schema\"\n (click)=\"OnSchemaFilterChange(schema)\">\n {{schema}}\n <span class=\"schema-chip-count\">{{GetSchemaEntityCount(schema)}}</span>\n </button>\n }\n </div>\n }\n <div class=\"entity-scroll-list\">\n @for (entity of FilteredEntities; track entity) {\n <div class=\"entity-list-item\"\n [class.selected]=\"entity.IsSelected\"\n (click)=\"SelectEntity(entity)\">\n <div class=\"entity-list-name\">{{entity.Name}}</div>\n <div class=\"entity-list-badges\">\n @if (entity.ReferencedByCount > 0) {\n <span class=\"dep-badge\"\n [ngClass]=\"GetDependencyLevel(entity.ReferencedByCount)\"\n title=\"Referenced by (entities with FKs to this)\">\n {{entity.ReferencedByCount}} <i class=\"fa-solid fa-arrow-down\"></i>\n </span>\n }\n @if (entity.DependsOnCount > 0) {\n <span class=\"dep-badge level-depends-on\"\n title=\"Depends on (entities this has FKs to)\">\n {{entity.DependsOnCount}} <i class=\"fa-solid fa-arrow-up\"></i>\n </span>\n }\n </div>\n </div>\n }\n @if (FilteredEntities.length === 0) {\n <div class=\"empty-list\">\n <p>No entities match your search.</p>\n </div>\n }\n </div>\n </div>\n <!-- Detail Panel -->\n <div class=\"entity-detail-panel\">\n @if (SelectedEntity) {\n <div class=\"detail-header\">\n <i class=\"fa-solid fa-table detail-icon\"></i>\n <div class=\"detail-header-text\">\n <h3 class=\"detail-title\">{{SelectedEntity.Name}}</h3>\n <span class=\"detail-schema\">{{SelectedEntity.SchemaName}}</span>\n </div>\n </div>\n <!-- Referenced By (entities that have FKs pointing to this entity) -->\n <div class=\"relationship-section\">\n <div class=\"section-header\">\n <i class=\"fa-solid fa-arrow-down section-icon referenced-by-icon\"></i>\n <h4>Referenced By</h4>\n <span class=\"section-count\">{{ReferencedByEntities.length}}</span>\n </div>\n <p class=\"section-hint\">Entities that have foreign keys pointing to <strong>{{SelectedEntity.Name}}</strong></p>\n @if (ReferencedByEntities.length > 0) {\n <div class=\"relationship-list\">\n @for (rel of ReferencedByEntities; track rel) {\n <div class=\"relationship-item\">\n <div class=\"rel-main\"\n (click)=\"NavigateToEntity(rel.ToEntity)\">\n <i class=\"fa-solid fa-table rel-icon\"></i>\n <span class=\"rel-entity-name\">{{rel.ToEntity}}</span>\n <span class=\"rel-join-field\">\n <i class=\"fa-solid fa-link\"></i>\n {{rel.RelatedEntityJoinField}}\n </span>\n </div>\n </div>\n }\n </div>\n }\n @if (ReferencedByEntities.length === 0) {\n <div class=\"empty-relationships\">\n <p>No entities reference this entity.</p>\n </div>\n }\n </div>\n <!-- Depends On (entities this entity has FKs to) -->\n <div class=\"relationship-section\">\n <div class=\"section-header\">\n <i class=\"fa-solid fa-arrow-up section-icon depends-on-icon\"></i>\n <h4>Depends On</h4>\n <span class=\"section-count\">{{DependsOnEntities.length}}</span>\n </div>\n <p class=\"section-hint\"><strong>{{SelectedEntity.Name}}</strong> has foreign keys pointing to these entities</p>\n @if (DependsOnEntities.length > 0) {\n <div class=\"relationship-list\">\n @for (rel of DependsOnEntities; track rel) {\n <div class=\"relationship-item\">\n <div class=\"rel-main\"\n (click)=\"NavigateToEntity(rel.FromEntity)\">\n <i class=\"fa-solid fa-table rel-icon\"></i>\n <span class=\"rel-entity-name\">{{rel.FromEntity}}</span>\n <span class=\"rel-join-field\">\n <i class=\"fa-solid fa-link\"></i>\n {{rel.RelatedEntityJoinField}}\n </span>\n </div>\n </div>\n }\n </div>\n }\n @if (DependsOnEntities.length === 0) {\n <div class=\"empty-relationships\">\n <p>This entity has no foreign key dependencies.</p>\n </div>\n }\n </div>\n } @else {\n <div class=\"no-selection\">\n <i class=\"fa-solid fa-diagram-project no-selection-icon\"></i>\n <h3>Select an Entity</h3>\n <p>Choose an entity from the list to explore its dependency relationships.</p>\n </div>\n }\n </div>\n </div>\n }\n</div>\n"]}
1
+ {"version":3,"file":"graph-resource.component.js","sourceRoot":"","sources":["../../../src/VersionHistory/components/graph-resource.component.ts","../../../src/VersionHistory/components/graph-resource.component.html"],"names":[],"mappings":";;;;;;;AAAA,OAAO,EAAE,SAAS,EAAwC,uBAAuB,EAAE,MAAM,eAAe,CAAC;AACzG,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,aAAa,EAAG,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpE,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,QAAQ,EAAc,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAgB,cAAc,EAAE,MAAM,+BAA+B,CAAC;;;;;;ICHzE,gCAA4D;;;;IAkDlD,kCAEyC;IAAvC,0PAAS,sCAA4B,KAAC;IACtC,YACA;IAAA,gCAAgC;IAAA,YAAgC;IAClE,AADkE,iBAAO,EAChE;;;;IAJP,2DAAwC;IAExC,cACA;IADA,0CACA;IAAgC,eAAgC;IAAhC,4DAAgC;;;IANtE,+BAA0B;IACxB,0JAOC;IACH,iBAAM;;;IARJ,cAOC;IAPD,sCAOC;;;IAWK,gCAEoD;IAClD,YAA6B;IAAA,wBAAsC;IACrE,iBAAO;;;;IAHL,gFAAwD;IAExD,cAA6B;IAA7B,4DAA6B;;;IAI/B,gCACgD;IAC9C,YAA0B;IAAA,wBAAoC;IAChE,iBAAO;;;IADL,cAA0B;IAA1B,yDAA0B;;;;IAflC,+BAEiC;IAA/B,yOAAS,8BAAoB,KAAC;IAC9B,+BAA8B;IAAA,YAAe;IAAA,iBAAM;IACnD,+BAAgC;IAC9B,6HAAoC;IAOpC,6HAAiC;IAOrC,AADE,iBAAM,EACF;;;IAlBJ,gDAAoC;IAEN,eAAe;IAAf,oCAAe;IAE3C,eAMC;IAND,0DAMC;IACD,cAKC;IALD,uDAKC;;;IAMH,AADF,+BAAwB,QACnB;IAAA,8CAA8B;IACnC,AADmC,iBAAI,EACjC;;;;IA0BE,AADF,+BAA+B,cAEc;IAAzC,mQAAS,wCAA8B,KAAC;IACxC,wBAA0C;IAC1C,gCAA8B;IAAA,YAAgB;IAAA,iBAAO;IACrD,gCAA6B;IAC3B,wBAAgC;IAChC,YACF;IAEJ,AADE,AADE,iBAAO,EACH,EACF;;;IAN4B,eAAgB;IAAhB,qCAAgB;IAG5C,eACF;IADE,8DACF;;;IAVR,+BAA+B;IAC7B,sKAYC;IACH,iBAAM;;;IAbJ,cAYC;IAZD,0CAYC;;;IAKD,AADF,+BAAiC,QAC5B;IAAA,kDAAkC;IACvC,AADuC,iBAAI,EACrC;;;;IAeA,AADF,+BAA+B,cAEgB;IAA3C,oQAAS,2CAAgC,KAAC;IAC1C,wBAA0C;IAC1C,gCAA8B;IAAA,YAAkB;IAAA,iBAAO;IACvD,gCAA6B;IAC3B,wBAAgC;IAChC,YACF;IAEJ,AADE,AADE,iBAAO,EACH,EACF;;;IAN4B,eAAkB;IAAlB,wCAAkB;IAG9C,eACF;IADE,+DACF;;;IAVR,+BAA+B;IAC7B,sKAYC;IACH,iBAAM;;;IAbJ,cAYC;IAZD,uCAYC;;;IAKD,AADF,+BAAiC,QAC5B;IAAA,4DAA4C;IACjD,AADiD,iBAAI,EAC/C;;;IAlEV,+BAA2B;IACzB,wBAA6C;IAE3C,AADF,+BAAgC,aACL;IAAA,YAAuB;IAAA,iBAAK;IACrD,gCAA4B;IAAA,YAA6B;IAE7D,AADE,AAD2D,iBAAO,EAC5D,EACF;IAGJ,AADF,+BAAkC,cACJ;IAC1B,wBAAsE;IACtE,2BAAI;IAAA,8BAAa;IAAA,iBAAK;IACtB,iCAA4B;IAAA,aAA+B;IAC7D,AAD6D,iBAAO,EAC9D;IACN,8BAAwB;IAAA,6DAA4C;IAAA,+BAAQ;IAAA,aAAuB;IAAS,AAAT,iBAAS,EAAI;IAChH,sIAAuC;IAiBvC,sIAAyC;IAK3C,iBAAM;IAGJ,AADF,gCAAkC,eACJ;IAC1B,yBAAiE;IACjE,2BAAI;IAAA,2BAAU;IAAA,iBAAK;IACnB,iCAA4B;IAAA,aAA4B;IAC1D,AAD0D,iBAAO,EAC3D;IACkB,AAAxB,8BAAwB,cAAQ;IAAA,aAAuB;IAAA,iBAAS;IAAC,6DAA2C;IAAA,iBAAI;IAChH,sIAAoC;IAiBpC,sIAAsC;IAKxC,iBAAM;;;IAjEuB,eAAuB;IAAvB,gDAAuB;IACpB,eAA6B;IAA7B,sDAA6B;IAQ7B,eAA+B;IAA/B,wDAA+B;IAEe,eAAuB;IAAvB,gDAAuB;IACnG,cAgBC;IAhBD,kEAgBC;IACD,cAIC;IAJD,oEAIC;IAO6B,eAA4B;IAA5B,qDAA4B;IAE1B,eAAuB;IAAvB,gDAAuB;IACvD,eAgBC;IAhBD,+DAgBC;IACD,cAIC;IAJD,iEAIC;;;IAGH,+BAA0B;IACxB,wBAA6D;IAC7D,0BAAI;IAAA,gCAAgB;IAAA,iBAAK;IACzB,yBAAG;IAAA,uFAAuE;IAC5E,AAD4E,iBAAI,EAC1E;;;;IA/JR,AADF,AADF,8BAAyB,aACE,YACA;IAAA,uCAAuB;IAAA,iBAAK;IACnD,4BAAyB;IAAA,+EAA+D;IAC1F,AAD0F,iBAAI,EACxF;IAEJ,AADF,8BAA4B,gBACmC;IAApC,wMAAS,gBAAS,KAAC;IAC1C,uBAAmC;IAGzC,AADE,AADE,iBAAS,EACL,EACF;IAGJ,AADF,8BAAuB,eACG;IACtB,yBAAiC;IACjC,6BAAM;IAAA,aAA0B;IAClC,AADkC,iBAAO,EACnC;IACN,gCAAwB;IACtB,yBAA2C;IAC3C,6BAAM;IAAA,aAA0C;IAClD,AADkD,iBAAO,EACnD;IACN,gCAAwB;IACtB,yBAAkD;IAClD,6BAAM;IAAA,aAAoC;IAE9C,AADE,AAD4C,iBAAO,EAC7C,EACF;IAMA,AADF,AADF,AAFF,gCAA0B,eAEO,eACH,cACA;IAAA,yBAAQ;IAClC,AADkC,iBAAK,EACjC;IACN,gCAAwB;IACtB,yBAA8C;IAC9C,kCAI6C;IAA3C,8NAAiB,6BAAsB,KAAC;IAC5C,AALE,iBAI6C,EACzC;IAEN,uHAAmC;IAYnC,gCAAgC;IAC9B,0IAqBC;IACD,uHAAqC;IAMzC,AADE,iBAAM,EACF;IAEN,gCAAiC;IAuE7B,AAtEF,8GAAsB,iGAsEb;IAQb,AADE,iBAAM,EACF;;;IArJI,gBAA0B;IAA1B,4DAA0B;IAI1B,eAA0C;IAA1C,4EAA0C;IAI1C,eAAoC;IAApC,sEAAoC;IAetC,eAAsB;IAAtB,2CAAsB;IAI1B,cAWC;IAXD,8DAWC;IAEC,eAqBC;IArBD,sCAqBC;IACD,eAIC;IAJD,gEAIC;IAKH,eA4EC;IA5ED,iDA4EC;;ADvIF,IAAM,oCAAoC,GAA1C,MAAM,oCAAqC,SAAQ,qBAAqB;;IA0BvD;IAzBb,SAAS,GAAG,IAAI,CAAC;IAExB,iBAAiB;IACV,WAAW,GAAiB,EAAE,CAAC;IAC/B,gBAAgB,GAAiB,EAAE,CAAC;IACpC,UAAU,GAAG,EAAE,CAAC;IAChB,YAAY,GAAG,EAAE,CAAC;IAClB,gBAAgB,GAAa,EAAE,CAAC;IAEvC,yBAAyB;IAClB,cAAc,GAAsB,IAAI,CAAC;IACzC,kBAAkB,GAAsB,IAAI,CAAC;IAC7C,oBAAoB,GAAuB,EAAE,CAAC;IAC9C,iBAAiB,GAAuB,EAAE,CAAC;IAElD,QAAQ;IACD,aAAa,GAAG,CAAC,CAAC;IAClB,sBAAsB,GAAG,CAAC,CAAC;IAC3B,kBAAkB,GAAG,CAAC,CAAC;IAEtB,MAAM,CAAU,SAAS,GAAG,sCAAsC,CAAC;IACnE,iBAAiB,GAAG,KAAK,CAAC;IAC1B,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAC;IAC1B,QAAQ,GAAG,IAAI,OAAO,EAAQ,CAAC;IAEvC,YAAoB,GAAsB;QACtC,KAAK,EAAE,CAAC;QADQ,QAAG,GAAH,GAAG,CAAmB;IAE1C,CAAC;IAED,QAAQ;QACJ,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC3B,IAAI,CAAC,QAAQ,EAAE,CAAC;IACpB,CAAC;IAED,WAAW;QACP,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QACrB,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,sBAAsB,CAAC,IAAkB;QAC3C,OAAO,kBAAkB,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,oBAAoB,CAAC,IAAkB;QACzC,OAAO,6BAA6B,CAAC;IACzC,CAAC;IAEM,QAAQ;QACX,IAAI,CAAC;YACD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;YACtB,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;YAExB,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAExC,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBAClC,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,EAAE,EAAE,CAAC,CAAC,EAAE;gBACR,UAAU,EAAE,CAAC,CAAC,UAAU;gBACxB,iBAAiB,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC;gBAC5C,cAAc,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;gBACtC,UAAU,EAAE,KAAK;aACpB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YAEjD,iCAAiC;YACjC,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;YACnE,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC;YAErD,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;YAC7C,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,iBAAiB,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC;YAC3F,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC;YAE5F,IAAI,CAAC,WAAW,EAAE,CAAC;QACvB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,sCAAsC,EAAE,KAAK,CAAC,CAAC;QACjE,CAAC;gBAAS,CAAC;YACP,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;YACvB,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC1B,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAC5B,CAAC;IACL,CAAC;IAED,qGAAqG;IAC7F,iBAAiB,CAAC,MAAkB;QACxC,OAAO,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CACrC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,aAAa;YAC7C,CAAC,CAAC,aAAa,KAAK,MAAM,CAAC,IAAI,CAClC,CAAC,MAAM,CAAC;IACb,CAAC;IAED,6FAA6F;IACrF,cAAc,CAAC,MAAkB;QACrC,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CACrC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI;YACtB,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CACvB,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,aAAa;gBAC7C,CAAC,CAAC,aAAa,KAAK,MAAM,CAAC,IAAI,CAClC,CACJ,CAAC,MAAM,CAAC;IACb,CAAC;IAEM,cAAc,CAAC,IAAY;QAC9B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC,WAAW,EAAE,CAAC;IACvB,CAAC;IAEM,oBAAoB,CAAC,MAAc;QACtC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,KAAK,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;QAC/D,IAAI,CAAC,WAAW,EAAE,CAAC;QACnB,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAC9B,CAAC;IAEO,mBAAmB;QACvB,IAAI,CAAC;YACD,MAAM,GAAG,GAAG,cAAc,CAAC,QAAQ,CAAC,UAAU,CAAC,sCAAoC,CAAC,SAAS,CAAC,CAAC;YAC/F,IAAI,GAAG,EAAE,CAAC;gBACN,MAAM,KAAK,GAA4B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBACvD,IAAI,KAAK,CAAC,YAAY,IAAI,IAAI,EAAE,CAAC;oBAC7B,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC,YAAY,CAAC;gBAC3C,CAAC;YACL,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,kCAAkC,EAAE,KAAK,CAAC,CAAC;YACzD,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;QAC3B,CAAC;QACD,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;IAClC,CAAC;IAEO,kBAAkB;QACtB,IAAI,CAAC,IAAI,CAAC,iBAAiB;YAAE,OAAO;QACpC,MAAM,KAAK,GAA4B;YACnC,YAAY,EAAE,IAAI,CAAC,YAAY;SAClC,CAAC;QACF,cAAc,CAAC,QAAQ,CAAC,mBAAmB,CAAC,sCAAoC,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;IACvH,CAAC;IAEO,WAAW;QACf,IAAI,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC;QAE9B,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACpB,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,IAAI,CAAC,YAAY,CAAC,CAAC;QACpE,CAAC;QAED,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YAClB,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC;YAC7C,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;QACvE,CAAC;QAED,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC;QAC/B,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC5B,CAAC;IAEM,YAAY,CAAC,UAAsB;QACtC,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACtB,IAAI,CAAC,cAAc,CAAC,UAAU,GAAG,KAAK,CAAC;QAC3C,CAAC;QAED,UAAU,CAAC,UAAU,GAAG,IAAI,CAAC;QAC7B,IAAI,CAAC,cAAc,GAAG,UAAU,CAAC;QAEjC,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;QACrF,IAAI,CAAC,kBAAkB,GAAG,UAAU,IAAI,IAAI,CAAC;QAE7C,IAAI,UAAU,EAAE,CAAC;YACb,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,qBAAqB,CAAC,UAAU,CAAC,CAAC;YACnE,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC;QACjE,CAAC;aAAM,CAAC;YACJ,IAAI,CAAC,oBAAoB,GAAG,EAAE,CAAC;YAC/B,IAAI,CAAC,iBAAiB,GAAG,EAAE,CAAC;QAChC,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC5B,CAAC;IAED,oFAAoF;IAC5E,qBAAqB,CAAC,UAAsB;QAChD,OAAO,UAAU,CAAC,eAAe;aAC5B,MAAM,CAAC,CAAC,CAAC,EAAE,CACR,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,aAAa;YAC7C,CAAC,CAAC,aAAa,KAAK,UAAU,CAAC,IAAI,CACtC;aACA,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACP,UAAU,EAAE,UAAU,CAAC,IAAI;YAC3B,QAAQ,EAAE,CAAC,CAAC,aAAa;YACzB,sBAAsB,EAAE,CAAC,CAAC,sBAAsB;YAChD,IAAI,EAAE,CAAC,CAAC,IAAI;SACf,CAAC,CAAC;aACF,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC9D,CAAC;IAED,+EAA+E;IACvE,kBAAkB,CAAC,UAAsB;QAC7C,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ;aACxB,MAAM,CAAC,CAAC,CAAC,EAAE,CACR,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,IAAI;YAC1B,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CACvB,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,aAAa;gBAC7C,CAAC,CAAC,aAAa,KAAK,UAAU,CAAC,IAAI,CACtC,CACJ;aACA,GAAG,CAAC,CAAC,CAAC,EAAE;YACL,MAAM,GAAG,GAAG,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CACnC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,aAAa;gBAC7C,CAAC,CAAC,aAAa,KAAK,UAAU,CAAC,IAAI,CACrC,CAAC;YACH,OAAO;gBACH,UAAU,EAAE,CAAC,CAAC,IAAI;gBAClB,QAAQ,EAAE,UAAU,CAAC,IAAI;gBACzB,sBAAsB,EAAE,GAAG,CAAC,sBAAsB;gBAClD,IAAI,EAAE,GAAG,CAAC,IAAI;aACjB,CAAC;QACN,CAAC,CAAC;aACD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;IAClE,CAAC;IAEM,gBAAgB,CAAC,UAAkB;QACtC,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC;QAC/D,IAAI,IAAI,EAAE,CAAC;YACP,+CAA+C;YAC/C,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,UAAU,KAAK,IAAI,CAAC,YAAY,EAAE,CAAC;gBAC7D,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;gBACvB,IAAI,CAAC,WAAW,EAAE,CAAC;YACvB,CAAC;YACD,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC;IACL,CAAC;IAEM,kBAAkB,CAAC,KAAa;QACnC,IAAI,KAAK,KAAK,CAAC;YAAE,OAAO,YAAY,CAAC;QACrC,IAAI,KAAK,IAAI,CAAC;YAAE,OAAO,WAAW,CAAC;QACnC,IAAI,KAAK,IAAI,EAAE;YAAE,OAAO,cAAc,CAAC;QACvC,OAAO,YAAY,CAAC;IACxB,CAAC;IAEM,oBAAoB,CAAC,MAAc;QACtC,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,MAAM,CAAC,CAAC,MAAM,CAAC;IACxE,CAAC;IAEM,OAAO;QACV,IAAI,CAAC,QAAQ,EAAE,CAAC;IACpB,CAAC;8HAhPQ,oCAAoC;6DAApC,oCAAoC;YClCjD,8BAA6B;YAC3B,6GAAiB;YAIjB,6FAAkB;YAwKpB,iBAAM;;YA5KJ,cAEC;YAFD,wCAEC;YAED,cAuKC;YAvKD,yCAuKC;;;AD1IU,oCAAoC;IARhD,aAAa,CAAC,qBAAqB,EAAE,6BAA6B,CAAC;GAQvD,oCAAoC,CAiPhD;;iFAjPY,oCAAoC;cAPhD,SAAS;6BACI,KAAK,YACL,mCAAmC,mBAG5B,uBAAuB,CAAC,MAAM;;kFAEtC,oCAAoC","sourcesContent":["import { Component, OnInit, OnDestroy, ChangeDetectorRef, ChangeDetectionStrategy } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { RegisterClass , UUIDsEqual } from '@memberjunction/global';\nimport { BaseResourceComponent } from '@memberjunction/ng-shared';\nimport { Metadata, EntityInfo } from '@memberjunction/core';\nimport { ResourceData, UserInfoEngine } from '@memberjunction/core-entities';\n\ninterface VersionGraphPreferences {\n SchemaFilter: string;\n}\ninterface EntityNode {\n Name: string;\n ID: string;\n SchemaName: string;\n ReferencedByCount: number;\n DependsOnCount: number;\n IsSelected: boolean;\n}\n\ninterface RelationshipEdge {\n FromEntity: string;\n ToEntity: string;\n RelatedEntityJoinField: string;\n Type: string;\n}\n\n@RegisterClass(BaseResourceComponent, 'VersionHistoryGraphResource')\n@Component({\n standalone: false,\n selector: 'mj-version-history-graph-resource',\n templateUrl: './graph-resource.component.html',\n styleUrls: ['./graph-resource.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class VersionHistoryGraphResourceComponent extends BaseResourceComponent implements OnInit, OnDestroy {\n public IsLoading = true;\n\n // Entity browser\n public AllEntities: EntityNode[] = [];\n public FilteredEntities: EntityNode[] = [];\n public SearchText = '';\n public SchemaFilter = '';\n public AvailableSchemas: string[] = [];\n\n // Selected entity detail\n public SelectedEntity: EntityNode | null = null;\n public SelectedEntityInfo: EntityInfo | null = null;\n public ReferencedByEntities: RelationshipEdge[] = [];\n public DependsOnEntities: RelationshipEdge[] = [];\n\n // Stats\n public TotalEntities = 0;\n public EntitiesWithDependents = 0;\n public TotalRelationships = 0;\n\n private static readonly PREFS_KEY = 'VersionHistory.Graph.UserPreferences';\n private preferencesLoaded = false;\n private metadata = new Metadata();\n private destroy$ = new Subject<void>();\n\n constructor(private cdr: ChangeDetectorRef) {\n super();\n }\n\n ngOnInit(): void {\n this.loadUserPreferences();\n this.LoadData();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n async GetResourceDisplayName(data: ResourceData): Promise<string> {\n return 'Dependency Graph';\n }\n\n async GetResourceIconClass(data: ResourceData): Promise<string> {\n return 'fa-solid fa-diagram-project';\n }\n\n public LoadData(): void {\n try {\n this.IsLoading = true;\n this.cdr.markForCheck();\n\n const entities = this.metadata.Entities;\n\n this.AllEntities = entities.map(e => ({\n Name: e.Name,\n ID: e.ID,\n SchemaName: e.SchemaName,\n ReferencedByCount: this.countReferencedBy(e),\n DependsOnCount: this.countDependsOn(e),\n IsSelected: false\n })).sort((a, b) => a.Name.localeCompare(b.Name));\n\n // Extract unique schemas, sorted\n const schemaSet = new Set(this.AllEntities.map(e => e.SchemaName));\n this.AvailableSchemas = Array.from(schemaSet).sort();\n\n this.TotalEntities = this.AllEntities.length;\n this.EntitiesWithDependents = this.AllEntities.filter(e => e.ReferencedByCount > 0).length;\n this.TotalRelationships = this.AllEntities.reduce((sum, e) => sum + e.ReferencedByCount, 0);\n\n this.applyFilter();\n } catch (error) {\n console.error('Error loading dependency graph data:', error);\n } finally {\n this.IsLoading = false;\n this.NotifyLoadComplete();\n this.cdr.markForCheck();\n }\n }\n\n /** Count entities that reference this entity (have FKs pointing to it), excluding self-references */\n private countReferencedBy(entity: EntityInfo): number {\n return entity.RelatedEntities.filter(r =>\n r.Type.trim().toUpperCase() === 'ONE TO MANY' &&\n r.RelatedEntity !== entity.Name\n ).length;\n }\n\n /** Count entities this entity depends on (has FKs pointing to), excluding self-references */\n private countDependsOn(entity: EntityInfo): number {\n return this.metadata.Entities.filter(e =>\n e.Name !== entity.Name &&\n e.RelatedEntities.some(r =>\n r.Type.trim().toUpperCase() === 'ONE TO MANY' &&\n r.RelatedEntity === entity.Name\n )\n ).length;\n }\n\n public OnSearchChange(text: string): void {\n this.SearchText = text;\n this.applyFilter();\n }\n\n public OnSchemaFilterChange(schema: string): void {\n this.SchemaFilter = this.SchemaFilter === schema ? '' : schema;\n this.applyFilter();\n this.persistPreferences();\n }\n\n private loadUserPreferences(): void {\n try {\n const raw = UserInfoEngine.Instance.GetSetting(VersionHistoryGraphResourceComponent.PREFS_KEY);\n if (raw) {\n const prefs: VersionGraphPreferences = JSON.parse(raw);\n if (prefs.SchemaFilter != null) {\n this.SchemaFilter = prefs.SchemaFilter;\n }\n }\n } catch (error) {\n console.error('Error loading graph preferences:', error);\n this.SchemaFilter = '';\n }\n this.preferencesLoaded = true;\n }\n\n private persistPreferences(): void {\n if (!this.preferencesLoaded) return;\n const prefs: VersionGraphPreferences = {\n SchemaFilter: this.SchemaFilter\n };\n UserInfoEngine.Instance.SetSettingDebounced(VersionHistoryGraphResourceComponent.PREFS_KEY, JSON.stringify(prefs));\n }\n\n private applyFilter(): void {\n let result = this.AllEntities;\n\n if (this.SchemaFilter) {\n result = result.filter(e => e.SchemaName === this.SchemaFilter);\n }\n\n if (this.SearchText) {\n const search = this.SearchText.toLowerCase();\n result = result.filter(e => e.Name.toLowerCase().includes(search));\n }\n\n this.FilteredEntities = result;\n this.cdr.markForCheck();\n }\n\n public SelectEntity(entityNode: EntityNode): void {\n if (this.SelectedEntity) {\n this.SelectedEntity.IsSelected = false;\n }\n\n entityNode.IsSelected = true;\n this.SelectedEntity = entityNode;\n\n const entityInfo = this.metadata.Entities.find(e => UUIDsEqual(e.ID, entityNode.ID));\n this.SelectedEntityInfo = entityInfo ?? null;\n\n if (entityInfo) {\n this.ReferencedByEntities = this.buildReferencedByList(entityInfo);\n this.DependsOnEntities = this.buildDependsOnList(entityInfo);\n } else {\n this.ReferencedByEntities = [];\n this.DependsOnEntities = [];\n }\n\n this.cdr.markForCheck();\n }\n\n /** Entities that have FKs pointing TO the selected entity (it is the \"one\" side) */\n private buildReferencedByList(entityInfo: EntityInfo): RelationshipEdge[] {\n return entityInfo.RelatedEntities\n .filter(r =>\n r.Type.trim().toUpperCase() === 'ONE TO MANY' &&\n r.RelatedEntity !== entityInfo.Name\n )\n .map(r => ({\n FromEntity: entityInfo.Name,\n ToEntity: r.RelatedEntity,\n RelatedEntityJoinField: r.RelatedEntityJoinField,\n Type: r.Type\n }))\n .sort((a, b) => a.ToEntity.localeCompare(b.ToEntity));\n }\n\n /** Entities the selected entity has FKs pointing to (it is the \"many\" side) */\n private buildDependsOnList(entityInfo: EntityInfo): RelationshipEdge[] {\n return this.metadata.Entities\n .filter(e =>\n e.Name !== entityInfo.Name &&\n e.RelatedEntities.some(r =>\n r.Type.trim().toUpperCase() === 'ONE TO MANY' &&\n r.RelatedEntity === entityInfo.Name\n )\n )\n .map(e => {\n const rel = e.RelatedEntities.find(r =>\n r.Type.trim().toUpperCase() === 'ONE TO MANY' &&\n r.RelatedEntity === entityInfo.Name\n )!;\n return {\n FromEntity: e.Name,\n ToEntity: entityInfo.Name,\n RelatedEntityJoinField: rel.RelatedEntityJoinField,\n Type: rel.Type\n };\n })\n .sort((a, b) => a.FromEntity.localeCompare(b.FromEntity));\n }\n\n public NavigateToEntity(entityName: string): void {\n const node = this.AllEntities.find(e => e.Name === entityName);\n if (node) {\n // Clear schema filter so the entity is visible\n if (this.SchemaFilter && node.SchemaName !== this.SchemaFilter) {\n this.SchemaFilter = '';\n this.applyFilter();\n }\n this.SelectEntity(node);\n }\n }\n\n public GetDependencyLevel(count: number): string {\n if (count === 0) return 'level-none';\n if (count <= 3) return 'level-low';\n if (count <= 10) return 'level-medium';\n return 'level-high';\n }\n\n public GetSchemaEntityCount(schema: string): number {\n return this.AllEntities.filter(e => e.SchemaName === schema).length;\n }\n\n public Refresh(): void {\n this.LoadData();\n }\n}\n","<div class=\"graph-container\">\n @if (IsLoading) {\n <mj-loading text=\"Loading dependency graph...\"></mj-loading>\n }\n\n @if (!IsLoading) {\n <!-- Header -->\n <div class=\"page-header\">\n <div class=\"header-left\">\n <h2 class=\"page-title\">Entity Dependency Graph</h2>\n <p class=\"page-subtitle\">Explore entity relationships used by the version history system</p>\n </div>\n <div class=\"header-actions\">\n <button class=\"btn-icon\" (click)=\"Refresh()\" title=\"Refresh\">\n <i class=\"fa-solid fa-refresh\"></i>\n </button>\n </div>\n </div>\n <!-- Stats Row -->\n <div class=\"stats-row\">\n <div class=\"stat-badge\">\n <i class=\"fa-solid fa-table\"></i>\n <span>{{TotalEntities}} Entities</span>\n </div>\n <div class=\"stat-badge\">\n <i class=\"fa-solid fa-diagram-project\"></i>\n <span>{{EntitiesWithDependents}} with Dependents</span>\n </div>\n <div class=\"stat-badge\">\n <i class=\"fa-solid fa-arrow-right-arrow-left\"></i>\n <span>{{TotalRelationships}} Relationships</span>\n </div>\n </div>\n <!-- Main Layout: Entity List + Detail -->\n <div class=\"graph-layout\">\n <!-- Entity List -->\n <div class=\"entity-list-panel\">\n <div class=\"panel-header\">\n <h3 class=\"panel-title\">Entities</h3>\n </div>\n <div class=\"search-bar\">\n <i class=\"fa-solid fa-search search-icon\"></i>\n <input type=\"text\"\n class=\"search-input\"\n placeholder=\"Filter entities...\"\n [ngModel]=\"SearchText\"\n (ngModelChange)=\"OnSearchChange($event)\" />\n </div>\n <!-- Schema Filter Chips -->\n @if (AvailableSchemas.length > 1) {\n <div class=\"schema-chips\">\n @for (schema of AvailableSchemas; track schema) {\n <button class=\"schema-chip\"\n [class.active]=\"SchemaFilter === schema\"\n (click)=\"OnSchemaFilterChange(schema)\">\n {{schema}}\n <span class=\"schema-chip-count\">{{GetSchemaEntityCount(schema)}}</span>\n </button>\n }\n </div>\n }\n <div class=\"entity-scroll-list\">\n @for (entity of FilteredEntities; track entity) {\n <div class=\"entity-list-item\"\n [class.selected]=\"entity.IsSelected\"\n (click)=\"SelectEntity(entity)\">\n <div class=\"entity-list-name\">{{entity.Name}}</div>\n <div class=\"entity-list-badges\">\n @if (entity.ReferencedByCount > 0) {\n <span class=\"dep-badge\"\n [ngClass]=\"GetDependencyLevel(entity.ReferencedByCount)\"\n title=\"Referenced by (entities with FKs to this)\">\n {{entity.ReferencedByCount}} <i class=\"fa-solid fa-arrow-down\"></i>\n </span>\n }\n @if (entity.DependsOnCount > 0) {\n <span class=\"dep-badge level-depends-on\"\n title=\"Depends on (entities this has FKs to)\">\n {{entity.DependsOnCount}} <i class=\"fa-solid fa-arrow-up\"></i>\n </span>\n }\n </div>\n </div>\n }\n @if (FilteredEntities.length === 0) {\n <div class=\"empty-list\">\n <p>No entities match your search.</p>\n </div>\n }\n </div>\n </div>\n <!-- Detail Panel -->\n <div class=\"entity-detail-panel\">\n @if (SelectedEntity) {\n <div class=\"detail-header\">\n <i class=\"fa-solid fa-table detail-icon\"></i>\n <div class=\"detail-header-text\">\n <h3 class=\"detail-title\">{{SelectedEntity.Name}}</h3>\n <span class=\"detail-schema\">{{SelectedEntity.SchemaName}}</span>\n </div>\n </div>\n <!-- Referenced By (entities that have FKs pointing to this entity) -->\n <div class=\"relationship-section\">\n <div class=\"section-header\">\n <i class=\"fa-solid fa-arrow-down section-icon referenced-by-icon\"></i>\n <h4>Referenced By</h4>\n <span class=\"section-count\">{{ReferencedByEntities.length}}</span>\n </div>\n <p class=\"section-hint\">Entities that have foreign keys pointing to <strong>{{SelectedEntity.Name}}</strong></p>\n @if (ReferencedByEntities.length > 0) {\n <div class=\"relationship-list\">\n @for (rel of ReferencedByEntities; track rel) {\n <div class=\"relationship-item\">\n <div class=\"rel-main\"\n (click)=\"NavigateToEntity(rel.ToEntity)\">\n <i class=\"fa-solid fa-table rel-icon\"></i>\n <span class=\"rel-entity-name\">{{rel.ToEntity}}</span>\n <span class=\"rel-join-field\">\n <i class=\"fa-solid fa-link\"></i>\n {{rel.RelatedEntityJoinField}}\n </span>\n </div>\n </div>\n }\n </div>\n }\n @if (ReferencedByEntities.length === 0) {\n <div class=\"empty-relationships\">\n <p>No entities reference this entity.</p>\n </div>\n }\n </div>\n <!-- Depends On (entities this entity has FKs to) -->\n <div class=\"relationship-section\">\n <div class=\"section-header\">\n <i class=\"fa-solid fa-arrow-up section-icon depends-on-icon\"></i>\n <h4>Depends On</h4>\n <span class=\"section-count\">{{DependsOnEntities.length}}</span>\n </div>\n <p class=\"section-hint\"><strong>{{SelectedEntity.Name}}</strong> has foreign keys pointing to these entities</p>\n @if (DependsOnEntities.length > 0) {\n <div class=\"relationship-list\">\n @for (rel of DependsOnEntities; track rel) {\n <div class=\"relationship-item\">\n <div class=\"rel-main\"\n (click)=\"NavigateToEntity(rel.FromEntity)\">\n <i class=\"fa-solid fa-table rel-icon\"></i>\n <span class=\"rel-entity-name\">{{rel.FromEntity}}</span>\n <span class=\"rel-join-field\">\n <i class=\"fa-solid fa-link\"></i>\n {{rel.RelatedEntityJoinField}}\n </span>\n </div>\n </div>\n }\n </div>\n }\n @if (DependsOnEntities.length === 0) {\n <div class=\"empty-relationships\">\n <p>This entity has no foreign key dependencies.</p>\n </div>\n }\n </div>\n } @else {\n <div class=\"no-selection\">\n <i class=\"fa-solid fa-diagram-project no-selection-icon\"></i>\n <h3>Select an Entity</h3>\n <p>Choose an entity from the list to explore its dependency relationships.</p>\n </div>\n }\n </div>\n </div>\n }\n</div>\n"]}
@@ -7,7 +7,7 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
7
7
  var VersionHistoryLabelsResourceComponent_1;
8
8
  import { Component, ChangeDetectionStrategy } from '@angular/core';
9
9
  import { Subject } from 'rxjs';
10
- import { RegisterClass } from '@memberjunction/global';
10
+ import { RegisterClass, UUIDsEqual } from '@memberjunction/global';
11
11
  import { BaseResourceComponent } from '@memberjunction/ng-shared';
12
12
  import { RunView, Metadata } from '@memberjunction/core';
13
13
  import { UserInfoEngine } from '@memberjunction/core-entities';
@@ -654,7 +654,7 @@ let VersionHistoryLabelsResourceComponent = class VersionHistoryLabelsResourceCo
654
654
  ResolveEntityName(entityId) {
655
655
  if (!entityId)
656
656
  return '';
657
- const entity = this.metadata.Entities.find(e => e.ID === entityId);
657
+ const entity = this.metadata.Entities.find(e => UUIDsEqual(e.ID, entityId));
658
658
  return entity ? entity.Name : '';
659
659
  }
660
660
  // =======================================================================
@@ -935,7 +935,7 @@ let VersionHistoryLabelsResourceComponent = class VersionHistoryLabelsResourceCo
935
935
  GetChildLabels(parentId) {
936
936
  if (!parentId)
937
937
  return [];
938
- return this.Labels.filter(l => l.ParentID === parentId);
938
+ return this.Labels.filter(l => UUIDsEqual(l.ParentID, parentId));
939
939
  }
940
940
  static ɵfac = function VersionHistoryLabelsResourceComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || VersionHistoryLabelsResourceComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(i1.NavigationService)); };
941
941
  static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: VersionHistoryLabelsResourceComponent, selectors: [["mj-version-history-labels-resource"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 5, vars: 4, consts: [[1, "labels-container"], ["text", "Loading version labels..."], [1, "create-wizard-overlay"], [3, "Label", "AllLabels", "ItemCountMap"], [1, "page-header"], [1, "header-left"], [1, "page-title"], [1, "page-subtitle"], [1, "header-actions"], [1, "view-toggle"], ["title", "Card view", 1, "toggle-btn", 3, "click"], [1, "fa-solid", "fa-grip"], ["title", "List view", 1, "toggle-btn", 3, "click"], [1, "fa-solid", "fa-list"], [1, "btn-primary", 3, "click"], [1, "fa-solid", "fa-plus"], ["title", "Refresh", 1, "btn-icon", 3, "click"], [1, "fa-solid", "fa-refresh"], [1, "kpi-row"], [1, "kpi-card"], [1, "kpi-icon", 2, "background", "rgba(99, 102, 241, 0.1)", "color", "#6366f1"], [1, "fa-solid", "fa-tags"], [1, "kpi-content"], [1, "kpi-value"], [1, "kpi-label"], [1, "kpi-icon", 2, "background", "rgba(16, 185, 129, 0.1)", "color", "#10b981"], [1, "fa-solid", "fa-circle-check"], [1, "kpi-icon", 2, "background", "rgba(107, 114, 128, 0.1)", "color", "#6b7280"], [1, "fa-solid", "fa-box-archive"], [1, "kpi-icon", 2, "background", "rgba(245, 158, 11, 0.1)", "color", "#f59e0b"], [1, "fa-solid", "fa-clock-rotate-left"], [1, "scope-chips"], [1, "scope-chip", 3, "active"], [1, "scope-chip", 3, "active", "ngClass"], [1, "search-bar"], [1, "fa-solid", "fa-search", "search-icon"], ["type", "text", "placeholder", "Search labels by name, description, or entity...", 1, "search-input", 3, "ngModelChange", "ngModel"], [1, "btn-clear"], [1, "labels-list"], [1, "labels-table"], [1, "empty-state"], [1, "scope-chip", 3, "click"], [1, "chip-count"], [1, "scope-chip", 3, "click", "ngClass"], [1, "btn-clear", 3, "click"], [1, "fa-solid", "fa-xmark"], [1, "label-card", "clickable", 3, "group-parent"], [1, "label-card", "clickable", 3, "click"], [1, "label-header"], [1, "label-title-row"], [1, "label-scope-icon"], [1, "label-name"], [1, "group-badge"], [1, "label-status", 3, "ngClass"], [1, "label-meta"], ["title", "Scope", 1, "meta-item"], [1, "fa-solid", "fa-layer-group"], ["title", "Entity", 1, "meta-item"], ["title", "Record ID", 1, "meta-item"], ["title", "Items captured", 1, "meta-item"], ["title", "Creation time", 1, "meta-item"], ["title", "Created by", 1, "meta-item"], ["title", "Created", 1, "meta-item"], [1, "fa-regular", "fa-clock"], [1, "label-description"], [1, "child-labels"], [1, "fa-solid", "fa-table"], [1, "fa-solid", "fa-fingerprint"], [1, "fa-solid", "fa-camera"], [1, "fa-solid", "fa-stopwatch"], [1, "fa-solid", "fa-user"], [1, "child-label"], [1, "fa-solid", "fa-tag", "child-icon"], [1, "child-name"], [1, "child-record"], [1, "child-items"], [1, "list-header-row"], [1, "list-col-icon"], [1, "list-col-name", "sortable-header", 3, "click"], [1, "sort-icon"], [1, "list-col-entity"], [1, "list-col-status", "sortable-header", 3, "click"], [1, "list-col-items", "sortable-header", 3, "click"], [1, "list-col-date", "sortable-header", 3, "click"], [1, "list-col-arrow"], [1, "list-row", "clickable"], [1, "list-row", "clickable", 3, "click"], [1, "list-scope-icon"], [1, "list-col-name"], [1, "list-label-name"], [1, "list-group-badge"], [1, "list-col-status"], [1, "label-status", "small", 3, "ngClass"], [1, "list-col-items"], [1, "list-col-date"], [1, "fa-solid", "fa-chevron-right", "list-arrow"], [1, "fa-solid", "fa-tags", "empty-icon"], [1, "btn-primary", "empty-cta"], [1, "btn-primary", "empty-cta", 3, "click"], [1, "create-wizard-overlay", 3, "click"], [1, "create-wizard-container", 3, "click"], [1, "create-wizard-header"], [1, "create-wizard-title"], [1, "fa-solid", "fa-tag"], ["title", "Close", 1, "create-wizard-close", 3, "click"], [1, "create-wizard-body"], [3, "Created", "Cancel"], [3, "Close", "LabelUpdated", "EntityLinkClick", "Label", "AllLabels", "ItemCountMap"]], template: function VersionHistoryLabelsResourceComponent_Template(rf, ctx) { if (rf & 1) {