@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.
@@ -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 requests to restore a previous version.
19
- * The parent component is responsible for applying the old field values and saving.
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
- /** The ID of the MJ: Record Changes record being restored */
23
- VersionID: string;
24
- /** When the version was created */
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
- /** User who made the change */
37
+ /** Display name / email of who made the historical change. */
27
38
  ChangedByUser: string;
28
- /** Map of field name to old/new values from this change */
29
- FieldChanges: Record<string, {
30
- OldValue: unknown;
31
- NewValue: unknown;
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 single field in the restore preview, comparing version value vs current record value */
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
- export declare class RecordChangesComponent implements OnInit {
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 clicks Restore on a historical version.
69
- * The parent is responsible for loading old values into the record and saving.
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 being previewed for restore, or null if no preview is active */
77
- RestorePreview: MJRecordChangeEntity | null;
78
- /** Parsed field-level diff for the restore preview */
79
- RestorePreviewFields: RestoreFieldDiff[];
80
- /** Whether the restore operation is in progress */
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
- SetTypeFilter(type: string): void;
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 inline restore preview panel for a given change record.
114
- * Computes a field-by-field diff between the version's old values and the current record.
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
- * Confirms the restore: emits a RestoreVersionEvent with the old field values
121
- * so the parent (record-form-container) can apply them and save.
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
- ConfirmRestore(): void;
241
+ isMostRecentChange(change: MJRecordChangeEntity): boolean;
124
242
  /**
125
- * Builds the diff list comparing version old values vs the current record.
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
- private buildRestorePreviewFields;
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":"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"}
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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"}