@memberjunction/ng-conversations 5.30.1 → 5.31.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (124) hide show
  1. package/dist/lib/components/collection/artifact-collection-picker-modal.component.d.ts +2 -1
  2. package/dist/lib/components/collection/artifact-collection-picker-modal.component.d.ts.map +1 -1
  3. package/dist/lib/components/collection/artifact-collection-picker-modal.component.js +9 -6
  4. package/dist/lib/components/collection/artifact-collection-picker-modal.component.js.map +1 -1
  5. package/dist/lib/components/collection/artifact-create-modal.component.d.ts +2 -1
  6. package/dist/lib/components/collection/artifact-create-modal.component.d.ts.map +1 -1
  7. package/dist/lib/components/collection/artifact-create-modal.component.js +9 -6
  8. package/dist/lib/components/collection/artifact-create-modal.component.js.map +1 -1
  9. package/dist/lib/components/collection/collection-form-modal.component.d.ts +2 -1
  10. package/dist/lib/components/collection/collection-form-modal.component.d.ts.map +1 -1
  11. package/dist/lib/components/collection/collection-form-modal.component.js +8 -5
  12. package/dist/lib/components/collection/collection-form-modal.component.js.map +1 -1
  13. package/dist/lib/components/collection/collection-tree.component.d.ts +2 -1
  14. package/dist/lib/components/collection/collection-tree.component.d.ts.map +1 -1
  15. package/dist/lib/components/collection/collection-tree.component.js +9 -6
  16. package/dist/lib/components/collection/collection-tree.component.js.map +1 -1
  17. package/dist/lib/components/collection/collection-view.component.d.ts +2 -1
  18. package/dist/lib/components/collection/collection-view.component.d.ts.map +1 -1
  19. package/dist/lib/components/collection/collection-view.component.js +12 -10
  20. package/dist/lib/components/collection/collection-view.component.js.map +1 -1
  21. package/dist/lib/components/collection/collections-full-view.component.d.ts +2 -1
  22. package/dist/lib/components/collection/collections-full-view.component.d.ts.map +1 -1
  23. package/dist/lib/components/collection/collections-full-view.component.js +18 -12
  24. package/dist/lib/components/collection/collections-full-view.component.js.map +1 -1
  25. package/dist/lib/components/conversation/conversation-chat-area.component.d.ts +2 -1
  26. package/dist/lib/components/conversation/conversation-chat-area.component.d.ts.map +1 -1
  27. package/dist/lib/components/conversation/conversation-chat-area.component.js +22 -11
  28. package/dist/lib/components/conversation/conversation-chat-area.component.js.map +1 -1
  29. package/dist/lib/components/library/library-full-view.component.d.ts +2 -1
  30. package/dist/lib/components/library/library-full-view.component.d.ts.map +1 -1
  31. package/dist/lib/components/library/library-full-view.component.js +8 -5
  32. package/dist/lib/components/library/library-full-view.component.js.map +1 -1
  33. package/dist/lib/components/message/conversation-message-rating.component.d.ts +2 -1
  34. package/dist/lib/components/message/conversation-message-rating.component.d.ts.map +1 -1
  35. package/dist/lib/components/message/conversation-message-rating.component.js +9 -7
  36. package/dist/lib/components/message/conversation-message-rating.component.js.map +1 -1
  37. package/dist/lib/components/message/message-input.component.d.ts +2 -1
  38. package/dist/lib/components/message/message-input.component.d.ts.map +1 -1
  39. package/dist/lib/components/message/message-input.component.js +12 -5
  40. package/dist/lib/components/message/message-input.component.js.map +1 -1
  41. package/dist/lib/components/message/message-item.component.d.ts.map +1 -1
  42. package/dist/lib/components/message/message-item.component.js +6 -1
  43. package/dist/lib/components/message/message-item.component.js.map +1 -1
  44. package/dist/lib/components/overlay/chat-overlay.component.d.ts +2 -1
  45. package/dist/lib/components/overlay/chat-overlay.component.d.ts.map +1 -1
  46. package/dist/lib/components/overlay/chat-overlay.component.js +6 -6
  47. package/dist/lib/components/overlay/chat-overlay.component.js.map +1 -1
  48. package/dist/lib/components/project/project-form-modal.component.d.ts +2 -1
  49. package/dist/lib/components/project/project-form-modal.component.d.ts.map +1 -1
  50. package/dist/lib/components/project/project-form-modal.component.js +6 -5
  51. package/dist/lib/components/project/project-form-modal.component.js.map +1 -1
  52. package/dist/lib/components/project/project-selector.component.d.ts +2 -1
  53. package/dist/lib/components/project/project-selector.component.d.ts.map +1 -1
  54. package/dist/lib/components/project/project-selector.component.js +8 -6
  55. package/dist/lib/components/project/project-selector.component.js.map +1 -1
  56. package/dist/lib/components/share/share-modal.component.d.ts +2 -1
  57. package/dist/lib/components/share/share-modal.component.d.ts.map +1 -1
  58. package/dist/lib/components/share/share-modal.component.js +11 -9
  59. package/dist/lib/components/share/share-modal.component.js.map +1 -1
  60. package/dist/lib/components/shared/user-picker.component.d.ts +2 -1
  61. package/dist/lib/components/shared/user-picker.component.d.ts.map +1 -1
  62. package/dist/lib/components/shared/user-picker.component.js +6 -4
  63. package/dist/lib/components/shared/user-picker.component.js.map +1 -1
  64. package/dist/lib/components/task/tasks-full-view.component.d.ts +2 -1
  65. package/dist/lib/components/task/tasks-full-view.component.d.ts.map +1 -1
  66. package/dist/lib/components/task/tasks-full-view.component.js +9 -8
  67. package/dist/lib/components/task/tasks-full-view.component.js.map +1 -1
  68. package/dist/lib/components/tasks/tasks-dropdown.component.d.ts.map +1 -1
  69. package/dist/lib/components/tasks/tasks-dropdown.component.js +5 -0
  70. package/dist/lib/components/tasks/tasks-dropdown.component.js.map +1 -1
  71. package/dist/lib/components/thread/thread-panel.component.d.ts +2 -1
  72. package/dist/lib/components/thread/thread-panel.component.d.ts.map +1 -1
  73. package/dist/lib/components/thread/thread-panel.component.js +7 -4
  74. package/dist/lib/components/thread/thread-panel.component.js.map +1 -1
  75. package/dist/lib/components/workspace/conversation-workspace.component.d.ts.map +1 -1
  76. package/dist/lib/components/workspace/conversation-workspace.component.js +8 -4
  77. package/dist/lib/components/workspace/conversation-workspace.component.js.map +1 -1
  78. package/dist/lib/models/lazy-artifact-info.js +1 -1
  79. package/dist/lib/models/lazy-artifact-info.js.map +1 -1
  80. package/dist/lib/services/active-tasks.service.d.ts +7 -1
  81. package/dist/lib/services/active-tasks.service.d.ts.map +1 -1
  82. package/dist/lib/services/active-tasks.service.js +12 -2
  83. package/dist/lib/services/active-tasks.service.js.map +1 -1
  84. package/dist/lib/services/agent-state.service.d.ts +7 -1
  85. package/dist/lib/services/agent-state.service.d.ts.map +1 -1
  86. package/dist/lib/services/agent-state.service.js +12 -2
  87. package/dist/lib/services/agent-state.service.js.map +1 -1
  88. package/dist/lib/services/artifact-permission.service.d.ts +8 -1
  89. package/dist/lib/services/artifact-permission.service.d.ts.map +1 -1
  90. package/dist/lib/services/artifact-permission.service.js +21 -7
  91. package/dist/lib/services/artifact-permission.service.js.map +1 -1
  92. package/dist/lib/services/artifact-state.service.d.ts +8 -1
  93. package/dist/lib/services/artifact-state.service.d.ts.map +1 -1
  94. package/dist/lib/services/artifact-state.service.js +25 -11
  95. package/dist/lib/services/artifact-state.service.js.map +1 -1
  96. package/dist/lib/services/artifact-use-tracking.service.d.ts +7 -1
  97. package/dist/lib/services/artifact-use-tracking.service.d.ts.map +1 -1
  98. package/dist/lib/services/artifact-use-tracking.service.js +12 -2
  99. package/dist/lib/services/artifact-use-tracking.service.js.map +1 -1
  100. package/dist/lib/services/collection-permission.service.d.ts +7 -1
  101. package/dist/lib/services/collection-permission.service.d.ts.map +1 -1
  102. package/dist/lib/services/collection-permission.service.js +19 -9
  103. package/dist/lib/services/collection-permission.service.js.map +1 -1
  104. package/dist/lib/services/conversation-agent.service.d.ts +8 -0
  105. package/dist/lib/services/conversation-agent.service.d.ts.map +1 -1
  106. package/dist/lib/services/conversation-agent.service.js +15 -3
  107. package/dist/lib/services/conversation-agent.service.js.map +1 -1
  108. package/dist/lib/services/conversation-attachment.service.d.ts +7 -1
  109. package/dist/lib/services/conversation-attachment.service.d.ts.map +1 -1
  110. package/dist/lib/services/conversation-attachment.service.js +12 -2
  111. package/dist/lib/services/conversation-attachment.service.js.map +1 -1
  112. package/dist/lib/services/data-cache.service.d.ts +7 -1
  113. package/dist/lib/services/data-cache.service.d.ts.map +1 -1
  114. package/dist/lib/services/data-cache.service.js +16 -7
  115. package/dist/lib/services/data-cache.service.js.map +1 -1
  116. package/dist/lib/services/export.service.d.ts +7 -1
  117. package/dist/lib/services/export.service.d.ts.map +1 -1
  118. package/dist/lib/services/export.service.js +12 -2
  119. package/dist/lib/services/export.service.js.map +1 -1
  120. package/dist/lib/services/search.service.d.ts +7 -1
  121. package/dist/lib/services/search.service.d.ts.map +1 -1
  122. package/dist/lib/services/search.service.js +16 -6
  123. package/dist/lib/services/search.service.js.map +1 -1
  124. package/package.json +22 -22
@@ -1,4 +1,5 @@
1
1
  import { EventEmitter, OnInit, OnChanges, ChangeDetectorRef } from '@angular/core';
2
+ import { BaseAngularComponent } from '@memberjunction/ng-base-types';
2
3
  import { UserInfo } from '@memberjunction/core';
3
4
  import { MJCollectionEntity } from '@memberjunction/core-entities';
4
5
  import { ToastService } from '../../services/toast.service';
@@ -19,7 +20,7 @@ interface CollectionNode {
19
20
  * - Multi-selection support
20
21
  * - Create new collection with proper permission logic
21
22
  */
22
- export declare class ArtifactCollectionPickerModalComponent implements OnInit, OnChanges {
23
+ export declare class ArtifactCollectionPickerModalComponent extends BaseAngularComponent implements OnInit, OnChanges {
23
24
  private toastService;
24
25
  private permissionService;
25
26
  private cdr;
@@ -1 +1 @@
1
- {"version":3,"file":"artifact-collection-picker-modal.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/collection/artifact-collection-picker-modal.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,YAAY,EAAE,MAAM,EAAE,SAAS,EAAiB,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAG5H,OAAO,EAAE,QAAQ,EAAqB,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAGnE,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,EAAE,2BAA2B,EAAE,oBAAoB,EAAE,MAAM,8CAA8C,CAAC;;AAGjH,UAAU,cAAc;IACtB,UAAU,EAAE,kBAAkB,CAAC;IAC/B,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,EAAE,OAAO,CAAC;IACrB,uBAAuB,EAAE,OAAO,CAAC;CAClC;AAED;;;;;;;;GAQG;AACH,qBA4ca,sCAAuC,YAAW,MAAM,EAAE,SAAS;IA6B5E,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,iBAAiB;IACzB,OAAO,CAAC,GAAG;IA9BJ,MAAM,EAAE,OAAO,CAAS;IACxB,aAAa,EAAG,MAAM,CAAC;IACvB,WAAW,EAAG,QAAQ,CAAC;IACvB,oBAAoB,EAAE,MAAM,EAAE,CAAM;IAEnC,KAAK,yBAAgC;IACrC,SAAS,qBAA4B;IAExC,cAAc,EAAE,kBAAkB,EAAE,CAAM;IAC1C,oBAAoB,EAAE,cAAc,EAAE,CAAM;IAC5C,mBAAmB,EAAE,kBAAkB,EAAE,CAAM;IAC/C,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAa;IAE/D,cAAc,EAAE,cAAc,EAAE,CAAM;IACtC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAQ;IACtC,uBAAuB,EAAE,kBAAkB,GAAG,SAAS,CAAa;IAEpE,WAAW,EAAE,MAAM,CAAM;IACzB,SAAS,EAAE,OAAO,CAAS;IAC3B,QAAQ,EAAE,OAAO,CAAS;IAC1B,YAAY,EAAE,MAAM,CAAM;IAG1B,cAAc,EAAE,OAAO,CAAS;IAChC,iBAAiB,EAAE,MAAM,CAAM;IAC/B,oBAAoB,EAAE,OAAO,CAAS;gBAGnC,YAAY,EAAE,YAAY,EAC1B,iBAAiB,EAAE,2BAA2B,EAC9C,GAAG,EAAE,iBAAiB;IAG1B,QAAQ;IAMR,WAAW,CAAC,OAAO,EAAE,GAAG;IAO9B,OAAO,CAAC,KAAK;YAYC,eAAe;YA0Cf,mBAAmB;IAsBjC,OAAO,CAAC,sBAAsB;IAK9B,OAAO,CAAC,uBAAuB;IAK/B,OAAO,CAAC,UAAU;IAWlB,OAAO,CAAC,UAAU,EAAE,kBAAkB,GAAG,OAAO;IAWhD,eAAe,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI;IAgB3C,mBAAmB,CAAC,UAAU,EAAE,kBAAkB,GAAG,IAAI;IAmBzD,cAAc,IAAI,IAAI;IAatB,oBAAoB,CAAC,UAAU,EAAE,kBAAkB,GAAG,IAAI;IAmB1D,cAAc,IAAI,IAAI;IA0BhB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;IAmEjC,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAkB7B,QAAQ,IAAI,IAAI;yCA7UL,sCAAsC;2CAAtC,sCAAsC;CAgVlD"}
1
+ {"version":3,"file":"artifact-collection-picker-modal.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/collection/artifact-collection-picker-modal.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,YAAY,EAAE,MAAM,EAAE,SAAS,EAAiB,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAC5H,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAGrE,OAAO,EAAE,QAAQ,EAAqB,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAGnE,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,EAAE,2BAA2B,EAAE,oBAAoB,EAAE,MAAM,8CAA8C,CAAC;;AAGjH,UAAU,cAAc;IACtB,UAAU,EAAE,kBAAkB,CAAC;IAC/B,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,EAAE,OAAO,CAAC;IACrB,uBAAuB,EAAE,OAAO,CAAC;CAClC;AAED;;;;;;;;GAQG;AACH,qBA4ca,sCAAuC,SAAQ,oBAAqB,YAAW,MAAM,EAAE,SAAS;IA6BzG,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,iBAAiB;IACzB,OAAO,CAAC,GAAG;IA9BJ,MAAM,EAAE,OAAO,CAAS;IACxB,aAAa,EAAG,MAAM,CAAC;IACvB,WAAW,EAAG,QAAQ,CAAC;IACvB,oBAAoB,EAAE,MAAM,EAAE,CAAM;IAEnC,KAAK,yBAAgC;IACrC,SAAS,qBAA4B;IAExC,cAAc,EAAE,kBAAkB,EAAE,CAAM;IAC1C,oBAAoB,EAAE,cAAc,EAAE,CAAM;IAC5C,mBAAmB,EAAE,kBAAkB,EAAE,CAAM;IAC/C,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAa;IAE/D,cAAc,EAAE,cAAc,EAAE,CAAM;IACtC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAQ;IACtC,uBAAuB,EAAE,kBAAkB,GAAG,SAAS,CAAa;IAEpE,WAAW,EAAE,MAAM,CAAM;IACzB,SAAS,EAAE,OAAO,CAAS;IAC3B,QAAQ,EAAE,OAAO,CAAS;IAC1B,YAAY,EAAE,MAAM,CAAM;IAG1B,cAAc,EAAE,OAAO,CAAS;IAChC,iBAAiB,EAAE,MAAM,CAAM;IAC/B,oBAAoB,EAAE,OAAO,CAAS;gBAGnC,YAAY,EAAE,YAAY,EAC1B,iBAAiB,EAAE,2BAA2B,EAC9C,GAAG,EAAE,iBAAiB;IAI1B,QAAQ;IAOR,WAAW,CAAC,OAAO,EAAE,GAAG;IAO9B,OAAO,CAAC,KAAK;YAYC,eAAe;YA0Cf,mBAAmB;IAsBjC,OAAO,CAAC,sBAAsB;IAK9B,OAAO,CAAC,uBAAuB;IAK/B,OAAO,CAAC,UAAU;IAWlB,OAAO,CAAC,UAAU,EAAE,kBAAkB,GAAG,OAAO;IAWhD,eAAe,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI;IAgB3C,mBAAmB,CAAC,UAAU,EAAE,kBAAkB,GAAG,IAAI;IAmBzD,cAAc,IAAI,IAAI;IAatB,oBAAoB,CAAC,UAAU,EAAE,kBAAkB,GAAG,IAAI;IAmB1D,cAAc,IAAI,IAAI;IA0BhB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;IAmEjC,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAkB7B,QAAQ,IAAI,IAAI;yCA/UL,sCAAsC;2CAAtC,sCAAsC;CAkVlD"}
@@ -1,6 +1,7 @@
1
1
  import { Component, Input, Output, EventEmitter } from '@angular/core';
2
+ import { BaseAngularComponent } from '@memberjunction/ng-base-types';
2
3
  import { FormsModule } from '@angular/forms';
3
- import { RunView, Metadata } from '@memberjunction/core';
4
+ import { RunView } from '@memberjunction/core';
4
5
  import { MJDialogComponent, MJDialogActionsComponent, MJButtonDirective } from '@memberjunction/ng-ui-components';
5
6
  import { SharedGenericModule } from '@memberjunction/ng-shared-generic';
6
7
  import { UUIDsEqual } from '@memberjunction/global';
@@ -263,7 +264,7 @@ function ArtifactCollectionPickerModalComponent_Conditional_0_Template(rf, ctx)
263
264
  * - Multi-selection support
264
265
  * - Create new collection with proper permission logic
265
266
  */
266
- export class ArtifactCollectionPickerModalComponent {
267
+ export class ArtifactCollectionPickerModalComponent extends BaseAngularComponent {
267
268
  toastService;
268
269
  permissionService;
269
270
  cdr;
@@ -289,11 +290,13 @@ export class ArtifactCollectionPickerModalComponent {
289
290
  newCollectionName = '';
290
291
  isCreatingCollection = false;
291
292
  constructor(toastService, permissionService, cdr) {
293
+ super();
292
294
  this.toastService = toastService;
293
295
  this.permissionService = permissionService;
294
296
  this.cdr = cdr;
295
297
  }
296
298
  async ngOnInit() {
299
+ this.permissionService.Provider = this.ProviderToUse;
297
300
  if (this.isOpen) {
298
301
  await this.loadCollections();
299
302
  }
@@ -320,7 +323,7 @@ export class ArtifactCollectionPickerModalComponent {
320
323
  this.isLoading = true;
321
324
  this.errorMessage = '';
322
325
  // Load all collections in environment
323
- const rv = new RunView();
326
+ const rv = RunView.FromMetadataProvider(this.ProviderToUse);
324
327
  const result = await rv.RunView({
325
328
  EntityName: 'MJ: Collections',
326
329
  ExtraFilter: `EnvironmentID='${this.environmentId}'`,
@@ -475,7 +478,7 @@ export class ArtifactCollectionPickerModalComponent {
475
478
  }
476
479
  try {
477
480
  this.isCreatingCollection = true;
478
- const md = new Metadata();
481
+ const md = this.ProviderToUse;
479
482
  const collection = await md.GetEntityObject('MJ: Collections', this.currentUser);
480
483
  collection.Name = this.newCollectionName.trim();
481
484
  collection.EnvironmentID = this.environmentId;
@@ -542,7 +545,7 @@ export class ArtifactCollectionPickerModalComponent {
542
545
  this.cancelled.emit();
543
546
  }
544
547
  static ɵfac = function ArtifactCollectionPickerModalComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ArtifactCollectionPickerModalComponent)(i0.ɵɵdirectiveInject(i1.ToastService), i0.ɵɵdirectiveInject(i2.CollectionPermissionService), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
545
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ArtifactCollectionPickerModalComponent, selectors: [["mj-artifact-collection-picker-modal"]], inputs: { isOpen: "isOpen", environmentId: "environmentId", currentUser: "currentUser", excludeCollectionIds: "excludeCollectionIds" }, outputs: { saved: "saved", cancelled: "cancelled" }, features: [i0.ɵɵNgOnChangesFeature], decls: 1, vars: 1, consts: [["newCollectionInput", ""], ["Title", "Save to Collection", 3, "Visible", "Width", "MinWidth"], ["Title", "Save to Collection", 3, "Close", "Visible", "Width", "MinWidth"], [1, "picker-modal"], [1, "breadcrumb-nav"], [1, "search-bar"], [1, "fas", "fa-search", "search-icon"], ["type", "text", "placeholder", "Search collections...", 1, "k-textbox", "search-input", 3, "ngModelChange", "input", "ngModel", "disabled"], [1, "collections-list"], [1, "loading-state"], [1, "error-state"], [1, "selected-summary"], [1, "create-section"], [1, "divider"], [1, "btn-create-collection"], [1, "create-form"], ["mjButton", "", 3, "click"], ["mjButton", "", "variant", "primary", 3, "click", "disabled"], [1, "breadcrumb-btn", 3, "click"], [1, "fas", "fa-home"], [1, "fas", "fa-chevron-right", "breadcrumb-separator"], [1, "empty-state"], [1, "fas", "fa-search"], [1, "fas", "fa-folder-open"], [1, "fas", "fa-folder"], [1, "hint"], [1, "collection-item", 3, "already-added"], [1, "collection-item", 3, "click"], [1, "collection-checkbox"], ["type", "checkbox", 3, "click", "checked", "disabled"], [1, "fas", "fa-folder", "collection-icon"], [1, "collection-name"], [1, "already-added-badge"], ["title", "View sub-collections", 1, "drill-down-btn"], [1, "fas", "fa-check-circle"], ["title", "View sub-collections", 1, "drill-down-btn", 3, "click"], [1, "fas", "fa-chevron-right"], ["text", "Loading collections...", "size", "medium"], [1, "fas", "fa-exclamation-triangle"], [1, "btn-create-collection", 3, "click"], [1, "fas", "fa-plus"], ["type", "text", "placeholder", "Enter collection name", 1, "k-textbox", "create-input", 3, "ngModelChange", "keydown.enter", "ngModel"], [1, "create-actions"], ["mjButton", "", "variant", "primary", "size", "sm", 3, "click", "disabled"], [1, "fas", "fa-spinner", "fa-spin"], ["mjButton", "", "size", "sm", 3, "click"], [1, "fas", "fa-save"]], template: function ArtifactCollectionPickerModalComponent_Template(rf, ctx) { if (rf & 1) {
548
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ArtifactCollectionPickerModalComponent, selectors: [["mj-artifact-collection-picker-modal"]], inputs: { isOpen: "isOpen", environmentId: "environmentId", currentUser: "currentUser", excludeCollectionIds: "excludeCollectionIds" }, outputs: { saved: "saved", cancelled: "cancelled" }, features: [i0.ɵɵInheritDefinitionFeature, i0.ɵɵNgOnChangesFeature], decls: 1, vars: 1, consts: [["newCollectionInput", ""], ["Title", "Save to Collection", 3, "Visible", "Width", "MinWidth"], ["Title", "Save to Collection", 3, "Close", "Visible", "Width", "MinWidth"], [1, "picker-modal"], [1, "breadcrumb-nav"], [1, "search-bar"], [1, "fas", "fa-search", "search-icon"], ["type", "text", "placeholder", "Search collections...", 1, "k-textbox", "search-input", 3, "ngModelChange", "input", "ngModel", "disabled"], [1, "collections-list"], [1, "loading-state"], [1, "error-state"], [1, "selected-summary"], [1, "create-section"], [1, "divider"], [1, "btn-create-collection"], [1, "create-form"], ["mjButton", "", 3, "click"], ["mjButton", "", "variant", "primary", 3, "click", "disabled"], [1, "breadcrumb-btn", 3, "click"], [1, "fas", "fa-home"], [1, "fas", "fa-chevron-right", "breadcrumb-separator"], [1, "empty-state"], [1, "fas", "fa-search"], [1, "fas", "fa-folder-open"], [1, "fas", "fa-folder"], [1, "hint"], [1, "collection-item", 3, "already-added"], [1, "collection-item", 3, "click"], [1, "collection-checkbox"], ["type", "checkbox", 3, "click", "checked", "disabled"], [1, "fas", "fa-folder", "collection-icon"], [1, "collection-name"], [1, "already-added-badge"], ["title", "View sub-collections", 1, "drill-down-btn"], [1, "fas", "fa-check-circle"], ["title", "View sub-collections", 1, "drill-down-btn", 3, "click"], [1, "fas", "fa-chevron-right"], ["text", "Loading collections...", "size", "medium"], [1, "fas", "fa-exclamation-triangle"], [1, "btn-create-collection", 3, "click"], [1, "fas", "fa-plus"], ["type", "text", "placeholder", "Enter collection name", 1, "k-textbox", "create-input", 3, "ngModelChange", "keydown.enter", "ngModel"], [1, "create-actions"], ["mjButton", "", "variant", "primary", "size", "sm", 3, "click", "disabled"], [1, "fas", "fa-spinner", "fa-spin"], ["mjButton", "", "size", "sm", 3, "click"], [1, "fas", "fa-save"]], template: function ArtifactCollectionPickerModalComponent_Template(rf, ctx) { if (rf & 1) {
546
549
  i0.ɵɵconditionalCreate(0, ArtifactCollectionPickerModalComponent_Conditional_0_Template, 22, 13, "mj-dialog", 1);
547
550
  } if (rf & 2) {
548
551
  i0.ɵɵconditional(ctx.isOpen ? 0 : -1);
@@ -728,5 +731,5 @@ export class ArtifactCollectionPickerModalComponent {
728
731
  }], cancelled: [{
729
732
  type: Output
730
733
  }] }); })();
731
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ArtifactCollectionPickerModalComponent, { className: "ArtifactCollectionPickerModalComponent", filePath: "src/lib/components/collection/artifact-collection-picker-modal.component.ts", lineNumber: 488 }); })();
734
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ArtifactCollectionPickerModalComponent, { className: "ArtifactCollectionPickerModalComponent", filePath: "src/lib/components/collection/artifact-collection-picker-modal.component.ts", lineNumber: 489 }); })();
732
735
  //# sourceMappingURL=artifact-collection-picker-modal.component.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"artifact-collection-picker-modal.component.js","sourceRoot":"","sources":["../../../../src/lib/components/collection/artifact-collection-picker-modal.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAuD,MAAM,eAAe,CAAC;AAE5H,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAY,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAEnE,OAAO,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAClH,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AAGxE,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;;;;;;;;;IA4CpC,wBAAyD;IACzD,kCAA+E;IAAhD,yPAAS,+CAAqC,KAAC;IAC5E,YACF;IAAA,iBAAS;;;IADP,eACF;IADE,wDACF;;;;IAPF,AADF,8BAA4B,iBACgC;IAA3B,yNAAS,uBAAgB,KAAC;IACvD,wBAA2B;IAAC,sBAC9B;IAAA,iBAAS;IACT,uIAKC;IACH,iBAAM;;;IANJ,eAKC;IALD,oCAKC;;;IAoBK,wBAA6B;IAC7B,yBAAG;IAAA,YAAiD;IAAA,iBAAI;;;IAArD,eAAiD;IAAjD,mFAAiD;;;IAEpD,wBAAkC;IAClC,yBAAG;IAAA,4CAA4B;IAAA,iBAAI;;;IAEnC,wBAA6B;IAC7B,yBAAG;IAAA,wCAAwB;IAAA,iBAAI;IAC/B,6BAAgB;IAAA,sDAAsC;IAAA,iBAAI;;;IAV9D,+BAAyB;IAOrB,AAHA,AAHF,wIAAmB,kHAGW,kHAGrB;IAKX,iBAAM;;;IAXJ,cAUC;IAVD,yEAUC;;;IAiBG,gCAAkC;IAChC,wBAAmC;IAAC,+BACtC;IAAA,iBAAO;;;;IAGP,kCAG+B;IAD7B,yRAAS,wBAAwB,wBAAE,8CAAoC,KAAC;IAExE,wBAAoC;IACtC,iBAAS;;;;IAvBb,+BAEkC;IAAhC,oQAAS,+BAAqB,KAAC;IAE7B,AADF,+BAAiC,gBAK6B;IAA1D,sPAAS,wBAAwB,wBAAE,+BAAqB,KAAC;IAC7D,AALE,iBAI4D,EACxD;IACN,wBAAgH;IAChH,gCAA8B;IAAA,YAA0B;IAAA,iBAAO;IAC/D,0JAAoC;IAKpC,4JAAwB;IAQ1B,iBAAM;;;IAxBJ,gEAAoD;IAKhD,eAAyB;IACzB,AADA,0CAAyB,6CACgB;IAGJ,cAAkE;IAAlE,8EAAkE;IAC7E,eAA0B;IAA1B,6CAA0B;IACxD,cAIC;IAJD,0DAIC;IACD,cAOC;IAPD,8CAOC;;;IAzBL,oJA2BC;;;IA3BD,0CA2BC;;;IA3CL,8BAA8B;IAe1B,AAdF,qIAAyC,oGAchC;IA8BX,iBAAM;;;IA5CJ,cA2CC;IA3CD,kEA2CC;;;IAKH,8BAA2B;IACzB,iCAAqE;IACvE,iBAAM;;;IAIN,+BAAyB;IACvB,wBAA2C;IAC3C,4BAAM;IAAA,YAAkB;IAC1B,AAD0B,iBAAO,EAC3B;;;IADE,eAAkB;IAAlB,yCAAkB;;;IAK1B,+BAA8B;IAC5B,wBAAmC;IACnC,4BAAM;IAAA,YAAuD;IAC/D,AAD+D,iBAAO,EAChE;;;IADE,eAAuD;IAAvD,uFAAuD;;;;IAS7D,kCAAsE;IAAhC,kPAA0B,IAAI,KAAC;IACnE,wBAA2B;IAC3B,uCACF;IAAA,iBAAS;;;IAaD,wBAAsC;;;IAEtC,wBACF;;;;IAbJ,AADF,+BAAyB,mBAOD;IAHpB,iWAA+B;IAE/B,0OAAiB,yBAAkB,KAAC;IALtC,iBAMsB;IAEpB,AADF,+BAA4B,iBAC+G;IAA5F,2NAAS,yBAAkB,KAAC;IAGrE,AAFF,oIAA4B,qGAEnB;IAGX,iBAAS;IACT,kCAAoF;IAAzD,6NAA0B,KAAK,mDAAsB,EAAE,KAAC;IACjF,wBACF;IAEJ,AADE,AADE,iBAAS,EACL,EACF;;;IAhBF,cAA+B;IAA/B,wDAA+B;IAK2C,eAA8D;IAA9D,0FAA8D;IACtI,cAIC;IAJD,qDAIC;;;IAmBP,wBAAsC;IAAC,2BACzC;;;IACE,wBAA2B;IAAC,YAC9B;;;IAD8B,cAC9B;IAD8B,wFAC9B;;;;IApJN,oCAKmB;IAHjB,6MAAS,iBAAU,KAAC;IAIpB,8BAA0B;IAExB,sHAAiC;IAcjC,8BAAwB;IACtB,uBAAyC;IACzC,gCAMyB;IAHvB,oUAAyB;IACzB,yMAAS,uBAAgB,KAAC;IAG9B,AAPE,iBAMyB,EACrB;IAEN,sHAAmC;IAiDnC,sHAAiB;IAMjB,uHAAoB;IAOpB,uHAAsC;IASlC,AADF,AADF,gCAA4B,eACL,YACb;IAAA,8BAAa;IACrB,AADqB,iBAAO,EACtB;IAMJ,AALF,4HAAuB,mGAKd;IAwBb,AADE,iBAAM,EACF;IAEJ,AADF,0CAAmB,kBACqB;IAArB,2MAAS,iBAAU,KAAC;IACnC,yBACF;IAAA,iBAAS;IACT,mCAG4D;IAD1D,2MAAS,eAAQ,KAAC;IAIhB,AAFF,8GAAgB,wFAEP;IAKf,AADE,AADE,iBAAS,EACS,EACV;;;IAlJV,AADA,AADA,8BAAgB,cACH,iBACG;IAGd,eAYC;IAZD,2DAYC;IAOG,eAAyB;IAAzB,kDAAyB;IAGzB,2CAAsB;IAG1B,cA+CC;IA/CD,oEA+CC;IAED,cAIC;IAJD,2CAIC;IAED,cAKC;IALD,8CAKC;IAED,cAKC;IALD,gEAKC;IAMC,eA2BC;IA3BD,kDA2BC;IAUD,eAAyD;IAAzD,qFAAyD;IACzD,cAIC;IAJD,2CAIC;;AAzKb;;;;;;;;GAQG;AA6cH,MAAM,OAAO,sCAAsC;IA6BvC;IACA;IACA;IA9BD,MAAM,GAAY,KAAK,CAAC;IACxB,aAAa,CAAU;IACvB,WAAW,CAAY;IACvB,oBAAoB,GAAa,EAAE,CAAC,CAAC,2DAA2D;IAE/F,KAAK,GAAG,IAAI,YAAY,EAAY,CAAC,CAAC,gCAAgC;IACtE,SAAS,GAAG,IAAI,YAAY,EAAQ,CAAC;IAExC,cAAc,GAAyB,EAAE,CAAC;IAC1C,oBAAoB,GAAqB,EAAE,CAAC;IAC5C,mBAAmB,GAAyB,EAAE,CAAC;IAC/C,eAAe,GAAsC,IAAI,GAAG,EAAE,CAAC;IAE/D,cAAc,GAAqB,EAAE,CAAC,CAAC,mBAAmB;IAC1D,eAAe,GAAkB,IAAI,CAAC;IACtC,uBAAuB,GAAmC,SAAS,CAAC;IAEpE,WAAW,GAAW,EAAE,CAAC;IACzB,SAAS,GAAY,KAAK,CAAC;IAC3B,QAAQ,GAAY,KAAK,CAAC;IAC1B,YAAY,GAAW,EAAE,CAAC;IAEjC,+BAA+B;IACxB,cAAc,GAAY,KAAK,CAAC;IAChC,iBAAiB,GAAW,EAAE,CAAC;IAC/B,oBAAoB,GAAY,KAAK,CAAC;IAE7C,YACU,YAA0B,EAC1B,iBAA8C,EAC9C,GAAsB;QAFtB,iBAAY,GAAZ,YAAY,CAAc;QAC1B,sBAAiB,GAAjB,iBAAiB,CAA6B;QAC9C,QAAG,GAAH,GAAG,CAAmB;IAC7B,CAAC;IAEJ,KAAK,CAAC,QAAQ;QACZ,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QAC/B,CAAC;IACH,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,OAAY;QAC5B,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACrC,IAAI,CAAC,KAAK,EAAE,CAAC;YACb,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QAC/B,CAAC;IACH,CAAC;IAEO,KAAK;QACX,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;QACzB,IAAI,CAAC,oBAAoB,GAAG,EAAE,CAAC;QAC/B,IAAI,CAAC,mBAAmB,GAAG,EAAE,CAAC;QAC9B,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;QAC7B,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;QACzB,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC5B,IAAI,CAAC,uBAAuB,GAAG,SAAS,CAAC;QACzC,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;QACtB,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;IACzB,CAAC;IAEO,KAAK,CAAC,eAAe;QAC3B,IAAI,CAAC;YACH,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;YACtB,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;YAEvB,sCAAsC;YACtC,MAAM,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;YACzB,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,OAAO,CAAqB;gBAClD,UAAU,EAAE,iBAAiB;gBAC7B,WAAW,EAAE,kBAAkB,IAAI,CAAC,aAAa,GAAG;gBACpD,OAAO,EAAE,UAAU;gBACnB,UAAU,EAAE,eAAe;aAC5B,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;YAErB,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACpB,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,IAAI,4BAA4B,CAAC;gBACxE,OAAO;YACT,CAAC;YAED,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;YAE3C,4CAA4C;YAC5C,MAAM,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAEjC,6CAA6C;YAC7C,oFAAoF;YACpF,MAAM,mBAAmB,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;gBACzD,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACzB,CAAC,CAAC,CAAC;YAEH,kCAAkC;YAClC,IAAI,CAAC,sBAAsB,CAAC,mBAAmB,CAAC,CAAC;QAEnD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,KAAK,CAAC,CAAC;YACnD,IAAI,CAAC,YAAY,GAAG,6CAA6C,CAAC;QACpE,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;YACvB,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QAC3B,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,mBAAmB;QAC/B,6DAA6D;QAC7D,MAAM,mBAAmB,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CACpD,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAC9D,CAAC;QAEF,IAAI,mBAAmB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrC,OAAO;QACT,CAAC;QAED,MAAM,aAAa,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACzD,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,oBAAoB,CACnE,aAAa,EACb,IAAI,CAAC,WAAW,CAAC,EAAE,EACnB,IAAI,CAAC,WAAW,CACjB,CAAC;QAEF,WAAW,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,YAAY,EAAE,EAAE;YAC/C,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;QACrD,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,sBAAsB,CAAC,mBAAyC;QACtE,MAAM,eAAe,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QACrE,IAAI,CAAC,oBAAoB,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC;IAChG,CAAC;IAEO,uBAAuB,CAAC,QAAgB,EAAE,mBAAyC;QACzF,MAAM,gBAAgB,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;QAC3F,IAAI,CAAC,oBAAoB,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC;IACjG,CAAC;IAEO,UAAU,CAAC,UAA8B,EAAE,sBAA4C;QAC7F,MAAM,WAAW,GAAG,sBAAsB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,EAAE,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5F,MAAM,uBAAuB,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;QACpG,OAAO;YACL,UAAU;YACV,QAAQ,EAAE,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,EAAE,UAAU,CAAC,EAAE,CAAC,CAAC;YAC/E,WAAW;YACX,uBAAuB;SACxB,CAAC;IACJ,CAAC;IAED,OAAO,CAAC,UAA8B;QACpC,uEAAuE;QACvE,IAAI,CAAC,UAAU,CAAC,OAAO,IAAI,UAAU,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,EAAE,CAAC;YAC/E,OAAO,IAAI,CAAC;QACd,CAAC;QAED,0BAA0B;QAC1B,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QAC3D,OAAO,UAAU,EAAE,OAAO,IAAI,KAAK,CAAC;IACtC,CAAC;IAED,eAAe,CAAC,IAAoB;QAClC,yEAAyE;QACzE,IAAI,IAAI,CAAC,uBAAuB,EAAE,CAAC;YACjC,OAAO;QACT,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5F,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;YACf,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YAC1C,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;QACxB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC/C,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACvB,CAAC;IACH,CAAC;IAED,mBAAmB,CAAC,UAA8B;QAChD,0CAA0C;QAC1C,MAAM,mBAAmB,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;YACzD,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,mBAAmB,CAAC,CAAC;QAC9D,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE/B,IAAI,CAAC,eAAe,GAAG,UAAU,CAAC,EAAE,CAAC;QACrC,IAAI,CAAC,uBAAuB,GAAG,UAAU,CAAC;QAE1C,4BAA4B;QAC5B,IAAI,CAAC,uBAAuB,CAAC,UAAU,CAAC,EAAE,EAAE,mBAAmB,CAAC,CAAC;QAEjE,kCAAkC;QAClC,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;IACxB,CAAC;IAED,cAAc;QACZ,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;QACzB,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC5B,IAAI,CAAC,uBAAuB,GAAG,SAAS,CAAC;QAEzC,MAAM,mBAAmB,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;YACzD,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,sBAAsB,CAAC,mBAAmB,CAAC,CAAC;QACjD,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;IACxB,CAAC;IAED,oBAAoB,CAAC,UAA8B;QACjD,2DAA2D;QAC3D,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE,EAAE,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;QAE7F,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;YACf,qCAAqC;YACrC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;YAC9D,IAAI,CAAC,eAAe,GAAG,UAAU,CAAC,EAAE,CAAC;YACrC,IAAI,CAAC,uBAAuB,GAAG,UAAU,CAAC;YAE1C,MAAM,mBAAmB,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;gBACzD,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACzB,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,uBAAuB,CAAC,UAAU,CAAC,EAAE,EAAE,mBAAmB,CAAC,CAAC;YACjE,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;QACxB,CAAC;IACH,CAAC;IAED,cAAc;QACZ,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC;YAC7B,sCAAsC;YACtC,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;gBACzB,MAAM,mBAAmB,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;oBACzD,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;gBACzB,CAAC,CAAC,CAAC;gBACH,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,eAAe,EAAE,mBAAmB,CAAC,CAAC;YAC1E,CAAC;iBAAM,CAAC;gBACN,MAAM,mBAAmB,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;oBACzD,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;gBACzB,CAAC,CAAC,CAAC;gBACH,IAAI,CAAC,sBAAsB,CAAC,mBAAmB,CAAC,CAAC;YACnD,CAAC;YACD,OAAO;QACT,CAAC;QAED,yCAAyC;QACzC,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC;QAC7C,MAAM,mBAAmB,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;YACzD,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACjE,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,oBAAoB,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC;IACpG,CAAC;IAED,KAAK,CAAC,gBAAgB;QACpB,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,EAAE,CAAC;YACnC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,gCAAgC,CAAC,CAAC;YAC5D,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC;YACjC,MAAM,EAAE,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC1B,MAAM,UAAU,GAAG,MAAM,EAAE,CAAC,eAAe,CAAqB,iBAAiB,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;YAErG,UAAU,CAAC,IAAI,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,CAAC;YAChD,UAAU,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;YAE9C,2DAA2D;YAC3D,IAAI,IAAI,CAAC,uBAAuB,EAAE,CAAC;gBACjC,mDAAmD;gBACnD,UAAU,CAAC,QAAQ,GAAG,IAAI,CAAC,uBAAuB,CAAC,EAAE,CAAC;gBACtD,UAAU,CAAC,OAAO,GAAG,IAAI,CAAC,uBAAuB,CAAC,OAAO,IAAI,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;YACnF,CAAC;iBAAM,CAAC;gBACN,wDAAwD;gBACxD,UAAU,CAAC,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;YAC3C,CAAC;YAED,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC,IAAI,EAAE,CAAC;YAEtC,IAAI,KAAK,EAAE,CAAC;gBACV,qDAAqD;gBACrD,IAAI,IAAI,CAAC,uBAAuB,EAAE,CAAC;oBACjC,+BAA+B;oBAC/B,MAAM,IAAI,CAAC,iBAAiB,CAAC,qBAAqB,CAChD,IAAI,CAAC,uBAAuB,CAAC,EAAE,EAC/B,UAAU,CAAC,EAAE,EACb,IAAI,CAAC,WAAW,CACjB,CAAC;gBACJ,CAAC;qBAAM,CAAC;oBACN,0BAA0B;oBAC1B,MAAM,IAAI,CAAC,iBAAiB,CAAC,qBAAqB,CAChD,UAAU,CAAC,EAAE,EACb,IAAI,CAAC,WAAW,CAAC,EAAE,EACnB,IAAI,CAAC,WAAW,CACjB,CAAC;gBACJ,CAAC;gBAED,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,iCAAiC,CAAC,CAAC;gBAE7D,aAAa;gBACb,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;gBAC5B,IAAI,CAAC,iBAAiB,GAAG,EAAE,CAAC;gBAE5B,4CAA4C;gBAC5C,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;gBAE7B,2CAA2C;gBAC3C,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC5C,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,UAAU,CAAC,YAAY,EAAE,OAAO,IAAI,6BAA6B,CAAC,CAAC;YAC7F,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,KAAK,CAAC,CAAC;YACnD,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,iDAAiD,CAAC,CAAC;QAC7E,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,oBAAoB,GAAG,KAAK,CAAC;YAClC,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,KAAK,CAAC,MAAM;QACV,IAAI,IAAI,CAAC,mBAAmB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1C,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,uCAAuC,CAAC,CAAC;YACnE,OAAO;QACT,CAAC;QAED,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QAErB,IAAI,CAAC;YACH,kFAAkF;YAClF,MAAM,aAAa,GAAG,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC9D,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACjC,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;YACtB,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,QAAQ;QACN,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;IACxB,CAAC;gIA/UU,sCAAsC;6DAAtC,sCAAsC;YAjc/C,gHAAc;;YAAd,qCAyJC;4BAhKD,WAAW,2DACX,iBAAiB;YACjB,wBAAwB;YACxB,iBAAiB;YACjB,mBAAmB;;iFAocV,sCAAsC;cA5clD,SAAS;2BACE,qCAAqC,cACnC,IAAI,WACP;oBACP,WAAW;oBACX,iBAAiB;oBACjB,wBAAwB;oBACxB,iBAAiB;oBACjB,mBAAmB;iBACtB,YACW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA2JP;;kBAwSF,KAAK;;kBACL,KAAK;;kBACL,KAAK;;kBACL,KAAK;;kBAEL,MAAM;;kBACN,MAAM;;kFAPI,sCAAsC","sourcesContent":["import { Component, Input, Output, EventEmitter, OnInit, OnChanges, SimpleChanges, ChangeDetectorRef } from '@angular/core';\n\nimport { FormsModule } from '@angular/forms';\nimport { UserInfo, RunView, Metadata } from '@memberjunction/core';\nimport { MJCollectionEntity } from '@memberjunction/core-entities';\nimport { MJDialogComponent, MJDialogActionsComponent, MJButtonDirective } from '@memberjunction/ng-ui-components';\nimport { SharedGenericModule } from '@memberjunction/ng-shared-generic';\nimport { ToastService } from '../../services/toast.service';\nimport { CollectionPermissionService, CollectionPermission } from '../../services/collection-permission.service';\nimport { UUIDsEqual } from '@memberjunction/global';\n\ninterface CollectionNode {\n collection: MJCollectionEntity;\n selected: boolean;\n hasChildren: boolean;\n alreadyContainsArtifact: boolean;\n}\n\n/**\n * Modal for selecting collections to save artifacts to.\n * Features:\n * - Permission-aware: only shows collections where user has Edit permission\n * - Hierarchical navigation: start with root collections, drill down as needed\n * - Search by name\n * - Multi-selection support\n * - Create new collection with proper permission logic\n */\n@Component({\n selector: 'mj-artifact-collection-picker-modal',\n standalone: true,\n imports: [\n FormsModule,\n MJDialogComponent,\n MJDialogActionsComponent,\n MJButtonDirective,\n SharedGenericModule\n],\n template: `\n @if (isOpen) {\n <mj-dialog\n Title=\"Save to Collection\"\n (Close)=\"onCancel()\"\n [Visible]=\"true\"\n [Width]=\"700\"\n [MinWidth]=\"500\">\n <div class=\"picker-modal\">\n <!-- Breadcrumb Navigation -->\n @if (navigationPath.length > 0) {\n <div class=\"breadcrumb-nav\">\n <button class=\"breadcrumb-btn\" (click)=\"navigateToRoot()\">\n <i class=\"fas fa-home\"></i> Root\n </button>\n @for (item of navigationPath; track item.collection.ID) {\n <i class=\"fas fa-chevron-right breadcrumb-separator\"></i>\n <button class=\"breadcrumb-btn\" (click)=\"navigateToCollection(item.collection)\">\n {{ item.collection.Name }}\n </button>\n }\n </div>\n }\n <!-- Search Bar -->\n <div class=\"search-bar\">\n <i class=\"fas fa-search search-icon\"></i>\n <input\n type=\"text\"\n class=\"k-textbox search-input\"\n [(ngModel)]=\"searchQuery\"\n (input)=\"onSearchChange()\"\n placeholder=\"Search collections...\"\n [disabled]=\"isLoading\">\n </div>\n <!-- Collections List -->\n @if (!isLoading && !errorMessage) {\n <div class=\"collections-list\">\n @if (displayedCollections.length === 0) {\n <div class=\"empty-state\">\n @if (searchQuery) {\n <i class=\"fas fa-search\"></i>\n <p>No collections found matching \"{{ searchQuery }}\"</p>\n } @else if (currentParentId) {\n <i class=\"fas fa-folder-open\"></i>\n <p>No sub-collections available</p>\n } @else {\n <i class=\"fas fa-folder\"></i>\n <p>No collections available</p>\n <p class=\"hint\">Create a new collection to get started</p>\n }\n </div>\n } @else {\n @for (node of displayedCollections; track node.collection.ID) {\n <div class=\"collection-item\"\n [class.already-added]=\"node.alreadyContainsArtifact\"\n (click)=\"toggleSelection(node)\">\n <div class=\"collection-checkbox\">\n <input\n type=\"checkbox\"\n [checked]=\"node.selected\"\n [disabled]=\"node.alreadyContainsArtifact\"\n (click)=\"$event.stopPropagation(); toggleSelection(node)\">\n </div>\n <i class=\"fas fa-folder collection-icon\" [style.color]=\"node.collection.Color || 'var(--mj-brand-primary)'\"></i>\n <span class=\"collection-name\">{{ node.collection.Name }}</span>\n @if (node.alreadyContainsArtifact) {\n <span class=\"already-added-badge\">\n <i class=\"fas fa-check-circle\"></i> Already added\n </span>\n }\n @if (node.hasChildren) {\n <button\n class=\"drill-down-btn\"\n (click)=\"$event.stopPropagation(); drillIntoCollection(node.collection)\"\n title=\"View sub-collections\">\n <i class=\"fas fa-chevron-right\"></i>\n </button>\n }\n </div>\n }\n }\n </div>\n }\n <!-- Loading State -->\n @if (isLoading) {\n <div class=\"loading-state\">\n <mj-loading text=\"Loading collections...\" size=\"medium\"></mj-loading>\n </div>\n }\n <!-- Error State -->\n @if (errorMessage) {\n <div class=\"error-state\">\n <i class=\"fas fa-exclamation-triangle\"></i>\n <span>{{ errorMessage }}</span>\n </div>\n }\n <!-- Selected Collections Summary -->\n @if (selectedCollections.length > 0) {\n <div class=\"selected-summary\">\n <i class=\"fas fa-check-circle\"></i>\n <span>{{ selectedCollections.length }} collection(s) selected</span>\n </div>\n }\n <!-- Create New Collection Section -->\n <div class=\"create-section\">\n <div class=\"divider\">\n <span>OR CREATE NEW</span>\n </div>\n @if (!showCreateForm) {\n <button class=\"btn-create-collection\" (click)=\"showCreateForm = true\">\n <i class=\"fas fa-plus\"></i>\n Create New Collection\n </button>\n } @else {\n <div class=\"create-form\">\n <input\n type=\"text\"\n class=\"k-textbox create-input\"\n [(ngModel)]=\"newCollectionName\"\n placeholder=\"Enter collection name\"\n (keydown.enter)=\"createCollection()\"\n #newCollectionInput>\n <div class=\"create-actions\">\n <button mjButton variant=\"primary\" size=\"sm\" (click)=\"createCollection()\" [disabled]=\"isCreatingCollection || !newCollectionName.trim()\">\n @if (isCreatingCollection) {\n <i class=\"fas fa-spinner fa-spin\"></i>\n } @else {\n Create\n }\n </button>\n <button mjButton size=\"sm\" (click)=\"showCreateForm = false; newCollectionName = ''\">\n Cancel\n </button>\n </div>\n </div>\n }\n </div>\n </div>\n <mj-dialog-actions>\n <button mjButton (click)=\"onCancel()\">\n Cancel\n </button>\n <button mjButton\n variant=\"primary\"\n (click)=\"onSave()\"\n [disabled]=\"selectedCollections.length === 0 || isSaving\">\n @if (isSaving) {\n <i class=\"fas fa-spinner fa-spin\"></i> Saving...\n } @else {\n <i class=\"fas fa-save\"></i> Save to {{ selectedCollections.length }} Collection(s)\n }\n </button>\n </mj-dialog-actions>\n </mj-dialog>\n }\n `,\n styles: [`\n .picker-modal {\n display: flex;\n flex-direction: column;\n gap: 16px;\n padding: 20px 0;\n min-height: 400px;\n max-height: 600px;\n }\n\n .breadcrumb-nav {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 16px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n overflow-x: auto;\n }\n\n .breadcrumb-btn {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 4px 8px;\n background: transparent;\n border: none;\n border-radius: 4px;\n color: var(--mj-brand-primary);\n cursor: pointer;\n white-space: nowrap;\n font-size: 14px;\n }\n\n .breadcrumb-btn:hover {\n background: var(--mj-border-default);\n }\n\n .breadcrumb-separator {\n color: var(--mj-text-disabled);\n font-size: 12px;\n }\n\n .search-bar {\n position: relative;\n display: flex;\n align-items: center;\n }\n\n .search-icon {\n position: absolute;\n left: 12px;\n color: var(--mj-text-disabled);\n pointer-events: none;\n }\n\n .search-input {\n width: 100%;\n padding-left: 36px;\n }\n\n .collections-list {\n flex: 1;\n overflow-y: auto;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n min-height: 250px;\n max-height: 350px;\n }\n\n .collection-item {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 16px;\n border-bottom: 1px solid var(--mj-border-default);\n cursor: pointer;\n transition: background 0.2s;\n }\n\n .collection-item:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .collection-item:last-child {\n border-bottom: none;\n }\n\n .collection-item.already-added {\n background: var(--mj-bg-surface-sunken);\n opacity: 0.7;\n cursor: not-allowed;\n }\n\n .collection-item.already-added:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .collection-checkbox {\n display: flex;\n align-items: center;\n }\n\n .collection-checkbox input[type=\"checkbox\"] {\n width: 18px;\n height: 18px;\n cursor: pointer;\n }\n\n .collection-icon {\n font-size: 18px;\n flex-shrink: 0;\n }\n\n .collection-name {\n flex: 1;\n font-size: 14px;\n color: var(--mj-text-primary);\n }\n\n .already-added-badge {\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 4px 8px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 30%, var(--mj-bg-surface));\n border-radius: 12px;\n color: var(--mj-brand-primary);\n font-size: 12px;\n font-weight: 500;\n white-space: nowrap;\n }\n\n .already-added-badge i {\n font-size: 12px;\n color: var(--mj-brand-primary);\n }\n\n .drill-down-btn {\n padding: 6px 10px;\n background: transparent;\n border: 1px solid var(--mj-border-strong);\n border-radius: 4px;\n color: var(--mj-text-muted);\n cursor: pointer;\n transition: all 0.2s;\n }\n\n .drill-down-btn:hover {\n background: var(--mj-bg-surface-sunken);\n border-color: var(--mj-text-disabled);\n color: var(--mj-text-secondary);\n }\n\n .empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 48px 24px;\n color: var(--mj-text-muted);\n text-align: center;\n }\n\n .empty-state i {\n font-size: 48px;\n margin-bottom: 16px;\n opacity: 0.4;\n }\n\n .empty-state p {\n margin: 4px 0;\n font-size: 14px;\n }\n\n .empty-state .hint {\n font-size: 13px;\n color: var(--mj-text-disabled);\n }\n\n .loading-state, .error-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 48px 24px;\n gap: 12px;\n color: var(--mj-text-muted);\n }\n\n .error-state i {\n font-size: 32px;\n }\n\n .error-state {\n color: var(--mj-status-error);\n }\n\n .selected-summary {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 16px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 30%, var(--mj-bg-surface));\n border-radius: 6px;\n color: var(--mj-brand-primary);\n font-size: 14px;\n font-weight: 500;\n }\n\n .selected-summary i {\n color: var(--mj-brand-primary);\n }\n\n .create-section {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n\n .divider {\n display: flex;\n align-items: center;\n text-align: center;\n color: var(--mj-text-disabled);\n font-size: 12px;\n font-weight: 500;\n }\n\n .divider::before,\n .divider::after {\n content: '';\n flex: 1;\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .divider span {\n padding: 0 12px;\n }\n\n .btn-create-collection {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 10px 16px;\n background: var(--mj-bg-surface-sunken);\n border: 2px dashed var(--mj-border-strong);\n border-radius: 6px;\n color: var(--mj-brand-primary);\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s;\n }\n\n .btn-create-collection:hover {\n background: var(--mj-bg-surface-sunken);\n border-color: var(--mj-brand-primary);\n }\n\n .btn-create-collection i {\n font-size: 16px;\n }\n\n .create-form {\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding: 16px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n }\n\n .create-input {\n width: 100%;\n }\n\n .create-actions {\n display: flex;\n gap: 8px;\n justify-content: flex-end;\n }\n\n .btn-create, .btn-cancel {\n padding: 8px 16px;\n font-size: 14px;\n }\n `]\n})\nexport class ArtifactCollectionPickerModalComponent implements OnInit, OnChanges {\n @Input() isOpen: boolean = false;\n @Input() environmentId!: string;\n @Input() currentUser!: UserInfo;\n @Input() excludeCollectionIds: string[] = []; // Collections to exclude (e.g., already contains artifact)\n\n @Output() saved = new EventEmitter<string[]>(); // Emits selected collection IDs\n @Output() cancelled = new EventEmitter<void>();\n\n public allCollections: MJCollectionEntity[] = [];\n public displayedCollections: CollectionNode[] = [];\n public selectedCollections: MJCollectionEntity[] = [];\n public userPermissions: Map<string, CollectionPermission> = new Map();\n\n public navigationPath: CollectionNode[] = []; // Breadcrumb trail\n public currentParentId: string | null = null;\n public currentParentCollection: MJCollectionEntity | undefined = undefined;\n\n public searchQuery: string = '';\n public isLoading: boolean = false;\n public isSaving: boolean = false;\n public errorMessage: string = '';\n\n // Create collection form state\n public showCreateForm: boolean = false;\n public newCollectionName: string = '';\n public isCreatingCollection: boolean = false;\n\n constructor(\n private toastService: ToastService,\n private permissionService: CollectionPermissionService,\n private cdr: ChangeDetectorRef\n ) {}\n\n async ngOnInit() {\n if (this.isOpen) {\n await this.loadCollections();\n }\n }\n\n async ngOnChanges(changes: any) {\n if (changes['isOpen'] && this.isOpen) {\n this.reset();\n await this.loadCollections();\n }\n }\n\n private reset(): void {\n this.allCollections = [];\n this.displayedCollections = [];\n this.selectedCollections = [];\n this.userPermissions.clear();\n this.navigationPath = [];\n this.currentParentId = null;\n this.currentParentCollection = undefined;\n this.searchQuery = '';\n this.errorMessage = '';\n }\n\n private async loadCollections(): Promise<void> {\n try {\n this.isLoading = true;\n this.errorMessage = '';\n\n // Load all collections in environment\n const rv = new RunView();\n const result = await rv.RunView<MJCollectionEntity>({\n EntityName: 'MJ: Collections',\n ExtraFilter: `EnvironmentID='${this.environmentId}'`,\n OrderBy: 'Name ASC',\n ResultType: 'entity_object'\n }, this.currentUser);\n\n if (!result.Success) {\n this.errorMessage = result.ErrorMessage || 'Failed to load collections';\n return;\n }\n\n this.allCollections = result.Results || [];\n\n // Load user permissions for all collections\n await this.loadUserPermissions();\n\n // Filter to collections with Edit permission\n // Include collections that already contain the artifact (will be shown as disabled)\n const editableCollections = this.allCollections.filter(c => {\n return this.canEdit(c);\n });\n\n // Show root collections initially\n this.displayRootCollections(editableCollections);\n\n } catch (error) {\n console.error('Error loading collections:', error);\n this.errorMessage = 'An error occurred while loading collections';\n } finally {\n this.isLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n private async loadUserPermissions(): Promise<void> {\n // Load permissions for collections not owned by current user\n const nonOwnedCollections = this.allCollections.filter(\n c => c.OwnerID && !UUIDsEqual(c.OwnerID, this.currentUser.ID)\n );\n\n if (nonOwnedCollections.length === 0) {\n return;\n }\n\n const collectionIds = nonOwnedCollections.map(c => c.ID);\n const permissions = await this.permissionService.checkBulkPermissions(\n collectionIds,\n this.currentUser.ID,\n this.currentUser\n );\n\n permissions.forEach((permission, collectionId) => {\n this.userPermissions.set(collectionId, permission);\n });\n }\n\n private displayRootCollections(editableCollections: MJCollectionEntity[]): void {\n const rootCollections = editableCollections.filter(c => !c.ParentID);\n this.displayedCollections = rootCollections.map(c => this.createNode(c, editableCollections));\n }\n\n private displayChildCollections(parentId: string, editableCollections: MJCollectionEntity[]): void {\n const childCollections = editableCollections.filter(c => UUIDsEqual(c.ParentID, parentId));\n this.displayedCollections = childCollections.map(c => this.createNode(c, editableCollections));\n }\n\n private createNode(collection: MJCollectionEntity, allEditableCollections: MJCollectionEntity[]): CollectionNode {\n const hasChildren = allEditableCollections.some(c => UUIDsEqual(c.ParentID, collection.ID));\n const alreadyContainsArtifact = this.excludeCollectionIds.some(id => UUIDsEqual(id, collection.ID));\n return {\n collection,\n selected: this.selectedCollections.some(sc => UUIDsEqual(sc.ID, collection.ID)),\n hasChildren,\n alreadyContainsArtifact\n };\n }\n\n canEdit(collection: MJCollectionEntity): boolean {\n // Backwards compatibility: treat null OwnerID as owned by current user\n if (!collection.OwnerID || UUIDsEqual(collection.OwnerID, this.currentUser.ID)) {\n return true;\n }\n\n // Check permission record\n const permission = this.userPermissions.get(collection.ID);\n return permission?.canEdit || false;\n }\n\n toggleSelection(node: CollectionNode): void {\n // Don't allow selection of collections that already contain the artifact\n if (node.alreadyContainsArtifact) {\n return;\n }\n\n const index = this.selectedCollections.findIndex(c => UUIDsEqual(c.ID, node.collection.ID));\n if (index >= 0) {\n this.selectedCollections.splice(index, 1);\n node.selected = false;\n } else {\n this.selectedCollections.push(node.collection);\n node.selected = true;\n }\n }\n\n drillIntoCollection(collection: MJCollectionEntity): void {\n // Add current location to navigation path\n const editableCollections = this.allCollections.filter(c => {\n return this.canEdit(c);\n });\n\n const node = this.createNode(collection, editableCollections);\n this.navigationPath.push(node);\n\n this.currentParentId = collection.ID;\n this.currentParentCollection = collection;\n\n // Display child collections\n this.displayChildCollections(collection.ID, editableCollections);\n\n // Clear search when drilling down\n this.searchQuery = '';\n }\n\n navigateToRoot(): void {\n this.navigationPath = [];\n this.currentParentId = null;\n this.currentParentCollection = undefined;\n\n const editableCollections = this.allCollections.filter(c => {\n return this.canEdit(c);\n });\n\n this.displayRootCollections(editableCollections);\n this.searchQuery = '';\n }\n\n navigateToCollection(collection: MJCollectionEntity): void {\n // Find the index of this collection in the navigation path\n const index = this.navigationPath.findIndex(n => UUIDsEqual(n.collection.ID, collection.ID));\n\n if (index >= 0) {\n // Trim navigation path to this level\n this.navigationPath = this.navigationPath.slice(0, index + 1);\n this.currentParentId = collection.ID;\n this.currentParentCollection = collection;\n\n const editableCollections = this.allCollections.filter(c => {\n return this.canEdit(c);\n });\n\n this.displayChildCollections(collection.ID, editableCollections);\n this.searchQuery = '';\n }\n }\n\n onSearchChange(): void {\n if (!this.searchQuery.trim()) {\n // Reset to current navigation context\n if (this.currentParentId) {\n const editableCollections = this.allCollections.filter(c => {\n return this.canEdit(c);\n });\n this.displayChildCollections(this.currentParentId, editableCollections);\n } else {\n const editableCollections = this.allCollections.filter(c => {\n return this.canEdit(c);\n });\n this.displayRootCollections(editableCollections);\n }\n return;\n }\n\n // Search across all editable collections\n const query = this.searchQuery.toLowerCase();\n const editableCollections = this.allCollections.filter(c => {\n return this.canEdit(c) && c.Name.toLowerCase().includes(query);\n });\n\n this.displayedCollections = editableCollections.map(c => this.createNode(c, editableCollections));\n }\n\n async createCollection(): Promise<void> {\n if (!this.newCollectionName.trim()) {\n this.toastService.warning('Please enter a collection name');\n return;\n }\n\n try {\n this.isCreatingCollection = true;\n const md = new Metadata();\n const collection = await md.GetEntityObject<MJCollectionEntity>('MJ: Collections', this.currentUser);\n\n collection.Name = this.newCollectionName.trim();\n collection.EnvironmentID = this.environmentId;\n\n // Set parent and owner based on current navigation context\n if (this.currentParentCollection) {\n // Creating sub-collection - inherit parent's owner\n collection.ParentID = this.currentParentCollection.ID;\n collection.OwnerID = this.currentParentCollection.OwnerID || this.currentUser.ID;\n } else {\n // Creating root collection - current user becomes owner\n collection.OwnerID = this.currentUser.ID;\n }\n\n const saved = await collection.Save();\n\n if (saved) {\n // Create owner permission or copy parent permissions\n if (this.currentParentCollection) {\n // Copy permissions from parent\n await this.permissionService.copyParentPermissions(\n this.currentParentCollection.ID,\n collection.ID,\n this.currentUser\n );\n } else {\n // Create owner permission\n await this.permissionService.createOwnerPermission(\n collection.ID,\n this.currentUser.ID,\n this.currentUser\n );\n }\n\n this.toastService.success('Collection created successfully');\n\n // Reset form\n this.showCreateForm = false;\n this.newCollectionName = '';\n\n // Reload collections to include the new one\n await this.loadCollections();\n\n // Auto-select the newly created collection\n this.selectedCollections.push(collection);\n } else {\n this.toastService.error(collection.LatestResult?.Message || 'Failed to create collection');\n }\n } catch (error) {\n console.error('Error creating collection:', error);\n this.toastService.error('An error occurred while creating the collection');\n } finally {\n this.isCreatingCollection = false;\n this.cdr.detectChanges();\n }\n }\n\n async onSave(): Promise<void> {\n if (this.selectedCollections.length === 0) {\n this.toastService.warning('Please select at least one collection');\n return;\n }\n\n this.isSaving = true;\n\n try {\n // Emit the selected collection IDs - parent handles actual saving and modal close\n const collectionIds = this.selectedCollections.map(c => c.ID);\n this.saved.emit(collectionIds);\n } finally {\n this.isSaving = false;\n this.cdr.detectChanges();\n }\n }\n\n onCancel(): void {\n this.cancelled.emit();\n }\n}\n"]}
1
+ {"version":3,"file":"artifact-collection-picker-modal.component.js","sourceRoot":"","sources":["../../../../src/lib/components/collection/artifact-collection-picker-modal.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, OnInit, OnChanges, SimpleChanges, ChangeDetectorRef } from '@angular/core';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\n\nimport { FormsModule } from '@angular/forms';\nimport { UserInfo, RunView, Metadata } from '@memberjunction/core';\nimport { MJCollectionEntity } from '@memberjunction/core-entities';\nimport { MJDialogComponent, MJDialogActionsComponent, MJButtonDirective } from '@memberjunction/ng-ui-components';\nimport { SharedGenericModule } from '@memberjunction/ng-shared-generic';\nimport { ToastService } from '../../services/toast.service';\nimport { CollectionPermissionService, CollectionPermission } from '../../services/collection-permission.service';\nimport { UUIDsEqual } from '@memberjunction/global';\n\ninterface CollectionNode {\n collection: MJCollectionEntity;\n selected: boolean;\n hasChildren: boolean;\n alreadyContainsArtifact: boolean;\n}\n\n/**\n * Modal for selecting collections to save artifacts to.\n * Features:\n * - Permission-aware: only shows collections where user has Edit permission\n * - Hierarchical navigation: start with root collections, drill down as needed\n * - Search by name\n * - Multi-selection support\n * - Create new collection with proper permission logic\n */\n@Component({\n selector: 'mj-artifact-collection-picker-modal',\n standalone: true,\n imports: [\n FormsModule,\n MJDialogComponent,\n MJDialogActionsComponent,\n MJButtonDirective,\n SharedGenericModule\n],\n template: `\n @if (isOpen) {\n <mj-dialog\n Title=\"Save to Collection\"\n (Close)=\"onCancel()\"\n [Visible]=\"true\"\n [Width]=\"700\"\n [MinWidth]=\"500\">\n <div class=\"picker-modal\">\n <!-- Breadcrumb Navigation -->\n @if (navigationPath.length > 0) {\n <div class=\"breadcrumb-nav\">\n <button class=\"breadcrumb-btn\" (click)=\"navigateToRoot()\">\n <i class=\"fas fa-home\"></i> Root\n </button>\n @for (item of navigationPath; track item.collection.ID) {\n <i class=\"fas fa-chevron-right breadcrumb-separator\"></i>\n <button class=\"breadcrumb-btn\" (click)=\"navigateToCollection(item.collection)\">\n {{ item.collection.Name }}\n </button>\n }\n </div>\n }\n <!-- Search Bar -->\n <div class=\"search-bar\">\n <i class=\"fas fa-search search-icon\"></i>\n <input\n type=\"text\"\n class=\"k-textbox search-input\"\n [(ngModel)]=\"searchQuery\"\n (input)=\"onSearchChange()\"\n placeholder=\"Search collections...\"\n [disabled]=\"isLoading\">\n </div>\n <!-- Collections List -->\n @if (!isLoading && !errorMessage) {\n <div class=\"collections-list\">\n @if (displayedCollections.length === 0) {\n <div class=\"empty-state\">\n @if (searchQuery) {\n <i class=\"fas fa-search\"></i>\n <p>No collections found matching \"{{ searchQuery }}\"</p>\n } @else if (currentParentId) {\n <i class=\"fas fa-folder-open\"></i>\n <p>No sub-collections available</p>\n } @else {\n <i class=\"fas fa-folder\"></i>\n <p>No collections available</p>\n <p class=\"hint\">Create a new collection to get started</p>\n }\n </div>\n } @else {\n @for (node of displayedCollections; track node.collection.ID) {\n <div class=\"collection-item\"\n [class.already-added]=\"node.alreadyContainsArtifact\"\n (click)=\"toggleSelection(node)\">\n <div class=\"collection-checkbox\">\n <input\n type=\"checkbox\"\n [checked]=\"node.selected\"\n [disabled]=\"node.alreadyContainsArtifact\"\n (click)=\"$event.stopPropagation(); toggleSelection(node)\">\n </div>\n <i class=\"fas fa-folder collection-icon\" [style.color]=\"node.collection.Color || 'var(--mj-brand-primary)'\"></i>\n <span class=\"collection-name\">{{ node.collection.Name }}</span>\n @if (node.alreadyContainsArtifact) {\n <span class=\"already-added-badge\">\n <i class=\"fas fa-check-circle\"></i> Already added\n </span>\n }\n @if (node.hasChildren) {\n <button\n class=\"drill-down-btn\"\n (click)=\"$event.stopPropagation(); drillIntoCollection(node.collection)\"\n title=\"View sub-collections\">\n <i class=\"fas fa-chevron-right\"></i>\n </button>\n }\n </div>\n }\n }\n </div>\n }\n <!-- Loading State -->\n @if (isLoading) {\n <div class=\"loading-state\">\n <mj-loading text=\"Loading collections...\" size=\"medium\"></mj-loading>\n </div>\n }\n <!-- Error State -->\n @if (errorMessage) {\n <div class=\"error-state\">\n <i class=\"fas fa-exclamation-triangle\"></i>\n <span>{{ errorMessage }}</span>\n </div>\n }\n <!-- Selected Collections Summary -->\n @if (selectedCollections.length > 0) {\n <div class=\"selected-summary\">\n <i class=\"fas fa-check-circle\"></i>\n <span>{{ selectedCollections.length }} collection(s) selected</span>\n </div>\n }\n <!-- Create New Collection Section -->\n <div class=\"create-section\">\n <div class=\"divider\">\n <span>OR CREATE NEW</span>\n </div>\n @if (!showCreateForm) {\n <button class=\"btn-create-collection\" (click)=\"showCreateForm = true\">\n <i class=\"fas fa-plus\"></i>\n Create New Collection\n </button>\n } @else {\n <div class=\"create-form\">\n <input\n type=\"text\"\n class=\"k-textbox create-input\"\n [(ngModel)]=\"newCollectionName\"\n placeholder=\"Enter collection name\"\n (keydown.enter)=\"createCollection()\"\n #newCollectionInput>\n <div class=\"create-actions\">\n <button mjButton variant=\"primary\" size=\"sm\" (click)=\"createCollection()\" [disabled]=\"isCreatingCollection || !newCollectionName.trim()\">\n @if (isCreatingCollection) {\n <i class=\"fas fa-spinner fa-spin\"></i>\n } @else {\n Create\n }\n </button>\n <button mjButton size=\"sm\" (click)=\"showCreateForm = false; newCollectionName = ''\">\n Cancel\n </button>\n </div>\n </div>\n }\n </div>\n </div>\n <mj-dialog-actions>\n <button mjButton (click)=\"onCancel()\">\n Cancel\n </button>\n <button mjButton\n variant=\"primary\"\n (click)=\"onSave()\"\n [disabled]=\"selectedCollections.length === 0 || isSaving\">\n @if (isSaving) {\n <i class=\"fas fa-spinner fa-spin\"></i> Saving...\n } @else {\n <i class=\"fas fa-save\"></i> Save to {{ selectedCollections.length }} Collection(s)\n }\n </button>\n </mj-dialog-actions>\n </mj-dialog>\n }\n `,\n styles: [`\n .picker-modal {\n display: flex;\n flex-direction: column;\n gap: 16px;\n padding: 20px 0;\n min-height: 400px;\n max-height: 600px;\n }\n\n .breadcrumb-nav {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 16px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n overflow-x: auto;\n }\n\n .breadcrumb-btn {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 4px 8px;\n background: transparent;\n border: none;\n border-radius: 4px;\n color: var(--mj-brand-primary);\n cursor: pointer;\n white-space: nowrap;\n font-size: 14px;\n }\n\n .breadcrumb-btn:hover {\n background: var(--mj-border-default);\n }\n\n .breadcrumb-separator {\n color: var(--mj-text-disabled);\n font-size: 12px;\n }\n\n .search-bar {\n position: relative;\n display: flex;\n align-items: center;\n }\n\n .search-icon {\n position: absolute;\n left: 12px;\n color: var(--mj-text-disabled);\n pointer-events: none;\n }\n\n .search-input {\n width: 100%;\n padding-left: 36px;\n }\n\n .collections-list {\n flex: 1;\n overflow-y: auto;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n min-height: 250px;\n max-height: 350px;\n }\n\n .collection-item {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 16px;\n border-bottom: 1px solid var(--mj-border-default);\n cursor: pointer;\n transition: background 0.2s;\n }\n\n .collection-item:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .collection-item:last-child {\n border-bottom: none;\n }\n\n .collection-item.already-added {\n background: var(--mj-bg-surface-sunken);\n opacity: 0.7;\n cursor: not-allowed;\n }\n\n .collection-item.already-added:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .collection-checkbox {\n display: flex;\n align-items: center;\n }\n\n .collection-checkbox input[type=\"checkbox\"] {\n width: 18px;\n height: 18px;\n cursor: pointer;\n }\n\n .collection-icon {\n font-size: 18px;\n flex-shrink: 0;\n }\n\n .collection-name {\n flex: 1;\n font-size: 14px;\n color: var(--mj-text-primary);\n }\n\n .already-added-badge {\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 4px 8px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 30%, var(--mj-bg-surface));\n border-radius: 12px;\n color: var(--mj-brand-primary);\n font-size: 12px;\n font-weight: 500;\n white-space: nowrap;\n }\n\n .already-added-badge i {\n font-size: 12px;\n color: var(--mj-brand-primary);\n }\n\n .drill-down-btn {\n padding: 6px 10px;\n background: transparent;\n border: 1px solid var(--mj-border-strong);\n border-radius: 4px;\n color: var(--mj-text-muted);\n cursor: pointer;\n transition: all 0.2s;\n }\n\n .drill-down-btn:hover {\n background: var(--mj-bg-surface-sunken);\n border-color: var(--mj-text-disabled);\n color: var(--mj-text-secondary);\n }\n\n .empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 48px 24px;\n color: var(--mj-text-muted);\n text-align: center;\n }\n\n .empty-state i {\n font-size: 48px;\n margin-bottom: 16px;\n opacity: 0.4;\n }\n\n .empty-state p {\n margin: 4px 0;\n font-size: 14px;\n }\n\n .empty-state .hint {\n font-size: 13px;\n color: var(--mj-text-disabled);\n }\n\n .loading-state, .error-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 48px 24px;\n gap: 12px;\n color: var(--mj-text-muted);\n }\n\n .error-state i {\n font-size: 32px;\n }\n\n .error-state {\n color: var(--mj-status-error);\n }\n\n .selected-summary {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 16px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 30%, var(--mj-bg-surface));\n border-radius: 6px;\n color: var(--mj-brand-primary);\n font-size: 14px;\n font-weight: 500;\n }\n\n .selected-summary i {\n color: var(--mj-brand-primary);\n }\n\n .create-section {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n\n .divider {\n display: flex;\n align-items: center;\n text-align: center;\n color: var(--mj-text-disabled);\n font-size: 12px;\n font-weight: 500;\n }\n\n .divider::before,\n .divider::after {\n content: '';\n flex: 1;\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .divider span {\n padding: 0 12px;\n }\n\n .btn-create-collection {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 10px 16px;\n background: var(--mj-bg-surface-sunken);\n border: 2px dashed var(--mj-border-strong);\n border-radius: 6px;\n color: var(--mj-brand-primary);\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s;\n }\n\n .btn-create-collection:hover {\n background: var(--mj-bg-surface-sunken);\n border-color: var(--mj-brand-primary);\n }\n\n .btn-create-collection i {\n font-size: 16px;\n }\n\n .create-form {\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding: 16px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n }\n\n .create-input {\n width: 100%;\n }\n\n .create-actions {\n display: flex;\n gap: 8px;\n justify-content: flex-end;\n }\n\n .btn-create, .btn-cancel {\n padding: 8px 16px;\n font-size: 14px;\n }\n `]\n})\nexport class ArtifactCollectionPickerModalComponent extends BaseAngularComponent implements OnInit, OnChanges {\n @Input() isOpen: boolean = false;\n @Input() environmentId!: string;\n @Input() currentUser!: UserInfo;\n @Input() excludeCollectionIds: string[] = []; // Collections to exclude (e.g., already contains artifact)\n\n @Output() saved = new EventEmitter<string[]>(); // Emits selected collection IDs\n @Output() cancelled = new EventEmitter<void>();\n\n public allCollections: MJCollectionEntity[] = [];\n public displayedCollections: CollectionNode[] = [];\n public selectedCollections: MJCollectionEntity[] = [];\n public userPermissions: Map<string, CollectionPermission> = new Map();\n\n public navigationPath: CollectionNode[] = []; // Breadcrumb trail\n public currentParentId: string | null = null;\n public currentParentCollection: MJCollectionEntity | undefined = undefined;\n\n public searchQuery: string = '';\n public isLoading: boolean = false;\n public isSaving: boolean = false;\n public errorMessage: string = '';\n\n // Create collection form state\n public showCreateForm: boolean = false;\n public newCollectionName: string = '';\n public isCreatingCollection: boolean = false;\n\n constructor(\n private toastService: ToastService,\n private permissionService: CollectionPermissionService,\n private cdr: ChangeDetectorRef\n ) {\n super();}\n\n async ngOnInit() {\n this.permissionService.Provider = this.ProviderToUse;\n if (this.isOpen) {\n await this.loadCollections();\n }\n }\n\n async ngOnChanges(changes: any) {\n if (changes['isOpen'] && this.isOpen) {\n this.reset();\n await this.loadCollections();\n }\n }\n\n private reset(): void {\n this.allCollections = [];\n this.displayedCollections = [];\n this.selectedCollections = [];\n this.userPermissions.clear();\n this.navigationPath = [];\n this.currentParentId = null;\n this.currentParentCollection = undefined;\n this.searchQuery = '';\n this.errorMessage = '';\n }\n\n private async loadCollections(): Promise<void> {\n try {\n this.isLoading = true;\n this.errorMessage = '';\n\n // Load all collections in environment\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView<MJCollectionEntity>({\n EntityName: 'MJ: Collections',\n ExtraFilter: `EnvironmentID='${this.environmentId}'`,\n OrderBy: 'Name ASC',\n ResultType: 'entity_object'\n }, this.currentUser);\n\n if (!result.Success) {\n this.errorMessage = result.ErrorMessage || 'Failed to load collections';\n return;\n }\n\n this.allCollections = result.Results || [];\n\n // Load user permissions for all collections\n await this.loadUserPermissions();\n\n // Filter to collections with Edit permission\n // Include collections that already contain the artifact (will be shown as disabled)\n const editableCollections = this.allCollections.filter(c => {\n return this.canEdit(c);\n });\n\n // Show root collections initially\n this.displayRootCollections(editableCollections);\n\n } catch (error) {\n console.error('Error loading collections:', error);\n this.errorMessage = 'An error occurred while loading collections';\n } finally {\n this.isLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n private async loadUserPermissions(): Promise<void> {\n // Load permissions for collections not owned by current user\n const nonOwnedCollections = this.allCollections.filter(\n c => c.OwnerID && !UUIDsEqual(c.OwnerID, this.currentUser.ID)\n );\n\n if (nonOwnedCollections.length === 0) {\n return;\n }\n\n const collectionIds = nonOwnedCollections.map(c => c.ID);\n const permissions = await this.permissionService.checkBulkPermissions(\n collectionIds,\n this.currentUser.ID,\n this.currentUser\n );\n\n permissions.forEach((permission, collectionId) => {\n this.userPermissions.set(collectionId, permission);\n });\n }\n\n private displayRootCollections(editableCollections: MJCollectionEntity[]): void {\n const rootCollections = editableCollections.filter(c => !c.ParentID);\n this.displayedCollections = rootCollections.map(c => this.createNode(c, editableCollections));\n }\n\n private displayChildCollections(parentId: string, editableCollections: MJCollectionEntity[]): void {\n const childCollections = editableCollections.filter(c => UUIDsEqual(c.ParentID, parentId));\n this.displayedCollections = childCollections.map(c => this.createNode(c, editableCollections));\n }\n\n private createNode(collection: MJCollectionEntity, allEditableCollections: MJCollectionEntity[]): CollectionNode {\n const hasChildren = allEditableCollections.some(c => UUIDsEqual(c.ParentID, collection.ID));\n const alreadyContainsArtifact = this.excludeCollectionIds.some(id => UUIDsEqual(id, collection.ID));\n return {\n collection,\n selected: this.selectedCollections.some(sc => UUIDsEqual(sc.ID, collection.ID)),\n hasChildren,\n alreadyContainsArtifact\n };\n }\n\n canEdit(collection: MJCollectionEntity): boolean {\n // Backwards compatibility: treat null OwnerID as owned by current user\n if (!collection.OwnerID || UUIDsEqual(collection.OwnerID, this.currentUser.ID)) {\n return true;\n }\n\n // Check permission record\n const permission = this.userPermissions.get(collection.ID);\n return permission?.canEdit || false;\n }\n\n toggleSelection(node: CollectionNode): void {\n // Don't allow selection of collections that already contain the artifact\n if (node.alreadyContainsArtifact) {\n return;\n }\n\n const index = this.selectedCollections.findIndex(c => UUIDsEqual(c.ID, node.collection.ID));\n if (index >= 0) {\n this.selectedCollections.splice(index, 1);\n node.selected = false;\n } else {\n this.selectedCollections.push(node.collection);\n node.selected = true;\n }\n }\n\n drillIntoCollection(collection: MJCollectionEntity): void {\n // Add current location to navigation path\n const editableCollections = this.allCollections.filter(c => {\n return this.canEdit(c);\n });\n\n const node = this.createNode(collection, editableCollections);\n this.navigationPath.push(node);\n\n this.currentParentId = collection.ID;\n this.currentParentCollection = collection;\n\n // Display child collections\n this.displayChildCollections(collection.ID, editableCollections);\n\n // Clear search when drilling down\n this.searchQuery = '';\n }\n\n navigateToRoot(): void {\n this.navigationPath = [];\n this.currentParentId = null;\n this.currentParentCollection = undefined;\n\n const editableCollections = this.allCollections.filter(c => {\n return this.canEdit(c);\n });\n\n this.displayRootCollections(editableCollections);\n this.searchQuery = '';\n }\n\n navigateToCollection(collection: MJCollectionEntity): void {\n // Find the index of this collection in the navigation path\n const index = this.navigationPath.findIndex(n => UUIDsEqual(n.collection.ID, collection.ID));\n\n if (index >= 0) {\n // Trim navigation path to this level\n this.navigationPath = this.navigationPath.slice(0, index + 1);\n this.currentParentId = collection.ID;\n this.currentParentCollection = collection;\n\n const editableCollections = this.allCollections.filter(c => {\n return this.canEdit(c);\n });\n\n this.displayChildCollections(collection.ID, editableCollections);\n this.searchQuery = '';\n }\n }\n\n onSearchChange(): void {\n if (!this.searchQuery.trim()) {\n // Reset to current navigation context\n if (this.currentParentId) {\n const editableCollections = this.allCollections.filter(c => {\n return this.canEdit(c);\n });\n this.displayChildCollections(this.currentParentId, editableCollections);\n } else {\n const editableCollections = this.allCollections.filter(c => {\n return this.canEdit(c);\n });\n this.displayRootCollections(editableCollections);\n }\n return;\n }\n\n // Search across all editable collections\n const query = this.searchQuery.toLowerCase();\n const editableCollections = this.allCollections.filter(c => {\n return this.canEdit(c) && c.Name.toLowerCase().includes(query);\n });\n\n this.displayedCollections = editableCollections.map(c => this.createNode(c, editableCollections));\n }\n\n async createCollection(): Promise<void> {\n if (!this.newCollectionName.trim()) {\n this.toastService.warning('Please enter a collection name');\n return;\n }\n\n try {\n this.isCreatingCollection = true;\n const md = this.ProviderToUse;\n const collection = await md.GetEntityObject<MJCollectionEntity>('MJ: Collections', this.currentUser);\n\n collection.Name = this.newCollectionName.trim();\n collection.EnvironmentID = this.environmentId;\n\n // Set parent and owner based on current navigation context\n if (this.currentParentCollection) {\n // Creating sub-collection - inherit parent's owner\n collection.ParentID = this.currentParentCollection.ID;\n collection.OwnerID = this.currentParentCollection.OwnerID || this.currentUser.ID;\n } else {\n // Creating root collection - current user becomes owner\n collection.OwnerID = this.currentUser.ID;\n }\n\n const saved = await collection.Save();\n\n if (saved) {\n // Create owner permission or copy parent permissions\n if (this.currentParentCollection) {\n // Copy permissions from parent\n await this.permissionService.copyParentPermissions(\n this.currentParentCollection.ID,\n collection.ID,\n this.currentUser\n );\n } else {\n // Create owner permission\n await this.permissionService.createOwnerPermission(\n collection.ID,\n this.currentUser.ID,\n this.currentUser\n );\n }\n\n this.toastService.success('Collection created successfully');\n\n // Reset form\n this.showCreateForm = false;\n this.newCollectionName = '';\n\n // Reload collections to include the new one\n await this.loadCollections();\n\n // Auto-select the newly created collection\n this.selectedCollections.push(collection);\n } else {\n this.toastService.error(collection.LatestResult?.Message || 'Failed to create collection');\n }\n } catch (error) {\n console.error('Error creating collection:', error);\n this.toastService.error('An error occurred while creating the collection');\n } finally {\n this.isCreatingCollection = false;\n this.cdr.detectChanges();\n }\n }\n\n async onSave(): Promise<void> {\n if (this.selectedCollections.length === 0) {\n this.toastService.warning('Please select at least one collection');\n return;\n }\n\n this.isSaving = true;\n\n try {\n // Emit the selected collection IDs - parent handles actual saving and modal close\n const collectionIds = this.selectedCollections.map(c => c.ID);\n this.saved.emit(collectionIds);\n } finally {\n this.isSaving = false;\n this.cdr.detectChanges();\n }\n }\n\n onCancel(): void {\n this.cancelled.emit();\n }\n}\n"]}
@@ -1,4 +1,5 @@
1
1
  import { EventEmitter, OnChanges, SimpleChanges, ChangeDetectorRef } from '@angular/core';
2
+ import { BaseAngularComponent } from '@memberjunction/ng-base-types';
2
3
  import { UserInfo } from '@memberjunction/core';
3
4
  import { MJArtifactEntity, MJArtifactTypeEntity } from '@memberjunction/core-entities';
4
5
  import { ToastService } from '../../services/toast.service';
@@ -7,7 +8,7 @@ import * as i0 from "@angular/core";
7
8
  /**
8
9
  * Modal for creating new artifacts and adding them to collections
9
10
  */
10
- export declare class ArtifactCreateModalComponent implements OnChanges {
11
+ export declare class ArtifactCreateModalComponent extends BaseAngularComponent implements OnChanges {
11
12
  private toastService;
12
13
  private permissionService;
13
14
  private cdr;
@@ -1 +1 @@
1
- {"version":3,"file":"artifact-create-modal.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/collection/artifact-create-modal.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACpH,OAAO,EAAE,QAAQ,EAAqB,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAA+C,MAAM,+BAA+B,CAAC;AACpI,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,EAAE,2BAA2B,EAAE,MAAM,8CAA8C,CAAC;;AAG3F;;GAEG;AACH,qBAoJa,4BAA6B,YAAW,SAAS;IAsB1D,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,iBAAiB;IACzB,OAAO,CAAC,GAAG;IAvBJ,MAAM,EAAE,OAAO,CAAS;IACxB,YAAY,EAAG,MAAM,CAAC;IACtB,aAAa,EAAG,MAAM,CAAC;IACvB,WAAW,EAAG,QAAQ,CAAC;IAEtB,KAAK,iCAAwC;IAC7C,SAAS,qBAA4B;IAExC,QAAQ;;;;sBAIS,oBAAoB,GAAG,IAAI;MACjD;IAEK,aAAa,EAAE,oBAAoB,EAAE,CAAM;IAC3C,cAAc,EAAE,OAAO,CAAS;IAChC,QAAQ,EAAE,OAAO,CAAS;IAC1B,YAAY,EAAE,MAAM,CAAM;gBAGvB,YAAY,EAAE,YAAY,EAC1B,iBAAiB,EAAE,2BAA2B,EAC9C,GAAG,EAAE,iBAAiB;IAGhC,WAAW,CAAC,OAAO,EAAE,aAAa;IAOlC,IAAI,OAAO,IAAI,OAAO,CAIrB;YAEa,iBAAiB;IAkC/B,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAI9B,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAuF7B,QAAQ,IAAI,IAAI;IAKhB,OAAO,CAAC,SAAS;yCA1KN,4BAA4B;2CAA5B,4BAA4B;CAmLxC"}
1
+ {"version":3,"file":"artifact-create-modal.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/collection/artifact-create-modal.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACpH,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAE,QAAQ,EAAqB,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAA+C,MAAM,+BAA+B,CAAC;AACpI,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,EAAE,2BAA2B,EAAE,MAAM,8CAA8C,CAAC;;AAG3F;;GAEG;AACH,qBAoJa,4BAA6B,SAAQ,oBAAqB,YAAW,SAAS;IAsBvF,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,iBAAiB;IACzB,OAAO,CAAC,GAAG;IAvBJ,MAAM,EAAE,OAAO,CAAS;IACxB,YAAY,EAAG,MAAM,CAAC;IACtB,aAAa,EAAG,MAAM,CAAC;IACvB,WAAW,EAAG,QAAQ,CAAC;IAEtB,KAAK,iCAAwC;IAC7C,SAAS,qBAA4B;IAExC,QAAQ;;;;sBAIS,oBAAoB,GAAG,IAAI;MACjD;IAEK,aAAa,EAAE,oBAAoB,EAAE,CAAM;IAC3C,cAAc,EAAE,OAAO,CAAS;IAChC,QAAQ,EAAE,OAAO,CAAS;IAC1B,YAAY,EAAE,MAAM,CAAM;gBAGvB,YAAY,EAAE,YAAY,EAC1B,iBAAiB,EAAE,2BAA2B,EAC9C,GAAG,EAAE,iBAAiB;IAIhC,WAAW,CAAC,OAAO,EAAE,aAAa;IAQlC,IAAI,OAAO,IAAI,OAAO,CAIrB;YAEa,iBAAiB;IAkC/B,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAI9B,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAuF7B,QAAQ,IAAI,IAAI;IAKhB,OAAO,CAAC,SAAS;yCA5KN,4BAA4B;2CAA5B,4BAA4B;CAqLxC"}
@@ -1,5 +1,6 @@
1
1
  import { Component, Input, Output, EventEmitter } from '@angular/core';
2
- import { Metadata, RunView } from '@memberjunction/core';
2
+ import { BaseAngularComponent } from '@memberjunction/ng-base-types';
3
+ import { RunView } from '@memberjunction/core';
3
4
  import { UUIDsEqual } from '@memberjunction/global';
4
5
  import * as i0 from "@angular/core";
5
6
  import * as i1 from "../../services/toast.service";
@@ -106,7 +107,7 @@ function ArtifactCreateModalComponent_Conditional_0_Template(rf, ctx) { if (rf &
106
107
  /**
107
108
  * Modal for creating new artifacts and adding them to collections
108
109
  */
109
- export class ArtifactCreateModalComponent {
110
+ export class ArtifactCreateModalComponent extends BaseAngularComponent {
110
111
  toastService;
111
112
  permissionService;
112
113
  cdr;
@@ -127,11 +128,13 @@ export class ArtifactCreateModalComponent {
127
128
  isSaving = false;
128
129
  errorMessage = '';
129
130
  constructor(toastService, permissionService, cdr) {
131
+ super();
130
132
  this.toastService = toastService;
131
133
  this.permissionService = permissionService;
132
134
  this.cdr = cdr;
133
135
  }
134
136
  ngOnChanges(changes) {
137
+ this.permissionService.Provider = this.ProviderToUse;
135
138
  if (changes['isOpen'] && this.isOpen) {
136
139
  this.resetForm();
137
140
  this.loadArtifactTypes();
@@ -145,7 +148,7 @@ export class ArtifactCreateModalComponent {
145
148
  async loadArtifactTypes() {
146
149
  this.isLoadingTypes = true;
147
150
  try {
148
- const rv = new RunView();
151
+ const rv = RunView.FromMetadataProvider(this.ProviderToUse);
149
152
  const result = await rv.RunView({
150
153
  EntityName: 'MJ: Artifact Types',
151
154
  ExtraFilter: 'IsEnabled=1',
@@ -184,7 +187,7 @@ export class ArtifactCreateModalComponent {
184
187
  this.errorMessage = '';
185
188
  try {
186
189
  // Validate permission to add artifacts to collection
187
- const md = new Metadata();
190
+ const md = this.ProviderToUse;
188
191
  const collection = await md.GetEntityObject('MJ: Collections', this.currentUser);
189
192
  await collection.Load(this.collectionId);
190
193
  // Check if user has Edit permission on collection
@@ -265,7 +268,7 @@ export class ArtifactCreateModalComponent {
265
268
  this.errorMessage = '';
266
269
  }
267
270
  static ɵfac = function ArtifactCreateModalComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ArtifactCreateModalComponent)(i0.ɵɵdirectiveInject(i1.ToastService), i0.ɵɵdirectiveInject(i2.CollectionPermissionService), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
268
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ArtifactCreateModalComponent, selectors: [["mj-artifact-create-modal"]], inputs: { isOpen: "isOpen", collectionId: "collectionId", environmentId: "environmentId", currentUser: "currentUser" }, outputs: { saved: "saved", cancelled: "cancelled" }, standalone: false, features: [i0.ɵɵNgOnChangesFeature], decls: 1, vars: 1, consts: [["nameInput", ""], ["Title", "Create Artifact", 3, "Width", "MinWidth", "Visible"], ["Title", "Create Artifact", 3, "Close", "Width", "MinWidth", "Visible"], [1, "artifact-form"], [1, "form-group"], [1, "form-label"], [1, "required"], ["type", "text", "placeholder", "Artifact name", 1, "k-textbox", "form-control", 3, "ngModelChange", "ngModel"], [1, "form-control", "mj-select", 3, "ngModelChange", "ngModel", "disabled"], ["value", "", "disabled", ""], [3, "value"], ["placeholder", "Optional description", "rows", "2", 1, "k-textarea", "form-control", 3, "ngModelChange", "ngModel"], ["placeholder", "Paste your content here...", "rows", "12", 1, "k-textarea", "form-control", "content-area", 3, "ngModelChange", "ngModel"], [1, "content-hint"], [1, "fas", "fa-info-circle"], [1, "form-error"], ["mjButton", "", 3, "click", "disabled"], ["mjButton", "", "variant", "primary", 3, "click", "disabled"], [1, "fas", "fa-exclamation-circle"]], template: function ArtifactCreateModalComponent_Template(rf, ctx) { if (rf & 1) {
271
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ArtifactCreateModalComponent, selectors: [["mj-artifact-create-modal"]], inputs: { isOpen: "isOpen", collectionId: "collectionId", environmentId: "environmentId", currentUser: "currentUser" }, outputs: { saved: "saved", cancelled: "cancelled" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature, i0.ɵɵNgOnChangesFeature], decls: 1, vars: 1, consts: [["nameInput", ""], ["Title", "Create Artifact", 3, "Width", "MinWidth", "Visible"], ["Title", "Create Artifact", 3, "Close", "Width", "MinWidth", "Visible"], [1, "artifact-form"], [1, "form-group"], [1, "form-label"], [1, "required"], ["type", "text", "placeholder", "Artifact name", 1, "k-textbox", "form-control", 3, "ngModelChange", "ngModel"], [1, "form-control", "mj-select", 3, "ngModelChange", "ngModel", "disabled"], ["value", "", "disabled", ""], [3, "value"], ["placeholder", "Optional description", "rows", "2", 1, "k-textarea", "form-control", 3, "ngModelChange", "ngModel"], ["placeholder", "Paste your content here...", "rows", "12", 1, "k-textarea", "form-control", "content-area", 3, "ngModelChange", "ngModel"], [1, "content-hint"], [1, "fas", "fa-info-circle"], [1, "form-error"], ["mjButton", "", 3, "click", "disabled"], ["mjButton", "", "variant", "primary", 3, "click", "disabled"], [1, "fas", "fa-exclamation-circle"]], template: function ArtifactCreateModalComponent_Template(rf, ctx) { if (rf & 1) {
269
272
  i0.ɵɵconditionalCreate(0, ArtifactCreateModalComponent_Conditional_0_Template, 40, 12, "mj-dialog", 1);
270
273
  } if (rf & 2) {
271
274
  i0.ɵɵconditional(ctx.isOpen ? 0 : -1);
@@ -366,5 +369,5 @@ export class ArtifactCreateModalComponent {
366
369
  }], cancelled: [{
367
370
  type: Output
368
371
  }] }); })();
369
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ArtifactCreateModalComponent, { className: "ArtifactCreateModalComponent", filePath: "src/lib/components/collection/artifact-create-modal.component.ts", lineNumber: 159 }); })();
372
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ArtifactCreateModalComponent, { className: "ArtifactCreateModalComponent", filePath: "src/lib/components/collection/artifact-create-modal.component.ts", lineNumber: 160 }); })();
370
373
  //# sourceMappingURL=artifact-create-modal.component.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"artifact-create-modal.component.js","sourceRoot":"","sources":["../../../../src/lib/components/collection/artifact-create-modal.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, OnChanges, SimpleChanges, ChangeDetectorRef } from '@angular/core';\nimport { UserInfo, Metadata, RunView } from '@memberjunction/core';\nimport { MJArtifactEntity, MJArtifactTypeEntity, MJArtifactVersionEntity, MJCollectionEntity } from '@memberjunction/core-entities';\nimport { ToastService } from '../../services/toast.service';\nimport { CollectionPermissionService } from '../../services/collection-permission.service';\nimport { UUIDsEqual } from '@memberjunction/global';\n\n/**\n * Modal for creating new artifacts and adding them to collections\n */\n@Component({\n standalone: false,\n selector: 'mj-artifact-create-modal',\n template: `\n @if (isOpen) {\n <mj-dialog\n Title=\"Create Artifact\"\n (Close)=\"onCancel()\"\n [Width]=\"600\"\n [MinWidth]=\"400\"\n [Visible]=\"true\">\n <div class=\"artifact-form\">\n <div class=\"form-group\">\n <label class=\"form-label\">\n Name <span class=\"required\">*</span>\n </label>\n <input\n type=\"text\"\n class=\"k-textbox form-control\"\n [(ngModel)]=\"formData.name\"\n placeholder=\"Artifact name\"\n #nameInput>\n </div>\n <div class=\"form-group\">\n <label class=\"form-label\">\n Type <span class=\"required\">*</span>\n </label>\n <select\n [ngModel]=\"formData.selectedType?.ID || ''\"\n (ngModelChange)=\"onTypeSelected($event)\"\n class=\"form-control mj-select\"\n [disabled]=\"isLoadingTypes\">\n <option value=\"\" disabled>Select a type...</option>\n @for (type of artifactTypes; track type.ID) {\n <option [value]=\"type.ID\">{{ type.Name }}</option>\n }\n </select>\n </div>\n <div class=\"form-group\">\n <label class=\"form-label\">Description</label>\n <textarea\n class=\"k-textarea form-control\"\n [(ngModel)]=\"formData.description\"\n placeholder=\"Optional description\"\n rows=\"2\">\n </textarea>\n </div>\n <div class=\"form-group\">\n <label class=\"form-label\">\n Content <span class=\"required\">*</span>\n </label>\n <textarea\n class=\"k-textarea form-control content-area\"\n [(ngModel)]=\"formData.content\"\n placeholder=\"Paste your content here...\"\n rows=\"12\">\n </textarea>\n <div class=\"content-hint\">\n <i class=\"fas fa-info-circle\"></i>\n Paste or type the artifact content. The content will be saved as version 1.\n </div>\n </div>\n @if (errorMessage) {\n <div class=\"form-error\">\n <i class=\"fas fa-exclamation-circle\"></i>\n {{ errorMessage }}\n </div>\n }\n </div>\n <mj-dialog-actions>\n <button mjButton (click)=\"onCancel()\" [disabled]=\"isSaving\">\n Cancel\n </button>\n <button mjButton\n variant=\"primary\"\n (click)=\"onSave()\"\n [disabled]=\"!canSave || isSaving\">\n {{ isSaving ? 'Creating...' : 'Create Artifact' }}\n </button>\n </mj-dialog-actions>\n </mj-dialog>\n }\n `,\n styles: [`\n .artifact-form {\n padding: 20px 0;\n }\n\n .form-group {\n margin-bottom: 20px;\n }\n\n .form-label {\n display: block;\n margin-bottom: 8px;\n font-weight: 500;\n color: var(--mj-text-primary);\n }\n\n .required {\n color: var(--mj-status-error);\n }\n\n .form-control {\n width: 100%;\n }\n\n .content-area {\n font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', monospace;\n font-size: 13px;\n line-height: 1.5;\n }\n\n .content-hint {\n display: flex;\n align-items: start;\n gap: 8px;\n margin-top: 8px;\n padding: 8px 12px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 30%, var(--mj-bg-surface));\n border-radius: 6px;\n font-size: 13px;\n color: var(--mj-brand-primary);\n }\n\n .content-hint i {\n flex-shrink: 0;\n margin-top: 2px;\n }\n\n .form-error {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px;\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n border: 1px solid color-mix(in srgb, var(--mj-status-error) 30%, var(--mj-bg-surface));\n border-radius: 6px;\n color: var(--mj-status-error);\n font-size: 14px;\n }\n\n .form-error i {\n flex-shrink: 0;\n }\n `]\n})\nexport class ArtifactCreateModalComponent implements OnChanges {\n @Input() isOpen: boolean = false;\n @Input() collectionId!: string;\n @Input() environmentId!: string;\n @Input() currentUser!: UserInfo;\n\n @Output() saved = new EventEmitter<MJArtifactEntity>();\n @Output() cancelled = new EventEmitter<void>();\n\n public formData = {\n name: '',\n description: '',\n content: '',\n selectedType: null as MJArtifactTypeEntity | null\n };\n\n public artifactTypes: MJArtifactTypeEntity[] = [];\n public isLoadingTypes: boolean = false;\n public isSaving: boolean = false;\n public errorMessage: string = '';\n\n constructor(\n private toastService: ToastService,\n private permissionService: CollectionPermissionService,\n private cdr: ChangeDetectorRef\n ) {}\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes['isOpen'] && this.isOpen) {\n this.resetForm();\n this.loadArtifactTypes();\n }\n }\n\n get canSave(): boolean {\n return this.formData.name.trim().length > 0 &&\n this.formData.content.trim().length > 0 &&\n this.formData.selectedType !== null;\n }\n\n private async loadArtifactTypes(): Promise<void> {\n this.isLoadingTypes = true;\n try {\n const rv = new RunView();\n const result = await rv.RunView<MJArtifactTypeEntity>(\n {\n EntityName: 'MJ: Artifact Types',\n ExtraFilter: 'IsEnabled=1',\n OrderBy: 'Name ASC',\n MaxRows: 1000,\n ResultType: 'entity_object'\n },\n this.currentUser\n );\n\n if (result.Success && result.Results) {\n this.artifactTypes = result.Results;\n // Default to \"Text\" or first type\n const textType = this.artifactTypes.find(t => t.Name === 'Text' || t.Name === 'Markdown');\n if (textType) {\n this.formData.selectedType = textType;\n } else if (this.artifactTypes.length > 0) {\n this.formData.selectedType = this.artifactTypes[0];\n }\n }\n } catch (error) {\n console.error('Error loading artifact types:', error);\n this.toastService.error('Failed to load artifact types');\n } finally {\n this.isLoadingTypes = false;\n this.cdr.detectChanges(); // zone.js 0.15: async RunView doesn't trigger CD\n }\n }\n\n onTypeSelected(typeId: string): void {\n this.formData.selectedType = this.artifactTypes.find(t => UUIDsEqual(t.ID, typeId)) || null;\n }\n\n async onSave(): Promise<void> {\n if (!this.canSave) return;\n\n this.isSaving = true;\n this.errorMessage = '';\n\n try {\n // Validate permission to add artifacts to collection\n const md = new Metadata();\n const collection = await md.GetEntityObject<MJCollectionEntity>('MJ: Collections', this.currentUser);\n await collection.Load(this.collectionId);\n\n // Check if user has Edit permission on collection\n if (collection.OwnerID && !UUIDsEqual(collection.OwnerID, this.currentUser.ID)) {\n const permission = await this.permissionService.checkPermission(\n this.collectionId,\n this.currentUser.ID,\n this.currentUser\n );\n\n if (!permission?.canEdit) {\n this.errorMessage = 'You do not have Edit permission to add artifacts to this collection.';\n this.isSaving = false;\n return;\n }\n }\n\n // Step 1: Create the artifact\n const artifact = await md.GetEntityObject<MJArtifactEntity>('MJ: Artifacts', this.currentUser);\n artifact.Name = this.formData.name.trim();\n artifact.Description = this.formData.description.trim() || null;\n artifact.TypeID = this.formData.selectedType!.ID;\n artifact.EnvironmentID = this.environmentId;\n artifact.UserID = this.currentUser.ID;\n\n const artifactSaved = await artifact.Save();\n if (!artifactSaved) {\n this.errorMessage = artifact.LatestResult?.Message || 'Failed to create artifact';\n this.toastService.error(this.errorMessage);\n return;\n }\n\n // Step 2: Create the first version\n const version = await md.GetEntityObject<MJArtifactVersionEntity>('MJ: Artifact Versions', this.currentUser);\n version.ArtifactID = artifact.ID;\n version.VersionNumber = 1;\n version.Content = this.formData.content.trim();\n version.UserID = this.currentUser.ID;\n version.Name = this.formData.name.trim(); // Version inherits name\n version.Description = this.formData.description.trim() || null;\n\n const versionSaved = await version.Save();\n if (!versionSaved) {\n // Rollback: delete the artifact if version creation fails\n await artifact.Delete();\n this.errorMessage = version.LatestResult?.Message || 'Failed to create artifact version';\n this.toastService.error(this.errorMessage);\n return;\n }\n\n // Step 3: Add to collection\n const collectionArtifact = await md.GetEntityObject('MJ: Collection Artifacts', this.currentUser);\n (collectionArtifact as any).CollectionID = this.collectionId;\n (collectionArtifact as any).ArtifactVersionID = version.ID;\n\n const collectionLinkSaved = await collectionArtifact.Save();\n if (!collectionLinkSaved) {\n // Rollback: delete version and artifact if collection link fails\n await version.Delete();\n await artifact.Delete();\n this.errorMessage = 'Failed to add artifact to collection';\n this.toastService.error(this.errorMessage);\n return;\n }\n\n this.toastService.success('Artifact created successfully');\n this.saved.emit(artifact);\n this.resetForm();\n } catch (error) {\n console.error('Error creating artifact:', error);\n this.errorMessage = 'An unexpected error occurred';\n this.toastService.error(this.errorMessage);\n } finally {\n this.isSaving = false;\n }\n }\n\n onCancel(): void {\n this.resetForm();\n this.cancelled.emit();\n }\n\n private resetForm(): void {\n this.formData = {\n name: '',\n description: '',\n content: '',\n selectedType: this.artifactTypes.length > 0 ? this.artifactTypes[0] : null\n };\n this.errorMessage = '';\n }\n}\n"]}
1
+ {"version":3,"file":"artifact-create-modal.component.js","sourceRoot":"","sources":["../../../../src/lib/components/collection/artifact-create-modal.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, OnChanges, SimpleChanges, ChangeDetectorRef } from '@angular/core';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { UserInfo, Metadata, RunView } from '@memberjunction/core';\nimport { MJArtifactEntity, MJArtifactTypeEntity, MJArtifactVersionEntity, MJCollectionEntity } from '@memberjunction/core-entities';\nimport { ToastService } from '../../services/toast.service';\nimport { CollectionPermissionService } from '../../services/collection-permission.service';\nimport { UUIDsEqual } from '@memberjunction/global';\n\n/**\n * Modal for creating new artifacts and adding them to collections\n */\n@Component({\n standalone: false,\n selector: 'mj-artifact-create-modal',\n template: `\n @if (isOpen) {\n <mj-dialog\n Title=\"Create Artifact\"\n (Close)=\"onCancel()\"\n [Width]=\"600\"\n [MinWidth]=\"400\"\n [Visible]=\"true\">\n <div class=\"artifact-form\">\n <div class=\"form-group\">\n <label class=\"form-label\">\n Name <span class=\"required\">*</span>\n </label>\n <input\n type=\"text\"\n class=\"k-textbox form-control\"\n [(ngModel)]=\"formData.name\"\n placeholder=\"Artifact name\"\n #nameInput>\n </div>\n <div class=\"form-group\">\n <label class=\"form-label\">\n Type <span class=\"required\">*</span>\n </label>\n <select\n [ngModel]=\"formData.selectedType?.ID || ''\"\n (ngModelChange)=\"onTypeSelected($event)\"\n class=\"form-control mj-select\"\n [disabled]=\"isLoadingTypes\">\n <option value=\"\" disabled>Select a type...</option>\n @for (type of artifactTypes; track type.ID) {\n <option [value]=\"type.ID\">{{ type.Name }}</option>\n }\n </select>\n </div>\n <div class=\"form-group\">\n <label class=\"form-label\">Description</label>\n <textarea\n class=\"k-textarea form-control\"\n [(ngModel)]=\"formData.description\"\n placeholder=\"Optional description\"\n rows=\"2\">\n </textarea>\n </div>\n <div class=\"form-group\">\n <label class=\"form-label\">\n Content <span class=\"required\">*</span>\n </label>\n <textarea\n class=\"k-textarea form-control content-area\"\n [(ngModel)]=\"formData.content\"\n placeholder=\"Paste your content here...\"\n rows=\"12\">\n </textarea>\n <div class=\"content-hint\">\n <i class=\"fas fa-info-circle\"></i>\n Paste or type the artifact content. The content will be saved as version 1.\n </div>\n </div>\n @if (errorMessage) {\n <div class=\"form-error\">\n <i class=\"fas fa-exclamation-circle\"></i>\n {{ errorMessage }}\n </div>\n }\n </div>\n <mj-dialog-actions>\n <button mjButton (click)=\"onCancel()\" [disabled]=\"isSaving\">\n Cancel\n </button>\n <button mjButton\n variant=\"primary\"\n (click)=\"onSave()\"\n [disabled]=\"!canSave || isSaving\">\n {{ isSaving ? 'Creating...' : 'Create Artifact' }}\n </button>\n </mj-dialog-actions>\n </mj-dialog>\n }\n `,\n styles: [`\n .artifact-form {\n padding: 20px 0;\n }\n\n .form-group {\n margin-bottom: 20px;\n }\n\n .form-label {\n display: block;\n margin-bottom: 8px;\n font-weight: 500;\n color: var(--mj-text-primary);\n }\n\n .required {\n color: var(--mj-status-error);\n }\n\n .form-control {\n width: 100%;\n }\n\n .content-area {\n font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', monospace;\n font-size: 13px;\n line-height: 1.5;\n }\n\n .content-hint {\n display: flex;\n align-items: start;\n gap: 8px;\n margin-top: 8px;\n padding: 8px 12px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 30%, var(--mj-bg-surface));\n border-radius: 6px;\n font-size: 13px;\n color: var(--mj-brand-primary);\n }\n\n .content-hint i {\n flex-shrink: 0;\n margin-top: 2px;\n }\n\n .form-error {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px;\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n border: 1px solid color-mix(in srgb, var(--mj-status-error) 30%, var(--mj-bg-surface));\n border-radius: 6px;\n color: var(--mj-status-error);\n font-size: 14px;\n }\n\n .form-error i {\n flex-shrink: 0;\n }\n `]\n})\nexport class ArtifactCreateModalComponent extends BaseAngularComponent implements OnChanges {\n @Input() isOpen: boolean = false;\n @Input() collectionId!: string;\n @Input() environmentId!: string;\n @Input() currentUser!: UserInfo;\n\n @Output() saved = new EventEmitter<MJArtifactEntity>();\n @Output() cancelled = new EventEmitter<void>();\n\n public formData = {\n name: '',\n description: '',\n content: '',\n selectedType: null as MJArtifactTypeEntity | null\n };\n\n public artifactTypes: MJArtifactTypeEntity[] = [];\n public isLoadingTypes: boolean = false;\n public isSaving: boolean = false;\n public errorMessage: string = '';\n\n constructor(\n private toastService: ToastService,\n private permissionService: CollectionPermissionService,\n private cdr: ChangeDetectorRef\n ) {\n super();}\n\n ngOnChanges(changes: SimpleChanges) {\n this.permissionService.Provider = this.ProviderToUse;\n if (changes['isOpen'] && this.isOpen) {\n this.resetForm();\n this.loadArtifactTypes();\n }\n }\n\n get canSave(): boolean {\n return this.formData.name.trim().length > 0 &&\n this.formData.content.trim().length > 0 &&\n this.formData.selectedType !== null;\n }\n\n private async loadArtifactTypes(): Promise<void> {\n this.isLoadingTypes = true;\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView<MJArtifactTypeEntity>(\n {\n EntityName: 'MJ: Artifact Types',\n ExtraFilter: 'IsEnabled=1',\n OrderBy: 'Name ASC',\n MaxRows: 1000,\n ResultType: 'entity_object'\n },\n this.currentUser\n );\n\n if (result.Success && result.Results) {\n this.artifactTypes = result.Results;\n // Default to \"Text\" or first type\n const textType = this.artifactTypes.find(t => t.Name === 'Text' || t.Name === 'Markdown');\n if (textType) {\n this.formData.selectedType = textType;\n } else if (this.artifactTypes.length > 0) {\n this.formData.selectedType = this.artifactTypes[0];\n }\n }\n } catch (error) {\n console.error('Error loading artifact types:', error);\n this.toastService.error('Failed to load artifact types');\n } finally {\n this.isLoadingTypes = false;\n this.cdr.detectChanges(); // zone.js 0.15: async RunView doesn't trigger CD\n }\n }\n\n onTypeSelected(typeId: string): void {\n this.formData.selectedType = this.artifactTypes.find(t => UUIDsEqual(t.ID, typeId)) || null;\n }\n\n async onSave(): Promise<void> {\n if (!this.canSave) return;\n\n this.isSaving = true;\n this.errorMessage = '';\n\n try {\n // Validate permission to add artifacts to collection\n const md = this.ProviderToUse;\n const collection = await md.GetEntityObject<MJCollectionEntity>('MJ: Collections', this.currentUser);\n await collection.Load(this.collectionId);\n\n // Check if user has Edit permission on collection\n if (collection.OwnerID && !UUIDsEqual(collection.OwnerID, this.currentUser.ID)) {\n const permission = await this.permissionService.checkPermission(\n this.collectionId,\n this.currentUser.ID,\n this.currentUser\n );\n\n if (!permission?.canEdit) {\n this.errorMessage = 'You do not have Edit permission to add artifacts to this collection.';\n this.isSaving = false;\n return;\n }\n }\n\n // Step 1: Create the artifact\n const artifact = await md.GetEntityObject<MJArtifactEntity>('MJ: Artifacts', this.currentUser);\n artifact.Name = this.formData.name.trim();\n artifact.Description = this.formData.description.trim() || null;\n artifact.TypeID = this.formData.selectedType!.ID;\n artifact.EnvironmentID = this.environmentId;\n artifact.UserID = this.currentUser.ID;\n\n const artifactSaved = await artifact.Save();\n if (!artifactSaved) {\n this.errorMessage = artifact.LatestResult?.Message || 'Failed to create artifact';\n this.toastService.error(this.errorMessage);\n return;\n }\n\n // Step 2: Create the first version\n const version = await md.GetEntityObject<MJArtifactVersionEntity>('MJ: Artifact Versions', this.currentUser);\n version.ArtifactID = artifact.ID;\n version.VersionNumber = 1;\n version.Content = this.formData.content.trim();\n version.UserID = this.currentUser.ID;\n version.Name = this.formData.name.trim(); // Version inherits name\n version.Description = this.formData.description.trim() || null;\n\n const versionSaved = await version.Save();\n if (!versionSaved) {\n // Rollback: delete the artifact if version creation fails\n await artifact.Delete();\n this.errorMessage = version.LatestResult?.Message || 'Failed to create artifact version';\n this.toastService.error(this.errorMessage);\n return;\n }\n\n // Step 3: Add to collection\n const collectionArtifact = await md.GetEntityObject('MJ: Collection Artifacts', this.currentUser);\n (collectionArtifact as any).CollectionID = this.collectionId;\n (collectionArtifact as any).ArtifactVersionID = version.ID;\n\n const collectionLinkSaved = await collectionArtifact.Save();\n if (!collectionLinkSaved) {\n // Rollback: delete version and artifact if collection link fails\n await version.Delete();\n await artifact.Delete();\n this.errorMessage = 'Failed to add artifact to collection';\n this.toastService.error(this.errorMessage);\n return;\n }\n\n this.toastService.success('Artifact created successfully');\n this.saved.emit(artifact);\n this.resetForm();\n } catch (error) {\n console.error('Error creating artifact:', error);\n this.errorMessage = 'An unexpected error occurred';\n this.toastService.error(this.errorMessage);\n } finally {\n this.isSaving = false;\n }\n }\n\n onCancel(): void {\n this.resetForm();\n this.cancelled.emit();\n }\n\n private resetForm(): void {\n this.formData = {\n name: '',\n description: '',\n content: '',\n selectedType: this.artifactTypes.length > 0 ? this.artifactTypes[0] : null\n };\n this.errorMessage = '';\n }\n}\n"]}
@@ -1,4 +1,5 @@
1
1
  import { EventEmitter, OnChanges, SimpleChanges } from '@angular/core';
2
+ import { BaseAngularComponent } from '@memberjunction/ng-base-types';
2
3
  import { UserInfo } from '@memberjunction/core';
3
4
  import { MJCollectionEntity } from '@memberjunction/core-entities';
4
5
  import { ToastService } from '../../services/toast.service';
@@ -7,7 +8,7 @@ import * as i0 from "@angular/core";
7
8
  /**
8
9
  * Modal for creating and editing collections
9
10
  */
10
- export declare class CollectionFormModalComponent implements OnChanges {
11
+ export declare class CollectionFormModalComponent extends BaseAngularComponent implements OnChanges {
11
12
  private toastService;
12
13
  private permissionService;
13
14
  isOpen: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"collection-form-modal.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/collection/collection-form-modal.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACjG,OAAO,EAAE,QAAQ,EAAY,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAEnE,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,EAAE,2BAA2B,EAAE,MAAM,8CAA8C,CAAC;;AAG3F;;GAEG;AACH,qBAuHa,4BAA6B,YAAW,SAAS;IAmB1D,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,iBAAiB;IAnBlB,MAAM,EAAE,OAAO,CAAS;IACxB,UAAU,CAAC,EAAE,kBAAkB,CAAC;IAChC,gBAAgB,CAAC,EAAE,kBAAkB,CAAC;IACtC,aAAa,EAAG,MAAM,CAAC;IACvB,WAAW,EAAG,QAAQ,CAAC;IAEtB,KAAK,mCAA0C;IAC/C,SAAS,qBAA4B;IAExC,QAAQ;;;MAGb;IAEK,QAAQ,EAAE,OAAO,CAAS;IAC1B,YAAY,EAAE,MAAM,CAAM;gBAGvB,YAAY,EAAE,YAAY,EAC1B,iBAAiB,EAAE,2BAA2B;IAGxD,WAAW,CAAC,OAAO,EAAE,aAAa;IAWlC,IAAI,OAAO,IAAI,OAAO,CAErB;IAEK,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAsG7B,QAAQ,IAAI,IAAI;IAKhB,OAAO,CAAC,SAAS;yCAjJN,4BAA4B;2CAA5B,4BAA4B;CAwJxC"}
1
+ {"version":3,"file":"collection-form-modal.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/collection/collection-form-modal.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACjG,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAE,QAAQ,EAAY,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAEnE,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,EAAE,2BAA2B,EAAE,MAAM,8CAA8C,CAAC;;AAG3F;;GAEG;AACH,qBAuHa,4BAA6B,SAAQ,oBAAqB,YAAW,SAAS;IAmBvF,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,iBAAiB;IAnBlB,MAAM,EAAE,OAAO,CAAS;IACxB,UAAU,CAAC,EAAE,kBAAkB,CAAC;IAChC,gBAAgB,CAAC,EAAE,kBAAkB,CAAC;IACtC,aAAa,EAAG,MAAM,CAAC;IACvB,WAAW,EAAG,QAAQ,CAAC;IAEtB,KAAK,mCAA0C;IAC/C,SAAS,qBAA4B;IAExC,QAAQ;;;MAGb;IAEK,QAAQ,EAAE,OAAO,CAAS;IAC1B,YAAY,EAAE,MAAM,CAAM;gBAGvB,YAAY,EAAE,YAAY,EAC1B,iBAAiB,EAAE,2BAA2B;IAIxD,WAAW,CAAC,OAAO,EAAE,aAAa;IAclC,IAAI,OAAO,IAAI,OAAO,CAErB;IAEK,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAsG7B,QAAQ,IAAI,IAAI;IAKhB,OAAO,CAAC,SAAS;yCArJN,4BAA4B;2CAA5B,4BAA4B;CA4JxC"}
@@ -1,5 +1,5 @@
1
1
  import { Component, Input, Output, EventEmitter } from '@angular/core';
2
- import { Metadata } from '@memberjunction/core';
2
+ import { BaseAngularComponent } from '@memberjunction/ng-base-types';
3
3
  import { UUIDsEqual } from '@memberjunction/global';
4
4
  import * as i0 from "@angular/core";
5
5
  import * as i1 from "../../services/toast.service";
@@ -82,7 +82,7 @@ function CollectionFormModalComponent_Conditional_0_Template(rf, ctx) { if (rf &
82
82
  /**
83
83
  * Modal for creating and editing collections
84
84
  */
85
- export class CollectionFormModalComponent {
85
+ export class CollectionFormModalComponent extends BaseAngularComponent {
86
86
  toastService;
87
87
  permissionService;
88
88
  isOpen = false;
@@ -99,10 +99,13 @@ export class CollectionFormModalComponent {
99
99
  isSaving = false;
100
100
  errorMessage = '';
101
101
  constructor(toastService, permissionService) {
102
+ super();
102
103
  this.toastService = toastService;
103
104
  this.permissionService = permissionService;
104
105
  }
105
106
  ngOnChanges(changes) {
107
+ // Bind provider-aware service to this component's provider on every input change pass.
108
+ this.permissionService.Provider = this.ProviderToUse;
106
109
  if (changes['collection'] || changes['isOpen']) {
107
110
  if (this.isOpen && this.collection) {
108
111
  this.formData.name = this.collection.Name || '';
@@ -145,7 +148,7 @@ export class CollectionFormModalComponent {
145
148
  }
146
149
  }
147
150
  }
148
- const md = new Metadata();
151
+ const md = this.ProviderToUse;
149
152
  const collection = this.collection ||
150
153
  await md.GetEntityObject('MJ: Collections', this.currentUser);
151
154
  collection.Name = this.formData.name.trim();
@@ -210,7 +213,7 @@ export class CollectionFormModalComponent {
210
213
  this.errorMessage = '';
211
214
  }
212
215
  static ɵfac = function CollectionFormModalComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || CollectionFormModalComponent)(i0.ɵɵdirectiveInject(i1.ToastService), i0.ɵɵdirectiveInject(i2.CollectionPermissionService)); };
213
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: CollectionFormModalComponent, selectors: [["mj-collection-form-modal"]], inputs: { isOpen: "isOpen", collection: "collection", parentCollection: "parentCollection", environmentId: "environmentId", currentUser: "currentUser" }, outputs: { saved: "saved", cancelled: "cancelled" }, standalone: false, features: [i0.ɵɵNgOnChangesFeature], decls: 1, vars: 1, consts: [["nameInput", ""], [3, "Title", "Width", "MinWidth", "Visible"], [3, "Close", "Title", "Width", "MinWidth", "Visible"], [1, "collection-form"], [1, "form-group"], [1, "form-label"], [1, "required"], ["type", "text", "placeholder", "Collection name", 1, "k-textbox", "form-control", 3, "ngModelChange", "keydown.enter", "ngModel"], ["placeholder", "Optional description", "rows", "3", 1, "k-textarea", "form-control", 3, "ngModelChange", "ngModel"], [1, "form-error"], ["mjButton", "", 3, "click", "disabled"], ["mjButton", "", "variant", "primary", 3, "click", "disabled"], [1, "parent-info"], [1, "fas", "fa-folder"], [1, "fas", "fa-exclamation-circle"]], template: function CollectionFormModalComponent_Template(rf, ctx) { if (rf & 1) {
216
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: CollectionFormModalComponent, selectors: [["mj-collection-form-modal"]], inputs: { isOpen: "isOpen", collection: "collection", parentCollection: "parentCollection", environmentId: "environmentId", currentUser: "currentUser" }, outputs: { saved: "saved", cancelled: "cancelled" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature, i0.ɵɵNgOnChangesFeature], decls: 1, vars: 1, consts: [["nameInput", ""], [3, "Title", "Width", "MinWidth", "Visible"], [3, "Close", "Title", "Width", "MinWidth", "Visible"], [1, "collection-form"], [1, "form-group"], [1, "form-label"], [1, "required"], ["type", "text", "placeholder", "Collection name", 1, "k-textbox", "form-control", 3, "ngModelChange", "keydown.enter", "ngModel"], ["placeholder", "Optional description", "rows", "3", 1, "k-textarea", "form-control", 3, "ngModelChange", "ngModel"], [1, "form-error"], ["mjButton", "", 3, "click", "disabled"], ["mjButton", "", "variant", "primary", 3, "click", "disabled"], [1, "parent-info"], [1, "fas", "fa-folder"], [1, "fas", "fa-exclamation-circle"]], template: function CollectionFormModalComponent_Template(rf, ctx) { if (rf & 1) {
214
217
  i0.ɵɵconditionalCreate(0, CollectionFormModalComponent_Conditional_0_Template, 21, 11, "mj-dialog", 1);
215
218
  } if (rf & 2) {
216
219
  i0.ɵɵconditional(ctx.isOpen ? 0 : -1);
@@ -293,5 +296,5 @@ export class CollectionFormModalComponent {
293
296
  }], cancelled: [{
294
297
  type: Output
295
298
  }] }); })();
296
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(CollectionFormModalComponent, { className: "CollectionFormModalComponent", filePath: "src/lib/components/collection/collection-form-modal.component.ts", lineNumber: 131 }); })();
299
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(CollectionFormModalComponent, { className: "CollectionFormModalComponent", filePath: "src/lib/components/collection/collection-form-modal.component.ts", lineNumber: 132 }); })();
297
300
  //# sourceMappingURL=collection-form-modal.component.js.map