@memberjunction/ng-record-clone 0.0.1-seed.1 → 6.2.0-edge.3

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.
Files changed (55) hide show
  1. package/LICENSE +183 -0
  2. package/README.md +241 -3
  3. package/dist/lib/clone-lineage-chip.component.d.ts +50 -0
  4. package/dist/lib/clone-lineage-chip.component.d.ts.map +1 -0
  5. package/dist/lib/clone-lineage-chip.component.js +448 -0
  6. package/dist/lib/clone-lineage-chip.component.js.map +1 -0
  7. package/dist/lib/clone-plan-tree.component.d.ts +51 -0
  8. package/dist/lib/clone-plan-tree.component.d.ts.map +1 -0
  9. package/dist/lib/clone-plan-tree.component.js +634 -0
  10. package/dist/lib/clone-plan-tree.component.js.map +1 -0
  11. package/dist/lib/clone-progress.component.d.ts +12 -0
  12. package/dist/lib/clone-progress.component.d.ts.map +1 -0
  13. package/dist/lib/clone-progress.component.js +151 -0
  14. package/dist/lib/clone-progress.component.js.map +1 -0
  15. package/dist/lib/clone-result.component.d.ts +40 -0
  16. package/dist/lib/clone-result.component.d.ts.map +1 -0
  17. package/dist/lib/clone-result.component.js +357 -0
  18. package/dist/lib/clone-result.component.js.map +1 -0
  19. package/dist/lib/clone-review.component.d.ts +58 -0
  20. package/dist/lib/clone-review.component.d.ts.map +1 -0
  21. package/dist/lib/clone-review.component.js +581 -0
  22. package/dist/lib/clone-review.component.js.map +1 -0
  23. package/dist/lib/clone-scope-controls.component.d.ts +81 -0
  24. package/dist/lib/clone-scope-controls.component.d.ts.map +1 -0
  25. package/dist/lib/clone-scope-controls.component.js +394 -0
  26. package/dist/lib/clone-scope-controls.component.js.map +1 -0
  27. package/dist/lib/clone-values.component.d.ts +55 -0
  28. package/dist/lib/clone-values.component.d.ts.map +1 -0
  29. package/dist/lib/clone-values.component.js +493 -0
  30. package/dist/lib/clone-values.component.js.map +1 -0
  31. package/dist/lib/record-clone-panel.component.d.ts +247 -0
  32. package/dist/lib/record-clone-panel.component.d.ts.map +1 -0
  33. package/dist/lib/record-clone-panel.component.js +1252 -0
  34. package/dist/lib/record-clone-panel.component.js.map +1 -0
  35. package/dist/lib/record-clone-slide-in.component.d.ts +83 -0
  36. package/dist/lib/record-clone-slide-in.component.d.ts.map +1 -0
  37. package/dist/lib/record-clone-slide-in.component.js +206 -0
  38. package/dist/lib/record-clone-slide-in.component.js.map +1 -0
  39. package/dist/lib/record-clone-types.d.ts +89 -0
  40. package/dist/lib/record-clone-types.d.ts.map +1 -0
  41. package/dist/lib/record-clone-types.js +29 -0
  42. package/dist/lib/record-clone-types.js.map +1 -0
  43. package/dist/lib/record-clone.module.d.ts +16 -0
  44. package/dist/lib/record-clone.module.d.ts.map +1 -0
  45. package/dist/lib/record-clone.module.js +69 -0
  46. package/dist/lib/record-clone.module.js.map +1 -0
  47. package/dist/lib/record-clone.service.d.ts +42 -0
  48. package/dist/lib/record-clone.service.d.ts.map +1 -0
  49. package/dist/lib/record-clone.service.js +123 -0
  50. package/dist/lib/record-clone.service.js.map +1 -0
  51. package/dist/public-api.d.ts +16 -0
  52. package/dist/public-api.d.ts.map +1 -0
  53. package/dist/public-api.js +16 -0
  54. package/dist/public-api.js.map +1 -0
  55. package/package.json +47 -5
@@ -0,0 +1,581 @@
1
+ /**
2
+ * @fileoverview Review and preflight execution component for record cloning.
3
+ *
4
+ * Implements §12.3 & §12.4 of the Record Cloning architectural blueprint. Displays
5
+ * stat badges (Create / Reference / Skip / Warnings), blocked alert banner with reasons,
6
+ * warnings grouped by severity linking to nodes, field-change diffs, and confirmation actions.
7
+ */
8
+ import { Component, ChangeDetectionStrategy, Input, Output, EventEmitter, } from '@angular/core';
9
+ import { CommonModule } from '@angular/common';
10
+ import { MJButtonDirective, MJStatBadgeComponent, } from '@memberjunction/ng-ui-components';
11
+ import * as i0 from "@angular/core";
12
+ const _forTrack0 = ($index, $item) => $item.Code + ($item.NodeKey || "") + $index;
13
+ const _forTrack1 = ($index, $item) => $item.Code + ($item.NodeKey || "");
14
+ const _forTrack2 = ($index, $item) => $item.Node.Key;
15
+ const _forTrack3 = ($index, $item) => $item.Field;
16
+ function CloneReviewComponent_Conditional_3_Template(rf, ctx) { if (rf & 1) {
17
+ i0.ɵɵelement(0, "mj-stat-badge", 3);
18
+ } if (rf & 2) {
19
+ const ctx_r0 = i0.ɵɵnextContext();
20
+ i0.ɵɵproperty("Count", ctx_r0.ReferenceCount);
21
+ } }
22
+ function CloneReviewComponent_Conditional_4_Template(rf, ctx) { if (rf & 1) {
23
+ i0.ɵɵelement(0, "mj-stat-badge", 4);
24
+ } if (rf & 2) {
25
+ const ctx_r0 = i0.ɵɵnextContext();
26
+ i0.ɵɵproperty("Count", ctx_r0.SkipCount);
27
+ } }
28
+ function CloneReviewComponent_Conditional_5_Template(rf, ctx) { if (rf & 1) {
29
+ i0.ɵɵelement(0, "mj-stat-badge", 5);
30
+ } if (rf & 2) {
31
+ const ctx_r0 = i0.ɵɵnextContext();
32
+ i0.ɵɵproperty("Count", ctx_r0.TotalWarningsCount);
33
+ } }
34
+ function CloneReviewComponent_Conditional_6_Template(rf, ctx) { if (rf & 1) {
35
+ i0.ɵɵelement(0, "mj-stat-badge", 6);
36
+ } }
37
+ function CloneReviewComponent_Conditional_7_For_9_Conditional_4_Template(rf, ctx) { if (rf & 1) {
38
+ const _r2 = i0.ɵɵgetCurrentView();
39
+ i0.ɵɵelementStart(0, "button", 18);
40
+ i0.ɵɵlistener("click", function CloneReviewComponent_Conditional_7_For_9_Conditional_4_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r2); const warning_r3 = i0.ɵɵnextContext().$implicit; const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.OnNodeClick(warning_r3.NodeKey)); });
41
+ i0.ɵɵtext(1);
42
+ i0.ɵɵelementEnd();
43
+ } if (rf & 2) {
44
+ const warning_r3 = i0.ɵɵnextContext().$implicit;
45
+ i0.ɵɵadvance();
46
+ i0.ɵɵtextInterpolate1(" [", warning_r3.NodeKey, "] ");
47
+ } }
48
+ function CloneReviewComponent_Conditional_7_For_9_Template(rf, ctx) { if (rf & 1) {
49
+ i0.ɵɵelementStart(0, "li")(1, "strong");
50
+ i0.ɵɵtext(2);
51
+ i0.ɵɵelementEnd();
52
+ i0.ɵɵtext(3);
53
+ i0.ɵɵconditionalCreate(4, CloneReviewComponent_Conditional_7_For_9_Conditional_4_Template, 2, 1, "button", 17);
54
+ i0.ɵɵelementEnd();
55
+ } if (rf & 2) {
56
+ const warning_r3 = ctx.$implicit;
57
+ i0.ɵɵadvance(2);
58
+ i0.ɵɵtextInterpolate1("", warning_r3.Code, ":");
59
+ i0.ɵɵadvance();
60
+ i0.ɵɵtextInterpolate1(" ", warning_r3.Message, " ");
61
+ i0.ɵɵadvance();
62
+ i0.ɵɵconditional(warning_r3.NodeKey ? 4 : -1);
63
+ } }
64
+ function CloneReviewComponent_Conditional_7_Template(rf, ctx) { if (rf & 1) {
65
+ i0.ɵɵelementStart(0, "div", 7)(1, "div", 12);
66
+ i0.ɵɵelement(2, "i", 13);
67
+ i0.ɵɵelementStart(3, "span", 14);
68
+ i0.ɵɵtext(4, "Cloning Cannot Proceed");
69
+ i0.ɵɵelementEnd()();
70
+ i0.ɵɵelementStart(5, "p", 15);
71
+ i0.ɵɵtext(6, " One or more constraints or validation rules prevent this record graph from being cloned: ");
72
+ i0.ɵɵelementEnd();
73
+ i0.ɵɵelementStart(7, "ul", 16);
74
+ i0.ɵɵrepeaterCreate(8, CloneReviewComponent_Conditional_7_For_9_Template, 5, 3, "li", null, _forTrack0);
75
+ i0.ɵɵelementEnd()();
76
+ } if (rf & 2) {
77
+ const ctx_r0 = i0.ɵɵnextContext();
78
+ i0.ɵɵadvance(8);
79
+ i0.ɵɵrepeater(ctx_r0.BlockingErrors);
80
+ } }
81
+ function CloneReviewComponent_Conditional_8_For_6_Conditional_5_Template(rf, ctx) { if (rf & 1) {
82
+ const _r4 = i0.ɵɵgetCurrentView();
83
+ i0.ɵɵelementStart(0, "button", 18);
84
+ i0.ɵɵlistener("click", function CloneReviewComponent_Conditional_8_For_6_Conditional_5_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r4); const warn_r5 = i0.ɵɵnextContext().$implicit; const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.OnNodeClick(warn_r5.NodeKey)); });
85
+ i0.ɵɵtext(1);
86
+ i0.ɵɵelementEnd();
87
+ } if (rf & 2) {
88
+ const warn_r5 = i0.ɵɵnextContext().$implicit;
89
+ i0.ɵɵadvance();
90
+ i0.ɵɵtextInterpolate1(" [", warn_r5.NodeKey, "] ");
91
+ } }
92
+ function CloneReviewComponent_Conditional_8_For_6_Template(rf, ctx) { if (rf & 1) {
93
+ i0.ɵɵelementStart(0, "div", 23)(1, "span", 24);
94
+ i0.ɵɵtext(2);
95
+ i0.ɵɵelementEnd();
96
+ i0.ɵɵelementStart(3, "span", 25);
97
+ i0.ɵɵtext(4);
98
+ i0.ɵɵelementEnd();
99
+ i0.ɵɵconditionalCreate(5, CloneReviewComponent_Conditional_8_For_6_Conditional_5_Template, 2, 1, "button", 17);
100
+ i0.ɵɵelementEnd();
101
+ } if (rf & 2) {
102
+ const warn_r5 = ctx.$implicit;
103
+ i0.ɵɵclassProp("warning-amber", warn_r5.Severity === "Warning");
104
+ i0.ɵɵadvance(2);
105
+ i0.ɵɵtextInterpolate(warn_r5.Severity);
106
+ i0.ɵɵadvance(2);
107
+ i0.ɵɵtextInterpolate(warn_r5.Message);
108
+ i0.ɵɵadvance();
109
+ i0.ɵɵconditional(warn_r5.NodeKey ? 5 : -1);
110
+ } }
111
+ function CloneReviewComponent_Conditional_8_Template(rf, ctx) { if (rf & 1) {
112
+ i0.ɵɵelementStart(0, "div", 8)(1, "h4", 19);
113
+ i0.ɵɵelement(2, "i", 20);
114
+ i0.ɵɵtext(3);
115
+ i0.ɵɵelementEnd();
116
+ i0.ɵɵelementStart(4, "div", 21);
117
+ i0.ɵɵrepeaterCreate(5, CloneReviewComponent_Conditional_8_For_6_Template, 6, 5, "div", 22, _forTrack1);
118
+ i0.ɵɵelementEnd()();
119
+ } if (rf & 2) {
120
+ const ctx_r0 = i0.ɵɵnextContext();
121
+ i0.ɵɵadvance(3);
122
+ i0.ɵɵtextInterpolate1(" Warnings & Considerations (", ctx_r0.NonBlockingWarnings.length, ") ");
123
+ i0.ɵɵadvance(2);
124
+ i0.ɵɵrepeater(ctx_r0.NonBlockingWarnings);
125
+ } }
126
+ function CloneReviewComponent_Conditional_9_For_8_For_10_Template(rf, ctx) { if (rf & 1) {
127
+ i0.ɵɵelementStart(0, "div", 34)(1, "span", 35);
128
+ i0.ɵɵtext(2);
129
+ i0.ɵɵelementEnd();
130
+ i0.ɵɵelementStart(3, "span", 36);
131
+ i0.ɵɵtext(4);
132
+ i0.ɵɵelementEnd();
133
+ i0.ɵɵelementStart(5, "div", 37)(6, "span", 38);
134
+ i0.ɵɵtext(7);
135
+ i0.ɵɵelementEnd();
136
+ i0.ɵɵelement(8, "i", 39);
137
+ i0.ɵɵelementStart(9, "span", 40);
138
+ i0.ɵɵtext(10);
139
+ i0.ɵɵelementEnd()()();
140
+ } if (rf & 2) {
141
+ const change_r8 = ctx.$implicit;
142
+ const ctx_r0 = i0.ɵɵnextContext(3);
143
+ i0.ɵɵadvance(2);
144
+ i0.ɵɵtextInterpolate(change_r8.Field);
145
+ i0.ɵɵadvance();
146
+ i0.ɵɵproperty("title", change_r8.Kind);
147
+ i0.ɵɵadvance();
148
+ i0.ɵɵtextInterpolate1(" ", ctx_r0.FormatChangeKind(change_r8.Kind), " ");
149
+ i0.ɵɵadvance(2);
150
+ i0.ɵɵproperty("title", "Previous: " + change_r8.OldValue);
151
+ i0.ɵɵadvance();
152
+ i0.ɵɵtextInterpolate1(" ", ctx_r0.FormatDiffValue(change_r8.OldValue), " ");
153
+ i0.ɵɵadvance(2);
154
+ i0.ɵɵproperty("title", "New: " + change_r8.NewValue);
155
+ i0.ɵɵadvance();
156
+ i0.ɵɵtextInterpolate1(" ", ctx_r0.FormatDiffValue(change_r8.NewValue), " ");
157
+ } }
158
+ function CloneReviewComponent_Conditional_9_For_8_Template(rf, ctx) { if (rf & 1) {
159
+ const _r6 = i0.ɵɵgetCurrentView();
160
+ i0.ɵɵelementStart(0, "div", 29)(1, "div", 30)(2, "span", 31);
161
+ i0.ɵɵtext(3);
162
+ i0.ɵɵelementEnd();
163
+ i0.ɵɵelementStart(4, "span", 32);
164
+ i0.ɵɵtext(5);
165
+ i0.ɵɵelementEnd();
166
+ i0.ɵɵelementStart(6, "button", 18);
167
+ i0.ɵɵlistener("click", function CloneReviewComponent_Conditional_9_For_8_Template_button_click_6_listener() { const summary_r7 = i0.ɵɵrestoreView(_r6).$implicit; const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.OnNodeClick(summary_r7.Node.Key)); });
168
+ i0.ɵɵtext(7);
169
+ i0.ɵɵelementEnd()();
170
+ i0.ɵɵelementStart(8, "div", 33);
171
+ i0.ɵɵrepeaterCreate(9, CloneReviewComponent_Conditional_9_For_8_For_10_Template, 11, 7, "div", 34, _forTrack3);
172
+ i0.ɵɵelementEnd()();
173
+ } if (rf & 2) {
174
+ const summary_r7 = ctx.$implicit;
175
+ i0.ɵɵadvance(3);
176
+ i0.ɵɵtextInterpolate(summary_r7.Node.EntityName);
177
+ i0.ɵɵadvance(2);
178
+ i0.ɵɵtextInterpolate(summary_r7.Node.DisplayName);
179
+ i0.ɵɵadvance(2);
180
+ i0.ɵɵtextInterpolate1(" [", summary_r7.Node.Key, "] ");
181
+ i0.ɵɵadvance(2);
182
+ i0.ɵɵrepeater(summary_r7.Changes);
183
+ } }
184
+ function CloneReviewComponent_Conditional_9_Template(rf, ctx) { if (rf & 1) {
185
+ i0.ɵɵelementStart(0, "div", 8)(1, "h4", 19);
186
+ i0.ɵɵelement(2, "i", 26);
187
+ i0.ɵɵtext(3);
188
+ i0.ɵɵelementEnd();
189
+ i0.ɵɵelementStart(4, "p", 27);
190
+ i0.ɵɵtext(5, " Values the clone sets instead of copying (configured rules, names, remapped references and your entries): ");
191
+ i0.ɵɵelementEnd();
192
+ i0.ɵɵelementStart(6, "div", 28);
193
+ i0.ɵɵrepeaterCreate(7, CloneReviewComponent_Conditional_9_For_8_Template, 11, 3, "div", 29, _forTrack2);
194
+ i0.ɵɵelementEnd()();
195
+ } if (rf & 2) {
196
+ const ctx_r0 = i0.ɵɵnextContext();
197
+ i0.ɵɵadvance(3);
198
+ i0.ɵɵtextInterpolate1(" Field Value Modifications (", ctx_r0.TotalFieldChangesCount, ") ");
199
+ i0.ɵɵadvance(4);
200
+ i0.ɵɵrepeater(ctx_r0.NodesWithFieldChanges);
201
+ } }
202
+ function CloneReviewComponent_Conditional_12_Template(rf, ctx) { if (rf & 1) {
203
+ i0.ɵɵelement(0, "i", 41);
204
+ i0.ɵɵtext(1, " Cloning... ");
205
+ } }
206
+ function CloneReviewComponent_Conditional_13_Template(rf, ctx) { if (rf & 1) {
207
+ i0.ɵɵelement(0, "i", 41);
208
+ i0.ɵɵtext(1, " Updating plan... ");
209
+ } }
210
+ function CloneReviewComponent_Conditional_14_Template(rf, ctx) { if (rf & 1) {
211
+ i0.ɵɵelement(0, "i", 42);
212
+ i0.ɵɵtext(1);
213
+ } if (rf & 2) {
214
+ const ctx_r0 = i0.ɵɵnextContext();
215
+ i0.ɵɵadvance();
216
+ i0.ɵɵtextInterpolate1(" Execute Clone (", ctx_r0.CreateCount, " Records) ");
217
+ } }
218
+ export class CloneReviewComponent {
219
+ /** The plan to review: counts, warnings, blocked reasons and per-node field changes. */
220
+ Plan = null;
221
+ /** Name the root clone will get. */
222
+ RootName = '';
223
+ /** Reason the user entered, shown for confirmation. */
224
+ Reason = '';
225
+ /** Disables Confirm while the clone runs. */
226
+ IsExecuting = false;
227
+ /** Disables Confirm while the plan is being recomputed, so the user never confirms a plan they haven't seen. */
228
+ IsPlanning = false;
229
+ /** The user confirmed; the host executes the plan. */
230
+ Confirm = new EventEmitter();
231
+ /** The user backed out of the clone. */
232
+ Cancel = new EventEmitter();
233
+ /** Fires with a node key when the user clicks a warning or node to inspect it. */
234
+ NodeClicked = new EventEmitter();
235
+ get IsBlocked() {
236
+ return !!this.Plan?.Blocked || this.BlockingErrors.length > 0;
237
+ }
238
+ get CreateCount() {
239
+ return this.Plan?.Counts?.Create ?? 0;
240
+ }
241
+ get ReferenceCount() {
242
+ if (!this.Plan?.Nodes)
243
+ return 0;
244
+ return this.Plan.Nodes.filter(n => n.Action === 'Reference').length;
245
+ }
246
+ get SkipCount() {
247
+ if (!this.Plan?.Nodes)
248
+ return 0;
249
+ return this.Plan.Nodes.filter(n => n.Action === 'Skip').length;
250
+ }
251
+ get AllWarnings() {
252
+ const list = [];
253
+ if (this.Plan?.Warnings) {
254
+ list.push(...this.Plan.Warnings);
255
+ }
256
+ if (this.Plan?.Nodes) {
257
+ for (const node of this.Plan.Nodes) {
258
+ if (node.Warnings) {
259
+ for (const w of node.Warnings) {
260
+ list.push({ ...w, NodeKey: w.NodeKey || node.Key });
261
+ }
262
+ }
263
+ }
264
+ }
265
+ return list;
266
+ }
267
+ get BlockingErrors() {
268
+ return this.AllWarnings.filter(w => w.Severity === 'Error');
269
+ }
270
+ get NonBlockingWarnings() {
271
+ return this.AllWarnings.filter(w => w.Severity !== 'Error');
272
+ }
273
+ get TotalWarningsCount() {
274
+ return this.AllWarnings.length;
275
+ }
276
+ /**
277
+ * The field changes a reviewer needs: every rule the clone applies (reset, ownership, rename,
278
+ * remap, derived rule, override, prompt), configured exclusions and FLS denials. Plain copies,
279
+ * columns that can't be written, and the automatic key and __mj_ timestamp exclusions are left out:
280
+ * they are the same for every clone and would bury the rest.
281
+ */
282
+ get NodesWithFieldChanges() {
283
+ if (!this.Plan?.Nodes)
284
+ return [];
285
+ const summaries = [];
286
+ for (const node of this.Plan.Nodes) {
287
+ const changes = (node.FieldChanges ?? []).filter((c) => CloneReviewComponent.isReviewable(c));
288
+ if (changes.length > 0) {
289
+ summaries.push({ Node: node, Changes: changes });
290
+ }
291
+ }
292
+ return summaries;
293
+ }
294
+ static isReviewable(change) {
295
+ if (change.Kind === 'Copy' || change.Kind === 'NotWritable')
296
+ return false;
297
+ if (change.Kind === 'Excluded') {
298
+ // The engine always excludes the primary key and the __mj_ audit columns.
299
+ return !change.Field.startsWith('__mj_') && !change.Reason.startsWith('Primary key');
300
+ }
301
+ return true;
302
+ }
303
+ get TotalFieldChangesCount() {
304
+ return this.NodesWithFieldChanges.reduce((sum, s) => sum + s.Changes.length, 0);
305
+ }
306
+ FormatChangeKind(kind) {
307
+ return kind.replace(/_/g, ' ');
308
+ }
309
+ FormatDiffValue(val) {
310
+ if (val === null || val === undefined)
311
+ return '(null)';
312
+ if (typeof val === 'string')
313
+ return `"${val}"`;
314
+ return String(val);
315
+ }
316
+ OnNodeClick(nodeKey) {
317
+ this.NodeClicked.emit(nodeKey);
318
+ }
319
+ OnConfirm() {
320
+ if (!this.IsBlocked && !this.IsExecuting && !this.IsPlanning) {
321
+ this.Confirm.emit();
322
+ }
323
+ }
324
+ OnCancel() {
325
+ if (!this.IsExecuting) {
326
+ this.Cancel.emit();
327
+ }
328
+ }
329
+ static ɵfac = function CloneReviewComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || CloneReviewComponent)(); };
330
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: CloneReviewComponent, selectors: [["mj-clone-review"]], inputs: { Plan: "Plan", RootName: "RootName", Reason: "Reason", IsExecuting: "IsExecuting", IsPlanning: "IsPlanning" }, outputs: { Confirm: "Confirm", Cancel: "Cancel", NodeClicked: "NodeClicked" }, decls: 17, vars: 11, consts: [[1, "clone-review-container"], [1, "stat-badges-row"], ["Label", "to create", "Variant", "success", "Icon", "fa-solid fa-plus", 3, "Count"], ["Label", "referenced", "Variant", "info", "Icon", "fa-solid fa-link", 3, "Count"], ["Label", "skipped", "Variant", "default", "Icon", "fa-solid fa-forward", 3, "Count"], ["Label", "warnings", "Variant", "warning", "Icon", "fa-solid fa-triangle-exclamation", 3, "Count"], ["Label", "BLOCKED", "Variant", "error", "Icon", "fa-solid fa-ban"], ["role", "alert", 1, "blocked-banner"], [1, "review-section"], [1, "actions-bar"], ["type", "button", "mjButton", "", "variant", "primary", 3, "click", "disabled"], ["type", "button", "mjButton", "", "variant", "outline", 3, "click", "disabled"], [1, "blocked-banner-header"], [1, "fa-solid", "fa-circle-exclamation", "blocked-icon"], [1, "blocked-title"], [1, "blocked-description"], [1, "blocked-reasons-list"], ["type", "button", 1, "node-link-btn"], ["type", "button", 1, "node-link-btn", 3, "click"], [1, "section-title"], [1, "fa-solid", "fa-triangle-exclamation", "warning-icon"], [1, "warnings-list"], [1, "warning-item", 3, "warning-amber"], [1, "warning-item"], [1, "warning-badge"], [1, "warning-message"], [1, "fa-solid", "fa-code-compare", "diff-icon"], [1, "section-description"], [1, "diff-nodes-list"], [1, "diff-node-card"], [1, "diff-node-header"], [1, "diff-entity-badge"], [1, "diff-node-title"], [1, "diff-table"], [1, "diff-row"], [1, "diff-field-name"], [1, "diff-kind-chip", 3, "title"], [1, "diff-values"], [1, "diff-old-val", 3, "title"], [1, "fa-solid", "fa-arrow-right", "diff-arrow"], [1, "diff-new-val", 3, "title"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "fa-solid", "fa-clone"]], template: function CloneReviewComponent_Template(rf, ctx) { if (rf & 1) {
331
+ i0.ɵɵelementStart(0, "div", 0)(1, "div", 1);
332
+ i0.ɵɵelement(2, "mj-stat-badge", 2);
333
+ i0.ɵɵconditionalCreate(3, CloneReviewComponent_Conditional_3_Template, 1, 1, "mj-stat-badge", 3);
334
+ i0.ɵɵconditionalCreate(4, CloneReviewComponent_Conditional_4_Template, 1, 1, "mj-stat-badge", 4);
335
+ i0.ɵɵconditionalCreate(5, CloneReviewComponent_Conditional_5_Template, 1, 1, "mj-stat-badge", 5);
336
+ i0.ɵɵconditionalCreate(6, CloneReviewComponent_Conditional_6_Template, 1, 0, "mj-stat-badge", 6);
337
+ i0.ɵɵelementEnd();
338
+ i0.ɵɵconditionalCreate(7, CloneReviewComponent_Conditional_7_Template, 10, 0, "div", 7);
339
+ i0.ɵɵconditionalCreate(8, CloneReviewComponent_Conditional_8_Template, 7, 1, "div", 8);
340
+ i0.ɵɵconditionalCreate(9, CloneReviewComponent_Conditional_9_Template, 9, 1, "div", 8);
341
+ i0.ɵɵelementStart(10, "div", 9)(11, "button", 10);
342
+ i0.ɵɵlistener("click", function CloneReviewComponent_Template_button_click_11_listener() { return ctx.OnConfirm(); });
343
+ i0.ɵɵconditionalCreate(12, CloneReviewComponent_Conditional_12_Template, 2, 0)(13, CloneReviewComponent_Conditional_13_Template, 2, 0)(14, CloneReviewComponent_Conditional_14_Template, 2, 1);
344
+ i0.ɵɵelementEnd();
345
+ i0.ɵɵelementStart(15, "button", 11);
346
+ i0.ɵɵlistener("click", function CloneReviewComponent_Template_button_click_15_listener() { return ctx.OnCancel(); });
347
+ i0.ɵɵtext(16, " Cancel ");
348
+ i0.ɵɵelementEnd()()();
349
+ } if (rf & 2) {
350
+ i0.ɵɵadvance(2);
351
+ i0.ɵɵproperty("Count", ctx.CreateCount);
352
+ i0.ɵɵadvance();
353
+ i0.ɵɵconditional(ctx.ReferenceCount > 0 ? 3 : -1);
354
+ i0.ɵɵadvance();
355
+ i0.ɵɵconditional(ctx.SkipCount > 0 ? 4 : -1);
356
+ i0.ɵɵadvance();
357
+ i0.ɵɵconditional(ctx.TotalWarningsCount > 0 ? 5 : -1);
358
+ i0.ɵɵadvance();
359
+ i0.ɵɵconditional(ctx.IsBlocked ? 6 : -1);
360
+ i0.ɵɵadvance();
361
+ i0.ɵɵconditional(ctx.IsBlocked ? 7 : -1);
362
+ i0.ɵɵadvance();
363
+ i0.ɵɵconditional(ctx.NonBlockingWarnings.length > 0 ? 8 : -1);
364
+ i0.ɵɵadvance();
365
+ i0.ɵɵconditional(ctx.NodesWithFieldChanges.length > 0 ? 9 : -1);
366
+ i0.ɵɵadvance(2);
367
+ i0.ɵɵproperty("disabled", ctx.IsBlocked || ctx.IsExecuting || ctx.IsPlanning);
368
+ i0.ɵɵadvance();
369
+ i0.ɵɵconditional(ctx.IsExecuting ? 12 : ctx.IsPlanning ? 13 : 14);
370
+ i0.ɵɵadvance(3);
371
+ i0.ɵɵproperty("disabled", ctx.IsExecuting);
372
+ } }, dependencies: [CommonModule,
373
+ MJButtonDirective,
374
+ MJStatBadgeComponent], styles: [".clone-review-container[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: var(--mj-space-4);\n padding: var(--mj-space-1) 0;\n }\n\n .stat-badges-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: var(--mj-space-2);\n padding: var(--mj-space-1) 0;\n }\n\n .blocked-banner[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: var(--mj-space-1-5);\n padding: var(--mj-space-3) var(--mj-space-4);\n background: var(--mj-status-error-bg);\n border: 1px solid var(--mj-status-error-border);\n border-radius: var(--mj-radius-md);\n color: var(--mj-status-error-text);\n }\n\n .blocked-banner-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: var(--mj-space-1-5);\n }\n\n .blocked-icon[_ngcontent-%COMP%] {\n font-size: var(--mj-text-base);\n color: var(--mj-status-error-text);\n }\n\n .blocked-title[_ngcontent-%COMP%] {\n font-size: var(--mj-text-sm);\n font-weight: 700;\n }\n\n .blocked-description[_ngcontent-%COMP%] {\n margin: 0;\n font-size: var(--mj-text-xs);\n }\n\n .blocked-reasons-list[_ngcontent-%COMP%] {\n margin: 0;\n padding-left: 20px;\n font-size: var(--mj-text-xs);\n display: flex;\n flex-direction: column;\n gap: 4px;\n }\n\n .review-section[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: var(--mj-space-1-5);\n }\n\n .section-title[_ngcontent-%COMP%] {\n margin: 0;\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: var(--mj-text-sm);\n font-weight: 600;\n color: var(--mj-text-primary);\n }\n\n .section-description[_ngcontent-%COMP%] {\n margin: 0;\n font-size: var(--mj-text-xs);\n color: var(--mj-text-secondary);\n }\n\n .warning-icon[_ngcontent-%COMP%] {\n color: var(--mj-status-warning-text);\n }\n\n .diff-icon[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n }\n\n .warnings-list[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: var(--mj-space-1-5);\n }\n\n .warning-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: var(--mj-space-2);\n padding: 6px 10px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-sm);\n font-size: var(--mj-text-xs);\n }\n\n .warning-badge[_ngcontent-%COMP%] {\n font-size: 10px;\n font-weight: 700;\n text-transform: uppercase;\n padding: 1px 6px;\n border-radius: 8px;\n background: var(--mj-status-warning-bg);\n color: var(--mj-status-warning-text);\n }\n\n .warning-message[_ngcontent-%COMP%] {\n flex: 1;\n color: var(--mj-text-primary);\n }\n\n .node-link-btn[_ngcontent-%COMP%] {\n background: none;\n border: none;\n color: var(--mj-brand-primary);\n cursor: pointer;\n padding: 0 4px;\n font-size: 11px;\n text-decoration: underline;\n }\n\n .node-link-btn[_ngcontent-%COMP%]:hover {\n color: var(--mj-brand-primary-hover);\n }\n\n .diff-nodes-list[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: var(--mj-space-2);\n }\n\n .diff-node-card[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-sm);\n overflow: hidden;\n }\n\n .diff-node-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: var(--mj-space-1-5);\n padding: 6px 10px;\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .diff-entity-badge[_ngcontent-%COMP%] {\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n background: var(--mj-bg-surface-sunken);\n padding: 1px 5px;\n border-radius: 3px;\n }\n\n .diff-node-title[_ngcontent-%COMP%] {\n font-size: var(--mj-text-xs);\n font-weight: 500;\n color: var(--mj-text-primary);\n flex: 1;\n }\n\n .diff-table[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n }\n\n .diff-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: var(--mj-space-3);\n padding: 6px 10px;\n border-bottom: 1px solid var(--mj-border-default);\n font-size: var(--mj-text-xs);\n }\n\n .diff-row[_ngcontent-%COMP%]:last-child {\n border-bottom: none;\n }\n\n .diff-field-name[_ngcontent-%COMP%] {\n font-weight: 600;\n color: var(--mj-text-primary);\n min-width: 120px;\n }\n\n .diff-kind-chip[_ngcontent-%COMP%] {\n font-size: 10px;\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-secondary);\n padding: 1px 6px;\n border-radius: 10px;\n text-transform: capitalize;\n }\n\n .diff-values[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n flex: 1;\n overflow: hidden;\n }\n\n .diff-old-val[_ngcontent-%COMP%] {\n color: var(--mj-status-error-text);\n text-decoration: line-through;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n max-width: 140px;\n }\n\n .diff-arrow[_ngcontent-%COMP%] {\n font-size: 10px;\n color: var(--mj-text-muted);\n }\n\n .diff-new-val[_ngcontent-%COMP%] {\n color: var(--mj-status-success-text);\n font-weight: 600;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n max-width: 200px;\n }\n\n .actions-bar[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: var(--mj-space-2);\n padding-top: var(--mj-space-3);\n border-top: 1px solid var(--mj-border-default);\n margin-top: var(--mj-space-1);\n }"], changeDetection: 0 });
375
+ }
376
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(CloneReviewComponent, [{
377
+ type: Component,
378
+ args: [{ standalone: true, selector: 'mj-clone-review', template: `
379
+ <div class="clone-review-container">
380
+ <!-- Stat Badges Row -->
381
+ <div class="stat-badges-row">
382
+ <mj-stat-badge
383
+ [Count]="CreateCount"
384
+ Label="to create"
385
+ Variant="success"
386
+ Icon="fa-solid fa-plus">
387
+ </mj-stat-badge>
388
+
389
+ @if (ReferenceCount > 0) {
390
+ <mj-stat-badge
391
+ [Count]="ReferenceCount"
392
+ Label="referenced"
393
+ Variant="info"
394
+ Icon="fa-solid fa-link">
395
+ </mj-stat-badge>
396
+ }
397
+
398
+ @if (SkipCount > 0) {
399
+ <mj-stat-badge
400
+ [Count]="SkipCount"
401
+ Label="skipped"
402
+ Variant="default"
403
+ Icon="fa-solid fa-forward">
404
+ </mj-stat-badge>
405
+ }
406
+
407
+ @if (TotalWarningsCount > 0) {
408
+ <mj-stat-badge
409
+ [Count]="TotalWarningsCount"
410
+ Label="warnings"
411
+ Variant="warning"
412
+ Icon="fa-solid fa-triangle-exclamation">
413
+ </mj-stat-badge>
414
+ }
415
+
416
+ @if (IsBlocked) {
417
+ <mj-stat-badge
418
+ Label="BLOCKED"
419
+ Variant="error"
420
+ Icon="fa-solid fa-ban">
421
+ </mj-stat-badge>
422
+ }
423
+ </div>
424
+
425
+ <!-- Blocked Banner -->
426
+ @if (IsBlocked) {
427
+ <div class="blocked-banner" role="alert">
428
+ <div class="blocked-banner-header">
429
+ <i class="fa-solid fa-circle-exclamation blocked-icon"></i>
430
+ <span class="blocked-title">Cloning Cannot Proceed</span>
431
+ </div>
432
+ <p class="blocked-description">
433
+ One or more constraints or validation rules prevent this record graph from being cloned:
434
+ </p>
435
+ <ul class="blocked-reasons-list">
436
+ @for (warning of BlockingErrors; track warning.Code + (warning.NodeKey || '') + $index) {
437
+ <li>
438
+ <strong>{{warning.Code}}:</strong> {{warning.Message}}
439
+ @if (warning.NodeKey) {
440
+ <button
441
+ type="button"
442
+ class="node-link-btn"
443
+ (click)="OnNodeClick(warning.NodeKey)">
444
+ [{{warning.NodeKey}}]
445
+ </button>
446
+ }
447
+ </li>
448
+ }
449
+ </ul>
450
+ </div>
451
+ }
452
+
453
+ <!-- Warnings Breakdown -->
454
+ @if (NonBlockingWarnings.length > 0) {
455
+ <div class="review-section">
456
+ <h4 class="section-title">
457
+ <i class="fa-solid fa-triangle-exclamation warning-icon"></i>
458
+ Warnings & Considerations ({{NonBlockingWarnings.length}})
459
+ </h4>
460
+ <div class="warnings-list">
461
+ @for (warn of NonBlockingWarnings; track warn.Code + (warn.NodeKey || '')) {
462
+ <div class="warning-item" [class.warning-amber]="warn.Severity === 'Warning'">
463
+ <span class="warning-badge">{{warn.Severity}}</span>
464
+ <span class="warning-message">{{warn.Message}}</span>
465
+ @if (warn.NodeKey) {
466
+ <button
467
+ type="button"
468
+ class="node-link-btn"
469
+ (click)="OnNodeClick(warn.NodeKey)">
470
+ [{{warn.NodeKey}}]
471
+ </button>
472
+ }
473
+ </div>
474
+ }
475
+ </div>
476
+ </div>
477
+ }
478
+
479
+ <!-- Field Changes Diff Section -->
480
+ @if (NodesWithFieldChanges.length > 0) {
481
+ <div class="review-section">
482
+ <h4 class="section-title">
483
+ <i class="fa-solid fa-code-compare diff-icon"></i>
484
+ Field Value Modifications ({{TotalFieldChangesCount}})
485
+ </h4>
486
+ <p class="section-description">
487
+ Values the clone sets instead of copying (configured rules, names, remapped references and your entries):
488
+ </p>
489
+
490
+ <div class="diff-nodes-list">
491
+ @for (summary of NodesWithFieldChanges; track summary.Node.Key) {
492
+ <div class="diff-node-card">
493
+ <div class="diff-node-header">
494
+ <span class="diff-entity-badge">{{summary.Node.EntityName}}</span>
495
+ <span class="diff-node-title">{{summary.Node.DisplayName}}</span>
496
+ <button
497
+ type="button"
498
+ class="node-link-btn"
499
+ (click)="OnNodeClick(summary.Node.Key)">
500
+ [{{summary.Node.Key}}]
501
+ </button>
502
+ </div>
503
+ <div class="diff-table">
504
+ @for (change of summary.Changes; track change.Field) {
505
+ <div class="diff-row">
506
+ <span class="diff-field-name">{{change.Field}}</span>
507
+ <span class="diff-kind-chip" [title]="change.Kind">
508
+ {{FormatChangeKind(change.Kind)}}
509
+ </span>
510
+ <div class="diff-values">
511
+ <span class="diff-old-val" [title]="'Previous: ' + change.OldValue">
512
+ {{FormatDiffValue(change.OldValue)}}
513
+ </span>
514
+ <i class="fa-solid fa-arrow-right diff-arrow"></i>
515
+ <span class="diff-new-val" [title]="'New: ' + change.NewValue">
516
+ {{FormatDiffValue(change.NewValue)}}
517
+ </span>
518
+ </div>
519
+ </div>
520
+ }
521
+ </div>
522
+ </div>
523
+ }
524
+ </div>
525
+ </div>
526
+ }
527
+
528
+ <!-- Execution Actions Bar -->
529
+ <div class="actions-bar">
530
+ <button
531
+ type="button"
532
+ mjButton
533
+ variant="primary"
534
+ [disabled]="IsBlocked || IsExecuting || IsPlanning"
535
+ (click)="OnConfirm()">
536
+ @if (IsExecuting) {
537
+ <i class="fa-solid fa-spinner fa-spin"></i>
538
+ Cloning...
539
+ } @else if (IsPlanning) {
540
+ <i class="fa-solid fa-spinner fa-spin"></i>
541
+ Updating plan...
542
+ } @else {
543
+ <i class="fa-solid fa-clone"></i>
544
+ Execute Clone ({{CreateCount}} Records)
545
+ }
546
+ </button>
547
+
548
+ <button
549
+ type="button"
550
+ mjButton
551
+ variant="outline"
552
+ [disabled]="IsExecuting"
553
+ (click)="OnCancel()">
554
+ Cancel
555
+ </button>
556
+ </div>
557
+ </div>
558
+ `, imports: [
559
+ CommonModule,
560
+ MJButtonDirective,
561
+ MJStatBadgeComponent,
562
+ ], changeDetection: ChangeDetectionStrategy.OnPush, styles: ["\n .clone-review-container {\n display: flex;\n flex-direction: column;\n gap: var(--mj-space-4);\n padding: var(--mj-space-1) 0;\n }\n\n .stat-badges-row {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: var(--mj-space-2);\n padding: var(--mj-space-1) 0;\n }\n\n .blocked-banner {\n display: flex;\n flex-direction: column;\n gap: var(--mj-space-1-5);\n padding: var(--mj-space-3) var(--mj-space-4);\n background: var(--mj-status-error-bg);\n border: 1px solid var(--mj-status-error-border);\n border-radius: var(--mj-radius-md);\n color: var(--mj-status-error-text);\n }\n\n .blocked-banner-header {\n display: flex;\n align-items: center;\n gap: var(--mj-space-1-5);\n }\n\n .blocked-icon {\n font-size: var(--mj-text-base);\n color: var(--mj-status-error-text);\n }\n\n .blocked-title {\n font-size: var(--mj-text-sm);\n font-weight: 700;\n }\n\n .blocked-description {\n margin: 0;\n font-size: var(--mj-text-xs);\n }\n\n .blocked-reasons-list {\n margin: 0;\n padding-left: 20px;\n font-size: var(--mj-text-xs);\n display: flex;\n flex-direction: column;\n gap: 4px;\n }\n\n .review-section {\n display: flex;\n flex-direction: column;\n gap: var(--mj-space-1-5);\n }\n\n .section-title {\n margin: 0;\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: var(--mj-text-sm);\n font-weight: 600;\n color: var(--mj-text-primary);\n }\n\n .section-description {\n margin: 0;\n font-size: var(--mj-text-xs);\n color: var(--mj-text-secondary);\n }\n\n .warning-icon {\n color: var(--mj-status-warning-text);\n }\n\n .diff-icon {\n color: var(--mj-brand-primary);\n }\n\n .warnings-list {\n display: flex;\n flex-direction: column;\n gap: var(--mj-space-1-5);\n }\n\n .warning-item {\n display: flex;\n align-items: center;\n gap: var(--mj-space-2);\n padding: 6px 10px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-sm);\n font-size: var(--mj-text-xs);\n }\n\n .warning-badge {\n font-size: 10px;\n font-weight: 700;\n text-transform: uppercase;\n padding: 1px 6px;\n border-radius: 8px;\n background: var(--mj-status-warning-bg);\n color: var(--mj-status-warning-text);\n }\n\n .warning-message {\n flex: 1;\n color: var(--mj-text-primary);\n }\n\n .node-link-btn {\n background: none;\n border: none;\n color: var(--mj-brand-primary);\n cursor: pointer;\n padding: 0 4px;\n font-size: 11px;\n text-decoration: underline;\n }\n\n .node-link-btn:hover {\n color: var(--mj-brand-primary-hover);\n }\n\n .diff-nodes-list {\n display: flex;\n flex-direction: column;\n gap: var(--mj-space-2);\n }\n\n .diff-node-card {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-sm);\n overflow: hidden;\n }\n\n .diff-node-header {\n display: flex;\n align-items: center;\n gap: var(--mj-space-1-5);\n padding: 6px 10px;\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .diff-entity-badge {\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n background: var(--mj-bg-surface-sunken);\n padding: 1px 5px;\n border-radius: 3px;\n }\n\n .diff-node-title {\n font-size: var(--mj-text-xs);\n font-weight: 500;\n color: var(--mj-text-primary);\n flex: 1;\n }\n\n .diff-table {\n display: flex;\n flex-direction: column;\n }\n\n .diff-row {\n display: flex;\n align-items: center;\n gap: var(--mj-space-3);\n padding: 6px 10px;\n border-bottom: 1px solid var(--mj-border-default);\n font-size: var(--mj-text-xs);\n }\n\n .diff-row:last-child {\n border-bottom: none;\n }\n\n .diff-field-name {\n font-weight: 600;\n color: var(--mj-text-primary);\n min-width: 120px;\n }\n\n .diff-kind-chip {\n font-size: 10px;\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-secondary);\n padding: 1px 6px;\n border-radius: 10px;\n text-transform: capitalize;\n }\n\n .diff-values {\n display: flex;\n align-items: center;\n gap: 6px;\n flex: 1;\n overflow: hidden;\n }\n\n .diff-old-val {\n color: var(--mj-status-error-text);\n text-decoration: line-through;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n max-width: 140px;\n }\n\n .diff-arrow {\n font-size: 10px;\n color: var(--mj-text-muted);\n }\n\n .diff-new-val {\n color: var(--mj-status-success-text);\n font-weight: 600;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n max-width: 200px;\n }\n\n .actions-bar {\n display: flex;\n align-items: center;\n gap: var(--mj-space-2);\n padding-top: var(--mj-space-3);\n border-top: 1px solid var(--mj-border-default);\n margin-top: var(--mj-space-1);\n }\n "] }]
563
+ }], null, { Plan: [{
564
+ type: Input
565
+ }], RootName: [{
566
+ type: Input
567
+ }], Reason: [{
568
+ type: Input
569
+ }], IsExecuting: [{
570
+ type: Input
571
+ }], IsPlanning: [{
572
+ type: Input
573
+ }], Confirm: [{
574
+ type: Output
575
+ }], Cancel: [{
576
+ type: Output
577
+ }], NodeClicked: [{
578
+ type: Output
579
+ }] }); })();
580
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(CloneReviewComponent, { className: "CloneReviewComponent", filePath: "src/lib/clone-review.component.ts", lineNumber: 468 }); })();
581
+ //# sourceMappingURL=clone-review.component.js.map