@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
@@ -209,30 +209,94 @@ export class SaveViewAsListDialogComponent extends BaseAngularComponent {
209
209
  RecordCount = null;
210
210
  Save = new EventEmitter();
211
211
  Cancel = new EventEmitter();
212
- listName = '';
212
+ ListName = '';
213
+ /** @deprecated Use {@link ListName}. */
214
+ get listName() {
215
+ return this.ListName;
216
+ }
217
+ /** @deprecated Use {@link ListName}. */
218
+ set listName(value) {
219
+ this.ListName = value;
220
+ }
213
221
  description = '';
214
- categoryId = null;
215
- rememberLineage = true;
216
- useSnapshot = true;
217
- refreshMode = 'Additive';
218
- categories = [];
219
- loadingCategories = false;
220
- submitting = false;
222
+ CategoryId = null;
223
+ /** @deprecated Use {@link CategoryId}. */
224
+ get categoryId() {
225
+ return this.CategoryId;
226
+ }
227
+ /** @deprecated Use {@link CategoryId}. */
228
+ set categoryId(value) {
229
+ this.CategoryId = value;
230
+ }
231
+ RememberLineage = true;
232
+ /** @deprecated Use {@link RememberLineage}. */
233
+ get rememberLineage() {
234
+ return this.RememberLineage;
235
+ }
236
+ /** @deprecated Use {@link RememberLineage}. */
237
+ set rememberLineage(value) {
238
+ this.RememberLineage = value;
239
+ }
240
+ UseSnapshot = true;
241
+ /** @deprecated Use {@link UseSnapshot}. */
242
+ get useSnapshot() {
243
+ return this.UseSnapshot;
244
+ }
245
+ /** @deprecated Use {@link UseSnapshot}. */
246
+ set useSnapshot(value) {
247
+ this.UseSnapshot = value;
248
+ }
249
+ RefreshMode = 'Additive';
250
+ /** @deprecated Use {@link RefreshMode}. */
251
+ get refreshMode() {
252
+ return this.RefreshMode;
253
+ }
254
+ /** @deprecated Use {@link RefreshMode}. */
255
+ set refreshMode(value) {
256
+ this.RefreshMode = value;
257
+ }
258
+ Categories = [];
259
+ /** @deprecated Use {@link Categories}. */
260
+ get categories() {
261
+ return this.Categories;
262
+ }
263
+ /** @deprecated Use {@link Categories}. */
264
+ set categories(value) {
265
+ this.Categories = value;
266
+ }
267
+ LoadingCategories = false;
268
+ /** @deprecated Use {@link LoadingCategories}. */
269
+ get loadingCategories() {
270
+ return this.LoadingCategories;
271
+ }
272
+ /** @deprecated Use {@link LoadingCategories}. */
273
+ set loadingCategories(value) {
274
+ this.LoadingCategories = value;
275
+ }
276
+ Submitting = false;
277
+ /** @deprecated Use {@link Submitting}. */
278
+ get submitting() {
279
+ return this.Submitting;
280
+ }
281
+ /** @deprecated Use {@link Submitting}. */
282
+ set submitting(value) {
283
+ this.Submitting = value;
284
+ }
221
285
  async ngOnInit() {
222
286
  await this.loadCategories();
223
287
  }
224
288
  OnSave() {
225
- if (!this.canSave)
289
+ if (!this.CanSave)
226
290
  return;
227
- this.submitting = true;
291
+ this.Submitting = true;
228
292
  const payload = {
229
- ListName: this.listName.trim(),
293
+ ListName: this.ListName.trim(),
230
294
  Description: this.description.trim() || undefined,
231
- CategoryId: this.categoryId ?? undefined,
232
- RememberLineage: this.rememberLineage,
295
+ CategoryId: this.CategoryId ?? undefined,
296
+ RememberLineage: this.RememberLineage,
233
297
  // UseSnapshot only meaningful when lineage is remembered.
234
- UseSnapshot: this.rememberLineage && this.useSnapshot,
235
- RefreshMode: this.refreshMode,
298
+ UseSnapshot: this.RememberLineage && this.UseSnapshot,
299
+ RefreshMode: this.RefreshMode,
236
300
  };
237
301
  this.Save.emit(payload);
238
302
  }
@@ -240,28 +304,36 @@ export class SaveViewAsListDialogComponent extends BaseAngularComponent {
240
304
  this.Cancel.emit();
241
305
  }
242
306
  OnLineageChange(remember) {
243
- this.rememberLineage = remember;
307
+ this.RememberLineage = remember;
244
308
  // If lineage is off, snapshot has no meaning — keep the checkbox state
245
309
  // intact so re-enabling lineage restores it, but the emitted payload
246
310
  // forces UseSnapshot=false (see `OnSave`).
247
311
  }
312
+ get CanSave() {
313
+ return !!this.ViewId && this.ListName.trim().length > 0 && !this.Submitting;
314
+ }
315
+ /** @deprecated Use {@link CanSave}. */
248
316
  get canSave() {
249
- return !!this.ViewId && this.listName.trim().length > 0 && !this.submitting;
317
+ return this.CanSave;
250
318
  }
251
- get confirmButtonLabel() {
252
- if (this.submitting)
319
+ get ConfirmButtonLabel() {
320
+ if (this.Submitting)
253
321
  return 'Saving...';
254
322
  if (this.RecordCount != null)
255
323
  return `Save List (${this.RecordCount} records)`;
256
324
  return 'Save List';
257
325
  }
326
+ /** @deprecated Use {@link ConfirmButtonLabel}. */
327
+ get confirmButtonLabel() {
328
+ return this.ConfirmButtonLabel;
329
+ }
258
330
  /**
259
331
  * Load list categories for the category dropdown. Multi-provider safe.
260
332
  * Failures degrade gracefully — the dropdown just shows "Uncategorized"
261
333
  * and we log so the user can troubleshoot.
262
334
  */
263
335
  async loadCategories() {
264
- this.loadingCategories = true;
336
+ this.LoadingCategories = true;
265
337
  try {
266
338
  const rv = RunView.FromMetadataProvider(this.ProviderToUse);
267
339
  const result = await rv.RunView({
@@ -270,22 +342,22 @@ export class SaveViewAsListDialogComponent extends BaseAngularComponent {
270
342
  ResultType: 'entity_object',
271
343
  });
272
344
  if (result.Success) {
273
- this.categories = result.Results ?? [];
345
+ this.Categories = result.Results ?? [];
274
346
  }
275
347
  }
276
348
  finally {
277
- this.loadingCategories = false;
349
+ this.LoadingCategories = false;
278
350
  this.cdr.markForCheck();
279
351
  }
280
352
  }
281
353
  resetForm() {
282
- this.listName = this.ViewName ? `${this.ViewName} — Snapshot ${new Date().toISOString().slice(0, 10)}` : '';
354
+ this.ListName = this.ViewName ? `${this.ViewName} — Snapshot ${new Date().toISOString().slice(0, 10)}` : '';
283
355
  this.description = '';
284
- this.categoryId = null;
285
- this.rememberLineage = true;
286
- this.useSnapshot = true;
287
- this.refreshMode = 'Additive';
288
- this.submitting = false;
356
+ this.CategoryId = null;
357
+ this.RememberLineage = true;
358
+ this.UseSnapshot = true;
359
+ this.RefreshMode = 'Additive';
360
+ this.Submitting = false;
289
361
  }
290
362
  static ɵfac = /*@__PURE__*/ (() => { let ɵSaveViewAsListDialogComponent_BaseFactory; return function SaveViewAsListDialogComponent_Factory(__ngFactoryType__) { return (ɵSaveViewAsListDialogComponent_BaseFactory || (ɵSaveViewAsListDialogComponent_BaseFactory = i0.ɵɵgetInheritedFactory(SaveViewAsListDialogComponent)))(__ngFactoryType__ || SaveViewAsListDialogComponent); }; })();
291
363
  static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: SaveViewAsListDialogComponent, selectors: [["mj-save-view-as-list-dialog"]], inputs: { Visible: "Visible", ViewId: "ViewId", ViewName: "ViewName", RecordCount: "RecordCount" }, outputs: { Save: "Save", Cancel: "Cancel" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 1, vars: 1, consts: [["Title", "Save View Results as List", 3, "Visible", "Width"], ["Title", "Save View Results as List", 3, "Close", "Visible", "Width"], [1, "save-view-form", 3, "submit"], ["Variant", "info"], [1, "field"], ["for", "save-view-list-name", 1, "field__label"], ["id", "save-view-list-name", "name", "listName", "required", "", "autofocus", "", 1, "mj-input", 3, "ngModelChange", "ngModel"], ["for", "save-view-description", 1, "field__label"], ["id", "save-view-description", "name", "description", "rows", "2", 1, "mj-input", 3, "ngModelChange", "ngModel"], ["for", "save-view-category", 1, "field__label"], ["id", "save-view-category", "name", "categoryId", 1, "mj-input", "mj-select", 3, "ngModelChange", "ngModel", "disabled"], [3, "ngValue"], [1, "divider"], [1, "lineage-section"], [1, "field__label"], [1, "lineage-option"], ["type", "radio", "name", "lineage", 3, "change", "checked"], [1, "lineage-option__title"], [1, "lineage-option__desc"], ["mjButton", "", "variant", "primary", "type", "button", 3, "click", "disabled"], [1, "fa-solid", "fa-check"], ["mjButton", "", "variant", "outline", "type", "button", 3, "click"], [1, "field--inline"], ["id", "save-view-freeze", "type", "checkbox", "name", "useSnapshot", 3, "ngModelChange", "ngModel"], ["for", "save-view-freeze"], [1, "muted"], ["for", "save-view-mode", 1, "field__label"], ["id", "save-view-mode", "name", "refreshMode", 1, "mj-input", "mj-select", 3, "ngModelChange", "ngModel"], ["value", "Additive"], ["value", "Sync"]], template: function SaveViewAsListDialogComponent_Template(rf, ctx) { if (rf & 1) {
@@ -1 +1 @@
1
- {"version":3,"file":"save-view-as-list-dialog.component.js","sourceRoot":"","sources":["../../../../src/lib/components/save-view-as-list-dialog/save-view-as-list-dialog.component.ts","../../../../src/lib/components/save-view-as-list-dialog/save-view-as-list-dialog.component.html"],"names":[],"mappings":"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","sourcesContent":["import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, Input, OnInit, Output, inject } from '@angular/core';\n\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { RunView } from '@memberjunction/core';\nimport { MJListCategoryEntity } from '@memberjunction/core-entities';\n\n/**\n * Form payload emitted when the user clicks Save. The parent component is\n * responsible for calling `GraphQLListsClient.MaterializeFromView` with these\n * options — we keep the dialog generic so it doesn't have to know about the\n * GraphQL transport.\n */\nexport interface SaveViewAsListResult {\n ListName: string;\n Description?: string;\n CategoryId?: string;\n RememberLineage: boolean;\n UseSnapshot: boolean;\n RefreshMode: 'Additive' | 'Sync';\n}\n\n/**\n * Dialog for materializing a User View into a new static List. Matches\n * mockup `09-save-view-as-list.html`: name + description + category, then\n * a radio group for source-lineage (remember vs one-time snapshot), then a\n * \"freeze filter\" checkbox that maps to `UseSnapshot` on the list.\n *\n * The dialog is reusable — pass `ViewId` + `ViewName` + the displayed\n * record count and listen for `Save` / `Cancel`. Multi-provider safe via\n * `BaseAngularComponent.ProviderToUse`.\n */\n@Component({\n standalone: false,\n selector: 'mj-save-view-as-list-dialog',\n templateUrl: './save-view-as-list-dialog.component.html',\n styleUrls: ['./save-view-as-list-dialog.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SaveViewAsListDialogComponent extends BaseAngularComponent implements OnInit {\n private readonly cdr = inject(ChangeDetectorRef);\n\n /** Visibility toggle, getter/setter so opening resets the form. */\n @Input()\n get Visible(): boolean {\n return this._visible;\n }\n set Visible(value: boolean) {\n if (value && !this._visible) this.resetForm();\n this._visible = value;\n }\n private _visible = false;\n\n /** Required — the User View we're materializing from. */\n @Input() ViewId: string | null = null;\n\n /** Display name of the source view (shown in the info banner + default list name). */\n @Input() ViewName: string | null = null;\n\n /** Optional — record count shown in the button label + info banner. */\n @Input() RecordCount: number | null = null;\n\n @Output() Save = new EventEmitter<SaveViewAsListResult>();\n @Output() Cancel = new EventEmitter<void>();\n\n public listName = '';\n public description = '';\n public categoryId: string | null = null;\n public rememberLineage = true;\n public useSnapshot = true;\n public refreshMode: 'Additive' | 'Sync' = 'Additive';\n\n public categories: MJListCategoryEntity[] = [];\n public loadingCategories = false;\n public submitting = false;\n\n async ngOnInit(): Promise<void> {\n await this.loadCategories();\n }\n\n public OnSave(): void {\n if (!this.canSave) return;\n this.submitting = true;\n const payload: SaveViewAsListResult = {\n ListName: this.listName.trim(),\n Description: this.description.trim() || undefined,\n CategoryId: this.categoryId ?? undefined,\n RememberLineage: this.rememberLineage,\n // UseSnapshot only meaningful when lineage is remembered.\n UseSnapshot: this.rememberLineage && this.useSnapshot,\n RefreshMode: this.refreshMode,\n };\n this.Save.emit(payload);\n }\n\n public OnCancel(): void {\n this.Cancel.emit();\n }\n\n public OnLineageChange(remember: boolean): void {\n this.rememberLineage = remember;\n // If lineage is off, snapshot has no meaning — keep the checkbox state\n // intact so re-enabling lineage restores it, but the emitted payload\n // forces UseSnapshot=false (see `OnSave`).\n }\n\n public get canSave(): boolean {\n return !!this.ViewId && this.listName.trim().length > 0 && !this.submitting;\n }\n\n public get confirmButtonLabel(): string {\n if (this.submitting) return 'Saving...';\n if (this.RecordCount != null) return `Save List (${this.RecordCount} records)`;\n return 'Save List';\n }\n\n /**\n * Load list categories for the category dropdown. Multi-provider safe.\n * Failures degrade gracefully — the dropdown just shows \"Uncategorized\"\n * and we log so the user can troubleshoot.\n */\n private async loadCategories(): Promise<void> {\n this.loadingCategories = true;\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView<MJListCategoryEntity>({\n EntityName: 'MJ: List Categories',\n OrderBy: 'Name ASC',\n ResultType: 'entity_object',\n });\n if (result.Success) {\n this.categories = result.Results ?? [];\n }\n } finally {\n this.loadingCategories = false;\n this.cdr.markForCheck();\n }\n }\n\n private resetForm(): void {\n this.listName = this.ViewName ? `${this.ViewName} — Snapshot ${new Date().toISOString().slice(0, 10)}` : '';\n this.description = '';\n this.categoryId = null;\n this.rememberLineage = true;\n this.useSnapshot = true;\n this.refreshMode = 'Additive';\n this.submitting = false;\n }\n}\n","@if (Visible) {\n <mj-dialog\n [Visible]=\"true\"\n [Width]=\"560\"\n Title=\"Save View Results as List\"\n (Close)=\"OnCancel()\">\n <form class=\"save-view-form\" (submit)=\"$event.preventDefault(); OnSave()\">\n <mj-alert Variant=\"info\">\n <div>\n Materializes\n @if (RecordCount != null) {\n <strong>{{ RecordCount }} records</strong>\n } @else {\n <strong>view results</strong>\n }\n @if (ViewName) {\n from <strong>{{ ViewName }}</strong>\n }\n into a static List. The list can be refreshed from this view later if you keep lineage on.\n </div>\n </mj-alert>\n\n <div class=\"field\">\n <label class=\"field__label\" for=\"save-view-list-name\">List name</label>\n <input\n id=\"save-view-list-name\"\n class=\"mj-input\"\n [(ngModel)]=\"listName\"\n name=\"listName\"\n required\n autofocus />\n </div>\n\n <div class=\"field\">\n <label class=\"field__label\" for=\"save-view-description\">Description</label>\n <textarea\n id=\"save-view-description\"\n class=\"mj-input\"\n [(ngModel)]=\"description\"\n name=\"description\"\n rows=\"2\"></textarea>\n </div>\n\n <div class=\"field\">\n <label class=\"field__label\" for=\"save-view-category\">Category</label>\n <select\n id=\"save-view-category\"\n class=\"mj-input mj-select\"\n [(ngModel)]=\"categoryId\"\n name=\"categoryId\"\n [disabled]=\"loadingCategories\">\n <option [ngValue]=\"null\">(uncategorized)</option>\n @for (cat of categories; track cat.ID) {\n <option [ngValue]=\"cat.ID\">{{ cat.Name }}</option>\n }\n </select>\n </div>\n\n <div class=\"divider\"></div>\n\n <div class=\"lineage-section\">\n <div class=\"field__label\">Source lineage</div>\n <label class=\"lineage-option\" [class.lineage-option--selected]=\"rememberLineage\">\n <input\n type=\"radio\"\n name=\"lineage\"\n [checked]=\"rememberLineage\"\n (change)=\"OnLineageChange(true)\" />\n <div>\n <div class=\"lineage-option__title\">Remember source view (recommended)</div>\n <div class=\"lineage-option__desc\">\n Stores <code>SourceViewID</code> and (optionally) the current filter. Enables\n <strong>Refresh from source</strong> later. You'll choose Additive or Sync each refresh.\n </div>\n </div>\n </label>\n <label class=\"lineage-option\" [class.lineage-option--selected]=\"!rememberLineage\">\n <input\n type=\"radio\"\n name=\"lineage\"\n [checked]=\"!rememberLineage\"\n (change)=\"OnLineageChange(false)\" />\n <div>\n <div class=\"lineage-option__title\">One-time snapshot</div>\n <div class=\"lineage-option__desc\">\n No lineage stored. List is fully static; later changes to the view do not propagate.\n </div>\n </div>\n </label>\n </div>\n\n @if (rememberLineage) {\n <div class=\"field--inline\">\n <input\n id=\"save-view-freeze\"\n type=\"checkbox\"\n [(ngModel)]=\"useSnapshot\"\n name=\"useSnapshot\" />\n <label for=\"save-view-freeze\">\n Freeze filter at current value\n <span class=\"muted\">\n (<code>UseSnapshot = true</code>) — refresh re-runs the saved filter, even if the view is later edited\n </span>\n </label>\n </div>\n\n <div class=\"field\">\n <label class=\"field__label\" for=\"save-view-mode\">Default refresh mode</label>\n <select\n id=\"save-view-mode\"\n class=\"mj-input mj-select\"\n [(ngModel)]=\"refreshMode\"\n name=\"refreshMode\">\n <option value=\"Additive\">Additive — only adds new records on refresh</option>\n <option value=\"Sync\">Sync — reconciles in both directions (may remove records)</option>\n </select>\n </div>\n }\n </form>\n\n <mj-dialog-actions>\n <button mjButton variant=\"primary\" type=\"button\" [disabled]=\"!canSave\" (click)=\"OnSave()\">\n <i class=\"fa-solid fa-check\"></i>\n {{ confirmButtonLabel }}\n </button>\n <button mjButton variant=\"outline\" type=\"button\" (click)=\"OnCancel()\">Cancel</button>\n </mj-dialog-actions>\n </mj-dialog>\n}\n"]}
1
+ {"version":3,"file":"save-view-as-list-dialog.component.js","sourceRoot":"","sources":["../../../../src/lib/components/save-view-as-list-dialog/save-view-as-list-dialog.component.ts","../../../../src/lib/components/save-view-as-list-dialog/save-view-as-list-dialog.component.html"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,EAAU,MAAM,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAEnI,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;;;;;;ICQnC,8BAAQ;IAAA,YAAyB;IAAA,iBAAS;;;IAAlC,cAAyB;IAAzB,yDAAyB;;;IAEjC,8BAAQ;IAAA,4BAAY;IAAA,iBAAS;;;IAG7B,sBAAK;IAAA,8BAAQ;IAAA,YAAc;IAAA,iBAAS;;;IAAvB,eAAc;IAAd,qCAAc;;;IAqC3B,kCAA2B;IAAA,YAAc;IAAA,iBAAS;;;IAA1C,mCAAkB;IAAC,cAAc;IAAd,iCAAc;;;;IAwC3C,AADF,+BAA2B,gBAKF;IADrB,2UAAyB;IAH3B,iBAIuB;IACvB,iCAA8B;IAC5B,gDACA;IAAA,gCAAoB;IAClB,kBAAC;IAAA,4BAAM;IAAA,kCAAkB;IAAA,iBAAO;IAAA,4FAClC;IAEJ,AADE,AADE,iBAAO,EACD,EACJ;IAGJ,AADF,8BAAmB,iBACgC;IAAA,qCAAoB;IAAA,iBAAQ;IAC7E,mCAIqB;IADnB,6UAAyB;IAEzB,mCAAyB;IAAA,iEAA2C;IAAA,iBAAS;IAC7E,mCAAqB;IAAA,+EAAyD;IAElF,AADE,AADgF,iBAAS,EAChF,EACL;;;IApBF,cAAyB;IAAzB,kDAAyB;IAezB,gBAAyB;IAAzB,kDAAyB;;;;IA9GnC,oCAIuB;IAArB,oMAAS,iBAAU,KAAC;IACpB,+BAA0E;IAA7C,iLAAU,uBAAuB,wBAAE,eAAQ,KAAC;IAErE,AADF,mCAAyB,UAClB;IACH,8BACA;IAEE,AAFF,6GAA2B,uFAElB;IAGT,mGAAgB;IAGhB,4GACF;IACF,AADE,iBAAM,EACG;IAGT,AADF,8BAAmB,gBACqC;IAAA,0BAAS;IAAA,iBAAQ;IACvE,iCAMc;IAHZ,sTAAsB;IAI1B,AAPE,iBAMc,EACV;IAGJ,AADF,+BAAmB,gBACuC;IAAA,4BAAW;IAAA,iBAAQ;IAC3E,oCAKW;IAFT,+TAAyB;IAG7B,AADa,iBAAW,EAClB;IAGJ,AADF,+BAAmB,gBACoC;IAAA,yBAAQ;IAAA,iBAAQ;IACrE,mCAKiC;IAF/B,2TAAwB;IAGxB,mCAAyB;IAAA,gCAAe;IAAA,iBAAS;IACjD,oHAEC;IAEL,AADE,iBAAS,EACL;IAEN,2BAA2B;IAGzB,AADF,gCAA6B,eACD;IAAA,+BAAc;IAAA,iBAAM;IAE5C,AADF,kCAAiF,iBAK1C;IAAnC,mMAAU,uBAAgB,IAAI,CAAC,KAAC;IAJlC,iBAIqC;IAEnC,AADF,4BAAK,eACgC;IAAA,mDAAkC;IAAA,iBAAM;IAC3E,gCAAkC;IAChC,yBAAO;IAAA,6BAAM;IAAA,6BAAY;IAAA,iBAAO;IAAC,+DACjC;IAAA,+BAAQ;IAAA,oCAAmB;IAAA,iBAAS;IAAC,sEACvC;IAEJ,AADE,AADE,iBAAM,EACF,EACA;IAEN,AADF,kCAAkF,iBAK1C;IAApC,mMAAU,uBAAgB,KAAK,CAAC,KAAC;IAJnC,iBAIsC;IAEpC,AADF,4BAAK,eACgC;IAAA,kCAAiB;IAAA,iBAAM;IAC1D,gCAAkC;IAChC,uGACF;IAGN,AADE,AADE,AADE,iBAAM,EACF,EACA,EACJ;IAEN,sGAAuB;IA2BzB,iBAAO;IAGL,AADF,0CAAmB,kBACyE;IAAnB,kMAAS,eAAQ,KAAC;IACvF,yBAAiC;IACjC,aACF;IAAA,iBAAS;IACT,mCAAsE;IAArB,kMAAS,iBAAU,KAAC;IAAC,uBAAM;IAEhF,AADE,AAD8E,iBAAS,EACnE,EACV;;;IA5HV,AADA,8BAAgB,cACH;IAOP,eAIC;IAJD,oDAIC;IACD,eAEC;IAFD,0CAEC;IAUD,eAAsB;IAAtB,+CAAsB;IAWtB,eAAyB;IAAzB,kDAAyB;IAUzB,eAAwB;IAAxB,iDAAwB;IAExB,mDAA8B;IACtB,cAAgB;IAAhB,8BAAgB;IACxB,eAEC;IAFD,gCAEC;IAQ2B,eAAkD;IAAlD,kEAAkD;IAI5E,cAA2B;IAA3B,gDAA2B;IAUD,gBAAmD;IAAnD,mEAAmD;IAI7E,cAA4B;IAA5B,iDAA4B;IAWlC,eA0BC;IA1BD,kDA0BC;IAIgD,eAAqB;IAArB,0CAAqB;IAEpE,eACF;IADE,0DACF;;ADvGN;;;;;;;;;GASG;AAQH,MAAM,OAAO,6BAA8B,SAAQ,oBAAoB;IACpD,GAAG,GAAG,MAAM,CAAC,iBAAiB,CAAC,CAAC;IAEjD,mEAAmE;IACnE,IACI,OAAO;QACT,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IACD,IAAI,OAAO,CAAC,KAAc;QACxB,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE,IAAI,CAAC,SAAS,EAAE,CAAC;QAC9C,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;IACxB,CAAC;IACO,QAAQ,GAAG,KAAK,CAAC;IAEzB,yDAAyD;IAChD,MAAM,GAAkB,IAAI,CAAC;IAEtC,sFAAsF;IAC7E,QAAQ,GAAkB,IAAI,CAAC;IAExC,uEAAuE;IAC9D,WAAW,GAAkB,IAAI,CAAC;IAEjC,IAAI,GAAG,IAAI,YAAY,EAAwB,CAAC;IAChD,MAAM,GAAG,IAAI,YAAY,EAAQ,CAAC;IAErC,QAAQ,GAAG,EAAE,CAAC;IAErB,wCAAwC;IACxC,IAAW,QAAQ;QACjB,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IACD,wCAAwC;IACxC,IAAW,QAAQ,CAAC,KAAK;QACvB,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;IACxB,CAAC;IACM,WAAW,GAAG,EAAE,CAAC;IACjB,UAAU,GAAkB,IAAI,CAAC;IAExC,0CAA0C;IAC1C,IAAW,UAAU;QACnB,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IACD,0CAA0C;IAC1C,IAAW,UAAU,CAAC,KAAoB;QACxC,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;IAC1B,CAAC;IACM,eAAe,GAAG,IAAI,CAAC;IAE9B,+CAA+C;IAC/C,IAAW,eAAe;QACxB,OAAO,IAAI,CAAC,eAAe,CAAC;IAC9B,CAAC;IACD,+CAA+C;IAC/C,IAAW,eAAe,CAAC,KAAK;QAC9B,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;IAC/B,CAAC;IACM,WAAW,GAAG,IAAI,CAAC;IAE1B,2CAA2C;IAC3C,IAAW,WAAW;QACpB,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IACD,2CAA2C;IAC3C,IAAW,WAAW,CAAC,KAAK;QAC1B,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;IAC3B,CAAC;IACM,WAAW,GAAwB,UAAU,CAAC;IAErD,2CAA2C;IAC3C,IAAW,WAAW;QACpB,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IACD,2CAA2C;IAC3C,IAAW,WAAW,CAAC,KAA0B;QAC/C,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;IAC3B,CAAC;IAEM,UAAU,GAA2B,EAAE,CAAC;IAE/C,0CAA0C;IAC1C,IAAW,UAAU;QACnB,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IACD,0CAA0C;IAC1C,IAAW,UAAU,CAAC,KAA6B;QACjD,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;IAC1B,CAAC;IACM,iBAAiB,GAAG,KAAK,CAAC;IAEjC,iDAAiD;IACjD,IAAW,iBAAiB;QAC1B,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAChC,CAAC;IACD,iDAAiD;IACjD,IAAW,iBAAiB,CAAC,KAAK;QAChC,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;IACjC,CAAC;IACM,UAAU,GAAG,KAAK,CAAC;IAE1B,0CAA0C;IAC1C,IAAW,UAAU;QACnB,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IACD,0CAA0C;IAC1C,IAAW,UAAU,CAAC,KAAK;QACzB,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;IAC9B,CAAC;IAEM,MAAM;QACX,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO;QAC1B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,MAAM,OAAO,GAAyB;YACpC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;YAC9B,WAAW,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,SAAS;YACjD,UAAU,EAAE,IAAI,CAAC,UAAU,IAAI,SAAS;YACxC,eAAe,EAAE,IAAI,CAAC,eAAe;YACrC,0DAA0D;YAC1D,WAAW,EAAE,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,WAAW;YACrD,WAAW,EAAE,IAAI,CAAC,WAAW;SAC9B,CAAC;QACF,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC1B,CAAC;IAEM,QAAQ;QACb,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IACrB,CAAC;IAEM,eAAe,CAAC,QAAiB;QACtC,IAAI,CAAC,eAAe,GAAG,QAAQ,CAAC;QAChC,uEAAuE;QACvE,qEAAqE;QACrE,2CAA2C;IAC7C,CAAC;IAED,IAAW,OAAO;QAChB,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC;IAC9E,CAAC;IAED,uCAAuC;IACvC,IAAW,OAAO;QAChB,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED,IAAW,kBAAkB;QAC3B,IAAI,IAAI,CAAC,UAAU;YAAE,OAAO,WAAW,CAAC;QACxC,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI;YAAE,OAAO,cAAc,IAAI,CAAC,WAAW,WAAW,CAAC;QAC/E,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,kDAAkD;IAClD,IAAW,kBAAkB;QAC3B,OAAO,IAAI,CAAC,kBAAkB,CAAC;IACjC,CAAC;IAED;;;;OAIG;IACK,KAAK,CAAC,cAAc;QAC1B,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;QAC9B,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAC5D,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,OAAO,CAAuB;gBACpD,UAAU,EAAE,qBAAqB;gBACjC,OAAO,EAAE,UAAU;gBACnB,UAAU,EAAE,eAAe;aAC5B,CAAC,CAAC;YACH,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACnB,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;YACzC,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;YAC/B,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAC1B,CAAC;IACH,CAAC;IAEO,SAAS;QACf,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,eAAe,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5G,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;QACtB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC5B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;QAC9B,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;IAC1B,CAAC;iSA9LU,6BAA6B,yBAA7B,6BAA6B;6DAA7B,6BAA6B;YCtC1C,uGAAe;;YAAf,sCAgIC;;;iFD1FY,6BAA6B;cAPzC,SAAS;6BACI,KAAK,YACP,6BAA6B,mBAGtB,uBAAuB,CAAC,MAAM;;kBAM9C,KAAK;;kBAWL,KAAK;;kBAGL,KAAK;;kBAGL,KAAK;;kBAEL,MAAM;;kBACN,MAAM;;kFAxBI,6BAA6B","sourcesContent":["import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, Input, OnInit, Output, inject } from '@angular/core';\n\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { RunView } from '@memberjunction/core';\nimport { MJListCategoryEntity } from '@memberjunction/core-entities';\n\n/**\n * Form payload emitted when the user clicks Save. The parent component is\n * responsible for calling `GraphQLListsClient.MaterializeFromView` with these\n * options — we keep the dialog generic so it doesn't have to know about the\n * GraphQL transport.\n */\nexport interface SaveViewAsListResult {\n ListName: string;\n Description?: string;\n CategoryId?: string;\n RememberLineage: boolean;\n UseSnapshot: boolean;\n RefreshMode: 'Additive' | 'Sync';\n}\n\n/**\n * Dialog for materializing a User View into a new static List. Matches\n * mockup `09-save-view-as-list.html`: name + description + category, then\n * a radio group for source-lineage (remember vs one-time snapshot), then a\n * \"freeze filter\" checkbox that maps to `UseSnapshot` on the list.\n *\n * The dialog is reusable — pass `ViewId` + `ViewName` + the displayed\n * record count and listen for `Save` / `Cancel`. Multi-provider safe via\n * `BaseAngularComponent.ProviderToUse`.\n */\n@Component({\n standalone: false,\n selector: 'mj-save-view-as-list-dialog',\n templateUrl: './save-view-as-list-dialog.component.html',\n styleUrls: ['./save-view-as-list-dialog.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SaveViewAsListDialogComponent extends BaseAngularComponent implements OnInit {\n private readonly cdr = inject(ChangeDetectorRef);\n\n /** Visibility toggle, getter/setter so opening resets the form. */\n @Input()\n get Visible(): boolean {\n return this._visible;\n }\n set Visible(value: boolean) {\n if (value && !this._visible) this.resetForm();\n this._visible = value;\n }\n private _visible = false;\n\n /** Required — the User View we're materializing from. */\n @Input() ViewId: string | null = null;\n\n /** Display name of the source view (shown in the info banner + default list name). */\n @Input() ViewName: string | null = null;\n\n /** Optional — record count shown in the button label + info banner. */\n @Input() RecordCount: number | null = null;\n\n @Output() Save = new EventEmitter<SaveViewAsListResult>();\n @Output() Cancel = new EventEmitter<void>();\n\n public ListName = '';\n\n /** @deprecated Use {@link ListName}. */\n public get listName() {\n return this.ListName;\n }\n /** @deprecated Use {@link ListName}. */\n public set listName(value) {\n this.ListName = value;\n }\n public description = '';\n public CategoryId: string | null = null;\n\n /** @deprecated Use {@link CategoryId}. */\n public get categoryId(): string | null {\n return this.CategoryId;\n }\n /** @deprecated Use {@link CategoryId}. */\n public set categoryId(value: string | null) {\n this.CategoryId = value;\n }\n public RememberLineage = true;\n\n /** @deprecated Use {@link RememberLineage}. */\n public get rememberLineage() {\n return this.RememberLineage;\n }\n /** @deprecated Use {@link RememberLineage}. */\n public set rememberLineage(value) {\n this.RememberLineage = value;\n }\n public UseSnapshot = true;\n\n /** @deprecated Use {@link UseSnapshot}. */\n public get useSnapshot() {\n return this.UseSnapshot;\n }\n /** @deprecated Use {@link UseSnapshot}. */\n public set useSnapshot(value) {\n this.UseSnapshot = value;\n }\n public RefreshMode: 'Additive' | 'Sync' = 'Additive';\n\n /** @deprecated Use {@link RefreshMode}. */\n public get refreshMode(): 'Additive' | 'Sync' {\n return this.RefreshMode;\n }\n /** @deprecated Use {@link RefreshMode}. */\n public set refreshMode(value: 'Additive' | 'Sync') {\n this.RefreshMode = value;\n }\n\n public Categories: MJListCategoryEntity[] = [];\n\n /** @deprecated Use {@link Categories}. */\n public get categories(): MJListCategoryEntity[] {\n return this.Categories;\n }\n /** @deprecated Use {@link Categories}. */\n public set categories(value: MJListCategoryEntity[]) {\n this.Categories = value;\n }\n public LoadingCategories = false;\n\n /** @deprecated Use {@link LoadingCategories}. */\n public get loadingCategories() {\n return this.LoadingCategories;\n }\n /** @deprecated Use {@link LoadingCategories}. */\n public set loadingCategories(value) {\n this.LoadingCategories = value;\n }\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 async ngOnInit(): Promise<void> {\n await this.loadCategories();\n }\n\n public OnSave(): void {\n if (!this.CanSave) return;\n this.Submitting = true;\n const payload: SaveViewAsListResult = {\n ListName: this.ListName.trim(),\n Description: this.description.trim() || undefined,\n CategoryId: this.CategoryId ?? undefined,\n RememberLineage: this.RememberLineage,\n // UseSnapshot only meaningful when lineage is remembered.\n UseSnapshot: this.RememberLineage && this.UseSnapshot,\n RefreshMode: this.RefreshMode,\n };\n this.Save.emit(payload);\n }\n\n public OnCancel(): void {\n this.Cancel.emit();\n }\n\n public OnLineageChange(remember: boolean): void {\n this.RememberLineage = remember;\n // If lineage is off, snapshot has no meaning — keep the checkbox state\n // intact so re-enabling lineage restores it, but the emitted payload\n // forces UseSnapshot=false (see `OnSave`).\n }\n\n public get CanSave(): boolean {\n return !!this.ViewId && this.ListName.trim().length > 0 && !this.Submitting;\n }\n\n /** @deprecated Use {@link CanSave}. */\n public get canSave(): boolean {\n return this.CanSave;\n }\n\n public get ConfirmButtonLabel(): string {\n if (this.Submitting) return 'Saving...';\n if (this.RecordCount != null) return `Save List (${this.RecordCount} records)`;\n return 'Save List';\n }\n\n /** @deprecated Use {@link ConfirmButtonLabel}. */\n public get confirmButtonLabel(): string {\n return this.ConfirmButtonLabel;\n }\n\n /**\n * Load list categories for the category dropdown. Multi-provider safe.\n * Failures degrade gracefully — the dropdown just shows \"Uncategorized\"\n * and we log so the user can troubleshoot.\n */\n private async loadCategories(): Promise<void> {\n this.LoadingCategories = true;\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView<MJListCategoryEntity>({\n EntityName: 'MJ: List Categories',\n OrderBy: 'Name ASC',\n ResultType: 'entity_object',\n });\n if (result.Success) {\n this.Categories = result.Results ?? [];\n }\n } finally {\n this.LoadingCategories = false;\n this.cdr.markForCheck();\n }\n }\n\n private resetForm(): void {\n this.ListName = this.ViewName ? `${this.ViewName} — Snapshot ${new Date().toISOString().slice(0, 10)}` : '';\n this.description = '';\n this.CategoryId = null;\n this.RememberLineage = true;\n this.UseSnapshot = true;\n this.RefreshMode = 'Additive';\n this.Submitting = false;\n }\n}\n","@if (Visible) {\n <mj-dialog\n [Visible]=\"true\"\n [Width]=\"560\"\n Title=\"Save View Results as List\"\n (Close)=\"OnCancel()\">\n <form class=\"save-view-form\" (submit)=\"$event.preventDefault(); OnSave()\">\n <mj-alert Variant=\"info\">\n <div>\n Materializes\n @if (RecordCount != null) {\n <strong>{{ RecordCount }} records</strong>\n } @else {\n <strong>view results</strong>\n }\n @if (ViewName) {\n from <strong>{{ ViewName }}</strong>\n }\n into a static List. The list can be refreshed from this view later if you keep lineage on.\n </div>\n </mj-alert>\n\n <div class=\"field\">\n <label class=\"field__label\" for=\"save-view-list-name\">List name</label>\n <input\n id=\"save-view-list-name\"\n class=\"mj-input\"\n [(ngModel)]=\"listName\"\n name=\"listName\"\n required\n autofocus />\n </div>\n\n <div class=\"field\">\n <label class=\"field__label\" for=\"save-view-description\">Description</label>\n <textarea\n id=\"save-view-description\"\n class=\"mj-input\"\n [(ngModel)]=\"description\"\n name=\"description\"\n rows=\"2\"></textarea>\n </div>\n\n <div class=\"field\">\n <label class=\"field__label\" for=\"save-view-category\">Category</label>\n <select\n id=\"save-view-category\"\n class=\"mj-input mj-select\"\n [(ngModel)]=\"categoryId\"\n name=\"categoryId\"\n [disabled]=\"loadingCategories\">\n <option [ngValue]=\"null\">(uncategorized)</option>\n @for (cat of categories; track cat.ID) {\n <option [ngValue]=\"cat.ID\">{{ cat.Name }}</option>\n }\n </select>\n </div>\n\n <div class=\"divider\"></div>\n\n <div class=\"lineage-section\">\n <div class=\"field__label\">Source lineage</div>\n <label class=\"lineage-option\" [class.lineage-option--selected]=\"rememberLineage\">\n <input\n type=\"radio\"\n name=\"lineage\"\n [checked]=\"rememberLineage\"\n (change)=\"OnLineageChange(true)\" />\n <div>\n <div class=\"lineage-option__title\">Remember source view (recommended)</div>\n <div class=\"lineage-option__desc\">\n Stores <code>SourceViewID</code> and (optionally) the current filter. Enables\n <strong>Refresh from source</strong> later. You'll choose Additive or Sync each refresh.\n </div>\n </div>\n </label>\n <label class=\"lineage-option\" [class.lineage-option--selected]=\"!rememberLineage\">\n <input\n type=\"radio\"\n name=\"lineage\"\n [checked]=\"!rememberLineage\"\n (change)=\"OnLineageChange(false)\" />\n <div>\n <div class=\"lineage-option__title\">One-time snapshot</div>\n <div class=\"lineage-option__desc\">\n No lineage stored. List is fully static; later changes to the view do not propagate.\n </div>\n </div>\n </label>\n </div>\n\n @if (rememberLineage) {\n <div class=\"field--inline\">\n <input\n id=\"save-view-freeze\"\n type=\"checkbox\"\n [(ngModel)]=\"useSnapshot\"\n name=\"useSnapshot\" />\n <label for=\"save-view-freeze\">\n Freeze filter at current value\n <span class=\"muted\">\n (<code>UseSnapshot = true</code>) — refresh re-runs the saved filter, even if the view is later edited\n </span>\n </label>\n </div>\n\n <div class=\"field\">\n <label class=\"field__label\" for=\"save-view-mode\">Default refresh mode</label>\n <select\n id=\"save-view-mode\"\n class=\"mj-input mj-select\"\n [(ngModel)]=\"refreshMode\"\n name=\"refreshMode\">\n <option value=\"Additive\">Additive — only adds new records on refresh</option>\n <option value=\"Sync\">Sync — reconciles in both directions (may remove records)</option>\n </select>\n </div>\n }\n </form>\n\n <mj-dialog-actions>\n <button mjButton variant=\"primary\" type=\"button\" [disabled]=\"!canSave\" (click)=\"OnSave()\">\n <i class=\"fa-solid fa-check\"></i>\n {{ confirmButtonLabel }}\n </button>\n <button mjButton variant=\"outline\" type=\"button\" (click)=\"OnCancel()\">Cancel</button>\n </mj-dialog-actions>\n </mj-dialog>\n}\n"]}
@@ -20,13 +20,23 @@ export declare class ListsSharedWithMeComponent extends BaseAngularComponent imp
20
20
  ListName: string;
21
21
  }>;
22
22
  /** Permission-level filter (empty = "All Permissions"). */
23
- filterLevel: SharePermissionLevel | '';
23
+ FilterLevel: SharePermissionLevel | '';
24
+ /** @deprecated Use {@link FilterLevel}. */
25
+ get filterLevel(): SharePermissionLevel | '';
26
+ /** @deprecated Use {@link FilterLevel}. */
27
+ set filterLevel(value: SharePermissionLevel | '');
24
28
  /** Free-text filter on list name. */
25
29
  filterText: string;
26
- loading: boolean;
30
+ Loading: boolean;
31
+ /** @deprecated Use {@link Loading}. */
32
+ get loading(): boolean;
33
+ /** @deprecated Use {@link Loading}. */
34
+ set loading(value: boolean);
27
35
  errorMessage: string | null;
28
36
  private allShares;
29
37
  ngOnInit(): Promise<void>;
38
+ get VisibleShares(): SharedListSummary[];
39
+ /** @deprecated Use {@link VisibleShares}. */
30
40
  get visibleShares(): SharedListSummary[];
31
41
  OnFilterChange(): void;
32
42
  OnCardClick(listId: string): void;
@@ -36,9 +46,15 @@ export declare class ListsSharedWithMeComponent extends BaseAngularComponent imp
36
46
  * ("3d ago", "2w ago"). Matches the mockup; falls back to absolute on
37
47
  * older entries.
38
48
  */
49
+ FormatRelative(date: Date): string;
50
+ /** @deprecated Use {@link FormatRelative}. */
39
51
  formatRelative(date: Date): string;
40
52
  /** Badge variant class for the permission-level chip. */
53
+ BadgeClass(level: SharePermissionLevel): string;
54
+ /** @deprecated Use {@link BadgeClass}. */
41
55
  badgeClass(level: SharePermissionLevel): string;
56
+ BadgeLabel(level: SharePermissionLevel): string;
57
+ /** @deprecated Use {@link BadgeLabel}. */
42
58
  badgeLabel(level: SharePermissionLevel): string;
43
59
  private loadShares;
44
60
  static ɵfac: i0.ɵɵFactoryDeclaration<ListsSharedWithMeComponent, never>;
@@ -1 +1 @@
1
- {"version":3,"file":"shared-with-me.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/shared-with-me/shared-with-me.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyD,YAAY,EAAE,MAAM,EAAkB,MAAM,eAAe,CAAC;AAE5H,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAErE,OAAO,KAAK,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;;AAE1F;;;;;;;GAOG;AACH,qBAOa,0BAA2B,SAAQ,oBAAqB,YAAW,MAAM;IACpF,OAAO,CAAC,QAAQ,CAAC,GAAG,CAA6B;IAEjD;;0BAEsB;IACZ,QAAQ;gBAA8B,MAAM;kBAAY,MAAM;OAAM;IAE9E,2DAA2D;IACpD,WAAW,EAAE,oBAAoB,GAAG,EAAE,CAAM;IAEnD,qCAAqC;IAC9B,UAAU,SAAM;IAEhB,OAAO,UAAS;IAChB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAQ;IAC1C,OAAO,CAAC,SAAS,CAA2B;IAEtC,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAI/B,IAAW,aAAa,IAAI,iBAAiB,EAAE,CAO9C;IAEM,cAAc,IAAI,IAAI;IAItB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAK3B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAIrC;;;;OAIG;IACI,cAAc,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM;IAiBzC,yDAAyD;IAClD,UAAU,CAAC,KAAK,EAAE,oBAAoB,GAAG,MAAM;IAW/C,UAAU,CAAC,KAAK,EAAE,oBAAoB,GAAG,MAAM;YAWxC,UAAU;yCAzFb,0BAA0B;2CAA1B,0BAA0B;CAyGtC"}
1
+ {"version":3,"file":"shared-with-me.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/shared-with-me/shared-with-me.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyD,YAAY,EAAE,MAAM,EAAkB,MAAM,eAAe,CAAC;AAE5H,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAErE,OAAO,KAAK,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;;AAE1F;;;;;;;GAOG;AACH,qBAOa,0BAA2B,SAAQ,oBAAqB,YAAW,MAAM;IACpF,OAAO,CAAC,QAAQ,CAAC,GAAG,CAA6B;IAEjD;;0BAEsB;IACZ,QAAQ;gBAA8B,MAAM;kBAAY,MAAM;OAAM;IAE9E,2DAA2D;IACpD,WAAW,EAAE,oBAAoB,GAAG,EAAE,CAAM;IAEnD,2CAA2C;IAC3C,IAAW,WAAW,IAAI,oBAAoB,GAAG,EAAE,CAElD;IACD,2CAA2C;IAC3C,IAAW,WAAW,CAAC,KAAK,EAAE,oBAAoB,GAAG,EAAE,EAEtD;IAED,qCAAqC;IAC9B,UAAU,SAAM;IAEhB,OAAO,UAAS;IAEvB,uCAAuC;IACvC,IAAW,OAAO,YAEjB;IACD,uCAAuC;IACvC,IAAW,OAAO,CAAC,KAAK,SAAA,EAEvB;IACM,YAAY,EAAE,MAAM,GAAG,IAAI,CAAQ;IAC1C,OAAO,CAAC,SAAS,CAA2B;IAEtC,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAI/B,IAAW,aAAa,IAAI,iBAAiB,EAAE,CAO9C;IAED,6CAA6C;IAC7C,IAAW,aAAa,IAAI,iBAAiB,EAAE,CAE9C;IAEM,cAAc,IAAI,IAAI;IAItB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAK3B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAIrC;;;;OAIG;IACI,cAAc,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM;IAiBzC,8CAA8C;IACvC,cAAc,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM;IAIzC,yDAAyD;IAClD,UAAU,CAAC,KAAK,EAAE,oBAAoB,GAAG,MAAM;IAWtD,0CAA0C;IACnC,UAAU,CAAC,KAAK,EAAE,oBAAoB,GAAG,MAAM;IAI/C,UAAU,CAAC,KAAK,EAAE,oBAAoB,GAAG,MAAM;IAWtD,0CAA0C;IACnC,UAAU,CAAC,KAAK,EAAE,oBAAoB,GAAG,MAAM;YAIxC,UAAU;yCA/Hb,0BAA0B;2CAA1B,0BAA0B;CA+ItC"}
@@ -85,25 +85,45 @@ export class ListsSharedWithMeComponent extends BaseAngularComponent {
85
85
  * a second fetch. */
86
86
  OpenList = new EventEmitter();
87
87
  /** Permission-level filter (empty = "All Permissions"). */
88
- filterLevel = '';
88
+ FilterLevel = '';
89
+ /** @deprecated Use {@link FilterLevel}. */
90
+ get filterLevel() {
91
+ return this.FilterLevel;
92
+ }
93
+ /** @deprecated Use {@link FilterLevel}. */
94
+ set filterLevel(value) {
95
+ this.FilterLevel = value;
96
+ }
89
97
  /** Free-text filter on list name. */
90
98
  filterText = '';
91
- loading = false;
99
+ Loading = false;
100
+ /** @deprecated Use {@link Loading}. */
101
+ get loading() {
102
+ return this.Loading;
103
+ }
104
+ /** @deprecated Use {@link Loading}. */
105
+ set loading(value) {
106
+ this.Loading = value;
107
+ }
92
108
  errorMessage = null;
93
109
  allShares = [];
94
110
  async ngOnInit() {
95
111
  await this.loadShares();
96
112
  }
97
- get visibleShares() {
113
+ get VisibleShares() {
98
114
  const term = this.filterText.trim().toLowerCase();
99
115
  return this.allShares.filter((s) => {
100
- if (this.filterLevel && s.PermissionLevel !== this.filterLevel)
116
+ if (this.FilterLevel && s.PermissionLevel !== this.FilterLevel)
101
117
  return false;
102
118
  if (term && !s.ListName.toLowerCase().includes(term))
103
119
  return false;
104
120
  return true;
105
121
  });
106
122
  }
123
+ /** @deprecated Use {@link VisibleShares}. */
124
+ get visibleShares() {
125
+ return this.VisibleShares;
126
+ }
107
127
  OnFilterChange() {
108
128
  this.cdr.markForCheck();
109
129
  }
@@ -119,7 +139,7 @@ export class ListsSharedWithMeComponent extends BaseAngularComponent {
119
139
  * ("3d ago", "2w ago"). Matches the mockup; falls back to absolute on
120
140
  * older entries.
121
141
  */
122
- formatRelative(date) {
142
+ FormatRelative(date) {
123
143
  const diffMs = Date.now() - date.getTime();
124
144
  const seconds = Math.floor(diffMs / 1000);
125
145
  if (seconds < 60)
@@ -141,8 +161,12 @@ export class ListsSharedWithMeComponent extends BaseAngularComponent {
141
161
  return `${months}mo ago`;
142
162
  return date.toLocaleDateString();
143
163
  }
164
+ /** @deprecated Use {@link FormatRelative}. */
165
+ formatRelative(date) {
166
+ return this.FormatRelative(date);
167
+ }
144
168
  /** Badge variant class for the permission-level chip. */
145
- badgeClass(level) {
169
+ BadgeClass(level) {
146
170
  switch (level) {
147
171
  case 'Owner':
148
172
  return 'badge--owner';
@@ -152,7 +176,11 @@ export class ListsSharedWithMeComponent extends BaseAngularComponent {
152
176
  return 'badge--viewer';
153
177
  }
154
178
  }
155
- badgeLabel(level) {
179
+ /** @deprecated Use {@link BadgeClass}. */
180
+ badgeClass(level) {
181
+ return this.BadgeClass(level);
182
+ }
183
+ BadgeLabel(level) {
156
184
  switch (level) {
157
185
  case 'Owner':
158
186
  return 'Owner';
@@ -162,8 +190,12 @@ export class ListsSharedWithMeComponent extends BaseAngularComponent {
162
190
  return 'Viewer';
163
191
  }
164
192
  }
193
+ /** @deprecated Use {@link BadgeLabel}. */
194
+ badgeLabel(level) {
195
+ return this.BadgeLabel(level);
196
+ }
165
197
  async loadShares() {
166
- this.loading = true;
198
+ this.Loading = true;
167
199
  this.errorMessage = null;
168
200
  this.cdr.markForCheck();
169
201
  try {
@@ -176,7 +208,7 @@ export class ListsSharedWithMeComponent extends BaseAngularComponent {
176
208
  this.allShares = [];
177
209
  }
178
210
  finally {
179
- this.loading = false;
211
+ this.Loading = false;
180
212
  this.cdr.markForCheck();
181
213
  }
182
214
  }
@@ -1 +1 @@
1
- {"version":3,"file":"shared-with-me.component.js","sourceRoot":"","sources":["../../../../src/lib/components/shared-with-me/shared-with-me.component.ts","../../../../src/lib/components/shared-with-me/shared-with-me.component.html"],"names":[],"mappings":"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","sourcesContent":["import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, OnInit, Output, inject } from '@angular/core';\n\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { GraphQLDataProvider, GraphQLListsClient } from '@memberjunction/graphql-dataprovider';\nimport type { SharedListSummary, SharePermissionLevel } from '@memberjunction/lists-base';\n\n/**\n * \"Shared With Me\" view (mockup 17). Lists every `MJ: List` the current\n * user has direct-share access to, plus a permission badge per row.\n *\n * Drop into the Lists app as a tab/resource. Click events bubble up via\n * `OpenList` so the host app can route through its own navigation\n * (NavigationService etc.) — keeps this component framework-agnostic.\n */\n@Component({\n standalone: false,\n selector: 'mj-lists-shared-with-me',\n templateUrl: './shared-with-me.component.html',\n styleUrls: ['./shared-with-me.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ListsSharedWithMeComponent extends BaseAngularComponent implements OnInit {\n private readonly cdr = inject(ChangeDetectorRef);\n\n /** Emitted when the user clicks a card. Host wires this to navigation.\n * Includes ListName so the host can open a properly-titled tab without\n * a second fetch. */\n @Output() OpenList = new EventEmitter<{ ListID: string; ListName: string }>();\n\n /** Permission-level filter (empty = \"All Permissions\"). */\n public filterLevel: SharePermissionLevel | '' = '';\n\n /** Free-text filter on list name. */\n public filterText = '';\n\n public loading = false;\n public errorMessage: string | null = null;\n private allShares: SharedListSummary[] = [];\n\n async ngOnInit(): Promise<void> {\n await this.loadShares();\n }\n\n public get visibleShares(): SharedListSummary[] {\n const term = this.filterText.trim().toLowerCase();\n return this.allShares.filter((s) => {\n if (this.filterLevel && s.PermissionLevel !== this.filterLevel) return false;\n if (term && !s.ListName.toLowerCase().includes(term)) return false;\n return true;\n });\n }\n\n public OnFilterChange(): void {\n this.cdr.markForCheck();\n }\n\n public OnCardClick(listId: string): void {\n const share = this.allShares.find((s) => s.ListID === listId);\n this.OpenList.emit({ ListID: listId, ListName: share?.ListName ?? '' });\n }\n\n public async Refresh(): Promise<void> {\n await this.loadShares();\n }\n\n /**\n * Friendly-format the \"shared at\" timestamp into a relative phrase\n * (\"3d ago\", \"2w ago\"). Matches the mockup; falls back to absolute on\n * older entries.\n */\n public formatRelative(date: Date): string {\n const diffMs = Date.now() - date.getTime();\n const seconds = Math.floor(diffMs / 1000);\n if (seconds < 60) return 'just now';\n const minutes = Math.floor(seconds / 60);\n if (minutes < 60) return `${minutes}m ago`;\n const hours = Math.floor(minutes / 60);\n if (hours < 24) return `${hours}h ago`;\n const days = Math.floor(hours / 24);\n if (days < 7) return `${days}d ago`;\n const weeks = Math.floor(days / 7);\n if (weeks < 5) return `${weeks}w ago`;\n const months = Math.floor(days / 30);\n if (months < 12) return `${months}mo ago`;\n return date.toLocaleDateString();\n }\n\n /** Badge variant class for the permission-level chip. */\n public badgeClass(level: SharePermissionLevel): string {\n switch (level) {\n case 'Owner':\n return 'badge--owner';\n case 'Edit':\n return 'badge--editor';\n default:\n return 'badge--viewer';\n }\n }\n\n public badgeLabel(level: SharePermissionLevel): string {\n switch (level) {\n case 'Owner':\n return 'Owner';\n case 'Edit':\n return 'Editor';\n default:\n return 'Viewer';\n }\n }\n\n private async loadShares(): Promise<void> {\n this.loading = true;\n this.errorMessage = null;\n this.cdr.markForCheck();\n try {\n const provider = this.ProviderToUse as unknown as GraphQLDataProvider;\n const client = new GraphQLListsClient(provider);\n this.allShares = await client.ListsSharedWithMe();\n } catch (e) {\n this.errorMessage = e instanceof Error ? e.message : String(e);\n this.allShares = [];\n } finally {\n this.loading = false;\n this.cdr.markForCheck();\n }\n }\n}\n","<div class=\"shared-with-me\">\n <!-- Toolbar -->\n <div class=\"shared-toolbar\">\n <div class=\"search-box\">\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 shared lists…\" />\n </div>\n <select\n class=\"mj-input mj-select permission-filter\"\n [(ngModel)]=\"filterLevel\"\n (ngModelChange)=\"OnFilterChange()\"\n title=\"Filter by permission\">\n <option value=\"\">All Permissions</option>\n <option value=\"View\">Viewer</option>\n <option value=\"Edit\">Editor</option>\n <option value=\"Owner\">Owner</option>\n </select>\n <button mjButton variant=\"outline\" (click)=\"Refresh()\" [disabled]=\"loading\">\n <i class=\"fa-solid fa-rotate\"></i>\n Refresh\n </button>\n </div>\n\n @if (loading) {\n <div class=\"state-block\">\n <mj-loading text=\"Loading shared lists...\" size=\"medium\"></mj-loading>\n </div>\n } @else if (errorMessage) {\n <div class=\"state-block state-block--error\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n <span>{{ errorMessage }}</span>\n </div>\n } @else if (visibleShares.length === 0) {\n <div class=\"state-block state-block--empty\">\n <i class=\"fa-solid fa-share-nodes\"></i>\n <h3>No lists shared with you</h3>\n <p>When someone shares a list with you, it'll appear here.</p>\n </div>\n } @else {\n <div class=\"list-grid\">\n @for (share of visibleShares; track share.ListID) {\n <div class=\"list-card\" (click)=\"OnCardClick(share.ListID)\" tabindex=\"0\">\n <div class=\"list-card__header\">\n <div class=\"list-card__icon\">\n <i class=\"fa-solid fa-list\"></i>\n </div>\n <div class=\"list-card__title\">{{ share.ListName }}</div>\n </div>\n <div class=\"list-card__footer\">\n <span class=\"permission-badge\" [ngClass]=\"badgeClass(share.PermissionLevel)\">\n {{ badgeLabel(share.PermissionLevel) }}\n </span>\n <span class=\"list-card__shared-at\">{{ formatRelative(share.SharedAt) }}</span>\n </div>\n </div>\n }\n </div>\n }\n</div>\n"]}
1
+ {"version":3,"file":"shared-with-me.component.js","sourceRoot":"","sources":["../../../../src/lib/components/shared-with-me/shared-with-me.component.ts","../../../../src/lib/components/shared-with-me/shared-with-me.component.html"],"names":[],"mappings":"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","sourcesContent":["import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, OnInit, Output, inject } from '@angular/core';\n\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { GraphQLDataProvider, GraphQLListsClient } from '@memberjunction/graphql-dataprovider';\nimport type { SharedListSummary, SharePermissionLevel } from '@memberjunction/lists-base';\n\n/**\n * \"Shared With Me\" view (mockup 17). Lists every `MJ: List` the current\n * user has direct-share access to, plus a permission badge per row.\n *\n * Drop into the Lists app as a tab/resource. Click events bubble up via\n * `OpenList` so the host app can route through its own navigation\n * (NavigationService etc.) — keeps this component framework-agnostic.\n */\n@Component({\n standalone: false,\n selector: 'mj-lists-shared-with-me',\n templateUrl: './shared-with-me.component.html',\n styleUrls: ['./shared-with-me.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ListsSharedWithMeComponent extends BaseAngularComponent implements OnInit {\n private readonly cdr = inject(ChangeDetectorRef);\n\n /** Emitted when the user clicks a card. Host wires this to navigation.\n * Includes ListName so the host can open a properly-titled tab without\n * a second fetch. */\n @Output() OpenList = new EventEmitter<{ ListID: string; ListName: string }>();\n\n /** Permission-level filter (empty = \"All Permissions\"). */\n public FilterLevel: SharePermissionLevel | '' = '';\n\n /** @deprecated Use {@link FilterLevel}. */\n public get filterLevel(): SharePermissionLevel | '' {\n return this.FilterLevel;\n }\n /** @deprecated Use {@link FilterLevel}. */\n public set filterLevel(value: SharePermissionLevel | '') {\n this.FilterLevel = value;\n }\n\n /** Free-text filter on list name. */\n public filterText = '';\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 private allShares: SharedListSummary[] = [];\n\n async ngOnInit(): Promise<void> {\n await this.loadShares();\n }\n\n public get VisibleShares(): SharedListSummary[] {\n const term = this.filterText.trim().toLowerCase();\n return this.allShares.filter((s) => {\n if (this.FilterLevel && s.PermissionLevel !== this.FilterLevel) return false;\n if (term && !s.ListName.toLowerCase().includes(term)) return false;\n return true;\n });\n }\n\n /** @deprecated Use {@link VisibleShares}. */\n public get visibleShares(): SharedListSummary[] {\n return this.VisibleShares;\n }\n\n public OnFilterChange(): void {\n this.cdr.markForCheck();\n }\n\n public OnCardClick(listId: string): void {\n const share = this.allShares.find((s) => s.ListID === listId);\n this.OpenList.emit({ ListID: listId, ListName: share?.ListName ?? '' });\n }\n\n public async Refresh(): Promise<void> {\n await this.loadShares();\n }\n\n /**\n * Friendly-format the \"shared at\" timestamp into a relative phrase\n * (\"3d ago\", \"2w ago\"). Matches the mockup; falls back to absolute on\n * older entries.\n */\n public FormatRelative(date: Date): string {\n const diffMs = Date.now() - date.getTime();\n const seconds = Math.floor(diffMs / 1000);\n if (seconds < 60) return 'just now';\n const minutes = Math.floor(seconds / 60);\n if (minutes < 60) return `${minutes}m ago`;\n const hours = Math.floor(minutes / 60);\n if (hours < 24) return `${hours}h ago`;\n const days = Math.floor(hours / 24);\n if (days < 7) return `${days}d ago`;\n const weeks = Math.floor(days / 7);\n if (weeks < 5) return `${weeks}w ago`;\n const months = Math.floor(days / 30);\n if (months < 12) return `${months}mo ago`;\n return date.toLocaleDateString();\n }\n\n /** @deprecated Use {@link FormatRelative}. */\n public formatRelative(date: Date): string {\n return this.FormatRelative(date);\n }\n\n /** Badge variant class for the permission-level chip. */\n public BadgeClass(level: SharePermissionLevel): string {\n switch (level) {\n case 'Owner':\n return 'badge--owner';\n case 'Edit':\n return 'badge--editor';\n default:\n return 'badge--viewer';\n }\n }\n\n /** @deprecated Use {@link BadgeClass}. */\n public badgeClass(level: SharePermissionLevel): string {\n return this.BadgeClass(level);\n }\n\n public BadgeLabel(level: SharePermissionLevel): string {\n switch (level) {\n case 'Owner':\n return 'Owner';\n case 'Edit':\n return 'Editor';\n default:\n return 'Viewer';\n }\n }\n\n /** @deprecated Use {@link BadgeLabel}. */\n public badgeLabel(level: SharePermissionLevel): string {\n return this.BadgeLabel(level);\n }\n\n private async loadShares(): Promise<void> {\n this.Loading = true;\n this.errorMessage = null;\n this.cdr.markForCheck();\n try {\n const provider = this.ProviderToUse as unknown as GraphQLDataProvider;\n const client = new GraphQLListsClient(provider);\n this.allShares = await client.ListsSharedWithMe();\n } catch (e) {\n this.errorMessage = e instanceof Error ? e.message : String(e);\n this.allShares = [];\n } finally {\n this.Loading = false;\n this.cdr.markForCheck();\n }\n }\n}\n","<div class=\"shared-with-me\">\n <!-- Toolbar -->\n <div class=\"shared-toolbar\">\n <div class=\"search-box\">\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 shared lists…\" />\n </div>\n <select\n class=\"mj-input mj-select permission-filter\"\n [(ngModel)]=\"filterLevel\"\n (ngModelChange)=\"OnFilterChange()\"\n title=\"Filter by permission\">\n <option value=\"\">All Permissions</option>\n <option value=\"View\">Viewer</option>\n <option value=\"Edit\">Editor</option>\n <option value=\"Owner\">Owner</option>\n </select>\n <button mjButton variant=\"outline\" (click)=\"Refresh()\" [disabled]=\"loading\">\n <i class=\"fa-solid fa-rotate\"></i>\n Refresh\n </button>\n </div>\n\n @if (loading) {\n <div class=\"state-block\">\n <mj-loading text=\"Loading shared lists...\" size=\"medium\"></mj-loading>\n </div>\n } @else if (errorMessage) {\n <div class=\"state-block state-block--error\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n <span>{{ errorMessage }}</span>\n </div>\n } @else if (visibleShares.length === 0) {\n <div class=\"state-block state-block--empty\">\n <i class=\"fa-solid fa-share-nodes\"></i>\n <h3>No lists shared with you</h3>\n <p>When someone shares a list with you, it'll appear here.</p>\n </div>\n } @else {\n <div class=\"list-grid\">\n @for (share of visibleShares; track share.ListID) {\n <div class=\"list-card\" (click)=\"OnCardClick(share.ListID)\" tabindex=\"0\">\n <div class=\"list-card__header\">\n <div class=\"list-card__icon\">\n <i class=\"fa-solid fa-list\"></i>\n </div>\n <div class=\"list-card__title\">{{ share.ListName }}</div>\n </div>\n <div class=\"list-card__footer\">\n <span class=\"permission-badge\" [ngClass]=\"badgeClass(share.PermissionLevel)\">\n {{ badgeLabel(share.PermissionLevel) }}\n </span>\n <span class=\"list-card__shared-at\">{{ formatRelative(share.SharedAt) }}</span>\n </div>\n </div>\n }\n </div>\n }\n</div>\n"]}
@@ -43,17 +43,41 @@ export declare class TagChipsComponent extends BaseAngularComponent implements O
43
43
  /** Emitted after add/remove so parents can refresh dependent data. */
44
44
  TagsChanged: EventEmitter<void>;
45
45
  tags: DisplayTag[];
46
- loading: boolean;
47
- addInput: string;
48
- suggestions: MJTagEntity[];
49
- showSuggestions: boolean;
46
+ Loading: boolean;
47
+ /** @deprecated Use {@link Loading}. */
48
+ get loading(): boolean;
49
+ /** @deprecated Use {@link Loading}. */
50
+ set loading(value: boolean);
51
+ AddInput: string;
52
+ /** @deprecated Use {@link AddInput}. */
53
+ get addInput(): string;
54
+ /** @deprecated Use {@link AddInput}. */
55
+ set addInput(value: string);
56
+ Suggestions: MJTagEntity[];
57
+ /** @deprecated Use {@link Suggestions}. */
58
+ get suggestions(): MJTagEntity[];
59
+ /** @deprecated Use {@link Suggestions}. */
60
+ set suggestions(value: MJTagEntity[]);
61
+ ShowSuggestions: boolean;
62
+ /** @deprecated Use {@link ShowSuggestions}. */
63
+ get showSuggestions(): boolean;
64
+ /** @deprecated Use {@link ShowSuggestions}. */
65
+ set showSuggestions(value: boolean);
50
66
  /** True when the trimmed input doesn't exactly match any existing tag —
51
67
  * drives the "Create '<term>'" affordance at the top of the dropdown. */
52
- canCreateNew: boolean;
68
+ CanCreateNew: boolean;
69
+ /** @deprecated Use {@link CanCreateNew}. */
70
+ get canCreateNew(): boolean;
71
+ /** @deprecated Use {@link CanCreateNew}. */
72
+ set canCreateNew(value: boolean);
53
73
  private initialized;
54
74
  private entityID;
55
75
  ngOnInit(): Promise<void>;
76
+ get DisplayedTags(): DisplayTag[];
77
+ /** @deprecated Use {@link DisplayedTags}. */
56
78
  get displayedTags(): DisplayTag[];
79
+ get ExtraTagCount(): number;
80
+ /** @deprecated Use {@link ExtraTagCount}. */
57
81
  get extraTagCount(): number;
58
82
  OnTagClick(tag: DisplayTag): void;
59
83
  OnRemove(tag: DisplayTag, event: Event): Promise<void>;
@@ -69,7 +93,7 @@ export declare class TagChipsComponent extends BaseAngularComponent implements O
69
93
  /** Click handler for the "Create '<term>'" affordance. Creates the
70
94
  * `MJ: Tags` row then attaches it via the standard apply path. */
71
95
  OnCreateNew(): Promise<void>;
72
- private CreateAndAddTag;
96
+ private createAndAddTag;
73
97
  private applyTagToRecord;
74
98
  /**
75
99
  * Bulk-load tags + their names in two RunViews — one for the join
@@ -1 +1 @@
1
- {"version":3,"file":"tag-chips.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/tag-chips/tag-chips.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyD,YAAY,EAAS,MAAM,EAAkB,MAAM,eAAe,CAAC;AAEnI,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAErE,OAAO,KAAK,EAAE,WAAW,EAAsB,MAAM,+BAA+B,CAAC;;AAErF;;;;;;;;;;GAUG;AAEH,UAAU,UAAU;IAClB,4CAA4C;IAC5C,YAAY,EAAE,MAAM,CAAC;IACrB,0DAA0D;IAC1D,KAAK,EAAE,MAAM,CAAC;IACd,wBAAwB;IACxB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,qBAOa,iBAAkB,SAAQ,oBAAqB,YAAW,MAAM;IAC3E,OAAO,CAAC,QAAQ,CAAC,GAAG,CAA6B;IAEjD,gDAAgD;IAChD,IACI,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,EAKlC;IACD,IAAI,UAAU,IAAI,MAAM,GAAG,IAAI,CAE9B;IACD,OAAO,CAAC,WAAW,CAAuB;IAE1C,+DAA+D;IAC/D,IACI,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,EAKhC;IACD,IAAI,QAAQ,IAAI,MAAM,GAAG,IAAI,CAE5B;IACD,OAAO,CAAC,SAAS,CAAuB;IAExC,4DAA4D;IACnD,QAAQ,UAAS;IAE1B,wEAAwE;IAC/D,UAAU,SAAK;IAExB,2EAA2E;IACjE,UAAU;eAA6B,MAAM;cAAQ,MAAM;OAAM;IAE3E,sEAAsE;IAC5D,WAAW,qBAA4B;IAE1C,IAAI,EAAE,UAAU,EAAE,CAAM;IACxB,OAAO,UAAS;IAChB,QAAQ,SAAM;IACd,WAAW,EAAE,WAAW,EAAE,CAAM;IAChC,eAAe,UAAS;IAC/B;8EAC0E;IACnE,YAAY,UAAS;IAE5B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,QAAQ,CAAuB;IAEjC,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAK/B,IAAW,aAAa,IAAI,UAAU,EAAE,CAEvC;IAED,IAAW,aAAa,IAAI,MAAM,CAEjC;IAEM,UAAU,CAAC,GAAG,EAAE,UAAU,GAAG,IAAI;IAI3B,QAAQ,CAAC,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC;IAmBtD,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAsC3D;;;;;OAKG;IACU,gBAAgB,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC;IAe9C,QAAQ,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAKtD;uEACmE;IACtD,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;YAM3B,eAAe;YAsBf,gBAAgB;IA4B9B;;;;OAIG;YACW,QAAQ;IAuDtB,OAAO,CAAC,QAAQ;yCA/QL,iBAAiB;2CAAjB,iBAAiB;CAoR7B"}
1
+ {"version":3,"file":"tag-chips.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/tag-chips/tag-chips.component.ts"],"names":[],"mappings":"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"}