@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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list-invitations.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/list-invitations/list-invitations.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgE,MAAM,EAAU,MAAM,eAAe,CAAC;AAE7G,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;;AAKrE;;;;;;;;;;GAUG;AAEH,KAAK,gBAAgB,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,GAAG,SAAS,CAAC;AAEvE,UAAU,aAAa;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC1B,MAAM,EAAE,gBAAgB,CAAC;IACzB,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,qBAOa,wBAAyB,SAAQ,oBAAqB,YAAW,MAAM;IAClF,OAAO,CAAC,QAAQ,CAAC,GAAG,CAA6B;IAEjD,IACI,MAAM,IAAI,MAAM,GAAG,IAAI,CAE1B;IACD,IAAI,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,EAK9B;IACD,OAAO,CAAC,OAAO,CAAuB;IAEtC,yEAAyE;IAChE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAQ;IAEjC,SAAS,EAAE,gBAAgB,CAAa;
|
|
1
|
+
{"version":3,"file":"list-invitations.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/list-invitations/list-invitations.component.ts"],"names":[],"mappings":"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"}
|
|
@@ -148,8 +148,24 @@ export class ListInvitationsComponent extends BaseAngularComponent {
|
|
|
148
148
|
_listId = null;
|
|
149
149
|
/** Optional display name for the list — used in the empty-state copy. */
|
|
150
150
|
ListName = null;
|
|
151
|
-
|
|
152
|
-
|
|
151
|
+
ActiveTab = 'Pending';
|
|
152
|
+
/** @deprecated Use {@link ActiveTab}. */
|
|
153
|
+
get activeTab() {
|
|
154
|
+
return this.ActiveTab;
|
|
155
|
+
}
|
|
156
|
+
/** @deprecated Use {@link ActiveTab}. */
|
|
157
|
+
set activeTab(value) {
|
|
158
|
+
this.ActiveTab = value;
|
|
159
|
+
}
|
|
160
|
+
Invitations = [];
|
|
161
|
+
/** @deprecated Use {@link Invitations}. */
|
|
162
|
+
get invitations() {
|
|
163
|
+
return this.Invitations;
|
|
164
|
+
}
|
|
165
|
+
/** @deprecated Use {@link Invitations}. */
|
|
166
|
+
set invitations(value) {
|
|
167
|
+
this.Invitations = value;
|
|
168
|
+
}
|
|
153
169
|
/**
|
|
154
170
|
* Precomputed list of invitations matching the active tab, recomputed only when
|
|
155
171
|
* the source data ({@link invitations}) or {@link activeTab} changes (see
|
|
@@ -157,25 +173,77 @@ export class ListInvitationsComponent extends BaseAngularComponent {
|
|
|
157
173
|
* Bound directly as the @for source in the template, so a getter here would
|
|
158
174
|
* allocate a fresh array (map + filter) every CD tick.
|
|
159
175
|
*/
|
|
160
|
-
|
|
161
|
-
|
|
176
|
+
VisibleInvitations = [];
|
|
177
|
+
/** @deprecated Use {@link VisibleInvitations}. */
|
|
178
|
+
get visibleInvitations() {
|
|
179
|
+
return this.VisibleInvitations;
|
|
180
|
+
}
|
|
181
|
+
/** @deprecated Use {@link VisibleInvitations}. */
|
|
182
|
+
set visibleInvitations(value) {
|
|
183
|
+
this.VisibleInvitations = value;
|
|
184
|
+
}
|
|
185
|
+
Loading = false;
|
|
186
|
+
/** @deprecated Use {@link Loading}. */
|
|
187
|
+
get loading() {
|
|
188
|
+
return this.Loading;
|
|
189
|
+
}
|
|
190
|
+
/** @deprecated Use {@link Loading}. */
|
|
191
|
+
set loading(value) {
|
|
192
|
+
this.Loading = value;
|
|
193
|
+
}
|
|
162
194
|
errorMessage = null;
|
|
163
|
-
|
|
195
|
+
Submitting = false;
|
|
196
|
+
/** @deprecated Use {@link Submitting}. */
|
|
197
|
+
get submitting() {
|
|
198
|
+
return this.Submitting;
|
|
199
|
+
}
|
|
200
|
+
/** @deprecated Use {@link Submitting}. */
|
|
201
|
+
set submitting(value) {
|
|
202
|
+
this.Submitting = value;
|
|
203
|
+
}
|
|
164
204
|
// Send-new-invitation form
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
205
|
+
NewEmail = '';
|
|
206
|
+
/** @deprecated Use {@link NewEmail}. */
|
|
207
|
+
get newEmail() {
|
|
208
|
+
return this.NewEmail;
|
|
209
|
+
}
|
|
210
|
+
/** @deprecated Use {@link NewEmail}. */
|
|
211
|
+
set newEmail(value) {
|
|
212
|
+
this.NewEmail = value;
|
|
213
|
+
}
|
|
214
|
+
NewRole = 'Viewer';
|
|
215
|
+
/** @deprecated Use {@link NewRole}. */
|
|
216
|
+
get newRole() {
|
|
217
|
+
return this.NewRole;
|
|
218
|
+
}
|
|
219
|
+
/** @deprecated Use {@link NewRole}. */
|
|
220
|
+
set newRole(value) {
|
|
221
|
+
this.NewRole = value;
|
|
222
|
+
}
|
|
223
|
+
NewTtlHours = 168;
|
|
224
|
+
/** @deprecated Use {@link NewTtlHours}. */
|
|
225
|
+
get newTtlHours() {
|
|
226
|
+
return this.NewTtlHours;
|
|
227
|
+
}
|
|
228
|
+
/** @deprecated Use {@link NewTtlHours}. */
|
|
229
|
+
set newTtlHours(value) {
|
|
230
|
+
this.NewTtlHours = value;
|
|
231
|
+
} // 7 days default
|
|
168
232
|
initialized = false;
|
|
169
233
|
async ngOnInit() {
|
|
170
234
|
this.initialized = true;
|
|
171
235
|
if (this._listId)
|
|
172
236
|
await this.loadInvitations();
|
|
173
237
|
}
|
|
174
|
-
|
|
175
|
-
this.
|
|
238
|
+
SetTab(tab) {
|
|
239
|
+
this.ActiveTab = tab;
|
|
176
240
|
this.recomputeVisibleInvitations();
|
|
177
241
|
this.cdr.markForCheck();
|
|
178
242
|
}
|
|
243
|
+
/** @deprecated Use {@link SetTab}. */
|
|
244
|
+
setTab(tab) {
|
|
245
|
+
return this.SetTab(tab);
|
|
246
|
+
}
|
|
179
247
|
/**
|
|
180
248
|
* Recompute the precomputed {@link visibleInvitations} array. Called only when
|
|
181
249
|
* the source data or the active tab changes — keeping the per-row hydration
|
|
@@ -187,22 +255,26 @@ export class ListInvitationsComponent extends BaseAngularComponent {
|
|
|
187
255
|
*/
|
|
188
256
|
recomputeVisibleInvitations() {
|
|
189
257
|
const now = Date.now();
|
|
190
|
-
const hydrated = this.
|
|
258
|
+
const hydrated = this.Invitations.map((inv) => inv.Status === 'Pending' && inv.ExpiresAt.getTime() < now
|
|
191
259
|
? { ...inv, Status: 'Expired' }
|
|
192
260
|
: inv);
|
|
193
|
-
this.
|
|
261
|
+
this.VisibleInvitations = hydrated.filter((i) => i.Status === this.ActiveTab);
|
|
194
262
|
}
|
|
195
|
-
|
|
263
|
+
CountFor(status) {
|
|
196
264
|
const now = Date.now();
|
|
197
265
|
let count = 0;
|
|
198
|
-
for (const inv of this.
|
|
266
|
+
for (const inv of this.Invitations) {
|
|
199
267
|
const effective = inv.Status === 'Pending' && inv.ExpiresAt.getTime() < now ? 'Expired' : inv.Status;
|
|
200
268
|
if (effective === status)
|
|
201
269
|
count++;
|
|
202
270
|
}
|
|
203
271
|
return count;
|
|
204
272
|
}
|
|
205
|
-
|
|
273
|
+
/** @deprecated Use {@link CountFor}. */
|
|
274
|
+
countFor(status) {
|
|
275
|
+
return this.CountFor(status);
|
|
276
|
+
}
|
|
277
|
+
FormatExpiry(d) {
|
|
206
278
|
const diff = d.getTime() - Date.now();
|
|
207
279
|
if (diff < 0)
|
|
208
280
|
return `expired ${d.toLocaleDateString()}`;
|
|
@@ -212,25 +284,33 @@ export class ListInvitationsComponent extends BaseAngularComponent {
|
|
|
212
284
|
const days = Math.floor(hours / 24);
|
|
213
285
|
return `expires in ${days}d`;
|
|
214
286
|
}
|
|
287
|
+
/** @deprecated Use {@link FormatExpiry}. */
|
|
288
|
+
formatExpiry(d) {
|
|
289
|
+
return this.FormatExpiry(d);
|
|
290
|
+
}
|
|
291
|
+
get CanSend() {
|
|
292
|
+
return !!this._listId && this.NewEmail.trim().length > 0 && this.NewEmail.includes('@') && !this.Submitting;
|
|
293
|
+
}
|
|
294
|
+
/** @deprecated Use {@link CanSend}. */
|
|
215
295
|
get canSend() {
|
|
216
|
-
return
|
|
296
|
+
return this.CanSend;
|
|
217
297
|
}
|
|
218
298
|
async SendInvitation() {
|
|
219
|
-
if (!this.
|
|
299
|
+
if (!this.CanSend || !this._listId)
|
|
220
300
|
return;
|
|
221
|
-
this.
|
|
301
|
+
this.Submitting = true;
|
|
222
302
|
this.cdr.markForCheck();
|
|
223
303
|
try {
|
|
224
304
|
const provider = this.ProviderToUse;
|
|
225
305
|
const client = new GraphQLListsClient(provider);
|
|
226
306
|
const result = await client.Invite({
|
|
227
307
|
ListID: this._listId,
|
|
228
|
-
Email: this.
|
|
229
|
-
Role: this.
|
|
230
|
-
TtlHours: this.
|
|
308
|
+
Email: this.NewEmail.trim(),
|
|
309
|
+
Role: this.NewRole,
|
|
310
|
+
TtlHours: this.NewTtlHours,
|
|
231
311
|
});
|
|
232
312
|
if (result.Success) {
|
|
233
|
-
this.
|
|
313
|
+
this.NewEmail = '';
|
|
234
314
|
await this.loadInvitations();
|
|
235
315
|
}
|
|
236
316
|
else {
|
|
@@ -241,7 +321,7 @@ export class ListInvitationsComponent extends BaseAngularComponent {
|
|
|
241
321
|
this.errorMessage = e instanceof Error ? e.message : String(e);
|
|
242
322
|
}
|
|
243
323
|
finally {
|
|
244
|
-
this.
|
|
324
|
+
this.Submitting = false;
|
|
245
325
|
this.cdr.markForCheck();
|
|
246
326
|
}
|
|
247
327
|
}
|
|
@@ -283,7 +363,7 @@ export class ListInvitationsComponent extends BaseAngularComponent {
|
|
|
283
363
|
async loadInvitations() {
|
|
284
364
|
if (!this._listId)
|
|
285
365
|
return;
|
|
286
|
-
this.
|
|
366
|
+
this.Loading = true;
|
|
287
367
|
this.errorMessage = null;
|
|
288
368
|
this.cdr.markForCheck();
|
|
289
369
|
try {
|
|
@@ -296,11 +376,11 @@ export class ListInvitationsComponent extends BaseAngularComponent {
|
|
|
296
376
|
});
|
|
297
377
|
if (!result.Success) {
|
|
298
378
|
this.errorMessage = result.ErrorMessage ?? 'Failed to load invitations';
|
|
299
|
-
this.
|
|
379
|
+
this.Invitations = [];
|
|
300
380
|
this.recomputeVisibleInvitations();
|
|
301
381
|
return;
|
|
302
382
|
}
|
|
303
|
-
this.
|
|
383
|
+
this.Invitations = (result.Results ?? []).map((r) => ({
|
|
304
384
|
ID: String(r.ID),
|
|
305
385
|
Email: String(r.Email),
|
|
306
386
|
Role: r.Role,
|
|
@@ -313,11 +393,11 @@ export class ListInvitationsComponent extends BaseAngularComponent {
|
|
|
313
393
|
}
|
|
314
394
|
catch (e) {
|
|
315
395
|
this.errorMessage = e instanceof Error ? e.message : String(e);
|
|
316
|
-
this.
|
|
396
|
+
this.Invitations = [];
|
|
317
397
|
this.recomputeVisibleInvitations();
|
|
318
398
|
}
|
|
319
399
|
finally {
|
|
320
|
-
this.
|
|
400
|
+
this.Loading = false;
|
|
321
401
|
this.cdr.markForCheck();
|
|
322
402
|
}
|
|
323
403
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list-invitations.component.js","sourceRoot":"","sources":["../../../../src/lib/components/list-invitations/list-invitations.component.ts","../../../../src/lib/components/list-invitations/list-invitations.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';\nimport type { MJListInvitationEntity } from '@memberjunction/core-entities';\nimport { GraphQLDataProvider, GraphQLListsClient } from '@memberjunction/graphql-dataprovider';\n\n/**\n * Invitations management UI (mockup 16). For a single List:\n * - Pending / Accepted / Expired / Revoked tabs.\n * - Send new invitation form (email + role + TTL).\n * - Revoke / Resend actions on Pending invites.\n *\n * Reads invitations directly via `RunView` (cheaper than going through\n * GraphQL — the entity is already accessible). Mutations route through\n * `GraphQLListsClient` so the audit-log + notification side effects\n * fire server-side.\n */\n\ntype InvitationStatus = 'Pending' | 'Accepted' | 'Expired' | 'Revoked';\n\ninterface InvitationRow {\n ID: string;\n Email: string;\n Role: 'Editor' | 'Viewer';\n Status: InvitationStatus;\n ExpiresAt: Date;\n CreatedAt: Date;\n Token: string;\n}\n\n@Component({\n standalone: false,\n selector: 'mj-list-invitations',\n templateUrl: './list-invitations.component.html',\n styleUrls: ['./list-invitations.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ListInvitationsComponent extends BaseAngularComponent implements OnInit {\n private readonly cdr = inject(ChangeDetectorRef);\n\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 (this.initialized && value) void this.loadInvitations();\n }\n }\n private _listId: string | null = null;\n\n /** Optional display name for the list — used in the empty-state copy. */\n @Input() ListName: string | null = null;\n\n public activeTab: InvitationStatus = 'Pending';\n public invitations: InvitationRow[] = [];\n\n /**\n * Precomputed list of invitations matching the active tab, recomputed only when\n * the source data ({@link invitations}) or {@link activeTab} changes (see\n * {@link recomputeVisibleInvitations}) — NOT on every change-detection cycle.\n * Bound directly as the @for source in the template, so a getter here would\n * allocate a fresh array (map + filter) every CD tick.\n */\n public visibleInvitations: InvitationRow[] = [];\n public loading = false;\n public errorMessage: string | null = null;\n public submitting = false;\n\n // Send-new-invitation form\n public newEmail = '';\n public newRole: 'Editor' | 'Viewer' = 'Viewer';\n public newTtlHours = 168; // 7 days default\n\n private initialized = false;\n\n async ngOnInit(): Promise<void> {\n this.initialized = true;\n if (this._listId) await this.loadInvitations();\n }\n\n public setTab(tab: InvitationStatus): void {\n this.activeTab = tab;\n this.recomputeVisibleInvitations();\n this.cdr.markForCheck();\n }\n\n /**\n * Recompute the precomputed {@link visibleInvitations} array. Called only when\n * the source data or the active tab changes — keeping the per-row hydration\n * (map) + filter out of the per-CD-cycle hot path.\n *\n * We hydrate Status=\"Pending\" rows whose ExpiresAt is in the past as Expired\n * on the client so users see them without waiting for a server-side flip. The\n * server's Accept path also lazily marks them.\n */\n private recomputeVisibleInvitations(): void {\n const now = Date.now();\n const hydrated = this.invitations.map<InvitationRow>((inv) =>\n inv.Status === 'Pending' && inv.ExpiresAt.getTime() < now\n ? { ...inv, Status: 'Expired' }\n : inv,\n );\n this.visibleInvitations = hydrated.filter((i) => i.Status === this.activeTab);\n }\n\n public countFor(status: InvitationStatus): number {\n const now = Date.now();\n let count = 0;\n for (const inv of this.invitations) {\n const effective: InvitationStatus =\n inv.Status === 'Pending' && inv.ExpiresAt.getTime() < now ? 'Expired' : inv.Status;\n if (effective === status) count++;\n }\n return count;\n }\n\n public formatExpiry(d: Date): string {\n const diff = d.getTime() - Date.now();\n if (diff < 0) return `expired ${d.toLocaleDateString()}`;\n const hours = Math.floor(diff / 3_600_000);\n if (hours < 24) return `expires in ${hours}h`;\n const days = Math.floor(hours / 24);\n return `expires in ${days}d`;\n }\n\n public get canSend(): boolean {\n return !!this._listId && this.newEmail.trim().length > 0 && this.newEmail.includes('@') && !this.submitting;\n }\n\n public async SendInvitation(): Promise<void> {\n if (!this.canSend || !this._listId) return;\n this.submitting = true;\n this.cdr.markForCheck();\n try {\n const provider = this.ProviderToUse as unknown as GraphQLDataProvider;\n const client = new GraphQLListsClient(provider);\n const result = await client.Invite({\n ListID: this._listId,\n Email: this.newEmail.trim(),\n Role: this.newRole,\n TtlHours: this.newTtlHours,\n });\n if (result.Success) {\n this.newEmail = '';\n await this.loadInvitations();\n } else {\n this.errorMessage = `Failed to send: ${result.Message}`;\n }\n } catch (e) {\n this.errorMessage = e instanceof Error ? e.message : String(e);\n } finally {\n this.submitting = false;\n this.cdr.markForCheck();\n }\n }\n\n public async Revoke(invitationId: string): Promise<void> {\n const provider = this.ProviderToUse as unknown as GraphQLDataProvider;\n const client = new GraphQLListsClient(provider);\n const result = await client.RevokeInvitation(invitationId);\n if (result.Success) {\n await this.loadInvitations();\n } else {\n this.errorMessage = `Failed to revoke: ${result.Message}`;\n this.cdr.markForCheck();\n }\n }\n\n /**\n * \"Resend\" = create a fresh invitation for the same email + role. The\n * old one stays Pending until either accepted or expired; users see\n * both in the Pending tab until one is consumed.\n */\n public async Resend(inv: InvitationRow): Promise<void> {\n const provider = this.ProviderToUse as unknown as GraphQLDataProvider;\n const client = new GraphQLListsClient(provider);\n if (!this._listId) return;\n const result = await client.Invite({\n ListID: this._listId,\n Email: inv.Email,\n Role: inv.Role,\n TtlHours: 168,\n });\n if (result.Success) await this.loadInvitations();\n else {\n this.errorMessage = `Failed to resend: ${result.Message}`;\n this.cdr.markForCheck();\n }\n }\n\n private async loadInvitations(): Promise<void> {\n if (!this._listId) return;\n this.loading = true;\n this.errorMessage = null;\n this.cdr.markForCheck();\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView<MJListInvitationEntity>({\n EntityName: 'MJ: List Invitations',\n ExtraFilter: `ListID='${this._listId.replace(/'/g, \"''\")}'`,\n OrderBy: '__mj_CreatedAt DESC',\n ResultType: 'simple',\n });\n if (!result.Success) {\n this.errorMessage = result.ErrorMessage ?? 'Failed to load invitations';\n this.invitations = [];\n this.recomputeVisibleInvitations();\n return;\n }\n this.invitations = (result.Results ?? []).map((r) => ({\n ID: String(r.ID),\n Email: String(r.Email),\n Role: r.Role as 'Editor' | 'Viewer',\n Status: r.Status as InvitationStatus,\n ExpiresAt: new Date(r.ExpiresAt as unknown as string),\n CreatedAt: new Date(r.__mj_CreatedAt as unknown as string),\n Token: String(r.Token),\n }));\n this.recomputeVisibleInvitations();\n } catch (e) {\n this.errorMessage = e instanceof Error ? e.message : String(e);\n this.invitations = [];\n this.recomputeVisibleInvitations();\n } finally {\n this.loading = false;\n this.cdr.markForCheck();\n }\n }\n}\n","<div class=\"invitations\">\n <!-- Send new invitation -->\n <div class=\"invitation-send\">\n <div class=\"invitation-send__heading\">Send invitation</div>\n <form class=\"invitation-send__form\" (submit)=\"$event.preventDefault(); SendInvitation()\">\n <input\n class=\"mj-input invitation-send__email\"\n type=\"email\"\n [(ngModel)]=\"newEmail\"\n name=\"newEmail\"\n placeholder=\"recipient@example.com\"\n required />\n <select class=\"mj-input mj-select invitation-send__role\" [(ngModel)]=\"newRole\" name=\"newRole\">\n <option value=\"Viewer\">Viewer</option>\n <option value=\"Editor\">Editor</option>\n </select>\n <input\n class=\"mj-input invitation-send__ttl\"\n type=\"number\"\n [(ngModel)]=\"newTtlHours\"\n name=\"newTtlHours\"\n title=\"Hours until expiry\"\n min=\"1\"\n max=\"720\" />\n <button mjButton variant=\"primary\" type=\"submit\" [disabled]=\"!canSend\">\n @if (submitting) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n } @else {\n <i class=\"fa-solid fa-paper-plane\"></i>\n }\n {{ submitting ? 'Sending…' : 'Send' }}\n </button>\n </form>\n </div>\n\n @if (errorMessage) {\n <div class=\"invitation-error\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n {{ errorMessage }}\n </div>\n }\n\n <!-- Status tabs -->\n <div class=\"invitation-tabs\">\n @for (s of ['Pending', 'Accepted', 'Expired', 'Revoked']; track s) {\n <button\n class=\"invitation-tab\"\n [class.invitation-tab--active]=\"activeTab === s\"\n (click)=\"setTab($any(s))\">\n {{ s }}\n <span class=\"invitation-tab__count\">{{ countFor($any(s)) }}</span>\n </button>\n }\n </div>\n\n @if (loading) {\n <div class=\"invitation-state\">\n <mj-loading text=\"Loading invitations...\" size=\"medium\"></mj-loading>\n </div>\n } @else if (visibleInvitations.length === 0) {\n <div class=\"invitation-state invitation-state--empty\">\n <i class=\"fa-solid fa-envelope\"></i>\n <span>No {{ activeTab.toLowerCase() }} invitations.</span>\n </div>\n } @else {\n <table class=\"invitation-table\">\n <thead>\n <tr>\n <th>Email</th>\n <th>Role</th>\n <th>Sent</th>\n <th>Expiry</th>\n <th></th>\n </tr>\n </thead>\n <tbody>\n @for (inv of visibleInvitations; track inv.ID) {\n <tr>\n <td>{{ inv.Email }}</td>\n <td>\n <span class=\"role-chip\" [class.role-chip--editor]=\"inv.Role === 'Editor'\">\n {{ inv.Role }}\n </span>\n </td>\n <td>{{ inv.CreatedAt.toLocaleDateString() }}</td>\n <td>{{ formatExpiry(inv.ExpiresAt) }}</td>\n <td class=\"invitation-actions\">\n @if (activeTab === 'Pending') {\n <button mjButton size=\"sm\" variant=\"outline\" (click)=\"Resend(inv)\" title=\"Send a fresh invitation\">\n <i class=\"fa-solid fa-paper-plane\"></i>\n Resend\n </button>\n <button mjButton size=\"sm\" variant=\"danger\" (click)=\"Revoke(inv.ID)\">\n <i class=\"fa-solid fa-xmark\"></i>\n Revoke\n </button>\n } @else if (activeTab === 'Expired') {\n <button mjButton size=\"sm\" variant=\"outline\" (click)=\"Resend(inv)\">\n <i class=\"fa-solid fa-rotate-right\"></i>\n Re-send\n </button>\n }\n </td>\n </tr>\n }\n </tbody>\n </table>\n }\n</div>\n"]}
|
|
1
|
+
{"version":3,"file":"list-invitations.component.js","sourceRoot":"","sources":["../../../../src/lib/components/list-invitations/list-invitations.component.ts","../../../../src/lib/components/list-invitations/list-invitations.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';\nimport type { MJListInvitationEntity } from '@memberjunction/core-entities';\nimport { GraphQLDataProvider, GraphQLListsClient } from '@memberjunction/graphql-dataprovider';\n\n/**\n * Invitations management UI (mockup 16). For a single List:\n * - Pending / Accepted / Expired / Revoked tabs.\n * - Send new invitation form (email + role + TTL).\n * - Revoke / Resend actions on Pending invites.\n *\n * Reads invitations directly via `RunView` (cheaper than going through\n * GraphQL — the entity is already accessible). Mutations route through\n * `GraphQLListsClient` so the audit-log + notification side effects\n * fire server-side.\n */\n\ntype InvitationStatus = 'Pending' | 'Accepted' | 'Expired' | 'Revoked';\n\ninterface InvitationRow {\n ID: string;\n Email: string;\n Role: 'Editor' | 'Viewer';\n Status: InvitationStatus;\n ExpiresAt: Date;\n CreatedAt: Date;\n Token: string;\n}\n\n@Component({\n standalone: false,\n selector: 'mj-list-invitations',\n templateUrl: './list-invitations.component.html',\n styleUrls: ['./list-invitations.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ListInvitationsComponent extends BaseAngularComponent implements OnInit {\n private readonly cdr = inject(ChangeDetectorRef);\n\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 (this.initialized && value) void this.loadInvitations();\n }\n }\n private _listId: string | null = null;\n\n /** Optional display name for the list — used in the empty-state copy. */\n @Input() ListName: string | null = null;\n\n public ActiveTab: InvitationStatus = 'Pending';\n\n /** @deprecated Use {@link ActiveTab}. */\n public get activeTab(): InvitationStatus {\n return this.ActiveTab;\n }\n /** @deprecated Use {@link ActiveTab}. */\n public set activeTab(value: InvitationStatus) {\n this.ActiveTab = value;\n }\n public Invitations: InvitationRow[] = [];\n\n /** @deprecated Use {@link Invitations}. */\n public get invitations(): InvitationRow[] {\n return this.Invitations;\n }\n /** @deprecated Use {@link Invitations}. */\n public set invitations(value: InvitationRow[]) {\n this.Invitations = value;\n }\n\n /**\n * Precomputed list of invitations matching the active tab, recomputed only when\n * the source data ({@link invitations}) or {@link activeTab} changes (see\n * {@link recomputeVisibleInvitations}) — NOT on every change-detection cycle.\n * Bound directly as the @for source in the template, so a getter here would\n * allocate a fresh array (map + filter) every CD tick.\n */\n public VisibleInvitations: InvitationRow[] = [];\n\n /** @deprecated Use {@link VisibleInvitations}. */\n public get visibleInvitations(): InvitationRow[] {\n return this.VisibleInvitations;\n }\n /** @deprecated Use {@link VisibleInvitations}. */\n public set visibleInvitations(value: InvitationRow[]) {\n this.VisibleInvitations = value;\n }\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 public Submitting = false;\n\n /** @deprecated Use {@link Submitting}. */\n public get submitting() {\n return this.Submitting;\n }\n /** @deprecated Use {@link Submitting}. */\n public set submitting(value) {\n this.Submitting = value;\n }\n\n // Send-new-invitation form\n public NewEmail = '';\n\n /** @deprecated Use {@link NewEmail}. */\n public get newEmail() {\n return this.NewEmail;\n }\n /** @deprecated Use {@link NewEmail}. */\n public set newEmail(value) {\n this.NewEmail = value;\n }\n public NewRole: 'Editor' | 'Viewer' = 'Viewer';\n\n /** @deprecated Use {@link NewRole}. */\n public get newRole(): 'Editor' | 'Viewer' {\n return this.NewRole;\n }\n /** @deprecated Use {@link NewRole}. */\n public set newRole(value: 'Editor' | 'Viewer') {\n this.NewRole = value;\n }\n public NewTtlHours = 168;\n\n /** @deprecated Use {@link NewTtlHours}. */\n public get newTtlHours() {\n return this.NewTtlHours;\n }\n /** @deprecated Use {@link NewTtlHours}. */\n public set newTtlHours(value) {\n this.NewTtlHours = value;\n } // 7 days default\n\n private initialized = false;\n\n async ngOnInit(): Promise<void> {\n this.initialized = true;\n if (this._listId) await this.loadInvitations();\n }\n\n public SetTab(tab: InvitationStatus): void {\n this.ActiveTab = tab;\n this.recomputeVisibleInvitations();\n this.cdr.markForCheck();\n }\n\n /** @deprecated Use {@link SetTab}. */\n public setTab(tab: InvitationStatus): void {\n return this.SetTab(tab);\n }\n\n /**\n * Recompute the precomputed {@link visibleInvitations} array. Called only when\n * the source data or the active tab changes — keeping the per-row hydration\n * (map) + filter out of the per-CD-cycle hot path.\n *\n * We hydrate Status=\"Pending\" rows whose ExpiresAt is in the past as Expired\n * on the client so users see them without waiting for a server-side flip. The\n * server's Accept path also lazily marks them.\n */\n private recomputeVisibleInvitations(): void {\n const now = Date.now();\n const hydrated = this.Invitations.map<InvitationRow>((inv) =>\n inv.Status === 'Pending' && inv.ExpiresAt.getTime() < now\n ? { ...inv, Status: 'Expired' }\n : inv,\n );\n this.VisibleInvitations = hydrated.filter((i) => i.Status === this.ActiveTab);\n }\n\n public CountFor(status: InvitationStatus): number {\n const now = Date.now();\n let count = 0;\n for (const inv of this.Invitations) {\n const effective: InvitationStatus =\n inv.Status === 'Pending' && inv.ExpiresAt.getTime() < now ? 'Expired' : inv.Status;\n if (effective === status) count++;\n }\n return count;\n }\n\n /** @deprecated Use {@link CountFor}. */\n public countFor(status: InvitationStatus): number {\n return this.CountFor(status);\n }\n\n public FormatExpiry(d: Date): string {\n const diff = d.getTime() - Date.now();\n if (diff < 0) return `expired ${d.toLocaleDateString()}`;\n const hours = Math.floor(diff / 3_600_000);\n if (hours < 24) return `expires in ${hours}h`;\n const days = Math.floor(hours / 24);\n return `expires in ${days}d`;\n }\n\n /** @deprecated Use {@link FormatExpiry}. */\n public formatExpiry(d: Date): string {\n return this.FormatExpiry(d);\n }\n\n public get CanSend(): boolean {\n return !!this._listId && this.NewEmail.trim().length > 0 && this.NewEmail.includes('@') && !this.Submitting;\n }\n\n /** @deprecated Use {@link CanSend}. */\n public get canSend(): boolean {\n return this.CanSend;\n }\n\n public async SendInvitation(): Promise<void> {\n if (!this.CanSend || !this._listId) return;\n this.Submitting = true;\n this.cdr.markForCheck();\n try {\n const provider = this.ProviderToUse as unknown as GraphQLDataProvider;\n const client = new GraphQLListsClient(provider);\n const result = await client.Invite({\n ListID: this._listId,\n Email: this.NewEmail.trim(),\n Role: this.NewRole,\n TtlHours: this.NewTtlHours,\n });\n if (result.Success) {\n this.NewEmail = '';\n await this.loadInvitations();\n } else {\n this.errorMessage = `Failed to send: ${result.Message}`;\n }\n } catch (e) {\n this.errorMessage = e instanceof Error ? e.message : String(e);\n } finally {\n this.Submitting = false;\n this.cdr.markForCheck();\n }\n }\n\n public async Revoke(invitationId: string): Promise<void> {\n const provider = this.ProviderToUse as unknown as GraphQLDataProvider;\n const client = new GraphQLListsClient(provider);\n const result = await client.RevokeInvitation(invitationId);\n if (result.Success) {\n await this.loadInvitations();\n } else {\n this.errorMessage = `Failed to revoke: ${result.Message}`;\n this.cdr.markForCheck();\n }\n }\n\n /**\n * \"Resend\" = create a fresh invitation for the same email + role. The\n * old one stays Pending until either accepted or expired; users see\n * both in the Pending tab until one is consumed.\n */\n public async Resend(inv: InvitationRow): Promise<void> {\n const provider = this.ProviderToUse as unknown as GraphQLDataProvider;\n const client = new GraphQLListsClient(provider);\n if (!this._listId) return;\n const result = await client.Invite({\n ListID: this._listId,\n Email: inv.Email,\n Role: inv.Role,\n TtlHours: 168,\n });\n if (result.Success) await this.loadInvitations();\n else {\n this.errorMessage = `Failed to resend: ${result.Message}`;\n this.cdr.markForCheck();\n }\n }\n\n private async loadInvitations(): Promise<void> {\n if (!this._listId) return;\n this.Loading = true;\n this.errorMessage = null;\n this.cdr.markForCheck();\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView<MJListInvitationEntity>({\n EntityName: 'MJ: List Invitations',\n ExtraFilter: `ListID='${this._listId.replace(/'/g, \"''\")}'`,\n OrderBy: '__mj_CreatedAt DESC',\n ResultType: 'simple',\n });\n if (!result.Success) {\n this.errorMessage = result.ErrorMessage ?? 'Failed to load invitations';\n this.Invitations = [];\n this.recomputeVisibleInvitations();\n return;\n }\n this.Invitations = (result.Results ?? []).map((r) => ({\n ID: String(r.ID),\n Email: String(r.Email),\n Role: r.Role as 'Editor' | 'Viewer',\n Status: r.Status as InvitationStatus,\n ExpiresAt: new Date(r.ExpiresAt as unknown as string),\n CreatedAt: new Date(r.__mj_CreatedAt as unknown as string),\n Token: String(r.Token),\n }));\n this.recomputeVisibleInvitations();\n } catch (e) {\n this.errorMessage = e instanceof Error ? e.message : String(e);\n this.Invitations = [];\n this.recomputeVisibleInvitations();\n } finally {\n this.Loading = false;\n this.cdr.markForCheck();\n }\n }\n}\n","<div class=\"invitations\">\n <!-- Send new invitation -->\n <div class=\"invitation-send\">\n <div class=\"invitation-send__heading\">Send invitation</div>\n <form class=\"invitation-send__form\" (submit)=\"$event.preventDefault(); SendInvitation()\">\n <input\n class=\"mj-input invitation-send__email\"\n type=\"email\"\n [(ngModel)]=\"newEmail\"\n name=\"newEmail\"\n placeholder=\"recipient@example.com\"\n required />\n <select class=\"mj-input mj-select invitation-send__role\" [(ngModel)]=\"newRole\" name=\"newRole\">\n <option value=\"Viewer\">Viewer</option>\n <option value=\"Editor\">Editor</option>\n </select>\n <input\n class=\"mj-input invitation-send__ttl\"\n type=\"number\"\n [(ngModel)]=\"newTtlHours\"\n name=\"newTtlHours\"\n title=\"Hours until expiry\"\n min=\"1\"\n max=\"720\" />\n <button mjButton variant=\"primary\" type=\"submit\" [disabled]=\"!canSend\">\n @if (submitting) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n } @else {\n <i class=\"fa-solid fa-paper-plane\"></i>\n }\n {{ submitting ? 'Sending…' : 'Send' }}\n </button>\n </form>\n </div>\n\n @if (errorMessage) {\n <div class=\"invitation-error\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n {{ errorMessage }}\n </div>\n }\n\n <!-- Status tabs -->\n <div class=\"invitation-tabs\">\n @for (s of ['Pending', 'Accepted', 'Expired', 'Revoked']; track s) {\n <button\n class=\"invitation-tab\"\n [class.invitation-tab--active]=\"activeTab === s\"\n (click)=\"setTab($any(s))\">\n {{ s }}\n <span class=\"invitation-tab__count\">{{ countFor($any(s)) }}</span>\n </button>\n }\n </div>\n\n @if (loading) {\n <div class=\"invitation-state\">\n <mj-loading text=\"Loading invitations...\" size=\"medium\"></mj-loading>\n </div>\n } @else if (visibleInvitations.length === 0) {\n <div class=\"invitation-state invitation-state--empty\">\n <i class=\"fa-solid fa-envelope\"></i>\n <span>No {{ activeTab.toLowerCase() }} invitations.</span>\n </div>\n } @else {\n <table class=\"invitation-table\">\n <thead>\n <tr>\n <th>Email</th>\n <th>Role</th>\n <th>Sent</th>\n <th>Expiry</th>\n <th></th>\n </tr>\n </thead>\n <tbody>\n @for (inv of visibleInvitations; track inv.ID) {\n <tr>\n <td>{{ inv.Email }}</td>\n <td>\n <span class=\"role-chip\" [class.role-chip--editor]=\"inv.Role === 'Editor'\">\n {{ inv.Role }}\n </span>\n </td>\n <td>{{ inv.CreatedAt.toLocaleDateString() }}</td>\n <td>{{ formatExpiry(inv.ExpiresAt) }}</td>\n <td class=\"invitation-actions\">\n @if (activeTab === 'Pending') {\n <button mjButton size=\"sm\" variant=\"outline\" (click)=\"Resend(inv)\" title=\"Send a fresh invitation\">\n <i class=\"fa-solid fa-paper-plane\"></i>\n Resend\n </button>\n <button mjButton size=\"sm\" variant=\"danger\" (click)=\"Revoke(inv.ID)\">\n <i class=\"fa-solid fa-xmark\"></i>\n Revoke\n </button>\n } @else if (activeTab === 'Expired') {\n <button mjButton size=\"sm\" variant=\"outline\" (click)=\"Resend(inv)\">\n <i class=\"fa-solid fa-rotate-right\"></i>\n Re-send\n </button>\n }\n </td>\n </tr>\n }\n </tbody>\n </table>\n }\n</div>\n"]}
|
|
@@ -33,7 +33,11 @@ export declare class ListManagementDialogComponent extends BaseAngularComponent
|
|
|
33
33
|
/**
|
|
34
34
|
* Controls dialog visibility
|
|
35
35
|
*/
|
|
36
|
+
get Visible(): boolean;
|
|
37
|
+
set Visible(value: boolean);
|
|
38
|
+
/** @deprecated Use {@link Visible}. */
|
|
36
39
|
get visible(): boolean;
|
|
40
|
+
/** @deprecated Use {@link Visible}. */
|
|
37
41
|
set visible(value: boolean);
|
|
38
42
|
private _visible;
|
|
39
43
|
/** Set on each closed→open transition; cleared once init actually runs (requires config). */
|
|
@@ -43,27 +47,91 @@ export declare class ListManagementDialogComponent extends BaseAngularComponent
|
|
|
43
47
|
/**
|
|
44
48
|
* Emitted when dialog is closed with results
|
|
45
49
|
*/
|
|
50
|
+
Complete: EventEmitter<ListManagementResult>;
|
|
51
|
+
/**
|
|
52
|
+
* @deprecated Use {@link Complete}.
|
|
53
|
+
*
|
|
54
|
+
* The same emitter under the old binding name, so a template still binding
|
|
55
|
+
* (complete) keeps working. Must stay AFTER Complete: class fields
|
|
56
|
+
* initialise in order, and the other way round this captures undefined.
|
|
57
|
+
*/
|
|
46
58
|
complete: EventEmitter<ListManagementResult>;
|
|
47
59
|
/**
|
|
48
60
|
* Emitted when dialog is cancelled
|
|
49
61
|
*/
|
|
50
62
|
cancel: EventEmitter<void>;
|
|
51
|
-
|
|
63
|
+
Loading: boolean;
|
|
64
|
+
/** @deprecated Use {@link Loading}. */
|
|
65
|
+
get loading(): boolean;
|
|
66
|
+
/** @deprecated Use {@link Loading}. */
|
|
67
|
+
set loading(value: boolean);
|
|
52
68
|
saving: boolean;
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
69
|
+
SearchText: string;
|
|
70
|
+
/** @deprecated Use {@link SearchText}. */
|
|
71
|
+
get searchText(): string;
|
|
72
|
+
/** @deprecated Use {@link SearchText}. */
|
|
73
|
+
set searchText(value: string);
|
|
74
|
+
ActiveTab: ListFilterTab;
|
|
75
|
+
/** @deprecated Use {@link ActiveTab}. */
|
|
76
|
+
get activeTab(): ListFilterTab;
|
|
77
|
+
/** @deprecated Use {@link ActiveTab}. */
|
|
78
|
+
set activeTab(value: ListFilterTab);
|
|
79
|
+
SortOption: ListSortOption;
|
|
80
|
+
/** @deprecated Use {@link SortOption}. */
|
|
81
|
+
get sortOption(): ListSortOption;
|
|
82
|
+
/** @deprecated Use {@link SortOption}. */
|
|
83
|
+
set sortOption(value: ListSortOption);
|
|
84
|
+
ShowCreateForm: boolean;
|
|
85
|
+
/** @deprecated Use {@link ShowCreateForm}. */
|
|
86
|
+
get showCreateForm(): boolean;
|
|
87
|
+
/** @deprecated Use {@link ShowCreateForm}. */
|
|
88
|
+
set showCreateForm(value: boolean);
|
|
89
|
+
AllLists: ListItemViewModel[];
|
|
90
|
+
/** @deprecated Use {@link AllLists}. */
|
|
91
|
+
get allLists(): ListItemViewModel[];
|
|
92
|
+
/** @deprecated Use {@link AllLists}. */
|
|
93
|
+
set allLists(value: ListItemViewModel[]);
|
|
94
|
+
FilteredLists: ListItemViewModel[];
|
|
95
|
+
/** @deprecated Use {@link FilteredLists}. */
|
|
96
|
+
get filteredLists(): ListItemViewModel[];
|
|
97
|
+
/** @deprecated Use {@link FilteredLists}. */
|
|
98
|
+
set filteredLists(value: ListItemViewModel[]);
|
|
99
|
+
Categories: MJListCategoryEntity[];
|
|
100
|
+
/** @deprecated Use {@link Categories}. */
|
|
101
|
+
get categories(): MJListCategoryEntity[];
|
|
102
|
+
/** @deprecated Use {@link Categories}. */
|
|
103
|
+
set categories(value: MJListCategoryEntity[]);
|
|
104
|
+
NewListName: string;
|
|
105
|
+
/** @deprecated Use {@link NewListName}. */
|
|
106
|
+
get newListName(): string;
|
|
107
|
+
/** @deprecated Use {@link NewListName}. */
|
|
108
|
+
set newListName(value: string);
|
|
109
|
+
NewListDescription: string;
|
|
110
|
+
/** @deprecated Use {@link NewListDescription}. */
|
|
111
|
+
get newListDescription(): string;
|
|
112
|
+
/** @deprecated Use {@link NewListDescription}. */
|
|
113
|
+
set newListDescription(value: string);
|
|
114
|
+
NewListCategoryId: string | null;
|
|
115
|
+
/** @deprecated Use {@link NewListCategoryId}. */
|
|
116
|
+
get newListCategoryId(): string | null;
|
|
117
|
+
/** @deprecated Use {@link NewListCategoryId}. */
|
|
118
|
+
set newListCategoryId(value: string | null);
|
|
63
119
|
private originalMembership;
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
120
|
+
AddedToLists: Set<string>;
|
|
121
|
+
/** @deprecated Use {@link AddedToLists}. */
|
|
122
|
+
get addedToLists(): Set<string>;
|
|
123
|
+
/** @deprecated Use {@link AddedToLists}. */
|
|
124
|
+
set addedToLists(value: Set<string>);
|
|
125
|
+
RemovedFromLists: Set<string>;
|
|
126
|
+
/** @deprecated Use {@link RemovedFromLists}. */
|
|
127
|
+
get removedFromLists(): Set<string>;
|
|
128
|
+
/** @deprecated Use {@link RemovedFromLists}. */
|
|
129
|
+
set removedFromLists(value: Set<string>);
|
|
130
|
+
NewlyCreatedLists: MJListEntity[];
|
|
131
|
+
/** @deprecated Use {@link NewlyCreatedLists}. */
|
|
132
|
+
get newlyCreatedLists(): MJListEntity[];
|
|
133
|
+
/** @deprecated Use {@link NewlyCreatedLists}. */
|
|
134
|
+
set newlyCreatedLists(value: MJListEntity[]);
|
|
67
135
|
private destroy$;
|
|
68
136
|
private searchSubject;
|
|
69
137
|
constructor(listService: ListManagementService, cdr: ChangeDetectorRef);
|
|
@@ -72,22 +140,32 @@ export declare class ListManagementDialogComponent extends BaseAngularComponent
|
|
|
72
140
|
/**
|
|
73
141
|
* Get dialog title based on config
|
|
74
142
|
*/
|
|
143
|
+
get DialogTitle(): string;
|
|
144
|
+
/** @deprecated Use {@link DialogTitle}. */
|
|
75
145
|
get dialogTitle(): string;
|
|
76
146
|
/**
|
|
77
147
|
* Get subtitle showing context
|
|
78
148
|
*/
|
|
149
|
+
get DialogSubtitle(): string;
|
|
150
|
+
/** @deprecated Use {@link DialogSubtitle}. */
|
|
79
151
|
get dialogSubtitle(): string;
|
|
80
152
|
/**
|
|
81
153
|
* Check if there are pending changes
|
|
82
154
|
*/
|
|
155
|
+
get HasChanges(): boolean;
|
|
156
|
+
/** @deprecated Use {@link HasChanges}. */
|
|
83
157
|
get hasChanges(): boolean;
|
|
84
158
|
/**
|
|
85
159
|
* Get count of lists to add to
|
|
86
160
|
*/
|
|
161
|
+
get AddCount(): number;
|
|
162
|
+
/** @deprecated Use {@link AddCount}. */
|
|
87
163
|
get addCount(): number;
|
|
88
164
|
/**
|
|
89
165
|
* Get count of lists to remove from
|
|
90
166
|
*/
|
|
167
|
+
get RemoveCount(): number;
|
|
168
|
+
/** @deprecated Use {@link RemoveCount}. */
|
|
91
169
|
get removeCount(): number;
|
|
92
170
|
/**
|
|
93
171
|
* Setup search with debounce
|
|
@@ -108,18 +186,26 @@ export declare class ListManagementDialogComponent extends BaseAngularComponent
|
|
|
108
186
|
/**
|
|
109
187
|
* Handle search input
|
|
110
188
|
*/
|
|
189
|
+
OnSearchInput(event: Event): void;
|
|
190
|
+
/** @deprecated Use {@link OnSearchInput}. */
|
|
111
191
|
onSearchInput(event: Event): void;
|
|
112
192
|
/**
|
|
113
193
|
* Clear search
|
|
114
194
|
*/
|
|
195
|
+
ClearSearch(): void;
|
|
196
|
+
/** @deprecated Use {@link ClearSearch}. */
|
|
115
197
|
clearSearch(): void;
|
|
116
198
|
/**
|
|
117
199
|
* Change active tab
|
|
118
200
|
*/
|
|
201
|
+
SetActiveTab(tab: ListFilterTab): void;
|
|
202
|
+
/** @deprecated Use {@link SetActiveTab}. */
|
|
119
203
|
setActiveTab(tab: ListFilterTab): void;
|
|
120
204
|
/**
|
|
121
205
|
* Change sort option
|
|
122
206
|
*/
|
|
207
|
+
SetSortOption(option: ListSortOption): void;
|
|
208
|
+
/** @deprecated Use {@link SetSortOption}. */
|
|
123
209
|
setSortOption(option: ListSortOption): void;
|
|
124
210
|
/**
|
|
125
211
|
* Apply all filters and sorting
|
|
@@ -128,38 +214,56 @@ export declare class ListManagementDialogComponent extends BaseAngularComponent
|
|
|
128
214
|
/**
|
|
129
215
|
* Toggle list selection for adding
|
|
130
216
|
*/
|
|
217
|
+
ToggleListForAdd(vm: ListItemViewModel): void;
|
|
218
|
+
/** @deprecated Use {@link ToggleListForAdd}. */
|
|
131
219
|
toggleListForAdd(vm: ListItemViewModel): void;
|
|
132
220
|
/**
|
|
133
221
|
* Toggle list selection for removal
|
|
134
222
|
*/
|
|
223
|
+
ToggleListForRemove(vm: ListItemViewModel): void;
|
|
224
|
+
/** @deprecated Use {@link ToggleListForRemove}. */
|
|
135
225
|
toggleListForRemove(vm: ListItemViewModel): void;
|
|
136
226
|
/**
|
|
137
227
|
* Get membership indicator class
|
|
138
228
|
*/
|
|
229
|
+
GetMembershipClass(vm: ListItemViewModel): string;
|
|
230
|
+
/** @deprecated Use {@link GetMembershipClass}. */
|
|
139
231
|
getMembershipClass(vm: ListItemViewModel): string;
|
|
140
232
|
/**
|
|
141
233
|
* Get membership indicator text
|
|
142
234
|
*/
|
|
235
|
+
GetMembershipText(vm: ListItemViewModel): string;
|
|
236
|
+
/** @deprecated Use {@link GetMembershipText}. */
|
|
143
237
|
getMembershipText(vm: ListItemViewModel): string;
|
|
144
238
|
/**
|
|
145
239
|
* Get membership icon
|
|
146
240
|
*/
|
|
241
|
+
GetMembershipIcon(vm: ListItemViewModel): string;
|
|
242
|
+
/** @deprecated Use {@link GetMembershipIcon}. */
|
|
147
243
|
getMembershipIcon(vm: ListItemViewModel): string;
|
|
148
244
|
/**
|
|
149
245
|
* Show create list form
|
|
150
246
|
*/
|
|
247
|
+
ShowCreateListForm(): void;
|
|
248
|
+
/** @deprecated Use {@link ShowCreateListForm}. */
|
|
151
249
|
showCreateListForm(): void;
|
|
152
250
|
/**
|
|
153
251
|
* Cancel create list form
|
|
154
252
|
*/
|
|
253
|
+
CancelCreateList(): void;
|
|
254
|
+
/** @deprecated Use {@link CancelCreateList}. */
|
|
155
255
|
cancelCreateList(): void;
|
|
156
256
|
/**
|
|
157
257
|
* Create a new list
|
|
158
258
|
*/
|
|
259
|
+
CreateList(): Promise<void>;
|
|
260
|
+
/** @deprecated Use {@link CreateList}. */
|
|
159
261
|
createList(): Promise<void>;
|
|
160
262
|
/**
|
|
161
263
|
* Apply changes and close dialog
|
|
162
264
|
*/
|
|
265
|
+
ApplyChanges(): Promise<void>;
|
|
266
|
+
/** @deprecated Use {@link ApplyChanges}. */
|
|
163
267
|
applyChanges(): Promise<void>;
|
|
164
268
|
/**
|
|
165
269
|
* Cancel and close dialog
|
|
@@ -172,12 +276,16 @@ export declare class ListManagementDialogComponent extends BaseAngularComponent
|
|
|
172
276
|
/**
|
|
173
277
|
* Check if we should show the add button for a list
|
|
174
278
|
*/
|
|
279
|
+
ShowAddButton(vm: ListItemViewModel): boolean;
|
|
280
|
+
/** @deprecated Use {@link ShowAddButton}. */
|
|
175
281
|
showAddButton(vm: ListItemViewModel): boolean;
|
|
176
282
|
/**
|
|
177
283
|
* Check if we should show the remove button for a list
|
|
178
284
|
*/
|
|
285
|
+
ShowRemoveButton(vm: ListItemViewModel): boolean;
|
|
286
|
+
/** @deprecated Use {@link ShowRemoveButton}. */
|
|
179
287
|
showRemoveButton(vm: ListItemViewModel): boolean;
|
|
180
288
|
static ɵfac: i0.ɵɵFactoryDeclaration<ListManagementDialogComponent, never>;
|
|
181
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<ListManagementDialogComponent, "mj-list-management-dialog", never, { "config": { "alias": "config"; "required": false; }; "visible": { "alias": "visible"; "required": false; }; }, { "complete": "complete"; "cancel": "cancel"; }, never, never, false, never>;
|
|
289
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<ListManagementDialogComponent, "mj-list-management-dialog", never, { "config": { "alias": "config"; "required": false; }; "Visible": { "alias": "Visible"; "required": false; }; "visible": { "alias": "visible"; "required": false; }; }, { "Complete": "Complete"; "complete": "complete"; "cancel": "cancel"; }, never, never, false, never>;
|
|
182
290
|
}
|
|
183
291
|
//# sourceMappingURL=list-management-dialog.component.d.ts.map
|
package/dist/lib/components/list-management-dialog/list-management-dialog.component.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list-management-dialog.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/list-management-dialog/list-management-dialog.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,YAAY,EACZ,MAAM,EACN,SAAS,EACT,iBAAiB,EAClB,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAGrE,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACnF,OAAO,EAAE,qBAAqB,EAAE,MAAM,wCAAwC,CAAC;AAE/E,OAAO,EACL,0BAA0B,EAC1B,oBAAoB,EACpB,iBAAiB,EACjB,aAAa,EACb,cAAc,EAGf,MAAM,qCAAqC,CAAC;;AAE7C;;;;;;;;;;GAUG;AACH,qBAMa,6BAA8B,SAAQ,oBAAqB,YAAW,MAAM,EAAE,SAAS;
|
|
1
|
+
{"version":3,"file":"list-management-dialog.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/list-management-dialog/list-management-dialog.component.ts"],"names":[],"mappings":"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"}
|