@memberjunction/ng-conversations 5.30.1 → 5.32.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.
- package/dist/lib/components/collection/artifact-collection-picker-modal.component.d.ts +2 -1
- package/dist/lib/components/collection/artifact-collection-picker-modal.component.d.ts.map +1 -1
- package/dist/lib/components/collection/artifact-collection-picker-modal.component.js +9 -6
- package/dist/lib/components/collection/artifact-collection-picker-modal.component.js.map +1 -1
- package/dist/lib/components/collection/artifact-create-modal.component.d.ts +2 -1
- package/dist/lib/components/collection/artifact-create-modal.component.d.ts.map +1 -1
- package/dist/lib/components/collection/artifact-create-modal.component.js +9 -6
- package/dist/lib/components/collection/artifact-create-modal.component.js.map +1 -1
- package/dist/lib/components/collection/collection-form-modal.component.d.ts +2 -1
- package/dist/lib/components/collection/collection-form-modal.component.d.ts.map +1 -1
- package/dist/lib/components/collection/collection-form-modal.component.js +8 -5
- package/dist/lib/components/collection/collection-form-modal.component.js.map +1 -1
- package/dist/lib/components/collection/collection-tree.component.d.ts +2 -1
- package/dist/lib/components/collection/collection-tree.component.d.ts.map +1 -1
- package/dist/lib/components/collection/collection-tree.component.js +9 -6
- package/dist/lib/components/collection/collection-tree.component.js.map +1 -1
- package/dist/lib/components/collection/collection-view.component.d.ts +2 -1
- package/dist/lib/components/collection/collection-view.component.d.ts.map +1 -1
- package/dist/lib/components/collection/collection-view.component.js +12 -10
- package/dist/lib/components/collection/collection-view.component.js.map +1 -1
- package/dist/lib/components/collection/collections-full-view.component.d.ts +2 -1
- package/dist/lib/components/collection/collections-full-view.component.d.ts.map +1 -1
- package/dist/lib/components/collection/collections-full-view.component.js +18 -12
- package/dist/lib/components/collection/collections-full-view.component.js.map +1 -1
- package/dist/lib/components/conversation/conversation-chat-area.component.d.ts +2 -1
- package/dist/lib/components/conversation/conversation-chat-area.component.d.ts.map +1 -1
- package/dist/lib/components/conversation/conversation-chat-area.component.js +22 -11
- package/dist/lib/components/conversation/conversation-chat-area.component.js.map +1 -1
- package/dist/lib/components/library/library-full-view.component.d.ts +2 -1
- package/dist/lib/components/library/library-full-view.component.d.ts.map +1 -1
- package/dist/lib/components/library/library-full-view.component.js +8 -5
- package/dist/lib/components/library/library-full-view.component.js.map +1 -1
- package/dist/lib/components/message/conversation-message-rating.component.d.ts +2 -1
- package/dist/lib/components/message/conversation-message-rating.component.d.ts.map +1 -1
- package/dist/lib/components/message/conversation-message-rating.component.js +9 -7
- package/dist/lib/components/message/conversation-message-rating.component.js.map +1 -1
- package/dist/lib/components/message/message-input.component.d.ts +2 -1
- package/dist/lib/components/message/message-input.component.d.ts.map +1 -1
- package/dist/lib/components/message/message-input.component.js +12 -5
- package/dist/lib/components/message/message-input.component.js.map +1 -1
- package/dist/lib/components/message/message-item.component.d.ts.map +1 -1
- package/dist/lib/components/message/message-item.component.js +6 -1
- package/dist/lib/components/message/message-item.component.js.map +1 -1
- package/dist/lib/components/overlay/chat-overlay.component.d.ts +2 -1
- package/dist/lib/components/overlay/chat-overlay.component.d.ts.map +1 -1
- package/dist/lib/components/overlay/chat-overlay.component.js +6 -6
- package/dist/lib/components/overlay/chat-overlay.component.js.map +1 -1
- package/dist/lib/components/project/project-form-modal.component.d.ts +2 -1
- package/dist/lib/components/project/project-form-modal.component.d.ts.map +1 -1
- package/dist/lib/components/project/project-form-modal.component.js +6 -5
- package/dist/lib/components/project/project-form-modal.component.js.map +1 -1
- package/dist/lib/components/project/project-selector.component.d.ts +2 -1
- package/dist/lib/components/project/project-selector.component.d.ts.map +1 -1
- package/dist/lib/components/project/project-selector.component.js +8 -6
- package/dist/lib/components/project/project-selector.component.js.map +1 -1
- package/dist/lib/components/share/share-modal.component.d.ts +2 -1
- package/dist/lib/components/share/share-modal.component.d.ts.map +1 -1
- package/dist/lib/components/share/share-modal.component.js +11 -9
- package/dist/lib/components/share/share-modal.component.js.map +1 -1
- package/dist/lib/components/shared/user-picker.component.d.ts +2 -1
- package/dist/lib/components/shared/user-picker.component.d.ts.map +1 -1
- package/dist/lib/components/shared/user-picker.component.js +6 -4
- package/dist/lib/components/shared/user-picker.component.js.map +1 -1
- package/dist/lib/components/task/tasks-full-view.component.d.ts +2 -1
- package/dist/lib/components/task/tasks-full-view.component.d.ts.map +1 -1
- package/dist/lib/components/task/tasks-full-view.component.js +9 -8
- package/dist/lib/components/task/tasks-full-view.component.js.map +1 -1
- package/dist/lib/components/tasks/tasks-dropdown.component.d.ts.map +1 -1
- package/dist/lib/components/tasks/tasks-dropdown.component.js +5 -0
- package/dist/lib/components/tasks/tasks-dropdown.component.js.map +1 -1
- package/dist/lib/components/thread/thread-panel.component.d.ts +2 -1
- package/dist/lib/components/thread/thread-panel.component.d.ts.map +1 -1
- package/dist/lib/components/thread/thread-panel.component.js +7 -4
- package/dist/lib/components/thread/thread-panel.component.js.map +1 -1
- package/dist/lib/components/workspace/conversation-workspace.component.d.ts.map +1 -1
- package/dist/lib/components/workspace/conversation-workspace.component.js +8 -4
- package/dist/lib/components/workspace/conversation-workspace.component.js.map +1 -1
- package/dist/lib/models/lazy-artifact-info.js +1 -1
- package/dist/lib/models/lazy-artifact-info.js.map +1 -1
- package/dist/lib/services/active-tasks.service.d.ts +7 -1
- package/dist/lib/services/active-tasks.service.d.ts.map +1 -1
- package/dist/lib/services/active-tasks.service.js +12 -2
- package/dist/lib/services/active-tasks.service.js.map +1 -1
- package/dist/lib/services/agent-state.service.d.ts +7 -1
- package/dist/lib/services/agent-state.service.d.ts.map +1 -1
- package/dist/lib/services/agent-state.service.js +12 -2
- package/dist/lib/services/agent-state.service.js.map +1 -1
- package/dist/lib/services/artifact-permission.service.d.ts +8 -1
- package/dist/lib/services/artifact-permission.service.d.ts.map +1 -1
- package/dist/lib/services/artifact-permission.service.js +21 -7
- package/dist/lib/services/artifact-permission.service.js.map +1 -1
- package/dist/lib/services/artifact-state.service.d.ts +8 -1
- package/dist/lib/services/artifact-state.service.d.ts.map +1 -1
- package/dist/lib/services/artifact-state.service.js +25 -11
- package/dist/lib/services/artifact-state.service.js.map +1 -1
- package/dist/lib/services/artifact-use-tracking.service.d.ts +7 -1
- package/dist/lib/services/artifact-use-tracking.service.d.ts.map +1 -1
- package/dist/lib/services/artifact-use-tracking.service.js +12 -2
- package/dist/lib/services/artifact-use-tracking.service.js.map +1 -1
- package/dist/lib/services/collection-permission.service.d.ts +7 -1
- package/dist/lib/services/collection-permission.service.d.ts.map +1 -1
- package/dist/lib/services/collection-permission.service.js +19 -9
- package/dist/lib/services/collection-permission.service.js.map +1 -1
- package/dist/lib/services/conversation-agent.service.d.ts +8 -0
- package/dist/lib/services/conversation-agent.service.d.ts.map +1 -1
- package/dist/lib/services/conversation-agent.service.js +15 -3
- package/dist/lib/services/conversation-agent.service.js.map +1 -1
- package/dist/lib/services/conversation-attachment.service.d.ts +7 -1
- package/dist/lib/services/conversation-attachment.service.d.ts.map +1 -1
- package/dist/lib/services/conversation-attachment.service.js +12 -2
- package/dist/lib/services/conversation-attachment.service.js.map +1 -1
- package/dist/lib/services/data-cache.service.d.ts +7 -1
- package/dist/lib/services/data-cache.service.d.ts.map +1 -1
- package/dist/lib/services/data-cache.service.js +16 -7
- package/dist/lib/services/data-cache.service.js.map +1 -1
- package/dist/lib/services/export.service.d.ts +7 -1
- package/dist/lib/services/export.service.d.ts.map +1 -1
- package/dist/lib/services/export.service.js +12 -2
- package/dist/lib/services/export.service.js.map +1 -1
- package/dist/lib/services/search.service.d.ts +7 -1
- package/dist/lib/services/search.service.d.ts.map +1 -1
- package/dist/lib/services/search.service.js +16 -6
- package/dist/lib/services/search.service.js.map +1 -1
- 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;
|
|
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
|
|
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 =
|
|
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 =
|
|
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:
|
|
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":"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","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;
|
|
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 {
|
|
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 =
|
|
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 =
|
|
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:
|
|
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;
|
|
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 {
|
|
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 =
|
|
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:
|
|
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
|