@memberjunction/ng-list-management 6.1.4 → 6.2.0-edge.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/components/audience-source-picker/audience-source-picker.component.d.ts +74 -14
- package/dist/lib/components/audience-source-picker/audience-source-picker.component.d.ts.map +1 -1
- package/dist/lib/components/audience-source-picker/audience-source-picker.component.js +177 -57
- package/dist/lib/components/audience-source-picker/audience-source-picker.component.js.map +1 -1
- package/dist/lib/components/audience-source-summary/audience-source-summary.component.d.ts +7 -1
- package/dist/lib/components/audience-source-summary/audience-source-summary.component.d.ts.map +1 -1
- package/dist/lib/components/audience-source-summary/audience-source-summary.component.js +17 -5
- package/dist/lib/components/audience-source-summary/audience-source-summary.component.js.map +1 -1
- package/dist/lib/components/list-audit-log/list-audit-log.component.d.ts +30 -4
- package/dist/lib/components/list-audit-log/list-audit-log.component.d.ts.map +1 -1
- package/dist/lib/components/list-audit-log/list-audit-log.component.js +54 -14
- package/dist/lib/components/list-audit-log/list-audit-log.component.js.map +1 -1
- package/dist/lib/components/list-delta-confirm/list-delta-confirm.component.d.ts +17 -1
- package/dist/lib/components/list-delta-confirm/list-delta-confirm.component.d.ts.map +1 -1
- package/dist/lib/components/list-delta-confirm/list-delta-confirm.component.js +45 -13
- package/dist/lib/components/list-delta-confirm/list-delta-confirm.component.js.map +1 -1
- package/dist/lib/components/list-invitations/list-invitations.component.d.ts +48 -8
- package/dist/lib/components/list-invitations/list-invitations.component.d.ts.map +1 -1
- package/dist/lib/components/list-invitations/list-invitations.component.js +108 -28
- package/dist/lib/components/list-invitations/list-invitations.component.js.map +1 -1
- package/dist/lib/components/list-management-dialog/list-management-dialog.component.d.ts +123 -15
- package/dist/lib/components/list-management-dialog/list-management-dialog.component.d.ts.map +1 -1
- package/dist/lib/components/list-management-dialog/list-management-dialog.component.js +312 -100
- 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 +128 -14
- 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 +288 -92
- package/dist/lib/components/list-share-dialog/list-share-dialog.component.js.map +1 -1
- package/dist/lib/components/list-stats/list-stats.component.d.ts +32 -6
- package/dist/lib/components/list-stats/list-stats.component.d.ts.map +1 -1
- package/dist/lib/components/list-stats/list-stats.component.js +67 -15
- package/dist/lib/components/list-stats/list-stats.component.js.map +1 -1
- package/dist/lib/components/save-view-as-list-dialog/save-view-as-list-dialog.component.d.ts +44 -8
- package/dist/lib/components/save-view-as-list-dialog/save-view-as-list-dialog.component.d.ts.map +1 -1
- package/dist/lib/components/save-view-as-list-dialog/save-view-as-list-dialog.component.js +100 -28
- package/dist/lib/components/save-view-as-list-dialog/save-view-as-list-dialog.component.js.map +1 -1
- package/dist/lib/components/shared-with-me/shared-with-me.component.d.ts +18 -2
- package/dist/lib/components/shared-with-me/shared-with-me.component.d.ts.map +1 -1
- package/dist/lib/components/shared-with-me/shared-with-me.component.js +41 -9
- package/dist/lib/components/shared-with-me/shared-with-me.component.js.map +1 -1
- package/dist/lib/components/tag-chips/tag-chips.component.d.ts +30 -6
- package/dist/lib/components/tag-chips/tag-chips.component.d.ts.map +1 -1
- package/dist/lib/components/tag-chips/tag-chips.component.js +76 -28
- package/dist/lib/components/tag-chips/tag-chips.component.js.map +1 -1
- package/dist/lib/services/list-management.service.d.ts +25 -1
- package/dist/lib/services/list-management.service.d.ts.map +1 -1
- package/dist/lib/services/list-management.service.js +59 -11
- package/dist/lib/services/list-management.service.js.map +1 -1
- package/dist/lib/services/list-sharing.service.d.ts +42 -1
- package/dist/lib/services/list-sharing.service.d.ts.map +1 -1
- package/dist/lib/services/list-sharing.service.js +85 -17
- package/dist/lib/services/list-sharing.service.js.map +1 -1
- package/package.json +11 -11
package/dist/lib/components/audience-source-summary/audience-source-summary.component.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audience-source-summary.component.js","sourceRoot":"","sources":["../../../../src/lib/components/audience-source-summary/audience-source-summary.component.ts","../../../../src/lib/components/audience-source-summary/audience-source-summary.component.html"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"audience-source-summary.component.js","sourceRoot":"","sources":["../../../../src/lib/components/audience-source-summary/audience-source-summary.component.ts","../../../../src/lib/components/audience-source-summary/audience-source-summary.component.html"],"names":[],"mappings":"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","sourcesContent":["import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, inject } from '@angular/core';\n\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { Metadata } from '@memberjunction/core';\nimport type { MJListEntity, MJUserViewEntity } from '@memberjunction/core-entities';\nimport type { AudienceSource } from '@memberjunction/lists-base';\n\n/**\n * Compact, read-only summary of an `AudienceSource`. Resolves names\n * (list / view → display name) so the user sees the audience as\n * \"VIP Donors Q4 2026 (List, 348 records)\" rather than a raw UUID.\n *\n * Pairs naturally with `AudienceSourcePickerComponent`: bind the same\n * `Source` to both, and the summary reflects the picker's current\n * selection live.\n */\n@Component({\n standalone: false,\n selector: 'mj-audience-source-summary',\n templateUrl: './audience-source-summary.component.html',\n styleUrls: ['./audience-source-summary.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AudienceSourceSummaryComponent extends BaseAngularComponent {\n private readonly cdr = inject(ChangeDetectorRef);\n\n @Input()\n set Source(value: AudienceSource | null) {\n this._source = value;\n if (value) void this.resolveLabel(value);\n else this.label = null;\n }\n get Source(): AudienceSource | null {\n return this._source;\n }\n private _source: AudienceSource | null = null;\n\n /** Optional pre-computed count to surface (e.g., from a prior resolve). */\n @Input() RecordCount: number | null = null;\n\n public label: string | null = null;\n public Icon = 'fa-solid fa-bullseye';\n\n /** @deprecated Use {@link Icon}. */\n public get icon() {\n return this.Icon;\n }\n /** @deprecated Use {@link Icon}. */\n public set icon(value) {\n this.Icon = value;\n }\n\n public get KindLabel(): string {\n if (!this._source) return '';\n if (this._source.kind === 'list') return 'List';\n if (this._source.kind === 'view') return 'View';\n return 'Ad-hoc Filter';\n }\n\n /** @deprecated Use {@link KindLabel}. */\n public get kindLabel(): string {\n return this.KindLabel;\n }\n\n /**\n * Resolve a human-readable label for the source. Names are looked up\n * one-at-a-time; cheap because each picker change fires at most once.\n * Falls back to the underlying ID if the lookup fails — the summary\n * is informational, never load-bearing.\n */\n private async resolveLabel(source: AudienceSource): Promise<void> {\n try {\n // ProviderToUse always resolves (it falls back to the global default itself).\n const md = this.ProviderToUse as unknown as Metadata;\n if (source.kind === 'list') {\n const list = await md.GetEntityObject<MJListEntity>('MJ: Lists', this.ProviderToUse.CurrentUser ?? undefined);\n const loaded = await list.Load(source.listId);\n this.label = loaded ? list.Name : source.listId;\n this.Icon = 'fa-solid fa-list';\n } else if (source.kind === 'view') {\n const view = await md.GetEntityObject<MJUserViewEntity>('MJ: User Views', this.ProviderToUse.CurrentUser ?? undefined);\n const loaded = await view.Load(source.viewId);\n this.label = loaded ? view.Name : source.viewId;\n this.Icon = 'fa-solid fa-eye';\n } else {\n this.label = `${source.entityName} — ${this.truncate(source.extraFilter, 80)}`;\n this.Icon = 'fa-solid fa-filter';\n }\n } catch {\n this.label = '(unable to resolve)';\n } finally {\n this.cdr.markForCheck();\n }\n }\n\n private truncate(s: string, n: number): string {\n return s.length <= n ? s : `${s.slice(0, n - 1)}…`;\n }\n}\n","@if (Source && label) {\n <div class=\"audience-summary\">\n <i [class]=\"icon\"></i>\n <div class=\"audience-summary__body\">\n <div class=\"audience-summary__name\">\n Audience: <strong>{{ label }}</strong>\n </div>\n <div class=\"audience-summary__detail\">\n <span class=\"audience-summary__kind\">{{ kindLabel }}</span>\n @if (RecordCount != null) {\n · resolves to <strong>{{ RecordCount }} record(s)</strong>\n } @else {\n · resolves at execution time\n }\n </div>\n </div>\n </div>\n} @else {\n <div class=\"audience-summary audience-summary--empty\">\n <i class=\"fa-solid fa-bullseye\"></i>\n <span>No audience selected.</span>\n </div>\n}\n"]}
|
|
@@ -27,20 +27,46 @@ export declare class ListAuditLogComponent extends BaseAngularComponent implemen
|
|
|
27
27
|
private _listId;
|
|
28
28
|
/** Max rows to load. Defaults to a sensible 200 for the per-list view. */
|
|
29
29
|
PageSize: number;
|
|
30
|
-
|
|
31
|
-
|
|
30
|
+
Entries: AuditLogRow[];
|
|
31
|
+
/** @deprecated Use {@link Entries}. */
|
|
32
|
+
get entries(): AuditLogRow[];
|
|
33
|
+
/** @deprecated Use {@link Entries}. */
|
|
34
|
+
set entries(value: AuditLogRow[]);
|
|
35
|
+
EventTypes: Array<{
|
|
32
36
|
ID: string;
|
|
33
37
|
Name: string;
|
|
34
38
|
}>;
|
|
35
|
-
|
|
39
|
+
/** @deprecated Use {@link EventTypes}. */
|
|
40
|
+
get eventTypes(): Array<{
|
|
41
|
+
ID: string;
|
|
42
|
+
Name: string;
|
|
43
|
+
}>;
|
|
44
|
+
/** @deprecated Use {@link EventTypes}. */
|
|
45
|
+
set eventTypes(value: Array<{
|
|
46
|
+
ID: string;
|
|
47
|
+
Name: string;
|
|
48
|
+
}>);
|
|
49
|
+
FilterType: string;
|
|
50
|
+
/** @deprecated Use {@link FilterType}. */
|
|
51
|
+
get filterType(): string;
|
|
52
|
+
/** @deprecated Use {@link FilterType}. */
|
|
53
|
+
set filterType(value: string);
|
|
36
54
|
filterText: string;
|
|
37
|
-
|
|
55
|
+
Loading: boolean;
|
|
56
|
+
/** @deprecated Use {@link Loading}. */
|
|
57
|
+
get loading(): boolean;
|
|
58
|
+
/** @deprecated Use {@link Loading}. */
|
|
59
|
+
set loading(value: boolean);
|
|
38
60
|
errorMessage: string | null;
|
|
39
61
|
private initialized;
|
|
40
62
|
ngOnInit(): Promise<void>;
|
|
63
|
+
get VisibleEntries(): AuditLogRow[];
|
|
64
|
+
/** @deprecated Use {@link VisibleEntries}. */
|
|
41
65
|
get visibleEntries(): AuditLogRow[];
|
|
42
66
|
OnFilterChange(): void;
|
|
43
67
|
formatDate(d: Date): string;
|
|
68
|
+
FormatDetails(raw: string | null): string;
|
|
69
|
+
/** @deprecated Use {@link FormatDetails}. */
|
|
44
70
|
formatDetails(raw: string | null): string;
|
|
45
71
|
/**
|
|
46
72
|
* Bulk-load audit-log entries + their type names + user names in three
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list-audit-log.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/list-audit-log/list-audit-log.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgE,MAAM,EAAU,MAAM,eAAe,CAAC;AAE7G,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;;AAGrE;;;;;;;GAOG;AAEH,UAAU,WAAW;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,IAAI,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED,qBAOa,qBAAsB,SAAQ,oBAAqB,YAAW,MAAM;IAC/E,OAAO,CAAC,QAAQ,CAAC,GAAG,CAA6B;IAEjD,uCAAuC;IACvC,IACI,MAAM,IAAI,MAAM,GAAG,IAAI,CAE1B;IACD,IAAI,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,EAO9B;IACD,OAAO,CAAC,OAAO,CAAuB;IAEtC,0EAA0E;IACjE,QAAQ,SAAO;IAEjB,OAAO,EAAE,WAAW,EAAE,CAAM;
|
|
1
|
+
{"version":3,"file":"list-audit-log.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/list-audit-log/list-audit-log.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgE,MAAM,EAAU,MAAM,eAAe,CAAC;AAE7G,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;;AAGrE;;;;;;;GAOG;AAEH,UAAU,WAAW;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,IAAI,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED,qBAOa,qBAAsB,SAAQ,oBAAqB,YAAW,MAAM;IAC/E,OAAO,CAAC,QAAQ,CAAC,GAAG,CAA6B;IAEjD,uCAAuC;IACvC,IACI,MAAM,IAAI,MAAM,GAAG,IAAI,CAE1B;IACD,IAAI,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,EAO9B;IACD,OAAO,CAAC,OAAO,CAAuB;IAEtC,0EAA0E;IACjE,QAAQ,SAAO;IAEjB,OAAO,EAAE,WAAW,EAAE,CAAM;IAEnC,uCAAuC;IACvC,IAAW,OAAO,IAAI,WAAW,EAAE,CAElC;IACD,uCAAuC;IACvC,IAAW,OAAO,CAAC,KAAK,EAAE,WAAW,EAAE,EAEtC;IACM,UAAU,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAM;IAE5D,0CAA0C;IAC1C,IAAW,UAAU,IAAI,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAE3D;IACD,0CAA0C;IAC1C,IAAW,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,EAE/D;IACM,UAAU,SAAM;IAEvB,0CAA0C;IAC1C,IAAW,UAAU,WAEpB;IACD,0CAA0C;IAC1C,IAAW,UAAU,CAAC,KAAK,QAAA,EAE1B;IACM,UAAU,SAAM;IAChB,OAAO,UAAS;IAEvB,uCAAuC;IACvC,IAAW,OAAO,YAEjB;IACD,uCAAuC;IACvC,IAAW,OAAO,CAAC,KAAK,SAAA,EAEvB;IACM,YAAY,EAAE,MAAM,GAAG,IAAI,CAAQ;IAE1C,OAAO,CAAC,WAAW,CAAS;IAEtB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAK/B,IAAW,cAAc,IAAI,WAAW,EAAE,CAUzC;IAED,8CAA8C;IAC9C,IAAW,cAAc,IAAI,WAAW,EAAE,CAEzC;IAEM,cAAc,IAAI,IAAI;IAItB,UAAU,CAAC,CAAC,EAAE,IAAI,GAAG,MAAM;IAI3B,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM;IAUhD,6CAA6C;IACtC,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM;IAIhD;;;;OAIG;YACW,WAAW;yCApHd,qBAAqB;2CAArB,qBAAqB;CAyMjC"}
|
|
@@ -116,11 +116,43 @@ export class ListAuditLogComponent extends BaseAngularComponent {
|
|
|
116
116
|
_listId = null;
|
|
117
117
|
/** Max rows to load. Defaults to a sensible 200 for the per-list view. */
|
|
118
118
|
PageSize = 200;
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
119
|
+
Entries = [];
|
|
120
|
+
/** @deprecated Use {@link Entries}. */
|
|
121
|
+
get entries() {
|
|
122
|
+
return this.Entries;
|
|
123
|
+
}
|
|
124
|
+
/** @deprecated Use {@link Entries}. */
|
|
125
|
+
set entries(value) {
|
|
126
|
+
this.Entries = value;
|
|
127
|
+
}
|
|
128
|
+
EventTypes = [];
|
|
129
|
+
/** @deprecated Use {@link EventTypes}. */
|
|
130
|
+
get eventTypes() {
|
|
131
|
+
return this.EventTypes;
|
|
132
|
+
}
|
|
133
|
+
/** @deprecated Use {@link EventTypes}. */
|
|
134
|
+
set eventTypes(value) {
|
|
135
|
+
this.EventTypes = value;
|
|
136
|
+
}
|
|
137
|
+
FilterType = '';
|
|
138
|
+
/** @deprecated Use {@link FilterType}. */
|
|
139
|
+
get filterType() {
|
|
140
|
+
return this.FilterType;
|
|
141
|
+
}
|
|
142
|
+
/** @deprecated Use {@link FilterType}. */
|
|
143
|
+
set filterType(value) {
|
|
144
|
+
this.FilterType = value;
|
|
145
|
+
}
|
|
122
146
|
filterText = '';
|
|
123
|
-
|
|
147
|
+
Loading = false;
|
|
148
|
+
/** @deprecated Use {@link Loading}. */
|
|
149
|
+
get loading() {
|
|
150
|
+
return this.Loading;
|
|
151
|
+
}
|
|
152
|
+
/** @deprecated Use {@link Loading}. */
|
|
153
|
+
set loading(value) {
|
|
154
|
+
this.Loading = value;
|
|
155
|
+
}
|
|
124
156
|
errorMessage = null;
|
|
125
157
|
initialized = false;
|
|
126
158
|
async ngOnInit() {
|
|
@@ -128,10 +160,10 @@ export class ListAuditLogComponent extends BaseAngularComponent {
|
|
|
128
160
|
if (this._listId)
|
|
129
161
|
await this.loadEntries();
|
|
130
162
|
}
|
|
131
|
-
get
|
|
163
|
+
get VisibleEntries() {
|
|
132
164
|
const term = this.filterText.trim().toLowerCase();
|
|
133
|
-
return this.
|
|
134
|
-
if (this.
|
|
165
|
+
return this.Entries.filter((e) => {
|
|
166
|
+
if (this.FilterType && e.AuditLogTypeID !== this.FilterType)
|
|
135
167
|
return false;
|
|
136
168
|
if (term) {
|
|
137
169
|
const hay = `${e.Description} ${e.UserName}`.toLowerCase();
|
|
@@ -141,13 +173,17 @@ export class ListAuditLogComponent extends BaseAngularComponent {
|
|
|
141
173
|
return true;
|
|
142
174
|
});
|
|
143
175
|
}
|
|
176
|
+
/** @deprecated Use {@link VisibleEntries}. */
|
|
177
|
+
get visibleEntries() {
|
|
178
|
+
return this.VisibleEntries;
|
|
179
|
+
}
|
|
144
180
|
OnFilterChange() {
|
|
145
181
|
this.cdr.markForCheck();
|
|
146
182
|
}
|
|
147
183
|
formatDate(d) {
|
|
148
184
|
return d.toLocaleString();
|
|
149
185
|
}
|
|
150
|
-
|
|
186
|
+
FormatDetails(raw) {
|
|
151
187
|
if (!raw)
|
|
152
188
|
return '';
|
|
153
189
|
try {
|
|
@@ -158,6 +194,10 @@ export class ListAuditLogComponent extends BaseAngularComponent {
|
|
|
158
194
|
return raw;
|
|
159
195
|
}
|
|
160
196
|
}
|
|
197
|
+
/** @deprecated Use {@link FormatDetails}. */
|
|
198
|
+
formatDetails(raw) {
|
|
199
|
+
return this.FormatDetails(raw);
|
|
200
|
+
}
|
|
161
201
|
/**
|
|
162
202
|
* Bulk-load audit-log entries + their type names + user names in three
|
|
163
203
|
* RunViews via the batch helper so the UI only spins once. We then
|
|
@@ -166,7 +206,7 @@ export class ListAuditLogComponent extends BaseAngularComponent {
|
|
|
166
206
|
async loadEntries() {
|
|
167
207
|
if (!this._listId)
|
|
168
208
|
return;
|
|
169
|
-
this.
|
|
209
|
+
this.Loading = true;
|
|
170
210
|
this.errorMessage = null;
|
|
171
211
|
this.cdr.markForCheck();
|
|
172
212
|
try {
|
|
@@ -185,7 +225,7 @@ export class ListAuditLogComponent extends BaseAngularComponent {
|
|
|
185
225
|
});
|
|
186
226
|
if (!logs.Success) {
|
|
187
227
|
this.errorMessage = logs.ErrorMessage ?? 'Failed to load audit logs';
|
|
188
|
-
this.
|
|
228
|
+
this.Entries = [];
|
|
189
229
|
return;
|
|
190
230
|
}
|
|
191
231
|
const rows = logs.Results ?? [];
|
|
@@ -215,7 +255,7 @@ export class ListAuditLogComponent extends BaseAngularComponent {
|
|
|
215
255
|
const typeById = new Map();
|
|
216
256
|
for (const t of types.Results ?? [])
|
|
217
257
|
typeById.set(String(t.ID), String(t.Name));
|
|
218
|
-
this.
|
|
258
|
+
this.Entries = rows.map((r) => ({
|
|
219
259
|
ID: String(r.ID),
|
|
220
260
|
EventDate: new Date(r.__mj_CreatedAt),
|
|
221
261
|
UserID: String(r.UserID),
|
|
@@ -226,16 +266,16 @@ export class ListAuditLogComponent extends BaseAngularComponent {
|
|
|
226
266
|
Details: r.Details,
|
|
227
267
|
}));
|
|
228
268
|
// Populate the event-type dropdown with only types we actually have.
|
|
229
|
-
this.
|
|
269
|
+
this.EventTypes = [...typeById.entries()]
|
|
230
270
|
.map(([ID, Name]) => ({ ID, Name }))
|
|
231
271
|
.sort((a, b) => a.Name.localeCompare(b.Name));
|
|
232
272
|
}
|
|
233
273
|
catch (e) {
|
|
234
274
|
this.errorMessage = e instanceof Error ? e.message : String(e);
|
|
235
|
-
this.
|
|
275
|
+
this.Entries = [];
|
|
236
276
|
}
|
|
237
277
|
finally {
|
|
238
|
-
this.
|
|
278
|
+
this.Loading = false;
|
|
239
279
|
this.cdr.markForCheck();
|
|
240
280
|
}
|
|
241
281
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list-audit-log.component.js","sourceRoot":"","sources":["../../../../src/lib/components/list-audit-log/list-audit-log.component.ts","../../../../src/lib/components/list-audit-log/list-audit-log.component.html"],"names":[],"mappings":"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","sourcesContent":["import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnInit, inject } from '@angular/core';\n\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { RunView } from '@memberjunction/core';\n\n/**\n * Audit log view for a single List (mockup 18). Reads from the generic\n * `MJ: Audit Logs` entity, scoped to this list via `EntityID` (the MJ:\n * Lists entity row) + `RecordID` = the list ID. The event-type dropdown\n * is populated lazily from the audit-log-type rows actually present in\n * the data — keeps the UI honest about what events have happened\n * (instead of showing filter options that never match).\n */\n\ninterface AuditLogRow {\n ID: string;\n EventDate: Date;\n UserID: string;\n UserName: string;\n AuditLogTypeID: string;\n EventType: string;\n Description: string;\n Details: string | null;\n}\n\n@Component({\n standalone: false,\n selector: 'mj-list-audit-log',\n templateUrl: './list-audit-log.component.html',\n styleUrls: ['./list-audit-log.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ListAuditLogComponent extends BaseAngularComponent implements OnInit {\n private readonly cdr = inject(ChangeDetectorRef);\n\n /** ListID we're auditing. Required. */\n @Input()\n get ListID(): string | null {\n return this._listId;\n }\n set ListID(value: string | null) {\n if (this._listId !== value) {\n this._listId = value;\n if (value && this.initialized) {\n void this.loadEntries();\n }\n }\n }\n private _listId: string | null = null;\n\n /** Max rows to load. Defaults to a sensible 200 for the per-list view. */\n @Input() PageSize = 200;\n\n public entries: AuditLogRow[] = [];\n public eventTypes: Array<{ ID: string; Name: string }> = [];\n public filterType = '';\n public filterText = '';\n public loading = false;\n public errorMessage: string | null = null;\n\n private initialized = false;\n\n async ngOnInit(): Promise<void> {\n this.initialized = true;\n if (this._listId) await this.loadEntries();\n }\n\n public get visibleEntries(): AuditLogRow[] {\n const term = this.filterText.trim().toLowerCase();\n return this.entries.filter((e) => {\n if (this.filterType && e.AuditLogTypeID !== this.filterType) return false;\n if (term) {\n const hay = `${e.Description} ${e.UserName}`.toLowerCase();\n if (!hay.includes(term)) return false;\n }\n return true;\n });\n }\n\n public OnFilterChange(): void {\n this.cdr.markForCheck();\n }\n\n public formatDate(d: Date): string {\n return d.toLocaleString();\n }\n\n public formatDetails(raw: string | null): string {\n if (!raw) return '';\n try {\n const parsed = JSON.parse(raw);\n return JSON.stringify(parsed, null, 2);\n } catch {\n return raw;\n }\n }\n\n /**\n * Bulk-load audit-log entries + their type names + user names in three\n * RunViews via the batch helper so the UI only spins once. We then\n * compose the joined view in memory (1k rows × 3 lookups stays cheap).\n */\n private async loadEntries(): Promise<void> {\n if (!this._listId) return;\n this.loading = true;\n this.errorMessage = null;\n this.cdr.markForCheck();\n\n try {\n const md = this.ProviderToUse;\n const listsEntity = md.Entities.find((e) => e.Name === 'MJ: Lists');\n if (!listsEntity) throw new Error('MJ: Lists entity not found in metadata');\n\n const rv = RunView.FromMetadataProvider(md);\n const logs = await rv.RunView<{\n ID: string;\n UserID: string;\n AuditLogTypeID: string;\n Description: string | null;\n Details: string | null;\n __mj_CreatedAt: Date;\n }>({\n EntityName: 'MJ: Audit Logs',\n ExtraFilter: `EntityID='${listsEntity.ID}' AND RecordID='${this._listId.replace(/'/g, \"''\")}'`,\n OrderBy: '__mj_CreatedAt DESC',\n MaxRows: this.PageSize,\n Fields: ['ID', 'UserID', 'AuditLogTypeID', 'Description', 'Details', '__mj_CreatedAt'],\n ResultType: 'simple',\n });\n\n if (!logs.Success) {\n this.errorMessage = logs.ErrorMessage ?? 'Failed to load audit logs';\n this.entries = [];\n return;\n }\n\n const rows = logs.Results ?? [];\n const userIds = Array.from(new Set(rows.map((r) => String(r.UserID))));\n const typeIds = Array.from(new Set(rows.map((r) => String(r.AuditLogTypeID))));\n\n const [users, types] = await Promise.all([\n userIds.length > 0\n ? rv.RunView<{ ID: string; Name: string }>({\n EntityName: 'MJ: Users',\n ExtraFilter: `ID IN (${userIds.map((id) => `'${id}'`).join(',')})`,\n Fields: ['ID', 'Name'],\n ResultType: 'simple',\n })\n : Promise.resolve({ Success: true, Results: [] }),\n typeIds.length > 0\n ? rv.RunView<{ ID: string; Name: string }>({\n EntityName: 'MJ: Audit Log Types',\n ExtraFilter: `ID IN (${typeIds.map((id) => `'${id}'`).join(',')})`,\n Fields: ['ID', 'Name'],\n ResultType: 'simple',\n })\n : Promise.resolve({ Success: true, Results: [] }),\n ]);\n\n const userById = new Map<string, string>();\n for (const u of users.Results ?? []) userById.set(String(u.ID), String(u.Name));\n const typeById = new Map<string, string>();\n for (const t of types.Results ?? []) typeById.set(String(t.ID), String(t.Name));\n\n this.entries = rows.map((r) => ({\n ID: String(r.ID),\n EventDate: new Date(r.__mj_CreatedAt),\n UserID: String(r.UserID),\n UserName: userById.get(String(r.UserID)) ?? '(unknown user)',\n AuditLogTypeID: String(r.AuditLogTypeID),\n EventType: typeById.get(String(r.AuditLogTypeID)) ?? '(unknown event)',\n Description: r.Description ?? '',\n Details: r.Details,\n }));\n\n // Populate the event-type dropdown with only types we actually have.\n this.eventTypes = [...typeById.entries()]\n .map(([ID, Name]) => ({ ID, Name }))\n .sort((a, b) => a.Name.localeCompare(b.Name));\n } catch (e) {\n this.errorMessage = e instanceof Error ? e.message : String(e);\n this.entries = [];\n } finally {\n this.loading = false;\n this.cdr.markForCheck();\n }\n }\n}\n","<div class=\"audit-log\">\n <div class=\"audit-log__toolbar\">\n <div class=\"audit-search\">\n <i class=\"fa-solid fa-search\"></i>\n <input\n class=\"mj-input\"\n type=\"text\"\n [(ngModel)]=\"filterText\"\n (ngModelChange)=\"OnFilterChange()\"\n placeholder=\"Filter by description or user…\" />\n </div>\n <select\n class=\"mj-input mj-select\"\n [(ngModel)]=\"filterType\"\n (ngModelChange)=\"OnFilterChange()\"\n title=\"Filter by event type\">\n <option value=\"\">All Events</option>\n @for (t of eventTypes; track t.ID) {\n <option [value]=\"t.ID\">{{ t.Name }}</option>\n }\n </select>\n </div>\n\n @if (loading) {\n <div class=\"audit-state\">\n <mj-loading text=\"Loading audit log...\" size=\"medium\"></mj-loading>\n </div>\n } @else if (errorMessage) {\n <div class=\"audit-state audit-state--error\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n {{ errorMessage }}\n </div>\n } @else if (visibleEntries.length === 0) {\n <div class=\"audit-state audit-state--empty\">\n <i class=\"fa-solid fa-clock-rotate-left\"></i>\n <span>No audit log entries match the current filters.</span>\n </div>\n } @else {\n <table class=\"audit-table\">\n <thead>\n <tr>\n <th>When</th>\n <th>Who</th>\n <th>Event</th>\n <th>Description</th>\n </tr>\n </thead>\n <tbody>\n @for (entry of visibleEntries; track entry.ID) {\n <tr>\n <td class=\"audit-cell-date\">{{ formatDate(entry.EventDate) }}</td>\n <td class=\"audit-cell-user\">{{ entry.UserName }}</td>\n <td>\n <span class=\"event-chip\">{{ entry.EventType }}</span>\n </td>\n <td class=\"audit-cell-description\">\n {{ entry.Description }}\n @if (entry.Details) {\n <details class=\"details-toggle\">\n <summary>details</summary>\n <pre>{{ formatDetails(entry.Details) }}</pre>\n </details>\n }\n </td>\n </tr>\n }\n </tbody>\n </table>\n }\n</div>\n"]}
|
|
1
|
+
{"version":3,"file":"list-audit-log.component.js","sourceRoot":"","sources":["../../../../src/lib/components/list-audit-log/list-audit-log.component.ts","../../../../src/lib/components/list-audit-log/list-audit-log.component.html"],"names":[],"mappings":"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","sourcesContent":["import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnInit, inject } from '@angular/core';\n\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { RunView } from '@memberjunction/core';\n\n/**\n * Audit log view for a single List (mockup 18). Reads from the generic\n * `MJ: Audit Logs` entity, scoped to this list via `EntityID` (the MJ:\n * Lists entity row) + `RecordID` = the list ID. The event-type dropdown\n * is populated lazily from the audit-log-type rows actually present in\n * the data — keeps the UI honest about what events have happened\n * (instead of showing filter options that never match).\n */\n\ninterface AuditLogRow {\n ID: string;\n EventDate: Date;\n UserID: string;\n UserName: string;\n AuditLogTypeID: string;\n EventType: string;\n Description: string;\n Details: string | null;\n}\n\n@Component({\n standalone: false,\n selector: 'mj-list-audit-log',\n templateUrl: './list-audit-log.component.html',\n styleUrls: ['./list-audit-log.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ListAuditLogComponent extends BaseAngularComponent implements OnInit {\n private readonly cdr = inject(ChangeDetectorRef);\n\n /** ListID we're auditing. Required. */\n @Input()\n get ListID(): string | null {\n return this._listId;\n }\n set ListID(value: string | null) {\n if (this._listId !== value) {\n this._listId = value;\n if (value && this.initialized) {\n void this.loadEntries();\n }\n }\n }\n private _listId: string | null = null;\n\n /** Max rows to load. Defaults to a sensible 200 for the per-list view. */\n @Input() PageSize = 200;\n\n public Entries: AuditLogRow[] = [];\n\n /** @deprecated Use {@link Entries}. */\n public get entries(): AuditLogRow[] {\n return this.Entries;\n }\n /** @deprecated Use {@link Entries}. */\n public set entries(value: AuditLogRow[]) {\n this.Entries = value;\n }\n public EventTypes: Array<{ ID: string; Name: string }> = [];\n\n /** @deprecated Use {@link EventTypes}. */\n public get eventTypes(): Array<{ ID: string; Name: string }> {\n return this.EventTypes;\n }\n /** @deprecated Use {@link EventTypes}. */\n public set eventTypes(value: Array<{ ID: string; Name: string }>) {\n this.EventTypes = value;\n }\n public FilterType = '';\n\n /** @deprecated Use {@link FilterType}. */\n public get filterType() {\n return this.FilterType;\n }\n /** @deprecated Use {@link FilterType}. */\n public set filterType(value) {\n this.FilterType = value;\n }\n public filterText = '';\n public Loading = false;\n\n /** @deprecated Use {@link Loading}. */\n public get loading() {\n return this.Loading;\n }\n /** @deprecated Use {@link Loading}. */\n public set loading(value) {\n this.Loading = value;\n }\n public errorMessage: string | null = null;\n\n private initialized = false;\n\n async ngOnInit(): Promise<void> {\n this.initialized = true;\n if (this._listId) await this.loadEntries();\n }\n\n public get VisibleEntries(): AuditLogRow[] {\n const term = this.filterText.trim().toLowerCase();\n return this.Entries.filter((e) => {\n if (this.FilterType && e.AuditLogTypeID !== this.FilterType) return false;\n if (term) {\n const hay = `${e.Description} ${e.UserName}`.toLowerCase();\n if (!hay.includes(term)) return false;\n }\n return true;\n });\n }\n\n /** @deprecated Use {@link VisibleEntries}. */\n public get visibleEntries(): AuditLogRow[] {\n return this.VisibleEntries;\n }\n\n public OnFilterChange(): void {\n this.cdr.markForCheck();\n }\n\n public formatDate(d: Date): string {\n return d.toLocaleString();\n }\n\n public FormatDetails(raw: string | null): string {\n if (!raw) return '';\n try {\n const parsed = JSON.parse(raw);\n return JSON.stringify(parsed, null, 2);\n } catch {\n return raw;\n }\n }\n\n /** @deprecated Use {@link FormatDetails}. */\n public formatDetails(raw: string | null): string {\n return this.FormatDetails(raw);\n }\n\n /**\n * Bulk-load audit-log entries + their type names + user names in three\n * RunViews via the batch helper so the UI only spins once. We then\n * compose the joined view in memory (1k rows × 3 lookups stays cheap).\n */\n private async loadEntries(): Promise<void> {\n if (!this._listId) return;\n this.Loading = true;\n this.errorMessage = null;\n this.cdr.markForCheck();\n\n try {\n const md = this.ProviderToUse;\n const listsEntity = md.Entities.find((e) => e.Name === 'MJ: Lists');\n if (!listsEntity) throw new Error('MJ: Lists entity not found in metadata');\n\n const rv = RunView.FromMetadataProvider(md);\n const logs = await rv.RunView<{\n ID: string;\n UserID: string;\n AuditLogTypeID: string;\n Description: string | null;\n Details: string | null;\n __mj_CreatedAt: Date;\n }>({\n EntityName: 'MJ: Audit Logs',\n ExtraFilter: `EntityID='${listsEntity.ID}' AND RecordID='${this._listId.replace(/'/g, \"''\")}'`,\n OrderBy: '__mj_CreatedAt DESC',\n MaxRows: this.PageSize,\n Fields: ['ID', 'UserID', 'AuditLogTypeID', 'Description', 'Details', '__mj_CreatedAt'],\n ResultType: 'simple',\n });\n\n if (!logs.Success) {\n this.errorMessage = logs.ErrorMessage ?? 'Failed to load audit logs';\n this.Entries = [];\n return;\n }\n\n const rows = logs.Results ?? [];\n const userIds = Array.from(new Set(rows.map((r) => String(r.UserID))));\n const typeIds = Array.from(new Set(rows.map((r) => String(r.AuditLogTypeID))));\n\n const [users, types] = await Promise.all([\n userIds.length > 0\n ? rv.RunView<{ ID: string; Name: string }>({\n EntityName: 'MJ: Users',\n ExtraFilter: `ID IN (${userIds.map((id) => `'${id}'`).join(',')})`,\n Fields: ['ID', 'Name'],\n ResultType: 'simple',\n })\n : Promise.resolve({ Success: true, Results: [] }),\n typeIds.length > 0\n ? rv.RunView<{ ID: string; Name: string }>({\n EntityName: 'MJ: Audit Log Types',\n ExtraFilter: `ID IN (${typeIds.map((id) => `'${id}'`).join(',')})`,\n Fields: ['ID', 'Name'],\n ResultType: 'simple',\n })\n : Promise.resolve({ Success: true, Results: [] }),\n ]);\n\n const userById = new Map<string, string>();\n for (const u of users.Results ?? []) userById.set(String(u.ID), String(u.Name));\n const typeById = new Map<string, string>();\n for (const t of types.Results ?? []) typeById.set(String(t.ID), String(t.Name));\n\n this.Entries = rows.map((r) => ({\n ID: String(r.ID),\n EventDate: new Date(r.__mj_CreatedAt),\n UserID: String(r.UserID),\n UserName: userById.get(String(r.UserID)) ?? '(unknown user)',\n AuditLogTypeID: String(r.AuditLogTypeID),\n EventType: typeById.get(String(r.AuditLogTypeID)) ?? '(unknown event)',\n Description: r.Description ?? '',\n Details: r.Details,\n }));\n\n // Populate the event-type dropdown with only types we actually have.\n this.EventTypes = [...typeById.entries()]\n .map(([ID, Name]) => ({ ID, Name }))\n .sort((a, b) => a.Name.localeCompare(b.Name));\n } catch (e) {\n this.errorMessage = e instanceof Error ? e.message : String(e);\n this.Entries = [];\n } finally {\n this.Loading = false;\n this.cdr.markForCheck();\n }\n }\n}\n","<div class=\"audit-log\">\n <div class=\"audit-log__toolbar\">\n <div class=\"audit-search\">\n <i class=\"fa-solid fa-search\"></i>\n <input\n class=\"mj-input\"\n type=\"text\"\n [(ngModel)]=\"filterText\"\n (ngModelChange)=\"OnFilterChange()\"\n placeholder=\"Filter by description or user…\" />\n </div>\n <select\n class=\"mj-input mj-select\"\n [(ngModel)]=\"filterType\"\n (ngModelChange)=\"OnFilterChange()\"\n title=\"Filter by event type\">\n <option value=\"\">All Events</option>\n @for (t of eventTypes; track t.ID) {\n <option [value]=\"t.ID\">{{ t.Name }}</option>\n }\n </select>\n </div>\n\n @if (loading) {\n <div class=\"audit-state\">\n <mj-loading text=\"Loading audit log...\" size=\"medium\"></mj-loading>\n </div>\n } @else if (errorMessage) {\n <div class=\"audit-state audit-state--error\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n {{ errorMessage }}\n </div>\n } @else if (visibleEntries.length === 0) {\n <div class=\"audit-state audit-state--empty\">\n <i class=\"fa-solid fa-clock-rotate-left\"></i>\n <span>No audit log entries match the current filters.</span>\n </div>\n } @else {\n <table class=\"audit-table\">\n <thead>\n <tr>\n <th>When</th>\n <th>Who</th>\n <th>Event</th>\n <th>Description</th>\n </tr>\n </thead>\n <tbody>\n @for (entry of visibleEntries; track entry.ID) {\n <tr>\n <td class=\"audit-cell-date\">{{ formatDate(entry.EventDate) }}</td>\n <td class=\"audit-cell-user\">{{ entry.UserName }}</td>\n <td>\n <span class=\"event-chip\">{{ entry.EventType }}</span>\n </td>\n <td class=\"audit-cell-description\">\n {{ entry.Description }}\n @if (entry.Details) {\n <details class=\"details-toggle\">\n <summary>details</summary>\n <pre>{{ formatDetails(entry.Details) }}</pre>\n </details>\n }\n </td>\n </tr>\n }\n </tbody>\n </table>\n }\n</div>\n"]}
|
|
@@ -48,12 +48,28 @@ export declare class ListDeltaConfirmComponent {
|
|
|
48
48
|
/** Fires when the user cancels (close button, ESC, or Cancel button). */
|
|
49
49
|
Cancel: EventEmitter<void>;
|
|
50
50
|
/** Local UI state for the acknowledgement checkbox in drop-warning mode. */
|
|
51
|
-
|
|
51
|
+
DropAcknowledged: boolean;
|
|
52
|
+
/** @deprecated Use {@link DropAcknowledged}. */
|
|
53
|
+
get dropAcknowledged(): boolean;
|
|
54
|
+
/** @deprecated Use {@link DropAcknowledged}. */
|
|
55
|
+
set dropAcknowledged(value: boolean);
|
|
56
|
+
get HasDrops(): boolean;
|
|
57
|
+
/** @deprecated Use {@link HasDrops}. */
|
|
52
58
|
get hasDrops(): boolean;
|
|
59
|
+
get CanConfirm(): boolean;
|
|
60
|
+
/** @deprecated Use {@link CanConfirm}. */
|
|
53
61
|
get canConfirm(): boolean;
|
|
62
|
+
get PreviewAdds(): string[];
|
|
63
|
+
/** @deprecated Use {@link PreviewAdds}. */
|
|
54
64
|
get previewAdds(): string[];
|
|
65
|
+
get PreviewRemoves(): string[];
|
|
66
|
+
/** @deprecated Use {@link PreviewRemoves}. */
|
|
55
67
|
get previewRemoves(): string[];
|
|
68
|
+
get ConfirmButtonLabel(): string;
|
|
69
|
+
/** @deprecated Use {@link ConfirmButtonLabel}. */
|
|
56
70
|
get confirmButtonLabel(): string;
|
|
71
|
+
get TargetDisplayName(): string;
|
|
72
|
+
/** @deprecated Use {@link TargetDisplayName}. */
|
|
57
73
|
get targetDisplayName(): string;
|
|
58
74
|
OnConfirm(): void;
|
|
59
75
|
OnCancel(): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list-delta-confirm.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/list-delta-confirm/list-delta-confirm.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsC,YAAY,EAAiB,MAAM,eAAe,CAAC;AAEhG,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;;AAE5D;;;;;;;;;;;;;;;GAeG;AACH,qBAOa,yBAAyB;IACpC;;;;OAIG;IACH,IACI,OAAO,IAAI,OAAO,CAErB;IACD,IAAI,OAAO,CAAC,KAAK,EAAE,OAAO,EAOzB;IACD,OAAO,CAAC,QAAQ,CAAS;IAEzB,wFAAwF;IAC/E,KAAK,EAAE,SAAS,GAAG,IAAI,CAAQ;IAExC;;;OAGG;IACM,cAAc,EAAE,MAAM,GAAG,IAAI,CAAQ;IAE9C;;;OAGG;IACM,WAAW,EAAE,MAAM,GAAG,IAAI,CAAQ;IAE3C;;;OAGG;IACM,YAAY,SAAK;IAE1B,2EAA2E;IACjE,OAAO,uBAA8B;IAE/C,yEAAyE;IAC/D,MAAM,qBAA4B;IAE5C,4EAA4E;IACrE,gBAAgB,UAAS;IAEhC,IAAW,QAAQ,IAAI,OAAO,CAE7B;IAED,IAAW,UAAU,IAAI,OAAO,CAI/B;IAED,IAAW,WAAW,IAAI,MAAM,EAAE,CAEjC;IAED,IAAW,cAAc,IAAI,MAAM,EAAE,CAEpC;IAED,IAAW,kBAAkB,IAAI,MAAM,CAItC;IAED,IAAW,iBAAiB,IAAI,MAAM,CAErC;IAEM,SAAS,IAAI,IAAI;IAKjB,QAAQ,IAAI,IAAI;IAIhB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;
|
|
1
|
+
{"version":3,"file":"list-delta-confirm.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/list-delta-confirm/list-delta-confirm.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsC,YAAY,EAAiB,MAAM,eAAe,CAAC;AAEhG,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;;AAE5D;;;;;;;;;;;;;;;GAeG;AACH,qBAOa,yBAAyB;IACpC;;;;OAIG;IACH,IACI,OAAO,IAAI,OAAO,CAErB;IACD,IAAI,OAAO,CAAC,KAAK,EAAE,OAAO,EAOzB;IACD,OAAO,CAAC,QAAQ,CAAS;IAEzB,wFAAwF;IAC/E,KAAK,EAAE,SAAS,GAAG,IAAI,CAAQ;IAExC;;;OAGG;IACM,cAAc,EAAE,MAAM,GAAG,IAAI,CAAQ;IAE9C;;;OAGG;IACM,WAAW,EAAE,MAAM,GAAG,IAAI,CAAQ;IAE3C;;;OAGG;IACM,YAAY,SAAK;IAE1B,2EAA2E;IACjE,OAAO,uBAA8B;IAE/C,yEAAyE;IAC/D,MAAM,qBAA4B;IAE5C,4EAA4E;IACrE,gBAAgB,UAAS;IAEhC,gDAAgD;IAChD,IAAW,gBAAgB,YAE1B;IACD,gDAAgD;IAChD,IAAW,gBAAgB,CAAC,KAAK,SAAA,EAEhC;IAED,IAAW,QAAQ,IAAI,OAAO,CAE7B;IAED,wCAAwC;IACxC,IAAW,QAAQ,IAAI,OAAO,CAE7B;IAED,IAAW,UAAU,IAAI,OAAO,CAI/B;IAED,0CAA0C;IAC1C,IAAW,UAAU,IAAI,OAAO,CAE/B;IAED,IAAW,WAAW,IAAI,MAAM,EAAE,CAEjC;IAED,2CAA2C;IAC3C,IAAW,WAAW,IAAI,MAAM,EAAE,CAEjC;IAED,IAAW,cAAc,IAAI,MAAM,EAAE,CAEpC;IAED,8CAA8C;IAC9C,IAAW,cAAc,IAAI,MAAM,EAAE,CAEpC;IAED,IAAW,kBAAkB,IAAI,MAAM,CAItC;IAED,kDAAkD;IAClD,IAAW,kBAAkB,IAAI,MAAM,CAEtC;IAED,IAAW,iBAAiB,IAAI,MAAM,CAErC;IAED,iDAAiD;IACjD,IAAW,iBAAiB,IAAI,MAAM,CAErC;IAEM,SAAS,IAAI,IAAI;IAKjB,QAAQ,IAAI,IAAI;IAIhB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;yCA9HzC,yBAAyB;2CAAzB,yBAAyB;CAiIrC"}
|
|
@@ -226,7 +226,7 @@ export class ListDeltaConfirmComponent {
|
|
|
226
226
|
// Reset the acknowledgement when re-opening so a previous session's
|
|
227
227
|
// confirmation doesn't carry over to a new delta.
|
|
228
228
|
if (value)
|
|
229
|
-
this.
|
|
229
|
+
this.DropAcknowledged = false;
|
|
230
230
|
}
|
|
231
231
|
}
|
|
232
232
|
_visible = false;
|
|
@@ -252,35 +252,67 @@ export class ListDeltaConfirmComponent {
|
|
|
252
252
|
/** Fires when the user cancels (close button, ESC, or Cancel button). */
|
|
253
253
|
Cancel = new EventEmitter();
|
|
254
254
|
/** Local UI state for the acknowledgement checkbox in drop-warning mode. */
|
|
255
|
-
|
|
256
|
-
|
|
255
|
+
DropAcknowledged = false;
|
|
256
|
+
/** @deprecated Use {@link DropAcknowledged}. */
|
|
257
|
+
get dropAcknowledged() {
|
|
258
|
+
return this.DropAcknowledged;
|
|
259
|
+
}
|
|
260
|
+
/** @deprecated Use {@link DropAcknowledged}. */
|
|
261
|
+
set dropAcknowledged(value) {
|
|
262
|
+
this.DropAcknowledged = value;
|
|
263
|
+
}
|
|
264
|
+
get HasDrops() {
|
|
257
265
|
return (this.Delta?.Counts.Remove ?? 0) > 0;
|
|
258
266
|
}
|
|
259
|
-
|
|
267
|
+
/** @deprecated Use {@link HasDrops}. */
|
|
268
|
+
get hasDrops() {
|
|
269
|
+
return this.HasDrops;
|
|
270
|
+
}
|
|
271
|
+
get CanConfirm() {
|
|
260
272
|
if (!this.Delta)
|
|
261
273
|
return false;
|
|
262
|
-
if (!this.
|
|
274
|
+
if (!this.HasDrops)
|
|
263
275
|
return true;
|
|
264
|
-
return this.
|
|
276
|
+
return this.DropAcknowledged;
|
|
265
277
|
}
|
|
266
|
-
|
|
278
|
+
/** @deprecated Use {@link CanConfirm}. */
|
|
279
|
+
get canConfirm() {
|
|
280
|
+
return this.CanConfirm;
|
|
281
|
+
}
|
|
282
|
+
get PreviewAdds() {
|
|
267
283
|
return this.Delta?.ToAdd.slice(0, this.PreviewLimit) ?? [];
|
|
268
284
|
}
|
|
269
|
-
|
|
285
|
+
/** @deprecated Use {@link PreviewAdds}. */
|
|
286
|
+
get previewAdds() {
|
|
287
|
+
return this.PreviewAdds;
|
|
288
|
+
}
|
|
289
|
+
get PreviewRemoves() {
|
|
270
290
|
return this.Delta?.ToRemove.slice(0, this.PreviewLimit) ?? [];
|
|
271
291
|
}
|
|
272
|
-
|
|
292
|
+
/** @deprecated Use {@link PreviewRemoves}. */
|
|
293
|
+
get previewRemoves() {
|
|
294
|
+
return this.PreviewRemoves;
|
|
295
|
+
}
|
|
296
|
+
get ConfirmButtonLabel() {
|
|
273
297
|
if (!this.Delta)
|
|
274
298
|
return 'Confirm';
|
|
275
|
-
if (this.
|
|
299
|
+
if (this.HasDrops)
|
|
276
300
|
return `Confirm Removal & Update`;
|
|
277
301
|
return `Confirm (Add ${this.Delta.Counts.Add})`;
|
|
278
302
|
}
|
|
279
|
-
|
|
303
|
+
/** @deprecated Use {@link ConfirmButtonLabel}. */
|
|
304
|
+
get confirmButtonLabel() {
|
|
305
|
+
return this.ConfirmButtonLabel;
|
|
306
|
+
}
|
|
307
|
+
get TargetDisplayName() {
|
|
280
308
|
return this.TargetListName ?? 'this list';
|
|
281
309
|
}
|
|
310
|
+
/** @deprecated Use {@link TargetDisplayName}. */
|
|
311
|
+
get targetDisplayName() {
|
|
312
|
+
return this.TargetDisplayName;
|
|
313
|
+
}
|
|
282
314
|
OnConfirm() {
|
|
283
|
-
if (!this.
|
|
315
|
+
if (!this.CanConfirm || !this.Delta)
|
|
284
316
|
return;
|
|
285
317
|
this.Confirm.emit(this.Delta.DeltaToken);
|
|
286
318
|
}
|
|
@@ -288,7 +320,7 @@ export class ListDeltaConfirmComponent {
|
|
|
288
320
|
this.Cancel.emit();
|
|
289
321
|
}
|
|
290
322
|
OnAcknowledgementToggle(value) {
|
|
291
|
-
this.
|
|
323
|
+
this.DropAcknowledged = value;
|
|
292
324
|
}
|
|
293
325
|
static ɵfac = function ListDeltaConfirmComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ListDeltaConfirmComponent)(); };
|
|
294
326
|
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) {
|
|
@@ -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 <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"]}
|
|
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 /** @deprecated Use {@link DropAcknowledged}. */\n public get dropAcknowledged() {\n return this.DropAcknowledged;\n }\n /** @deprecated Use {@link DropAcknowledged}. */\n public set dropAcknowledged(value) {\n this.DropAcknowledged = value;\n }\n\n public get HasDrops(): boolean {\n return (this.Delta?.Counts.Remove ?? 0) > 0;\n }\n\n /** @deprecated Use {@link HasDrops}. */\n public get hasDrops(): boolean {\n return this.HasDrops;\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 /** @deprecated Use {@link CanConfirm}. */\n public get canConfirm(): boolean {\n return this.CanConfirm;\n }\n\n public get PreviewAdds(): string[] {\n return this.Delta?.ToAdd.slice(0, this.PreviewLimit) ?? [];\n }\n\n /** @deprecated Use {@link PreviewAdds}. */\n public get previewAdds(): string[] {\n return this.PreviewAdds;\n }\n\n public get PreviewRemoves(): string[] {\n return this.Delta?.ToRemove.slice(0, this.PreviewLimit) ?? [];\n }\n\n /** @deprecated Use {@link PreviewRemoves}. */\n public get previewRemoves(): string[] {\n return this.PreviewRemoves;\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 /** @deprecated Use {@link ConfirmButtonLabel}. */\n public get confirmButtonLabel(): string {\n return this.ConfirmButtonLabel;\n }\n\n public get TargetDisplayName(): string {\n return this.TargetListName ?? 'this list';\n }\n\n /** @deprecated Use {@link TargetDisplayName}. */\n public get targetDisplayName(): string {\n return this.TargetDisplayName;\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"]}
|
|
@@ -29,8 +29,16 @@ export declare class ListInvitationsComponent extends BaseAngularComponent imple
|
|
|
29
29
|
private _listId;
|
|
30
30
|
/** Optional display name for the list — used in the empty-state copy. */
|
|
31
31
|
ListName: string | null;
|
|
32
|
-
|
|
33
|
-
|
|
32
|
+
ActiveTab: InvitationStatus;
|
|
33
|
+
/** @deprecated Use {@link ActiveTab}. */
|
|
34
|
+
get activeTab(): InvitationStatus;
|
|
35
|
+
/** @deprecated Use {@link ActiveTab}. */
|
|
36
|
+
set activeTab(value: InvitationStatus);
|
|
37
|
+
Invitations: InvitationRow[];
|
|
38
|
+
/** @deprecated Use {@link Invitations}. */
|
|
39
|
+
get invitations(): InvitationRow[];
|
|
40
|
+
/** @deprecated Use {@link Invitations}. */
|
|
41
|
+
set invitations(value: InvitationRow[]);
|
|
34
42
|
/**
|
|
35
43
|
* Precomputed list of invitations matching the active tab, recomputed only when
|
|
36
44
|
* the source data ({@link invitations}) or {@link activeTab} changes (see
|
|
@@ -38,15 +46,41 @@ export declare class ListInvitationsComponent extends BaseAngularComponent imple
|
|
|
38
46
|
* Bound directly as the @for source in the template, so a getter here would
|
|
39
47
|
* allocate a fresh array (map + filter) every CD tick.
|
|
40
48
|
*/
|
|
41
|
-
|
|
42
|
-
|
|
49
|
+
VisibleInvitations: InvitationRow[];
|
|
50
|
+
/** @deprecated Use {@link VisibleInvitations}. */
|
|
51
|
+
get visibleInvitations(): InvitationRow[];
|
|
52
|
+
/** @deprecated Use {@link VisibleInvitations}. */
|
|
53
|
+
set visibleInvitations(value: InvitationRow[]);
|
|
54
|
+
Loading: boolean;
|
|
55
|
+
/** @deprecated Use {@link Loading}. */
|
|
56
|
+
get loading(): boolean;
|
|
57
|
+
/** @deprecated Use {@link Loading}. */
|
|
58
|
+
set loading(value: boolean);
|
|
43
59
|
errorMessage: string | null;
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
60
|
+
Submitting: boolean;
|
|
61
|
+
/** @deprecated Use {@link Submitting}. */
|
|
62
|
+
get submitting(): boolean;
|
|
63
|
+
/** @deprecated Use {@link Submitting}. */
|
|
64
|
+
set submitting(value: boolean);
|
|
65
|
+
NewEmail: string;
|
|
66
|
+
/** @deprecated Use {@link NewEmail}. */
|
|
67
|
+
get newEmail(): string;
|
|
68
|
+
/** @deprecated Use {@link NewEmail}. */
|
|
69
|
+
set newEmail(value: string);
|
|
70
|
+
NewRole: 'Editor' | 'Viewer';
|
|
71
|
+
/** @deprecated Use {@link NewRole}. */
|
|
72
|
+
get newRole(): 'Editor' | 'Viewer';
|
|
73
|
+
/** @deprecated Use {@link NewRole}. */
|
|
74
|
+
set newRole(value: 'Editor' | 'Viewer');
|
|
75
|
+
NewTtlHours: number;
|
|
76
|
+
/** @deprecated Use {@link NewTtlHours}. */
|
|
77
|
+
get newTtlHours(): number;
|
|
78
|
+
/** @deprecated Use {@link NewTtlHours}. */
|
|
79
|
+
set newTtlHours(value: number);
|
|
48
80
|
private initialized;
|
|
49
81
|
ngOnInit(): Promise<void>;
|
|
82
|
+
SetTab(tab: InvitationStatus): void;
|
|
83
|
+
/** @deprecated Use {@link SetTab}. */
|
|
50
84
|
setTab(tab: InvitationStatus): void;
|
|
51
85
|
/**
|
|
52
86
|
* Recompute the precomputed {@link visibleInvitations} array. Called only when
|
|
@@ -58,8 +92,14 @@ export declare class ListInvitationsComponent extends BaseAngularComponent imple
|
|
|
58
92
|
* server's Accept path also lazily marks them.
|
|
59
93
|
*/
|
|
60
94
|
private recomputeVisibleInvitations;
|
|
95
|
+
CountFor(status: InvitationStatus): number;
|
|
96
|
+
/** @deprecated Use {@link CountFor}. */
|
|
61
97
|
countFor(status: InvitationStatus): number;
|
|
98
|
+
FormatExpiry(d: Date): string;
|
|
99
|
+
/** @deprecated Use {@link FormatExpiry}. */
|
|
62
100
|
formatExpiry(d: Date): string;
|
|
101
|
+
get CanSend(): boolean;
|
|
102
|
+
/** @deprecated Use {@link CanSend}. */
|
|
63
103
|
get canSend(): boolean;
|
|
64
104
|
SendInvitation(): Promise<void>;
|
|
65
105
|
Revoke(invitationId: string): Promise<void>;
|