@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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"collection-form-modal.component.js","sourceRoot":"","sources":["../../../../src/lib/components/collection/collection-form-modal.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, OnChanges, SimpleChanges } from '@angular/core';\nimport { UserInfo, Metadata } from '@memberjunction/core';\nimport { MJCollectionEntity } from '@memberjunction/core-entities';\nimport { DialogService } from '../../services/dialog.service';\nimport { ToastService } from '../../services/toast.service';\nimport { CollectionPermissionService } from '../../services/collection-permission.service';\nimport { UUIDsEqual } from '@memberjunction/global';\n\n/**\n * Modal for creating and editing collections\n */\n@Component({\n standalone: false,\n selector: 'mj-collection-form-modal',\n template: `\n @if (isOpen) {\n <mj-dialog\n [Title]=\"collection?.ID ? 'Edit Collection' : 'New Collection'\"\n (Close)=\"onCancel()\"\n [Width]=\"500\"\n [MinWidth]=\"300\"\n [Visible]=\"true\">\n <div class=\"collection-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=\"Collection name\"\n #nameInput\n (keydown.enter)=\"onSave()\">\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=\"3\">\n </textarea>\n </div>\n @if (parentCollection) {\n <div class=\"form-group\">\n <label class=\"form-label\">Parent Collection</label>\n <div class=\"parent-info\">\n <i class=\"fas fa-folder\"></i>\n <span>{{ parentCollection.Name }}</span>\n </div>\n </div>\n }\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 ? 'Saving...' : 'Save' }}\n </button>\n </mj-dialog-actions>\n </mj-dialog>\n }\n `,\n styles: [`\n .collection-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 .parent-info {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n color: var(--mj-text-muted);\n }\n\n .parent-info i {\n color: var(--mj-brand-primary);\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 CollectionFormModalComponent implements OnChanges {\n @Input() isOpen: boolean = false;\n @Input() collection?: MJCollectionEntity;\n @Input() parentCollection?: MJCollectionEntity;\n @Input() environmentId!: string;\n @Input() currentUser!: UserInfo;\n\n @Output() saved = new EventEmitter<MJCollectionEntity>();\n @Output() cancelled = new EventEmitter<void>();\n\n public formData = {\n name: '',\n description: ''\n };\n\n public isSaving: boolean = false;\n public errorMessage: string = '';\n\n constructor(\n private toastService: ToastService,\n private permissionService: CollectionPermissionService\n ) {}\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes['collection'] || changes['isOpen']) {\n if (this.isOpen && this.collection) {\n this.formData.name = this.collection.Name || '';\n this.formData.description = this.collection.Description || '';\n } else if (this.isOpen && !this.collection) {\n this.formData = { name: '', description: '' };\n }\n }\n }\n\n get canSave(): boolean {\n return this.formData.name.trim().length > 0;\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 permissions before saving\n if (this.collection) {\n // Editing existing collection - need Edit permission\n if (this.collection.OwnerID && !UUIDsEqual(this.collection.OwnerID, this.currentUser.ID)) {\n const permission = await this.permissionService.checkPermission(\n this.collection.ID,\n this.currentUser.ID,\n this.currentUser\n );\n\n if (!permission?.canEdit) {\n this.errorMessage = 'You do not have Edit permission for this collection.';\n this.isSaving = false;\n return;\n }\n }\n } else if (this.parentCollection) {\n // Creating child collection - need Edit permission on parent\n if (this.parentCollection.OwnerID && !UUIDsEqual(this.parentCollection.OwnerID, this.currentUser.ID)) {\n const permission = await this.permissionService.checkPermission(\n this.parentCollection.ID,\n this.currentUser.ID,\n this.currentUser\n );\n\n if (!permission?.canEdit) {\n this.errorMessage = 'You do not have Edit permission for the parent collection.';\n this.isSaving = false;\n return;\n }\n }\n }\n\n const md = new Metadata();\n const collection = this.collection ||\n await md.GetEntityObject<MJCollectionEntity>('MJ: Collections', this.currentUser);\n\n collection.Name = this.formData.name.trim();\n collection.Description = this.formData.description.trim() || null;\n collection.EnvironmentID = this.environmentId;\n\n // Set owner and parent relationship if creating new collection\n if (!this.collection) {\n if (this.parentCollection) {\n // Child collection inherits parent's owner to maintain permission hierarchy\n collection.ParentID = this.parentCollection.ID;\n collection.OwnerID = this.parentCollection.OwnerID || this.currentUser.ID;\n } else {\n // Root collection - current user becomes owner\n collection.OwnerID = this.currentUser.ID;\n }\n } else if (this.parentCollection) {\n // Updating existing collection's parent\n collection.ParentID = this.parentCollection.ID;\n }\n\n const saved = await collection.Save();\n if (saved) {\n // If creating new collection, set up permissions\n if (!this.collection) {\n if (this.parentCollection) {\n // Child collection - copy all permissions from parent (including owner)\n await this.permissionService.copyParentPermissions(\n this.parentCollection.ID,\n collection.ID,\n this.currentUser\n );\n } else {\n // Root collection - create owner permission for current user\n await this.permissionService.createOwnerPermission(\n collection.ID,\n this.currentUser.ID,\n this.currentUser\n );\n }\n }\n\n this.toastService.success(\n this.collection ? 'Collection updated successfully' : 'Collection created successfully'\n );\n this.saved.emit(collection);\n this.resetForm();\n } else {\n this.errorMessage = collection.LatestResult?.Message || 'Failed to save collection';\n this.toastService.error(this.errorMessage);\n }\n } catch (error) {\n console.error('Error saving collection:', 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 };\n this.errorMessage = '';\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"collection-form-modal.component.js","sourceRoot":"","sources":["../../../../src/lib/components/collection/collection-form-modal.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, OnChanges, SimpleChanges } from '@angular/core';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { UserInfo, Metadata } from '@memberjunction/core';\nimport { MJCollectionEntity } from '@memberjunction/core-entities';\nimport { DialogService } from '../../services/dialog.service';\nimport { ToastService } from '../../services/toast.service';\nimport { CollectionPermissionService } from '../../services/collection-permission.service';\nimport { UUIDsEqual } from '@memberjunction/global';\n\n/**\n * Modal for creating and editing collections\n */\n@Component({\n standalone: false,\n selector: 'mj-collection-form-modal',\n template: `\n @if (isOpen) {\n <mj-dialog\n [Title]=\"collection?.ID ? 'Edit Collection' : 'New Collection'\"\n (Close)=\"onCancel()\"\n [Width]=\"500\"\n [MinWidth]=\"300\"\n [Visible]=\"true\">\n <div class=\"collection-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=\"Collection name\"\n #nameInput\n (keydown.enter)=\"onSave()\">\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=\"3\">\n </textarea>\n </div>\n @if (parentCollection) {\n <div class=\"form-group\">\n <label class=\"form-label\">Parent Collection</label>\n <div class=\"parent-info\">\n <i class=\"fas fa-folder\"></i>\n <span>{{ parentCollection.Name }}</span>\n </div>\n </div>\n }\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 ? 'Saving...' : 'Save' }}\n </button>\n </mj-dialog-actions>\n </mj-dialog>\n }\n `,\n styles: [`\n .collection-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 .parent-info {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n color: var(--mj-text-muted);\n }\n\n .parent-info i {\n color: var(--mj-brand-primary);\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 CollectionFormModalComponent extends BaseAngularComponent implements OnChanges {\n @Input() isOpen: boolean = false;\n @Input() collection?: MJCollectionEntity;\n @Input() parentCollection?: MJCollectionEntity;\n @Input() environmentId!: string;\n @Input() currentUser!: UserInfo;\n\n @Output() saved = new EventEmitter<MJCollectionEntity>();\n @Output() cancelled = new EventEmitter<void>();\n\n public formData = {\n name: '',\n description: ''\n };\n\n public isSaving: boolean = false;\n public errorMessage: string = '';\n\n constructor(\n private toastService: ToastService,\n private permissionService: CollectionPermissionService\n ) {\n super();}\n\n ngOnChanges(changes: SimpleChanges) {\n // Bind provider-aware service to this component's provider on every input change pass.\n this.permissionService.Provider = this.ProviderToUse;\n\n if (changes['collection'] || changes['isOpen']) {\n if (this.isOpen && this.collection) {\n this.formData.name = this.collection.Name || '';\n this.formData.description = this.collection.Description || '';\n } else if (this.isOpen && !this.collection) {\n this.formData = { name: '', description: '' };\n }\n }\n }\n\n get canSave(): boolean {\n return this.formData.name.trim().length > 0;\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 permissions before saving\n if (this.collection) {\n // Editing existing collection - need Edit permission\n if (this.collection.OwnerID && !UUIDsEqual(this.collection.OwnerID, this.currentUser.ID)) {\n const permission = await this.permissionService.checkPermission(\n this.collection.ID,\n this.currentUser.ID,\n this.currentUser\n );\n\n if (!permission?.canEdit) {\n this.errorMessage = 'You do not have Edit permission for this collection.';\n this.isSaving = false;\n return;\n }\n }\n } else if (this.parentCollection) {\n // Creating child collection - need Edit permission on parent\n if (this.parentCollection.OwnerID && !UUIDsEqual(this.parentCollection.OwnerID, this.currentUser.ID)) {\n const permission = await this.permissionService.checkPermission(\n this.parentCollection.ID,\n this.currentUser.ID,\n this.currentUser\n );\n\n if (!permission?.canEdit) {\n this.errorMessage = 'You do not have Edit permission for the parent collection.';\n this.isSaving = false;\n return;\n }\n }\n }\n\n const md = this.ProviderToUse;\n const collection = this.collection ||\n await md.GetEntityObject<MJCollectionEntity>('MJ: Collections', this.currentUser);\n\n collection.Name = this.formData.name.trim();\n collection.Description = this.formData.description.trim() || null;\n collection.EnvironmentID = this.environmentId;\n\n // Set owner and parent relationship if creating new collection\n if (!this.collection) {\n if (this.parentCollection) {\n // Child collection inherits parent's owner to maintain permission hierarchy\n collection.ParentID = this.parentCollection.ID;\n collection.OwnerID = this.parentCollection.OwnerID || this.currentUser.ID;\n } else {\n // Root collection - current user becomes owner\n collection.OwnerID = this.currentUser.ID;\n }\n } else if (this.parentCollection) {\n // Updating existing collection's parent\n collection.ParentID = this.parentCollection.ID;\n }\n\n const saved = await collection.Save();\n if (saved) {\n // If creating new collection, set up permissions\n if (!this.collection) {\n if (this.parentCollection) {\n // Child collection - copy all permissions from parent (including owner)\n await this.permissionService.copyParentPermissions(\n this.parentCollection.ID,\n collection.ID,\n this.currentUser\n );\n } else {\n // Root collection - create owner permission for current user\n await this.permissionService.createOwnerPermission(\n collection.ID,\n this.currentUser.ID,\n this.currentUser\n );\n }\n }\n\n this.toastService.success(\n this.collection ? 'Collection updated successfully' : 'Collection created successfully'\n );\n this.saved.emit(collection);\n this.resetForm();\n } else {\n this.errorMessage = collection.LatestResult?.Message || 'Failed to save collection';\n this.toastService.error(this.errorMessage);\n }\n } catch (error) {\n console.error('Error saving collection:', 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 };\n this.errorMessage = '';\n }\n}\n"]}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { EventEmitter, OnInit } from '@angular/core';
|
|
2
|
+
import { BaseAngularComponent } from '@memberjunction/ng-base-types';
|
|
2
3
|
import { MJCollectionEntity } from '@memberjunction/core-entities';
|
|
3
4
|
import { UserInfo } from '@memberjunction/core';
|
|
4
5
|
import { CollectionPermission, CollectionPermissionService } from '../../services/collection-permission.service';
|
|
@@ -9,7 +10,7 @@ interface TreeNode {
|
|
|
9
10
|
expanded: boolean;
|
|
10
11
|
level: number;
|
|
11
12
|
}
|
|
12
|
-
export declare class CollectionTreeComponent implements OnInit {
|
|
13
|
+
export declare class CollectionTreeComponent extends BaseAngularComponent implements OnInit {
|
|
13
14
|
private permissionService;
|
|
14
15
|
environmentId: string;
|
|
15
16
|
currentUser: UserInfo;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"collection-tree.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/collection/collection-tree.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,YAAY,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAC/E,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAE,QAAQ,EAA+B,MAAM,sBAAsB,CAAC;AAC7E,OAAO,EAAE,oBAAoB,EAAE,2BAA2B,EAAE,MAAM,8CAA8C,CAAC;;AAGjH,UAAU,QAAQ;IAChB,UAAU,EAAE,kBAAkB,CAAC;IAC/B,QAAQ,EAAE,QAAQ,EAAE,CAAC;IACrB,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf;AAOD,qBAuJa,uBAAwB,YAAW,MAAM;
|
|
1
|
+
{"version":3,"file":"collection-tree.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/collection/collection-tree.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,YAAY,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAC/E,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAE,QAAQ,EAA+B,MAAM,sBAAsB,CAAC;AAC7E,OAAO,EAAE,oBAAoB,EAAE,2BAA2B,EAAE,MAAM,8CAA8C,CAAC;;AAGjH,UAAU,QAAQ;IAChB,UAAU,EAAE,kBAAkB,CAAC;IAC/B,QAAQ,EAAE,QAAQ,EAAE,CAAC;IACrB,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf;AAOD,qBAuJa,uBAAwB,SAAQ,oBAAqB,YAAW,MAAM;IAerE,OAAO,CAAC,iBAAiB;IAd5B,aAAa,EAAG,MAAM,CAAC;IACvB,WAAW,EAAG,QAAQ,CAAC;IACvB,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAQ;IAC3C,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAa;IAE9D,kBAAkB,mCAA0C;IAC5D,iBAAiB,mCAA0C;IAC3D,iBAAiB,mCAA0C;IAE9D,WAAW,EAAE,kBAAkB,EAAE,CAAM;IACvC,SAAS,EAAE,QAAQ,EAAE,CAAM;IAC3B,WAAW,EAAE,QAAQ,GAAG,IAAI,CAAQ;IACpC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAQ;gBAExB,iBAAiB,EAAE,2BAA2B;IAGlE,QAAQ;YAKM,eAAe;IAmB7B,OAAO,CAAC,SAAS;IAKjB,OAAO,CAAC,SAAS;IAUjB,UAAU,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI;IAK9C,oBAAoB,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO;IAI7C,oBAAoB,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO;IAI7C,kBAAkB,CAAC,UAAU,EAAE,kBAAkB,GAAG,IAAI;IAKlD,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAoD1D,kBAAkB,CAAC,UAAU,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IA6BvE,WAAW,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,GAAG,IAAI;IAanD,SAAS,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI;IAOjC,UAAU,CAAC,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,GAAG,IAAI;IAkBxD,WAAW,CAAC,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,GAAG,IAAI;IAMnD,MAAM,CAAC,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IA2CnE,cAAc,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI;IAYhC,UAAU,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IA4BjD,OAAO,CAAC,YAAY;IAepB,OAAO,CAAC,UAAU,EAAE,kBAAkB,GAAG,OAAO;IAWhD,SAAS,CAAC,UAAU,EAAE,kBAAkB,GAAG,OAAO;IAWlD,eAAe,IAAI,OAAO;yCAhUf,uBAAuB;2CAAvB,uBAAuB;CAoUnC"}
|
|
@@ -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, LogError } 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/collection-permission.service";
|
|
@@ -165,7 +166,7 @@ function CollectionTreeComponent_ng_template_8_Template(rf, ctx) { if (rf & 1) {
|
|
|
165
166
|
i0.ɵɵadvance();
|
|
166
167
|
i0.ɵɵconditional(node_r12.expanded ? 9 : -1);
|
|
167
168
|
} }
|
|
168
|
-
export class CollectionTreeComponent {
|
|
169
|
+
export class CollectionTreeComponent extends BaseAngularComponent {
|
|
169
170
|
permissionService;
|
|
170
171
|
environmentId;
|
|
171
172
|
currentUser;
|
|
@@ -179,14 +180,16 @@ export class CollectionTreeComponent {
|
|
|
179
180
|
draggedNode = null;
|
|
180
181
|
dragOverNodeId = null;
|
|
181
182
|
constructor(permissionService) {
|
|
183
|
+
super();
|
|
182
184
|
this.permissionService = permissionService;
|
|
183
185
|
}
|
|
184
186
|
ngOnInit() {
|
|
187
|
+
this.permissionService.Provider = this.ProviderToUse;
|
|
185
188
|
this.loadCollections();
|
|
186
189
|
}
|
|
187
190
|
async loadCollections() {
|
|
188
191
|
try {
|
|
189
|
-
const rv =
|
|
192
|
+
const rv = RunView.FromMetadataProvider(this.ProviderToUse);
|
|
190
193
|
const result = await rv.RunView({
|
|
191
194
|
EntityName: 'MJ: Collections',
|
|
192
195
|
ExtraFilter: `EnvironmentID='${this.environmentId}'`,
|
|
@@ -248,7 +251,7 @@ export class CollectionTreeComponent {
|
|
|
248
251
|
if (!name)
|
|
249
252
|
return;
|
|
250
253
|
try {
|
|
251
|
-
const md =
|
|
254
|
+
const md = this.ProviderToUse;
|
|
252
255
|
const collection = await md.GetEntityObject('MJ: Collections', this.currentUser);
|
|
253
256
|
collection.Name = name;
|
|
254
257
|
collection.EnvironmentID = this.environmentId;
|
|
@@ -441,7 +444,7 @@ export class CollectionTreeComponent {
|
|
|
441
444
|
return true;
|
|
442
445
|
}
|
|
443
446
|
static ɵfac = function CollectionTreeComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || CollectionTreeComponent)(i0.ɵɵdirectiveInject(i1.CollectionPermissionService)); };
|
|
444
|
-
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: CollectionTreeComponent, selectors: [["mj-collection-tree"]], inputs: { environmentId: "environmentId", currentUser: "currentUser", selectedCollectionId: "selectedCollectionId", userPermissions: "userPermissions" }, outputs: { collectionSelected: "collectionSelected", collectionCreated: "collectionCreated", collectionDeleted: "collectionDeleted" }, standalone: false, decls: 10, vars: 3, consts: [["recursiveTree", ""], [1, "collection-tree"], [1, "tree-header"], ["title", "New Collection", 1, "btn-new"], [1, "tree-content", 3, "dragover", "drop"], [1, "tree-node-wrapper"], ["title", "New Collection", 1, "btn-new", 3, "click"], [1, "fas", "fa-plus"], [1, "tree-node", 3, "click", "dragstart", "dragend", "dragover", "dragleave", "drop", "draggable"], [1, "fas", "toggle-icon", 3, "ngClass"], [1, "fas", "fa-folder", "collection-icon"], [1, "collection-name"], [1, "node-actions", 3, "click"], ["title", "Add sub-collection", 1, "node-action-btn"], ["title", "Delete", 1, "node-action-btn"], [1, "fas", "toggle-icon", 3, "click", "ngClass"], ["title", "Add sub-collection", 1, "node-action-btn", 3, "click"], ["title", "Delete", 1, "node-action-btn", 3, "click"], [1, "fas", "fa-trash"], [4, "ngTemplateOutlet", "ngTemplateOutletContext"]], template: function CollectionTreeComponent_Template(rf, ctx) { if (rf & 1) {
|
|
447
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: CollectionTreeComponent, selectors: [["mj-collection-tree"]], inputs: { environmentId: "environmentId", currentUser: "currentUser", selectedCollectionId: "selectedCollectionId", userPermissions: "userPermissions" }, outputs: { collectionSelected: "collectionSelected", collectionCreated: "collectionCreated", collectionDeleted: "collectionDeleted" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 10, vars: 3, consts: [["recursiveTree", ""], [1, "collection-tree"], [1, "tree-header"], ["title", "New Collection", 1, "btn-new"], [1, "tree-content", 3, "dragover", "drop"], [1, "tree-node-wrapper"], ["title", "New Collection", 1, "btn-new", 3, "click"], [1, "fas", "fa-plus"], [1, "tree-node", 3, "click", "dragstart", "dragend", "dragover", "dragleave", "drop", "draggable"], [1, "fas", "toggle-icon", 3, "ngClass"], [1, "fas", "fa-folder", "collection-icon"], [1, "collection-name"], [1, "node-actions", 3, "click"], ["title", "Add sub-collection", 1, "node-action-btn"], ["title", "Delete", 1, "node-action-btn"], [1, "fas", "toggle-icon", 3, "click", "ngClass"], ["title", "Add sub-collection", 1, "node-action-btn", 3, "click"], ["title", "Delete", 1, "node-action-btn", 3, "click"], [1, "fas", "fa-trash"], [4, "ngTemplateOutlet", "ngTemplateOutletContext"]], template: function CollectionTreeComponent_Template(rf, ctx) { if (rf & 1) {
|
|
445
448
|
const _r1 = i0.ɵɵgetCurrentView();
|
|
446
449
|
i0.ɵɵelementStart(0, "div", 1)(1, "div", 2)(2, "h3");
|
|
447
450
|
i0.ɵɵtext(3, "Collections");
|
|
@@ -589,5 +592,5 @@ export class CollectionTreeComponent {
|
|
|
589
592
|
}], collectionDeleted: [{
|
|
590
593
|
type: Output
|
|
591
594
|
}] }); })();
|
|
592
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(CollectionTreeComponent, { className: "CollectionTreeComponent", filePath: "src/lib/components/collection/collection-tree.component.ts", lineNumber:
|
|
595
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(CollectionTreeComponent, { className: "CollectionTreeComponent", filePath: "src/lib/components/collection/collection-tree.component.ts", lineNumber: 171 }); })();
|
|
593
596
|
//# sourceMappingURL=collection-tree.component.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"collection-tree.component.js","sourceRoot":"","sources":["../../../../src/lib/components/collection/collection-tree.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, OnInit } from '@angular/core';\nimport { MJCollectionEntity } from '@memberjunction/core-entities';\nimport { UserInfo, RunView, Metadata, LogError } from '@memberjunction/core';\nimport { CollectionPermission, CollectionPermissionService } from '../../services/collection-permission.service';\nimport { UUIDsEqual } from '@memberjunction/global';\n\ninterface TreeNode {\n collection: MJCollectionEntity;\n children: TreeNode[];\n expanded: boolean;\n level: number;\n}\n\ninterface DragData {\n collectionId: string;\n parentId: string | null;\n}\n\n@Component({\n standalone: false,\n selector: 'mj-collection-tree',\n template: `\n <div class=\"collection-tree\">\n <div class=\"tree-header\">\n <h3>Collections</h3>\n @if (canCreateAtRoot()) {\n <button class=\"btn-new\" (click)=\"onCreateCollection(null)\" title=\"New Collection\">\n <i class=\"fas fa-plus\"></i>\n </button>\n }\n </div>\n\n <div\n class=\"tree-content\"\n [class.drag-over-root]=\"dragOverNodeId === 'root'\"\n (dragover)=\"onDragOverRoot($event)\"\n (drop)=\"onDropRoot($event)\">\n @for (node of treeNodes; track node.collection.ID) {\n <div class=\"tree-node-wrapper\">\n <div\n class=\"tree-node\"\n [class.selected]=\"IsCollectionSelected(node)\"\n [class.drag-over]=\"dragOverNodeId === node.collection.ID\"\n [class.dragging]=\"IsCollectionDragging(node)\"\n [style.padding-left.px]=\"node.level * 20\"\n [draggable]=\"true\"\n (click)=\"onSelectCollection(node.collection)\"\n (dragstart)=\"onDragStart($event, node)\"\n (dragend)=\"onDragEnd($event)\"\n (dragover)=\"onDragOver($event, node)\"\n (dragleave)=\"onDragLeave($event, node)\"\n (drop)=\"onDrop($event, node)\">\n @if (node.children.length > 0) {\n <i\n class=\"fas toggle-icon\"\n [ngClass]=\"node.expanded ? 'fa-chevron-down' : 'fa-chevron-right'\"\n (click)=\"toggleNode(node, $event)\">\n </i>\n }\n <i class=\"fas fa-folder collection-icon\" [style.color]=\"node.collection.Color || '#0076B6'\"></i>\n <span class=\"collection-name\">{{ node.collection.Name }}</span>\n <div class=\"node-actions\" (click)=\"$event.stopPropagation()\">\n @if (canEdit(node.collection)) {\n <button class=\"node-action-btn\" (click)=\"onCreateCollection(node.collection.ID)\" title=\"Add sub-collection\">\n <i class=\"fas fa-plus\"></i>\n </button>\n }\n @if (canDelete(node.collection)) {\n <button class=\"node-action-btn\" (click)=\"onDeleteCollection(node.collection)\" title=\"Delete\">\n <i class=\"fas fa-trash\"></i>\n </button>\n }\n </div>\n </div>\n\n @if (node.expanded) {\n @for (child of node.children; track child.collection.ID) {\n <ng-container *ngTemplateOutlet=\"recursiveTree; context: { node: child }\"></ng-container>\n }\n }\n </div>\n }\n </div>\n </div>\n\n <ng-template #recursiveTree let-node=\"node\">\n <div class=\"tree-node-wrapper\">\n <div\n class=\"tree-node\"\n [class.selected]=\"IsCollectionSelected(node)\"\n [class.drag-over]=\"dragOverNodeId === node.collection.ID\"\n [class.dragging]=\"IsCollectionDragging(node)\"\n [style.padding-left.px]=\"node.level * 20\"\n [draggable]=\"true\"\n (click)=\"onSelectCollection(node.collection)\"\n (dragstart)=\"onDragStart($event, node)\"\n (dragend)=\"onDragEnd($event)\"\n (dragover)=\"onDragOver($event, node)\"\n (dragleave)=\"onDragLeave($event, node)\"\n (drop)=\"onDrop($event, node)\">\n @if (node.children.length > 0) {\n <i\n class=\"fas toggle-icon\"\n [ngClass]=\"node.expanded ? 'fa-chevron-down' : 'fa-chevron-right'\"\n (click)=\"toggleNode(node, $event)\">\n </i>\n }\n <i class=\"fas fa-folder collection-icon\" [style.color]=\"node.collection.Color || '#0076B6'\"></i>\n <span class=\"collection-name\">{{ node.collection.Name }}</span>\n <div class=\"node-actions\" (click)=\"$event.stopPropagation()\">\n @if (canEdit(node.collection)) {\n <button class=\"node-action-btn\" (click)=\"onCreateCollection(node.collection.ID)\" title=\"Add sub-collection\">\n <i class=\"fas fa-plus\"></i>\n </button>\n }\n @if (canDelete(node.collection)) {\n <button class=\"node-action-btn\" (click)=\"onDeleteCollection(node.collection)\" title=\"Delete\">\n <i class=\"fas fa-trash\"></i>\n </button>\n }\n </div>\n </div>\n\n @if (node.expanded) {\n @for (child of node.children; track child.collection.ID) {\n <ng-container *ngTemplateOutlet=\"recursiveTree; context: { node: child }\"></ng-container>\n }\n }\n </div>\n </ng-template>\n `,\n styles: [`\n .collection-tree { display: flex; flex-direction: column; height: 100%; }\n .tree-header { padding: 16px; border-bottom: 1px solid var(--mj-border-default); display: flex; justify-content: space-between; align-items: center; }\n .tree-header h3 { margin: 0; font-size: 16px; }\n .btn-new { padding: 6px 10px; background: var(--mj-brand-primary); color: var(--mj-text-inverse); border: none; border-radius: 4px; cursor: pointer; }\n .btn-new:hover { background: var(--mj-brand-primary-hover); }\n .tree-content { flex: 1; overflow-y: auto; position: relative; }\n .tree-content.drag-over-root { background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface)); }\n .tree-node {\n padding: 8px 12px;\n cursor: move;\n display: flex;\n align-items: center;\n gap: 8px;\n position: relative;\n transition: all 0.2s ease;\n border: 2px solid transparent;\n }\n .tree-node:hover { background: var(--mj-bg-surface-sunken); }\n .tree-node.selected { background: var(--mj-brand-accent); }\n .tree-node.dragging {\n opacity: 0.4;\n cursor: grabbing;\n }\n .tree-node.drag-over {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border: 2px dashed var(--mj-brand-primary);\n border-radius: 4px;\n }\n .toggle-icon { font-size: 10px; color: var(--mj-text-disabled); cursor: pointer; width: 12px; }\n .collection-icon { font-size: 14px; }\n .collection-name { flex: 1; font-size: 14px; user-select: none; }\n .node-actions { display: none; gap: 4px; }\n .tree-node:hover .node-actions { display: flex; }\n .node-action-btn { padding: 4px 6px; background: transparent; border: none; cursor: pointer; border-radius: 3px; color: var(--mj-text-muted); }\n .node-action-btn:hover { background: var(--mj-bg-surface-sunken); }\n `]\n})\nexport class CollectionTreeComponent implements OnInit {\n @Input() environmentId!: string;\n @Input() currentUser!: UserInfo;\n @Input() selectedCollectionId: string | null = null;\n @Input() userPermissions: Map<string, CollectionPermission> = new Map();\n\n @Output() collectionSelected = new EventEmitter<MJCollectionEntity>();\n @Output() collectionCreated = new EventEmitter<MJCollectionEntity>();\n @Output() collectionDeleted = new EventEmitter<MJCollectionEntity>();\n\n public collections: MJCollectionEntity[] = [];\n public treeNodes: TreeNode[] = [];\n public draggedNode: TreeNode | null = null;\n public dragOverNodeId: string | null = null;\n\n constructor(private permissionService: CollectionPermissionService) {}\n\n ngOnInit() {\n this.loadCollections();\n }\n\n private async loadCollections(): Promise<void> {\n try {\n const rv = new RunView();\n const result = await rv.RunView<MJCollectionEntity>({\n EntityName: 'MJ: Collections',\n ExtraFilter: `EnvironmentID='${this.environmentId}'`,\n OrderBy: 'Sequence ASC, Name ASC',\n ResultType: 'entity_object'\n }, this.currentUser);\n\n if (result.Success) {\n this.collections = result.Results || [];\n this.buildTree();\n }\n } catch (error) {\n console.error('Error loading collections:', error);\n }\n }\n\n private buildTree(): void {\n const rootCollections = this.collections.filter(c => !c.ParentID);\n this.treeNodes = rootCollections.map(c => this.buildNode(c, 0));\n }\n\n private buildNode(collection: MJCollectionEntity, level: number): TreeNode {\n const children = this.collections.filter(c => UUIDsEqual(c.ParentID, collection.ID));\n return {\n collection,\n children: children.map(c => this.buildNode(c, level + 1)),\n expanded: level === 0,\n level\n };\n }\n\n toggleNode(node: TreeNode, event: Event): void {\n event.stopPropagation();\n node.expanded = !node.expanded;\n }\n\n IsCollectionSelected(node: TreeNode): boolean {\n return UUIDsEqual(node.collection.ID, this.selectedCollectionId);\n }\n\n IsCollectionDragging(node: TreeNode): boolean {\n return UUIDsEqual(this.draggedNode?.collection?.ID, node.collection.ID);\n }\n\n onSelectCollection(collection: MJCollectionEntity): void {\n this.selectedCollectionId = collection.ID;\n this.collectionSelected.emit(collection);\n }\n\n async onCreateCollection(parentId: string | null): Promise<void> {\n // Validate permission if creating child collection\n if (parentId) {\n const parentCollection = this.collections.find(c => UUIDsEqual(c.ID, parentId));\n if (parentCollection) {\n // Check if user has Edit permission on parent\n if (parentCollection.OwnerID && !UUIDsEqual(parentCollection.OwnerID, this.currentUser.ID)) {\n const permission = await this.permissionService.checkPermission(\n parentId,\n this.currentUser.ID,\n this.currentUser\n );\n\n if (!permission?.canEdit) {\n alert('You do not have Edit permission to create a sub-collection.');\n return;\n }\n }\n }\n }\n\n const name = prompt('Enter collection name:');\n if (!name) return;\n\n try {\n const md = new Metadata();\n const collection = await md.GetEntityObject<MJCollectionEntity>('MJ: Collections', this.currentUser);\n\n collection.Name = name;\n collection.EnvironmentID = this.environmentId;\n\n if (parentId) {\n // Child collection - inherit parent's owner and set parent\n const parentCollection = this.collections.find(c => UUIDsEqual(c.ID, parentId));\n collection.ParentID = parentId;\n collection.OwnerID = parentCollection?.OwnerID || this.currentUser.ID;\n } else {\n // Root collection - current user becomes owner\n collection.OwnerID = this.currentUser.ID;\n }\n\n const saved = await collection.Save();\n if (saved) {\n this.collectionCreated.emit(collection);\n await this.loadCollections();\n }\n } catch (error) {\n console.error('Error creating collection:', error);\n alert('Failed to create collection');\n }\n }\n\n async onDeleteCollection(collection: MJCollectionEntity): Promise<void> {\n // Validate Delete permission\n if (collection.OwnerID && !UUIDsEqual(collection.OwnerID, this.currentUser.ID)) {\n const permission = await this.permissionService.checkPermission(\n collection.ID,\n this.currentUser.ID,\n this.currentUser\n );\n\n if (!permission?.canDelete) {\n alert('You do not have Delete permission for this collection.');\n return;\n }\n }\n\n if (!confirm(`Delete collection \"${collection.Name}\"?`)) return;\n\n try {\n const deleted = await collection.Delete();\n if (deleted) {\n this.collectionDeleted.emit(collection);\n await this.loadCollections();\n }\n } catch (error) {\n console.error('Error deleting collection:', error);\n alert('Failed to delete collection');\n }\n }\n\n onDragStart(event: DragEvent, node: TreeNode): void {\n this.draggedNode = node;\n const dragData: DragData = {\n collectionId: node.collection.ID,\n parentId: node.collection.ParentID || null\n };\n event.dataTransfer!.effectAllowed = 'move';\n event.dataTransfer!.setData('application/json', JSON.stringify(dragData));\n\n // Add visual feedback\n (event.target as HTMLElement).style.opacity = '0.4';\n }\n\n onDragEnd(event: DragEvent): void {\n // Clean up visual feedback\n (event.target as HTMLElement).style.opacity = '1';\n this.draggedNode = null;\n this.dragOverNodeId = null;\n }\n\n onDragOver(event: DragEvent, targetNode: TreeNode): void {\n event.preventDefault(); // Required to allow drop\n\n if (!this.draggedNode || UUIDsEqual(this.draggedNode.collection.ID, targetNode.collection.ID)) {\n event.dataTransfer!.dropEffect = 'none';\n return;\n }\n\n // Check if trying to drop into a descendant\n if (this.isDescendant(targetNode, this.draggedNode)) {\n event.dataTransfer!.dropEffect = 'none';\n return;\n }\n\n event.dataTransfer!.dropEffect = 'move';\n this.dragOverNodeId = targetNode.collection.ID;\n }\n\n onDragLeave(event: DragEvent, targetNode: TreeNode): void {\n if (this.dragOverNodeId === targetNode.collection.ID) {\n this.dragOverNodeId = null;\n }\n }\n\n async onDrop(event: DragEvent, targetNode: TreeNode): Promise<void> {\n event.preventDefault();\n event.stopPropagation();\n\n if (!this.draggedNode) {\n return;\n }\n\n // Don't allow dropping on itself\n if (UUIDsEqual(this.draggedNode.collection.ID, targetNode.collection.ID)) {\n this.dragOverNodeId = null;\n return;\n }\n\n // Check if trying to drop into a descendant\n if (this.isDescendant(targetNode, this.draggedNode)) {\n alert('Cannot move a collection into its own descendant');\n this.dragOverNodeId = null;\n return;\n }\n\n try {\n const collection = this.draggedNode.collection;\n const newParentId = targetNode.collection.ID;\n\n // Update the collection's parent\n collection.ParentID = newParentId;\n\n const saved = await collection.Save();\n if (saved) {\n // Reload the tree to reflect changes\n await this.loadCollections();\n } else {\n alert('Failed to move collection');\n }\n } catch (error) {\n LogError(error);\n alert('Error moving collection');\n } finally {\n this.dragOverNodeId = null;\n }\n }\n\n onDragOverRoot(event: DragEvent): void {\n event.preventDefault();\n\n if (!this.draggedNode) {\n event.dataTransfer!.dropEffect = 'none';\n return;\n }\n\n event.dataTransfer!.dropEffect = 'move';\n this.dragOverNodeId = 'root';\n }\n\n async onDropRoot(event: DragEvent): Promise<void> {\n event.preventDefault();\n event.stopPropagation();\n\n if (!this.draggedNode) {\n return;\n }\n\n try {\n const collection = this.draggedNode.collection;\n\n // Move to root level\n collection.ParentID = null;\n\n const saved = await collection.Save();\n if (saved) {\n await this.loadCollections();\n } else {\n alert('Failed to move collection to root');\n }\n } catch (error) {\n LogError(error);\n alert('Error moving collection to root');\n } finally {\n this.dragOverNodeId = null;\n }\n }\n\n private isDescendant(potentialDescendant: TreeNode, ancestor: TreeNode): boolean {\n if (UUIDsEqual(potentialDescendant.collection.ParentID, ancestor.collection.ID)) {\n return true;\n }\n\n for (const child of ancestor.children) {\n if (this.isDescendant(potentialDescendant, child)) {\n return true;\n }\n }\n\n return false;\n }\n\n // Permission checking methods\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 canDelete(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?.canDelete || false;\n }\n\n canCreateAtRoot(): boolean {\n // Anyone can create at root level\n return true;\n }\n}"]}
|
|
1
|
+
{"version":3,"file":"collection-tree.component.js","sourceRoot":"","sources":["../../../../src/lib/components/collection/collection-tree.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAU,MAAM,eAAe,CAAC;AAC/E,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAErE,OAAO,EAAY,OAAO,EAAY,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAE7E,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;;;;;;;;IAsB1C,iCAAkF;IAA1D,2LAAS,0BAAmB,IAAI,CAAC,KAAC;IACxD,uBAA2B;IAC7B,iBAAS;;;;IAyBH,6BAGqC;IAAnC,gPAAS,kCAAwB,KAAC;IACpC,iBAAI;;;IAFF,mFAAkE;;;;IAQlE,kCAA4G;IAA5E,+OAAS,gDAAsC,KAAC;IAC9E,uBAA2B;IAC7B,iBAAS;;;;IAGT,kCAA6F;IAA7D,+OAAS,6CAAmC,KAAC;IAC3E,wBAA4B;IAC9B,iBAAS;;;IAOX,wBAAyF;;;IAAzF,qHAA0E;;;;;IAA1B,AAAjC,oDAAiC,iEAAwB;;;IAD1E,0HAEC;;;IAFD,+BAEC;;;;IAvCH,AADF,8BAA+B,aAaG;IAA9B,AADA,AADA,AADA,AADA,AADA,0MAAS,6CAAmC,KAAC,2MAChC,mCAAyB,KAAC,6KAC5B,wBAAiB,KAAC,yMACjB,kCAAwB,KAAC,2MACxB,mCAAyB,KAAC,iMAC/B,8BAAoB,KAAC;IAC7B,6FAAgC;IAOhC,wBAAgG;IAChG,gCAA8B;IAAA,YAA0B;IAAA,iBAAO;IAC/D,+BAA6D;IAAnC,mJAAS,wBAAwB,KAAC;IAC1D,mGAAgC;IAKhC,mGAAkC;IAMtC,AADE,iBAAM,EACF;IAEN,qFAAqB;IAKvB,iBAAM;;;;IApCF,cAAyC;IAAzC,wDAAyC;IADzC,AADA,AADA,gEAA6C,8DACY,kDACZ;IAE7C,gCAAkB;IAOlB,cAMC;IAND,sDAMC;IACwC,cAAkD;IAAlD,8DAAkD;IAC7D,eAA0B;IAA1B,6CAA0B;IAEtD,eAIC;IAJD,6DAIC;IACD,cAIC;IAJD,+DAIC;IAIL,cAIC;IAJD,2CAIC;;;;IAsBD,6BAGqC;IAAnC,qPAAS,mCAAwB,KAAC;IACpC,iBAAI;;;IAFF,oFAAkE;;;;IAQlE,kCAA4G;IAA5E,oPAAS,iDAAsC,KAAC;IAC9E,uBAA2B;IAC7B,iBAAS;;;;IAGT,kCAA6F;IAA7D,oPAAS,8CAAmC,KAAC;IAC3E,wBAA4B;IAC9B,iBAAS;;;IAOX,wBAAyF;;;IAAzF,6HAA0E;;;;;IAA1B,AAAjC,oDAAiC,kEAAwB;;;IAD1E,kIAEC;;;IAFD,gCAEC;;;;IAvCH,AADF,8BAA+B,aAaG;IAA9B,AADA,AADA,AADA,AADA,AADA,+MAAS,8CAAmC,KAAC,gNAChC,oCAAyB,KAAC,sLAC5B,wBAAiB,KAAC,8MACjB,mCAAwB,KAAC,gNACxB,oCAAyB,KAAC,sMAC/B,+BAAoB,KAAC;IAC7B,qGAAgC;IAOhC,wBAAgG;IAChG,gCAA8B;IAAA,YAA0B;IAAA,iBAAO;IAC/D,+BAA6D;IAAnC,4JAAS,wBAAwB,KAAC;IAC1D,2GAAgC;IAKhC,2GAAkC;IAMtC,AADE,iBAAM,EACF;IAEN,6FAAqB;IAKvB,iBAAM;;;;IApCF,cAAyC;IAAzC,yDAAyC;IADzC,AADA,AADA,iEAA6C,+DACY,mDACZ;IAE7C,gCAAkB;IAOlB,cAMC;IAND,uDAMC;IACwC,cAAkD;IAAlD,+DAAkD;IAC7D,eAA0B;IAA1B,8CAA0B;IAEtD,eAIC;IAJD,8DAIC;IACD,cAIC;IAJD,gEAIC;IAIL,cAIC;IAJD,4CAIC;;AA0CT,MAAM,OAAO,uBAAwB,SAAQ,oBAAoB;IAe3C;IAdX,aAAa,CAAU;IACvB,WAAW,CAAY;IACvB,oBAAoB,GAAkB,IAAI,CAAC;IAC3C,eAAe,GAAsC,IAAI,GAAG,EAAE,CAAC;IAE9D,kBAAkB,GAAG,IAAI,YAAY,EAAsB,CAAC;IAC5D,iBAAiB,GAAG,IAAI,YAAY,EAAsB,CAAC;IAC3D,iBAAiB,GAAG,IAAI,YAAY,EAAsB,CAAC;IAE9D,WAAW,GAAyB,EAAE,CAAC;IACvC,SAAS,GAAe,EAAE,CAAC;IAC3B,WAAW,GAAoB,IAAI,CAAC;IACpC,cAAc,GAAkB,IAAI,CAAC;IAE5C,YAAoB,iBAA8C;QAClE,KAAK,EAAE,CAAC;QADY,sBAAiB,GAAjB,iBAAiB,CAA6B;IAC1D,CAAC;IAET,QAAQ;QACN,IAAI,CAAC,iBAAiB,CAAC,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC;QACrD,IAAI,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC;IAEO,KAAK,CAAC,eAAe;QAC3B,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAC5D,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,OAAO,CAAqB;gBAClD,UAAU,EAAE,iBAAiB;gBAC7B,WAAW,EAAE,kBAAkB,IAAI,CAAC,aAAa,GAAG;gBACpD,OAAO,EAAE,wBAAwB;gBACjC,UAAU,EAAE,eAAe;aAC5B,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;YAErB,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACnB,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;gBACxC,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,KAAK,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;IAEO,SAAS;QACf,MAAM,eAAe,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QAClE,IAAI,CAAC,SAAS,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAClE,CAAC;IAEO,SAAS,CAAC,UAA8B,EAAE,KAAa;QAC7D,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,EAAE,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;QACrF,OAAO;YACL,UAAU;YACV,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;YACzD,QAAQ,EAAE,KAAK,KAAK,CAAC;YACrB,KAAK;SACN,CAAC;IACJ,CAAC;IAED,UAAU,CAAC,IAAc,EAAE,KAAY;QACrC,KAAK,CAAC,eAAe,EAAE,CAAC;QACxB,IAAI,CAAC,QAAQ,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC;IACjC,CAAC;IAED,oBAAoB,CAAC,IAAc;QACjC,OAAO,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,IAAI,CAAC,oBAAoB,CAAC,CAAC;IACnE,CAAC;IAED,oBAAoB,CAAC,IAAc;QACjC,OAAO,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,EAAE,EAAE,EAAE,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;IAC1E,CAAC;IAED,kBAAkB,CAAC,UAA8B;QAC/C,IAAI,CAAC,oBAAoB,GAAG,UAAU,CAAC,EAAE,CAAC;QAC1C,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,QAAuB;QAC9C,mDAAmD;QACnD,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,gBAAgB,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC;YAChF,IAAI,gBAAgB,EAAE,CAAC;gBACrB,8CAA8C;gBAC9C,IAAI,gBAAgB,CAAC,OAAO,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,EAAE,CAAC;oBAC3F,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,eAAe,CAC7D,QAAQ,EACR,IAAI,CAAC,WAAW,CAAC,EAAE,EACnB,IAAI,CAAC,WAAW,CACjB,CAAC;oBAEF,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE,CAAC;wBACzB,KAAK,CAAC,6DAA6D,CAAC,CAAC;wBACrE,OAAO;oBACT,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,CAAC,wBAAwB,CAAC,CAAC;QAC9C,IAAI,CAAC,IAAI;YAAE,OAAO;QAElB,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC;YAC9B,MAAM,UAAU,GAAG,MAAM,EAAE,CAAC,eAAe,CAAqB,iBAAiB,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;YAErG,UAAU,CAAC,IAAI,GAAG,IAAI,CAAC;YACvB,UAAU,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;YAE9C,IAAI,QAAQ,EAAE,CAAC;gBACb,2DAA2D;gBAC3D,MAAM,gBAAgB,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC;gBAChF,UAAU,CAAC,QAAQ,GAAG,QAAQ,CAAC;gBAC/B,UAAU,CAAC,OAAO,GAAG,gBAAgB,EAAE,OAAO,IAAI,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;YACxE,CAAC;iBAAM,CAAC;gBACN,+CAA+C;gBAC/C,UAAU,CAAC,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;YAC3C,CAAC;YAED,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC,IAAI,EAAE,CAAC;YACtC,IAAI,KAAK,EAAE,CAAC;gBACV,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBACxC,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;YAC/B,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,KAAK,CAAC,CAAC;YACnD,KAAK,CAAC,6BAA6B,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,UAA8B;QACrD,6BAA6B;QAC7B,IAAI,UAAU,CAAC,OAAO,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,EAAE,CAAC;YAC/E,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,eAAe,CAC7D,UAAU,CAAC,EAAE,EACb,IAAI,CAAC,WAAW,CAAC,EAAE,EACnB,IAAI,CAAC,WAAW,CACjB,CAAC;YAEF,IAAI,CAAC,UAAU,EAAE,SAAS,EAAE,CAAC;gBAC3B,KAAK,CAAC,wDAAwD,CAAC,CAAC;gBAChE,OAAO;YACT,CAAC;QACH,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,sBAAsB,UAAU,CAAC,IAAI,IAAI,CAAC;YAAE,OAAO;QAEhE,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,MAAM,EAAE,CAAC;YAC1C,IAAI,OAAO,EAAE,CAAC;gBACZ,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBACxC,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;YAC/B,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,KAAK,CAAC,CAAC;YACnD,KAAK,CAAC,6BAA6B,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;IAED,WAAW,CAAC,KAAgB,EAAE,IAAc;QAC1C,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,MAAM,QAAQ,GAAa;YACzB,YAAY,EAAE,IAAI,CAAC,UAAU,CAAC,EAAE;YAChC,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,QAAQ,IAAI,IAAI;SAC3C,CAAC;QACF,KAAK,CAAC,YAAa,CAAC,aAAa,GAAG,MAAM,CAAC;QAC3C,KAAK,CAAC,YAAa,CAAC,OAAO,CAAC,kBAAkB,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;QAE1E,sBAAsB;QACrB,KAAK,CAAC,MAAsB,CAAC,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC;IACtD,CAAC;IAED,SAAS,CAAC,KAAgB;QACxB,2BAA2B;QAC1B,KAAK,CAAC,MAAsB,CAAC,KAAK,CAAC,OAAO,GAAG,GAAG,CAAC;QAClD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;IAC7B,CAAC;IAED,UAAU,CAAC,KAAgB,EAAE,UAAoB;QAC/C,KAAK,CAAC,cAAc,EAAE,CAAC,CAAC,yBAAyB;QAEjD,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,EAAE,EAAE,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,CAAC;YAC9F,KAAK,CAAC,YAAa,CAAC,UAAU,GAAG,MAAM,CAAC;YACxC,OAAO;QACT,CAAC;QAED,4CAA4C;QAC5C,IAAI,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;YACpD,KAAK,CAAC,YAAa,CAAC,UAAU,GAAG,MAAM,CAAC;YACxC,OAAO;QACT,CAAC;QAED,KAAK,CAAC,YAAa,CAAC,UAAU,GAAG,MAAM,CAAC;QACxC,IAAI,CAAC,cAAc,GAAG,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;IACjD,CAAC;IAED,WAAW,CAAC,KAAgB,EAAE,UAAoB;QAChD,IAAI,IAAI,CAAC,cAAc,KAAK,UAAU,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC;YACrD,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC7B,CAAC;IACH,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAAgB,EAAE,UAAoB;QACjD,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,KAAK,CAAC,eAAe,EAAE,CAAC;QAExB,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtB,OAAO;QACT,CAAC;QAED,iCAAiC;QACjC,IAAI,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,EAAE,EAAE,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,CAAC;YACzE,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;YAC3B,OAAO;QACT,CAAC;QAED,4CAA4C;QAC5C,IAAI,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;YACpD,KAAK,CAAC,kDAAkD,CAAC,CAAC;YAC1D,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;YAC3B,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC;YAC/C,MAAM,WAAW,GAAG,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAE7C,iCAAiC;YACjC,UAAU,CAAC,QAAQ,GAAG,WAAW,CAAC;YAElC,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC,IAAI,EAAE,CAAC;YACtC,IAAI,KAAK,EAAE,CAAC;gBACV,qCAAqC;gBACrC,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;YAC/B,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,2BAA2B,CAAC,CAAC;YACrC,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,QAAQ,CAAC,KAAK,CAAC,CAAC;YAChB,KAAK,CAAC,yBAAyB,CAAC,CAAC;QACnC,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC7B,CAAC;IACH,CAAC;IAED,cAAc,CAAC,KAAgB;QAC7B,KAAK,CAAC,cAAc,EAAE,CAAC;QAEvB,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtB,KAAK,CAAC,YAAa,CAAC,UAAU,GAAG,MAAM,CAAC;YACxC,OAAO;QACT,CAAC;QAED,KAAK,CAAC,YAAa,CAAC,UAAU,GAAG,MAAM,CAAC;QACxC,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,KAAgB;QAC/B,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,KAAK,CAAC,eAAe,EAAE,CAAC;QAExB,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtB,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC;YAE/C,qBAAqB;YACrB,UAAU,CAAC,QAAQ,GAAG,IAAI,CAAC;YAE3B,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC,IAAI,EAAE,CAAC;YACtC,IAAI,KAAK,EAAE,CAAC;gBACV,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;YAC/B,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,mCAAmC,CAAC,CAAC;YAC7C,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,QAAQ,CAAC,KAAK,CAAC,CAAC;YAChB,KAAK,CAAC,iCAAiC,CAAC,CAAC;QAC3C,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC7B,CAAC;IACH,CAAC;IAEO,YAAY,CAAC,mBAA6B,EAAE,QAAkB;QACpE,IAAI,UAAU,CAAC,mBAAmB,CAAC,UAAU,CAAC,QAAQ,EAAE,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,CAAC;YAChF,OAAO,IAAI,CAAC;QACd,CAAC;QAED,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;YACtC,IAAI,IAAI,CAAC,YAAY,CAAC,mBAAmB,EAAE,KAAK,CAAC,EAAE,CAAC;gBAClD,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED,8BAA8B;IAC9B,OAAO,CAAC,UAA8B;QACpC,uEAAuE;QACvE,IAAI,CAAC,UAAU,CAAC,OAAO,IAAI,UAAU,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,EAAE,CAAC;YAC/E,OAAO,IAAI,CAAC;QACd,CAAC;QAED,0BAA0B;QAC1B,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QAC3D,OAAO,UAAU,EAAE,OAAO,IAAI,KAAK,CAAC;IACtC,CAAC;IAED,SAAS,CAAC,UAA8B;QACtC,uEAAuE;QACvE,IAAI,CAAC,UAAU,CAAC,OAAO,IAAI,UAAU,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,EAAE,CAAC;YAC/E,OAAO,IAAI,CAAC;QACd,CAAC;QAED,0BAA0B;QAC1B,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QAC3D,OAAO,UAAU,EAAE,SAAS,IAAI,KAAK,CAAC;IACxC,CAAC;IAED,eAAe;QACb,kCAAkC;QAClC,OAAO,IAAI,CAAC;IACd,CAAC;iHAnUU,uBAAuB;6DAAvB,uBAAuB;;YAjJ5B,AADF,AADF,8BAA6B,aACF,SACnB;YAAA,2BAAW;YAAA,iBAAK;YACpB,4FAAyB;YAK3B,iBAAM;YAEN,8BAI8B;YAA5B,AADA,mJAAY,0BAAsB,KAAC,8HAC3B,sBAAkB,KAAC;YAC3B,4FA4CC;YAEL,AADE,iBAAM,EACF;YAEN,2HAA4C;;YA5DxC,eAIC;YAJD,gDAIC;YAKD,cAAkD;YAAlD,+DAAkD;YAGlD,cA4CC;YA5CD,4BA4CC;;;iFAwFI,uBAAuB;cAvJnC,SAAS;6BACI,KAAK,YACP,oBAAoB,YACpB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6GT;;kBAwCA,KAAK;;kBACL,KAAK;;kBACL,KAAK;;kBACL,KAAK;;kBAEL,MAAM;;kBACN,MAAM;;kBACN,MAAM;;kFARI,uBAAuB","sourcesContent":["import { Component, Input, Output, EventEmitter, OnInit } from '@angular/core';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { MJCollectionEntity } from '@memberjunction/core-entities';\nimport { UserInfo, RunView, Metadata, LogError } from '@memberjunction/core';\nimport { CollectionPermission, CollectionPermissionService } from '../../services/collection-permission.service';\nimport { UUIDsEqual } from '@memberjunction/global';\n\ninterface TreeNode {\n collection: MJCollectionEntity;\n children: TreeNode[];\n expanded: boolean;\n level: number;\n}\n\ninterface DragData {\n collectionId: string;\n parentId: string | null;\n}\n\n@Component({\n standalone: false,\n selector: 'mj-collection-tree',\n template: `\n <div class=\"collection-tree\">\n <div class=\"tree-header\">\n <h3>Collections</h3>\n @if (canCreateAtRoot()) {\n <button class=\"btn-new\" (click)=\"onCreateCollection(null)\" title=\"New Collection\">\n <i class=\"fas fa-plus\"></i>\n </button>\n }\n </div>\n\n <div\n class=\"tree-content\"\n [class.drag-over-root]=\"dragOverNodeId === 'root'\"\n (dragover)=\"onDragOverRoot($event)\"\n (drop)=\"onDropRoot($event)\">\n @for (node of treeNodes; track node.collection.ID) {\n <div class=\"tree-node-wrapper\">\n <div\n class=\"tree-node\"\n [class.selected]=\"IsCollectionSelected(node)\"\n [class.drag-over]=\"dragOverNodeId === node.collection.ID\"\n [class.dragging]=\"IsCollectionDragging(node)\"\n [style.padding-left.px]=\"node.level * 20\"\n [draggable]=\"true\"\n (click)=\"onSelectCollection(node.collection)\"\n (dragstart)=\"onDragStart($event, node)\"\n (dragend)=\"onDragEnd($event)\"\n (dragover)=\"onDragOver($event, node)\"\n (dragleave)=\"onDragLeave($event, node)\"\n (drop)=\"onDrop($event, node)\">\n @if (node.children.length > 0) {\n <i\n class=\"fas toggle-icon\"\n [ngClass]=\"node.expanded ? 'fa-chevron-down' : 'fa-chevron-right'\"\n (click)=\"toggleNode(node, $event)\">\n </i>\n }\n <i class=\"fas fa-folder collection-icon\" [style.color]=\"node.collection.Color || '#0076B6'\"></i>\n <span class=\"collection-name\">{{ node.collection.Name }}</span>\n <div class=\"node-actions\" (click)=\"$event.stopPropagation()\">\n @if (canEdit(node.collection)) {\n <button class=\"node-action-btn\" (click)=\"onCreateCollection(node.collection.ID)\" title=\"Add sub-collection\">\n <i class=\"fas fa-plus\"></i>\n </button>\n }\n @if (canDelete(node.collection)) {\n <button class=\"node-action-btn\" (click)=\"onDeleteCollection(node.collection)\" title=\"Delete\">\n <i class=\"fas fa-trash\"></i>\n </button>\n }\n </div>\n </div>\n\n @if (node.expanded) {\n @for (child of node.children; track child.collection.ID) {\n <ng-container *ngTemplateOutlet=\"recursiveTree; context: { node: child }\"></ng-container>\n }\n }\n </div>\n }\n </div>\n </div>\n\n <ng-template #recursiveTree let-node=\"node\">\n <div class=\"tree-node-wrapper\">\n <div\n class=\"tree-node\"\n [class.selected]=\"IsCollectionSelected(node)\"\n [class.drag-over]=\"dragOverNodeId === node.collection.ID\"\n [class.dragging]=\"IsCollectionDragging(node)\"\n [style.padding-left.px]=\"node.level * 20\"\n [draggable]=\"true\"\n (click)=\"onSelectCollection(node.collection)\"\n (dragstart)=\"onDragStart($event, node)\"\n (dragend)=\"onDragEnd($event)\"\n (dragover)=\"onDragOver($event, node)\"\n (dragleave)=\"onDragLeave($event, node)\"\n (drop)=\"onDrop($event, node)\">\n @if (node.children.length > 0) {\n <i\n class=\"fas toggle-icon\"\n [ngClass]=\"node.expanded ? 'fa-chevron-down' : 'fa-chevron-right'\"\n (click)=\"toggleNode(node, $event)\">\n </i>\n }\n <i class=\"fas fa-folder collection-icon\" [style.color]=\"node.collection.Color || '#0076B6'\"></i>\n <span class=\"collection-name\">{{ node.collection.Name }}</span>\n <div class=\"node-actions\" (click)=\"$event.stopPropagation()\">\n @if (canEdit(node.collection)) {\n <button class=\"node-action-btn\" (click)=\"onCreateCollection(node.collection.ID)\" title=\"Add sub-collection\">\n <i class=\"fas fa-plus\"></i>\n </button>\n }\n @if (canDelete(node.collection)) {\n <button class=\"node-action-btn\" (click)=\"onDeleteCollection(node.collection)\" title=\"Delete\">\n <i class=\"fas fa-trash\"></i>\n </button>\n }\n </div>\n </div>\n\n @if (node.expanded) {\n @for (child of node.children; track child.collection.ID) {\n <ng-container *ngTemplateOutlet=\"recursiveTree; context: { node: child }\"></ng-container>\n }\n }\n </div>\n </ng-template>\n `,\n styles: [`\n .collection-tree { display: flex; flex-direction: column; height: 100%; }\n .tree-header { padding: 16px; border-bottom: 1px solid var(--mj-border-default); display: flex; justify-content: space-between; align-items: center; }\n .tree-header h3 { margin: 0; font-size: 16px; }\n .btn-new { padding: 6px 10px; background: var(--mj-brand-primary); color: var(--mj-text-inverse); border: none; border-radius: 4px; cursor: pointer; }\n .btn-new:hover { background: var(--mj-brand-primary-hover); }\n .tree-content { flex: 1; overflow-y: auto; position: relative; }\n .tree-content.drag-over-root { background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface)); }\n .tree-node {\n padding: 8px 12px;\n cursor: move;\n display: flex;\n align-items: center;\n gap: 8px;\n position: relative;\n transition: all 0.2s ease;\n border: 2px solid transparent;\n }\n .tree-node:hover { background: var(--mj-bg-surface-sunken); }\n .tree-node.selected { background: var(--mj-brand-accent); }\n .tree-node.dragging {\n opacity: 0.4;\n cursor: grabbing;\n }\n .tree-node.drag-over {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border: 2px dashed var(--mj-brand-primary);\n border-radius: 4px;\n }\n .toggle-icon { font-size: 10px; color: var(--mj-text-disabled); cursor: pointer; width: 12px; }\n .collection-icon { font-size: 14px; }\n .collection-name { flex: 1; font-size: 14px; user-select: none; }\n .node-actions { display: none; gap: 4px; }\n .tree-node:hover .node-actions { display: flex; }\n .node-action-btn { padding: 4px 6px; background: transparent; border: none; cursor: pointer; border-radius: 3px; color: var(--mj-text-muted); }\n .node-action-btn:hover { background: var(--mj-bg-surface-sunken); }\n `]\n})\nexport class CollectionTreeComponent extends BaseAngularComponent implements OnInit {\n @Input() environmentId!: string;\n @Input() currentUser!: UserInfo;\n @Input() selectedCollectionId: string | null = null;\n @Input() userPermissions: Map<string, CollectionPermission> = new Map();\n\n @Output() collectionSelected = new EventEmitter<MJCollectionEntity>();\n @Output() collectionCreated = new EventEmitter<MJCollectionEntity>();\n @Output() collectionDeleted = new EventEmitter<MJCollectionEntity>();\n\n public collections: MJCollectionEntity[] = [];\n public treeNodes: TreeNode[] = [];\n public draggedNode: TreeNode | null = null;\n public dragOverNodeId: string | null = null;\n\n constructor(private permissionService: CollectionPermissionService) {\n super();}\n\n ngOnInit() {\n this.permissionService.Provider = this.ProviderToUse;\n this.loadCollections();\n }\n\n private async loadCollections(): Promise<void> {\n try {\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: 'Sequence ASC, Name ASC',\n ResultType: 'entity_object'\n }, this.currentUser);\n\n if (result.Success) {\n this.collections = result.Results || [];\n this.buildTree();\n }\n } catch (error) {\n console.error('Error loading collections:', error);\n }\n }\n\n private buildTree(): void {\n const rootCollections = this.collections.filter(c => !c.ParentID);\n this.treeNodes = rootCollections.map(c => this.buildNode(c, 0));\n }\n\n private buildNode(collection: MJCollectionEntity, level: number): TreeNode {\n const children = this.collections.filter(c => UUIDsEqual(c.ParentID, collection.ID));\n return {\n collection,\n children: children.map(c => this.buildNode(c, level + 1)),\n expanded: level === 0,\n level\n };\n }\n\n toggleNode(node: TreeNode, event: Event): void {\n event.stopPropagation();\n node.expanded = !node.expanded;\n }\n\n IsCollectionSelected(node: TreeNode): boolean {\n return UUIDsEqual(node.collection.ID, this.selectedCollectionId);\n }\n\n IsCollectionDragging(node: TreeNode): boolean {\n return UUIDsEqual(this.draggedNode?.collection?.ID, node.collection.ID);\n }\n\n onSelectCollection(collection: MJCollectionEntity): void {\n this.selectedCollectionId = collection.ID;\n this.collectionSelected.emit(collection);\n }\n\n async onCreateCollection(parentId: string | null): Promise<void> {\n // Validate permission if creating child collection\n if (parentId) {\n const parentCollection = this.collections.find(c => UUIDsEqual(c.ID, parentId));\n if (parentCollection) {\n // Check if user has Edit permission on parent\n if (parentCollection.OwnerID && !UUIDsEqual(parentCollection.OwnerID, this.currentUser.ID)) {\n const permission = await this.permissionService.checkPermission(\n parentId,\n this.currentUser.ID,\n this.currentUser\n );\n\n if (!permission?.canEdit) {\n alert('You do not have Edit permission to create a sub-collection.');\n return;\n }\n }\n }\n }\n\n const name = prompt('Enter collection name:');\n if (!name) return;\n\n try {\n const md = this.ProviderToUse;\n const collection = await md.GetEntityObject<MJCollectionEntity>('MJ: Collections', this.currentUser);\n\n collection.Name = name;\n collection.EnvironmentID = this.environmentId;\n\n if (parentId) {\n // Child collection - inherit parent's owner and set parent\n const parentCollection = this.collections.find(c => UUIDsEqual(c.ID, parentId));\n collection.ParentID = parentId;\n collection.OwnerID = parentCollection?.OwnerID || this.currentUser.ID;\n } else {\n // Root collection - current user becomes owner\n collection.OwnerID = this.currentUser.ID;\n }\n\n const saved = await collection.Save();\n if (saved) {\n this.collectionCreated.emit(collection);\n await this.loadCollections();\n }\n } catch (error) {\n console.error('Error creating collection:', error);\n alert('Failed to create collection');\n }\n }\n\n async onDeleteCollection(collection: MJCollectionEntity): Promise<void> {\n // Validate Delete permission\n if (collection.OwnerID && !UUIDsEqual(collection.OwnerID, this.currentUser.ID)) {\n const permission = await this.permissionService.checkPermission(\n collection.ID,\n this.currentUser.ID,\n this.currentUser\n );\n\n if (!permission?.canDelete) {\n alert('You do not have Delete permission for this collection.');\n return;\n }\n }\n\n if (!confirm(`Delete collection \"${collection.Name}\"?`)) return;\n\n try {\n const deleted = await collection.Delete();\n if (deleted) {\n this.collectionDeleted.emit(collection);\n await this.loadCollections();\n }\n } catch (error) {\n console.error('Error deleting collection:', error);\n alert('Failed to delete collection');\n }\n }\n\n onDragStart(event: DragEvent, node: TreeNode): void {\n this.draggedNode = node;\n const dragData: DragData = {\n collectionId: node.collection.ID,\n parentId: node.collection.ParentID || null\n };\n event.dataTransfer!.effectAllowed = 'move';\n event.dataTransfer!.setData('application/json', JSON.stringify(dragData));\n\n // Add visual feedback\n (event.target as HTMLElement).style.opacity = '0.4';\n }\n\n onDragEnd(event: DragEvent): void {\n // Clean up visual feedback\n (event.target as HTMLElement).style.opacity = '1';\n this.draggedNode = null;\n this.dragOverNodeId = null;\n }\n\n onDragOver(event: DragEvent, targetNode: TreeNode): void {\n event.preventDefault(); // Required to allow drop\n\n if (!this.draggedNode || UUIDsEqual(this.draggedNode.collection.ID, targetNode.collection.ID)) {\n event.dataTransfer!.dropEffect = 'none';\n return;\n }\n\n // Check if trying to drop into a descendant\n if (this.isDescendant(targetNode, this.draggedNode)) {\n event.dataTransfer!.dropEffect = 'none';\n return;\n }\n\n event.dataTransfer!.dropEffect = 'move';\n this.dragOverNodeId = targetNode.collection.ID;\n }\n\n onDragLeave(event: DragEvent, targetNode: TreeNode): void {\n if (this.dragOverNodeId === targetNode.collection.ID) {\n this.dragOverNodeId = null;\n }\n }\n\n async onDrop(event: DragEvent, targetNode: TreeNode): Promise<void> {\n event.preventDefault();\n event.stopPropagation();\n\n if (!this.draggedNode) {\n return;\n }\n\n // Don't allow dropping on itself\n if (UUIDsEqual(this.draggedNode.collection.ID, targetNode.collection.ID)) {\n this.dragOverNodeId = null;\n return;\n }\n\n // Check if trying to drop into a descendant\n if (this.isDescendant(targetNode, this.draggedNode)) {\n alert('Cannot move a collection into its own descendant');\n this.dragOverNodeId = null;\n return;\n }\n\n try {\n const collection = this.draggedNode.collection;\n const newParentId = targetNode.collection.ID;\n\n // Update the collection's parent\n collection.ParentID = newParentId;\n\n const saved = await collection.Save();\n if (saved) {\n // Reload the tree to reflect changes\n await this.loadCollections();\n } else {\n alert('Failed to move collection');\n }\n } catch (error) {\n LogError(error);\n alert('Error moving collection');\n } finally {\n this.dragOverNodeId = null;\n }\n }\n\n onDragOverRoot(event: DragEvent): void {\n event.preventDefault();\n\n if (!this.draggedNode) {\n event.dataTransfer!.dropEffect = 'none';\n return;\n }\n\n event.dataTransfer!.dropEffect = 'move';\n this.dragOverNodeId = 'root';\n }\n\n async onDropRoot(event: DragEvent): Promise<void> {\n event.preventDefault();\n event.stopPropagation();\n\n if (!this.draggedNode) {\n return;\n }\n\n try {\n const collection = this.draggedNode.collection;\n\n // Move to root level\n collection.ParentID = null;\n\n const saved = await collection.Save();\n if (saved) {\n await this.loadCollections();\n } else {\n alert('Failed to move collection to root');\n }\n } catch (error) {\n LogError(error);\n alert('Error moving collection to root');\n } finally {\n this.dragOverNodeId = null;\n }\n }\n\n private isDescendant(potentialDescendant: TreeNode, ancestor: TreeNode): boolean {\n if (UUIDsEqual(potentialDescendant.collection.ParentID, ancestor.collection.ID)) {\n return true;\n }\n\n for (const child of ancestor.children) {\n if (this.isDescendant(potentialDescendant, child)) {\n return true;\n }\n }\n\n return false;\n }\n\n // Permission checking methods\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 canDelete(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?.canDelete || false;\n }\n\n canCreateAtRoot(): boolean {\n // Anyone can create at root level\n return true;\n }\n}"]}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { OnInit, OnChanges, OnDestroy, SimpleChanges, ChangeDetectorRef } from '@angular/core';
|
|
2
|
+
import { BaseAngularComponent } from '@memberjunction/ng-base-types';
|
|
2
3
|
import { MJCollectionEntity, MJArtifactEntity, MJArtifactVersionEntity } from '@memberjunction/core-entities';
|
|
3
4
|
import { UserInfo } from '@memberjunction/core';
|
|
4
5
|
import * as i0 from "@angular/core";
|
|
5
6
|
type ViewMode = 'grid' | 'list';
|
|
6
7
|
type SortBy = 'name' | 'date' | 'type';
|
|
7
|
-
export declare class CollectionViewComponent implements OnInit, OnChanges, OnDestroy {
|
|
8
|
+
export declare class CollectionViewComponent extends BaseAngularComponent implements OnInit, OnChanges, OnDestroy {
|
|
8
9
|
private cdr;
|
|
9
10
|
collection: MJCollectionEntity;
|
|
10
11
|
currentUser: UserInfo;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"collection-view.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/collection/collection-view.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACjH,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,uBAAuB,EAA8B,MAAM,+BAA+B,CAAC;AAC1I,OAAO,EAAE,QAAQ,EAAqB,MAAM,sBAAsB,CAAC;;AAGnE,KAAK,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAC;AAChC,KAAK,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAEvC,qBAqHa,uBAAwB,YAAW,MAAM,EAAE,SAAS,EAAE,SAAS;
|
|
1
|
+
{"version":3,"file":"collection-view.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/collection/collection-view.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACjH,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,uBAAuB,EAA8B,MAAM,+BAA+B,CAAC;AAC1I,OAAO,EAAE,QAAQ,EAAqB,MAAM,sBAAsB,CAAC;;AAGnE,KAAK,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAC;AAChC,KAAK,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAEvC,qBAqHa,uBAAwB,SAAQ,oBAAqB,YAAW,MAAM,EAAE,SAAS,EAAE,SAAS;IAuB3F,OAAO,CAAC,GAAG;IAtBd,UAAU,EAAG,kBAAkB,CAAC;IAChC,WAAW,EAAG,QAAQ,CAAC;IACvB,aAAa,EAAG,MAAM,CAAC;IACvB,OAAO,EAAE,OAAO,CAAQ;IAG1B,gBAAgB,EAAE,KAAK,CAAC;QAC7B,OAAO,EAAE,uBAAuB,CAAC;QACjC,QAAQ,EAAE,gBAAgB,CAAC;KAC5B,CAAC,CAAM;IACD,QAAQ,EAAE,QAAQ,CAAU;IAC5B,MAAM,EAAE,MAAM,CAAU;IACxB,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAQ;IACzC,qBAAqB,EAAE,MAAM,GAAG,SAAS,CAAa;IACtD,kBAAkB,UAAS;IAE3B,WAAW;;;QAIhB;gBAEkB,GAAG,EAAE,iBAAiB;IAG1C,QAAQ;IAIR,WAAW,CAAC,OAAO,EAAE,aAAa;IAMlC,WAAW;YAOG,aAAa;IAsD3B,OAAO,CAAC,iBAAiB;IAazB,YAAY,IAAI,IAAI;IAIpB,kBAAkB,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,uBAAuB,CAAC;QAAC,QAAQ,EAAE,gBAAgB,CAAA;KAAE,GAAG,IAAI;IAIhG,cAAc,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,uBAAuB,CAAC;QAAC,QAAQ,EAAE,gBAAgB,CAAA;KAAE,GAAG,IAAI;IAQ5F,qBAAqB,IAAI,IAAI;IAM7B,cAAc,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,uBAAuB,CAAC;QAAC,QAAQ,EAAE,gBAAgB,CAAA;KAAE,GAAG,IAAI;IAItF,gBAAgB,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,uBAAuB,CAAC;QAAC,QAAQ,EAAE,gBAAgB,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IA8CvG,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;yCAtLzB,uBAAuB;2CAAvB,uBAAuB;CAmOnC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Component, Input } from '@angular/core';
|
|
2
|
-
import {
|
|
2
|
+
import { BaseAngularComponent } from '@memberjunction/ng-base-types';
|
|
3
|
+
import { RunView } from '@memberjunction/core';
|
|
3
4
|
import { MJNotificationService } from '@memberjunction/ng-notifications';
|
|
4
5
|
import * as i0 from "@angular/core";
|
|
5
6
|
import * as i1 from "@angular/forms";
|
|
@@ -69,7 +70,7 @@ function CollectionViewComponent_Conditional_18_Template(rf, ctx) { if (rf & 1)
|
|
|
69
70
|
i0.ɵɵadvance(2);
|
|
70
71
|
i0.ɵɵproperty("artifactId", ctx_r2.selectedArtifactId)("versionNumber", ctx_r2.selectedVersionNumber)("currentUser", ctx_r2.currentUser)("environmentId", ctx_r2.environmentId)("viewContext", "collection")("contextCollectionId", ctx_r2.collection.ID);
|
|
71
72
|
} }
|
|
72
|
-
export class CollectionViewComponent {
|
|
73
|
+
export class CollectionViewComponent extends BaseAngularComponent {
|
|
73
74
|
cdr;
|
|
74
75
|
collection;
|
|
75
76
|
currentUser;
|
|
@@ -88,6 +89,7 @@ export class CollectionViewComponent {
|
|
|
88
89
|
{ label: 'Type', value: 'type' }
|
|
89
90
|
];
|
|
90
91
|
constructor(cdr) {
|
|
92
|
+
super();
|
|
91
93
|
this.cdr = cdr;
|
|
92
94
|
}
|
|
93
95
|
ngOnInit() {
|
|
@@ -108,8 +110,8 @@ export class CollectionViewComponent {
|
|
|
108
110
|
if (!this.collection)
|
|
109
111
|
return;
|
|
110
112
|
try {
|
|
111
|
-
const rv =
|
|
112
|
-
const md =
|
|
113
|
+
const rv = RunView.FromMetadataProvider(this.ProviderToUse);
|
|
114
|
+
const md = this.ProviderToUse;
|
|
113
115
|
// Load ALL VERSIONS in this collection (no DISTINCT - each version is separate)
|
|
114
116
|
const versionResult = await rv.RunView({
|
|
115
117
|
EntityName: 'MJ: Artifact Versions',
|
|
@@ -193,7 +195,7 @@ export class CollectionViewComponent {
|
|
|
193
195
|
return;
|
|
194
196
|
try {
|
|
195
197
|
// Delete THIS SPECIFIC VERSION from the collection
|
|
196
|
-
const rv =
|
|
198
|
+
const rv = RunView.FromMetadataProvider(this.ProviderToUse);
|
|
197
199
|
const result = await rv.RunView({
|
|
198
200
|
EntityName: 'MJ: Collection Artifacts',
|
|
199
201
|
ExtraFilter: `CollectionID='${this.collection.ID}' AND ArtifactVersionID='${item.version.ID}'`,
|
|
@@ -201,7 +203,7 @@ export class CollectionViewComponent {
|
|
|
201
203
|
}, this.currentUser);
|
|
202
204
|
if (result.Success && result.Results && result.Results.length > 0) {
|
|
203
205
|
// Delete all version associations atomically
|
|
204
|
-
const md =
|
|
206
|
+
const md = this.ProviderToUse;
|
|
205
207
|
const tg = await md.CreateTransactionGroup();
|
|
206
208
|
for (const joinRecord of result.Results) {
|
|
207
209
|
joinRecord.TransactionGroup = tg;
|
|
@@ -230,7 +232,7 @@ export class CollectionViewComponent {
|
|
|
230
232
|
return;
|
|
231
233
|
try {
|
|
232
234
|
// Create new artifact
|
|
233
|
-
const md =
|
|
235
|
+
const md = this.ProviderToUse;
|
|
234
236
|
const artifact = await md.GetEntityObject('MJ: Artifacts', this.currentUser);
|
|
235
237
|
artifact.Name = name;
|
|
236
238
|
// Type is read-only, set via TypeID instead
|
|
@@ -238,7 +240,7 @@ export class CollectionViewComponent {
|
|
|
238
240
|
const saved = await artifact.Save();
|
|
239
241
|
if (saved) {
|
|
240
242
|
// Get the latest version of this artifact to add to collection
|
|
241
|
-
const rv =
|
|
243
|
+
const rv = RunView.FromMetadataProvider(this.ProviderToUse);
|
|
242
244
|
const versionResult = await rv.RunView({
|
|
243
245
|
EntityName: 'MJ: Artifact Versions',
|
|
244
246
|
ExtraFilter: `ArtifactID='${artifact.ID}'`,
|
|
@@ -264,7 +266,7 @@ export class CollectionViewComponent {
|
|
|
264
266
|
}
|
|
265
267
|
}
|
|
266
268
|
static ɵfac = function CollectionViewComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || CollectionViewComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
|
|
267
|
-
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: CollectionViewComponent, selectors: [["mj-collection-view"]], inputs: { collection: "collection", currentUser: "currentUser", environmentId: "environmentId", canEdit: "canEdit" }, standalone: false, features: [i0.ɵɵNgOnChangesFeature], decls: 19, vars: 13, consts: [[1, "collection-view"], [1, "view-header"], [1, "header-actions"], [1, "view-mode-toggle"], ["title", "Grid View", 1, "mode-btn", 3, "click"], [1, "fas", "fa-grid"], ["title", "List View", 1, "mode-btn", 3, "click"], [1, "fas", "fa-list"], [1, "mj-select", 2, "width", "150px", 3, "ngModelChange", "ngModel"], [3, "value"], ["title", "Add Artifact", 1, "btn-add"], [1, "view-content"], [1, "empty-state"], [3, "artifact", "version"], [1, "artifact-viewer-overlay"], ["title", "Add Artifact", 1, "btn-add", 3, "click"], [1, "fas", "fa-plus"], [1, "fas", "fa-folder-open"], [1, "btn-add-primary"], [1, "btn-add-primary", 3, "click"], [3, "selected", "viewed", "edited", "removed", "artifact", "version"], [1, "artifact-viewer-overlay", 3, "click"], [1, "artifact-viewer-container", 3, "click"], [3, "closed", "artifactId", "versionNumber", "currentUser", "environmentId", "viewContext", "contextCollectionId"]], template: function CollectionViewComponent_Template(rf, ctx) { if (rf & 1) {
|
|
269
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: CollectionViewComponent, selectors: [["mj-collection-view"]], inputs: { collection: "collection", currentUser: "currentUser", environmentId: "environmentId", canEdit: "canEdit" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature, i0.ɵɵNgOnChangesFeature], decls: 19, vars: 13, consts: [[1, "collection-view"], [1, "view-header"], [1, "header-actions"], [1, "view-mode-toggle"], ["title", "Grid View", 1, "mode-btn", 3, "click"], [1, "fas", "fa-grid"], ["title", "List View", 1, "mode-btn", 3, "click"], [1, "fas", "fa-list"], [1, "mj-select", 2, "width", "150px", 3, "ngModelChange", "ngModel"], [3, "value"], ["title", "Add Artifact", 1, "btn-add"], [1, "view-content"], [1, "empty-state"], [3, "artifact", "version"], [1, "artifact-viewer-overlay"], ["title", "Add Artifact", 1, "btn-add", 3, "click"], [1, "fas", "fa-plus"], [1, "fas", "fa-folder-open"], [1, "btn-add-primary"], [1, "btn-add-primary", 3, "click"], [3, "selected", "viewed", "edited", "removed", "artifact", "version"], [1, "artifact-viewer-overlay", 3, "click"], [1, "artifact-viewer-container", 3, "click"], [3, "closed", "artifactId", "versionNumber", "currentUser", "environmentId", "viewContext", "contextCollectionId"]], template: function CollectionViewComponent_Template(rf, ctx) { if (rf & 1) {
|
|
268
270
|
i0.ɵɵelementStart(0, "div", 0)(1, "div", 1)(2, "h2");
|
|
269
271
|
i0.ɵɵtext(3);
|
|
270
272
|
i0.ɵɵelementEnd();
|
|
@@ -405,5 +407,5 @@ export class CollectionViewComponent {
|
|
|
405
407
|
}], canEdit: [{
|
|
406
408
|
type: Input
|
|
407
409
|
}] }); })();
|
|
408
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(CollectionViewComponent, { className: "CollectionViewComponent", filePath: "src/lib/components/collection/collection-view.component.ts", lineNumber:
|
|
410
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(CollectionViewComponent, { className: "CollectionViewComponent", filePath: "src/lib/components/collection/collection-view.component.ts", lineNumber: 127 }); })();
|
|
409
411
|
//# sourceMappingURL=collection-view.component.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"collection-view.component.js","sourceRoot":"","sources":["../../../../src/lib/components/collection/collection-view.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, OnInit, OnChanges, OnDestroy, SimpleChanges, ChangeDetectorRef } from '@angular/core';\nimport { MJCollectionEntity, MJArtifactEntity, MJArtifactVersionEntity, MJCollectionArtifactEntity } from '@memberjunction/core-entities';\nimport { UserInfo, RunView, Metadata } from '@memberjunction/core';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\n\ntype ViewMode = 'grid' | 'list';\ntype SortBy = 'name' | 'date' | 'type';\n\n@Component({\n standalone: false,\n selector: 'mj-collection-view',\n template: `\n <div class=\"collection-view\">\n <div class=\"view-header\">\n <h2>{{ collection.Name || 'Collection' }}</h2>\n <div class=\"header-actions\">\n <div class=\"view-mode-toggle\">\n <button\n class=\"mode-btn\"\n [class.active]=\"viewMode === 'grid'\"\n (click)=\"viewMode = 'grid'\"\n title=\"Grid View\">\n <i class=\"fas fa-grid\"></i>\n </button>\n <button\n class=\"mode-btn\"\n [class.active]=\"viewMode === 'list'\"\n (click)=\"viewMode = 'list'\"\n title=\"List View\">\n <i class=\"fas fa-list\"></i>\n </button>\n </div>\n \n <select\n [(ngModel)]=\"sortBy\"\n (ngModelChange)=\"onSortChange()\"\n class=\"mj-select\"\n style=\"width: 150px;\">\n @for (option of sortOptions; track option.value) {\n <option [value]=\"option.value\">{{ option.label }}</option>\n }\n </select>\n \n @if (canEdit) {\n <button class=\"btn-add\" (click)=\"onAddArtifact()\" title=\"Add Artifact\">\n <i class=\"fas fa-plus\"></i> Add\n </button>\n }\n </div>\n </div>\n \n <div class=\"view-content\" [class.grid-mode]=\"viewMode === 'grid'\" [class.list-mode]=\"viewMode === 'list'\">\n @if (artifactVersions.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fas fa-folder-open\"></i>\n <p>This collection is empty</p>\n @if (canEdit) {\n <button class=\"btn-add-primary\" (click)=\"onAddArtifact()\">\n <i class=\"fas fa-plus\"></i> Add Artifact\n </button>\n }\n </div>\n }\n \n @for (item of artifactVersions; track item.version.ID) {\n <mj-collection-artifact-card\n [artifact]=\"item.artifact\"\n [version]=\"item.version\"\n (selected)=\"onArtifactSelected(item)\"\n (viewed)=\"onViewArtifact(item)\"\n (edited)=\"onEditArtifact(item)\"\n (removed)=\"onRemoveArtifact(item)\">\n </mj-collection-artifact-card>\n }\n </div>\n </div>\n \n <!-- Artifact Viewer Panel -->\n @if (showArtifactViewer && selectedArtifactId) {\n <div class=\"artifact-viewer-overlay\" (click)=\"onCloseArtifactViewer()\">\n <div class=\"artifact-viewer-container\" (click)=\"$event.stopPropagation()\">\n <mj-artifact-viewer-panel\n [artifactId]=\"selectedArtifactId\"\n [versionNumber]=\"selectedVersionNumber\"\n [currentUser]=\"currentUser\"\n [environmentId]=\"environmentId\"\n [viewContext]=\"'collection'\"\n [contextCollectionId]=\"collection.ID\"\n (closed)=\"onCloseArtifactViewer()\">\n </mj-artifact-viewer-panel>\n </div>\n </div>\n }\n `,\n styles: [`\n .collection-view { display: flex; flex-direction: column; height: 100%; background: var(--mj-bg-surface); }\n\n .view-header { padding: 20px 24px; border-bottom: 1px solid var(--mj-border-default); display: flex; justify-content: space-between; align-items: center; }\n .view-header h2 { margin: 0; font-size: 20px; flex: 1; }\n\n .header-actions { display: flex; align-items: center; gap: 12px; }\n\n .view-mode-toggle { display: flex; border: 1px solid var(--mj-border-default); border-radius: 4px; overflow: hidden; }\n .mode-btn { padding: 8px 12px; background: var(--mj-bg-surface); border: none; border-right: 1px solid var(--mj-border-default); cursor: pointer; color: var(--mj-text-muted); transition: all 150ms ease; }\n .mode-btn:last-child { border-right: none; }\n .mode-btn:hover { background: var(--mj-bg-surface-sunken); }\n .mode-btn.active { background: var(--mj-brand-primary); color: var(--mj-text-inverse); }\n\n .btn-add { padding: 8px 16px; background: var(--mj-brand-primary); color: var(--mj-text-inverse); border: none; border-radius: 4px; cursor: pointer; display: flex; align-items: center; gap: 6px; }\n .btn-add:hover { background: var(--mj-brand-primary-hover); }\n\n .view-content { flex: 1; overflow-y: auto; padding: 24px; }\n .view-content.grid-mode { display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 16px; }\n .view-content.list-mode { display: flex; flex-direction: column; gap: 12px; }\n\n .empty-state { display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 64px 24px; color: var(--mj-text-disabled); }\n .empty-state i { font-size: 64px; margin-bottom: 24px; }\n .empty-state p { margin: 0 0 24px 0; font-size: 16px; }\n .btn-add-primary { padding: 12px 24px; background: var(--mj-brand-primary); color: var(--mj-text-inverse); border: none; border-radius: 4px; cursor: pointer; font-size: 14px; display: flex; align-items: center; gap: 8px; }\n .btn-add-primary:hover { background: var(--mj-brand-primary-hover); }\n\n .artifact-viewer-overlay { position: fixed; top: 0; left: 0; right: 0; bottom: 0; background: var(--mj-bg-overlay); display: flex; align-items: center; justify-content: center; z-index: 10000; }\n .artifact-viewer-container { width: 90%; max-width: 1200px; height: 90vh; background: var(--mj-bg-surface); border-radius: 12px; overflow: hidden; box-shadow: var(--mj-shadow-lg); }\n `]\n})\nexport class CollectionViewComponent implements OnInit, OnChanges, OnDestroy {\n @Input() collection!: MJCollectionEntity;\n @Input() currentUser!: UserInfo;\n @Input() environmentId!: string;\n @Input() canEdit: boolean = true;\n\n // Store versions with parent artifact info for display\n public artifactVersions: Array<{\n version: MJArtifactVersionEntity;\n artifact: MJArtifactEntity;\n }> = [];\n public viewMode: ViewMode = 'grid';\n public sortBy: SortBy = 'date';\n public selectedArtifactId: string | null = null;\n public selectedVersionNumber: number | undefined = undefined;\n public showArtifactViewer = false;\n\n public sortOptions = [\n { label: 'Name', value: 'name' },\n { label: 'Date Modified', value: 'date' },\n { label: 'Type', value: 'type' }\n ];\n\n constructor(private cdr: ChangeDetectorRef) {}\n\n ngOnInit() {\n this.loadArtifacts();\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes['collection'] && !changes['collection'].firstChange) {\n this.loadArtifacts();\n }\n }\n\n ngOnDestroy() {\n // Close artifact viewer when navigating away from collection\n if (this.showArtifactViewer) {\n this.onCloseArtifactViewer();\n }\n }\n\n private async loadArtifacts(): Promise<void> {\n if (!this.collection) return;\n\n try {\n const rv = new RunView();\n const md = new Metadata();\n\n // Load ALL VERSIONS in this collection (no DISTINCT - each version is separate)\n const versionResult = await rv.RunView<MJArtifactVersionEntity>({\n EntityName: 'MJ: Artifact Versions',\n ExtraFilter: `ID IN (\n SELECT ca.ArtifactVersionID\n FROM [__mj].[vwCollectionArtifacts] ca\n WHERE ca.CollectionID='${this.collection.ID}'\n )`,\n OrderBy: this.getVersionOrderBy(),\n ResultType: 'entity_object'\n }, this.currentUser);\n\n if (versionResult.Success && versionResult.Results) {\n // Get unique artifact IDs\n const artifactIds = [...new Set(versionResult.Results.map(v => v.ArtifactID))];\n\n // Load parent artifact info (just for display metadata - no visibility filtering)\n const artifactMap = new Map<string, MJArtifactEntity>();\n if (artifactIds.length > 0) {\n const artifactFilter = artifactIds.map(id => `ID='${id}'`).join(' OR ');\n const artifactResult = await rv.RunView<MJArtifactEntity>({\n EntityName: 'MJ: Artifacts',\n ExtraFilter: artifactFilter,\n ResultType: 'entity_object'\n }, this.currentUser);\n\n if (artifactResult.Success && artifactResult.Results) {\n artifactResult.Results.forEach(a => artifactMap.set(a.ID, a));\n }\n }\n\n // Combine version + artifact info\n this.artifactVersions = versionResult.Results\n .map(version => ({\n version,\n artifact: artifactMap.get(version.ArtifactID)!\n }))\n .filter(item => item.artifact != null); // Filter out any without parent artifact\n } else {\n this.artifactVersions = [];\n }\n } catch (error) {\n console.error('Failed to load collection artifacts:', error);\n this.artifactVersions = [];\n }\n }\n\n private getVersionOrderBy(): string {\n switch (this.sortBy) {\n case 'name':\n return 'Name ASC, VersionNumber DESC';\n case 'type':\n // Will sort by parent artifact type (handled in template)\n return 'ArtifactID ASC, VersionNumber DESC';\n case 'date':\n default:\n return '__mj_UpdatedAt DESC';\n }\n }\n\n onSortChange(): void {\n this.loadArtifacts();\n }\n\n onArtifactSelected(item: { version: MJArtifactVersionEntity; artifact: MJArtifactEntity }): void {\n // TODO: Emit event or navigate to artifact detail view\n }\n\n onViewArtifact(item: { version: MJArtifactVersionEntity; artifact: MJArtifactEntity }): void {\n this.selectedArtifactId = item.artifact.ID;\n this.selectedVersionNumber = item.version.VersionNumber;\n // Force change detection to ensure Input bindings propagate before component creation\n this.cdr.detectChanges();\n this.showArtifactViewer = true;\n }\n\n onCloseArtifactViewer(): void {\n this.showArtifactViewer = false;\n this.selectedArtifactId = null;\n this.selectedVersionNumber = undefined;\n }\n\n onEditArtifact(item: { version: MJArtifactVersionEntity; artifact: MJArtifactEntity }): void {\n // TODO: Open artifact editor\n }\n\n async onRemoveArtifact(item: { version: MJArtifactVersionEntity; artifact: MJArtifactEntity }): Promise<void> {\n const versionLabel = `\"${item.artifact.Name}\" v${item.version.VersionNumber}`;\n if (!confirm(`Remove ${versionLabel} from this collection?`)) return;\n\n try {\n // Delete THIS SPECIFIC VERSION from the collection\n const rv = new RunView();\n const result = await rv.RunView({\n EntityName: 'MJ: Collection Artifacts',\n ExtraFilter: `CollectionID='${this.collection.ID}' AND ArtifactVersionID='${item.version.ID}'`,\n ResultType: 'entity_object'\n }, this.currentUser);\n\n if (result.Success && result.Results && result.Results.length > 0) {\n // Delete all version associations atomically\n const md = new Metadata();\n const tg = await md.CreateTransactionGroup();\n for (const joinRecord of result.Results) {\n joinRecord.TransactionGroup = tg;\n await joinRecord.Delete();\n }\n const success = await tg.Submit();\n if (!success) {\n MJNotificationService.Instance.CreateSimpleNotification(\n `Failed to remove ${versionLabel} from collection`,\n 'error'\n );\n return;\n }\n await this.loadArtifacts();\n this.cdr.detectChanges();\n MJNotificationService.Instance.CreateSimpleNotification(\n `Removed ${versionLabel} from collection`,\n 'success',\n 3000\n );\n }\n } catch (error) {\n console.error('Failed to remove artifact version from collection:', error);\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Failed to remove artifact version from collection',\n 'error'\n );\n }\n }\n\n async onAddArtifact(): Promise<void> {\n // TODO: Open artifact picker dialog\n // For now, just show a simple prompt\n const name = prompt('Enter artifact name:');\n if (!name) return;\n\n try {\n // Create new artifact\n const md = new Metadata();\n const artifact = await md.GetEntityObject<MJArtifactEntity>('MJ: Artifacts', this.currentUser);\n\n artifact.Name = name;\n // Type is read-only, set via TypeID instead\n // For now, skip setting type - it has a default\n\n const saved = await artifact.Save();\n if (saved) {\n // Get the latest version of this artifact to add to collection\n const rv = new RunView();\n const versionResult = await rv.RunView({\n EntityName: 'MJ: Artifact Versions',\n ExtraFilter: `ArtifactID='${artifact.ID}'`,\n OrderBy: 'VersionNumber DESC',\n MaxRows: 1,\n ResultType: 'entity_object'\n }, this.currentUser);\n\n if (!versionResult.Success || !versionResult.Results || versionResult.Results.length === 0) {\n alert('Failed to get artifact version');\n return;\n }\n\n // Add to collection via join table using version ID\n const joinRecord = await md.GetEntityObject<MJCollectionArtifactEntity>('MJ: Collection Artifacts', this.currentUser);\n joinRecord.CollectionID = this.collection.ID;\n joinRecord.ArtifactVersionID = versionResult.Results[0].ID;\n\n await joinRecord.Save();\n await this.loadArtifacts();\n }\n } catch (error) {\n console.error('Failed to add artifact:', error);\n alert('Failed to add artifact');\n }\n }\n}"]}
|
|
1
|
+
{"version":3,"file":"collection-view.component.js","sourceRoot":"","sources":["../../../../src/lib/components/collection/collection-view.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, OnInit, OnChanges, OnDestroy, SimpleChanges, ChangeDetectorRef } from '@angular/core';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { MJCollectionEntity, MJArtifactEntity, MJArtifactVersionEntity, MJCollectionArtifactEntity } from '@memberjunction/core-entities';\nimport { UserInfo, RunView, Metadata } from '@memberjunction/core';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\n\ntype ViewMode = 'grid' | 'list';\ntype SortBy = 'name' | 'date' | 'type';\n\n@Component({\n standalone: false,\n selector: 'mj-collection-view',\n template: `\n <div class=\"collection-view\">\n <div class=\"view-header\">\n <h2>{{ collection.Name || 'Collection' }}</h2>\n <div class=\"header-actions\">\n <div class=\"view-mode-toggle\">\n <button\n class=\"mode-btn\"\n [class.active]=\"viewMode === 'grid'\"\n (click)=\"viewMode = 'grid'\"\n title=\"Grid View\">\n <i class=\"fas fa-grid\"></i>\n </button>\n <button\n class=\"mode-btn\"\n [class.active]=\"viewMode === 'list'\"\n (click)=\"viewMode = 'list'\"\n title=\"List View\">\n <i class=\"fas fa-list\"></i>\n </button>\n </div>\n \n <select\n [(ngModel)]=\"sortBy\"\n (ngModelChange)=\"onSortChange()\"\n class=\"mj-select\"\n style=\"width: 150px;\">\n @for (option of sortOptions; track option.value) {\n <option [value]=\"option.value\">{{ option.label }}</option>\n }\n </select>\n \n @if (canEdit) {\n <button class=\"btn-add\" (click)=\"onAddArtifact()\" title=\"Add Artifact\">\n <i class=\"fas fa-plus\"></i> Add\n </button>\n }\n </div>\n </div>\n \n <div class=\"view-content\" [class.grid-mode]=\"viewMode === 'grid'\" [class.list-mode]=\"viewMode === 'list'\">\n @if (artifactVersions.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fas fa-folder-open\"></i>\n <p>This collection is empty</p>\n @if (canEdit) {\n <button class=\"btn-add-primary\" (click)=\"onAddArtifact()\">\n <i class=\"fas fa-plus\"></i> Add Artifact\n </button>\n }\n </div>\n }\n \n @for (item of artifactVersions; track item.version.ID) {\n <mj-collection-artifact-card\n [artifact]=\"item.artifact\"\n [version]=\"item.version\"\n (selected)=\"onArtifactSelected(item)\"\n (viewed)=\"onViewArtifact(item)\"\n (edited)=\"onEditArtifact(item)\"\n (removed)=\"onRemoveArtifact(item)\">\n </mj-collection-artifact-card>\n }\n </div>\n </div>\n \n <!-- Artifact Viewer Panel -->\n @if (showArtifactViewer && selectedArtifactId) {\n <div class=\"artifact-viewer-overlay\" (click)=\"onCloseArtifactViewer()\">\n <div class=\"artifact-viewer-container\" (click)=\"$event.stopPropagation()\">\n <mj-artifact-viewer-panel\n [artifactId]=\"selectedArtifactId\"\n [versionNumber]=\"selectedVersionNumber\"\n [currentUser]=\"currentUser\"\n [environmentId]=\"environmentId\"\n [viewContext]=\"'collection'\"\n [contextCollectionId]=\"collection.ID\"\n (closed)=\"onCloseArtifactViewer()\">\n </mj-artifact-viewer-panel>\n </div>\n </div>\n }\n `,\n styles: [`\n .collection-view { display: flex; flex-direction: column; height: 100%; background: var(--mj-bg-surface); }\n\n .view-header { padding: 20px 24px; border-bottom: 1px solid var(--mj-border-default); display: flex; justify-content: space-between; align-items: center; }\n .view-header h2 { margin: 0; font-size: 20px; flex: 1; }\n\n .header-actions { display: flex; align-items: center; gap: 12px; }\n\n .view-mode-toggle { display: flex; border: 1px solid var(--mj-border-default); border-radius: 4px; overflow: hidden; }\n .mode-btn { padding: 8px 12px; background: var(--mj-bg-surface); border: none; border-right: 1px solid var(--mj-border-default); cursor: pointer; color: var(--mj-text-muted); transition: all 150ms ease; }\n .mode-btn:last-child { border-right: none; }\n .mode-btn:hover { background: var(--mj-bg-surface-sunken); }\n .mode-btn.active { background: var(--mj-brand-primary); color: var(--mj-text-inverse); }\n\n .btn-add { padding: 8px 16px; background: var(--mj-brand-primary); color: var(--mj-text-inverse); border: none; border-radius: 4px; cursor: pointer; display: flex; align-items: center; gap: 6px; }\n .btn-add:hover { background: var(--mj-brand-primary-hover); }\n\n .view-content { flex: 1; overflow-y: auto; padding: 24px; }\n .view-content.grid-mode { display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 16px; }\n .view-content.list-mode { display: flex; flex-direction: column; gap: 12px; }\n\n .empty-state { display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 64px 24px; color: var(--mj-text-disabled); }\n .empty-state i { font-size: 64px; margin-bottom: 24px; }\n .empty-state p { margin: 0 0 24px 0; font-size: 16px; }\n .btn-add-primary { padding: 12px 24px; background: var(--mj-brand-primary); color: var(--mj-text-inverse); border: none; border-radius: 4px; cursor: pointer; font-size: 14px; display: flex; align-items: center; gap: 8px; }\n .btn-add-primary:hover { background: var(--mj-brand-primary-hover); }\n\n .artifact-viewer-overlay { position: fixed; top: 0; left: 0; right: 0; bottom: 0; background: var(--mj-bg-overlay); display: flex; align-items: center; justify-content: center; z-index: 10000; }\n .artifact-viewer-container { width: 90%; max-width: 1200px; height: 90vh; background: var(--mj-bg-surface); border-radius: 12px; overflow: hidden; box-shadow: var(--mj-shadow-lg); }\n `]\n})\nexport class CollectionViewComponent extends BaseAngularComponent implements OnInit, OnChanges, OnDestroy {\n @Input() collection!: MJCollectionEntity;\n @Input() currentUser!: UserInfo;\n @Input() environmentId!: string;\n @Input() canEdit: boolean = true;\n\n // Store versions with parent artifact info for display\n public artifactVersions: Array<{\n version: MJArtifactVersionEntity;\n artifact: MJArtifactEntity;\n }> = [];\n public viewMode: ViewMode = 'grid';\n public sortBy: SortBy = 'date';\n public selectedArtifactId: string | null = null;\n public selectedVersionNumber: number | undefined = undefined;\n public showArtifactViewer = false;\n\n public sortOptions = [\n { label: 'Name', value: 'name' },\n { label: 'Date Modified', value: 'date' },\n { label: 'Type', value: 'type' }\n ];\n\n constructor(private cdr: ChangeDetectorRef) {\n super();}\n\n ngOnInit() {\n this.loadArtifacts();\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes['collection'] && !changes['collection'].firstChange) {\n this.loadArtifacts();\n }\n }\n\n ngOnDestroy() {\n // Close artifact viewer when navigating away from collection\n if (this.showArtifactViewer) {\n this.onCloseArtifactViewer();\n }\n }\n\n private async loadArtifacts(): Promise<void> {\n if (!this.collection) return;\n\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const md = this.ProviderToUse;\n\n // Load ALL VERSIONS in this collection (no DISTINCT - each version is separate)\n const versionResult = await rv.RunView<MJArtifactVersionEntity>({\n EntityName: 'MJ: Artifact Versions',\n ExtraFilter: `ID IN (\n SELECT ca.ArtifactVersionID\n FROM [__mj].[vwCollectionArtifacts] ca\n WHERE ca.CollectionID='${this.collection.ID}'\n )`,\n OrderBy: this.getVersionOrderBy(),\n ResultType: 'entity_object'\n }, this.currentUser);\n\n if (versionResult.Success && versionResult.Results) {\n // Get unique artifact IDs\n const artifactIds = [...new Set(versionResult.Results.map(v => v.ArtifactID))];\n\n // Load parent artifact info (just for display metadata - no visibility filtering)\n const artifactMap = new Map<string, MJArtifactEntity>();\n if (artifactIds.length > 0) {\n const artifactFilter = artifactIds.map(id => `ID='${id}'`).join(' OR ');\n const artifactResult = await rv.RunView<MJArtifactEntity>({\n EntityName: 'MJ: Artifacts',\n ExtraFilter: artifactFilter,\n ResultType: 'entity_object'\n }, this.currentUser);\n\n if (artifactResult.Success && artifactResult.Results) {\n artifactResult.Results.forEach(a => artifactMap.set(a.ID, a));\n }\n }\n\n // Combine version + artifact info\n this.artifactVersions = versionResult.Results\n .map(version => ({\n version,\n artifact: artifactMap.get(version.ArtifactID)!\n }))\n .filter(item => item.artifact != null); // Filter out any without parent artifact\n } else {\n this.artifactVersions = [];\n }\n } catch (error) {\n console.error('Failed to load collection artifacts:', error);\n this.artifactVersions = [];\n }\n }\n\n private getVersionOrderBy(): string {\n switch (this.sortBy) {\n case 'name':\n return 'Name ASC, VersionNumber DESC';\n case 'type':\n // Will sort by parent artifact type (handled in template)\n return 'ArtifactID ASC, VersionNumber DESC';\n case 'date':\n default:\n return '__mj_UpdatedAt DESC';\n }\n }\n\n onSortChange(): void {\n this.loadArtifacts();\n }\n\n onArtifactSelected(item: { version: MJArtifactVersionEntity; artifact: MJArtifactEntity }): void {\n // TODO: Emit event or navigate to artifact detail view\n }\n\n onViewArtifact(item: { version: MJArtifactVersionEntity; artifact: MJArtifactEntity }): void {\n this.selectedArtifactId = item.artifact.ID;\n this.selectedVersionNumber = item.version.VersionNumber;\n // Force change detection to ensure Input bindings propagate before component creation\n this.cdr.detectChanges();\n this.showArtifactViewer = true;\n }\n\n onCloseArtifactViewer(): void {\n this.showArtifactViewer = false;\n this.selectedArtifactId = null;\n this.selectedVersionNumber = undefined;\n }\n\n onEditArtifact(item: { version: MJArtifactVersionEntity; artifact: MJArtifactEntity }): void {\n // TODO: Open artifact editor\n }\n\n async onRemoveArtifact(item: { version: MJArtifactVersionEntity; artifact: MJArtifactEntity }): Promise<void> {\n const versionLabel = `\"${item.artifact.Name}\" v${item.version.VersionNumber}`;\n if (!confirm(`Remove ${versionLabel} from this collection?`)) return;\n\n try {\n // Delete THIS SPECIFIC VERSION from the collection\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView({\n EntityName: 'MJ: Collection Artifacts',\n ExtraFilter: `CollectionID='${this.collection.ID}' AND ArtifactVersionID='${item.version.ID}'`,\n ResultType: 'entity_object'\n }, this.currentUser);\n\n if (result.Success && result.Results && result.Results.length > 0) {\n // Delete all version associations atomically\n const md = this.ProviderToUse;\n const tg = await md.CreateTransactionGroup();\n for (const joinRecord of result.Results) {\n joinRecord.TransactionGroup = tg;\n await joinRecord.Delete();\n }\n const success = await tg.Submit();\n if (!success) {\n MJNotificationService.Instance.CreateSimpleNotification(\n `Failed to remove ${versionLabel} from collection`,\n 'error'\n );\n return;\n }\n await this.loadArtifacts();\n this.cdr.detectChanges();\n MJNotificationService.Instance.CreateSimpleNotification(\n `Removed ${versionLabel} from collection`,\n 'success',\n 3000\n );\n }\n } catch (error) {\n console.error('Failed to remove artifact version from collection:', error);\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Failed to remove artifact version from collection',\n 'error'\n );\n }\n }\n\n async onAddArtifact(): Promise<void> {\n // TODO: Open artifact picker dialog\n // For now, just show a simple prompt\n const name = prompt('Enter artifact name:');\n if (!name) return;\n\n try {\n // Create new artifact\n const md = this.ProviderToUse;\n const artifact = await md.GetEntityObject<MJArtifactEntity>('MJ: Artifacts', this.currentUser);\n\n artifact.Name = name;\n // Type is read-only, set via TypeID instead\n // For now, skip setting type - it has a default\n\n const saved = await artifact.Save();\n if (saved) {\n // Get the latest version of this artifact to add to collection\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const versionResult = await rv.RunView({\n EntityName: 'MJ: Artifact Versions',\n ExtraFilter: `ArtifactID='${artifact.ID}'`,\n OrderBy: 'VersionNumber DESC',\n MaxRows: 1,\n ResultType: 'entity_object'\n }, this.currentUser);\n\n if (!versionResult.Success || !versionResult.Results || versionResult.Results.length === 0) {\n alert('Failed to get artifact version');\n return;\n }\n\n // Add to collection via join table using version ID\n const joinRecord = await md.GetEntityObject<MJCollectionArtifactEntity>('MJ: Collection Artifacts', this.currentUser);\n joinRecord.CollectionID = this.collection.ID;\n joinRecord.ArtifactVersionID = versionResult.Results[0].ID;\n\n await joinRecord.Save();\n await this.loadArtifacts();\n }\n } catch (error) {\n console.error('Failed to add artifact:', error);\n alert('Failed to add artifact');\n }\n }\n}"]}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { EventEmitter, OnInit, OnDestroy, ChangeDetectorRef } from '@angular/core';
|
|
2
|
+
import { BaseAngularComponent } from '@memberjunction/ng-base-types';
|
|
2
3
|
import { UserInfo } from '@memberjunction/core';
|
|
3
4
|
import { MJCollectionEntity, MJArtifactEntity, MJArtifactVersionEntity } from '@memberjunction/core-entities';
|
|
4
5
|
import { DialogService } from '../../services/dialog.service';
|
|
@@ -12,7 +13,7 @@ import * as i0 from "@angular/core";
|
|
|
12
13
|
* Full-panel Collections view component
|
|
13
14
|
* Comprehensive collection management with artifacts display
|
|
14
15
|
*/
|
|
15
|
-
export declare class CollectionsFullViewComponent implements OnInit, OnDestroy {
|
|
16
|
+
export declare class CollectionsFullViewComponent extends BaseAngularComponent implements OnInit, OnDestroy {
|
|
16
17
|
private dialogService;
|
|
17
18
|
private artifactState;
|
|
18
19
|
private collectionState;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"collections-full-view.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/collection/collections-full-view.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,iBAAiB,EAAgB,MAAM,eAAe,CAAC;AAC3H,OAAO,EAAE,QAAQ,EAAqB,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,uBAAuB,EAA8B,MAAM,+BAA+B,CAAC;AAC1I,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;AAC7E,OAAO,EAAE,sBAAsB,EAAE,MAAM,yCAAyC,CAAC;AACjF,OAAO,EAAE,2BAA2B,EAAE,oBAAoB,EAAE,MAAM,8CAA8C,CAAC;AACjH,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAEnE,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;;AAGnI;;;GAGG;AACH,qBAm5Ca,4BAA6B,YAAW,MAAM,EAAE,SAAS;
|
|
1
|
+
{"version":3,"file":"collections-full-view.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/collection/collections-full-view.component.ts"],"names":[],"mappings":"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"}
|