@memberjunction/ng-dashboards 6.1.0-edge.6 → 6.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diff-resource.component.d.ts","sourceRoot":"","sources":["../../../src/VersionHistory/components/diff-resource.component.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"diff-resource.component.d.ts","sourceRoot":"","sources":["../../../src/VersionHistory/components/diff-resource.component.ts"],"names":[],"mappings":"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"}
|
|
@@ -935,13 +935,19 @@ let VersionHistoryDiffResourceComponent = class VersionHistoryDiffResourceCompon
|
|
|
935
935
|
{
|
|
936
936
|
EntityName: 'MJ: Record Changes',
|
|
937
937
|
ExtraFilter: `ID = '${oldChangeId}'`,
|
|
938
|
-
|
|
938
|
+
// 'EntityID' is required, not decorative: field-level security projects a Record Change's
|
|
939
|
+
// payload against the entity the row is ABOUT, and a row arriving without EntityID cannot
|
|
940
|
+
// be resolved — so the payload is withheld. See guides/FIELD_LEVEL_SECURITY_GUIDE.md §3.2.
|
|
941
|
+
Fields: ['EntityID', 'FullRecordJSON'],
|
|
939
942
|
ResultType: 'simple'
|
|
940
943
|
},
|
|
941
944
|
{
|
|
942
945
|
EntityName: 'MJ: Record Changes',
|
|
943
946
|
ExtraFilter: `ID = '${newChangeId}'`,
|
|
944
|
-
|
|
947
|
+
// 'EntityID' is required, not decorative: field-level security projects a Record Change's
|
|
948
|
+
// payload against the entity the row is ABOUT, and a row arriving without EntityID cannot
|
|
949
|
+
// be resolved — so the payload is withheld. See guides/FIELD_LEVEL_SECURITY_GUIDE.md §3.2.
|
|
950
|
+
Fields: ['EntityID', 'FullRecordJSON'],
|
|
945
951
|
ResultType: 'simple'
|
|
946
952
|
}
|
|
947
953
|
]);
|
|
@@ -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 , 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 protected override destroy$ = new Subject<void>();\n private metadata = this.ProviderToUse;\n\n constructor(private cdr: ChangeDetectorRef) {\n super();\n }\n\n ngOnInit(): void {\n super.ngOnInit();\n this.loadUserPreferences();\n this.LoadLabels();\n }\n\n ngOnDestroy(): void {\n super.ngOnDestroy();\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 = RunView.FromMetadataProvider(this.ProviderToUse);\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 = RunView.FromMetadataProvider(this.ProviderToUse);\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 // RecordID is a CompositeKey segment (\"ID|<uuid>\", or composite) — parse it against the\n // entity's real key column(s) rather than stripping the prefix and assuming `ID`.\n const pkey = CompositeKey.FromURLSegment(this.metadata.EntityByName(item.EntityName), item.RecordID);\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 groupEntity = this.metadata.EntityByName(group.EntityName);\n const inputs: EntityRecordNameInput[] = group.Items.map(item => {\n const input = new EntityRecordNameInput();\n input.EntityName = group.EntityName;\n input.CompositeKey = CompositeKey.FromURLSegment(groupEntity, item.RecordID);\n return input;\n });\n\n const results = await this.metadata.GetEntityRecordNames(inputs);\n\n for (const result of results) {\n if (result.Success && result.RecordName) {\n 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 = RunView.FromMetadataProvider(this.ProviderToUse);\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","<mj-page-layout>\n <mj-page-header\n Title=\"Diff Viewer\"\n Icon=\"fa-solid fa-code-compare\"\n Subtitle=\"Compare states between version labels or against current data\">\n </mj-page-header>\n\n <mj-page-body>\n @if (IsLoading) {\n <mj-loading text=\"Loading diff viewer...\"></mj-loading>\n }\n\n @if (!IsLoading) {\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 <mj-accordion-panel Size=\"sm\" [FlushBody]=\"true\"\n [Expanded]=\"group.IsExpanded\" (ExpandedChange)=\"ToggleEntityGroup(group)\">\n <ng-template mjAccordionTitle>\n <i [class]=\"group.EntityIcon\" class=\"entity-icon\"></i>\n <span class=\"entity-group-name\">{{group.EntityName}}</span>\n <div class=\"entity-group-badges\">\n @if (group.AddedCount > 0) {\n <span class=\"mj-accordion-badge mj-accordion-badge--success\">\n +{{group.AddedCount}}\n </span>\n }\n @if (group.RemovedCount > 0) {\n <span class=\"mj-accordion-badge mj-accordion-badge--error\">\n -{{group.RemovedCount}}\n </span>\n }\n @if (group.ModifiedCount > 0) {\n <span class=\"mj-accordion-badge mj-accordion-badge--warning\">\n ~{{group.ModifiedCount}}\n </span>\n }\n </div>\n </ng-template>\n <ng-template mjAccordionBody>\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 <mj-empty-state class=\"diff-fields-empty\" Size=\"compact\"\n Icon=\"\" Title=\"No field-level changes available\" />\n }\n </div>\n }\n </div>\n }\n </div>\n </ng-template>\n </mj-accordion-panel>\n }\n </div>\n }\n <!-- No changes -->\n @if (FilteredEntityGroups.length === 0 && TotalChanges === 0) {\n <mj-empty-state Variant=\"success\"\n Title=\"No differences found\"\n Message=\"The compared states are identical.\" />\n }\n }\n <!-- No results yet -->\n @if (!HasDiffResult && !IsDiffLoading) {\n <mj-empty-state Icon=\"fa-solid fa-code-compare\"\n Title=\"Select labels to compare\"\n Message=\"Choose a diff mode and select labels above, then click Compare.\" />\n }\n }\n </mj-page-body>\n</mj-page-layout>\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 protected override destroy$ = new Subject<void>();\n private metadata = this.ProviderToUse;\n\n constructor(private cdr: ChangeDetectorRef) {\n super();\n }\n\n ngOnInit(): void {\n super.ngOnInit();\n this.loadUserPreferences();\n this.LoadLabels();\n }\n\n ngOnDestroy(): void {\n super.ngOnDestroy();\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 = RunView.FromMetadataProvider(this.ProviderToUse);\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 = RunView.FromMetadataProvider(this.ProviderToUse);\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 // RecordID is a CompositeKey segment (\"ID|<uuid>\", or composite) — parse it against the\n // entity's real key column(s) rather than stripping the prefix and assuming `ID`.\n const pkey = CompositeKey.FromURLSegment(this.metadata.EntityByName(item.EntityName), item.RecordID);\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 groupEntity = this.metadata.EntityByName(group.EntityName);\n const inputs: EntityRecordNameInput[] = group.Items.map(item => {\n const input = new EntityRecordNameInput();\n input.EntityName = group.EntityName;\n input.CompositeKey = CompositeKey.FromURLSegment(groupEntity, item.RecordID);\n return input;\n });\n\n const results = await this.metadata.GetEntityRecordNames(inputs);\n\n for (const result of results) {\n if (result.Success && result.RecordName) {\n 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 = RunView.FromMetadataProvider(this.ProviderToUse);\n const [oldResult, newResult] = await rv.RunViews([\n {\n EntityName: 'MJ: Record Changes',\n ExtraFilter: `ID = '${oldChangeId}'`,\n // 'EntityID' is required, not decorative: field-level security projects a Record Change's\n // payload against the entity the row is ABOUT, and a row arriving without EntityID cannot\n // be resolved — so the payload is withheld. See guides/FIELD_LEVEL_SECURITY_GUIDE.md §3.2.\n Fields: ['EntityID', 'FullRecordJSON'],\n ResultType: 'simple'\n },\n {\n EntityName: 'MJ: Record Changes',\n ExtraFilter: `ID = '${newChangeId}'`,\n // 'EntityID' is required, not decorative: field-level security projects a Record Change's\n // payload against the entity the row is ABOUT, and a row arriving without EntityID cannot\n // be resolved — so the payload is withheld. See guides/FIELD_LEVEL_SECURITY_GUIDE.md §3.2.\n Fields: ['EntityID', 'FullRecordJSON'],\n ResultType: 'simple'\n }\n ]);\n\n if (!oldResult.Success || !newResult.Success) return [];\n if (oldResult.Results.length === 0 || newResult.Results.length === 0) return [];\n\n const oldRow = oldResult.Results[0] as RecordChangeRow;\n const newRow = newResult.Results[0] as RecordChangeRow;\n\n return this.diffRecordJson(oldRow.FullRecordJSON, newRow.FullRecordJSON);\n } catch {\n return [];\n }\n }\n\n private diffRecordJson(oldJson: string, newJson: string): FieldChangeView[] {\n const changes: FieldChangeView[] = [];\n\n try {\n const oldData = JSON.parse(oldJson || '{}') as Record<string, unknown>;\n const newData = JSON.parse(newJson || '{}') as Record<string, unknown>;\n const allKeys = new Set([...Object.keys(oldData), ...Object.keys(newData)]);\n\n for (const key of allKeys) {\n 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","<mj-page-layout>\n <mj-page-header\n Title=\"Diff Viewer\"\n Icon=\"fa-solid fa-code-compare\"\n Subtitle=\"Compare states between version labels or against current data\">\n </mj-page-header>\n\n <mj-page-body>\n @if (IsLoading) {\n <mj-loading text=\"Loading diff viewer...\"></mj-loading>\n }\n\n @if (!IsLoading) {\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 <mj-accordion-panel Size=\"sm\" [FlushBody]=\"true\"\n [Expanded]=\"group.IsExpanded\" (ExpandedChange)=\"ToggleEntityGroup(group)\">\n <ng-template mjAccordionTitle>\n <i [class]=\"group.EntityIcon\" class=\"entity-icon\"></i>\n <span class=\"entity-group-name\">{{group.EntityName}}</span>\n <div class=\"entity-group-badges\">\n @if (group.AddedCount > 0) {\n <span class=\"mj-accordion-badge mj-accordion-badge--success\">\n +{{group.AddedCount}}\n </span>\n }\n @if (group.RemovedCount > 0) {\n <span class=\"mj-accordion-badge mj-accordion-badge--error\">\n -{{group.RemovedCount}}\n </span>\n }\n @if (group.ModifiedCount > 0) {\n <span class=\"mj-accordion-badge mj-accordion-badge--warning\">\n ~{{group.ModifiedCount}}\n </span>\n }\n </div>\n </ng-template>\n <ng-template mjAccordionBody>\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 <mj-empty-state class=\"diff-fields-empty\" Size=\"compact\"\n Icon=\"\" Title=\"No field-level changes available\" />\n }\n </div>\n }\n </div>\n }\n </div>\n </ng-template>\n </mj-accordion-panel>\n }\n </div>\n }\n <!-- No changes -->\n @if (FilteredEntityGroups.length === 0 && TotalChanges === 0) {\n <mj-empty-state Variant=\"success\"\n Title=\"No differences found\"\n Message=\"The compared states are identical.\" />\n }\n }\n <!-- No results yet -->\n @if (!HasDiffResult && !IsDiffLoading) {\n <mj-empty-state Icon=\"fa-solid fa-code-compare\"\n Title=\"Select labels to compare\"\n Message=\"Choose a diff mode and select labels above, then click Compare.\" />\n }\n }\n </mj-page-body>\n</mj-page-layout>\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@memberjunction/ng-dashboards",
|
|
3
|
-
"version": "6.1.0
|
|
3
|
+
"version": "6.1.0",
|
|
4
4
|
"description": "MemberJunction Dashboards",
|
|
5
5
|
"main": "./dist/public-api.js",
|
|
6
6
|
"typings": "./dist/public-api.d.ts",
|
|
@@ -89,7 +89,7 @@
|
|
|
89
89
|
"@angular/compiler-cli": "21.2.22",
|
|
90
90
|
"@types/d3": "^7.4.0",
|
|
91
91
|
"sass": "^1.97.3",
|
|
92
|
-
"@memberjunction/ng-test-utils": "6.1.0
|
|
92
|
+
"@memberjunction/ng-test-utils": "6.1.0"
|
|
93
93
|
},
|
|
94
94
|
"peerDependencies": {
|
|
95
95
|
"@angular/animations": "^21.2.22",
|
|
@@ -106,67 +106,67 @@
|
|
|
106
106
|
"@codemirror/merge": "^6.11.2",
|
|
107
107
|
"@codemirror/state": "^6.5.4",
|
|
108
108
|
"@codemirror/view": "^6.39.12",
|
|
109
|
-
"@memberjunction/actions-base": "6.1.0
|
|
110
|
-
"@memberjunction/ai-core-plus": "6.1.0
|
|
111
|
-
"@memberjunction/ai-engine-base": "6.1.0
|
|
112
|
-
"@memberjunction/api-keys-base": "6.1.0
|
|
113
|
-
"@memberjunction/core": "6.1.0
|
|
114
|
-
"@memberjunction/core-entities": "6.1.0
|
|
115
|
-
"@memberjunction/credentials": "6.1.0
|
|
116
|
-
"@memberjunction/export-engine": "6.1.0
|
|
117
|
-
"@memberjunction/global": "6.1.0
|
|
118
|
-
"@memberjunction/graphql-dataprovider": "6.1.0
|
|
119
|
-
"@memberjunction/integration-engine-base": "6.1.0
|
|
120
|
-
"@memberjunction/interactive-component-types": "6.1.0
|
|
121
|
-
"@memberjunction/lists-base": "6.1.0
|
|
122
|
-
"@memberjunction/ng-action-gallery": "6.1.0
|
|
123
|
-
"@memberjunction/ng-actions": "6.1.0
|
|
124
|
-
"@memberjunction/ng-agent-requests": "6.1.0
|
|
125
|
-
"@memberjunction/ng-agents": "6.1.0
|
|
126
|
-
"@memberjunction/ng-ai-test-harness": "6.1.0
|
|
127
|
-
"@memberjunction/ng-archive-manager": "6.1.0
|
|
128
|
-
"@memberjunction/ng-base-application": "6.1.0
|
|
129
|
-
"@memberjunction/ng-base-forms": "6.1.0
|
|
130
|
-
"@memberjunction/ng-base-types": "6.1.0
|
|
131
|
-
"@memberjunction/ng-clustering": "6.1.0
|
|
132
|
-
"@memberjunction/ng-code-editor": "6.1.0
|
|
133
|
-
"@memberjunction/ng-composer": "6.1.0
|
|
134
|
-
"@memberjunction/ng-container-directives": "6.1.0
|
|
135
|
-
"@memberjunction/ng-conversations": "6.1.0
|
|
136
|
-
"@memberjunction/ng-core-entity-forms": "6.1.0
|
|
137
|
-
"@memberjunction/ng-credentials": "6.1.0
|
|
138
|
-
"@memberjunction/ng-dashboard-viewer": "6.1.0
|
|
139
|
-
"@memberjunction/ng-entity-relationship-diagram": "6.1.0
|
|
140
|
-
"@memberjunction/ng-entity-viewer": "6.1.0
|
|
141
|
-
"@memberjunction/ng-explorer-settings": "6.1.0
|
|
142
|
-
"@memberjunction/ng-export-service": "6.1.0
|
|
143
|
-
"@memberjunction/ng-filter-builder": "6.1.0
|
|
144
|
-
"@memberjunction/ng-list-management": "6.1.0
|
|
145
|
-
"@memberjunction/ng-map-view": "6.1.0
|
|
146
|
-
"@memberjunction/ng-markdown": "6.1.0
|
|
147
|
-
"@memberjunction/ng-media-player": "6.1.0
|
|
148
|
-
"@memberjunction/ng-notifications": "6.1.0
|
|
149
|
-
"@memberjunction/ng-query-viewer": "6.1.0
|
|
150
|
-
"@memberjunction/ng-react": "6.1.0
|
|
151
|
-
"@memberjunction/ng-record-process-studio": "6.1.0
|
|
152
|
-
"@memberjunction/ng-resource-permissions": "6.1.0
|
|
153
|
-
"@memberjunction/ng-scheduling": "6.1.0
|
|
154
|
-
"@memberjunction/ng-search": "6.1.0
|
|
155
|
-
"@memberjunction/ng-shared": "6.1.0
|
|
156
|
-
"@memberjunction/ng-shared-generic": "6.1.0
|
|
157
|
-
"@memberjunction/ng-task-graph-editor": "6.1.0
|
|
158
|
-
"@memberjunction/ng-tabstrip": "6.1.0
|
|
159
|
-
"@memberjunction/ng-testing": "6.1.0
|
|
160
|
-
"@memberjunction/ng-trees": "6.1.0
|
|
161
|
-
"@memberjunction/ng-ui-components": "6.1.0
|
|
162
|
-
"@memberjunction/ng-user-routines": "6.1.0
|
|
163
|
-
"@memberjunction/ng-versions": "6.1.0
|
|
164
|
-
"@memberjunction/ng-word-cloud": "6.1.0
|
|
165
|
-
"@memberjunction/predictive-studio-core": "6.1.0
|
|
166
|
-
"@memberjunction/tag-engine-base": "6.1.0
|
|
167
|
-
"@memberjunction/templates-base-types": "6.1.0
|
|
168
|
-
"@memberjunction/testing-engine-base": "6.1.0
|
|
169
|
-
"@memberjunction/theme-engine": "6.1.0
|
|
109
|
+
"@memberjunction/actions-base": "6.1.0",
|
|
110
|
+
"@memberjunction/ai-core-plus": "6.1.0",
|
|
111
|
+
"@memberjunction/ai-engine-base": "6.1.0",
|
|
112
|
+
"@memberjunction/api-keys-base": "6.1.0",
|
|
113
|
+
"@memberjunction/core": "6.1.0",
|
|
114
|
+
"@memberjunction/core-entities": "6.1.0",
|
|
115
|
+
"@memberjunction/credentials": "6.1.0",
|
|
116
|
+
"@memberjunction/export-engine": "6.1.0",
|
|
117
|
+
"@memberjunction/global": "6.1.0",
|
|
118
|
+
"@memberjunction/graphql-dataprovider": "6.1.0",
|
|
119
|
+
"@memberjunction/integration-engine-base": "6.1.0",
|
|
120
|
+
"@memberjunction/interactive-component-types": "6.1.0",
|
|
121
|
+
"@memberjunction/lists-base": "6.1.0",
|
|
122
|
+
"@memberjunction/ng-action-gallery": "6.1.0",
|
|
123
|
+
"@memberjunction/ng-actions": "6.1.0",
|
|
124
|
+
"@memberjunction/ng-agent-requests": "6.1.0",
|
|
125
|
+
"@memberjunction/ng-agents": "6.1.0",
|
|
126
|
+
"@memberjunction/ng-ai-test-harness": "6.1.0",
|
|
127
|
+
"@memberjunction/ng-archive-manager": "6.1.0",
|
|
128
|
+
"@memberjunction/ng-base-application": "6.1.0",
|
|
129
|
+
"@memberjunction/ng-base-forms": "6.1.0",
|
|
130
|
+
"@memberjunction/ng-base-types": "6.1.0",
|
|
131
|
+
"@memberjunction/ng-clustering": "6.1.0",
|
|
132
|
+
"@memberjunction/ng-code-editor": "6.1.0",
|
|
133
|
+
"@memberjunction/ng-composer": "6.1.0",
|
|
134
|
+
"@memberjunction/ng-container-directives": "6.1.0",
|
|
135
|
+
"@memberjunction/ng-conversations": "6.1.0",
|
|
136
|
+
"@memberjunction/ng-core-entity-forms": "6.1.0",
|
|
137
|
+
"@memberjunction/ng-credentials": "6.1.0",
|
|
138
|
+
"@memberjunction/ng-dashboard-viewer": "6.1.0",
|
|
139
|
+
"@memberjunction/ng-entity-relationship-diagram": "6.1.0",
|
|
140
|
+
"@memberjunction/ng-entity-viewer": "6.1.0",
|
|
141
|
+
"@memberjunction/ng-explorer-settings": "6.1.0",
|
|
142
|
+
"@memberjunction/ng-export-service": "6.1.0",
|
|
143
|
+
"@memberjunction/ng-filter-builder": "6.1.0",
|
|
144
|
+
"@memberjunction/ng-list-management": "6.1.0",
|
|
145
|
+
"@memberjunction/ng-map-view": "6.1.0",
|
|
146
|
+
"@memberjunction/ng-markdown": "6.1.0",
|
|
147
|
+
"@memberjunction/ng-media-player": "6.1.0",
|
|
148
|
+
"@memberjunction/ng-notifications": "6.1.0",
|
|
149
|
+
"@memberjunction/ng-query-viewer": "6.1.0",
|
|
150
|
+
"@memberjunction/ng-react": "6.1.0",
|
|
151
|
+
"@memberjunction/ng-record-process-studio": "6.1.0",
|
|
152
|
+
"@memberjunction/ng-resource-permissions": "6.1.0",
|
|
153
|
+
"@memberjunction/ng-scheduling": "6.1.0",
|
|
154
|
+
"@memberjunction/ng-search": "6.1.0",
|
|
155
|
+
"@memberjunction/ng-shared": "6.1.0",
|
|
156
|
+
"@memberjunction/ng-shared-generic": "6.1.0",
|
|
157
|
+
"@memberjunction/ng-task-graph-editor": "6.1.0",
|
|
158
|
+
"@memberjunction/ng-tabstrip": "6.1.0",
|
|
159
|
+
"@memberjunction/ng-testing": "6.1.0",
|
|
160
|
+
"@memberjunction/ng-trees": "6.1.0",
|
|
161
|
+
"@memberjunction/ng-ui-components": "6.1.0",
|
|
162
|
+
"@memberjunction/ng-user-routines": "6.1.0",
|
|
163
|
+
"@memberjunction/ng-versions": "6.1.0",
|
|
164
|
+
"@memberjunction/ng-word-cloud": "6.1.0",
|
|
165
|
+
"@memberjunction/predictive-studio-core": "6.1.0",
|
|
166
|
+
"@memberjunction/tag-engine-base": "6.1.0",
|
|
167
|
+
"@memberjunction/templates-base-types": "6.1.0",
|
|
168
|
+
"@memberjunction/testing-engine-base": "6.1.0",
|
|
169
|
+
"@memberjunction/theme-engine": "6.1.0",
|
|
170
170
|
"ag-grid-angular": "^35.0.1",
|
|
171
171
|
"ag-grid-community": "^35.0.1",
|
|
172
172
|
"angular-split": "^20.0.0",
|