@memberjunction/ng-conversations 5.41.0 β 5.43.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/__tests__/remote-browser-channel.test.js +163 -1
- package/dist/__tests__/remote-browser-channel.test.js.map +1 -1
- package/dist/lib/components/collection/collections-full-view.component.d.ts +105 -2
- package/dist/lib/components/collection/collections-full-view.component.d.ts.map +1 -1
- package/dist/lib/components/collection/collections-full-view.component.js +1378 -489
- package/dist/lib/components/collection/collections-full-view.component.js.map +1 -1
- package/dist/lib/components/conversation/conversation-chat-area.component.d.ts +4 -0
- package/dist/lib/components/conversation/conversation-chat-area.component.d.ts.map +1 -1
- package/dist/lib/components/conversation/conversation-chat-area.component.js +13 -8
- package/dist/lib/components/conversation/conversation-chat-area.component.js.map +1 -1
- package/dist/lib/components/conversation/conversation-list.component.d.ts +98 -5
- package/dist/lib/components/conversation/conversation-list.component.d.ts.map +1 -1
- package/dist/lib/components/conversation/conversation-list.component.js +1102 -401
- package/dist/lib/components/conversation/conversation-list.component.js.map +1 -1
- package/dist/lib/components/mention/mention-dropdown.component.js +37 -19
- package/dist/lib/components/mention/mention-dropdown.component.js.map +1 -1
- package/dist/lib/components/mention/mention-editor.component.d.ts.map +1 -1
- package/dist/lib/components/mention/mention-editor.component.js +10 -3
- package/dist/lib/components/mention/mention-editor.component.js.map +1 -1
- package/dist/lib/components/message/message-input.component.js +1 -1
- package/dist/lib/components/message/message-input.component.js.map +1 -1
- package/dist/lib/components/message/message-item.component.d.ts +5 -0
- package/dist/lib/components/message/message-item.component.d.ts.map +1 -1
- package/dist/lib/components/message/message-item.component.js +26 -3
- package/dist/lib/components/message/message-item.component.js.map +1 -1
- package/dist/lib/components/project/project-form-modal.component.d.ts +5 -1
- package/dist/lib/components/project/project-form-modal.component.d.ts.map +1 -1
- package/dist/lib/components/project/project-form-modal.component.js +104 -85
- package/dist/lib/components/project/project-form-modal.component.js.map +1 -1
- package/dist/lib/components/realtime/channels/base-realtime-channel-client.d.ts +22 -0
- package/dist/lib/components/realtime/channels/base-realtime-channel-client.d.ts.map +1 -1
- package/dist/lib/components/realtime/channels/base-realtime-channel-client.js +40 -0
- package/dist/lib/components/realtime/channels/base-realtime-channel-client.js.map +1 -1
- package/dist/lib/components/realtime/realtime-agent-picker.component.d.ts +12 -1
- package/dist/lib/components/realtime/realtime-agent-picker.component.d.ts.map +1 -1
- package/dist/lib/components/realtime/realtime-agent-picker.component.js +97 -19
- package/dist/lib/components/realtime/realtime-agent-picker.component.js.map +1 -1
- package/dist/lib/components/realtime/remote-browser/remote-browser-channel.d.ts +33 -0
- package/dist/lib/components/realtime/remote-browser/remote-browser-channel.d.ts.map +1 -1
- package/dist/lib/components/realtime/remote-browser/remote-browser-channel.js +164 -7
- package/dist/lib/components/realtime/remote-browser/remote-browser-channel.js.map +1 -1
- package/dist/lib/components/realtime/remote-browser/remote-browser-surface.component.d.ts +35 -2
- package/dist/lib/components/realtime/remote-browser/remote-browser-surface.component.d.ts.map +1 -1
- package/dist/lib/components/realtime/remote-browser/remote-browser-surface.component.js +67 -4
- package/dist/lib/components/realtime/remote-browser/remote-browser-surface.component.js.map +1 -1
- package/dist/lib/components/realtime/remote-browser/remote-browser-tools.d.ts +1 -0
- package/dist/lib/components/realtime/remote-browser/remote-browser-tools.d.ts.map +1 -1
- package/dist/lib/components/realtime/remote-browser/remote-browser-tools.js +13 -0
- package/dist/lib/components/realtime/remote-browser/remote-browser-tools.js.map +1 -1
- package/dist/lib/components/workspace/conversation-workspace.component.d.ts +4 -0
- package/dist/lib/components/workspace/conversation-workspace.component.d.ts.map +1 -1
- package/dist/lib/components/workspace/conversation-workspace.component.js +13 -8
- package/dist/lib/components/workspace/conversation-workspace.component.js.map +1 -1
- package/dist/lib/models/conversation-state.model.d.ts +1 -1
- package/dist/lib/models/conversation-state.model.d.ts.map +1 -1
- package/dist/lib/models/conversation-state.model.js.map +1 -1
- package/dist/lib/services/artifact-state.service.d.ts +1 -1
- package/dist/lib/services/artifact-state.service.d.ts.map +1 -1
- package/dist/lib/services/artifact-state.service.js +7 -2
- package/dist/lib/services/artifact-state.service.js.map +1 -1
- package/dist/lib/services/mention-autocomplete.service.d.ts +25 -5
- package/dist/lib/services/mention-autocomplete.service.d.ts.map +1 -1
- package/dist/lib/services/mention-autocomplete.service.js +86 -18
- package/dist/lib/services/mention-autocomplete.service.js.map +1 -1
- package/dist/lib/services/realtime-pairing.d.ts +8 -7
- package/dist/lib/services/realtime-pairing.d.ts.map +1 -1
- package/dist/lib/services/realtime-pairing.js +19 -9
- package/dist/lib/services/realtime-pairing.js.map +1 -1
- package/package.json +26 -26
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"collections-full-view.component.js","sourceRoot":"","sources":["../../../../src/lib/components/collection/collections-full-view.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, OnInit, OnDestroy, ChangeDetectorRef, HostListener } from '@angular/core';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { UserInfo, RunView, Metadata } from '@memberjunction/core';\nimport { MJCollectionEntity, MJArtifactEntity, MJArtifactVersionEntity, MJCollectionArtifactEntity } from '@memberjunction/core-entities';\nimport { DialogService } from '../../services/dialog.service';\nimport { ArtifactStateService } from '../../services/artifact-state.service';\nimport { CollectionStateService } from '../../services/collection-state.service';\nimport { CollectionPermissionService, CollectionPermission } from '../../services/collection-permission.service';\nimport { ArtifactIconService } from '@memberjunction/ng-artifacts';\nimport { Subject, takeUntil } from 'rxjs';\nimport { CollectionViewMode, CollectionViewItem, CollectionSortBy, CollectionSortOrder } from '../../models/collection-view.model';\nimport { UUIDsEqual } from '@memberjunction/global';\n\n/**\n * Full-panel Collections view component\n * Comprehensive collection management with artifacts display\n */\n@Component({\n standalone: false,\n selector: 'mj-collections-full-view',\n template: `\n <div class=\"collections-view\" (keydown)=\"handleKeyboardShortcut($event)\">\n <!-- Mac Finder-style Header -->\n <div class=\"collections-header\">\n <!-- Breadcrumb navigation -->\n <div class=\"collections-breadcrumb\">\n <div class=\"breadcrumb-item\">\n <i class=\"fas fa-home\"></i>\n <a class=\"breadcrumb-link\" (click)=\"navigateToRoot()\">Collections</a>\n </div>\n @if (breadcrumbs.length > 0) {\n <span class=\"breadcrumb-path\">\n @for (crumb of breadcrumbs; track crumb; let last = $last) {\n <i class=\"fas fa-chevron-right breadcrumb-separator\"></i>\n <a class=\"breadcrumb-link\"\n [class.active]=\"last\"\n (click)=\"navigateTo(crumb)\">\n {{ crumb.name }}\n </a>\n }\n </span>\n }\n </div>\n \n <!-- Action buttons -->\n <div class=\"collections-actions\">\n <!-- View mode toggle -->\n <button class=\"btn-icon\"\n (click)=\"toggleViewMode()\"\n [title]=\"viewMode === 'grid' ? 'Switch to List View' : 'Switch to Grid View'\">\n <i class=\"fas\" [ngClass]=\"viewMode === 'grid' ? 'fa-list' : 'fa-th'\"></i>\n </button>\n \n <!-- Select mode toggle -->\n <button class=\"btn-icon\"\n [class.active]=\"isSelectMode\"\n (click)=\"toggleSelectMode()\"\n [title]=\"isSelectMode ? 'Exit Select Mode' : 'Select Items'\">\n <i class=\"fas fa-check-square\"></i>\n </button>\n \n <!-- Sort dropdown (grid view only) -->\n @if (viewMode === 'grid') {\n <div class=\"dropdown-container\">\n <button class=\"btn-icon\"\n (click)=\"showSortDropdown = !showSortDropdown\"\n title=\"Sort options\">\n <i class=\"fas fa-sort\"></i>\n </button>\n @if (showSortDropdown) {\n <div class=\"dropdown-menu\">\n <button class=\"dropdown-item\"\n [class.active]=\"sortBy === 'name'\"\n (click)=\"setSortBy('name')\">\n <i class=\"fas fa-sort-alpha-down\"></i>\n <span>Sort by Name</span>\n </button>\n <button class=\"dropdown-item\"\n [class.active]=\"sortBy === 'date'\"\n (click)=\"setSortBy('date')\">\n <i class=\"fas fa-calendar\"></i>\n <span>Sort by Date</span>\n </button>\n <button class=\"dropdown-item\"\n [class.active]=\"sortBy === 'type'\"\n (click)=\"setSortBy('type')\">\n <i class=\"fas fa-tag\"></i>\n <span>Sort by Type</span>\n </button>\n </div>\n }\n </div>\n }\n \n <!-- Search -->\n <div class=\"search-container\">\n <i class=\"fas fa-search\"></i>\n <input type=\"text\"\n class=\"search-input\"\n placeholder=\"Search...\"\n [(ngModel)]=\"searchQuery\"\n (ngModelChange)=\"onSearchChange($event)\">\n @if (searchQuery) {\n <button class=\"search-clear\"\n (click)=\"searchQuery = ''; onSearchChange('')\"\n title=\"Clear search\">\n <i class=\"fas fa-times\"></i>\n </button>\n }\n </div>\n\n <!-- Current collection actions (visible when inside a collection) -->\n @if (currentCollectionId && currentCollection) {\n <div class=\"toolbar-separator\"></div>\n <div class=\"toolbar-actions-group\">\n @if (canShareCurrent()) {\n <button class=\"btn-icon\"\n (click)=\"shareCurrentCollection()\"\n [title]=\"'Share: ' + currentCollection.Name\">\n <i class=\"fas fa-share-nodes\"></i>\n </button>\n }\n @if (canEditCurrent()) {\n <button class=\"btn-icon\"\n (click)=\"editCurrentCollection()\"\n [title]=\"'Edit: ' + currentCollection.Name\">\n <i class=\"fas fa-pen-to-square\"></i>\n </button>\n }\n @if (canDeleteCurrent()) {\n <button class=\"btn-icon btn-icon-danger\"\n (click)=\"deleteCurrentCollection()\"\n [title]=\"'Delete: ' + currentCollection.Name\">\n <i class=\"fas fa-trash\"></i>\n </button>\n }\n </div>\n }\n\n <!-- New dropdown -->\n @if (canEditCurrent()) {\n <div class=\"dropdown-container\">\n <button class=\"btn-primary\"\n (click)=\"showNewDropdown = !showNewDropdown\">\n <i class=\"fas fa-plus\"></i>\n <span>New</span>\n <i class=\"fas fa-chevron-down\"></i>\n </button>\n @if (showNewDropdown) {\n <div class=\"dropdown-menu dropdown-menu-right\">\n <button class=\"dropdown-item\" (click)=\"createCollection()\">\n <i class=\"fas fa-folder-plus\"></i>\n <span>New Collection</span>\n </button>\n <button class=\"dropdown-item\"\n (click)=\"addArtifact()\"\n [disabled]=\"!currentCollectionId\">\n <i class=\"fas fa-file-plus\"></i>\n <span>New Artifact</span>\n </button>\n </div>\n }\n </div>\n }\n \n <!-- Refresh button -->\n <button class=\"btn-icon\" (click)=\"refresh()\" title=\"Refresh\">\n <i class=\"fas fa-sync\"></i>\n </button>\n </div>\n </div>\n \n <!-- Multi-select toolbar (appears when items selected) -->\n @if (selectedItems.size > 0) {\n <div class=\"selection-toolbar\">\n <div class=\"selection-info\">\n <span class=\"selection-count\">{{ selectedItems.size }} selected</span>\n </div>\n <div class=\"selection-actions\">\n <button class=\"btn-toolbar\" (click)=\"clearSelection()\">\n <i class=\"fas fa-times\"></i>\n Clear Selection\n </button>\n <button class=\"btn-toolbar btn-danger\" (click)=\"deleteSelected()\">\n <i class=\"fas fa-trash\"></i>\n Delete Selected\n </button>\n </div>\n </div>\n }\n \n <!-- Content area -->\n <div class=\"collections-content\">\n <!-- Loading state -->\n @if (isLoading) {\n <div class=\"loading-state\">\n <mj-loading text=\"Loading collections...\" size=\"large\"></mj-loading>\n </div>\n }\n \n <!-- Empty state -->\n @if (!isLoading && unifiedItems.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fas fa-folder-open\"></i>\n <!-- Search returned no results -->\n @if (searchQuery) {\n <h3>No items found</h3>\n <p>Try adjusting your search</p>\n }\n <!-- Empty root level -->\n @if (!searchQuery && !currentCollectionId) {\n <h3>No collections yet</h3>\n <p>Create your first collection to get started</p>\n @if (canEditCurrent()) {\n <button class=\"btn-primary empty-state-cta\"\n (click)=\"createCollection()\"\n >\n <i class=\"fas fa-plus\"></i>\n Create Collection\n </button>\n }\n }\n <!-- Empty collection (has parent) -->\n @if (!searchQuery && currentCollectionId) {\n <h3>This collection is empty</h3>\n <p>Use the <strong>New</strong> button above to add collections or artifacts</p>\n }\n </div>\n }\n \n <!-- Grid view -->\n @if (!isLoading && unifiedItems.length > 0 && viewMode === 'grid') {\n <div\n class=\"unified-grid\"\n [class.select-mode]=\"isSelectMode\">\n @for (item of PagedItems; track item) {\n <div\n class=\"grid-item\"\n [class.selected]=\"item.selected\"\n [class.active]=\"item.type === 'artifact' && IsArtifactActive(item)\"\n (click)=\"onItemClick(item, $event)\"\n (dblclick)=\"onItemDoubleClick(item, $event)\"\n (contextmenu)=\"onItemContextMenu(item, $event)\">\n <!-- Selection checkbox (only visible in select mode) -->\n @if (isSelectMode) {\n <div class=\"item-checkbox\"\n (click)=\"toggleItemSelection(item, $event)\">\n <i class=\"fas\"\n [ngClass]=\"item.selected ? 'fa-check-circle' : 'fa-circle'\"></i>\n </div>\n }\n <!-- Folder item -->\n @if (item.type === 'folder') {\n <div\n class=\"grid-item-content\"\n [title]=\"item.description || item.name\">\n <div class=\"grid-icon folder-icon\">\n <i class=\"fas fa-folder\"></i>\n @if (item.isShared) {\n <div class=\"shared-badge\" title=\"Shared\">\n <i class=\"fas fa-users\"></i>\n </div>\n }\n </div>\n <div class=\"grid-info\">\n <div class=\"grid-name\">{{ item.name }}</div>\n @if (item.description) {\n <div class=\"grid-description\">\n {{ item.description }}\n </div>\n }\n @if (item.itemCount !== undefined) {\n <div class=\"grid-meta\">\n {{ getItemCountText(item.itemCount) }}\n </div>\n }\n @if (item.isShared && item.owner) {\n <div class=\"grid-owner\">\n <i class=\"fas fa-user\"></i>\n {{ item.owner }}\n </div>\n }\n </div>\n </div>\n }\n <!-- Artifact item -->\n @if (item.type === 'artifact') {\n <div\n class=\"grid-item-content\"\n [title]=\"item.description || item.name\">\n <div class=\"grid-icon artifact-icon\">\n <i class=\"fas\" [ngClass]=\"item.icon\"></i>\n </div>\n <div class=\"grid-info\">\n <div class=\"grid-name\">{{ item.name }}</div>\n @if (item.description) {\n <div class=\"grid-description\">\n {{ item.description }}\n </div>\n }\n <div class=\"grid-meta\">\n @if (item.versionNumber) {\n <span class=\"version-badge\">\n v{{ item.versionNumber }}\n </span>\n }\n @if (item.artifactType) {\n <span class=\"artifact-type-badge\">\n {{ item.artifactType }}\n </span>\n }\n </div>\n </div>\n </div>\n }\n </div>\n }\n </div>\n\n <!-- Pagination controls (grid mode, when more than one page) -->\n @if (TotalPages > 1) {\n <div class=\"pagination-bar\">\n <span class=\"pagination-info\">\n {{ (CurrentPage - 1) * PageSize + 1 }}β{{ CurrentPage * PageSize < unifiedItems.length ? CurrentPage * PageSize : unifiedItems.length }}\n of {{ unifiedItems.length }} items\n </span>\n <div class=\"pagination-controls\">\n <button class=\"pagination-btn\"\n [disabled]=\"CurrentPage === 1\"\n (click)=\"GoToPage(1)\"\n title=\"First page\">\n <i class=\"fas fa-angles-left\"></i>\n </button>\n <button class=\"pagination-btn\"\n [disabled]=\"CurrentPage === 1\"\n (click)=\"GoToPage(CurrentPage - 1)\"\n title=\"Previous page\">\n <i class=\"fas fa-chevron-left\"></i>\n </button>\n <span class=\"pagination-page-info\">\n Page {{ CurrentPage }} of {{ TotalPages }}\n </span>\n <button class=\"pagination-btn\"\n [disabled]=\"CurrentPage === TotalPages\"\n (click)=\"GoToPage(CurrentPage + 1)\"\n title=\"Next page\">\n <i class=\"fas fa-chevron-right\"></i>\n </button>\n <button class=\"pagination-btn\"\n [disabled]=\"CurrentPage === TotalPages\"\n (click)=\"GoToPage(TotalPages)\"\n title=\"Last page\">\n <i class=\"fas fa-angles-right\"></i>\n </button>\n </div>\n </div>\n }\n }\n \n <!-- List view -->\n @if (!isLoading && unifiedItems.length > 0 && viewMode === 'list') {\n <div\n class=\"unified-list\"\n [class.select-mode]=\"isSelectMode\">\n <table class=\"list-table\">\n <thead>\n <tr>\n @if (isSelectMode) {\n <th class=\"col-checkbox\">\n <i class=\"fas\"\n [ngClass]=\"selectedItems.size === unifiedItems.length ? 'fa-check-square' : 'fa-square'\"\n (click)=\"selectedItems.size === unifiedItems.length ? clearSelection() : selectAll()\"></i>\n </th>\n }\n <th class=\"col-name sortable\" (click)=\"setSortBy('name')\">\n <span>Name</span>\n @if (sortBy !== 'name') {\n <i class=\"fas fa-sort\"></i>\n }\n @if (sortBy === 'name') {\n <i class=\"fas\"\n [ngClass]=\"sortOrder === 'asc' ? 'fa-sort-up' : 'fa-sort-down'\"></i>\n }\n </th>\n <th class=\"col-type sortable\" (click)=\"setSortBy('type')\">\n <span>Type</span>\n @if (sortBy !== 'type') {\n <i class=\"fas fa-sort\"></i>\n }\n @if (sortBy === 'type') {\n <i class=\"fas\"\n [ngClass]=\"sortOrder === 'asc' ? 'fa-sort-up' : 'fa-sort-down'\"></i>\n }\n </th>\n <th class=\"col-modified sortable\" (click)=\"setSortBy('date')\">\n <span>Modified</span>\n @if (sortBy !== 'date') {\n <i class=\"fas fa-sort\"></i>\n }\n @if (sortBy === 'date') {\n <i class=\"fas\"\n [ngClass]=\"sortOrder === 'asc' ? 'fa-sort-up' : 'fa-sort-down'\"></i>\n }\n </th>\n <th class=\"col-owner\">Owner</th>\n </tr>\n </thead>\n <tbody>\n @for (item of PagedItems; track item) {\n <tr\n class=\"list-item\"\n [class.selected]=\"item.selected\"\n [class.active]=\"item.type === 'artifact' && IsArtifactActive(item)\"\n (click)=\"onItemClick(item, $event)\"\n (dblclick)=\"onItemDoubleClick(item, $event)\"\n (contextmenu)=\"onItemContextMenu(item, $event)\">\n @if (isSelectMode) {\n <td class=\"col-checkbox\">\n <i class=\"fas\"\n [ngClass]=\"item.selected ? 'fa-check-circle' : 'fa-circle'\"\n (click)=\"toggleItemSelection(item, $event)\"></i>\n </td>\n }\n <td class=\"col-name\">\n <div class=\"list-name-cell\">\n <i class=\"fas\"\n [ngClass]=\"item.type === 'folder' ? 'fa-folder' : item.icon\"></i>\n <span>{{ item.name }}</span>\n @if (item.isShared) {\n <i class=\"fas fa-users shared-indicator\"\n title=\"Shared\"></i>\n }\n </div>\n </td>\n <td class=\"col-type\">\n @if (item.type === 'folder') {\n <span>Folder</span>\n }\n @if (item.type === 'artifact') {\n <span class=\"artifact-type-badge\">\n {{ item.artifactType }}\n </span>\n }\n </td>\n <td class=\"col-modified\">\n @if (item.lastModified) {\n <span>\n {{ item.lastModified | date:'short' }}\n </span>\n }\n </td>\n <td class=\"col-owner\">\n @if (item.owner) {\n <span>{{ item.owner }}</span>\n }\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n\n <!-- Pagination controls (list mode only, when more than one page) -->\n @if (TotalPages > 1) {\n <div class=\"pagination-bar\">\n <span class=\"pagination-info\">\n {{ (CurrentPage - 1) * PageSize + 1 }}β{{ CurrentPage * PageSize < unifiedItems.length ? CurrentPage * PageSize : unifiedItems.length }}\n of {{ unifiedItems.length }} items\n </span>\n <div class=\"pagination-controls\">\n <button class=\"pagination-btn\"\n [disabled]=\"CurrentPage === 1\"\n (click)=\"GoToPage(1)\"\n title=\"First page\">\n <i class=\"fas fa-angles-left\"></i>\n </button>\n <button class=\"pagination-btn\"\n [disabled]=\"CurrentPage === 1\"\n (click)=\"GoToPage(CurrentPage - 1)\"\n title=\"Previous page\">\n <i class=\"fas fa-chevron-left\"></i>\n </button>\n <span class=\"pagination-page-info\">\n Page {{ CurrentPage }} of {{ TotalPages }}\n </span>\n <button class=\"pagination-btn\"\n [disabled]=\"CurrentPage === TotalPages\"\n (click)=\"GoToPage(CurrentPage + 1)\"\n title=\"Next page\">\n <i class=\"fas fa-chevron-right\"></i>\n </button>\n <button class=\"pagination-btn\"\n [disabled]=\"CurrentPage === TotalPages\"\n (click)=\"GoToPage(TotalPages)\"\n title=\"Last page\">\n <i class=\"fas fa-angles-right\"></i>\n </button>\n </div>\n </div>\n }\n }\n </div>\n </div>\n\n <!-- Context Menu -->\n @if (showContextMenu && contextMenuItem) {\n <div class=\"context-menu-backdrop\" (click)=\"closeContextMenu()\"></div>\n <div class=\"context-menu\"\n [style.left.px]=\"contextMenuPosition.x\"\n [style.top.px]=\"contextMenuPosition.y\">\n @if (contextMenuItem.type === 'folder' && contextMenuItem.collection) {\n <button class=\"context-menu-item\" (click)=\"onContextMenuAction('open')\">\n <i class=\"fas fa-folder-open\"></i>\n <span>Open</span>\n </button>\n <div class=\"context-menu-divider\"></div>\n @if (canShare(contextMenuItem.collection)) {\n <button class=\"context-menu-item\" (click)=\"onContextMenuAction('share')\">\n <i class=\"fas fa-share-nodes\"></i>\n <span>Share</span>\n </button>\n }\n @if (canEdit(contextMenuItem.collection)) {\n <button class=\"context-menu-item\" (click)=\"onContextMenuAction('edit')\">\n <i class=\"fas fa-pen-to-square\"></i>\n <span>Edit</span>\n </button>\n }\n @if (canDelete(contextMenuItem.collection)) {\n <div class=\"context-menu-divider\"></div>\n <button class=\"context-menu-item context-menu-danger\" (click)=\"onContextMenuAction('delete')\">\n <i class=\"fas fa-trash\"></i>\n <span>Delete</span>\n </button>\n }\n }\n @if (contextMenuItem.type === 'artifact') {\n <button class=\"context-menu-item\" (click)=\"onContextMenuAction('view')\">\n <i class=\"fas fa-eye\"></i>\n <span>View</span>\n </button>\n @if (canEditCurrent()) {\n <div class=\"context-menu-divider\"></div>\n <button class=\"context-menu-item context-menu-danger\" (click)=\"onContextMenuAction('remove')\">\n <i class=\"fas fa-times-circle\"></i>\n <span>Remove from Collection</span>\n </button>\n }\n }\n </div>\n }\n\n <!-- Modals -->\n <mj-collection-form-modal\n [isOpen]=\"isFormModalOpen\"\n [collection]=\"editingCollection\"\n [parentCollection]=\"editingCollection ? undefined : (currentCollection || undefined)\"\n [environmentId]=\"environmentId\"\n [currentUser]=\"currentUser\"\n (saved)=\"onCollectionSaved($event)\"\n (cancelled)=\"onFormCancelled()\">\n </mj-collection-form-modal>\n \n <mj-artifact-create-modal\n [isOpen]=\"isArtifactModalOpen\"\n [collectionId]=\"currentCollectionId || ''\"\n [environmentId]=\"environmentId\"\n [currentUser]=\"currentUser\"\n (saved)=\"onArtifactSaved($event)\"\n (cancelled)=\"onArtifactModalCancelled()\">\n </mj-artifact-create-modal>\n \n <mj-collection-share-modal\n [isOpen]=\"isShareModalOpen\"\n [collection]=\"sharingCollection\"\n [currentUser]=\"currentUser\"\n [currentUserPermissions]=\"sharingCollection ? userPermissions.get(sharingCollection.ID) || null : null\"\n (saved)=\"onPermissionsChanged()\"\n (cancelled)=\"onShareModalCancelled()\">\n </mj-collection-share-modal>\n `,\n styles: [`\n :host {\n display: flex;\n flex-direction: column;\n flex: 1;\n min-height: 0;\n }\n\n /* Main container */\n .collections-view {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: var(--mj-bg-surface-sunken);\n position: relative;\n }\n\n /* Header */\n .collections-header {\n display: flex;\n align-items: center;\n padding: 12px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n gap: 16px;\n background: var(--mj-bg-surface);\n }\n\n .collections-breadcrumb {\n display: flex;\n align-items: center;\n gap: 6px;\n flex: 1;\n min-width: 0;\n }\n\n .breadcrumb-item {\n display: flex;\n align-items: center;\n gap: 6px;\n }\n\n .breadcrumb-item i {\n color: var(--mj-text-muted);\n font-size: 14px;\n }\n\n .breadcrumb-link {\n color: var(--mj-text-primary);\n font-weight: 500;\n cursor: pointer;\n text-decoration: none;\n white-space: nowrap;\n transition: color 150ms ease;\n font-size: 14px;\n }\n\n .breadcrumb-link:hover {\n color: var(--mj-brand-primary);\n }\n\n .breadcrumb-link.active {\n color: var(--mj-text-muted);\n cursor: default;\n }\n\n .breadcrumb-path {\n display: flex;\n align-items: center;\n gap: 6px;\n overflow-x: auto;\n }\n\n .breadcrumb-separator {\n color: var(--mj-border-strong);\n font-size: 10px;\n }\n\n .collections-actions {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n /* Button styles */\n .btn-primary {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n background: var(--mj-brand-primary);\n border: none;\n border-radius: 6px;\n color: var(--mj-text-inverse);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: background 150ms ease;\n }\n\n .btn-primary:hover {\n background: var(--mj-brand-primary-hover);\n }\n\n .btn-primary i.fa-chevron-down {\n font-size: 10px;\n margin-left: 2px;\n }\n\n .btn-icon {\n padding: 6px 10px;\n background: transparent;\n border: 1px solid var(--mj-border-strong);\n border-radius: 6px;\n cursor: pointer;\n color: var(--mj-text-muted);\n transition: all 150ms ease;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .btn-icon:hover {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-primary);\n border-color: var(--mj-text-disabled);\n }\n\n .btn-icon.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: var(--mj-brand-primary);\n }\n\n .btn-icon.active:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n }\n\n /* Dropdown menus */\n .dropdown-container {\n position: relative;\n }\n\n .dropdown-menu {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n min-width: 200px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n padding: 4px;\n z-index: 1000;\n }\n\n .dropdown-menu-right {\n left: auto;\n right: 0;\n }\n\n .dropdown-item {\n display: flex;\n align-items: center;\n gap: 10px;\n width: 100%;\n padding: 8px 12px;\n background: transparent;\n border: none;\n border-radius: 4px;\n color: var(--mj-text-primary);\n font-size: 13px;\n cursor: pointer;\n text-align: left;\n transition: background 100ms ease;\n }\n\n .dropdown-item:hover:not(:disabled) {\n background: var(--mj-bg-surface-sunken);\n }\n\n .dropdown-item:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n .dropdown-item.active {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n }\n\n .dropdown-item i {\n font-size: 14px;\n width: 16px;\n text-align: center;\n color: var(--mj-text-muted);\n }\n\n .dropdown-item.active i {\n color: var(--mj-brand-primary);\n }\n\n .dropdown-divider {\n height: 1px;\n background: var(--mj-border-default);\n margin: 4px 0;\n }\n\n /* Search */\n .search-container {\n position: relative;\n display: flex;\n align-items: center;\n min-width: 200px;\n }\n\n .search-container i.fa-search {\n position: absolute;\n left: 10px;\n color: var(--mj-text-disabled);\n font-size: 13px;\n pointer-events: none;\n }\n\n .search-input {\n width: 100%;\n padding: 6px 32px 6px 32px;\n border: 1px solid var(--mj-border-strong);\n border-radius: 6px;\n font-size: 13px;\n outline: none;\n transition: all 150ms ease;\n }\n\n .search-input:focus {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n }\n\n .search-clear {\n position: absolute;\n right: 6px;\n padding: 4px;\n background: transparent;\n border: none;\n color: var(--mj-text-disabled);\n cursor: pointer;\n border-radius: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .search-clear:hover {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n }\n\n /* Selection toolbar */\n .selection-toolbar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 8px 20px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-bottom: 1px solid color-mix(in srgb, var(--mj-brand-primary) 30%, var(--mj-bg-surface));\n }\n\n .selection-info {\n display: flex;\n align-items: center;\n gap: 12px;\n }\n\n .selection-count {\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-brand-primary);\n }\n\n .selection-actions {\n display: flex;\n gap: 8px;\n }\n\n .btn-toolbar {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-strong);\n border-radius: 6px;\n color: var(--mj-text-secondary);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: all 150ms ease;\n }\n\n .btn-toolbar:hover {\n background: var(--mj-bg-surface-sunken);\n border-color: var(--mj-text-disabled);\n }\n\n .btn-toolbar.btn-danger {\n color: var(--mj-status-error);\n border-color: color-mix(in srgb, var(--mj-status-error) 30%, var(--mj-bg-surface));\n }\n\n .btn-toolbar.btn-danger:hover {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n border-color: var(--mj-status-error);\n }\n\n /* Content area */\n .collections-content {\n display: flex;\n flex-direction: column;\n flex: 1;\n overflow-y: auto;\n padding: 20px;\n }\n\n /* Loading and empty states */\n .loading-state, .empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n flex: 1;\n min-height: 0;\n color: var(--mj-text-disabled);\n text-align: center;\n padding: 24px;\n }\n\n .empty-state > i {\n font-size: 64px;\n margin-bottom: 24px;\n opacity: 0.3;\n color: var(--mj-border-strong);\n }\n\n .empty-state h3 {\n margin: 0 0 8px 0;\n color: var(--mj-text-secondary);\n font-size: 18px;\n font-weight: 600;\n }\n\n .empty-state p {\n margin: 0 0 24px 0;\n font-size: 14px;\n color: var(--mj-text-muted);\n }\n\n .empty-state .empty-state-cta {\n padding: 10px 20px;\n font-size: 14px;\n border-radius: 8px;\n }\n\n .empty-state-actions {\n display: flex;\n gap: 12px;\n flex-wrap: wrap;\n justify-content: center;\n }\n\n /* Grid view */\n .unified-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(140px, 1fr));\n gap: 16px;\n padding: 4px;\n flex-shrink: 0;\n }\n\n .grid-item {\n display: flex;\n flex-direction: column;\n padding: 12px;\n background: var(--mj-bg-surface);\n border: 2px solid transparent;\n border-radius: 8px;\n cursor: pointer;\n transition: all 150ms ease;\n position: relative;\n user-select: none;\n }\n\n .grid-item:hover {\n background: var(--mj-bg-surface-sunken);\n border-color: var(--mj-border-strong);\n }\n\n .grid-item.selected {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary);\n }\n\n .grid-item.active {\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n border-color: var(--mj-status-warning);\n box-shadow: 0 0 0 1px var(--mj-status-warning);\n }\n\n .grid-item.active:hover {\n background: color-mix(in srgb, var(--mj-status-warning) 25%, var(--mj-bg-surface));\n }\n\n /* Select mode styling for grid */\n .unified-grid.select-mode .grid-item {\n cursor: pointer;\n }\n\n .unified-grid.select-mode .grid-item:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-color: color-mix(in srgb, var(--mj-brand-primary) 30%, var(--mj-bg-surface));\n }\n\n .item-checkbox {\n position: absolute;\n top: 8px;\n right: 8px;\n width: 20px;\n height: 20px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n z-index: 10;\n }\n\n .item-checkbox i {\n font-size: 16px;\n color: var(--mj-text-disabled);\n transition: color 150ms ease;\n }\n\n .grid-item.selected .item-checkbox i,\n .item-checkbox:hover i {\n color: var(--mj-brand-primary);\n }\n\n .grid-item-content {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 8px;\n }\n\n .grid-icon {\n width: 64px;\n height: 64px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 8px;\n position: relative;\n }\n\n .grid-icon.folder-icon {\n background: var(--mj-brand-primary);\n }\n\n .grid-icon.folder-icon i {\n font-size: 36px;\n color: var(--mj-text-inverse);\n }\n\n .grid-icon.artifact-icon {\n background: var(--mj-bg-surface-sunken);\n }\n\n .grid-icon.artifact-icon i {\n font-size: 32px;\n color: var(--mj-text-muted);\n }\n\n .shared-badge {\n position: absolute;\n top: -4px;\n right: -4px;\n width: 20px;\n height: 20px;\n background: var(--mj-status-success);\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n border: 2px solid var(--mj-bg-surface);\n }\n\n .shared-badge i {\n font-size: 10px;\n color: var(--mj-text-inverse);\n }\n\n .grid-info {\n width: 100%;\n text-align: center;\n }\n\n .grid-name {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n line-height: 1.3;\n margin-bottom: 4px;\n /* Allow wrapping to 2 lines max */\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n word-break: break-word;\n }\n\n .grid-description {\n font-size: 11px;\n color: var(--mj-text-muted);\n line-height: 1.3;\n margin-bottom: 4px;\n /* Allow wrapping to 2 lines max */\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n word-break: break-word;\n }\n\n .grid-meta {\n font-size: 11px;\n color: var(--mj-text-muted);\n margin-top: 4px;\n }\n\n .grid-owner {\n font-size: 11px;\n color: var(--mj-text-muted);\n margin-top: 2px;\n }\n\n .grid-owner i {\n font-size: 10px;\n margin-right: 3px;\n }\n\n .version-badge {\n display: inline-block;\n padding: 2px 6px;\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n color: var(--mj-status-warning);\n border-radius: 3px;\n font-size: 10px;\n font-weight: 600;\n font-family: monospace;\n margin-right: 4px;\n }\n\n .artifact-type-badge {\n display: inline-block;\n padding: 2px 6px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n border-radius: 3px;\n font-size: 10px;\n font-weight: 500;\n text-transform: uppercase;\n }\n\n /* List view */\n .unified-list {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n overflow: hidden;\n flex-shrink: 0;\n }\n\n .list-table {\n width: 100%;\n border-collapse: collapse;\n }\n\n .list-table thead {\n background: var(--mj-bg-surface-sunken);\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .list-table th {\n padding: 10px 16px;\n text-align: left;\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n\n .list-table th.sortable {\n cursor: pointer;\n user-select: none;\n transition: color 150ms ease;\n }\n\n .list-table th.sortable:hover {\n color: var(--mj-brand-primary);\n }\n\n .list-table th.sortable span {\n display: inline-block;\n margin-right: 6px;\n }\n\n .list-table th.sortable i {\n font-size: 10px;\n opacity: 0.5;\n }\n\n .list-table th.sortable:hover i {\n opacity: 1;\n }\n\n .list-table tbody tr {\n border-bottom: 1px solid var(--mj-bg-surface-sunken);\n transition: background 150ms ease;\n cursor: pointer;\n user-select: none;\n }\n\n .list-table tbody tr:last-child {\n border-bottom: none;\n }\n\n .list-table tbody tr:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .list-table tbody tr.selected {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n }\n\n .list-table tbody tr.active {\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n border-left: 3px solid var(--mj-status-warning);\n }\n\n .list-table tbody tr.active:hover {\n background: color-mix(in srgb, var(--mj-status-warning) 25%, var(--mj-bg-surface));\n }\n\n .list-table td {\n padding: 12px 16px;\n font-size: 13px;\n color: var(--mj-text-secondary);\n }\n\n .col-checkbox {\n width: 40px;\n text-align: center;\n }\n\n .col-checkbox i {\n font-size: 16px;\n color: var(--mj-text-disabled);\n cursor: pointer;\n transition: color 150ms ease;\n }\n\n .col-checkbox i:hover,\n .list-table tbody tr.selected .col-checkbox i {\n color: var(--mj-brand-primary);\n }\n\n .col-name {\n min-width: 300px;\n }\n\n .list-name-cell {\n display: flex;\n align-items: center;\n gap: 10px;\n }\n\n .list-name-cell i {\n font-size: 16px;\n color: var(--mj-text-muted);\n width: 20px;\n text-align: center;\n }\n\n .list-name-cell .fa-folder {\n color: var(--mj-brand-primary);\n }\n\n .shared-indicator {\n font-size: 12px;\n color: var(--mj-status-success);\n margin-left: auto;\n }\n\n .col-type {\n width: 150px;\n }\n\n .col-modified {\n width: 180px;\n }\n\n .col-owner {\n width: 150px;\n }\n\n /* Pagination */\n .pagination-bar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 10px 16px;\n margin-top: 8px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n font-size: 13px;\n color: var(--mj-text-secondary);\n flex-shrink: 0;\n }\n\n .pagination-info {\n white-space: nowrap;\n }\n\n .pagination-controls {\n display: flex;\n align-items: center;\n gap: 4px;\n }\n\n .pagination-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 150ms ease;\n font-size: 12px;\n }\n\n .pagination-btn:hover:not(:disabled) {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-border-strong);\n color: var(--mj-text-primary);\n }\n\n .pagination-btn:disabled {\n opacity: 0.35;\n cursor: default;\n }\n\n .pagination-page-info {\n padding: 0 8px;\n white-space: nowrap;\n font-weight: 500;\n }\n\n /* Toolbar separator and action group */\n .toolbar-separator {\n width: 1px;\n height: 24px;\n background: var(--mj-border-strong);\n margin: 0 4px;\n }\n\n .toolbar-actions-group {\n display: flex;\n align-items: center;\n gap: 4px;\n }\n\n .btn-icon-danger {\n color: var(--mj-status-error);\n border-color: color-mix(in srgb, var(--mj-status-error) 30%, var(--mj-bg-surface));\n }\n\n .btn-icon-danger:hover {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n border-color: var(--mj-status-error);\n }\n\n /* Context menu */\n .context-menu-backdrop {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: 1999;\n }\n\n .context-menu {\n position: fixed;\n min-width: 180px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n box-shadow: 0 4px 16px rgba(0, 0, 0, 0.18);\n padding: 4px;\n z-index: 2000;\n }\n\n .context-menu-item {\n display: flex;\n align-items: center;\n gap: 10px;\n width: 100%;\n padding: 8px 12px;\n background: transparent;\n border: none;\n border-radius: 4px;\n color: var(--mj-text-primary);\n font-size: 13px;\n cursor: pointer;\n text-align: left;\n transition: background 100ms ease;\n }\n\n .context-menu-item:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .context-menu-item i {\n font-size: 14px;\n width: 16px;\n text-align: center;\n color: var(--mj-text-muted);\n }\n\n .context-menu-danger {\n color: var(--mj-status-error);\n }\n\n .context-menu-danger i {\n color: var(--mj-status-error);\n }\n\n .context-menu-danger:hover {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n }\n\n .context-menu-divider {\n height: 1px;\n background: var(--mj-border-default);\n margin: 4px 0;\n }\n `]\n})\nexport class CollectionsFullViewComponent extends BaseAngularComponent implements OnInit, OnDestroy {\n @Input() environmentId!: string;\n @Input() currentUser!: UserInfo;\n @Output() collectionNavigated = new EventEmitter<{\n collectionId: string | null;\n versionId?: string | null;\n }>();\n\n public collections: MJCollectionEntity[] = [];\n public artifactVersions: Array<{ version: MJArtifactVersionEntity; artifact: MJArtifactEntity }> = [];\n public filteredCollections: MJCollectionEntity[] = [];\n public filteredArtifactVersions: Array<{ version: MJArtifactVersionEntity; artifact: MJArtifactEntity }> = [];\n public isLoading: boolean = false;\n public breadcrumbs: Array<{ id: string; name: string }> = [];\n public currentCollectionId: string | null = null;\n public currentCollection: MJCollectionEntity | null = null;\n\n public isFormModalOpen: boolean = false;\n public editingCollection?: MJCollectionEntity;\n public isArtifactModalOpen: boolean = false;\n\n public userPermissions: Map<string, CollectionPermission> = new Map();\n public isShareModalOpen: boolean = false;\n public sharingCollection: MJCollectionEntity | null = null;\n\n // New UI state for Mac Finder-style view\n public viewMode: CollectionViewMode = 'grid';\n public sortBy: CollectionSortBy = 'name';\n public sortOrder: CollectionSortOrder = 'asc';\n public searchQuery: string = '';\n public unifiedItems: CollectionViewItem[] = [];\n public selectedItems: Set<string> = new Set();\n public showNewDropdown: boolean = false;\n public showSortDropdown: boolean = false;\n public activeArtifactId: string | null = null; // Track which artifact is currently being viewed\n private itemCountMap: Map<string, number> = new Map();\n public isSelectMode: boolean = false; // Toggle for selection mode\n\n // Pagination state\n public PageSize: number = 50;\n public CurrentPage: number = 1;\n\n /** Total number of pages based on current items and page size */\n get TotalPages(): number {\n return Math.max(1, Math.ceil(this.unifiedItems.length / this.PageSize));\n }\n\n /** Items for the current page */\n get PagedItems(): CollectionViewItem[] {\n const start = (this.CurrentPage - 1) * this.PageSize;\n return this.unifiedItems.slice(start, start + this.PageSize);\n }\n\n /** Navigate to a specific page */\n GoToPage(page: number): void {\n this.CurrentPage = Math.max(1, Math.min(page, this.TotalPages));\n }\n\n IsArtifactActive(item: CollectionViewItem): boolean {\n return UUIDsEqual(item.artifact?.ID, this.activeArtifactId);\n }\n\n // Context menu state\n public showContextMenu: boolean = false;\n public contextMenuPosition: { x: number; y: number } = { x: 0, y: 0 };\n public contextMenuItem: CollectionViewItem | null = null;\n\n private destroy$ = new Subject<void>();\n private isNavigatingProgrammatically = false;\n\n constructor(\n private dialogService: DialogService,\n private artifactState: ArtifactStateService,\n private collectionState: CollectionStateService,\n private permissionService: CollectionPermissionService,\n private artifactIconService: ArtifactIconService,\n private cdr: ChangeDetectorRef\n ) {\n super();}\n\n ngOnInit() {\n // Bind provider-aware services to this component's provider.\n const p = this.ProviderToUse;\n this.artifactState.Provider = p;\n this.permissionService.Provider = p;\n\n // Subscribe to collection state changes for deep linking FIRST\n // This ensures that if there's a URL with collectionId, we set it before loading data\n this.subscribeToCollectionState();\n\n // Subscribe to artifact state changes to track active artifact\n this.subscribeToArtifactState();\n\n // Check if there's an active collection from URL params (set by parent component)\n const activeCollectionId = this.collectionState.activeCollectionId;\n if (activeCollectionId) {\n // If there's an active collection, navigate to it (which will call loadData)\n console.log('π Initial load with active collection:', activeCollectionId);\n this.navigateToCollectionById(activeCollectionId);\n } else {\n // Otherwise, just load the root level\n this.loadData();\n }\n }\n\n ngOnDestroy() {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n /**\n * Subscribe to collection state changes for deep linking support\n */\n private subscribeToCollectionState(): void {\n // Watch for external navigation requests (e.g., from search or URL)\n this.collectionState.activeCollectionId$\n .pipe(takeUntil(this.destroy$))\n .subscribe(collectionId => {\n // Ignore state changes that we triggered ourselves\n if (this.isNavigatingProgrammatically) {\n return;\n }\n\n // Only navigate if the state is different from our current state\n // This prevents double-loading during initialization\n if (collectionId !== this.currentCollectionId) {\n if (collectionId) {\n console.log('π Collection state changed externally, navigating to:', collectionId);\n this.navigateToCollectionById(collectionId);\n } else {\n console.log('π Collection state cleared externally, navigating to root');\n this.navigateToRoot();\n }\n }\n });\n }\n\n /**\n * Subscribe to artifact state changes to track which artifact is currently open\n */\n private subscribeToArtifactState(): void {\n this.artifactState.activeArtifact$\n .pipe(takeUntil(this.destroy$))\n .subscribe(artifact => {\n // Update active artifact ID for highlighting\n this.activeArtifactId = artifact?.ID || null;\n });\n }\n\n async loadData(): Promise<void> {\n // Only show loading spinner if we don't have data yet\n // This prevents flash of loading when navigating between collections\n const hasData = this.collections.length > 0 || this.unifiedItems.length > 0;\n if (!hasData) {\n this.isLoading = true;\n }\n\n try {\n // Load saved view preferences from localStorage\n const savedMode = localStorage.getItem('collections-view-mode');\n if (savedMode === 'grid' || savedMode === 'list') {\n this.viewMode = savedMode;\n }\n\n const savedSortBy = localStorage.getItem('collections-sort-by');\n if (savedSortBy === 'name' || savedSortBy === 'date' || savedSortBy === 'type') {\n this.sortBy = savedSortBy;\n }\n\n const savedSortOrder = localStorage.getItem('collections-sort-order');\n if (savedSortOrder === 'asc' || savedSortOrder === 'desc') {\n this.sortOrder = savedSortOrder;\n }\n\n await Promise.all([\n this.loadCollections(),\n this.loadArtifacts(),\n this.loadCurrentCollectionPermission()\n ]);\n\n // Build unified item list after data loads\n this.buildUnifiedItemList();\n } finally {\n this.isLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n private async loadCollections(): Promise<void> {\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n\n // Load collections where user is owner OR has permissions\n const ownerFilter = `OwnerID='${this.currentUser.ID}'`;\n const permissionSubquery = `ID IN (\n SELECT CollectionID\n FROM [__mj].[vwCollectionPermissions]\n WHERE UserID='${this.currentUser.ID}'\n )`;\n\n const baseFilter = `EnvironmentID='${this.environmentId}'` +\n (this.currentCollectionId ? ` AND ParentID='${this.currentCollectionId}'` : ' AND ParentID IS NULL');\n\n const filter = `${baseFilter} AND (OwnerID IS NULL OR ${ownerFilter} OR ${permissionSubquery})`;\n\n const result = await rv.RunView<MJCollectionEntity>(\n {\n EntityName: 'MJ: Collections',\n ExtraFilter: filter,\n OrderBy: 'Name ASC',\n MaxRows: 1000,\n ResultType: 'entity_object'\n },\n this.currentUser\n );\n\n if (result.Success) {\n this.collections = result.Results || [];\n await Promise.all([\n this.loadUserPermissions(),\n this.loadItemCounts()\n ]);\n this.filteredCollections = [...this.collections];\n }\n } catch (error) {\n console.error('Failed to load collections:', error);\n }\n }\n\n /**\n * Load item counts (child collections + artifacts) for all visible collections\n */\n private async loadItemCounts(): Promise<void> {\n this.itemCountMap.clear();\n if (this.collections.length === 0) return;\n\n const collectionIds = this.collections.map(c => c.ID);\n const inClause = collectionIds.map(id => `'${id}'`).join(',');\n\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const [childResult, artifactResult] = await rv.RunViews(\n [\n {\n EntityName: 'MJ: Collections',\n ExtraFilter: `ParentID IN (${inClause})`,\n Fields: ['ID', 'ParentID'],\n ResultType: 'simple'\n },\n {\n EntityName: 'MJ: Collection Artifacts',\n ExtraFilter: `CollectionID IN (${inClause})`,\n Fields: ['ID', 'CollectionID'],\n ResultType: 'simple'\n }\n ],\n this.currentUser\n );\n\n // Count children per parent\n if (childResult.Success && childResult.Results) {\n for (const child of childResult.Results) {\n const parentId = (child as Record<string, string>).ParentID;\n this.itemCountMap.set(parentId, (this.itemCountMap.get(parentId) || 0) + 1);\n }\n }\n\n // Count artifacts per collection\n if (artifactResult.Success && artifactResult.Results) {\n for (const ca of artifactResult.Results) {\n const collId = (ca as Record<string, string>).CollectionID;\n this.itemCountMap.set(collId, (this.itemCountMap.get(collId) || 0) + 1);\n }\n }\n }\n\n private async loadUserPermissions(): Promise<void> {\n this.userPermissions.clear();\n\n for (const collection of this.collections) {\n const permission = await this.permissionService.checkPermission(\n collection.ID,\n this.currentUser.ID,\n this.currentUser\n );\n\n if (permission) {\n this.userPermissions.set(collection.ID, permission);\n }\n }\n }\n\n private async loadCurrentCollectionPermission(): Promise<void> {\n if (!this.currentCollectionId || !this.currentCollection) {\n return;\n }\n\n const permission = await this.permissionService.checkPermission(\n this.currentCollectionId,\n this.currentUser.ID,\n this.currentUser\n );\n\n if (permission) {\n this.userPermissions.set(this.currentCollectionId, permission);\n }\n }\n\n private async loadArtifacts(): Promise<void> {\n if (!this.currentCollectionId) {\n this.artifactVersions = [];\n this.filteredArtifactVersions = [];\n return;\n }\n\n try {\n this.artifactVersions = await this.artifactState.loadArtifactVersionsForCollection(\n this.currentCollectionId,\n this.currentUser\n );\n this.filteredArtifactVersions = [...this.artifactVersions];\n } catch (error) {\n console.error('Failed to load artifact versions:', error);\n }\n }\n\n async openCollection(collection: MJCollectionEntity): Promise<void> {\n this.isNavigatingProgrammatically = true;\n try {\n this.breadcrumbs.push({ id: collection.ID, name: collection.Name });\n this.currentCollectionId = collection.ID;\n this.currentCollection = collection;\n this.activeArtifactId = null; // Clear active artifact when switching collections\n await this.loadData();\n\n // Update state service\n this.collectionState.setActiveCollection(collection.ID);\n\n // Close any open artifact when switching collections\n this.collectionNavigated.emit({\n collectionId: collection.ID,\n versionId: null\n });\n } finally {\n this.isNavigatingProgrammatically = false;\n }\n }\n\n async navigateTo(crumb: { id: string; name: string }): Promise<void> {\n this.isNavigatingProgrammatically = true;\n try {\n const index = this.breadcrumbs.findIndex(b => b.id === crumb.id);\n if (index !== -1) {\n this.breadcrumbs = this.breadcrumbs.slice(0, index + 1);\n this.currentCollectionId = crumb.id;\n\n // Load the collection entity\n const md = this.ProviderToUse;\n this.currentCollection = await md.GetEntityObject<MJCollectionEntity>('MJ: Collections', this.currentUser);\n await this.currentCollection.Load(crumb.id);\n\n await this.loadData();\n\n // Update state service\n this.collectionState.setActiveCollection(crumb.id);\n\n // Close any open artifact when navigating collections\n this.collectionNavigated.emit({\n collectionId: crumb.id,\n versionId: null\n });\n }\n } finally {\n this.isNavigatingProgrammatically = false;\n }\n }\n\n async navigateToRoot(): Promise<void> {\n this.isNavigatingProgrammatically = true;\n try {\n this.breadcrumbs = [];\n this.currentCollectionId = null;\n this.currentCollection = null;\n await this.loadData();\n\n // Update state service\n this.collectionState.setActiveCollection(null);\n\n // Close any open artifact when navigating to root\n this.collectionNavigated.emit({\n collectionId: null,\n versionId: null\n });\n } finally {\n this.isNavigatingProgrammatically = false;\n }\n }\n\n /**\n * Update a breadcrumb entry's name in place (e.g., after rename)\n */\n private updateBreadcrumbName(collectionId: string, newName: string): void {\n const crumb = this.breadcrumbs.find(b => UUIDsEqual(b.id, collectionId));\n if (crumb) {\n crumb.name = newName;\n }\n }\n\n /**\n * Navigate to a collection by ID, building the breadcrumb trail\n * Used for deep linking from search results or URL parameters\n */\n async navigateToCollectionById(collectionId: string): Promise<void> {\n this.isNavigatingProgrammatically = true;\n try {\n console.log('π Navigating to collection by ID:', collectionId);\n\n // Load the target collection\n const md = this.ProviderToUse;\n const targetCollection = await md.GetEntityObject<MJCollectionEntity>('MJ: Collections', this.currentUser);\n await targetCollection.Load(collectionId);\n\n if (!targetCollection || !targetCollection.ID) {\n console.error('β Failed to load collection:', collectionId);\n return;\n }\n\n // Build breadcrumb trail by traversing parent hierarchy\n // Note: breadcrumbs includes ALL collections in the path including the current one\n const trail: Array<{ id: string; name: string }> = [];\n let currentId: string | null = targetCollection.ParentID;\n\n while (currentId) {\n const parentCollection = await md.GetEntityObject<MJCollectionEntity>('MJ: Collections', this.currentUser);\n await parentCollection.Load(currentId);\n\n if (parentCollection && parentCollection.ID) {\n // Add to front of trail (we're working backwards)\n trail.unshift({\n id: parentCollection.ID,\n name: parentCollection.Name\n });\n currentId = parentCollection.ParentID;\n } else {\n break;\n }\n }\n\n // Add the target collection to the trail (breadcrumbs includes current collection)\n trail.push({\n id: targetCollection.ID,\n name: targetCollection.Name\n });\n\n // Update component state\n this.breadcrumbs = trail;\n this.currentCollectionId = targetCollection.ID;\n this.currentCollection = targetCollection;\n\n // Load collections and artifacts for this collection\n await this.loadData();\n\n // Update state service\n this.collectionState.setActiveCollection(targetCollection.ID);\n\n // Emit navigation event\n // NOTE: We don't emit artifactId here because this is for deep linking/programmatic navigation\n // Artifact state is managed separately by the artifact state service\n this.collectionNavigated.emit({\n collectionId: targetCollection.ID\n });\n\n console.log('β
Successfully navigated to collection with breadcrumb trail:', trail);\n } catch (error) {\n console.error('β Error navigating to collection:', error);\n } finally {\n this.isNavigatingProgrammatically = false;\n }\n }\n\n refresh(): void {\n this.loadData();\n }\n\n async createCollection(): Promise<void> {\n // Validate user can edit current collection (or at root level)\n if (this.currentCollection) {\n const canEdit = await this.validatePermission(this.currentCollection, 'edit');\n if (!canEdit) return;\n }\n\n this.showNewDropdown = false;\n this.editingCollection = undefined;\n this.isFormModalOpen = true;\n }\n\n async editCollection(collection: MJCollectionEntity): Promise<void> {\n const canEdit = await this.validatePermission(collection, 'edit');\n if (!canEdit) return;\n\n this.editingCollection = collection;\n this.isFormModalOpen = true;\n }\n\n async deleteCollection(collection: MJCollectionEntity): Promise<void> {\n console.log('deleteCollection called for:', collection.Name, collection.ID);\n\n // Validate user has delete permission\n const canDelete = await this.validatePermission(collection, 'delete');\n if (!canDelete) return;\n\n const confirmed = await this.dialogService.confirm({\n title: 'Delete Collection',\n message: `Are you sure you want to delete \"${collection.Name}\"? This will also delete all child collections and remove all artifacts. This action cannot be undone.`,\n okText: 'Delete',\n cancelText: 'Cancel',\n dangerous: true\n });\n\n console.log('Delete confirmed:', confirmed);\n\n if (confirmed) {\n try {\n console.log('Attempting to delete collection and all children...');\n await this.deleteCollectionRecursive(collection.ID);\n await this.loadCollections();\n } catch (error) {\n console.error('Error deleting collection:', error);\n await this.dialogService.alert('Error', `An error occurred while deleting the collection: ${error}`);\n }\n }\n }\n\n private async deleteCollectionRecursive(collectionId: string): Promise<void> {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n\n // Step 1: Find and delete all child collections recursively\n const childrenResult = await rv.RunView<MJCollectionEntity>(\n {\n EntityName: 'MJ: Collections',\n ExtraFilter: `ParentID='${collectionId}'`,\n MaxRows: 1000,\n ResultType: 'entity_object'\n },\n this.currentUser\n );\n\n if (childrenResult.Success && childrenResult.Results) {\n for (const child of childrenResult.Results) {\n await this.deleteCollectionRecursive(child.ID);\n }\n }\n\n // Step 2: Delete all permissions for this collection\n await this.permissionService.deleteAllPermissions(collectionId, this.currentUser);\n\n // Step 3: Delete all artifact links for this collection\n const artifactsResult = await rv.RunView<any>(\n {\n EntityName: 'MJ: Collection Artifacts',\n ExtraFilter: `CollectionID='${collectionId}'`,\n MaxRows: 1000,\n ResultType: 'entity_object'\n },\n this.currentUser\n );\n\n if (artifactsResult.Success && artifactsResult.Results) {\n for (const ca of artifactsResult.Results) {\n await ca.Delete();\n }\n }\n\n // Step 4: Delete the collection itself\n const md = this.ProviderToUse;\n const collection = await md.GetEntityObject<MJCollectionEntity>('MJ: Collections', this.currentUser);\n await collection.Load(collectionId);\n const deleted = await collection.Delete();\n\n if (!deleted) {\n throw new Error(`Failed to delete collection: ${collection.LatestResult?.Message || 'Unknown error'}`);\n }\n }\n\n async onCollectionSaved(collection: MJCollectionEntity): Promise<void> {\n this.isFormModalOpen = false;\n this.editingCollection = undefined;\n await this.loadCollections();\n // Reload current collection permission (it was cleared by loadUserPermissions)\n await this.loadCurrentCollectionPermission();\n\n // Update breadcrumb and currentCollection if the saved collection is in the trail\n this.updateBreadcrumbName(collection.ID, collection.Name);\n if (this.currentCollection && UUIDsEqual(this.currentCollection.ID, collection.ID)) {\n this.currentCollection = collection;\n }\n\n // Rebuild unified list to show new collection\n this.buildUnifiedItemList();\n this.cdr.detectChanges();\n }\n\n onFormCancelled(): void {\n this.isFormModalOpen = false;\n this.editingCollection = undefined;\n }\n\n async addArtifact(): Promise<void> {\n // Validate user can edit current collection\n if (this.currentCollection) {\n const canEdit = await this.validatePermission(this.currentCollection, 'edit');\n if (!canEdit) return;\n }\n\n this.showNewDropdown = false;\n this.isArtifactModalOpen = true;\n }\n\n async onArtifactSaved(artifact: MJArtifactEntity): Promise<void> {\n this.isArtifactModalOpen = false;\n await this.loadArtifacts();\n this.cdr.detectChanges();\n }\n\n onArtifactModalCancelled(): void {\n this.isArtifactModalOpen = false;\n }\n\n async removeArtifact(item: { version: MJArtifactVersionEntity; artifact: MJArtifactEntity }): Promise<void> {\n if (!this.currentCollectionId) return;\n\n // Validate user has delete permission on current collection\n if (this.currentCollection) {\n const canDelete = await this.validatePermission(this.currentCollection, 'delete');\n if (!canDelete) return;\n }\n\n const versionLabel = `\"${item.artifact.Name}\" v${item.version.VersionNumber}`;\n const confirmed = await this.dialogService.confirm({\n title: 'Remove Artifact Version',\n message: `Remove ${versionLabel} from this collection?`,\n okText: 'Remove',\n cancelText: 'Cancel'\n });\n\n if (confirmed) {\n try {\n // Delete THIS SPECIFIC VERSION from the collection\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView({\n EntityName: 'MJ: Collection Artifacts',\n ExtraFilter: `CollectionID='${this.currentCollectionId}' AND ArtifactVersionID='${item.version.ID}'`,\n ResultType: 'entity_object'\n }, this.currentUser);\n\n if (result.Success && result.Results && result.Results.length > 0) {\n // Delete this version association\n for (const joinRecord of result.Results) {\n await joinRecord.Delete();\n }\n await this.loadArtifacts();\n this.buildUnifiedItemList();\n } else {\n await this.dialogService.alert('Error', 'Collection artifact link not found.');\n }\n } catch (error) {\n console.error('Error removing artifact version:', error);\n await this.dialogService.alert('Error', 'Failed to remove artifact version from collection.');\n }\n }\n }\n\n viewArtifact(item: { version: MJArtifactVersionEntity; artifact: MJArtifactEntity }): void {\n this.activeArtifactId = item.artifact.ID;\n this.artifactState.openArtifact(item.artifact.ID, item.version.VersionNumber);\n }\n\n // Permission validation and checking methods\n private async validatePermission(\n collection: MJCollectionEntity | null,\n requiredPermission: 'edit' | 'delete' | 'share'\n ): Promise<boolean> {\n // Owner has all permissions (including backwards compatibility for null OwnerID)\n if (!collection?.OwnerID || UUIDsEqual(collection.OwnerID, this.currentUser.ID)) {\n return true;\n }\n\n const permission = this.userPermissions.get(collection.ID);\n if (!permission) {\n await this.dialogService.alert(\n 'Permission Denied',\n 'You do not have permission to perform this action.'\n );\n return false;\n }\n\n const hasPermission =\n (requiredPermission === 'edit' && permission.canEdit) ||\n (requiredPermission === 'delete' && permission.canDelete) ||\n (requiredPermission === 'share' && permission.canShare);\n\n if (!hasPermission) {\n const permissionName = requiredPermission.charAt(0).toUpperCase() + requiredPermission.slice(1);\n await this.dialogService.alert(\n 'Permission Denied',\n `You do not have ${permissionName} permission for this collection.`\n );\n return false;\n }\n\n return true;\n }\n\n canEdit(collection: MJCollectionEntity): boolean {\n // Backwards compatibility: treat null OwnerID as owned by current user\n if (!collection.OwnerID || UUIDsEqual(collection.OwnerID, this.currentUser.ID)) return true;\n\n // Check permission record\n const permission = this.userPermissions.get(collection.ID);\n return permission?.canEdit || false;\n }\n\n canDelete(collection: MJCollectionEntity): boolean {\n // Backwards compatibility: treat null OwnerID as owned by current user\n if (!collection.OwnerID || UUIDsEqual(collection.OwnerID, this.currentUser.ID)) return true;\n\n // Check permission record\n const permission = this.userPermissions.get(collection.ID);\n return permission?.canDelete || false;\n }\n\n canShare(collection: MJCollectionEntity): boolean {\n // Backwards compatibility: treat null OwnerID as owned by current user\n if (!collection.OwnerID || UUIDsEqual(collection.OwnerID, this.currentUser.ID)) return true;\n\n // Check permission record\n const permission = this.userPermissions.get(collection.ID);\n return permission?.canShare || false;\n }\n\n canEditCurrent(): boolean {\n // At root level, anyone can create\n if (!this.currentCollectionId || !this.currentCollection) {\n return true;\n }\n return this.canEdit(this.currentCollection);\n }\n\n canDeleteCurrent(): boolean {\n // At root level, no delete needed\n if (!this.currentCollectionId || !this.currentCollection) {\n return false;\n }\n return this.canDelete(this.currentCollection);\n }\n\n canShareCurrent(): boolean {\n // At root level, no share needed\n if (!this.currentCollectionId || !this.currentCollection) {\n return false;\n }\n return this.canShare(this.currentCollection);\n }\n\n isShared(collection: MJCollectionEntity): boolean {\n // Collection is shared if user is not the owner and OwnerID is set\n return collection.OwnerID != null && !UUIDsEqual(collection.OwnerID, this.currentUser.ID);\n }\n\n // Sharing methods\n async shareCollection(collection: MJCollectionEntity): Promise<void> {\n // Validate user has share permission\n const canShare = await this.validatePermission(collection, 'share');\n if (!canShare) return;\n\n this.sharingCollection = collection;\n this.isShareModalOpen = true;\n }\n\n async onPermissionsChanged(): Promise<void> {\n // Reload collections and permissions after sharing changes\n await this.loadCollections();\n this.cdr.detectChanges();\n }\n\n onShareModalCancelled(): void {\n this.isShareModalOpen = false;\n this.sharingCollection = null;\n }\n\n // Header toolbar action methods\n shareCurrentCollection(): void {\n if (this.currentCollection) {\n this.shareCollection(this.currentCollection);\n }\n }\n\n editCurrentCollection(): void {\n if (this.currentCollection) {\n this.editCollection(this.currentCollection);\n }\n }\n\n deleteCurrentCollection(): void {\n if (this.currentCollection) {\n this.deleteCollection(this.currentCollection);\n }\n }\n\n /**\n * Get the icon for an artifact using the centralized icon service.\n * Fallback priority: Plugin icon > Metadata icon > Hardcoded mapping > Generic icon\n */\n public getArtifactIcon(artifact: MJArtifactEntity): string {\n return this.artifactIconService.getArtifactIcon(artifact);\n }\n\n // ==================== NEW MAC FINDER-STYLE METHODS ====================\n\n /**\n * Build unified list of folders and artifacts (Phase 1)\n */\n private buildUnifiedItemList(): void {\n const items: CollectionViewItem[] = [];\n\n // Add folders first (collections)\n for (const collection of this.filteredCollections) {\n items.push({\n type: 'folder',\n id: collection.ID,\n name: collection.Name,\n description: collection.Description || undefined,\n icon: 'fa-folder',\n itemCount: this.itemCountMap.get(collection.ID) || 0,\n owner: collection.Owner || undefined,\n isShared: this.isShared(collection),\n selected: this.selectedItems.has(collection.ID),\n collection: collection\n });\n }\n\n // Then add artifacts\n for (const item of this.filteredArtifactVersions) {\n items.push({\n type: 'artifact',\n id: item.version.ID,\n name: item.artifact.Name,\n description: item.artifact.Description || undefined,\n icon: this.getArtifactIcon(item.artifact),\n versionNumber: item.version.VersionNumber,\n artifactType: item.artifact.Type,\n lastModified: item.version.__mj_UpdatedAt,\n selected: this.selectedItems.has(item.version.ID),\n artifact: item.artifact,\n version: item.version\n });\n }\n\n // Apply sorting and reset pagination\n this.unifiedItems = this.sortItems(items);\n this.CurrentPage = 1;\n this.cdr.detectChanges();\n }\n\n /**\n * Sort items by selected criteria (Phase 2)\n */\n private sortItems(items: CollectionViewItem[]): CollectionViewItem[] {\n return items.sort((a, b) => {\n let comparison = 0;\n\n // Always keep folders before artifacts\n if (a.type !== b.type) {\n return a.type === 'folder' ? -1 : 1;\n }\n\n // Then sort by selected criteria\n switch (this.sortBy) {\n case 'name':\n comparison = a.name.localeCompare(b.name);\n break;\n case 'date':\n const aDate = a.lastModified || new Date(0);\n const bDate = b.lastModified || new Date(0);\n comparison = aDate.getTime() - bDate.getTime();\n break;\n case 'type':\n comparison = (a.artifactType || '').localeCompare(b.artifactType || '');\n break;\n }\n\n return this.sortOrder === 'asc' ? comparison : -comparison;\n });\n }\n\n /**\n * Toggle between grid and list view\n */\n public toggleViewMode(): void {\n this.viewMode = this.viewMode === 'grid' ? 'list' : 'grid';\n // Save preference to localStorage\n localStorage.setItem('collections-view-mode', this.viewMode);\n }\n\n /**\n * Set view mode explicitly\n */\n public setViewMode(mode: CollectionViewMode): void {\n this.viewMode = mode;\n // Save preference to localStorage\n localStorage.setItem('collections-view-mode', mode);\n }\n\n /**\n * Toggle selection mode on/off\n * When entering select mode, clicks toggle selection instead of opening items\n * When exiting select mode, clears any selections\n */\n public toggleSelectMode(): void {\n this.isSelectMode = !this.isSelectMode;\n if (!this.isSelectMode) {\n // Clear selection when exiting select mode (clearSelection calls buildUnifiedItemList which calls cdr)\n this.clearSelection();\n } else {\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Exit selection mode (called when navigating to a new folder)\n */\n private exitSelectMode(): void {\n if (this.isSelectMode) {\n this.isSelectMode = false;\n this.clearSelection();\n }\n }\n\n /**\n * Set sort order - toggles asc/desc if clicking same column\n */\n public setSortBy(sortBy: CollectionSortBy): void {\n if (this.sortBy === sortBy) {\n // Toggle order if same sort\n this.sortOrder = this.sortOrder === 'asc' ? 'desc' : 'asc';\n } else {\n this.sortBy = sortBy;\n this.sortOrder = 'asc';\n }\n\n // Save sort preferences to localStorage\n localStorage.setItem('collections-sort-by', this.sortBy);\n localStorage.setItem('collections-sort-order', this.sortOrder);\n\n // Close dropdown and rebuild list\n this.showSortDropdown = false;\n this.buildUnifiedItemList();\n }\n\n /**\n * Filter items by search query (Phase 2)\n */\n public onSearchChange(query?: string): void {\n // If query parameter provided, use it; otherwise use searchQuery property\n const searchText = query !== undefined ? query : this.searchQuery;\n\n if (!searchText.trim()) {\n // Reset to all items\n this.buildUnifiedItemList();\n return;\n }\n\n const lowerQuery = searchText.toLowerCase();\n this.unifiedItems = this.unifiedItems.filter(item =>\n item.name.toLowerCase().includes(lowerQuery) ||\n item.description?.toLowerCase().includes(lowerQuery)\n );\n }\n\n /**\n * Multi-select: Toggle item selection (Phase 3)\n */\n public toggleItemSelection(item: CollectionViewItem, event: MouseEvent): void {\n event.stopPropagation();\n\n if (event.metaKey || event.ctrlKey) {\n // Cmd/Ctrl+Click: Toggle individual selection\n if (this.selectedItems.has(item.id)) {\n this.selectedItems.delete(item.id);\n } else {\n this.selectedItems.add(item.id);\n }\n } else if (event.shiftKey) {\n // Shift+Click: Select range (TODO: implement range selection)\n this.selectedItems.add(item.id);\n } else {\n // Regular click: Select only this item\n this.selectedItems.clear();\n this.selectedItems.add(item.id);\n }\n\n this.buildUnifiedItemList(); // Refresh to update selected states\n }\n\n /**\n * Multi-select: Select all items (Phase 3)\n */\n public selectAll(): void {\n this.selectedItems.clear();\n for (const item of this.unifiedItems) {\n this.selectedItems.add(item.id);\n }\n this.buildUnifiedItemList();\n }\n\n /**\n * Multi-select: Clear selection (Phase 3)\n */\n public clearSelection(): void {\n this.selectedItems.clear();\n this.buildUnifiedItemList();\n }\n\n /**\n * Multi-select: Delete selected items\n */\n public async deleteSelected(): Promise<void> {\n if (this.selectedItems.size === 0) return;\n\n const confirmed = await this.dialogService.confirm({\n title: `Delete ${this.selectedItems.size} item(s)?`,\n message: 'This action cannot be undone.',\n dangerous: true\n });\n\n if (!confirmed) return;\n\n const selectedViewItems = this.unifiedItems.filter(item => this.selectedItems.has(item.id));\n const folderItems = selectedViewItems.filter(item => item.type === 'folder' && item.collection);\n const artifactItems = selectedViewItems.filter(item => item.type === 'artifact' && item.version);\n\n try {\n for (const item of folderItems) {\n await this.deleteCollectionRecursive(item.collection!.ID);\n }\n\n if (artifactItems.length > 0 && this.currentCollectionId) {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n for (const item of artifactItems) {\n const result = await rv.RunView<MJCollectionArtifactEntity>({\n EntityName: 'MJ: Collection Artifacts',\n ExtraFilter: `CollectionID='${this.currentCollectionId}' AND ArtifactVersionID='${item.version!.ID}'`,\n ResultType: 'entity_object'\n }, this.currentUser);\n\n if (result.Success && result.Results) {\n for (const joinRecord of result.Results) {\n await joinRecord.Delete();\n }\n }\n }\n }\n\n this.clearSelection();\n await this.loadCollections();\n if (artifactItems.length > 0) {\n await this.loadArtifacts();\n }\n this.buildUnifiedItemList();\n } catch (error) {\n console.error('Error deleting selected items:', error);\n await this.dialogService.alert('Error', `An error occurred while deleting: ${error}`);\n }\n }\n\n /**\n * Get count of items in folder (Phase 1)\n */\n private async getCollectionItemCount(collectionId: string): Promise<number> {\n return this.itemCountMap.get(collectionId) || 0;\n }\n\n /**\n * Handle clicking on unified item\n * In select mode: toggles selection\n * In normal mode: opens item (folder or artifact)\n */\n public onItemClick(item: CollectionViewItem, event?: MouseEvent): void {\n // In select mode, single click toggles selection\n if (this.isSelectMode) {\n this.toggleItemSelectionSimple(item);\n return;\n }\n\n // Normal mode: open the item\n this.openItem(item);\n }\n\n /**\n * Handle double-clicking on unified item\n * Always opens the item, even in select mode\n */\n public onItemDoubleClick(item: CollectionViewItem, event?: MouseEvent): void {\n event?.preventDefault();\n this.openItem(item);\n }\n\n /**\n * Open an item (folder or artifact)\n */\n private openItem(item: CollectionViewItem): void {\n if (item.type === 'folder' && item.collection) {\n // Exit select mode when navigating to a new folder\n this.exitSelectMode();\n this.openCollection(item.collection);\n } else if (item.type === 'artifact') {\n if (!item.artifact || !item.version) {\n console.error('Artifact or version is missing for item:', item.id);\n return;\n }\n this.viewArtifact({ artifact: item.artifact, version: item.version });\n }\n }\n\n /**\n * Simple toggle for item selection (used in select mode)\n */\n private toggleItemSelectionSimple(item: CollectionViewItem): void {\n if (this.selectedItems.has(item.id)) {\n this.selectedItems.delete(item.id);\n } else {\n this.selectedItems.add(item.id);\n }\n this.buildUnifiedItemList();\n }\n\n /**\n * Get item count text for display\n */\n public getItemCountText(itemCount?: number): string {\n if (itemCount !== undefined) {\n if (itemCount === 0) return 'Empty';\n if (itemCount === 1) return '1 item';\n return `${itemCount} items`;\n }\n\n const folders = this.unifiedItems.filter(i => i.type === 'folder').length;\n const artifacts = this.unifiedItems.filter(i => i.type === 'artifact').length;\n const total = folders + artifacts;\n\n if (total === 0) return 'No items';\n if (total === 1) return '1 item';\n\n const parts: string[] = [];\n if (folders > 0) parts.push(`${folders} folder${folders > 1 ? 's' : ''}`);\n if (artifacts > 0) parts.push(`${artifacts} artifact${artifacts > 1 ? 's' : ''}`);\n\n return parts.join(', ');\n }\n\n /**\n * Handle keyboard shortcuts\n * - Cmd/Ctrl+A: Select all (enters select mode if not already)\n * - Escape: Exit select mode and clear selection\n * - Delete/Backspace: Delete selected items\n */\n public handleKeyboardShortcut(event: KeyboardEvent): void {\n // Cmd+A / Ctrl+A: Select all (enters select mode)\n if ((event.metaKey || event.ctrlKey) && event.key === 'a') {\n event.preventDefault();\n if (!this.isSelectMode) {\n this.isSelectMode = true;\n }\n this.selectAll();\n return;\n }\n\n // Escape: Exit select mode\n if (event.key === 'Escape' && this.isSelectMode) {\n event.preventDefault();\n this.exitSelectMode();\n return;\n }\n\n // Delete/Backspace: Delete selected items\n if ((event.key === 'Delete' || event.key === 'Backspace') && this.selectedItems.size > 0) {\n // Only if not focused on an input\n const target = event.target as HTMLElement;\n if (target.tagName !== 'INPUT' && target.tagName !== 'TEXTAREA') {\n event.preventDefault();\n this.deleteSelected();\n }\n return;\n }\n }\n\n /**\n * Handle right-click context menu - shows custom context menu with permission-gated actions\n */\n public onItemContextMenu(item: CollectionViewItem, event: MouseEvent): void {\n event.preventDefault();\n event.stopPropagation();\n\n // Close any open dropdowns\n this.showNewDropdown = false;\n this.showSortDropdown = false;\n\n this.contextMenuItem = item;\n this.contextMenuPosition = this.clampContextMenuPosition(event.clientX, event.clientY);\n this.showContextMenu = true;\n this.cdr.detectChanges();\n }\n\n /** Clamp menu position to keep it within the viewport */\n private clampContextMenuPosition(x: number, y: number): { x: number; y: number } {\n const menuWidth = 200;\n const menuHeight = 200;\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n\n return {\n x: Math.min(x, viewportWidth - menuWidth),\n y: Math.min(y, viewportHeight - menuHeight)\n };\n }\n\n public closeContextMenu(): void {\n this.showContextMenu = false;\n this.contextMenuItem = null;\n this.cdr.detectChanges();\n }\n\n /** Handle context menu action dispatch */\n public onContextMenuAction(action: string): void {\n const item = this.contextMenuItem;\n this.closeContextMenu();\n if (!item) return;\n\n switch (action) {\n case 'open':\n this.openItem(item);\n break;\n case 'view':\n this.openItem(item);\n break;\n case 'share':\n if (item.collection) {\n this.shareCollection(item.collection);\n }\n break;\n case 'edit':\n if (item.collection) {\n this.editCollection(item.collection);\n }\n break;\n case 'delete':\n if (item.collection) {\n this.deleteCollection(item.collection);\n }\n break;\n case 'remove':\n if (item.artifact && item.version) {\n this.removeArtifact({ artifact: item.artifact, version: item.version });\n }\n break;\n }\n }\n\n /** Close context menu on Escape key */\n @HostListener('document:keydown.escape')\n public onEscapeKey(): void {\n if (this.showContextMenu) {\n this.closeContextMenu();\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"collections-full-view.component.js","sourceRoot":"","sources":["../../../../src/lib/components/collection/collections-full-view.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, OnInit, OnDestroy, ChangeDetectorRef, HostListener } from '@angular/core';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { UserInfo, RunView, Metadata, IMetadataProvider } from '@memberjunction/core';\nimport { MJCollectionEntity, MJArtifactEntity, MJArtifactVersionEntity, MJCollectionArtifactEntity } from '@memberjunction/core-entities';\nimport { DialogService } from '../../services/dialog.service';\nimport { ArtifactStateService } from '../../services/artifact-state.service';\nimport { CollectionStateService } from '../../services/collection-state.service';\nimport { CollectionPermissionService, CollectionPermission } from '../../services/collection-permission.service';\nimport { ArtifactIconService } from '@memberjunction/ng-artifacts';\nimport { Subject, takeUntil } from 'rxjs';\nimport { CollectionViewMode, CollectionViewItem, CollectionSortBy, CollectionSortOrder } from '../../models/collection-view.model';\nimport { UUIDsEqual, NormalizeUUID } from '@memberjunction/global';\n\n/**\n * Full-panel Collections view component\n * Comprehensive collection management with artifacts display\n */\n@Component({\n standalone: false,\n selector: 'mj-collections-full-view',\n template: `\n <div class=\"collections-view\" (keydown)=\"handleKeyboardShortcut($event)\">\n <!-- Mac Finder-style Header -->\n <div class=\"collections-header\">\n <!-- Breadcrumb navigation -->\n <div class=\"collections-breadcrumb\">\n <button class=\"btn-icon nav-toggle\" (click)=\"toggleNavigator()\"\n [class.active]=\"showNavigator\" title=\"Toggle collections panel\">\n <i class=\"fas fa-bars\"></i>\n </button>\n <div class=\"breadcrumb-item\"\n [class.drag-over]=\"dragOverTargetId === 'root'\"\n (dragover)=\"onCrumbDragOver(null, $event)\"\n (dragleave)=\"onDragLeave('root')\"\n (drop)=\"onCrumbDrop(null, $event)\">\n <i class=\"fas fa-home\"></i>\n <a class=\"breadcrumb-link\" (click)=\"navigateToRoot()\">Collections</a>\n </div>\n @if (breadcrumbs.length > 0) {\n <span class=\"breadcrumb-path\">\n @for (crumb of breadcrumbs; track crumb; let last = $last) {\n <i class=\"fas fa-chevron-right breadcrumb-separator\"></i>\n <a class=\"breadcrumb-link\"\n [class.active]=\"last\"\n [class.drag-over]=\"dragOverTargetId === 'crumb:' + crumb.id\"\n (dragover)=\"onCrumbDragOver(crumb.id, $event)\"\n (dragleave)=\"onDragLeave('crumb:' + crumb.id)\"\n (drop)=\"onCrumbDrop(crumb.id, $event)\"\n (click)=\"navigateTo(crumb)\">\n {{ crumb.name }}\n </a>\n }\n </span>\n }\n </div>\n \n <!-- Action buttons -->\n <div class=\"collections-actions\">\n <!-- View mode toggle -->\n <button class=\"btn-icon\"\n (click)=\"toggleViewMode()\"\n [title]=\"viewMode === 'grid' ? 'Switch to List View' : 'Switch to Grid View'\">\n <i class=\"fas\" [ngClass]=\"viewMode === 'grid' ? 'fa-list' : 'fa-th'\"></i>\n </button>\n \n <!-- Select mode toggle -->\n <button class=\"btn-icon\"\n [class.active]=\"isSelectMode\"\n (click)=\"toggleSelectMode()\"\n [title]=\"isSelectMode ? 'Exit Select Mode' : 'Select Items'\">\n <i class=\"fas fa-check-square\"></i>\n </button>\n \n <!-- Sort dropdown (grid view only) -->\n @if (viewMode === 'grid') {\n <div class=\"dropdown-container\">\n <button class=\"btn-icon\"\n (click)=\"showSortDropdown = !showSortDropdown\"\n title=\"Sort options\">\n <i class=\"fas fa-sort\"></i>\n </button>\n @if (showSortDropdown) {\n <div class=\"dropdown-menu\">\n <button class=\"dropdown-item\"\n [class.active]=\"sortBy === 'name'\"\n (click)=\"setSortBy('name')\">\n <i class=\"fas fa-sort-alpha-down\"></i>\n <span>Sort by Name</span>\n </button>\n <button class=\"dropdown-item\"\n [class.active]=\"sortBy === 'date'\"\n (click)=\"setSortBy('date')\">\n <i class=\"fas fa-calendar\"></i>\n <span>Sort by Date</span>\n </button>\n <button class=\"dropdown-item\"\n [class.active]=\"sortBy === 'type'\"\n (click)=\"setSortBy('type')\">\n <i class=\"fas fa-tag\"></i>\n <span>Sort by Type</span>\n </button>\n </div>\n }\n </div>\n }\n \n <!-- Search -->\n <div class=\"search-container\">\n <i class=\"fas fa-search\"></i>\n <input type=\"text\"\n class=\"search-input\"\n placeholder=\"Search...\"\n [(ngModel)]=\"searchQuery\"\n (ngModelChange)=\"onSearchChange($event)\">\n @if (searchQuery) {\n <button class=\"search-clear\"\n (click)=\"searchQuery = ''; onSearchChange('')\"\n title=\"Clear search\">\n <i class=\"fas fa-times\"></i>\n </button>\n }\n </div>\n\n <!-- Current collection actions (visible when inside a collection) -->\n @if (currentCollectionId && currentCollection) {\n <div class=\"toolbar-separator\"></div>\n <div class=\"toolbar-actions-group\">\n @if (canShareCurrent()) {\n <button class=\"btn-icon\"\n (click)=\"shareCurrentCollection()\"\n [title]=\"'Share: ' + currentCollection.Name\">\n <i class=\"fas fa-share-nodes\"></i>\n </button>\n }\n @if (canEditCurrent()) {\n <button class=\"btn-icon\"\n (click)=\"editCurrentCollection()\"\n [title]=\"'Edit: ' + currentCollection.Name\">\n <i class=\"fas fa-pen-to-square\"></i>\n </button>\n }\n @if (canDeleteCurrent()) {\n <button class=\"btn-icon btn-icon-danger\"\n (click)=\"deleteCurrentCollection()\"\n [title]=\"'Delete: ' + currentCollection.Name\">\n <i class=\"fas fa-trash\"></i>\n </button>\n }\n </div>\n }\n\n <!-- New dropdown -->\n @if (canEditCurrent()) {\n <div class=\"dropdown-container\">\n <button class=\"btn-primary\"\n (click)=\"showNewDropdown = !showNewDropdown\">\n <i class=\"fas fa-plus\"></i>\n <span>New</span>\n <i class=\"fas fa-chevron-down\"></i>\n </button>\n @if (showNewDropdown) {\n <div class=\"dropdown-menu dropdown-menu-right\">\n <button class=\"dropdown-item\" (click)=\"createCollection()\">\n <i class=\"fas fa-folder-plus\"></i>\n <span>New Collection</span>\n </button>\n <button class=\"dropdown-item\"\n (click)=\"addArtifact()\"\n [disabled]=\"!currentCollectionId\">\n <i class=\"fas fa-file-plus\"></i>\n <span>New Artifact</span>\n </button>\n </div>\n }\n </div>\n }\n \n <!-- Refresh button -->\n <button class=\"btn-icon\" (click)=\"refresh()\" title=\"Refresh\">\n <i class=\"fas fa-sync\"></i>\n </button>\n </div>\n </div>\n \n <!-- Multi-select toolbar (appears when items selected) -->\n @if (selectedItems.size > 0) {\n <div class=\"selection-toolbar\">\n <div class=\"selection-info\">\n <span class=\"selection-count\">{{ selectedItems.size }} selected</span>\n </div>\n <div class=\"selection-actions\">\n <div class=\"dropdown-container\">\n <button class=\"btn-toolbar\" (click)=\"openBulkMove($event)\">\n <i class=\"fas fa-folder-tree\"></i>\n Move toβ¦\n </button>\n @if (showBulkMovePopover) {\n <div class=\"bulk-move-backdrop\" (click)=\"closeBulkMove()\"></div>\n <div class=\"dropdown-menu bulk-move-menu\">\n @if (navigatorNodes.length === 0) {\n <div class=\"dropdown-note\">No collections available</div>\n } @else {\n @for (node of navigatorNodes; track node.collection.ID) {\n <button class=\"dropdown-item\" [style.paddingLeft.px]=\"12 + node.depth * 12\"\n (click)=\"bulkMoveTo(node.collection)\">\n <i class=\"fas fa-folder\" [style.color]=\"node.collection.Color || null\"></i>\n <span>{{ node.collection.Name }}</span>\n </button>\n }\n }\n </div>\n }\n </div>\n <button class=\"btn-toolbar\" (click)=\"stageSelected()\" title=\"Add to the staging shelf to move later\">\n <i class=\"fas fa-layer-group\"></i>\n Stage\n </button>\n <button class=\"btn-toolbar\" (click)=\"clearSelection()\">\n <i class=\"fas fa-times\"></i>\n Clear\n </button>\n <button class=\"btn-toolbar btn-danger\" (click)=\"deleteSelected()\">\n <i class=\"fas fa-trash\"></i>\n Delete\n </button>\n </div>\n </div>\n }\n \n <!-- Body: navigator pane (#6) + content -->\n <div class=\"collections-body\">\n @if (showNavigator) {\n <div class=\"collections-navigator\">\n <div class=\"nav-header\">Collections</div>\n <div class=\"nav-list\">\n <button class=\"nav-row\"\n [class.active]=\"!currentCollectionId\"\n [class.drag-over]=\"dragOverTargetId === 'root'\"\n (click)=\"navigateToRoot()\"\n (dragover)=\"onCrumbDragOver(null, $event)\"\n (dragleave)=\"onDragLeave('root')\"\n (drop)=\"onCrumbDrop(null, $event)\">\n <i class=\"fas fa-home\"></i>\n <span>All Collections</span>\n </button>\n @for (node of navigatorNodes; track node.collection.ID) {\n <button class=\"nav-row\"\n [class.active]=\"isCurrentNavigator(node.collection)\"\n [class.drag-over]=\"dragOverTargetId === 'nav:' + node.collection.ID\"\n [style.paddingLeft.px]=\"10 + node.depth * 14\"\n (click)=\"navigatorClick(node.collection)\"\n (dragover)=\"onNavigatorDragOver(node.collection, $event)\"\n (dragleave)=\"onDragLeave('nav:' + node.collection.ID)\"\n (drop)=\"onNavigatorDrop(node.collection, $event)\"\n [title]=\"node.collection.Name\">\n <i class=\"fas fa-folder\" [style.color]=\"node.collection.Color || null\"></i>\n <span class=\"nav-row-name\">{{ node.collection.Name }}</span>\n </button>\n }\n </div>\n </div>\n }\n <!-- Content area -->\n <div class=\"collections-content\">\n <!-- Loading state -->\n @if (isLoading) {\n <div class=\"loading-state\">\n <mj-loading text=\"Loading collections...\" size=\"large\"></mj-loading>\n </div>\n }\n \n <!-- Empty state -->\n @if (!isLoading && unifiedItems.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fas fa-folder-open\"></i>\n <!-- Search returned no results -->\n @if (searchQuery) {\n <h3>No items found</h3>\n <p>Try adjusting your search</p>\n }\n <!-- Empty root level -->\n @if (!searchQuery && !currentCollectionId) {\n <h3>No collections yet</h3>\n <p>Create your first collection to get started</p>\n @if (canEditCurrent()) {\n <button class=\"btn-primary empty-state-cta\"\n (click)=\"createCollection()\"\n >\n <i class=\"fas fa-plus\"></i>\n Create Collection\n </button>\n }\n }\n <!-- Empty collection (has parent) -->\n @if (!searchQuery && currentCollectionId) {\n <h3>This collection is empty</h3>\n <p>Use the <strong>New</strong> button above to add collections or artifacts</p>\n }\n </div>\n }\n \n <!-- Grid view -->\n @if (!isLoading && unifiedItems.length > 0 && viewMode === 'grid') {\n <div\n class=\"unified-grid\"\n [class.select-mode]=\"isSelectMode\">\n @for (item of PagedItems; track item) {\n <div\n class=\"grid-item\"\n [class.selected]=\"item.selected\"\n [class.active]=\"item.type === 'artifact' && IsArtifactActive(item)\"\n [class.dragging]=\"draggedItemIds.includes(item.id)\"\n [class.drag-over]=\"dragOverTargetId === item.id\"\n [draggable]=\"true\"\n (dragstart)=\"onItemDragStart(item, $event)\"\n (dragend)=\"onItemDragEnd()\"\n (dragover)=\"item.type === 'folder' ? onFolderItemDragOver(item, $event) : null\"\n (dragleave)=\"item.type === 'folder' ? onDragLeave(item.id) : null\"\n (drop)=\"item.type === 'folder' ? onFolderItemDrop(item, $event) : null\"\n (click)=\"onItemClick(item, $event)\"\n (dblclick)=\"onItemDoubleClick(item, $event)\"\n (contextmenu)=\"onItemContextMenu(item, $event)\">\n <!-- Selection checkbox (hover-reveal β no explicit select mode needed) -->\n <div class=\"item-checkbox\"\n (click)=\"onCheckboxClick(item, $event)\">\n <i class=\"fas\"\n [ngClass]=\"item.selected ? 'fa-check-circle' : 'fa-circle'\"></i>\n </div>\n <!-- Folder item -->\n @if (item.type === 'folder') {\n <div\n class=\"grid-item-content\"\n [title]=\"item.description || item.name\">\n <div class=\"grid-icon folder-icon\">\n <i class=\"fas fa-folder\"></i>\n @if (item.isShared) {\n <div class=\"shared-badge\" title=\"Shared\">\n <i class=\"fas fa-users\"></i>\n </div>\n }\n </div>\n <div class=\"grid-info\">\n <div class=\"grid-name\">{{ item.name }}</div>\n @if (item.description) {\n <div class=\"grid-description\">\n {{ item.description }}\n </div>\n }\n @if (item.itemCount !== undefined) {\n <div class=\"grid-meta\">\n {{ getItemCountText(item.itemCount) }}\n </div>\n }\n @if (item.isShared && item.owner) {\n <div class=\"grid-owner\">\n <i class=\"fas fa-user\"></i>\n {{ item.owner }}\n </div>\n }\n </div>\n </div>\n }\n <!-- Artifact item -->\n @if (item.type === 'artifact') {\n <div\n class=\"grid-item-content\"\n [title]=\"item.description || item.name\">\n <div class=\"grid-icon artifact-icon\">\n <i class=\"fas\" [ngClass]=\"item.icon\"></i>\n </div>\n <div class=\"grid-info\">\n <div class=\"grid-name\">{{ item.name }}</div>\n @if (item.description) {\n <div class=\"grid-description\">\n {{ item.description }}\n </div>\n }\n <div class=\"grid-meta\">\n @if (item.versionNumber) {\n <span class=\"version-badge\">\n v{{ item.versionNumber }}\n </span>\n }\n @if (item.artifactType) {\n <span class=\"artifact-type-badge\">\n {{ item.artifactType }}\n </span>\n }\n </div>\n </div>\n </div>\n }\n </div>\n }\n </div>\n\n <!-- Pagination controls (grid mode, when more than one page) -->\n @if (TotalPages > 1) {\n <div class=\"pagination-bar\">\n <span class=\"pagination-info\">\n {{ (CurrentPage - 1) * PageSize + 1 }}β{{ CurrentPage * PageSize < unifiedItems.length ? CurrentPage * PageSize : unifiedItems.length }}\n of {{ unifiedItems.length }} items\n </span>\n <div class=\"pagination-controls\">\n <button class=\"pagination-btn\"\n [disabled]=\"CurrentPage === 1\"\n (click)=\"GoToPage(1)\"\n title=\"First page\">\n <i class=\"fas fa-angles-left\"></i>\n </button>\n <button class=\"pagination-btn\"\n [disabled]=\"CurrentPage === 1\"\n (click)=\"GoToPage(CurrentPage - 1)\"\n title=\"Previous page\">\n <i class=\"fas fa-chevron-left\"></i>\n </button>\n <span class=\"pagination-page-info\">\n Page {{ CurrentPage }} of {{ TotalPages }}\n </span>\n <button class=\"pagination-btn\"\n [disabled]=\"CurrentPage === TotalPages\"\n (click)=\"GoToPage(CurrentPage + 1)\"\n title=\"Next page\">\n <i class=\"fas fa-chevron-right\"></i>\n </button>\n <button class=\"pagination-btn\"\n [disabled]=\"CurrentPage === TotalPages\"\n (click)=\"GoToPage(TotalPages)\"\n title=\"Last page\">\n <i class=\"fas fa-angles-right\"></i>\n </button>\n </div>\n </div>\n }\n }\n \n <!-- List view -->\n @if (!isLoading && unifiedItems.length > 0 && viewMode === 'list') {\n <div\n class=\"unified-list\"\n [class.select-mode]=\"isSelectMode\">\n <table class=\"list-table\">\n <thead>\n <tr>\n <th class=\"col-checkbox\">\n <i class=\"fas\"\n [ngClass]=\"selectedItems.size === unifiedItems.length && unifiedItems.length > 0 ? 'fa-check-square' : 'fa-square'\"\n (click)=\"selectedItems.size === unifiedItems.length ? clearSelection() : selectAll()\"></i>\n </th>\n <th class=\"col-name sortable\" (click)=\"setSortBy('name')\">\n <span>Name</span>\n @if (sortBy !== 'name') {\n <i class=\"fas fa-sort\"></i>\n }\n @if (sortBy === 'name') {\n <i class=\"fas\"\n [ngClass]=\"sortOrder === 'asc' ? 'fa-sort-up' : 'fa-sort-down'\"></i>\n }\n </th>\n <th class=\"col-type sortable\" (click)=\"setSortBy('type')\">\n <span>Type</span>\n @if (sortBy !== 'type') {\n <i class=\"fas fa-sort\"></i>\n }\n @if (sortBy === 'type') {\n <i class=\"fas\"\n [ngClass]=\"sortOrder === 'asc' ? 'fa-sort-up' : 'fa-sort-down'\"></i>\n }\n </th>\n <th class=\"col-modified sortable\" (click)=\"setSortBy('date')\">\n <span>Modified</span>\n @if (sortBy !== 'date') {\n <i class=\"fas fa-sort\"></i>\n }\n @if (sortBy === 'date') {\n <i class=\"fas\"\n [ngClass]=\"sortOrder === 'asc' ? 'fa-sort-up' : 'fa-sort-down'\"></i>\n }\n </th>\n <th class=\"col-owner\">Owner</th>\n </tr>\n </thead>\n <tbody>\n @for (item of PagedItems; track item) {\n <tr\n class=\"list-item\"\n [class.selected]=\"item.selected\"\n [class.active]=\"item.type === 'artifact' && IsArtifactActive(item)\"\n [class.dragging]=\"draggedItemIds.includes(item.id)\"\n [class.drag-over]=\"dragOverTargetId === item.id\"\n [draggable]=\"true\"\n (dragstart)=\"onItemDragStart(item, $event)\"\n (dragend)=\"onItemDragEnd()\"\n (dragover)=\"item.type === 'folder' ? onFolderItemDragOver(item, $event) : null\"\n (dragleave)=\"item.type === 'folder' ? onDragLeave(item.id) : null\"\n (drop)=\"item.type === 'folder' ? onFolderItemDrop(item, $event) : null\"\n (click)=\"onItemClick(item, $event)\"\n (dblclick)=\"onItemDoubleClick(item, $event)\"\n (contextmenu)=\"onItemContextMenu(item, $event)\">\n <td class=\"col-checkbox\">\n <i class=\"fas\"\n [ngClass]=\"item.selected ? 'fa-check-circle' : 'fa-circle'\"\n (click)=\"onCheckboxClick(item, $event)\"></i>\n </td>\n <td class=\"col-name\">\n <div class=\"list-name-cell\">\n <i class=\"fas\"\n [ngClass]=\"item.type === 'folder' ? 'fa-folder' : item.icon\"></i>\n <span>{{ item.name }}</span>\n @if (item.isShared) {\n <i class=\"fas fa-users shared-indicator\"\n title=\"Shared\"></i>\n }\n </div>\n </td>\n <td class=\"col-type\">\n @if (item.type === 'folder') {\n <span>Folder</span>\n }\n @if (item.type === 'artifact') {\n <span class=\"artifact-type-badge\">\n {{ item.artifactType }}\n </span>\n }\n </td>\n <td class=\"col-modified\">\n @if (item.lastModified) {\n <span>\n {{ item.lastModified | date:'short' }}\n </span>\n }\n </td>\n <td class=\"col-owner\">\n @if (item.owner) {\n <span>{{ item.owner }}</span>\n }\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n\n <!-- Pagination controls (list mode only, when more than one page) -->\n @if (TotalPages > 1) {\n <div class=\"pagination-bar\">\n <span class=\"pagination-info\">\n {{ (CurrentPage - 1) * PageSize + 1 }}β{{ CurrentPage * PageSize < unifiedItems.length ? CurrentPage * PageSize : unifiedItems.length }}\n of {{ unifiedItems.length }} items\n </span>\n <div class=\"pagination-controls\">\n <button class=\"pagination-btn\"\n [disabled]=\"CurrentPage === 1\"\n (click)=\"GoToPage(1)\"\n title=\"First page\">\n <i class=\"fas fa-angles-left\"></i>\n </button>\n <button class=\"pagination-btn\"\n [disabled]=\"CurrentPage === 1\"\n (click)=\"GoToPage(CurrentPage - 1)\"\n title=\"Previous page\">\n <i class=\"fas fa-chevron-left\"></i>\n </button>\n <span class=\"pagination-page-info\">\n Page {{ CurrentPage }} of {{ TotalPages }}\n </span>\n <button class=\"pagination-btn\"\n [disabled]=\"CurrentPage === TotalPages\"\n (click)=\"GoToPage(CurrentPage + 1)\"\n title=\"Next page\">\n <i class=\"fas fa-chevron-right\"></i>\n </button>\n <button class=\"pagination-btn\"\n [disabled]=\"CurrentPage === TotalPages\"\n (click)=\"GoToPage(TotalPages)\"\n title=\"Last page\">\n <i class=\"fas fa-angles-right\"></i>\n </button>\n </div>\n </div>\n }\n }\n </div>\n </div>\n\n <!-- Staging shelf (#5) β survives navigation; drop staged items into the open collection -->\n @if (shelf.length > 0) {\n <div class=\"staging-shelf\">\n <div class=\"shelf-info\">\n <i class=\"fas fa-layer-group\"></i>\n <span>{{ shelf.length }} staged</span>\n </div>\n <div class=\"shelf-chips\">\n @for (entry of shelf; track entry.item.id) {\n <span class=\"shelf-chip\" [title]=\"entry.item.name\">\n <i class=\"fas\" [ngClass]=\"entry.item.type === 'folder' ? 'fa-folder' : entry.item.icon\"></i>\n <span class=\"shelf-chip-name\">{{ entry.item.name }}</span>\n <button class=\"shelf-chip-x\" (click)=\"removeFromShelf(entry.item.id)\" title=\"Remove\">\n <i class=\"fas fa-times\"></i>\n </button>\n </span>\n }\n </div>\n <div class=\"shelf-actions\">\n <button class=\"btn-toolbar btn-primary-toolbar\"\n (click)=\"dropShelfHere()\"\n [disabled]=\"!currentCollectionId\"\n [title]=\"currentCollectionId ? 'Move staged items into this collection' : 'Open a collection to move items here'\">\n <i class=\"fas fa-arrow-down\"></i>\n Move here\n </button>\n <button class=\"btn-toolbar\" (click)=\"clearShelf()\">Clear</button>\n </div>\n </div>\n }\n </div>\n\n <!-- Context Menu -->\n @if (showContextMenu && contextMenuItem) {\n <div class=\"context-menu-backdrop\" (click)=\"closeContextMenu()\"></div>\n <div class=\"context-menu\"\n [style.left.px]=\"contextMenuPosition.x\"\n [style.top.px]=\"contextMenuPosition.y\">\n @if (contextMenuItem.type === 'folder' && contextMenuItem.collection) {\n <button class=\"context-menu-item\" (click)=\"onContextMenuAction('open')\">\n <i class=\"fas fa-folder-open\"></i>\n <span>Open</span>\n </button>\n <div class=\"context-menu-divider\"></div>\n @if (canShare(contextMenuItem.collection)) {\n <button class=\"context-menu-item\" (click)=\"onContextMenuAction('share')\">\n <i class=\"fas fa-share-nodes\"></i>\n <span>Share</span>\n </button>\n }\n @if (canEdit(contextMenuItem.collection)) {\n <button class=\"context-menu-item\" (click)=\"onContextMenuAction('edit')\">\n <i class=\"fas fa-pen-to-square\"></i>\n <span>Edit</span>\n </button>\n }\n @if (canDelete(contextMenuItem.collection)) {\n <div class=\"context-menu-divider\"></div>\n <button class=\"context-menu-item context-menu-danger\" (click)=\"onContextMenuAction('delete')\">\n <i class=\"fas fa-trash\"></i>\n <span>Delete</span>\n </button>\n }\n }\n @if (contextMenuItem.type === 'artifact') {\n @if (showMoveSubmenu) {\n <button class=\"context-menu-item\" (click)=\"closeMoveSubmenu($event)\">\n <i class=\"fas fa-chevron-left\"></i>\n <span>Move to Collection</span>\n </button>\n <div class=\"context-menu-divider\"></div>\n @if (isLoadingMoveTargets) {\n <div class=\"context-menu-note\"><i class=\"fas fa-spinner fa-spin\"></i> Loadingβ¦</div>\n } @else if (moveTargets.length === 0) {\n <div class=\"context-menu-note\">No other collections</div>\n } @else {\n <div class=\"move-target-list\">\n @for (t of moveTargets; track t.collection.ID) {\n <button class=\"context-menu-item\" [style.paddingLeft.px]=\"14 + t.depth * 12\"\n (click)=\"moveArtifactToCollection(t.collection)\">\n <i class=\"fas fa-folder\" [style.color]=\"t.collection.Color || null\"></i>\n <span>{{ t.collection.Name }}</span>\n </button>\n }\n </div>\n }\n } @else {\n <button class=\"context-menu-item\" (click)=\"onContextMenuAction('view')\">\n <i class=\"fas fa-eye\"></i>\n <span>View</span>\n </button>\n <button class=\"context-menu-item\" (click)=\"onContextMenuAction('openConversation')\">\n <i class=\"fas fa-comments\"></i>\n <span>Open source conversation</span>\n </button>\n @if (canEditCurrent()) {\n <button class=\"context-menu-item\" (click)=\"openMoveSubmenu($event)\">\n <i class=\"fas fa-folder-tree\"></i>\n <span>Move to Collection</span>\n <i class=\"fas fa-chevron-right submenu-arrow\"></i>\n </button>\n <div class=\"context-menu-divider\"></div>\n <button class=\"context-menu-item context-menu-danger\" (click)=\"onContextMenuAction('remove')\">\n <i class=\"fas fa-times-circle\"></i>\n <span>Remove from Collection</span>\n </button>\n }\n }\n }\n </div>\n }\n\n <!-- Modals -->\n <mj-collection-form-modal\n [isOpen]=\"isFormModalOpen\"\n [collection]=\"editingCollection\"\n [parentCollection]=\"editingCollection ? undefined : (currentCollection || undefined)\"\n [environmentId]=\"environmentId\"\n [currentUser]=\"currentUser\"\n (saved)=\"onCollectionSaved($event)\"\n (cancelled)=\"onFormCancelled()\">\n </mj-collection-form-modal>\n \n <mj-artifact-create-modal\n [isOpen]=\"isArtifactModalOpen\"\n [collectionId]=\"currentCollectionId || ''\"\n [environmentId]=\"environmentId\"\n [currentUser]=\"currentUser\"\n (saved)=\"onArtifactSaved($event)\"\n (cancelled)=\"onArtifactModalCancelled()\">\n </mj-artifact-create-modal>\n \n <mj-collection-share-modal\n [isOpen]=\"isShareModalOpen\"\n [collection]=\"sharingCollection\"\n [currentUser]=\"currentUser\"\n [currentUserPermissions]=\"sharingCollection ? userPermissions.get(sharingCollection.ID) || null : null\"\n (saved)=\"onPermissionsChanged()\"\n (cancelled)=\"onShareModalCancelled()\">\n </mj-collection-share-modal>\n `,\n styles: [`\n :host {\n display: flex;\n flex-direction: column;\n flex: 1;\n min-height: 0;\n }\n\n /* Main container */\n .collections-view {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: var(--mj-bg-surface-sunken);\n position: relative;\n }\n\n /* Header */\n .collections-header {\n display: flex;\n align-items: center;\n padding: 12px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n gap: 16px;\n background: var(--mj-bg-surface);\n }\n\n .collections-breadcrumb {\n display: flex;\n align-items: center;\n gap: 6px;\n flex: 1;\n min-width: 0;\n }\n\n .breadcrumb-item {\n display: flex;\n align-items: center;\n gap: 6px;\n }\n\n .breadcrumb-item i {\n color: var(--mj-text-muted);\n font-size: 14px;\n }\n\n .breadcrumb-link {\n color: var(--mj-text-primary);\n font-weight: 500;\n cursor: pointer;\n text-decoration: none;\n white-space: nowrap;\n transition: color 150ms ease;\n font-size: 14px;\n }\n\n .breadcrumb-link:hover {\n color: var(--mj-brand-primary);\n }\n\n .breadcrumb-link.active {\n color: var(--mj-text-muted);\n cursor: default;\n }\n\n .breadcrumb-path {\n display: flex;\n align-items: center;\n gap: 6px;\n overflow-x: auto;\n }\n\n .breadcrumb-separator {\n color: var(--mj-border-strong);\n font-size: 10px;\n }\n\n .collections-actions {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n /* Button styles */\n .btn-primary {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n background: var(--mj-brand-primary);\n border: none;\n border-radius: 6px;\n color: var(--mj-text-inverse);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: background 150ms ease;\n }\n\n .btn-primary:hover {\n background: var(--mj-brand-primary-hover);\n }\n\n .btn-primary i.fa-chevron-down {\n font-size: 10px;\n margin-left: 2px;\n }\n\n .btn-icon {\n padding: 6px 10px;\n background: transparent;\n border: 1px solid var(--mj-border-strong);\n border-radius: 6px;\n cursor: pointer;\n color: var(--mj-text-muted);\n transition: all 150ms ease;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .btn-icon:hover {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-primary);\n border-color: var(--mj-text-disabled);\n }\n\n .btn-icon.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: var(--mj-brand-primary);\n }\n\n .btn-icon.active:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n }\n\n /* Dropdown menus */\n .dropdown-container {\n position: relative;\n }\n\n .dropdown-menu {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n min-width: 200px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n padding: 4px;\n z-index: 1000;\n }\n\n .dropdown-menu-right {\n left: auto;\n right: 0;\n }\n\n .dropdown-item {\n display: flex;\n align-items: center;\n gap: 10px;\n width: 100%;\n padding: 8px 12px;\n background: transparent;\n border: none;\n border-radius: 4px;\n color: var(--mj-text-primary);\n font-size: 13px;\n cursor: pointer;\n text-align: left;\n transition: background 100ms ease;\n }\n\n .dropdown-item:hover:not(:disabled) {\n background: var(--mj-bg-surface-sunken);\n }\n\n .dropdown-item:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n .dropdown-item.active {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n }\n\n .dropdown-item i {\n font-size: 14px;\n width: 16px;\n text-align: center;\n color: var(--mj-text-muted);\n }\n\n .dropdown-item.active i {\n color: var(--mj-brand-primary);\n }\n\n .dropdown-divider {\n height: 1px;\n background: var(--mj-border-default);\n margin: 4px 0;\n }\n\n /* Search */\n .search-container {\n position: relative;\n display: flex;\n align-items: center;\n min-width: 200px;\n }\n\n .search-container i.fa-search {\n position: absolute;\n left: 10px;\n color: var(--mj-text-disabled);\n font-size: 13px;\n pointer-events: none;\n }\n\n .search-input {\n width: 100%;\n padding: 6px 32px 6px 32px;\n border: 1px solid var(--mj-border-strong);\n border-radius: 6px;\n font-size: 13px;\n outline: none;\n transition: all 150ms ease;\n }\n\n .search-input:focus {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n }\n\n .search-clear {\n position: absolute;\n right: 6px;\n padding: 4px;\n background: transparent;\n border: none;\n color: var(--mj-text-disabled);\n cursor: pointer;\n border-radius: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .search-clear:hover {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n }\n\n /* Selection toolbar */\n .selection-toolbar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 8px 20px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-bottom: 1px solid color-mix(in srgb, var(--mj-brand-primary) 30%, var(--mj-bg-surface));\n }\n\n .selection-info {\n display: flex;\n align-items: center;\n gap: 12px;\n }\n\n .selection-count {\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-brand-primary);\n }\n\n .selection-actions {\n display: flex;\n gap: 8px;\n }\n\n .btn-toolbar {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-strong);\n border-radius: 6px;\n color: var(--mj-text-secondary);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: all 150ms ease;\n }\n\n .btn-toolbar:hover {\n background: var(--mj-bg-surface-sunken);\n border-color: var(--mj-text-disabled);\n }\n\n .btn-toolbar.btn-danger {\n color: var(--mj-status-error);\n border-color: color-mix(in srgb, var(--mj-status-error) 30%, var(--mj-bg-surface));\n }\n\n .btn-toolbar.btn-danger:hover {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n border-color: var(--mj-status-error);\n }\n\n /* Content area */\n .collections-content {\n display: flex;\n flex-direction: column;\n flex: 1;\n overflow-y: auto;\n padding: 20px;\n }\n\n /* Loading and empty states */\n .loading-state, .empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n flex: 1;\n min-height: 0;\n color: var(--mj-text-disabled);\n text-align: center;\n padding: 24px;\n }\n\n .empty-state > i {\n font-size: 64px;\n margin-bottom: 24px;\n opacity: 0.3;\n color: var(--mj-border-strong);\n }\n\n .empty-state h3 {\n margin: 0 0 8px 0;\n color: var(--mj-text-secondary);\n font-size: 18px;\n font-weight: 600;\n }\n\n .empty-state p {\n margin: 0 0 24px 0;\n font-size: 14px;\n color: var(--mj-text-muted);\n }\n\n .empty-state .empty-state-cta {\n padding: 10px 20px;\n font-size: 14px;\n border-radius: 8px;\n }\n\n .empty-state-actions {\n display: flex;\n gap: 12px;\n flex-wrap: wrap;\n justify-content: center;\n }\n\n /* Grid view */\n .unified-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(140px, 1fr));\n gap: 16px;\n padding: 4px;\n flex-shrink: 0;\n }\n\n .grid-item {\n display: flex;\n flex-direction: column;\n padding: 12px;\n background: var(--mj-bg-surface);\n border: 2px solid transparent;\n border-radius: 8px;\n cursor: pointer;\n transition: all 150ms ease;\n position: relative;\n user-select: none;\n }\n\n .grid-item:hover {\n background: var(--mj-bg-surface-sunken);\n border-color: var(--mj-border-strong);\n }\n\n .grid-item.selected {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary);\n }\n\n .grid-item.active {\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n border-color: var(--mj-status-warning);\n box-shadow: 0 0 0 1px var(--mj-status-warning);\n }\n\n .grid-item.active:hover {\n background: color-mix(in srgb, var(--mj-status-warning) 25%, var(--mj-bg-surface));\n }\n\n /* Select mode styling for grid */\n .unified-grid.select-mode .grid-item {\n cursor: pointer;\n }\n\n .unified-grid.select-mode .grid-item:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-color: color-mix(in srgb, var(--mj-brand-primary) 30%, var(--mj-bg-surface));\n }\n\n .item-checkbox {\n position: absolute;\n top: 8px;\n right: 8px;\n width: 20px;\n height: 20px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n z-index: 10;\n }\n\n .item-checkbox i {\n font-size: 16px;\n color: var(--mj-text-disabled);\n transition: color 150ms ease;\n }\n\n .grid-item.selected .item-checkbox i,\n .item-checkbox:hover i {\n color: var(--mj-brand-primary);\n }\n\n .grid-item-content {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 8px;\n }\n\n .grid-icon {\n width: 64px;\n height: 64px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 8px;\n position: relative;\n }\n\n .grid-icon.folder-icon {\n background: var(--mj-brand-primary);\n }\n\n .grid-icon.folder-icon i {\n font-size: 36px;\n color: var(--mj-text-inverse);\n }\n\n .grid-icon.artifact-icon {\n background: var(--mj-bg-surface-sunken);\n }\n\n .grid-icon.artifact-icon i {\n font-size: 32px;\n color: var(--mj-text-muted);\n }\n\n .shared-badge {\n position: absolute;\n top: -4px;\n right: -4px;\n width: 20px;\n height: 20px;\n background: var(--mj-status-success);\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n border: 2px solid var(--mj-bg-surface);\n }\n\n .shared-badge i {\n font-size: 10px;\n color: var(--mj-text-inverse);\n }\n\n .grid-info {\n width: 100%;\n text-align: center;\n }\n\n .grid-name {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n line-height: 1.3;\n margin-bottom: 4px;\n /* Allow wrapping to 2 lines max */\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n word-break: break-word;\n }\n\n .grid-description {\n font-size: 11px;\n color: var(--mj-text-muted);\n line-height: 1.3;\n margin-bottom: 4px;\n /* Allow wrapping to 2 lines max */\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n word-break: break-word;\n }\n\n .grid-meta {\n font-size: 11px;\n color: var(--mj-text-muted);\n margin-top: 4px;\n }\n\n .grid-owner {\n font-size: 11px;\n color: var(--mj-text-muted);\n margin-top: 2px;\n }\n\n .grid-owner i {\n font-size: 10px;\n margin-right: 3px;\n }\n\n .version-badge {\n display: inline-block;\n padding: 2px 6px;\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n color: var(--mj-status-warning);\n border-radius: 3px;\n font-size: 10px;\n font-weight: 600;\n font-family: monospace;\n margin-right: 4px;\n }\n\n .artifact-type-badge {\n display: inline-block;\n padding: 2px 6px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n border-radius: 3px;\n font-size: 10px;\n font-weight: 500;\n text-transform: uppercase;\n }\n\n /* List view */\n .unified-list {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n overflow: hidden;\n flex-shrink: 0;\n }\n\n .list-table {\n width: 100%;\n border-collapse: collapse;\n }\n\n .list-table thead {\n background: var(--mj-bg-surface-sunken);\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .list-table th {\n padding: 10px 16px;\n text-align: left;\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n\n .list-table th.sortable {\n cursor: pointer;\n user-select: none;\n transition: color 150ms ease;\n }\n\n .list-table th.sortable:hover {\n color: var(--mj-brand-primary);\n }\n\n .list-table th.sortable span {\n display: inline-block;\n margin-right: 6px;\n }\n\n .list-table th.sortable i {\n font-size: 10px;\n opacity: 0.5;\n }\n\n .list-table th.sortable:hover i {\n opacity: 1;\n }\n\n .list-table tbody tr {\n border-bottom: 1px solid var(--mj-bg-surface-sunken);\n transition: background 150ms ease;\n cursor: pointer;\n user-select: none;\n }\n\n .list-table tbody tr:last-child {\n border-bottom: none;\n }\n\n .list-table tbody tr:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .list-table tbody tr.selected {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n }\n\n .list-table tbody tr.active {\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n border-left: 3px solid var(--mj-status-warning);\n }\n\n .list-table tbody tr.active:hover {\n background: color-mix(in srgb, var(--mj-status-warning) 25%, var(--mj-bg-surface));\n }\n\n .list-table td {\n padding: 12px 16px;\n font-size: 13px;\n color: var(--mj-text-secondary);\n }\n\n .col-checkbox {\n width: 40px;\n text-align: center;\n }\n\n .col-checkbox i {\n font-size: 16px;\n color: var(--mj-text-disabled);\n cursor: pointer;\n transition: color 150ms ease;\n }\n\n .col-checkbox i:hover,\n .list-table tbody tr.selected .col-checkbox i {\n color: var(--mj-brand-primary);\n }\n\n .col-name {\n min-width: 300px;\n }\n\n .list-name-cell {\n display: flex;\n align-items: center;\n gap: 10px;\n }\n\n .list-name-cell i {\n font-size: 16px;\n color: var(--mj-text-muted);\n width: 20px;\n text-align: center;\n }\n\n .list-name-cell .fa-folder {\n color: var(--mj-brand-primary);\n }\n\n .shared-indicator {\n font-size: 12px;\n color: var(--mj-status-success);\n margin-left: auto;\n }\n\n .col-type {\n width: 150px;\n }\n\n .col-modified {\n width: 180px;\n }\n\n .col-owner {\n width: 150px;\n }\n\n /* Pagination */\n .pagination-bar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 10px 16px;\n margin-top: 8px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n font-size: 13px;\n color: var(--mj-text-secondary);\n flex-shrink: 0;\n }\n\n .pagination-info {\n white-space: nowrap;\n }\n\n .pagination-controls {\n display: flex;\n align-items: center;\n gap: 4px;\n }\n\n .pagination-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 150ms ease;\n font-size: 12px;\n }\n\n .pagination-btn:hover:not(:disabled) {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-border-strong);\n color: var(--mj-text-primary);\n }\n\n .pagination-btn:disabled {\n opacity: 0.35;\n cursor: default;\n }\n\n .pagination-page-info {\n padding: 0 8px;\n white-space: nowrap;\n font-weight: 500;\n }\n\n /* Toolbar separator and action group */\n .toolbar-separator {\n width: 1px;\n height: 24px;\n background: var(--mj-border-strong);\n margin: 0 4px;\n }\n\n .toolbar-actions-group {\n display: flex;\n align-items: center;\n gap: 4px;\n }\n\n .btn-icon-danger {\n color: var(--mj-status-error);\n border-color: color-mix(in srgb, var(--mj-status-error) 30%, var(--mj-bg-surface));\n }\n\n .btn-icon-danger:hover {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n border-color: var(--mj-status-error);\n }\n\n /* Context menu */\n .context-menu-backdrop {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: 1999;\n }\n\n .context-menu {\n position: fixed;\n min-width: 180px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n box-shadow: 0 4px 16px rgba(0, 0, 0, 0.18);\n padding: 4px;\n z-index: 2000;\n }\n\n .context-menu-item {\n display: flex;\n align-items: center;\n gap: 10px;\n width: 100%;\n padding: 8px 12px;\n background: transparent;\n border: none;\n border-radius: 4px;\n color: var(--mj-text-primary);\n font-size: 13px;\n cursor: pointer;\n text-align: left;\n transition: background 100ms ease;\n }\n\n .context-menu-item:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .context-menu-item i {\n font-size: 14px;\n width: 16px;\n text-align: center;\n color: var(--mj-text-muted);\n }\n\n .context-menu-danger {\n color: var(--mj-status-error);\n }\n\n .context-menu-danger i {\n color: var(--mj-status-error);\n }\n\n .context-menu-danger:hover {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n }\n\n .context-menu-divider {\n height: 1px;\n background: var(--mj-border-default);\n margin: 4px 0;\n }\n .submenu-arrow {\n margin-left: auto;\n font-size: 10px;\n opacity: 0.6;\n }\n .move-target-list {\n max-height: 240px;\n overflow-y: auto;\n }\n .context-menu-note {\n padding: 8px 14px;\n font-size: 12px;\n color: var(--mj-text-muted);\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n /* ===== Body: navigator pane + content (#6) ===== */\n .collections-body {\n flex: 1;\n display: flex;\n flex-direction: row;\n min-height: 0;\n overflow: hidden;\n }\n .collections-navigator {\n width: 240px;\n flex-shrink: 0;\n border-right: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n overflow-y: auto;\n display: flex;\n flex-direction: column;\n }\n .nav-header {\n padding: 12px 14px 8px;\n font-size: 11px;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.06em;\n color: var(--mj-text-muted);\n }\n .nav-list { display: flex; flex-direction: column; padding: 0 6px 12px; gap: 1px; }\n .nav-row {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n padding: 7px 10px;\n border: 1px solid transparent;\n border-radius: 6px;\n background: transparent;\n color: var(--mj-text-secondary);\n font-size: 13px;\n text-align: left;\n cursor: pointer;\n transition: background 0.12s ease;\n }\n .nav-row:hover { background: var(--mj-bg-surface-hover); color: var(--mj-text-primary); }\n .nav-row.active {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-weight: 600;\n }\n .nav-row.drag-over {\n background: color-mix(in srgb, var(--mj-brand-primary) 22%, transparent);\n border-color: var(--mj-brand-primary);\n }\n .nav-row i { font-size: 13px; width: 16px; flex-shrink: 0; }\n .nav-row-name { flex: 1; min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\n .nav-toggle.active { color: var(--mj-brand-primary); }\n\n /* ===== Drag-and-drop visuals (#1/#2) ===== */\n .grid-item.dragging, .list-item.dragging { opacity: 0.4; }\n .grid-item.drag-over {\n border-color: var(--mj-brand-primary) !important;\n background: color-mix(in srgb, var(--mj-brand-primary) 18%, var(--mj-bg-surface)) !important;\n }\n .list-item.drag-over td {\n background: color-mix(in srgb, var(--mj-brand-primary) 14%, var(--mj-bg-surface));\n box-shadow: inset 0 0 0 1px var(--mj-brand-primary);\n }\n .breadcrumb-item.drag-over, .breadcrumb-link.drag-over {\n background: color-mix(in srgb, var(--mj-brand-primary) 20%, transparent);\n border-radius: 6px;\n outline: 1px solid var(--mj-brand-primary);\n }\n\n /* Hover-reveal checkboxes (frictionless selection #4) */\n .item-checkbox { opacity: 0; transition: opacity 150ms ease; }\n .grid-item:hover .item-checkbox,\n .grid-item.selected .item-checkbox,\n .unified-grid.select-mode .item-checkbox { opacity: 1; }\n .list-item .col-checkbox i { opacity: 0; transition: opacity 150ms ease; }\n .list-item:hover .col-checkbox i,\n .list-item.selected .col-checkbox i,\n .unified-list.select-mode .col-checkbox i { opacity: 1; }\n .list-item.selected .col-checkbox i { color: var(--mj-brand-primary); }\n\n /* ===== Bulk \"Move toβ¦\" popover (#3) ===== */\n .bulk-move-backdrop {\n position: fixed; inset: 0; z-index: 1000;\n }\n .bulk-move-menu {\n max-height: 320px;\n overflow-y: auto;\n z-index: 1001;\n }\n .dropdown-note { padding: 10px 14px; font-size: 12px; color: var(--mj-text-muted); }\n\n /* ===== Staging shelf (#5) ===== */\n .staging-shelf {\n flex-shrink: 0;\n display: flex;\n align-items: center;\n gap: 14px;\n padding: 10px 16px;\n background: var(--mj-bg-surface);\n border-top: 1px solid var(--mj-border-default);\n box-shadow: 0 -2px 8px color-mix(in srgb, var(--mj-text-primary) 6%, transparent);\n }\n .shelf-info {\n display: flex; align-items: center; gap: 8px;\n font-weight: 600; font-size: 13px; color: var(--mj-text-primary);\n flex-shrink: 0;\n }\n .shelf-info i { color: var(--mj-brand-primary); }\n .shelf-chips {\n flex: 1; min-width: 0;\n display: flex; gap: 6px; overflow-x: auto; padding: 2px 0;\n }\n .shelf-chip {\n display: inline-flex; align-items: center; gap: 6px;\n padding: 4px 6px 4px 10px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-default);\n border-radius: 999px;\n font-size: 12px; color: var(--mj-text-secondary);\n flex-shrink: 0;\n }\n .shelf-chip-name { max-width: 120px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\n .shelf-chip-x {\n width: 18px; height: 18px; border: 0; background: transparent;\n color: var(--mj-text-muted); cursor: pointer; border-radius: 50%;\n display: flex; align-items: center; justify-content: center; font-size: 10px;\n }\n .shelf-chip-x:hover { background: var(--mj-bg-surface-hover); color: var(--mj-text-primary); }\n .shelf-actions { display: flex; gap: 8px; flex-shrink: 0; }\n .btn-toolbar.btn-primary-toolbar {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border-color: var(--mj-brand-primary);\n }\n .btn-toolbar.btn-primary-toolbar:hover:not(:disabled) { background: var(--mj-brand-primary-hover); }\n .btn-toolbar:disabled { opacity: 0.5; cursor: not-allowed; }\n `]\n})\nexport class CollectionsFullViewComponent extends BaseAngularComponent implements OnInit, OnDestroy {\n @Input() environmentId!: string;\n @Input() currentUser!: UserInfo;\n @Output() collectionNavigated = new EventEmitter<{\n collectionId: string | null;\n versionId?: string | null;\n }>();\n\n /** Emitted when the user asks to open the conversation an artifact was produced in. */\n @Output() openConversationRequested = new EventEmitter<{ conversationId: string }>();\n\n public collections: MJCollectionEntity[] = [];\n public artifactVersions: Array<{ version: MJArtifactVersionEntity; artifact: MJArtifactEntity }> = [];\n public filteredCollections: MJCollectionEntity[] = [];\n public filteredArtifactVersions: Array<{ version: MJArtifactVersionEntity; artifact: MJArtifactEntity }> = [];\n public isLoading: boolean = false;\n public breadcrumbs: Array<{ id: string; name: string }> = [];\n public currentCollectionId: string | null = null;\n public currentCollection: MJCollectionEntity | null = null;\n\n public isFormModalOpen: boolean = false;\n public editingCollection?: MJCollectionEntity;\n public isArtifactModalOpen: boolean = false;\n\n public userPermissions: Map<string, CollectionPermission> = new Map();\n public isShareModalOpen: boolean = false;\n public sharingCollection: MJCollectionEntity | null = null;\n\n // New UI state for Mac Finder-style view\n public viewMode: CollectionViewMode = 'grid';\n public sortBy: CollectionSortBy = 'name';\n public sortOrder: CollectionSortOrder = 'asc';\n public searchQuery: string = '';\n public unifiedItems: CollectionViewItem[] = [];\n public selectedItems: Set<string> = new Set();\n public showNewDropdown: boolean = false;\n public showSortDropdown: boolean = false;\n public activeArtifactId: string | null = null; // Track which artifact is currently being viewed\n private itemCountMap: Map<string, number> = new Map();\n public isSelectMode: boolean = false; // Toggle for selection mode\n\n // Pagination state\n public PageSize: number = 50;\n public CurrentPage: number = 1;\n\n /** Total number of pages based on current items and page size */\n get TotalPages(): number {\n return Math.max(1, Math.ceil(this.unifiedItems.length / this.PageSize));\n }\n\n /** Items for the current page */\n get PagedItems(): CollectionViewItem[] {\n const start = (this.CurrentPage - 1) * this.PageSize;\n return this.unifiedItems.slice(start, start + this.PageSize);\n }\n\n /** Navigate to a specific page */\n GoToPage(page: number): void {\n this.CurrentPage = Math.max(1, Math.min(page, this.TotalPages));\n }\n\n IsArtifactActive(item: CollectionViewItem): boolean {\n return UUIDsEqual(item.artifact?.ID, this.activeArtifactId);\n }\n\n // Context menu state\n public showContextMenu: boolean = false;\n public contextMenuPosition: { x: number; y: number } = { x: 0, y: 0 };\n public contextMenuItem: CollectionViewItem | null = null;\n\n /** \"Move to Collection\" submenu state (within the artifact context menu). */\n public showMoveSubmenu: boolean = false;\n public isLoadingMoveTargets: boolean = false;\n public moveTargets: Array<{ collection: MJCollectionEntity; depth: number }> = [];\n\n /** Anchor index (into unifiedItems) for shift-click range selection. */\n private lastSelectedIndex: number | null = null;\n\n /** Drag-and-drop state. draggedItemIds = the item ids being dragged (1 or the whole selection). */\n public draggedItemIds: string[] = [];\n /** Tag of the current drop target for highlight: item id, 'root', 'crumb:<id>', or 'nav:<id>'. */\n public dragOverTargetId: string | null = null;\n\n /** Bulk \"Move toβ¦\" popover (selection toolbar). */\n public showBulkMovePopover: boolean = false;\n\n /** All accessible collections (navigator pane + move targets + folder-cycle checks). */\n public allCollections: MJCollectionEntity[] = [];\n private allCollectionsById: Map<string, MJCollectionEntity> = new Map();\n public navigatorNodes: Array<{ collection: MJCollectionEntity; depth: number }> = [];\n public showNavigator: boolean = true;\n\n /** Staging shelf: items held across navigation, then dropped into a destination collection. */\n public shelf: Array<{ item: CollectionViewItem; sourceCollectionId: string | null }> = [];\n\n private destroy$ = new Subject<void>();\n private isNavigatingProgrammatically = false;\n\n constructor(\n private dialogService: DialogService,\n private artifactState: ArtifactStateService,\n private collectionState: CollectionStateService,\n private permissionService: CollectionPermissionService,\n private artifactIconService: ArtifactIconService,\n private cdr: ChangeDetectorRef\n ) {\n super();}\n\n ngOnInit() {\n // Bind provider-aware services to this component's provider.\n const p = this.ProviderToUse;\n this.artifactState.Provider = p;\n this.permissionService.Provider = p;\n\n // Subscribe to collection state changes for deep linking FIRST\n // This ensures that if there's a URL with collectionId, we set it before loading data\n this.subscribeToCollectionState();\n\n // Subscribe to artifact state changes to track active artifact\n this.subscribeToArtifactState();\n\n // Load the full collection set for the navigator pane + drag targets + cycle checks\n void this.loadAllCollections();\n\n // Check if there's an active collection from URL params (set by parent component)\n const activeCollectionId = this.collectionState.activeCollectionId;\n if (activeCollectionId) {\n // If there's an active collection, navigate to it (which will call loadData)\n console.log('π Initial load with active collection:', activeCollectionId);\n this.navigateToCollectionById(activeCollectionId);\n } else {\n // Otherwise, just load the root level\n this.loadData();\n }\n }\n\n ngOnDestroy() {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n /**\n * Subscribe to collection state changes for deep linking support\n */\n private subscribeToCollectionState(): void {\n // Watch for external navigation requests (e.g., from search or URL)\n this.collectionState.activeCollectionId$\n .pipe(takeUntil(this.destroy$))\n .subscribe(collectionId => {\n // Ignore state changes that we triggered ourselves\n if (this.isNavigatingProgrammatically) {\n return;\n }\n\n // Only navigate if the state is different from our current state\n // This prevents double-loading during initialization\n if (collectionId !== this.currentCollectionId) {\n if (collectionId) {\n console.log('π Collection state changed externally, navigating to:', collectionId);\n this.navigateToCollectionById(collectionId);\n } else {\n console.log('π Collection state cleared externally, navigating to root');\n this.navigateToRoot();\n }\n }\n });\n }\n\n /**\n * Subscribe to artifact state changes to track which artifact is currently open\n */\n private subscribeToArtifactState(): void {\n this.artifactState.activeArtifact$\n .pipe(takeUntil(this.destroy$))\n .subscribe(artifact => {\n // Update active artifact ID for highlighting\n this.activeArtifactId = artifact?.ID || null;\n });\n }\n\n async loadData(): Promise<void> {\n // Only show loading spinner if we don't have data yet\n // This prevents flash of loading when navigating between collections\n const hasData = this.collections.length > 0 || this.unifiedItems.length > 0;\n if (!hasData) {\n this.isLoading = true;\n }\n\n try {\n // Load saved view preferences from localStorage\n const savedMode = localStorage.getItem('collections-view-mode');\n if (savedMode === 'grid' || savedMode === 'list') {\n this.viewMode = savedMode;\n }\n\n const savedSortBy = localStorage.getItem('collections-sort-by');\n if (savedSortBy === 'name' || savedSortBy === 'date' || savedSortBy === 'type') {\n this.sortBy = savedSortBy;\n }\n\n const savedSortOrder = localStorage.getItem('collections-sort-order');\n if (savedSortOrder === 'asc' || savedSortOrder === 'desc') {\n this.sortOrder = savedSortOrder;\n }\n\n await Promise.all([\n this.loadCollections(),\n this.loadArtifacts(),\n this.loadCurrentCollectionPermission()\n ]);\n\n // Build unified item list after data loads\n this.buildUnifiedItemList();\n } finally {\n this.isLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n private async loadCollections(bypassCache: boolean = false): Promise<void> {\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n\n // Load collections where user is owner OR has permissions\n const ownerFilter = `OwnerID='${this.currentUser.ID}'`;\n const permissionSubquery = `ID IN (\n SELECT CollectionID\n FROM [__mj].[vwCollectionPermissions]\n WHERE UserID='${this.currentUser.ID}'\n )`;\n\n const baseFilter = `EnvironmentID='${this.environmentId}'` +\n (this.currentCollectionId ? ` AND ParentID='${this.currentCollectionId}'` : ' AND ParentID IS NULL');\n\n const filter = `${baseFilter} AND (OwnerID IS NULL OR ${ownerFilter} OR ${permissionSubquery})`;\n\n const result = await rv.RunView<MJCollectionEntity>(\n {\n EntityName: 'MJ: Collections',\n ExtraFilter: filter,\n OrderBy: 'Name ASC',\n MaxRows: 1000,\n ResultType: 'entity_object',\n BypassCache: bypassCache\n },\n this.currentUser\n );\n\n if (result.Success) {\n this.collections = result.Results || [];\n await Promise.all([\n this.loadUserPermissions(),\n this.loadItemCounts(bypassCache)\n ]);\n this.filteredCollections = [...this.collections];\n }\n } catch (error) {\n console.error('Failed to load collections:', error);\n }\n }\n\n /**\n * Load item counts (child collections + artifacts) for all visible collections.\n * `bypassCache` is passed right after a mutation so the count badges reflect committed\n * DB state immediately (cache invalidation is async relative to Save/Delete resolving).\n */\n private async loadItemCounts(bypassCache: boolean = false): Promise<void> {\n this.itemCountMap.clear();\n if (this.collections.length === 0) return;\n\n const collectionIds = this.collections.map(c => c.ID);\n const inClause = collectionIds.map(id => `'${id}'`).join(',');\n\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const [childResult, artifactResult] = await rv.RunViews(\n [\n {\n EntityName: 'MJ: Collections',\n ExtraFilter: `ParentID IN (${inClause})`,\n Fields: ['ID', 'ParentID'],\n ResultType: 'simple',\n BypassCache: bypassCache\n },\n {\n EntityName: 'MJ: Collection Artifacts',\n ExtraFilter: `CollectionID IN (${inClause})`,\n Fields: ['ID', 'CollectionID'],\n ResultType: 'simple',\n BypassCache: bypassCache\n }\n ],\n this.currentUser\n );\n\n // Count children per parent\n if (childResult.Success && childResult.Results) {\n for (const child of childResult.Results) {\n const parentId = (child as Record<string, string>).ParentID;\n this.itemCountMap.set(parentId, (this.itemCountMap.get(parentId) || 0) + 1);\n }\n }\n\n // Count artifacts per collection\n if (artifactResult.Success && artifactResult.Results) {\n for (const ca of artifactResult.Results) {\n const collId = (ca as Record<string, string>).CollectionID;\n this.itemCountMap.set(collId, (this.itemCountMap.get(collId) || 0) + 1);\n }\n }\n }\n\n private async loadUserPermissions(): Promise<void> {\n this.userPermissions.clear();\n\n for (const collection of this.collections) {\n const permission = await this.permissionService.checkPermission(\n collection.ID,\n this.currentUser.ID,\n this.currentUser\n );\n\n if (permission) {\n this.userPermissions.set(collection.ID, permission);\n }\n }\n }\n\n private async loadCurrentCollectionPermission(): Promise<void> {\n if (!this.currentCollectionId || !this.currentCollection) {\n return;\n }\n\n const permission = await this.permissionService.checkPermission(\n this.currentCollectionId,\n this.currentUser.ID,\n this.currentUser\n );\n\n if (permission) {\n this.userPermissions.set(this.currentCollectionId, permission);\n }\n }\n\n private async loadArtifacts(bypassCache: boolean = false): Promise<void> {\n if (!this.currentCollectionId) {\n this.artifactVersions = [];\n this.filteredArtifactVersions = [];\n return;\n }\n\n try {\n this.artifactVersions = await this.artifactState.loadArtifactVersionsForCollection(\n this.currentCollectionId,\n this.currentUser,\n bypassCache\n );\n this.filteredArtifactVersions = [...this.artifactVersions];\n } catch (error) {\n console.error('Failed to load artifact versions:', error);\n }\n }\n\n async openCollection(collection: MJCollectionEntity): Promise<void> {\n this.isNavigatingProgrammatically = true;\n try {\n this.breadcrumbs.push({ id: collection.ID, name: collection.Name });\n this.currentCollectionId = collection.ID;\n this.currentCollection = collection;\n this.activeArtifactId = null; // Clear active artifact when switching collections\n await this.loadData();\n\n // Update state service\n this.collectionState.setActiveCollection(collection.ID);\n\n // Close any open artifact when switching collections\n this.collectionNavigated.emit({\n collectionId: collection.ID,\n versionId: null\n });\n } finally {\n this.isNavigatingProgrammatically = false;\n }\n }\n\n async navigateTo(crumb: { id: string; name: string }): Promise<void> {\n this.isNavigatingProgrammatically = true;\n try {\n const index = this.breadcrumbs.findIndex(b => b.id === crumb.id);\n if (index !== -1) {\n this.breadcrumbs = this.breadcrumbs.slice(0, index + 1);\n this.currentCollectionId = crumb.id;\n\n // Load the collection entity\n const md = this.ProviderToUse;\n this.currentCollection = await md.GetEntityObject<MJCollectionEntity>('MJ: Collections', this.currentUser);\n await this.currentCollection.Load(crumb.id);\n\n await this.loadData();\n\n // Update state service\n this.collectionState.setActiveCollection(crumb.id);\n\n // Close any open artifact when navigating collections\n this.collectionNavigated.emit({\n collectionId: crumb.id,\n versionId: null\n });\n }\n } finally {\n this.isNavigatingProgrammatically = false;\n }\n }\n\n async navigateToRoot(): Promise<void> {\n this.isNavigatingProgrammatically = true;\n try {\n this.breadcrumbs = [];\n this.currentCollectionId = null;\n this.currentCollection = null;\n await this.loadData();\n\n // Update state service\n this.collectionState.setActiveCollection(null);\n\n // Close any open artifact when navigating to root\n this.collectionNavigated.emit({\n collectionId: null,\n versionId: null\n });\n } finally {\n this.isNavigatingProgrammatically = false;\n }\n }\n\n /**\n * Update a breadcrumb entry's name in place (e.g., after rename)\n */\n private updateBreadcrumbName(collectionId: string, newName: string): void {\n const crumb = this.breadcrumbs.find(b => UUIDsEqual(b.id, collectionId));\n if (crumb) {\n crumb.name = newName;\n }\n }\n\n /**\n * Navigate to a collection by ID, building the breadcrumb trail\n * Used for deep linking from search results or URL parameters\n */\n async navigateToCollectionById(collectionId: string): Promise<void> {\n this.isNavigatingProgrammatically = true;\n try {\n console.log('π Navigating to collection by ID:', collectionId);\n\n // Load the target collection\n const md = this.ProviderToUse;\n const targetCollection = await md.GetEntityObject<MJCollectionEntity>('MJ: Collections', this.currentUser);\n await targetCollection.Load(collectionId);\n\n if (!targetCollection || !targetCollection.ID) {\n console.error('β Failed to load collection:', collectionId);\n return;\n }\n\n // Build breadcrumb trail by traversing parent hierarchy\n // Note: breadcrumbs includes ALL collections in the path including the current one\n const trail: Array<{ id: string; name: string }> = [];\n let currentId: string | null = targetCollection.ParentID;\n\n while (currentId) {\n const parentCollection = await md.GetEntityObject<MJCollectionEntity>('MJ: Collections', this.currentUser);\n await parentCollection.Load(currentId);\n\n if (parentCollection && parentCollection.ID) {\n // Add to front of trail (we're working backwards)\n trail.unshift({\n id: parentCollection.ID,\n name: parentCollection.Name\n });\n currentId = parentCollection.ParentID;\n } else {\n break;\n }\n }\n\n // Add the target collection to the trail (breadcrumbs includes current collection)\n trail.push({\n id: targetCollection.ID,\n name: targetCollection.Name\n });\n\n // Update component state\n this.breadcrumbs = trail;\n this.currentCollectionId = targetCollection.ID;\n this.currentCollection = targetCollection;\n\n // Load collections and artifacts for this collection\n await this.loadData();\n\n // Update state service\n this.collectionState.setActiveCollection(targetCollection.ID);\n\n // Emit navigation event\n // NOTE: We don't emit artifactId here because this is for deep linking/programmatic navigation\n // Artifact state is managed separately by the artifact state service\n this.collectionNavigated.emit({\n collectionId: targetCollection.ID\n });\n\n console.log('β
Successfully navigated to collection with breadcrumb trail:', trail);\n } catch (error) {\n console.error('β Error navigating to collection:', error);\n } finally {\n this.isNavigatingProgrammatically = false;\n }\n }\n\n refresh(): void {\n this.loadData();\n }\n\n async createCollection(): Promise<void> {\n // Validate user can edit current collection (or at root level)\n if (this.currentCollection) {\n const canEdit = await this.validatePermission(this.currentCollection, 'edit');\n if (!canEdit) return;\n }\n\n this.showNewDropdown = false;\n this.editingCollection = undefined;\n this.isFormModalOpen = true;\n }\n\n async editCollection(collection: MJCollectionEntity): Promise<void> {\n const canEdit = await this.validatePermission(collection, 'edit');\n if (!canEdit) return;\n\n this.editingCollection = collection;\n this.isFormModalOpen = true;\n }\n\n async deleteCollection(collection: MJCollectionEntity): Promise<void> {\n console.log('deleteCollection called for:', collection.Name, collection.ID);\n\n // Validate user has delete permission\n const canDelete = await this.validatePermission(collection, 'delete');\n if (!canDelete) return;\n\n const confirmed = await this.dialogService.confirm({\n title: 'Delete Collection',\n message: `Are you sure you want to delete \"${collection.Name}\"? This will also delete all child collections and remove all artifacts. This action cannot be undone.`,\n okText: 'Delete',\n cancelText: 'Cancel',\n dangerous: true\n });\n\n console.log('Delete confirmed:', confirmed);\n\n if (confirmed) {\n try {\n console.log('Attempting to delete collection and all children...');\n await this.deleteCollectionRecursive(collection.ID);\n await this.loadCollections(true);\n await this.loadAllCollections(true);\n } catch (error) {\n console.error('Error deleting collection:', error);\n await this.dialogService.alert('Error', `An error occurred while deleting the collection: ${error}`);\n }\n }\n }\n\n private async deleteCollectionRecursive(collectionId: string): Promise<void> {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n\n // Step 1: Find and delete all child collections recursively\n const childrenResult = await rv.RunView<MJCollectionEntity>(\n {\n EntityName: 'MJ: Collections',\n ExtraFilter: `ParentID='${collectionId}'`,\n MaxRows: 1000,\n ResultType: 'entity_object'\n },\n this.currentUser\n );\n\n if (childrenResult.Success && childrenResult.Results) {\n for (const child of childrenResult.Results) {\n await this.deleteCollectionRecursive(child.ID);\n }\n }\n\n // Step 2: Delete all permissions for this collection\n await this.permissionService.deleteAllPermissions(collectionId, this.currentUser);\n\n // Step 3: Delete all artifact links for this collection\n const artifactsResult = await rv.RunView<any>(\n {\n EntityName: 'MJ: Collection Artifacts',\n ExtraFilter: `CollectionID='${collectionId}'`,\n MaxRows: 1000,\n ResultType: 'entity_object'\n },\n this.currentUser\n );\n\n if (artifactsResult.Success && artifactsResult.Results) {\n for (const ca of artifactsResult.Results) {\n await ca.Delete();\n }\n }\n\n // Step 4: Delete the collection itself\n const md = this.ProviderToUse;\n const collection = await md.GetEntityObject<MJCollectionEntity>('MJ: Collections', this.currentUser);\n await collection.Load(collectionId);\n const deleted = await collection.Delete();\n\n if (!deleted) {\n throw new Error(`Failed to delete collection: ${collection.LatestResult?.Message || 'Unknown error'}`);\n }\n }\n\n async onCollectionSaved(collection: MJCollectionEntity): Promise<void> {\n this.isFormModalOpen = false;\n this.editingCollection = undefined;\n await this.loadCollections(true);\n await this.loadAllCollections(true);\n // Reload current collection permission (it was cleared by loadUserPermissions)\n await this.loadCurrentCollectionPermission();\n\n // Update breadcrumb and currentCollection if the saved collection is in the trail\n this.updateBreadcrumbName(collection.ID, collection.Name);\n if (this.currentCollection && UUIDsEqual(this.currentCollection.ID, collection.ID)) {\n this.currentCollection = collection;\n }\n\n // Rebuild unified list to show new collection\n this.buildUnifiedItemList();\n this.cdr.detectChanges();\n }\n\n onFormCancelled(): void {\n this.isFormModalOpen = false;\n this.editingCollection = undefined;\n }\n\n async addArtifact(): Promise<void> {\n // Validate user can edit current collection\n if (this.currentCollection) {\n const canEdit = await this.validatePermission(this.currentCollection, 'edit');\n if (!canEdit) return;\n }\n\n this.showNewDropdown = false;\n this.isArtifactModalOpen = true;\n }\n\n async onArtifactSaved(artifact: MJArtifactEntity): Promise<void> {\n this.isArtifactModalOpen = false;\n await this.loadArtifacts(true);\n this.cdr.detectChanges();\n }\n\n onArtifactModalCancelled(): void {\n this.isArtifactModalOpen = false;\n }\n\n async removeArtifact(item: { version: MJArtifactVersionEntity; artifact: MJArtifactEntity }): Promise<void> {\n if (!this.currentCollectionId) return;\n\n // Validate user has delete permission on current collection\n if (this.currentCollection) {\n const canDelete = await this.validatePermission(this.currentCollection, 'delete');\n if (!canDelete) return;\n }\n\n const versionLabel = `\"${item.artifact.Name}\" v${item.version.VersionNumber}`;\n const confirmed = await this.dialogService.confirm({\n title: 'Remove Artifact Version',\n message: `Remove ${versionLabel} from this collection?`,\n okText: 'Remove',\n cancelText: 'Cancel'\n });\n\n if (confirmed) {\n try {\n // Delete THIS SPECIFIC VERSION from the collection\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView({\n EntityName: 'MJ: Collection Artifacts',\n ExtraFilter: `CollectionID='${this.currentCollectionId}' AND ArtifactVersionID='${item.version.ID}'`,\n ResultType: 'entity_object'\n }, this.currentUser);\n\n if (result.Success && result.Results && result.Results.length > 0) {\n // Delete this version association\n for (const joinRecord of result.Results) {\n await joinRecord.Delete();\n }\n await this.loadArtifacts(true);\n this.buildUnifiedItemList();\n } else {\n await this.dialogService.alert('Error', 'Collection artifact link not found.');\n }\n } catch (error) {\n console.error('Error removing artifact version:', error);\n await this.dialogService.alert('Error', 'Failed to remove artifact version from collection.');\n }\n }\n }\n\n viewArtifact(item: { version: MJArtifactVersionEntity; artifact: MJArtifactEntity }): void {\n this.activeArtifactId = item.artifact.ID;\n this.artifactState.openArtifact(item.artifact.ID, item.version.VersionNumber);\n }\n\n // Permission validation and checking methods\n private async validatePermission(\n collection: MJCollectionEntity | null,\n requiredPermission: 'edit' | 'delete' | 'share'\n ): Promise<boolean> {\n // Owner has all permissions (including backwards compatibility for null OwnerID)\n if (!collection?.OwnerID || UUIDsEqual(collection.OwnerID, this.currentUser.ID)) {\n return true;\n }\n\n const permission = this.userPermissions.get(collection.ID);\n if (!permission) {\n await this.dialogService.alert(\n 'Permission Denied',\n 'You do not have permission to perform this action.'\n );\n return false;\n }\n\n const hasPermission =\n (requiredPermission === 'edit' && permission.canEdit) ||\n (requiredPermission === 'delete' && permission.canDelete) ||\n (requiredPermission === 'share' && permission.canShare);\n\n if (!hasPermission) {\n const permissionName = requiredPermission.charAt(0).toUpperCase() + requiredPermission.slice(1);\n await this.dialogService.alert(\n 'Permission Denied',\n `You do not have ${permissionName} permission for this collection.`\n );\n return false;\n }\n\n return true;\n }\n\n canEdit(collection: MJCollectionEntity): boolean {\n // Backwards compatibility: treat null OwnerID as owned by current user\n if (!collection.OwnerID || UUIDsEqual(collection.OwnerID, this.currentUser.ID)) return true;\n\n // Check permission record\n const permission = this.userPermissions.get(collection.ID);\n return permission?.canEdit || false;\n }\n\n canDelete(collection: MJCollectionEntity): boolean {\n // Backwards compatibility: treat null OwnerID as owned by current user\n if (!collection.OwnerID || UUIDsEqual(collection.OwnerID, this.currentUser.ID)) return true;\n\n // Check permission record\n const permission = this.userPermissions.get(collection.ID);\n return permission?.canDelete || false;\n }\n\n canShare(collection: MJCollectionEntity): boolean {\n // Backwards compatibility: treat null OwnerID as owned by current user\n if (!collection.OwnerID || UUIDsEqual(collection.OwnerID, this.currentUser.ID)) return true;\n\n // Check permission record\n const permission = this.userPermissions.get(collection.ID);\n return permission?.canShare || false;\n }\n\n canEditCurrent(): boolean {\n // At root level, anyone can create\n if (!this.currentCollectionId || !this.currentCollection) {\n return true;\n }\n return this.canEdit(this.currentCollection);\n }\n\n canDeleteCurrent(): boolean {\n // At root level, no delete needed\n if (!this.currentCollectionId || !this.currentCollection) {\n return false;\n }\n return this.canDelete(this.currentCollection);\n }\n\n canShareCurrent(): boolean {\n // At root level, no share needed\n if (!this.currentCollectionId || !this.currentCollection) {\n return false;\n }\n return this.canShare(this.currentCollection);\n }\n\n isShared(collection: MJCollectionEntity): boolean {\n // Collection is shared if user is not the owner and OwnerID is set\n return collection.OwnerID != null && !UUIDsEqual(collection.OwnerID, this.currentUser.ID);\n }\n\n // Sharing methods\n async shareCollection(collection: MJCollectionEntity): Promise<void> {\n // Validate user has share permission\n const canShare = await this.validatePermission(collection, 'share');\n if (!canShare) return;\n\n this.sharingCollection = collection;\n this.isShareModalOpen = true;\n }\n\n async onPermissionsChanged(): Promise<void> {\n // Reload collections and permissions after sharing changes\n await this.loadCollections(true);\n await this.loadAllCollections(true);\n this.cdr.detectChanges();\n }\n\n onShareModalCancelled(): void {\n this.isShareModalOpen = false;\n this.sharingCollection = null;\n }\n\n // Header toolbar action methods\n shareCurrentCollection(): void {\n if (this.currentCollection) {\n this.shareCollection(this.currentCollection);\n }\n }\n\n editCurrentCollection(): void {\n if (this.currentCollection) {\n this.editCollection(this.currentCollection);\n }\n }\n\n deleteCurrentCollection(): void {\n if (this.currentCollection) {\n this.deleteCollection(this.currentCollection);\n }\n }\n\n /**\n * Get the icon for an artifact using the centralized icon service.\n * Fallback priority: Plugin icon > Metadata icon > Hardcoded mapping > Generic icon\n */\n public getArtifactIcon(artifact: MJArtifactEntity): string {\n return this.artifactIconService.getArtifactIcon(artifact);\n }\n\n // ==================== NEW MAC FINDER-STYLE METHODS ====================\n\n /**\n * Build unified list of folders and artifacts (Phase 1)\n */\n private buildUnifiedItemList(): void {\n const items: CollectionViewItem[] = [];\n\n // Add folders first (collections)\n for (const collection of this.filteredCollections) {\n items.push({\n type: 'folder',\n id: collection.ID,\n name: collection.Name,\n description: collection.Description || undefined,\n icon: 'fa-folder',\n itemCount: this.itemCountMap.get(collection.ID) || 0,\n owner: collection.Owner || undefined,\n isShared: this.isShared(collection),\n selected: this.selectedItems.has(collection.ID),\n collection: collection\n });\n }\n\n // Then add artifacts\n for (const item of this.filteredArtifactVersions) {\n items.push({\n type: 'artifact',\n id: item.version.ID,\n name: item.artifact.Name,\n description: item.artifact.Description || undefined,\n icon: this.getArtifactIcon(item.artifact),\n versionNumber: item.version.VersionNumber,\n artifactType: item.artifact.Type,\n lastModified: item.version.__mj_UpdatedAt,\n selected: this.selectedItems.has(item.version.ID),\n artifact: item.artifact,\n version: item.version\n });\n }\n\n // Apply sorting and reset pagination\n this.unifiedItems = this.sortItems(items);\n this.CurrentPage = 1;\n this.cdr.detectChanges();\n }\n\n /**\n * Sort items by selected criteria (Phase 2)\n */\n private sortItems(items: CollectionViewItem[]): CollectionViewItem[] {\n return items.sort((a, b) => {\n let comparison = 0;\n\n // Always keep folders before artifacts\n if (a.type !== b.type) {\n return a.type === 'folder' ? -1 : 1;\n }\n\n // Then sort by selected criteria\n switch (this.sortBy) {\n case 'name':\n comparison = a.name.localeCompare(b.name);\n break;\n case 'date':\n const aDate = a.lastModified || new Date(0);\n const bDate = b.lastModified || new Date(0);\n comparison = aDate.getTime() - bDate.getTime();\n break;\n case 'type':\n comparison = (a.artifactType || '').localeCompare(b.artifactType || '');\n break;\n }\n\n return this.sortOrder === 'asc' ? comparison : -comparison;\n });\n }\n\n /**\n * Toggle between grid and list view\n */\n public toggleViewMode(): void {\n this.viewMode = this.viewMode === 'grid' ? 'list' : 'grid';\n // Save preference to localStorage\n localStorage.setItem('collections-view-mode', this.viewMode);\n }\n\n /**\n * Set view mode explicitly\n */\n public setViewMode(mode: CollectionViewMode): void {\n this.viewMode = mode;\n // Save preference to localStorage\n localStorage.setItem('collections-view-mode', mode);\n }\n\n /**\n * Toggle selection mode on/off\n * When entering select mode, clicks toggle selection instead of opening items\n * When exiting select mode, clears any selections\n */\n public toggleSelectMode(): void {\n this.isSelectMode = !this.isSelectMode;\n if (!this.isSelectMode) {\n // Clear selection when exiting select mode (clearSelection calls buildUnifiedItemList which calls cdr)\n this.clearSelection();\n } else {\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Exit selection mode (called when navigating to a new folder)\n */\n private exitSelectMode(): void {\n if (this.isSelectMode) {\n this.isSelectMode = false;\n this.clearSelection();\n }\n }\n\n /**\n * Set sort order - toggles asc/desc if clicking same column\n */\n public setSortBy(sortBy: CollectionSortBy): void {\n if (this.sortBy === sortBy) {\n // Toggle order if same sort\n this.sortOrder = this.sortOrder === 'asc' ? 'desc' : 'asc';\n } else {\n this.sortBy = sortBy;\n this.sortOrder = 'asc';\n }\n\n // Save sort preferences to localStorage\n localStorage.setItem('collections-sort-by', this.sortBy);\n localStorage.setItem('collections-sort-order', this.sortOrder);\n\n // Close dropdown and rebuild list\n this.showSortDropdown = false;\n this.buildUnifiedItemList();\n }\n\n /**\n * Filter items by search query (Phase 2)\n */\n public onSearchChange(query?: string): void {\n // If query parameter provided, use it; otherwise use searchQuery property\n const searchText = query !== undefined ? query : this.searchQuery;\n\n if (!searchText.trim()) {\n // Reset to all items\n this.buildUnifiedItemList();\n return;\n }\n\n const lowerQuery = searchText.toLowerCase();\n this.unifiedItems = this.unifiedItems.filter(item =>\n item.name.toLowerCase().includes(lowerQuery) ||\n item.description?.toLowerCase().includes(lowerQuery)\n );\n }\n\n /**\n * Multi-select: Toggle item selection (Phase 3)\n */\n public toggleItemSelection(item: CollectionViewItem, event: MouseEvent): void {\n event.stopPropagation();\n // Checkbox click: additive toggle by default, shift = range, cmd/ctrl = toggle.\n this.applySelectionGesture(item, event);\n }\n\n /**\n * Multi-select: Select all items (Phase 3)\n */\n public selectAll(): void {\n this.selectedItems.clear();\n for (const item of this.unifiedItems) {\n this.selectedItems.add(item.id);\n }\n this.refreshSelectionFlags();\n }\n\n /**\n * Multi-select: Clear selection (Phase 3)\n */\n public clearSelection(): void {\n this.selectedItems.clear();\n this.lastSelectedIndex = null;\n this.refreshSelectionFlags();\n }\n\n /**\n * Multi-select: Delete selected items\n */\n public async deleteSelected(): Promise<void> {\n if (this.selectedItems.size === 0) return;\n\n const confirmed = await this.dialogService.confirm({\n title: `Delete ${this.selectedItems.size} item(s)?`,\n message: 'This action cannot be undone.',\n dangerous: true\n });\n\n if (!confirmed) return;\n\n const selectedViewItems = this.unifiedItems.filter(item => this.selectedItems.has(item.id));\n const folderItems = selectedViewItems.filter(item => item.type === 'folder' && item.collection);\n const artifactItems = selectedViewItems.filter(item => item.type === 'artifact' && item.version);\n\n try {\n for (const item of folderItems) {\n await this.deleteCollectionRecursive(item.collection!.ID);\n }\n\n if (artifactItems.length > 0 && this.currentCollectionId) {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n for (const item of artifactItems) {\n const result = await rv.RunView<MJCollectionArtifactEntity>({\n EntityName: 'MJ: Collection Artifacts',\n ExtraFilter: `CollectionID='${this.currentCollectionId}' AND ArtifactVersionID='${item.version!.ID}'`,\n ResultType: 'entity_object'\n }, this.currentUser);\n\n if (result.Success && result.Results) {\n for (const joinRecord of result.Results) {\n await joinRecord.Delete();\n }\n }\n }\n }\n\n this.clearSelection();\n await this.loadCollections(true);\n await this.loadAllCollections(true);\n if (artifactItems.length > 0) {\n await this.loadArtifacts(true);\n }\n this.buildUnifiedItemList();\n } catch (error) {\n console.error('Error deleting selected items:', error);\n await this.dialogService.alert('Error', `An error occurred while deleting: ${error}`);\n }\n }\n\n /**\n * Get count of items in folder (Phase 1)\n */\n private async getCollectionItemCount(collectionId: string): Promise<number> {\n return this.itemCountMap.get(collectionId) || 0;\n }\n\n /**\n * Handle clicking on unified item\n * In select mode: toggles selection\n * In normal mode: opens item (folder or artifact)\n */\n public onItemClick(item: CollectionViewItem, event?: MouseEvent): void {\n // Modifier-click selects without needing select mode (shift = range, cmd/ctrl = toggle)\n if (event && (event.shiftKey || event.metaKey || event.ctrlKey)) {\n this.applySelectionGesture(item, event, true);\n return;\n }\n\n // In sticky select mode, a plain click toggles selection\n if (this.isSelectMode) {\n this.toggleItemSelectionSimple(item);\n return;\n }\n\n // Normal mode: open the item\n this.openItem(item);\n }\n\n /**\n * Handle double-clicking on unified item\n * Always opens the item, even in select mode\n */\n public onItemDoubleClick(item: CollectionViewItem, event?: MouseEvent): void {\n event?.preventDefault();\n this.openItem(item);\n }\n\n /**\n * Open an item (folder or artifact)\n */\n private openItem(item: CollectionViewItem): void {\n if (item.type === 'folder' && item.collection) {\n // Exit select mode when navigating to a new folder\n this.exitSelectMode();\n this.openCollection(item.collection);\n } else if (item.type === 'artifact') {\n if (!item.artifact || !item.version) {\n console.error('Artifact or version is missing for item:', item.id);\n return;\n }\n this.viewArtifact({ artifact: item.artifact, version: item.version });\n }\n }\n\n /**\n * Simple toggle for item selection (used in select mode)\n */\n private toggleItemSelectionSimple(item: CollectionViewItem): void {\n if (this.selectedItems.has(item.id)) {\n this.selectedItems.delete(item.id);\n } else {\n this.selectedItems.add(item.id);\n }\n this.lastSelectedIndex = this.indexOfItem(item.id);\n this.refreshSelectionFlags();\n }\n\n /**\n * Get item count text for display\n */\n public getItemCountText(itemCount?: number): string {\n if (itemCount !== undefined) {\n if (itemCount === 0) return 'Empty';\n if (itemCount === 1) return '1 item';\n return `${itemCount} items`;\n }\n\n const folders = this.unifiedItems.filter(i => i.type === 'folder').length;\n const artifacts = this.unifiedItems.filter(i => i.type === 'artifact').length;\n const total = folders + artifacts;\n\n if (total === 0) return 'No items';\n if (total === 1) return '1 item';\n\n const parts: string[] = [];\n if (folders > 0) parts.push(`${folders} folder${folders > 1 ? 's' : ''}`);\n if (artifacts > 0) parts.push(`${artifacts} artifact${artifacts > 1 ? 's' : ''}`);\n\n return parts.join(', ');\n }\n\n /**\n * Handle keyboard shortcuts\n * - Cmd/Ctrl+A: Select all (enters select mode if not already)\n * - Escape: Exit select mode and clear selection\n * - Delete/Backspace: Delete selected items\n */\n public handleKeyboardShortcut(event: KeyboardEvent): void {\n // Cmd+A / Ctrl+A: Select all (enters select mode)\n if ((event.metaKey || event.ctrlKey) && event.key === 'a') {\n event.preventDefault();\n if (!this.isSelectMode) {\n this.isSelectMode = true;\n }\n this.selectAll();\n return;\n }\n\n // Escape: Exit select mode\n if (event.key === 'Escape' && this.isSelectMode) {\n event.preventDefault();\n this.exitSelectMode();\n return;\n }\n\n // Delete/Backspace: Delete selected items\n if ((event.key === 'Delete' || event.key === 'Backspace') && this.selectedItems.size > 0) {\n // Only if not focused on an input\n const target = event.target as HTMLElement;\n if (target.tagName !== 'INPUT' && target.tagName !== 'TEXTAREA') {\n event.preventDefault();\n this.deleteSelected();\n }\n return;\n }\n }\n\n /**\n * Handle right-click context menu - shows custom context menu with permission-gated actions\n */\n public onItemContextMenu(item: CollectionViewItem, event: MouseEvent): void {\n event.preventDefault();\n event.stopPropagation();\n\n // Close any open dropdowns\n this.showNewDropdown = false;\n this.showSortDropdown = false;\n\n this.contextMenuItem = item;\n this.contextMenuPosition = this.clampContextMenuPosition(event.clientX, event.clientY);\n this.showContextMenu = true;\n this.showMoveSubmenu = false;\n this.cdr.detectChanges();\n }\n\n /** Clamp menu position to keep it within the viewport */\n private clampContextMenuPosition(x: number, y: number): { x: number; y: number } {\n const menuWidth = 200;\n const menuHeight = 200;\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n\n return {\n x: Math.min(x, viewportWidth - menuWidth),\n y: Math.min(y, viewportHeight - menuHeight)\n };\n }\n\n public closeContextMenu(): void {\n this.showContextMenu = false;\n this.contextMenuItem = null;\n this.showMoveSubmenu = false;\n this.cdr.detectChanges();\n }\n\n /** Opens the inline \"Move to Collection\" submenu and loads candidate target collections. */\n public openMoveSubmenu(event: Event): void {\n event.stopPropagation();\n this.showMoveSubmenu = true;\n void this.loadMoveTargets();\n }\n\n public closeMoveSubmenu(event: Event): void {\n event.stopPropagation();\n this.showMoveSubmenu = false;\n this.cdr.detectChanges();\n }\n\n /** Loads every collection the user can access in this environment (flattened, indented), minus the current one. */\n private async loadMoveTargets(): Promise<void> {\n this.isLoadingMoveTargets = true;\n this.moveTargets = [];\n this.cdr.detectChanges();\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const ownerFilter = `OwnerID='${this.currentUser.ID}'`;\n const permissionSubquery = `ID IN (\n SELECT CollectionID FROM [__mj].[vwCollectionPermissions] WHERE UserID='${this.currentUser.ID}'\n )`;\n const filter = `EnvironmentID='${this.environmentId}' AND (OwnerID IS NULL OR ${ownerFilter} OR ${permissionSubquery})`;\n\n const result = await rv.RunView<MJCollectionEntity>({\n EntityName: 'MJ: Collections',\n ExtraFilter: filter,\n OrderBy: 'Name ASC',\n MaxRows: 1000,\n ResultType: 'entity_object'\n }, this.currentUser);\n\n const all = result.Success ? (result.Results || []) : [];\n const flattened = this.flattenCollectionTree(all);\n this.moveTargets = this.currentCollectionId\n ? flattened.filter(t => !UUIDsEqual(t.collection.ID, this.currentCollectionId!))\n : flattened;\n } catch (error) {\n console.error('Failed to load move targets:', error);\n this.moveTargets = [];\n } finally {\n this.isLoadingMoveTargets = false;\n this.cdr.detectChanges();\n }\n }\n\n /** Flattens collections into a depth-first, indented list (orphans treated as roots). */\n private flattenCollectionTree(all: MJCollectionEntity[]): Array<{ collection: MJCollectionEntity; depth: number }> {\n const ids = new Set(all.map(c => NormalizeUUID(c.ID)));\n const byParent = new Map<string | null, MJCollectionEntity[]>();\n for (const c of all) {\n const pid = c.ParentID ? NormalizeUUID(c.ParentID) : null;\n const key = pid && ids.has(pid) ? pid : null;\n const arr = byParent.get(key) || [];\n arr.push(c);\n byParent.set(key, arr);\n }\n const out: Array<{ collection: MJCollectionEntity; depth: number }> = [];\n const walk = (parentKey: string | null, depth: number): void => {\n for (const c of (byParent.get(parentKey) || [])) {\n out.push({ collection: c, depth });\n walk(NormalizeUUID(c.ID), depth + 1);\n }\n };\n walk(null, 0);\n return out;\n }\n\n /**\n * Moves the right-clicked artifact version from the current collection to the target.\n * Adds to the target first (so a failure never drops it from the source), then removes\n * the version's join row from the source collection.\n */\n public async moveArtifactToCollection(target: MJCollectionEntity): Promise<void> {\n const item = this.contextMenuItem;\n const fromCollectionId = this.currentCollectionId;\n this.closeContextMenu();\n\n if (!item?.artifact || !item.version || !fromCollectionId) return;\n if (UUIDsEqual(target.ID, fromCollectionId)) return;\n\n try {\n const p = this.ProviderToUse;\n const rv = RunView.FromMetadataProvider(p);\n\n // Add to target (skip if the version is already there to avoid a duplicate join row)\n const existing = await rv.RunView<MJCollectionArtifactEntity>({\n EntityName: 'MJ: Collection Artifacts',\n ExtraFilter: `CollectionID='${target.ID}' AND ArtifactVersionID='${item.version.ID}'`,\n ResultType: 'simple',\n Fields: ['ID']\n }, this.currentUser);\n\n if (!(existing.Success && (existing.Results?.length ?? 0) > 0)) {\n const junction = await p.GetEntityObject<MJCollectionArtifactEntity>('MJ: Collection Artifacts', this.currentUser);\n junction.CollectionID = target.ID;\n junction.ArtifactVersionID = item.version.ID;\n junction.Sequence = 0;\n const saved = await junction.Save();\n if (!saved) {\n throw new Error(junction.LatestResult?.CompleteMessage || 'Failed to add artifact to the target collection');\n }\n }\n\n // Remove this version's join row(s) from the source collection\n const sourceRows = await rv.RunView<MJCollectionArtifactEntity>({\n EntityName: 'MJ: Collection Artifacts',\n ExtraFilter: `CollectionID='${fromCollectionId}' AND ArtifactVersionID='${item.version.ID}'`,\n ResultType: 'entity_object'\n }, this.currentUser);\n\n if (sourceRows.Success && sourceRows.Results) {\n for (const row of sourceRows.Results) {\n await row.Delete();\n }\n }\n\n await this.loadArtifacts(true);\n await this.loadCollections(true);\n await this.loadAllCollections(true);\n this.buildUnifiedItemList();\n } catch (error) {\n console.error('Error moving artifact:', error);\n await this.dialogService.alert('Error', 'Failed to move artifact. Please try again.');\n }\n }\n\n /** Handle context menu action dispatch */\n public onContextMenuAction(action: string): void {\n const item = this.contextMenuItem;\n this.closeContextMenu();\n if (!item) return;\n\n switch (action) {\n case 'open':\n this.openItem(item);\n break;\n case 'view':\n this.openItem(item);\n break;\n case 'share':\n if (item.collection) {\n this.shareCollection(item.collection);\n }\n break;\n case 'edit':\n if (item.collection) {\n this.editCollection(item.collection);\n }\n break;\n case 'delete':\n if (item.collection) {\n this.deleteCollection(item.collection);\n }\n break;\n case 'remove':\n if (item.artifact && item.version) {\n this.removeArtifact({ artifact: item.artifact, version: item.version });\n }\n break;\n case 'openConversation':\n if (item.artifact && item.version) {\n void this.openSourceConversation(item);\n }\n break;\n }\n }\n\n /**\n * Resolves the artifact version the user right-clicked to the conversation it was produced in,\n * then asks the host to open it. Chain: Artifact Version β Conversation Detail Artifacts\n * (prefer Direction='Output' = produced here) β Conversation Detail β ConversationID.\n */\n private async openSourceConversation(item: CollectionViewItem): Promise<void> {\n if (!item.version) return;\n const conversationId = await this.resolveArtifactToConversation(item.version.ID);\n if (conversationId) {\n this.openConversationRequested.emit({ conversationId });\n } else {\n await this.dialogService.alert('No Source Conversation', 'This artifact is not linked to a conversation.');\n }\n }\n\n private async resolveArtifactToConversation(artifactVersionId: string): Promise<string | null> {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n\n // Find the message(s) this version is attached to. Prefer the one that produced it\n // (Direction='Output'); fall back to any link if it only appears as an input.\n const linkResult = await rv.RunView<{ ConversationDetailID: string; Direction: string }>({\n EntityName: 'MJ: Conversation Detail Artifacts',\n ExtraFilter: `ArtifactVersionID='${artifactVersionId}'`,\n Fields: ['ConversationDetailID', 'Direction'],\n ResultType: 'simple'\n }, this.currentUser);\n\n const links = linkResult.Success ? (linkResult.Results ?? []) : [];\n if (links.length === 0) return null;\n const link = links.find(l => l.Direction === 'Output') ?? links[0];\n\n const detailResult = await rv.RunView<{ ConversationID: string }>({\n EntityName: 'MJ: Conversation Details',\n ExtraFilter: `ID='${link.ConversationDetailID}'`,\n Fields: ['ConversationID'],\n ResultType: 'simple'\n }, this.currentUser);\n\n return detailResult.Success ? (detailResult.Results?.[0]?.ConversationID ?? null) : null;\n }\n\n /** Close context menu on Escape key */\n @HostListener('document:keydown.escape')\n public onEscapeKey(): void {\n if (this.showContextMenu) {\n this.closeContextMenu();\n }\n }\n\n // ============================================================\n // Selection gestures (#4 β frictionless multi-select)\n // ============================================================\n\n private indexOfItem(id: string): number {\n return this.unifiedItems.findIndex(i => i.id === id);\n }\n\n /** Re-sync each item's `selected` flag from the set without rebuilding (preserves page). */\n private refreshSelectionFlags(): void {\n for (const it of this.unifiedItems) {\n it.selected = this.selectedItems.has(it.id);\n }\n this.cdr.detectChanges();\n }\n\n /**\n * Centralized selection gesture used by both the hover checkbox and modifier-clicks.\n * - shift β range select from the last anchor\n * - cmd/ctrl β additive toggle\n * - plain β additive toggle (checkbox) or replace (plainReplaces, used by body clicks)\n */\n private applySelectionGesture(item: CollectionViewItem, event: MouseEvent, plainReplaces = false): void {\n const idx = this.indexOfItem(item.id);\n if (event.shiftKey && this.lastSelectedIndex != null && this.lastSelectedIndex >= 0) {\n const lo = Math.min(this.lastSelectedIndex, idx);\n const hi = Math.max(this.lastSelectedIndex, idx);\n for (let i = lo; i <= hi; i++) {\n const it = this.unifiedItems[i];\n if (it) this.selectedItems.add(it.id);\n }\n } else if (event.metaKey || event.ctrlKey || !plainReplaces) {\n if (this.selectedItems.has(item.id)) {\n this.selectedItems.delete(item.id);\n } else {\n this.selectedItems.add(item.id);\n }\n this.lastSelectedIndex = idx;\n } else {\n this.selectedItems.clear();\n this.selectedItems.add(item.id);\n this.lastSelectedIndex = idx;\n }\n this.refreshSelectionFlags();\n }\n\n /** Hover-checkbox click β selects without requiring an explicit \"select mode\". */\n public onCheckboxClick(item: CollectionViewItem, event: MouseEvent): void {\n event.stopPropagation();\n this.applySelectionGesture(item, event);\n }\n\n // ============================================================\n // Drag-and-drop (#1, #2 β drag items onto folders / breadcrumbs / navigator)\n // ============================================================\n\n public onItemDragStart(item: CollectionViewItem, event: DragEvent): void {\n // If the dragged item is part of the current selection, drag the whole selection;\n // otherwise drag just this item.\n this.draggedItemIds = (this.selectedItems.has(item.id) && this.selectedItems.size > 0)\n ? Array.from(this.selectedItems)\n : [item.id];\n if (event.dataTransfer) {\n event.dataTransfer.effectAllowed = 'move';\n event.dataTransfer.setData('text/plain', this.draggedItemIds.join(','));\n }\n }\n\n public onItemDragEnd(): void {\n this.draggedItemIds = [];\n this.dragOverTargetId = null;\n }\n\n private draggedItems(): CollectionViewItem[] {\n return this.unifiedItems.filter(i => this.draggedItemIds.includes(i.id));\n }\n\n /** Folder grid card / list row as a drop target. */\n public onFolderItemDragOver(folderItem: CollectionViewItem, event: DragEvent): void {\n const targetId = folderItem.collection?.ID;\n if (this.draggedItemIds.length === 0 || this.draggedItemIds.includes(folderItem.id)) return;\n if (!this.canDropOnCollection(targetId)) return;\n event.preventDefault();\n if (event.dataTransfer) event.dataTransfer.dropEffect = 'move';\n this.dragOverTargetId = folderItem.id;\n }\n\n public onFolderItemDrop(folderItem: CollectionViewItem, event: DragEvent): void {\n event.preventDefault();\n const targetId = folderItem.collection?.ID ?? null;\n this.dragOverTargetId = null;\n void this.moveDraggedItemsTo(targetId);\n }\n\n /** Breadcrumb crumb / Home root as a drop target. crumbId null = top level. */\n public onCrumbDragOver(crumbId: string | null, event: DragEvent): void {\n if (this.draggedItemIds.length === 0) return;\n // Artifacts can't live at the top level (no collection)\n if (crumbId === null && this.draggedItems().some(i => i.type === 'artifact')) return;\n if (!this.canDropOnCollection(crumbId)) return;\n event.preventDefault();\n if (event.dataTransfer) event.dataTransfer.dropEffect = 'move';\n this.dragOverTargetId = crumbId === null ? 'root' : 'crumb:' + crumbId;\n }\n\n public onCrumbDrop(crumbId: string | null, event: DragEvent): void {\n event.preventDefault();\n this.dragOverTargetId = null;\n void this.moveDraggedItemsTo(crumbId);\n }\n\n /** True when the dragged set may be dropped on the target collection (blocks folder cycles). */\n private canDropOnCollection(targetCollectionId: string | null | undefined): boolean {\n if (targetCollectionId === undefined) return false;\n for (const f of this.draggedItems()) {\n if (f.type !== 'folder' || !f.collection) continue;\n const fid = f.collection.ID;\n if (targetCollectionId && (UUIDsEqual(fid, targetCollectionId) || this.isCollectionDescendant(targetCollectionId, fid))) {\n return false;\n }\n }\n return true;\n }\n\n private isCollectionDescendant(nodeId: string, ancestorId: string): boolean {\n let cur = this.allCollectionsById.get(NormalizeUUID(nodeId));\n const seen = new Set<string>();\n while (cur?.ParentID) {\n const pid = NormalizeUUID(cur.ParentID);\n if (seen.has(pid)) break;\n seen.add(pid);\n if (UUIDsEqual(pid, ancestorId)) return true;\n cur = this.allCollectionsById.get(pid);\n }\n return false;\n }\n\n private async moveDraggedItemsTo(targetCollectionId: string | null): Promise<void> {\n const items = this.draggedItems();\n this.draggedItemIds = [];\n await this.moveItemsTo(items, targetCollectionId, this.currentCollectionId);\n }\n\n // ============================================================\n // Move primitives (shared by drag, bulk move, and shelf)\n // ============================================================\n\n /**\n * Moves items into the target collection. Artifacts: add the version to the target and remove\n * it from its source collection. Folders: reparent (target null = top level). Skips no-ops and\n * invalid folder moves (cycles). Reloads and rebuilds when done.\n */\n private async moveItemsTo(\n items: CollectionViewItem[],\n targetCollectionId: string | null,\n artifactSourceCollectionId: string | null\n ): Promise<void> {\n if (items.length === 0) return;\n try {\n const p = this.ProviderToUse;\n const rv = RunView.FromMetadataProvider(p);\n\n for (const item of items) {\n if (item.type === 'artifact' && item.version) {\n if (targetCollectionId == null) continue; // artifacts require a collection\n if (artifactSourceCollectionId && UUIDsEqual(artifactSourceCollectionId, targetCollectionId)) continue;\n await this.addVersionToCollection(p, rv, item.version.ID, targetCollectionId);\n if (artifactSourceCollectionId) {\n await this.removeVersionFromCollection(rv, item.version.ID, artifactSourceCollectionId);\n }\n } else if (item.type === 'folder' && item.collection) {\n const fid = item.collection.ID;\n if (targetCollectionId && (UUIDsEqual(fid, targetCollectionId) || this.isCollectionDescendant(targetCollectionId, fid))) continue;\n await this.reparentCollection(fid, targetCollectionId);\n }\n }\n\n this.clearSelection();\n await this.loadCollections(true);\n await this.loadArtifacts(true);\n await this.loadAllCollections(true);\n this.buildUnifiedItemList();\n } catch (error) {\n console.error('Error moving items:', error);\n await this.dialogService.alert('Error', 'Failed to move item(s). Please try again.');\n }\n }\n\n private async addVersionToCollection(p: IMetadataProvider, rv: RunView, versionId: string, collectionId: string): Promise<void> {\n const existing = await rv.RunView<MJCollectionArtifactEntity>({\n EntityName: 'MJ: Collection Artifacts',\n ExtraFilter: `CollectionID='${collectionId}' AND ArtifactVersionID='${versionId}'`,\n ResultType: 'simple',\n Fields: ['ID']\n }, this.currentUser);\n if (existing.Success && (existing.Results?.length ?? 0) > 0) return;\n\n const junction = await p.GetEntityObject<MJCollectionArtifactEntity>('MJ: Collection Artifacts', this.currentUser);\n junction.CollectionID = collectionId;\n junction.ArtifactVersionID = versionId;\n junction.Sequence = 0;\n const ok = await junction.Save();\n if (!ok) throw new Error(junction.LatestResult?.CompleteMessage || 'Failed to add artifact to collection');\n }\n\n private async removeVersionFromCollection(rv: RunView, versionId: string, collectionId: string): Promise<void> {\n const rows = await rv.RunView<MJCollectionArtifactEntity>({\n EntityName: 'MJ: Collection Artifacts',\n ExtraFilter: `CollectionID='${collectionId}' AND ArtifactVersionID='${versionId}'`,\n ResultType: 'entity_object'\n }, this.currentUser);\n if (rows.Success && rows.Results) {\n for (const row of rows.Results) await row.Delete();\n }\n }\n\n private async reparentCollection(collectionId: string, newParentId: string | null): Promise<void> {\n const p = this.ProviderToUse;\n const collection = await p.GetEntityObject<MJCollectionEntity>('MJ: Collections', this.currentUser);\n await collection.Load(collectionId);\n collection.ParentID = newParentId;\n const ok = await collection.Save();\n if (!ok) throw new Error(collection.LatestResult?.CompleteMessage || 'Failed to move folder');\n }\n\n // ============================================================\n // All-collections cache (navigator + cycle checks + bulk move)\n // ============================================================\n\n public async loadAllCollections(bypassCache: boolean = false): Promise<void> {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const ownerFilter = `OwnerID='${this.currentUser.ID}'`;\n const permissionSubquery = `ID IN (\n SELECT CollectionID FROM [__mj].[vwCollectionPermissions] WHERE UserID='${this.currentUser.ID}'\n )`;\n const filter = `EnvironmentID='${this.environmentId}' AND (OwnerID IS NULL OR ${ownerFilter} OR ${permissionSubquery})`;\n const result = await rv.RunView<MJCollectionEntity>({\n EntityName: 'MJ: Collections',\n ExtraFilter: filter,\n OrderBy: 'Name ASC',\n MaxRows: 1000,\n ResultType: 'entity_object',\n BypassCache: bypassCache\n }, this.currentUser);\n this.allCollections = result.Success ? (result.Results || []) : [];\n this.allCollectionsById = new Map(this.allCollections.map(c => [NormalizeUUID(c.ID), c]));\n this.navigatorNodes = this.flattenCollectionTree(this.allCollections);\n this.cdr.detectChanges();\n }\n\n public toggleNavigator(): void {\n this.showNavigator = !this.showNavigator;\n }\n\n public navigatorClick(collection: MJCollectionEntity): void {\n void this.navigateToCollectionById(collection.ID);\n }\n\n public isCurrentNavigator(collection: MJCollectionEntity): boolean {\n return !!this.currentCollectionId && UUIDsEqual(collection.ID, this.currentCollectionId);\n }\n\n public onNavigatorDragOver(collection: MJCollectionEntity, event: DragEvent): void {\n if (this.draggedItemIds.length === 0 || this.draggedItemIds.some(id => UUIDsEqual(id, collection.ID))) return;\n if (!this.canDropOnCollection(collection.ID)) return;\n event.preventDefault();\n if (event.dataTransfer) event.dataTransfer.dropEffect = 'move';\n this.dragOverTargetId = 'nav:' + collection.ID;\n }\n\n public onNavigatorDrop(collection: MJCollectionEntity, event: DragEvent): void {\n event.preventDefault();\n this.dragOverTargetId = null;\n void this.moveDraggedItemsTo(collection.ID);\n }\n\n public onDragLeave(tag: string): void {\n if (this.dragOverTargetId === tag) this.dragOverTargetId = null;\n }\n\n // ============================================================\n // Bulk \"Move toβ¦\" (#3)\n // ============================================================\n\n public openBulkMove(event: Event): void {\n event.stopPropagation();\n if (this.navigatorNodes.length === 0) void this.loadAllCollections();\n this.showBulkMovePopover = true;\n }\n\n public closeBulkMove(): void {\n this.showBulkMovePopover = false;\n }\n\n public async bulkMoveTo(collection: MJCollectionEntity): Promise<void> {\n const items = this.unifiedItems.filter(i => this.selectedItems.has(i.id));\n this.showBulkMovePopover = false;\n await this.moveItemsTo(items, collection.ID, this.currentCollectionId);\n }\n\n // ============================================================\n // Staging shelf (#5)\n // ============================================================\n\n public stageSelected(): void {\n const items = this.unifiedItems.filter(i => this.selectedItems.has(i.id));\n for (const it of items) {\n if (!this.shelf.some(s => s.item.id === it.id)) {\n this.shelf.push({ item: it, sourceCollectionId: this.currentCollectionId });\n }\n }\n this.clearSelection();\n this.cdr.detectChanges();\n }\n\n public removeFromShelf(id: string): void {\n this.shelf = this.shelf.filter(s => s.item.id !== id);\n this.cdr.detectChanges();\n }\n\n public clearShelf(): void {\n this.shelf = [];\n this.cdr.detectChanges();\n }\n\n /** Moves all staged items into the currently-open collection. */\n public async dropShelfHere(): Promise<void> {\n if (this.shelf.length === 0 || !this.currentCollectionId) return;\n const target = this.currentCollectionId;\n try {\n const p = this.ProviderToUse;\n const rv = RunView.FromMetadataProvider(p);\n for (const entry of this.shelf) {\n const it = entry.item;\n if (it.type === 'artifact' && it.version) {\n if (entry.sourceCollectionId && UUIDsEqual(entry.sourceCollectionId, target)) continue;\n await this.addVersionToCollection(p, rv, it.version.ID, target);\n if (entry.sourceCollectionId) {\n await this.removeVersionFromCollection(rv, it.version.ID, entry.sourceCollectionId);\n }\n } else if (it.type === 'folder' && it.collection) {\n const fid = it.collection.ID;\n if (UUIDsEqual(fid, target) || this.isCollectionDescendant(target, fid)) continue;\n await this.reparentCollection(fid, target);\n }\n }\n this.shelf = [];\n await this.loadCollections(true);\n await this.loadArtifacts(true);\n await this.loadAllCollections(true);\n this.buildUnifiedItemList();\n } catch (error) {\n console.error('Error moving staged items:', error);\n await this.dialogService.alert('Error', 'Failed to move staged items. Please try again.');\n }\n }\n}\n"]}
|