@memberjunction/ng-file-storage 5.11.0 → 5.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"file-grid.component.js","sourceRoot":"","sources":["../../../src/lib/file-browser/file-grid.component.ts","../../../src/lib/file-browser/file-grid.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, OnInit, OnChanges, SimpleChanges } from '@angular/core';\nimport { GraphQLDataProvider, GraphQLFileStorageClient } from '@memberjunction/graphql-dataprovider';\nimport { FileStorageEngine, StorageAccountWithProvider } from '@memberjunction/core-entities';\nimport { UUIDsEqual } from '@memberjunction/global';\n\n/**\n * Represents a file or folder item in the grid\n */\nexport interface FileGridItem {\n key: string;\n name: string;\n type: 'file' | 'folder';\n size: number;\n lastModified: Date;\n contentType?: string;\n etag?: string;\n}\n\n/**\n * Result from a single provider's search\n */\nexport interface FileSearchResultItem {\n path: string;\n name: string;\n size: number;\n contentType: string;\n lastModified: string;\n relevance?: number;\n excerpt?: string;\n matchInFilename?: boolean;\n objectId?: string;\n}\n\n/**\n * Search results from a single account\n */\nexport interface AccountSearchResult {\n accountID: string;\n accountName: string;\n success: boolean;\n errorMessage?: string;\n results: FileSearchResultItem[];\n totalMatches?: number;\n hasMore: boolean;\n nextPageToken?: string;\n}\n\n/**\n * Aggregated search results from multiple accounts\n */\nexport interface MultiProviderSearchResult {\n accountResults: AccountSearchResult[];\n totalResultsReturned: number;\n successfulAccounts: number;\n failedAccounts: number;\n}\n\n/**\n * Displays files and folders in a grid/list view.\n * Shows file metadata like name, size, type, and last modified date.\n * Supports file selection and navigation to folders.\n */\n@Component({\n standalone: false,\n selector: 'mj-file-grid',\n templateUrl: './file-grid.component.html',\n styleUrls: ['./file-grid.component.css']\n})\nexport class FileGridComponent implements OnInit, OnChanges {\n /**\n * The storage account to list files from (includes provider details)\n */\n @Input() account: StorageAccountWithProvider | null = null;\n\n /**\n * The current folder path to display\n */\n @Input() folderPath: string = '';\n\n /**\n * Emits when a folder is double-clicked for navigation\n */\n @Output() folderNavigate = new EventEmitter<string>();\n\n /**\n * Emits when the folder structure has changed (e.g., new folder created)\n * This signals that the folder tree should refresh\n */\n @Output() folderStructureChanged = new EventEmitter<void>();\n\n /**\n * List of files and folders in the current directory\n */\n public items: FileGridItem[] = [];\n\n /**\n * Currently selected item keys in the grid (Kendo stores keys, not full objects)\n */\n public selectedItems: string[] = [];\n\n /**\n * Loading state indicator\n */\n public isLoading: boolean = false;\n\n /**\n * Error message if loading fails\n */\n public errorMessage: string | null = null;\n\n /**\n * View mode: 'grid' or 'list'\n */\n public viewMode: 'grid' | 'list' = 'list';\n\n /**\n * Sort configuration for the grid\n */\n public sort: Array<{ field: string; dir?: 'asc' | 'desc' }> = [\n { field: 'name', dir: 'asc' }\n ];\n\n /**\n * Search query for filtering files/folders\n */\n public searchQuery: string = '';\n\n /**\n * File type filter ('all', 'files', 'folders')\n */\n public fileTypeFilter: 'all' | 'files' | 'folders' = 'all';\n\n /**\n * Filtered list of items based on search and filter criteria\n */\n public filteredItems: FileGridItem[] = [];\n\n /**\n * Drag-and-drop state\n */\n public isDragging: boolean = false;\n\n /**\n * Upload progress state\n */\n public isUploading: boolean = false;\n public uploadProgress: number = 0;\n public uploadingFileName: string = '';\n\n /**\n * New folder dialog state\n */\n public showNewFolderDialog: boolean = false;\n public newFolderName: string = '';\n public isCreatingFolder: boolean = false;\n\n /**\n * Delete confirmation dialog state\n */\n public showDeleteDialog: boolean = false;\n public itemToDelete: FileGridItem | null = null;\n public isDeleting: boolean = false;\n\n /**\n * Rename dialog state\n */\n public showRenameDialog: boolean = false;\n public itemToRename: FileGridItem | null = null;\n public newItemName: string = '';\n public isRenaming: boolean = false;\n\n /**\n * Copy dialog state\n */\n public showCopyDialog: boolean = false;\n public itemToCopy: FileGridItem | null = null;\n public copyDestinationPath: string = '';\n public isCopying: boolean = false;\n\n /**\n * Move dialog state\n */\n public showMoveDialog: boolean = false;\n public itemToMove: FileGridItem | null = null;\n public moveDestinationPath: string = '';\n public isMoving: boolean = false;\n\n /**\n * Copy to provider dialog state\n */\n public showCopyToProviderDialog: boolean = false;\n public itemToCopyToProvider: FileGridItem | null = null;\n public availableAccounts: StorageAccountWithProvider[] = [];\n public selectedDestinationAccounts: Set<string> = new Set();\n public copyToAccountDestinationPath: string = '';\n public isCopyingToAccount: boolean = false;\n public copyToAccountProgress: { current: number; total: number; currentAccount: string } | null = null;\n\n /**\n * Multi-provider search state\n */\n public isMultiProviderSearchMode: boolean = false;\n public multiProviderSearchQuery: string = '';\n public selectedSearchProviders: Set<string> = new Set();\n public isSearching: boolean = false;\n public multiProviderSearchResults: MultiProviderSearchResult | null = null;\n\n /**\n * GraphQL client for file storage operations\n */\n private storageClient: GraphQLFileStorageClient;\n\n constructor() {\n this.storageClient = new GraphQLFileStorageClient(GraphQLDataProvider.Instance);\n }\n\n ngOnInit(): void {\n // Don't load items here - wait for ngOnChanges when inputs are set\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n // Reload items when provider or folder path changes\n if (changes['account'] || changes['folderPath']) {\n this.loadItems();\n }\n }\n\n /**\n * Loads files and folders from the current path\n */\n private async loadItems(): Promise<void> {\n if (!this.account) {\n this.items = [];\n return;\n }\n\n const previousItemCount = this.items.length;\n const previousItemNames = this.items.map(i => i.name);\n\n this.isLoading = true;\n this.errorMessage = null;\n\n try {\n console.log('[FileGrid] Loading items for account:', this.account.account.ID, 'path:', this.folderPath);\n console.log('[FileGrid] Previous items:', { count: previousItemCount, names: previousItemNames });\n\n const listResult = await this.storageClient.ListObjects(\n this.account.account.ID,\n this.folderPath || '',\n '/'\n );\n\n console.log('[FileGrid] ListObjects result:', listResult);\n\n this.items = [];\n\n // Add folders from prefixes first (so they appear before files)\n if (listResult.prefixes) {\n for (const prefix of listResult.prefixes) {\n // Extract the folder name from the prefix path\n // Prefix comes as \"path/to/folder/\" so we need to get just \"folder\"\n const folderName = prefix.endsWith('/')\n ? prefix.slice(0, -1).split('/').pop()\n : prefix.split('/').pop();\n\n if (folderName) {\n this.items.push({\n key: prefix,\n name: folderName,\n type: 'folder',\n size: 0,\n lastModified: new Date(),\n contentType: 'application/x-directory'\n });\n }\n }\n }\n\n // Add files from objects\n if (listResult.objects) {\n for (const obj of listResult.objects) {\n // Skip directories from objects - we already added them from prefixes\n if (obj.isDirectory) {\n continue;\n }\n\n this.items.push({\n key: obj.fullPath,\n name: obj.name,\n type: 'file',\n size: obj.size,\n lastModified: obj.lastModified,\n contentType: obj.contentType,\n etag: obj.etag\n });\n }\n }\n\n } catch (error) {\n this.errorMessage = 'Failed to load files';\n console.error('[FileGrid] Error loading files:', error);\n } finally {\n this.isLoading = false;\n }\n\n // Apply filters after loading\n this.applyFilters();\n }\n\n /**\n * Applies search and filter criteria to the items list\n */\n private applyFilters(): void {\n let filtered = [...this.items];\n\n // Apply file type filter\n if (this.fileTypeFilter === 'files') {\n filtered = filtered.filter(item => item.type === 'file');\n } else if (this.fileTypeFilter === 'folders') {\n filtered = filtered.filter(item => item.type === 'folder');\n }\n\n // Apply search query\n if (this.searchQuery.trim()) {\n const query = this.searchQuery.toLowerCase();\n filtered = filtered.filter(item =>\n item.name.toLowerCase().includes(query)\n );\n }\n\n this.filteredItems = filtered;\n }\n\n /**\n * Handles search query changes\n */\n public onSearchChange(query: string): void {\n this.searchQuery = query;\n this.applyFilters();\n }\n\n /**\n * Clears the search query\n */\n public clearSearch(): void {\n this.searchQuery = '';\n this.applyFilters();\n }\n\n /**\n * Handles file type filter changes\n */\n public onFileTypeFilterChange(filterType: 'all' | 'files' | 'folders'): void {\n this.fileTypeFilter = filterType;\n this.applyFilters();\n }\n\n /**\n * Formats a file size in bytes to a human-readable string\n */\n public formatFileSize(bytes: number): string {\n if (bytes === 0) return '0 B';\n\n const k = 1024;\n const sizes = ['B', 'KB', 'MB', 'GB', 'TB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n return Math.round((bytes / Math.pow(k, i)) * 100) / 100 + ' ' + sizes[i];\n }\n\n /**\n * Formats a date to a readable string\n */\n public formatDate(date: Date): string {\n return date.toLocaleString();\n }\n\n /**\n * Gets the icon class for a file or folder\n */\n public getItemIcon(item: FileGridItem): string {\n if (!item || !item.name) {\n return 'fa-solid fa-file';\n }\n\n if (item.type === 'folder') {\n return 'fa-solid fa-folder';\n }\n\n // Determine file icon based on content type or extension\n const extension = item.name.split('.').pop()?.toLowerCase() || '';\n\n if (['jpg', 'jpeg', 'png', 'gif', 'bmp', 'svg'].includes(extension)) {\n return 'fa-solid fa-file-image';\n } else if (['pdf'].includes(extension)) {\n return 'fa-solid fa-file-pdf';\n } else if (['doc', 'docx'].includes(extension)) {\n return 'fa-solid fa-file-word';\n } else if (['xls', 'xlsx'].includes(extension)) {\n return 'fa-solid fa-file-excel';\n } else if (['ppt', 'pptx'].includes(extension)) {\n return 'fa-solid fa-file-powerpoint';\n } else if (['zip', 'rar', '7z', 'tar', 'gz'].includes(extension)) {\n return 'fa-solid fa-file-zipper';\n } else if (['mp4', 'avi', 'mov', 'wmv'].includes(extension)) {\n return 'fa-solid fa-file-video';\n } else if (['mp3', 'wav', 'ogg', 'flac'].includes(extension)) {\n return 'fa-solid fa-file-audio';\n } else if (['txt', 'log'].includes(extension)) {\n return 'fa-solid fa-file-lines';\n } else if (['js', 'ts', 'html', 'css', 'json', 'xml', 'py', 'java', 'cpp'].includes(extension)) {\n return 'fa-solid fa-file-code';\n } else {\n return 'fa-solid fa-file';\n }\n }\n\n /**\n * Handles item selection change (not used - Kendo handles selection internally)\n */\n public onSelectionChange(selectedKeys: string[]): void {\n this.selectedItems = selectedKeys;\n }\n\n /**\n * Handles tile click in grid view for selection\n */\n public onTileClick(item: FileGridItem, event: MouseEvent): void {\n if (event.ctrlKey || event.metaKey) {\n // Multi-select: toggle item key\n const index = this.selectedItems.indexOf(item.key);\n if (index >= 0) {\n this.selectedItems.splice(index, 1);\n } else {\n this.selectedItems.push(item.key);\n }\n } else if (event.shiftKey && this.selectedItems.length > 0) {\n // Range select: select from last selected to current\n const lastSelectedKey = this.selectedItems[this.selectedItems.length - 1];\n const lastSelected = this.items.find(i => i.key === lastSelectedKey);\n if (lastSelected) {\n const lastIndex = this.items.indexOf(lastSelected);\n const currentIndex = this.items.indexOf(item);\n const start = Math.min(lastIndex, currentIndex);\n const end = Math.max(lastIndex, currentIndex);\n this.selectedItems = this.items.slice(start, end + 1).map(i => i.key);\n }\n } else {\n // Single select: replace selection\n this.selectedItems = [item.key];\n }\n }\n\n /**\n * Handles double-click on an item\n * For folders, navigate into them. For files, open/download them.\n */\n public onItemDoubleClick(item: FileGridItem): void {\n if (item.type === 'folder') {\n // Navigate into folder by emitting the folder path\n console.log('[FileGrid] Navigating to folder:', item.key);\n this.folderNavigate.emit(item.key);\n } else {\n // Download file\n this.downloadFile(item);\n }\n }\n\n /**\n * Downloads a file by creating a pre-authenticated download URL\n */\n private async downloadFile(item: FileGridItem): Promise<void> {\n if (!this.account) {\n return;\n }\n\n try {\n console.log('[FileGrid] Downloading file:', item.key);\n\n const downloadUrl = await this.storageClient.CreatePreAuthDownloadUrl(\n this.account.account.ID,\n item.key\n );\n\n console.log('[FileGrid] Download URL created:', downloadUrl ? 'success' : 'failed');\n\n if (downloadUrl) {\n // Trigger browser download\n const link = document.createElement('a');\n link.href = downloadUrl;\n link.download = item.name;\n link.target = '_blank'; // Open in new tab as fallback\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n\n console.log('[FileGrid] File download initiated:', item.name);\n } else {\n console.error('[FileGrid] Failed to get download URL');\n this.errorMessage = 'Failed to generate download URL';\n }\n } catch (error) {\n console.error('[FileGrid] Error downloading file:', error);\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n this.errorMessage = `Failed to download file: ${errorMessage}`;\n\n // Clear error after 5 seconds\n setTimeout(() => {\n if (this.errorMessage?.startsWith('Failed to download')) {\n this.errorMessage = null;\n }\n }, 5000);\n }\n }\n\n /**\n * Toggles between grid and list view\n */\n public toggleViewMode(): void {\n this.viewMode = this.viewMode === 'grid' ? 'list' : 'grid';\n }\n\n /**\n * Refreshes the current directory\n */\n public refresh(): void {\n this.loadItems();\n }\n\n /**\n * Navigates up to the parent directory\n */\n public navigateUp(): void {\n if (!this.folderPath) {\n // Already at root\n return;\n }\n\n // Remove trailing slash if present\n const cleanPath = this.folderPath.endsWith('/')\n ? this.folderPath.slice(0, -1)\n : this.folderPath;\n\n // Get parent path by removing last segment\n const segments = cleanPath.split('/').filter(s => s.length > 0);\n segments.pop(); // Remove last segment\n\n const parentPath = segments.length > 0 ? segments.join('/') + '/' : '';\n\n // Emit navigation event to update the folder tree and path\n this.folderNavigate.emit(parentPath);\n }\n\n /**\n * Checks if we can navigate up (not at root)\n */\n public canNavigateUp(): boolean {\n return this.folderPath !== '' && this.folderPath !== '/';\n }\n\n /**\n * Handles sort change event from the grid\n */\n public onSortChange(sort: Array<{ field: string; dir?: 'asc' | 'desc' }>): void {\n this.sort = sort;\n }\n\n /**\n * Gets a human-readable file type based on extension\n */\n public getFileType(item: FileGridItem): string {\n if (item.type === 'folder') {\n return 'Folder';\n }\n\n const extension = item.name.split('.').pop()?.toLowerCase() || '';\n\n const typeMap: Record<string, string> = {\n // Documents\n pdf: 'PDF Document',\n doc: 'Word Document',\n docx: 'Word Document',\n xls: 'Excel Spreadsheet',\n xlsx: 'Excel Spreadsheet',\n ppt: 'PowerPoint',\n pptx: 'PowerPoint',\n txt: 'Text File',\n\n // Images\n jpg: 'JPEG Image',\n jpeg: 'JPEG Image',\n png: 'PNG Image',\n gif: 'GIF Image',\n bmp: 'Bitmap Image',\n svg: 'SVG Image',\n\n // Archives\n zip: 'ZIP Archive',\n rar: 'RAR Archive',\n '7z': '7-Zip Archive',\n tar: 'TAR Archive',\n gz: 'GZIP Archive',\n\n // Media\n mp4: 'MP4 Video',\n avi: 'AVI Video',\n mov: 'QuickTime Video',\n mp3: 'MP3 Audio',\n wav: 'WAV Audio',\n\n // Code\n js: 'JavaScript',\n ts: 'TypeScript',\n html: 'HTML',\n css: 'CSS',\n json: 'JSON',\n xml: 'XML',\n py: 'Python',\n java: 'Java',\n cpp: 'C++'\n };\n\n return typeMap[extension] || `${extension.toUpperCase()} File`;\n }\n\n /**\n * Handles upload button click - triggers file input\n */\n public onUploadClick(): void {\n const fileInput = document.createElement('input');\n fileInput.type = 'file';\n fileInput.multiple = true;\n fileInput.onchange = (event: Event) => {\n const target = event.target as HTMLInputElement;\n if (target.files && target.files.length > 0) {\n this.uploadFiles(Array.from(target.files));\n }\n };\n fileInput.click();\n }\n\n /**\n * Handles drag enter event\n */\n public onDragEnter(event: DragEvent): void {\n event.preventDefault();\n event.stopPropagation();\n this.isDragging = true;\n }\n\n /**\n * Handles drag over event\n */\n public onDragOver(event: DragEvent): void {\n event.preventDefault();\n event.stopPropagation();\n }\n\n /**\n * Handles drag leave event\n */\n public onDragLeave(event: DragEvent): void {\n event.preventDefault();\n event.stopPropagation();\n\n // Only hide if leaving the container itself, not child elements\n if (event.currentTarget === event.target) {\n this.isDragging = false;\n }\n }\n\n /**\n * Handles drop event\n */\n public onDrop(event: DragEvent): void {\n event.preventDefault();\n event.stopPropagation();\n this.isDragging = false;\n\n const files = event.dataTransfer?.files;\n if (files && files.length > 0) {\n this.uploadFiles(Array.from(files));\n }\n }\n\n /**\n * Uploads multiple files to the current folder\n */\n private async uploadFiles(files: File[]): Promise<void> {\n if (!this.account) {\n return;\n }\n\n console.log('[FileGrid] Uploading files:', files.map(f => f.name));\n\n for (let i = 0; i < files.length; i++) {\n const file = files[i];\n await this.uploadSingleFile(file, i + 1, files.length);\n }\n\n // Refresh the file list after all uploads complete\n this.loadItems();\n }\n\n /**\n * Uploads a single file\n */\n private async uploadSingleFile(file: File, current: number, total: number): Promise<void> {\n if (!this.account) {\n return;\n }\n\n this.isUploading = true;\n this.uploadingFileName = `${file.name} (${current}/${total})`;\n this.uploadProgress = 0;\n\n try {\n // Construct the full object name with folder path\n // Remove trailing slash from folderPath to avoid double slashes\n let objectName: string;\n if (this.folderPath) {\n const cleanPath = this.folderPath.endsWith('/')\n ? this.folderPath.slice(0, -1)\n : this.folderPath;\n objectName = `${cleanPath}/${file.name}`;\n } else {\n objectName = file.name;\n }\n\n console.log('[FileGrid] Getting upload URL for:', objectName);\n\n // Get pre-authenticated upload URL\n const uploadData = await this.storageClient.CreatePreAuthUploadUrl(\n this.account.account.ID,\n objectName,\n file.type || 'application/octet-stream'\n );\n\n console.log('[FileGrid] Got upload URL:', uploadData.uploadUrl);\n\n // Upload the file using XMLHttpRequest to track progress\n await this.uploadFileToUrl(file, uploadData.uploadUrl);\n\n console.log('[FileGrid] File uploaded successfully:', file.name);\n\n } catch (error) {\n console.error('[FileGrid] Error uploading file:', error);\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n\n // Check if this is an unsupported operation error (e.g., Google Drive doesn't support pre-auth uploads)\n if (errorMessage.includes('not supported')) {\n this.errorMessage = `Upload not supported for ${this.account?.account.Name || 'this account'}. Try using a different storage account.`;\n } else {\n this.errorMessage = `Failed to upload ${file.name}: ${errorMessage}`;\n }\n\n // Clear error after 5 seconds\n setTimeout(() => {\n if (this.errorMessage?.startsWith('Failed to upload') || this.errorMessage?.startsWith('Upload not supported')) {\n this.errorMessage = null;\n }\n }, 5000);\n } finally {\n this.isUploading = false;\n this.uploadProgress = 0;\n this.uploadingFileName = '';\n }\n }\n\n /**\n * Uploads file to the pre-authenticated URL with progress tracking\n */\n private uploadFileToUrl(file: File, url: string): Promise<void> {\n return new Promise((resolve, reject) => {\n const xhr = new XMLHttpRequest();\n\n xhr.upload.addEventListener('progress', (event) => {\n if (event.lengthComputable) {\n this.uploadProgress = Math.round((event.loaded / event.total) * 100);\n }\n });\n\n xhr.addEventListener('load', () => {\n if (xhr.status >= 200 && xhr.status < 300) {\n resolve();\n } else {\n reject(new Error(`Upload failed with status ${xhr.status}`));\n }\n });\n\n xhr.addEventListener('error', () => {\n reject(new Error('Network error during upload'));\n });\n\n xhr.addEventListener('abort', () => {\n reject(new Error('Upload cancelled'));\n });\n\n // Use POST for Dropbox temporary upload links (required by Dropbox API)\n // Use PUT for other providers like S3\n // Dropbox requires POST with application/octet-stream\n xhr.open('POST', url, true);\n xhr.setRequestHeader('Content-Type', 'application/octet-stream');\n xhr.send(file);\n });\n }\n\n /**\n * Opens the new folder dialog\n */\n public onNewFolderClick(): void {\n this.newFolderName = '';\n this.showNewFolderDialog = true;\n }\n\n /**\n * Closes the new folder dialog\n */\n public onCancelNewFolder(): void {\n this.showNewFolderDialog = false;\n this.newFolderName = '';\n }\n\n /**\n * Creates a new folder in the current directory\n */\n public async onCreateFolder(): Promise<void> {\n if (!this.account || !this.newFolderName.trim()) {\n return;\n }\n\n this.isCreatingFolder = true;\n\n try {\n // Construct the full folder path\n // Remove trailing slash from folderPath to avoid double slashes\n let folderPath: string;\n if (this.folderPath) {\n const cleanPath = this.folderPath.endsWith('/')\n ? this.folderPath.slice(0, -1)\n : this.folderPath;\n folderPath = `${cleanPath}/${this.newFolderName.trim()}`;\n } else {\n folderPath = this.newFolderName.trim();\n }\n\n console.log('[FileGrid] Creating folder:', folderPath);\n\n const success = await this.storageClient.CreateDirectory(\n this.account.account.ID,\n folderPath\n );\n\n if (success) {\n console.log('[FileGrid] Folder created successfully:', folderPath);\n\n // Close dialog and refresh\n this.showNewFolderDialog = false;\n this.newFolderName = '';\n\n // Notify parent that folder structure changed\n this.folderStructureChanged.emit();\n\n // Refresh the file grid\n this.loadItems();\n } else {\n this.errorMessage = 'Failed to create folder';\n }\n } catch (error) {\n console.error('[FileGrid] Error creating folder:', error);\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n this.errorMessage = `Failed to create folder: ${errorMessage}`;\n\n // Clear error after 5 seconds\n setTimeout(() => {\n if (this.errorMessage?.startsWith('Failed to create')) {\n this.errorMessage = null;\n }\n }, 5000);\n } finally {\n this.isCreatingFolder = false;\n }\n }\n\n /**\n * Opens the delete confirmation dialog for the selected items\n */\n public onDeleteClick(): void {\n if (this.selectedItems.length === 0) {\n return;\n }\n\n // selectedItems contains keys (strings), not full objects\n // Find the actual item object from the items array\n const selectedKey = this.selectedItems[0];\n const item = this.items.find(i => i.key === selectedKey);\n\n if (!item) {\n console.error('[FileGrid] Could not find selected item with key:', selectedKey);\n return;\n }\n\n this.itemToDelete = item;\n this.showDeleteDialog = true;\n }\n\n /**\n * Closes the delete confirmation dialog\n */\n public onCancelDelete(): void {\n this.showDeleteDialog = false;\n this.itemToDelete = null;\n }\n\n /**\n * Deletes the selected item after confirmation\n */\n public async onConfirmDelete(): Promise<void> {\n if (!this.account || !this.itemToDelete) {\n return;\n }\n\n this.isDeleting = true;\n\n try {\n // Construct the full path to the item\n const itemPath = this.constructItemPath(this.itemToDelete);\n\n console.log('[FileGrid] Deleting item:', itemPath);\n\n const success = await this.storageClient.DeleteObject(\n this.account.account.ID,\n itemPath\n );\n\n console.log('[FileGrid] Delete result:', { success });\n\n if (success) {\n console.log('[FileGrid] Item deleted successfully:', itemPath);\n\n // Check if we deleted a folder (before clearing itemToDelete)\n const wasFolder = this.itemToDelete.type === 'folder';\n\n console.log('[FileGrid] Item details:', {\n type: this.itemToDelete.type,\n name: this.itemToDelete.name,\n key: this.itemToDelete.key,\n wasFolder\n });\n\n // Close dialog\n this.showDeleteDialog = false;\n this.itemToDelete = null;\n\n // Clear selection\n this.selectedItems = [];\n\n // If we deleted a folder, notify parent that folder structure changed\n if (wasFolder) {\n console.log('[FileGrid] Emitting folderStructureChanged event');\n this.folderStructureChanged.emit();\n }\n\n // Refresh the file grid\n console.log('[FileGrid] Calling loadItems() to refresh grid');\n this.loadItems();\n } else {\n console.error('[FileGrid] Delete operation returned false');\n this.errorMessage = `Failed to delete ${this.itemToDelete.type}`;\n }\n } catch (error) {\n console.error('[FileGrid] Error deleting item:', error);\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n this.errorMessage = `Failed to delete: ${errorMessage}`;\n\n // Clear error after 5 seconds\n setTimeout(() => {\n if (this.errorMessage?.startsWith('Failed to delete')) {\n this.errorMessage = null;\n }\n }, 5000);\n } finally {\n this.isDeleting = false;\n }\n }\n\n /**\n * Opens the rename dialog for the selected item\n */\n public onRenameClick(): void {\n if (this.selectedItems.length !== 1) {\n return;\n }\n\n // selectedItems contains keys (strings), not full objects\n // Find the actual item object from the items array\n const selectedKey = this.selectedItems[0];\n const item = this.items.find(i => i.key === selectedKey);\n\n if (!item) {\n console.error('[FileGrid] Could not find selected item with key:', selectedKey);\n return;\n }\n\n this.itemToRename = item;\n this.newItemName = item.name;\n this.showRenameDialog = true;\n }\n\n /**\n * Closes the rename dialog\n */\n public onCancelRename(): void {\n this.showRenameDialog = false;\n this.itemToRename = null;\n this.newItemName = '';\n }\n\n /**\n * Renames the selected item after confirmation\n */\n public async onConfirmRename(): Promise<void> {\n if (!this.account || !this.itemToRename || !this.newItemName.trim()) {\n return;\n }\n\n // Check if name actually changed\n if (this.newItemName.trim() === this.itemToRename.name) {\n this.onCancelRename();\n return;\n }\n\n this.isRenaming = true;\n\n try {\n // Construct the old and new paths\n const oldPath = this.constructItemPath(this.itemToRename);\n\n // Build the new path by replacing the old name with the new name\n const pathParts = oldPath.split('/');\n pathParts[pathParts.length - 1] = this.newItemName.trim();\n const newPath = pathParts.join('/');\n\n console.log('[FileGrid] Renaming item:', { oldPath, newPath });\n\n const success = await this.storageClient.MoveObject(\n this.account.account.ID,\n oldPath,\n newPath\n );\n\n console.log('[FileGrid] Rename result:', { success });\n\n if (success) {\n console.log('[FileGrid] Item renamed successfully:', { oldPath, newPath });\n\n // Check if we renamed a folder (before clearing itemToRename)\n const wasFolder = this.itemToRename.type === 'folder';\n\n // Close dialog\n this.showRenameDialog = false;\n this.itemToRename = null;\n this.newItemName = '';\n\n // Clear selection\n this.selectedItems = [];\n\n // If we renamed a folder, notify parent that folder structure changed\n if (wasFolder) {\n console.log('[FileGrid] Emitting folderStructureChanged event');\n this.folderStructureChanged.emit();\n }\n\n // Refresh the file grid\n console.log('[FileGrid] Calling loadItems() to refresh grid');\n this.loadItems();\n } else {\n console.error('[FileGrid] Rename operation returned false');\n this.errorMessage = `Failed to rename ${this.itemToRename.type}`;\n }\n } catch (error) {\n console.error('[FileGrid] Error renaming item:', error);\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n this.errorMessage = `Failed to rename: ${errorMessage}`;\n\n // Clear error after 5 seconds\n setTimeout(() => {\n if (this.errorMessage?.startsWith('Failed to rename')) {\n this.errorMessage = null;\n }\n }, 5000);\n } finally {\n this.isRenaming = false;\n }\n }\n\n /**\n * Downloads the selected file\n */\n public async onDownloadClick(): Promise<void> {\n if (this.selectedItems.length !== 1) {\n return;\n }\n\n // Find the selected item\n const selectedKey = this.selectedItems[0];\n const item = this.items.find(i => i.key === selectedKey);\n\n if (!item) {\n console.error('[FileGrid] Could not find selected item with key:', selectedKey);\n return;\n }\n\n // Can only download files, not folders\n if (item.type === 'folder') {\n this.errorMessage = 'Cannot download folders. Please select a file.';\n setTimeout(() => {\n if (this.errorMessage?.includes('Cannot download folders')) {\n this.errorMessage = null;\n }\n }, 3000);\n return;\n }\n\n if (!this.account) {\n return;\n }\n\n try {\n const itemPath = this.constructItemPath(item);\n\n console.log('[FileGrid] Creating download URL for:', itemPath);\n\n const downloadUrl = await this.storageClient.CreatePreAuthDownloadUrl(\n this.account.account.ID,\n itemPath\n );\n\n if (downloadUrl) {\n console.log('[FileGrid] Download URL created, initiating download');\n\n // Create a temporary anchor element to trigger download\n const link = document.createElement('a');\n link.href = downloadUrl;\n link.download = item.name;\n link.style.display = 'none';\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n } else {\n this.errorMessage = 'Failed to create download URL';\n }\n } catch (error) {\n console.error('[FileGrid] Error downloading file:', error);\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n this.errorMessage = `Failed to download: ${errorMessage}`;\n\n // Clear error after 5 seconds\n setTimeout(() => {\n if (this.errorMessage?.startsWith('Failed to download')) {\n this.errorMessage = null;\n }\n }, 5000);\n }\n }\n\n /**\n * Opens the copy dialog for the selected item\n */\n public onCopyClick(): void {\n if (this.selectedItems.length !== 1) {\n return;\n }\n\n const selectedKey = this.selectedItems[0];\n const item = this.items.find(i => i.key === selectedKey);\n\n if (!item) {\n console.error('[FileGrid] Could not find selected item with key:', selectedKey);\n return;\n }\n\n this.itemToCopy = item;\n this.copyDestinationPath = this.folderPath + item.name + '-copy';\n this.showCopyDialog = true;\n }\n\n /**\n * Cancels the copy operation\n */\n public onCancelCopy(): void {\n this.showCopyDialog = false;\n this.itemToCopy = null;\n this.copyDestinationPath = '';\n }\n\n /**\n * Confirms and executes the copy operation\n */\n public async onConfirmCopy(): Promise<void> {\n if (!this.account || !this.itemToCopy || !this.copyDestinationPath.trim()) {\n return;\n }\n\n this.isCopying = true;\n\n try {\n const sourcePath = this.constructItemPath(this.itemToCopy);\n\n const success = await this.storageClient.CopyObject(\n this.account.account.ID,\n sourcePath,\n this.copyDestinationPath.trim()\n );\n\n if (success) {\n // Close dialog\n this.showCopyDialog = false;\n this.itemToCopy = null;\n this.copyDestinationPath = '';\n\n // Clear selection\n this.selectedItems = [];\n\n // Refresh the file grid\n this.loadItems();\n } else {\n this.errorMessage = 'Failed to copy item';\n }\n } catch (error) {\n console.error('[FileGrid] Error copying item:', error);\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n this.errorMessage = `Failed to copy: ${errorMessage}`;\n\n setTimeout(() => {\n if (this.errorMessage?.startsWith('Failed to copy')) {\n this.errorMessage = null;\n }\n }, 5000);\n } finally {\n this.isCopying = false;\n }\n }\n\n /**\n * Opens the move dialog for the selected item\n */\n public onMoveClick(): void {\n if (this.selectedItems.length !== 1) {\n return;\n }\n\n const selectedKey = this.selectedItems[0];\n const item = this.items.find(i => i.key === selectedKey);\n\n if (!item) {\n console.error('[FileGrid] Could not find selected item with key:', selectedKey);\n return;\n }\n\n this.itemToMove = item;\n // Suggest a different folder path\n this.moveDestinationPath = this.folderPath;\n this.showMoveDialog = true;\n }\n\n /**\n * Cancels the move operation\n */\n public onCancelMove(): void {\n this.showMoveDialog = false;\n this.itemToMove = null;\n this.moveDestinationPath = '';\n }\n\n /**\n * Confirms and executes the move operation\n */\n public async onConfirmMove(): Promise<void> {\n if (!this.account || !this.itemToMove || !this.moveDestinationPath.trim()) {\n return;\n }\n\n this.isMoving = true;\n\n try {\n const sourcePath = this.constructItemPath(this.itemToMove);\n const destPath = this.moveDestinationPath.trim().endsWith('/')\n ? this.moveDestinationPath.trim() + this.itemToMove.name\n : this.moveDestinationPath.trim();\n\n const success = await this.storageClient.MoveObject(\n this.account.account.ID,\n sourcePath,\n destPath\n );\n\n if (success) {\n const wasFolder = this.itemToMove.type === 'folder';\n\n // Close dialog\n this.showMoveDialog = false;\n this.itemToMove = null;\n this.moveDestinationPath = '';\n\n // Clear selection\n this.selectedItems = [];\n\n // If we moved a folder, notify parent that folder structure changed\n if (wasFolder) {\n this.folderStructureChanged.emit();\n }\n\n // Refresh the file grid\n this.loadItems();\n } else {\n this.errorMessage = 'Failed to move item';\n }\n } catch (error) {\n console.error('[FileGrid] Error moving item:', error);\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n this.errorMessage = `Failed to move: ${errorMessage}`;\n\n setTimeout(() => {\n if (this.errorMessage?.startsWith('Failed to move')) {\n this.errorMessage = null;\n }\n }, 5000);\n } finally {\n this.isMoving = false;\n }\n }\n\n /**\n * Constructs the full path for an item\n */\n private constructItemPath(item: FileGridItem): string {\n // Validate that we have either key or name\n if (!item.key && !item.name) {\n console.error('[FileGrid] Cannot construct path - item has no key or name:', item);\n throw new Error('Cannot construct path for item without key or name');\n }\n\n // If item.key exists and is at root level, use it directly\n if (!this.folderPath || this.folderPath === '/') {\n return item.key || item.name;\n }\n\n // If the item key already includes the folder path, use it as is\n if (item.key && item.key.startsWith(this.folderPath)) {\n return item.key;\n }\n\n // Otherwise, combine folder path with item name\n const normalizedFolderPath = this.folderPath.endsWith('/')\n ? this.folderPath.slice(0, -1)\n : this.folderPath;\n\n // Make sure we have a name to use\n const itemName = item.name || item.key;\n if (!itemName) {\n console.error('[FileGrid] Cannot construct path - item has no usable name:', item);\n throw new Error('Cannot construct path for item without name');\n }\n\n return `${normalizedFolderPath}/${itemName}`;\n }\n\n /**\n * Gets the currently selected item (if exactly one is selected)\n */\n public getSelectedItem(): FileGridItem | null {\n if (this.selectedItems.length !== 1) {\n return null;\n }\n return this.items.find(item => item.key === this.selectedItems[0]) || null;\n }\n\n /**\n * Opens the copy to account dialog\n */\n public async onCopyToAccountClick(): Promise<void> {\n const item = this.getSelectedItem();\n if (!item || item.type === 'folder') {\n return;\n }\n\n try {\n const engine = FileStorageEngine.Instance;\n await engine.Config(false); // Use cached data if available\n\n // Build available accounts (excluding current account)\n this.availableAccounts = engine.AccountsWithProviders\n .filter(a => !UUIDsEqual(a.account.ID, this.account?.account.ID));\n\n if (this.availableAccounts.length === 0) {\n this.errorMessage = 'No other storage accounts available';\n setTimeout(() => {\n if (this.errorMessage?.includes('No other storage accounts')) {\n this.errorMessage = null;\n }\n }, 3000);\n return;\n }\n\n this.itemToCopyToProvider = item;\n this.copyToAccountDestinationPath = item.name; // Default to same filename\n this.selectedDestinationAccounts.clear();\n this.copyToAccountProgress = null;\n this.showCopyToProviderDialog = true;\n\n } catch (error) {\n console.error('[FileGrid] Error loading accounts:', error);\n this.errorMessage = 'Failed to load storage accounts';\n }\n }\n\n /**\n * Cancels the copy to account dialog\n */\n public onCancelCopyToAccount(): void {\n this.showCopyToProviderDialog = false;\n this.itemToCopyToProvider = null;\n this.selectedDestinationAccounts.clear();\n this.copyToAccountDestinationPath = '';\n this.copyToAccountProgress = null;\n }\n\n /**\n * Toggles selection of a destination account for copying\n */\n public toggleDestinationAccount(accountId: string): void {\n if (this.selectedDestinationAccounts.has(accountId)) {\n this.selectedDestinationAccounts.delete(accountId);\n } else {\n this.selectedDestinationAccounts.add(accountId);\n }\n }\n\n /**\n * Checks if an account is selected as a destination\n */\n public isDestinationAccountSelected(accountId: string): boolean {\n return this.selectedDestinationAccounts.has(accountId);\n }\n\n /**\n * Executes the cross-account copy to multiple selected accounts\n */\n public async onConfirmCopyToAccount(): Promise<void> {\n if (!this.itemToCopyToProvider || this.selectedDestinationAccounts.size === 0 || !this.account) {\n return;\n }\n\n this.isCopyingToAccount = true;\n\n // Get selected accounts\n const selectedAccounts = this.availableAccounts.filter(a =>\n this.selectedDestinationAccounts.has(a.account.ID)\n );\n\n const successfulCopies: string[] = [];\n const failedCopies: { account: string; error: string }[] = [];\n\n try {\n // Construct source path and normalize it\n const rawSourcePath = this.constructItemPath(this.itemToCopyToProvider);\n const sourcePath = rawSourcePath.replace(/^\\/+|\\/+$/g, '').replace(/\\/+/g, '/');\n console.log('[FileGrid] Cross-account copy sourcePath:', { raw: rawSourcePath, normalized: sourcePath });\n\n // Copy to each selected account\n for (let i = 0; i < selectedAccounts.length; i++) {\n const destAccount = selectedAccounts[i];\n this.copyToAccountProgress = {\n current: i + 1,\n total: selectedAccounts.length,\n currentAccount: destAccount.account.Name\n };\n\n try {\n console.log('[FileGrid] Copying to account:', destAccount.account.Name);\n\n const copyResult = await this.storageClient.CopyObjectBetweenAccounts(\n this.account.account.ID,\n destAccount.account.ID,\n sourcePath,\n this.copyToAccountDestinationPath\n );\n\n if (copyResult.success) {\n successfulCopies.push(destAccount.account.Name);\n } else {\n failedCopies.push({ account: destAccount.account.Name, error: copyResult.message });\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n failedCopies.push({ account: destAccount.account.Name, error: errorMessage });\n }\n }\n\n // Show results\n if (failedCopies.length === 0) {\n this.errorMessage = `Successfully copied to ${successfulCopies.length} account${successfulCopies.length > 1 ? 's' : ''}: ${successfulCopies.join(', ')}`;\n } else if (successfulCopies.length === 0) {\n this.errorMessage = `Copy failed for all accounts: ${failedCopies.map(f => `${f.account} (${f.error})`).join(', ')}`;\n } else {\n this.errorMessage = `Copied to ${successfulCopies.length} account(s). Failed: ${failedCopies.map(f => f.account).join(', ')}`;\n }\n\n setTimeout(() => {\n if (this.errorMessage?.includes('copied') || this.errorMessage?.includes('Copy failed')) {\n this.errorMessage = null;\n }\n }, 5000);\n\n // Close dialog\n this.showCopyToProviderDialog = false;\n this.itemToCopyToProvider = null;\n this.selectedDestinationAccounts.clear();\n this.copyToAccountDestinationPath = '';\n this.copyToAccountProgress = null;\n\n } catch (error) {\n console.error('[FileGrid] Error copying to accounts:', error);\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n this.errorMessage = `Copy failed: ${errorMessage}`;\n\n setTimeout(() => {\n if (this.errorMessage?.startsWith('Copy failed')) {\n this.errorMessage = null;\n }\n }, 5000);\n } finally {\n this.isCopyingToAccount = false;\n this.copyToAccountProgress = null;\n }\n }\n\n // ==========================================\n // Multi-Account Search Methods\n // ==========================================\n\n /**\n * Toggles multi-account search mode\n */\n public toggleMultiAccountSearchMode(): void {\n this.isMultiProviderSearchMode = !this.isMultiProviderSearchMode;\n\n if (this.isMultiProviderSearchMode) {\n // Load available accounts if not already loaded\n if (this.availableAccounts.length === 0) {\n this.loadAvailableAccountsForSearch();\n }\n // Pre-select current account if available\n if (this.account) {\n this.selectedSearchProviders.add(this.account.account.ID);\n }\n } else {\n // Clear search results when exiting search mode\n this.multiProviderSearchResults = null;\n this.multiProviderSearchQuery = '';\n }\n }\n\n /**\n * Loads available accounts for search selection\n */\n private async loadAvailableAccountsForSearch(): Promise<void> {\n try {\n const engine = FileStorageEngine.Instance;\n await engine.Config(false); // Use cached data if available\n this.availableAccounts = engine.AccountsWithProviders;\n } catch (error) {\n console.error('[FileGrid] Error loading accounts for search:', error);\n }\n }\n\n /**\n * Toggles account selection for search\n */\n public toggleSearchAccount(accountID: string): void {\n if (this.selectedSearchProviders.has(accountID)) {\n this.selectedSearchProviders.delete(accountID);\n } else {\n this.selectedSearchProviders.add(accountID);\n }\n }\n\n /**\n * Checks if an account is selected for search\n */\n public isAccountSelectedForSearch(accountID: string): boolean {\n return this.selectedSearchProviders.has(accountID);\n }\n\n /**\n * Checks if an account's provider supports search\n */\n public accountSupportsSearch(accountWithProvider: StorageAccountWithProvider): boolean {\n return accountWithProvider.provider.SupportsSearch === true;\n }\n\n /**\n * Executes multi-account search\n */\n public async executeMultiAccountSearch(): Promise<void> {\n if (!this.multiProviderSearchQuery.trim() || this.selectedSearchProviders.size === 0) {\n return;\n }\n\n this.isSearching = true;\n this.multiProviderSearchResults = null;\n\n try {\n console.log('[FileGrid] Executing multi-account search:', {\n accountIds: Array.from(this.selectedSearchProviders),\n query: this.multiProviderSearchQuery\n });\n\n const searchResult = await this.storageClient.SearchFiles(\n Array.from(this.selectedSearchProviders),\n this.multiProviderSearchQuery,\n { maxResultsPerAccount: 50 }\n );\n\n console.log('[FileGrid] Multi-account search result:', searchResult);\n\n // Map the client result to the component's expected format\n this.multiProviderSearchResults = {\n accountResults: searchResult.accountResults.map((ar: { accountId: string; accountName: string; success: boolean; errorMessage?: string; results: Array<{ path: string; name: string; size: number; contentType: string; lastModified: Date; relevance?: number; excerpt?: string; matchInFilename?: boolean; objectId?: string }>; totalMatches?: number; hasMore: boolean; nextPageToken?: string }) => ({\n accountID: ar.accountId,\n accountName: ar.accountName,\n success: ar.success,\n errorMessage: ar.errorMessage,\n results: ar.results.map((r: { path: string; name: string; size: number; contentType: string; lastModified: Date; relevance?: number; excerpt?: string; matchInFilename?: boolean; objectId?: string }) => ({\n path: r.path,\n name: r.name,\n size: r.size,\n contentType: r.contentType,\n lastModified: r.lastModified.toISOString(),\n relevance: r.relevance,\n excerpt: r.excerpt,\n matchInFilename: r.matchInFilename,\n objectId: r.objectId\n })),\n totalMatches: ar.totalMatches,\n hasMore: ar.hasMore,\n nextPageToken: ar.nextPageToken\n })),\n totalResultsReturned: searchResult.totalResultsReturned,\n successfulAccounts: searchResult.successfulAccounts,\n failedAccounts: searchResult.failedAccounts\n };\n\n } catch (error) {\n console.error('[FileGrid] Error executing multi-provider search:', error);\n this.errorMessage = 'Search failed. Please try again.';\n setTimeout(() => {\n if (this.errorMessage === 'Search failed. Please try again.') {\n this.errorMessage = null;\n }\n }, 5000);\n } finally {\n this.isSearching = false;\n }\n }\n\n /**\n * Clears multi-provider search results\n */\n public clearMultiProviderSearch(): void {\n this.multiProviderSearchQuery = '';\n this.multiProviderSearchResults = null;\n }\n\n /**\n * Gets icon for a search result based on content type\n */\n public getSearchResultIcon(result: FileSearchResultItem): string {\n const extension = result.name.split('.').pop()?.toLowerCase() || '';\n\n if (['jpg', 'jpeg', 'png', 'gif', 'bmp', 'svg'].includes(extension)) {\n return 'fa-solid fa-file-image';\n } else if (['pdf'].includes(extension)) {\n return 'fa-solid fa-file-pdf';\n } else if (['doc', 'docx'].includes(extension)) {\n return 'fa-solid fa-file-word';\n } else if (['xls', 'xlsx'].includes(extension)) {\n return 'fa-solid fa-file-excel';\n } else if (['ppt', 'pptx'].includes(extension)) {\n return 'fa-solid fa-file-powerpoint';\n } else if (['zip', 'rar', '7z', 'tar', 'gz'].includes(extension)) {\n return 'fa-solid fa-file-zipper';\n } else if (['mp4', 'avi', 'mov', 'wmv'].includes(extension)) {\n return 'fa-solid fa-file-video';\n } else if (['mp3', 'wav', 'ogg', 'flac'].includes(extension)) {\n return 'fa-solid fa-file-audio';\n } else {\n return 'fa-solid fa-file';\n }\n }\n\n /**\n * Formats file size for search results\n */\n public formatSearchResultSize(bytes: number): string {\n return this.formatFileSize(bytes);\n }\n\n /**\n * Formats date for search results\n */\n public formatSearchResultDate(dateStr: string): string {\n return new Date(dateStr).toLocaleString();\n }\n}","<div class=\"file-grid-container\"\n (dragenter)=\"onDragEnter($event)\"\n (dragover)=\"onDragOver($event)\"\n (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDrop($event)\">\n <!-- Breadcrumb Navigation Bar -->\n @if (!isLoading && !errorMessage) {\n <div class=\"breadcrumb-bar\">\n <div class=\"nav-buttons\">\n <button class=\"nav-btn\"\n [disabled]=\"!canNavigateUp()\"\n (click)=\"navigateUp()\"\n title=\"Go up to parent folder\">\n <i class=\"fa-solid fa-arrow-up\"></i>\n </button>\n <button class=\"nav-btn\" (click)=\"refresh()\" title=\"Refresh\">\n <i class=\"fa-solid fa-arrows-rotate\"></i>\n </button>\n </div>\n <div class=\"breadcrumb-path\">\n <i class=\"fa-solid fa-folder\"></i>\n <span class=\"path-text\">{{ folderPath || 'Root' }} /</span>\n </div>\n <div class=\"search-bar\">\n <input type=\"text\"\n class=\"search-input\"\n [(ngModel)]=\"searchQuery\"\n (ngModelChange)=\"onSearchChange($event)\"\n placeholder=\"Search files and folders...\"\n [disabled]=\"isLoading || isMultiProviderSearchMode\">\n @if (searchQuery && !isMultiProviderSearchMode) {\n <button class=\"search-clear-btn\"\n (click)=\"clearSearch()\"\n title=\"Clear search\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n }\n <select class=\"file-type-filter\"\n [(ngModel)]=\"fileTypeFilter\"\n (ngModelChange)=\"onFileTypeFilterChange($event)\"\n [disabled]=\"isLoading || isMultiProviderSearchMode\">\n <option value=\"all\">All</option>\n <option value=\"files\">Files</option>\n <option value=\"folders\">Folders</option>\n </select>\n <button class=\"multi-search-btn\"\n [class.active]=\"isMultiProviderSearchMode\"\n (click)=\"toggleMultiAccountSearchMode()\"\n title=\"Search across all storage providers\">\n <i class=\"fa-solid fa-magnifying-glass-plus\"></i>\n </button>\n </div>\n </div>\n }\n\n <!-- Multi-Provider Search Panel -->\n @if (isMultiProviderSearchMode) {\n <div class=\"multi-provider-search-panel\">\n <div class=\"search-panel-header\">\n <h3><i class=\"fa-solid fa-magnifying-glass\"></i> Search Across Providers</h3>\n <button class=\"close-panel-btn\" (click)=\"toggleMultiAccountSearchMode()\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n <div class=\"search-panel-body\">\n <div class=\"search-input-row\">\n <input type=\"text\"\n class=\"multi-search-input\"\n [(ngModel)]=\"multiProviderSearchQuery\"\n placeholder=\"Enter search term...\"\n (keydown.enter)=\"executeMultiAccountSearch()\"\n [disabled]=\"isSearching\">\n <button class=\"search-execute-btn\"\n (click)=\"executeMultiAccountSearch()\"\n [disabled]=\"isSearching || !multiProviderSearchQuery.trim() || selectedSearchProviders.size === 0\">\n @if (isSearching) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n }\n @if (!isSearching) {\n <i class=\"fa-solid fa-search\"></i>\n }\n {{ isSearching ? 'Searching...' : 'Search' }}\n </button>\n </div>\n <div class=\"provider-selection\">\n <label class=\"provider-selection-label\">Select accounts to search:</label>\n <div class=\"provider-checkboxes\">\n @for (a of availableAccounts; track a) {\n <label\n class=\"provider-checkbox\"\n [class.disabled]=\"!accountSupportsSearch(a)\"\n [title]=\"accountSupportsSearch(a) ? '' : 'This account does not support search'\">\n <input type=\"checkbox\"\n [checked]=\"isAccountSelectedForSearch(a.account.ID)\"\n (change)=\"toggleSearchAccount(a.account.ID)\"\n [disabled]=\"!accountSupportsSearch(a)\">\n <span class=\"provider-name\">{{ a.account.Name }}</span>\n <span class=\"provider-type\">({{ a.provider.Name }})</span>\n @if (!accountSupportsSearch(a)) {\n <span class=\"no-search-badge\">(no search)</span>\n }\n </label>\n }\n </div>\n </div>\n </div>\n <!-- Search Results -->\n @if (multiProviderSearchResults) {\n <div class=\"search-results-container\">\n <div class=\"search-results-summary\">\n <span class=\"result-count\">{{ multiProviderSearchResults.totalResultsReturned }} result(s) found</span>\n <span class=\"provider-stats\">\n ({{ multiProviderSearchResults.successfulAccounts }} account(s) searched\n @if (multiProviderSearchResults.failedAccounts > 0) {\n <span class=\"failed-count\">\n , {{ multiProviderSearchResults.failedAccounts }} failed\n </span>\n })\n </span>\n <button class=\"clear-results-btn\" (click)=\"clearMultiProviderSearch()\">\n <i class=\"fa-solid fa-xmark\"></i> Clear\n </button>\n </div>\n <div class=\"provider-results-list\">\n @for (accountResult of multiProviderSearchResults.accountResults; track accountResult) {\n <div\n class=\"provider-result-group\"\n [class.failed]=\"!accountResult.success\">\n <div class=\"provider-result-header\">\n <i class=\"fa-solid fa-cloud\"></i>\n <span class=\"provider-name\">{{ accountResult.accountName }}</span>\n @if (accountResult.success) {\n <span class=\"result-count\">\n ({{ accountResult.results.length }} result(s))\n </span>\n }\n @if (!accountResult.success) {\n <span class=\"error-badge\">\n <i class=\"fa-solid fa-exclamation-triangle\"></i>\n {{ accountResult.errorMessage }}\n </span>\n }\n </div>\n @if (accountResult.success && accountResult.results.length > 0) {\n <div class=\"provider-result-files\">\n @for (file of accountResult.results; track file) {\n <div class=\"search-result-item\">\n <i [class]=\"getSearchResultIcon(file)\" class=\"file-icon\"></i>\n <div class=\"file-info\">\n <span class=\"file-name\">{{ file.name }}</span>\n <span class=\"file-path\">{{ file.path }}</span>\n </div>\n <span class=\"file-size\">{{ formatSearchResultSize(file.size) }}</span>\n <span class=\"file-date\">{{ formatSearchResultDate(file.lastModified) }}</span>\n </div>\n }\n </div>\n }\n @if (accountResult.success && accountResult.results.length === 0) {\n <div class=\"no-results-message\">\n No matching files found\n </div>\n }\n </div>\n }\n </div>\n </div>\n }\n <!-- Searching State -->\n @if (isSearching) {\n <div class=\"searching-state\">\n <mj-loading text=\"Searching across providers...\"></mj-loading>\n </div>\n }\n </div>\n }\n\n <!-- Loading State -->\n @if (isLoading && !isMultiProviderSearchMode) {\n <div class=\"loading-state\">\n <mj-loading text=\"Loading files...\"></mj-loading>\n </div>\n }\n\n <!-- Error State -->\n @if (errorMessage && !isLoading) {\n <div class=\"error-state\">\n <div class=\"error-icon\">\n <i class=\"fa-solid fa-circle-exclamation\"></i>\n </div>\n <p class=\"error-message\">{{ errorMessage }}</p>\n <button class=\"retry-btn\" (click)=\"refresh()\">\n <i class=\"fa-solid fa-arrows-rotate\"></i>\n Retry\n </button>\n </div>\n }\n\n <!-- List View -->\n @if (!isLoading && !errorMessage && filteredItems.length > 0 && viewMode === 'list') {\n <div class=\"file-table-wrapper\">\n <table class=\"file-table\">\n <thead>\n <tr>\n <th class=\"col-name\" (click)=\"onSortChange([{ field: 'name', dir: sort[0].field === 'name' && sort[0].dir === 'asc' ? 'desc' : 'asc' }])\">\n <span>Name</span>\n <i class=\"fa-solid sort-icon\"\n [class.fa-caret-up]=\"sort[0].field === 'name' && sort[0].dir === 'asc'\"\n [class.fa-caret-down]=\"sort[0].field === 'name' && sort[0].dir === 'desc'\"\n [class.fa-sort]=\"sort[0].field !== 'name'\"></i>\n </th>\n <th class=\"col-type\">Type</th>\n <th class=\"col-size\" (click)=\"onSortChange([{ field: 'size', dir: sort[0].field === 'size' && sort[0].dir === 'asc' ? 'desc' : 'asc' }])\">\n <span>Size</span>\n <i class=\"fa-solid sort-icon\"\n [class.fa-caret-up]=\"sort[0].field === 'size' && sort[0].dir === 'asc'\"\n [class.fa-caret-down]=\"sort[0].field === 'size' && sort[0].dir === 'desc'\"\n [class.fa-sort]=\"sort[0].field !== 'size'\"></i>\n </th>\n <th class=\"col-modified\" (click)=\"onSortChange([{ field: 'lastModified', dir: sort[0].field === 'lastModified' && sort[0].dir === 'asc' ? 'desc' : 'asc' }])\">\n <span>Modified</span>\n <i class=\"fa-solid sort-icon\"\n [class.fa-caret-up]=\"sort[0].field === 'lastModified' && sort[0].dir === 'asc'\"\n [class.fa-caret-down]=\"sort[0].field === 'lastModified' && sort[0].dir === 'desc'\"\n [class.fa-sort]=\"sort[0].field !== 'lastModified'\"></i>\n </th>\n </tr>\n </thead>\n <tbody>\n @for (item of filteredItems; track item) {\n <tr\n class=\"file-row\"\n [class.selected]=\"selectedItems.includes(item.key)\"\n (click)=\"onTileClick(item, $event)\"\n (dblclick)=\"onItemDoubleClick(item)\">\n <td class=\"col-name\">\n <i [class]=\"getItemIcon(item)\" class=\"item-icon\"></i>\n <span class=\"item-name\">{{ item.name }}</span>\n </td>\n <td class=\"col-type\">\n <span class=\"item-type\">{{ getFileType(item) }}</span>\n </td>\n <td class=\"col-size\">\n <span class=\"item-size\">{{ item.type === 'folder' ? '—' : formatFileSize(item.size) }}</span>\n </td>\n <td class=\"col-modified\">\n <span class=\"item-date\">{{ formatDate(item.lastModified) }}</span>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n\n <!-- Grid View -->\n @if (!isLoading && !errorMessage && filteredItems.length > 0 && viewMode === 'grid') {\n <div class=\"file-grid-wrapper\">\n <div class=\"file-grid\">\n @for (item of filteredItems; track item) {\n <div\n class=\"grid-item\"\n [class.selected]=\"selectedItems.includes(item.key)\"\n (click)=\"onTileClick(item, $event)\"\n (dblclick)=\"onItemDoubleClick(item)\">\n <div class=\"grid-icon\">\n <i [class]=\"getItemIcon(item)\"></i>\n </div>\n <div class=\"grid-name\">{{ item.name }}</div>\n @if (item.type === 'file') {\n <div class=\"grid-meta\">{{ formatFileSize(item.size) }}</div>\n }\n @if (item.type === 'folder') {\n <div class=\"grid-meta\">Folder</div>\n }\n </div>\n }\n </div>\n </div>\n }\n\n <!-- Empty State -->\n @if (!isLoading && !errorMessage && filteredItems.length === 0) {\n <div class=\"empty-state\">\n <div class=\"empty-icon\">\n <i class=\"fa-solid fa-folder-open\"></i>\n </div>\n <p class=\"empty-message\">This folder is empty</p>\n <button class=\"upload-btn\" (click)=\"onUploadClick()\">\n <i class=\"fa-solid fa-upload\"></i>\n Upload Files\n </button>\n </div>\n }\n\n <!-- Bottom Toolbar -->\n @if (!isLoading && !errorMessage) {\n <div class=\"bottom-toolbar\">\n <div class=\"toolbar-left\">\n <button class=\"toolbar-btn\" (click)=\"onUploadClick()\">\n <i class=\"fa-solid fa-upload\"></i>\n Upload\n </button>\n <button class=\"toolbar-btn\" (click)=\"onNewFolderClick()\">\n <i class=\"fa-solid fa-folder-plus\"></i>\n New Folder\n </button>\n <button class=\"toolbar-btn\"\n [disabled]=\"selectedItems.length !== 1\"\n (click)=\"onDownloadClick()\">\n <i class=\"fa-solid fa-download\"></i>\n Download\n </button>\n <button class=\"toolbar-btn\"\n [disabled]=\"selectedItems.length !== 1\"\n (click)=\"onRenameClick()\">\n <i class=\"fa-solid fa-pen\"></i>\n Rename\n </button>\n <button class=\"toolbar-btn\"\n [disabled]=\"selectedItems.length !== 1\"\n (click)=\"onCopyClick()\">\n <i class=\"fa-solid fa-copy\"></i>\n Copy\n </button>\n <button class=\"toolbar-btn\"\n [disabled]=\"selectedItems.length !== 1 || getSelectedItem()?.type === 'folder'\"\n (click)=\"onCopyToAccountClick()\"\n title=\"Copy file to another storage account\">\n <i class=\"fa-solid fa-cloud-arrow-up\"></i>\n Copy to...\n </button>\n <button class=\"toolbar-btn\"\n [disabled]=\"selectedItems.length !== 1\"\n (click)=\"onMoveClick()\">\n <i class=\"fa-solid fa-arrows-up-down-left-right\"></i>\n Move\n </button>\n <button class=\"toolbar-btn\"\n [disabled]=\"selectedItems.length === 0\"\n (click)=\"onDeleteClick()\">\n <i class=\"fa-solid fa-trash\"></i>\n Delete\n </button>\n </div>\n <div class=\"toolbar-right\">\n <!-- View Toggle -->\n <div class=\"view-toggle\">\n <button class=\"view-btn\"\n [class.active]=\"viewMode === 'list'\"\n (click)=\"viewMode = 'list'\"\n title=\"List View\">\n <i class=\"fa-solid fa-list\"></i>\n </button>\n <button class=\"view-btn\"\n [class.active]=\"viewMode === 'grid'\"\n (click)=\"viewMode = 'grid'\"\n title=\"Grid View\">\n <i class=\"fa-solid fa-th\"></i>\n </button>\n </div>\n <span class=\"item-count\">\n {{ filteredItems.length }} {{ filteredItems.length === 1 ? 'item' : 'filteredItems' }}\n </span>\n </div>\n </div>\n }\n\n <!-- Drag & Drop Overlay -->\n @if (isDragging) {\n <div class=\"drag-overlay\">\n <div class=\"drag-content\">\n <div class=\"drag-icon\">\n <i class=\"fa-solid fa-cloud-arrow-up\"></i>\n </div>\n <h2 class=\"drag-title\">Drop files to upload</h2>\n </div>\n </div>\n }\n\n <!-- Upload Progress -->\n @if (isUploading) {\n <div class=\"upload-progress\">\n <div class=\"progress-content\">\n <div class=\"progress-info\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n <span>Uploading {{ uploadingFileName }}...</span>\n </div>\n <div class=\"progress-bar-wrap\">\n <div class=\"progress-bar\" [style.width.%]=\"uploadProgress\"></div>\n </div>\n <span class=\"progress-percent\">{{ uploadProgress }}%</span>\n </div>\n </div>\n }\n </div>\n\n <!-- New Folder Modal -->\n @if (showNewFolderDialog) {\n <div class=\"modal-overlay\" (click)=\"onCancelNewFolder()\">\n <div class=\"modal-dialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"modal-header\">\n <h3>Create New Folder</h3>\n <button class=\"modal-close\" (click)=\"onCancelNewFolder()\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n <div class=\"modal-body\">\n <label>Folder name:</label>\n <input type=\"text\"\n [(ngModel)]=\"newFolderName\"\n [disabled]=\"isCreatingFolder\"\n placeholder=\"Enter folder name\"\n (keydown.enter)=\"onCreateFolder()\">\n </div>\n <div class=\"modal-footer\">\n <button (click)=\"onCancelNewFolder()\" [disabled]=\"isCreatingFolder\">Cancel</button>\n <button (click)=\"onCreateFolder()\" [disabled]=\"!newFolderName.trim() || isCreatingFolder\">\n @if (isCreatingFolder) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n }\n {{ isCreatingFolder ? 'Creating...' : 'Create' }}\n </button>\n </div>\n </div>\n </div>\n }\n\n <!-- Delete Confirmation Modal -->\n @if (showDeleteDialog && itemToDelete) {\n <div class=\"modal-overlay\" (click)=\"onCancelDelete()\">\n <div class=\"modal-dialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"modal-header\">\n <h3>Delete {{ itemToDelete.type === 'folder' ? 'Folder' : 'File' }}?</h3>\n <button class=\"modal-close\" (click)=\"onCancelDelete()\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n <div class=\"modal-body\">\n <p>Are you sure you want to delete <strong>{{ itemToDelete.name }}</strong>?</p>\n @if (itemToDelete.type === 'folder') {\n <p class=\"warning\">This will delete the folder and all its contents.</p>\n }\n </div>\n <div class=\"modal-footer\">\n <button (click)=\"onCancelDelete()\" [disabled]=\"isDeleting\">Cancel</button>\n <button (click)=\"onConfirmDelete()\" [disabled]=\"isDeleting\" class=\"danger\">\n @if (isDeleting) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n }\n {{ isDeleting ? 'Deleting...' : 'Delete' }}\n </button>\n </div>\n </div>\n </div>\n }\n\n <!-- Rename Modal -->\n @if (showRenameDialog && itemToRename) {\n <div class=\"modal-overlay\" (click)=\"onCancelRename()\">\n <div class=\"modal-dialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"modal-header\">\n <h3>Rename {{ itemToRename.type === 'folder' ? 'Folder' : 'File' }}</h3>\n <button class=\"modal-close\" (click)=\"onCancelRename()\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n <div class=\"modal-body\">\n <label>New name:</label>\n <input type=\"text\"\n [(ngModel)]=\"newItemName\"\n [disabled]=\"isRenaming\"\n placeholder=\"Enter new name\"\n (keydown.enter)=\"onConfirmRename()\">\n </div>\n <div class=\"modal-footer\">\n <button (click)=\"onCancelRename()\" [disabled]=\"isRenaming\">Cancel</button>\n <button (click)=\"onConfirmRename()\" [disabled]=\"isRenaming || !newItemName.trim()\">\n @if (isRenaming) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n }\n {{ isRenaming ? 'Renaming...' : 'Rename' }}\n </button>\n </div>\n </div>\n </div>\n }\n\n <!-- Copy Modal -->\n @if (showCopyDialog && itemToCopy) {\n <div class=\"modal-overlay\" (click)=\"onCancelCopy()\">\n <div class=\"modal-dialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"modal-header\">\n <h3>Copy {{ itemToCopy.type === 'folder' ? 'Folder' : 'File' }}</h3>\n <button class=\"modal-close\" (click)=\"onCancelCopy()\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n <div class=\"modal-body\">\n <p>Copying: <strong>{{ itemToCopy.name }}</strong></p>\n <label>Destination path:</label>\n <input type=\"text\"\n [(ngModel)]=\"copyDestinationPath\"\n [disabled]=\"isCopying\"\n placeholder=\"Enter destination path\"\n (keydown.enter)=\"onConfirmCopy()\">\n </div>\n <div class=\"modal-footer\">\n <button (click)=\"onCancelCopy()\" [disabled]=\"isCopying\">Cancel</button>\n <button (click)=\"onConfirmCopy()\" [disabled]=\"isCopying || !copyDestinationPath.trim()\">\n @if (isCopying) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n }\n {{ isCopying ? 'Copying...' : 'Copy' }}\n </button>\n </div>\n </div>\n </div>\n }\n\n <!-- Move Modal -->\n @if (showMoveDialog && itemToMove) {\n <div class=\"modal-overlay\" (click)=\"onCancelMove()\">\n <div class=\"modal-dialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"modal-header\">\n <h3>Move {{ itemToMove.type === 'folder' ? 'Folder' : 'File' }}</h3>\n <button class=\"modal-close\" (click)=\"onCancelMove()\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n <div class=\"modal-body\">\n <p>Moving: <strong>{{ itemToMove.name }}</strong></p>\n <label>Destination folder path:</label>\n <input type=\"text\"\n [(ngModel)]=\"moveDestinationPath\"\n [disabled]=\"isMoving\"\n placeholder=\"Enter destination folder (e.g., folder1/folder2/)\"\n (keydown.enter)=\"onConfirmMove()\">\n <p style=\"font-size: 11px; color: #666; margin-top: 8px;\">\n File will be moved to: {{ moveDestinationPath }}{{ itemToMove.name }}\n </p>\n </div>\n <div class=\"modal-footer\">\n <button (click)=\"onCancelMove()\" [disabled]=\"isMoving\">Cancel</button>\n <button (click)=\"onConfirmMove()\" [disabled]=\"isMoving || !moveDestinationPath.trim()\">\n @if (isMoving) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n }\n {{ isMoving ? 'Moving...' : 'Move' }}\n </button>\n </div>\n </div>\n </div>\n }\n\n <!-- Copy to Account Modal -->\n @if (showCopyToProviderDialog && itemToCopyToProvider) {\n <div class=\"modal-overlay\" (click)=\"onCancelCopyToAccount()\">\n <div class=\"modal-dialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"modal-header\">\n <h3>Copy to Another Account</h3>\n <button class=\"modal-close\" (click)=\"onCancelCopyToAccount()\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n <div class=\"modal-body\">\n <p>Copying: <strong>{{ itemToCopyToProvider.name }}</strong></p>\n <p style=\"font-size: 12px; color: #666; margin-bottom: 16px;\">\n From: <strong>{{ account?.account?.Name }}</strong>\n </p>\n <label>Select destination account(s):</label>\n <div class=\"account-checkbox-list\">\n @for (a of availableAccounts; track a) {\n <div class=\"account-checkbox-item\">\n <input type=\"checkbox\"\n [id]=\"'dest-account-' + a.account.ID\"\n [checked]=\"isDestinationAccountSelected(a.account.ID)\"\n [disabled]=\"isCopyingToAccount\"\n (change)=\"toggleDestinationAccount(a.account.ID)\">\n <label [for]=\"'dest-account-' + a.account.ID\">\n {{ a.account.Name }} <span class=\"provider-badge\">{{ a.provider.Name }}</span>\n </label>\n </div>\n }\n </div>\n <label style=\"margin-top: 16px;\">Destination filename:</label>\n <input type=\"text\"\n [(ngModel)]=\"copyToAccountDestinationPath\"\n [disabled]=\"isCopyingToAccount\"\n placeholder=\"Enter destination filename\"\n (keydown.enter)=\"onConfirmCopyToAccount()\">\n @if (copyToAccountProgress) {\n <div class=\"copy-progress\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n Copying to {{ copyToAccountProgress.currentAccount }} ({{ copyToAccountProgress.current }}/{{ copyToAccountProgress.total }})...\n </div>\n }\n </div>\n <div class=\"modal-footer\">\n <button (click)=\"onCancelCopyToAccount()\" [disabled]=\"isCopyingToAccount\">Cancel</button>\n <button (click)=\"onConfirmCopyToAccount()\"\n [disabled]=\"isCopyingToAccount || selectedDestinationAccounts.size === 0 || !copyToAccountDestinationPath.trim()\">\n @if (isCopyingToAccount) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n }\n {{ isCopyingToAccount ? 'Copying...' : 'Copy to ' + selectedDestinationAccounts.size + ' account' + (selectedDestinationAccounts.size !== 1 ? 's' : '') }}\n </button>\n </div>\n </div>\n </div>\n }\n"]}
1
+ {"version":3,"file":"file-grid.component.js","sourceRoot":"","sources":["../../../src/lib/file-browser/file-grid.component.ts","../../../src/lib/file-browser/file-grid.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, OnInit, OnChanges, SimpleChanges } from '@angular/core';\nimport { GraphQLDataProvider, GraphQLFileStorageClient } from '@memberjunction/graphql-dataprovider';\nimport { FileStorageEngine, StorageAccountWithProvider } from '@memberjunction/core-entities';\nimport { UUIDsEqual } from '@memberjunction/global';\n\n/**\n * Represents a file or folder item in the grid\n */\nexport interface FileGridItem {\n key: string;\n name: string;\n type: 'file' | 'folder';\n size: number;\n lastModified: Date;\n contentType?: string;\n etag?: string;\n}\n\n/**\n * Result from a single provider's search\n */\nexport interface FileSearchResultItem {\n path: string;\n name: string;\n size: number;\n contentType: string;\n lastModified: string;\n relevance?: number;\n excerpt?: string;\n matchInFilename?: boolean;\n objectId?: string;\n}\n\n/**\n * Search results from a single account\n */\nexport interface AccountSearchResult {\n accountID: string;\n accountName: string;\n success: boolean;\n errorMessage?: string;\n results: FileSearchResultItem[];\n totalMatches?: number;\n hasMore: boolean;\n nextPageToken?: string;\n}\n\n/**\n * Aggregated search results from multiple accounts\n */\nexport interface MultiProviderSearchResult {\n accountResults: AccountSearchResult[];\n totalResultsReturned: number;\n successfulAccounts: number;\n failedAccounts: number;\n}\n\n/**\n * Displays files and folders in a grid/list view.\n * Shows file metadata like name, size, type, and last modified date.\n * Supports file selection and navigation to folders.\n */\n@Component({\n standalone: false,\n selector: 'mj-file-grid',\n templateUrl: './file-grid.component.html',\n styleUrls: ['./file-grid.component.css']\n})\nexport class FileGridComponent implements OnInit, OnChanges {\n /**\n * The storage account to list files from (includes provider details)\n */\n @Input() account: StorageAccountWithProvider | null = null;\n\n /**\n * The current folder path to display\n */\n @Input() folderPath: string = '';\n\n /**\n * Emits when a folder is double-clicked for navigation\n */\n @Output() folderNavigate = new EventEmitter<string>();\n\n /**\n * Emits when the folder structure has changed (e.g., new folder created)\n * This signals that the folder tree should refresh\n */\n @Output() folderStructureChanged = new EventEmitter<void>();\n\n /**\n * List of files and folders in the current directory\n */\n public items: FileGridItem[] = [];\n\n /**\n * Currently selected item keys in the grid (Kendo stores keys, not full objects)\n */\n public selectedItems: string[] = [];\n\n /**\n * Loading state indicator\n */\n public isLoading: boolean = false;\n\n /**\n * Error message if loading fails\n */\n public errorMessage: string | null = null;\n\n /**\n * View mode: 'grid' or 'list'\n */\n public viewMode: 'grid' | 'list' = 'list';\n\n /**\n * Sort configuration for the grid\n */\n public sort: Array<{ field: string; dir?: 'asc' | 'desc' }> = [\n { field: 'name', dir: 'asc' }\n ];\n\n /**\n * Search query for filtering files/folders\n */\n public searchQuery: string = '';\n\n /**\n * File type filter ('all', 'files', 'folders')\n */\n public fileTypeFilter: 'all' | 'files' | 'folders' = 'all';\n\n /**\n * Filtered list of items based on search and filter criteria\n */\n public filteredItems: FileGridItem[] = [];\n\n /**\n * Drag-and-drop state\n */\n public isDragging: boolean = false;\n\n /**\n * Upload progress state\n */\n public isUploading: boolean = false;\n public uploadProgress: number = 0;\n public uploadingFileName: string = '';\n\n /**\n * New folder dialog state\n */\n public showNewFolderDialog: boolean = false;\n public newFolderName: string = '';\n public isCreatingFolder: boolean = false;\n\n /**\n * Delete confirmation dialog state\n */\n public showDeleteDialog: boolean = false;\n public itemToDelete: FileGridItem | null = null;\n public isDeleting: boolean = false;\n\n /**\n * Rename dialog state\n */\n public showRenameDialog: boolean = false;\n public itemToRename: FileGridItem | null = null;\n public newItemName: string = '';\n public isRenaming: boolean = false;\n\n /**\n * Copy dialog state\n */\n public showCopyDialog: boolean = false;\n public itemToCopy: FileGridItem | null = null;\n public copyDestinationPath: string = '';\n public isCopying: boolean = false;\n\n /**\n * Move dialog state\n */\n public showMoveDialog: boolean = false;\n public itemToMove: FileGridItem | null = null;\n public moveDestinationPath: string = '';\n public isMoving: boolean = false;\n\n /**\n * Copy to provider dialog state\n */\n public showCopyToProviderDialog: boolean = false;\n public itemToCopyToProvider: FileGridItem | null = null;\n public availableAccounts: StorageAccountWithProvider[] = [];\n public selectedDestinationAccounts: Set<string> = new Set();\n public copyToAccountDestinationPath: string = '';\n public isCopyingToAccount: boolean = false;\n public copyToAccountProgress: { current: number; total: number; currentAccount: string } | null = null;\n\n /**\n * Multi-provider search state\n */\n public isMultiProviderSearchMode: boolean = false;\n public multiProviderSearchQuery: string = '';\n public selectedSearchProviders: Set<string> = new Set();\n public isSearching: boolean = false;\n public multiProviderSearchResults: MultiProviderSearchResult | null = null;\n\n /**\n * GraphQL client for file storage operations\n */\n private storageClient: GraphQLFileStorageClient;\n\n constructor() {\n this.storageClient = new GraphQLFileStorageClient(GraphQLDataProvider.Instance);\n }\n\n ngOnInit(): void {\n // Don't load items here - wait for ngOnChanges when inputs are set\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n // Reload items when provider or folder path changes\n if (changes['account'] || changes['folderPath']) {\n this.loadItems();\n }\n }\n\n /**\n * Loads files and folders from the current path\n */\n private async loadItems(): Promise<void> {\n if (!this.account) {\n this.items = [];\n return;\n }\n\n const previousItemCount = this.items.length;\n const previousItemNames = this.items.map(i => i.name);\n\n this.isLoading = true;\n this.errorMessage = null;\n\n try {\n console.log('[FileGrid] Loading items for account:', this.account.account.ID, 'path:', this.folderPath);\n console.log('[FileGrid] Previous items:', { count: previousItemCount, names: previousItemNames });\n\n const listResult = await this.storageClient.ListObjects(\n this.account.account.ID,\n this.folderPath || '',\n '/'\n );\n\n console.log('[FileGrid] ListObjects result:', listResult);\n\n this.items = [];\n\n // Add folders from prefixes first (so they appear before files)\n if (listResult.prefixes) {\n for (const prefix of listResult.prefixes) {\n // Extract the folder name from the prefix path\n // Prefix comes as \"path/to/folder/\" so we need to get just \"folder\"\n const folderName = prefix.endsWith('/')\n ? prefix.slice(0, -1).split('/').pop()\n : prefix.split('/').pop();\n\n if (folderName) {\n this.items.push({\n key: prefix,\n name: folderName,\n type: 'folder',\n size: 0,\n lastModified: new Date(),\n contentType: 'application/x-directory'\n });\n }\n }\n }\n\n // Add files from objects\n if (listResult.objects) {\n for (const obj of listResult.objects) {\n // Skip directories from objects - we already added them from prefixes\n if (obj.isDirectory) {\n continue;\n }\n\n this.items.push({\n key: obj.fullPath,\n name: obj.name,\n type: 'file',\n size: obj.size,\n lastModified: obj.lastModified,\n contentType: obj.contentType,\n etag: obj.etag\n });\n }\n }\n\n } catch (error) {\n this.errorMessage = 'Failed to load files';\n console.error('[FileGrid] Error loading files:', error);\n } finally {\n this.isLoading = false;\n }\n\n // Apply filters after loading\n this.applyFilters();\n }\n\n /**\n * Applies search and filter criteria to the items list\n */\n private applyFilters(): void {\n let filtered = [...this.items];\n\n // Apply file type filter\n if (this.fileTypeFilter === 'files') {\n filtered = filtered.filter(item => item.type === 'file');\n } else if (this.fileTypeFilter === 'folders') {\n filtered = filtered.filter(item => item.type === 'folder');\n }\n\n // Apply search query\n if (this.searchQuery.trim()) {\n const query = this.searchQuery.toLowerCase();\n filtered = filtered.filter(item =>\n item.name.toLowerCase().includes(query)\n );\n }\n\n this.filteredItems = filtered;\n }\n\n /**\n * Handles search query changes\n */\n public onSearchChange(query: string): void {\n this.searchQuery = query;\n this.applyFilters();\n }\n\n /**\n * Clears the search query\n */\n public clearSearch(): void {\n this.searchQuery = '';\n this.applyFilters();\n }\n\n /**\n * Handles file type filter changes\n */\n public onFileTypeFilterChange(filterType: 'all' | 'files' | 'folders'): void {\n this.fileTypeFilter = filterType;\n this.applyFilters();\n }\n\n /**\n * Formats a file size in bytes to a human-readable string\n */\n public formatFileSize(bytes: number): string {\n if (bytes === 0) return '0 B';\n\n const k = 1024;\n const sizes = ['B', 'KB', 'MB', 'GB', 'TB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n return Math.round((bytes / Math.pow(k, i)) * 100) / 100 + ' ' + sizes[i];\n }\n\n /**\n * Formats a date to a readable string\n */\n public formatDate(date: Date): string {\n return date.toLocaleString();\n }\n\n /**\n * Gets the icon class for a file or folder\n */\n public getItemIcon(item: FileGridItem): string {\n if (!item || !item.name) {\n return 'fa-solid fa-file';\n }\n\n if (item.type === 'folder') {\n return 'fa-solid fa-folder';\n }\n\n // Determine file icon based on content type or extension\n const extension = item.name.split('.').pop()?.toLowerCase() || '';\n\n if (['jpg', 'jpeg', 'png', 'gif', 'bmp', 'svg'].includes(extension)) {\n return 'fa-solid fa-file-image';\n } else if (['pdf'].includes(extension)) {\n return 'fa-solid fa-file-pdf';\n } else if (['doc', 'docx'].includes(extension)) {\n return 'fa-solid fa-file-word';\n } else if (['xls', 'xlsx'].includes(extension)) {\n return 'fa-solid fa-file-excel';\n } else if (['ppt', 'pptx'].includes(extension)) {\n return 'fa-solid fa-file-powerpoint';\n } else if (['zip', 'rar', '7z', 'tar', 'gz'].includes(extension)) {\n return 'fa-solid fa-file-zipper';\n } else if (['mp4', 'avi', 'mov', 'wmv'].includes(extension)) {\n return 'fa-solid fa-file-video';\n } else if (['mp3', 'wav', 'ogg', 'flac'].includes(extension)) {\n return 'fa-solid fa-file-audio';\n } else if (['txt', 'log'].includes(extension)) {\n return 'fa-solid fa-file-lines';\n } else if (['js', 'ts', 'html', 'css', 'json', 'xml', 'py', 'java', 'cpp'].includes(extension)) {\n return 'fa-solid fa-file-code';\n } else {\n return 'fa-solid fa-file';\n }\n }\n\n /**\n * Handles item selection change (not used - Kendo handles selection internally)\n */\n public onSelectionChange(selectedKeys: string[]): void {\n this.selectedItems = selectedKeys;\n }\n\n /**\n * Handles tile click in grid view for selection\n */\n public onTileClick(item: FileGridItem, event: MouseEvent): void {\n if (event.ctrlKey || event.metaKey) {\n // Multi-select: toggle item key\n const index = this.selectedItems.indexOf(item.key);\n if (index >= 0) {\n this.selectedItems.splice(index, 1);\n } else {\n this.selectedItems.push(item.key);\n }\n } else if (event.shiftKey && this.selectedItems.length > 0) {\n // Range select: select from last selected to current\n const lastSelectedKey = this.selectedItems[this.selectedItems.length - 1];\n const lastSelected = this.items.find(i => i.key === lastSelectedKey);\n if (lastSelected) {\n const lastIndex = this.items.indexOf(lastSelected);\n const currentIndex = this.items.indexOf(item);\n const start = Math.min(lastIndex, currentIndex);\n const end = Math.max(lastIndex, currentIndex);\n this.selectedItems = this.items.slice(start, end + 1).map(i => i.key);\n }\n } else {\n // Single select: replace selection\n this.selectedItems = [item.key];\n }\n }\n\n /**\n * Handles double-click on an item\n * For folders, navigate into them. For files, open/download them.\n */\n public onItemDoubleClick(item: FileGridItem): void {\n if (item.type === 'folder') {\n // Navigate into folder by emitting the folder path\n console.log('[FileGrid] Navigating to folder:', item.key);\n this.folderNavigate.emit(item.key);\n } else {\n // Download file\n this.downloadFile(item);\n }\n }\n\n /**\n * Downloads a file by creating a pre-authenticated download URL\n */\n private async downloadFile(item: FileGridItem): Promise<void> {\n if (!this.account) {\n return;\n }\n\n try {\n console.log('[FileGrid] Downloading file:', item.key);\n\n const downloadUrl = await this.storageClient.CreatePreAuthDownloadUrl(\n this.account.account.ID,\n item.key\n );\n\n console.log('[FileGrid] Download URL created:', downloadUrl ? 'success' : 'failed');\n\n if (downloadUrl) {\n // Trigger browser download\n const link = document.createElement('a');\n link.href = downloadUrl;\n link.download = item.name;\n link.target = '_blank'; // Open in new tab as fallback\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n\n console.log('[FileGrid] File download initiated:', item.name);\n } else {\n console.error('[FileGrid] Failed to get download URL');\n this.errorMessage = 'Failed to generate download URL';\n }\n } catch (error) {\n console.error('[FileGrid] Error downloading file:', error);\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n this.errorMessage = `Failed to download file: ${errorMessage}`;\n\n // Clear error after 5 seconds\n setTimeout(() => {\n if (this.errorMessage?.startsWith('Failed to download')) {\n this.errorMessage = null;\n }\n }, 5000);\n }\n }\n\n /**\n * Toggles between grid and list view\n */\n public toggleViewMode(): void {\n this.viewMode = this.viewMode === 'grid' ? 'list' : 'grid';\n }\n\n /**\n * Refreshes the current directory\n */\n public refresh(): void {\n this.loadItems();\n }\n\n /**\n * Navigates up to the parent directory\n */\n public navigateUp(): void {\n if (!this.folderPath) {\n // Already at root\n return;\n }\n\n // Remove trailing slash if present\n const cleanPath = this.folderPath.endsWith('/')\n ? this.folderPath.slice(0, -1)\n : this.folderPath;\n\n // Get parent path by removing last segment\n const segments = cleanPath.split('/').filter(s => s.length > 0);\n segments.pop(); // Remove last segment\n\n const parentPath = segments.length > 0 ? segments.join('/') + '/' : '';\n\n // Emit navigation event to update the folder tree and path\n this.folderNavigate.emit(parentPath);\n }\n\n /**\n * Checks if we can navigate up (not at root)\n */\n public canNavigateUp(): boolean {\n return this.folderPath !== '' && this.folderPath !== '/';\n }\n\n /**\n * Handles sort change event from the grid\n */\n public onSortChange(sort: Array<{ field: string; dir?: 'asc' | 'desc' }>): void {\n this.sort = sort;\n }\n\n /**\n * Gets a human-readable file type based on extension\n */\n public getFileType(item: FileGridItem): string {\n if (item.type === 'folder') {\n return 'Folder';\n }\n\n const extension = item.name.split('.').pop()?.toLowerCase() || '';\n\n const typeMap: Record<string, string> = {\n // Documents\n pdf: 'PDF Document',\n doc: 'Word Document',\n docx: 'Word Document',\n xls: 'Excel Spreadsheet',\n xlsx: 'Excel Spreadsheet',\n ppt: 'PowerPoint',\n pptx: 'PowerPoint',\n txt: 'Text File',\n\n // Images\n jpg: 'JPEG Image',\n jpeg: 'JPEG Image',\n png: 'PNG Image',\n gif: 'GIF Image',\n bmp: 'Bitmap Image',\n svg: 'SVG Image',\n\n // Archives\n zip: 'ZIP Archive',\n rar: 'RAR Archive',\n '7z': '7-Zip Archive',\n tar: 'TAR Archive',\n gz: 'GZIP Archive',\n\n // Media\n mp4: 'MP4 Video',\n avi: 'AVI Video',\n mov: 'QuickTime Video',\n mp3: 'MP3 Audio',\n wav: 'WAV Audio',\n\n // Code\n js: 'JavaScript',\n ts: 'TypeScript',\n html: 'HTML',\n css: 'CSS',\n json: 'JSON',\n xml: 'XML',\n py: 'Python',\n java: 'Java',\n cpp: 'C++'\n };\n\n return typeMap[extension] || `${extension.toUpperCase()} File`;\n }\n\n /**\n * Handles upload button click - triggers file input\n */\n public onUploadClick(): void {\n const fileInput = document.createElement('input');\n fileInput.type = 'file';\n fileInput.multiple = true;\n fileInput.onchange = (event: Event) => {\n const target = event.target as HTMLInputElement;\n if (target.files && target.files.length > 0) {\n this.uploadFiles(Array.from(target.files));\n }\n };\n fileInput.click();\n }\n\n /**\n * Handles drag enter event\n */\n public onDragEnter(event: DragEvent): void {\n event.preventDefault();\n event.stopPropagation();\n this.isDragging = true;\n }\n\n /**\n * Handles drag over event\n */\n public onDragOver(event: DragEvent): void {\n event.preventDefault();\n event.stopPropagation();\n }\n\n /**\n * Handles drag leave event\n */\n public onDragLeave(event: DragEvent): void {\n event.preventDefault();\n event.stopPropagation();\n\n // Only hide if leaving the container itself, not child elements\n if (event.currentTarget === event.target) {\n this.isDragging = false;\n }\n }\n\n /**\n * Handles drop event\n */\n public onDrop(event: DragEvent): void {\n event.preventDefault();\n event.stopPropagation();\n this.isDragging = false;\n\n const files = event.dataTransfer?.files;\n if (files && files.length > 0) {\n this.uploadFiles(Array.from(files));\n }\n }\n\n /**\n * Uploads multiple files to the current folder\n */\n private async uploadFiles(files: File[]): Promise<void> {\n if (!this.account) {\n return;\n }\n\n console.log('[FileGrid] Uploading files:', files.map(f => f.name));\n\n for (let i = 0; i < files.length; i++) {\n const file = files[i];\n await this.uploadSingleFile(file, i + 1, files.length);\n }\n\n // Refresh the file list after all uploads complete\n this.loadItems();\n }\n\n /**\n * Uploads a single file\n */\n private async uploadSingleFile(file: File, current: number, total: number): Promise<void> {\n if (!this.account) {\n return;\n }\n\n this.isUploading = true;\n this.uploadingFileName = `${file.name} (${current}/${total})`;\n this.uploadProgress = 0;\n\n try {\n // Construct the full object name with folder path\n // Remove trailing slash from folderPath to avoid double slashes\n let objectName: string;\n if (this.folderPath) {\n const cleanPath = this.folderPath.endsWith('/')\n ? this.folderPath.slice(0, -1)\n : this.folderPath;\n objectName = `${cleanPath}/${file.name}`;\n } else {\n objectName = file.name;\n }\n\n console.log('[FileGrid] Getting upload URL for:', objectName);\n\n // Get pre-authenticated upload URL\n const uploadData = await this.storageClient.CreatePreAuthUploadUrl(\n this.account.account.ID,\n objectName,\n file.type || 'application/octet-stream'\n );\n\n console.log('[FileGrid] Got upload URL:', uploadData.uploadUrl);\n\n // Upload the file using XMLHttpRequest to track progress\n await this.uploadFileToUrl(file, uploadData.uploadUrl);\n\n console.log('[FileGrid] File uploaded successfully:', file.name);\n\n } catch (error) {\n console.error('[FileGrid] Error uploading file:', error);\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n\n // Check if this is an unsupported operation error (e.g., Google Drive doesn't support pre-auth uploads)\n if (errorMessage.includes('not supported')) {\n this.errorMessage = `Upload not supported for ${this.account?.account.Name || 'this account'}. Try using a different storage account.`;\n } else {\n this.errorMessage = `Failed to upload ${file.name}: ${errorMessage}`;\n }\n\n // Clear error after 5 seconds\n setTimeout(() => {\n if (this.errorMessage?.startsWith('Failed to upload') || this.errorMessage?.startsWith('Upload not supported')) {\n this.errorMessage = null;\n }\n }, 5000);\n } finally {\n this.isUploading = false;\n this.uploadProgress = 0;\n this.uploadingFileName = '';\n }\n }\n\n /**\n * Uploads file to the pre-authenticated URL with progress tracking\n */\n private uploadFileToUrl(file: File, url: string): Promise<void> {\n return new Promise((resolve, reject) => {\n const xhr = new XMLHttpRequest();\n\n xhr.upload.addEventListener('progress', (event) => {\n if (event.lengthComputable) {\n this.uploadProgress = Math.round((event.loaded / event.total) * 100);\n }\n });\n\n xhr.addEventListener('load', () => {\n if (xhr.status >= 200 && xhr.status < 300) {\n resolve();\n } else {\n reject(new Error(`Upload failed with status ${xhr.status}`));\n }\n });\n\n xhr.addEventListener('error', () => {\n reject(new Error('Network error during upload'));\n });\n\n xhr.addEventListener('abort', () => {\n reject(new Error('Upload cancelled'));\n });\n\n // Use POST for Dropbox temporary upload links (required by Dropbox API)\n // Use PUT for other providers like S3\n // Dropbox requires POST with application/octet-stream\n xhr.open('POST', url, true);\n xhr.setRequestHeader('Content-Type', 'application/octet-stream');\n xhr.send(file);\n });\n }\n\n /**\n * Opens the new folder dialog\n */\n public onNewFolderClick(): void {\n this.newFolderName = '';\n this.showNewFolderDialog = true;\n }\n\n /**\n * Closes the new folder dialog\n */\n public onCancelNewFolder(): void {\n this.showNewFolderDialog = false;\n this.newFolderName = '';\n }\n\n /**\n * Creates a new folder in the current directory\n */\n public async onCreateFolder(): Promise<void> {\n if (!this.account || !this.newFolderName.trim()) {\n return;\n }\n\n this.isCreatingFolder = true;\n\n try {\n // Construct the full folder path\n // Remove trailing slash from folderPath to avoid double slashes\n let folderPath: string;\n if (this.folderPath) {\n const cleanPath = this.folderPath.endsWith('/')\n ? this.folderPath.slice(0, -1)\n : this.folderPath;\n folderPath = `${cleanPath}/${this.newFolderName.trim()}`;\n } else {\n folderPath = this.newFolderName.trim();\n }\n\n console.log('[FileGrid] Creating folder:', folderPath);\n\n const success = await this.storageClient.CreateDirectory(\n this.account.account.ID,\n folderPath\n );\n\n if (success) {\n console.log('[FileGrid] Folder created successfully:', folderPath);\n\n // Close dialog and refresh\n this.showNewFolderDialog = false;\n this.newFolderName = '';\n\n // Notify parent that folder structure changed\n this.folderStructureChanged.emit();\n\n // Refresh the file grid\n this.loadItems();\n } else {\n this.errorMessage = 'Failed to create folder';\n }\n } catch (error) {\n console.error('[FileGrid] Error creating folder:', error);\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n this.errorMessage = `Failed to create folder: ${errorMessage}`;\n\n // Clear error after 5 seconds\n setTimeout(() => {\n if (this.errorMessage?.startsWith('Failed to create')) {\n this.errorMessage = null;\n }\n }, 5000);\n } finally {\n this.isCreatingFolder = false;\n }\n }\n\n /**\n * Opens the delete confirmation dialog for the selected items\n */\n public onDeleteClick(): void {\n if (this.selectedItems.length === 0) {\n return;\n }\n\n // selectedItems contains keys (strings), not full objects\n // Find the actual item object from the items array\n const selectedKey = this.selectedItems[0];\n const item = this.items.find(i => i.key === selectedKey);\n\n if (!item) {\n console.error('[FileGrid] Could not find selected item with key:', selectedKey);\n return;\n }\n\n this.itemToDelete = item;\n this.showDeleteDialog = true;\n }\n\n /**\n * Closes the delete confirmation dialog\n */\n public onCancelDelete(): void {\n this.showDeleteDialog = false;\n this.itemToDelete = null;\n }\n\n /**\n * Deletes the selected item after confirmation\n */\n public async onConfirmDelete(): Promise<void> {\n if (!this.account || !this.itemToDelete) {\n return;\n }\n\n this.isDeleting = true;\n\n try {\n // Construct the full path to the item\n const itemPath = this.constructItemPath(this.itemToDelete);\n\n console.log('[FileGrid] Deleting item:', itemPath);\n\n const success = await this.storageClient.DeleteObject(\n this.account.account.ID,\n itemPath\n );\n\n console.log('[FileGrid] Delete result:', { success });\n\n if (success) {\n console.log('[FileGrid] Item deleted successfully:', itemPath);\n\n // Check if we deleted a folder (before clearing itemToDelete)\n const wasFolder = this.itemToDelete.type === 'folder';\n\n console.log('[FileGrid] Item details:', {\n type: this.itemToDelete.type,\n name: this.itemToDelete.name,\n key: this.itemToDelete.key,\n wasFolder\n });\n\n // Close dialog\n this.showDeleteDialog = false;\n this.itemToDelete = null;\n\n // Clear selection\n this.selectedItems = [];\n\n // If we deleted a folder, notify parent that folder structure changed\n if (wasFolder) {\n console.log('[FileGrid] Emitting folderStructureChanged event');\n this.folderStructureChanged.emit();\n }\n\n // Refresh the file grid\n console.log('[FileGrid] Calling loadItems() to refresh grid');\n this.loadItems();\n } else {\n console.error('[FileGrid] Delete operation returned false');\n this.errorMessage = `Failed to delete ${this.itemToDelete.type}`;\n }\n } catch (error) {\n console.error('[FileGrid] Error deleting item:', error);\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n this.errorMessage = `Failed to delete: ${errorMessage}`;\n\n // Clear error after 5 seconds\n setTimeout(() => {\n if (this.errorMessage?.startsWith('Failed to delete')) {\n this.errorMessage = null;\n }\n }, 5000);\n } finally {\n this.isDeleting = false;\n }\n }\n\n /**\n * Opens the rename dialog for the selected item\n */\n public onRenameClick(): void {\n if (this.selectedItems.length !== 1) {\n return;\n }\n\n // selectedItems contains keys (strings), not full objects\n // Find the actual item object from the items array\n const selectedKey = this.selectedItems[0];\n const item = this.items.find(i => i.key === selectedKey);\n\n if (!item) {\n console.error('[FileGrid] Could not find selected item with key:', selectedKey);\n return;\n }\n\n this.itemToRename = item;\n this.newItemName = item.name;\n this.showRenameDialog = true;\n }\n\n /**\n * Closes the rename dialog\n */\n public onCancelRename(): void {\n this.showRenameDialog = false;\n this.itemToRename = null;\n this.newItemName = '';\n }\n\n /**\n * Renames the selected item after confirmation\n */\n public async onConfirmRename(): Promise<void> {\n if (!this.account || !this.itemToRename || !this.newItemName.trim()) {\n return;\n }\n\n // Check if name actually changed\n if (this.newItemName.trim() === this.itemToRename.name) {\n this.onCancelRename();\n return;\n }\n\n this.isRenaming = true;\n\n try {\n // Construct the old and new paths\n const oldPath = this.constructItemPath(this.itemToRename);\n\n // Build the new path by replacing the old name with the new name\n const pathParts = oldPath.split('/');\n pathParts[pathParts.length - 1] = this.newItemName.trim();\n const newPath = pathParts.join('/');\n\n console.log('[FileGrid] Renaming item:', { oldPath, newPath });\n\n const success = await this.storageClient.MoveObject(\n this.account.account.ID,\n oldPath,\n newPath\n );\n\n console.log('[FileGrid] Rename result:', { success });\n\n if (success) {\n console.log('[FileGrid] Item renamed successfully:', { oldPath, newPath });\n\n // Check if we renamed a folder (before clearing itemToRename)\n const wasFolder = this.itemToRename.type === 'folder';\n\n // Close dialog\n this.showRenameDialog = false;\n this.itemToRename = null;\n this.newItemName = '';\n\n // Clear selection\n this.selectedItems = [];\n\n // If we renamed a folder, notify parent that folder structure changed\n if (wasFolder) {\n console.log('[FileGrid] Emitting folderStructureChanged event');\n this.folderStructureChanged.emit();\n }\n\n // Refresh the file grid\n console.log('[FileGrid] Calling loadItems() to refresh grid');\n this.loadItems();\n } else {\n console.error('[FileGrid] Rename operation returned false');\n this.errorMessage = `Failed to rename ${this.itemToRename.type}`;\n }\n } catch (error) {\n console.error('[FileGrid] Error renaming item:', error);\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n this.errorMessage = `Failed to rename: ${errorMessage}`;\n\n // Clear error after 5 seconds\n setTimeout(() => {\n if (this.errorMessage?.startsWith('Failed to rename')) {\n this.errorMessage = null;\n }\n }, 5000);\n } finally {\n this.isRenaming = false;\n }\n }\n\n /**\n * Downloads the selected file\n */\n public async onDownloadClick(): Promise<void> {\n if (this.selectedItems.length !== 1) {\n return;\n }\n\n // Find the selected item\n const selectedKey = this.selectedItems[0];\n const item = this.items.find(i => i.key === selectedKey);\n\n if (!item) {\n console.error('[FileGrid] Could not find selected item with key:', selectedKey);\n return;\n }\n\n // Can only download files, not folders\n if (item.type === 'folder') {\n this.errorMessage = 'Cannot download folders. Please select a file.';\n setTimeout(() => {\n if (this.errorMessage?.includes('Cannot download folders')) {\n this.errorMessage = null;\n }\n }, 3000);\n return;\n }\n\n if (!this.account) {\n return;\n }\n\n try {\n const itemPath = this.constructItemPath(item);\n\n console.log('[FileGrid] Creating download URL for:', itemPath);\n\n const downloadUrl = await this.storageClient.CreatePreAuthDownloadUrl(\n this.account.account.ID,\n itemPath\n );\n\n if (downloadUrl) {\n console.log('[FileGrid] Download URL created, initiating download');\n\n // Create a temporary anchor element to trigger download\n const link = document.createElement('a');\n link.href = downloadUrl;\n link.download = item.name;\n link.style.display = 'none';\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n } else {\n this.errorMessage = 'Failed to create download URL';\n }\n } catch (error) {\n console.error('[FileGrid] Error downloading file:', error);\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n this.errorMessage = `Failed to download: ${errorMessage}`;\n\n // Clear error after 5 seconds\n setTimeout(() => {\n if (this.errorMessage?.startsWith('Failed to download')) {\n this.errorMessage = null;\n }\n }, 5000);\n }\n }\n\n /**\n * Opens the copy dialog for the selected item\n */\n public onCopyClick(): void {\n if (this.selectedItems.length !== 1) {\n return;\n }\n\n const selectedKey = this.selectedItems[0];\n const item = this.items.find(i => i.key === selectedKey);\n\n if (!item) {\n console.error('[FileGrid] Could not find selected item with key:', selectedKey);\n return;\n }\n\n this.itemToCopy = item;\n this.copyDestinationPath = this.folderPath + item.name + '-copy';\n this.showCopyDialog = true;\n }\n\n /**\n * Cancels the copy operation\n */\n public onCancelCopy(): void {\n this.showCopyDialog = false;\n this.itemToCopy = null;\n this.copyDestinationPath = '';\n }\n\n /**\n * Confirms and executes the copy operation\n */\n public async onConfirmCopy(): Promise<void> {\n if (!this.account || !this.itemToCopy || !this.copyDestinationPath.trim()) {\n return;\n }\n\n this.isCopying = true;\n\n try {\n const sourcePath = this.constructItemPath(this.itemToCopy);\n\n const success = await this.storageClient.CopyObject(\n this.account.account.ID,\n sourcePath,\n this.copyDestinationPath.trim()\n );\n\n if (success) {\n // Close dialog\n this.showCopyDialog = false;\n this.itemToCopy = null;\n this.copyDestinationPath = '';\n\n // Clear selection\n this.selectedItems = [];\n\n // Refresh the file grid\n this.loadItems();\n } else {\n this.errorMessage = 'Failed to copy item';\n }\n } catch (error) {\n console.error('[FileGrid] Error copying item:', error);\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n this.errorMessage = `Failed to copy: ${errorMessage}`;\n\n setTimeout(() => {\n if (this.errorMessage?.startsWith('Failed to copy')) {\n this.errorMessage = null;\n }\n }, 5000);\n } finally {\n this.isCopying = false;\n }\n }\n\n /**\n * Opens the move dialog for the selected item\n */\n public onMoveClick(): void {\n if (this.selectedItems.length !== 1) {\n return;\n }\n\n const selectedKey = this.selectedItems[0];\n const item = this.items.find(i => i.key === selectedKey);\n\n if (!item) {\n console.error('[FileGrid] Could not find selected item with key:', selectedKey);\n return;\n }\n\n this.itemToMove = item;\n // Suggest a different folder path\n this.moveDestinationPath = this.folderPath;\n this.showMoveDialog = true;\n }\n\n /**\n * Cancels the move operation\n */\n public onCancelMove(): void {\n this.showMoveDialog = false;\n this.itemToMove = null;\n this.moveDestinationPath = '';\n }\n\n /**\n * Confirms and executes the move operation\n */\n public async onConfirmMove(): Promise<void> {\n if (!this.account || !this.itemToMove || !this.moveDestinationPath.trim()) {\n return;\n }\n\n this.isMoving = true;\n\n try {\n const sourcePath = this.constructItemPath(this.itemToMove);\n const destPath = this.moveDestinationPath.trim().endsWith('/')\n ? this.moveDestinationPath.trim() + this.itemToMove.name\n : this.moveDestinationPath.trim();\n\n const success = await this.storageClient.MoveObject(\n this.account.account.ID,\n sourcePath,\n destPath\n );\n\n if (success) {\n const wasFolder = this.itemToMove.type === 'folder';\n\n // Close dialog\n this.showMoveDialog = false;\n this.itemToMove = null;\n this.moveDestinationPath = '';\n\n // Clear selection\n this.selectedItems = [];\n\n // If we moved a folder, notify parent that folder structure changed\n if (wasFolder) {\n this.folderStructureChanged.emit();\n }\n\n // Refresh the file grid\n this.loadItems();\n } else {\n this.errorMessage = 'Failed to move item';\n }\n } catch (error) {\n console.error('[FileGrid] Error moving item:', error);\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n this.errorMessage = `Failed to move: ${errorMessage}`;\n\n setTimeout(() => {\n if (this.errorMessage?.startsWith('Failed to move')) {\n this.errorMessage = null;\n }\n }, 5000);\n } finally {\n this.isMoving = false;\n }\n }\n\n /**\n * Constructs the full path for an item\n */\n private constructItemPath(item: FileGridItem): string {\n // Validate that we have either key or name\n if (!item.key && !item.name) {\n console.error('[FileGrid] Cannot construct path - item has no key or name:', item);\n throw new Error('Cannot construct path for item without key or name');\n }\n\n // If item.key exists and is at root level, use it directly\n if (!this.folderPath || this.folderPath === '/') {\n return item.key || item.name;\n }\n\n // If the item key already includes the folder path, use it as is\n if (item.key && item.key.startsWith(this.folderPath)) {\n return item.key;\n }\n\n // Otherwise, combine folder path with item name\n const normalizedFolderPath = this.folderPath.endsWith('/')\n ? this.folderPath.slice(0, -1)\n : this.folderPath;\n\n // Make sure we have a name to use\n const itemName = item.name || item.key;\n if (!itemName) {\n console.error('[FileGrid] Cannot construct path - item has no usable name:', item);\n throw new Error('Cannot construct path for item without name');\n }\n\n return `${normalizedFolderPath}/${itemName}`;\n }\n\n /**\n * Gets the currently selected item (if exactly one is selected)\n */\n public getSelectedItem(): FileGridItem | null {\n if (this.selectedItems.length !== 1) {\n return null;\n }\n return this.items.find(item => item.key === this.selectedItems[0]) || null;\n }\n\n /**\n * Opens the copy to account dialog\n */\n public async onCopyToAccountClick(): Promise<void> {\n const item = this.getSelectedItem();\n if (!item || item.type === 'folder') {\n return;\n }\n\n try {\n const engine = FileStorageEngine.Instance;\n await engine.Config(false); // Use cached data if available\n\n // Build available accounts (excluding current account)\n this.availableAccounts = engine.AccountsWithProviders\n .filter(a => !UUIDsEqual(a.account.ID, this.account?.account.ID));\n\n if (this.availableAccounts.length === 0) {\n this.errorMessage = 'No other storage accounts available';\n setTimeout(() => {\n if (this.errorMessage?.includes('No other storage accounts')) {\n this.errorMessage = null;\n }\n }, 3000);\n return;\n }\n\n this.itemToCopyToProvider = item;\n this.copyToAccountDestinationPath = item.name; // Default to same filename\n this.selectedDestinationAccounts.clear();\n this.copyToAccountProgress = null;\n this.showCopyToProviderDialog = true;\n\n } catch (error) {\n console.error('[FileGrid] Error loading accounts:', error);\n this.errorMessage = 'Failed to load storage accounts';\n }\n }\n\n /**\n * Cancels the copy to account dialog\n */\n public onCancelCopyToAccount(): void {\n this.showCopyToProviderDialog = false;\n this.itemToCopyToProvider = null;\n this.selectedDestinationAccounts.clear();\n this.copyToAccountDestinationPath = '';\n this.copyToAccountProgress = null;\n }\n\n /**\n * Toggles selection of a destination account for copying\n */\n public toggleDestinationAccount(accountId: string): void {\n if (this.selectedDestinationAccounts.has(accountId)) {\n this.selectedDestinationAccounts.delete(accountId);\n } else {\n this.selectedDestinationAccounts.add(accountId);\n }\n }\n\n /**\n * Checks if an account is selected as a destination\n */\n public isDestinationAccountSelected(accountId: string): boolean {\n return this.selectedDestinationAccounts.has(accountId);\n }\n\n /**\n * Executes the cross-account copy to multiple selected accounts\n */\n public async onConfirmCopyToAccount(): Promise<void> {\n if (!this.itemToCopyToProvider || this.selectedDestinationAccounts.size === 0 || !this.account) {\n return;\n }\n\n this.isCopyingToAccount = true;\n\n // Get selected accounts\n const selectedAccounts = this.availableAccounts.filter(a =>\n this.selectedDestinationAccounts.has(a.account.ID)\n );\n\n const successfulCopies: string[] = [];\n const failedCopies: { account: string; error: string }[] = [];\n\n try {\n // Construct source path and normalize it\n const rawSourcePath = this.constructItemPath(this.itemToCopyToProvider);\n const sourcePath = rawSourcePath.replace(/^\\/+|\\/+$/g, '').replace(/\\/+/g, '/');\n console.log('[FileGrid] Cross-account copy sourcePath:', { raw: rawSourcePath, normalized: sourcePath });\n\n // Copy to each selected account\n for (let i = 0; i < selectedAccounts.length; i++) {\n const destAccount = selectedAccounts[i];\n this.copyToAccountProgress = {\n current: i + 1,\n total: selectedAccounts.length,\n currentAccount: destAccount.account.Name\n };\n\n try {\n console.log('[FileGrid] Copying to account:', destAccount.account.Name);\n\n const copyResult = await this.storageClient.CopyObjectBetweenAccounts(\n this.account.account.ID,\n destAccount.account.ID,\n sourcePath,\n this.copyToAccountDestinationPath\n );\n\n if (copyResult.success) {\n successfulCopies.push(destAccount.account.Name);\n } else {\n failedCopies.push({ account: destAccount.account.Name, error: copyResult.message });\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n failedCopies.push({ account: destAccount.account.Name, error: errorMessage });\n }\n }\n\n // Show results\n if (failedCopies.length === 0) {\n this.errorMessage = `Successfully copied to ${successfulCopies.length} account${successfulCopies.length > 1 ? 's' : ''}: ${successfulCopies.join(', ')}`;\n } else if (successfulCopies.length === 0) {\n this.errorMessage = `Copy failed for all accounts: ${failedCopies.map(f => `${f.account} (${f.error})`).join(', ')}`;\n } else {\n this.errorMessage = `Copied to ${successfulCopies.length} account(s). Failed: ${failedCopies.map(f => f.account).join(', ')}`;\n }\n\n setTimeout(() => {\n if (this.errorMessage?.includes('copied') || this.errorMessage?.includes('Copy failed')) {\n this.errorMessage = null;\n }\n }, 5000);\n\n // Close dialog\n this.showCopyToProviderDialog = false;\n this.itemToCopyToProvider = null;\n this.selectedDestinationAccounts.clear();\n this.copyToAccountDestinationPath = '';\n this.copyToAccountProgress = null;\n\n } catch (error) {\n console.error('[FileGrid] Error copying to accounts:', error);\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n this.errorMessage = `Copy failed: ${errorMessage}`;\n\n setTimeout(() => {\n if (this.errorMessage?.startsWith('Copy failed')) {\n this.errorMessage = null;\n }\n }, 5000);\n } finally {\n this.isCopyingToAccount = false;\n this.copyToAccountProgress = null;\n }\n }\n\n // ==========================================\n // Multi-Account Search Methods\n // ==========================================\n\n /**\n * Toggles multi-account search mode\n */\n public toggleMultiAccountSearchMode(): void {\n this.isMultiProviderSearchMode = !this.isMultiProviderSearchMode;\n\n if (this.isMultiProviderSearchMode) {\n // Load available accounts if not already loaded\n if (this.availableAccounts.length === 0) {\n this.loadAvailableAccountsForSearch();\n }\n // Pre-select current account if available\n if (this.account) {\n this.selectedSearchProviders.add(this.account.account.ID);\n }\n } else {\n // Clear search results when exiting search mode\n this.multiProviderSearchResults = null;\n this.multiProviderSearchQuery = '';\n }\n }\n\n /**\n * Loads available accounts for search selection\n */\n private async loadAvailableAccountsForSearch(): Promise<void> {\n try {\n const engine = FileStorageEngine.Instance;\n await engine.Config(false); // Use cached data if available\n this.availableAccounts = engine.AccountsWithProviders;\n } catch (error) {\n console.error('[FileGrid] Error loading accounts for search:', error);\n }\n }\n\n /**\n * Toggles account selection for search\n */\n public toggleSearchAccount(accountID: string): void {\n if (this.selectedSearchProviders.has(accountID)) {\n this.selectedSearchProviders.delete(accountID);\n } else {\n this.selectedSearchProviders.add(accountID);\n }\n }\n\n /**\n * Checks if an account is selected for search\n */\n public isAccountSelectedForSearch(accountID: string): boolean {\n return this.selectedSearchProviders.has(accountID);\n }\n\n /**\n * Checks if an account's provider supports search\n */\n public accountSupportsSearch(accountWithProvider: StorageAccountWithProvider): boolean {\n return accountWithProvider.provider.SupportsSearch === true;\n }\n\n /**\n * Executes multi-account search\n */\n public async executeMultiAccountSearch(): Promise<void> {\n if (!this.multiProviderSearchQuery.trim() || this.selectedSearchProviders.size === 0) {\n return;\n }\n\n this.isSearching = true;\n this.multiProviderSearchResults = null;\n\n try {\n console.log('[FileGrid] Executing multi-account search:', {\n accountIds: Array.from(this.selectedSearchProviders),\n query: this.multiProviderSearchQuery\n });\n\n const searchResult = await this.storageClient.SearchFiles(\n Array.from(this.selectedSearchProviders),\n this.multiProviderSearchQuery,\n { maxResultsPerAccount: 50 }\n );\n\n console.log('[FileGrid] Multi-account search result:', searchResult);\n\n // Map the client result to the component's expected format\n this.multiProviderSearchResults = {\n accountResults: searchResult.accountResults.map((ar: { accountId: string; accountName: string; success: boolean; errorMessage?: string; results: Array<{ path: string; name: string; size: number; contentType: string; lastModified: Date; relevance?: number; excerpt?: string; matchInFilename?: boolean; objectId?: string }>; totalMatches?: number; hasMore: boolean; nextPageToken?: string }) => ({\n accountID: ar.accountId,\n accountName: ar.accountName,\n success: ar.success,\n errorMessage: ar.errorMessage,\n results: ar.results.map((r: { path: string; name: string; size: number; contentType: string; lastModified: Date; relevance?: number; excerpt?: string; matchInFilename?: boolean; objectId?: string }) => ({\n path: r.path,\n name: r.name,\n size: r.size,\n contentType: r.contentType,\n lastModified: r.lastModified.toISOString(),\n relevance: r.relevance,\n excerpt: r.excerpt,\n matchInFilename: r.matchInFilename,\n objectId: r.objectId\n })),\n totalMatches: ar.totalMatches,\n hasMore: ar.hasMore,\n nextPageToken: ar.nextPageToken\n })),\n totalResultsReturned: searchResult.totalResultsReturned,\n successfulAccounts: searchResult.successfulAccounts,\n failedAccounts: searchResult.failedAccounts\n };\n\n } catch (error) {\n console.error('[FileGrid] Error executing multi-provider search:', error);\n this.errorMessage = 'Search failed. Please try again.';\n setTimeout(() => {\n if (this.errorMessage === 'Search failed. Please try again.') {\n this.errorMessage = null;\n }\n }, 5000);\n } finally {\n this.isSearching = false;\n }\n }\n\n /**\n * Clears multi-provider search results\n */\n public clearMultiProviderSearch(): void {\n this.multiProviderSearchQuery = '';\n this.multiProviderSearchResults = null;\n }\n\n /**\n * Gets icon for a search result based on content type\n */\n public getSearchResultIcon(result: FileSearchResultItem): string {\n const extension = result.name.split('.').pop()?.toLowerCase() || '';\n\n if (['jpg', 'jpeg', 'png', 'gif', 'bmp', 'svg'].includes(extension)) {\n return 'fa-solid fa-file-image';\n } else if (['pdf'].includes(extension)) {\n return 'fa-solid fa-file-pdf';\n } else if (['doc', 'docx'].includes(extension)) {\n return 'fa-solid fa-file-word';\n } else if (['xls', 'xlsx'].includes(extension)) {\n return 'fa-solid fa-file-excel';\n } else if (['ppt', 'pptx'].includes(extension)) {\n return 'fa-solid fa-file-powerpoint';\n } else if (['zip', 'rar', '7z', 'tar', 'gz'].includes(extension)) {\n return 'fa-solid fa-file-zipper';\n } else if (['mp4', 'avi', 'mov', 'wmv'].includes(extension)) {\n return 'fa-solid fa-file-video';\n } else if (['mp3', 'wav', 'ogg', 'flac'].includes(extension)) {\n return 'fa-solid fa-file-audio';\n } else {\n return 'fa-solid fa-file';\n }\n }\n\n /**\n * Formats file size for search results\n */\n public formatSearchResultSize(bytes: number): string {\n return this.formatFileSize(bytes);\n }\n\n /**\n * Formats date for search results\n */\n public formatSearchResultDate(dateStr: string): string {\n return new Date(dateStr).toLocaleString();\n }\n}","<div class=\"file-grid-container\"\n (dragenter)=\"onDragEnter($event)\"\n (dragover)=\"onDragOver($event)\"\n (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDrop($event)\">\n <!-- Breadcrumb Navigation Bar -->\n @if (!isLoading && !errorMessage) {\n <div class=\"breadcrumb-bar\">\n <div class=\"nav-buttons\">\n <button class=\"nav-btn\"\n [disabled]=\"!canNavigateUp()\"\n (click)=\"navigateUp()\"\n title=\"Go up to parent folder\">\n <i class=\"fa-solid fa-arrow-up\"></i>\n </button>\n <button class=\"nav-btn\" (click)=\"refresh()\" title=\"Refresh\">\n <i class=\"fa-solid fa-arrows-rotate\"></i>\n </button>\n </div>\n <div class=\"breadcrumb-path\">\n <i class=\"fa-solid fa-folder\"></i>\n <span class=\"path-text\">{{ folderPath || 'Root' }} /</span>\n </div>\n <div class=\"search-bar\">\n <input type=\"text\"\n class=\"search-input\"\n [(ngModel)]=\"searchQuery\"\n (ngModelChange)=\"onSearchChange($event)\"\n placeholder=\"Search files and folders...\"\n [disabled]=\"isLoading || isMultiProviderSearchMode\">\n @if (searchQuery && !isMultiProviderSearchMode) {\n <button class=\"search-clear-btn\"\n (click)=\"clearSearch()\"\n title=\"Clear search\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n }\n <select class=\"file-type-filter\"\n [(ngModel)]=\"fileTypeFilter\"\n (ngModelChange)=\"onFileTypeFilterChange($event)\"\n [disabled]=\"isLoading || isMultiProviderSearchMode\">\n <option value=\"all\">All</option>\n <option value=\"files\">Files</option>\n <option value=\"folders\">Folders</option>\n </select>\n <button class=\"multi-search-btn\"\n [class.active]=\"isMultiProviderSearchMode\"\n (click)=\"toggleMultiAccountSearchMode()\"\n title=\"Search across all storage providers\">\n <i class=\"fa-solid fa-magnifying-glass-plus\"></i>\n </button>\n </div>\n </div>\n }\n\n <!-- Multi-Provider Search Panel -->\n @if (isMultiProviderSearchMode) {\n <div class=\"multi-provider-search-panel\">\n <div class=\"search-panel-header\">\n <h3><i class=\"fa-solid fa-magnifying-glass\"></i> Search Across Providers</h3>\n <button class=\"close-panel-btn\" (click)=\"toggleMultiAccountSearchMode()\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n <div class=\"search-panel-body\">\n <div class=\"search-input-row\">\n <input type=\"text\"\n class=\"multi-search-input\"\n [(ngModel)]=\"multiProviderSearchQuery\"\n placeholder=\"Enter search term...\"\n (keydown.enter)=\"executeMultiAccountSearch()\"\n [disabled]=\"isSearching\">\n <button class=\"search-execute-btn\"\n (click)=\"executeMultiAccountSearch()\"\n [disabled]=\"isSearching || !multiProviderSearchQuery.trim() || selectedSearchProviders.size === 0\">\n @if (isSearching) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n }\n @if (!isSearching) {\n <i class=\"fa-solid fa-search\"></i>\n }\n {{ isSearching ? 'Searching...' : 'Search' }}\n </button>\n </div>\n <div class=\"provider-selection\">\n <label class=\"provider-selection-label\">Select accounts to search:</label>\n <div class=\"provider-checkboxes\">\n @for (a of availableAccounts; track a) {\n <label\n class=\"provider-checkbox\"\n [class.disabled]=\"!accountSupportsSearch(a)\"\n [title]=\"accountSupportsSearch(a) ? '' : 'This account does not support search'\">\n <input type=\"checkbox\"\n [checked]=\"isAccountSelectedForSearch(a.account.ID)\"\n (change)=\"toggleSearchAccount(a.account.ID)\"\n [disabled]=\"!accountSupportsSearch(a)\">\n <span class=\"provider-name\">{{ a.account.Name }}</span>\n <span class=\"provider-type\">({{ a.provider.Name }})</span>\n @if (!accountSupportsSearch(a)) {\n <span class=\"no-search-badge\">(no search)</span>\n }\n </label>\n }\n </div>\n </div>\n </div>\n <!-- Search Results -->\n @if (multiProviderSearchResults) {\n <div class=\"search-results-container\">\n <div class=\"search-results-summary\">\n <span class=\"result-count\">{{ multiProviderSearchResults.totalResultsReturned }} result(s) found</span>\n <span class=\"provider-stats\">\n ({{ multiProviderSearchResults.successfulAccounts }} account(s) searched\n @if (multiProviderSearchResults.failedAccounts > 0) {\n <span class=\"failed-count\">\n , {{ multiProviderSearchResults.failedAccounts }} failed\n </span>\n })\n </span>\n <button class=\"clear-results-btn\" (click)=\"clearMultiProviderSearch()\">\n <i class=\"fa-solid fa-xmark\"></i> Clear\n </button>\n </div>\n <div class=\"provider-results-list\">\n @for (accountResult of multiProviderSearchResults.accountResults; track accountResult) {\n <div\n class=\"provider-result-group\"\n [class.failed]=\"!accountResult.success\">\n <div class=\"provider-result-header\">\n <i class=\"fa-solid fa-cloud\"></i>\n <span class=\"provider-name\">{{ accountResult.accountName }}</span>\n @if (accountResult.success) {\n <span class=\"result-count\">\n ({{ accountResult.results.length }} result(s))\n </span>\n }\n @if (!accountResult.success) {\n <span class=\"error-badge\">\n <i class=\"fa-solid fa-exclamation-triangle\"></i>\n {{ accountResult.errorMessage }}\n </span>\n }\n </div>\n @if (accountResult.success && accountResult.results.length > 0) {\n <div class=\"provider-result-files\">\n @for (file of accountResult.results; track file) {\n <div class=\"search-result-item\">\n <i [class]=\"getSearchResultIcon(file)\" class=\"file-icon\"></i>\n <div class=\"file-info\">\n <span class=\"file-name\">{{ file.name }}</span>\n <span class=\"file-path\">{{ file.path }}</span>\n </div>\n <span class=\"file-size\">{{ formatSearchResultSize(file.size) }}</span>\n <span class=\"file-date\">{{ formatSearchResultDate(file.lastModified) }}</span>\n </div>\n }\n </div>\n }\n @if (accountResult.success && accountResult.results.length === 0) {\n <div class=\"no-results-message\">\n No matching files found\n </div>\n }\n </div>\n }\n </div>\n </div>\n }\n <!-- Searching State -->\n @if (isSearching) {\n <div class=\"searching-state\">\n <mj-loading text=\"Searching across providers...\"></mj-loading>\n </div>\n }\n </div>\n }\n\n <!-- Loading State -->\n @if (isLoading && !isMultiProviderSearchMode) {\n <div class=\"loading-state\">\n <mj-loading text=\"Loading files...\"></mj-loading>\n </div>\n }\n\n <!-- Error State -->\n @if (errorMessage && !isLoading) {\n <div class=\"error-state\">\n <div class=\"error-icon\">\n <i class=\"fa-solid fa-circle-exclamation\"></i>\n </div>\n <p class=\"error-message\">{{ errorMessage }}</p>\n <button class=\"retry-btn\" (click)=\"refresh()\">\n <i class=\"fa-solid fa-arrows-rotate\"></i>\n Retry\n </button>\n </div>\n }\n\n <!-- List View -->\n @if (!isLoading && !errorMessage && filteredItems.length > 0 && viewMode === 'list') {\n <div class=\"file-table-wrapper\">\n <table class=\"file-table\">\n <thead>\n <tr>\n <th class=\"col-name\" (click)=\"onSortChange([{ field: 'name', dir: sort[0].field === 'name' && sort[0].dir === 'asc' ? 'desc' : 'asc' }])\">\n <span>Name</span>\n <i class=\"fa-solid sort-icon\"\n [class.fa-caret-up]=\"sort[0].field === 'name' && sort[0].dir === 'asc'\"\n [class.fa-caret-down]=\"sort[0].field === 'name' && sort[0].dir === 'desc'\"\n [class.fa-sort]=\"sort[0].field !== 'name'\"></i>\n </th>\n <th class=\"col-type\">Type</th>\n <th class=\"col-size\" (click)=\"onSortChange([{ field: 'size', dir: sort[0].field === 'size' && sort[0].dir === 'asc' ? 'desc' : 'asc' }])\">\n <span>Size</span>\n <i class=\"fa-solid sort-icon\"\n [class.fa-caret-up]=\"sort[0].field === 'size' && sort[0].dir === 'asc'\"\n [class.fa-caret-down]=\"sort[0].field === 'size' && sort[0].dir === 'desc'\"\n [class.fa-sort]=\"sort[0].field !== 'size'\"></i>\n </th>\n <th class=\"col-modified\" (click)=\"onSortChange([{ field: 'lastModified', dir: sort[0].field === 'lastModified' && sort[0].dir === 'asc' ? 'desc' : 'asc' }])\">\n <span>Modified</span>\n <i class=\"fa-solid sort-icon\"\n [class.fa-caret-up]=\"sort[0].field === 'lastModified' && sort[0].dir === 'asc'\"\n [class.fa-caret-down]=\"sort[0].field === 'lastModified' && sort[0].dir === 'desc'\"\n [class.fa-sort]=\"sort[0].field !== 'lastModified'\"></i>\n </th>\n </tr>\n </thead>\n <tbody>\n @for (item of filteredItems; track item) {\n <tr\n class=\"file-row\"\n [class.selected]=\"selectedItems.includes(item.key)\"\n (click)=\"onTileClick(item, $event)\"\n (dblclick)=\"onItemDoubleClick(item)\">\n <td class=\"col-name\">\n <i [class]=\"getItemIcon(item)\" class=\"item-icon\"></i>\n <span class=\"item-name\">{{ item.name }}</span>\n </td>\n <td class=\"col-type\">\n <span class=\"item-type\">{{ getFileType(item) }}</span>\n </td>\n <td class=\"col-size\">\n <span class=\"item-size\">{{ item.type === 'folder' ? '—' : formatFileSize(item.size) }}</span>\n </td>\n <td class=\"col-modified\">\n <span class=\"item-date\">{{ formatDate(item.lastModified) }}</span>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n\n <!-- Grid View -->\n @if (!isLoading && !errorMessage && filteredItems.length > 0 && viewMode === 'grid') {\n <div class=\"file-grid-wrapper\">\n <div class=\"file-grid\">\n @for (item of filteredItems; track item) {\n <div\n class=\"grid-item\"\n [class.selected]=\"selectedItems.includes(item.key)\"\n (click)=\"onTileClick(item, $event)\"\n (dblclick)=\"onItemDoubleClick(item)\">\n <div class=\"grid-icon\">\n <i [class]=\"getItemIcon(item)\"></i>\n </div>\n <div class=\"grid-name\">{{ item.name }}</div>\n @if (item.type === 'file') {\n <div class=\"grid-meta\">{{ formatFileSize(item.size) }}</div>\n }\n @if (item.type === 'folder') {\n <div class=\"grid-meta\">Folder</div>\n }\n </div>\n }\n </div>\n </div>\n }\n\n <!-- Empty State -->\n @if (!isLoading && !errorMessage && filteredItems.length === 0) {\n <div class=\"empty-state\">\n <div class=\"empty-icon\">\n <i class=\"fa-solid fa-folder-open\"></i>\n </div>\n <p class=\"empty-message\">This folder is empty</p>\n <button class=\"upload-btn\" (click)=\"onUploadClick()\">\n <i class=\"fa-solid fa-upload\"></i>\n Upload Files\n </button>\n </div>\n }\n\n <!-- Bottom Toolbar -->\n @if (!isLoading && !errorMessage) {\n <div class=\"bottom-toolbar\">\n <div class=\"toolbar-left\">\n <button class=\"toolbar-btn\" (click)=\"onUploadClick()\">\n <i class=\"fa-solid fa-upload\"></i>\n Upload\n </button>\n <button class=\"toolbar-btn\" (click)=\"onNewFolderClick()\">\n <i class=\"fa-solid fa-folder-plus\"></i>\n New Folder\n </button>\n <button class=\"toolbar-btn\"\n [disabled]=\"selectedItems.length !== 1\"\n (click)=\"onDownloadClick()\">\n <i class=\"fa-solid fa-download\"></i>\n Download\n </button>\n <button class=\"toolbar-btn\"\n [disabled]=\"selectedItems.length !== 1\"\n (click)=\"onRenameClick()\">\n <i class=\"fa-solid fa-pen\"></i>\n Rename\n </button>\n <button class=\"toolbar-btn\"\n [disabled]=\"selectedItems.length !== 1\"\n (click)=\"onCopyClick()\">\n <i class=\"fa-solid fa-copy\"></i>\n Copy\n </button>\n <button class=\"toolbar-btn\"\n [disabled]=\"selectedItems.length !== 1 || getSelectedItem()?.type === 'folder'\"\n (click)=\"onCopyToAccountClick()\"\n title=\"Copy file to another storage account\">\n <i class=\"fa-solid fa-cloud-arrow-up\"></i>\n Copy to...\n </button>\n <button class=\"toolbar-btn\"\n [disabled]=\"selectedItems.length !== 1\"\n (click)=\"onMoveClick()\">\n <i class=\"fa-solid fa-arrows-up-down-left-right\"></i>\n Move\n </button>\n <button class=\"toolbar-btn\"\n [disabled]=\"selectedItems.length === 0\"\n (click)=\"onDeleteClick()\">\n <i class=\"fa-solid fa-trash\"></i>\n Delete\n </button>\n </div>\n <div class=\"toolbar-right\">\n <!-- View Toggle -->\n <div class=\"view-toggle\">\n <button class=\"view-btn\"\n [class.active]=\"viewMode === 'list'\"\n (click)=\"viewMode = 'list'\"\n title=\"List View\">\n <i class=\"fa-solid fa-list\"></i>\n </button>\n <button class=\"view-btn\"\n [class.active]=\"viewMode === 'grid'\"\n (click)=\"viewMode = 'grid'\"\n title=\"Grid View\">\n <i class=\"fa-solid fa-th\"></i>\n </button>\n </div>\n <span class=\"item-count\">\n {{ filteredItems.length }} {{ filteredItems.length === 1 ? 'item' : 'filteredItems' }}\n </span>\n </div>\n </div>\n }\n\n <!-- Drag & Drop Overlay -->\n @if (isDragging) {\n <div class=\"drag-overlay\">\n <div class=\"drag-content\">\n <div class=\"drag-icon\">\n <i class=\"fa-solid fa-cloud-arrow-up\"></i>\n </div>\n <h2 class=\"drag-title\">Drop files to upload</h2>\n </div>\n </div>\n }\n\n <!-- Upload Progress -->\n @if (isUploading) {\n <div class=\"upload-progress\">\n <div class=\"progress-content\">\n <div class=\"progress-info\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n <span>Uploading {{ uploadingFileName }}...</span>\n </div>\n <div class=\"progress-bar-wrap\">\n <div class=\"progress-bar\" [style.width.%]=\"uploadProgress\"></div>\n </div>\n <span class=\"progress-percent\">{{ uploadProgress }}%</span>\n </div>\n </div>\n }\n </div>\n\n <!-- New Folder Modal -->\n @if (showNewFolderDialog) {\n <div class=\"modal-overlay\" (click)=\"onCancelNewFolder()\">\n <div class=\"modal-dialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"modal-header\">\n <h3>Create New Folder</h3>\n <button class=\"modal-close\" (click)=\"onCancelNewFolder()\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n <div class=\"modal-body\">\n <label>Folder name:</label>\n <input type=\"text\"\n [(ngModel)]=\"newFolderName\"\n [disabled]=\"isCreatingFolder\"\n placeholder=\"Enter folder name\"\n (keydown.enter)=\"onCreateFolder()\">\n </div>\n <div class=\"modal-footer\">\n <button (click)=\"onCancelNewFolder()\" [disabled]=\"isCreatingFolder\">Cancel</button>\n <button (click)=\"onCreateFolder()\" [disabled]=\"!newFolderName.trim() || isCreatingFolder\">\n @if (isCreatingFolder) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n }\n {{ isCreatingFolder ? 'Creating...' : 'Create' }}\n </button>\n </div>\n </div>\n </div>\n }\n\n <!-- Delete Confirmation Modal -->\n @if (showDeleteDialog && itemToDelete) {\n <div class=\"modal-overlay\" (click)=\"onCancelDelete()\">\n <div class=\"modal-dialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"modal-header\">\n <h3>Delete {{ itemToDelete.type === 'folder' ? 'Folder' : 'File' }}?</h3>\n <button class=\"modal-close\" (click)=\"onCancelDelete()\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n <div class=\"modal-body\">\n <p>Are you sure you want to delete <strong>{{ itemToDelete.name }}</strong>?</p>\n @if (itemToDelete.type === 'folder') {\n <p class=\"warning\">This will delete the folder and all its contents.</p>\n }\n </div>\n <div class=\"modal-footer\">\n <button (click)=\"onCancelDelete()\" [disabled]=\"isDeleting\">Cancel</button>\n <button (click)=\"onConfirmDelete()\" [disabled]=\"isDeleting\" class=\"danger\">\n @if (isDeleting) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n }\n {{ isDeleting ? 'Deleting...' : 'Delete' }}\n </button>\n </div>\n </div>\n </div>\n }\n\n <!-- Rename Modal -->\n @if (showRenameDialog && itemToRename) {\n <div class=\"modal-overlay\" (click)=\"onCancelRename()\">\n <div class=\"modal-dialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"modal-header\">\n <h3>Rename {{ itemToRename.type === 'folder' ? 'Folder' : 'File' }}</h3>\n <button class=\"modal-close\" (click)=\"onCancelRename()\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n <div class=\"modal-body\">\n <label>New name:</label>\n <input type=\"text\"\n [(ngModel)]=\"newItemName\"\n [disabled]=\"isRenaming\"\n placeholder=\"Enter new name\"\n (keydown.enter)=\"onConfirmRename()\">\n </div>\n <div class=\"modal-footer\">\n <button (click)=\"onCancelRename()\" [disabled]=\"isRenaming\">Cancel</button>\n <button (click)=\"onConfirmRename()\" [disabled]=\"isRenaming || !newItemName.trim()\">\n @if (isRenaming) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n }\n {{ isRenaming ? 'Renaming...' : 'Rename' }}\n </button>\n </div>\n </div>\n </div>\n }\n\n <!-- Copy Modal -->\n @if (showCopyDialog && itemToCopy) {\n <div class=\"modal-overlay\" (click)=\"onCancelCopy()\">\n <div class=\"modal-dialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"modal-header\">\n <h3>Copy {{ itemToCopy.type === 'folder' ? 'Folder' : 'File' }}</h3>\n <button class=\"modal-close\" (click)=\"onCancelCopy()\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n <div class=\"modal-body\">\n <p>Copying: <strong>{{ itemToCopy.name }}</strong></p>\n <label>Destination path:</label>\n <input type=\"text\"\n [(ngModel)]=\"copyDestinationPath\"\n [disabled]=\"isCopying\"\n placeholder=\"Enter destination path\"\n (keydown.enter)=\"onConfirmCopy()\">\n </div>\n <div class=\"modal-footer\">\n <button (click)=\"onCancelCopy()\" [disabled]=\"isCopying\">Cancel</button>\n <button (click)=\"onConfirmCopy()\" [disabled]=\"isCopying || !copyDestinationPath.trim()\">\n @if (isCopying) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n }\n {{ isCopying ? 'Copying...' : 'Copy' }}\n </button>\n </div>\n </div>\n </div>\n }\n\n <!-- Move Modal -->\n @if (showMoveDialog && itemToMove) {\n <div class=\"modal-overlay\" (click)=\"onCancelMove()\">\n <div class=\"modal-dialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"modal-header\">\n <h3>Move {{ itemToMove.type === 'folder' ? 'Folder' : 'File' }}</h3>\n <button class=\"modal-close\" (click)=\"onCancelMove()\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n <div class=\"modal-body\">\n <p>Moving: <strong>{{ itemToMove.name }}</strong></p>\n <label>Destination folder path:</label>\n <input type=\"text\"\n [(ngModel)]=\"moveDestinationPath\"\n [disabled]=\"isMoving\"\n placeholder=\"Enter destination folder (e.g., folder1/folder2/)\"\n (keydown.enter)=\"onConfirmMove()\">\n <p style=\"font-size: 11px; color: var(--mj-text-secondary); margin-top: 8px;\">\n File will be moved to: {{ moveDestinationPath }}{{ itemToMove.name }}\n </p>\n </div>\n <div class=\"modal-footer\">\n <button (click)=\"onCancelMove()\" [disabled]=\"isMoving\">Cancel</button>\n <button (click)=\"onConfirmMove()\" [disabled]=\"isMoving || !moveDestinationPath.trim()\">\n @if (isMoving) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n }\n {{ isMoving ? 'Moving...' : 'Move' }}\n </button>\n </div>\n </div>\n </div>\n }\n\n <!-- Copy to Account Modal -->\n @if (showCopyToProviderDialog && itemToCopyToProvider) {\n <div class=\"modal-overlay\" (click)=\"onCancelCopyToAccount()\">\n <div class=\"modal-dialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"modal-header\">\n <h3>Copy to Another Account</h3>\n <button class=\"modal-close\" (click)=\"onCancelCopyToAccount()\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n <div class=\"modal-body\">\n <p>Copying: <strong>{{ itemToCopyToProvider.name }}</strong></p>\n <p style=\"font-size: 12px; color: var(--mj-text-secondary); margin-bottom: 16px;\">\n From: <strong>{{ account?.account?.Name }}</strong>\n </p>\n <label>Select destination account(s):</label>\n <div class=\"account-checkbox-list\">\n @for (a of availableAccounts; track a) {\n <div class=\"account-checkbox-item\">\n <input type=\"checkbox\"\n [id]=\"'dest-account-' + a.account.ID\"\n [checked]=\"isDestinationAccountSelected(a.account.ID)\"\n [disabled]=\"isCopyingToAccount\"\n (change)=\"toggleDestinationAccount(a.account.ID)\">\n <label [for]=\"'dest-account-' + a.account.ID\">\n {{ a.account.Name }} <span class=\"provider-badge\">{{ a.provider.Name }}</span>\n </label>\n </div>\n }\n </div>\n <label style=\"margin-top: 16px;\">Destination filename:</label>\n <input type=\"text\"\n [(ngModel)]=\"copyToAccountDestinationPath\"\n [disabled]=\"isCopyingToAccount\"\n placeholder=\"Enter destination filename\"\n (keydown.enter)=\"onConfirmCopyToAccount()\">\n @if (copyToAccountProgress) {\n <div class=\"copy-progress\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n Copying to {{ copyToAccountProgress.currentAccount }} ({{ copyToAccountProgress.current }}/{{ copyToAccountProgress.total }})...\n </div>\n }\n </div>\n <div class=\"modal-footer\">\n <button (click)=\"onCancelCopyToAccount()\" [disabled]=\"isCopyingToAccount\">Cancel</button>\n <button (click)=\"onConfirmCopyToAccount()\"\n [disabled]=\"isCopyingToAccount || selectedDestinationAccounts.size === 0 || !copyToAccountDestinationPath.trim()\">\n @if (isCopyingToAccount) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n }\n {{ isCopyingToAccount ? 'Copying...' : 'Copy to ' + selectedDestinationAccounts.size + ' account' + (selectedDestinationAccounts.size !== 1 ? 's' : '') }}\n </button>\n </div>\n </div>\n </div>\n }\n"]}