@memberjunction/ng-list-management 5.42.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/components/list-delta-confirm/list-delta-confirm.component.js +32 -36
- package/dist/lib/components/list-delta-confirm/list-delta-confirm.component.js.map +1 -1
- package/dist/lib/components/list-management-dialog/list-management-dialog.component.js +73 -94
- package/dist/lib/components/list-management-dialog/list-management-dialog.component.js.map +1 -1
- package/dist/lib/components/list-share-dialog/list-share-dialog.component.d.ts +5 -0
- package/dist/lib/components/list-share-dialog/list-share-dialog.component.d.ts.map +1 -1
- package/dist/lib/components/list-share-dialog/list-share-dialog.component.js +20 -22
- package/dist/lib/components/list-share-dialog/list-share-dialog.component.js.map +1 -1
- package/dist/lib/components/save-view-as-list-dialog/save-view-as-list-dialog.component.js +72 -74
- package/dist/lib/components/save-view-as-list-dialog/save-view-as-list-dialog.component.js.map +1 -1
- package/dist/lib/module.d.ts +1 -1
- package/dist/lib/module.d.ts.map +1 -1
- package/dist/lib/module.js +7 -1
- package/dist/lib/module.js.map +1 -1
- package/package.json +12 -11
- package/dist/__tests__/index.test.d.ts +0 -2
- package/dist/__tests__/index.test.d.ts.map +0 -1
- package/dist/__tests__/index.test.js +0 -7
- package/dist/__tests__/index.test.js.map +0 -1
- package/dist/__tests__/list-models.test.d.ts +0 -2
- package/dist/__tests__/list-models.test.d.ts.map +0 -1
- package/dist/__tests__/list-models.test.js +0 -86
- package/dist/__tests__/list-models.test.js.map +0 -1
- package/dist/lib/components/list-invitations/__tests__/list-invitations.component.test.d.ts +0 -2
- package/dist/lib/components/list-invitations/__tests__/list-invitations.component.test.d.ts.map +0 -1
- package/dist/lib/components/list-invitations/__tests__/list-invitations.component.test.js +0 -145
- package/dist/lib/components/list-invitations/__tests__/list-invitations.component.test.js.map +0 -1
|
@@ -24,13 +24,11 @@ function ListDeltaConfirmComponent_Conditional_0_Conditional_4_Template(rf, ctx)
|
|
|
24
24
|
i0.ɵɵtextInterpolate(ctx_r1.targetDisplayName);
|
|
25
25
|
} }
|
|
26
26
|
function ListDeltaConfirmComponent_Conditional_0_Conditional_21_Template(rf, ctx) { if (rf & 1) {
|
|
27
|
-
i0.ɵɵelementStart(0, "
|
|
28
|
-
i0.ɵɵ
|
|
29
|
-
i0.ɵɵ
|
|
30
|
-
i0.ɵɵtext(3, "Safe operation \u2014 no records will be removed from the list.");
|
|
31
|
-
i0.ɵɵelementEnd()();
|
|
27
|
+
i0.ɵɵelementStart(0, "mj-alert", 10);
|
|
28
|
+
i0.ɵɵtext(1, "Safe operation \u2014 no records will be removed from the list.");
|
|
29
|
+
i0.ɵɵelementEnd();
|
|
32
30
|
} }
|
|
33
|
-
function
|
|
31
|
+
function ListDeltaConfirmComponent_Conditional_0_Conditional_22_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
34
32
|
i0.ɵɵtext(0, " These records are members today but are no longer matched by the source ");
|
|
35
33
|
i0.ɵɵelementStart(1, "em");
|
|
36
34
|
i0.ɵɵtext(2);
|
|
@@ -41,39 +39,37 @@ function ListDeltaConfirmComponent_Conditional_0_Conditional_22_Conditional_6_Te
|
|
|
41
39
|
i0.ɵɵadvance(2);
|
|
42
40
|
i0.ɵɵtextInterpolate1("\"", ctx_r1.SourceLabel, "\"");
|
|
43
41
|
} }
|
|
44
|
-
function
|
|
42
|
+
function ListDeltaConfirmComponent_Conditional_0_Conditional_22_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
45
43
|
i0.ɵɵtext(0, " These records are members today but are no longer matched by the configured source. ");
|
|
46
44
|
} }
|
|
47
45
|
function ListDeltaConfirmComponent_Conditional_0_Conditional_22_Template(rf, ctx) { if (rf & 1) {
|
|
48
46
|
const _r3 = i0.ɵɵgetCurrentView();
|
|
49
|
-
i0.ɵɵelementStart(0, "
|
|
50
|
-
i0.ɵɵ
|
|
51
|
-
i0.ɵɵelementStart(2, "div", 18)(3, "div")(4, "strong");
|
|
52
|
-
i0.ɵɵtext(5);
|
|
47
|
+
i0.ɵɵelementStart(0, "mj-alert", 11)(1, "div", 16)(2, "div")(3, "strong");
|
|
48
|
+
i0.ɵɵtext(4);
|
|
53
49
|
i0.ɵɵelementEnd();
|
|
54
|
-
i0.ɵɵconditionalCreate(
|
|
50
|
+
i0.ɵɵconditionalCreate(5, ListDeltaConfirmComponent_Conditional_0_Conditional_22_Conditional_5_Template, 4, 1)(6, ListDeltaConfirmComponent_Conditional_0_Conditional_22_Conditional_6_Template, 1, 0);
|
|
55
51
|
i0.ɵɵelementEnd();
|
|
56
|
-
i0.ɵɵelementStart(
|
|
57
|
-
i0.ɵɵlistener("change", function
|
|
52
|
+
i0.ɵɵelementStart(7, "label", 17)(8, "input", 18);
|
|
53
|
+
i0.ɵɵlistener("change", function ListDeltaConfirmComponent_Conditional_0_Conditional_22_Template_input_change_8_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnAcknowledgementToggle($event.target.checked)); });
|
|
58
54
|
i0.ɵɵelementEnd();
|
|
59
|
-
i0.ɵɵelementStart(
|
|
60
|
-
i0.ɵɵtext(
|
|
55
|
+
i0.ɵɵelementStart(9, "span");
|
|
56
|
+
i0.ɵɵtext(10);
|
|
61
57
|
i0.ɵɵelementEnd()()()();
|
|
62
58
|
} if (rf & 2) {
|
|
63
59
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
64
|
-
i0.ɵɵadvance(
|
|
60
|
+
i0.ɵɵadvance(4);
|
|
65
61
|
i0.ɵɵtextInterpolate1("", ctx_r1.Delta.Counts.Remove, " record(s) will be removed from this list.");
|
|
66
62
|
i0.ɵɵadvance();
|
|
67
|
-
i0.ɵɵconditional(ctx_r1.SourceLabel ?
|
|
63
|
+
i0.ɵɵconditional(ctx_r1.SourceLabel ? 5 : 6);
|
|
68
64
|
i0.ɵɵadvance(3);
|
|
69
65
|
i0.ɵɵproperty("checked", ctx_r1.dropAcknowledged);
|
|
70
66
|
i0.ɵɵadvance(2);
|
|
71
67
|
i0.ɵɵtextInterpolate1("I understand ", ctx_r1.Delta.Counts.Remove, " record(s) will be removed");
|
|
72
68
|
} }
|
|
73
69
|
function ListDeltaConfirmComponent_Conditional_0_Conditional_23_For_4_Template(rf, ctx) { if (rf & 1) {
|
|
74
|
-
i0.ɵɵelementStart(0, "li",
|
|
75
|
-
i0.ɵɵelement(1, "i",
|
|
76
|
-
i0.ɵɵelementStart(2, "span",
|
|
70
|
+
i0.ɵɵelementStart(0, "li", 21);
|
|
71
|
+
i0.ɵɵelement(1, "i", 22);
|
|
72
|
+
i0.ɵɵelementStart(2, "span", 23);
|
|
77
73
|
i0.ɵɵtext(3);
|
|
78
74
|
i0.ɵɵelementEnd()();
|
|
79
75
|
} if (rf & 2) {
|
|
@@ -82,11 +78,11 @@ function ListDeltaConfirmComponent_Conditional_0_Conditional_23_For_4_Template(r
|
|
|
82
78
|
i0.ɵɵtextInterpolate(id_r4);
|
|
83
79
|
} }
|
|
84
80
|
function ListDeltaConfirmComponent_Conditional_0_Conditional_23_Template(rf, ctx) { if (rf & 1) {
|
|
85
|
-
i0.ɵɵelementStart(0, "div",
|
|
81
|
+
i0.ɵɵelementStart(0, "div", 19);
|
|
86
82
|
i0.ɵɵtext(1);
|
|
87
83
|
i0.ɵɵelementEnd();
|
|
88
|
-
i0.ɵɵelementStart(2, "ul",
|
|
89
|
-
i0.ɵɵrepeaterCreate(3, ListDeltaConfirmComponent_Conditional_0_Conditional_23_For_4_Template, 4, 1, "li",
|
|
84
|
+
i0.ɵɵelementStart(2, "ul", 20);
|
|
85
|
+
i0.ɵɵrepeaterCreate(3, ListDeltaConfirmComponent_Conditional_0_Conditional_23_For_4_Template, 4, 1, "li", 21, i0.ɵɵrepeaterTrackByIdentity);
|
|
90
86
|
i0.ɵɵelementEnd();
|
|
91
87
|
} if (rf & 2) {
|
|
92
88
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
@@ -96,9 +92,9 @@ function ListDeltaConfirmComponent_Conditional_0_Conditional_23_Template(rf, ctx
|
|
|
96
92
|
i0.ɵɵrepeater(ctx_r1.previewAdds);
|
|
97
93
|
} }
|
|
98
94
|
function ListDeltaConfirmComponent_Conditional_0_Conditional_24_For_4_Template(rf, ctx) { if (rf & 1) {
|
|
99
|
-
i0.ɵɵelementStart(0, "li",
|
|
100
|
-
i0.ɵɵelement(1, "i",
|
|
101
|
-
i0.ɵɵelementStart(2, "span",
|
|
95
|
+
i0.ɵɵelementStart(0, "li", 24);
|
|
96
|
+
i0.ɵɵelement(1, "i", 27);
|
|
97
|
+
i0.ɵɵelementStart(2, "span", 23);
|
|
102
98
|
i0.ɵɵtext(3);
|
|
103
99
|
i0.ɵɵelementEnd()();
|
|
104
100
|
} if (rf & 2) {
|
|
@@ -107,14 +103,14 @@ function ListDeltaConfirmComponent_Conditional_0_Conditional_24_For_4_Template(r
|
|
|
107
103
|
i0.ɵɵtextInterpolate(id_r5);
|
|
108
104
|
} }
|
|
109
105
|
function ListDeltaConfirmComponent_Conditional_0_Conditional_24_Template(rf, ctx) { if (rf & 1) {
|
|
110
|
-
i0.ɵɵelementStart(0, "div",
|
|
106
|
+
i0.ɵɵelementStart(0, "div", 19);
|
|
111
107
|
i0.ɵɵtext(1);
|
|
112
108
|
i0.ɵɵelementEnd();
|
|
113
|
-
i0.ɵɵelementStart(2, "ul",
|
|
114
|
-
i0.ɵɵrepeaterCreate(3, ListDeltaConfirmComponent_Conditional_0_Conditional_24_For_4_Template, 4, 1, "li",
|
|
109
|
+
i0.ɵɵelementStart(2, "ul", 20);
|
|
110
|
+
i0.ɵɵrepeaterCreate(3, ListDeltaConfirmComponent_Conditional_0_Conditional_24_For_4_Template, 4, 1, "li", 24, i0.ɵɵrepeaterTrackByIdentity);
|
|
115
111
|
i0.ɵɵelementEnd();
|
|
116
|
-
i0.ɵɵelementStart(5, "div",
|
|
117
|
-
i0.ɵɵelement(6, "i",
|
|
112
|
+
i0.ɵɵelementStart(5, "div", 25);
|
|
113
|
+
i0.ɵɵelement(6, "i", 26);
|
|
118
114
|
i0.ɵɵtext(7, " Removed records are logged in the audit log and can be re-added manually if needed. ");
|
|
119
115
|
i0.ɵɵelementEnd();
|
|
120
116
|
} if (rf & 2) {
|
|
@@ -155,7 +151,7 @@ function ListDeltaConfirmComponent_Conditional_0_Template(rf, ctx) { if (rf & 1)
|
|
|
155
151
|
i0.ɵɵelementStart(19, "div", 7);
|
|
156
152
|
i0.ɵɵtext(20, "To Remove");
|
|
157
153
|
i0.ɵɵelementEnd()()();
|
|
158
|
-
i0.ɵɵconditionalCreate(21, ListDeltaConfirmComponent_Conditional_0_Conditional_21_Template,
|
|
154
|
+
i0.ɵɵconditionalCreate(21, ListDeltaConfirmComponent_Conditional_0_Conditional_21_Template, 2, 0, "mj-alert", 10)(22, ListDeltaConfirmComponent_Conditional_0_Conditional_22_Template, 11, 4, "mj-alert", 11);
|
|
159
155
|
i0.ɵɵconditionalCreate(23, ListDeltaConfirmComponent_Conditional_0_Conditional_23_Template, 5, 2);
|
|
160
156
|
i0.ɵɵconditionalCreate(24, ListDeltaConfirmComponent_Conditional_0_Conditional_24_Template, 8, 2);
|
|
161
157
|
i0.ɵɵelementEnd();
|
|
@@ -295,15 +291,15 @@ export class ListDeltaConfirmComponent {
|
|
|
295
291
|
this.dropAcknowledged = value;
|
|
296
292
|
}
|
|
297
293
|
static ɵfac = function ListDeltaConfirmComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ListDeltaConfirmComponent)(); };
|
|
298
|
-
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ListDeltaConfirmComponent, selectors: [["mj-list-delta-confirm"]], inputs: { Visible: "Visible", Delta: "Delta", TargetListName: "TargetListName", SourceLabel: "SourceLabel", PreviewLimit: "PreviewLimit" }, outputs: { Confirm: "Confirm", Cancel: "Cancel" }, standalone: false, decls: 1, vars: 1, consts: [[3, "Visible", "Width", "Title"], [3, "Close", "Visible", "Width", "Title"], [1, "delta-confirm-body"], [1, "delta-confirm-intro"], [1, "delta-summary"], [1, "delta-tile", "delta-tile--add"], [1, "delta-tile__count"], [1, "delta-tile__label"], [1, "delta-tile", "delta-tile--keep"], [1, "delta-tile"], [
|
|
294
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ListDeltaConfirmComponent, selectors: [["mj-list-delta-confirm"]], inputs: { Visible: "Visible", Delta: "Delta", TargetListName: "TargetListName", SourceLabel: "SourceLabel", PreviewLimit: "PreviewLimit" }, outputs: { Confirm: "Confirm", Cancel: "Cancel" }, standalone: false, decls: 1, vars: 1, consts: [[3, "Visible", "Width", "Title"], [3, "Close", "Visible", "Width", "Title"], [1, "delta-confirm-body"], [1, "delta-confirm-intro"], [1, "delta-summary"], [1, "delta-tile", "delta-tile--add"], [1, "delta-tile__count"], [1, "delta-tile__label"], [1, "delta-tile", "delta-tile--keep"], [1, "delta-tile"], ["Variant", "success"], ["Variant", "error"], ["mjButton", "", 3, "click", "variant", "disabled"], [1, "fa-solid", "fa-check"], ["mjButton", "", "variant", "outline", 3, "click"], [1, "delta-token-hint"], [1, "delta-banner__copy"], [1, "delta-banner__ack"], ["type", "checkbox", 3, "change", "checked"], [1, "delta-section-label"], [1, "delta-preview"], [1, "delta-preview__row", "delta-preview__row--add"], [1, "fa-solid", "fa-user-plus"], [1, "delta-preview__id"], [1, "delta-preview__row", "delta-preview__row--remove"], [1, "delta-footnote"], [1, "fa-solid", "fa-clock-rotate-left"], [1, "fa-solid", "fa-user-minus"]], template: function ListDeltaConfirmComponent_Template(rf, ctx) { if (rf & 1) {
|
|
299
295
|
i0.ɵɵconditionalCreate(0, ListDeltaConfirmComponent_Conditional_0_Template, 34, 21, "mj-dialog", 0);
|
|
300
296
|
} if (rf & 2) {
|
|
301
297
|
i0.ɵɵconditional(ctx.Visible && ctx.Delta ? 0 : -1);
|
|
302
|
-
} }, dependencies: [i1.MJButtonDirective, i1.MJDialogComponent, i1.MJDialogActionsComponent], styles: ["[_nghost-%COMP%] {\n display: contents;\n}\n\n.delta-confirm-body[_ngcontent-%COMP%] {\n padding: 16px 20px 8px;\n display: flex;\n flex-direction: column;\n gap: 14px;\n color: var(--mj-text-primary);\n font-size: 13px;\n line-height: 1.5;\n}\n\n.delta-confirm-body--danger[_ngcontent-%COMP%] {\n border-left: 3px solid var(--mj-status-error);\n padding-left: 17px;\n}\n\n.delta-confirm-intro[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n}\n\n.delta-summary[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(3, minmax(0, 1fr));\n gap: 10px;\n}\n\n.delta-tile[_ngcontent-%COMP%] {\n border-radius: 8px;\n padding: 12px 14px;\n text-align: center;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n}\n\n.delta-tile__count[_ngcontent-%COMP%] {\n font-size: 22px;\n font-weight: 600;\n line-height: 1.1;\n}\n\n.delta-tile__label[_ngcontent-%COMP%] {\n font-size: 11px;\n letter-spacing: 0.04em;\n text-transform: uppercase;\n color: var(--mj-text-muted);\n margin-top: 4px;\n}\n\n.delta-tile--add[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 8%, var(--mj-bg-surface));\n border-color: var(--mj-status-success-border);\n color: var(--mj-status-success-text);\n}\n\n.delta-tile--keep[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-card);\n border-color: var(--mj-border-default);\n color: var(--mj-text-primary);\n}\n\n.delta-tile--remove[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 8%, var(--mj-bg-surface));\n border-color: var(--mj-status-error-border);\n color: var(--mj-status-error-text);\n}\n\n.delta-tile--remove-empty[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-sunken);\n border-color: var(--mj-border-default);\n color: var(--mj-text-muted);\n}\n\n.delta-
|
|
298
|
+
} }, dependencies: [i1.MJButtonDirective, i1.MJDialogComponent, i1.MJDialogActionsComponent, i1.MJAlertComponent], styles: ["[_nghost-%COMP%] {\n display: contents;\n}\n\n.delta-confirm-body[_ngcontent-%COMP%] {\n padding: 16px 20px 8px;\n display: flex;\n flex-direction: column;\n gap: 14px;\n color: var(--mj-text-primary);\n font-size: 13px;\n line-height: 1.5;\n}\n\n.delta-confirm-body--danger[_ngcontent-%COMP%] {\n border-left: 3px solid var(--mj-status-error);\n padding-left: 17px;\n}\n\n.delta-confirm-intro[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n}\n\n.delta-summary[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(3, minmax(0, 1fr));\n gap: 10px;\n}\n\n.delta-tile[_ngcontent-%COMP%] {\n border-radius: 8px;\n padding: 12px 14px;\n text-align: center;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n}\n\n.delta-tile__count[_ngcontent-%COMP%] {\n font-size: 22px;\n font-weight: 600;\n line-height: 1.1;\n}\n\n.delta-tile__label[_ngcontent-%COMP%] {\n font-size: 11px;\n letter-spacing: 0.04em;\n text-transform: uppercase;\n color: var(--mj-text-muted);\n margin-top: 4px;\n}\n\n.delta-tile--add[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 8%, var(--mj-bg-surface));\n border-color: var(--mj-status-success-border);\n color: var(--mj-status-success-text);\n}\n\n.delta-tile--keep[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-card);\n border-color: var(--mj-border-default);\n color: var(--mj-text-primary);\n}\n\n.delta-tile--remove[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 8%, var(--mj-bg-surface));\n border-color: var(--mj-status-error-border);\n color: var(--mj-status-error-text);\n}\n\n.delta-tile--remove-empty[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-sunken);\n border-color: var(--mj-border-default);\n color: var(--mj-text-muted);\n}\n\n.delta-banner__copy[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.delta-banner__ack[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 12.5px;\n cursor: pointer;\n user-select: none;\n}\n\n.delta-banner__ack[_ngcontent-%COMP%] input[_ngcontent-%COMP%] {\n cursor: pointer;\n}\n\n.delta-section-label[_ngcontent-%COMP%] {\n font-size: 11px;\n letter-spacing: 0.04em;\n text-transform: uppercase;\n color: var(--mj-text-muted);\n margin-top: 6px;\n}\n\n.delta-preview[_ngcontent-%COMP%] {\n list-style: none;\n padding: 0;\n margin: 0;\n display: flex;\n flex-direction: column;\n gap: 4px;\n max-height: 180px;\n overflow-y: auto;\n border: 1px solid var(--mj-border-subtle);\n border-radius: 6px;\n background: var(--mj-bg-surface-sunken);\n padding: 6px 8px;\n}\n\n.delta-preview__row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 4px 6px;\n border-radius: 4px;\n font-size: 12.5px;\n}\n\n.delta-preview__row--add[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-status-success);\n}\n\n.delta-preview__row--remove[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n}\n\n.delta-preview__id[_ngcontent-%COMP%] {\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n font-size: 11.5px;\n color: var(--mj-text-secondary);\n}\n\n.delta-footnote[_ngcontent-%COMP%] {\n font-size: 11.5px;\n color: var(--mj-text-muted);\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.delta-token-hint[_ngcontent-%COMP%] {\n margin-left: auto;\n font-size: 11px;\n color: var(--mj-text-muted);\n align-self: center;\n}"], changeDetection: 0 });
|
|
303
299
|
}
|
|
304
300
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ListDeltaConfirmComponent, [{
|
|
305
301
|
type: Component,
|
|
306
|
-
args: [{ standalone: false, selector: 'mj-list-delta-confirm', changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (Visible && Delta) {\n <mj-dialog\n [Visible]=\"true\"\n [Width]=\"720\"\n [Title]=\"hasDrops ? 'Confirm List Update \u2014 Records Will Be Removed' : 'Confirm List Update'\"\n (Close)=\"OnCancel()\">\n <div class=\"delta-confirm-body\" [class.delta-confirm-body--danger]=\"hasDrops\">\n <div class=\"delta-confirm-intro\">\n @if (hasDrops) {\n Refreshing <strong>{{ targetDisplayName }}</strong> will reconcile against the source.\n Records that are no longer present in the source will be removed.\n } @else {\n You're about to apply this change to <strong>{{ targetDisplayName }}</strong>.\n }\n </div>\n\n <div class=\"delta-summary\">\n <div class=\"delta-tile delta-tile--add\">\n <div class=\"delta-tile__count\">+{{ Delta.Counts.Add }}</div>\n <div class=\"delta-tile__label\">To Add</div>\n </div>\n <div class=\"delta-tile delta-tile--keep\">\n <div class=\"delta-tile__count\">{{ Delta.Counts.Unchanged }}</div>\n <div class=\"delta-tile__label\">Unchanged</div>\n </div>\n <div class=\"delta-tile\"\n [class.delta-tile--remove]=\"hasDrops\"\n [class.delta-tile--remove-empty]=\"!hasDrops\">\n <div class=\"delta-tile__count\">{{ hasDrops ? '\u2212' : '' }}{{ Delta.Counts.Remove }}</div>\n <div class=\"delta-tile__label\">To Remove</div>\n </div>\n </div>\n\n @if (!hasDrops) {\n <
|
|
302
|
+
args: [{ standalone: false, selector: 'mj-list-delta-confirm', changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (Visible && Delta) {\n <mj-dialog\n [Visible]=\"true\"\n [Width]=\"720\"\n [Title]=\"hasDrops ? 'Confirm List Update \u2014 Records Will Be Removed' : 'Confirm List Update'\"\n (Close)=\"OnCancel()\">\n <div class=\"delta-confirm-body\" [class.delta-confirm-body--danger]=\"hasDrops\">\n <div class=\"delta-confirm-intro\">\n @if (hasDrops) {\n Refreshing <strong>{{ targetDisplayName }}</strong> will reconcile against the source.\n Records that are no longer present in the source will be removed.\n } @else {\n You're about to apply this change to <strong>{{ targetDisplayName }}</strong>.\n }\n </div>\n\n <div class=\"delta-summary\">\n <div class=\"delta-tile delta-tile--add\">\n <div class=\"delta-tile__count\">+{{ Delta.Counts.Add }}</div>\n <div class=\"delta-tile__label\">To Add</div>\n </div>\n <div class=\"delta-tile delta-tile--keep\">\n <div class=\"delta-tile__count\">{{ Delta.Counts.Unchanged }}</div>\n <div class=\"delta-tile__label\">Unchanged</div>\n </div>\n <div class=\"delta-tile\"\n [class.delta-tile--remove]=\"hasDrops\"\n [class.delta-tile--remove-empty]=\"!hasDrops\">\n <div class=\"delta-tile__count\">{{ hasDrops ? '\u2212' : '' }}{{ Delta.Counts.Remove }}</div>\n <div class=\"delta-tile__label\">To Remove</div>\n </div>\n </div>\n\n @if (!hasDrops) {\n <mj-alert Variant=\"success\">Safe operation \u2014 no records will be removed from the list.</mj-alert>\n } @else {\n <mj-alert Variant=\"error\">\n <div class=\"delta-banner__copy\">\n <div>\n <strong>{{ Delta.Counts.Remove }} record(s) will be removed from this list.</strong>\n @if (SourceLabel) {\n These records are members today but are no longer matched by the source\n <em>\"{{ SourceLabel }}\"</em>.\n } @else {\n These records are members today but are no longer matched by the configured source.\n }\n </div>\n <label class=\"delta-banner__ack\">\n <input type=\"checkbox\"\n [checked]=\"dropAcknowledged\"\n (change)=\"OnAcknowledgementToggle($any($event.target).checked)\">\n <span>I understand {{ Delta.Counts.Remove }} record(s) will be removed</span>\n </label>\n </div>\n </mj-alert>\n }\n\n @if (previewAdds.length > 0) {\n <div class=\"delta-section-label\">\n Preview \u2014 records being added (first {{ previewAdds.length }} of {{ Delta.Counts.Add }})\n </div>\n <ul class=\"delta-preview\">\n @for (id of previewAdds; track id) {\n <li class=\"delta-preview__row delta-preview__row--add\">\n <i class=\"fa-solid fa-user-plus\"></i>\n <span class=\"delta-preview__id\">{{ id }}</span>\n </li>\n }\n </ul>\n }\n\n @if (previewRemoves.length > 0) {\n <div class=\"delta-section-label\">\n Preview \u2014 records being removed (first {{ previewRemoves.length }} of {{ Delta.Counts.Remove }})\n </div>\n <ul class=\"delta-preview\">\n @for (id of previewRemoves; track id) {\n <li class=\"delta-preview__row delta-preview__row--remove\">\n <i class=\"fa-solid fa-user-minus\"></i>\n <span class=\"delta-preview__id\">{{ id }}</span>\n </li>\n }\n </ul>\n <div class=\"delta-footnote\">\n <i class=\"fa-solid fa-clock-rotate-left\"></i>\n Removed records are logged in the audit log and can be re-added manually if needed.\n </div>\n }\n </div>\n\n <mj-dialog-actions>\n <button mjButton\n [variant]=\"hasDrops ? 'danger' : 'primary'\"\n [disabled]=\"!canConfirm\"\n (click)=\"OnConfirm()\">\n <i class=\"fa-solid fa-check\"></i>\n {{ confirmButtonLabel }}\n </button>\n <button mjButton variant=\"outline\" (click)=\"OnCancel()\">Cancel</button>\n <span class=\"delta-token-hint\">\n @if (hasDrops && !dropAcknowledged) {\n Confirm button unlocks after acknowledgement\n } @else {\n Delta token valid for 5 min\n }\n </span>\n </mj-dialog-actions>\n </mj-dialog>\n}\n", styles: [":host {\n display: contents;\n}\n\n.delta-confirm-body {\n padding: 16px 20px 8px;\n display: flex;\n flex-direction: column;\n gap: 14px;\n color: var(--mj-text-primary);\n font-size: 13px;\n line-height: 1.5;\n}\n\n.delta-confirm-body--danger {\n border-left: 3px solid var(--mj-status-error);\n padding-left: 17px;\n}\n\n.delta-confirm-intro {\n color: var(--mj-text-secondary);\n}\n\n.delta-summary {\n display: grid;\n grid-template-columns: repeat(3, minmax(0, 1fr));\n gap: 10px;\n}\n\n.delta-tile {\n border-radius: 8px;\n padding: 12px 14px;\n text-align: center;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n}\n\n.delta-tile__count {\n font-size: 22px;\n font-weight: 600;\n line-height: 1.1;\n}\n\n.delta-tile__label {\n font-size: 11px;\n letter-spacing: 0.04em;\n text-transform: uppercase;\n color: var(--mj-text-muted);\n margin-top: 4px;\n}\n\n.delta-tile--add {\n background: color-mix(in srgb, var(--mj-status-success) 8%, var(--mj-bg-surface));\n border-color: var(--mj-status-success-border);\n color: var(--mj-status-success-text);\n}\n\n.delta-tile--keep {\n background: var(--mj-bg-surface-card);\n border-color: var(--mj-border-default);\n color: var(--mj-text-primary);\n}\n\n.delta-tile--remove {\n background: color-mix(in srgb, var(--mj-status-error) 8%, var(--mj-bg-surface));\n border-color: var(--mj-status-error-border);\n color: var(--mj-status-error-text);\n}\n\n.delta-tile--remove-empty {\n background: var(--mj-bg-surface-sunken);\n border-color: var(--mj-border-default);\n color: var(--mj-text-muted);\n}\n\n.delta-banner__copy {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.delta-banner__ack {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 12.5px;\n cursor: pointer;\n user-select: none;\n}\n\n.delta-banner__ack input {\n cursor: pointer;\n}\n\n.delta-section-label {\n font-size: 11px;\n letter-spacing: 0.04em;\n text-transform: uppercase;\n color: var(--mj-text-muted);\n margin-top: 6px;\n}\n\n.delta-preview {\n list-style: none;\n padding: 0;\n margin: 0;\n display: flex;\n flex-direction: column;\n gap: 4px;\n max-height: 180px;\n overflow-y: auto;\n border: 1px solid var(--mj-border-subtle);\n border-radius: 6px;\n background: var(--mj-bg-surface-sunken);\n padding: 6px 8px;\n}\n\n.delta-preview__row {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 4px 6px;\n border-radius: 4px;\n font-size: 12.5px;\n}\n\n.delta-preview__row--add i {\n color: var(--mj-status-success);\n}\n\n.delta-preview__row--remove i {\n color: var(--mj-status-error);\n}\n\n.delta-preview__id {\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n font-size: 11.5px;\n color: var(--mj-text-secondary);\n}\n\n.delta-footnote {\n font-size: 11.5px;\n color: var(--mj-text-muted);\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.delta-token-hint {\n margin-left: auto;\n font-size: 11px;\n color: var(--mj-text-muted);\n align-self: center;\n}\n"] }]
|
|
307
303
|
}], null, { Visible: [{
|
|
308
304
|
type: Input
|
|
309
305
|
}], Delta: [{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list-delta-confirm.component.js","sourceRoot":"","sources":["../../../../src/lib/components/list-delta-confirm/list-delta-confirm.component.ts","../../../../src/lib/components/list-delta-confirm/list-delta-confirm.component.html"],"names":[],"mappings":"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","sourcesContent":["import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core';\n\nimport type { ListDelta } from '@memberjunction/lists-base';\n\n/**\n * Confirmation dialog for any list operation that produced a `ListDelta`\n * preview. This is the **only** UI path that emits a valid `DeltaToken`\n * onward to `applyListDelta` — every mutating list flow funnels through\n * here.\n *\n * Two visual states:\n *\n * - **Safe** (`Delta.Counts.Remove === 0`): green confirmation banner; the\n * primary button is enabled immediately.\n * - **Drop-warning** (`Delta.Counts.Remove > 0`): red header + warning\n * banner; the primary button stays disabled until the user checks the\n * acknowledgement box. The server still rejects with `DROP_NOT_CONFIRMED`\n * if `ConfirmDrops` is false — this UI gate is a convenience, not the\n * source of truth.\n */\n@Component({\n standalone: false,\n selector: 'mj-list-delta-confirm',\n templateUrl: './list-delta-confirm.component.html',\n styleUrls: ['./list-delta-confirm.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ListDeltaConfirmComponent {\n /**\n * Whether the dialog is rendered. Bound via the same getter/setter\n * pattern used by the sibling share dialog so consumers can drive\n * visibility from a parent state machine.\n */\n @Input()\n get Visible(): boolean {\n return this._visible;\n }\n set Visible(value: boolean) {\n if (this._visible !== value) {\n this._visible = value;\n // Reset the acknowledgement when re-opening so a previous session's\n // confirmation doesn't carry over to a new delta.\n if (value) this.dropAcknowledged = false;\n }\n }\n private _visible = false;\n\n /** The delta to confirm. Required — the component renders nothing useful without it. */\n @Input() Delta: ListDelta | null = null;\n\n /**\n * Human-readable name of the target list. Optional; the dialog falls\n * back to \"this list\" if not provided.\n */\n @Input() TargetListName: string | null = null;\n\n /**\n * Optional descriptor of the source for display (\"Q4 Donor View\", etc.).\n * Has no functional effect — purely for the warning copy.\n */\n @Input() SourceLabel: string | null = null;\n\n /**\n * How many preview records to render in the \"first N of …\" lists.\n * Larger deltas could otherwise blow up the DOM.\n */\n @Input() PreviewLimit = 5;\n\n /** Fires when the user confirms — payload is the validated delta token. */\n @Output() Confirm = new EventEmitter<string>();\n\n /** Fires when the user cancels (close button, ESC, or Cancel button). */\n @Output() Cancel = new EventEmitter<void>();\n\n /** Local UI state for the acknowledgement checkbox in drop-warning mode. */\n public dropAcknowledged = false;\n\n public get hasDrops(): boolean {\n return (this.Delta?.Counts.Remove ?? 0) > 0;\n }\n\n public get canConfirm(): boolean {\n if (!this.Delta) return false;\n if (!this.hasDrops) return true;\n return this.dropAcknowledged;\n }\n\n public get previewAdds(): string[] {\n return this.Delta?.ToAdd.slice(0, this.PreviewLimit) ?? [];\n }\n\n public get previewRemoves(): string[] {\n return this.Delta?.ToRemove.slice(0, this.PreviewLimit) ?? [];\n }\n\n public get confirmButtonLabel(): string {\n if (!this.Delta) return 'Confirm';\n if (this.hasDrops) return `Confirm Removal & Update`;\n return `Confirm (Add ${this.Delta.Counts.Add})`;\n }\n\n public get targetDisplayName(): string {\n return this.TargetListName ?? 'this list';\n }\n\n public OnConfirm(): void {\n if (!this.canConfirm || !this.Delta) return;\n this.Confirm.emit(this.Delta.DeltaToken);\n }\n\n public OnCancel(): void {\n this.Cancel.emit();\n }\n\n public OnAcknowledgementToggle(value: boolean): void {\n this.dropAcknowledged = value;\n }\n}\n","@if (Visible && Delta) {\n <mj-dialog\n [Visible]=\"true\"\n [Width]=\"720\"\n [Title]=\"hasDrops ? 'Confirm List Update — Records Will Be Removed' : 'Confirm List Update'\"\n (Close)=\"OnCancel()\">\n <div class=\"delta-confirm-body\" [class.delta-confirm-body--danger]=\"hasDrops\">\n <div class=\"delta-confirm-intro\">\n @if (hasDrops) {\n Refreshing <strong>{{ targetDisplayName }}</strong> will reconcile against the source.\n Records that are no longer present in the source will be removed.\n } @else {\n You're about to apply this change to <strong>{{ targetDisplayName }}</strong>.\n }\n </div>\n\n <div class=\"delta-summary\">\n <div class=\"delta-tile delta-tile--add\">\n <div class=\"delta-tile__count\">+{{ Delta.Counts.Add }}</div>\n <div class=\"delta-tile__label\">To Add</div>\n </div>\n <div class=\"delta-tile delta-tile--keep\">\n <div class=\"delta-tile__count\">{{ Delta.Counts.Unchanged }}</div>\n <div class=\"delta-tile__label\">Unchanged</div>\n </div>\n <div class=\"delta-tile\"\n [class.delta-tile--remove]=\"hasDrops\"\n [class.delta-tile--remove-empty]=\"!hasDrops\">\n <div class=\"delta-tile__count\">{{ hasDrops ? '−' : '' }}{{ Delta.Counts.Remove }}</div>\n <div class=\"delta-tile__label\">To Remove</div>\n </div>\n </div>\n\n @if (!hasDrops) {\n <div class=\"delta-banner delta-banner--safe\">\n <i class=\"fa-solid fa-circle-check\"></i>\n <span>Safe operation — no records will be removed from the list.</span>\n </div>\n } @else {\n <div class=\"delta-banner delta-banner--danger\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n <div class=\"delta-banner__copy\">\n <div>\n <strong>{{ Delta.Counts.Remove }} record(s) will be removed from this list.</strong>\n @if (SourceLabel) {\n These records are members today but are no longer matched by the source\n <em>\"{{ SourceLabel }}\"</em>.\n } @else {\n These records are members today but are no longer matched by the configured source.\n }\n </div>\n <label class=\"delta-banner__ack\">\n <input type=\"checkbox\"\n [checked]=\"dropAcknowledged\"\n (change)=\"OnAcknowledgementToggle($any($event.target).checked)\">\n <span>I understand {{ Delta.Counts.Remove }} record(s) will be removed</span>\n </label>\n </div>\n </div>\n }\n\n @if (previewAdds.length > 0) {\n <div class=\"delta-section-label\">\n Preview — records being added (first {{ previewAdds.length }} of {{ Delta.Counts.Add }})\n </div>\n <ul class=\"delta-preview\">\n @for (id of previewAdds; track id) {\n <li class=\"delta-preview__row delta-preview__row--add\">\n <i class=\"fa-solid fa-user-plus\"></i>\n <span class=\"delta-preview__id\">{{ id }}</span>\n </li>\n }\n </ul>\n }\n\n @if (previewRemoves.length > 0) {\n <div class=\"delta-section-label\">\n Preview — records being removed (first {{ previewRemoves.length }} of {{ Delta.Counts.Remove }})\n </div>\n <ul class=\"delta-preview\">\n @for (id of previewRemoves; track id) {\n <li class=\"delta-preview__row delta-preview__row--remove\">\n <i class=\"fa-solid fa-user-minus\"></i>\n <span class=\"delta-preview__id\">{{ id }}</span>\n </li>\n }\n </ul>\n <div class=\"delta-footnote\">\n <i class=\"fa-solid fa-clock-rotate-left\"></i>\n Removed records are logged in the audit log and can be re-added manually if needed.\n </div>\n }\n </div>\n\n <mj-dialog-actions>\n <button mjButton\n [variant]=\"hasDrops ? 'danger' : 'primary'\"\n [disabled]=\"!canConfirm\"\n (click)=\"OnConfirm()\">\n <i class=\"fa-solid fa-check\"></i>\n {{ confirmButtonLabel }}\n </button>\n <button mjButton variant=\"outline\" (click)=\"OnCancel()\">Cancel</button>\n <span class=\"delta-token-hint\">\n @if (hasDrops && !dropAcknowledged) {\n Confirm button unlocks after acknowledgement\n } @else {\n Delta token valid for 5 min\n }\n </span>\n </mj-dialog-actions>\n </mj-dialog>\n}\n"]}
|
|
1
|
+
{"version":3,"file":"list-delta-confirm.component.js","sourceRoot":"","sources":["../../../../src/lib/components/list-delta-confirm/list-delta-confirm.component.ts","../../../../src/lib/components/list-delta-confirm/list-delta-confirm.component.html"],"names":[],"mappings":"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","sourcesContent":["import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core';\n\nimport type { ListDelta } from '@memberjunction/lists-base';\n\n/**\n * Confirmation dialog for any list operation that produced a `ListDelta`\n * preview. This is the **only** UI path that emits a valid `DeltaToken`\n * onward to `applyListDelta` — every mutating list flow funnels through\n * here.\n *\n * Two visual states:\n *\n * - **Safe** (`Delta.Counts.Remove === 0`): green confirmation banner; the\n * primary button is enabled immediately.\n * - **Drop-warning** (`Delta.Counts.Remove > 0`): red header + warning\n * banner; the primary button stays disabled until the user checks the\n * acknowledgement box. The server still rejects with `DROP_NOT_CONFIRMED`\n * if `ConfirmDrops` is false — this UI gate is a convenience, not the\n * source of truth.\n */\n@Component({\n standalone: false,\n selector: 'mj-list-delta-confirm',\n templateUrl: './list-delta-confirm.component.html',\n styleUrls: ['./list-delta-confirm.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ListDeltaConfirmComponent {\n /**\n * Whether the dialog is rendered. Bound via the same getter/setter\n * pattern used by the sibling share dialog so consumers can drive\n * visibility from a parent state machine.\n */\n @Input()\n get Visible(): boolean {\n return this._visible;\n }\n set Visible(value: boolean) {\n if (this._visible !== value) {\n this._visible = value;\n // Reset the acknowledgement when re-opening so a previous session's\n // confirmation doesn't carry over to a new delta.\n if (value) this.dropAcknowledged = false;\n }\n }\n private _visible = false;\n\n /** The delta to confirm. Required — the component renders nothing useful without it. */\n @Input() Delta: ListDelta | null = null;\n\n /**\n * Human-readable name of the target list. Optional; the dialog falls\n * back to \"this list\" if not provided.\n */\n @Input() TargetListName: string | null = null;\n\n /**\n * Optional descriptor of the source for display (\"Q4 Donor View\", etc.).\n * Has no functional effect — purely for the warning copy.\n */\n @Input() SourceLabel: string | null = null;\n\n /**\n * How many preview records to render in the \"first N of …\" lists.\n * Larger deltas could otherwise blow up the DOM.\n */\n @Input() PreviewLimit = 5;\n\n /** Fires when the user confirms — payload is the validated delta token. */\n @Output() Confirm = new EventEmitter<string>();\n\n /** Fires when the user cancels (close button, ESC, or Cancel button). */\n @Output() Cancel = new EventEmitter<void>();\n\n /** Local UI state for the acknowledgement checkbox in drop-warning mode. */\n public dropAcknowledged = false;\n\n public get hasDrops(): boolean {\n return (this.Delta?.Counts.Remove ?? 0) > 0;\n }\n\n public get canConfirm(): boolean {\n if (!this.Delta) return false;\n if (!this.hasDrops) return true;\n return this.dropAcknowledged;\n }\n\n public get previewAdds(): string[] {\n return this.Delta?.ToAdd.slice(0, this.PreviewLimit) ?? [];\n }\n\n public get previewRemoves(): string[] {\n return this.Delta?.ToRemove.slice(0, this.PreviewLimit) ?? [];\n }\n\n public get confirmButtonLabel(): string {\n if (!this.Delta) return 'Confirm';\n if (this.hasDrops) return `Confirm Removal & Update`;\n return `Confirm (Add ${this.Delta.Counts.Add})`;\n }\n\n public get targetDisplayName(): string {\n return this.TargetListName ?? 'this list';\n }\n\n public OnConfirm(): void {\n if (!this.canConfirm || !this.Delta) return;\n this.Confirm.emit(this.Delta.DeltaToken);\n }\n\n public OnCancel(): void {\n this.Cancel.emit();\n }\n\n public OnAcknowledgementToggle(value: boolean): void {\n this.dropAcknowledged = value;\n }\n}\n","@if (Visible && Delta) {\n <mj-dialog\n [Visible]=\"true\"\n [Width]=\"720\"\n [Title]=\"hasDrops ? 'Confirm List Update — Records Will Be Removed' : 'Confirm List Update'\"\n (Close)=\"OnCancel()\">\n <div class=\"delta-confirm-body\" [class.delta-confirm-body--danger]=\"hasDrops\">\n <div class=\"delta-confirm-intro\">\n @if (hasDrops) {\n Refreshing <strong>{{ targetDisplayName }}</strong> will reconcile against the source.\n Records that are no longer present in the source will be removed.\n } @else {\n You're about to apply this change to <strong>{{ targetDisplayName }}</strong>.\n }\n </div>\n\n <div class=\"delta-summary\">\n <div class=\"delta-tile delta-tile--add\">\n <div class=\"delta-tile__count\">+{{ Delta.Counts.Add }}</div>\n <div class=\"delta-tile__label\">To Add</div>\n </div>\n <div class=\"delta-tile delta-tile--keep\">\n <div class=\"delta-tile__count\">{{ Delta.Counts.Unchanged }}</div>\n <div class=\"delta-tile__label\">Unchanged</div>\n </div>\n <div class=\"delta-tile\"\n [class.delta-tile--remove]=\"hasDrops\"\n [class.delta-tile--remove-empty]=\"!hasDrops\">\n <div class=\"delta-tile__count\">{{ hasDrops ? '−' : '' }}{{ Delta.Counts.Remove }}</div>\n <div class=\"delta-tile__label\">To Remove</div>\n </div>\n </div>\n\n @if (!hasDrops) {\n <mj-alert Variant=\"success\">Safe operation — no records will be removed from the list.</mj-alert>\n } @else {\n <mj-alert Variant=\"error\">\n <div class=\"delta-banner__copy\">\n <div>\n <strong>{{ Delta.Counts.Remove }} record(s) will be removed from this list.</strong>\n @if (SourceLabel) {\n These records are members today but are no longer matched by the source\n <em>\"{{ SourceLabel }}\"</em>.\n } @else {\n These records are members today but are no longer matched by the configured source.\n }\n </div>\n <label class=\"delta-banner__ack\">\n <input type=\"checkbox\"\n [checked]=\"dropAcknowledged\"\n (change)=\"OnAcknowledgementToggle($any($event.target).checked)\">\n <span>I understand {{ Delta.Counts.Remove }} record(s) will be removed</span>\n </label>\n </div>\n </mj-alert>\n }\n\n @if (previewAdds.length > 0) {\n <div class=\"delta-section-label\">\n Preview — records being added (first {{ previewAdds.length }} of {{ Delta.Counts.Add }})\n </div>\n <ul class=\"delta-preview\">\n @for (id of previewAdds; track id) {\n <li class=\"delta-preview__row delta-preview__row--add\">\n <i class=\"fa-solid fa-user-plus\"></i>\n <span class=\"delta-preview__id\">{{ id }}</span>\n </li>\n }\n </ul>\n }\n\n @if (previewRemoves.length > 0) {\n <div class=\"delta-section-label\">\n Preview — records being removed (first {{ previewRemoves.length }} of {{ Delta.Counts.Remove }})\n </div>\n <ul class=\"delta-preview\">\n @for (id of previewRemoves; track id) {\n <li class=\"delta-preview__row delta-preview__row--remove\">\n <i class=\"fa-solid fa-user-minus\"></i>\n <span class=\"delta-preview__id\">{{ id }}</span>\n </li>\n }\n </ul>\n <div class=\"delta-footnote\">\n <i class=\"fa-solid fa-clock-rotate-left\"></i>\n Removed records are logged in the audit log and can be re-added manually if needed.\n </div>\n }\n </div>\n\n <mj-dialog-actions>\n <button mjButton\n [variant]=\"hasDrops ? 'danger' : 'primary'\"\n [disabled]=\"!canConfirm\"\n (click)=\"OnConfirm()\">\n <i class=\"fa-solid fa-check\"></i>\n {{ confirmButtonLabel }}\n </button>\n <button mjButton variant=\"outline\" (click)=\"OnCancel()\">Cancel</button>\n <span class=\"delta-token-hint\">\n @if (hasDrops && !dropAcknowledged) {\n Confirm button unlocks after acknowledgement\n } @else {\n Delta token valid for 5 min\n }\n </span>\n </mj-dialog-actions>\n </mj-dialog>\n}\n"]}
|