@memberjunction/ng-record-changes 5.27.1 → 5.28.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +220 -0
- package/dist/__tests__/restore-version.test.js +102 -152
- package/dist/__tests__/restore-version.test.js.map +1 -1
- package/dist/lib/__tests__/record-changes.test.js +21 -12
- package/dist/lib/__tests__/record-changes.test.js.map +1 -1
- package/dist/lib/ng-record-changes.component.d.ts +171 -49
- package/dist/lib/ng-record-changes.component.d.ts.map +1 -1
- package/dist/lib/ng-record-changes.component.js +645 -416
- package/dist/lib/ng-record-changes.component.js.map +1 -1
- package/dist/lib/ng-record-changes.module.d.ts +6 -5
- package/dist/lib/ng-record-changes.module.d.ts.map +1 -1
- package/dist/lib/ng-record-changes.module.js +9 -4
- package/dist/lib/ng-record-changes.module.js.map +1 -1
- package/dist/lib/restore-preview-panel/restore-preview-panel.component.d.ts +267 -0
- package/dist/lib/restore-preview-panel/restore-preview-panel.component.d.ts.map +1 -0
- package/dist/lib/restore-preview-panel/restore-preview-panel.component.js +748 -0
- package/dist/lib/restore-preview-panel/restore-preview-panel.component.js.map +1 -0
- package/dist/public-api.d.ts +1 -0
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +2 -1
- package/dist/public-api.js.map +1 -1
- package/package.json +8 -7
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"record-changes.test.js","sourceRoot":"","sources":["../../../src/lib/__tests__/record-changes.test.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Tests for record-changes package:\n * - RecordChangesComponent utility methods (pure functions)\n */\nimport { describe, it, expect, vi, beforeEach } from 'vitest';\n\n// Mock Angular\nvi.mock('@angular/core', () => ({\n Component: () => (target: Function) => target,\n Injectable: () => (target: Function) => target,\n Input: () => () => {},\n Output: () => () => {},\n EventEmitter: class { emit() {} },\n ChangeDetectorRef: class { detectChanges() {} markForCheck() {} },\n ChangeDetectionStrategy: { OnPush: 1 },\n ViewEncapsulation: { None: 2 },\n OnInit: class {},\n NgZone: class { run(fn: Function) { return fn(); } },\n}));\n\nvi.mock('@angular/platform-browser', () => ({\n DomSanitizer: class {\n bypassSecurityTrustHtml(html: string) { return html; }\n },\n}));\n\nvi.mock('@memberjunction/core', () => ({\n BaseEntity: class {},\n CompositeKey: class {},\n EntityFieldInfo: class {},\n EntityFieldTSType: { Boolean: 'boolean', Date: 'Date', Number: 'number', String: 'string' },\n Metadata: class {},\n RunView: class {\n RunView = vi.fn().mockResolvedValue({ Success: true, Results: [] });\n },\n}));\n\nvi.mock('@memberjunction/core-entities', () => ({\n MJRecordChangeEntity: class {},\n}));\n\nvi.mock('@memberjunction/ng-notifications', () => ({\n MJNotificationService: class {\n CreateSimpleNotification = vi.fn();\n },\n}));\n\nvi.mock('diff', () => ({\n diffChars: vi.fn(() => []),\n diffWords: vi.fn(() => []),\n}));\n\ndescribe('RecordChangesComponent utility methods', () => {\n let component: InstanceType<typeof import('../ng-record-changes.component').RecordChangesComponent>;\n\n beforeEach(async () => {\n vi.clearAllMocks();\n const mod = await import('../ng-record-changes.component');\n const { ChangeDetectorRef } = await import('@angular/core');\n const { MJNotificationService } = await import('@memberjunction/ng-notifications');\n const { DomSanitizer } = await import('@angular/platform-browser');\n const { NgZone } = await import('@angular/core');\n component = new mod.RecordChangesComponent(\n { detectChanges: vi.fn(), markForCheck: vi.fn() } as unknown as InstanceType<typeof ChangeDetectorRef>,\n { run: (fn: () => void) => fn() } as unknown as InstanceType<typeof NgZone>,\n {} as InstanceType<typeof MJNotificationService>,\n { bypassSecurityTrustHtml: (v: string) => v } as unknown as InstanceType<typeof DomSanitizer>,\n );\n });\n\n describe('getChangeTypeCardClass', () => {\n it('should return correct class for Create', () => {\n expect(component.getChangeTypeCardClass('Create')).toBe('type-create');\n });\n\n it('should return correct class for Update', () => {\n expect(component.getChangeTypeCardClass('Update')).toBe('type-update');\n });\n\n it('should return correct class for Delete', () => {\n expect(component.getChangeTypeCardClass('Delete')).toBe('type-delete');\n });\n\n it('should return type-update for unknown type', () => {\n expect(component.getChangeTypeCardClass('Other')).toBe('type-update');\n });\n });\n\n describe('getChangeTypeBadgeText', () => {\n it('should return Created for Create', () => {\n expect(component.getChangeTypeBadgeText('Create')).toBe('Created');\n });\n\n it('should return Update for Update', () => {\n expect(component.getChangeTypeBadgeText('Update')).toBe('Update');\n });\n\n it('should return Deleted for Delete', () => {\n expect(component.getChangeTypeBadgeText('Delete')).toBe('Deleted');\n });\n });\n\n describe('getSourceClass', () => {\n it('should return source-internal for Internal', () => {\n expect(component.getSourceClass('Internal')).toBe('source-internal');\n });\n\n it('should return source-external for External', () => {\n expect(component.getSourceClass('External')).toBe('source-external');\n });\n });\n\n describe('getStatusClass', () => {\n it('should return status-complete for Complete', () => {\n expect(component.getStatusClass('Complete')).toBe('status-complete');\n });\n\n it('should return status-pending for Pending', () => {\n expect(component.getStatusClass('Pending')).toBe('status-pending');\n });\n\n it('should return status-error for Error', () => {\n expect(component.getStatusClass('Error')).toBe('status-error');\n });\n\n it('should return status-unknown for unknown status', () => {\n expect(component.getStatusClass('Other')).toBe('status-unknown');\n });\n });\n\n describe('getLabelStatusClass', () => {\n it('should return correct classes for Active/Archived/Restored', () => {\n expect(component.getLabelStatusClass('Active')).toBe('label-status-active');\n expect(component.getLabelStatusClass('Archived')).toBe('label-status-archived');\n expect(component.getLabelStatusClass('Restored')).toBe('label-status-restored');\n expect(component.getLabelStatusClass('Unknown')).toBe('');\n });\n });\n\n describe('getUserInitials', () => {\n it('should extract initials from email', () => {\n expect(component.getUserInitials('amith@bluecypress.io')).toBe('AM');\n });\n\n it('should extract initials from name', () => {\n expect(component.getUserInitials('John Doe')).toBe('JD');\n });\n\n it('should handle single word', () => {\n expect(component.getUserInitials('admin')).toBe('AD');\n });\n\n it('should handle null', () => {\n expect(component.getUserInitials(null)).toBe('?');\n });\n });\n\n describe('getUserDisplayName', () => {\n it('should extract local part from email', () => {\n expect(component.getUserDisplayName('amith@bluecypress.io')).toBe('amith');\n });\n\n it('should return name as-is', () => {\n expect(component.getUserDisplayName('John Doe')).toBe('John Doe');\n });\n\n it('should return Unknown for null', () => {\n expect(component.getUserDisplayName(null)).toBe('Unknown');\n });\n });\n\n describe('SetTypeFilter', () => {\n it('should set type filter', () => {\n component.viewData = [];\n component.SetTypeFilter('Update');\n expect(component.selectedType).toBe('Update');\n });\n\n it('should toggle off when same filter clicked', () => {\n component.viewData = [];\n component.SetTypeFilter('Update');\n component.SetTypeFilter('Update');\n expect(component.selectedType).toBe('');\n });\n });\n\n describe('formatRelativeTime', () => {\n it('should return \"Just now\" for very recent dates', () => {\n const now = new Date();\n expect(component.formatRelativeTime(now)).toBe('Just now');\n });\n\n it('should return minutes for recent dates', () => {\n const fiveMinutesAgo = new Date(Date.now() - 5 * 60 * 1000);\n expect(component.formatRelativeTime(fiveMinutesAgo)).toBe('5 mins ago');\n });\n\n it('should return hours for older dates', () => {\n const threeHoursAgo = new Date(Date.now() - 3 * 60 * 60 * 1000);\n expect(component.formatRelativeTime(threeHoursAgo)).toBe('3 hours ago');\n });\n\n it('should return days for dates within a week', () => {\n const twoDaysAgo = new Date(Date.now() - 2 * 24 * 60 * 60 * 1000);\n expect(component.formatRelativeTime(twoDaysAgo)).toBe('2 days ago');\n });\n\n it('should return formatted date for older dates', () => {\n const oldDate = new Date(Date.now() - 30 * 24 * 60 * 60 * 1000);\n const result = component.formatRelativeTime(oldDate);\n expect(result).not.toContain('ago');\n });\n });\n\n describe('formatFullDateTime', () => {\n it('should format date with all parts', () => {\n const date = new Date('2025-03-15T14:30:00Z');\n const result = component.formatFullDateTime(date);\n expect(result).toContain('2025');\n expect(result).toContain('15');\n });\n });\n\n describe('formatTime', () => {\n it('should format time in 12-hour format', () => {\n const date = new Date('2025-03-15T14:30:00');\n const result = component.formatTime(date);\n expect(result).toContain('2:30');\n expect(result).toContain('PM');\n });\n });\n\n describe('toggleExpansion', () => {\n it('should add ID to expanded set', () => {\n component.toggleExpansion('change-1');\n expect(component.expandedItems.has('change-1')).toBe(true);\n });\n\n it('should remove ID from expanded set on second toggle', () => {\n component.toggleExpansion('change-1');\n component.toggleExpansion('change-1');\n expect(component.expandedItems.has('change-1')).toBe(false);\n });\n });\n\n describe('ClearFilters', () => {\n it('should reset all filter state', () => {\n component.searchTerm = 'test';\n component.selectedType = 'Update';\n component.selectedSource = 'Internal';\n component.viewData = [];\n\n component.ClearFilters();\n\n expect(component.searchTerm).toBe('');\n expect(component.selectedType).toBe('');\n expect(component.selectedSource).toBe('');\n });\n });\n\n describe('getChangeSummary', () => {\n it('should return \"Record created\" for Create type', () => {\n const change = { Type: 'Create', ChangesJSON: '{}', ChangesDescription: '' };\n expect(component.getChangeSummary(change as never)).toBe('Record created');\n });\n\n it('should return \"Record deleted\" for Delete type', () => {\n const change = { Type: 'Delete', ChangesJSON: '{}', ChangesDescription: '' };\n expect(component.getChangeSummary(change as never)).toBe('Record deleted');\n });\n });\n});\n"]}
|
|
1
|
+
{"version":3,"file":"record-changes.test.js","sourceRoot":"","sources":["../../../src/lib/__tests__/record-changes.test.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Tests for record-changes package:\n * - RecordChangesComponent utility methods (pure functions)\n */\nimport { describe, it, expect, vi, beforeEach } from 'vitest';\n\n// Mock Angular\nvi.mock('@angular/core', () => ({\n Component: () => (target: Function) => target,\n Injectable: () => (target: Function) => target,\n Input: () => () => {},\n Output: () => () => {},\n EventEmitter: class { emit() {} },\n ChangeDetectorRef: class { detectChanges() {} markForCheck() {} },\n ChangeDetectionStrategy: { OnPush: 1 },\n ViewEncapsulation: { None: 2 },\n OnInit: class {},\n NgZone: class { run(fn: Function) { return fn(); } },\n}));\n\nvi.mock('@angular/platform-browser', () => ({\n DomSanitizer: class {\n bypassSecurityTrustHtml(html: string) { return html; }\n },\n}));\n\nvi.mock('@memberjunction/core', () => ({\n BaseEntity: class {},\n CompositeKey: class {},\n EntityFieldInfo: class {},\n EntityFieldTSType: { Boolean: 'boolean', Date: 'Date', Number: 'number', String: 'string' },\n Metadata: class {},\n RunView: class {\n RunView = vi.fn().mockResolvedValue({ Success: true, Results: [] });\n },\n}));\n\nvi.mock('@memberjunction/core-entities', () => ({\n MJRecordChangeEntity: class {},\n}));\n\nvi.mock('@memberjunction/ng-notifications', () => ({\n MJNotificationService: class {\n CreateSimpleNotification = vi.fn();\n },\n}));\n\nvi.mock('diff', () => ({\n diffChars: vi.fn(() => []),\n diffWords: vi.fn(() => []),\n}));\n\ndescribe('RecordChangesComponent utility methods', () => {\n let component: InstanceType<typeof import('../ng-record-changes.component').RecordChangesComponent>;\n\n beforeEach(async () => {\n vi.clearAllMocks();\n const mod = await import('../ng-record-changes.component');\n const { ChangeDetectorRef } = await import('@angular/core');\n const { MJNotificationService } = await import('@memberjunction/ng-notifications');\n const { DomSanitizer } = await import('@angular/platform-browser');\n const { NgZone } = await import('@angular/core');\n component = new mod.RecordChangesComponent(\n { detectChanges: vi.fn(), markForCheck: vi.fn() } as unknown as InstanceType<typeof ChangeDetectorRef>,\n { run: (fn: () => void) => fn() } as unknown as InstanceType<typeof NgZone>,\n {} as InstanceType<typeof MJNotificationService>,\n { bypassSecurityTrustHtml: (v: string) => v } as unknown as InstanceType<typeof DomSanitizer>,\n );\n });\n\n describe('getChangeTypeCardClass', () => {\n it('should return correct class for Create', () => {\n expect(component.getChangeTypeCardClass('Create')).toBe('type-create');\n });\n\n it('should return correct class for Update', () => {\n expect(component.getChangeTypeCardClass('Update')).toBe('type-update');\n });\n\n it('should return correct class for Delete', () => {\n expect(component.getChangeTypeCardClass('Delete')).toBe('type-delete');\n });\n\n it('should return type-update for unknown type', () => {\n expect(component.getChangeTypeCardClass('Other')).toBe('type-update');\n });\n });\n\n describe('getChangeTypeBadgeText', () => {\n it('should return Created for Create', () => {\n expect(component.getChangeTypeBadgeText('Create')).toBe('Created');\n });\n\n it('should return Update for Update', () => {\n expect(component.getChangeTypeBadgeText('Update')).toBe('Update');\n });\n\n it('should return Deleted for Delete', () => {\n expect(component.getChangeTypeBadgeText('Delete')).toBe('Deleted');\n });\n });\n\n describe('getSourceClass', () => {\n it('should return source-internal for Internal', () => {\n expect(component.getSourceClass('Internal')).toBe('source-internal');\n });\n\n it('should return source-external for External', () => {\n expect(component.getSourceClass('External')).toBe('source-external');\n });\n });\n\n describe('getStatusClass', () => {\n it('should return status-complete for Complete', () => {\n expect(component.getStatusClass('Complete')).toBe('status-complete');\n });\n\n it('should return status-pending for Pending', () => {\n expect(component.getStatusClass('Pending')).toBe('status-pending');\n });\n\n it('should return status-error for Error', () => {\n expect(component.getStatusClass('Error')).toBe('status-error');\n });\n\n it('should return status-unknown for unknown status', () => {\n expect(component.getStatusClass('Other')).toBe('status-unknown');\n });\n });\n\n describe('getLabelStatusClass', () => {\n it('should return correct classes for Active/Archived/Restored', () => {\n expect(component.getLabelStatusClass('Active')).toBe('label-status-active');\n expect(component.getLabelStatusClass('Archived')).toBe('label-status-archived');\n expect(component.getLabelStatusClass('Restored')).toBe('label-status-restored');\n expect(component.getLabelStatusClass('Unknown')).toBe('');\n });\n });\n\n describe('getUserInitials', () => {\n it('should extract initials from email', () => {\n expect(component.getUserInitials('amith@bluecypress.io')).toBe('AM');\n });\n\n it('should extract initials from name', () => {\n expect(component.getUserInitials('John Doe')).toBe('JD');\n });\n\n it('should handle single word', () => {\n expect(component.getUserInitials('admin')).toBe('AD');\n });\n\n it('should handle null', () => {\n expect(component.getUserInitials(null)).toBe('?');\n });\n });\n\n describe('getUserDisplayName', () => {\n it('should extract local part from email', () => {\n expect(component.getUserDisplayName('amith@bluecypress.io')).toBe('amith');\n });\n\n it('should return name as-is', () => {\n expect(component.getUserDisplayName('John Doe')).toBe('John Doe');\n });\n\n it('should return Unknown for null', () => {\n expect(component.getUserDisplayName(null)).toBe('Unknown');\n });\n });\n\n describe('Conditional pill filters', () => {\n it('starts in \"All\" mode (no conditional pills selected)', () => {\n component.viewData = [];\n expect(component.IsAllSelected).toBe(true);\n });\n\n it('TogglePill toggles a pill on then off', () => {\n component.viewData = [];\n component.ChipSelections = { Update: false };\n component.TogglePill('Update');\n expect(component.ChipSelections['Update']).toBe(true);\n component.TogglePill('Update');\n expect(component.ChipSelections['Update']).toBe(false);\n });\n\n it('SelectAllPill clears every conditional selection', () => {\n component.viewData = [];\n component.ChipSelections = { Update: true, Create: true };\n component.SelectAllPill();\n expect(component.ChipSelections['Update']).toBe(false);\n expect(component.ChipSelections['Create']).toBe(false);\n expect(component.IsAllSelected).toBe(true);\n });\n });\n\n describe('formatRelativeTime', () => {\n it('should return \"Just now\" for very recent dates', () => {\n const now = new Date();\n expect(component.formatRelativeTime(now)).toBe('Just now');\n });\n\n it('should return minutes for recent dates', () => {\n const fiveMinutesAgo = new Date(Date.now() - 5 * 60 * 1000);\n expect(component.formatRelativeTime(fiveMinutesAgo)).toBe('5 mins ago');\n });\n\n it('should return hours for older dates', () => {\n const threeHoursAgo = new Date(Date.now() - 3 * 60 * 60 * 1000);\n expect(component.formatRelativeTime(threeHoursAgo)).toBe('3 hours ago');\n });\n\n it('should return days for dates within a week', () => {\n const twoDaysAgo = new Date(Date.now() - 2 * 24 * 60 * 60 * 1000);\n expect(component.formatRelativeTime(twoDaysAgo)).toBe('2 days ago');\n });\n\n it('should return formatted date for older dates', () => {\n const oldDate = new Date(Date.now() - 30 * 24 * 60 * 60 * 1000);\n const result = component.formatRelativeTime(oldDate);\n expect(result).not.toContain('ago');\n });\n });\n\n describe('formatFullDateTime', () => {\n it('should format date with all parts', () => {\n const date = new Date('2025-03-15T14:30:00Z');\n const result = component.formatFullDateTime(date);\n expect(result).toContain('2025');\n expect(result).toContain('15');\n });\n });\n\n describe('formatTime', () => {\n it('should format time in 12-hour format', () => {\n const date = new Date('2025-03-15T14:30:00');\n const result = component.formatTime(date);\n expect(result).toContain('2:30');\n expect(result).toContain('PM');\n });\n });\n\n describe('toggleExpansion', () => {\n it('should add ID to expanded set', () => {\n component.toggleExpansion('change-1');\n expect(component.expandedItems.has('change-1')).toBe(true);\n });\n\n it('should remove ID from expanded set on second toggle', () => {\n component.toggleExpansion('change-1');\n component.toggleExpansion('change-1');\n expect(component.expandedItems.has('change-1')).toBe(false);\n });\n });\n\n describe('ClearFilters', () => {\n it('should reset all filter state', () => {\n component.searchTerm = 'test';\n component.ChipSelections = { Update: true, Restore: true };\n component.viewData = [];\n\n component.ClearFilters();\n\n expect(component.searchTerm).toBe('');\n expect(component.ChipSelections['Update']).toBe(false);\n expect(component.ChipSelections['Restore']).toBe(false);\n expect(component.IsAllSelected).toBe(true);\n });\n });\n\n describe('getChangeSummary', () => {\n it('should return \"Record created\" for Create type', () => {\n const change = { Type: 'Create', ChangesJSON: '{}', ChangesDescription: '' };\n expect(component.getChangeSummary(change as never)).toBe('Record created');\n });\n\n it('should return \"Record deleted\" for Delete type', () => {\n const change = { Type: 'Delete', ChangesJSON: '{}', ChangesDescription: '' };\n expect(component.getChangeSummary(change as never)).toBe('Record deleted');\n });\n });\n});\n"]}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import { EventEmitter, OnInit, ChangeDetectorRef, NgZone } from '@angular/core';
|
|
1
|
+
import { EventEmitter, OnDestroy, OnInit, ChangeDetectorRef, NgZone } from '@angular/core';
|
|
2
2
|
import { DomSanitizer, SafeHtml } from '@angular/platform-browser';
|
|
3
3
|
import { BaseEntity, CompositeKey } from '@memberjunction/core';
|
|
4
4
|
import { MJRecordChangeEntity } from '@memberjunction/core-entities';
|
|
5
5
|
import { MJNotificationService } from '@memberjunction/ng-notifications';
|
|
6
|
+
import { RestoreCommitEvent } from './restore-preview-panel/restore-preview-panel.component';
|
|
6
7
|
import * as i0 from "@angular/core";
|
|
7
8
|
/** Lightweight shape for displaying a version label associated with this record */
|
|
8
9
|
interface RecordLabel {
|
|
@@ -15,23 +16,35 @@ interface RecordLabel {
|
|
|
15
16
|
ItemCount: number;
|
|
16
17
|
}
|
|
17
18
|
/**
|
|
18
|
-
* Event payload emitted when the user
|
|
19
|
-
*
|
|
19
|
+
* Event payload emitted when the user confirms a restore.
|
|
20
|
+
*
|
|
21
|
+
* The host component (typically `record-form-container`) is responsible for:
|
|
22
|
+
* 1. Reloading the live record (concurrency safety),
|
|
23
|
+
* 2. Calling `record.SetRestoreContext(SourceChangeID, Reason)`,
|
|
24
|
+
* 3. Calling `record.Set(FieldName, Value)` for each entry in `FieldValues`,
|
|
25
|
+
* 4. Calling `record.Save()`,
|
|
26
|
+
* 5. Calling `record.ClearRestoreContext()` after the save returns.
|
|
27
|
+
*
|
|
28
|
+
* The provider will write a new RecordChange row with `Source='Restore'`,
|
|
29
|
+
* `RestoredFromID = SourceChangeID`, and `RestoreReason = Reason` —
|
|
30
|
+
* producing the auditable lineage chain.
|
|
20
31
|
*/
|
|
21
32
|
export interface RestoreVersionEvent {
|
|
22
|
-
/**
|
|
23
|
-
|
|
24
|
-
/** When the
|
|
33
|
+
/** ID of the historical RecordChange row whose state is being restored. */
|
|
34
|
+
SourceChangeID: string;
|
|
35
|
+
/** When the historical change was made. */
|
|
25
36
|
ChangedAt: Date;
|
|
26
|
-
/**
|
|
37
|
+
/** Display name / email of who made the historical change. */
|
|
27
38
|
ChangedByUser: string;
|
|
28
|
-
/**
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
39
|
+
/** Optional user-entered reason for the restore. */
|
|
40
|
+
Reason: string | null;
|
|
41
|
+
/** Selected field values, ready to pass to BaseEntity.Set(). */
|
|
42
|
+
FieldValues: Array<{
|
|
43
|
+
FieldName: string;
|
|
44
|
+
Value: unknown;
|
|
32
45
|
}>;
|
|
33
46
|
}
|
|
34
|
-
/** A single field change with type-aware rendering info */
|
|
47
|
+
/** A single field change with type-aware rendering info (timeline display only). */
|
|
35
48
|
export interface FieldChangeInfo {
|
|
36
49
|
field: string;
|
|
37
50
|
displayName: string;
|
|
@@ -40,20 +53,39 @@ export interface FieldChangeInfo {
|
|
|
40
53
|
fieldType: 'boolean' | 'date' | 'number' | 'text';
|
|
41
54
|
diffHtml?: SafeHtml;
|
|
42
55
|
}
|
|
43
|
-
/** A
|
|
44
|
-
export interface RestoreFieldDiff {
|
|
45
|
-
FieldName: string;
|
|
46
|
-
DisplayName: string;
|
|
47
|
-
VersionValue: string;
|
|
48
|
-
CurrentValue: string;
|
|
49
|
-
IsChanged: boolean;
|
|
50
|
-
}
|
|
51
|
-
/** A group of changes that share the same date */
|
|
56
|
+
/** A group of changes that share the same date. */
|
|
52
57
|
export interface DateGroup {
|
|
53
58
|
label: string;
|
|
54
59
|
changes: MJRecordChangeEntity[];
|
|
55
60
|
}
|
|
56
|
-
|
|
61
|
+
/** A conditional filter pill (one per type/source actually present in loaded data). */
|
|
62
|
+
export interface FilterPill {
|
|
63
|
+
/** Unique key for selection state ('Update', 'Create', 'Delete', 'Snapshot', 'Restore'). */
|
|
64
|
+
Key: string;
|
|
65
|
+
/** User-facing label (pluralized: 'Updates', 'Restored', etc.). */
|
|
66
|
+
Label: string;
|
|
67
|
+
/** Font Awesome icon class. */
|
|
68
|
+
Icon: string;
|
|
69
|
+
/** Number of changes of this kind in the loaded data. */
|
|
70
|
+
Count: number;
|
|
71
|
+
/** Selection style — neutral type pill or violet restore pill. */
|
|
72
|
+
Variant: 'type' | 'restore';
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Slide-out timeline of all changes to a single record. Hosts the reusable
|
|
76
|
+
* {@link RestorePreviewPanelComponent} for the actual restore confirmation
|
|
77
|
+
* flow, and exposes a `RestoreRequested` event the host can act on to
|
|
78
|
+
* persist the restore.
|
|
79
|
+
*
|
|
80
|
+
* @example
|
|
81
|
+
* <mj-record-changes
|
|
82
|
+
* [record]="myEntity"
|
|
83
|
+
* [AllowRestore]="true"
|
|
84
|
+
* (dialogClosed)="showHistory = false"
|
|
85
|
+
* (RestoreRequested)="onRestoreRequested($event)">
|
|
86
|
+
* </mj-record-changes>
|
|
87
|
+
*/
|
|
88
|
+
export declare class RecordChangesComponent implements OnInit, OnDestroy {
|
|
57
89
|
private cdr;
|
|
58
90
|
private ngZone;
|
|
59
91
|
private mjNotificationService;
|
|
@@ -65,28 +97,60 @@ export declare class RecordChangesComponent implements OnInit {
|
|
|
65
97
|
/** Whether to show a "Restore" button on each historical version row. Default false. */
|
|
66
98
|
AllowRestore: boolean;
|
|
67
99
|
/**
|
|
68
|
-
* Emitted when the user
|
|
69
|
-
* The
|
|
100
|
+
* Emitted when the user confirms a restore in the preview panel.
|
|
101
|
+
* The host is responsible for applying the snapshot to the record and
|
|
102
|
+
* saving with `record.SetRestoreContext()` set first.
|
|
70
103
|
*/
|
|
71
104
|
RestoreRequested: EventEmitter<RestoreVersionEvent>;
|
|
72
105
|
viewData: MJRecordChangeEntity[];
|
|
73
106
|
filteredData: MJRecordChangeEntity[];
|
|
74
107
|
dateGroups: DateGroup[];
|
|
75
108
|
expandedItems: Set<string>;
|
|
76
|
-
/** The change record
|
|
77
|
-
|
|
78
|
-
/**
|
|
79
|
-
|
|
80
|
-
/** Whether the restore
|
|
109
|
+
/** The change record currently selected for restore preview, or null. */
|
|
110
|
+
RestorePreviewChange: MJRecordChangeEntity | null;
|
|
111
|
+
/** Visibility of the embedded restore preview slide-in. */
|
|
112
|
+
RestorePreviewVisible: boolean;
|
|
113
|
+
/** Whether the restore commit is in progress (between confirmation and host response). */
|
|
81
114
|
IsRestoring: boolean;
|
|
82
115
|
RecordLabels: RecordLabel[];
|
|
83
116
|
IsLoadingLabels: boolean;
|
|
84
117
|
ShowCreateWizard: boolean;
|
|
85
118
|
searchTerm: string;
|
|
119
|
+
/** Single selected type filter (legacy, kept for backwards compat). */
|
|
86
120
|
selectedType: string;
|
|
87
121
|
selectedSource: string;
|
|
122
|
+
/** Map of Key → selected, used by the conditional chip system. */
|
|
123
|
+
ChipSelections: Record<string, boolean>;
|
|
124
|
+
/** Whether the overflow popover is open. */
|
|
125
|
+
ShowFilterOverflow: boolean;
|
|
126
|
+
/** Highlighted change ID for the lineage-jump indicator (transient). */
|
|
127
|
+
HighlightedChangeID: string | null;
|
|
128
|
+
/**
|
|
129
|
+
* Conditional filter pills derived from loaded data. Always includes 'All'
|
|
130
|
+
* implicitly. Other pills only render when at least one matching change
|
|
131
|
+
* exists. Overflows into a popover when the count exceeds 2.
|
|
132
|
+
*/
|
|
133
|
+
ConditionalPills: FilterPill[];
|
|
134
|
+
/** Threshold above which conditional chips collapse into the overflow popover. */
|
|
135
|
+
private readonly OVERFLOW_THRESHOLD;
|
|
136
|
+
/**
|
|
137
|
+
* Subscription to the record's BaseEntity event stream. We listen for
|
|
138
|
+
* 'save' events and auto-refresh the timeline so the user immediately
|
|
139
|
+
* sees the new RecordChange row produced by either a normal save or a
|
|
140
|
+
* restore. Cleaned up in ngOnDestroy.
|
|
141
|
+
*/
|
|
142
|
+
private _entitySaveSub;
|
|
88
143
|
constructor(cdr: ChangeDetectorRef, ngZone: NgZone, mjNotificationService: MJNotificationService, sanitizer: DomSanitizer);
|
|
89
144
|
ngOnInit(): void;
|
|
145
|
+
ngOnDestroy(): void;
|
|
146
|
+
/**
|
|
147
|
+
* Wires up an event handler on the live record so the timeline auto-
|
|
148
|
+
* refreshes immediately after any save lands — including the one
|
|
149
|
+
* produced by the restore flow. Without this the user sees their record
|
|
150
|
+
* update in the form but the panel above still shows the pre-restore
|
|
151
|
+
* change list, which is confusing.
|
|
152
|
+
*/
|
|
153
|
+
private subscribeToRecordSaves;
|
|
90
154
|
/**
|
|
91
155
|
* Reloads the record changes list from the database.
|
|
92
156
|
* Called by the parent container after a save completes while the drawer is open.
|
|
@@ -96,8 +160,38 @@ export declare class RecordChangesComponent implements OnInit {
|
|
|
96
160
|
LoadRecordChanges(pkey: CompositeKey, appName: string, entityName: string): Promise<void>;
|
|
97
161
|
onSearchChange(): void;
|
|
98
162
|
onFilterChange(): void;
|
|
99
|
-
|
|
163
|
+
/**
|
|
164
|
+
* Toggles the "All" pill — clears every conditional selection.
|
|
165
|
+
*/
|
|
166
|
+
SelectAllPill(): void;
|
|
167
|
+
/**
|
|
168
|
+
* Toggles a conditional pill on/off.
|
|
169
|
+
*/
|
|
170
|
+
TogglePill(key: string): void;
|
|
171
|
+
/**
|
|
172
|
+
* Returns true when no conditional pills are selected (i.e. "All" mode).
|
|
173
|
+
*/
|
|
174
|
+
get IsAllSelected(): boolean;
|
|
175
|
+
/**
|
|
176
|
+
* Whether any conditional pills are actually visible at all.
|
|
177
|
+
*/
|
|
178
|
+
get HasConditionalPills(): boolean;
|
|
179
|
+
/**
|
|
180
|
+
* True when the conditional chips should collapse into an overflow popover
|
|
181
|
+
* because there are more than the threshold.
|
|
182
|
+
*/
|
|
183
|
+
get UseOverflowPopover(): boolean;
|
|
184
|
+
/** Number of currently selected conditional pills (for the popover trigger label). */
|
|
185
|
+
get SelectedConditionalCount(): number;
|
|
186
|
+
ToggleFilterOverflow(): void;
|
|
187
|
+
CloseFilterOverflow(): void;
|
|
100
188
|
ClearFilters(): void;
|
|
189
|
+
/**
|
|
190
|
+
* Builds the list of conditional pills from currently loaded data —
|
|
191
|
+
* a pill only appears for change types/sources that actually exist.
|
|
192
|
+
*/
|
|
193
|
+
private rebuildConditionalPills;
|
|
194
|
+
private isRestoreChange;
|
|
101
195
|
private applyFilters;
|
|
102
196
|
LoadRecordLabels(): Promise<void>;
|
|
103
197
|
OpenCreateWizard(): void;
|
|
@@ -110,31 +204,63 @@ export declare class RecordChangesComponent implements OnInit {
|
|
|
110
204
|
toggleExpansion(changeId: string): void;
|
|
111
205
|
onTimelineItemKeydown(event: KeyboardEvent, changeId: string): void;
|
|
112
206
|
/**
|
|
113
|
-
* Opens the
|
|
114
|
-
*
|
|
207
|
+
* Opens the embedded restore preview panel for a given change record.
|
|
208
|
+
* The panel computes a full-record diff (current vs the change's
|
|
209
|
+
* FullRecordJSON snapshot) — this is the semantic-correctness fix:
|
|
210
|
+
* we restore TO the state at that point in time, not just undo the
|
|
211
|
+
* one delta the user clicked.
|
|
115
212
|
*/
|
|
116
213
|
OnRestoreVersion(change: MJRecordChangeEntity, event: MouseEvent): void;
|
|
117
|
-
/** Closes the restore preview panel without applying changes. */
|
|
118
|
-
CancelRestorePreview(): void;
|
|
119
214
|
/**
|
|
120
|
-
*
|
|
121
|
-
*
|
|
215
|
+
* Called when the user confirms the restore in the embedded panel.
|
|
216
|
+
* Translates the panel's RestoreCommitEvent into the broader-shape
|
|
217
|
+
* RestoreVersionEvent the host is wired to handle.
|
|
218
|
+
*/
|
|
219
|
+
OnRestorePanelConfirmed(commit: RestoreCommitEvent): void;
|
|
220
|
+
/**
|
|
221
|
+
* Called when the user dismisses the restore preview without confirming.
|
|
222
|
+
*/
|
|
223
|
+
OnRestorePanelCancelled(): void;
|
|
224
|
+
/**
|
|
225
|
+
* Returns the source change for a given restored row, if found in the
|
|
226
|
+
* currently loaded changes. Returns null when the source isn't loaded
|
|
227
|
+
* (e.g., it's been pruned from history) or when this row isn't a restore.
|
|
228
|
+
*/
|
|
229
|
+
getRestoredFromSourceChange(change: MJRecordChangeEntity): MJRecordChangeEntity | null;
|
|
230
|
+
/**
|
|
231
|
+
* True when the row was produced by a restore operation (either the
|
|
232
|
+
* `Source` is `'Restore'` OR `RestoredFromID` is populated).
|
|
233
|
+
*/
|
|
234
|
+
isRestoreRow(change: MJRecordChangeEntity): boolean;
|
|
235
|
+
/**
|
|
236
|
+
* True when this change is the most recent in the loaded history.
|
|
237
|
+
* `viewData` is sorted DESC by `ChangedAt`, so the most recent is index 0.
|
|
238
|
+
* Restoring to the most recent version is a no-op, so the timeline hides
|
|
239
|
+
* the Restore button on this row.
|
|
122
240
|
*/
|
|
123
|
-
|
|
241
|
+
isMostRecentChange(change: MJRecordChangeEntity): boolean;
|
|
124
242
|
/**
|
|
125
|
-
*
|
|
243
|
+
* Click handler for the lineage chip — scrolls/highlights the source
|
|
244
|
+
* change row in the timeline. Auto-clears after a few seconds.
|
|
126
245
|
*/
|
|
127
|
-
|
|
128
|
-
/** Gets the current value of a field from the live record, formatted for display. */
|
|
129
|
-
private getCurrentFieldValue;
|
|
130
|
-
/** Parses ChangesJSON into a structured map, returning null on failure. */
|
|
131
|
-
private parseChangesJson;
|
|
132
|
-
/** Parses field changes into the RestoreVersionEvent format. */
|
|
133
|
-
private parseFieldChanges;
|
|
246
|
+
JumpToSourceChange(sourceChange: MJRecordChangeEntity, event: MouseEvent): void;
|
|
134
247
|
private buildDateGroups;
|
|
135
248
|
private formatDateGroupLabel;
|
|
136
249
|
getChangeTypeCardClass(type: string): string;
|
|
137
250
|
getChangeTypeBadgeText(type: string): string;
|
|
251
|
+
/**
|
|
252
|
+
* Badge text for the row's primary type tag. For restore rows we override
|
|
253
|
+
* the underlying `Type='Update'` and show "Restore" instead — matches the
|
|
254
|
+
* mockup's intent of treating restore as a first-class operation in the
|
|
255
|
+
* timeline rather than a flavor of update.
|
|
256
|
+
*/
|
|
257
|
+
getEffectiveBadgeText(change: MJRecordChangeEntity): string;
|
|
258
|
+
/**
|
|
259
|
+
* Optional restore reason — pulled from the dynamic `RestoreReason`
|
|
260
|
+
* column added by the lineage migration. Returns null when not present
|
|
261
|
+
* or not a restore row.
|
|
262
|
+
*/
|
|
263
|
+
getRestoreReason(change: MJRecordChangeEntity): string | null;
|
|
138
264
|
getSourceClass(source: string): string;
|
|
139
265
|
getStatusClass(status: string): string;
|
|
140
266
|
getTimelineItemLabel(change: MJRecordChangeEntity): string;
|
|
@@ -156,10 +282,6 @@ export declare class RecordChangesComponent implements OnInit {
|
|
|
156
282
|
displayName: string;
|
|
157
283
|
value: string;
|
|
158
284
|
}>;
|
|
159
|
-
/**
|
|
160
|
-
* Formats a change value for display. Handles corrupted date values (stored as empty objects)
|
|
161
|
-
* and formats ISO date strings into a human-readable format.
|
|
162
|
-
*/
|
|
163
285
|
private formatChangeValue;
|
|
164
286
|
private generateDiffHtml;
|
|
165
287
|
private shouldUseWordDiff;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ng-record-changes.component.d.ts","sourceRoot":"","sources":["../../src/lib/ng-record-changes.component.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"ng-record-changes.component.d.ts","sourceRoot":"","sources":["../../src/lib/ng-record-changes.component.ts"],"names":[],"mappings":"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"}
|