@memberjunction/ng-conversations 5.4.0 → 5.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. package/dist/lib/components/agent/agent-process-panel.component.d.ts.map +1 -1
  2. package/dist/lib/components/agent/agent-process-panel.component.js +3 -2
  3. package/dist/lib/components/agent/agent-process-panel.component.js.map +1 -1
  4. package/dist/lib/components/collection/artifact-collection-picker-modal.component.d.ts.map +1 -1
  5. package/dist/lib/components/collection/artifact-collection-picker-modal.component.js +10 -9
  6. package/dist/lib/components/collection/artifact-collection-picker-modal.component.js.map +1 -1
  7. package/dist/lib/components/collection/artifact-create-modal.component.d.ts.map +1 -1
  8. package/dist/lib/components/collection/artifact-create-modal.component.js +3 -2
  9. package/dist/lib/components/collection/artifact-create-modal.component.js.map +1 -1
  10. package/dist/lib/components/collection/collection-form-modal.component.d.ts.map +1 -1
  11. package/dist/lib/components/collection/collection-form-modal.component.js +4 -3
  12. package/dist/lib/components/collection/collection-form-modal.component.js.map +1 -1
  13. package/dist/lib/components/collection/collection-share-modal.component.d.ts.map +1 -1
  14. package/dist/lib/components/collection/collection-share-modal.component.js +5 -4
  15. package/dist/lib/components/collection/collection-share-modal.component.js.map +1 -1
  16. package/dist/lib/components/collection/collection-tree.component.d.ts +2 -0
  17. package/dist/lib/components/collection/collection-tree.component.d.ts.map +1 -1
  18. package/dist/lib/components/collection/collection-tree.component.js +24 -17
  19. package/dist/lib/components/collection/collection-tree.component.js.map +1 -1
  20. package/dist/lib/components/collection/collections-full-view.component.d.ts +1 -0
  21. package/dist/lib/components/collection/collections-full-view.component.d.ts.map +1 -1
  22. package/dist/lib/components/collection/collections-full-view.component.js +14 -10
  23. package/dist/lib/components/collection/collections-full-view.component.js.map +1 -1
  24. package/dist/lib/components/conversation/conversation-chat-area.component.d.ts +21 -7
  25. package/dist/lib/components/conversation/conversation-chat-area.component.d.ts.map +1 -1
  26. package/dist/lib/components/conversation/conversation-chat-area.component.js +44 -14
  27. package/dist/lib/components/conversation/conversation-chat-area.component.js.map +1 -1
  28. package/dist/lib/components/conversation/conversation-list.component.d.ts +3 -0
  29. package/dist/lib/components/conversation/conversation-list.component.d.ts.map +1 -1
  30. package/dist/lib/components/conversation/conversation-list.component.js +21 -11
  31. package/dist/lib/components/conversation/conversation-list.component.js.map +1 -1
  32. package/dist/lib/components/mention/mention-editor.component.d.ts.map +1 -1
  33. package/dist/lib/components/mention/mention-editor.component.js +4 -3
  34. package/dist/lib/components/mention/mention-editor.component.js.map +1 -1
  35. package/dist/lib/components/message/conversation-message-rating.component.d.ts.map +1 -1
  36. package/dist/lib/components/message/conversation-message-rating.component.js +3 -2
  37. package/dist/lib/components/message/conversation-message-rating.component.js.map +1 -1
  38. package/dist/lib/components/message/message-input.component.d.ts.map +1 -1
  39. package/dist/lib/components/message/message-input.component.js +21 -7
  40. package/dist/lib/components/message/message-input.component.js.map +1 -1
  41. package/dist/lib/components/message/message-item.component.d.ts.map +1 -1
  42. package/dist/lib/components/message/message-item.component.js +7 -6
  43. package/dist/lib/components/message/message-item.component.js.map +1 -1
  44. package/dist/lib/components/project/project-selector.component.d.ts.map +1 -1
  45. package/dist/lib/components/project/project-selector.component.js +3 -2
  46. package/dist/lib/components/project/project-selector.component.js.map +1 -1
  47. package/dist/lib/components/task/tasks-full-view.component.d.ts.map +1 -1
  48. package/dist/lib/components/task/tasks-full-view.component.js +4 -3
  49. package/dist/lib/components/task/tasks-full-view.component.js.map +1 -1
  50. package/dist/lib/services/agent-state.service.d.ts +4 -0
  51. package/dist/lib/services/agent-state.service.d.ts.map +1 -1
  52. package/dist/lib/services/agent-state.service.js +15 -6
  53. package/dist/lib/services/agent-state.service.js.map +1 -1
  54. package/dist/lib/services/artifact-permission.service.d.ts.map +1 -1
  55. package/dist/lib/services/artifact-permission.service.js +3 -2
  56. package/dist/lib/services/artifact-permission.service.js.map +1 -1
  57. package/dist/lib/services/conversation-agent.service.d.ts.map +1 -1
  58. package/dist/lib/services/conversation-agent.service.js +5 -4
  59. package/dist/lib/services/conversation-agent.service.js.map +1 -1
  60. package/dist/lib/services/conversation-attachment.service.d.ts.map +1 -1
  61. package/dist/lib/services/conversation-attachment.service.js +2 -1
  62. package/dist/lib/services/conversation-attachment.service.js.map +1 -1
  63. package/dist/lib/services/conversation-data.service.d.ts.map +1 -1
  64. package/dist/lib/services/conversation-data.service.js +7 -6
  65. package/dist/lib/services/conversation-data.service.js.map +1 -1
  66. package/dist/lib/services/data-cache.service.d.ts.map +1 -1
  67. package/dist/lib/services/data-cache.service.js +9 -8
  68. package/dist/lib/services/data-cache.service.js.map +1 -1
  69. package/package.json +17 -17
@@ -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';\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 <kendo-dialog\n [title]=\"collection?.ID ? 'Edit Collection' : 'New Collection'\"\n (close)=\"onCancel()\"\n [width]=\"500\"\n [minWidth]=\"300\">\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 <kendo-dialog-actions>\n <button kendoButton (click)=\"onCancel()\" [disabled]=\"isSaving\">\n Cancel\n </button>\n <button kendoButton\n [primary]=\"true\"\n (click)=\"onSave()\"\n [disabled]=\"!canSave || isSaving\">\n {{ isSaving ? 'Saving...' : 'Save' }}\n </button>\n </kendo-dialog-actions>\n </kendo-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: #333;\n }\n\n .required {\n color: #DC2626;\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: #F9FAFB;\n border: 1px solid #E5E7EB;\n border-radius: 6px;\n color: #6B7280;\n }\n\n .parent-info i {\n color: #1e40af;\n }\n\n .form-error {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px;\n background: #FEE2E2;\n border: 1px solid #FCA5A5;\n border-radius: 6px;\n color: #DC2626;\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 && 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 && 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 { 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 <kendo-dialog\n [title]=\"collection?.ID ? 'Edit Collection' : 'New Collection'\"\n (close)=\"onCancel()\"\n [width]=\"500\"\n [minWidth]=\"300\">\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 <kendo-dialog-actions>\n <button kendoButton (click)=\"onCancel()\" [disabled]=\"isSaving\">\n Cancel\n </button>\n <button kendoButton\n [primary]=\"true\"\n (click)=\"onSave()\"\n [disabled]=\"!canSave || isSaving\">\n {{ isSaving ? 'Saving...' : 'Save' }}\n </button>\n </kendo-dialog-actions>\n </kendo-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: #333;\n }\n\n .required {\n color: #DC2626;\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: #F9FAFB;\n border: 1px solid #E5E7EB;\n border-radius: 6px;\n color: #6B7280;\n }\n\n .parent-info i {\n color: #1e40af;\n }\n\n .form-error {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px;\n background: #FEE2E2;\n border: 1px solid #FCA5A5;\n border-radius: 6px;\n color: #DC2626;\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 +1 @@
1
- {"version":3,"file":"collection-share-modal.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/collection/collection-share-modal.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAK5H,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAE,2BAA2B,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,8CAA8C,CAAC;AAChI,OAAO,EAAuB,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;;AAExF,UAAU,iBAAkB,SAAQ,oBAAoB;IACpD,SAAS,EAAE,OAAO,CAAC;IACnB,kBAAkB,EAAE,aAAa,CAAC;CACrC;AAED,qBA+Ma,6BAA8B,YAAW,MAAM,EAAE,SAAS;IAsB/D,OAAO,CAAC,iBAAiB;IACzB,OAAO,CAAC,GAAG;IAtBN,MAAM,EAAE,OAAO,CAAS;IACxB,UAAU,EAAE,kBAAkB,GAAG,IAAI,CAAQ;IAC7C,WAAW,EAAG,QAAQ,CAAC;IACvB,sBAAsB,EAAE,oBAAoB,GAAG,IAAI,CAAQ;IAE1D,KAAK,qBAA4B;IACjC,SAAS,qBAA4B;IAE/C,WAAW,EAAE,iBAAiB,EAAE,CAAM;IACtC,YAAY,EAAE,gBAAgB,GAAG,IAAI,CAAQ;IAC7C,oBAAoB,EAAE,MAAM,EAAE,CAAM;IACpC,oBAAoB,EAAE,OAAO,CAAS;IAEtC,cAAc,EAAE,aAAa,CAK3B;gBAGU,iBAAiB,EAAE,2BAA2B,EAC9C,GAAG,EAAE,iBAAiB;IAG5B,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAQzB,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;YAa1C,eAAe;IAiB7B,OAAO,CAAC,0BAA0B;IA0BlC,kBAAkB,IAAI,MAAM,EAAE;IAS9B,cAAc,CAAC,IAAI,EAAE,gBAAgB,GAAG,IAAI;IAK5C,gBAAgB,IAAI,IAAI;IAWlB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAqChC,gBAAgB,CAAC,UAAU,EAAE,iBAAiB,GAAG,IAAI;IAKrD,YAAY,CAAC,UAAU,EAAE,iBAAiB,GAAG,IAAI;IAW3C,gBAAgB,CAAC,UAAU,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAiC9D,kBAAkB,CAAC,UAAU,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAoBtE,QAAQ,IAAI,IAAI;yCA7NP,6BAA6B;2CAA7B,6BAA6B;CAgOzC"}
1
+ {"version":3,"file":"collection-share-modal.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/collection/collection-share-modal.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAK5H,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAE,2BAA2B,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,8CAA8C,CAAC;AAChI,OAAO,EAAuB,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;;AAGxF,UAAU,iBAAkB,SAAQ,oBAAoB;IACpD,SAAS,EAAE,OAAO,CAAC;IACnB,kBAAkB,EAAE,aAAa,CAAC;CACrC;AAED,qBA+Ma,6BAA8B,YAAW,MAAM,EAAE,SAAS;IAsB/D,OAAO,CAAC,iBAAiB;IACzB,OAAO,CAAC,GAAG;IAtBN,MAAM,EAAE,OAAO,CAAS;IACxB,UAAU,EAAE,kBAAkB,GAAG,IAAI,CAAQ;IAC7C,WAAW,EAAG,QAAQ,CAAC;IACvB,sBAAsB,EAAE,oBAAoB,GAAG,IAAI,CAAQ;IAE1D,KAAK,qBAA4B;IACjC,SAAS,qBAA4B;IAE/C,WAAW,EAAE,iBAAiB,EAAE,CAAM;IACtC,YAAY,EAAE,gBAAgB,GAAG,IAAI,CAAQ;IAC7C,oBAAoB,EAAE,MAAM,EAAE,CAAM;IACpC,oBAAoB,EAAE,OAAO,CAAS;IAEtC,cAAc,EAAE,aAAa,CAK3B;gBAGU,iBAAiB,EAAE,2BAA2B,EAC9C,GAAG,EAAE,iBAAiB;IAG5B,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAQzB,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;YAa1C,eAAe;IAiB7B,OAAO,CAAC,0BAA0B;IA0BlC,kBAAkB,IAAI,MAAM,EAAE;IAS9B,cAAc,CAAC,IAAI,EAAE,gBAAgB,GAAG,IAAI;IAK5C,gBAAgB,IAAI,IAAI;IAWlB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAqChC,gBAAgB,CAAC,UAAU,EAAE,iBAAiB,GAAG,IAAI;IAKrD,YAAY,CAAC,UAAU,EAAE,iBAAiB,GAAG,IAAI;IAW3C,gBAAgB,CAAC,UAAU,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAiC9D,kBAAkB,CAAC,UAAU,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAoBtE,QAAQ,IAAI,IAAI;yCA7NP,6BAA6B;2CAA7B,6BAA6B;CAgOzC"}
@@ -3,6 +3,7 @@ import { FormsModule } from '@angular/forms';
3
3
  import { WindowModule } from '@progress/kendo-angular-dialog';
4
4
  import { ButtonModule } from '@progress/kendo-angular-buttons';
5
5
  import { UserPickerComponent } from '../shared/user-picker.component';
6
+ import { UUIDsEqual } from '@memberjunction/global';
6
7
  import * as i0 from "@angular/core";
7
8
  import * as i1 from "../../services/collection-permission.service";
8
9
  import * as i2 from "@angular/forms";
@@ -383,7 +384,7 @@ export class CollectionShareModalComponent {
383
384
  // User is owner if:
384
385
  // 1. OwnerID is null/undefined (backwards compatibility with old collections)
385
386
  // 2. OwnerID matches current user ID
386
- const isOwner = !this.collection?.OwnerID || this.collection.OwnerID === this.currentUser.ID;
387
+ const isOwner = !this.collection?.OwnerID || UUIDsEqual(this.collection.OwnerID, this.currentUser.ID);
387
388
  // Allow modification if user is owner OR has Share permission
388
389
  this.canModifyPermissions = isOwner || (this.currentUserPermissions?.canShare || false);
389
390
  const userPerms = this.currentUserPermissions || {
@@ -428,7 +429,7 @@ export class CollectionShareModalComponent {
428
429
  return;
429
430
  try {
430
431
  // User is owner if OwnerID is null (old collections) or matches current user
431
- const isOwner = !this.collection.OwnerID || this.collection.OwnerID === this.currentUser.ID;
432
+ const isOwner = !this.collection.OwnerID || UUIDsEqual(this.collection.OwnerID, this.currentUser.ID);
432
433
  const userPerms = this.currentUserPermissions || {
433
434
  canRead: true,
434
435
  canShare: false,
@@ -468,7 +469,7 @@ export class CollectionShareModalComponent {
468
469
  async onSavePermission(permission) {
469
470
  try {
470
471
  // User is owner if OwnerID is null (old collections) or matches current user
471
- const isOwner = !this.collection?.OwnerID || this.collection?.OwnerID === this.currentUser.ID;
472
+ const isOwner = !this.collection?.OwnerID || UUIDsEqual(this.collection?.OwnerID, this.currentUser.ID);
472
473
  const userPerms = this.currentUserPermissions || {
473
474
  canRead: true,
474
475
  canShare: false,
@@ -731,5 +732,5 @@ export class CollectionShareModalComponent {
731
732
  }], cancelled: [{
732
733
  type: Output
733
734
  }] }); })();
734
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(CollectionShareModalComponent, { className: "CollectionShareModalComponent", filePath: "src/lib/components/collection/collection-share-modal.component.ts", lineNumber: 223 }); })();
735
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(CollectionShareModalComponent, { className: "CollectionShareModalComponent", filePath: "src/lib/components/collection/collection-share-modal.component.ts", lineNumber: 224 }); })();
735
736
  //# sourceMappingURL=collection-share-modal.component.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"collection-share-modal.component.js","sourceRoot":"","sources":["../../../../src/lib/components/collection/collection-share-modal.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, OnInit, OnChanges, SimpleChanges, ChangeDetectorRef } from '@angular/core';\n\nimport { FormsModule } from '@angular/forms';\nimport { WindowModule } from '@progress/kendo-angular-dialog';\nimport { ButtonModule } from '@progress/kendo-angular-buttons';\nimport { UserInfo } from '@memberjunction/core';\nimport { MJCollectionEntity } from '@memberjunction/core-entities';\nimport { CollectionPermissionService, CollectionPermission, PermissionSet } from '../../services/collection-permission.service';\nimport { UserPickerComponent, UserSearchResult } from '../shared/user-picker.component';\n\ninterface PermissionDisplay extends CollectionPermission {\n isEditing: boolean;\n editingPermissions: PermissionSet;\n}\n\n@Component({\n selector: 'mj-collection-share-modal',\n standalone: true,\n imports: [FormsModule, WindowModule, ButtonModule, UserPickerComponent],\n template: `\n @if (isOpen && collection) {\n <kendo-window\n [title]=\"'Share: ' + collection.Name\"\n [width]=\"600\"\n [height]=\"500\"\n [minWidth]=\"400\"\n [minHeight]=\"400\"\n (close)=\"onCancel()\"\n >\n <div class=\"share-modal-content\">\n <!-- Add User Section -->\n <div class=\"add-user-section\">\n <h3 class=\"section-title\">\n <i class=\"fa-solid fa-user-plus\"></i>\n Share with User\n </h3>\n\n <mj-user-picker\n [currentUser]=\"currentUser\"\n [excludeUserIds]=\"getExcludedUserIds()\"\n (userSelected)=\"onUserSelected($event)\"\n ></mj-user-picker>\n\n @if (selectedUser) {\n <div class=\"permissions-form\">\n <div class=\"selected-user-info\">\n <div class=\"user-avatar\">\n <i class=\"fa-solid fa-user\"></i>\n </div>\n <div class=\"user-details\">\n <div class=\"user-name\">{{ selectedUser.name }}</div>\n <div class=\"user-email\">{{ selectedUser.email }}</div>\n </div>\n </div>\n\n <div class=\"permissions-grid\">\n <label class=\"permission-checkbox disabled\">\n <input type=\"checkbox\" [checked]=\"true\" disabled>\n <span class=\"permission-label\">\n <i class=\"fa-solid fa-eye\"></i>\n Read\n </span>\n <span class=\"permission-desc\">View collection and artifacts</span>\n </label>\n\n @if (availablePermissions.includes('Share')) {\n <label class=\"permission-checkbox\">\n <input type=\"checkbox\" [(ngModel)]=\"newPermissions.canShare\">\n <span class=\"permission-label\">\n <i class=\"fa-solid fa-share-nodes\"></i>\n Share\n </span>\n <span class=\"permission-desc\">Share with others</span>\n </label>\n }\n\n @if (availablePermissions.includes('Edit')) {\n <label class=\"permission-checkbox\">\n <input type=\"checkbox\" [(ngModel)]=\"newPermissions.canEdit\">\n <span class=\"permission-label\">\n <i class=\"fa-solid fa-pen-to-square\"></i>\n Edit\n </span>\n <span class=\"permission-desc\">Add/remove artifacts</span>\n </label>\n }\n\n @if (availablePermissions.includes('Delete')) {\n <label class=\"permission-checkbox\">\n <input type=\"checkbox\" [(ngModel)]=\"newPermissions.canDelete\">\n <span class=\"permission-label\">\n <i class=\"fa-solid fa-trash\"></i>\n Delete\n </span>\n <span class=\"permission-desc\">Delete collection</span>\n </label>\n }\n </div>\n\n <div class=\"form-actions\">\n <button kendoButton (click)=\"onAddUser()\" [disabled]=\"!selectedUser\" class=\"btn-primary\">\n <i class=\"fa-solid fa-plus\"></i>\n Add User\n </button>\n <button kendoButton (click)=\"onClearSelection()\" class=\"btn-secondary\">\n Cancel\n </button>\n </div>\n </div>\n }\n </div>\n\n <!-- Current Permissions Section -->\n <div class=\"permissions-list-section\">\n <h3 class=\"section-title\">\n <i class=\"fa-solid fa-users\"></i>\n Shared With ({{ permissions.length }})\n </h3>\n\n @if (permissions.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-user-slash\"></i>\n <p>Not shared with anyone yet</p>\n </div>\n } @else {\n <div class=\"permissions-list\">\n @for (permission of permissions; track permission.id) {\n <div class=\"permission-item\">\n <div class=\"user-avatar\">\n <i class=\"fa-solid fa-user\"></i>\n </div>\n <div class=\"permission-details\">\n <div class=\"permission-user\">\n <span class=\"user-name\">{{ permission.userName }}</span>\n @if (permission.sharedByUserName) {\n <span class=\"shared-by\">shared by {{ permission.sharedByUserName }}</span>\n }\n </div>\n\n @if (!permission.isEditing) {\n <div class=\"permission-badges\">\n <span class=\"permission-badge\">\n <i class=\"fa-solid fa-eye\"></i> Read\n </span>\n @if (permission.canShare) {\n <span class=\"permission-badge\">\n <i class=\"fa-solid fa-share-nodes\"></i> Share\n </span>\n }\n @if (permission.canEdit) {\n <span class=\"permission-badge\">\n <i class=\"fa-solid fa-pen-to-square\"></i> Edit\n </span>\n }\n @if (permission.canDelete) {\n <span class=\"permission-badge\">\n <i class=\"fa-solid fa-trash\"></i> Delete\n </span>\n }\n </div>\n } @else {\n <div class=\"permissions-edit-grid\">\n <label class=\"permission-checkbox-small disabled\">\n <input type=\"checkbox\" [checked]=\"true\" disabled>\n <span>Read</span>\n </label>\n @if (availablePermissions.includes('Share')) {\n <label class=\"permission-checkbox-small\">\n <input type=\"checkbox\" [(ngModel)]=\"permission.editingPermissions.canShare\">\n <span>Share</span>\n </label>\n }\n @if (availablePermissions.includes('Edit')) {\n <label class=\"permission-checkbox-small\">\n <input type=\"checkbox\" [(ngModel)]=\"permission.editingPermissions.canEdit\">\n <span>Edit</span>\n </label>\n }\n @if (availablePermissions.includes('Delete')) {\n <label class=\"permission-checkbox-small\">\n <input type=\"checkbox\" [(ngModel)]=\"permission.editingPermissions.canDelete\">\n <span>Delete</span>\n </label>\n }\n </div>\n }\n </div>\n\n @if (canModifyPermissions) {\n <div class=\"permission-actions\">\n @if (!permission.isEditing) {\n <button kendoButton class=\"btn-icon\" (click)=\"onEditPermission(permission)\" title=\"Edit\">\n <i class=\"fa-solid fa-pen\"></i>\n </button>\n <button kendoButton class=\"btn-icon btn-danger\" (click)=\"onRevokePermission(permission)\" title=\"Remove\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n } @else {\n <button kendoButton class=\"btn-icon btn-success\" (click)=\"onSavePermission(permission)\" title=\"Save\">\n <i class=\"fa-solid fa-check\"></i>\n </button>\n <button kendoButton class=\"btn-icon\" (click)=\"onCancelEdit(permission)\" title=\"Cancel\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n </div>\n\n <div class=\"modal-actions\">\n <button kendoButton (click)=\"onCancel()\">Close</button>\n </div>\n </kendo-window>\n }\n `,\n styleUrls: ['./collection-share-modal.component.css']\n})\nexport class CollectionShareModalComponent implements OnInit, OnChanges {\n @Input() isOpen: boolean = false;\n @Input() collection: MJCollectionEntity | null = null;\n @Input() currentUser!: UserInfo;\n @Input() currentUserPermissions: CollectionPermission | null = null;\n\n @Output() saved = new EventEmitter<void>();\n @Output() cancelled = new EventEmitter<void>();\n\n permissions: PermissionDisplay[] = [];\n selectedUser: UserSearchResult | null = null;\n availablePermissions: string[] = [];\n canModifyPermissions: boolean = false;\n\n newPermissions: PermissionSet = {\n canRead: true,\n canShare: false,\n canEdit: false,\n canDelete: false\n };\n\n constructor(\n private permissionService: CollectionPermissionService,\n private cdr: ChangeDetectorRef\n ) {}\n\n async ngOnInit(): Promise<void> {\n if (this.collection) {\n await this.loadPermissions();\n this.updateAvailablePermissions();\n this.cdr.detectChanges(); // zone.js 0.15: sync changes after async don't trigger CD\n }\n }\n\n async ngOnChanges(changes: SimpleChanges): Promise<void> {\n // Reload permissions when modal opens or collection/permissions change\n const modalOpened = changes['isOpen']?.currentValue === true && changes['isOpen']?.previousValue === false;\n const collectionChanged = changes['collection'] && !changes['collection'].isFirstChange();\n const permissionsChanged = changes['currentUserPermissions'] && !changes['currentUserPermissions'].isFirstChange();\n\n if ((modalOpened || collectionChanged || permissionsChanged) && this.collection) {\n await this.loadPermissions();\n this.updateAvailablePermissions();\n this.cdr.detectChanges(); // zone.js 0.15: sync changes after async don't trigger CD\n }\n }\n\n private async loadPermissions(): Promise<void> {\n if (!this.collection) return;\n\n const perms = await this.permissionService.loadPermissions(this.collection.ID, this.currentUser);\n this.permissions = perms.map(p => ({\n ...p,\n isEditing: false,\n editingPermissions: {\n canRead: p.canRead,\n canShare: p.canShare,\n canEdit: p.canEdit,\n canDelete: p.canDelete\n }\n }));\n this.cdr.detectChanges();\n }\n\n private updateAvailablePermissions(): void {\n // User is owner if:\n // 1. OwnerID is null/undefined (backwards compatibility with old collections)\n // 2. OwnerID matches current user ID\n const isOwner = !this.collection?.OwnerID || this.collection.OwnerID === this.currentUser.ID;\n\n // Allow modification if user is owner OR has Share permission\n this.canModifyPermissions = isOwner || (this.currentUserPermissions?.canShare || false);\n\n const userPerms = this.currentUserPermissions || {\n canRead: true,\n canShare: false,\n canEdit: false,\n canDelete: false\n };\n\n this.availablePermissions = this.permissionService.getAvailablePermissions(userPerms, isOwner);\n console.log('Share modal permissions:', {\n collectionId: this.collection?.ID,\n ownerId: this.collection?.OwnerID,\n currentUserId: this.currentUser.ID,\n isOwner,\n availablePermissions: this.availablePermissions\n });\n }\n\n getExcludedUserIds(): string[] {\n const ids = this.permissions.map(p => p.userId);\n ids.push(this.currentUser.ID); // Can't share with yourself\n if (this.collection?.OwnerID) {\n ids.push(this.collection.OwnerID); // Owner already has all permissions\n }\n return ids;\n }\n\n onUserSelected(user: UserSearchResult): void {\n this.selectedUser = user;\n this.cdr.detectChanges();\n }\n\n onClearSelection(): void {\n this.selectedUser = null;\n this.newPermissions = {\n canRead: true,\n canShare: false,\n canEdit: false,\n canDelete: false\n };\n this.cdr.detectChanges();\n }\n\n async onAddUser(): Promise<void> {\n if (!this.selectedUser || !this.collection) return;\n\n try {\n // User is owner if OwnerID is null (old collections) or matches current user\n const isOwner = !this.collection.OwnerID || this.collection.OwnerID === this.currentUser.ID;\n const userPerms = this.currentUserPermissions || {\n canRead: true,\n canShare: false,\n canEdit: false,\n canDelete: false\n };\n\n // Validate permissions\n if (!this.permissionService.validatePermissions(this.newPermissions, userPerms, isOwner)) {\n alert('You cannot grant permissions you do not have');\n return;\n }\n\n // Use cascade grant to apply permissions to all child collections\n await this.permissionService.grantPermissionCascade(\n this.collection.ID,\n this.selectedUser.id,\n this.newPermissions,\n this.currentUser.ID,\n this.currentUser\n );\n\n await this.loadPermissions();\n this.onClearSelection();\n this.saved.emit();\n } catch (error) {\n console.error('Error adding user:', error);\n alert('Failed to add user. Please try again.');\n }\n }\n\n onEditPermission(permission: PermissionDisplay): void {\n permission.isEditing = true;\n this.cdr.detectChanges();\n }\n\n onCancelEdit(permission: PermissionDisplay): void {\n permission.isEditing = false;\n permission.editingPermissions = {\n canRead: permission.canRead,\n canShare: permission.canShare,\n canEdit: permission.canEdit,\n canDelete: permission.canDelete\n };\n this.cdr.detectChanges();\n }\n\n async onSavePermission(permission: PermissionDisplay): Promise<void> {\n try {\n // User is owner if OwnerID is null (old collections) or matches current user\n const isOwner = !this.collection?.OwnerID || this.collection?.OwnerID === this.currentUser.ID;\n const userPerms = this.currentUserPermissions || {\n canRead: true,\n canShare: false,\n canEdit: false,\n canDelete: false\n };\n\n // Validate permissions\n if (!this.permissionService.validatePermissions(permission.editingPermissions, userPerms, isOwner)) {\n alert('You cannot grant permissions you do not have');\n return;\n }\n\n // Use cascade update to apply changes to all child collections\n await this.permissionService.updatePermissionCascade(\n this.collection!.ID,\n permission.userId,\n permission.editingPermissions,\n this.currentUser\n );\n\n await this.loadPermissions();\n this.saved.emit();\n } catch (error) {\n console.error('Error updating permission:', error);\n alert('Failed to update permissions. Please try again.');\n }\n }\n\n async onRevokePermission(permission: PermissionDisplay): Promise<void> {\n if (!confirm(`Remove ${permission.userName}'s access to this collection and all its child collections?`)) {\n return;\n }\n\n try {\n // Use cascade revoke to remove access from all child collections\n await this.permissionService.revokePermissionCascade(\n this.collection!.ID,\n permission.userId,\n this.currentUser\n );\n await this.loadPermissions();\n this.saved.emit();\n } catch (error) {\n console.error('Error revoking permission:', error);\n alert('Failed to revoke permission. Please try again.');\n }\n }\n\n onCancel(): void {\n this.cancelled.emit();\n }\n}\n"]}
1
+ {"version":3,"file":"collection-share-modal.component.js","sourceRoot":"","sources":["../../../../src/lib/components/collection/collection-share-modal.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, OnInit, OnChanges, SimpleChanges, ChangeDetectorRef } from '@angular/core';\n\nimport { FormsModule } from '@angular/forms';\nimport { WindowModule } from '@progress/kendo-angular-dialog';\nimport { ButtonModule } from '@progress/kendo-angular-buttons';\nimport { UserInfo } from '@memberjunction/core';\nimport { MJCollectionEntity } from '@memberjunction/core-entities';\nimport { CollectionPermissionService, CollectionPermission, PermissionSet } from '../../services/collection-permission.service';\nimport { UserPickerComponent, UserSearchResult } from '../shared/user-picker.component';\nimport { UUIDsEqual } from '@memberjunction/global';\n\ninterface PermissionDisplay extends CollectionPermission {\n isEditing: boolean;\n editingPermissions: PermissionSet;\n}\n\n@Component({\n selector: 'mj-collection-share-modal',\n standalone: true,\n imports: [FormsModule, WindowModule, ButtonModule, UserPickerComponent],\n template: `\n @if (isOpen && collection) {\n <kendo-window\n [title]=\"'Share: ' + collection.Name\"\n [width]=\"600\"\n [height]=\"500\"\n [minWidth]=\"400\"\n [minHeight]=\"400\"\n (close)=\"onCancel()\"\n >\n <div class=\"share-modal-content\">\n <!-- Add User Section -->\n <div class=\"add-user-section\">\n <h3 class=\"section-title\">\n <i class=\"fa-solid fa-user-plus\"></i>\n Share with User\n </h3>\n\n <mj-user-picker\n [currentUser]=\"currentUser\"\n [excludeUserIds]=\"getExcludedUserIds()\"\n (userSelected)=\"onUserSelected($event)\"\n ></mj-user-picker>\n\n @if (selectedUser) {\n <div class=\"permissions-form\">\n <div class=\"selected-user-info\">\n <div class=\"user-avatar\">\n <i class=\"fa-solid fa-user\"></i>\n </div>\n <div class=\"user-details\">\n <div class=\"user-name\">{{ selectedUser.name }}</div>\n <div class=\"user-email\">{{ selectedUser.email }}</div>\n </div>\n </div>\n\n <div class=\"permissions-grid\">\n <label class=\"permission-checkbox disabled\">\n <input type=\"checkbox\" [checked]=\"true\" disabled>\n <span class=\"permission-label\">\n <i class=\"fa-solid fa-eye\"></i>\n Read\n </span>\n <span class=\"permission-desc\">View collection and artifacts</span>\n </label>\n\n @if (availablePermissions.includes('Share')) {\n <label class=\"permission-checkbox\">\n <input type=\"checkbox\" [(ngModel)]=\"newPermissions.canShare\">\n <span class=\"permission-label\">\n <i class=\"fa-solid fa-share-nodes\"></i>\n Share\n </span>\n <span class=\"permission-desc\">Share with others</span>\n </label>\n }\n\n @if (availablePermissions.includes('Edit')) {\n <label class=\"permission-checkbox\">\n <input type=\"checkbox\" [(ngModel)]=\"newPermissions.canEdit\">\n <span class=\"permission-label\">\n <i class=\"fa-solid fa-pen-to-square\"></i>\n Edit\n </span>\n <span class=\"permission-desc\">Add/remove artifacts</span>\n </label>\n }\n\n @if (availablePermissions.includes('Delete')) {\n <label class=\"permission-checkbox\">\n <input type=\"checkbox\" [(ngModel)]=\"newPermissions.canDelete\">\n <span class=\"permission-label\">\n <i class=\"fa-solid fa-trash\"></i>\n Delete\n </span>\n <span class=\"permission-desc\">Delete collection</span>\n </label>\n }\n </div>\n\n <div class=\"form-actions\">\n <button kendoButton (click)=\"onAddUser()\" [disabled]=\"!selectedUser\" class=\"btn-primary\">\n <i class=\"fa-solid fa-plus\"></i>\n Add User\n </button>\n <button kendoButton (click)=\"onClearSelection()\" class=\"btn-secondary\">\n Cancel\n </button>\n </div>\n </div>\n }\n </div>\n\n <!-- Current Permissions Section -->\n <div class=\"permissions-list-section\">\n <h3 class=\"section-title\">\n <i class=\"fa-solid fa-users\"></i>\n Shared With ({{ permissions.length }})\n </h3>\n\n @if (permissions.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-user-slash\"></i>\n <p>Not shared with anyone yet</p>\n </div>\n } @else {\n <div class=\"permissions-list\">\n @for (permission of permissions; track permission.id) {\n <div class=\"permission-item\">\n <div class=\"user-avatar\">\n <i class=\"fa-solid fa-user\"></i>\n </div>\n <div class=\"permission-details\">\n <div class=\"permission-user\">\n <span class=\"user-name\">{{ permission.userName }}</span>\n @if (permission.sharedByUserName) {\n <span class=\"shared-by\">shared by {{ permission.sharedByUserName }}</span>\n }\n </div>\n\n @if (!permission.isEditing) {\n <div class=\"permission-badges\">\n <span class=\"permission-badge\">\n <i class=\"fa-solid fa-eye\"></i> Read\n </span>\n @if (permission.canShare) {\n <span class=\"permission-badge\">\n <i class=\"fa-solid fa-share-nodes\"></i> Share\n </span>\n }\n @if (permission.canEdit) {\n <span class=\"permission-badge\">\n <i class=\"fa-solid fa-pen-to-square\"></i> Edit\n </span>\n }\n @if (permission.canDelete) {\n <span class=\"permission-badge\">\n <i class=\"fa-solid fa-trash\"></i> Delete\n </span>\n }\n </div>\n } @else {\n <div class=\"permissions-edit-grid\">\n <label class=\"permission-checkbox-small disabled\">\n <input type=\"checkbox\" [checked]=\"true\" disabled>\n <span>Read</span>\n </label>\n @if (availablePermissions.includes('Share')) {\n <label class=\"permission-checkbox-small\">\n <input type=\"checkbox\" [(ngModel)]=\"permission.editingPermissions.canShare\">\n <span>Share</span>\n </label>\n }\n @if (availablePermissions.includes('Edit')) {\n <label class=\"permission-checkbox-small\">\n <input type=\"checkbox\" [(ngModel)]=\"permission.editingPermissions.canEdit\">\n <span>Edit</span>\n </label>\n }\n @if (availablePermissions.includes('Delete')) {\n <label class=\"permission-checkbox-small\">\n <input type=\"checkbox\" [(ngModel)]=\"permission.editingPermissions.canDelete\">\n <span>Delete</span>\n </label>\n }\n </div>\n }\n </div>\n\n @if (canModifyPermissions) {\n <div class=\"permission-actions\">\n @if (!permission.isEditing) {\n <button kendoButton class=\"btn-icon\" (click)=\"onEditPermission(permission)\" title=\"Edit\">\n <i class=\"fa-solid fa-pen\"></i>\n </button>\n <button kendoButton class=\"btn-icon btn-danger\" (click)=\"onRevokePermission(permission)\" title=\"Remove\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n } @else {\n <button kendoButton class=\"btn-icon btn-success\" (click)=\"onSavePermission(permission)\" title=\"Save\">\n <i class=\"fa-solid fa-check\"></i>\n </button>\n <button kendoButton class=\"btn-icon\" (click)=\"onCancelEdit(permission)\" title=\"Cancel\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n </div>\n\n <div class=\"modal-actions\">\n <button kendoButton (click)=\"onCancel()\">Close</button>\n </div>\n </kendo-window>\n }\n `,\n styleUrls: ['./collection-share-modal.component.css']\n})\nexport class CollectionShareModalComponent implements OnInit, OnChanges {\n @Input() isOpen: boolean = false;\n @Input() collection: MJCollectionEntity | null = null;\n @Input() currentUser!: UserInfo;\n @Input() currentUserPermissions: CollectionPermission | null = null;\n\n @Output() saved = new EventEmitter<void>();\n @Output() cancelled = new EventEmitter<void>();\n\n permissions: PermissionDisplay[] = [];\n selectedUser: UserSearchResult | null = null;\n availablePermissions: string[] = [];\n canModifyPermissions: boolean = false;\n\n newPermissions: PermissionSet = {\n canRead: true,\n canShare: false,\n canEdit: false,\n canDelete: false\n };\n\n constructor(\n private permissionService: CollectionPermissionService,\n private cdr: ChangeDetectorRef\n ) {}\n\n async ngOnInit(): Promise<void> {\n if (this.collection) {\n await this.loadPermissions();\n this.updateAvailablePermissions();\n this.cdr.detectChanges(); // zone.js 0.15: sync changes after async don't trigger CD\n }\n }\n\n async ngOnChanges(changes: SimpleChanges): Promise<void> {\n // Reload permissions when modal opens or collection/permissions change\n const modalOpened = changes['isOpen']?.currentValue === true && changes['isOpen']?.previousValue === false;\n const collectionChanged = changes['collection'] && !changes['collection'].isFirstChange();\n const permissionsChanged = changes['currentUserPermissions'] && !changes['currentUserPermissions'].isFirstChange();\n\n if ((modalOpened || collectionChanged || permissionsChanged) && this.collection) {\n await this.loadPermissions();\n this.updateAvailablePermissions();\n this.cdr.detectChanges(); // zone.js 0.15: sync changes after async don't trigger CD\n }\n }\n\n private async loadPermissions(): Promise<void> {\n if (!this.collection) return;\n\n const perms = await this.permissionService.loadPermissions(this.collection.ID, this.currentUser);\n this.permissions = perms.map(p => ({\n ...p,\n isEditing: false,\n editingPermissions: {\n canRead: p.canRead,\n canShare: p.canShare,\n canEdit: p.canEdit,\n canDelete: p.canDelete\n }\n }));\n this.cdr.detectChanges();\n }\n\n private updateAvailablePermissions(): void {\n // User is owner if:\n // 1. OwnerID is null/undefined (backwards compatibility with old collections)\n // 2. OwnerID matches current user ID\n const isOwner = !this.collection?.OwnerID || UUIDsEqual(this.collection.OwnerID, this.currentUser.ID);\n\n // Allow modification if user is owner OR has Share permission\n this.canModifyPermissions = isOwner || (this.currentUserPermissions?.canShare || false);\n\n const userPerms = this.currentUserPermissions || {\n canRead: true,\n canShare: false,\n canEdit: false,\n canDelete: false\n };\n\n this.availablePermissions = this.permissionService.getAvailablePermissions(userPerms, isOwner);\n console.log('Share modal permissions:', {\n collectionId: this.collection?.ID,\n ownerId: this.collection?.OwnerID,\n currentUserId: this.currentUser.ID,\n isOwner,\n availablePermissions: this.availablePermissions\n });\n }\n\n getExcludedUserIds(): string[] {\n const ids = this.permissions.map(p => p.userId);\n ids.push(this.currentUser.ID); // Can't share with yourself\n if (this.collection?.OwnerID) {\n ids.push(this.collection.OwnerID); // Owner already has all permissions\n }\n return ids;\n }\n\n onUserSelected(user: UserSearchResult): void {\n this.selectedUser = user;\n this.cdr.detectChanges();\n }\n\n onClearSelection(): void {\n this.selectedUser = null;\n this.newPermissions = {\n canRead: true,\n canShare: false,\n canEdit: false,\n canDelete: false\n };\n this.cdr.detectChanges();\n }\n\n async onAddUser(): Promise<void> {\n if (!this.selectedUser || !this.collection) return;\n\n try {\n // User is owner if OwnerID is null (old collections) or matches current user\n const isOwner = !this.collection.OwnerID || UUIDsEqual(this.collection.OwnerID, this.currentUser.ID);\n const userPerms = this.currentUserPermissions || {\n canRead: true,\n canShare: false,\n canEdit: false,\n canDelete: false\n };\n\n // Validate permissions\n if (!this.permissionService.validatePermissions(this.newPermissions, userPerms, isOwner)) {\n alert('You cannot grant permissions you do not have');\n return;\n }\n\n // Use cascade grant to apply permissions to all child collections\n await this.permissionService.grantPermissionCascade(\n this.collection.ID,\n this.selectedUser.id,\n this.newPermissions,\n this.currentUser.ID,\n this.currentUser\n );\n\n await this.loadPermissions();\n this.onClearSelection();\n this.saved.emit();\n } catch (error) {\n console.error('Error adding user:', error);\n alert('Failed to add user. Please try again.');\n }\n }\n\n onEditPermission(permission: PermissionDisplay): void {\n permission.isEditing = true;\n this.cdr.detectChanges();\n }\n\n onCancelEdit(permission: PermissionDisplay): void {\n permission.isEditing = false;\n permission.editingPermissions = {\n canRead: permission.canRead,\n canShare: permission.canShare,\n canEdit: permission.canEdit,\n canDelete: permission.canDelete\n };\n this.cdr.detectChanges();\n }\n\n async onSavePermission(permission: PermissionDisplay): Promise<void> {\n try {\n // User is owner if OwnerID is null (old collections) or matches current user\n const isOwner = !this.collection?.OwnerID || UUIDsEqual(this.collection?.OwnerID, this.currentUser.ID);\n const userPerms = this.currentUserPermissions || {\n canRead: true,\n canShare: false,\n canEdit: false,\n canDelete: false\n };\n\n // Validate permissions\n if (!this.permissionService.validatePermissions(permission.editingPermissions, userPerms, isOwner)) {\n alert('You cannot grant permissions you do not have');\n return;\n }\n\n // Use cascade update to apply changes to all child collections\n await this.permissionService.updatePermissionCascade(\n this.collection!.ID,\n permission.userId,\n permission.editingPermissions,\n this.currentUser\n );\n\n await this.loadPermissions();\n this.saved.emit();\n } catch (error) {\n console.error('Error updating permission:', error);\n alert('Failed to update permissions. Please try again.');\n }\n }\n\n async onRevokePermission(permission: PermissionDisplay): Promise<void> {\n if (!confirm(`Remove ${permission.userName}'s access to this collection and all its child collections?`)) {\n return;\n }\n\n try {\n // Use cascade revoke to remove access from all child collections\n await this.permissionService.revokePermissionCascade(\n this.collection!.ID,\n permission.userId,\n this.currentUser\n );\n await this.loadPermissions();\n this.saved.emit();\n } catch (error) {\n console.error('Error revoking permission:', error);\n alert('Failed to revoke permission. Please try again.');\n }\n }\n\n onCancel(): void {\n this.cancelled.emit();\n }\n}\n"]}
@@ -28,6 +28,8 @@ export declare class CollectionTreeComponent implements OnInit {
28
28
  private buildTree;
29
29
  private buildNode;
30
30
  toggleNode(node: TreeNode, event: Event): void;
31
+ IsCollectionSelected(node: TreeNode): boolean;
32
+ IsCollectionDragging(node: TreeNode): boolean;
31
33
  onSelectCollection(collection: MJCollectionEntity): void;
32
34
  onCreateCollection(parentId: string | null): Promise<void>;
33
35
  onDeleteCollection(collection: MJCollectionEntity): Promise<void>;
@@ -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;;AAEjH,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;IAexC,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;IAElE,QAAQ;YAIM,eAAe;IAmB7B,OAAO,CAAC,SAAS;IAKjB,OAAO,CAAC,SAAS;IAUjB,UAAU,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI;IAK9C,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;yCAtTf,uBAAuB;2CAAvB,uBAAuB;CA0TnC"}
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;IAexC,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;IAElE,QAAQ;YAIM,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;yCA9Tf,uBAAuB;2CAAvB,uBAAuB;CAkUnC"}
@@ -1,5 +1,6 @@
1
1
  import { Component, Input, Output, EventEmitter } from '@angular/core';
2
2
  import { RunView, Metadata, LogError } from '@memberjunction/core';
3
+ import { UUIDsEqual } from '@memberjunction/global';
3
4
  import * as i0 from "@angular/core";
4
5
  import * as i1 from "../../services/collection-permission.service";
5
6
  import * as i2 from "@angular/common";
@@ -73,7 +74,7 @@ function CollectionTreeComponent_For_7_Template(rf, ctx) { if (rf & 1) {
73
74
  const ctx_r2 = i0.ɵɵnextContext();
74
75
  i0.ɵɵadvance();
75
76
  i0.ɵɵstyleProp("padding-left", node_r5.level * 20, "px");
76
- i0.ɵɵclassProp("selected", node_r5.collection.ID === ctx_r2.selectedCollectionId)("drag-over", ctx_r2.dragOverNodeId === node_r5.collection.ID)("dragging", (ctx_r2.draggedNode == null ? null : ctx_r2.draggedNode.collection == null ? null : ctx_r2.draggedNode.collection.ID) === node_r5.collection.ID);
77
+ i0.ɵɵclassProp("selected", ctx_r2.IsCollectionSelected(node_r5))("drag-over", ctx_r2.dragOverNodeId === node_r5.collection.ID)("dragging", ctx_r2.IsCollectionDragging(node_r5));
77
78
  i0.ɵɵproperty("draggable", true);
78
79
  i0.ɵɵadvance();
79
80
  i0.ɵɵconditional(node_r5.children.length > 0 ? 2 : -1);
@@ -149,7 +150,7 @@ function CollectionTreeComponent_ng_template_8_Template(rf, ctx) { if (rf & 1) {
149
150
  const ctx_r2 = i0.ɵɵnextContext();
150
151
  i0.ɵɵadvance();
151
152
  i0.ɵɵstyleProp("padding-left", node_r12.level * 20, "px");
152
- i0.ɵɵclassProp("selected", node_r12.collection.ID === ctx_r2.selectedCollectionId)("drag-over", ctx_r2.dragOverNodeId === node_r12.collection.ID)("dragging", (ctx_r2.draggedNode == null ? null : ctx_r2.draggedNode.collection == null ? null : ctx_r2.draggedNode.collection.ID) === node_r12.collection.ID);
153
+ i0.ɵɵclassProp("selected", ctx_r2.IsCollectionSelected(node_r12))("drag-over", ctx_r2.dragOverNodeId === node_r12.collection.ID)("dragging", ctx_r2.IsCollectionDragging(node_r12));
153
154
  i0.ɵɵproperty("draggable", true);
154
155
  i0.ɵɵadvance();
155
156
  i0.ɵɵconditional(node_r12.children.length > 0 ? 2 : -1);
@@ -206,7 +207,7 @@ export class CollectionTreeComponent {
206
207
  this.treeNodes = rootCollections.map(c => this.buildNode(c, 0));
207
208
  }
208
209
  buildNode(collection, level) {
209
- const children = this.collections.filter(c => c.ParentID === collection.ID);
210
+ const children = this.collections.filter(c => UUIDsEqual(c.ParentID, collection.ID));
210
211
  return {
211
212
  collection,
212
213
  children: children.map(c => this.buildNode(c, level + 1)),
@@ -218,6 +219,12 @@ export class CollectionTreeComponent {
218
219
  event.stopPropagation();
219
220
  node.expanded = !node.expanded;
220
221
  }
222
+ IsCollectionSelected(node) {
223
+ return UUIDsEqual(node.collection.ID, this.selectedCollectionId);
224
+ }
225
+ IsCollectionDragging(node) {
226
+ return UUIDsEqual(this.draggedNode?.collection?.ID, node.collection.ID);
227
+ }
221
228
  onSelectCollection(collection) {
222
229
  this.selectedCollectionId = collection.ID;
223
230
  this.collectionSelected.emit(collection);
@@ -225,10 +232,10 @@ export class CollectionTreeComponent {
225
232
  async onCreateCollection(parentId) {
226
233
  // Validate permission if creating child collection
227
234
  if (parentId) {
228
- const parentCollection = this.collections.find(c => c.ID === parentId);
235
+ const parentCollection = this.collections.find(c => UUIDsEqual(c.ID, parentId));
229
236
  if (parentCollection) {
230
237
  // Check if user has Edit permission on parent
231
- if (parentCollection.OwnerID && parentCollection.OwnerID !== this.currentUser.ID) {
238
+ if (parentCollection.OwnerID && !UUIDsEqual(parentCollection.OwnerID, this.currentUser.ID)) {
232
239
  const permission = await this.permissionService.checkPermission(parentId, this.currentUser.ID, this.currentUser);
233
240
  if (!permission?.canEdit) {
234
241
  alert('You do not have Edit permission to create a sub-collection.');
@@ -247,7 +254,7 @@ export class CollectionTreeComponent {
247
254
  collection.EnvironmentID = this.environmentId;
248
255
  if (parentId) {
249
256
  // Child collection - inherit parent's owner and set parent
250
- const parentCollection = this.collections.find(c => c.ID === parentId);
257
+ const parentCollection = this.collections.find(c => UUIDsEqual(c.ID, parentId));
251
258
  collection.ParentID = parentId;
252
259
  collection.OwnerID = parentCollection?.OwnerID || this.currentUser.ID;
253
260
  }
@@ -268,7 +275,7 @@ export class CollectionTreeComponent {
268
275
  }
269
276
  async onDeleteCollection(collection) {
270
277
  // Validate Delete permission
271
- if (collection.OwnerID && collection.OwnerID !== this.currentUser.ID) {
278
+ if (collection.OwnerID && !UUIDsEqual(collection.OwnerID, this.currentUser.ID)) {
272
279
  const permission = await this.permissionService.checkPermission(collection.ID, this.currentUser.ID, this.currentUser);
273
280
  if (!permission?.canDelete) {
274
281
  alert('You do not have Delete permission for this collection.');
@@ -308,7 +315,7 @@ export class CollectionTreeComponent {
308
315
  }
309
316
  onDragOver(event, targetNode) {
310
317
  event.preventDefault(); // Required to allow drop
311
- if (!this.draggedNode || this.draggedNode.collection.ID === targetNode.collection.ID) {
318
+ if (!this.draggedNode || UUIDsEqual(this.draggedNode.collection.ID, targetNode.collection.ID)) {
312
319
  event.dataTransfer.dropEffect = 'none';
313
320
  return;
314
321
  }
@@ -332,7 +339,7 @@ export class CollectionTreeComponent {
332
339
  return;
333
340
  }
334
341
  // Don't allow dropping on itself
335
- if (this.draggedNode.collection.ID === targetNode.collection.ID) {
342
+ if (UUIDsEqual(this.draggedNode.collection.ID, targetNode.collection.ID)) {
336
343
  this.dragOverNodeId = null;
337
344
  return;
338
345
  }
@@ -400,7 +407,7 @@ export class CollectionTreeComponent {
400
407
  }
401
408
  }
402
409
  isDescendant(potentialDescendant, ancestor) {
403
- if (potentialDescendant.collection.ParentID === ancestor.collection.ID) {
410
+ if (UUIDsEqual(potentialDescendant.collection.ParentID, ancestor.collection.ID)) {
404
411
  return true;
405
412
  }
406
413
  for (const child of ancestor.children) {
@@ -413,7 +420,7 @@ export class CollectionTreeComponent {
413
420
  // Permission checking methods
414
421
  canEdit(collection) {
415
422
  // Backwards compatibility: treat null OwnerID as owned by current user
416
- if (!collection.OwnerID || collection.OwnerID === this.currentUser.ID) {
423
+ if (!collection.OwnerID || UUIDsEqual(collection.OwnerID, this.currentUser.ID)) {
417
424
  return true;
418
425
  }
419
426
  // Check permission record
@@ -422,7 +429,7 @@ export class CollectionTreeComponent {
422
429
  }
423
430
  canDelete(collection) {
424
431
  // Backwards compatibility: treat null OwnerID as owned by current user
425
- if (!collection.OwnerID || collection.OwnerID === this.currentUser.ID) {
432
+ if (!collection.OwnerID || UUIDsEqual(collection.OwnerID, this.currentUser.ID)) {
426
433
  return true;
427
434
  }
428
435
  // Check permission record
@@ -477,9 +484,9 @@ export class CollectionTreeComponent {
477
484
  <div class="tree-node-wrapper">
478
485
  <div
479
486
  class="tree-node"
480
- [class.selected]="node.collection.ID === selectedCollectionId"
487
+ [class.selected]="IsCollectionSelected(node)"
481
488
  [class.drag-over]="dragOverNodeId === node.collection.ID"
482
- [class.dragging]="draggedNode?.collection?.ID === node.collection.ID"
489
+ [class.dragging]="IsCollectionDragging(node)"
483
490
  [style.padding-left.px]="node.level * 20"
484
491
  [draggable]="true"
485
492
  (click)="onSelectCollection(node.collection)"
@@ -525,9 +532,9 @@ export class CollectionTreeComponent {
525
532
  <div class="tree-node-wrapper">
526
533
  <div
527
534
  class="tree-node"
528
- [class.selected]="node.collection.ID === selectedCollectionId"
535
+ [class.selected]="IsCollectionSelected(node)"
529
536
  [class.drag-over]="dragOverNodeId === node.collection.ID"
530
- [class.dragging]="draggedNode?.collection?.ID === node.collection.ID"
537
+ [class.dragging]="IsCollectionDragging(node)"
531
538
  [style.padding-left.px]="node.level * 20"
532
539
  [draggable]="true"
533
540
  (click)="onSelectCollection(node.collection)"
@@ -582,5 +589,5 @@ export class CollectionTreeComponent {
582
589
  }], collectionDeleted: [{
583
590
  type: Output
584
591
  }] }); })();
585
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(CollectionTreeComponent, { className: "CollectionTreeComponent", filePath: "src/lib/components/collection/collection-tree.component.ts", lineNumber: 169 }); })();
592
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(CollectionTreeComponent, { className: "CollectionTreeComponent", filePath: "src/lib/components/collection/collection-tree.component.ts", lineNumber: 170 }); })();
586
593
  //# sourceMappingURL=collection-tree.component.js.map