@memberjunction/ng-file-storage 6.2.0-edge.0 → 6.2.0-edge.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/admin/storage-admin-dialog.component.d.ts +1 -1
- package/dist/lib/admin/storage-admin-dialog.component.js +2 -2
- package/dist/lib/admin/storage-admin-dialog.component.js.map +1 -1
- package/dist/lib/category-tree/category-tree.d.ts +83 -9
- package/dist/lib/category-tree/category-tree.d.ts.map +1 -1
- package/dist/lib/category-tree/category-tree.js +192 -50
- package/dist/lib/category-tree/category-tree.js.map +1 -1
- package/dist/lib/file-browser/file-browser.component.d.ts +30 -4
- package/dist/lib/file-browser/file-browser.component.d.ts.map +1 -1
- package/dist/lib/file-browser/file-browser.component.js +68 -16
- package/dist/lib/file-browser/file-browser.component.js.map +1 -1
- package/dist/lib/file-browser/file-grid.component.d.ts +404 -58
- package/dist/lib/file-browser/file-grid.component.d.ts.map +1 -1
- package/dist/lib/file-browser/file-grid.component.js +1040 -396
- package/dist/lib/file-browser/file-grid.component.js.map +1 -1
- package/dist/lib/file-browser/folder-tree.component.d.ts +65 -9
- package/dist/lib/file-browser/folder-tree.component.d.ts.map +1 -1
- package/dist/lib/file-browser/folder-tree.component.js +166 -58
- package/dist/lib/file-browser/folder-tree.component.js.map +1 -1
- package/dist/lib/file-browser/storage-providers-list.component.d.ts +55 -7
- package/dist/lib/file-browser/storage-providers-list.component.d.ts.map +1 -1
- package/dist/lib/file-browser/storage-providers-list.component.js +124 -34
- package/dist/lib/file-browser/storage-providers-list.component.js.map +1 -1
- package/dist/lib/file-upload/file-upload.d.ts +22 -2
- package/dist/lib/file-upload/file-upload.d.ts.map +1 -1
- package/dist/lib/file-upload/file-upload.js +40 -10
- package/dist/lib/file-upload/file-upload.js.map +1 -1
- package/dist/lib/files-grid/files-grid.d.ts +28 -4
- package/dist/lib/files-grid/files-grid.d.ts.map +1 -1
- package/dist/lib/files-grid/files-grid.js +71 -23
- package/dist/lib/files-grid/files-grid.js.map +1 -1
- package/dist/lib/record-attachments/record-attachments.component.d.ts +15 -7
- package/dist/lib/record-attachments/record-attachments.component.d.ts.map +1 -1
- package/dist/lib/record-attachments/record-attachments.component.js +34 -18
- package/dist/lib/record-attachments/record-attachments.component.js.map +1 -1
- package/package.json +13 -13
|
@@ -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, ChangeDetectorRef, inject } from '@angular/core';\nimport { GraphQLDataProvider, GraphQLFileStorageClient } from '@memberjunction/graphql-dataprovider';\nimport { FileStorageEngineBase, StorageAccountWithProvider } from '@memberjunction/core-entities';\nimport { UUIDsEqual } from '@memberjunction/global';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\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 private cdr = inject(ChangeDetectorRef);\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 * Preview modal state\n */\n public showPreviewModal: boolean = false;\n public previewItem: FileGridItem | null = null;\n public previewUrl: string | null = null;\n public isLoadingPreview: boolean = false;\n public previewMediaType: string = 'unknown';\n\n /**\n * GraphQL client for file storage operations\n */\n private storageClient: GraphQLFileStorageClient;\n\n /**\n * Global notifications service for user toast feedback\n */\n protected notifications = inject(MJNotificationService);\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.cdr.detectChanges();\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 this.cdr.detectChanges();\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 in-browser preview.\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 // Open in-browser preview\n this.openPreview(item);\n }\n }\n\n /**\n * Downloads a file by creating a pre-authenticated download URL\n */\n public 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 // Open file in new browser tab for viewing/download\n window.open(downloadUrl, '_blank', 'noopener,noreferrer');\n this.notifications.CreateSimpleNotification(`Opening ${item.name}...`, 'info');\n } else {\n this.notifications.CreateSimpleNotification('Failed to generate download URL', 'error');\n }\n } catch (error) {\n console.error('[FileGrid] Error downloading file:', error);\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n this.notifications.CreateSimpleNotification(`Failed to download ${item.name}: ${errorMessage}`, 'error');\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 using server-side MJ Storage (supports all providers)\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 let cleanPath = '';\n if (this.folderPath && this.folderPath !== '/') {\n cleanPath = this.folderPath.endsWith('/') ? this.folderPath.slice(0, -1) : this.folderPath;\n if (cleanPath.startsWith('/')) {\n cleanPath = cleanPath.substring(1);\n }\n }\n\n console.log('[FileGrid] Uploading file via MJ Storage:', { name: file.name, path: cleanPath });\n const base64Data = await this.readFileAsBase64(file);\n\n const result = await this.storageClient.UploadFile({\n FileName: file.name,\n Base64Data: base64Data,\n MimeType: file.type || 'application/octet-stream',\n AccountID: this.account.account.ID,\n PathPrefix: cleanPath || undefined,\n });\n\n if (!result.Success) {\n throw new Error(result.ErrorMessage || 'Upload failed');\n }\n\n this.uploadProgress = 100;\n console.log('[FileGrid] File uploaded successfully via MJ Storage:', file.name);\n } catch (error) {\n console.error('[FileGrid] Error uploading file:', error);\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n this.errorMessage = `Failed to upload ${file.name}: ${errorMessage}`;\n\n // Clear error after 5 seconds\n setTimeout(() => {\n if (this.errorMessage?.startsWith('Failed to upload')) {\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 * Reads a browser File object as a base64 encoded string\n */\n private readFileAsBase64(file: File): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => {\n const result = reader.result;\n if (typeof result === 'string') {\n const base64 = result.substring(result.indexOf(',') + 1);\n resolve(base64);\n } else {\n reject(new Error('Failed to read file as base64 string'));\n }\n };\n reader.onerror = (err) => reject(err);\n reader.readAsDataURL(file);\n });\n }\n\n /**\n * Uploads file to the pre-authenticated URL with progress tracking\n */\n private uploadFileToUrl(file: File, url: string, driverKey?: 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 // Provider-specific upload semantics for the pre-authenticated URL:\n // - Dropbox temporary upload links require POST.\n // - Azure Blob \"Put Blob\" requires PUT and the `x-ms-blob-type: BlockBlob` header;\n // without the header Azure rejects the request and the upload silently no-ops.\n // - S3 and other pre-signed-PUT providers require PUT.\n const isDropbox = driverKey === 'Dropbox Storage';\n const isAzure = driverKey === 'Azure Blob Storage';\n xhr.open(isDropbox ? 'POST' : 'PUT', url, true);\n xhr.setRequestHeader('Content-Type', file.type || 'application/octet-stream');\n if (isAzure) {\n xhr.setRequestHeader('x-ms-blob-type', 'BlockBlob');\n }\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 const createdName = this.newFolderName.trim();\n // Close dialog and refresh\n this.showNewFolderDialog = false;\n this.newFolderName = '';\n\n this.notifications.CreateSimpleNotification(`Created folder \"${createdName}\"`, 'success');\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.notifications.CreateSimpleNotification('Failed to create folder', 'error');\n }\n } catch (error) {\n console.error('[FileGrid] Error creating folder:', error);\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n this.notifications.CreateSimpleNotification(`Failed to create folder: ${errorMessage}`, 'error');\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 const deletedName = this.itemToDelete.name;\n\n // Close dialog\n this.showDeleteDialog = false;\n this.itemToDelete = null;\n\n // Clear selection\n this.selectedItems = [];\n\n this.notifications.CreateSimpleNotification(`Deleted \"${deletedName}\"`, 'info');\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.notifications.CreateSimpleNotification(`Failed to delete ${this.itemToDelete.type}`, 'error');\n }\n } catch (error) {\n console.error('[FileGrid] Error deleting item:', error);\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n this.notifications.CreateSimpleNotification(`Failed to delete: ${errorMessage}`, 'error');\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 const oldName = this.itemToRename.name;\n const newName = this.newItemName.trim();\n\n // Close dialog\n this.showRenameDialog = false;\n this.itemToRename = null;\n this.newItemName = '';\n\n // Clear selection\n this.selectedItems = [];\n\n this.notifications.CreateSimpleNotification(`Renamed \"${oldName}\" to \"${newName}\"`, 'success');\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.notifications.CreateSimpleNotification(`Failed to rename ${this.itemToRename.type}`, 'error');\n }\n } catch (error) {\n console.error('[FileGrid] Error renaming item:', error);\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n this.notifications.CreateSimpleNotification(`Failed to rename: ${errorMessage}`, 'error');\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.notifications.CreateSimpleNotification('Cannot download folders. Please select a file.', 'warning');\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, opening in new tab');\n window.open(downloadUrl, '_blank', 'noopener,noreferrer');\n this.notifications.CreateSimpleNotification(`Opening ${item.name}...`, 'info');\n } else {\n this.notifications.CreateSimpleNotification('Failed to create download URL', 'error');\n }\n } catch (error) {\n console.error('[FileGrid] Error downloading file:', error);\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n this.notifications.CreateSimpleNotification(`Failed to download: ${errorMessage}`, 'error');\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 this.notifications.CreateSimpleNotification('Item copied successfully', 'success');\n\n // Refresh the file grid\n this.loadItems();\n } else {\n this.notifications.CreateSimpleNotification('Failed to copy item', 'error');\n }\n } catch (error) {\n console.error('[FileGrid] Error copying item:', error);\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n this.notifications.CreateSimpleNotification(`Failed to copy: ${errorMessage}`, 'error');\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 this.notifications.CreateSimpleNotification('Item moved successfully', 'success');\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.notifications.CreateSimpleNotification('Failed to move item', 'error');\n }\n } catch (error) {\n console.error('[FileGrid] Error moving item:', error);\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n this.notifications.CreateSimpleNotification(`Failed to move: ${errorMessage}`, 'error');\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 = FileStorageEngineBase.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.notifications.CreateSimpleNotification('No other storage accounts available', 'warning');\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.notifications.CreateSimpleNotification('Failed to load storage accounts', 'error');\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.notifications.CreateSimpleNotification(`Successfully copied to ${successfulCopies.length} account${successfulCopies.length > 1 ? 's' : ''}`, 'success');\n } else if (successfulCopies.length === 0) {\n this.notifications.CreateSimpleNotification(`Copy failed for all accounts: ${failedCopies.map(f => f.account).join(', ')}`, 'error');\n } else {\n this.notifications.CreateSimpleNotification(`Copied to ${successfulCopies.length} account(s). Failed: ${failedCopies.map(f => f.account).join(', ')}`, 'warning');\n }\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.notifications.CreateSimpleNotification(`Copy failed: ${errorMessage}`, 'error');\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 = FileStorageEngineBase.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\n /**\n * Determines media category for a file item\n */\n public getMediaType(item: FileGridItem): string {\n const ext = item.name.split('.').pop()?.toLowerCase() || '';\n const mime = item.contentType?.toLowerCase() || '';\n\n if (mime.startsWith('image/') || ['jpg', 'jpeg', 'png', 'gif', 'webp', 'svg', 'bmp', 'ico'].includes(ext)) {\n return 'image';\n }\n if (mime === 'application/pdf' || ext === 'pdf') {\n return 'pdf';\n }\n if (mime.startsWith('audio/') || ['mp3', 'wav', 'ogg', 'aac', 'flac', 'm4a'].includes(ext)) {\n return 'audio';\n }\n if (mime.startsWith('video/') || ['mp4', 'webm', 'ogg', 'mov', 'avi', 'mkv'].includes(ext)) {\n return 'video';\n }\n if (['json', 'ts', 'js', 'html', 'css', 'scss', 'xml', 'yaml', 'yml', 'md', 'sql', 'py', 'java', 'c', 'cpp'].includes(ext)) {\n return 'code';\n }\n if (mime.startsWith('text/') || ['txt', 'log', 'csv'].includes(ext)) {\n return 'text';\n }\n if (['doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx'].includes(ext)) {\n return 'document';\n }\n return 'unknown';\n }\n\n /**\n * Gets specific badge class for media type\n */\n public getItemColorClass(item: FileGridItem): string {\n if (item.type === 'folder') {\n return 'mj-file-thumb--folder';\n }\n const mediaType = this.getMediaType(item);\n return `mj-file-thumb--${mediaType}`;\n }\n\n /**\n * Generates clickable path breadcrumbs\n */\n public getPathBreadcrumbs(): Array<{ name: string; path: string }> {\n const raw = (this.folderPath || '').trim();\n if (!raw || raw === '/') {\n return [{ name: 'Root', path: '/' }];\n }\n const clean = raw.startsWith('/') ? raw.substring(1) : raw;\n const parts = clean.split('/').filter((p) => p.trim().length > 0);\n const crumbs: Array<{ name: string; path: string }> = [\n { name: 'Root', path: '/' },\n ];\n let currentPath = '';\n for (const part of parts) {\n currentPath += '/' + part;\n crumbs.push({ name: part, path: currentPath });\n }\n return crumbs;\n }\n\n /**\n * Navigates to a specific breadcrumb path\n */\n public navigateToBreadcrumb(path: string): void {\n this.folderNavigate.emit(path);\n }\n\n /**\n * Toggles selection of a file/folder item\n */\n public toggleItemSelection(item: FileGridItem, event?: Event): void {\n if (event) {\n event.stopPropagation();\n }\n const idx = this.selectedItems.indexOf(item.key);\n if (idx >= 0) {\n this.selectedItems = this.selectedItems.filter((k) => k !== item.key);\n } else {\n this.selectedItems = [...this.selectedItems, item.key];\n }\n this.cdr.markForCheck();\n }\n\n /**\n * Selects all current filtered items\n */\n public selectAll(): void {\n this.selectedItems = this.filteredItems.map((i) => i.key);\n this.cdr.markForCheck();\n }\n\n /**\n * Clears selection\n */\n public deselectAll(): void {\n this.selectedItems = [];\n this.cdr.markForCheck();\n }\n\n /**\n * Checks if all items are selected\n */\n public areAllSelected(): boolean {\n return (\n this.filteredItems.length > 0 &&\n this.selectedItems.length === this.filteredItems.length\n );\n }\n\n /**\n * Opens in-browser preview modal\n */\n public async openPreview(item: FileGridItem): Promise<void> {\n if (item.type === 'folder' || !this.account) {\n return;\n }\n\n this.previewItem = item;\n this.previewMediaType = this.getMediaType(item);\n this.showPreviewModal = true;\n this.isLoadingPreview = true;\n this.previewUrl = null;\n this.cdr.markForCheck();\n\n try {\n const itemPath = this.constructItemPath(item);\n const url = await this.storageClient.CreatePreAuthDownloadUrl(\n this.account.account.ID,\n itemPath\n );\n this.previewUrl = url;\n } catch (err) {\n console.error('[FileGrid] Preview error:', err);\n } finally {\n this.isLoadingPreview = false;\n this.cdr.markForCheck();\n }\n }\n\n /**\n * Closes the preview modal\n */\n public closePreview(): void {\n this.showPreviewModal = false;\n this.previewItem = null;\n this.previewUrl = null;\n this.isLoadingPreview = false;\n this.cdr.markForCheck();\n }\n}","<div class=\"file-grid-container\"\n (dragenter)=\"onDragEnter($event)\"\n (dragover)=\"onDragOver($event)\"\n (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDrop($event)\">\n\n <!-- Top Command Bar: Breadcrumbs & Primary Actions -->\n @if (!isLoading && !errorMessage) {\n <div class=\"command-bar breadcrumb-bar\">\n <!-- Left: Breadcrumb Navigation Trail -->\n <div class=\"command-bar-left\">\n <div class=\"nav-btn-group nav-buttons\">\n <button\n type=\"button\"\n class=\"mj-tool-btn 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\n type=\"button\"\n class=\"mj-tool-btn nav-btn\"\n (click)=\"refresh()\"\n title=\"Refresh current folder\">\n <i class=\"fa-solid fa-arrows-rotate\"></i>\n </button>\n </div>\n\n <nav class=\"breadcrumb-trail breadcrumb-path\" aria-label=\"Folder Path\">\n <i class=\"fa-solid fa-folder-open trail-root-icon\"></i>\n @for (crumb of getPathBreadcrumbs(); track crumb.path; let last = $last) {\n <button\n type=\"button\"\n class=\"crumb-btn\"\n [class.current]=\"last\"\n (click)=\"navigateToBreadcrumb(crumb.path)\"\n [title]=\"crumb.name\">\n {{ crumb.name }}\n </button>\n @if (!last) {\n <span class=\"crumb-separator\">/</span>\n }\n }\n </nav>\n </div>\n\n <!-- Right: Search, Filter, View Mode & Action Buttons -->\n <div class=\"command-bar-right\">\n <!-- Search & Filter Bar -->\n <div class=\"search-pill search-bar\">\n <i class=\"fa-solid fa-magnifying-glass search-icon\"></i>\n <input\n type=\"text\"\n class=\"search-input\"\n [(ngModel)]=\"searchQuery\"\n (ngModelChange)=\"onSearchChange($event)\"\n placeholder=\"Search files...\"\n [disabled]=\"isLoading || isMultiProviderSearchMode\" />\n @if (searchQuery && !isMultiProviderSearchMode) {\n <button\n type=\"button\"\n class=\"search-clear-btn\"\n (click)=\"clearSearch()\"\n title=\"Clear search\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n }\n <select\n class=\"type-filter-select file-type-filter\"\n [(ngModel)]=\"fileTypeFilter\"\n (ngModelChange)=\"onFileTypeFilterChange($event)\"\n [disabled]=\"isLoading || isMultiProviderSearchMode\">\n <option value=\"all\">All Items</option>\n <option value=\"files\">Files only</option>\n <option value=\"folders\">Folders only</option>\n </select>\n </div>\n\n <!-- Search Across Accounts Toggle -->\n <button\n type=\"button\"\n class=\"mj-btn-search-toggle multi-search-btn\"\n [class.active]=\"isMultiProviderSearchMode\"\n (click)=\"toggleMultiAccountSearchMode()\"\n title=\"Search across all storage accounts\">\n <i class=\"fa-solid fa-layer-group\"></i>\n <span>All Accounts</span>\n </button>\n\n <!-- View Switcher -->\n <div class=\"view-mode-toggle view-toggle\">\n <button\n type=\"button\"\n class=\"view-mode-btn 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\n type=\"button\"\n class=\"view-mode-btn view-btn\"\n [class.active]=\"viewMode === 'grid'\"\n (click)=\"viewMode = 'grid'\"\n title=\"Grid View\">\n <i class=\"fa-solid fa-table-cells-large\"></i>\n </button>\n </div>\n\n <!-- Primary Action CTAs -->\n <button\n type=\"button\"\n class=\"mj-action-btn mj-action-btn--secondary toolbar-btn\"\n (click)=\"onNewFolderClick()\"\n title=\"Create New Folder\">\n <i class=\"fa-solid fa-folder-plus\"></i>\n <span>New Folder</span>\n </button>\n\n <button\n type=\"button\"\n class=\"mj-action-btn mj-action-btn--primary toolbar-btn\"\n (click)=\"onUploadClick()\"\n title=\"Upload Files\">\n <i class=\"fa-solid fa-cloud-arrow-up\"></i>\n <span>Upload</span>\n </button>\n </div>\n </div>\n }\n\n <!-- Selection Action Bar (Appears when 1+ items selected) -->\n @if (selectedItems.length > 0 && !isMultiProviderSearchMode) {\n <div class=\"selection-bar\">\n <div class=\"selection-bar-left\">\n <label class=\"selection-checkbox-wrap\" (click)=\"$event.stopPropagation()\">\n <input\n type=\"checkbox\"\n [checked]=\"areAllSelected()\"\n (change)=\"areAllSelected() ? deselectAll() : selectAll()\" />\n <span class=\"selection-count\">{{ selectedItems.length }} item{{ selectedItems.length === 1 ? '' : 's' }} selected</span>\n </label>\n </div>\n\n <div class=\"selection-bar-right\">\n @if (selectedItems.length === 1 && getSelectedItem()?.type === 'file') {\n <button\n type=\"button\"\n class=\"sel-action-btn\"\n (click)=\"openPreview(getSelectedItem()!)\"\n title=\"Preview file\">\n <i class=\"fa-solid fa-eye\"></i>\n <span>Preview</span>\n </button>\n <button\n type=\"button\"\n class=\"sel-action-btn\"\n (click)=\"onDownloadClick()\"\n title=\"Download file\">\n <i class=\"fa-solid fa-download\"></i>\n <span>Download</span>\n </button>\n <button\n type=\"button\"\n class=\"sel-action-btn\"\n (click)=\"onCopyToAccountClick()\"\n title=\"Copy to another storage account\">\n <i class=\"fa-solid fa-cloud-arrow-up\"></i>\n <span>Copy to...</span>\n </button>\n }\n @if (selectedItems.length === 1) {\n <button\n type=\"button\"\n class=\"sel-action-btn\"\n (click)=\"onRenameClick()\"\n title=\"Rename item\">\n <i class=\"fa-solid fa-pen\"></i>\n <span>Rename</span>\n </button>\n <button\n type=\"button\"\n class=\"sel-action-btn\"\n (click)=\"onCopyClick()\"\n title=\"Copy to path\">\n <i class=\"fa-solid fa-copy\"></i>\n <span>Copy</span>\n </button>\n <button\n type=\"button\"\n class=\"sel-action-btn\"\n (click)=\"onMoveClick()\"\n title=\"Move item\">\n <i class=\"fa-solid fa-arrows-up-down-left-right\"></i>\n <span>Move</span>\n </button>\n }\n <button\n type=\"button\"\n class=\"sel-action-btn sel-action-btn--danger\"\n (click)=\"onDeleteClick()\"\n title=\"Delete selected item(s)\">\n <i class=\"fa-solid fa-trash\"></i>\n <span>Delete</span>\n </button>\n <button\n type=\"button\"\n class=\"sel-action-btn sel-action-btn--ghost\"\n (click)=\"deselectAll()\"\n title=\"Deselect all\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n </div>\n }\n\n <!-- Multi-Provider Search Panel -->\n @if (isMultiProviderSearchMode) {\n <div class=\"multi-search-card multi-provider-search-panel\">\n <div class=\"multi-search-header search-panel-header\">\n <div class=\"multi-search-title\">\n <i class=\"fa-solid fa-layer-group\"></i>\n <h3>Search Across Storage Accounts</h3>\n </div>\n <button\n type=\"button\"\n class=\"modal-close-btn close-panel-btn\"\n (click)=\"toggleMultiAccountSearchMode()\"\n title=\"Close search\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n\n <div class=\"multi-search-body search-panel-body\">\n <div class=\"multi-search-bar search-input-row\">\n <input\n type=\"text\"\n class=\"multi-search-text multi-search-input\"\n [(ngModel)]=\"multiProviderSearchQuery\"\n placeholder=\"Type query to search across connected accounts...\"\n (keydown.enter)=\"executeMultiAccountSearch()\"\n [disabled]=\"isSearching\" />\n <button\n type=\"button\"\n class=\"mj-action-btn mj-action-btn--primary 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 } @else {\n <i class=\"fa-solid fa-magnifying-glass\"></i>\n }\n <span>{{ isSearching ? 'Searching...' : 'Search Accounts' }}</span>\n </button>\n </div>\n\n <div class=\"multi-search-accounts provider-selection\">\n <span class=\"account-select-label provider-selection-label\">Target Accounts:</span>\n <div class=\"account-pill-list provider-checkboxes\">\n @for (a of availableAccounts; track a.account.ID) {\n <label\n class=\"account-select-pill provider-checkbox\"\n [class.disabled]=\"!accountSupportsSearch(a)\"\n [class.checked]=\"isAccountSelectedForSearch(a.account.ID)\">\n <input\n type=\"checkbox\"\n [checked]=\"isAccountSelectedForSearch(a.account.ID)\"\n (change)=\"toggleSearchAccount(a.account.ID)\"\n [disabled]=\"!accountSupportsSearch(a)\" />\n <span class=\"pill-account-name provider-name\">{{ a.account.Name }}</span>\n <span class=\"pill-provider-tag provider-type\">{{ a.provider.Name }}</span>\n @if (!accountSupportsSearch(a)) {\n <span class=\"pill-no-search no-search-badge\">(no search)</span>\n }\n </label>\n }\n </div>\n </div>\n </div>\n\n <!-- Search Results -->\n @if (multiProviderSearchResults) {\n <div class=\"multi-search-results search-results-container\">\n <div class=\"results-meta-bar search-results-summary\">\n <span class=\"meta-count result-count\">\n <strong>{{ multiProviderSearchResults.totalResultsReturned }}</strong> result{{ multiProviderSearchResults.totalResultsReturned === 1 ? '' : 's' }} found\n </span>\n <span class=\"meta-stats provider-stats\">\n ({{ multiProviderSearchResults.successfulAccounts }} account{{ multiProviderSearchResults.successfulAccounts === 1 ? '' : 's' }} searched)\n </span>\n <button\n type=\"button\"\n class=\"clear-results-btn\"\n (click)=\"clearMultiProviderSearch()\">\n <i class=\"fa-solid fa-xmark\"></i> Clear Results\n </button>\n </div>\n\n <div class=\"results-groups provider-results-list\">\n @for (accountResult of multiProviderSearchResults.accountResults; track accountResult.accountID) {\n <div class=\"result-group provider-result-group\" [class.failed]=\"!accountResult.success\">\n <div class=\"result-group-head provider-result-header\">\n <i class=\"fa-solid fa-cloud-bolt group-icon\"></i>\n <span class=\"group-account-name provider-name\">{{ accountResult.accountName }}</span>\n @if (accountResult.success) {\n <span class=\"group-count-badge result-count\">{{ accountResult.results.length }}</span>\n } @else {\n <span class=\"group-error-badge error-badge\">{{ accountResult.errorMessage }}</span>\n }\n </div>\n\n @if (accountResult.success && accountResult.results.length > 0) {\n <div class=\"result-items-grid provider-result-files\">\n @for (file of accountResult.results; track file.path) {\n <div class=\"search-item-row search-result-item\">\n <i [class]=\"getSearchResultIcon(file)\" class=\"search-item-icon file-icon\"></i>\n <div class=\"search-item-info file-info\">\n <span class=\"search-item-name file-name\">{{ file.name }}</span>\n <span class=\"search-item-path file-path\">{{ file.path }}</span>\n </div>\n <span class=\"search-item-size file-size\">{{ formatSearchResultSize(file.size) }}</span>\n <span class=\"search-item-date file-date\">{{ formatSearchResultDate(file.lastModified) }}</span>\n </div>\n }\n </div>\n }\n @if (accountResult.success && accountResult.results.length === 0) {\n <div class=\"group-empty-text no-results-message\">No matching files found in this account</div>\n }\n </div>\n }\n </div>\n </div>\n }\n </div>\n }\n\n <!-- Loading State -->\n @if (isLoading && !isMultiProviderSearchMode) {\n <div class=\"grid-loading-container loading-state\">\n <mj-loading text=\"Loading files...\"></mj-loading>\n </div>\n }\n\n <!-- Error State -->\n @if (errorMessage && !isLoading) {\n <mj-empty-state\n class=\"file-grid-empty-fill\"\n Variant=\"error\"\n Icon=\"fa-solid fa-triangle-exclamation\"\n Title=\"Unable to load files\"\n [Message]=\"errorMessage\"\n ActionText=\"Retry\"\n ActionIcon=\"fa-solid fa-arrows-rotate\"\n (Action)=\"refresh()\" />\n }\n\n <!-- Grid View -->\n @if (!isLoading && !errorMessage && filteredItems.length > 0 && viewMode === 'grid') {\n <div class=\"file-cards-grid file-grid file-grid-wrapper\">\n @for (item of filteredItems; track item.key) {\n <div\n class=\"file-card grid-item\"\n [class.selected]=\"selectedItems.includes(item.key)\"\n (click)=\"onTileClick(item, $event)\"\n (dblclick)=\"onItemDoubleClick(item)\"\n [title]=\"item.name\">\n\n <!-- Card Top Row: Checkbox & Quick Actions -->\n <div class=\"file-card-header\">\n <label class=\"file-card-checkbox\" (click)=\"$event.stopPropagation()\">\n <input\n type=\"checkbox\"\n [checked]=\"selectedItems.includes(item.key)\"\n (change)=\"toggleItemSelection(item, $event)\" />\n </label>\n <div class=\"file-card-quick-actions\" (click)=\"$event.stopPropagation()\">\n @if (item.type === 'file') {\n <button\n type=\"button\"\n class=\"quick-action-btn\"\n (click)=\"openPreview(item)\"\n title=\"Preview\">\n <i class=\"fa-solid fa-eye\"></i>\n </button>\n <button\n type=\"button\"\n class=\"quick-action-btn\"\n (click)=\"downloadFile(item)\"\n title=\"Download\">\n <i class=\"fa-solid fa-download\"></i>\n </button>\n }\n </div>\n </div>\n\n <!-- Card Thumbnail/Icon -->\n <div class=\"file-card-icon-container grid-icon\" [class]=\"getItemColorClass(item)\">\n <i [class]=\"getItemIcon(item)\"></i>\n </div>\n\n <!-- Card Body: Name & Meta -->\n <div class=\"file-card-body\">\n <span class=\"file-card-name grid-name\">{{ item.name }}</span>\n <div class=\"file-card-meta grid-meta\">\n <span class=\"meta-size\">{{ item.type === 'folder' ? 'Folder' : formatFileSize(item.size) }}</span>\n <span class=\"meta-date\">{{ formatDate(item.lastModified) }}</span>\n </div>\n </div>\n </div>\n }\n </div>\n }\n\n <!-- List View Table -->\n @if (!isLoading && !errorMessage && filteredItems.length > 0 && viewMode === 'list') {\n <div class=\"file-table-container file-table-wrapper\">\n <table class=\"file-table\">\n <thead>\n <tr>\n <th class=\"th-check\">\n <input\n type=\"checkbox\"\n [checked]=\"areAllSelected()\"\n (change)=\"areAllSelected() ? deselectAll() : selectAll()\" />\n </th>\n <th class=\"th-name 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-arrow 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=\"th-type col-type\">Type</th>\n <th class=\"th-size 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-arrow 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=\"th-date 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-arrow 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 <th class=\"th-actions\">Actions</th>\n </tr>\n </thead>\n <tbody>\n @for (item of filteredItems; track item.key) {\n <tr\n class=\"file-table-row file-row\"\n [class.selected]=\"selectedItems.includes(item.key)\"\n (click)=\"onTileClick(item, $event)\"\n (dblclick)=\"onItemDoubleClick(item)\">\n <td class=\"td-check\" (click)=\"$event.stopPropagation()\">\n <input\n type=\"checkbox\"\n [checked]=\"selectedItems.includes(item.key)\"\n (change)=\"toggleItemSelection(item, $event)\" />\n </td>\n <td class=\"td-name col-name\">\n <div class=\"row-name-wrap\">\n <div class=\"row-icon-badge\" [class]=\"getItemColorClass(item)\">\n <i [class]=\"getItemIcon(item)\" class=\"item-icon\"></i>\n </div>\n <span class=\"row-file-name item-name\" [title]=\"item.name\">{{ item.name }}</span>\n </div>\n </td>\n <td class=\"td-type col-type\">\n <span class=\"type-badge item-type\">{{ getFileType(item) }}</span>\n </td>\n <td class=\"td-size col-size\">\n <span class=\"size-text item-size\">{{ item.type === 'folder' ? '—' : formatFileSize(item.size) }}</span>\n </td>\n <td class=\"td-date col-modified\">\n <span class=\"date-text item-date\">{{ formatDate(item.lastModified) }}</span>\n </td>\n <td class=\"td-actions\" (click)=\"$event.stopPropagation()\">\n <div class=\"row-action-buttons\">\n @if (item.type === 'file') {\n <button\n type=\"button\"\n class=\"row-act-btn\"\n (click)=\"openPreview(item)\"\n title=\"Preview\">\n <i class=\"fa-solid fa-eye\"></i>\n </button>\n <button\n type=\"button\"\n class=\"row-act-btn\"\n (click)=\"downloadFile(item)\"\n title=\"Download\">\n <i class=\"fa-solid fa-download\"></i>\n </button>\n }\n </div>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n\n <!-- Empty State -->\n @if (!isLoading && !errorMessage && filteredItems.length === 0 && !isMultiProviderSearchMode) {\n <mj-empty-state\n Icon=\"fa-solid fa-folder-open\"\n Title=\"This folder is empty\"\n Message=\"Drop files here to upload or create a new folder\"\n ActionText=\"Upload Files\"\n ActionIcon=\"fa-solid fa-cloud-arrow-up\"\n (Action)=\"onUploadClick()\" />\n }\n\n <!-- Bottom Status Bar -->\n @if (!isLoading && !errorMessage) {\n <div class=\"status-bar\">\n <span class=\"status-count\">\n {{ filteredItems.length }} item{{ filteredItems.length === 1 ? '' : 's' }}\n @if (searchQuery) {\n (filtered)\n }\n </span>\n <div class=\"status-account-badge\" *ngIf=\"account\">\n <i class=\"fa-solid fa-cloud\"></i>\n <span>{{ account.account.Name }} ({{ account.provider.Name }})</span>\n </div>\n </div>\n }\n\n <!-- Drag & Drop Upload Overlay -->\n @if (isDragging) {\n <div class=\"drag-drop-overlay\">\n <div class=\"drag-drop-content\">\n <i class=\"fa-solid fa-cloud-arrow-up drag-icon\"></i>\n <h3>Drop files here to upload</h3>\n <p>Files will be stored in {{ folderPath || 'Root' }}</p>\n </div>\n </div>\n }\n\n <!-- Upload Progress Bar -->\n @if (isUploading) {\n <div class=\"upload-progress-bar-wrap\">\n <div class=\"upload-progress-card\">\n <div class=\"upload-info\">\n <i class=\"fa-solid fa-spinner fa-spin upload-spinner\"></i>\n <span class=\"upload-text\">Uploading {{ uploadingFileName }}...</span>\n </div>\n <div class=\"progress-track\">\n <div class=\"progress-fill\" [style.width.%]=\"uploadProgress\"></div>\n </div>\n </div>\n </div>\n }\n</div>\n\n<!-- ==========================================================================\n MODAL DIALOGS (Design Tokens, Smooth Animations, Backdrop Blurs)\n ========================================================================== -->\n\n<!-- File Preview Modal -->\n@if (showPreviewModal && previewItem) {\n <div class=\"mj-modal-backdrop\" (click)=\"closePreview()\">\n <div class=\"mj-modal-window preview-modal-window\" (click)=\"$event.stopPropagation()\">\n <div class=\"mj-modal-header\">\n <div class=\"modal-title-wrap\">\n <div class=\"row-icon-badge\" [class]=\"getItemColorClass(previewItem)\">\n <i [class]=\"getItemIcon(previewItem)\"></i>\n </div>\n <div>\n <h3 class=\"modal-title\">{{ previewItem.name }}</h3>\n <span class=\"modal-subtitle\">{{ formatFileSize(previewItem.size) }} • {{ formatDate(previewItem.lastModified) }}</span>\n </div>\n </div>\n <div class=\"modal-header-actions\">\n <button\n type=\"button\"\n class=\"mj-action-btn mj-action-btn--secondary\"\n (click)=\"downloadFile(previewItem)\"\n title=\"Download file\">\n <i class=\"fa-solid fa-download\"></i>\n <span>Download</span>\n </button>\n <button\n type=\"button\"\n class=\"modal-close-btn\"\n (click)=\"closePreview()\"\n title=\"Close preview\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n </div>\n\n <div class=\"preview-modal-body\">\n @if (isLoadingPreview) {\n <div class=\"preview-loading\">\n <mj-loading text=\"Loading preview...\"></mj-loading>\n </div>\n } @else if (previewUrl) {\n @switch (previewMediaType) {\n @case ('image') {\n <div class=\"preview-media-wrap image-preview-wrap\">\n <img [src]=\"previewUrl\" [alt]=\"previewItem.name\" class=\"preview-img\" />\n </div>\n }\n @case ('pdf') {\n <div class=\"preview-media-wrap pdf-preview-wrap\">\n <iframe [src]=\"previewUrl\" class=\"preview-iframe\" title=\"PDF Preview\"></iframe>\n </div>\n }\n @case ('video') {\n <div class=\"preview-media-wrap video-preview-wrap\">\n <video [src]=\"previewUrl\" controls autoplay class=\"preview-video\"></video>\n </div>\n }\n @case ('audio') {\n <div class=\"preview-media-wrap audio-preview-wrap\">\n <i class=\"fa-solid fa-music preview-audio-icon\"></i>\n <audio [src]=\"previewUrl\" controls class=\"preview-audio\"></audio>\n </div>\n }\n @default {\n <div class=\"preview-fallback\">\n <i [class]=\"getItemIcon(previewItem)\" class=\"preview-fallback-icon\"></i>\n <h4>{{ previewItem.name }}</h4>\n <p>Preview is not supported for this file type.</p>\n <button\n type=\"button\"\n class=\"mj-action-btn mj-action-btn--primary\"\n (click)=\"downloadFile(previewItem)\">\n <i class=\"fa-solid fa-download\"></i>\n <span>Download File</span>\n </button>\n </div>\n }\n }\n } @else {\n <div class=\"preview-fallback\">\n <i class=\"fa-solid fa-triangle-exclamation preview-fallback-icon\"></i>\n <h4>Preview unavailable</h4>\n <p>Could not generate a preview link for this file.</p>\n <button\n type=\"button\"\n class=\"mj-action-btn mj-action-btn--primary\"\n (click)=\"downloadFile(previewItem)\">\n <i class=\"fa-solid fa-download\"></i>\n <span>Download File</span>\n </button>\n </div>\n }\n </div>\n </div>\n </div>\n}\n\n<!-- New Folder Modal -->\n@if (showNewFolderDialog) {\n <div class=\"mj-modal-backdrop modal-overlay\" (click)=\"onCancelNewFolder()\">\n <div class=\"mj-modal-window modal-compact modal-dialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"mj-modal-header modal-header\">\n <h3 class=\"modal-title\">Create New Folder</h3>\n <button type=\"button\" class=\"modal-close-btn modal-close\" (click)=\"onCancelNewFolder()\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n <div class=\"mj-modal-body modal-body\">\n <label class=\"form-label\">Folder name:</label>\n <input\n type=\"text\"\n class=\"form-input\"\n [(ngModel)]=\"newFolderName\"\n [disabled]=\"isCreatingFolder\"\n placeholder=\"Enter folder name\"\n (keydown.enter)=\"onCreateFolder()\"\n autofocus />\n </div>\n <div class=\"mj-modal-footer modal-footer\">\n <button\n type=\"button\"\n class=\"mj-action-btn mj-action-btn--secondary\"\n (click)=\"onCancelNewFolder()\"\n [disabled]=\"isCreatingFolder\">\n Cancel\n </button>\n <button\n type=\"button\"\n class=\"mj-action-btn mj-action-btn--primary\"\n (click)=\"onCreateFolder()\"\n [disabled]=\"!newFolderName.trim() || isCreatingFolder\">\n @if (isCreatingFolder) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n }\n <span>{{ isCreatingFolder ? 'Creating...' : 'Create' }}</span>\n </button>\n </div>\n </div>\n </div>\n}\n\n<!-- Delete Confirmation Modal -->\n@if (showDeleteDialog && itemToDelete) {\n <div class=\"mj-modal-backdrop modal-overlay\" (click)=\"onCancelDelete()\">\n <div class=\"mj-modal-window modal-compact modal-dialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"mj-modal-header modal-header\">\n <h3 class=\"modal-title\">Delete {{ itemToDelete.type === 'folder' ? 'Folder' : 'File' }}?</h3>\n <button type=\"button\" class=\"modal-close-btn modal-close\" (click)=\"onCancelDelete()\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n <div class=\"mj-modal-body modal-body\">\n <p class=\"modal-body-text\">\n Are you sure you want to delete <strong>{{ itemToDelete.name }}</strong>?\n </p>\n @if (itemToDelete.type === 'folder') {\n <div class=\"modal-warning-banner warning\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n <span>This will delete the folder and all its contents.</span>\n </div>\n }\n </div>\n <div class=\"mj-modal-footer modal-footer\">\n <button\n type=\"button\"\n class=\"mj-action-btn mj-action-btn--secondary\"\n (click)=\"onCancelDelete()\"\n [disabled]=\"isDeleting\">\n Cancel\n </button>\n <button\n type=\"button\"\n class=\"mj-action-btn mj-action-btn--danger danger\"\n (click)=\"onConfirmDelete()\"\n [disabled]=\"isDeleting\">\n @if (isDeleting) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n }\n <span>{{ isDeleting ? 'Deleting...' : 'Delete' }}</span>\n </button>\n </div>\n </div>\n </div>\n}\n\n<!-- Rename Modal -->\n@if (showRenameDialog && itemToRename) {\n <div class=\"mj-modal-backdrop modal-overlay\" (click)=\"onCancelRename()\">\n <div class=\"mj-modal-window modal-compact modal-dialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"mj-modal-header modal-header\">\n <h3 class=\"modal-title\">Rename {{ itemToRename.type === 'folder' ? 'Folder' : 'File' }}</h3>\n <button type=\"button\" class=\"modal-close-btn modal-close\" (click)=\"onCancelRename()\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n <div class=\"mj-modal-body modal-body\">\n <label class=\"form-label\">New name:</label>\n <input\n type=\"text\"\n class=\"form-input\"\n [(ngModel)]=\"newItemName\"\n [disabled]=\"isRenaming\"\n placeholder=\"Enter new name\"\n (keydown.enter)=\"onConfirmRename()\"\n autofocus />\n </div>\n <div class=\"mj-modal-footer modal-footer\">\n <button\n type=\"button\"\n class=\"mj-action-btn mj-action-btn--secondary\"\n (click)=\"onCancelRename()\"\n [disabled]=\"isRenaming\">\n Cancel\n </button>\n <button\n type=\"button\"\n class=\"mj-action-btn mj-action-btn--primary\"\n (click)=\"onConfirmRename()\"\n [disabled]=\"isRenaming || !newItemName.trim()\">\n @if (isRenaming) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n }\n <span>{{ isRenaming ? 'Renaming...' : 'Rename' }}</span>\n </button>\n </div>\n </div>\n </div>\n}\n\n<!-- Copy Modal -->\n@if (showCopyDialog && itemToCopy) {\n <div class=\"mj-modal-backdrop\" (click)=\"onCancelCopy()\">\n <div class=\"mj-modal-window modal-compact\" (click)=\"$event.stopPropagation()\">\n <div class=\"mj-modal-header\">\n <h3 class=\"modal-title\">Copy {{ itemToCopy.type === 'folder' ? 'Folder' : 'File' }}</h3>\n <button type=\"button\" class=\"modal-close-btn\" (click)=\"onCancelCopy()\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n <div class=\"mj-modal-body\">\n <p class=\"modal-body-text\">Copying <strong>{{ itemToCopy.name }}</strong></p>\n <label class=\"form-label\">Destination Path</label>\n <input\n type=\"text\"\n class=\"form-input\"\n [(ngModel)]=\"copyDestinationPath\"\n [disabled]=\"isCopying\"\n placeholder=\"path/to/destination\"\n (keydown.enter)=\"onConfirmCopy()\" />\n </div>\n <div class=\"mj-modal-footer\">\n <button\n type=\"button\"\n class=\"mj-action-btn mj-action-btn--secondary\"\n (click)=\"onCancelCopy()\"\n [disabled]=\"isCopying\">\n Cancel\n </button>\n <button\n type=\"button\"\n class=\"mj-action-btn mj-action-btn--primary\"\n (click)=\"onConfirmCopy()\"\n [disabled]=\"isCopying || !copyDestinationPath.trim()\">\n @if (isCopying) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n }\n <span>{{ isCopying ? 'Copying...' : 'Copy' }}</span>\n </button>\n </div>\n </div>\n </div>\n}\n\n<!-- Move Modal -->\n@if (showMoveDialog && itemToMove) {\n <div class=\"mj-modal-backdrop\" (click)=\"onCancelMove()\">\n <div class=\"mj-modal-window modal-compact\" (click)=\"$event.stopPropagation()\">\n <div class=\"mj-modal-header\">\n <h3 class=\"modal-title\">Move {{ itemToMove.type === 'folder' ? 'Folder' : 'File' }}</h3>\n <button type=\"button\" class=\"modal-close-btn\" (click)=\"onCancelMove()\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n <div class=\"mj-modal-body\">\n <p class=\"modal-body-text\">Moving <strong>{{ itemToMove.name }}</strong></p>\n <label class=\"form-label\">Destination Folder</label>\n <input\n type=\"text\"\n class=\"form-input\"\n [(ngModel)]=\"moveDestinationPath\"\n [disabled]=\"isMoving\"\n placeholder=\"destination/folder/\"\n (keydown.enter)=\"onConfirmMove()\" />\n </div>\n <div class=\"mj-modal-footer\">\n <button\n type=\"button\"\n class=\"mj-action-btn mj-action-btn--secondary\"\n (click)=\"onCancelMove()\"\n [disabled]=\"isMoving\">\n Cancel\n </button>\n <button\n type=\"button\"\n class=\"mj-action-btn mj-action-btn--primary\"\n (click)=\"onConfirmMove()\"\n [disabled]=\"isMoving || !moveDestinationPath.trim()\">\n @if (isMoving) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n }\n <span>{{ isMoving ? 'Moving...' : 'Move' }}</span>\n </button>\n </div>\n </div>\n </div>\n}\n\n<!-- Copy to Account Modal -->\n@if (showCopyToProviderDialog && itemToCopyToProvider) {\n <div class=\"mj-modal-backdrop\" (click)=\"onCancelCopyToAccount()\">\n <div class=\"mj-modal-window\" (click)=\"$event.stopPropagation()\">\n <div class=\"mj-modal-header\">\n <h3 class=\"modal-title\">Copy to Another Account</h3>\n <button type=\"button\" class=\"modal-close-btn\" (click)=\"onCancelCopyToAccount()\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n <div class=\"mj-modal-body\">\n <p class=\"modal-body-text\">\n Copying <strong>{{ itemToCopyToProvider.name }}</strong> from <strong>{{ account?.account?.Name }}</strong>\n </p>\n\n <label class=\"form-label\">Select Destination Storage Accounts</label>\n <div class=\"account-picker-list\">\n @for (a of availableAccounts; track a.account.ID) {\n <label class=\"account-picker-item\" [for]=\"'dest-acc-' + a.account.ID\">\n <input\n type=\"checkbox\"\n [id]=\"'dest-acc-' + a.account.ID\"\n [checked]=\"isDestinationAccountSelected(a.account.ID)\"\n [disabled]=\"isCopyingToAccount\"\n (change)=\"toggleDestinationAccount(a.account.ID)\" />\n <span class=\"picker-name\">{{ a.account.Name }}</span>\n <span class=\"picker-badge\">{{ a.provider.Name }}</span>\n </label>\n }\n </div>\n\n <label class=\"form-label\" style=\"margin-top: 14px;\">Destination Filename</label>\n <input\n type=\"text\"\n class=\"form-input\"\n [(ngModel)]=\"copyToAccountDestinationPath\"\n [disabled]=\"isCopyingToAccount\"\n placeholder=\"Filename\"\n (keydown.enter)=\"onConfirmCopyToAccount()\" />\n\n @if (copyToAccountProgress) {\n <div class=\"copy-progress-indicator\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n <span>Copying to {{ copyToAccountProgress.currentAccount }} ({{ copyToAccountProgress.current }}/{{ copyToAccountProgress.total }})...</span>\n </div>\n }\n </div>\n <div class=\"mj-modal-footer\">\n <button\n type=\"button\"\n class=\"mj-action-btn mj-action-btn--secondary\"\n (click)=\"onCancelCopyToAccount()\"\n [disabled]=\"isCopyingToAccount\">\n Cancel\n </button>\n <button\n type=\"button\"\n class=\"mj-action-btn mj-action-btn--primary\"\n (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 <span>{{ isCopyingToAccount ? 'Copying...' : 'Copy to ' + selectedDestinationAccounts.size + ' Account' + (selectedDestinationAccounts.size !== 1 ? 's' : '') }}</span>\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, ChangeDetectorRef, inject } from '@angular/core';\nimport { GraphQLDataProvider, GraphQLFileStorageClient } from '@memberjunction/graphql-dataprovider';\nimport { FileStorageEngineBase, StorageAccountWithProvider } from '@memberjunction/core-entities';\nimport { UUIDsEqual } from '@memberjunction/global';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\n\n/**\n * Represents a file or folder item in the grid\n */\nexport interface FileGridItem {\n Key: string;\n name: string; // case-violation-ok-legacy-back-compat: the old name is also read off a value typed `any`, where a rename would compile and silently return undefined\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; // case-violation-ok-legacy-back-compat: the old name is also read off a value typed `any`, where a rename would compile and silently return undefined\n name: string; // case-violation-ok-legacy-back-compat: the old name is also read off a value typed `any`, where a rename would compile and silently return undefined\n size: number; // case-violation-ok-legacy-back-compat: renaming it broke a use the checker could not see from the declaration — the compile proved it\n contentType: string; // case-violation-ok-legacy-back-compat: renaming it broke a use the checker could not see from the declaration — the compile proved it\n lastModified: string; // case-violation-ok-legacy-back-compat: renaming it broke a use the checker could not see from the declaration — the compile proved it\n relevance?: number; // case-violation-ok-legacy-back-compat: renaming it broke a use the checker could not see from the declaration — the compile proved it\n excerpt?: string; // case-violation-ok-legacy-back-compat: renaming it broke a use the checker could not see from the declaration — the compile proved it\n matchInFilename?: boolean; // case-violation-ok-legacy-back-compat: renaming it broke a use the checker could not see from the declaration — the compile proved it\n objectId?: string; // case-violation-ok-legacy-back-compat: renaming it broke a use the checker could not see from the declaration — the compile proved it\n}\n\n/**\n * Search results from a single account\n */\nexport interface AccountSearchResult {\n accountID: string; // case-violation-ok-legacy-back-compat: renaming it broke a use the checker could not see from the declaration — the compile proved it\n accountName: string; // case-violation-ok-legacy-back-compat: renaming it broke a use the checker could not see from the declaration — the compile proved it\n success: boolean; // case-violation-ok-legacy-back-compat: the old name is also read off a value typed `any`, where a rename would compile and silently return undefined\n errorMessage?: string; // case-violation-ok-legacy-back-compat: renaming it broke a use the checker could not see from the declaration — the compile proved it\n results: FileSearchResultItem[]; // case-violation-ok-legacy-back-compat: renaming it broke a use the checker could not see from the declaration — the compile proved it\n totalMatches?: number; // case-violation-ok-legacy-back-compat: renaming it broke a use the checker could not see from the declaration — the compile proved it\n hasMore: boolean; // case-violation-ok-legacy-back-compat: renaming it broke a use the checker could not see from the declaration — the compile proved it\n nextPageToken?: string; // case-violation-ok-legacy-back-compat: renaming it broke a use the checker could not see from the declaration — the compile proved it\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 /** @deprecated Use {@link Account}. */\n @Input() set account(value: StorageAccountWithProvider | null) {\n this.Account = value;\n }\n /** @deprecated Use {@link Account}. */\n get account(): StorageAccountWithProvider | null {\n return this.Account;\n }\n\n /**\n * The current folder path to display\n */\n @Input() FolderPath: string = '';\n\n /** @deprecated Use {@link FolderPath}. */\n @Input() set folderPath(value: string) {\n this.FolderPath = value;\n }\n /** @deprecated Use {@link FolderPath}. */\n get folderPath(): string {\n return this.FolderPath;\n }\n\n /**\n * Emits when a folder is double-clicked for navigation\n */\n @Output() FolderNavigate = new EventEmitter<string>();\n\n /**\n * @deprecated Use {@link FolderNavigate}.\n *\n * The same emitter under the old binding name, so a template still binding\n * (folderNavigate) keeps working. Must stay AFTER FolderNavigate: class fields\n * initialise in order, and the other way round this captures undefined.\n */\n @Output() folderNavigate = this.FolderNavigate;\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 * @deprecated Use {@link FolderStructureChanged}.\n *\n * The same emitter under the old binding name, so a template still binding\n * (folderStructureChanged) keeps working. Must stay AFTER FolderStructureChanged: class fields\n * initialise in order, and the other way round this captures undefined.\n */\n @Output() folderStructureChanged = this.FolderStructureChanged;\n\n /**\n * List of files and folders in the current directory\n */\n public Items: FileGridItem[] = [];\n\n /** @deprecated Use {@link Items}. */\n public get items(): FileGridItem[] {\n return this.Items;\n }\n /** @deprecated Use {@link Items}. */\n public set items(value: FileGridItem[]) {\n this.Items = value;\n }\n\n /**\n * Currently selected item keys in the grid (Kendo stores keys, not full objects)\n */\n public SelectedItems: string[] = [];\n\n /** @deprecated Use {@link SelectedItems}. */\n public get selectedItems(): string[] {\n return this.SelectedItems;\n }\n /** @deprecated Use {@link SelectedItems}. */\n public set selectedItems(value: string[]) {\n this.SelectedItems = value;\n }\n\n private cdr = inject(ChangeDetectorRef);\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 /** @deprecated Use {@link ViewMode}. */\n public get viewMode(): 'grid' | 'list' {\n return this.ViewMode;\n }\n /** @deprecated Use {@link ViewMode}. */\n public set viewMode(value: 'grid' | 'list') {\n this.ViewMode = value;\n }\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 /** @deprecated Use {@link Sort}. */\n public get sort(): Array<{ field: string; dir?: 'asc' | 'desc' }> {\n return this.Sort;\n }\n /** @deprecated Use {@link Sort}. */\n public set sort(value: Array<{ field: string; dir?: 'asc' | 'desc' }>) {\n this.Sort = value;\n }\n\n /**\n * Search query for filtering files/folders\n */\n public SearchQuery: string = '';\n\n /** @deprecated Use {@link SearchQuery}. */\n public get searchQuery(): string {\n return this.SearchQuery;\n }\n /** @deprecated Use {@link SearchQuery}. */\n public set searchQuery(value: string) {\n this.SearchQuery = value;\n }\n\n /**\n * File type filter ('all', 'files', 'folders')\n */\n public FileTypeFilter: 'all' | 'files' | 'folders' = 'all';\n\n /** @deprecated Use {@link FileTypeFilter}. */\n public get fileTypeFilter(): 'all' | 'files' | 'folders' {\n return this.FileTypeFilter;\n }\n /** @deprecated Use {@link FileTypeFilter}. */\n public set fileTypeFilter(value: 'all' | 'files' | 'folders') {\n this.FileTypeFilter = value;\n }\n\n /**\n * Filtered list of items based on search and filter criteria\n */\n public FilteredItems: FileGridItem[] = [];\n\n /** @deprecated Use {@link FilteredItems}. */\n public get filteredItems(): FileGridItem[] {\n return this.FilteredItems;\n }\n /** @deprecated Use {@link FilteredItems}. */\n public set filteredItems(value: FileGridItem[]) {\n this.FilteredItems = value;\n }\n\n /**\n * Drag-and-drop state\n */\n public IsDragging: boolean = false;\n\n /** @deprecated Use {@link IsDragging}. */\n public get isDragging(): boolean {\n return this.IsDragging;\n }\n /** @deprecated Use {@link IsDragging}. */\n public set isDragging(value: boolean) {\n this.IsDragging = value;\n }\n\n /**\n * Upload progress state\n */\n public IsUploading: boolean = false;\n\n /** @deprecated Use {@link IsUploading}. */\n public get isUploading(): boolean {\n return this.IsUploading;\n }\n /** @deprecated Use {@link IsUploading}. */\n public set isUploading(value: boolean) {\n this.IsUploading = value;\n }\n public UploadProgress: number = 0;\n\n /** @deprecated Use {@link UploadProgress}. */\n public get uploadProgress(): number {\n return this.UploadProgress;\n }\n /** @deprecated Use {@link UploadProgress}. */\n public set uploadProgress(value: number) {\n this.UploadProgress = value;\n }\n public UploadingFileName: string = '';\n\n /** @deprecated Use {@link UploadingFileName}. */\n public get uploadingFileName(): string {\n return this.UploadingFileName;\n }\n /** @deprecated Use {@link UploadingFileName}. */\n public set uploadingFileName(value: string) {\n this.UploadingFileName = value;\n }\n\n /**\n * New folder dialog state\n */\n public ShowNewFolderDialog: boolean = false;\n\n /** @deprecated Use {@link ShowNewFolderDialog}. */\n public get showNewFolderDialog(): boolean {\n return this.ShowNewFolderDialog;\n }\n /** @deprecated Use {@link ShowNewFolderDialog}. */\n public set showNewFolderDialog(value: boolean) {\n this.ShowNewFolderDialog = value;\n }\n public NewFolderName: string = '';\n\n /** @deprecated Use {@link NewFolderName}. */\n public get newFolderName(): string {\n return this.NewFolderName;\n }\n /** @deprecated Use {@link NewFolderName}. */\n public set newFolderName(value: string) {\n this.NewFolderName = value;\n }\n public IsCreatingFolder: boolean = false;\n\n /** @deprecated Use {@link IsCreatingFolder}. */\n public get isCreatingFolder(): boolean {\n return this.IsCreatingFolder;\n }\n /** @deprecated Use {@link IsCreatingFolder}. */\n public set isCreatingFolder(value: boolean) {\n this.IsCreatingFolder = value;\n }\n\n /**\n * Delete confirmation dialog state\n */\n public showDeleteDialog: boolean = false;\n public ItemToDelete: FileGridItem | null = null;\n\n /** @deprecated Use {@link ItemToDelete}. */\n public get itemToDelete(): FileGridItem | null {\n return this.ItemToDelete;\n }\n /** @deprecated Use {@link ItemToDelete}. */\n public set itemToDelete(value: FileGridItem | null) {\n this.ItemToDelete = value;\n }\n public IsDeleting: boolean = false;\n\n /** @deprecated Use {@link IsDeleting}. */\n public get isDeleting(): boolean {\n return this.IsDeleting;\n }\n /** @deprecated Use {@link IsDeleting}. */\n public set isDeleting(value: boolean) {\n this.IsDeleting = value;\n }\n\n /**\n * Rename dialog state\n */\n public ShowRenameDialog: boolean = false;\n\n /** @deprecated Use {@link ShowRenameDialog}. */\n public get showRenameDialog(): boolean {\n return this.ShowRenameDialog;\n }\n /** @deprecated Use {@link ShowRenameDialog}. */\n public set showRenameDialog(value: boolean) {\n this.ShowRenameDialog = value;\n }\n public ItemToRename: FileGridItem | null = null;\n\n /** @deprecated Use {@link ItemToRename}. */\n public get itemToRename(): FileGridItem | null {\n return this.ItemToRename;\n }\n /** @deprecated Use {@link ItemToRename}. */\n public set itemToRename(value: FileGridItem | null) {\n this.ItemToRename = value;\n }\n public NewItemName: string = '';\n\n /** @deprecated Use {@link NewItemName}. */\n public get newItemName(): string {\n return this.NewItemName;\n }\n /** @deprecated Use {@link NewItemName}. */\n public set newItemName(value: string) {\n this.NewItemName = value;\n }\n public IsRenaming: boolean = false;\n\n /** @deprecated Use {@link IsRenaming}. */\n public get isRenaming(): boolean {\n return this.IsRenaming;\n }\n /** @deprecated Use {@link IsRenaming}. */\n public set isRenaming(value: boolean) {\n this.IsRenaming = value;\n }\n\n /**\n * Copy dialog state\n */\n public ShowCopyDialog: boolean = false;\n\n /** @deprecated Use {@link ShowCopyDialog}. */\n public get showCopyDialog(): boolean {\n return this.ShowCopyDialog;\n }\n /** @deprecated Use {@link ShowCopyDialog}. */\n public set showCopyDialog(value: boolean) {\n this.ShowCopyDialog = value;\n }\n public ItemToCopy: FileGridItem | null = null;\n\n /** @deprecated Use {@link ItemToCopy}. */\n public get itemToCopy(): FileGridItem | null {\n return this.ItemToCopy;\n }\n /** @deprecated Use {@link ItemToCopy}. */\n public set itemToCopy(value: FileGridItem | null) {\n this.ItemToCopy = value;\n }\n public CopyDestinationPath: string = '';\n\n /** @deprecated Use {@link CopyDestinationPath}. */\n public get copyDestinationPath(): string {\n return this.CopyDestinationPath;\n }\n /** @deprecated Use {@link CopyDestinationPath}. */\n public set copyDestinationPath(value: string) {\n this.CopyDestinationPath = value;\n }\n public IsCopying: boolean = false;\n\n /** @deprecated Use {@link IsCopying}. */\n public get isCopying(): boolean {\n return this.IsCopying;\n }\n /** @deprecated Use {@link IsCopying}. */\n public set isCopying(value: boolean) {\n this.IsCopying = value;\n }\n\n /**\n * Move dialog state\n */\n public ShowMoveDialog: boolean = false;\n\n /** @deprecated Use {@link ShowMoveDialog}. */\n public get showMoveDialog(): boolean {\n return this.ShowMoveDialog;\n }\n /** @deprecated Use {@link ShowMoveDialog}. */\n public set showMoveDialog(value: boolean) {\n this.ShowMoveDialog = value;\n }\n public ItemToMove: FileGridItem | null = null;\n\n /** @deprecated Use {@link ItemToMove}. */\n public get itemToMove(): FileGridItem | null {\n return this.ItemToMove;\n }\n /** @deprecated Use {@link ItemToMove}. */\n public set itemToMove(value: FileGridItem | null) {\n this.ItemToMove = value;\n }\n public MoveDestinationPath: string = '';\n\n /** @deprecated Use {@link MoveDestinationPath}. */\n public get moveDestinationPath(): string {\n return this.MoveDestinationPath;\n }\n /** @deprecated Use {@link MoveDestinationPath}. */\n public set moveDestinationPath(value: string) {\n this.MoveDestinationPath = value;\n }\n public IsMoving: boolean = false;\n\n /** @deprecated Use {@link IsMoving}. */\n public get isMoving(): boolean {\n return this.IsMoving;\n }\n /** @deprecated Use {@link IsMoving}. */\n public set isMoving(value: boolean) {\n this.IsMoving = value;\n }\n\n /**\n * Copy to provider dialog state\n */\n public ShowCopyToProviderDialog: boolean = false;\n\n /** @deprecated Use {@link ShowCopyToProviderDialog}. */\n public get showCopyToProviderDialog(): boolean {\n return this.ShowCopyToProviderDialog;\n }\n /** @deprecated Use {@link ShowCopyToProviderDialog}. */\n public set showCopyToProviderDialog(value: boolean) {\n this.ShowCopyToProviderDialog = value;\n }\n public ItemToCopyToProvider: FileGridItem | null = null;\n\n /** @deprecated Use {@link ItemToCopyToProvider}. */\n public get itemToCopyToProvider(): FileGridItem | null {\n return this.ItemToCopyToProvider;\n }\n /** @deprecated Use {@link ItemToCopyToProvider}. */\n public set itemToCopyToProvider(value: FileGridItem | null) {\n this.ItemToCopyToProvider = value;\n }\n public AvailableAccounts: StorageAccountWithProvider[] = [];\n\n /** @deprecated Use {@link AvailableAccounts}. */\n public get availableAccounts(): StorageAccountWithProvider[] {\n return this.AvailableAccounts;\n }\n /** @deprecated Use {@link AvailableAccounts}. */\n public set availableAccounts(value: StorageAccountWithProvider[]) {\n this.AvailableAccounts = value;\n }\n public SelectedDestinationAccounts: Set<string> = new Set();\n\n /** @deprecated Use {@link SelectedDestinationAccounts}. */\n public get selectedDestinationAccounts(): Set<string> {\n return this.SelectedDestinationAccounts;\n }\n /** @deprecated Use {@link SelectedDestinationAccounts}. */\n public set selectedDestinationAccounts(value: Set<string>) {\n this.SelectedDestinationAccounts = value;\n }\n public CopyToAccountDestinationPath: string = '';\n\n /** @deprecated Use {@link CopyToAccountDestinationPath}. */\n public get copyToAccountDestinationPath(): string {\n return this.CopyToAccountDestinationPath;\n }\n /** @deprecated Use {@link CopyToAccountDestinationPath}. */\n public set copyToAccountDestinationPath(value: string) {\n this.CopyToAccountDestinationPath = value;\n }\n public IsCopyingToAccount: boolean = false;\n\n /** @deprecated Use {@link IsCopyingToAccount}. */\n public get isCopyingToAccount(): boolean {\n return this.IsCopyingToAccount;\n }\n /** @deprecated Use {@link IsCopyingToAccount}. */\n public set isCopyingToAccount(value: boolean) {\n this.IsCopyingToAccount = value;\n }\n public CopyToAccountProgress: { current: number; total: number; currentAccount: string } | null = null;\n\n /** @deprecated Use {@link CopyToAccountProgress}. */\n public get copyToAccountProgress(): { current: number; total: number; currentAccount: string } | null {\n return this.CopyToAccountProgress;\n }\n /** @deprecated Use {@link CopyToAccountProgress}. */\n public set copyToAccountProgress(value: { current: number; total: number; currentAccount: string } | null) {\n this.CopyToAccountProgress = value;\n }\n\n /**\n * Multi-provider search state\n */\n public IsMultiProviderSearchMode: boolean = false;\n\n /** @deprecated Use {@link IsMultiProviderSearchMode}. */\n public get isMultiProviderSearchMode(): boolean {\n return this.IsMultiProviderSearchMode;\n }\n /** @deprecated Use {@link IsMultiProviderSearchMode}. */\n public set isMultiProviderSearchMode(value: boolean) {\n this.IsMultiProviderSearchMode = value;\n }\n public MultiProviderSearchQuery: string = '';\n\n /** @deprecated Use {@link MultiProviderSearchQuery}. */\n public get multiProviderSearchQuery(): string {\n return this.MultiProviderSearchQuery;\n }\n /** @deprecated Use {@link MultiProviderSearchQuery}. */\n public set multiProviderSearchQuery(value: string) {\n this.MultiProviderSearchQuery = value;\n }\n public SelectedSearchProviders: Set<string> = new Set();\n\n /** @deprecated Use {@link SelectedSearchProviders}. */\n public get selectedSearchProviders(): Set<string> {\n return this.SelectedSearchProviders;\n }\n /** @deprecated Use {@link SelectedSearchProviders}. */\n public set selectedSearchProviders(value: Set<string>) {\n this.SelectedSearchProviders = value;\n }\n public IsSearching: boolean = false;\n\n /** @deprecated Use {@link IsSearching}. */\n public get isSearching(): boolean {\n return this.IsSearching;\n }\n /** @deprecated Use {@link IsSearching}. */\n public set isSearching(value: boolean) {\n this.IsSearching = value;\n }\n public MultiProviderSearchResults: MultiProviderSearchResult | null = null;\n\n /** @deprecated Use {@link MultiProviderSearchResults}. */\n public get multiProviderSearchResults(): MultiProviderSearchResult | null {\n return this.MultiProviderSearchResults;\n }\n /** @deprecated Use {@link MultiProviderSearchResults}. */\n public set multiProviderSearchResults(value: MultiProviderSearchResult | null) {\n this.MultiProviderSearchResults = value;\n }\n\n /**\n * Preview modal state\n */\n public ShowPreviewModal: boolean = false;\n\n /** @deprecated Use {@link ShowPreviewModal}. */\n public get showPreviewModal(): boolean {\n return this.ShowPreviewModal;\n }\n /** @deprecated Use {@link ShowPreviewModal}. */\n public set showPreviewModal(value: boolean) {\n this.ShowPreviewModal = value;\n }\n public PreviewItem: FileGridItem | null = null;\n\n /** @deprecated Use {@link PreviewItem}. */\n public get previewItem(): FileGridItem | null {\n return this.PreviewItem;\n }\n /** @deprecated Use {@link PreviewItem}. */\n public set previewItem(value: FileGridItem | null) {\n this.PreviewItem = value;\n }\n public PreviewUrl: string | null = null;\n\n /** @deprecated Use {@link PreviewUrl}. */\n public get previewUrl(): string | null {\n return this.PreviewUrl;\n }\n /** @deprecated Use {@link PreviewUrl}. */\n public set previewUrl(value: string | null) {\n this.PreviewUrl = value;\n }\n public IsLoadingPreview: boolean = false;\n\n /** @deprecated Use {@link IsLoadingPreview}. */\n public get isLoadingPreview(): boolean {\n return this.IsLoadingPreview;\n }\n /** @deprecated Use {@link IsLoadingPreview}. */\n public set isLoadingPreview(value: boolean) {\n this.IsLoadingPreview = value;\n }\n public PreviewMediaType: string = 'unknown';\n\n /** @deprecated Use {@link PreviewMediaType}. */\n public get previewMediaType(): string {\n return this.PreviewMediaType;\n }\n /** @deprecated Use {@link PreviewMediaType}. */\n public set previewMediaType(value: string) {\n this.PreviewMediaType = value;\n }\n\n /**\n * GraphQL client for file storage operations\n */\n private storageClient: GraphQLFileStorageClient;\n\n /**\n * Global notifications service for user toast feedback\n */\n protected notifications = inject(MJNotificationService);\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.cdr.detectChanges();\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 this.cdr.detectChanges();\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 /** @deprecated Use {@link OnSearchChange}. */\n public onSearchChange(query: string): void {\n return this.OnSearchChange(query);\n }\n\n /**\n * Clears the search query\n */\n public ClearSearch(): void {\n this.SearchQuery = '';\n this.applyFilters();\n }\n\n /** @deprecated Use {@link ClearSearch}. */\n public clearSearch(): void {\n return this.ClearSearch();\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 /** @deprecated Use {@link OnFileTypeFilterChange}. */\n public onFileTypeFilterChange(filterType: 'all' | 'files' | 'folders'): void {\n return this.OnFileTypeFilterChange(filterType);\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 /** @deprecated Use {@link FormatFileSize}. */\n public formatFileSize(bytes: number): string {\n return this.FormatFileSize(bytes);\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 /** @deprecated Use {@link GetItemIcon}. */\n public getItemIcon(item: FileGridItem): string {\n return this.GetItemIcon(item);\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 /** @deprecated Use {@link OnSelectionChange}. */\n public onSelectionChange(selectedKeys: string[]): void {\n return this.OnSelectionChange(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 /** @deprecated Use {@link OnTileClick}. */\n public onTileClick(item: FileGridItem, event: MouseEvent): void {\n return this.OnTileClick(item, event);\n }\n\n /**\n * Handles double-click on an item\n * For folders, navigate into them. For files, open in-browser preview.\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 // Open in-browser preview\n this.OpenPreview(item);\n }\n }\n\n /** @deprecated Use {@link OnItemDoubleClick}. */\n public onItemDoubleClick(item: FileGridItem): void {\n return this.OnItemDoubleClick(item);\n }\n\n /**\n * Downloads a file by creating a pre-authenticated download URL\n */\n public 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 // Open file in new browser tab for viewing/download\n window.open(downloadUrl, '_blank', 'noopener,noreferrer');\n this.notifications.CreateSimpleNotification(`Opening ${item.name}...`, 'info');\n } else {\n this.notifications.CreateSimpleNotification('Failed to generate download URL', 'error');\n }\n } catch (error) {\n console.error('[FileGrid] Error downloading file:', error);\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n this.notifications.CreateSimpleNotification(`Failed to download ${item.name}: ${errorMessage}`, 'error');\n }\n }\n\n /** @deprecated Use {@link DownloadFile}. */\n public async downloadFile(item: FileGridItem): Promise<void> {\n return this.DownloadFile(item);\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 /** @deprecated Use {@link ToggleViewMode}. */\n public toggleViewMode(): void {\n return this.ToggleViewMode();\n }\n\n /**\n * Refreshes the current directory\n */\n public Refresh(): void {\n this.loadItems();\n }\n\n /** @deprecated Use {@link Refresh}. */\n public refresh(): void {\n return this.Refresh();\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 /** @deprecated Use {@link NavigateUp}. */\n public navigateUp(): void {\n return this.NavigateUp();\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 /** @deprecated Use {@link CanNavigateUp}. */\n public canNavigateUp(): boolean {\n return this.CanNavigateUp();\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 /** @deprecated Use {@link OnSortChange}. */\n public onSortChange(sort: Array<{ field: string; dir?: 'asc' | 'desc' }>): void {\n return this.OnSortChange(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 /** @deprecated Use {@link GetFileType}. */\n public getFileType(item: FileGridItem): string {\n return this.GetFileType(item);\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 /** @deprecated Use {@link OnUploadClick}. */\n public onUploadClick(): void {\n return this.OnUploadClick();\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 /** @deprecated Use {@link OnDragEnter}. */\n public onDragEnter(event: DragEvent): void {\n return this.OnDragEnter(event);\n }\n\n /**\n * Handles drag over event\n */\n public OnDragOver(event: DragEvent): void {\n event.preventDefault();\n event.stopPropagation();\n }\n\n /** @deprecated Use {@link OnDragOver}. */\n public onDragOver(event: DragEvent): void {\n return this.OnDragOver(event);\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 /** @deprecated Use {@link OnDragLeave}. */\n public onDragLeave(event: DragEvent): void {\n return this.OnDragLeave(event);\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 /** @deprecated Use {@link OnDrop}. */\n public onDrop(event: DragEvent): void {\n return this.OnDrop(event);\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 using server-side MJ Storage (supports all providers)\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 let cleanPath = '';\n if (this.FolderPath && this.FolderPath !== '/') {\n cleanPath = this.FolderPath.endsWith('/') ? this.FolderPath.slice(0, -1) : this.FolderPath;\n if (cleanPath.startsWith('/')) {\n cleanPath = cleanPath.substring(1);\n }\n }\n\n console.log('[FileGrid] Uploading file via MJ Storage:', { name: file.name, path: cleanPath });\n const base64Data = await this.readFileAsBase64(file);\n\n const result = await this.storageClient.UploadFile({\n FileName: file.name,\n Base64Data: base64Data,\n MimeType: file.type || 'application/octet-stream',\n AccountID: this.Account.account.ID,\n PathPrefix: cleanPath || undefined,\n });\n\n if (!result.Success) {\n throw new Error(result.ErrorMessage || 'Upload failed');\n }\n\n this.UploadProgress = 100;\n console.log('[FileGrid] File uploaded successfully via MJ Storage:', file.name);\n } catch (error) {\n console.error('[FileGrid] Error uploading file:', error);\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n this.errorMessage = `Failed to upload ${file.name}: ${errorMessage}`;\n\n // Clear error after 5 seconds\n setTimeout(() => {\n if (this.errorMessage?.startsWith('Failed to upload')) {\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 * Reads a browser File object as a base64 encoded string\n */\n private readFileAsBase64(file: File): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => {\n const result = reader.result;\n if (typeof result === 'string') {\n const base64 = result.substring(result.indexOf(',') + 1);\n resolve(base64);\n } else {\n reject(new Error('Failed to read file as base64 string'));\n }\n };\n reader.onerror = (err) => reject(err);\n reader.readAsDataURL(file);\n });\n }\n\n /**\n * Uploads file to the pre-authenticated URL with progress tracking\n */\n private uploadFileToUrl(file: File, url: string, driverKey?: 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 // Provider-specific upload semantics for the pre-authenticated URL:\n // - Dropbox temporary upload links require POST.\n // - Azure Blob \"Put Blob\" requires PUT and the `x-ms-blob-type: BlockBlob` header;\n // without the header Azure rejects the request and the upload silently no-ops.\n // - S3 and other pre-signed-PUT providers require PUT.\n const isDropbox = driverKey === 'Dropbox Storage';\n const isAzure = driverKey === 'Azure Blob Storage';\n xhr.open(isDropbox ? 'POST' : 'PUT', url, true);\n xhr.setRequestHeader('Content-Type', file.type || 'application/octet-stream');\n if (isAzure) {\n xhr.setRequestHeader('x-ms-blob-type', 'BlockBlob');\n }\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 /** @deprecated Use {@link OnNewFolderClick}. */\n public onNewFolderClick(): void {\n return this.OnNewFolderClick();\n }\n\n /**\n * Closes the new folder dialog\n */\n public OnCancelNewFolder(): void {\n this.ShowNewFolderDialog = false;\n this.NewFolderName = '';\n }\n\n /** @deprecated Use {@link OnCancelNewFolder}. */\n public onCancelNewFolder(): void {\n return this.OnCancelNewFolder();\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 const createdName = this.NewFolderName.trim();\n // Close dialog and refresh\n this.ShowNewFolderDialog = false;\n this.NewFolderName = '';\n\n this.notifications.CreateSimpleNotification(`Created folder \"${createdName}\"`, 'success');\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.notifications.CreateSimpleNotification('Failed to create folder', 'error');\n }\n } catch (error) {\n console.error('[FileGrid] Error creating folder:', error);\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n this.notifications.CreateSimpleNotification(`Failed to create folder: ${errorMessage}`, 'error');\n } finally {\n this.IsCreatingFolder = false;\n }\n }\n\n /** @deprecated Use {@link OnCreateFolder}. */\n public async onCreateFolder(): Promise<void> {\n return this.OnCreateFolder();\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 /** @deprecated Use {@link OnDeleteClick}. */\n public onDeleteClick(): void {\n return this.OnDeleteClick();\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 /** @deprecated Use {@link OnCancelDelete}. */\n public onCancelDelete(): void {\n return this.OnCancelDelete();\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 const deletedName = this.ItemToDelete.name;\n\n // Close dialog\n this.showDeleteDialog = false;\n this.ItemToDelete = null;\n\n // Clear selection\n this.SelectedItems = [];\n\n this.notifications.CreateSimpleNotification(`Deleted \"${deletedName}\"`, 'info');\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.notifications.CreateSimpleNotification(`Failed to delete ${this.ItemToDelete.Type}`, 'error');\n }\n } catch (error) {\n console.error('[FileGrid] Error deleting item:', error);\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n this.notifications.CreateSimpleNotification(`Failed to delete: ${errorMessage}`, 'error');\n } finally {\n this.IsDeleting = false;\n }\n }\n\n /** @deprecated Use {@link OnConfirmDelete}. */\n public async onConfirmDelete(): Promise<void> {\n return this.OnConfirmDelete();\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 /** @deprecated Use {@link OnRenameClick}. */\n public onRenameClick(): void {\n return this.OnRenameClick();\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 /** @deprecated Use {@link OnCancelRename}. */\n public onCancelRename(): void {\n return this.OnCancelRename();\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 const oldName = this.ItemToRename.name;\n const newName = this.NewItemName.trim();\n\n // Close dialog\n this.ShowRenameDialog = false;\n this.ItemToRename = null;\n this.NewItemName = '';\n\n // Clear selection\n this.SelectedItems = [];\n\n this.notifications.CreateSimpleNotification(`Renamed \"${oldName}\" to \"${newName}\"`, 'success');\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.notifications.CreateSimpleNotification(`Failed to rename ${this.ItemToRename.Type}`, 'error');\n }\n } catch (error) {\n console.error('[FileGrid] Error renaming item:', error);\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n this.notifications.CreateSimpleNotification(`Failed to rename: ${errorMessage}`, 'error');\n } finally {\n this.IsRenaming = false;\n }\n }\n\n /** @deprecated Use {@link OnConfirmRename}. */\n public async onConfirmRename(): Promise<void> {\n return this.OnConfirmRename();\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.notifications.CreateSimpleNotification('Cannot download folders. Please select a file.', 'warning');\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, opening in new tab');\n window.open(downloadUrl, '_blank', 'noopener,noreferrer');\n this.notifications.CreateSimpleNotification(`Opening ${item.name}...`, 'info');\n } else {\n this.notifications.CreateSimpleNotification('Failed to create download URL', 'error');\n }\n } catch (error) {\n console.error('[FileGrid] Error downloading file:', error);\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n this.notifications.CreateSimpleNotification(`Failed to download: ${errorMessage}`, 'error');\n }\n }\n\n /** @deprecated Use {@link OnDownloadClick}. */\n public async onDownloadClick(): Promise<void> {\n return this.OnDownloadClick();\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 /** @deprecated Use {@link OnCopyClick}. */\n public onCopyClick(): void {\n return this.OnCopyClick();\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 /** @deprecated Use {@link OnCancelCopy}. */\n public onCancelCopy(): void {\n return this.OnCancelCopy();\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 this.notifications.CreateSimpleNotification('Item copied successfully', 'success');\n\n // Refresh the file grid\n this.loadItems();\n } else {\n this.notifications.CreateSimpleNotification('Failed to copy item', 'error');\n }\n } catch (error) {\n console.error('[FileGrid] Error copying item:', error);\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n this.notifications.CreateSimpleNotification(`Failed to copy: ${errorMessage}`, 'error');\n } finally {\n this.IsCopying = false;\n }\n }\n\n /** @deprecated Use {@link OnConfirmCopy}. */\n public async onConfirmCopy(): Promise<void> {\n return this.OnConfirmCopy();\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 /** @deprecated Use {@link OnMoveClick}. */\n public onMoveClick(): void {\n return this.OnMoveClick();\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 /** @deprecated Use {@link OnCancelMove}. */\n public onCancelMove(): void {\n return this.OnCancelMove();\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 this.notifications.CreateSimpleNotification('Item moved successfully', 'success');\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.notifications.CreateSimpleNotification('Failed to move item', 'error');\n }\n } catch (error) {\n console.error('[FileGrid] Error moving item:', error);\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n this.notifications.CreateSimpleNotification(`Failed to move: ${errorMessage}`, 'error');\n } finally {\n this.IsMoving = false;\n }\n }\n\n /** @deprecated Use {@link OnConfirmMove}. */\n public async onConfirmMove(): Promise<void> {\n return this.OnConfirmMove();\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 /** @deprecated Use {@link GetSelectedItem}. */\n public getSelectedItem(): FileGridItem | null {\n return this.GetSelectedItem();\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 = FileStorageEngineBase.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.notifications.CreateSimpleNotification('No other storage accounts available', 'warning');\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.notifications.CreateSimpleNotification('Failed to load storage accounts', 'error');\n }\n }\n\n /** @deprecated Use {@link OnCopyToAccountClick}. */\n public async onCopyToAccountClick(): Promise<void> {\n return this.OnCopyToAccountClick();\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 /** @deprecated Use {@link OnCancelCopyToAccount}. */\n public onCancelCopyToAccount(): void {\n return this.OnCancelCopyToAccount();\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 /** @deprecated Use {@link ToggleDestinationAccount}. */\n public toggleDestinationAccount(accountId: string): void {\n return this.ToggleDestinationAccount(accountId);\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 /** @deprecated Use {@link IsDestinationAccountSelected}. */\n public isDestinationAccountSelected(accountId: string): boolean {\n return this.IsDestinationAccountSelected(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.notifications.CreateSimpleNotification(`Successfully copied to ${successfulCopies.length} account${successfulCopies.length > 1 ? 's' : ''}`, 'success');\n } else if (successfulCopies.length === 0) {\n this.notifications.CreateSimpleNotification(`Copy failed for all accounts: ${failedCopies.map(f => f.account).join(', ')}`, 'error');\n } else {\n this.notifications.CreateSimpleNotification(`Copied to ${successfulCopies.length} account(s). Failed: ${failedCopies.map(f => f.account).join(', ')}`, 'warning');\n }\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.notifications.CreateSimpleNotification(`Copy failed: ${errorMessage}`, 'error');\n } finally {\n this.IsCopyingToAccount = false;\n this.CopyToAccountProgress = null;\n }\n }\n\n /** @deprecated Use {@link OnConfirmCopyToAccount}. */\n public async onConfirmCopyToAccount(): Promise<void> {\n return this.OnConfirmCopyToAccount();\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 /** @deprecated Use {@link ToggleMultiAccountSearchMode}. */\n public toggleMultiAccountSearchMode(): void {\n return this.ToggleMultiAccountSearchMode();\n }\n\n /**\n * Loads available accounts for search selection\n */\n private async loadAvailableAccountsForSearch(): Promise<void> {\n try {\n const engine = FileStorageEngineBase.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 /** @deprecated Use {@link ToggleSearchAccount}. */\n public toggleSearchAccount(accountID: string): void {\n return this.ToggleSearchAccount(accountID);\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 /** @deprecated Use {@link IsAccountSelectedForSearch}. */\n public isAccountSelectedForSearch(accountID: string): boolean {\n return this.IsAccountSelectedForSearch(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 /** @deprecated Use {@link AccountSupportsSearch}. */\n public accountSupportsSearch(accountWithProvider: StorageAccountWithProvider): boolean {\n return this.AccountSupportsSearch(accountWithProvider);\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 /** @deprecated Use {@link ExecuteMultiAccountSearch}. */\n public async executeMultiAccountSearch(): Promise<void> {\n return this.ExecuteMultiAccountSearch();\n }\n\n /**\n * Clears multi-provider search results\n */\n public ClearMultiProviderSearch(): void {\n this.MultiProviderSearchQuery = '';\n this.MultiProviderSearchResults = null;\n }\n\n /** @deprecated Use {@link ClearMultiProviderSearch}. */\n public clearMultiProviderSearch(): void {\n return this.ClearMultiProviderSearch();\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 /** @deprecated Use {@link GetSearchResultIcon}. */\n public getSearchResultIcon(result: FileSearchResultItem): string {\n return this.GetSearchResultIcon(result);\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 /** @deprecated Use {@link FormatSearchResultSize}. */\n public formatSearchResultSize(bytes: number): string {\n return this.FormatSearchResultSize(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\n /** @deprecated Use {@link FormatSearchResultDate}. */\n public formatSearchResultDate(dateStr: string): string {\n return this.FormatSearchResultDate(dateStr);\n }\n\n /**\n * Determines media category for a file item\n */\n public GetMediaType(item: FileGridItem): string {\n const ext = item.name.split('.').pop()?.toLowerCase() || '';\n const mime = item.ContentType?.toLowerCase() || '';\n\n if (mime.startsWith('image/') || ['jpg', 'jpeg', 'png', 'gif', 'webp', 'svg', 'bmp', 'ico'].includes(ext)) {\n return 'image';\n }\n if (mime === 'application/pdf' || ext === 'pdf') {\n return 'pdf';\n }\n if (mime.startsWith('audio/') || ['mp3', 'wav', 'ogg', 'aac', 'flac', 'm4a'].includes(ext)) {\n return 'audio';\n }\n if (mime.startsWith('video/') || ['mp4', 'webm', 'ogg', 'mov', 'avi', 'mkv'].includes(ext)) {\n return 'video';\n }\n if (['json', 'ts', 'js', 'html', 'css', 'scss', 'xml', 'yaml', 'yml', 'md', 'sql', 'py', 'java', 'c', 'cpp'].includes(ext)) {\n return 'code';\n }\n if (mime.startsWith('text/') || ['txt', 'log', 'csv'].includes(ext)) {\n return 'text';\n }\n if (['doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx'].includes(ext)) {\n return 'document';\n }\n return 'unknown';\n }\n\n /** @deprecated Use {@link GetMediaType}. */\n public getMediaType(item: FileGridItem): string {\n return this.GetMediaType(item);\n }\n\n /**\n * Gets specific badge class for media type\n */\n public GetItemColorClass(item: FileGridItem): string {\n if (item.Type === 'folder') {\n return 'mj-file-thumb--folder';\n }\n const mediaType = this.GetMediaType(item);\n return `mj-file-thumb--${mediaType}`;\n }\n\n /** @deprecated Use {@link GetItemColorClass}. */\n public getItemColorClass(item: FileGridItem): string {\n return this.GetItemColorClass(item);\n }\n\n /**\n * Generates clickable path breadcrumbs\n */\n public GetPathBreadcrumbs(): Array<{ name: string; path: string }> {\n const raw = (this.FolderPath || '').trim();\n if (!raw || raw === '/') {\n return [{ name: 'Root', path: '/' }];\n }\n const clean = raw.startsWith('/') ? raw.substring(1) : raw;\n const parts = clean.split('/').filter((p) => p.trim().length > 0);\n const crumbs: Array<{ name: string; path: string }> = [\n { name: 'Root', path: '/' },\n ];\n let currentPath = '';\n for (const part of parts) {\n currentPath += '/' + part;\n crumbs.push({ name: part, path: currentPath });\n }\n return crumbs;\n }\n\n /** @deprecated Use {@link GetPathBreadcrumbs}. */\n public getPathBreadcrumbs(): Array<{ name: string; path: string }> {\n return this.GetPathBreadcrumbs();\n }\n\n /**\n * Navigates to a specific breadcrumb path\n */\n public NavigateToBreadcrumb(path: string): void {\n this.FolderNavigate.emit(path);\n }\n\n /** @deprecated Use {@link NavigateToBreadcrumb}. */\n public navigateToBreadcrumb(path: string): void {\n return this.NavigateToBreadcrumb(path);\n }\n\n /**\n * Toggles selection of a file/folder item\n */\n public ToggleItemSelection(item: FileGridItem, event?: Event): void {\n if (event) {\n event.stopPropagation();\n }\n const idx = this.SelectedItems.indexOf(item.Key);\n if (idx >= 0) {\n this.SelectedItems = this.SelectedItems.filter((k) => k !== item.Key);\n } else {\n this.SelectedItems = [...this.SelectedItems, item.Key];\n }\n this.cdr.markForCheck();\n }\n\n /** @deprecated Use {@link ToggleItemSelection}. */\n public toggleItemSelection(item: FileGridItem, event?: Event): void {\n return this.ToggleItemSelection(item, event);\n }\n\n /**\n * Selects all current filtered items\n */\n public SelectAll(): void {\n this.SelectedItems = this.FilteredItems.map((i) => i.Key);\n this.cdr.markForCheck();\n }\n\n /** @deprecated Use {@link SelectAll}. */\n public selectAll(): void {\n return this.SelectAll();\n }\n\n /**\n * Clears selection\n */\n public DeselectAll(): void {\n this.SelectedItems = [];\n this.cdr.markForCheck();\n }\n\n /** @deprecated Use {@link DeselectAll}. */\n public deselectAll(): void {\n return this.DeselectAll();\n }\n\n /**\n * Checks if all items are selected\n */\n public AreAllSelected(): boolean {\n return (\n this.FilteredItems.length > 0 &&\n this.SelectedItems.length === this.FilteredItems.length\n );\n }\n\n /** @deprecated Use {@link AreAllSelected}. */\n public areAllSelected(): boolean {\n return this.AreAllSelected();\n }\n\n /**\n * Opens in-browser preview modal\n */\n public async OpenPreview(item: FileGridItem): Promise<void> {\n if (item.Type === 'folder' || !this.Account) {\n return;\n }\n\n this.PreviewItem = item;\n this.PreviewMediaType = this.GetMediaType(item);\n this.ShowPreviewModal = true;\n this.IsLoadingPreview = true;\n this.PreviewUrl = null;\n this.cdr.markForCheck();\n\n try {\n const itemPath = this.constructItemPath(item);\n const url = await this.storageClient.CreatePreAuthDownloadUrl(\n this.Account.account.ID,\n itemPath\n );\n this.PreviewUrl = url;\n } catch (err) {\n console.error('[FileGrid] Preview error:', err);\n } finally {\n this.IsLoadingPreview = false;\n this.cdr.markForCheck();\n }\n }\n\n /** @deprecated Use {@link OpenPreview}. */\n public async openPreview(item: FileGridItem): Promise<void> {\n return this.OpenPreview(item);\n }\n\n /**\n * Closes the preview modal\n */\n public ClosePreview(): void {\n this.ShowPreviewModal = false;\n this.PreviewItem = null;\n this.PreviewUrl = null;\n this.IsLoadingPreview = false;\n this.cdr.markForCheck();\n }\n\n /** @deprecated Use {@link ClosePreview}. */\n public closePreview(): void {\n return this.ClosePreview();\n }\n}","<div class=\"file-grid-container\"\n (dragenter)=\"onDragEnter($event)\"\n (dragover)=\"onDragOver($event)\"\n (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDrop($event)\">\n\n <!-- Top Command Bar: Breadcrumbs & Primary Actions -->\n @if (!isLoading && !errorMessage) {\n <div class=\"command-bar breadcrumb-bar\">\n <!-- Left: Breadcrumb Navigation Trail -->\n <div class=\"command-bar-left\">\n <div class=\"nav-btn-group nav-buttons\">\n <button\n type=\"button\"\n class=\"mj-tool-btn 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\n type=\"button\"\n class=\"mj-tool-btn nav-btn\"\n (click)=\"refresh()\"\n title=\"Refresh current folder\">\n <i class=\"fa-solid fa-arrows-rotate\"></i>\n </button>\n </div>\n\n <nav class=\"breadcrumb-trail breadcrumb-path\" aria-label=\"Folder Path\">\n <i class=\"fa-solid fa-folder-open trail-root-icon\"></i>\n @for (crumb of getPathBreadcrumbs(); track crumb.path; let last = $last) {\n <button\n type=\"button\"\n class=\"crumb-btn\"\n [class.current]=\"last\"\n (click)=\"navigateToBreadcrumb(crumb.path)\"\n [title]=\"crumb.name\">\n {{ crumb.name }}\n </button>\n @if (!last) {\n <span class=\"crumb-separator\">/</span>\n }\n }\n </nav>\n </div>\n\n <!-- Right: Search, Filter, View Mode & Action Buttons -->\n <div class=\"command-bar-right\">\n <!-- Search & Filter Bar -->\n <div class=\"search-pill search-bar\">\n <i class=\"fa-solid fa-magnifying-glass search-icon\"></i>\n <input\n type=\"text\"\n class=\"search-input\"\n [(ngModel)]=\"searchQuery\"\n (ngModelChange)=\"onSearchChange($event)\"\n placeholder=\"Search files...\"\n [disabled]=\"isLoading || isMultiProviderSearchMode\" />\n @if (searchQuery && !isMultiProviderSearchMode) {\n <button\n type=\"button\"\n class=\"search-clear-btn\"\n (click)=\"clearSearch()\"\n title=\"Clear search\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n }\n <select\n class=\"type-filter-select file-type-filter\"\n [(ngModel)]=\"fileTypeFilter\"\n (ngModelChange)=\"onFileTypeFilterChange($event)\"\n [disabled]=\"isLoading || isMultiProviderSearchMode\">\n <option value=\"all\">All Items</option>\n <option value=\"files\">Files only</option>\n <option value=\"folders\">Folders only</option>\n </select>\n </div>\n\n <!-- Search Across Accounts Toggle -->\n <button\n type=\"button\"\n class=\"mj-btn-search-toggle multi-search-btn\"\n [class.active]=\"isMultiProviderSearchMode\"\n (click)=\"toggleMultiAccountSearchMode()\"\n title=\"Search across all storage accounts\">\n <i class=\"fa-solid fa-layer-group\"></i>\n <span>All Accounts</span>\n </button>\n\n <!-- View Switcher -->\n <div class=\"view-mode-toggle view-toggle\">\n <button\n type=\"button\"\n class=\"view-mode-btn 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\n type=\"button\"\n class=\"view-mode-btn view-btn\"\n [class.active]=\"viewMode === 'grid'\"\n (click)=\"viewMode = 'grid'\"\n title=\"Grid View\">\n <i class=\"fa-solid fa-table-cells-large\"></i>\n </button>\n </div>\n\n <!-- Primary Action CTAs -->\n <button\n type=\"button\"\n class=\"mj-action-btn mj-action-btn--secondary toolbar-btn\"\n (click)=\"onNewFolderClick()\"\n title=\"Create New Folder\">\n <i class=\"fa-solid fa-folder-plus\"></i>\n <span>New Folder</span>\n </button>\n\n <button\n type=\"button\"\n class=\"mj-action-btn mj-action-btn--primary toolbar-btn\"\n (click)=\"onUploadClick()\"\n title=\"Upload Files\">\n <i class=\"fa-solid fa-cloud-arrow-up\"></i>\n <span>Upload</span>\n </button>\n </div>\n </div>\n }\n\n <!-- Selection Action Bar (Appears when 1+ items selected) -->\n @if (selectedItems.length > 0 && !isMultiProviderSearchMode) {\n <div class=\"selection-bar\">\n <div class=\"selection-bar-left\">\n <label class=\"selection-checkbox-wrap\" (click)=\"$event.stopPropagation()\">\n <input\n type=\"checkbox\"\n [checked]=\"areAllSelected()\"\n (change)=\"areAllSelected() ? deselectAll() : selectAll()\" />\n <span class=\"selection-count\">{{ selectedItems.length }} item{{ selectedItems.length === 1 ? '' : 's' }} selected</span>\n </label>\n </div>\n\n <div class=\"selection-bar-right\">\n @if (selectedItems.length === 1 && getSelectedItem()?.Type === 'file') {\n <button\n type=\"button\"\n class=\"sel-action-btn\"\n (click)=\"openPreview(getSelectedItem()!)\"\n title=\"Preview file\">\n <i class=\"fa-solid fa-eye\"></i>\n <span>Preview</span>\n </button>\n <button\n type=\"button\"\n class=\"sel-action-btn\"\n (click)=\"onDownloadClick()\"\n title=\"Download file\">\n <i class=\"fa-solid fa-download\"></i>\n <span>Download</span>\n </button>\n <button\n type=\"button\"\n class=\"sel-action-btn\"\n (click)=\"onCopyToAccountClick()\"\n title=\"Copy to another storage account\">\n <i class=\"fa-solid fa-cloud-arrow-up\"></i>\n <span>Copy to...</span>\n </button>\n }\n @if (selectedItems.length === 1) {\n <button\n type=\"button\"\n class=\"sel-action-btn\"\n (click)=\"onRenameClick()\"\n title=\"Rename item\">\n <i class=\"fa-solid fa-pen\"></i>\n <span>Rename</span>\n </button>\n <button\n type=\"button\"\n class=\"sel-action-btn\"\n (click)=\"onCopyClick()\"\n title=\"Copy to path\">\n <i class=\"fa-solid fa-copy\"></i>\n <span>Copy</span>\n </button>\n <button\n type=\"button\"\n class=\"sel-action-btn\"\n (click)=\"onMoveClick()\"\n title=\"Move item\">\n <i class=\"fa-solid fa-arrows-up-down-left-right\"></i>\n <span>Move</span>\n </button>\n }\n <button\n type=\"button\"\n class=\"sel-action-btn sel-action-btn--danger\"\n (click)=\"onDeleteClick()\"\n title=\"Delete selected item(s)\">\n <i class=\"fa-solid fa-trash\"></i>\n <span>Delete</span>\n </button>\n <button\n type=\"button\"\n class=\"sel-action-btn sel-action-btn--ghost\"\n (click)=\"deselectAll()\"\n title=\"Deselect all\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n </div>\n }\n\n <!-- Multi-Provider Search Panel -->\n @if (isMultiProviderSearchMode) {\n <div class=\"multi-search-card multi-provider-search-panel\">\n <div class=\"multi-search-header search-panel-header\">\n <div class=\"multi-search-title\">\n <i class=\"fa-solid fa-layer-group\"></i>\n <h3>Search Across Storage Accounts</h3>\n </div>\n <button\n type=\"button\"\n class=\"modal-close-btn close-panel-btn\"\n (click)=\"toggleMultiAccountSearchMode()\"\n title=\"Close search\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n\n <div class=\"multi-search-body search-panel-body\">\n <div class=\"multi-search-bar search-input-row\">\n <input\n type=\"text\"\n class=\"multi-search-text multi-search-input\"\n [(ngModel)]=\"multiProviderSearchQuery\"\n placeholder=\"Type query to search across connected accounts...\"\n (keydown.enter)=\"executeMultiAccountSearch()\"\n [disabled]=\"isSearching\" />\n <button\n type=\"button\"\n class=\"mj-action-btn mj-action-btn--primary 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 } @else {\n <i class=\"fa-solid fa-magnifying-glass\"></i>\n }\n <span>{{ isSearching ? 'Searching...' : 'Search Accounts' }}</span>\n </button>\n </div>\n\n <div class=\"multi-search-accounts provider-selection\">\n <span class=\"account-select-label provider-selection-label\">Target Accounts:</span>\n <div class=\"account-pill-list provider-checkboxes\">\n @for (a of availableAccounts; track a.account.ID) {\n <label\n class=\"account-select-pill provider-checkbox\"\n [class.disabled]=\"!accountSupportsSearch(a)\"\n [class.checked]=\"isAccountSelectedForSearch(a.account.ID)\">\n <input\n type=\"checkbox\"\n [checked]=\"isAccountSelectedForSearch(a.account.ID)\"\n (change)=\"toggleSearchAccount(a.account.ID)\"\n [disabled]=\"!accountSupportsSearch(a)\" />\n <span class=\"pill-account-name provider-name\">{{ a.account.Name }}</span>\n <span class=\"pill-provider-tag provider-type\">{{ a.provider.Name }}</span>\n @if (!accountSupportsSearch(a)) {\n <span class=\"pill-no-search no-search-badge\">(no search)</span>\n }\n </label>\n }\n </div>\n </div>\n </div>\n\n <!-- Search Results -->\n @if (multiProviderSearchResults) {\n <div class=\"multi-search-results search-results-container\">\n <div class=\"results-meta-bar search-results-summary\">\n <span class=\"meta-count result-count\">\n <strong>{{ multiProviderSearchResults.TotalResultsReturned }}</strong> result{{ multiProviderSearchResults.TotalResultsReturned === 1 ? '' : 's' }} found\n </span>\n <span class=\"meta-stats provider-stats\">\n ({{ multiProviderSearchResults.SuccessfulAccounts }} account{{ multiProviderSearchResults.SuccessfulAccounts === 1 ? '' : 's' }} searched)\n </span>\n <button\n type=\"button\"\n class=\"clear-results-btn\"\n (click)=\"clearMultiProviderSearch()\">\n <i class=\"fa-solid fa-xmark\"></i> Clear Results\n </button>\n </div>\n\n <div class=\"results-groups provider-results-list\">\n @for (accountResult of multiProviderSearchResults.AccountResults; track accountResult.accountID) {\n <div class=\"result-group provider-result-group\" [class.failed]=\"!accountResult.success\">\n <div class=\"result-group-head provider-result-header\">\n <i class=\"fa-solid fa-cloud-bolt group-icon\"></i>\n <span class=\"group-account-name provider-name\">{{ accountResult.accountName }}</span>\n @if (accountResult.success) {\n <span class=\"group-count-badge result-count\">{{ accountResult.results.length }}</span>\n } @else {\n <span class=\"group-error-badge error-badge\">{{ accountResult.errorMessage }}</span>\n }\n </div>\n\n @if (accountResult.success && accountResult.results.length > 0) {\n <div class=\"result-items-grid provider-result-files\">\n @for (file of accountResult.results; track file.path) {\n <div class=\"search-item-row search-result-item\">\n <i [class]=\"getSearchResultIcon(file)\" class=\"search-item-icon file-icon\"></i>\n <div class=\"search-item-info file-info\">\n <span class=\"search-item-name file-name\">{{ file.name }}</span>\n <span class=\"search-item-path file-path\">{{ file.path }}</span>\n </div>\n <span class=\"search-item-size file-size\">{{ formatSearchResultSize(file.size) }}</span>\n <span class=\"search-item-date file-date\">{{ formatSearchResultDate(file.lastModified) }}</span>\n </div>\n }\n </div>\n }\n @if (accountResult.success && accountResult.results.length === 0) {\n <div class=\"group-empty-text no-results-message\">No matching files found in this account</div>\n }\n </div>\n }\n </div>\n </div>\n }\n </div>\n }\n\n <!-- Loading State -->\n @if (isLoading && !isMultiProviderSearchMode) {\n <div class=\"grid-loading-container loading-state\">\n <mj-loading text=\"Loading files...\"></mj-loading>\n </div>\n }\n\n <!-- Error State -->\n @if (errorMessage && !isLoading) {\n <mj-empty-state\n class=\"file-grid-empty-fill\"\n Variant=\"error\"\n Icon=\"fa-solid fa-triangle-exclamation\"\n Title=\"Unable to load files\"\n [Message]=\"errorMessage\"\n ActionText=\"Retry\"\n ActionIcon=\"fa-solid fa-arrows-rotate\"\n (Action)=\"refresh()\" />\n }\n\n <!-- Grid View -->\n @if (!isLoading && !errorMessage && filteredItems.length > 0 && viewMode === 'grid') {\n <div class=\"file-cards-grid file-grid file-grid-wrapper\">\n @for (item of filteredItems; track item.Key) {\n <div\n class=\"file-card grid-item\"\n [class.selected]=\"selectedItems.includes(item.Key)\"\n (click)=\"onTileClick(item, $event)\"\n (dblclick)=\"onItemDoubleClick(item)\"\n [title]=\"item.name\">\n\n <!-- Card Top Row: Checkbox & Quick Actions -->\n <div class=\"file-card-header\">\n <label class=\"file-card-checkbox\" (click)=\"$event.stopPropagation()\">\n <input\n type=\"checkbox\"\n [checked]=\"selectedItems.includes(item.Key)\"\n (change)=\"toggleItemSelection(item, $event)\" />\n </label>\n <div class=\"file-card-quick-actions\" (click)=\"$event.stopPropagation()\">\n @if (item.Type === 'file') {\n <button\n type=\"button\"\n class=\"quick-action-btn\"\n (click)=\"openPreview(item)\"\n title=\"Preview\">\n <i class=\"fa-solid fa-eye\"></i>\n </button>\n <button\n type=\"button\"\n class=\"quick-action-btn\"\n (click)=\"downloadFile(item)\"\n title=\"Download\">\n <i class=\"fa-solid fa-download\"></i>\n </button>\n }\n </div>\n </div>\n\n <!-- Card Thumbnail/Icon -->\n <div class=\"file-card-icon-container grid-icon\" [class]=\"getItemColorClass(item)\">\n <i [class]=\"getItemIcon(item)\"></i>\n </div>\n\n <!-- Card Body: Name & Meta -->\n <div class=\"file-card-body\">\n <span class=\"file-card-name grid-name\">{{ item.name }}</span>\n <div class=\"file-card-meta grid-meta\">\n <span class=\"meta-size\">{{ item.Type === 'folder' ? 'Folder' : formatFileSize(item.Size) }}</span>\n <span class=\"meta-date\">{{ formatDate(item.LastModified) }}</span>\n </div>\n </div>\n </div>\n }\n </div>\n }\n\n <!-- List View Table -->\n @if (!isLoading && !errorMessage && filteredItems.length > 0 && viewMode === 'list') {\n <div class=\"file-table-container file-table-wrapper\">\n <table class=\"file-table\">\n <thead>\n <tr>\n <th class=\"th-check\">\n <input\n type=\"checkbox\"\n [checked]=\"areAllSelected()\"\n (change)=\"areAllSelected() ? deselectAll() : selectAll()\" />\n </th>\n <th class=\"th-name 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-arrow 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=\"th-type col-type\">Type</th>\n <th class=\"th-size 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-arrow 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=\"th-date 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-arrow 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 <th class=\"th-actions\">Actions</th>\n </tr>\n </thead>\n <tbody>\n @for (item of filteredItems; track item.Key) {\n <tr\n class=\"file-table-row file-row\"\n [class.selected]=\"selectedItems.includes(item.Key)\"\n (click)=\"onTileClick(item, $event)\"\n (dblclick)=\"onItemDoubleClick(item)\">\n <td class=\"td-check\" (click)=\"$event.stopPropagation()\">\n <input\n type=\"checkbox\"\n [checked]=\"selectedItems.includes(item.Key)\"\n (change)=\"toggleItemSelection(item, $event)\" />\n </td>\n <td class=\"td-name col-name\">\n <div class=\"row-name-wrap\">\n <div class=\"row-icon-badge\" [class]=\"getItemColorClass(item)\">\n <i [class]=\"getItemIcon(item)\" class=\"item-icon\"></i>\n </div>\n <span class=\"row-file-name item-name\" [title]=\"item.name\">{{ item.name }}</span>\n </div>\n </td>\n <td class=\"td-type col-type\">\n <span class=\"type-badge item-type\">{{ getFileType(item) }}</span>\n </td>\n <td class=\"td-size col-size\">\n <span class=\"size-text item-size\">{{ item.Type === 'folder' ? '—' : formatFileSize(item.Size) }}</span>\n </td>\n <td class=\"td-date col-modified\">\n <span class=\"date-text item-date\">{{ formatDate(item.LastModified) }}</span>\n </td>\n <td class=\"td-actions\" (click)=\"$event.stopPropagation()\">\n <div class=\"row-action-buttons\">\n @if (item.Type === 'file') {\n <button\n type=\"button\"\n class=\"row-act-btn\"\n (click)=\"openPreview(item)\"\n title=\"Preview\">\n <i class=\"fa-solid fa-eye\"></i>\n </button>\n <button\n type=\"button\"\n class=\"row-act-btn\"\n (click)=\"downloadFile(item)\"\n title=\"Download\">\n <i class=\"fa-solid fa-download\"></i>\n </button>\n }\n </div>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n\n <!-- Empty State -->\n @if (!isLoading && !errorMessage && filteredItems.length === 0 && !isMultiProviderSearchMode) {\n <mj-empty-state\n Icon=\"fa-solid fa-folder-open\"\n Title=\"This folder is empty\"\n Message=\"Drop files here to upload or create a new folder\"\n ActionText=\"Upload Files\"\n ActionIcon=\"fa-solid fa-cloud-arrow-up\"\n (Action)=\"onUploadClick()\" />\n }\n\n <!-- Bottom Status Bar -->\n @if (!isLoading && !errorMessage) {\n <div class=\"status-bar\">\n <span class=\"status-count\">\n {{ filteredItems.length }} item{{ filteredItems.length === 1 ? '' : 's' }}\n @if (searchQuery) {\n (filtered)\n }\n </span>\n <div class=\"status-account-badge\" *ngIf=\"account\">\n <i class=\"fa-solid fa-cloud\"></i>\n <span>{{ account.account.Name }} ({{ account.provider.Name }})</span>\n </div>\n </div>\n }\n\n <!-- Drag & Drop Upload Overlay -->\n @if (isDragging) {\n <div class=\"drag-drop-overlay\">\n <div class=\"drag-drop-content\">\n <i class=\"fa-solid fa-cloud-arrow-up drag-icon\"></i>\n <h3>Drop files here to upload</h3>\n <p>Files will be stored in {{ folderPath || 'Root' }}</p>\n </div>\n </div>\n }\n\n <!-- Upload Progress Bar -->\n @if (isUploading) {\n <div class=\"upload-progress-bar-wrap\">\n <div class=\"upload-progress-card\">\n <div class=\"upload-info\">\n <i class=\"fa-solid fa-spinner fa-spin upload-spinner\"></i>\n <span class=\"upload-text\">Uploading {{ uploadingFileName }}...</span>\n </div>\n <div class=\"progress-track\">\n <div class=\"progress-fill\" [style.width.%]=\"uploadProgress\"></div>\n </div>\n </div>\n </div>\n }\n</div>\n\n<!-- ==========================================================================\n MODAL DIALOGS (Design Tokens, Smooth Animations, Backdrop Blurs)\n ========================================================================== -->\n\n<!-- File Preview Modal -->\n@if (showPreviewModal && previewItem) {\n <div class=\"mj-modal-backdrop\" (click)=\"closePreview()\">\n <div class=\"mj-modal-window preview-modal-window\" (click)=\"$event.stopPropagation()\">\n <div class=\"mj-modal-header\">\n <div class=\"modal-title-wrap\">\n <div class=\"row-icon-badge\" [class]=\"getItemColorClass(previewItem)\">\n <i [class]=\"getItemIcon(previewItem)\"></i>\n </div>\n <div>\n <h3 class=\"modal-title\">{{ previewItem.name }}</h3>\n <span class=\"modal-subtitle\">{{ formatFileSize(previewItem.Size) }} • {{ formatDate(previewItem.LastModified) }}</span>\n </div>\n </div>\n <div class=\"modal-header-actions\">\n <button\n type=\"button\"\n class=\"mj-action-btn mj-action-btn--secondary\"\n (click)=\"downloadFile(previewItem)\"\n title=\"Download file\">\n <i class=\"fa-solid fa-download\"></i>\n <span>Download</span>\n </button>\n <button\n type=\"button\"\n class=\"modal-close-btn\"\n (click)=\"closePreview()\"\n title=\"Close preview\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n </div>\n\n <div class=\"preview-modal-body\">\n @if (isLoadingPreview) {\n <div class=\"preview-loading\">\n <mj-loading text=\"Loading preview...\"></mj-loading>\n </div>\n } @else if (previewUrl) {\n @switch (previewMediaType) {\n @case ('image') {\n <div class=\"preview-media-wrap image-preview-wrap\">\n <img [src]=\"previewUrl\" [alt]=\"previewItem.name\" class=\"preview-img\" />\n </div>\n }\n @case ('pdf') {\n <div class=\"preview-media-wrap pdf-preview-wrap\">\n <iframe [src]=\"previewUrl\" class=\"preview-iframe\" title=\"PDF Preview\"></iframe>\n </div>\n }\n @case ('video') {\n <div class=\"preview-media-wrap video-preview-wrap\">\n <video [src]=\"previewUrl\" controls autoplay class=\"preview-video\"></video>\n </div>\n }\n @case ('audio') {\n <div class=\"preview-media-wrap audio-preview-wrap\">\n <i class=\"fa-solid fa-music preview-audio-icon\"></i>\n <audio [src]=\"previewUrl\" controls class=\"preview-audio\"></audio>\n </div>\n }\n @default {\n <div class=\"preview-fallback\">\n <i [class]=\"getItemIcon(previewItem)\" class=\"preview-fallback-icon\"></i>\n <h4>{{ previewItem.name }}</h4>\n <p>Preview is not supported for this file type.</p>\n <button\n type=\"button\"\n class=\"mj-action-btn mj-action-btn--primary\"\n (click)=\"downloadFile(previewItem)\">\n <i class=\"fa-solid fa-download\"></i>\n <span>Download File</span>\n </button>\n </div>\n }\n }\n } @else {\n <div class=\"preview-fallback\">\n <i class=\"fa-solid fa-triangle-exclamation preview-fallback-icon\"></i>\n <h4>Preview unavailable</h4>\n <p>Could not generate a preview link for this file.</p>\n <button\n type=\"button\"\n class=\"mj-action-btn mj-action-btn--primary\"\n (click)=\"downloadFile(previewItem)\">\n <i class=\"fa-solid fa-download\"></i>\n <span>Download File</span>\n </button>\n </div>\n }\n </div>\n </div>\n </div>\n}\n\n<!-- New Folder Modal -->\n@if (showNewFolderDialog) {\n <div class=\"mj-modal-backdrop modal-overlay\" (click)=\"onCancelNewFolder()\">\n <div class=\"mj-modal-window modal-compact modal-dialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"mj-modal-header modal-header\">\n <h3 class=\"modal-title\">Create New Folder</h3>\n <button type=\"button\" class=\"modal-close-btn modal-close\" (click)=\"onCancelNewFolder()\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n <div class=\"mj-modal-body modal-body\">\n <label class=\"form-label\">Folder name:</label>\n <input\n type=\"text\"\n class=\"form-input\"\n [(ngModel)]=\"newFolderName\"\n [disabled]=\"isCreatingFolder\"\n placeholder=\"Enter folder name\"\n (keydown.enter)=\"onCreateFolder()\"\n autofocus />\n </div>\n <div class=\"mj-modal-footer modal-footer\">\n <button\n type=\"button\"\n class=\"mj-action-btn mj-action-btn--secondary\"\n (click)=\"onCancelNewFolder()\"\n [disabled]=\"isCreatingFolder\">\n Cancel\n </button>\n <button\n type=\"button\"\n class=\"mj-action-btn mj-action-btn--primary\"\n (click)=\"onCreateFolder()\"\n [disabled]=\"!newFolderName.trim() || isCreatingFolder\">\n @if (isCreatingFolder) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n }\n <span>{{ isCreatingFolder ? 'Creating...' : 'Create' }}</span>\n </button>\n </div>\n </div>\n </div>\n}\n\n<!-- Delete Confirmation Modal -->\n@if (showDeleteDialog && itemToDelete) {\n <div class=\"mj-modal-backdrop modal-overlay\" (click)=\"onCancelDelete()\">\n <div class=\"mj-modal-window modal-compact modal-dialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"mj-modal-header modal-header\">\n <h3 class=\"modal-title\">Delete {{ itemToDelete.Type === 'folder' ? 'Folder' : 'File' }}?</h3>\n <button type=\"button\" class=\"modal-close-btn modal-close\" (click)=\"onCancelDelete()\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n <div class=\"mj-modal-body modal-body\">\n <p class=\"modal-body-text\">\n Are you sure you want to delete <strong>{{ itemToDelete.name }}</strong>?\n </p>\n @if (itemToDelete.Type === 'folder') {\n <div class=\"modal-warning-banner warning\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n <span>This will delete the folder and all its contents.</span>\n </div>\n }\n </div>\n <div class=\"mj-modal-footer modal-footer\">\n <button\n type=\"button\"\n class=\"mj-action-btn mj-action-btn--secondary\"\n (click)=\"onCancelDelete()\"\n [disabled]=\"isDeleting\">\n Cancel\n </button>\n <button\n type=\"button\"\n class=\"mj-action-btn mj-action-btn--danger danger\"\n (click)=\"onConfirmDelete()\"\n [disabled]=\"isDeleting\">\n @if (isDeleting) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n }\n <span>{{ isDeleting ? 'Deleting...' : 'Delete' }}</span>\n </button>\n </div>\n </div>\n </div>\n}\n\n<!-- Rename Modal -->\n@if (showRenameDialog && itemToRename) {\n <div class=\"mj-modal-backdrop modal-overlay\" (click)=\"onCancelRename()\">\n <div class=\"mj-modal-window modal-compact modal-dialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"mj-modal-header modal-header\">\n <h3 class=\"modal-title\">Rename {{ itemToRename.Type === 'folder' ? 'Folder' : 'File' }}</h3>\n <button type=\"button\" class=\"modal-close-btn modal-close\" (click)=\"onCancelRename()\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n <div class=\"mj-modal-body modal-body\">\n <label class=\"form-label\">New name:</label>\n <input\n type=\"text\"\n class=\"form-input\"\n [(ngModel)]=\"newItemName\"\n [disabled]=\"isRenaming\"\n placeholder=\"Enter new name\"\n (keydown.enter)=\"onConfirmRename()\"\n autofocus />\n </div>\n <div class=\"mj-modal-footer modal-footer\">\n <button\n type=\"button\"\n class=\"mj-action-btn mj-action-btn--secondary\"\n (click)=\"onCancelRename()\"\n [disabled]=\"isRenaming\">\n Cancel\n </button>\n <button\n type=\"button\"\n class=\"mj-action-btn mj-action-btn--primary\"\n (click)=\"onConfirmRename()\"\n [disabled]=\"isRenaming || !newItemName.trim()\">\n @if (isRenaming) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n }\n <span>{{ isRenaming ? 'Renaming...' : 'Rename' }}</span>\n </button>\n </div>\n </div>\n </div>\n}\n\n<!-- Copy Modal -->\n@if (showCopyDialog && itemToCopy) {\n <div class=\"mj-modal-backdrop\" (click)=\"onCancelCopy()\">\n <div class=\"mj-modal-window modal-compact\" (click)=\"$event.stopPropagation()\">\n <div class=\"mj-modal-header\">\n <h3 class=\"modal-title\">Copy {{ itemToCopy.Type === 'folder' ? 'Folder' : 'File' }}</h3>\n <button type=\"button\" class=\"modal-close-btn\" (click)=\"onCancelCopy()\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n <div class=\"mj-modal-body\">\n <p class=\"modal-body-text\">Copying <strong>{{ itemToCopy.name }}</strong></p>\n <label class=\"form-label\">Destination Path</label>\n <input\n type=\"text\"\n class=\"form-input\"\n [(ngModel)]=\"copyDestinationPath\"\n [disabled]=\"isCopying\"\n placeholder=\"path/to/destination\"\n (keydown.enter)=\"onConfirmCopy()\" />\n </div>\n <div class=\"mj-modal-footer\">\n <button\n type=\"button\"\n class=\"mj-action-btn mj-action-btn--secondary\"\n (click)=\"onCancelCopy()\"\n [disabled]=\"isCopying\">\n Cancel\n </button>\n <button\n type=\"button\"\n class=\"mj-action-btn mj-action-btn--primary\"\n (click)=\"onConfirmCopy()\"\n [disabled]=\"isCopying || !copyDestinationPath.trim()\">\n @if (isCopying) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n }\n <span>{{ isCopying ? 'Copying...' : 'Copy' }}</span>\n </button>\n </div>\n </div>\n </div>\n}\n\n<!-- Move Modal -->\n@if (showMoveDialog && itemToMove) {\n <div class=\"mj-modal-backdrop\" (click)=\"onCancelMove()\">\n <div class=\"mj-modal-window modal-compact\" (click)=\"$event.stopPropagation()\">\n <div class=\"mj-modal-header\">\n <h3 class=\"modal-title\">Move {{ itemToMove.Type === 'folder' ? 'Folder' : 'File' }}</h3>\n <button type=\"button\" class=\"modal-close-btn\" (click)=\"onCancelMove()\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n <div class=\"mj-modal-body\">\n <p class=\"modal-body-text\">Moving <strong>{{ itemToMove.name }}</strong></p>\n <label class=\"form-label\">Destination Folder</label>\n <input\n type=\"text\"\n class=\"form-input\"\n [(ngModel)]=\"moveDestinationPath\"\n [disabled]=\"isMoving\"\n placeholder=\"destination/folder/\"\n (keydown.enter)=\"onConfirmMove()\" />\n </div>\n <div class=\"mj-modal-footer\">\n <button\n type=\"button\"\n class=\"mj-action-btn mj-action-btn--secondary\"\n (click)=\"onCancelMove()\"\n [disabled]=\"isMoving\">\n Cancel\n </button>\n <button\n type=\"button\"\n class=\"mj-action-btn mj-action-btn--primary\"\n (click)=\"onConfirmMove()\"\n [disabled]=\"isMoving || !moveDestinationPath.trim()\">\n @if (isMoving) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n }\n <span>{{ isMoving ? 'Moving...' : 'Move' }}</span>\n </button>\n </div>\n </div>\n </div>\n}\n\n<!-- Copy to Account Modal -->\n@if (showCopyToProviderDialog && itemToCopyToProvider) {\n <div class=\"mj-modal-backdrop\" (click)=\"onCancelCopyToAccount()\">\n <div class=\"mj-modal-window\" (click)=\"$event.stopPropagation()\">\n <div class=\"mj-modal-header\">\n <h3 class=\"modal-title\">Copy to Another Account</h3>\n <button type=\"button\" class=\"modal-close-btn\" (click)=\"onCancelCopyToAccount()\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n <div class=\"mj-modal-body\">\n <p class=\"modal-body-text\">\n Copying <strong>{{ itemToCopyToProvider.name }}</strong> from <strong>{{ account?.account?.Name }}</strong>\n </p>\n\n <label class=\"form-label\">Select Destination Storage Accounts</label>\n <div class=\"account-picker-list\">\n @for (a of availableAccounts; track a.account.ID) {\n <label class=\"account-picker-item\" [for]=\"'dest-acc-' + a.account.ID\">\n <input\n type=\"checkbox\"\n [id]=\"'dest-acc-' + a.account.ID\"\n [checked]=\"isDestinationAccountSelected(a.account.ID)\"\n [disabled]=\"isCopyingToAccount\"\n (change)=\"toggleDestinationAccount(a.account.ID)\" />\n <span class=\"picker-name\">{{ a.account.Name }}</span>\n <span class=\"picker-badge\">{{ a.provider.Name }}</span>\n </label>\n }\n </div>\n\n <label class=\"form-label\" style=\"margin-top: 14px;\">Destination Filename</label>\n <input\n type=\"text\"\n class=\"form-input\"\n [(ngModel)]=\"copyToAccountDestinationPath\"\n [disabled]=\"isCopyingToAccount\"\n placeholder=\"Filename\"\n (keydown.enter)=\"onConfirmCopyToAccount()\" />\n\n @if (copyToAccountProgress) {\n <div class=\"copy-progress-indicator\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n <span>Copying to {{ copyToAccountProgress.currentAccount }} ({{ copyToAccountProgress.current }}/{{ copyToAccountProgress.total }})...</span>\n </div>\n }\n </div>\n <div class=\"mj-modal-footer\">\n <button\n type=\"button\"\n class=\"mj-action-btn mj-action-btn--secondary\"\n (click)=\"onCancelCopyToAccount()\"\n [disabled]=\"isCopyingToAccount\">\n Cancel\n </button>\n <button\n type=\"button\"\n class=\"mj-action-btn mj-action-btn--primary\"\n (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 <span>{{ isCopyingToAccount ? 'Copying...' : 'Copy to ' + selectedDestinationAccounts.size + ' Account' + (selectedDestinationAccounts.size !== 1 ? 's' : '') }}</span>\n </button>\n </div>\n </div>\n </div>\n}\n"]}
|