@memberjunction/ng-record-changes 5.43.0 → 5.44.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/ng-record-changes.component.js +102 -120
- package/dist/lib/ng-record-changes.component.js.map +1 -1
- package/dist/lib/ng-record-changes.module.d.ts +1 -1
- package/dist/lib/ng-record-changes.module.d.ts.map +1 -1
- package/dist/lib/ng-record-changes.module.js +7 -4
- package/dist/lib/ng-record-changes.module.js.map +1 -1
- package/dist/lib/restore-preview-panel/restore-preview-panel.component.js +41 -45
- package/dist/lib/restore-preview-panel/restore-preview-panel.component.js.map +1 -1
- package/package.json +14 -11
- package/dist/__tests__/restore-version.test.d.ts +0 -2
- package/dist/__tests__/restore-version.test.d.ts.map +0 -1
- package/dist/__tests__/restore-version.test.js +0 -123
- package/dist/__tests__/restore-version.test.js.map +0 -1
- package/dist/lib/__tests__/record-changes.test.d.ts +0 -2
- package/dist/lib/__tests__/record-changes.test.d.ts.map +0 -1
- package/dist/lib/__tests__/record-changes.test.js +0 -308
- package/dist/lib/__tests__/record-changes.test.js.map +0 -1
|
@@ -28,25 +28,21 @@ function RestorePreviewPanelComponent_Conditional_1_Conditional_13_Template(rf,
|
|
|
28
28
|
i0.ɵɵtextInterpolate2("", ctx_r1.DriftCount, " field", ctx_r1.DriftCount === 1 ? "" : "s", " from this snapshot no longer exist on the entity and will be skipped.");
|
|
29
29
|
} }
|
|
30
30
|
function RestorePreviewPanelComponent_Conditional_1_Conditional_14_Template(rf, ctx) { if (rf & 1) {
|
|
31
|
-
i0.ɵɵ
|
|
32
|
-
i0.ɵɵelement(1, "i", 21);
|
|
33
|
-
i0.ɵɵelementStart(2, "p");
|
|
34
|
-
i0.ɵɵtext(3, "No fields could be parsed from this snapshot.");
|
|
35
|
-
i0.ɵɵelementEnd()();
|
|
31
|
+
i0.ɵɵelement(0, "mj-empty-state", 9);
|
|
36
32
|
} }
|
|
37
33
|
function RestorePreviewPanelComponent_Conditional_1_Conditional_15_Template(rf, ctx) { if (rf & 1) {
|
|
38
34
|
const _r3 = i0.ɵɵgetCurrentView();
|
|
39
|
-
i0.ɵɵelementStart(0, "div", 10)(1, "span",
|
|
35
|
+
i0.ɵɵelementStart(0, "div", 10)(1, "span", 21);
|
|
40
36
|
i0.ɵɵtext(2);
|
|
41
37
|
i0.ɵɵelementEnd();
|
|
42
|
-
i0.ɵɵelementStart(3, "div",
|
|
38
|
+
i0.ɵɵelementStart(3, "div", 22)(4, "button", 23);
|
|
43
39
|
i0.ɵɵlistener("click", function RestorePreviewPanelComponent_Conditional_1_Conditional_15_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.SelectAll()); });
|
|
44
40
|
i0.ɵɵtext(5, "Select all changed");
|
|
45
41
|
i0.ɵɵelementEnd();
|
|
46
|
-
i0.ɵɵelementStart(6, "span",
|
|
42
|
+
i0.ɵɵelementStart(6, "span", 24);
|
|
47
43
|
i0.ɵɵtext(7, "\u00B7");
|
|
48
44
|
i0.ɵɵelementEnd();
|
|
49
|
-
i0.ɵɵelementStart(8, "button",
|
|
45
|
+
i0.ɵɵelementStart(8, "button", 23);
|
|
50
46
|
i0.ɵɵlistener("click", function RestorePreviewPanelComponent_Conditional_1_Conditional_15_Template_button_click_8_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.DeselectAll()); });
|
|
51
47
|
i0.ɵɵtext(9, "Deselect all");
|
|
52
48
|
i0.ɵɵelementEnd()()();
|
|
@@ -60,26 +56,26 @@ function RestorePreviewPanelComponent_Conditional_1_Conditional_15_Template(rf,
|
|
|
60
56
|
i0.ɵɵproperty("disabled", ctx_r1.IsRestoring);
|
|
61
57
|
} }
|
|
62
58
|
function RestorePreviewPanelComponent_Conditional_1_Conditional_16_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
63
|
-
i0.ɵɵelementStart(0, "th",
|
|
59
|
+
i0.ɵɵelementStart(0, "th", 32);
|
|
64
60
|
i0.ɵɵtext(1, "Current Value");
|
|
65
61
|
i0.ɵɵelementEnd();
|
|
66
|
-
i0.ɵɵelementStart(2, "th",
|
|
62
|
+
i0.ɵɵelementStart(2, "th", 33);
|
|
67
63
|
i0.ɵɵtext(3, "Restore To");
|
|
68
64
|
i0.ɵɵelementEnd();
|
|
69
65
|
} }
|
|
70
66
|
function RestorePreviewPanelComponent_Conditional_1_Conditional_16_Conditional_8_Template(rf, ctx) { if (rf & 1) {
|
|
71
|
-
i0.ɵɵelementStart(0, "th",
|
|
67
|
+
i0.ɵɵelementStart(0, "th", 29);
|
|
72
68
|
i0.ɵɵtext(1, "Will be created with");
|
|
73
69
|
i0.ɵɵelementEnd();
|
|
74
70
|
} }
|
|
75
71
|
function RestorePreviewPanelComponent_Conditional_1_Conditional_16_For_12_Conditional_0_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
76
|
-
i0.ɵɵelement(0, "i",
|
|
72
|
+
i0.ɵɵelement(0, "i", 36);
|
|
77
73
|
} }
|
|
78
74
|
function RestorePreviewPanelComponent_Conditional_1_Conditional_16_For_12_Conditional_0_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
79
|
-
i0.ɵɵelementStart(0, "td",
|
|
75
|
+
i0.ɵɵelementStart(0, "td", 32);
|
|
80
76
|
i0.ɵɵtext(1);
|
|
81
77
|
i0.ɵɵelementEnd();
|
|
82
|
-
i0.ɵɵelementStart(2, "td",
|
|
78
|
+
i0.ɵɵelementStart(2, "td", 33);
|
|
83
79
|
i0.ɵɵtext(3);
|
|
84
80
|
i0.ɵɵelementEnd();
|
|
85
81
|
} if (rf & 2) {
|
|
@@ -93,7 +89,7 @@ function RestorePreviewPanelComponent_Conditional_1_Conditional_16_For_12_Condit
|
|
|
93
89
|
i0.ɵɵtextInterpolate1(" ", row_r5.RestoreValue || "(empty)", " ");
|
|
94
90
|
} }
|
|
95
91
|
function RestorePreviewPanelComponent_Conditional_1_Conditional_16_For_12_Conditional_0_Conditional_10_Template(rf, ctx) { if (rf & 1) {
|
|
96
|
-
i0.ɵɵelementStart(0, "td",
|
|
92
|
+
i0.ɵɵelementStart(0, "td", 29);
|
|
97
93
|
i0.ɵɵtext(1);
|
|
98
94
|
i0.ɵɵelementEnd();
|
|
99
95
|
} if (rf & 2) {
|
|
@@ -103,32 +99,32 @@ function RestorePreviewPanelComponent_Conditional_1_Conditional_16_For_12_Condit
|
|
|
103
99
|
i0.ɵɵtextInterpolate1(" ", row_r5.RestoreValue || "(empty)", " ");
|
|
104
100
|
} }
|
|
105
101
|
function RestorePreviewPanelComponent_Conditional_1_Conditional_16_For_12_Conditional_0_Conditional_12_Template(rf, ctx) { if (rf & 1) {
|
|
106
|
-
i0.ɵɵelement(0, "i",
|
|
102
|
+
i0.ɵɵelement(0, "i", 40);
|
|
107
103
|
} }
|
|
108
104
|
function RestorePreviewPanelComponent_Conditional_1_Conditional_16_For_12_Conditional_0_Conditional_13_Template(rf, ctx) { if (rf & 1) {
|
|
109
|
-
i0.ɵɵelement(0, "i",
|
|
105
|
+
i0.ɵɵelement(0, "i", 41);
|
|
110
106
|
} }
|
|
111
107
|
function RestorePreviewPanelComponent_Conditional_1_Conditional_16_For_12_Conditional_0_Conditional_14_Template(rf, ctx) { if (rf & 1) {
|
|
112
|
-
i0.ɵɵelement(0, "i",
|
|
108
|
+
i0.ɵɵelement(0, "i", 42);
|
|
113
109
|
} }
|
|
114
110
|
function RestorePreviewPanelComponent_Conditional_1_Conditional_16_For_12_Conditional_0_Conditional_15_Template(rf, ctx) { if (rf & 1) {
|
|
115
|
-
i0.ɵɵelement(0, "i",
|
|
111
|
+
i0.ɵɵelement(0, "i", 43);
|
|
116
112
|
} }
|
|
117
113
|
function RestorePreviewPanelComponent_Conditional_1_Conditional_16_For_12_Conditional_0_Template(rf, ctx) { if (rf & 1) {
|
|
118
114
|
const _r4 = i0.ɵɵgetCurrentView();
|
|
119
|
-
i0.ɵɵelementStart(0, "tr")(1, "td",
|
|
115
|
+
i0.ɵɵelementStart(0, "tr")(1, "td", 27)(2, "button", 35);
|
|
120
116
|
i0.ɵɵlistener("click", function RestorePreviewPanelComponent_Conditional_1_Conditional_16_For_12_Conditional_0_Template_button_click_2_listener() { i0.ɵɵrestoreView(_r4); const row_r5 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.ToggleRow(row_r5)); });
|
|
121
|
-
i0.ɵɵconditionalCreate(3, RestorePreviewPanelComponent_Conditional_1_Conditional_16_For_12_Conditional_0_Conditional_3_Template, 1, 0, "i",
|
|
117
|
+
i0.ɵɵconditionalCreate(3, RestorePreviewPanelComponent_Conditional_1_Conditional_16_For_12_Conditional_0_Conditional_3_Template, 1, 0, "i", 36);
|
|
122
118
|
i0.ɵɵelementEnd()();
|
|
123
|
-
i0.ɵɵelementStart(4, "td",
|
|
119
|
+
i0.ɵɵelementStart(4, "td", 28)(5, "div", 37);
|
|
124
120
|
i0.ɵɵtext(6);
|
|
125
121
|
i0.ɵɵelementEnd();
|
|
126
|
-
i0.ɵɵelementStart(7, "div",
|
|
122
|
+
i0.ɵɵelementStart(7, "div", 38);
|
|
127
123
|
i0.ɵɵtext(8);
|
|
128
124
|
i0.ɵɵelementEnd()();
|
|
129
|
-
i0.ɵɵconditionalCreate(9, RestorePreviewPanelComponent_Conditional_1_Conditional_16_For_12_Conditional_0_Conditional_9_Template, 4, 6)(10, RestorePreviewPanelComponent_Conditional_1_Conditional_16_For_12_Conditional_0_Conditional_10_Template, 2, 3, "td",
|
|
130
|
-
i0.ɵɵelementStart(11, "td",
|
|
131
|
-
i0.ɵɵconditionalCreate(12, RestorePreviewPanelComponent_Conditional_1_Conditional_16_For_12_Conditional_0_Conditional_12_Template, 1, 0, "i",
|
|
125
|
+
i0.ɵɵconditionalCreate(9, RestorePreviewPanelComponent_Conditional_1_Conditional_16_For_12_Conditional_0_Conditional_9_Template, 4, 6)(10, RestorePreviewPanelComponent_Conditional_1_Conditional_16_For_12_Conditional_0_Conditional_10_Template, 2, 3, "td", 39);
|
|
126
|
+
i0.ɵɵelementStart(11, "td", 30);
|
|
127
|
+
i0.ɵɵconditionalCreate(12, RestorePreviewPanelComponent_Conditional_1_Conditional_16_For_12_Conditional_0_Conditional_12_Template, 1, 0, "i", 40)(13, RestorePreviewPanelComponent_Conditional_1_Conditional_16_For_12_Conditional_0_Conditional_13_Template, 1, 0, "i", 41)(14, RestorePreviewPanelComponent_Conditional_1_Conditional_16_For_12_Conditional_0_Conditional_14_Template, 1, 0, "i", 42)(15, RestorePreviewPanelComponent_Conditional_1_Conditional_16_For_12_Conditional_0_Conditional_15_Template, 1, 0, "i", 43);
|
|
132
128
|
i0.ɵɵelementEnd()();
|
|
133
129
|
} if (rf & 2) {
|
|
134
130
|
const row_r5 = i0.ɵɵnextContext().$implicit;
|
|
@@ -150,7 +146,7 @@ function RestorePreviewPanelComponent_Conditional_1_Conditional_16_For_12_Condit
|
|
|
150
146
|
i0.ɵɵconditional(row_r5.IsMissingInSchema ? 12 : row_r5.IsImmutable ? 13 : row_r5.IsChanged ? 14 : 15);
|
|
151
147
|
} }
|
|
152
148
|
function RestorePreviewPanelComponent_Conditional_1_Conditional_16_For_12_Template(rf, ctx) { if (rf & 1) {
|
|
153
|
-
i0.ɵɵconditionalCreate(0, RestorePreviewPanelComponent_Conditional_1_Conditional_16_For_12_Conditional_0_Template, 16, 19, "tr",
|
|
149
|
+
i0.ɵɵconditionalCreate(0, RestorePreviewPanelComponent_Conditional_1_Conditional_16_For_12_Conditional_0_Template, 16, 19, "tr", 34);
|
|
154
150
|
} if (rf & 2) {
|
|
155
151
|
const row_r5 = ctx.$implicit;
|
|
156
152
|
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
@@ -158,9 +154,9 @@ function RestorePreviewPanelComponent_Conditional_1_Conditional_16_For_12_Templa
|
|
|
158
154
|
} }
|
|
159
155
|
function RestorePreviewPanelComponent_Conditional_1_Conditional_16_Conditional_13_Template(rf, ctx) { if (rf & 1) {
|
|
160
156
|
const _r6 = i0.ɵɵgetCurrentView();
|
|
161
|
-
i0.ɵɵelementStart(0, "button",
|
|
157
|
+
i0.ɵɵelementStart(0, "button", 44);
|
|
162
158
|
i0.ɵɵlistener("click", function RestorePreviewPanelComponent_Conditional_1_Conditional_16_Conditional_13_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r6); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.ToggleUnchanged()); });
|
|
163
|
-
i0.ɵɵelement(1, "i",
|
|
159
|
+
i0.ɵɵelement(1, "i", 45);
|
|
164
160
|
i0.ɵɵelementStart(2, "span");
|
|
165
161
|
i0.ɵɵtext(3);
|
|
166
162
|
i0.ɵɵelementEnd()();
|
|
@@ -172,18 +168,18 @@ function RestorePreviewPanelComponent_Conditional_1_Conditional_16_Conditional_1
|
|
|
172
168
|
i0.ɵɵtextInterpolate3("", ctx_r1.ShowUnchanged ? "Hide" : "Show", " ", ctx_r1.UnchangedCount, " unchanged field", ctx_r1.UnchangedCount === 1 ? "" : "s");
|
|
173
169
|
} }
|
|
174
170
|
function RestorePreviewPanelComponent_Conditional_1_Conditional_16_Template(rf, ctx) { if (rf & 1) {
|
|
175
|
-
i0.ɵɵelementStart(0, "div",
|
|
176
|
-
i0.ɵɵelement(4, "th",
|
|
177
|
-
i0.ɵɵelementStart(5, "th",
|
|
171
|
+
i0.ɵɵelementStart(0, "div", 25)(1, "table", 26)(2, "thead")(3, "tr");
|
|
172
|
+
i0.ɵɵelement(4, "th", 27);
|
|
173
|
+
i0.ɵɵelementStart(5, "th", 28);
|
|
178
174
|
i0.ɵɵtext(6, "Field");
|
|
179
175
|
i0.ɵɵelementEnd();
|
|
180
|
-
i0.ɵɵconditionalCreate(7, RestorePreviewPanelComponent_Conditional_1_Conditional_16_Conditional_7_Template, 4, 0)(8, RestorePreviewPanelComponent_Conditional_1_Conditional_16_Conditional_8_Template, 2, 0, "th",
|
|
181
|
-
i0.ɵɵelement(9, "th",
|
|
176
|
+
i0.ɵɵconditionalCreate(7, RestorePreviewPanelComponent_Conditional_1_Conditional_16_Conditional_7_Template, 4, 0)(8, RestorePreviewPanelComponent_Conditional_1_Conditional_16_Conditional_8_Template, 2, 0, "th", 29);
|
|
177
|
+
i0.ɵɵelement(9, "th", 30);
|
|
182
178
|
i0.ɵɵelementEnd()();
|
|
183
179
|
i0.ɵɵelementStart(10, "tbody");
|
|
184
180
|
i0.ɵɵrepeaterCreate(11, RestorePreviewPanelComponent_Conditional_1_Conditional_16_For_12_Template, 1, 1, null, null, _forTrack0);
|
|
185
181
|
i0.ɵɵelementEnd()()();
|
|
186
|
-
i0.ɵɵconditionalCreate(13, RestorePreviewPanelComponent_Conditional_1_Conditional_16_Conditional_13_Template, 4, 7, "button",
|
|
182
|
+
i0.ɵɵconditionalCreate(13, RestorePreviewPanelComponent_Conditional_1_Conditional_16_Conditional_13_Template, 4, 7, "button", 31);
|
|
187
183
|
} if (rf & 2) {
|
|
188
184
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
189
185
|
i0.ɵɵadvance(7);
|
|
@@ -194,22 +190,22 @@ function RestorePreviewPanelComponent_Conditional_1_Conditional_16_Template(rf,
|
|
|
194
190
|
i0.ɵɵconditional(ctx_r1.UnchangedCount > 0 && ctx_r1.Mode === "live" ? 13 : -1);
|
|
195
191
|
} }
|
|
196
192
|
function RestorePreviewPanelComponent_Conditional_1_Conditional_17_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
197
|
-
i0.ɵɵelementStart(0, "span",
|
|
193
|
+
i0.ɵɵelementStart(0, "span", 47);
|
|
198
194
|
i0.ɵɵtext(1, "*");
|
|
199
195
|
i0.ɵɵelementEnd();
|
|
200
196
|
} }
|
|
201
197
|
function RestorePreviewPanelComponent_Conditional_1_Conditional_17_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
202
|
-
i0.ɵɵelementStart(0, "span",
|
|
198
|
+
i0.ɵɵelementStart(0, "span", 48);
|
|
203
199
|
i0.ɵɵtext(1, "(optional)");
|
|
204
200
|
i0.ɵɵelementEnd();
|
|
205
201
|
} }
|
|
206
202
|
function RestorePreviewPanelComponent_Conditional_1_Conditional_17_Template(rf, ctx) { if (rf & 1) {
|
|
207
203
|
const _r7 = i0.ɵɵgetCurrentView();
|
|
208
|
-
i0.ɵɵelementStart(0, "div", 11)(1, "label",
|
|
204
|
+
i0.ɵɵelementStart(0, "div", 11)(1, "label", 46);
|
|
209
205
|
i0.ɵɵtext(2, " Reason for restore ");
|
|
210
|
-
i0.ɵɵconditionalCreate(3, RestorePreviewPanelComponent_Conditional_1_Conditional_17_Conditional_3_Template, 2, 0, "span",
|
|
206
|
+
i0.ɵɵconditionalCreate(3, RestorePreviewPanelComponent_Conditional_1_Conditional_17_Conditional_3_Template, 2, 0, "span", 47)(4, RestorePreviewPanelComponent_Conditional_1_Conditional_17_Conditional_4_Template, 2, 0, "span", 48);
|
|
211
207
|
i0.ɵɵelementEnd();
|
|
212
|
-
i0.ɵɵelementStart(5, "textarea",
|
|
208
|
+
i0.ɵɵelementStart(5, "textarea", 49);
|
|
213
209
|
i0.ɵɵtwoWayListener("ngModelChange", function RestorePreviewPanelComponent_Conditional_1_Conditional_17_Template_textarea_ngModelChange_5_listener($event) { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.Reason, $event) || (ctx_r1.Reason = $event); return i0.ɵɵresetView($event); });
|
|
214
210
|
i0.ɵɵelementEnd()();
|
|
215
211
|
} if (rf & 2) {
|
|
@@ -252,7 +248,7 @@ function RestorePreviewPanelComponent_Conditional_1_Template(rf, ctx) { if (rf &
|
|
|
252
248
|
i0.ɵɵconditionalCreate(12, RestorePreviewPanelComponent_Conditional_1_Conditional_12_Template, 4, 1, "span");
|
|
253
249
|
i0.ɵɵelementEnd()()();
|
|
254
250
|
i0.ɵɵconditionalCreate(13, RestorePreviewPanelComponent_Conditional_1_Conditional_13_Template, 4, 2, "div", 8);
|
|
255
|
-
i0.ɵɵconditionalCreate(14, RestorePreviewPanelComponent_Conditional_1_Conditional_14_Template,
|
|
251
|
+
i0.ɵɵconditionalCreate(14, RestorePreviewPanelComponent_Conditional_1_Conditional_14_Template, 1, 0, "mj-empty-state", 9);
|
|
256
252
|
i0.ɵɵconditionalCreate(15, RestorePreviewPanelComponent_Conditional_1_Conditional_15_Template, 10, 4, "div", 10);
|
|
257
253
|
i0.ɵɵconditionalCreate(16, RestorePreviewPanelComponent_Conditional_1_Conditional_16_Template, 14, 2);
|
|
258
254
|
i0.ɵɵconditionalCreate(17, RestorePreviewPanelComponent_Conditional_1_Conditional_17_Template, 6, 3, "div", 11);
|
|
@@ -732,7 +728,7 @@ export class RestorePreviewPanelComponent extends BaseAngularComponent {
|
|
|
732
728
|
}).format(new Date(date));
|
|
733
729
|
}
|
|
734
730
|
static ɵfac = function RestorePreviewPanelComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || RestorePreviewPanelComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
|
|
735
|
-
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: RestorePreviewPanelComponent, selectors: [["mj-restore-preview-panel"]], inputs: { Visible: "Visible", Mode: "Mode", RecordChange: "RecordChange", LiveRecord: "LiveRecord", EntityName: "EntityName", RequireReason: "RequireReason", HideReason: "HideReason" }, outputs: { BeforeRestoreCommit: "BeforeRestoreCommit", RestoreConfirmed: "RestoreConfirmed", RestoreCancelled: "RestoreCancelled" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 2, vars: 7, consts: [[3, "Closed", "Mode", "Title", "Visible", "Resizable", "MinWidthPx", "MaxWidthRatio"], [1, "rpp-container"], [1, "rpp-header"], [1, "rpp-header-icon"], ["aria-hidden", "true", 1, "fa-solid", "fa-clock-rotate-left"], [1, "rpp-header-text"], [1, "rpp-header-title"], [1, "rpp-header-meta"], [1, "rpp-banner", "rpp-banner-warning"], [1, "rpp-empty"], [1, "rpp-action-bar"], [1, "rpp-reason-section"], [1, "rpp-footer"], [1, "rpp-footer-info"], ["aria-hidden", "true", 1, "fa-solid", "fa-shield-halved"], [1, "rpp-footer-actions"], ["type", "button", 1, "rpp-btn", "rpp-btn-primary", 3, "click", "disabled"], ["aria-hidden", "true", 1, "fa-solid", "fa-spinner", "fa-spin"], ["aria-hidden", "true", 1, "fa-solid", "fa-rotate-left"], ["type", "button", 1, "rpp-btn", "rpp-btn-secondary", 3, "click", "disabled"], ["aria-hidden", "true", 1, "fa-solid", "fa-triangle-exclamation"], [
|
|
731
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: RestorePreviewPanelComponent, selectors: [["mj-restore-preview-panel"]], inputs: { Visible: "Visible", Mode: "Mode", RecordChange: "RecordChange", LiveRecord: "LiveRecord", EntityName: "EntityName", RequireReason: "RequireReason", HideReason: "HideReason" }, outputs: { BeforeRestoreCommit: "BeforeRestoreCommit", RestoreConfirmed: "RestoreConfirmed", RestoreCancelled: "RestoreCancelled" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 2, vars: 7, consts: [[3, "Closed", "Mode", "Title", "Visible", "Resizable", "MinWidthPx", "MaxWidthRatio"], [1, "rpp-container"], [1, "rpp-header"], [1, "rpp-header-icon"], ["aria-hidden", "true", 1, "fa-solid", "fa-clock-rotate-left"], [1, "rpp-header-text"], [1, "rpp-header-title"], [1, "rpp-header-meta"], [1, "rpp-banner", "rpp-banner-warning"], ["Size", "compact", "Icon", "fa-solid fa-circle-info", "Title", "No fields could be parsed from this snapshot.", 1, "rpp-empty"], [1, "rpp-action-bar"], [1, "rpp-reason-section"], [1, "rpp-footer"], [1, "rpp-footer-info"], ["aria-hidden", "true", 1, "fa-solid", "fa-shield-halved"], [1, "rpp-footer-actions"], ["type", "button", 1, "rpp-btn", "rpp-btn-primary", 3, "click", "disabled"], ["aria-hidden", "true", 1, "fa-solid", "fa-spinner", "fa-spin"], ["aria-hidden", "true", 1, "fa-solid", "fa-rotate-left"], ["type", "button", 1, "rpp-btn", "rpp-btn-secondary", 3, "click", "disabled"], ["aria-hidden", "true", 1, "fa-solid", "fa-triangle-exclamation"], [1, "rpp-action-bar-label"], [1, "rpp-action-bar-buttons"], ["type", "button", 1, "rpp-link-btn", 3, "click", "disabled"], [1, "rpp-action-bar-sep"], [1, "rpp-table-wrap"], [1, "rpp-table"], [1, "rpp-col-check"], [1, "rpp-col-field"], ["colspan", "2", 1, "rpp-col-restore"], [1, "rpp-col-flag"], ["type", "button", 1, "rpp-disclosure"], [1, "rpp-col-current"], [1, "rpp-col-restore"], [3, "rpp-row-changed", "rpp-row-unchanged", "rpp-row-immutable", "rpp-row-drift"], ["type", "button", 1, "rpp-checkbox", 3, "click", "disabled"], ["aria-hidden", "true", 1, "fa-solid", "fa-check"], [1, "rpp-field-display"], [1, "rpp-field-name"], ["colspan", "2", 1, "rpp-col-restore", 3, "rpp-empty-cell"], ["title", "This field no longer exists on the entity and will be skipped", "aria-hidden", "true", 1, "fa-solid", "fa-triangle-exclamation", "rpp-flag-drift"], ["title", "Read-only or system field \u2014 cannot be modified", "aria-hidden", "true", 1, "fa-solid", "fa-lock", "rpp-flag-immutable"], ["title", "Will be changed", "aria-hidden", "true", 1, "fa-solid", "fa-circle-exclamation", "rpp-flag-changed"], ["title", "Already matches", "aria-hidden", "true", 1, "fa-solid", "fa-check", "rpp-flag-ok"], ["type", "button", 1, "rpp-disclosure", 3, "click"], ["aria-hidden", "true", 1, "fa-solid"], ["for", "rpp-reason-input"], [1, "rpp-required"], [1, "rpp-optional"], ["id", "rpp-reason-input", "placeholder", "e.g., Reverting incorrect Q2 entries", "rows", "2", 1, "rpp-reason-textarea", 3, "ngModelChange", "ngModel", "disabled"]], template: function RestorePreviewPanelComponent_Template(rf, ctx) { if (rf & 1) {
|
|
736
732
|
i0.ɵɵelementStart(0, "mj-slide-panel", 0);
|
|
737
733
|
i0.ɵɵlistener("Closed", function RestorePreviewPanelComponent_Template_mj_slide_panel_Closed_0_listener() { return ctx.Cancel(); });
|
|
738
734
|
i0.ɵɵconditionalCreate(1, RestorePreviewPanelComponent_Conditional_1_Template, 30, 13);
|
|
@@ -741,11 +737,11 @@ export class RestorePreviewPanelComponent extends BaseAngularComponent {
|
|
|
741
737
|
i0.ɵɵproperty("Mode", "slide")("Title", ctx.HeaderTitle)("Visible", ctx.Visible)("Resizable", true)("MinWidthPx", 500)("MaxWidthRatio", 0.7);
|
|
742
738
|
i0.ɵɵadvance();
|
|
743
739
|
i0.ɵɵconditional(ctx.RecordChange ? 1 : -1);
|
|
744
|
-
} }, dependencies: [i1.DefaultValueAccessor, i1.NgControlStatus, i1.NgModel, i2.MjSlidePanelComponent], styles: ["/* \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n * Restore Preview Panel\n * Slide-in panel that previews a restore operation field-by-field.\n * All colors use --mj-* design tokens so it adapts to dark mode and\n * white-label themes.\n * \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.rpp-container {\n padding: 18px 20px;\n display: flex;\n flex-direction: column;\n gap: 14px;\n}\n\n/* \u2500\u2500\u2500 Header summary \u2500\u2500\u2500 */\n\n.rpp-header {\n display: flex;\n align-items: flex-start;\n gap: 14px;\n padding-bottom: 14px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.rpp-header-icon {\n width: 38px;\n height: 38px;\n border-radius: 8px;\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n font-size: 16px;\n}\n\n.rpp-header-text {\n flex: 1;\n min-width: 0;\n}\n\n.rpp-header-title {\n font-size: 15px;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin-bottom: 4px;\n}\n\n.rpp-header-meta {\n display: flex;\n flex-wrap: wrap;\n gap: 14px;\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n.rpp-header-meta strong {\n color: var(--mj-text-secondary);\n font-weight: 500;\n margin-right: 4px;\n}\n\n/* \u2500\u2500\u2500 Banners \u2500\u2500\u2500 */\n\n.rpp-banner {\n display: flex;\n align-items: center;\n gap: 9px;\n padding: 10px 12px;\n border-radius: 8px;\n font-size: 12px;\n border: 1px solid;\n}\n\n.rpp-banner-warning {\n background: var(--mj-status-warning-bg);\n color: var(--mj-status-warning-text);\n border-color: var(--mj-status-warning-border);\n}\n\n/* \u2500\u2500\u2500 Empty state \u2500\u2500\u2500 */\n\n.rpp-empty {\n text-align: center;\n padding: 30px 20px;\n color: var(--mj-text-muted);\n}\n\n.rpp-empty i {\n font-size: 24px;\n margin-bottom: 8px;\n}\n\n.rpp-empty p {\n margin: 0;\n font-size: 13px;\n}\n\n/* \u2500\u2500\u2500 Action bar (select all / deselect all) \u2500\u2500\u2500 */\n\n.rpp-action-bar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 10px;\n padding: 8px 12px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 7px;\n font-size: 12px;\n}\n\n.rpp-action-bar-label {\n color: var(--mj-text-secondary);\n font-weight: 500;\n}\n\n.rpp-action-bar-buttons {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.rpp-action-bar-sep {\n color: var(--mj-text-disabled);\n}\n\n.rpp-link-btn {\n background: none;\n border: none;\n color: var(--mj-brand-primary);\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n padding: 2px 4px;\n border-radius: 4px;\n}\n\n.rpp-link-btn:hover:not(:disabled) {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n}\n\n.rpp-link-btn:disabled {\n color: var(--mj-text-disabled);\n cursor: not-allowed;\n}\n\n/* \u2500\u2500\u2500 Diff table \u2500\u2500\u2500 */\n\n.rpp-table-wrap {\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n overflow: hidden;\n}\n\n.rpp-table {\n width: 100%;\n border-collapse: collapse;\n font-size: 13px;\n background: var(--mj-bg-surface);\n}\n\n.rpp-table thead th {\n text-align: left;\n padding: 10px 12px;\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n font-size: 11px;\n text-transform: uppercase;\n letter-spacing: 0.06em;\n color: var(--mj-text-muted);\n font-weight: 600;\n}\n\n.rpp-table tbody td {\n padding: 10px 12px;\n border-bottom: 1px solid var(--mj-border-subtle);\n vertical-align: top;\n}\n\n.rpp-table tbody tr:last-child td {\n border-bottom: none;\n}\n\n.rpp-row-changed { background: var(--mj-bg-surface); }\n.rpp-row-unchanged {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-disabled);\n}\n.rpp-row-immutable { opacity: 0.7; }\n.rpp-row-drift { background: color-mix(in srgb, var(--mj-status-warning) 5%, var(--mj-bg-surface)); }\n\n/* Column widths */\n.rpp-col-check { width: 36px; padding: 8px 4px 8px 12px; }\n.rpp-col-field { width: 28%; min-width: 140px; }\n.rpp-col-current,\n.rpp-col-restore { word-break: break-word; }\n.rpp-col-flag { width: 28px; text-align: right; padding-right: 12px; }\n\n/* \u2500\u2500\u2500 Field cell \u2500\u2500\u2500 */\n\n.rpp-field-display {\n font-weight: 500;\n color: var(--mj-text-primary);\n margin-bottom: 2px;\n}\n\n.rpp-field-name {\n color: var(--mj-text-disabled);\n font-size: 11px;\n font-family: ui-monospace, SFMono-Regular, Consolas, monospace;\n}\n\n.rpp-row-unchanged .rpp-field-display { color: var(--mj-text-muted); }\n\n/* \u2500\u2500\u2500 Value cells \u2500\u2500\u2500 */\n\n.rpp-col-current { color: var(--mj-text-secondary); }\n.rpp-col-restore {\n color: var(--mj-text-primary);\n font-weight: 500;\n background: linear-gradient(90deg,\n color-mix(in srgb, var(--mj-brand-primary) 6%, transparent),\n transparent 80%);\n}\n\n.rpp-empty-cell {\n color: var(--mj-text-disabled);\n font-style: italic;\n}\n\n/* \u2500\u2500\u2500 Checkbox \u2500\u2500\u2500 */\n\n.rpp-checkbox {\n width: 18px;\n height: 18px;\n border: 1.5px solid var(--mj-border-strong);\n border-radius: 4px;\n background: var(--mj-bg-surface);\n display: inline-flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n padding: 0;\n color: var(--mj-text-inverse, #fff);\n transition: background-color 0.1s, border-color 0.1s;\n}\n\n.rpp-checkbox:hover:not(:disabled) {\n border-color: var(--mj-brand-primary);\n}\n\n.rpp-checkbox.checked {\n background: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n}\n\n.rpp-checkbox.checked i {\n font-size: 11px;\n}\n\n.rpp-checkbox.disabled,\n.rpp-checkbox:disabled {\n background: var(--mj-bg-surface-sunken);\n border-color: var(--mj-border-default);\n cursor: not-allowed;\n}\n\n/* \u2500\u2500\u2500 Flag icons \u2500\u2500\u2500 */\n\n.rpp-flag-changed { color: var(--mj-status-warning); }\n.rpp-flag-ok { color: var(--mj-text-disabled); }\n.rpp-flag-drift { color: var(--mj-status-warning); }\n.rpp-flag-immutable { color: var(--mj-text-disabled); }\n\n/* \u2500\u2500\u2500 Unchanged disclosure \u2500\u2500\u2500 */\n\n.rpp-disclosure {\n background: none;\n border: none;\n color: var(--mj-text-muted);\n font-size: 12px;\n cursor: pointer;\n padding: 8px 4px;\n display: flex;\n align-items: center;\n gap: 8px;\n text-align: left;\n}\n\n.rpp-disclosure:hover {\n color: var(--mj-text-primary);\n}\n\n.rpp-disclosure i {\n font-size: 10px;\n width: 12px;\n}\n\n/* \u2500\u2500\u2500 Reason section \u2500\u2500\u2500 */\n\n.rpp-reason-section {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.rpp-reason-section label {\n font-size: 12px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n.rpp-required {\n color: var(--mj-status-error);\n margin-left: 4px;\n}\n\n.rpp-optional {\n color: var(--mj-text-disabled);\n font-weight: 400;\n margin-left: 4px;\n}\n\n.rpp-reason-textarea {\n width: 100%;\n border: 1px solid var(--mj-border-default);\n border-radius: 7px;\n padding: 8px 10px;\n font-family: inherit;\n font-size: 13px;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n resize: vertical;\n min-height: 50px;\n box-sizing: border-box;\n}\n\n.rpp-reason-textarea:focus {\n outline: 2px solid var(--mj-brand-primary);\n outline-offset: -1px;\n border-color: var(--mj-brand-primary);\n}\n\n.rpp-reason-textarea:disabled {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-disabled);\n}\n\n/* \u2500\u2500\u2500 Footer \u2500\u2500\u2500 */\n\n.rpp-footer {\n position: sticky;\n bottom: 0;\n background: var(--mj-bg-surface);\n border-top: 1px solid var(--mj-border-default);\n padding: 12px 20px;\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 14px;\n}\n\n.rpp-footer-info {\n display: flex;\n align-items: center;\n gap: 7px;\n color: var(--mj-text-muted);\n font-size: 12px;\n}\n\n.rpp-footer-info i {\n color: var(--mj-brand-primary);\n}\n\n.rpp-footer-actions {\n display: flex;\n gap: 10px;\n}\n\n.rpp-btn {\n padding: 8px 16px;\n border-radius: 7px;\n font-size: 13px;\n font-weight: 600;\n cursor: pointer;\n border: 1px solid transparent;\n display: inline-flex;\n align-items: center;\n gap: 7px;\n font-family: inherit;\n}\n\n.rpp-btn-primary {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse, #fff);\n border-color: var(--mj-brand-primary);\n}\n\n.rpp-btn-primary:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n}\n\n.rpp-btn-primary:disabled {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-disabled);\n border-color: var(--mj-border-default);\n cursor: not-allowed;\n}\n\n.rpp-btn-secondary {\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n border-color: var(--mj-border-default);\n font-weight: 500;\n}\n\n.rpp-btn-secondary:hover:not(:disabled) {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n.rpp-btn-secondary:disabled {\n color: var(--mj-text-disabled);\n cursor: not-allowed;\n}\n"], encapsulation: 2, changeDetection: 0 });
|
|
740
|
+
} }, dependencies: [i1.DefaultValueAccessor, i1.NgControlStatus, i1.NgModel, i2.MjSlidePanelComponent, i2.MJEmptyStateComponent], styles: ["/* \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n * Restore Preview Panel\n * Slide-in panel that previews a restore operation field-by-field.\n * All colors use --mj-* design tokens so it adapts to dark mode and\n * white-label themes.\n * \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.rpp-container {\n padding: 18px 20px;\n display: flex;\n flex-direction: column;\n gap: 14px;\n}\n\n/* \u2500\u2500\u2500 Header summary \u2500\u2500\u2500 */\n\n.rpp-header {\n display: flex;\n align-items: flex-start;\n gap: 14px;\n padding-bottom: 14px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.rpp-header-icon {\n width: 38px;\n height: 38px;\n border-radius: 8px;\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n font-size: 16px;\n}\n\n.rpp-header-text {\n flex: 1;\n min-width: 0;\n}\n\n.rpp-header-title {\n font-size: 15px;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin-bottom: 4px;\n}\n\n.rpp-header-meta {\n display: flex;\n flex-wrap: wrap;\n gap: 14px;\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n.rpp-header-meta strong {\n color: var(--mj-text-secondary);\n font-weight: 500;\n margin-right: 4px;\n}\n\n/* \u2500\u2500\u2500 Banners \u2500\u2500\u2500 */\n\n.rpp-banner {\n display: flex;\n align-items: center;\n gap: 9px;\n padding: 10px 12px;\n border-radius: 8px;\n font-size: 12px;\n border: 1px solid;\n}\n\n.rpp-banner-warning {\n background: var(--mj-status-warning-bg);\n color: var(--mj-status-warning-text);\n border-color: var(--mj-status-warning-border);\n}\n\n/* \u2500\u2500\u2500 Empty state \u2500\u2500\u2500 */\n\n.rpp-empty {\n text-align: center;\n padding: 30px 20px;\n color: var(--mj-text-muted);\n}\n\n.rpp-empty i {\n font-size: 24px;\n margin-bottom: 8px;\n}\n\n.rpp-empty p {\n margin: 0;\n font-size: 13px;\n}\n\n/* \u2500\u2500\u2500 Action bar (select all / deselect all) \u2500\u2500\u2500 */\n\n.rpp-action-bar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 10px;\n padding: 8px 12px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 7px;\n font-size: 12px;\n}\n\n.rpp-action-bar-label {\n color: var(--mj-text-secondary);\n font-weight: 500;\n}\n\n.rpp-action-bar-buttons {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.rpp-action-bar-sep {\n color: var(--mj-text-disabled);\n}\n\n.rpp-link-btn {\n background: none;\n border: none;\n color: var(--mj-brand-primary);\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n padding: 2px 4px;\n border-radius: 4px;\n}\n\n.rpp-link-btn:hover:not(:disabled) {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n}\n\n.rpp-link-btn:disabled {\n color: var(--mj-text-disabled);\n cursor: not-allowed;\n}\n\n/* \u2500\u2500\u2500 Diff table \u2500\u2500\u2500 */\n\n.rpp-table-wrap {\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n overflow: hidden;\n}\n\n.rpp-table {\n width: 100%;\n border-collapse: collapse;\n font-size: 13px;\n background: var(--mj-bg-surface);\n}\n\n.rpp-table thead th {\n text-align: left;\n padding: 10px 12px;\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n font-size: 11px;\n text-transform: uppercase;\n letter-spacing: 0.06em;\n color: var(--mj-text-muted);\n font-weight: 600;\n}\n\n.rpp-table tbody td {\n padding: 10px 12px;\n border-bottom: 1px solid var(--mj-border-subtle);\n vertical-align: top;\n}\n\n.rpp-table tbody tr:last-child td {\n border-bottom: none;\n}\n\n.rpp-row-changed { background: var(--mj-bg-surface); }\n.rpp-row-unchanged {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-disabled);\n}\n.rpp-row-immutable { opacity: 0.7; }\n.rpp-row-drift { background: color-mix(in srgb, var(--mj-status-warning) 5%, var(--mj-bg-surface)); }\n\n/* Column widths */\n.rpp-col-check { width: 36px; padding: 8px 4px 8px 12px; }\n.rpp-col-field { width: 28%; min-width: 140px; }\n.rpp-col-current,\n.rpp-col-restore { word-break: break-word; }\n.rpp-col-flag { width: 28px; text-align: right; padding-right: 12px; }\n\n/* \u2500\u2500\u2500 Field cell \u2500\u2500\u2500 */\n\n.rpp-field-display {\n font-weight: 500;\n color: var(--mj-text-primary);\n margin-bottom: 2px;\n}\n\n.rpp-field-name {\n color: var(--mj-text-disabled);\n font-size: 11px;\n font-family: ui-monospace, SFMono-Regular, Consolas, monospace;\n}\n\n.rpp-row-unchanged .rpp-field-display { color: var(--mj-text-muted); }\n\n/* \u2500\u2500\u2500 Value cells \u2500\u2500\u2500 */\n\n.rpp-col-current { color: var(--mj-text-secondary); }\n.rpp-col-restore {\n color: var(--mj-text-primary);\n font-weight: 500;\n background: linear-gradient(90deg,\n color-mix(in srgb, var(--mj-brand-primary) 6%, transparent),\n transparent 80%);\n}\n\n.rpp-empty-cell {\n color: var(--mj-text-disabled);\n font-style: italic;\n}\n\n/* \u2500\u2500\u2500 Checkbox \u2500\u2500\u2500 */\n\n.rpp-checkbox {\n width: 18px;\n height: 18px;\n border: 1.5px solid var(--mj-border-strong);\n border-radius: 4px;\n background: var(--mj-bg-surface);\n display: inline-flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n padding: 0;\n color: var(--mj-text-inverse, #fff);\n transition: background-color 0.1s, border-color 0.1s;\n}\n\n.rpp-checkbox:hover:not(:disabled) {\n border-color: var(--mj-brand-primary);\n}\n\n.rpp-checkbox.checked {\n background: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n}\n\n.rpp-checkbox.checked i {\n font-size: 11px;\n}\n\n.rpp-checkbox.disabled,\n.rpp-checkbox:disabled {\n background: var(--mj-bg-surface-sunken);\n border-color: var(--mj-border-default);\n cursor: not-allowed;\n}\n\n/* \u2500\u2500\u2500 Flag icons \u2500\u2500\u2500 */\n\n.rpp-flag-changed { color: var(--mj-status-warning); }\n.rpp-flag-ok { color: var(--mj-text-disabled); }\n.rpp-flag-drift { color: var(--mj-status-warning); }\n.rpp-flag-immutable { color: var(--mj-text-disabled); }\n\n/* \u2500\u2500\u2500 Unchanged disclosure \u2500\u2500\u2500 */\n\n.rpp-disclosure {\n background: none;\n border: none;\n color: var(--mj-text-muted);\n font-size: 12px;\n cursor: pointer;\n padding: 8px 4px;\n display: flex;\n align-items: center;\n gap: 8px;\n text-align: left;\n}\n\n.rpp-disclosure:hover {\n color: var(--mj-text-primary);\n}\n\n.rpp-disclosure i {\n font-size: 10px;\n width: 12px;\n}\n\n/* \u2500\u2500\u2500 Reason section \u2500\u2500\u2500 */\n\n.rpp-reason-section {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.rpp-reason-section label {\n font-size: 12px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n.rpp-required {\n color: var(--mj-status-error);\n margin-left: 4px;\n}\n\n.rpp-optional {\n color: var(--mj-text-disabled);\n font-weight: 400;\n margin-left: 4px;\n}\n\n.rpp-reason-textarea {\n width: 100%;\n border: 1px solid var(--mj-border-default);\n border-radius: 7px;\n padding: 8px 10px;\n font-family: inherit;\n font-size: 13px;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n resize: vertical;\n min-height: 50px;\n box-sizing: border-box;\n}\n\n.rpp-reason-textarea:focus {\n outline: 2px solid var(--mj-brand-primary);\n outline-offset: -1px;\n border-color: var(--mj-brand-primary);\n}\n\n.rpp-reason-textarea:disabled {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-disabled);\n}\n\n/* \u2500\u2500\u2500 Footer \u2500\u2500\u2500 */\n\n.rpp-footer {\n position: sticky;\n bottom: 0;\n background: var(--mj-bg-surface);\n border-top: 1px solid var(--mj-border-default);\n padding: 12px 20px;\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 14px;\n}\n\n.rpp-footer-info {\n display: flex;\n align-items: center;\n gap: 7px;\n color: var(--mj-text-muted);\n font-size: 12px;\n}\n\n.rpp-footer-info i {\n color: var(--mj-brand-primary);\n}\n\n.rpp-footer-actions {\n display: flex;\n gap: 10px;\n}\n\n.rpp-btn {\n padding: 8px 16px;\n border-radius: 7px;\n font-size: 13px;\n font-weight: 600;\n cursor: pointer;\n border: 1px solid transparent;\n display: inline-flex;\n align-items: center;\n gap: 7px;\n font-family: inherit;\n}\n\n.rpp-btn-primary {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse, #fff);\n border-color: var(--mj-brand-primary);\n}\n\n.rpp-btn-primary:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n}\n\n.rpp-btn-primary:disabled {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-disabled);\n border-color: var(--mj-border-default);\n cursor: not-allowed;\n}\n\n.rpp-btn-secondary {\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n border-color: var(--mj-border-default);\n font-weight: 500;\n}\n\n.rpp-btn-secondary:hover:not(:disabled) {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n.rpp-btn-secondary:disabled {\n color: var(--mj-text-disabled);\n cursor: not-allowed;\n}\n"], encapsulation: 2, changeDetection: 0 });
|
|
745
741
|
}
|
|
746
742
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(RestorePreviewPanelComponent, [{
|
|
747
743
|
type: Component,
|
|
748
|
-
args: [{ standalone: false, selector: 'mj-restore-preview-panel', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "<mj-slide-panel\n [Mode]=\"'slide'\"\n [Title]=\"HeaderTitle\"\n [Visible]=\"Visible\"\n [Resizable]=\"true\"\n [MinWidthPx]=\"500\"\n [MaxWidthRatio]=\"0.7\"\n (Closed)=\"Cancel()\">\n\n @if (RecordChange) {\n <div class=\"rpp-container\">\n\n <!-- Header summary block -->\n <div class=\"rpp-header\">\n <div class=\"rpp-header-icon\">\n <i class=\"fa-solid fa-clock-rotate-left\" aria-hidden=\"true\"></i>\n </div>\n <div class=\"rpp-header-text\">\n <div class=\"rpp-header-title\">{{ HeaderTitle }}</div>\n <div class=\"rpp-header-meta\">\n <span><strong>Version:</strong> {{ formatTimestamp(VersionTimestamp) }}</span>\n @if (VersionUser) {\n <span><strong>By:</strong> {{ VersionUser }}</span>\n }\n </div>\n </div>\n </div>\n\n <!-- Drift warning -->\n @if (DriftCount > 0) {\n <div class=\"rpp-banner rpp-banner-warning\">\n <i class=\"fa-solid fa-triangle-exclamation\" aria-hidden=\"true\"></i>\n <span>{{ DriftCount }} field{{ DriftCount === 1 ? '' : 's' }} from this snapshot no longer exist on the entity and will be skipped.</span>\n </div>\n }\n\n <!-- Empty state -->\n @if (Rows.length === 0) {\n <div class=\"rpp-empty\">\n <i class=\"fa-solid fa-circle-info\" aria-hidden=\"true\"></i>\n <p>No fields could be parsed from this snapshot.</p>\n </div>\n }\n\n <!-- Action bar (select all / deselect all) -->\n @if (Rows.length > 0 && Mode !== 'undelete') {\n <div class=\"rpp-action-bar\">\n <span class=\"rpp-action-bar-label\">{{ ChangedCount }} field{{ ChangedCount === 1 ? '' : 's' }} differ from current</span>\n <div class=\"rpp-action-bar-buttons\">\n <button class=\"rpp-link-btn\" type=\"button\" (click)=\"SelectAll()\" [disabled]=\"IsRestoring\">Select all changed</button>\n <span class=\"rpp-action-bar-sep\">\u00B7</span>\n <button class=\"rpp-link-btn\" type=\"button\" (click)=\"DeselectAll()\" [disabled]=\"IsRestoring\">Deselect all</button>\n </div>\n </div>\n }\n\n <!-- Diff table -->\n @if (Rows.length > 0) {\n <div class=\"rpp-table-wrap\">\n <table class=\"rpp-table\">\n <thead>\n <tr>\n <th class=\"rpp-col-check\"></th>\n <th class=\"rpp-col-field\">Field</th>\n @if (Mode === 'live') {\n <th class=\"rpp-col-current\">Current Value</th>\n <th class=\"rpp-col-restore\">Restore To</th>\n } @else {\n <th class=\"rpp-col-restore\" colspan=\"2\">Will be created with</th>\n }\n <th class=\"rpp-col-flag\"></th>\n </tr>\n </thead>\n <tbody>\n @for (row of Rows; track row.FieldName) {\n @if (row.IsChanged || ShowUnchanged) {\n <tr [class.rpp-row-changed]=\"row.IsChanged\"\n [class.rpp-row-unchanged]=\"!row.IsChanged\"\n [class.rpp-row-immutable]=\"row.IsImmutable\"\n [class.rpp-row-drift]=\"row.IsMissingInSchema\">\n <td class=\"rpp-col-check\">\n <button type=\"button\"\n class=\"rpp-checkbox\"\n [class.checked]=\"row.Selected\"\n [class.disabled]=\"row.IsImmutable || row.IsMissingInSchema\"\n [disabled]=\"row.IsImmutable || row.IsMissingInSchema || IsRestoring\"\n [attr.aria-label]=\"'Toggle ' + row.DisplayName\"\n (click)=\"ToggleRow(row)\">\n @if (row.Selected) {\n <i class=\"fa-solid fa-check\" aria-hidden=\"true\"></i>\n }\n </button>\n </td>\n <td class=\"rpp-col-field\">\n <div class=\"rpp-field-display\">{{ row.DisplayName }}</div>\n <div class=\"rpp-field-name\">{{ row.FieldName }}</div>\n </td>\n @if (Mode === 'live') {\n <td class=\"rpp-col-current\" [class.rpp-empty-cell]=\"!row.CurrentValue\">\n {{ row.CurrentValue || '(empty)' }}\n </td>\n <td class=\"rpp-col-restore\" [class.rpp-empty-cell]=\"!row.RestoreValue\">\n {{ row.RestoreValue || '(empty)' }}\n </td>\n } @else {\n <td class=\"rpp-col-restore\" colspan=\"2\" [class.rpp-empty-cell]=\"!row.RestoreValue\">\n {{ row.RestoreValue || '(empty)' }}\n </td>\n }\n <td class=\"rpp-col-flag\">\n @if (row.IsMissingInSchema) {\n <i class=\"fa-solid fa-triangle-exclamation rpp-flag-drift\"\n title=\"This field no longer exists on the entity and will be skipped\"\n aria-hidden=\"true\"></i>\n } @else if (row.IsImmutable) {\n <i class=\"fa-solid fa-lock rpp-flag-immutable\"\n title=\"Read-only or system field \u2014 cannot be modified\"\n aria-hidden=\"true\"></i>\n } @else if (row.IsChanged) {\n <i class=\"fa-solid fa-circle-exclamation rpp-flag-changed\"\n title=\"Will be changed\"\n aria-hidden=\"true\"></i>\n } @else {\n <i class=\"fa-solid fa-check rpp-flag-ok\"\n title=\"Already matches\"\n aria-hidden=\"true\"></i>\n }\n </td>\n </tr>\n }\n }\n </tbody>\n </table>\n </div>\n\n <!-- Unchanged disclosure -->\n @if (UnchangedCount > 0 && Mode === 'live') {\n <button class=\"rpp-disclosure\" type=\"button\" (click)=\"ToggleUnchanged()\">\n <i class=\"fa-solid\"\n [class.fa-chevron-right]=\"!ShowUnchanged\"\n [class.fa-chevron-down]=\"ShowUnchanged\"\n aria-hidden=\"true\"></i>\n <span>{{ ShowUnchanged ? 'Hide' : 'Show' }} {{ UnchangedCount }} unchanged field{{ UnchangedCount === 1 ? '' : 's' }}</span>\n </button>\n }\n }\n\n <!-- Reason text area -->\n @if (!HideReason && Rows.length > 0) {\n <div class=\"rpp-reason-section\">\n <label for=\"rpp-reason-input\">\n Reason for restore\n @if (RequireReason) {\n <span class=\"rpp-required\">*</span>\n } @else {\n <span class=\"rpp-optional\">(optional)</span>\n }\n </label>\n <textarea id=\"rpp-reason-input\"\n [(ngModel)]=\"Reason\"\n [disabled]=\"IsRestoring\"\n placeholder=\"e.g., Reverting incorrect Q2 entries\"\n class=\"rpp-reason-textarea\"\n rows=\"2\"></textarea>\n </div>\n }\n </div>\n\n <!-- Footer actions -->\n <div class=\"rpp-footer\">\n <div class=\"rpp-footer-info\">\n <i class=\"fa-solid fa-shield-halved\" aria-hidden=\"true\"></i>\n @if (Mode === 'live') {\n <span>A snapshot of the current state is saved automatically before the restore.</span>\n } @else {\n <span>A new \"Created\" entry will be added to this record's history, linked back to the original deletion.</span>\n }\n </div>\n <div class=\"rpp-footer-actions\">\n <button type=\"button\"\n class=\"rpp-btn rpp-btn-primary\"\n [disabled]=\"IsRestoreDisabled\"\n (click)=\"ConfirmRestore()\">\n @if (IsRestoring) {\n <i class=\"fa-solid fa-spinner fa-spin\" aria-hidden=\"true\"></i>\n } @else {\n <i class=\"fa-solid fa-rotate-left\" aria-hidden=\"true\"></i>\n }\n {{ RestoreButtonLabel }}\n </button>\n <button type=\"button\"\n class=\"rpp-btn rpp-btn-secondary\"\n [disabled]=\"IsRestoring\"\n (click)=\"Cancel()\">Cancel</button>\n </div>\n </div>\n }\n</mj-slide-panel>\n", styles: ["/* \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n * Restore Preview Panel\n * Slide-in panel that previews a restore operation field-by-field.\n * All colors use --mj-* design tokens so it adapts to dark mode and\n * white-label themes.\n * \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.rpp-container {\n padding: 18px 20px;\n display: flex;\n flex-direction: column;\n gap: 14px;\n}\n\n/* \u2500\u2500\u2500 Header summary \u2500\u2500\u2500 */\n\n.rpp-header {\n display: flex;\n align-items: flex-start;\n gap: 14px;\n padding-bottom: 14px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.rpp-header-icon {\n width: 38px;\n height: 38px;\n border-radius: 8px;\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n font-size: 16px;\n}\n\n.rpp-header-text {\n flex: 1;\n min-width: 0;\n}\n\n.rpp-header-title {\n font-size: 15px;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin-bottom: 4px;\n}\n\n.rpp-header-meta {\n display: flex;\n flex-wrap: wrap;\n gap: 14px;\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n.rpp-header-meta strong {\n color: var(--mj-text-secondary);\n font-weight: 500;\n margin-right: 4px;\n}\n\n/* \u2500\u2500\u2500 Banners \u2500\u2500\u2500 */\n\n.rpp-banner {\n display: flex;\n align-items: center;\n gap: 9px;\n padding: 10px 12px;\n border-radius: 8px;\n font-size: 12px;\n border: 1px solid;\n}\n\n.rpp-banner-warning {\n background: var(--mj-status-warning-bg);\n color: var(--mj-status-warning-text);\n border-color: var(--mj-status-warning-border);\n}\n\n/* \u2500\u2500\u2500 Empty state \u2500\u2500\u2500 */\n\n.rpp-empty {\n text-align: center;\n padding: 30px 20px;\n color: var(--mj-text-muted);\n}\n\n.rpp-empty i {\n font-size: 24px;\n margin-bottom: 8px;\n}\n\n.rpp-empty p {\n margin: 0;\n font-size: 13px;\n}\n\n/* \u2500\u2500\u2500 Action bar (select all / deselect all) \u2500\u2500\u2500 */\n\n.rpp-action-bar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 10px;\n padding: 8px 12px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 7px;\n font-size: 12px;\n}\n\n.rpp-action-bar-label {\n color: var(--mj-text-secondary);\n font-weight: 500;\n}\n\n.rpp-action-bar-buttons {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.rpp-action-bar-sep {\n color: var(--mj-text-disabled);\n}\n\n.rpp-link-btn {\n background: none;\n border: none;\n color: var(--mj-brand-primary);\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n padding: 2px 4px;\n border-radius: 4px;\n}\n\n.rpp-link-btn:hover:not(:disabled) {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n}\n\n.rpp-link-btn:disabled {\n color: var(--mj-text-disabled);\n cursor: not-allowed;\n}\n\n/* \u2500\u2500\u2500 Diff table \u2500\u2500\u2500 */\n\n.rpp-table-wrap {\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n overflow: hidden;\n}\n\n.rpp-table {\n width: 100%;\n border-collapse: collapse;\n font-size: 13px;\n background: var(--mj-bg-surface);\n}\n\n.rpp-table thead th {\n text-align: left;\n padding: 10px 12px;\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n font-size: 11px;\n text-transform: uppercase;\n letter-spacing: 0.06em;\n color: var(--mj-text-muted);\n font-weight: 600;\n}\n\n.rpp-table tbody td {\n padding: 10px 12px;\n border-bottom: 1px solid var(--mj-border-subtle);\n vertical-align: top;\n}\n\n.rpp-table tbody tr:last-child td {\n border-bottom: none;\n}\n\n.rpp-row-changed { background: var(--mj-bg-surface); }\n.rpp-row-unchanged {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-disabled);\n}\n.rpp-row-immutable { opacity: 0.7; }\n.rpp-row-drift { background: color-mix(in srgb, var(--mj-status-warning) 5%, var(--mj-bg-surface)); }\n\n/* Column widths */\n.rpp-col-check { width: 36px; padding: 8px 4px 8px 12px; }\n.rpp-col-field { width: 28%; min-width: 140px; }\n.rpp-col-current,\n.rpp-col-restore { word-break: break-word; }\n.rpp-col-flag { width: 28px; text-align: right; padding-right: 12px; }\n\n/* \u2500\u2500\u2500 Field cell \u2500\u2500\u2500 */\n\n.rpp-field-display {\n font-weight: 500;\n color: var(--mj-text-primary);\n margin-bottom: 2px;\n}\n\n.rpp-field-name {\n color: var(--mj-text-disabled);\n font-size: 11px;\n font-family: ui-monospace, SFMono-Regular, Consolas, monospace;\n}\n\n.rpp-row-unchanged .rpp-field-display { color: var(--mj-text-muted); }\n\n/* \u2500\u2500\u2500 Value cells \u2500\u2500\u2500 */\n\n.rpp-col-current { color: var(--mj-text-secondary); }\n.rpp-col-restore {\n color: var(--mj-text-primary);\n font-weight: 500;\n background: linear-gradient(90deg,\n color-mix(in srgb, var(--mj-brand-primary) 6%, transparent),\n transparent 80%);\n}\n\n.rpp-empty-cell {\n color: var(--mj-text-disabled);\n font-style: italic;\n}\n\n/* \u2500\u2500\u2500 Checkbox \u2500\u2500\u2500 */\n\n.rpp-checkbox {\n width: 18px;\n height: 18px;\n border: 1.5px solid var(--mj-border-strong);\n border-radius: 4px;\n background: var(--mj-bg-surface);\n display: inline-flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n padding: 0;\n color: var(--mj-text-inverse, #fff);\n transition: background-color 0.1s, border-color 0.1s;\n}\n\n.rpp-checkbox:hover:not(:disabled) {\n border-color: var(--mj-brand-primary);\n}\n\n.rpp-checkbox.checked {\n background: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n}\n\n.rpp-checkbox.checked i {\n font-size: 11px;\n}\n\n.rpp-checkbox.disabled,\n.rpp-checkbox:disabled {\n background: var(--mj-bg-surface-sunken);\n border-color: var(--mj-border-default);\n cursor: not-allowed;\n}\n\n/* \u2500\u2500\u2500 Flag icons \u2500\u2500\u2500 */\n\n.rpp-flag-changed { color: var(--mj-status-warning); }\n.rpp-flag-ok { color: var(--mj-text-disabled); }\n.rpp-flag-drift { color: var(--mj-status-warning); }\n.rpp-flag-immutable { color: var(--mj-text-disabled); }\n\n/* \u2500\u2500\u2500 Unchanged disclosure \u2500\u2500\u2500 */\n\n.rpp-disclosure {\n background: none;\n border: none;\n color: var(--mj-text-muted);\n font-size: 12px;\n cursor: pointer;\n padding: 8px 4px;\n display: flex;\n align-items: center;\n gap: 8px;\n text-align: left;\n}\n\n.rpp-disclosure:hover {\n color: var(--mj-text-primary);\n}\n\n.rpp-disclosure i {\n font-size: 10px;\n width: 12px;\n}\n\n/* \u2500\u2500\u2500 Reason section \u2500\u2500\u2500 */\n\n.rpp-reason-section {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.rpp-reason-section label {\n font-size: 12px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n.rpp-required {\n color: var(--mj-status-error);\n margin-left: 4px;\n}\n\n.rpp-optional {\n color: var(--mj-text-disabled);\n font-weight: 400;\n margin-left: 4px;\n}\n\n.rpp-reason-textarea {\n width: 100%;\n border: 1px solid var(--mj-border-default);\n border-radius: 7px;\n padding: 8px 10px;\n font-family: inherit;\n font-size: 13px;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n resize: vertical;\n min-height: 50px;\n box-sizing: border-box;\n}\n\n.rpp-reason-textarea:focus {\n outline: 2px solid var(--mj-brand-primary);\n outline-offset: -1px;\n border-color: var(--mj-brand-primary);\n}\n\n.rpp-reason-textarea:disabled {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-disabled);\n}\n\n/* \u2500\u2500\u2500 Footer \u2500\u2500\u2500 */\n\n.rpp-footer {\n position: sticky;\n bottom: 0;\n background: var(--mj-bg-surface);\n border-top: 1px solid var(--mj-border-default);\n padding: 12px 20px;\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 14px;\n}\n\n.rpp-footer-info {\n display: flex;\n align-items: center;\n gap: 7px;\n color: var(--mj-text-muted);\n font-size: 12px;\n}\n\n.rpp-footer-info i {\n color: var(--mj-brand-primary);\n}\n\n.rpp-footer-actions {\n display: flex;\n gap: 10px;\n}\n\n.rpp-btn {\n padding: 8px 16px;\n border-radius: 7px;\n font-size: 13px;\n font-weight: 600;\n cursor: pointer;\n border: 1px solid transparent;\n display: inline-flex;\n align-items: center;\n gap: 7px;\n font-family: inherit;\n}\n\n.rpp-btn-primary {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse, #fff);\n border-color: var(--mj-brand-primary);\n}\n\n.rpp-btn-primary:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n}\n\n.rpp-btn-primary:disabled {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-disabled);\n border-color: var(--mj-border-default);\n cursor: not-allowed;\n}\n\n.rpp-btn-secondary {\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n border-color: var(--mj-border-default);\n font-weight: 500;\n}\n\n.rpp-btn-secondary:hover:not(:disabled) {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n.rpp-btn-secondary:disabled {\n color: var(--mj-text-disabled);\n cursor: not-allowed;\n}\n"] }]
|
|
744
|
+
args: [{ standalone: false, selector: 'mj-restore-preview-panel', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "<mj-slide-panel\n [Mode]=\"'slide'\"\n [Title]=\"HeaderTitle\"\n [Visible]=\"Visible\"\n [Resizable]=\"true\"\n [MinWidthPx]=\"500\"\n [MaxWidthRatio]=\"0.7\"\n (Closed)=\"Cancel()\">\n\n @if (RecordChange) {\n <div class=\"rpp-container\">\n\n <!-- Header summary block -->\n <div class=\"rpp-header\">\n <div class=\"rpp-header-icon\">\n <i class=\"fa-solid fa-clock-rotate-left\" aria-hidden=\"true\"></i>\n </div>\n <div class=\"rpp-header-text\">\n <div class=\"rpp-header-title\">{{ HeaderTitle }}</div>\n <div class=\"rpp-header-meta\">\n <span><strong>Version:</strong> {{ formatTimestamp(VersionTimestamp) }}</span>\n @if (VersionUser) {\n <span><strong>By:</strong> {{ VersionUser }}</span>\n }\n </div>\n </div>\n </div>\n\n <!-- Drift warning -->\n @if (DriftCount > 0) {\n <div class=\"rpp-banner rpp-banner-warning\">\n <i class=\"fa-solid fa-triangle-exclamation\" aria-hidden=\"true\"></i>\n <span>{{ DriftCount }} field{{ DriftCount === 1 ? '' : 's' }} from this snapshot no longer exist on the entity and will be skipped.</span>\n </div>\n }\n\n <!-- Empty state -->\n @if (Rows.length === 0) {\n <mj-empty-state class=\"rpp-empty\" Size=\"compact\"\n Icon=\"fa-solid fa-circle-info\"\n Title=\"No fields could be parsed from this snapshot.\" />\n }\n\n <!-- Action bar (select all / deselect all) -->\n @if (Rows.length > 0 && Mode !== 'undelete') {\n <div class=\"rpp-action-bar\">\n <span class=\"rpp-action-bar-label\">{{ ChangedCount }} field{{ ChangedCount === 1 ? '' : 's' }} differ from current</span>\n <div class=\"rpp-action-bar-buttons\">\n <button class=\"rpp-link-btn\" type=\"button\" (click)=\"SelectAll()\" [disabled]=\"IsRestoring\">Select all changed</button>\n <span class=\"rpp-action-bar-sep\">\u00B7</span>\n <button class=\"rpp-link-btn\" type=\"button\" (click)=\"DeselectAll()\" [disabled]=\"IsRestoring\">Deselect all</button>\n </div>\n </div>\n }\n\n <!-- Diff table -->\n @if (Rows.length > 0) {\n <div class=\"rpp-table-wrap\">\n <table class=\"rpp-table\">\n <thead>\n <tr>\n <th class=\"rpp-col-check\"></th>\n <th class=\"rpp-col-field\">Field</th>\n @if (Mode === 'live') {\n <th class=\"rpp-col-current\">Current Value</th>\n <th class=\"rpp-col-restore\">Restore To</th>\n } @else {\n <th class=\"rpp-col-restore\" colspan=\"2\">Will be created with</th>\n }\n <th class=\"rpp-col-flag\"></th>\n </tr>\n </thead>\n <tbody>\n @for (row of Rows; track row.FieldName) {\n @if (row.IsChanged || ShowUnchanged) {\n <tr [class.rpp-row-changed]=\"row.IsChanged\"\n [class.rpp-row-unchanged]=\"!row.IsChanged\"\n [class.rpp-row-immutable]=\"row.IsImmutable\"\n [class.rpp-row-drift]=\"row.IsMissingInSchema\">\n <td class=\"rpp-col-check\">\n <button type=\"button\"\n class=\"rpp-checkbox\"\n [class.checked]=\"row.Selected\"\n [class.disabled]=\"row.IsImmutable || row.IsMissingInSchema\"\n [disabled]=\"row.IsImmutable || row.IsMissingInSchema || IsRestoring\"\n [attr.aria-label]=\"'Toggle ' + row.DisplayName\"\n (click)=\"ToggleRow(row)\">\n @if (row.Selected) {\n <i class=\"fa-solid fa-check\" aria-hidden=\"true\"></i>\n }\n </button>\n </td>\n <td class=\"rpp-col-field\">\n <div class=\"rpp-field-display\">{{ row.DisplayName }}</div>\n <div class=\"rpp-field-name\">{{ row.FieldName }}</div>\n </td>\n @if (Mode === 'live') {\n <td class=\"rpp-col-current\" [class.rpp-empty-cell]=\"!row.CurrentValue\">\n {{ row.CurrentValue || '(empty)' }}\n </td>\n <td class=\"rpp-col-restore\" [class.rpp-empty-cell]=\"!row.RestoreValue\">\n {{ row.RestoreValue || '(empty)' }}\n </td>\n } @else {\n <td class=\"rpp-col-restore\" colspan=\"2\" [class.rpp-empty-cell]=\"!row.RestoreValue\">\n {{ row.RestoreValue || '(empty)' }}\n </td>\n }\n <td class=\"rpp-col-flag\">\n @if (row.IsMissingInSchema) {\n <i class=\"fa-solid fa-triangle-exclamation rpp-flag-drift\"\n title=\"This field no longer exists on the entity and will be skipped\"\n aria-hidden=\"true\"></i>\n } @else if (row.IsImmutable) {\n <i class=\"fa-solid fa-lock rpp-flag-immutable\"\n title=\"Read-only or system field \u2014 cannot be modified\"\n aria-hidden=\"true\"></i>\n } @else if (row.IsChanged) {\n <i class=\"fa-solid fa-circle-exclamation rpp-flag-changed\"\n title=\"Will be changed\"\n aria-hidden=\"true\"></i>\n } @else {\n <i class=\"fa-solid fa-check rpp-flag-ok\"\n title=\"Already matches\"\n aria-hidden=\"true\"></i>\n }\n </td>\n </tr>\n }\n }\n </tbody>\n </table>\n </div>\n\n <!-- Unchanged disclosure -->\n @if (UnchangedCount > 0 && Mode === 'live') {\n <button class=\"rpp-disclosure\" type=\"button\" (click)=\"ToggleUnchanged()\">\n <i class=\"fa-solid\"\n [class.fa-chevron-right]=\"!ShowUnchanged\"\n [class.fa-chevron-down]=\"ShowUnchanged\"\n aria-hidden=\"true\"></i>\n <span>{{ ShowUnchanged ? 'Hide' : 'Show' }} {{ UnchangedCount }} unchanged field{{ UnchangedCount === 1 ? '' : 's' }}</span>\n </button>\n }\n }\n\n <!-- Reason text area -->\n @if (!HideReason && Rows.length > 0) {\n <div class=\"rpp-reason-section\">\n <label for=\"rpp-reason-input\">\n Reason for restore\n @if (RequireReason) {\n <span class=\"rpp-required\">*</span>\n } @else {\n <span class=\"rpp-optional\">(optional)</span>\n }\n </label>\n <textarea id=\"rpp-reason-input\"\n [(ngModel)]=\"Reason\"\n [disabled]=\"IsRestoring\"\n placeholder=\"e.g., Reverting incorrect Q2 entries\"\n class=\"rpp-reason-textarea\"\n rows=\"2\"></textarea>\n </div>\n }\n </div>\n\n <!-- Footer actions -->\n <div class=\"rpp-footer\">\n <div class=\"rpp-footer-info\">\n <i class=\"fa-solid fa-shield-halved\" aria-hidden=\"true\"></i>\n @if (Mode === 'live') {\n <span>A snapshot of the current state is saved automatically before the restore.</span>\n } @else {\n <span>A new \"Created\" entry will be added to this record's history, linked back to the original deletion.</span>\n }\n </div>\n <div class=\"rpp-footer-actions\">\n <button type=\"button\"\n class=\"rpp-btn rpp-btn-primary\"\n [disabled]=\"IsRestoreDisabled\"\n (click)=\"ConfirmRestore()\">\n @if (IsRestoring) {\n <i class=\"fa-solid fa-spinner fa-spin\" aria-hidden=\"true\"></i>\n } @else {\n <i class=\"fa-solid fa-rotate-left\" aria-hidden=\"true\"></i>\n }\n {{ RestoreButtonLabel }}\n </button>\n <button type=\"button\"\n class=\"rpp-btn rpp-btn-secondary\"\n [disabled]=\"IsRestoring\"\n (click)=\"Cancel()\">Cancel</button>\n </div>\n </div>\n }\n</mj-slide-panel>\n", styles: ["/* \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n * Restore Preview Panel\n * Slide-in panel that previews a restore operation field-by-field.\n * All colors use --mj-* design tokens so it adapts to dark mode and\n * white-label themes.\n * \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.rpp-container {\n padding: 18px 20px;\n display: flex;\n flex-direction: column;\n gap: 14px;\n}\n\n/* \u2500\u2500\u2500 Header summary \u2500\u2500\u2500 */\n\n.rpp-header {\n display: flex;\n align-items: flex-start;\n gap: 14px;\n padding-bottom: 14px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.rpp-header-icon {\n width: 38px;\n height: 38px;\n border-radius: 8px;\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n font-size: 16px;\n}\n\n.rpp-header-text {\n flex: 1;\n min-width: 0;\n}\n\n.rpp-header-title {\n font-size: 15px;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin-bottom: 4px;\n}\n\n.rpp-header-meta {\n display: flex;\n flex-wrap: wrap;\n gap: 14px;\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n.rpp-header-meta strong {\n color: var(--mj-text-secondary);\n font-weight: 500;\n margin-right: 4px;\n}\n\n/* \u2500\u2500\u2500 Banners \u2500\u2500\u2500 */\n\n.rpp-banner {\n display: flex;\n align-items: center;\n gap: 9px;\n padding: 10px 12px;\n border-radius: 8px;\n font-size: 12px;\n border: 1px solid;\n}\n\n.rpp-banner-warning {\n background: var(--mj-status-warning-bg);\n color: var(--mj-status-warning-text);\n border-color: var(--mj-status-warning-border);\n}\n\n/* \u2500\u2500\u2500 Empty state \u2500\u2500\u2500 */\n\n.rpp-empty {\n text-align: center;\n padding: 30px 20px;\n color: var(--mj-text-muted);\n}\n\n.rpp-empty i {\n font-size: 24px;\n margin-bottom: 8px;\n}\n\n.rpp-empty p {\n margin: 0;\n font-size: 13px;\n}\n\n/* \u2500\u2500\u2500 Action bar (select all / deselect all) \u2500\u2500\u2500 */\n\n.rpp-action-bar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 10px;\n padding: 8px 12px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 7px;\n font-size: 12px;\n}\n\n.rpp-action-bar-label {\n color: var(--mj-text-secondary);\n font-weight: 500;\n}\n\n.rpp-action-bar-buttons {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.rpp-action-bar-sep {\n color: var(--mj-text-disabled);\n}\n\n.rpp-link-btn {\n background: none;\n border: none;\n color: var(--mj-brand-primary);\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n padding: 2px 4px;\n border-radius: 4px;\n}\n\n.rpp-link-btn:hover:not(:disabled) {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n}\n\n.rpp-link-btn:disabled {\n color: var(--mj-text-disabled);\n cursor: not-allowed;\n}\n\n/* \u2500\u2500\u2500 Diff table \u2500\u2500\u2500 */\n\n.rpp-table-wrap {\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n overflow: hidden;\n}\n\n.rpp-table {\n width: 100%;\n border-collapse: collapse;\n font-size: 13px;\n background: var(--mj-bg-surface);\n}\n\n.rpp-table thead th {\n text-align: left;\n padding: 10px 12px;\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n font-size: 11px;\n text-transform: uppercase;\n letter-spacing: 0.06em;\n color: var(--mj-text-muted);\n font-weight: 600;\n}\n\n.rpp-table tbody td {\n padding: 10px 12px;\n border-bottom: 1px solid var(--mj-border-subtle);\n vertical-align: top;\n}\n\n.rpp-table tbody tr:last-child td {\n border-bottom: none;\n}\n\n.rpp-row-changed { background: var(--mj-bg-surface); }\n.rpp-row-unchanged {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-disabled);\n}\n.rpp-row-immutable { opacity: 0.7; }\n.rpp-row-drift { background: color-mix(in srgb, var(--mj-status-warning) 5%, var(--mj-bg-surface)); }\n\n/* Column widths */\n.rpp-col-check { width: 36px; padding: 8px 4px 8px 12px; }\n.rpp-col-field { width: 28%; min-width: 140px; }\n.rpp-col-current,\n.rpp-col-restore { word-break: break-word; }\n.rpp-col-flag { width: 28px; text-align: right; padding-right: 12px; }\n\n/* \u2500\u2500\u2500 Field cell \u2500\u2500\u2500 */\n\n.rpp-field-display {\n font-weight: 500;\n color: var(--mj-text-primary);\n margin-bottom: 2px;\n}\n\n.rpp-field-name {\n color: var(--mj-text-disabled);\n font-size: 11px;\n font-family: ui-monospace, SFMono-Regular, Consolas, monospace;\n}\n\n.rpp-row-unchanged .rpp-field-display { color: var(--mj-text-muted); }\n\n/* \u2500\u2500\u2500 Value cells \u2500\u2500\u2500 */\n\n.rpp-col-current { color: var(--mj-text-secondary); }\n.rpp-col-restore {\n color: var(--mj-text-primary);\n font-weight: 500;\n background: linear-gradient(90deg,\n color-mix(in srgb, var(--mj-brand-primary) 6%, transparent),\n transparent 80%);\n}\n\n.rpp-empty-cell {\n color: var(--mj-text-disabled);\n font-style: italic;\n}\n\n/* \u2500\u2500\u2500 Checkbox \u2500\u2500\u2500 */\n\n.rpp-checkbox {\n width: 18px;\n height: 18px;\n border: 1.5px solid var(--mj-border-strong);\n border-radius: 4px;\n background: var(--mj-bg-surface);\n display: inline-flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n padding: 0;\n color: var(--mj-text-inverse, #fff);\n transition: background-color 0.1s, border-color 0.1s;\n}\n\n.rpp-checkbox:hover:not(:disabled) {\n border-color: var(--mj-brand-primary);\n}\n\n.rpp-checkbox.checked {\n background: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n}\n\n.rpp-checkbox.checked i {\n font-size: 11px;\n}\n\n.rpp-checkbox.disabled,\n.rpp-checkbox:disabled {\n background: var(--mj-bg-surface-sunken);\n border-color: var(--mj-border-default);\n cursor: not-allowed;\n}\n\n/* \u2500\u2500\u2500 Flag icons \u2500\u2500\u2500 */\n\n.rpp-flag-changed { color: var(--mj-status-warning); }\n.rpp-flag-ok { color: var(--mj-text-disabled); }\n.rpp-flag-drift { color: var(--mj-status-warning); }\n.rpp-flag-immutable { color: var(--mj-text-disabled); }\n\n/* \u2500\u2500\u2500 Unchanged disclosure \u2500\u2500\u2500 */\n\n.rpp-disclosure {\n background: none;\n border: none;\n color: var(--mj-text-muted);\n font-size: 12px;\n cursor: pointer;\n padding: 8px 4px;\n display: flex;\n align-items: center;\n gap: 8px;\n text-align: left;\n}\n\n.rpp-disclosure:hover {\n color: var(--mj-text-primary);\n}\n\n.rpp-disclosure i {\n font-size: 10px;\n width: 12px;\n}\n\n/* \u2500\u2500\u2500 Reason section \u2500\u2500\u2500 */\n\n.rpp-reason-section {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.rpp-reason-section label {\n font-size: 12px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n.rpp-required {\n color: var(--mj-status-error);\n margin-left: 4px;\n}\n\n.rpp-optional {\n color: var(--mj-text-disabled);\n font-weight: 400;\n margin-left: 4px;\n}\n\n.rpp-reason-textarea {\n width: 100%;\n border: 1px solid var(--mj-border-default);\n border-radius: 7px;\n padding: 8px 10px;\n font-family: inherit;\n font-size: 13px;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n resize: vertical;\n min-height: 50px;\n box-sizing: border-box;\n}\n\n.rpp-reason-textarea:focus {\n outline: 2px solid var(--mj-brand-primary);\n outline-offset: -1px;\n border-color: var(--mj-brand-primary);\n}\n\n.rpp-reason-textarea:disabled {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-disabled);\n}\n\n/* \u2500\u2500\u2500 Footer \u2500\u2500\u2500 */\n\n.rpp-footer {\n position: sticky;\n bottom: 0;\n background: var(--mj-bg-surface);\n border-top: 1px solid var(--mj-border-default);\n padding: 12px 20px;\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 14px;\n}\n\n.rpp-footer-info {\n display: flex;\n align-items: center;\n gap: 7px;\n color: var(--mj-text-muted);\n font-size: 12px;\n}\n\n.rpp-footer-info i {\n color: var(--mj-brand-primary);\n}\n\n.rpp-footer-actions {\n display: flex;\n gap: 10px;\n}\n\n.rpp-btn {\n padding: 8px 16px;\n border-radius: 7px;\n font-size: 13px;\n font-weight: 600;\n cursor: pointer;\n border: 1px solid transparent;\n display: inline-flex;\n align-items: center;\n gap: 7px;\n font-family: inherit;\n}\n\n.rpp-btn-primary {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse, #fff);\n border-color: var(--mj-brand-primary);\n}\n\n.rpp-btn-primary:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n}\n\n.rpp-btn-primary:disabled {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-disabled);\n border-color: var(--mj-border-default);\n cursor: not-allowed;\n}\n\n.rpp-btn-secondary {\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n border-color: var(--mj-border-default);\n font-weight: 500;\n}\n\n.rpp-btn-secondary:hover:not(:disabled) {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n.rpp-btn-secondary:disabled {\n color: var(--mj-text-disabled);\n cursor: not-allowed;\n}\n"] }]
|
|
749
745
|
}], () => [{ type: i0.ChangeDetectorRef }], { Visible: [{
|
|
750
746
|
type: Input
|
|
751
747
|
}], Mode: [{
|