@memberjunction/ng-record-changes 2.41.0 → 2.42.1

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,32 +1,61 @@
1
1
  import { EventEmitter, OnInit, Renderer2, ElementRef, AfterViewInit, OnDestroy } from '@angular/core';
2
- import { DomSanitizer } from '@angular/platform-browser';
2
+ import { DomSanitizer, SafeHtml } from '@angular/platform-browser';
3
3
  import { SortDescriptor } from '@progress/kendo-data-query';
4
- import { BaseEntity } from '@memberjunction/core';
4
+ import { BaseEntity, CompositeKey } from '@memberjunction/core';
5
+ import { RecordChangeEntity } from '@memberjunction/core-entities';
6
+ import { MJNotificationService } from '@memberjunction/ng-notifications';
5
7
  import * as i0 from "@angular/core";
6
8
  export declare class RecordChangesComponent implements OnInit, AfterViewInit, OnDestroy {
7
- private sanitizer;
8
9
  private renderer;
10
+ private mjNotificationService;
11
+ private sanitizer;
9
12
  showloader: boolean;
10
13
  dialogClosed: EventEmitter<any>;
11
14
  record: BaseEntity;
12
15
  wrapper: ElementRef;
13
- viewData: any;
14
- visibleColumns: any;
16
+ viewData: RecordChangeEntity[];
17
+ filteredData: RecordChangeEntity[];
18
+ expandedItems: Set<string>;
19
+ searchTerm: string;
20
+ selectedType: string;
21
+ selectedSource: string;
15
22
  sortSettings: SortDescriptor[];
16
- constructor(sanitizer: DomSanitizer, renderer: Renderer2);
23
+ constructor(renderer: Renderer2, mjNotificationService: MJNotificationService, sanitizer: DomSanitizer);
17
24
  ngOnInit(): void;
18
25
  ngAfterViewInit(): void;
19
26
  ngOnDestroy(): void;
20
- LoadRecordChanges(KeyValuePairString: string, appName: string, entityName: string): Promise<void>;
21
- prepareColumns(): void;
27
+ LoadRecordChanges(pkey: CompositeKey, appName: string, entityName: string): Promise<void>;
22
28
  closePropertiesDialog(): void;
23
- FormatColumnValue(col: any, value: any, dataItem: any, maxLength?: number, trailingChars?: string): any;
24
- protected fieldMarkup(fieldName: string): string;
25
- protected valueMarkup(changeInfo: {
29
+ onSearchChange(): void;
30
+ onFilterChange(): void;
31
+ private applyFilters;
32
+ toggleExpansion(changeId: string): void;
33
+ onTimelineItemKeydown(event: KeyboardEvent, changeId: string): void;
34
+ getChangeTypeClass(type: string): string;
35
+ getChangeTypeIcon(type: string): string;
36
+ getChangeTypeBadgeClass(type: string): string;
37
+ getSourceClass(source: string): string;
38
+ getStatusClass(status: string): string;
39
+ getTimelineItemLabel(change: RecordChangeEntity): string;
40
+ formatRelativeTime(date: Date): string;
41
+ formatFullDateTime(date: Date): string;
42
+ getChangeSummary(change: RecordChangeEntity): string;
43
+ getFieldChanges(change: RecordChangeEntity): Array<{
26
44
  field: string;
45
+ displayName: string;
27
46
  oldValue: any;
28
47
  newValue: any;
29
- }, isOldValue: boolean): string;
48
+ isBooleanField: boolean;
49
+ diffHtml?: SafeHtml;
50
+ }>;
51
+ getCreatedFields(change: RecordChangeEntity): Array<{
52
+ name: string;
53
+ displayName: string;
54
+ value: any;
55
+ }>;
56
+ private generateDiffHtml;
57
+ private shouldUseWordDiff;
58
+ private escapeHtml;
30
59
  static ɵfac: i0.ɵɵFactoryDeclaration<RecordChangesComponent, never>;
31
60
  static ɵcmp: i0.ɵɵComponentDeclaration<RecordChangesComponent, "mj-record-changes", never, { "record": { "alias": "record"; "required": false; }; }, { "dialogClosed": "dialogClosed"; }, never, never, false, never>;
32
61
  }
@@ -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,EAAa,YAAY,EAAS,MAAM,EAAU,SAAS,EAAE,UAAU,EAAE,aAAa,EAAE,SAAS,EAAa,MAAM,eAAe,CAAC;AAC3I,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAyD,MAAM,sBAAsB,CAAC;;AAEzG,qBAKa,sBAAuB,YAAW,MAAM,EAAE,aAAa,EAAE,SAAS;IAkBjE,OAAO,CAAC,SAAS;IAAgB,OAAO,CAAC,QAAQ;IAjBtD,UAAU,EAAE,OAAO,CAAS;IACzB,YAAY,oBAAsB;IACnC,MAAM,EAAG,UAAU,CAAC;IAEwB,OAAO,EAAG,UAAU,CAAC;IAG1E,QAAQ,EAAE,GAAG,CAAM;IACnB,cAAc,EAAE,GAAG,CAAM;IACzB,YAAY,EAAE,cAAc,EAAE,CAK5B;gBAGkB,SAAS,EAAE,YAAY,EAAU,QAAQ,EAAE,SAAS;IAExE,QAAQ,IAAI,IAAI;IAQhB,eAAe,IAAI,IAAI;IAMvB,WAAW,IAAI,IAAI;IAMb,iBAAiB,CAAC,kBAAkB,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM;IAevF,cAAc;IAcd,qBAAqB;IAIrB,iBAAiB,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,SAAS,GAAE,MAAU,EAAE,aAAa,GAAE,MAAc;IAiE3G,SAAS,CAAC,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAGhD,SAAS,CAAC,WAAW,CAAC,UAAU,EAAE;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,GAAG,CAAC;QAAC,QAAQ,EAAE,GAAG,CAAA;KAAC,EAAE,UAAU,EAAE,OAAO,GAAG,MAAM;yCA7IlG,sBAAsB;2CAAtB,sBAAsB;CAgJlC"}
1
+ {"version":3,"file":"ng-record-changes.component.d.ts","sourceRoot":"","sources":["../../src/lib/ng-record-changes.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,YAAY,EAAS,MAAM,EAAU,SAAS,EAAE,UAAU,EAAE,aAAa,EAAE,SAAS,EAAgC,MAAM,eAAe,CAAC;AAC9J,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,YAAY,EAAgD,MAAM,sBAAsB,CAAC;AAC9G,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;;AAGzE,qBAMa,sBAAuB,YAAW,MAAM,EAAE,aAAa,EAAE,SAAS;IAwBjE,OAAO,CAAC,QAAQ;IAAa,OAAO,CAAC,qBAAqB;IAAyB,OAAO,CAAC,SAAS;IAvBzG,UAAU,EAAE,OAAO,CAAS;IACzB,YAAY,oBAAsB;IACnC,MAAM,EAAG,UAAU,CAAC;IAEwB,OAAO,EAAG,UAAU,CAAC;IAE1E,QAAQ,EAAE,kBAAkB,EAAE,CAAM;IACpC,YAAY,EAAE,kBAAkB,EAAE,CAAM;IACxC,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,CAAa;IAGvC,UAAU,EAAE,MAAM,CAAM;IACxB,YAAY,EAAE,MAAM,CAAM;IAC1B,cAAc,EAAE,MAAM,CAAM;IAE5B,YAAY,EAAE,cAAc,EAAE,CAK5B;gBAGkB,QAAQ,EAAE,SAAS,EAAU,qBAAqB,EAAE,qBAAqB,EAAU,SAAS,EAAE,YAAY;IAE9H,QAAQ,IAAI,IAAI;IAOhB,eAAe,IAAI,IAAI;IAMvB,WAAW,IAAI,IAAI;IAMN,iBAAiB,CAAC,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM;IAetF,qBAAqB;IAKrB,cAAc,IAAI,IAAI;IAItB,cAAc,IAAI,IAAI;IAItB,OAAO,CAAC,YAAY;IA2BpB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAQvC,qBAAqB,CAAC,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAQnE,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IASxC,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IASvC,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAS7C,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAItC,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAStC,oBAAoB,CAAC,MAAM,EAAE,kBAAkB,GAAG,MAAM;IAIxD,kBAAkB,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM;IAmBtC,kBAAkB,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM;IAYtC,gBAAgB,CAAC,MAAM,EAAE,kBAAkB,GAAG,MAAM;IAwCpD,eAAe,CAAC,MAAM,EAAE,kBAAkB,GAAG,KAAK,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,GAAG,CAAC;QAAC,QAAQ,EAAE,GAAG,CAAC;QAAC,cAAc,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,EAAE,QAAQ,CAAA;KAAC,CAAC;IAuCpK,gBAAgB,CAAC,MAAM,EAAE,kBAAkB,GAAG,KAAK,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,GAAG,CAAA;KAAC,CAAC;IAmBpG,OAAO,CAAC,gBAAgB;IAoCxB,OAAO,CAAC,iBAAiB;IAUzB,OAAO,CAAC,UAAU;yCA/UP,sBAAsB;2CAAtB,sBAAsB;CAoVlC"}
@@ -7,56 +7,372 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
7
7
  step((generator = generator.apply(thisArg, _arguments || [])).next());
8
8
  });
9
9
  };
10
- import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core';
11
- import { EntityFieldTSType, LogError, RunView } from '@memberjunction/core';
10
+ import { Component, EventEmitter, Input, Output, ViewChild, ViewEncapsulation } from '@angular/core';
11
+ import { EntityFieldTSType, Metadata } from '@memberjunction/core';
12
+ import { diffChars, diffWords } from 'diff';
12
13
  import * as i0 from "@angular/core";
13
- import * as i1 from "@angular/platform-browser";
14
- import * as i2 from "@angular/common";
15
- import * as i3 from "@progress/kendo-angular-grid";
16
- import * as i4 from "@progress/kendo-angular-dialog";
17
- import * as i5 from "@progress/kendo-angular-indicators";
14
+ import * as i1 from "@memberjunction/ng-notifications";
15
+ import * as i2 from "@angular/platform-browser";
16
+ import * as i3 from "@angular/common";
17
+ import * as i4 from "@angular/forms";
18
+ import * as i5 from "@progress/kendo-angular-dialog";
19
+ import * as i6 from "@progress/kendo-angular-indicators";
18
20
  const _c0 = ["recordChangesWrapper"];
19
- const _c1 = () => ({ "font-weight": "bold", "background-color": "#a9c2af" });
21
+ const _forTrack0 = ($index, $item) => $item.ID;
22
+ const _forTrack1 = ($index, $item) => $item.name;
23
+ const _forTrack2 = ($index, $item) => $item.field;
20
24
  function RecordChangesComponent_kendo_loader_4_Template(rf, ctx) { if (rf & 1) {
21
25
  i0.ɵɵelement(0, "kendo-loader", 6);
22
26
  } }
23
- function RecordChangesComponent_div_5_kendo_grid_column_4_ng_template_1_Template(rf, ctx) { if (rf & 1) {
24
- i0.ɵɵelement(0, "span", 13);
27
+ function RecordChangesComponent_Conditional_5_Conditional_21_Template(rf, ctx) { if (rf & 1) {
28
+ i0.ɵɵelementStart(0, "div", 18);
29
+ i0.ɵɵtext(1);
30
+ i0.ɵɵelementEnd();
31
+ } if (rf & 2) {
32
+ const ctx_r2 = i0.ɵɵnextContext(2);
33
+ i0.ɵɵadvance();
34
+ i0.ɵɵtextInterpolate2(" Showing ", ctx_r2.filteredData.length, " of ", ctx_r2.viewData.length, " changes ");
35
+ } }
36
+ function RecordChangesComponent_Conditional_5_Conditional_23_Conditional_1_Template(rf, ctx) { if (rf & 1) {
37
+ i0.ɵɵelement(0, "i", 22);
38
+ i0.ɵɵtext(1, " No changes found for this record. ");
39
+ } }
40
+ function RecordChangesComponent_Conditional_5_Conditional_23_Conditional_2_Template(rf, ctx) { if (rf & 1) {
41
+ i0.ɵɵelement(0, "i", 23);
42
+ i0.ɵɵtext(1, " No changes match your current filters. ");
43
+ } }
44
+ function RecordChangesComponent_Conditional_5_Conditional_23_Template(rf, ctx) { if (rf & 1) {
45
+ i0.ɵɵelementStart(0, "div", 20);
46
+ i0.ɵɵtemplate(1, RecordChangesComponent_Conditional_5_Conditional_23_Conditional_1_Template, 2, 0)(2, RecordChangesComponent_Conditional_5_Conditional_23_Conditional_2_Template, 2, 0);
47
+ i0.ɵɵelementEnd();
48
+ } if (rf & 2) {
49
+ const ctx_r2 = i0.ɵɵnextContext(2);
50
+ i0.ɵɵadvance();
51
+ i0.ɵɵconditional(ctx_r2.viewData.length === 0 ? 1 : 2);
52
+ } }
53
+ function RecordChangesComponent_Conditional_5_Conditional_24_For_2_Conditional_4_Template(rf, ctx) { if (rf & 1) {
54
+ i0.ɵɵelement(0, "div", 28);
55
+ } }
56
+ function RecordChangesComponent_Conditional_5_Conditional_24_For_2_Conditional_19_Template(rf, ctx) { if (rf & 1) {
57
+ i0.ɵɵelementStart(0, "span", 38);
58
+ i0.ɵɵtext(1);
59
+ i0.ɵɵelementEnd();
60
+ } if (rf & 2) {
61
+ const change_r5 = i0.ɵɵnextContext().$implicit;
62
+ i0.ɵɵadvance();
63
+ i0.ɵɵtextInterpolate1(" via ", change_r5.Integration, " ");
64
+ } }
65
+ function RecordChangesComponent_Conditional_5_Conditional_24_For_2_Conditional_20_Template(rf, ctx) { if (rf & 1) {
66
+ i0.ɵɵelementStart(0, "div", 39);
67
+ i0.ɵɵtext(1);
68
+ i0.ɵɵelementEnd();
69
+ } if (rf & 2) {
70
+ const change_r5 = i0.ɵɵnextContext().$implicit;
71
+ const ctx_r2 = i0.ɵɵnextContext(3);
72
+ i0.ɵɵadvance();
73
+ i0.ɵɵtextInterpolate1(" ", ctx_r2.getChangeSummary(change_r5), " ");
74
+ } }
75
+ function RecordChangesComponent_Conditional_5_Conditional_24_For_2_Conditional_21_Conditional_5_Conditional_4_For_2_Template(rf, ctx) { if (rf & 1) {
76
+ i0.ɵɵelementStart(0, "div", 50)(1, "span", 51);
77
+ i0.ɵɵtext(2);
78
+ i0.ɵɵelementEnd();
79
+ i0.ɵɵelementStart(3, "span", 52);
80
+ i0.ɵɵtext(4);
81
+ i0.ɵɵelementEnd()();
82
+ } if (rf & 2) {
83
+ const field_r6 = ctx.$implicit;
84
+ i0.ɵɵadvance(2);
85
+ i0.ɵɵtextInterpolate(field_r6.displayName);
86
+ i0.ɵɵadvance(2);
87
+ i0.ɵɵtextInterpolate(field_r6.value);
88
+ } }
89
+ function RecordChangesComponent_Conditional_5_Conditional_24_For_2_Conditional_21_Conditional_5_Conditional_4_Template(rf, ctx) { if (rf & 1) {
90
+ i0.ɵɵelementStart(0, "div", 49);
91
+ i0.ɵɵrepeaterCreate(1, RecordChangesComponent_Conditional_5_Conditional_24_For_2_Conditional_21_Conditional_5_Conditional_4_For_2_Template, 5, 2, "div", 50, _forTrack1);
92
+ i0.ɵɵelementEnd();
93
+ } if (rf & 2) {
94
+ const change_r5 = i0.ɵɵnextContext(3).$implicit;
95
+ const ctx_r2 = i0.ɵɵnextContext(3);
96
+ i0.ɵɵadvance();
97
+ i0.ɵɵrepeater(ctx_r2.getCreatedFields(change_r5));
98
+ } }
99
+ function RecordChangesComponent_Conditional_5_Conditional_24_For_2_Conditional_21_Conditional_5_Template(rf, ctx) { if (rf & 1) {
100
+ i0.ɵɵelementStart(0, "div", 43)(1, "h4");
101
+ i0.ɵɵelement(2, "i", 48);
102
+ i0.ɵɵtext(3, " Record Created");
103
+ i0.ɵɵelementEnd();
104
+ i0.ɵɵtemplate(4, RecordChangesComponent_Conditional_5_Conditional_24_For_2_Conditional_21_Conditional_5_Conditional_4_Template, 3, 0, "div", 49);
105
+ i0.ɵɵelementEnd();
25
106
  } if (rf & 2) {
26
- const dataItem_r2 = ctx.$implicit;
27
- const item_r3 = i0.ɵɵnextContext().$implicit;
28
- const ctx_r3 = i0.ɵɵnextContext(2);
29
- i0.ɵɵproperty("innerHTML", ctx_r3.FormatColumnValue(item_r3, dataItem_r2[item_r3.field], dataItem_r2), i0.ɵɵsanitizeHtml);
107
+ const change_r5 = i0.ɵɵnextContext(2).$implicit;
108
+ i0.ɵɵadvance(4);
109
+ i0.ɵɵconditional(change_r5.FullRecordJSON ? 4 : -1);
30
110
  } }
31
- function RecordChangesComponent_div_5_kendo_grid_column_4_Template(rf, ctx) { if (rf & 1) {
32
- i0.ɵɵelementStart(0, "kendo-grid-column", 11);
33
- i0.ɵɵtemplate(1, RecordChangesComponent_div_5_kendo_grid_column_4_ng_template_1_Template, 1, 1, "ng-template", 12);
111
+ function RecordChangesComponent_Conditional_5_Conditional_24_For_2_Conditional_21_Conditional_6_Template(rf, ctx) { if (rf & 1) {
112
+ i0.ɵɵelementStart(0, "div", 44)(1, "h4");
113
+ i0.ɵɵelement(2, "i", 53);
114
+ i0.ɵɵtext(3, " Record Deleted");
34
115
  i0.ɵɵelementEnd();
116
+ i0.ɵɵelementStart(4, "p", 54);
117
+ i0.ɵɵtext(5, "This record was permanently removed from the system.");
118
+ i0.ɵɵelementEnd()();
119
+ } }
120
+ function RecordChangesComponent_Conditional_5_Conditional_24_For_2_Conditional_21_Conditional_7_For_6_Conditional_3_Template(rf, ctx) { if (rf & 1) {
121
+ i0.ɵɵelementStart(0, "div", 57)(1, "span", 60);
122
+ i0.ɵɵtext(2);
123
+ i0.ɵɵelementEnd()();
35
124
  } if (rf & 2) {
36
- const item_r3 = ctx.$implicit;
37
- i0.ɵɵpropertyInterpolate("field", item_r3.field);
38
- i0.ɵɵpropertyInterpolate("title", item_r3.title);
39
- i0.ɵɵproperty("width", item_r3.width)("headerStyle", i0.ɵɵpureFunction0(4, _c1));
125
+ const fieldChange_r7 = i0.ɵɵnextContext().$implicit;
126
+ i0.ɵɵadvance(2);
127
+ i0.ɵɵtextInterpolate(fieldChange_r7.newValue);
40
128
  } }
41
- function RecordChangesComponent_div_5_Template(rf, ctx) { if (rf & 1) {
42
- i0.ɵɵelementStart(0, "div", 7, 1)(2, "div", 8)(3, "kendo-grid", 9);
43
- i0.ɵɵtemplate(4, RecordChangesComponent_div_5_kendo_grid_column_4_Template, 2, 5, "kendo-grid-column", 10);
129
+ function RecordChangesComponent_Conditional_5_Conditional_24_For_2_Conditional_21_Conditional_7_For_6_Conditional_4_Template(rf, ctx) { if (rf & 1) {
130
+ i0.ɵɵelementStart(0, "div", 58);
131
+ i0.ɵɵelement(1, "div", 61);
132
+ i0.ɵɵelementEnd();
133
+ } if (rf & 2) {
134
+ const fieldChange_r7 = i0.ɵɵnextContext().$implicit;
135
+ i0.ɵɵadvance();
136
+ i0.ɵɵproperty("innerHTML", fieldChange_r7.diffHtml, i0.ɵɵsanitizeHtml);
137
+ } }
138
+ function RecordChangesComponent_Conditional_5_Conditional_24_For_2_Conditional_21_Conditional_7_For_6_Conditional_5_Template(rf, ctx) { if (rf & 1) {
139
+ i0.ɵɵelementStart(0, "div", 59)(1, "div", 62)(2, "span", 63);
140
+ i0.ɵɵtext(3, "From:");
141
+ i0.ɵɵelementEnd();
142
+ i0.ɵɵelementStart(4, "span", 64);
143
+ i0.ɵɵtext(5);
144
+ i0.ɵɵelementEnd()();
145
+ i0.ɵɵelementStart(6, "div", 65);
146
+ i0.ɵɵelement(7, "i", 66);
147
+ i0.ɵɵelementEnd();
148
+ i0.ɵɵelementStart(8, "div", 60)(9, "span", 63);
149
+ i0.ɵɵtext(10, "To:");
150
+ i0.ɵɵelementEnd();
151
+ i0.ɵɵelementStart(11, "span", 64);
152
+ i0.ɵɵtext(12);
44
153
  i0.ɵɵelementEnd()()();
45
154
  } if (rf & 2) {
46
- const ctx_r3 = i0.ɵɵnextContext();
155
+ const fieldChange_r7 = i0.ɵɵnextContext().$implicit;
156
+ i0.ɵɵadvance(5);
157
+ i0.ɵɵtextInterpolate(fieldChange_r7.oldValue || "(empty)");
158
+ i0.ɵɵadvance(7);
159
+ i0.ɵɵtextInterpolate(fieldChange_r7.newValue || "(empty)");
160
+ } }
161
+ function RecordChangesComponent_Conditional_5_Conditional_24_For_2_Conditional_21_Conditional_7_For_6_Template(rf, ctx) { if (rf & 1) {
162
+ i0.ɵɵelementStart(0, "div", 56)(1, "div", 51);
163
+ i0.ɵɵtext(2);
164
+ i0.ɵɵelementEnd();
165
+ i0.ɵɵtemplate(3, RecordChangesComponent_Conditional_5_Conditional_24_For_2_Conditional_21_Conditional_7_For_6_Conditional_3_Template, 3, 1, "div", 57)(4, RecordChangesComponent_Conditional_5_Conditional_24_For_2_Conditional_21_Conditional_7_For_6_Conditional_4_Template, 2, 1, "div", 58)(5, RecordChangesComponent_Conditional_5_Conditional_24_For_2_Conditional_21_Conditional_7_For_6_Conditional_5_Template, 13, 2, "div", 59);
166
+ i0.ɵɵelementEnd();
167
+ } if (rf & 2) {
168
+ const fieldChange_r7 = ctx.$implicit;
169
+ i0.ɵɵadvance(2);
170
+ i0.ɵɵtextInterpolate(fieldChange_r7.displayName);
171
+ i0.ɵɵadvance();
172
+ i0.ɵɵconditional(fieldChange_r7.isBooleanField ? 3 : fieldChange_r7.diffHtml ? 4 : 5);
173
+ } }
174
+ function RecordChangesComponent_Conditional_5_Conditional_24_For_2_Conditional_21_Conditional_7_Template(rf, ctx) { if (rf & 1) {
175
+ i0.ɵɵelementStart(0, "div", 45)(1, "h4");
176
+ i0.ɵɵelement(2, "i", 55);
177
+ i0.ɵɵtext(3, " Fields Changed");
178
+ i0.ɵɵelementEnd();
179
+ i0.ɵɵelementStart(4, "div", 49);
180
+ i0.ɵɵrepeaterCreate(5, RecordChangesComponent_Conditional_5_Conditional_24_For_2_Conditional_21_Conditional_7_For_6_Template, 6, 2, "div", 56, _forTrack2);
181
+ i0.ɵɵelementEnd()();
182
+ } if (rf & 2) {
183
+ const change_r5 = i0.ɵɵnextContext(2).$implicit;
184
+ const ctx_r2 = i0.ɵɵnextContext(3);
185
+ i0.ɵɵadvance(5);
186
+ i0.ɵɵrepeater(ctx_r2.getFieldChanges(change_r5));
187
+ } }
188
+ function RecordChangesComponent_Conditional_5_Conditional_24_For_2_Conditional_21_Conditional_8_Template(rf, ctx) { if (rf & 1) {
189
+ i0.ɵɵelementStart(0, "div", 46)(1, "h5");
190
+ i0.ɵɵelement(2, "i", 67);
191
+ i0.ɵɵtext(3, " Comments");
192
+ i0.ɵɵelementEnd();
193
+ i0.ɵɵelementStart(4, "p");
194
+ i0.ɵɵtext(5);
195
+ i0.ɵɵelementEnd()();
196
+ } if (rf & 2) {
197
+ const change_r5 = i0.ɵɵnextContext(2).$implicit;
198
+ i0.ɵɵadvance(5);
199
+ i0.ɵɵtextInterpolate(change_r5.Comments);
200
+ } }
201
+ function RecordChangesComponent_Conditional_5_Conditional_24_For_2_Conditional_21_Conditional_9_Template(rf, ctx) { if (rf & 1) {
202
+ i0.ɵɵelementStart(0, "div", 47)(1, "h5");
203
+ i0.ɵɵelement(2, "i", 68);
204
+ i0.ɵɵtext(3, " Errors");
205
+ i0.ɵɵelementEnd();
206
+ i0.ɵɵelementStart(4, "pre", 69);
207
+ i0.ɵɵtext(5);
208
+ i0.ɵɵelementEnd()();
209
+ } if (rf & 2) {
210
+ const change_r5 = i0.ɵɵnextContext(2).$implicit;
211
+ i0.ɵɵadvance(5);
212
+ i0.ɵɵtextInterpolate(change_r5.ErrorLog);
213
+ } }
214
+ function RecordChangesComponent_Conditional_5_Conditional_24_For_2_Conditional_21_Template(rf, ctx) { if (rf & 1) {
215
+ i0.ɵɵelementStart(0, "div", 40)(1, "div", 41);
216
+ i0.ɵɵelement(2, "i", 42);
217
+ i0.ɵɵelementStart(3, "strong");
218
+ i0.ɵɵtext(4);
219
+ i0.ɵɵelementEnd()();
220
+ i0.ɵɵtemplate(5, RecordChangesComponent_Conditional_5_Conditional_24_For_2_Conditional_21_Conditional_5_Template, 5, 1, "div", 43)(6, RecordChangesComponent_Conditional_5_Conditional_24_For_2_Conditional_21_Conditional_6_Template, 6, 0, "div", 44)(7, RecordChangesComponent_Conditional_5_Conditional_24_For_2_Conditional_21_Conditional_7_Template, 7, 0, "div", 45)(8, RecordChangesComponent_Conditional_5_Conditional_24_For_2_Conditional_21_Conditional_8_Template, 6, 1, "div", 46)(9, RecordChangesComponent_Conditional_5_Conditional_24_For_2_Conditional_21_Conditional_9_Template, 6, 1, "div", 47);
221
+ i0.ɵɵelementEnd();
222
+ } if (rf & 2) {
223
+ const change_r5 = i0.ɵɵnextContext().$implicit;
224
+ const ctx_r2 = i0.ɵɵnextContext(3);
225
+ i0.ɵɵadvance(4);
226
+ i0.ɵɵtextInterpolate(ctx_r2.formatFullDateTime(change_r5.ChangedAt));
227
+ i0.ɵɵadvance();
228
+ i0.ɵɵconditional(change_r5.Type === "Create" ? 5 : change_r5.Type === "Delete" ? 6 : 7);
47
229
  i0.ɵɵadvance(3);
48
- i0.ɵɵproperty("kendoGridBinding", ctx_r3.viewData)("pageSize", 100)("sortable", true)("sort", ctx_r3.sortSettings)("loading", ctx_r3.showloader)("resizable", true)("navigable", true);
230
+ i0.ɵɵconditional(change_r5.Comments ? 8 : -1);
49
231
  i0.ɵɵadvance();
50
- i0.ɵɵproperty("ngForOf", ctx_r3.visibleColumns);
232
+ i0.ɵɵconditional(change_r5.ErrorLog ? 9 : -1);
233
+ } }
234
+ function RecordChangesComponent_Conditional_5_Conditional_24_For_2_Template(rf, ctx) { if (rf & 1) {
235
+ const _r4 = i0.ɵɵgetCurrentView();
236
+ i0.ɵɵelementStart(0, "div", 25);
237
+ i0.ɵɵlistener("click", function RecordChangesComponent_Conditional_5_Conditional_24_For_2_Template_div_click_0_listener() { const change_r5 = i0.ɵɵrestoreView(_r4).$implicit; const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.toggleExpansion(change_r5.ID)); })("keydown", function RecordChangesComponent_Conditional_5_Conditional_24_For_2_Template_div_keydown_0_listener($event) { const change_r5 = i0.ɵɵrestoreView(_r4).$implicit; const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.onTimelineItemKeydown($event, change_r5.ID)); });
238
+ i0.ɵɵelementStart(1, "div", 26)(2, "div", 27);
239
+ i0.ɵɵelement(3, "i");
240
+ i0.ɵɵelementEnd();
241
+ i0.ɵɵtemplate(4, RecordChangesComponent_Conditional_5_Conditional_24_For_2_Conditional_4_Template, 1, 0, "div", 28);
242
+ i0.ɵɵelementEnd();
243
+ i0.ɵɵelementStart(5, "div", 29)(6, "div", 30)(7, "div", 31)(8, "span", 32);
244
+ i0.ɵɵtext(9);
245
+ i0.ɵɵelementEnd();
246
+ i0.ɵɵelementStart(10, "span", 33);
247
+ i0.ɵɵtext(11);
248
+ i0.ɵɵelementEnd();
249
+ i0.ɵɵelementStart(12, "span", 34);
250
+ i0.ɵɵtext(13);
251
+ i0.ɵɵelementEnd()();
252
+ i0.ɵɵelementStart(14, "div", 35)(15, "span", 36);
253
+ i0.ɵɵtext(16);
254
+ i0.ɵɵelementEnd();
255
+ i0.ɵɵelementStart(17, "span", 37);
256
+ i0.ɵɵtext(18);
257
+ i0.ɵɵelementEnd();
258
+ i0.ɵɵtemplate(19, RecordChangesComponent_Conditional_5_Conditional_24_For_2_Conditional_19_Template, 2, 1, "span", 38);
259
+ i0.ɵɵelementEnd()();
260
+ i0.ɵɵtemplate(20, RecordChangesComponent_Conditional_5_Conditional_24_For_2_Conditional_20_Template, 2, 1, "div", 39)(21, RecordChangesComponent_Conditional_5_Conditional_24_For_2_Conditional_21_Template, 10, 4, "div", 40);
261
+ i0.ɵɵelementEnd()();
262
+ } if (rf & 2) {
263
+ const change_r5 = ctx.$implicit;
264
+ const ɵ$index_65_r8 = ctx.$index;
265
+ const ctx_r2 = i0.ɵɵnextContext(3);
266
+ i0.ɵɵclassProp("expanded", ctx_r2.expandedItems.has(change_r5.ID));
267
+ i0.ɵɵattribute("tabindex", 0)("aria-expanded", ctx_r2.expandedItems.has(change_r5.ID))("aria-label", ctx_r2.getTimelineItemLabel(change_r5));
268
+ i0.ɵɵadvance(2);
269
+ i0.ɵɵclassMap(ctx_r2.getChangeTypeClass(change_r5.Type));
270
+ i0.ɵɵadvance();
271
+ i0.ɵɵclassMap(ctx_r2.getChangeTypeIcon(change_r5.Type));
272
+ i0.ɵɵattribute("aria-hidden", true);
273
+ i0.ɵɵadvance();
274
+ i0.ɵɵconditional(ɵ$index_65_r8 < ctx_r2.filteredData.length - 1 ? 4 : -1);
275
+ i0.ɵɵadvance(4);
276
+ i0.ɵɵclassMap(ctx_r2.getChangeTypeBadgeClass(change_r5.Type));
277
+ i0.ɵɵadvance();
278
+ i0.ɵɵtextInterpolate1(" ", change_r5.Type, " ");
279
+ i0.ɵɵadvance(2);
280
+ i0.ɵɵtextInterpolate(change_r5.User || "Unknown User");
281
+ i0.ɵɵadvance();
282
+ i0.ɵɵclassMap(ctx_r2.getSourceClass(change_r5.Source));
283
+ i0.ɵɵadvance();
284
+ i0.ɵɵtextInterpolate1(" ", change_r5.Source, " ");
285
+ i0.ɵɵadvance(2);
286
+ i0.ɵɵproperty("title", ctx_r2.formatFullDateTime(change_r5.ChangedAt));
287
+ i0.ɵɵadvance();
288
+ i0.ɵɵtextInterpolate1(" ", ctx_r2.formatRelativeTime(change_r5.ChangedAt), " ");
289
+ i0.ɵɵadvance();
290
+ i0.ɵɵclassMap(ctx_r2.getStatusClass(change_r5.Status));
291
+ i0.ɵɵadvance();
292
+ i0.ɵɵtextInterpolate1(" ", change_r5.Status, " ");
293
+ i0.ɵɵadvance();
294
+ i0.ɵɵconditional(change_r5.Integration ? 19 : -1);
295
+ i0.ɵɵadvance();
296
+ i0.ɵɵconditional(!ctx_r2.expandedItems.has(change_r5.ID) ? 20 : -1);
297
+ i0.ɵɵadvance();
298
+ i0.ɵɵconditional(ctx_r2.expandedItems.has(change_r5.ID) ? 21 : -1);
299
+ } }
300
+ function RecordChangesComponent_Conditional_5_Conditional_24_Template(rf, ctx) { if (rf & 1) {
301
+ i0.ɵɵelementStart(0, "div", 21);
302
+ i0.ɵɵrepeaterCreate(1, RecordChangesComponent_Conditional_5_Conditional_24_For_2_Template, 22, 26, "div", 24, _forTrack0);
303
+ i0.ɵɵelementEnd();
304
+ } if (rf & 2) {
305
+ const ctx_r2 = i0.ɵɵnextContext(2);
306
+ i0.ɵɵadvance();
307
+ i0.ɵɵrepeater(ctx_r2.filteredData);
308
+ } }
309
+ function RecordChangesComponent_Conditional_5_Template(rf, ctx) { if (rf & 1) {
310
+ const _r2 = i0.ɵɵgetCurrentView();
311
+ i0.ɵɵelementStart(0, "div", 5, 1)(2, "div", 7)(3, "div", 8)(4, "input", 9);
312
+ i0.ɵɵtwoWayListener("ngModelChange", function RecordChangesComponent_Conditional_5_Template_input_ngModelChange_4_listener($event) { i0.ɵɵrestoreView(_r2); const ctx_r2 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r2.searchTerm, $event) || (ctx_r2.searchTerm = $event); return i0.ɵɵresetView($event); });
313
+ i0.ɵɵlistener("input", function RecordChangesComponent_Conditional_5_Template_input_input_4_listener() { i0.ɵɵrestoreView(_r2); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onSearchChange()); });
314
+ i0.ɵɵelementEnd();
315
+ i0.ɵɵelementStart(5, "select", 10);
316
+ i0.ɵɵtwoWayListener("ngModelChange", function RecordChangesComponent_Conditional_5_Template_select_ngModelChange_5_listener($event) { i0.ɵɵrestoreView(_r2); const ctx_r2 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r2.selectedType, $event) || (ctx_r2.selectedType = $event); return i0.ɵɵresetView($event); });
317
+ i0.ɵɵlistener("change", function RecordChangesComponent_Conditional_5_Template_select_change_5_listener() { i0.ɵɵrestoreView(_r2); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onFilterChange()); });
318
+ i0.ɵɵelementStart(6, "option", 11);
319
+ i0.ɵɵtext(7, "All Changes");
320
+ i0.ɵɵelementEnd();
321
+ i0.ɵɵelementStart(8, "option", 12);
322
+ i0.ɵɵtext(9, "Created");
323
+ i0.ɵɵelementEnd();
324
+ i0.ɵɵelementStart(10, "option", 13);
325
+ i0.ɵɵtext(11, "Updated");
326
+ i0.ɵɵelementEnd();
327
+ i0.ɵɵelementStart(12, "option", 14);
328
+ i0.ɵɵtext(13, "Deleted");
329
+ i0.ɵɵelementEnd()();
330
+ i0.ɵɵelementStart(14, "select", 15);
331
+ i0.ɵɵtwoWayListener("ngModelChange", function RecordChangesComponent_Conditional_5_Template_select_ngModelChange_14_listener($event) { i0.ɵɵrestoreView(_r2); const ctx_r2 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r2.selectedSource, $event) || (ctx_r2.selectedSource = $event); return i0.ɵɵresetView($event); });
332
+ i0.ɵɵlistener("change", function RecordChangesComponent_Conditional_5_Template_select_change_14_listener() { i0.ɵɵrestoreView(_r2); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onFilterChange()); });
333
+ i0.ɵɵelementStart(15, "option", 11);
334
+ i0.ɵɵtext(16, "All Sources");
335
+ i0.ɵɵelementEnd();
336
+ i0.ɵɵelementStart(17, "option", 16);
337
+ i0.ɵɵtext(18, "Internal");
338
+ i0.ɵɵelementEnd();
339
+ i0.ɵɵelementStart(19, "option", 17);
340
+ i0.ɵɵtext(20, "External");
341
+ i0.ɵɵelementEnd()()();
342
+ i0.ɵɵtemplate(21, RecordChangesComponent_Conditional_5_Conditional_21_Template, 2, 2, "div", 18);
343
+ i0.ɵɵelementEnd();
344
+ i0.ɵɵelementStart(22, "div", 19);
345
+ i0.ɵɵtemplate(23, RecordChangesComponent_Conditional_5_Conditional_23_Template, 3, 1, "div", 20)(24, RecordChangesComponent_Conditional_5_Conditional_24_Template, 3, 0, "div", 21);
346
+ i0.ɵɵelementEnd()();
347
+ } if (rf & 2) {
348
+ const ctx_r2 = i0.ɵɵnextContext();
349
+ i0.ɵɵadvance(4);
350
+ i0.ɵɵtwoWayProperty("ngModel", ctx_r2.searchTerm);
351
+ i0.ɵɵadvance();
352
+ i0.ɵɵtwoWayProperty("ngModel", ctx_r2.selectedType);
353
+ i0.ɵɵadvance(9);
354
+ i0.ɵɵtwoWayProperty("ngModel", ctx_r2.selectedSource);
355
+ i0.ɵɵadvance(7);
356
+ i0.ɵɵconditional(ctx_r2.filteredData.length !== ctx_r2.viewData.length ? 21 : -1);
357
+ i0.ɵɵadvance();
358
+ i0.ɵɵattribute("aria-label", "Timeline of changes for " + ctx_r2.record.EntityInfo.Name + " record");
359
+ i0.ɵɵadvance();
360
+ i0.ɵɵconditional(ctx_r2.filteredData.length === 0 ? 23 : 24);
51
361
  } }
52
362
  export class RecordChangesComponent {
53
- constructor(sanitizer, renderer) {
54
- this.sanitizer = sanitizer;
363
+ constructor(renderer, mjNotificationService, sanitizer) {
55
364
  this.renderer = renderer;
365
+ this.mjNotificationService = mjNotificationService;
366
+ this.sanitizer = sanitizer;
56
367
  this.showloader = false;
57
368
  this.dialogClosed = new EventEmitter();
58
369
  this.viewData = [];
59
- this.visibleColumns = [];
370
+ this.filteredData = [];
371
+ this.expandedItems = new Set();
372
+ // Filter properties
373
+ this.searchTerm = '';
374
+ this.selectedType = '';
375
+ this.selectedSource = '';
60
376
  this.sortSettings = [
61
377
  {
62
378
  field: "ChangedAt",
@@ -67,8 +383,7 @@ export class RecordChangesComponent {
67
383
  ngOnInit() {
68
384
  if (this.record) {
69
385
  this.showloader = true;
70
- this.LoadRecordChanges(this.record.PrimaryKey.ToConcatenatedString(), '', this.record.EntityInfo.Name);
71
- this.prepareColumns();
386
+ this.LoadRecordChanges(this.record.PrimaryKey, '', this.record.EntityInfo.Name);
72
387
  }
73
388
  }
74
389
  ngAfterViewInit() {
@@ -81,131 +396,296 @@ export class RecordChangesComponent {
81
396
  if (this.renderer && this.wrapper && this.wrapper.nativeElement)
82
397
  this.renderer.removeChild(document.body, this.wrapper.nativeElement);
83
398
  }
84
- LoadRecordChanges(KeyValuePairString, appName, entityName) {
399
+ LoadRecordChanges(pkey, appName, entityName) {
85
400
  return __awaiter(this, void 0, void 0, function* () {
86
- // Perform any necessary actions with the ViewID, such as fetching data
87
- if (KeyValuePairString && entityName) {
88
- const rv = new RunView();
89
- const response = yield rv.RunView({ EntityName: "Record Changes", ExtraFilter: `Entity='${entityName}' AND RecordID='${KeyValuePairString}'` });
90
- if (response.Success) {
91
- this.viewData = response.Results;
401
+ if (pkey && entityName) {
402
+ const md = new Metadata();
403
+ const changes = yield md.GetRecordChanges(entityName, pkey);
404
+ if (changes) {
405
+ this.viewData = changes.sort((a, b) => new Date(b.ChangedAt).getTime() - new Date(a.ChangedAt).getTime());
406
+ this.filteredData = [...this.viewData];
92
407
  this.showloader = false;
93
408
  }
94
409
  else {
95
- LogError(response.ErrorMessage);
410
+ this.mjNotificationService.CreateSimpleNotification(`Error loading record changes for ${entityName} with primary key ${pkey.ToString()}.`, 'error');
96
411
  this.showloader = false;
97
412
  }
98
413
  }
99
414
  });
100
415
  }
101
- prepareColumns() {
102
- this.visibleColumns = [{
103
- field: 'ChangedAt',
104
- title: 'Date',
105
- type: 'datetime',
106
- width: 175,
107
- },
108
- {
109
- field: 'ChangesDescription',
110
- title: 'Changes',
111
- type: 'description',
112
- }];
113
- }
114
416
  closePropertiesDialog() {
115
417
  this.dialogClosed.emit();
116
418
  }
117
- FormatColumnValue(col, value, dataItem, maxLength = 0, trailingChars = "...") {
118
- if (value === null)
119
- return null;
419
+ // Filter and search methods
420
+ onSearchChange() {
421
+ this.applyFilters();
422
+ }
423
+ onFilterChange() {
424
+ this.applyFilters();
425
+ }
426
+ applyFilters() {
427
+ let filtered = [...this.viewData];
428
+ // Apply search filter
429
+ if (this.searchTerm.trim()) {
430
+ const search = this.searchTerm.toLowerCase();
431
+ filtered = filtered.filter(change => {
432
+ var _a, _b, _c;
433
+ return ((_a = change.ChangesDescription) === null || _a === void 0 ? void 0 : _a.toLowerCase().includes(search)) ||
434
+ ((_b = change.User) === null || _b === void 0 ? void 0 : _b.toLowerCase().includes(search)) ||
435
+ ((_c = change.Comments) === null || _c === void 0 ? void 0 : _c.toLowerCase().includes(search));
436
+ });
437
+ }
438
+ // Apply type filter
439
+ if (this.selectedType) {
440
+ filtered = filtered.filter(change => change.Type === this.selectedType);
441
+ }
442
+ // Apply source filter
443
+ if (this.selectedSource) {
444
+ filtered = filtered.filter(change => change.Source === this.selectedSource);
445
+ }
446
+ this.filteredData = filtered;
447
+ }
448
+ // Timeline interaction methods
449
+ toggleExpansion(changeId) {
450
+ if (this.expandedItems.has(changeId)) {
451
+ this.expandedItems.delete(changeId);
452
+ }
453
+ else {
454
+ this.expandedItems.add(changeId);
455
+ }
456
+ }
457
+ onTimelineItemKeydown(event, changeId) {
458
+ if (event.key === 'Enter' || event.key === ' ') {
459
+ event.preventDefault();
460
+ this.toggleExpansion(changeId);
461
+ }
462
+ }
463
+ // Utility methods for timeline display
464
+ getChangeTypeClass(type) {
465
+ switch (type) {
466
+ case 'Create': return 'change-create';
467
+ case 'Update': return 'change-update';
468
+ case 'Delete': return 'change-delete';
469
+ default: return 'change-unknown';
470
+ }
471
+ }
472
+ getChangeTypeIcon(type) {
473
+ switch (type) {
474
+ case 'Create': return 'fa-solid fa-plus';
475
+ case 'Update': return 'fa-solid fa-edit';
476
+ case 'Delete': return 'fa-solid fa-trash';
477
+ default: return 'fa-solid fa-question';
478
+ }
479
+ }
480
+ getChangeTypeBadgeClass(type) {
481
+ switch (type) {
482
+ case 'Create': return 'badge-create';
483
+ case 'Update': return 'badge-update';
484
+ case 'Delete': return 'badge-delete';
485
+ default: return 'badge-unknown';
486
+ }
487
+ }
488
+ getSourceClass(source) {
489
+ return source === 'Internal' ? 'source-internal' : 'source-external';
490
+ }
491
+ getStatusClass(status) {
492
+ switch (status) {
493
+ case 'Complete': return 'status-complete';
494
+ case 'Pending': return 'status-pending';
495
+ case 'Error': return 'status-error';
496
+ default: return 'status-unknown';
497
+ }
498
+ }
499
+ getTimelineItemLabel(change) {
500
+ return `${change.Type} by ${change.User || 'Unknown User'} on ${this.formatFullDateTime(change.ChangedAt)}`;
501
+ }
502
+ formatRelativeTime(date) {
503
+ const now = new Date();
504
+ const diffMs = now.getTime() - new Date(date).getTime();
505
+ const diffMins = Math.floor(diffMs / 60000);
506
+ const diffHours = Math.floor(diffMins / 60);
507
+ const diffDays = Math.floor(diffHours / 24);
508
+ if (diffMins < 1)
509
+ return 'Just now';
510
+ if (diffMins < 60)
511
+ return `${diffMins} min${diffMins > 1 ? 's' : ''} ago`;
512
+ if (diffHours < 24)
513
+ return `${diffHours} hour${diffHours > 1 ? 's' : ''} ago`;
514
+ if (diffDays < 7)
515
+ return `${diffDays} day${diffDays > 1 ? 's' : ''} ago`;
516
+ return new Intl.DateTimeFormat('en-US', {
517
+ month: 'short',
518
+ day: 'numeric',
519
+ year: diffDays > 365 ? 'numeric' : undefined
520
+ }).format(new Date(date));
521
+ }
522
+ formatFullDateTime(date) {
523
+ return new Intl.DateTimeFormat('en-US', {
524
+ year: 'numeric',
525
+ month: 'long',
526
+ day: 'numeric',
527
+ hour: 'numeric',
528
+ minute: 'numeric',
529
+ hour12: true,
530
+ timeZoneName: 'short'
531
+ }).format(new Date(date));
532
+ }
533
+ getChangeSummary(change) {
534
+ if (change.Type === 'Create') {
535
+ return 'Record was created';
536
+ }
537
+ if (change.Type === 'Delete') {
538
+ return 'Record was deleted';
539
+ }
120
540
  try {
121
- switch (col.type.toLowerCase()) {
122
- case 'datetime':
123
- let utcDate = new Date(value); // UTC date
124
- // Calculate the local timezone offset and adjust the date
125
- const localDate = new Date(utcDate.getTime() - utcDate.getTimezoneOffset() * 60000);
126
- return new Intl.DateTimeFormat('en-US', {
127
- year: 'numeric',
128
- month: 'short',
129
- day: 'numeric',
130
- hour: 'numeric',
131
- minute: 'numeric',
132
- hour12: true,
133
- }).format(localDate);
134
- case 'int':
135
- return new Intl.NumberFormat(undefined, { minimumFractionDigits: 0, maximumFractionDigits: 0 }).format(value);
136
- case 'description':
137
- // while the database stores a description, it is easier to use the ChangesJSON field to get the structured data and then generate our HTML
138
- const json = JSON.parse(dataItem.ChangesJSON);
139
- if (!json)
140
- return value;
141
- else {
142
- const fields = Object.keys(json); // each field that was changed is a key in the JSON object
143
- let formattedDescription = '<div>';
144
- for (let i = 0; i < fields.length; i++) {
145
- const changeInfo = json[fields[i]];
146
- const field = this.record.EntityInfo.Fields.find((f) => { var _a; return f.Name.trim().toLowerCase() === ((_a = changeInfo.field) === null || _a === void 0 ? void 0 : _a.trim().toLowerCase()); });
147
- let innerDescription = "";
148
- if (field) {
149
- // we have field metadata, so we can use that
150
- if (field.TSType === EntityFieldTSType.Boolean) {
151
- // for boolean fields, it is cleaner to just show new value, no need to show old value as it is always the opposite
152
- innerDescription = `${this.fieldMarkup(field.DisplayNameOrName)} set to ${this.valueMarkup(changeInfo, false)}`;
153
- }
154
- else {
155
- innerDescription = `${this.fieldMarkup(field.DisplayNameOrName)} changed from ${this.valueMarkup(changeInfo, true)} to ${this.valueMarkup(changeInfo, false)}`;
156
- }
157
- }
158
- else {
159
- // we don't have field metadata - this could happen if a field was removed or renamed after a record change was recorded in the database, so just use what we have
160
- innerDescription = `${this.fieldMarkup(changeInfo.field)} changed from ${this.valueMarkup(changeInfo, true)}} to ${this.valueMarkup(changeInfo, false)}`;
161
- }
162
- formattedDescription += `<div>${innerDescription}</div>`;
163
- }
164
- formattedDescription += '</div>';
165
- return this.sanitizer.bypassSecurityTrustHtml(formattedDescription);
166
- }
167
- default:
168
- return value;
541
+ const changesJson = JSON.parse(change.ChangesJSON || '{}');
542
+ const fields = Object.keys(changesJson);
543
+ if (fields.length === 0)
544
+ return 'No field changes detected';
545
+ // Get field display names
546
+ const fieldNames = fields.map(fieldKey => {
547
+ const changeInfo = changesJson[fieldKey];
548
+ const field = this.record.EntityInfo.Fields.find((f) => { var _a; return f.Name.trim().toLowerCase() === ((_a = changeInfo.field) === null || _a === void 0 ? void 0 : _a.trim().toLowerCase()); });
549
+ return (field === null || field === void 0 ? void 0 : field.DisplayNameOrName) || changeInfo.field;
550
+ });
551
+ if (fieldNames.length === 1) {
552
+ return `${fieldNames[0]} changed`;
553
+ }
554
+ if (fieldNames.length === 2) {
555
+ return `${fieldNames[0]} and ${fieldNames[1]} changed`;
169
556
  }
557
+ if (fieldNames.length <= 4) {
558
+ const lastField = fieldNames.pop();
559
+ return `${fieldNames.join(', ')}, and ${lastField} changed`;
560
+ }
561
+ // For more than 4 fields, show first 3 and count
562
+ return `${fieldNames.slice(0, 3).join(', ')}, and ${fieldNames.length - 3} other field${fieldNames.length - 3 > 1 ? 's' : ''} changed`;
170
563
  }
171
- catch (e) {
172
- LogError(e);
173
- return value;
564
+ catch (_a) {
565
+ return change.ChangesDescription || 'Changes made';
174
566
  }
175
567
  }
176
- fieldMarkup(fieldName) {
177
- return `<b>${fieldName}</b>`;
568
+ getFieldChanges(change) {
569
+ try {
570
+ const changesJson = JSON.parse(change.ChangesJSON || '{}');
571
+ const fields = Object.keys(changesJson);
572
+ return fields.map(fieldKey => {
573
+ var _a, _b;
574
+ const changeInfo = changesJson[fieldKey];
575
+ const field = this.record.EntityInfo.Fields.find((f) => { var _a; return f.Name.trim().toLowerCase() === ((_a = changeInfo.field) === null || _a === void 0 ? void 0 : _a.trim().toLowerCase()); });
576
+ const isBooleanField = (field === null || field === void 0 ? void 0 : field.TSType) === EntityFieldTSType.Boolean;
577
+ let diffHtml;
578
+ // Generate diff HTML for non-boolean text fields
579
+ if (!isBooleanField) {
580
+ const oldStr = String((_a = changeInfo.oldValue) !== null && _a !== void 0 ? _a : '');
581
+ const newStr = String((_b = changeInfo.newValue) !== null && _b !== void 0 ? _b : '');
582
+ // Always show diff if values are different, even if one is empty
583
+ if (oldStr !== newStr) {
584
+ diffHtml = this.generateDiffHtml(oldStr, newStr);
585
+ }
586
+ }
587
+ return {
588
+ field: changeInfo.field,
589
+ displayName: (field === null || field === void 0 ? void 0 : field.DisplayNameOrName) || changeInfo.field,
590
+ oldValue: changeInfo.oldValue,
591
+ newValue: changeInfo.newValue,
592
+ isBooleanField,
593
+ diffHtml
594
+ };
595
+ });
596
+ }
597
+ catch (_a) {
598
+ return [];
599
+ }
600
+ }
601
+ getCreatedFields(change) {
602
+ try {
603
+ if (!change.FullRecordJSON)
604
+ return [];
605
+ const record = JSON.parse(change.FullRecordJSON);
606
+ const fields = this.record.EntityInfo.Fields;
607
+ return fields
608
+ .filter((field) => record[field.Name] !== null && record[field.Name] !== undefined && record[field.Name] !== '')
609
+ .map((field) => ({
610
+ name: field.Name,
611
+ displayName: field.DisplayNameOrName,
612
+ value: record[field.Name]
613
+ }));
614
+ }
615
+ catch (_a) {
616
+ return [];
617
+ }
618
+ }
619
+ generateDiffHtml(oldValue, newValue) {
620
+ // Handle empty values
621
+ if (!oldValue && !newValue) {
622
+ return this.sanitizer.bypassSecurityTrustHtml('<div class="diff-container"><span class="diff-unchanged">(no change)</span></div>');
623
+ }
624
+ if (!oldValue) {
625
+ return this.sanitizer.bypassSecurityTrustHtml(`<div class="diff-container"><span class="diff-added">${this.escapeHtml(newValue)}</span></div>`);
626
+ }
627
+ if (!newValue) {
628
+ return this.sanitizer.bypassSecurityTrustHtml(`<div class="diff-container"><span class="diff-removed">${this.escapeHtml(oldValue)}</span></div>`);
629
+ }
630
+ // Decide between character and word diff based on content length and type
631
+ const useWordDiff = this.shouldUseWordDiff(oldValue, newValue);
632
+ const diffs = useWordDiff ? diffWords(oldValue, newValue) : diffChars(oldValue, newValue);
633
+ let html = '<div class="diff-container">';
634
+ diffs.forEach((part) => {
635
+ const escapedValue = this.escapeHtml(part.value);
636
+ if (part.added) {
637
+ html += `<span class="diff-added">${escapedValue}</span>`;
638
+ }
639
+ else if (part.removed) {
640
+ html += `<span class="diff-removed">${escapedValue}</span>`;
641
+ }
642
+ else {
643
+ html += `<span class="diff-unchanged">${escapedValue}</span>`;
644
+ }
645
+ });
646
+ html += '</div>';
647
+ return this.sanitizer.bypassSecurityTrustHtml(html);
648
+ }
649
+ shouldUseWordDiff(oldValue, newValue) {
650
+ // Use word diff for longer text with spaces (sentences/paragraphs)
651
+ // Use character diff for shorter text, codes, IDs, etc.
652
+ const hasMultipleWords = (text) => text.includes(' ') && text.split(' ').length > 3;
653
+ const isLongText = (text) => text.length > 50;
654
+ return (hasMultipleWords(oldValue) || hasMultipleWords(newValue)) &&
655
+ (isLongText(oldValue) || isLongText(newValue));
178
656
  }
179
- valueMarkup(changeInfo, isOldValue) {
180
- return `<span style="color: ${isOldValue ? 'darkgray' : 'blue'};">${isOldValue ? changeInfo.oldValue : changeInfo.newValue}</span>`;
657
+ escapeHtml(text) {
658
+ const div = document.createElement('div');
659
+ div.textContent = text;
660
+ return div.innerHTML;
181
661
  }
182
662
  }
183
- RecordChangesComponent.ɵfac = function RecordChangesComponent_Factory(t) { return new (t || RecordChangesComponent)(i0.ɵɵdirectiveInject(i1.DomSanitizer), i0.ɵɵdirectiveInject(i0.Renderer2)); };
663
+ RecordChangesComponent.ɵfac = function RecordChangesComponent_Factory(t) { return new (t || RecordChangesComponent)(i0.ɵɵdirectiveInject(i0.Renderer2), i0.ɵɵdirectiveInject(i1.MJNotificationService), i0.ɵɵdirectiveInject(i2.DomSanitizer)); };
184
664
  RecordChangesComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: RecordChangesComponent, selectors: [["mj-record-changes"]], viewQuery: function RecordChangesComponent_Query(rf, ctx) { if (rf & 1) {
185
665
  i0.ɵɵviewQuery(_c0, 7);
186
666
  } if (rf & 2) {
187
667
  let _t;
188
668
  i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.wrapper = _t.first);
189
- } }, inputs: { record: "record" }, outputs: { dialogClosed: "dialogClosed" }, decls: 6, vars: 7, consts: [["recordChangesWrapper", ""], ["dialogContainer", ""], [1, "k-overlay"], ["title", "Record Changes", 1, "kendo-window-custom", 3, "close", "width", "height", "minHeight", "minWidth", "resizable"], ["type", "converging-spinner", 4, "ngIf"], ["class", "k-d-flex k-flex-col k-justify-content-between k-h-full", 4, "ngIf"], ["type", "converging-spinner"], [1, "k-d-flex", "k-flex-col", "k-justify-content-between", "k-h-full"], [1, "kendo-grid-container"], ["scrollable", "virtual", 3, "kendoGridBinding", "pageSize", "sortable", "sort", "loading", "resizable", "navigable"], [3, "field", "title", "width", "headerStyle", 4, "ngFor", "ngForOf"], [3, "field", "title", "width", "headerStyle"], ["kendoGridCellTemplate", ""], [3, "innerHTML"]], template: function RecordChangesComponent_Template(rf, ctx) { if (rf & 1) {
669
+ } }, inputs: { record: "record" }, outputs: { dialogClosed: "dialogClosed" }, decls: 6, vars: 9, consts: [["recordChangesWrapper", ""], ["dialogContainer", ""], [1, "k-overlay"], ["title", "Record Changes History", 1, "kendo-window-custom", 3, "close", "width", "height", "minHeight", "minWidth", "resizable", "top", "left"], ["type", "converging-spinner", 4, "ngIf"], [1, "record-changes-container"], ["type", "converging-spinner"], [1, "filter-panel"], [1, "filter-controls"], ["type", "text", "placeholder", "Search changes...", "aria-label", "Search record changes", 1, "search-input", 3, "ngModelChange", "input", "ngModel"], ["aria-label", "Filter by change type", 1, "filter-select", 3, "ngModelChange", "change", "ngModel"], ["value", ""], ["value", "Create"], ["value", "Update"], ["value", "Delete"], ["aria-label", "Filter by change source", 1, "filter-select", 3, "ngModelChange", "change", "ngModel"], ["value", "Internal"], ["value", "External"], [1, "filter-results"], [1, "timeline-container"], [1, "no-changes-message"], [1, "timeline"], [1, "fa-solid", "fa-info-circle"], [1, "fa-solid", "fa-search"], [1, "timeline-item", 3, "expanded"], [1, "timeline-item", 3, "click", "keydown"], [1, "timeline-marker"], [1, "timeline-icon"], [1, "timeline-line"], [1, "timeline-content"], [1, "change-header"], [1, "change-title"], [1, "change-type-badge"], [1, "change-user"], [1, "change-source"], [1, "change-meta"], [1, "change-time", 3, "title"], [1, "change-status"], [1, "change-integration"], [1, "change-summary"], [1, "change-details"], [1, "change-timestamp"], ["aria-hidden", "true", 1, "fa-solid", "fa-clock"], [1, "creation-details"], [1, "deletion-details"], [1, "update-details"], [1, "change-comments"], [1, "change-errors"], [1, "fa-solid", "fa-plus"], [1, "field-changes"], [1, "field-change", "created"], [1, "field-name"], [1, "field-value", "new-value"], [1, "fa-solid", "fa-trash"], [1, "deletion-note"], [1, "fa-solid", "fa-edit"], [1, "field-change"], [1, "boolean-change"], [1, "diff-view"], [1, "value-diff"], [1, "new-value"], [1, "diff-content", 3, "innerHTML"], [1, "old-value"], [1, "value-label"], [1, "value"], [1, "diff-arrow"], ["aria-hidden", "true", 1, "fa-solid", "fa-arrow-right"], [1, "fa-solid", "fa-comment"], [1, "fa-solid", "fa-exclamation-triangle"], [1, "error-log"]], template: function RecordChangesComponent_Template(rf, ctx) { if (rf & 1) {
190
670
  const _r1 = i0.ɵɵgetCurrentView();
191
671
  i0.ɵɵelementStart(0, "div", null, 0);
192
672
  i0.ɵɵelement(2, "div", 2);
193
673
  i0.ɵɵelementStart(3, "kendo-window", 3);
194
674
  i0.ɵɵlistener("close", function RecordChangesComponent_Template_kendo_window_close_3_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.closePropertiesDialog()); });
195
- i0.ɵɵtemplate(4, RecordChangesComponent_kendo_loader_4_Template, 1, 0, "kendo-loader", 4)(5, RecordChangesComponent_div_5_Template, 5, 8, "div", 5);
675
+ i0.ɵɵtemplate(4, RecordChangesComponent_kendo_loader_4_Template, 1, 0, "kendo-loader", 4)(5, RecordChangesComponent_Conditional_5_Template, 25, 6, "div", 5);
196
676
  i0.ɵɵelementEnd()();
197
677
  } if (rf & 2) {
198
678
  i0.ɵɵadvance(3);
199
- i0.ɵɵproperty("width", 700)("height", 525)("minHeight", 300)("minWidth", 400)("resizable", true);
679
+ i0.ɵɵproperty("width", 800)("height", 650)("minHeight", 400)("minWidth", 600)("resizable", true)("top", 50)("left", 50);
200
680
  i0.ɵɵadvance();
201
681
  i0.ɵɵproperty("ngIf", ctx.showloader);
202
682
  i0.ɵɵadvance();
203
- i0.ɵɵproperty("ngIf", !ctx.showloader);
204
- } }, dependencies: [i2.NgForOf, i2.NgIf, i3.GridComponent, i3.DataBindingDirective, i3.ColumnComponent, i3.CellTemplateDirective, i4.WindowComponent, i5.LoaderComponent] });
683
+ i0.ɵɵconditional(!ctx.showloader ? 5 : -1);
684
+ } }, dependencies: [i3.NgIf, i4.NgSelectOption, i4.ɵNgSelectMultipleOption, i4.DefaultValueAccessor, i4.SelectControlValueAccessor, i4.NgControlStatus, i4.NgModel, i5.WindowComponent, i6.LoaderComponent], styles: ["/* Record Changes Timeline Styles */\n.record-changes-container {\n display: flex;\n flex-direction: column;\n height: 100%;\n padding: 1rem;\n}\n\n/* Filter Panel */\n.filter-panel {\n background: #f8f9fa;\n border-radius: 8px;\n padding: 1rem;\n margin-bottom: 1rem;\n border: 1px solid #e9ecef;\n}\n\n.filter-controls {\n display: flex;\n gap: 1rem;\n align-items: center;\n flex-wrap: wrap;\n}\n\n.search-input {\n flex: 1;\n min-width: 200px;\n padding: 0.5rem 1rem;\n border: 1px solid #ced4da;\n border-radius: 4px;\n font-size: 0.9rem;\n}\n\n.search-input:focus {\n outline: none;\n border-color: #007bff;\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.filter-select {\n padding: 0.5rem;\n border: 1px solid #ced4da;\n border-radius: 4px;\n background: white;\n font-size: 0.9rem;\n min-width: 120px;\n}\n\n.filter-select:focus {\n outline: none;\n border-color: #007bff;\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.filter-results {\n margin-top: 0.5rem;\n font-size: 0.85rem;\n color: #6c757d;\n font-style: italic;\n}\n\n/* Timeline Container */\n.timeline-container {\n flex: 1;\n overflow-y: auto;\n padding-right: 0.5rem;\n}\n\n.no-changes-message {\n text-align: center;\n padding: 3rem 1rem;\n color: #6c757d;\n font-size: 1.1rem;\n}\n\n.no-changes-message i {\n display: block;\n font-size: 2rem;\n margin-bottom: 1rem;\n color: #adb5bd;\n}\n\n/* Timeline */\n.timeline {\n position: relative;\n padding-left: 2rem;\n}\n\n.timeline-item {\n position: relative;\n margin-bottom: 1.5rem;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.timeline-item:hover {\n transform: translateX(2px);\n}\n\n.timeline-item:focus {\n outline: 2px solid #007bff;\n outline-offset: 2px;\n border-radius: 4px;\n}\n\n.timeline-item.expanded {\n margin-bottom: 2rem;\n}\n\n/* Timeline Marker */\n.timeline-marker {\n position: absolute;\n left: -2rem;\n top: 0;\n display: flex;\n flex-direction: column;\n align-items: center;\n}\n\n.timeline-icon {\n width: 2.5rem;\n height: 2.5rem;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 0.9rem;\n color: white;\n box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n z-index: 2;\n}\n\n.timeline-icon.change-create {\n background: linear-gradient(135deg, #28a745, #20c997);\n}\n\n.timeline-icon.change-update {\n background: linear-gradient(135deg, #007bff, #6f42c1);\n}\n\n.timeline-icon.change-delete {\n background: linear-gradient(135deg, #dc3545, #fd7e14);\n}\n\n.timeline-icon.change-unknown {\n background: linear-gradient(135deg, #6c757d, #adb5bd);\n}\n\n.timeline-line {\n width: 2px;\n height: 2rem;\n background: #e9ecef;\n margin-top: 0.5rem;\n}\n\n/* Timeline Content */\n.timeline-content {\n background: white;\n border: 1px solid #e9ecef;\n border-radius: 8px;\n padding: 1rem;\n box-shadow: 0 2px 4px rgba(0,0,0,0.05);\n transition: box-shadow 0.2s ease;\n}\n\n.timeline-item:hover .timeline-content {\n box-shadow: 0 4px 8px rgba(0,0,0,0.1);\n}\n\n.timeline-item.expanded .timeline-content {\n box-shadow: 0 4px 12px rgba(0,0,0,0.15);\n}\n\n/* Change Header */\n.change-header {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n margin-bottom: 0.75rem;\n flex-wrap: wrap;\n gap: 0.5rem;\n}\n\n.change-title {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n flex-wrap: wrap;\n}\n\n.change-type-badge {\n font-size: 0.75rem;\n font-weight: 600;\n padding: 0.25rem 0.5rem;\n border-radius: 12px;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n}\n\n.badge-create {\n background: #d4edda;\n color: #155724;\n}\n\n.badge-update {\n background: #cce7ff;\n color: #004085;\n}\n\n.badge-delete {\n background: #f8d7da;\n color: #721c24;\n}\n\n.badge-unknown {\n background: #e2e3e5;\n color: #383d41;\n}\n\n.change-user {\n font-weight: 600;\n color: #495057;\n}\n\n.change-source {\n font-size: 0.8rem;\n padding: 0.2rem 0.4rem;\n border-radius: 8px;\n font-weight: 500;\n}\n\n.source-internal {\n background: #e7f3ff;\n color: #0056b3;\n}\n\n.source-external {\n background: #fff3cd;\n color: #856404;\n}\n\n.change-meta {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n font-size: 0.85rem;\n color: #6c757d;\n flex-wrap: wrap;\n}\n\n.change-time {\n font-weight: 500;\n}\n\n.change-status {\n padding: 0.2rem 0.4rem;\n border-radius: 8px;\n font-size: 0.75rem;\n font-weight: 600;\n text-transform: uppercase;\n}\n\n.status-complete {\n background: #d4edda;\n color: #155724;\n}\n\n.status-pending {\n background: #fff3cd;\n color: #856404;\n}\n\n.status-error {\n background: #f8d7da;\n color: #721c24;\n}\n\n.status-unknown {\n background: #e2e3e5;\n color: #383d41;\n}\n\n.change-integration {\n font-style: italic;\n color: #495057;\n}\n\n/* Change Summary */\n.change-summary {\n color: #6c757d;\n font-size: 0.9rem;\n line-height: 1.4;\n}\n\n/* Change Details */\n.change-details {\n margin-top: 1rem;\n padding-top: 1rem;\n border-top: 1px solid #e9ecef;\n}\n\n.change-timestamp {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n margin-bottom: 1rem;\n padding: 0.5rem;\n background: #f8f9fa;\n border-radius: 6px;\n border-left: 4px solid #6c757d;\n font-size: 0.9rem;\n color: #495057;\n}\n\n.change-timestamp i {\n color: #6c757d;\n}\n\n.change-details h4 {\n font-size: 1rem;\n margin-bottom: 1rem;\n color: #495057;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n}\n\n.change-details h5 {\n font-size: 0.9rem;\n margin-bottom: 0.5rem;\n color: #495057;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n}\n\n/* Field Changes */\n.field-changes {\n display: flex;\n flex-direction: column;\n gap: 1rem;\n}\n\n.field-change {\n background: #f8f9fa;\n border-radius: 6px;\n padding: 0.75rem;\n border-left: 4px solid #007bff;\n}\n\n.field-change.created {\n border-left-color: #28a745;\n}\n\n.field-name {\n font-weight: 600;\n color: #495057;\n margin-bottom: 0.5rem;\n display: block;\n}\n\n.field-value {\n font-family: 'Courier New', monospace;\n font-size: 0.85rem;\n padding: 0.25rem 0.5rem;\n border-radius: 4px;\n background: white;\n border: 1px solid #dee2e6;\n}\n\n.value-diff {\n display: grid;\n grid-template-columns: 1fr auto 1fr;\n gap: 1rem;\n align-items: center;\n}\n\n.old-value, .new-value {\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n}\n\n.value-label {\n font-size: 0.75rem;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n color: #6c757d;\n}\n\n.old-value .value {\n color: #6c757d;\n background: #f8f9fa;\n text-decoration: line-through;\n}\n\n.new-value .value {\n color: #155724;\n background: #d4edda;\n font-weight: 500;\n}\n\n.value {\n font-family: 'Courier New', monospace;\n font-size: 0.85rem;\n padding: 0.25rem 0.5rem;\n border-radius: 4px;\n border: 1px solid #dee2e6;\n word-break: break-all;\n}\n\n.diff-arrow {\n color: #007bff;\n font-size: 1.2rem;\n}\n\n.boolean-change .new-value {\n font-weight: 600;\n color: #007bff;\n font-size: 0.9rem;\n}\n\n/* Creation Details */\n.creation-details .field-change {\n border-left-color: #28a745;\n}\n\n.creation-details .field-value {\n color: #155724;\n background: #d4edda;\n font-weight: 500;\n}\n\n/* Deletion Details */\n.deletion-details {\n text-align: center;\n padding: 1rem;\n}\n\n.deletion-note {\n color: #6c757d;\n font-style: italic;\n margin-bottom: 0;\n}\n\n/* Diff View Styles - Scoped to this component */\nmj-record-changes .diff-view,\n.record-changes-container .diff-view {\n margin-top: 0.5rem !important;\n border: 1px dashed #28a745;\n border-radius: 4px;\n padding: 0.25rem;\n}\n\nmj-record-changes .diff-content,\n.record-changes-container .diff-content {\n background: #ffffff !important;\n border: 2px solid #007bff !important;\n border-radius: 6px;\n padding: 0.75rem !important;\n font-family: 'SFMono-Regular', 'Consolas', 'Liberation Mono', 'Menlo', monospace !important;\n font-size: 0.85rem !important;\n line-height: 1.45 !important;\n overflow-x: auto;\n min-height: 2rem;\n}\n\nmj-record-changes .diff-container,\n.record-changes-container .diff-container {\n word-wrap: break-word;\n white-space: pre-wrap;\n}\n\nmj-record-changes .diff-added,\n.record-changes-container .diff-added {\n background-color: #d1f5d3 !important;\n color: #22863a !important;\n text-decoration: none !important;\n border-radius: 3px;\n padding: 2px 4px !important;\n font-weight: 600 !important;\n display: inline;\n border: 1px solid #28a745;\n}\n\nmj-record-changes .diff-removed,\n.record-changes-container .diff-removed {\n background-color: #ffeef0 !important;\n color: #d73a49 !important;\n text-decoration: line-through !important;\n border-radius: 3px;\n padding: 2px 4px !important;\n font-weight: 600 !important;\n display: inline;\n border: 1px solid #dc3545;\n}\n\nmj-record-changes .diff-unchanged,\n.record-changes-container .diff-unchanged {\n color: #24292e !important;\n display: inline;\n}\n\n/* Enhanced diff styling for better readability */\nmj-record-changes .diff-added:not(:empty)::before,\n.record-changes-container .diff-added:not(:empty)::before {\n content: '';\n background: #28a745;\n width: 3px;\n height: 100%;\n position: absolute;\n left: -1px;\n border-radius: 1px;\n}\n\nmj-record-changes .diff-removed:not(:empty)::before,\n.record-changes-container .diff-removed:not(:empty)::before {\n content: '';\n background: #dc3545;\n width: 3px;\n height: 100%;\n position: absolute;\n left: -1px;\n border-radius: 1px;\n}\n\nmj-record-changes .diff-added, \nmj-record-changes .diff-removed,\n.record-changes-container .diff-added, \n.record-changes-container .diff-removed {\n position: relative;\n margin: 0 1px;\n display: inline;\n}\n\n/* Hover effects for diff elements */\nmj-record-changes .diff-added:hover,\n.record-changes-container .diff-added:hover {\n background-color: #c3f0c5 !important;\n box-shadow: 0 0 0 2px rgba(40, 167, 69, 0.15);\n}\n\nmj-record-changes .diff-removed:hover,\n.record-changes-container .diff-removed:hover {\n background-color: #ffd6dd !important;\n box-shadow: 0 0 0 2px rgba(220, 53, 69, 0.15);\n}\n\n/* Multi-line diff styling */\nmj-record-changes .diff-content .diff-added,\nmj-record-changes .diff-content .diff-removed,\n.record-changes-container .diff-content .diff-added,\n.record-changes-container .diff-content .diff-removed {\n padding: 1px 3px;\n border-radius: 3px;\n}\n\nmj-record-changes .diff-content .diff-added + .diff-added,\nmj-record-changes .diff-content .diff-removed + .diff-removed,\n.record-changes-container .diff-content .diff-added + .diff-added,\n.record-changes-container .diff-content .diff-removed + .diff-removed {\n margin-left: 0;\n}\n\n/* Word diff specific styling */\nmj-record-changes .diff-container.word-diff .diff-added,\nmj-record-changes .diff-container.word-diff .diff-removed,\n.record-changes-container .diff-container.word-diff .diff-added,\n.record-changes-container .diff-container.word-diff .diff-removed {\n padding: 2px 4px;\n margin: 0 1px;\n border-radius: 4px;\n}\n\n/* Comments and Errors */\n.change-comments, .change-errors {\n margin-top: 1rem;\n padding: 0.75rem;\n border-radius: 6px;\n}\n\n.change-comments {\n background: #e7f3ff;\n border-left: 4px solid #007bff;\n}\n\n.change-errors {\n background: #f8d7da;\n border-left: 4px solid #dc3545;\n}\n\n.error-log {\n background: #ffffff;\n padding: 0.5rem;\n border-radius: 4px;\n font-family: 'Courier New', monospace;\n font-size: 0.8rem;\n color: #721c24;\n margin: 0;\n white-space: pre-wrap;\n overflow-x: auto;\n}\n\n/* Responsive Design */\n@media (max-width: 768px) {\n .filter-controls {\n flex-direction: column;\n align-items: stretch;\n }\n \n .search-input, .filter-select {\n width: 100%;\n }\n \n .change-header {\n flex-direction: column;\n align-items: flex-start;\n }\n \n .change-meta {\n flex-direction: column;\n align-items: flex-start;\n gap: 0.25rem;\n }\n \n .value-diff {\n grid-template-columns: 1fr;\n gap: 0.5rem;\n }\n \n .diff-arrow {\n justify-self: center;\n transform: rotate(90deg);\n }\n \n .timeline {\n padding-left: 1.5rem;\n }\n \n .timeline-marker {\n left: -1.5rem;\n }\n \n .timeline-icon {\n width: 2rem;\n height: 2rem;\n font-size: 0.8rem;\n }\n \n /* Responsive diff view */\n .diff-content {\n font-size: 0.8rem;\n padding: 0.5rem;\n }\n \n .diff-added, .diff-removed {\n padding: 1px 2px;\n }\n}\n\n@media (max-width: 480px) {\n .record-changes-container {\n padding: 0.5rem;\n }\n \n .timeline-content {\n padding: 0.75rem;\n }\n \n .field-change {\n padding: 0.5rem;\n }\n}"], encapsulation: 2 });
205
685
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(RecordChangesComponent, [{
206
686
  type: Component,
207
- args: [{ selector: 'mj-record-changes', template: "<div #recordChangesWrapper>\n <div class=\"k-overlay\"></div>\n <kendo-window \n class=\"kendo-window-custom\"\n [width]=\"700\"\n [height]=\"525\"\n [minHeight]=\"300\"\n [minWidth]=\"400\"\n [resizable]=\"true\"\n title=\"Record Changes\"\n (close)=\"closePropertiesDialog()\"\n >\n <kendo-loader *ngIf=\"showloader\" type=\"converging-spinner\" ></kendo-loader>\n <div class=\"k-d-flex k-flex-col k-justify-content-between k-h-full\" #dialogContainer *ngIf=\"!showloader\">\n <div class=\"kendo-grid-container\">\n <kendo-grid \n [kendoGridBinding]=\"viewData\" \n scrollable=\"virtual\" \n [pageSize]=\"100\" \n [sortable]=\"true\"\n [sort]=\"sortSettings\" \n [loading]=\"showloader\" \n [resizable]=\"true\" \n [navigable]=\"true\"\n >\n <kendo-grid-column \n *ngFor=\"let item of visibleColumns; let i = index\" \n field=\"{{item.field}}\"\n title=\"{{item.title}}\" \n [width]=\"item.width\"\n [headerStyle]=\"{ 'font-weight' : 'bold', 'background-color': '#a9c2af' }\"\n >\n <ng-template kendoGridCellTemplate let-dataItem>\n <span [innerHTML]=\"FormatColumnValue(item, dataItem[item.field], dataItem)\"></span>\n </ng-template>\n </kendo-grid-column>\n </kendo-grid>\n </div>\n </div>\n </kendo-window>\n</div>" }]
208
- }], () => [{ type: i1.DomSanitizer }, { type: i0.Renderer2 }], { dialogClosed: [{
687
+ args: [{ selector: 'mj-record-changes', encapsulation: ViewEncapsulation.None, template: "<div #recordChangesWrapper>\n <div class=\"k-overlay\"></div>\n <kendo-window \n class=\"kendo-window-custom\"\n [width]=\"800\"\n [height]=\"650\"\n [minHeight]=\"400\"\n [minWidth]=\"600\"\n [resizable]=\"true\"\n [top]=\"50\"\n [left]=\"50\"\n title=\"Record Changes History\"\n (close)=\"closePropertiesDialog()\"\n >\n <kendo-loader *ngIf=\"showloader\" type=\"converging-spinner\"></kendo-loader>\n @if (!showloader) {\n <div class=\"record-changes-container\" #dialogContainer>\n <!-- Filter Panel -->\n <div class=\"filter-panel\">\n <div class=\"filter-controls\">\n <input \n type=\"text\" \n class=\"search-input\"\n placeholder=\"Search changes...\"\n [(ngModel)]=\"searchTerm\"\n (input)=\"onSearchChange()\"\n aria-label=\"Search record changes\"\n />\n <select \n class=\"filter-select\"\n [(ngModel)]=\"selectedType\"\n (change)=\"onFilterChange()\"\n aria-label=\"Filter by change type\"\n >\n <option value=\"\">All Changes</option>\n <option value=\"Create\">Created</option>\n <option value=\"Update\">Updated</option>\n <option value=\"Delete\">Deleted</option>\n </select>\n <select \n class=\"filter-select\"\n [(ngModel)]=\"selectedSource\"\n (change)=\"onFilterChange()\"\n aria-label=\"Filter by change source\"\n >\n <option value=\"\">All Sources</option>\n <option value=\"Internal\">Internal</option>\n <option value=\"External\">External</option>\n </select>\n </div>\n @if (filteredData.length !== viewData.length) {\n <div class=\"filter-results\">\n Showing {{ filteredData.length }} of {{ viewData.length }} changes\n </div>\n }\n </div>\n\n <!-- Timeline Container -->\n <div class=\"timeline-container\" [attr.aria-label]=\"'Timeline of changes for ' + record.EntityInfo.Name + ' record'\">\n @if (filteredData.length === 0) {\n <div class=\"no-changes-message\">\n @if (viewData.length === 0) {\n <i class=\"fa-solid fa-info-circle\"></i>\n No changes found for this record.\n } @else {\n <i class=\"fa-solid fa-search\"></i>\n No changes match your current filters.\n }\n </div>\n } @else {\n <div class=\"timeline\">\n @for (change of filteredData; track change.ID; let i = $index) {\n <div \n class=\"timeline-item\"\n [class.expanded]=\"expandedItems.has(change.ID)\"\n [attr.tabindex]=\"0\"\n [attr.aria-expanded]=\"expandedItems.has(change.ID)\"\n [attr.aria-label]=\"getTimelineItemLabel(change)\"\n (click)=\"toggleExpansion(change.ID)\"\n (keydown)=\"onTimelineItemKeydown($event, change.ID)\"\n >\n <div class=\"timeline-marker\">\n <div class=\"timeline-icon\" [class]=\"getChangeTypeClass(change.Type)\">\n <i [class]=\"getChangeTypeIcon(change.Type)\" [attr.aria-hidden]=\"true\"></i>\n </div>\n @if (i < filteredData.length - 1) {\n <div class=\"timeline-line\"></div>\n }\n </div>\n \n <div class=\"timeline-content\">\n <div class=\"change-header\">\n <div class=\"change-title\">\n <span class=\"change-type-badge\" [class]=\"getChangeTypeBadgeClass(change.Type)\">\n {{ change.Type }}\n </span>\n <span class=\"change-user\">{{ change.User || 'Unknown User' }}</span>\n <span class=\"change-source\" [class]=\"getSourceClass(change.Source)\">\n {{ change.Source }}\n </span>\n </div>\n <div class=\"change-meta\">\n <span class=\"change-time\" [title]=\"formatFullDateTime(change.ChangedAt)\">\n {{ formatRelativeTime(change.ChangedAt) }}\n </span>\n <span class=\"change-status\" [class]=\"getStatusClass(change.Status)\">\n {{ change.Status }}\n </span>\n @if (change.Integration) {\n <span class=\"change-integration\">\n via {{ change.Integration }}\n </span>\n }\n </div>\n </div>\n \n @if (!expandedItems.has(change.ID)) {\n <div class=\"change-summary\">\n {{ getChangeSummary(change) }}\n </div>\n }\n \n @if (expandedItems.has(change.ID)) {\n <div class=\"change-details\">\n <div class=\"change-timestamp\">\n <i class=\"fa-solid fa-clock\" aria-hidden=\"true\"></i>\n <strong>{{ formatFullDateTime(change.ChangedAt) }}</strong>\n </div>\n @if (change.Type === 'Create') {\n <div class=\"creation-details\">\n <h4><i class=\"fa-solid fa-plus\"></i> Record Created</h4>\n @if (change.FullRecordJSON) {\n <div class=\"field-changes\">\n @for (field of getCreatedFields(change); track field.name) {\n <div class=\"field-change created\">\n <span class=\"field-name\">{{ field.displayName }}</span>\n <span class=\"field-value new-value\">{{ field.value }}</span>\n </div>\n }\n </div>\n }\n </div>\n } @else if (change.Type === 'Delete') {\n <div class=\"deletion-details\">\n <h4><i class=\"fa-solid fa-trash\"></i> Record Deleted</h4>\n <p class=\"deletion-note\">This record was permanently removed from the system.</p>\n </div>\n } @else {\n <div class=\"update-details\">\n <h4><i class=\"fa-solid fa-edit\"></i> Fields Changed</h4>\n <div class=\"field-changes\">\n @for (fieldChange of getFieldChanges(change); track fieldChange.field) {\n <div class=\"field-change\">\n <div class=\"field-name\">{{ fieldChange.displayName }}</div>\n @if (fieldChange.isBooleanField) {\n <div class=\"boolean-change\">\n <span class=\"new-value\">{{ fieldChange.newValue }}</span>\n </div>\n } @else if (fieldChange.diffHtml) {\n <div class=\"diff-view\">\n <div class=\"diff-content\" [innerHTML]=\"fieldChange.diffHtml\"></div>\n </div>\n } @else {\n <div class=\"value-diff\">\n <div class=\"old-value\">\n <span class=\"value-label\">From:</span>\n <span class=\"value\">{{ fieldChange.oldValue || '(empty)' }}</span>\n </div>\n <div class=\"diff-arrow\">\n <i class=\"fa-solid fa-arrow-right\" aria-hidden=\"true\"></i>\n </div>\n <div class=\"new-value\">\n <span class=\"value-label\">To:</span>\n <span class=\"value\">{{ fieldChange.newValue || '(empty)' }}</span>\n </div>\n </div>\n }\n </div>\n }\n </div>\n </div>\n }\n \n @if (change.Comments) {\n <div class=\"change-comments\">\n <h5><i class=\"fa-solid fa-comment\"></i> Comments</h5>\n <p>{{ change.Comments }}</p>\n </div>\n }\n \n @if (change.ErrorLog) {\n <div class=\"change-errors\">\n <h5><i class=\"fa-solid fa-exclamation-triangle\"></i> Errors</h5>\n <pre class=\"error-log\">{{ change.ErrorLog }}</pre>\n </div>\n }\n </div>\n }\n </div>\n </div>\n }\n </div>\n }\n </div>\n </div>\n }\n </kendo-window>\n</div>", styles: ["/* Record Changes Timeline Styles */\n.record-changes-container {\n display: flex;\n flex-direction: column;\n height: 100%;\n padding: 1rem;\n}\n\n/* Filter Panel */\n.filter-panel {\n background: #f8f9fa;\n border-radius: 8px;\n padding: 1rem;\n margin-bottom: 1rem;\n border: 1px solid #e9ecef;\n}\n\n.filter-controls {\n display: flex;\n gap: 1rem;\n align-items: center;\n flex-wrap: wrap;\n}\n\n.search-input {\n flex: 1;\n min-width: 200px;\n padding: 0.5rem 1rem;\n border: 1px solid #ced4da;\n border-radius: 4px;\n font-size: 0.9rem;\n}\n\n.search-input:focus {\n outline: none;\n border-color: #007bff;\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.filter-select {\n padding: 0.5rem;\n border: 1px solid #ced4da;\n border-radius: 4px;\n background: white;\n font-size: 0.9rem;\n min-width: 120px;\n}\n\n.filter-select:focus {\n outline: none;\n border-color: #007bff;\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.filter-results {\n margin-top: 0.5rem;\n font-size: 0.85rem;\n color: #6c757d;\n font-style: italic;\n}\n\n/* Timeline Container */\n.timeline-container {\n flex: 1;\n overflow-y: auto;\n padding-right: 0.5rem;\n}\n\n.no-changes-message {\n text-align: center;\n padding: 3rem 1rem;\n color: #6c757d;\n font-size: 1.1rem;\n}\n\n.no-changes-message i {\n display: block;\n font-size: 2rem;\n margin-bottom: 1rem;\n color: #adb5bd;\n}\n\n/* Timeline */\n.timeline {\n position: relative;\n padding-left: 2rem;\n}\n\n.timeline-item {\n position: relative;\n margin-bottom: 1.5rem;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.timeline-item:hover {\n transform: translateX(2px);\n}\n\n.timeline-item:focus {\n outline: 2px solid #007bff;\n outline-offset: 2px;\n border-radius: 4px;\n}\n\n.timeline-item.expanded {\n margin-bottom: 2rem;\n}\n\n/* Timeline Marker */\n.timeline-marker {\n position: absolute;\n left: -2rem;\n top: 0;\n display: flex;\n flex-direction: column;\n align-items: center;\n}\n\n.timeline-icon {\n width: 2.5rem;\n height: 2.5rem;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 0.9rem;\n color: white;\n box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n z-index: 2;\n}\n\n.timeline-icon.change-create {\n background: linear-gradient(135deg, #28a745, #20c997);\n}\n\n.timeline-icon.change-update {\n background: linear-gradient(135deg, #007bff, #6f42c1);\n}\n\n.timeline-icon.change-delete {\n background: linear-gradient(135deg, #dc3545, #fd7e14);\n}\n\n.timeline-icon.change-unknown {\n background: linear-gradient(135deg, #6c757d, #adb5bd);\n}\n\n.timeline-line {\n width: 2px;\n height: 2rem;\n background: #e9ecef;\n margin-top: 0.5rem;\n}\n\n/* Timeline Content */\n.timeline-content {\n background: white;\n border: 1px solid #e9ecef;\n border-radius: 8px;\n padding: 1rem;\n box-shadow: 0 2px 4px rgba(0,0,0,0.05);\n transition: box-shadow 0.2s ease;\n}\n\n.timeline-item:hover .timeline-content {\n box-shadow: 0 4px 8px rgba(0,0,0,0.1);\n}\n\n.timeline-item.expanded .timeline-content {\n box-shadow: 0 4px 12px rgba(0,0,0,0.15);\n}\n\n/* Change Header */\n.change-header {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n margin-bottom: 0.75rem;\n flex-wrap: wrap;\n gap: 0.5rem;\n}\n\n.change-title {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n flex-wrap: wrap;\n}\n\n.change-type-badge {\n font-size: 0.75rem;\n font-weight: 600;\n padding: 0.25rem 0.5rem;\n border-radius: 12px;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n}\n\n.badge-create {\n background: #d4edda;\n color: #155724;\n}\n\n.badge-update {\n background: #cce7ff;\n color: #004085;\n}\n\n.badge-delete {\n background: #f8d7da;\n color: #721c24;\n}\n\n.badge-unknown {\n background: #e2e3e5;\n color: #383d41;\n}\n\n.change-user {\n font-weight: 600;\n color: #495057;\n}\n\n.change-source {\n font-size: 0.8rem;\n padding: 0.2rem 0.4rem;\n border-radius: 8px;\n font-weight: 500;\n}\n\n.source-internal {\n background: #e7f3ff;\n color: #0056b3;\n}\n\n.source-external {\n background: #fff3cd;\n color: #856404;\n}\n\n.change-meta {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n font-size: 0.85rem;\n color: #6c757d;\n flex-wrap: wrap;\n}\n\n.change-time {\n font-weight: 500;\n}\n\n.change-status {\n padding: 0.2rem 0.4rem;\n border-radius: 8px;\n font-size: 0.75rem;\n font-weight: 600;\n text-transform: uppercase;\n}\n\n.status-complete {\n background: #d4edda;\n color: #155724;\n}\n\n.status-pending {\n background: #fff3cd;\n color: #856404;\n}\n\n.status-error {\n background: #f8d7da;\n color: #721c24;\n}\n\n.status-unknown {\n background: #e2e3e5;\n color: #383d41;\n}\n\n.change-integration {\n font-style: italic;\n color: #495057;\n}\n\n/* Change Summary */\n.change-summary {\n color: #6c757d;\n font-size: 0.9rem;\n line-height: 1.4;\n}\n\n/* Change Details */\n.change-details {\n margin-top: 1rem;\n padding-top: 1rem;\n border-top: 1px solid #e9ecef;\n}\n\n.change-timestamp {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n margin-bottom: 1rem;\n padding: 0.5rem;\n background: #f8f9fa;\n border-radius: 6px;\n border-left: 4px solid #6c757d;\n font-size: 0.9rem;\n color: #495057;\n}\n\n.change-timestamp i {\n color: #6c757d;\n}\n\n.change-details h4 {\n font-size: 1rem;\n margin-bottom: 1rem;\n color: #495057;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n}\n\n.change-details h5 {\n font-size: 0.9rem;\n margin-bottom: 0.5rem;\n color: #495057;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n}\n\n/* Field Changes */\n.field-changes {\n display: flex;\n flex-direction: column;\n gap: 1rem;\n}\n\n.field-change {\n background: #f8f9fa;\n border-radius: 6px;\n padding: 0.75rem;\n border-left: 4px solid #007bff;\n}\n\n.field-change.created {\n border-left-color: #28a745;\n}\n\n.field-name {\n font-weight: 600;\n color: #495057;\n margin-bottom: 0.5rem;\n display: block;\n}\n\n.field-value {\n font-family: 'Courier New', monospace;\n font-size: 0.85rem;\n padding: 0.25rem 0.5rem;\n border-radius: 4px;\n background: white;\n border: 1px solid #dee2e6;\n}\n\n.value-diff {\n display: grid;\n grid-template-columns: 1fr auto 1fr;\n gap: 1rem;\n align-items: center;\n}\n\n.old-value, .new-value {\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n}\n\n.value-label {\n font-size: 0.75rem;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n color: #6c757d;\n}\n\n.old-value .value {\n color: #6c757d;\n background: #f8f9fa;\n text-decoration: line-through;\n}\n\n.new-value .value {\n color: #155724;\n background: #d4edda;\n font-weight: 500;\n}\n\n.value {\n font-family: 'Courier New', monospace;\n font-size: 0.85rem;\n padding: 0.25rem 0.5rem;\n border-radius: 4px;\n border: 1px solid #dee2e6;\n word-break: break-all;\n}\n\n.diff-arrow {\n color: #007bff;\n font-size: 1.2rem;\n}\n\n.boolean-change .new-value {\n font-weight: 600;\n color: #007bff;\n font-size: 0.9rem;\n}\n\n/* Creation Details */\n.creation-details .field-change {\n border-left-color: #28a745;\n}\n\n.creation-details .field-value {\n color: #155724;\n background: #d4edda;\n font-weight: 500;\n}\n\n/* Deletion Details */\n.deletion-details {\n text-align: center;\n padding: 1rem;\n}\n\n.deletion-note {\n color: #6c757d;\n font-style: italic;\n margin-bottom: 0;\n}\n\n/* Diff View Styles - Scoped to this component */\nmj-record-changes .diff-view,\n.record-changes-container .diff-view {\n margin-top: 0.5rem !important;\n border: 1px dashed #28a745;\n border-radius: 4px;\n padding: 0.25rem;\n}\n\nmj-record-changes .diff-content,\n.record-changes-container .diff-content {\n background: #ffffff !important;\n border: 2px solid #007bff !important;\n border-radius: 6px;\n padding: 0.75rem !important;\n font-family: 'SFMono-Regular', 'Consolas', 'Liberation Mono', 'Menlo', monospace !important;\n font-size: 0.85rem !important;\n line-height: 1.45 !important;\n overflow-x: auto;\n min-height: 2rem;\n}\n\nmj-record-changes .diff-container,\n.record-changes-container .diff-container {\n word-wrap: break-word;\n white-space: pre-wrap;\n}\n\nmj-record-changes .diff-added,\n.record-changes-container .diff-added {\n background-color: #d1f5d3 !important;\n color: #22863a !important;\n text-decoration: none !important;\n border-radius: 3px;\n padding: 2px 4px !important;\n font-weight: 600 !important;\n display: inline;\n border: 1px solid #28a745;\n}\n\nmj-record-changes .diff-removed,\n.record-changes-container .diff-removed {\n background-color: #ffeef0 !important;\n color: #d73a49 !important;\n text-decoration: line-through !important;\n border-radius: 3px;\n padding: 2px 4px !important;\n font-weight: 600 !important;\n display: inline;\n border: 1px solid #dc3545;\n}\n\nmj-record-changes .diff-unchanged,\n.record-changes-container .diff-unchanged {\n color: #24292e !important;\n display: inline;\n}\n\n/* Enhanced diff styling for better readability */\nmj-record-changes .diff-added:not(:empty)::before,\n.record-changes-container .diff-added:not(:empty)::before {\n content: '';\n background: #28a745;\n width: 3px;\n height: 100%;\n position: absolute;\n left: -1px;\n border-radius: 1px;\n}\n\nmj-record-changes .diff-removed:not(:empty)::before,\n.record-changes-container .diff-removed:not(:empty)::before {\n content: '';\n background: #dc3545;\n width: 3px;\n height: 100%;\n position: absolute;\n left: -1px;\n border-radius: 1px;\n}\n\nmj-record-changes .diff-added, \nmj-record-changes .diff-removed,\n.record-changes-container .diff-added, \n.record-changes-container .diff-removed {\n position: relative;\n margin: 0 1px;\n display: inline;\n}\n\n/* Hover effects for diff elements */\nmj-record-changes .diff-added:hover,\n.record-changes-container .diff-added:hover {\n background-color: #c3f0c5 !important;\n box-shadow: 0 0 0 2px rgba(40, 167, 69, 0.15);\n}\n\nmj-record-changes .diff-removed:hover,\n.record-changes-container .diff-removed:hover {\n background-color: #ffd6dd !important;\n box-shadow: 0 0 0 2px rgba(220, 53, 69, 0.15);\n}\n\n/* Multi-line diff styling */\nmj-record-changes .diff-content .diff-added,\nmj-record-changes .diff-content .diff-removed,\n.record-changes-container .diff-content .diff-added,\n.record-changes-container .diff-content .diff-removed {\n padding: 1px 3px;\n border-radius: 3px;\n}\n\nmj-record-changes .diff-content .diff-added + .diff-added,\nmj-record-changes .diff-content .diff-removed + .diff-removed,\n.record-changes-container .diff-content .diff-added + .diff-added,\n.record-changes-container .diff-content .diff-removed + .diff-removed {\n margin-left: 0;\n}\n\n/* Word diff specific styling */\nmj-record-changes .diff-container.word-diff .diff-added,\nmj-record-changes .diff-container.word-diff .diff-removed,\n.record-changes-container .diff-container.word-diff .diff-added,\n.record-changes-container .diff-container.word-diff .diff-removed {\n padding: 2px 4px;\n margin: 0 1px;\n border-radius: 4px;\n}\n\n/* Comments and Errors */\n.change-comments, .change-errors {\n margin-top: 1rem;\n padding: 0.75rem;\n border-radius: 6px;\n}\n\n.change-comments {\n background: #e7f3ff;\n border-left: 4px solid #007bff;\n}\n\n.change-errors {\n background: #f8d7da;\n border-left: 4px solid #dc3545;\n}\n\n.error-log {\n background: #ffffff;\n padding: 0.5rem;\n border-radius: 4px;\n font-family: 'Courier New', monospace;\n font-size: 0.8rem;\n color: #721c24;\n margin: 0;\n white-space: pre-wrap;\n overflow-x: auto;\n}\n\n/* Responsive Design */\n@media (max-width: 768px) {\n .filter-controls {\n flex-direction: column;\n align-items: stretch;\n }\n \n .search-input, .filter-select {\n width: 100%;\n }\n \n .change-header {\n flex-direction: column;\n align-items: flex-start;\n }\n \n .change-meta {\n flex-direction: column;\n align-items: flex-start;\n gap: 0.25rem;\n }\n \n .value-diff {\n grid-template-columns: 1fr;\n gap: 0.5rem;\n }\n \n .diff-arrow {\n justify-self: center;\n transform: rotate(90deg);\n }\n \n .timeline {\n padding-left: 1.5rem;\n }\n \n .timeline-marker {\n left: -1.5rem;\n }\n \n .timeline-icon {\n width: 2rem;\n height: 2rem;\n font-size: 0.8rem;\n }\n \n /* Responsive diff view */\n .diff-content {\n font-size: 0.8rem;\n padding: 0.5rem;\n }\n \n .diff-added, .diff-removed {\n padding: 1px 2px;\n }\n}\n\n@media (max-width: 480px) {\n .record-changes-container {\n padding: 0.5rem;\n }\n \n .timeline-content {\n padding: 0.75rem;\n }\n \n .field-change {\n padding: 0.5rem;\n }\n}"] }]
688
+ }], () => [{ type: i0.Renderer2 }, { type: i1.MJNotificationService }, { type: i2.DomSanitizer }], { dialogClosed: [{
209
689
  type: Output
210
690
  }], record: [{
211
691
  type: Input
@@ -213,5 +693,5 @@ RecordChangesComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: Reco
213
693
  type: ViewChild,
214
694
  args: ['recordChangesWrapper', { static: true }]
215
695
  }] }); })();
216
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(RecordChangesComponent, { className: "RecordChangesComponent", filePath: "src/lib/ng-record-changes.component.ts", lineNumber: 11 }); })();
696
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(RecordChangesComponent, { className: "RecordChangesComponent", filePath: "src/lib/ng-record-changes.component.ts", lineNumber: 15 }); })();
217
697
  //# sourceMappingURL=ng-record-changes.component.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ng-record-changes.component.js","sourceRoot":"","sources":["../../src/lib/ng-record-changes.component.ts","../../src/lib/ng-record-changes.component.html"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,EAAU,MAAM,EAAmD,SAAS,EAAE,MAAM,eAAe,CAAC;AAG3I,OAAO,EAA+B,iBAAiB,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;;;;;;;;;;ICSjG,kCAA2E;;;IAqBvD,2BAAmF;;;;;IAA7E,yHAAqE;;;IARnF,6CAMC;IACG,kHAAgD;IAGpD,iBAAoB;;;IARhB,gDAAsB;IACtB,gDAAsB;IAEtB,AADA,qCAAoB,2CACqD;;;IAfjF,AADJ,AADJ,iCAAyG,aACnE,oBAU7B;IACG,0GAMC;IAOb,AADI,AADI,iBAAa,EACX,EACJ;;;IAtBM,eAA6B;IAO7B,AADA,AADA,AADA,AADA,AADA,AAFA,kDAA6B,iBAEb,kBACC,6BACI,8BACC,mBACJ,mBACA;IAGG,cAAmB;IAAnB,+CAAmB;;ADhB5D,MAAM,OAAO,sBAAsB;IAkBjC,YAAoB,SAAuB,EAAU,QAAmB;QAApD,cAAS,GAAT,SAAS,CAAc;QAAU,aAAQ,GAAR,QAAQ,CAAW;QAjBjE,eAAU,GAAY,KAAK,CAAC;QACzB,iBAAY,GAAG,IAAI,YAAY,EAAE,CAAC;QAM5C,aAAQ,GAAQ,EAAE,CAAC;QACnB,mBAAc,GAAQ,EAAE,CAAC;QACzB,iBAAY,GAAqB;YAC/B;gBACE,KAAK,EAAE,WAAW;gBAClB,GAAG,EAAE,MAAM;aACZ;SACF,CAAC;IAG0E,CAAC;IAE7E,QAAQ;QACN,IAAG,IAAI,CAAC,MAAM,EAAC,CAAC;YACd,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;YACvB,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,oBAAoB,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YACvG,IAAI,CAAC,cAAc,EAAE,CAAC;QACxB,CAAC;IACH,CAAC;IAED,eAAe;QACb,iEAAiE;QACjE,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,aAAa;YAC7D,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IACzE,CAAC;IAED,WAAW;QACT,mEAAmE;QACnE,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,aAAa;YAC7D,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IACzE,CAAC;IAEK,iBAAiB,CAAC,kBAA0B,EAAE,OAAe,EAAE,UAAkB;;YACrF,uEAAuE;YACvE,IAAI,kBAAkB,IAAI,UAAU,EAAE,CAAC;gBACrC,MAAM,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;gBACzB,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,UAAU,EAAE,gBAAgB,EAAE,WAAW,EAAE,WAAW,UAAU,mBAAmB,kBAAkB,GAAG,EAAC,CAAC,CAAC;gBAC/I,IAAG,QAAQ,CAAC,OAAO,EAAC,CAAC;oBACnB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC;oBACjC,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;gBAC1B,CAAC;qBAAM,CAAC;oBACN,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;oBAChC,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;gBAC1B,CAAC;YACH,CAAC;QACH,CAAC;KAAA;IAED,cAAc;QACZ,IAAI,CAAC,cAAc,GAAG,CAAC;gBACrB,KAAK,EAAE,WAAW;gBAClB,KAAK,EAAE,MAAM;gBACb,IAAI,EAAE,UAAU;gBAChB,KAAK,EAAE,GAAG;aACX;YACD;gBACE,KAAK,EAAE,oBAAoB;gBAC3B,KAAK,EAAE,SAAS;gBAChB,IAAI,EAAE,aAAa;aACpB,CAAC,CAAC;IACL,CAAC;IAED,qBAAqB;QACnB,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;IAC3B,CAAC;IAED,iBAAiB,CAAC,GAAQ,EAAE,KAAU,EAAE,QAAa,EAAE,YAAoB,CAAC,EAAE,gBAAwB,KAAK;QACzG,IAAI,KAAK,KAAK,IAAI;YAChB,OAAO,IAAI,CAAC;QAEd,IAAI,CAAC;YACH,QAAQ,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;gBAC/B,KAAK,UAAU;oBACb,IAAI,OAAO,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW;oBAC1C,0DAA0D;oBAC1D,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,OAAO,CAAC,iBAAiB,EAAE,GAAG,KAAK,CAAC,CAAC;oBAEpF,OAAO,IAAI,IAAI,CAAC,cAAc,CAAC,OAAO,EAAG;wBACvC,IAAI,EAAE,SAAS;wBACf,KAAK,EAAE,OAAO;wBACd,GAAG,EAAE,SAAS;wBACd,IAAI,EAAE,SAAS;wBACf,MAAM,EAAE,SAAS;wBACjB,MAAM,EAAE,IAAI;qBACb,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;gBACvB,KAAK,KAAK;oBACR,OAAO,IAAI,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,EAAE,qBAAqB,EAAE,CAAC,EAAE,qBAAqB,EAAE,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBAEhH,KAAK,aAAa;oBAChB,2IAA2I;oBAC3I,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;oBAC9C,IAAG,CAAC,IAAI;wBACN,OAAO,KAAK,CAAC;yBACV,CAAC;wBACJ,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,0DAA0D;wBAC5F,IAAI,oBAAoB,GAAG,OAAO,CAAC;wBAEnC,KAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAC,CAAC;4BACrC,MAAM,UAAU,GAAkD,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;4BAClF,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,WAAC,OAAA,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,MAAK,MAAA,UAAU,CAAC,KAAK,0CAAE,IAAI,GAAG,WAAW,EAAE,CAAA,CAAA,EAAA,CAAC,CAAC;4BACrI,IAAI,gBAAgB,GAAW,EAAE,CAAC;4BAClC,IAAI,KAAK,EAAE,CAAC;gCACV,8CAA8C;gCAC9C,IAAI,KAAK,CAAC,MAAM,KAAK,iBAAiB,CAAC,OAAO,EAAE,CAAC;oCAC/C,mHAAmH;oCACnH,gBAAgB,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,iBAAiB,CAAC,WAAW,IAAI,CAAC,WAAW,CAAC,UAAU,EAAC,KAAK,CAAC,EAAE,CAAC;gCACjH,CAAC;qCACI,CAAC;oCACJ,gBAAgB,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,iBAAiB,CAAC,iBAAiB,IAAI,CAAC,WAAW,CAAC,UAAU,EAAC,IAAI,CAAC,OAAO,IAAI,CAAC,WAAW,CAAC,UAAU,EAAC,KAAK,CAAC,EAAE,CAAC;gCAC/J,CAAC;4BACH,CAAC;iCACI,CAAC;gCACJ,kKAAkK;gCAClK,gBAAgB,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,KAAK,CAAC,iBAAiB,IAAI,CAAC,WAAW,CAAC,UAAU,EAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,WAAW,CAAC,UAAU,EAAC,KAAK,CAAC,EAAE,CAAC;4BACzJ,CAAC;4BAED,oBAAoB,IAAI,QAAQ,gBAAgB,QAAQ,CAAC;wBAC3D,CAAC;wBAED,oBAAoB,IAAI,QAAQ,CAAC;wBACjC,OAAO,IAAI,CAAC,SAAS,CAAC,uBAAuB,CAAC,oBAAoB,CAAC,CAAC;oBACtE,CAAC;gBACH;oBACE,OAAO,KAAK,CAAC;YACf,CAAC;QACL,CAAC;QACD,OAAO,CAAC,EAAE,CAAC;YACT,QAAQ,CAAC,CAAC,CAAC,CAAC;YACZ,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IACS,WAAW,CAAC,SAAiB;QACrC,OAAO,MAAM,SAAS,MAAM,CAAA;IAC9B,CAAC;IACS,WAAW,CAAC,UAAyD,EAAE,UAAmB;QAClG,OAAO,uBAAuB,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,MAAM,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,QAAQ,SAAS,CAAC;IACtI,CAAC;;4FA/IU,sBAAsB;yEAAtB,sBAAsB;;;;;;;QCVnC,oCAA2B;QACvB,yBAA6B;QAC7B,uCASC;QADG,+IAAS,2BAAuB,KAAC;QAGjC,AADA,yFAA4D,0DAC6C;QA2BjH,AADI,iBAAe,EACb;;QApCE,eAAa;QAIb,AADA,AADA,AADA,AADA,2BAAa,eACC,kBACG,iBACD,mBACE;QAIH,cAAgB;QAAhB,qCAAgB;QACuD,cAAiB;QAAjB,sCAAiB;;iFDHlG,sBAAsB;cALlC,SAAS;2BACE,mBAAmB;qEAMnB,YAAY;kBAArB,MAAM;YACE,MAAM;kBAAd,KAAK;YAE+C,OAAO;kBAA3D,SAAS;mBAAC,sBAAsB,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;;kFALxC,sBAAsB"}
1
+ {"version":3,"file":"ng-record-changes.component.js","sourceRoot":"","sources":["../../src/lib/ng-record-changes.component.ts","../../src/lib/ng-record-changes.component.html"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@memberjunction/ng-record-changes",
3
- "version": "2.41.0",
3
+ "version": "2.42.1",
4
4
  "description": "MemberJunction: Angular pop-up window and grid to show changes made to a specific individual record",
5
5
  "main": "./dist/public-api.js",
6
6
  "typings": "./dist/public-api.d.ts",
@@ -27,10 +27,12 @@
27
27
  "@progress/kendo-angular-indicators": "16.2.0"
28
28
  },
29
29
  "dependencies": {
30
- "@memberjunction/core": "2.41.0",
31
- "@memberjunction/global": "2.41.0",
32
- "@memberjunction/ng-compare-records": "2.41.0",
33
- "@memberjunction/ng-container-directives": "2.41.0",
30
+ "@memberjunction/core": "2.42.1",
31
+ "@memberjunction/global": "2.42.1",
32
+ "@memberjunction/ng-compare-records": "2.42.1",
33
+ "@memberjunction/ng-container-directives": "2.42.1",
34
+ "@memberjunction/ng-notifications": "2.42.1",
35
+ "diff": "8.0.2",
34
36
  "tslib": "^2.3.0"
35
37
  },
36
38
  "sideEffects": false