@memberjunction/ng-conversations 5.34.0 → 5.35.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.
@@ -1 +1 @@
1
- {"version":3,"file":"artifact-collection-picker-modal.component.js","sourceRoot":"","sources":["../../../../src/lib/components/collection/artifact-collection-picker-modal.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, OnInit, OnChanges, SimpleChanges, ChangeDetectorRef, ViewChild, ElementRef, AfterViewInit } from '@angular/core';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\n\nimport { FormsModule } from '@angular/forms';\nimport { UserInfo, RunView, LogError } from '@memberjunction/core';\nimport { MJCollectionEntity, MJCollectionArtifactEntity } from '@memberjunction/core-entities';\nimport { MJDialogComponent, MJDialogActionsComponent, MJButtonDirective } from '@memberjunction/ng-ui-components';\nimport { SharedGenericModule } from '@memberjunction/ng-shared-generic';\nimport { ToastService } from '../../services/toast.service';\nimport { CollectionPermissionService, CollectionPermission } from '../../services/collection-permission.service';\nimport { UUIDsEqual, NormalizeUUID } from '@memberjunction/global';\n\ntype SaveStatus = 'pending' | 'saving' | 'success' | 'error';\ntype FilterMode = 'editable' | 'recent';\n\ninterface CollectionNode {\n collection: MJCollectionEntity;\n depth: number;\n expanded: boolean;\n hasChildren: boolean;\n alreadyContainsArtifact: boolean;\n /** Breadcrumb of parent names — only used in search mode */\n ancestry: string;\n}\n\ninterface SaveResult {\n collectionId: string;\n collectionName: string;\n status: SaveStatus;\n errorMessage?: string;\n}\n\n/**\n * Modal for saving an artifact version to one or more collections.\n *\n * Owns the full UX *and* the writes:\n * - Left pane: searchable, expandable tree of collections the user can edit\n * - Right pane: artifact preview + live selection chips, and (post-save) per-collection results\n * - Save runs inline (modal stays open during writes) and reports per-collection success/failure with retry\n *\n * Emits {@link completed} on full success (parent should reload bookmark state) and on user-acknowledged\n * partial failure. Emits {@link cancelled} when the user backs out without saving anything.\n */\n@Component({\n selector: 'mj-artifact-collection-picker-modal',\n standalone: true,\n imports: [\n FormsModule,\n MJDialogComponent,\n MJDialogActionsComponent,\n MJButtonDirective,\n SharedGenericModule\n ],\n template: `\n @if (isOpen) {\n <mj-dialog\n Title=\"Save to Collection\"\n (Close)=\"onCancel()\"\n [Visible]=\"true\"\n [Width]=\"960\"\n [MinWidth]=\"720\">\n <div class=\"picker-shell\">\n <!-- ============================================================ -->\n <!-- LEFT PANE · search + tree -->\n <!-- ============================================================ -->\n <div class=\"pane pane-left\">\n <div class=\"toolbar\">\n <div class=\"search\">\n <i class=\"fa-solid fa-magnifying-glass\"></i>\n <input\n #searchInput\n type=\"text\"\n [(ngModel)]=\"searchQuery\"\n (ngModelChange)=\"onSearchChange()\"\n placeholder=\"Search collections…\"\n [disabled]=\"isLoading || isSaving\" />\n @if (searchQuery) {\n <button class=\"search-clear\" (click)=\"clearSearch()\" title=\"Clear\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n }\n </div>\n <button class=\"chip-btn\"\n [class.active]=\"filterMode === 'editable'\"\n (click)=\"setFilter('editable')\"\n [disabled]=\"isSaving\">\n <i class=\"fa-solid fa-user-pen\"></i> Editable\n </button>\n <button class=\"chip-btn\"\n [class.active]=\"filterMode === 'recent'\"\n (click)=\"setFilter('recent')\"\n [disabled]=\"isSaving\">\n <i class=\"fa-solid fa-clock\"></i> Recent\n </button>\n </div>\n\n <div class=\"tree-wrap\">\n @if (isLoading) {\n <div class=\"state-block\">\n <mj-loading text=\"Loading collections…\" size=\"medium\"></mj-loading>\n </div>\n } @else if (errorMessage) {\n <div class=\"state-block error\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n <span>{{ errorMessage }}</span>\n </div>\n } @else if (visibleNodes.length === 0) {\n <div class=\"state-block muted\">\n @if (searchQuery) {\n <i class=\"fa-solid fa-magnifying-glass\"></i>\n <p>No collections match &ldquo;{{ searchQuery }}&rdquo;</p>\n <button class=\"link-btn\" (click)=\"clearSearch()\">Clear search</button>\n } @else {\n <i class=\"fa-solid fa-folder-open\"></i>\n <p>No editable collections yet</p>\n <p class=\"hint\">Create one to get started</p>\n }\n </div>\n } @else {\n <div class=\"tree\" role=\"tree\">\n @for (node of visibleNodes; track node.collection.ID) {\n <div class=\"row\"\n role=\"treeitem\"\n [class.selected]=\"isSelected(node.collection.ID)\"\n [class.already]=\"node.alreadyContainsArtifact\"\n [style.padding-left.px]=\"searchQuery ? 12 : 12 + node.depth * 18\"\n (click)=\"onRowClick(node)\">\n <span class=\"caret\" (click)=\"$event.stopPropagation(); toggleExpand(node)\">\n @if (node.hasChildren && !searchQuery) {\n <i class=\"fa-solid\" [class.fa-chevron-down]=\"node.expanded\" [class.fa-chevron-right]=\"!node.expanded\"></i>\n }\n </span>\n <span class=\"check\"\n [class.checked]=\"isSelected(node.collection.ID)\"\n [class.locked]=\"node.alreadyContainsArtifact\"\n [attr.aria-label]=\"node.alreadyContainsArtifact ? 'Already saved' : 'Toggle selection'\">\n @if (isSelected(node.collection.ID) || node.alreadyContainsArtifact) {\n <i class=\"fa-solid fa-check\"></i>\n }\n </span>\n <i class=\"fa-solid fa-folder folder-icon\"\n [style.color]=\"node.collection.Color || 'var(--mj-brand-primary)'\"></i>\n <span class=\"row-title\">\n {{ node.collection.Name }}\n @if (searchQuery && node.ancestry) {\n <span class=\"row-ancestry\">· {{ node.ancestry }}</span>\n }\n </span>\n @if (node.alreadyContainsArtifact) {\n <span class=\"row-tag success\">Already saved</span>\n }\n </div>\n }\n\n <!-- Inline \"create new\" row -->\n @if (!isSaving && !searchQuery && !showCreateForm) {\n <button class=\"row create-row\" (click)=\"openCreateForm()\">\n <span class=\"caret\"></span>\n <span class=\"check dashed\"><i class=\"fa-solid fa-plus\"></i></span>\n <span class=\"row-title\">Create new collection…</span>\n </button>\n } @else if (showCreateForm) {\n <div class=\"row create-form-row\">\n <span class=\"caret\"></span>\n <span class=\"check dashed\"><i class=\"fa-solid fa-plus\"></i></span>\n <input #newNameInput type=\"text\"\n class=\"create-input\"\n [(ngModel)]=\"newCollectionName\"\n (keydown.enter)=\"createCollection()\"\n (keydown.escape)=\"cancelCreate()\"\n placeholder=\"Collection name\"\n [disabled]=\"isCreatingCollection\" />\n <button mjButton variant=\"primary\" size=\"sm\"\n (click)=\"createCollection()\"\n [disabled]=\"isCreatingCollection || !newCollectionName.trim()\">\n @if (isCreatingCollection) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n } @else {\n Create\n }\n </button>\n <button mjButton size=\"sm\" (click)=\"cancelCreate()\" [disabled]=\"isCreatingCollection\">\n Cancel\n </button>\n </div>\n }\n </div>\n }\n </div>\n </div>\n\n <!-- ============================================================ -->\n <!-- RIGHT PANE · preview + chips / results -->\n <!-- ============================================================ -->\n <div class=\"pane pane-right\">\n <div class=\"preview-block\">\n <div class=\"block-label\">Saving</div>\n <div class=\"preview-card\">\n <div class=\"preview-thumb\"><i class=\"fa-solid fa-file-lines\"></i></div>\n <div class=\"preview-meta\">\n <div class=\"preview-name\" [title]=\"artifactName\">{{ artifactName || 'Artifact' }}</div>\n @if (artifactVersionNumber != null) {\n <span class=\"badge neutral\">v{{ artifactVersionNumber }}</span>\n }\n </div>\n </div>\n </div>\n\n <div class=\"chips-block\">\n <div class=\"block-label\">\n @if (saveResults.size > 0) {\n <span>Results</span>\n <span class=\"block-count\">{{ successCount }} / {{ saveResults.size }}</span>\n } @else {\n <span>Selected</span>\n <span class=\"block-count\">{{ selectedIds.size }}</span>\n }\n </div>\n\n @if (saveResults.size > 0) {\n <!-- Per-collection results -->\n <div class=\"chips\">\n @for (r of resultsList; track r.collectionId) {\n <div class=\"chip result\" [class.success]=\"r.status === 'success'\"\n [class.error]=\"r.status === 'error'\"\n [class.saving]=\"r.status === 'saving'\">\n <span class=\"chip-status\">\n @switch (r.status) {\n @case ('saving') { <i class=\"fa-solid fa-spinner fa-spin\"></i> }\n @case ('success') { <i class=\"fa-solid fa-check\"></i> }\n @case ('error') { <i class=\"fa-solid fa-triangle-exclamation\"></i> }\n @default { <i class=\"fa-solid fa-circle\"></i> }\n }\n </span>\n <div class=\"chip-body\">\n <div class=\"chip-name\">{{ r.collectionName }}</div>\n @if (r.status === 'error' && r.errorMessage) {\n <div class=\"chip-error\">{{ r.errorMessage }}</div>\n }\n </div>\n @if (r.status === 'error') {\n <button class=\"chip-action\" (click)=\"retryOne(r.collectionId)\" title=\"Retry\">\n <i class=\"fa-solid fa-rotate-right\"></i>\n </button>\n }\n </div>\n }\n </div>\n } @else if (selectedIds.size > 0) {\n <div class=\"chips\">\n @for (c of selectedCollections; track c.ID) {\n <div class=\"chip\">\n <i class=\"fa-solid fa-folder folder-icon\" [style.color]=\"c.Color || 'var(--mj-brand-primary)'\"></i>\n <div class=\"chip-body\">\n <div class=\"chip-name\">{{ c.Name }}</div>\n </div>\n <button class=\"chip-action\" (click)=\"deselect(c.ID)\"\n [disabled]=\"isSaving\"\n title=\"Remove\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n }\n </div>\n } @else {\n <div class=\"chips-empty\">\n <i class=\"fa-solid fa-hand-pointer\"></i>\n <p>Pick a collection on the left</p>\n </div>\n }\n </div>\n\n <div class=\"footnote\">\n <i class=\"fa-solid fa-shield-halved\"></i>\n Only collections you can edit are shown\n </div>\n </div>\n </div>\n\n <mj-dialog-actions>\n <!-- Primary on the LEFT per MJ convention -->\n @if (failedCount > 0 && !isSaving) {\n <button mjButton variant=\"primary\" (click)=\"retryFailed()\">\n <i class=\"fa-solid fa-rotate-right\"></i> Retry {{ failedCount }} failed\n </button>\n <button mjButton (click)=\"onAcknowledgeAndClose()\">Done</button>\n } @else if (saveResults.size > 0 && successCount === saveResults.size && !isSaving) {\n <!-- All succeeded — auto-closes, but render fallback button just in case -->\n <button mjButton variant=\"primary\" (click)=\"onAcknowledgeAndClose()\">\n <i class=\"fa-solid fa-check\"></i> Done\n </button>\n } @else {\n <button mjButton variant=\"primary\"\n (click)=\"onSave()\"\n [disabled]=\"selectedIds.size === 0 || isSaving\">\n @if (isSaving) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Saving to {{ selectedIds.size }}…\n } @else {\n <i class=\"fa-solid fa-bookmark\"></i>\n Save to {{ selectedIds.size }} {{ selectedIds.size === 1 ? 'collection' : 'collections' }}\n }\n </button>\n <button mjButton (click)=\"onCancel()\" [disabled]=\"isSaving\">Cancel</button>\n }\n </mj-dialog-actions>\n </mj-dialog>\n }\n `,\n styles: [`\n /* ===== Shell ===== */\n .picker-shell {\n display: grid;\n grid-template-columns: 1fr 300px;\n min-height: 460px;\n max-height: 70vh;\n gap: 0;\n margin: -8px -4px 0;\n }\n .pane { display:flex; flex-direction:column; min-height: 0; }\n .pane-left { border-right: 1px solid var(--mj-border-subtle); }\n .pane-right { background: var(--mj-bg-surface-card); }\n\n /* ===== Toolbar / search / chip filters ===== */\n .toolbar {\n display:flex; gap: 8px; padding: 10px 12px;\n border-bottom: 1px solid var(--mj-border-subtle);\n flex-wrap: wrap;\n }\n .search {\n flex: 1; min-width: 200px;\n display:flex; align-items:center; gap: 8px;\n padding: 8px 12px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid transparent;\n border-radius: 8px;\n transition: all .15s ease;\n }\n .search:focus-within {\n background: var(--mj-bg-surface);\n border-color: var(--mj-border-focus);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 18%, transparent);\n }\n .search i { color: var(--mj-text-muted); font-size: 13px; }\n .search input {\n flex: 1; border: 0; outline: 0; background: transparent;\n font-size: 13.5px; color: var(--mj-text-primary);\n min-width: 0;\n }\n .search input::placeholder { color: var(--mj-text-disabled); }\n .search-clear {\n background: transparent; border: 0; cursor: pointer;\n color: var(--mj-text-muted); padding: 2px 4px; border-radius: 4px;\n }\n .search-clear:hover { color: var(--mj-text-primary); background: var(--mj-bg-surface-hover); }\n\n .chip-btn {\n display:inline-flex; align-items:center; gap: 6px;\n padding: 7px 11px; border-radius: 8px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n color: var(--mj-text-secondary);\n font-size: 12.5px; font-weight: 600; cursor: pointer;\n transition: all .15s ease;\n }\n .chip-btn:hover:not(:disabled) { background: var(--mj-bg-surface-hover); color: var(--mj-text-primary); }\n .chip-btn.active {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n border-color: color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n }\n .chip-btn:disabled { opacity: .55; cursor: not-allowed; }\n\n /* ===== Tree ===== */\n .tree-wrap { flex: 1; overflow-y: auto; padding: 8px 8px 16px; }\n .tree { display:flex; flex-direction: column; gap: 1px; }\n .row {\n display:flex; align-items:center; gap: 10px;\n padding: 7px 12px; border-radius: 8px; cursor: pointer;\n user-select: none;\n border: 1px solid transparent;\n background: transparent;\n text-align: left;\n transition: background .12s ease;\n min-height: 36px;\n }\n .row:hover { background: var(--mj-bg-surface-hover); }\n .row.selected {\n background: color-mix(in srgb, var(--mj-brand-primary) 9%, var(--mj-bg-surface));\n border-color: color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n }\n .row.already { cursor: default; }\n .row.already:hover { background: transparent; }\n .row.already .row-title { color: var(--mj-text-secondary); }\n\n .caret {\n width: 16px; flex-shrink: 0; text-align: center;\n color: var(--mj-text-muted); font-size: 10px;\n cursor: pointer;\n }\n .caret:hover { color: var(--mj-text-primary); }\n\n .check {\n width: 18px; height: 18px; border-radius: 5px;\n border: 1.5px solid var(--mj-border-strong);\n background: var(--mj-bg-surface);\n display:flex; align-items:center; justify-content:center;\n color: transparent; font-size: 10px; flex-shrink: 0;\n transition: all .12s ease;\n }\n .check.checked {\n background: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n color: #fff;\n }\n .check.locked {\n background: var(--mj-status-success);\n border-color: var(--mj-status-success);\n color: #fff;\n }\n .check.dashed {\n border-style: dashed;\n color: var(--mj-text-muted);\n }\n\n .folder-icon { font-size: 14px; flex-shrink: 0; }\n\n .row-title {\n flex: 1; font-size: 13.5px; font-weight: 600;\n color: var(--mj-text-primary);\n white-space: nowrap; overflow: hidden; text-overflow: ellipsis;\n }\n .row-ancestry {\n font-weight: 500; color: var(--mj-text-muted); font-size: 12px;\n margin-left: 2px;\n }\n .row-tag {\n font-size: 11px; font-weight: 600; padding: 2px 8px;\n border-radius: 999px; flex-shrink: 0;\n }\n .row-tag.success {\n background: var(--mj-status-success-bg);\n color: var(--mj-status-success-text);\n border: 1px solid color-mix(in srgb, var(--mj-status-success) 35%, transparent);\n }\n\n .create-row {\n width: 100%;\n border: 1.5px dashed var(--mj-border-strong);\n color: var(--mj-text-secondary);\n margin-top: 8px;\n background: transparent;\n }\n .create-row .row-title { color: var(--mj-text-secondary); font-weight: 600; }\n .create-row:hover {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 4%, var(--mj-bg-surface));\n }\n .create-row:hover .row-title { color: var(--mj-brand-primary); }\n\n .create-form-row {\n margin-top: 8px;\n border: 1.5px solid var(--mj-border-focus);\n background: var(--mj-bg-surface);\n cursor: default;\n gap: 8px;\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n }\n .create-input {\n flex: 1; min-width: 0;\n padding: 7px 10px;\n font-size: 13.5px; color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n border: 1.5px solid var(--mj-border-strong);\n border-radius: 6px;\n outline: 0;\n transition: all .12s ease;\n }\n .create-input::placeholder {\n color: var(--mj-text-muted);\n }\n .create-input:focus {\n border-color: var(--mj-border-focus);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 20%, transparent);\n }\n\n /* ===== State blocks ===== */\n .state-block {\n display:flex; flex-direction:column; align-items:center; justify-content:center;\n padding: 48px 24px; gap: 8px; color: var(--mj-text-muted);\n text-align: center;\n }\n .state-block i { font-size: 28px; opacity: .6; }\n .state-block.error { color: var(--mj-status-error-text); }\n .state-block .hint { font-size: 12.5px; color: var(--mj-text-disabled); margin: 0; }\n .state-block .link-btn {\n background: transparent; border: 0; color: var(--mj-text-link);\n font-weight: 600; cursor: pointer; font-size: 13px; padding: 6px 12px;\n }\n .state-block .link-btn:hover { color: var(--mj-text-link-hover); text-decoration: underline; }\n .state-block p { margin: 0; font-size: 13.5px; }\n\n /* ===== Right pane ===== */\n .preview-block { padding: 16px 18px; border-bottom: 1px solid var(--mj-border-subtle); }\n .block-label {\n font-size: 11px; text-transform: uppercase; letter-spacing: .08em;\n font-weight: 700; color: var(--mj-text-muted); margin-bottom: 8px;\n display:flex; justify-content:space-between; align-items:center;\n }\n .block-count {\n color: var(--mj-brand-primary); font-size: 12px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n padding: 2px 8px; border-radius: 999px;\n }\n .preview-card {\n display:flex; gap: 12px; align-items:center;\n background: var(--mj-bg-surface); border: 1px solid var(--mj-border-default);\n border-radius: 10px; padding: 12px;\n box-shadow: 0 1px 2px rgba(15,23,42,.04);\n }\n .preview-thumb {\n width: 38px; height: 38px; border-radius: 9px; flex-shrink: 0;\n background: linear-gradient(135deg, var(--mj-color-accent-400), var(--mj-brand-primary));\n color: #fff; display:flex; align-items:center; justify-content:center;\n font-size: 14px;\n }\n .preview-meta { flex: 1; min-width: 0; display:flex; flex-direction: column; gap: 4px; }\n .preview-name {\n font-weight: 700; font-size: 13.5px; color: var(--mj-text-primary);\n white-space: nowrap; overflow: hidden; text-overflow: ellipsis;\n }\n .badge {\n display:inline-flex; align-items:center; gap: 4px;\n padding: 2px 8px; border-radius: 999px; font-size: 11px; font-weight: 600;\n width: fit-content;\n }\n .badge.neutral {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n border: 1px solid var(--mj-border-default);\n }\n\n .chips-block { flex: 1; min-height: 0; display:flex; flex-direction: column;\n padding: 16px 18px 8px; overflow-y: auto; }\n .chips { display:flex; flex-direction: column; gap: 6px; }\n .chip {\n display:flex; align-items:center; gap: 10px; padding: 8px 10px;\n background: var(--mj-bg-surface); border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n }\n .chip-body { flex: 1; min-width: 0; }\n .chip-name {\n font-weight: 600; font-size: 13px; color: var(--mj-text-primary);\n white-space: nowrap; overflow: hidden; text-overflow: ellipsis;\n }\n .chip-error {\n font-size: 11.5px; color: var(--mj-status-error-text); margin-top: 2px;\n white-space: nowrap; overflow: hidden; text-overflow: ellipsis;\n }\n .chip-action {\n width: 24px; height: 24px; border-radius: 6px;\n background: transparent; border: 0; cursor: pointer;\n color: var(--mj-text-muted); font-size: 11px;\n display:flex; align-items:center; justify-content:center;\n }\n .chip-action:hover:not(:disabled) {\n background: var(--mj-bg-surface-hover); color: var(--mj-text-primary);\n }\n .chip-action:disabled { opacity: .4; cursor: not-allowed; }\n .chip-status {\n width: 20px; flex-shrink: 0; text-align: center; font-size: 12px;\n }\n .chip.result.success { border-color: color-mix(in srgb, var(--mj-status-success) 35%, transparent);\n background: var(--mj-status-success-bg); }\n .chip.result.success .chip-status { color: var(--mj-status-success-text); }\n .chip.result.error { border-color: color-mix(in srgb, var(--mj-status-error) 35%, transparent);\n background: var(--mj-status-error-bg); }\n .chip.result.error .chip-status { color: var(--mj-status-error-text); }\n .chip.result.saving .chip-status { color: var(--mj-brand-primary); }\n\n .chips-empty {\n flex: 1; display:flex; flex-direction: column; align-items: center; justify-content: center;\n padding: 32px 16px; text-align: center; color: var(--mj-text-muted);\n border: 1.5px dashed var(--mj-border-default); border-radius: 10px;\n }\n .chips-empty i { font-size: 22px; margin-bottom: 8px; opacity: .55; }\n .chips-empty p { margin: 0; font-size: 12.5px; }\n\n .footnote {\n padding: 12px 18px;\n font-size: 11.5px; color: var(--mj-text-muted);\n display:flex; align-items:center; gap: 6px;\n border-top: 1px solid var(--mj-border-subtle);\n }\n .footnote i { font-size: 11px; }\n\n /* Tighten dialog content padding so panes meet edges cleanly */\n :host ::ng-deep mj-dialog .k-window-content,\n :host ::ng-deep mj-dialog .mj-dialog-content {\n padding: 0 !important;\n }\n `]\n})\nexport class ArtifactCollectionPickerModalComponent extends BaseAngularComponent implements OnInit, OnChanges, AfterViewInit {\n @Input() isOpen: boolean = false;\n @Input() environmentId!: string;\n @Input() currentUser!: UserInfo;\n /** Collections that already contain the *current version* — rendered with a green check and locked. */\n @Input() excludeCollectionIds: string[] = [];\n /** ID of the artifact version being saved. Required for writes. */\n @Input() artifactVersionId: string | null = null;\n /** Display-only: artifact name shown in the preview pane. */\n @Input() artifactName: string = '';\n /** Display-only: version number shown in the preview pane. */\n @Input() artifactVersionNumber: number | null = null;\n\n /** Fired when the save flow finishes (fully successful, or user acknowledged partial result). */\n @Output() completed = new EventEmitter<{ successIds: string[]; failedIds: string[] }>();\n @Output() cancelled = new EventEmitter<void>();\n\n @ViewChild('searchInput') searchInputRef?: ElementRef<HTMLInputElement>;\n @ViewChild('newNameInput') newNameInputRef?: ElementRef<HTMLInputElement>;\n\n // Data\n private allCollections: MJCollectionEntity[] = [];\n private editableCollections: MJCollectionEntity[] = [];\n private userPermissions: Map<string, CollectionPermission> = new Map();\n private collectionById: Map<string, MJCollectionEntity> = new Map();\n private expandedIds: Set<string> = new Set();\n\n // Selection (normalized UUIDs so SQL Server vs Postgres casing doesn't bite us)\n public selectedIds: Set<string> = new Set();\n\n // Filter / search\n public searchQuery: string = '';\n public filterMode: FilterMode = 'editable';\n\n // Render output\n public visibleNodes: CollectionNode[] = [];\n\n // States\n public isLoading: boolean = false;\n public isSaving: boolean = false;\n public errorMessage: string = '';\n public showCreateForm: boolean = false;\n public newCollectionName: string = '';\n public isCreatingCollection: boolean = false;\n\n // Per-collection save outcomes\n public saveResults: Map<string, SaveResult> = new Map();\n\n constructor(\n private toastService: ToastService,\n private permissionService: CollectionPermissionService,\n private cdr: ChangeDetectorRef\n ) {\n super();\n }\n\n // ============================================================\n // Lifecycle\n // ============================================================\n async ngOnInit() {\n this.permissionService.Provider = this.ProviderToUse;\n if (this.isOpen) {\n await this.loadCollections();\n }\n }\n\n async ngOnChanges(changes: SimpleChanges) {\n if (changes['isOpen']) {\n if (this.isOpen) {\n this.resetState();\n await this.loadCollections();\n // Autofocus search on next tick\n Promise.resolve().then(() => this.searchInputRef?.nativeElement?.focus());\n }\n }\n }\n\n ngAfterViewInit(): void {\n if (this.isOpen) {\n this.searchInputRef?.nativeElement?.focus();\n }\n }\n\n // ============================================================\n // Selection helpers (normalized UUIDs)\n // ============================================================\n public isSelected(id: string): boolean {\n return this.selectedIds.has(NormalizeUUID(id));\n }\n\n public get selectedCollections(): MJCollectionEntity[] {\n const list: MJCollectionEntity[] = [];\n for (const id of this.selectedIds) {\n const c = this.collectionById.get(id);\n if (c) list.push(c);\n }\n return list;\n }\n\n public get resultsList(): SaveResult[] {\n return Array.from(this.saveResults.values());\n }\n\n public get successCount(): number {\n let n = 0;\n for (const r of this.saveResults.values()) if (r.status === 'success') n++;\n return n;\n }\n\n public get failedCount(): number {\n let n = 0;\n for (const r of this.saveResults.values()) if (r.status === 'error') n++;\n return n;\n }\n\n // ============================================================\n // Load + tree build\n // ============================================================\n private resetState(): void {\n this.allCollections = [];\n this.editableCollections = [];\n this.userPermissions.clear();\n this.collectionById.clear();\n this.expandedIds.clear();\n this.selectedIds.clear();\n this.visibleNodes = [];\n this.searchQuery = '';\n this.filterMode = 'editable';\n this.errorMessage = '';\n this.showCreateForm = false;\n this.newCollectionName = '';\n this.saveResults.clear();\n this.isSaving = false;\n this.isCreatingCollection = false;\n }\n\n private async loadCollections(): Promise<void> {\n try {\n this.isLoading = true;\n this.errorMessage = '';\n\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView<MJCollectionEntity>({\n EntityName: 'MJ: Collections',\n ExtraFilter: `EnvironmentID='${this.environmentId}'`,\n OrderBy: 'Name ASC',\n ResultType: 'entity_object'\n }, this.currentUser);\n\n if (!result.Success) {\n this.errorMessage = result.ErrorMessage || 'Failed to load collections';\n return;\n }\n\n this.allCollections = result.Results || [];\n await this.loadUserPermissions();\n\n this.editableCollections = this.allCollections.filter(c => this.canEdit(c));\n this.collectionById.clear();\n for (const c of this.editableCollections) {\n this.collectionById.set(NormalizeUUID(c.ID), c);\n }\n\n this.rebuildVisibleNodes();\n } catch (error) {\n LogError(error);\n this.errorMessage = 'An error occurred while loading collections';\n } finally {\n this.isLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n private async loadUserPermissions(): Promise<void> {\n const nonOwned = this.allCollections.filter(\n c => c.OwnerID && !UUIDsEqual(c.OwnerID, this.currentUser.ID)\n );\n if (nonOwned.length === 0) return;\n\n const ids = nonOwned.map(c => c.ID);\n const permissions = await this.permissionService.checkBulkPermissions(\n ids, this.currentUser.ID, this.currentUser\n );\n permissions.forEach((permission, id) => this.userPermissions.set(id, permission));\n }\n\n private canEdit(c: MJCollectionEntity): boolean {\n if (!c.OwnerID || UUIDsEqual(c.OwnerID, this.currentUser.ID)) return true;\n return this.userPermissions.get(c.ID)?.canEdit || false;\n }\n\n // ============================================================\n // Tree rendering — flat list of CollectionNode, ordered DFS\n // ============================================================\n private rebuildVisibleNodes(): void {\n const q = this.searchQuery.trim().toLowerCase();\n if (q) {\n this.visibleNodes = this.buildSearchNodes(q);\n } else {\n this.visibleNodes = this.buildTreeNodes();\n }\n }\n\n private buildTreeNodes(): CollectionNode[] {\n const byParent = new Map<string | null, MJCollectionEntity[]>();\n for (const c of this.editableCollections) {\n const key = c.ParentID ? NormalizeUUID(c.ParentID) : null;\n const arr = byParent.get(key) || [];\n arr.push(c);\n byParent.set(key, arr);\n }\n\n const out: CollectionNode[] = [];\n const walk = (parentId: string | null, depth: number): void => {\n const children = byParent.get(parentId) || [];\n for (const c of children) {\n const id = NormalizeUUID(c.ID);\n const kids = byParent.get(id) || [];\n const hasChildren = kids.length > 0;\n out.push({\n collection: c,\n depth,\n expanded: this.expandedIds.has(id),\n hasChildren,\n alreadyContainsArtifact: this.isAlreadyAdded(c.ID),\n ancestry: ''\n });\n if (hasChildren && this.expandedIds.has(id)) {\n walk(id, depth + 1);\n }\n }\n };\n walk(null, 0);\n return out;\n }\n\n private buildSearchNodes(query: string): CollectionNode[] {\n const matches = this.editableCollections.filter(c => c.Name.toLowerCase().includes(query));\n return matches.map(c => ({\n collection: c,\n depth: 0,\n expanded: false,\n hasChildren: false,\n alreadyContainsArtifact: this.isAlreadyAdded(c.ID),\n ancestry: this.buildAncestry(c)\n }));\n }\n\n private buildAncestry(c: MJCollectionEntity): string {\n const names: string[] = [];\n let parentId = c.ParentID;\n let guard = 0;\n while (parentId && guard++ < 32) {\n const p = this.collectionById.get(NormalizeUUID(parentId));\n if (!p) break;\n names.unshift(p.Name);\n parentId = p.ParentID;\n }\n return names.join(' / ');\n }\n\n private isAlreadyAdded(id: string): boolean {\n return this.excludeCollectionIds.some(eid => UUIDsEqual(eid, id));\n }\n\n // ============================================================\n // Tree interactions\n // ============================================================\n public onRowClick(node: CollectionNode): void {\n if (this.isSaving) return;\n if (node.alreadyContainsArtifact) return;\n this.toggleSelection(node.collection);\n }\n\n public toggleSelection(c: MJCollectionEntity): void {\n const id = NormalizeUUID(c.ID);\n if (this.selectedIds.has(id)) {\n this.selectedIds.delete(id);\n } else {\n this.selectedIds.add(id);\n }\n }\n\n public deselect(id: string): void {\n if (this.isSaving) return;\n this.selectedIds.delete(NormalizeUUID(id));\n }\n\n public toggleExpand(node: CollectionNode): void {\n if (!node.hasChildren) return;\n const id = NormalizeUUID(node.collection.ID);\n if (this.expandedIds.has(id)) {\n this.expandedIds.delete(id);\n } else {\n this.expandedIds.add(id);\n }\n this.rebuildVisibleNodes();\n }\n\n public onSearchChange(): void {\n this.rebuildVisibleNodes();\n }\n\n public clearSearch(): void {\n this.searchQuery = '';\n this.rebuildVisibleNodes();\n this.searchInputRef?.nativeElement?.focus();\n }\n\n public setFilter(mode: FilterMode): void {\n this.filterMode = mode;\n // 'recent' filter is a placeholder for now — same data, future sort change.\n // Keeping the chip wired so the UI is honest and a future PR can flip the sort.\n this.rebuildVisibleNodes();\n }\n\n // ============================================================\n // Create new collection (root-level only — keeps the picker simple)\n // ============================================================\n public openCreateForm(): void {\n this.showCreateForm = true;\n // Force the @if branch to render now, then focus the input it created.\n // A microtask alone isn't enough — Angular hasn't run change detection by then,\n // so the @ViewChild ref is still undefined.\n this.cdr.detectChanges();\n this.newNameInputRef?.nativeElement?.focus();\n }\n\n public cancelCreate(): void {\n this.showCreateForm = false;\n this.newCollectionName = '';\n }\n\n public async createCollection(): Promise<void> {\n const name = this.newCollectionName.trim();\n if (!name) {\n this.toastService.warning('Please enter a collection name');\n return;\n }\n try {\n this.isCreatingCollection = true;\n const p = this.ProviderToUse;\n const collection = await p.GetEntityObject<MJCollectionEntity>('MJ: Collections', this.currentUser);\n collection.Name = name;\n collection.EnvironmentID = this.environmentId;\n collection.OwnerID = this.currentUser.ID;\n\n const saved = await collection.Save();\n if (!saved) {\n this.toastService.error(collection.LatestResult?.CompleteMessage || 'Failed to create collection');\n return;\n }\n\n // No explicit owner permission row needed — CollectionPermissionProvider treats the\n // OwnerID as an implicit full-access grant. Writing a self-share row was both redundant\n // and triggering a server-side auth failure on freshly-created collections.\n\n this.toastService.success('Collection created');\n this.cancelCreate();\n\n // Splice the new collection into local state directly. Re-running loadCollections() here\n // races with the server's cache-invalidation propagation and intermittently returns the\n // pre-create result; we already own the freshly-saved entity, so just use it.\n this.allCollections = [...this.allCollections, collection];\n this.editableCollections = [...this.editableCollections, collection];\n this.collectionById.set(NormalizeUUID(collection.ID), collection);\n // Auto-select the new one\n this.selectedIds.add(NormalizeUUID(collection.ID));\n this.rebuildVisibleNodes();\n } catch (error) {\n LogError(error);\n this.toastService.error('Failed to create collection');\n } finally {\n this.isCreatingCollection = false;\n this.cdr.detectChanges();\n }\n }\n\n // ============================================================\n // Save flow (writes happen here, dialog stays open until done)\n // ============================================================\n public async onSave(): Promise<void> {\n if (this.isSaving) return;\n if (this.selectedIds.size === 0) {\n this.toastService.warning('Pick at least one collection');\n return;\n }\n if (!this.artifactVersionId) {\n this.toastService.error('No version selected to save');\n return;\n }\n\n this.isSaving = true;\n this.saveResults.clear();\n // Seed each result as pending so they render in order\n for (const c of this.selectedCollections) {\n this.saveResults.set(NormalizeUUID(c.ID), {\n collectionId: c.ID,\n collectionName: c.Name,\n status: 'pending'\n });\n }\n this.cdr.detectChanges();\n\n for (const c of this.selectedCollections) {\n await this.saveOne(c);\n }\n\n this.isSaving = false;\n\n // Auto-close on full success\n if (this.failedCount === 0) {\n this.emitCompleted();\n } else {\n this.toastService.warning(`Saved to ${this.successCount} of ${this.saveResults.size} collections`);\n this.cdr.detectChanges();\n }\n }\n\n public async retryFailed(): Promise<void> {\n if (this.isSaving) return;\n const toRetry: MJCollectionEntity[] = [];\n for (const r of this.saveResults.values()) {\n if (r.status === 'error') {\n const c = this.collectionById.get(NormalizeUUID(r.collectionId));\n if (c) toRetry.push(c);\n }\n }\n if (toRetry.length === 0) return;\n\n this.isSaving = true;\n this.cdr.detectChanges();\n for (const c of toRetry) {\n await this.saveOne(c);\n }\n this.isSaving = false;\n\n if (this.failedCount === 0) {\n this.emitCompleted();\n } else {\n this.cdr.detectChanges();\n }\n }\n\n public async retryOne(collectionId: string): Promise<void> {\n if (this.isSaving) return;\n const c = this.collectionById.get(NormalizeUUID(collectionId));\n if (!c) return;\n this.isSaving = true;\n this.cdr.detectChanges();\n await this.saveOne(c);\n this.isSaving = false;\n if (this.failedCount === 0 && this.successCount === this.saveResults.size) {\n this.emitCompleted();\n } else {\n this.cdr.detectChanges();\n }\n }\n\n private async saveOne(collection: MJCollectionEntity): Promise<void> {\n const key = NormalizeUUID(collection.ID);\n const r = this.saveResults.get(key);\n if (!r) return;\n r.status = 'saving';\n r.errorMessage = undefined;\n this.cdr.detectChanges();\n\n try {\n const versionId = this.artifactVersionId;\n if (!versionId) {\n r.status = 'error';\n r.errorMessage = 'No artifact version selected';\n return;\n }\n\n const p = this.ProviderToUse;\n\n // Server-side cache + remote-invalidation make this idempotent in practice,\n // but we still pre-check to avoid creating duplicate junction rows in races.\n const rv = RunView.FromMetadataProvider(p);\n const existing = await rv.RunView<MJCollectionArtifactEntity>({\n EntityName: 'MJ: Collection Artifacts',\n ExtraFilter: `CollectionID='${collection.ID}' AND ArtifactVersionID='${versionId}'`,\n ResultType: 'simple',\n Fields: ['ID']\n }, this.currentUser);\n\n if (existing.Success && (existing.Results?.length ?? 0) > 0) {\n r.status = 'success';\n return;\n }\n\n const junction = await p.GetEntityObject<MJCollectionArtifactEntity>(\n 'MJ: Collection Artifacts', this.currentUser\n );\n junction.CollectionID = collection.ID;\n junction.ArtifactVersionID = versionId;\n junction.Sequence = 0;\n\n const ok = await junction.Save();\n if (ok) {\n r.status = 'success';\n } else {\n r.status = 'error';\n r.errorMessage = junction.LatestResult?.CompleteMessage || 'Save failed';\n }\n } catch (err) {\n LogError(err);\n r.status = 'error';\n r.errorMessage = err instanceof Error ? err.message : 'Unexpected error';\n }\n }\n\n // ============================================================\n // Close paths\n // ============================================================\n public onCancel(): void {\n if (this.isSaving) return; // can't close while writes are in flight\n // If any saves completed before cancel, treat it as completion so the viewer reloads\n if (this.successCount > 0) {\n this.emitCompleted();\n } else {\n this.cancelled.emit();\n }\n }\n\n public onAcknowledgeAndClose(): void {\n this.emitCompleted();\n }\n\n private emitCompleted(): void {\n const successIds: string[] = [];\n const failedIds: string[] = [];\n for (const r of this.saveResults.values()) {\n if (r.status === 'success') successIds.push(r.collectionId);\n else if (r.status === 'error') failedIds.push(r.collectionId);\n }\n this.completed.emit({ successIds, failedIds });\n }\n}\n"]}
1
+ {"version":3,"file":"artifact-collection-picker-modal.component.js","sourceRoot":"","sources":["../../../../src/lib/components/collection/artifact-collection-picker-modal.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, OnInit, OnChanges, SimpleChanges, ChangeDetectorRef, ViewChild, ElementRef, AfterViewInit } from '@angular/core';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\n\nimport { FormsModule } from '@angular/forms';\nimport { UserInfo, RunView, LogError } from '@memberjunction/core';\nimport { MJCollectionEntity, MJCollectionArtifactEntity } from '@memberjunction/core-entities';\nimport { MJDialogComponent, MJDialogActionsComponent, MJButtonDirective } from '@memberjunction/ng-ui-components';\nimport { SharedGenericModule } from '@memberjunction/ng-shared-generic';\nimport { ToastService } from '../../services/toast.service';\nimport { CollectionPermissionService, CollectionPermission } from '../../services/collection-permission.service';\nimport { UUIDsEqual, NormalizeUUID } from '@memberjunction/global';\n\ntype SaveStatus = 'pending' | 'saving' | 'success' | 'error';\ntype FilterMode = 'editable' | 'recent';\n\ninterface CollectionNode {\n collection: MJCollectionEntity;\n depth: number;\n expanded: boolean;\n hasChildren: boolean;\n alreadyContainsArtifact: boolean;\n /** Breadcrumb of parent names — only used in search mode */\n ancestry: string;\n}\n\ninterface SaveResult {\n collectionId: string;\n collectionName: string;\n status: SaveStatus;\n errorMessage?: string;\n}\n\n/**\n * Modal for saving an artifact version to one or more collections.\n *\n * Owns the full UX *and* the writes:\n * - Left pane: searchable, expandable tree of collections the user can edit\n * - Right pane: artifact preview + live selection chips, and (post-save) per-collection results\n * - Save runs inline (modal stays open during writes) and reports per-collection success/failure with retry\n *\n * Emits {@link completed} on full success (parent should reload bookmark state) and on user-acknowledged\n * partial failure. Emits {@link cancelled} when the user backs out without saving anything.\n */\n@Component({\n selector: 'mj-artifact-collection-picker-modal',\n standalone: true,\n imports: [\n FormsModule,\n MJDialogComponent,\n MJDialogActionsComponent,\n MJButtonDirective,\n SharedGenericModule\n ],\n template: `\n @if (isOpen) {\n <mj-dialog\n Title=\"Save to Collection\"\n (Close)=\"onCancel()\"\n [Visible]=\"true\"\n [Width]=\"960\"\n [MinWidth]=\"720\">\n <div class=\"picker-shell\">\n <!-- ============================================================ -->\n <!-- LEFT PANE · search + tree -->\n <!-- ============================================================ -->\n <div class=\"pane pane-left\">\n <div class=\"toolbar\">\n <div class=\"search\">\n <i class=\"fa-solid fa-magnifying-glass\"></i>\n <input\n #searchInput\n type=\"text\"\n [(ngModel)]=\"searchQuery\"\n (ngModelChange)=\"onSearchChange()\"\n placeholder=\"Search collections…\"\n [disabled]=\"isLoading || isSaving\" />\n @if (searchQuery) {\n <button class=\"search-clear\" (click)=\"clearSearch()\" title=\"Clear\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n }\n </div>\n <button class=\"chip-btn\"\n [class.active]=\"filterMode === 'editable'\"\n (click)=\"setFilter('editable')\"\n [disabled]=\"isSaving\">\n <i class=\"fa-solid fa-user-pen\"></i> Editable\n </button>\n <button class=\"chip-btn\"\n [class.active]=\"filterMode === 'recent'\"\n (click)=\"setFilter('recent')\"\n [disabled]=\"isSaving\">\n <i class=\"fa-solid fa-clock\"></i> Recent\n </button>\n </div>\n\n <div class=\"tree-wrap\">\n @if (isLoading) {\n <div class=\"state-block\">\n <mj-loading text=\"Loading collections…\" size=\"medium\"></mj-loading>\n </div>\n } @else if (errorMessage) {\n <div class=\"state-block error\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n <span>{{ errorMessage }}</span>\n </div>\n } @else if (visibleNodes.length === 0) {\n <div class=\"state-block muted\">\n @if (searchQuery) {\n <i class=\"fa-solid fa-magnifying-glass\"></i>\n <p>No collections match &ldquo;{{ searchQuery }}&rdquo;</p>\n <button class=\"link-btn\" (click)=\"clearSearch()\">Clear search</button>\n } @else {\n <i class=\"fa-solid fa-folder-open\"></i>\n <p>No editable collections yet</p>\n @if (showCreateForm) {\n <div class=\"empty-create-form\">\n <input #newNameInput type=\"text\"\n class=\"create-input\"\n [(ngModel)]=\"newCollectionName\"\n (keydown.enter)=\"createCollection()\"\n (keydown.escape)=\"cancelCreate()\"\n placeholder=\"Collection name\"\n [disabled]=\"isCreatingCollection\" />\n <div class=\"empty-create-actions\">\n <button mjButton variant=\"primary\" size=\"sm\"\n (click)=\"createCollection()\"\n [disabled]=\"isCreatingCollection || !newCollectionName.trim()\">\n @if (isCreatingCollection) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n } @else {\n Create\n }\n </button>\n <button mjButton size=\"sm\" (click)=\"cancelCreate()\" [disabled]=\"isCreatingCollection\">\n Cancel\n </button>\n </div>\n </div>\n } @else {\n <p class=\"hint\">Create one to get started</p>\n <button mjButton variant=\"primary\" size=\"sm\" (click)=\"openCreateForm()\">\n <i class=\"fa-solid fa-plus\"></i> New collection\n </button>\n }\n }\n </div>\n } @else {\n <div class=\"tree\" role=\"tree\">\n @for (node of visibleNodes; track node.collection.ID) {\n <div class=\"row\"\n role=\"treeitem\"\n [class.selected]=\"isSelected(node.collection.ID)\"\n [class.already]=\"node.alreadyContainsArtifact\"\n [style.padding-left.px]=\"searchQuery ? 12 : 12 + node.depth * 18\"\n (click)=\"onRowClick(node)\">\n <span class=\"caret\" (click)=\"$event.stopPropagation(); toggleExpand(node)\">\n @if (node.hasChildren && !searchQuery) {\n <i class=\"fa-solid\" [class.fa-chevron-down]=\"node.expanded\" [class.fa-chevron-right]=\"!node.expanded\"></i>\n }\n </span>\n <span class=\"check\"\n [class.checked]=\"isSelected(node.collection.ID)\"\n [class.locked]=\"node.alreadyContainsArtifact\"\n [attr.aria-label]=\"node.alreadyContainsArtifact ? 'Already saved' : 'Toggle selection'\">\n @if (isSelected(node.collection.ID) || node.alreadyContainsArtifact) {\n <i class=\"fa-solid fa-check\"></i>\n }\n </span>\n <i class=\"fa-solid fa-folder folder-icon\"\n [style.color]=\"node.collection.Color || 'var(--mj-brand-primary)'\"></i>\n <span class=\"row-title\">\n {{ node.collection.Name }}\n @if (searchQuery && node.ancestry) {\n <span class=\"row-ancestry\">· {{ node.ancestry }}</span>\n }\n </span>\n @if (node.alreadyContainsArtifact) {\n <span class=\"row-tag success\">Already saved</span>\n }\n </div>\n }\n\n <!-- Inline \"create new\" row -->\n @if (!isSaving && !searchQuery && !showCreateForm) {\n <button class=\"row create-row\" (click)=\"openCreateForm()\">\n <span class=\"caret\"></span>\n <span class=\"check dashed\"><i class=\"fa-solid fa-plus\"></i></span>\n <span class=\"row-title\">Create new collection…</span>\n </button>\n } @else if (showCreateForm) {\n <div class=\"row create-form-row\">\n <span class=\"caret\"></span>\n <span class=\"check dashed\"><i class=\"fa-solid fa-plus\"></i></span>\n <input #newNameInput type=\"text\"\n class=\"create-input\"\n [(ngModel)]=\"newCollectionName\"\n (keydown.enter)=\"createCollection()\"\n (keydown.escape)=\"cancelCreate()\"\n placeholder=\"Collection name\"\n [disabled]=\"isCreatingCollection\" />\n <button mjButton variant=\"primary\" size=\"sm\"\n (click)=\"createCollection()\"\n [disabled]=\"isCreatingCollection || !newCollectionName.trim()\">\n @if (isCreatingCollection) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n } @else {\n Create\n }\n </button>\n <button mjButton size=\"sm\" (click)=\"cancelCreate()\" [disabled]=\"isCreatingCollection\">\n Cancel\n </button>\n </div>\n }\n </div>\n }\n </div>\n </div>\n\n <!-- ============================================================ -->\n <!-- RIGHT PANE · preview + chips / results -->\n <!-- ============================================================ -->\n <div class=\"pane pane-right\">\n <div class=\"preview-block\">\n <div class=\"block-label\">Saving</div>\n <div class=\"preview-card\">\n <div class=\"preview-thumb\"><i class=\"fa-solid fa-file-lines\"></i></div>\n <div class=\"preview-meta\">\n <div class=\"preview-name\" [title]=\"artifactName\">{{ artifactName || 'Artifact' }}</div>\n @if (artifactVersionNumber != null) {\n <span class=\"badge neutral\">v{{ artifactVersionNumber }}</span>\n }\n </div>\n </div>\n </div>\n\n <div class=\"chips-block\">\n <div class=\"block-label\">\n @if (saveResults.size > 0) {\n <span>Results</span>\n <span class=\"block-count\">{{ successCount }} / {{ saveResults.size }}</span>\n } @else {\n <span>Selected</span>\n <span class=\"block-count\">{{ selectedIds.size }}</span>\n }\n </div>\n\n @if (saveResults.size > 0) {\n <!-- Per-collection results -->\n <div class=\"chips\">\n @for (r of resultsList; track r.collectionId) {\n <div class=\"chip result\" [class.success]=\"r.status === 'success'\"\n [class.error]=\"r.status === 'error'\"\n [class.saving]=\"r.status === 'saving'\">\n <span class=\"chip-status\">\n @switch (r.status) {\n @case ('saving') { <i class=\"fa-solid fa-spinner fa-spin\"></i> }\n @case ('success') { <i class=\"fa-solid fa-check\"></i> }\n @case ('error') { <i class=\"fa-solid fa-triangle-exclamation\"></i> }\n @default { <i class=\"fa-solid fa-circle\"></i> }\n }\n </span>\n <div class=\"chip-body\">\n <div class=\"chip-name\">{{ r.collectionName }}</div>\n @if (r.status === 'error' && r.errorMessage) {\n <div class=\"chip-error\">{{ r.errorMessage }}</div>\n }\n </div>\n @if (r.status === 'error') {\n <button class=\"chip-action\" (click)=\"retryOne(r.collectionId)\" title=\"Retry\">\n <i class=\"fa-solid fa-rotate-right\"></i>\n </button>\n }\n </div>\n }\n </div>\n } @else if (selectedIds.size > 0) {\n <div class=\"chips\">\n @for (c of selectedCollections; track c.ID) {\n <div class=\"chip\">\n <i class=\"fa-solid fa-folder folder-icon\" [style.color]=\"c.Color || 'var(--mj-brand-primary)'\"></i>\n <div class=\"chip-body\">\n <div class=\"chip-name\">{{ c.Name }}</div>\n </div>\n <button class=\"chip-action\" (click)=\"deselect(c.ID)\"\n [disabled]=\"isSaving\"\n title=\"Remove\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n }\n </div>\n } @else {\n <div class=\"chips-empty\">\n <i class=\"fa-solid fa-hand-pointer\"></i>\n <p>Pick a collection on the left</p>\n </div>\n }\n </div>\n\n <div class=\"footnote\">\n <i class=\"fa-solid fa-shield-halved\"></i>\n Only collections you can edit are shown\n </div>\n </div>\n </div>\n\n <mj-dialog-actions>\n <!-- Primary on the LEFT per MJ convention -->\n @if (failedCount > 0 && !isSaving) {\n <button mjButton variant=\"primary\" (click)=\"retryFailed()\">\n <i class=\"fa-solid fa-rotate-right\"></i> Retry {{ failedCount }} failed\n </button>\n <button mjButton (click)=\"onAcknowledgeAndClose()\">Done</button>\n } @else if (saveResults.size > 0 && successCount === saveResults.size && !isSaving) {\n <!-- All succeeded — auto-closes, but render fallback button just in case -->\n <button mjButton variant=\"primary\" (click)=\"onAcknowledgeAndClose()\">\n <i class=\"fa-solid fa-check\"></i> Done\n </button>\n } @else {\n <button mjButton variant=\"primary\"\n (click)=\"onSave()\"\n [disabled]=\"selectedIds.size === 0 || isSaving\">\n @if (isSaving) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Saving to {{ selectedIds.size }}…\n } @else {\n <i class=\"fa-solid fa-bookmark\"></i>\n Save to {{ selectedIds.size }} {{ selectedIds.size === 1 ? 'collection' : 'collections' }}\n }\n </button>\n <button mjButton (click)=\"onCancel()\" [disabled]=\"isSaving\">Cancel</button>\n }\n </mj-dialog-actions>\n </mj-dialog>\n }\n `,\n styles: [`\n /* ===== Shell ===== */\n .picker-shell {\n display: grid;\n grid-template-columns: 1fr 300px;\n min-height: 460px;\n max-height: 70vh;\n gap: 0;\n margin: -8px -4px 0;\n }\n .pane { display:flex; flex-direction:column; min-height: 0; }\n .pane-left { border-right: 1px solid var(--mj-border-subtle); }\n .pane-right { background: var(--mj-bg-surface-card); }\n\n /* ===== Toolbar / search / chip filters ===== */\n .toolbar {\n display:flex; gap: 8px; padding: 10px 12px;\n border-bottom: 1px solid var(--mj-border-subtle);\n flex-wrap: wrap;\n }\n .search {\n flex: 1; min-width: 200px;\n display:flex; align-items:center; gap: 8px;\n padding: 8px 12px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid transparent;\n border-radius: 8px;\n transition: all .15s ease;\n }\n .search:focus-within {\n background: var(--mj-bg-surface);\n border-color: var(--mj-border-focus);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 18%, transparent);\n }\n .search i { color: var(--mj-text-muted); font-size: 13px; }\n .search input {\n flex: 1; border: 0; outline: 0; background: transparent;\n font-size: 13.5px; color: var(--mj-text-primary);\n min-width: 0;\n }\n .search input::placeholder { color: var(--mj-text-disabled); }\n .search-clear {\n background: transparent; border: 0; cursor: pointer;\n color: var(--mj-text-muted); padding: 2px 4px; border-radius: 4px;\n }\n .search-clear:hover { color: var(--mj-text-primary); background: var(--mj-bg-surface-hover); }\n\n .chip-btn {\n display:inline-flex; align-items:center; gap: 6px;\n padding: 7px 11px; border-radius: 8px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n color: var(--mj-text-secondary);\n font-size: 12.5px; font-weight: 600; cursor: pointer;\n transition: all .15s ease;\n }\n .chip-btn:hover:not(:disabled) { background: var(--mj-bg-surface-hover); color: var(--mj-text-primary); }\n .chip-btn.active {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n border-color: color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n }\n .chip-btn:disabled { opacity: .55; cursor: not-allowed; }\n\n /* ===== Tree ===== */\n .tree-wrap { flex: 1; overflow-y: auto; padding: 8px 8px 16px; }\n .tree { display:flex; flex-direction: column; gap: 1px; }\n .row {\n display:flex; align-items:center; gap: 10px;\n padding: 7px 12px; border-radius: 8px; cursor: pointer;\n user-select: none;\n border: 1px solid transparent;\n background: transparent;\n text-align: left;\n transition: background .12s ease;\n min-height: 36px;\n }\n .row:hover { background: var(--mj-bg-surface-hover); }\n .row.selected {\n background: color-mix(in srgb, var(--mj-brand-primary) 9%, var(--mj-bg-surface));\n border-color: color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n }\n .row.already { cursor: default; }\n .row.already:hover { background: transparent; }\n .row.already .row-title { color: var(--mj-text-secondary); }\n\n .caret {\n width: 16px; flex-shrink: 0; text-align: center;\n color: var(--mj-text-muted); font-size: 10px;\n cursor: pointer;\n }\n .caret:hover { color: var(--mj-text-primary); }\n\n .check {\n width: 18px; height: 18px; border-radius: 5px;\n border: 1.5px solid var(--mj-border-strong);\n background: var(--mj-bg-surface);\n display:flex; align-items:center; justify-content:center;\n color: transparent; font-size: 10px; flex-shrink: 0;\n transition: all .12s ease;\n }\n .check.checked {\n background: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n color: #fff;\n }\n .check.locked {\n background: var(--mj-status-success);\n border-color: var(--mj-status-success);\n color: #fff;\n }\n .check.dashed {\n border-style: dashed;\n color: var(--mj-text-muted);\n }\n\n .folder-icon { font-size: 14px; flex-shrink: 0; }\n\n .row-title {\n flex: 1; font-size: 13.5px; font-weight: 600;\n color: var(--mj-text-primary);\n white-space: nowrap; overflow: hidden; text-overflow: ellipsis;\n }\n .row-ancestry {\n font-weight: 500; color: var(--mj-text-muted); font-size: 12px;\n margin-left: 2px;\n }\n .row-tag {\n font-size: 11px; font-weight: 600; padding: 2px 8px;\n border-radius: 999px; flex-shrink: 0;\n }\n .row-tag.success {\n background: var(--mj-status-success-bg);\n color: var(--mj-status-success-text);\n border: 1px solid color-mix(in srgb, var(--mj-status-success) 35%, transparent);\n }\n\n .create-row {\n width: 100%;\n border: 1.5px dashed var(--mj-border-strong);\n color: var(--mj-text-secondary);\n margin-top: 8px;\n background: transparent;\n }\n .create-row .row-title { color: var(--mj-text-secondary); font-weight: 600; }\n .create-row:hover {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 4%, var(--mj-bg-surface));\n }\n .create-row:hover .row-title { color: var(--mj-brand-primary); }\n\n .create-form-row {\n margin-top: 8px;\n border: 1.5px solid var(--mj-border-focus);\n background: var(--mj-bg-surface);\n cursor: default;\n gap: 8px;\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n }\n .create-input {\n flex: 1; min-width: 0;\n padding: 7px 10px;\n font-size: 13.5px; color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n border: 1.5px solid var(--mj-border-strong);\n border-radius: 6px;\n outline: 0;\n transition: all .12s ease;\n }\n .create-input::placeholder {\n color: var(--mj-text-muted);\n }\n .create-input:focus {\n border-color: var(--mj-border-focus);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 20%, transparent);\n }\n\n /* ===== State blocks ===== */\n .state-block {\n display:flex; flex-direction:column; align-items:center; justify-content:center;\n padding: 48px 24px; gap: 8px; color: var(--mj-text-muted);\n text-align: center;\n }\n .state-block i { font-size: 28px; opacity: .6; }\n .state-block.error { color: var(--mj-status-error-text); }\n .state-block .hint { font-size: 12.5px; color: var(--mj-text-disabled); margin: 0; }\n .state-block .link-btn {\n background: transparent; border: 0; color: var(--mj-text-link);\n font-weight: 600; cursor: pointer; font-size: 13px; padding: 6px 12px;\n }\n .state-block .link-btn:hover { color: var(--mj-text-link-hover); text-decoration: underline; }\n .state-block p { margin: 0; font-size: 13.5px; }\n /* Buttons inside state blocks: keep their icons at button scale, not the 28px empty-state glyph size */\n .state-block button i { font-size: inherit; opacity: 1; }\n .empty-create-form {\n display: flex; flex-direction: column; gap: 8px;\n width: 100%; max-width: 280px; margin-top: 4px;\n }\n .empty-create-actions { display: flex; gap: 8px; justify-content: center; }\n\n /* ===== Right pane ===== */\n .preview-block { padding: 16px 18px; border-bottom: 1px solid var(--mj-border-subtle); }\n .block-label {\n font-size: 11px; text-transform: uppercase; letter-spacing: .08em;\n font-weight: 700; color: var(--mj-text-muted); margin-bottom: 8px;\n display:flex; justify-content:space-between; align-items:center;\n }\n .block-count {\n color: var(--mj-brand-primary); font-size: 12px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n padding: 2px 8px; border-radius: 999px;\n }\n .preview-card {\n display:flex; gap: 12px; align-items:center;\n background: var(--mj-bg-surface); border: 1px solid var(--mj-border-default);\n border-radius: 10px; padding: 12px;\n box-shadow: 0 1px 2px rgba(15,23,42,.04);\n }\n .preview-thumb {\n width: 38px; height: 38px; border-radius: 9px; flex-shrink: 0;\n background: linear-gradient(135deg, var(--mj-color-accent-400), var(--mj-brand-primary));\n color: #fff; display:flex; align-items:center; justify-content:center;\n font-size: 14px;\n }\n .preview-meta { flex: 1; min-width: 0; display:flex; flex-direction: column; gap: 4px; }\n .preview-name {\n font-weight: 700; font-size: 13.5px; color: var(--mj-text-primary);\n white-space: nowrap; overflow: hidden; text-overflow: ellipsis;\n }\n .badge {\n display:inline-flex; align-items:center; gap: 4px;\n padding: 2px 8px; border-radius: 999px; font-size: 11px; font-weight: 600;\n width: fit-content;\n }\n .badge.neutral {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n border: 1px solid var(--mj-border-default);\n }\n\n .chips-block { flex: 1; min-height: 0; display:flex; flex-direction: column;\n padding: 16px 18px 8px; overflow-y: auto; }\n .chips { display:flex; flex-direction: column; gap: 6px; }\n .chip {\n display:flex; align-items:center; gap: 10px; padding: 8px 10px;\n background: var(--mj-bg-surface); border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n }\n .chip-body { flex: 1; min-width: 0; }\n .chip-name {\n font-weight: 600; font-size: 13px; color: var(--mj-text-primary);\n white-space: nowrap; overflow: hidden; text-overflow: ellipsis;\n }\n .chip-error {\n font-size: 11.5px; color: var(--mj-status-error-text); margin-top: 2px;\n white-space: nowrap; overflow: hidden; text-overflow: ellipsis;\n }\n .chip-action {\n width: 24px; height: 24px; border-radius: 6px;\n background: transparent; border: 0; cursor: pointer;\n color: var(--mj-text-muted); font-size: 11px;\n display:flex; align-items:center; justify-content:center;\n }\n .chip-action:hover:not(:disabled) {\n background: var(--mj-bg-surface-hover); color: var(--mj-text-primary);\n }\n .chip-action:disabled { opacity: .4; cursor: not-allowed; }\n .chip-status {\n width: 20px; flex-shrink: 0; text-align: center; font-size: 12px;\n }\n .chip.result.success { border-color: color-mix(in srgb, var(--mj-status-success) 35%, transparent);\n background: var(--mj-status-success-bg); }\n .chip.result.success .chip-status { color: var(--mj-status-success-text); }\n .chip.result.error { border-color: color-mix(in srgb, var(--mj-status-error) 35%, transparent);\n background: var(--mj-status-error-bg); }\n .chip.result.error .chip-status { color: var(--mj-status-error-text); }\n .chip.result.saving .chip-status { color: var(--mj-brand-primary); }\n\n .chips-empty {\n flex: 1; display:flex; flex-direction: column; align-items: center; justify-content: center;\n padding: 32px 16px; text-align: center; color: var(--mj-text-muted);\n border: 1.5px dashed var(--mj-border-default); border-radius: 10px;\n }\n .chips-empty i { font-size: 22px; margin-bottom: 8px; opacity: .55; }\n .chips-empty p { margin: 0; font-size: 12.5px; }\n\n .footnote {\n padding: 12px 18px;\n font-size: 11.5px; color: var(--mj-text-muted);\n display:flex; align-items:center; gap: 6px;\n border-top: 1px solid var(--mj-border-subtle);\n }\n .footnote i { font-size: 11px; }\n\n /* Tighten dialog content padding so panes meet edges cleanly */\n :host ::ng-deep mj-dialog .k-window-content,\n :host ::ng-deep mj-dialog .mj-dialog-content {\n padding: 0 !important;\n }\n `]\n})\nexport class ArtifactCollectionPickerModalComponent extends BaseAngularComponent implements OnInit, OnChanges, AfterViewInit {\n @Input() isOpen: boolean = false;\n @Input() environmentId!: string;\n @Input() currentUser!: UserInfo;\n /** Collections that already contain the *current version* — rendered with a green check and locked. */\n @Input() excludeCollectionIds: string[] = [];\n /** ID of the artifact version being saved. Required for writes. */\n @Input() artifactVersionId: string | null = null;\n /** Display-only: artifact name shown in the preview pane. */\n @Input() artifactName: string = '';\n /** Display-only: version number shown in the preview pane. */\n @Input() artifactVersionNumber: number | null = null;\n\n /** Fired when the save flow finishes (fully successful, or user acknowledged partial result). */\n @Output() completed = new EventEmitter<{ successIds: string[]; failedIds: string[] }>();\n @Output() cancelled = new EventEmitter<void>();\n\n @ViewChild('searchInput') searchInputRef?: ElementRef<HTMLInputElement>;\n @ViewChild('newNameInput') newNameInputRef?: ElementRef<HTMLInputElement>;\n\n // Data\n private allCollections: MJCollectionEntity[] = [];\n private editableCollections: MJCollectionEntity[] = [];\n private userPermissions: Map<string, CollectionPermission> = new Map();\n private collectionById: Map<string, MJCollectionEntity> = new Map();\n private expandedIds: Set<string> = new Set();\n\n // Selection (normalized UUIDs so SQL Server vs Postgres casing doesn't bite us)\n public selectedIds: Set<string> = new Set();\n\n // Filter / search\n public searchQuery: string = '';\n public filterMode: FilterMode = 'editable';\n\n // Render output\n public visibleNodes: CollectionNode[] = [];\n\n // States\n public isLoading: boolean = false;\n public isSaving: boolean = false;\n public errorMessage: string = '';\n public showCreateForm: boolean = false;\n public newCollectionName: string = '';\n public isCreatingCollection: boolean = false;\n\n // Per-collection save outcomes\n public saveResults: Map<string, SaveResult> = new Map();\n\n constructor(\n private toastService: ToastService,\n private permissionService: CollectionPermissionService,\n private cdr: ChangeDetectorRef\n ) {\n super();\n }\n\n // ============================================================\n // Lifecycle\n // ============================================================\n async ngOnInit() {\n this.permissionService.Provider = this.ProviderToUse;\n if (this.isOpen) {\n await this.loadCollections();\n }\n }\n\n async ngOnChanges(changes: SimpleChanges) {\n if (changes['isOpen']) {\n if (this.isOpen) {\n this.resetState();\n await this.loadCollections();\n // Autofocus search on next tick\n Promise.resolve().then(() => this.searchInputRef?.nativeElement?.focus());\n }\n }\n }\n\n ngAfterViewInit(): void {\n if (this.isOpen) {\n this.searchInputRef?.nativeElement?.focus();\n }\n }\n\n // ============================================================\n // Selection helpers (normalized UUIDs)\n // ============================================================\n public isSelected(id: string): boolean {\n return this.selectedIds.has(NormalizeUUID(id));\n }\n\n public get selectedCollections(): MJCollectionEntity[] {\n const list: MJCollectionEntity[] = [];\n for (const id of this.selectedIds) {\n const c = this.collectionById.get(id);\n if (c) list.push(c);\n }\n return list;\n }\n\n public get resultsList(): SaveResult[] {\n return Array.from(this.saveResults.values());\n }\n\n public get successCount(): number {\n let n = 0;\n for (const r of this.saveResults.values()) if (r.status === 'success') n++;\n return n;\n }\n\n public get failedCount(): number {\n let n = 0;\n for (const r of this.saveResults.values()) if (r.status === 'error') n++;\n return n;\n }\n\n // ============================================================\n // Load + tree build\n // ============================================================\n private resetState(): void {\n this.allCollections = [];\n this.editableCollections = [];\n this.userPermissions.clear();\n this.collectionById.clear();\n this.expandedIds.clear();\n this.selectedIds.clear();\n this.visibleNodes = [];\n this.searchQuery = '';\n this.filterMode = 'editable';\n this.errorMessage = '';\n this.showCreateForm = false;\n this.newCollectionName = '';\n this.saveResults.clear();\n this.isSaving = false;\n this.isCreatingCollection = false;\n }\n\n private async loadCollections(): Promise<void> {\n try {\n this.isLoading = true;\n this.errorMessage = '';\n\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView<MJCollectionEntity>({\n EntityName: 'MJ: Collections',\n ExtraFilter: `EnvironmentID='${this.environmentId}'`,\n OrderBy: 'Name ASC',\n ResultType: 'entity_object'\n }, this.currentUser);\n\n if (!result.Success) {\n this.errorMessage = result.ErrorMessage || 'Failed to load collections';\n return;\n }\n\n this.allCollections = result.Results || [];\n await this.loadUserPermissions();\n\n this.editableCollections = this.allCollections.filter(c => this.canEdit(c));\n this.collectionById.clear();\n for (const c of this.editableCollections) {\n this.collectionById.set(NormalizeUUID(c.ID), c);\n }\n\n this.rebuildVisibleNodes();\n } catch (error) {\n LogError(error);\n this.errorMessage = 'An error occurred while loading collections';\n } finally {\n this.isLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n private async loadUserPermissions(): Promise<void> {\n const nonOwned = this.allCollections.filter(\n c => c.OwnerID && !UUIDsEqual(c.OwnerID, this.currentUser.ID)\n );\n if (nonOwned.length === 0) return;\n\n const ids = nonOwned.map(c => c.ID);\n const permissions = await this.permissionService.checkBulkPermissions(\n ids, this.currentUser.ID, this.currentUser\n );\n permissions.forEach((permission, id) => this.userPermissions.set(id, permission));\n }\n\n private canEdit(c: MJCollectionEntity): boolean {\n if (!c.OwnerID || UUIDsEqual(c.OwnerID, this.currentUser.ID)) return true;\n return this.userPermissions.get(c.ID)?.canEdit || false;\n }\n\n // ============================================================\n // Tree rendering — flat list of CollectionNode, ordered DFS\n // ============================================================\n private rebuildVisibleNodes(): void {\n const q = this.searchQuery.trim().toLowerCase();\n if (q) {\n this.visibleNodes = this.buildSearchNodes(q);\n } else {\n this.visibleNodes = this.buildTreeNodes();\n }\n }\n\n private buildTreeNodes(): CollectionNode[] {\n const byParent = new Map<string | null, MJCollectionEntity[]>();\n for (const c of this.editableCollections) {\n const key = c.ParentID ? NormalizeUUID(c.ParentID) : null;\n const arr = byParent.get(key) || [];\n arr.push(c);\n byParent.set(key, arr);\n }\n\n const out: CollectionNode[] = [];\n const walk = (parentId: string | null, depth: number): void => {\n const children = byParent.get(parentId) || [];\n for (const c of children) {\n const id = NormalizeUUID(c.ID);\n const kids = byParent.get(id) || [];\n const hasChildren = kids.length > 0;\n out.push({\n collection: c,\n depth,\n expanded: this.expandedIds.has(id),\n hasChildren,\n alreadyContainsArtifact: this.isAlreadyAdded(c.ID),\n ancestry: ''\n });\n if (hasChildren && this.expandedIds.has(id)) {\n walk(id, depth + 1);\n }\n }\n };\n walk(null, 0);\n return out;\n }\n\n private buildSearchNodes(query: string): CollectionNode[] {\n const matches = this.editableCollections.filter(c => c.Name.toLowerCase().includes(query));\n return matches.map(c => ({\n collection: c,\n depth: 0,\n expanded: false,\n hasChildren: false,\n alreadyContainsArtifact: this.isAlreadyAdded(c.ID),\n ancestry: this.buildAncestry(c)\n }));\n }\n\n private buildAncestry(c: MJCollectionEntity): string {\n const names: string[] = [];\n let parentId = c.ParentID;\n let guard = 0;\n while (parentId && guard++ < 32) {\n const p = this.collectionById.get(NormalizeUUID(parentId));\n if (!p) break;\n names.unshift(p.Name);\n parentId = p.ParentID;\n }\n return names.join(' / ');\n }\n\n private isAlreadyAdded(id: string): boolean {\n return this.excludeCollectionIds.some(eid => UUIDsEqual(eid, id));\n }\n\n // ============================================================\n // Tree interactions\n // ============================================================\n public onRowClick(node: CollectionNode): void {\n if (this.isSaving) return;\n if (node.alreadyContainsArtifact) return;\n this.toggleSelection(node.collection);\n }\n\n public toggleSelection(c: MJCollectionEntity): void {\n const id = NormalizeUUID(c.ID);\n if (this.selectedIds.has(id)) {\n this.selectedIds.delete(id);\n } else {\n this.selectedIds.add(id);\n }\n }\n\n public deselect(id: string): void {\n if (this.isSaving) return;\n this.selectedIds.delete(NormalizeUUID(id));\n }\n\n public toggleExpand(node: CollectionNode): void {\n if (!node.hasChildren) return;\n const id = NormalizeUUID(node.collection.ID);\n if (this.expandedIds.has(id)) {\n this.expandedIds.delete(id);\n } else {\n this.expandedIds.add(id);\n }\n this.rebuildVisibleNodes();\n }\n\n public onSearchChange(): void {\n this.rebuildVisibleNodes();\n }\n\n public clearSearch(): void {\n this.searchQuery = '';\n this.rebuildVisibleNodes();\n this.searchInputRef?.nativeElement?.focus();\n }\n\n public setFilter(mode: FilterMode): void {\n this.filterMode = mode;\n // 'recent' filter is a placeholder for now — same data, future sort change.\n // Keeping the chip wired so the UI is honest and a future PR can flip the sort.\n this.rebuildVisibleNodes();\n }\n\n // ============================================================\n // Create new collection (root-level only — keeps the picker simple)\n // ============================================================\n public openCreateForm(): void {\n this.showCreateForm = true;\n // Force the @if branch to render now, then focus the input it created.\n // A microtask alone isn't enough — Angular hasn't run change detection by then,\n // so the @ViewChild ref is still undefined.\n this.cdr.detectChanges();\n this.newNameInputRef?.nativeElement?.focus();\n }\n\n public cancelCreate(): void {\n this.showCreateForm = false;\n this.newCollectionName = '';\n }\n\n public async createCollection(): Promise<void> {\n const name = this.newCollectionName.trim();\n if (!name) {\n this.toastService.warning('Please enter a collection name');\n return;\n }\n try {\n this.isCreatingCollection = true;\n const p = this.ProviderToUse;\n const collection = await p.GetEntityObject<MJCollectionEntity>('MJ: Collections', this.currentUser);\n collection.Name = name;\n collection.EnvironmentID = this.environmentId;\n collection.OwnerID = this.currentUser.ID;\n\n const saved = await collection.Save();\n if (!saved) {\n this.toastService.error(collection.LatestResult?.CompleteMessage || 'Failed to create collection');\n return;\n }\n\n // No explicit owner permission row needed — CollectionPermissionProvider treats the\n // OwnerID as an implicit full-access grant. Writing a self-share row was both redundant\n // and triggering a server-side auth failure on freshly-created collections.\n\n this.toastService.success('Collection created');\n this.cancelCreate();\n\n // Splice the new collection into local state directly. Re-running loadCollections() here\n // races with the server's cache-invalidation propagation and intermittently returns the\n // pre-create result; we already own the freshly-saved entity, so just use it.\n this.allCollections = [...this.allCollections, collection];\n this.editableCollections = [...this.editableCollections, collection];\n this.collectionById.set(NormalizeUUID(collection.ID), collection);\n // Auto-select the new one\n this.selectedIds.add(NormalizeUUID(collection.ID));\n this.rebuildVisibleNodes();\n } catch (error) {\n LogError(error);\n this.toastService.error('Failed to create collection');\n } finally {\n this.isCreatingCollection = false;\n this.cdr.detectChanges();\n }\n }\n\n // ============================================================\n // Save flow (writes happen here, dialog stays open until done)\n // ============================================================\n public async onSave(): Promise<void> {\n if (this.isSaving) return;\n if (this.selectedIds.size === 0) {\n this.toastService.warning('Pick at least one collection');\n return;\n }\n if (!this.artifactVersionId) {\n this.toastService.error('No version selected to save');\n return;\n }\n\n this.isSaving = true;\n this.saveResults.clear();\n // Seed each result as pending so they render in order\n for (const c of this.selectedCollections) {\n this.saveResults.set(NormalizeUUID(c.ID), {\n collectionId: c.ID,\n collectionName: c.Name,\n status: 'pending'\n });\n }\n this.cdr.detectChanges();\n\n for (const c of this.selectedCollections) {\n await this.saveOne(c);\n }\n\n this.isSaving = false;\n\n // Auto-close on full success\n if (this.failedCount === 0) {\n this.emitCompleted();\n } else {\n this.toastService.warning(`Saved to ${this.successCount} of ${this.saveResults.size} collections`);\n this.cdr.detectChanges();\n }\n }\n\n public async retryFailed(): Promise<void> {\n if (this.isSaving) return;\n const toRetry: MJCollectionEntity[] = [];\n for (const r of this.saveResults.values()) {\n if (r.status === 'error') {\n const c = this.collectionById.get(NormalizeUUID(r.collectionId));\n if (c) toRetry.push(c);\n }\n }\n if (toRetry.length === 0) return;\n\n this.isSaving = true;\n this.cdr.detectChanges();\n for (const c of toRetry) {\n await this.saveOne(c);\n }\n this.isSaving = false;\n\n if (this.failedCount === 0) {\n this.emitCompleted();\n } else {\n this.cdr.detectChanges();\n }\n }\n\n public async retryOne(collectionId: string): Promise<void> {\n if (this.isSaving) return;\n const c = this.collectionById.get(NormalizeUUID(collectionId));\n if (!c) return;\n this.isSaving = true;\n this.cdr.detectChanges();\n await this.saveOne(c);\n this.isSaving = false;\n if (this.failedCount === 0 && this.successCount === this.saveResults.size) {\n this.emitCompleted();\n } else {\n this.cdr.detectChanges();\n }\n }\n\n private async saveOne(collection: MJCollectionEntity): Promise<void> {\n const key = NormalizeUUID(collection.ID);\n const r = this.saveResults.get(key);\n if (!r) return;\n r.status = 'saving';\n r.errorMessage = undefined;\n this.cdr.detectChanges();\n\n try {\n const versionId = this.artifactVersionId;\n if (!versionId) {\n r.status = 'error';\n r.errorMessage = 'No artifact version selected';\n return;\n }\n\n const p = this.ProviderToUse;\n\n // Server-side cache + remote-invalidation make this idempotent in practice,\n // but we still pre-check to avoid creating duplicate junction rows in races.\n const rv = RunView.FromMetadataProvider(p);\n const existing = await rv.RunView<MJCollectionArtifactEntity>({\n EntityName: 'MJ: Collection Artifacts',\n ExtraFilter: `CollectionID='${collection.ID}' AND ArtifactVersionID='${versionId}'`,\n ResultType: 'simple',\n Fields: ['ID']\n }, this.currentUser);\n\n if (existing.Success && (existing.Results?.length ?? 0) > 0) {\n r.status = 'success';\n return;\n }\n\n const junction = await p.GetEntityObject<MJCollectionArtifactEntity>(\n 'MJ: Collection Artifacts', this.currentUser\n );\n junction.CollectionID = collection.ID;\n junction.ArtifactVersionID = versionId;\n junction.Sequence = 0;\n\n const ok = await junction.Save();\n if (ok) {\n r.status = 'success';\n } else {\n r.status = 'error';\n r.errorMessage = junction.LatestResult?.CompleteMessage || 'Save failed';\n }\n } catch (err) {\n LogError(err);\n r.status = 'error';\n r.errorMessage = err instanceof Error ? err.message : 'Unexpected error';\n }\n }\n\n // ============================================================\n // Close paths\n // ============================================================\n public onCancel(): void {\n if (this.isSaving) return; // can't close while writes are in flight\n // If any saves completed before cancel, treat it as completion so the viewer reloads\n if (this.successCount > 0) {\n this.emitCompleted();\n } else {\n this.cancelled.emit();\n }\n }\n\n public onAcknowledgeAndClose(): void {\n this.emitCompleted();\n }\n\n private emitCompleted(): void {\n const successIds: string[] = [];\n const failedIds: string[] = [];\n for (const r of this.saveResults.values()) {\n if (r.status === 'success') successIds.push(r.collectionId);\n else if (r.status === 'error') failedIds.push(r.collectionId);\n }\n this.completed.emit({ successIds, failedIds });\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"message-input.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/message/message-input.component.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"message-input.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/message/message-input.component.ts"],"names":[],"mappings":"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"}
@@ -346,17 +346,36 @@ export class MessageInputComponent extends BaseAngularComponent {
346
346
  this.isUploadingAttachments = true;
347
347
  this.uploadingMessage = `Uploading ${attachmentsToSave.length} attachment${attachmentsToSave.length > 1 ? 's' : ''}...`;
348
348
  this.uploadStateChanged.emit({ isUploading: true, message: this.uploadingMessage });
349
+ let attachmentRejection = null;
349
350
  try {
350
351
  await this.attachmentService.saveAttachments(messageDetail.ID, attachmentsToSave, this.currentUser);
351
352
  }
352
353
  catch (attachmentError) {
353
354
  console.error('Failed to save attachments:', attachmentError);
354
- this.toastService.error('Some attachments could not be saved');
355
+ attachmentRejection = attachmentError instanceof Error
356
+ ? attachmentError.message
357
+ : 'Some attachments could not be saved';
355
358
  }
356
359
  finally {
357
360
  this.isUploadingAttachments = false;
358
361
  this.uploadStateChanged.emit({ isUploading: false, message: '' });
359
362
  }
363
+ // Plan §6: when attachments are rejected, the message itself must
364
+ // not go through. Roll back the ConversationDetail and notify the
365
+ // user with the server's rejection message so they can see exactly
366
+ // why and either remove the file or upload a supported one. The
367
+ // text and pending attachments stay in the input so the user can edit.
368
+ if (attachmentRejection) {
369
+ MJNotificationService.Instance?.CreateSimpleNotification(attachmentRejection, 'error', 5000);
370
+ try {
371
+ await messageDetail.Delete();
372
+ }
373
+ catch (rollbackErr) {
374
+ console.error('Failed to roll back conversation detail after attachment rejection:', rollbackErr);
375
+ }
376
+ this.isSending = false;
377
+ return;
378
+ }
360
379
  }
361
380
  // Clear pending attachments after successful send
362
381
  this.pendingAttachments = [];
@@ -427,17 +446,34 @@ export class MessageInputComponent extends BaseAngularComponent {
427
446
  this.isUploadingAttachments = true;
428
447
  this.uploadingMessage = `Uploading ${attachmentsToSave.length} attachment${attachmentsToSave.length > 1 ? 's' : ''}...`;
429
448
  this.uploadStateChanged.emit({ isUploading: true, message: this.uploadingMessage });
449
+ let attachmentRejection = null;
430
450
  try {
431
451
  await this.attachmentService.saveAttachments(detail.ID, attachmentsToSave, this.currentUser);
432
452
  }
433
453
  catch (attachmentError) {
434
454
  console.error('Failed to save attachments:', attachmentError);
435
- this.toastService.error('Some attachments could not be saved');
455
+ attachmentRejection = attachmentError instanceof Error
456
+ ? attachmentError.message
457
+ : 'Some attachments could not be saved';
436
458
  }
437
459
  finally {
438
460
  this.isUploadingAttachments = false;
439
461
  this.uploadStateChanged.emit({ isUploading: false, message: '' });
440
462
  }
463
+ // Plan §6: roll back the message when attachments are rejected so
464
+ // the user sees the rejection clearly instead of the agent answering
465
+ // a question that was supposed to include the file.
466
+ if (attachmentRejection) {
467
+ MJNotificationService.Instance?.CreateSimpleNotification(attachmentRejection, 'error', 5000);
468
+ try {
469
+ await detail.Delete();
470
+ }
471
+ catch (rollbackErr) {
472
+ console.error('Failed to roll back conversation detail after attachment rejection:', rollbackErr);
473
+ }
474
+ this.isSending = false;
475
+ return;
476
+ }
441
477
  }
442
478
  // Clear pending attachments after successful send
443
479
  this.pendingAttachments = [];