@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.
Files changed (53) hide show
  1. package/dist/lib/components/audience-source-picker/audience-source-picker.component.d.ts +74 -14
  2. package/dist/lib/components/audience-source-picker/audience-source-picker.component.d.ts.map +1 -1
  3. package/dist/lib/components/audience-source-picker/audience-source-picker.component.js +177 -57
  4. package/dist/lib/components/audience-source-picker/audience-source-picker.component.js.map +1 -1
  5. package/dist/lib/components/audience-source-summary/audience-source-summary.component.d.ts +7 -1
  6. package/dist/lib/components/audience-source-summary/audience-source-summary.component.d.ts.map +1 -1
  7. package/dist/lib/components/audience-source-summary/audience-source-summary.component.js +17 -5
  8. package/dist/lib/components/audience-source-summary/audience-source-summary.component.js.map +1 -1
  9. package/dist/lib/components/list-audit-log/list-audit-log.component.d.ts +30 -4
  10. package/dist/lib/components/list-audit-log/list-audit-log.component.d.ts.map +1 -1
  11. package/dist/lib/components/list-audit-log/list-audit-log.component.js +54 -14
  12. package/dist/lib/components/list-audit-log/list-audit-log.component.js.map +1 -1
  13. package/dist/lib/components/list-delta-confirm/list-delta-confirm.component.d.ts +17 -1
  14. package/dist/lib/components/list-delta-confirm/list-delta-confirm.component.d.ts.map +1 -1
  15. package/dist/lib/components/list-delta-confirm/list-delta-confirm.component.js +45 -13
  16. package/dist/lib/components/list-delta-confirm/list-delta-confirm.component.js.map +1 -1
  17. package/dist/lib/components/list-invitations/list-invitations.component.d.ts +48 -8
  18. package/dist/lib/components/list-invitations/list-invitations.component.d.ts.map +1 -1
  19. package/dist/lib/components/list-invitations/list-invitations.component.js +108 -28
  20. package/dist/lib/components/list-invitations/list-invitations.component.js.map +1 -1
  21. package/dist/lib/components/list-management-dialog/list-management-dialog.component.d.ts +123 -15
  22. package/dist/lib/components/list-management-dialog/list-management-dialog.component.d.ts.map +1 -1
  23. package/dist/lib/components/list-management-dialog/list-management-dialog.component.js +312 -100
  24. package/dist/lib/components/list-management-dialog/list-management-dialog.component.js.map +1 -1
  25. package/dist/lib/components/list-share-dialog/list-share-dialog.component.d.ts +128 -14
  26. package/dist/lib/components/list-share-dialog/list-share-dialog.component.d.ts.map +1 -1
  27. package/dist/lib/components/list-share-dialog/list-share-dialog.component.js +288 -92
  28. package/dist/lib/components/list-share-dialog/list-share-dialog.component.js.map +1 -1
  29. package/dist/lib/components/list-stats/list-stats.component.d.ts +32 -6
  30. package/dist/lib/components/list-stats/list-stats.component.d.ts.map +1 -1
  31. package/dist/lib/components/list-stats/list-stats.component.js +67 -15
  32. package/dist/lib/components/list-stats/list-stats.component.js.map +1 -1
  33. package/dist/lib/components/save-view-as-list-dialog/save-view-as-list-dialog.component.d.ts +44 -8
  34. package/dist/lib/components/save-view-as-list-dialog/save-view-as-list-dialog.component.d.ts.map +1 -1
  35. package/dist/lib/components/save-view-as-list-dialog/save-view-as-list-dialog.component.js +100 -28
  36. package/dist/lib/components/save-view-as-list-dialog/save-view-as-list-dialog.component.js.map +1 -1
  37. package/dist/lib/components/shared-with-me/shared-with-me.component.d.ts +18 -2
  38. package/dist/lib/components/shared-with-me/shared-with-me.component.d.ts.map +1 -1
  39. package/dist/lib/components/shared-with-me/shared-with-me.component.js +41 -9
  40. package/dist/lib/components/shared-with-me/shared-with-me.component.js.map +1 -1
  41. package/dist/lib/components/tag-chips/tag-chips.component.d.ts +30 -6
  42. package/dist/lib/components/tag-chips/tag-chips.component.d.ts.map +1 -1
  43. package/dist/lib/components/tag-chips/tag-chips.component.js +76 -28
  44. package/dist/lib/components/tag-chips/tag-chips.component.js.map +1 -1
  45. package/dist/lib/services/list-management.service.d.ts +25 -1
  46. package/dist/lib/services/list-management.service.d.ts.map +1 -1
  47. package/dist/lib/services/list-management.service.js +59 -11
  48. package/dist/lib/services/list-management.service.js.map +1 -1
  49. package/dist/lib/services/list-sharing.service.d.ts +42 -1
  50. package/dist/lib/services/list-sharing.service.d.ts.map +1 -1
  51. package/dist/lib/services/list-sharing.service.js +85 -17
  52. package/dist/lib/services/list-sharing.service.js.map +1 -1
  53. package/package.json +11 -11
@@ -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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","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 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 /**\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"]}
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
- entries: AuditLogRow[];
31
- eventTypes: Array<{
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
- filterType: string;
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
- loading: boolean;
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;IAC5B,UAAU,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAM;IACrD,UAAU,SAAM;IAChB,UAAU,SAAM;IAChB,OAAO,UAAS;IAChB,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;IAEM,cAAc,IAAI,IAAI;IAItB,UAAU,CAAC,CAAC,EAAE,IAAI,GAAG,MAAM;IAI3B,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM;IAUhD;;;;OAIG;YACW,WAAW;yCAtEd,qBAAqB;2CAArB,qBAAqB;CA2JjC"}
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
- entries = [];
120
- eventTypes = [];
121
- filterType = '';
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
- loading = false;
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 visibleEntries() {
163
+ get VisibleEntries() {
132
164
  const term = this.filterText.trim().toLowerCase();
133
- return this.entries.filter((e) => {
134
- if (this.filterType && e.AuditLogTypeID !== this.filterType)
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
- formatDetails(raw) {
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.loading = true;
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.entries = [];
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.entries = rows.map((r) => ({
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.eventTypes = [...typeById.entries()]
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.entries = [];
275
+ this.Entries = [];
236
276
  }
237
277
  finally {
238
- this.loading = false;
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":"AAAA,OAAO,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,SAAS,EAAE,KAAK,EAAU,MAAM,EAAE,MAAM,eAAe,CAAC;AAE7G,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;;;;;;ICevC,iCAAuB;IAAA,YAAY;IAAA,iBAAS;;;IAApC,+BAAc;IAAC,cAAY;IAAZ,+BAAY;;;IAMvC,8BAAyB;IACvB,iCAAmE;IACrE,iBAAM;;;IAEN,8BAA4C;IAC1C,wBAAgD;IAChD,YACF;IAAA,iBAAM;;;IADJ,eACF;IADE,oDACF;;;IAEA,+BAA4C;IAC1C,wBAA6C;IAC7C,4BAAM;IAAA,+DAA+C;IACvD,AADuD,iBAAO,EACxD;;;IAuBQ,AADF,mCAAgC,cACrB;IAAA,uBAAO;IAAA,iBAAU;IAC1B,2BAAK;IAAA,YAAkC;IACzC,AADyC,iBAAM,EACrC;;;;IADH,eAAkC;IAAlC,4DAAkC;;;IAV7C,AADF,0BAAI,aAC0B;IAAA,YAAiC;IAAA,iBAAK;IAClE,8BAA4B;IAAA,YAAoB;IAAA,iBAAK;IAEnD,AADF,0BAAI,eACuB;IAAA,YAAqB;IAChD,AADgD,iBAAO,EAClD;IACL,8BAAmC;IACjC,YACA;IAAA,oHAAqB;IAOzB,AADE,iBAAK,EACF;;;;IAdyB,eAAiC;IAAjC,2DAAiC;IACjC,eAAoB;IAApB,uCAAoB;IAErB,eAAqB;IAArB,wCAAqB;IAG9C,eACA;IADA,qDACA;IAAA,cAKC;IALD,4CAKC;;;IArBL,AADF,AADF,AADF,iCAA2B,YAClB,SACD,SACE;IAAA,oBAAI;IAAA,iBAAK;IACb,0BAAI;IAAA,mBAAG;IAAA,iBAAK;IACZ,0BAAI;IAAA,qBAAK;IAAA,iBAAK;IACd,0BAAI;IAAA,4BAAW;IAEnB,AADE,AADiB,iBAAK,EACjB,EACC;IACR,8BAAO;IACL,4GAiBC;IAEL,AADE,iBAAQ,EACF;;;IAnBJ,gBAiBC;IAjBD,oCAiBC;;ADjCT,MAAM,OAAO,qBAAsB,SAAQ,oBAAoB;IAC5C,GAAG,GAAG,MAAM,CAAC,iBAAiB,CAAC,CAAC;IAEjD,uCAAuC;IACvC,IACI,MAAM;QACR,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IACD,IAAI,MAAM,CAAC,KAAoB;QAC7B,IAAI,IAAI,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;YAC3B,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;YACrB,IAAI,KAAK,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;gBAC9B,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC;YAC1B,CAAC;QACH,CAAC;IACH,CAAC;IACO,OAAO,GAAkB,IAAI,CAAC;IAEtC,0EAA0E;IACjE,QAAQ,GAAG,GAAG,CAAC;IAEjB,OAAO,GAAkB,EAAE,CAAC;IAC5B,UAAU,GAAwC,EAAE,CAAC;IACrD,UAAU,GAAG,EAAE,CAAC;IAChB,UAAU,GAAG,EAAE,CAAC;IAChB,OAAO,GAAG,KAAK,CAAC;IAChB,YAAY,GAAkB,IAAI,CAAC;IAElC,WAAW,GAAG,KAAK,CAAC;IAE5B,KAAK,CAAC,QAAQ;QACZ,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,IAAI,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;IAC7C,CAAC;IAED,IAAW,cAAc;QACvB,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAClD,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;YAC/B,IAAI,IAAI,CAAC,UAAU,IAAI,CAAC,CAAC,cAAc,KAAK,IAAI,CAAC,UAAU;gBAAE,OAAO,KAAK,CAAC;YAC1E,IAAI,IAAI,EAAE,CAAC;gBACT,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC,WAAW,EAAE,CAAC;gBAC3D,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC;oBAAE,OAAO,KAAK,CAAC;YACxC,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,cAAc;QACnB,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC1B,CAAC;IAEM,UAAU,CAAC,CAAO;QACvB,OAAO,CAAC,CAAC,cAAc,EAAE,CAAC;IAC5B,CAAC;IAEM,aAAa,CAAC,GAAkB;QACrC,IAAI,CAAC,GAAG;YAAE,OAAO,EAAE,CAAC;QACpB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC/B,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QACzC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,GAAG,CAAC;QACb,CAAC;IACH,CAAC;IAED;;;;OAIG;IACK,KAAK,CAAC,WAAW;QACvB,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO;QAC1B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAExB,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC;YAC9B,MAAM,WAAW,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC;YACpE,IAAI,CAAC,WAAW;gBAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;YAE5E,MAAM,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC;YAC5C,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,OAAO,CAO1B;gBACD,UAAU,EAAE,gBAAgB;gBAC5B,WAAW,EAAE,aAAa,WAAW,CAAC,EAAE,mBAAmB,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG;gBAC9F,OAAO,EAAE,qBAAqB;gBAC9B,OAAO,EAAE,IAAI,CAAC,QAAQ;gBACtB,MAAM,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,gBAAgB,EAAE,aAAa,EAAE,SAAS,EAAE,gBAAgB,CAAC;gBACtF,UAAU,EAAE,QAAQ;aACrB,CAAC,CAAC;YAEH,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;gBAClB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,IAAI,2BAA2B,CAAC;gBACrE,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;gBAClB,OAAO;YACT,CAAC;YAED,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;YAChC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YACvE,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;YAE/E,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;gBACvC,OAAO,CAAC,MAAM,GAAG,CAAC;oBAChB,CAAC,CAAC,EAAE,CAAC,OAAO,CAA+B;wBACvC,UAAU,EAAE,WAAW;wBACvB,WAAW,EAAE,UAAU,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG;wBAClE,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC;wBACtB,UAAU,EAAE,QAAQ;qBACrB,CAAC;oBACJ,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;gBACnD,OAAO,CAAC,MAAM,GAAG,CAAC;oBAChB,CAAC,CAAC,EAAE,CAAC,OAAO,CAA+B;wBACvC,UAAU,EAAE,qBAAqB;wBACjC,WAAW,EAAE,UAAU,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG;wBAClE,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC;wBACtB,UAAU,EAAE,QAAQ;qBACrB,CAAC;oBACJ,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;aACpD,CAAC,CAAC;YAEH,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;YAC3C,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,IAAI,EAAE;gBAAE,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YAChF,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;YAC3C,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,IAAI,EAAE;gBAAE,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YAEhF,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC9B,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;gBAChB,SAAS,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC;gBACrC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;gBACxB,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,gBAAgB;gBAC5D,cAAc,EAAE,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC;gBACxC,SAAS,EAAE,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,IAAI,iBAAiB;gBACtE,WAAW,EAAE,CAAC,CAAC,WAAW,IAAI,EAAE;gBAChC,OAAO,EAAE,CAAC,CAAC,OAAO;aACnB,CAAC,CAAC,CAAC;YAEJ,qEAAqE;YACrE,IAAI,CAAC,UAAU,GAAG,CAAC,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC;iBACtC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;iBACnC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAClD,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,CAAC,YAAY,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YAC/D,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;QACpB,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;YACrB,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAC1B,CAAC;IACH,CAAC;iQA1JU,qBAAqB,yBAArB,qBAAqB;6DAArB,qBAAqB;YC9B9B,AADF,AADF,8BAAuB,aACW,aACJ;YACxB,uBAAkC;YAClC,gCAKiD;YAF/C,mNAAwB;YACxB,iHAAiB,oBAAgB,IAAC;YAEtC,AANE,iBAKiD,EAC7C;YACN,iCAI+B;YAF7B,oNAAwB;YACxB,kHAAiB,oBAAgB,IAAC;YAElC,iCAAiB;YAAA,0BAAU;YAAA,iBAAS;YACpC,2FAEC;YAEL,AADE,iBAAS,EACL;YAgBJ,AALA,AALA,AAJF,yFAAe,mEAIY,oEAKe,uEAKjC;YAgCX,iBAAM;;YA9DE,eAAwB;YAAxB,8CAAwB;YAM1B,cAAwB;YAAxB,8CAAwB;YAIxB,eAEC;YAFD,6BAEC;YAIL,eA6CC;YA7CD,sGA6CC;;;iFDpCU,qBAAqB;cAPjC,SAAS;6BACI,KAAK,YACP,mBAAmB,mBAGZ,uBAAuB,CAAC,MAAM;;kBAM9C,KAAK;;kBAeL,KAAK;;kFAnBK,qBAAqB","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
- dropAcknowledged: boolean;
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;yCAvFzC,yBAAyB;2CAAzB,yBAAyB;CA0FrC"}
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.dropAcknowledged = false;
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
- dropAcknowledged = false;
256
- get hasDrops() {
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
- get canConfirm() {
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.hasDrops)
274
+ if (!this.HasDrops)
263
275
  return true;
264
- return this.dropAcknowledged;
276
+ return this.DropAcknowledged;
265
277
  }
266
- get previewAdds() {
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
- get previewRemoves() {
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
- get confirmButtonLabel() {
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.hasDrops)
299
+ if (this.HasDrops)
276
300
  return `Confirm Removal & Update`;
277
301
  return `Confirm (Add ${this.Delta.Counts.Add})`;
278
302
  }
279
- get targetDisplayName() {
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.canConfirm || !this.Delta)
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.dropAcknowledged = value;
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
- activeTab: InvitationStatus;
33
- invitations: InvitationRow[];
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
- visibleInvitations: InvitationRow[];
42
- loading: boolean;
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
- submitting: boolean;
45
- newEmail: string;
46
- newRole: 'Editor' | 'Viewer';
47
- newTtlHours: number;
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>;