@burdenoff/microfe-files 2026.1014.11 → 2026.1016.1
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/README.md +37 -0
- package/dist/config/index.js.map +1 -1
- package/dist/files/FilesRoot.js +17 -10
- package/dist/files/FilesRoot.js.map +1 -1
- package/dist/files/FilesRoutes.d.ts +1 -1
- package/dist/files/FilesRoutes.js.map +1 -1
- package/dist/files/components/ActionMenu.js.map +1 -1
- package/dist/files/components/ConfirmDialog.d.ts +1 -1
- package/dist/files/components/ConfirmDialog.js.map +1 -1
- package/dist/files/components/ContextMenu.d.ts +1 -1
- package/dist/files/components/ContextMenu.js.map +1 -1
- package/dist/files/components/CopyDialog.js.map +1 -1
- package/dist/files/components/EmptyState.d.ts +1 -1
- package/dist/files/components/EmptyState.js.map +1 -1
- package/dist/files/components/FileBrowser.js +2 -1
- package/dist/files/components/FileBrowser.js.map +1 -1
- package/dist/files/components/FileCard.d.ts.map +1 -1
- package/dist/files/components/FileCard.js +150 -142
- package/dist/files/components/FileCard.js.map +1 -1
- package/dist/files/components/FileInfoPanel.d.ts +1 -1
- package/dist/files/components/FileInfoPanel.d.ts.map +1 -1
- package/dist/files/components/FileInfoPanel.js +3 -7
- package/dist/files/components/FileInfoPanel.js.map +1 -1
- package/dist/files/components/FileListItem.d.ts.map +1 -1
- package/dist/files/components/FileListItem.js +1 -1
- package/dist/files/components/FileListItem.js.map +1 -1
- package/dist/files/components/FilePreviewModal.d.ts +1 -1
- package/dist/files/components/FilePreviewModal.d.ts.map +1 -1
- package/dist/files/components/FilePreviewModal.js +5 -0
- package/dist/files/components/FilePreviewModal.js.map +1 -1
- package/dist/files/components/FileVersionPanel.d.ts.map +1 -1
- package/dist/files/components/FileVersionPanel.js +122 -121
- package/dist/files/components/FileVersionPanel.js.map +1 -1
- package/dist/files/components/FolderCard.d.ts.map +1 -1
- package/dist/files/components/FolderCard.js +1 -1
- package/dist/files/components/FolderCard.js.map +1 -1
- package/dist/files/components/MoveDialog.js +2 -2
- package/dist/files/components/MoveDialog.js.map +1 -1
- package/dist/files/components/SearchBar.d.ts +1 -1
- package/dist/files/components/SearchBar.d.ts.map +1 -1
- package/dist/files/components/SearchBar.js +132 -128
- package/dist/files/components/SearchBar.js.map +1 -1
- package/dist/files/components/ShareDialog.d.ts +1 -1
- package/dist/files/components/ShareDialog.js.map +1 -1
- package/dist/files/components/StorageBanner.js.map +1 -1
- package/dist/files/components/TabBar.d.ts +1 -1
- package/dist/files/components/TabBar.js.map +1 -1
- package/dist/files/components/Toast.d.ts +1 -1
- package/dist/files/components/Toast.js.map +1 -1
- package/dist/files/components/UploadQueue.d.ts +1 -1
- package/dist/files/components/UploadQueue.js +1 -1
- package/dist/files/components/UploadQueue.js.map +1 -1
- package/dist/files/components/contextMenuItems.d.ts +4 -4
- package/dist/files/components/contextMenuItems.js.map +1 -1
- package/dist/files/components/viewers/AudioPlayer.d.ts +1 -1
- package/dist/files/components/viewers/AudioPlayer.js.map +1 -1
- package/dist/files/components/viewers/CodeViewer.d.ts +1 -1
- package/dist/files/components/viewers/CodeViewer.js.map +1 -1
- package/dist/files/components/viewers/ImageViewer.d.ts +1 -1
- package/dist/files/components/viewers/ImageViewer.js.map +1 -1
- package/dist/files/components/viewers/PDFViewer.d.ts +1 -1
- package/dist/files/components/viewers/PDFViewer.js.map +1 -1
- package/dist/files/components/viewers/TextViewer.d.ts +1 -1
- package/dist/files/components/viewers/TextViewer.js.map +1 -1
- package/dist/files/components/viewers/VideoPlayer.d.ts +1 -1
- package/dist/files/components/viewers/VideoPlayer.js.map +1 -1
- package/dist/files/graphql-types.d.ts +2 -17
- package/dist/files/graphql-types.d.ts.map +1 -1
- package/dist/files/hooks/useBatchOperations.d.ts +6 -1
- package/dist/files/hooks/useBatchOperations.d.ts.map +1 -1
- package/dist/files/hooks/useBatchOperations.js +8 -7
- package/dist/files/hooks/useBatchOperations.js.map +1 -1
- package/dist/files/hooks/useBinItems.d.ts.map +1 -1
- package/dist/files/hooks/useBinItems.js +14 -12
- package/dist/files/hooks/useBinItems.js.map +1 -1
- package/dist/files/hooks/useBrowsePage.d.ts +131 -8
- package/dist/files/hooks/useBrowsePage.d.ts.map +1 -1
- package/dist/files/hooks/useBrowsePage.js +23 -22
- package/dist/files/hooks/useBrowsePage.js.map +1 -1
- package/dist/files/hooks/useCopyFile.d.ts +22 -1
- package/dist/files/hooks/useCopyFile.d.ts.map +1 -1
- package/dist/files/hooks/useCopyFile.js +9 -8
- package/dist/files/hooks/useCopyFile.js.map +1 -1
- package/dist/files/hooks/useCreateFolder.d.ts +23 -1
- package/dist/files/hooks/useCreateFolder.d.ts.map +1 -1
- package/dist/files/hooks/useCreateFolder.js +16 -9
- package/dist/files/hooks/useCreateFolder.js.map +1 -1
- package/dist/files/hooks/useCreateFolderShare.d.ts +20 -1
- package/dist/files/hooks/useCreateFolderShare.d.ts.map +1 -1
- package/dist/files/hooks/useCreateFolderShare.js +22 -7
- package/dist/files/hooks/useCreateFolderShare.js.map +1 -1
- package/dist/files/hooks/useCreateShare.d.ts +19 -1
- package/dist/files/hooks/useCreateShare.d.ts.map +1 -1
- package/dist/files/hooks/useCreateShare.js +22 -7
- package/dist/files/hooks/useCreateShare.js.map +1 -1
- package/dist/files/hooks/useDeleteFile.d.ts +1 -1
- package/dist/files/hooks/useDeleteFile.d.ts.map +1 -1
- package/dist/files/hooks/useDeleteFile.js +8 -7
- package/dist/files/hooks/useDeleteFile.js.map +1 -1
- package/dist/files/hooks/useDeleteFolder.d.ts +1 -1
- package/dist/files/hooks/useDeleteFolder.d.ts.map +1 -1
- package/dist/files/hooks/useDeleteFolder.js +9 -8
- package/dist/files/hooks/useDeleteFolder.js.map +1 -1
- package/dist/files/hooks/useDragDrop.js.map +1 -1
- package/dist/files/hooks/useFileVersions.d.ts +36 -9
- package/dist/files/hooks/useFileVersions.d.ts.map +1 -1
- package/dist/files/hooks/useFileVersions.js +14 -13
- package/dist/files/hooks/useFileVersions.js.map +1 -1
- package/dist/files/hooks/useFoldersQuery.d.ts +8 -4
- package/dist/files/hooks/useFoldersQuery.d.ts.map +1 -1
- package/dist/files/hooks/useFoldersQuery.js +7 -6
- package/dist/files/hooks/useFoldersQuery.js.map +1 -1
- package/dist/files/hooks/useKeyboardNavigation.js +7 -8
- package/dist/files/hooks/useKeyboardNavigation.js.map +1 -1
- package/dist/files/hooks/useMoveFile.d.ts +22 -1
- package/dist/files/hooks/useMoveFile.d.ts.map +1 -1
- package/dist/files/hooks/useMoveFile.js +9 -8
- package/dist/files/hooks/useMoveFile.js.map +1 -1
- package/dist/files/hooks/useMoveFolder.d.ts +22 -1
- package/dist/files/hooks/useMoveFolder.d.ts.map +1 -1
- package/dist/files/hooks/useMoveFolder.js +9 -8
- package/dist/files/hooks/useMoveFolder.js.map +1 -1
- package/dist/files/hooks/usePermanentlyDeleteFile.d.ts +1 -1
- package/dist/files/hooks/usePermanentlyDeleteFile.d.ts.map +1 -1
- package/dist/files/hooks/usePermanentlyDeleteFile.js +8 -7
- package/dist/files/hooks/usePermanentlyDeleteFile.js.map +1 -1
- package/dist/files/hooks/usePermanentlyDeleteFolder.d.ts +1 -1
- package/dist/files/hooks/usePermanentlyDeleteFolder.d.ts.map +1 -1
- package/dist/files/hooks/usePermanentlyDeleteFolder.js +8 -7
- package/dist/files/hooks/usePermanentlyDeleteFolder.js.map +1 -1
- package/dist/files/hooks/useRecentFiles.d.ts.map +1 -1
- package/dist/files/hooks/useRecentFiles.js +13 -11
- package/dist/files/hooks/useRecentFiles.js.map +1 -1
- package/dist/files/hooks/useRenameFile.d.ts +22 -1
- package/dist/files/hooks/useRenameFile.d.ts.map +1 -1
- package/dist/files/hooks/useRenameFile.js +9 -8
- package/dist/files/hooks/useRenameFile.js.map +1 -1
- package/dist/files/hooks/useRenameFolder.d.ts +22 -1
- package/dist/files/hooks/useRenameFolder.d.ts.map +1 -1
- package/dist/files/hooks/useRenameFolder.js +9 -8
- package/dist/files/hooks/useRenameFolder.js.map +1 -1
- package/dist/files/hooks/useRestoreFile.d.ts +22 -1
- package/dist/files/hooks/useRestoreFile.d.ts.map +1 -1
- package/dist/files/hooks/useRestoreFile.js +8 -7
- package/dist/files/hooks/useRestoreFile.js.map +1 -1
- package/dist/files/hooks/useRestoreFolder.d.ts +22 -1
- package/dist/files/hooks/useRestoreFolder.d.ts.map +1 -1
- package/dist/files/hooks/useRestoreFolder.js +8 -7
- package/dist/files/hooks/useRestoreFolder.js.map +1 -1
- package/dist/files/hooks/useSearch.d.ts +2 -3
- package/dist/files/hooks/useSearch.d.ts.map +1 -1
- package/dist/files/hooks/useSearch.js +14 -12
- package/dist/files/hooks/useSearch.js.map +1 -1
- package/dist/files/hooks/useStarredItems.d.ts +2 -3
- package/dist/files/hooks/useStarredItems.d.ts.map +1 -1
- package/dist/files/hooks/useStarredItems.js +12 -10
- package/dist/files/hooks/useStarredItems.js.map +1 -1
- package/dist/files/hooks/useStorageQuota.d.ts.map +1 -1
- package/dist/files/hooks/useStorageQuota.js +17 -16
- package/dist/files/hooks/useStorageQuota.js.map +1 -1
- package/dist/files/hooks/useToast.js.map +1 -1
- package/dist/files/hooks/useToggleStar.d.ts +43 -1
- package/dist/files/hooks/useToggleStar.d.ts.map +1 -1
- package/dist/files/hooks/useToggleStar.js +9 -8
- package/dist/files/hooks/useToggleStar.js.map +1 -1
- package/dist/files/hooks/useUploadFile.d.ts +23 -1
- package/dist/files/hooks/useUploadFile.d.ts.map +1 -1
- package/dist/files/hooks/useUploadFile.js +28 -27
- package/dist/files/hooks/useUploadFile.js.map +1 -1
- package/dist/files/hooks/useUploadQueueState.d.ts +32 -0
- package/dist/files/hooks/useUploadQueueState.d.ts.map +1 -0
- package/dist/files/hooks/useUploadQueueState.js +61 -0
- package/dist/files/hooks/useUploadQueueState.js.map +1 -0
- package/dist/files/index.js +4 -3
- package/dist/files/pages/BrowserPage.d.ts +1 -1
- package/dist/files/pages/BrowserPage.d.ts.map +1 -1
- package/dist/files/pages/BrowserPage.js +383 -387
- package/dist/files/pages/BrowserPage.js.map +1 -1
- package/dist/files/pages/ShareAccessPage.d.ts +1 -1
- package/dist/files/pages/ShareAccessPage.js.map +1 -1
- package/dist/files/providers/FilesProvider.js.map +1 -1
- package/dist/files/store/filesStore.js.map +1 -1
- package/dist/files/types.d.ts.map +1 -1
- package/dist/files/utils/events.js.map +1 -1
- package/dist/files/utils/fileViewModel.d.ts +7 -0
- package/dist/files/utils/fileViewModel.d.ts.map +1 -0
- package/dist/files/utils/fileViewModel.js +34 -0
- package/dist/files/utils/fileViewModel.js.map +1 -0
- package/dist/files/utils/i18n.js.map +1 -1
- package/dist/files/utils/index.js +19 -19
- package/dist/files/utils/index.js.map +1 -1
- package/dist/files/utils/quotaUtils.js +1 -2
- package/dist/files/utils/thumbnail.js +19 -23
- package/dist/files/utils/thumbnail.js.map +1 -1
- package/dist/files/utils/uploadDigest.js +1 -1
- package/dist/files/utils/uploadDigest.js.map +1 -1
- package/dist/generated/global-operations.d.ts +4 -1
- package/dist/generated/global-operations.d.ts.map +1 -1
- package/dist/generated/global-types.d.ts +16 -21
- package/dist/generated/global-types.d.ts.map +1 -1
- package/dist/generated/wspace-operations.d.ts +503 -1784
- package/dist/generated/wspace-operations.d.ts.map +1 -1
- package/dist/generated/wspace-operations.js +15278 -1110
- package/dist/generated/wspace-operations.js.map +1 -1
- package/dist/generated/wspace-types.d.ts +90013 -24889
- package/dist/generated/wspace-types.d.ts.map +1 -1
- package/dist/generated/wspace-types.js +16 -0
- package/dist/generated/wspace-types.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/shared/hooks/useTr.js.map +1 -1
- package/dist/translations/en.js.map +1 -1
- package/dist/utils/nativeBridge.js +1 -2
- package/package.json +24 -22
- package/dist/files.d.ts +0 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FileBrowser.js","names":[],"sources":["../../../src/files/components/FileBrowser.tsx"],"sourcesContent":["import { type FC, useState } from \"react\";\nimport { Folder, Star } from \"lucide-react\";\nimport { useI18n } from \"@burdenoff/fe-libs/shared/providers/shell/I18nProvider\";\nimport type { FileItem, FolderItem } from \"../types\";\nimport { useFilesStore } from \"../store/filesStore\";\nimport { FileCard } from \"./FileCard\";\nimport { FileListItem } from \"./FileListItem\";\nimport { FolderCard } from \"./FolderCard\";\nimport { ActionMenu } from \"./ActionMenu\";\nimport { ContextMenu } from \"./ContextMenu\";\nimport { createFileMenuItems, createFolderMenuItems } from \"./contextMenuItems\";\nimport { sortFiles } from \"../utils\";\nimport { tWithFallback } from \"../utils/i18n\";\nimport {\n useDragDrop,\n type DragData,\n type DragOperation,\n} from \"../hooks/useDragDrop\";\n\ninterface FileBrowserProps {\n files: FileItem[];\n folders: FolderItem[];\n loading?: boolean;\n error?: Error | null;\n preserveSortOrder?: boolean;\n onFilePreview?: (file: FileItem) => void;\n onFileShare?: (file: FileItem) => void;\n onFileDelete?: (file: FileItem) => void;\n onFileRestore?: (file: FileItem) => void;\n onFileFavorite?: (file: FileItem) => void;\n onFileRename?: (file: FileItem) => void;\n onFileDownload?: (file: FileItem) => void;\n onFileCopy?: (file: FileItem) => void;\n onFileMove?: (file: FileItem) => void;\n onFileInfo?: (file: FileItem) => void;\n onFileActivity?: (file: FileItem) => void;\n onFolderOpen?: (folder: FolderItem) => void;\n onFolderShare?: (folder: FolderItem) => void;\n onFolderDelete?: (folder: FolderItem) => void;\n onFolderRestore?: (folder: FolderItem) => void;\n onFolderRename?: (folder: FolderItem) => void;\n onFolderFavorite?: (folder: FolderItem) => void;\n onFolderCopy?: (folder: FolderItem) => void;\n onFolderMove?: (folder: FolderItem) => void;\n onFolderInfo?: (folder: FolderItem) => void;\n onFolderActivity?: (folder: FolderItem) => void;\n onMoveFile?: (fileId: string, targetFolderId: string) => Promise<void>;\n onCopyFile?: (fileId: string, targetFolderId: string) => Promise<void>;\n onMoveFolder?: (folderId: string, targetFolderId: string) => Promise<void>;\n onCopyFolder?: (folderId: string, targetFolderId: string) => Promise<void>;\n}\n\nexport const FileBrowser: FC<FileBrowserProps> = ({\n files,\n folders,\n loading = false,\n error = null,\n preserveSortOrder = false,\n onFilePreview,\n onFileShare,\n onFileDelete,\n onFileRestore,\n onFileFavorite,\n onFileRename,\n onFileDownload,\n onFileCopy,\n onFileMove,\n onFileInfo,\n onFileActivity,\n onFolderOpen,\n onFolderShare,\n onFolderDelete,\n onFolderRestore,\n onFolderRename,\n onFolderFavorite,\n onFolderCopy,\n onFolderMove,\n onFolderInfo,\n onFolderActivity,\n onMoveFile,\n onCopyFile,\n onMoveFolder,\n onCopyFolder,\n}) => {\n const { t } = useI18n();\n const { viewMode, sortBy, sortDirection, selectedFiles, selectedFolders } =\n useFilesStore();\n\n const [openMenuId, setOpenMenuId] = useState<string | null>(null);\n const [dragState, setDragState] = useState<{\n draggedItem: DragData | null;\n dropTargetFolderId: string | null;\n }>({ draggedItem: null, dropTargetFolderId: null });\n const [contextMenu, setContextMenu] = useState<{\n item: FileItem | FolderItem;\n type: \"file\" | \"folder\";\n x: number;\n y: number;\n } | null>(null);\n\n const { draggedItem, startDrag, endDrag, handleDrop } = useDragDrop({\n onMoveFile,\n onCopyFile,\n onMoveFolder,\n onCopyFolder,\n });\n\n const handleFileDragStart = (file: FileItem, operation: DragOperation) => {\n startDrag({ type: \"file\", item: file, operation });\n setDragState({\n draggedItem: { type: \"file\", item: file, operation },\n dropTargetFolderId: null,\n });\n };\n\n const handleFolderDragStart = (\n folder: FolderItem,\n operation: DragOperation,\n ) => {\n startDrag({ type: \"folder\", item: folder, operation });\n setDragState({\n draggedItem: { type: \"folder\", item: folder, operation },\n dropTargetFolderId: null,\n });\n };\n\n const handleDragEnd = () => {\n endDrag();\n setDragState({ draggedItem: null, dropTargetFolderId: null });\n };\n\n const handleFolderDrop = async (folder: FolderItem) => {\n if (draggedItem) {\n await handleDrop(folder.id);\n setDragState({ draggedItem: null, dropTargetFolderId: null });\n }\n };\n\n const handleFolderDragOver = (folderId: string) => {\n setDragState((prev) => ({ ...prev, dropTargetFolderId: folderId }));\n };\n\n const handleFolderDragLeave = () => {\n setDragState((prev) => ({ ...prev, dropTargetFolderId: null }));\n };\n\n const handleFileContextMenu = (file: FileItem, x: number, y: number) => {\n setContextMenu({ item: file, type: \"file\", x, y });\n };\n\n const handleFolderContextMenu = (\n folder: FolderItem,\n x: number,\n y: number,\n ) => {\n setContextMenu({ item: folder, type: \"folder\", x, y });\n };\n\n const closeContextMenu = () => {\n setContextMenu(null);\n };\n\n const fileCanRead = (file: FileItem) =>\n file.canRead === true || file.canUpdate === true || file.canWrite === true;\n const fileCanUpdate = (file: FileItem) =>\n file.canUpdate === true || file.canWrite === true;\n const fileCanShare = (file: FileItem) =>\n file.canShare === true || fileCanUpdate(file);\n const fileCanDelete = (file: FileItem) => file.canDelete === true;\n\n const folderCanRead = (folder: FolderItem) =>\n folder.canRead === true || folder.permissions?.canRead === true;\n const folderCanUpdate = (folder: FolderItem) =>\n folder.canUpdate === true || folder.permissions?.canWrite === true;\n const folderCanShare = (folder: FolderItem) =>\n folder.permissions?.canShare === true || folderCanUpdate(folder);\n const folderCanDelete = (folder: FolderItem) =>\n folder.canDelete === true || folder.permissions?.canDelete === true;\n\n const getContextMenuItems = () => {\n if (!contextMenu) return [];\n if (contextMenu.type === \"file\") {\n const file = contextMenu.item as FileItem;\n return createFileMenuItems(\n {\n onShare:\n onFileShare && fileCanShare(file)\n ? () => onFileShare(file)\n : undefined,\n onDownload:\n onFileDownload && fileCanRead(file)\n ? () => onFileDownload(file)\n : undefined,\n onCopy:\n onFileCopy && fileCanRead(file)\n ? () => onFileCopy(file)\n : undefined,\n onRename:\n onFileRename && fileCanUpdate(file)\n ? () => onFileRename(file)\n : undefined,\n onStar:\n onFileFavorite && fileCanUpdate(file)\n ? () => onFileFavorite(file)\n : undefined,\n onMove:\n onFileMove && fileCanUpdate(file)\n ? () => onFileMove(file)\n : undefined,\n onInfo: onFileInfo ? () => onFileInfo(file) : undefined,\n onActivity: onFileActivity ? () => onFileActivity(file) : undefined,\n onDelete:\n onFileDelete && fileCanDelete(file)\n ? () => onFileDelete(file)\n : undefined,\n onRestore:\n onFileRestore && fileCanUpdate(file)\n ? () => onFileRestore(file)\n : undefined,\n isStarred: file.starred,\n },\n t,\n );\n } else {\n const folder = contextMenu.item as FolderItem;\n return createFolderMenuItems(\n {\n onShare:\n onFolderShare && folderCanShare(folder)\n ? () => onFolderShare(folder)\n : undefined,\n onRename:\n onFolderRename && folderCanUpdate(folder)\n ? () => onFolderRename(folder)\n : undefined,\n onStar:\n onFolderFavorite && folderCanUpdate(folder)\n ? () => onFolderFavorite(folder)\n : undefined,\n onMove:\n onFolderMove && folderCanUpdate(folder)\n ? () => onFolderMove(folder)\n : undefined,\n onInfo: onFolderInfo ? () => onFolderInfo(folder) : undefined,\n onDelete:\n onFolderDelete && folderCanDelete(folder)\n ? () => onFolderDelete(folder)\n : undefined,\n onRestore:\n onFolderRestore && folderCanUpdate(folder)\n ? () => onFolderRestore(folder)\n : undefined,\n isStarred: folder.starred,\n },\n t,\n );\n }\n };\n\n const sortedFiles = preserveSortOrder\n ? files\n : sortFiles(files, sortBy, sortDirection);\n const sortedFolders = preserveSortOrder\n ? folders\n : sortFiles(folders, sortBy, sortDirection);\n\n if (loading) {\n return (\n <div\n className=\"@container p-page-padding\"\n role=\"status\"\n aria-busy=\"true\"\n aria-label={tWithFallback(t, \"files.browser.loading\", \"Loading files…\")}\n >\n <div className=\"grid grid-cols-2 gap-4 @md:grid-cols-3 @lg:grid-cols-4 @xl:grid-cols-5\">\n {Array.from({ length: 10 }).map((_, index) => (\n <div\n key={index}\n className=\"overflow-hidden rounded-card border border-border-seam bg-bg-surface\"\n >\n <div className=\"aspect-[4/3] w-full animate-vc-shimmer bg-bg-sunken\" />\n <div className=\"space-y-2 p-3\">\n <div className=\"h-3 w-3/4 animate-vc-shimmer rounded bg-bg-sunken\" />\n <div className=\"h-3 w-1/2 animate-vc-shimmer rounded bg-bg-sunken\" />\n </div>\n </div>\n ))}\n </div>\n </div>\n );\n }\n\n if (error) {\n return (\n <div className=\"flex items-center justify-center min-h-[500px]\">\n <div className=\"text-center max-w-md\">\n <div className=\"mb-3 text-xl font-semibold text-status-error-text\">\n {tWithFallback(\n t,\n \"files.browser.loadError\",\n \"Failed to load files\",\n )}\n </div>\n <p className=\"mb-6 text-sm text-text-secondary\">\n {error.message ||\n tWithFallback(\n t,\n \"files.browser.unexpectedError\",\n \"An unexpected error occurred\",\n )}\n </p>\n <button\n type=\"button\"\n onClick={() => window.location.reload()}\n className=\"rounded-lg bg-action-primary-bg px-6 py-2.5 text-sm font-medium text-text-inverse transition-colors hover:bg-action-primary-bg-hover\"\n >\n {tWithFallback(t, \"files.browser.retry\", \"Retry\")}\n </button>\n </div>\n </div>\n );\n }\n\n if (files.length === 0 && folders.length === 0) {\n return (\n <>\n {contextMenu && (\n <ContextMenu\n x={contextMenu.x}\n y={contextMenu.y}\n onClose={closeContextMenu}\n items={getContextMenuItems()}\n />\n )}\n </>\n );\n }\n\n if (viewMode !== \"list\") {\n return (\n <div className=\"@container bg-bg-canvas p-page-padding\">\n {/* Folders section */}\n {sortedFolders.length > 0 && (\n <div className={sortedFiles.length > 0 ? \"mb-6\" : \"\"}>\n {sortedFiles.length > 0 && (\n <h2 className=\"text-xs font-semibold text-text-tertiary uppercase tracking-wider mb-3 px-1\">\n {tWithFallback(t, \"files.browser.section.folders\", \"Folders\")}\n </h2>\n )}\n <div className=\"grid grid-cols-1 @sm:grid-cols-2 @lg:grid-cols-3 @xl:grid-cols-4 gap-2\">\n {sortedFolders.map((folder) => (\n <FolderCard\n key={folder.id}\n folder={folder}\n isSelected={selectedFolders.has(folder.id)}\n isDragging={draggedItem?.item.id === folder.id}\n isDropTarget={dragState.dropTargetFolderId === folder.id}\n draggedItem={draggedItem}\n onOpen={folderCanRead(folder) ? onFolderOpen : undefined}\n onShare={folderCanShare(folder) ? onFolderShare : undefined}\n onDelete={\n folderCanDelete(folder) ? onFolderDelete : undefined\n }\n onRestore={\n folderCanUpdate(folder) ? onFolderRestore : undefined\n }\n onRename={\n folderCanUpdate(folder) ? onFolderRename : undefined\n }\n onFavorite={\n folderCanUpdate(folder) ? onFolderFavorite : undefined\n }\n onCopy={onFolderCopy}\n onMove={folderCanUpdate(folder) ? onFolderMove : undefined}\n onInfo={onFolderInfo}\n onActivity={onFolderActivity}\n onDragStart={\n folderCanUpdate(folder) ? handleFolderDragStart : undefined\n }\n onDragEnd={handleDragEnd}\n onDrop={\n folderCanUpdate(folder) ? handleFolderDrop : undefined\n }\n onContextMenu={handleFolderContextMenu}\n />\n ))}\n </div>\n </div>\n )}\n\n {/* Files section */}\n {sortedFiles.length > 0 && (\n <div>\n {sortedFolders.length > 0 && (\n <h2 className=\"text-xs font-semibold text-text-tertiary uppercase tracking-wider mb-3 px-1\">\n {tWithFallback(t, \"files.browser.section.files\", \"Files\")}\n </h2>\n )}\n <div className=\"grid grid-cols-2 @md:grid-cols-3 @lg:grid-cols-4 @xl:grid-cols-5 gap-4\">\n {sortedFiles.map((file) => (\n <FileCard\n key={file.id}\n file={file}\n isSelected={selectedFiles.has(file.id)}\n isDragging={draggedItem?.item.id === file.id}\n onPreview={fileCanRead(file) ? onFilePreview : undefined}\n onShare={fileCanShare(file) ? onFileShare : undefined}\n onDelete={fileCanDelete(file) ? onFileDelete : undefined}\n onRestore={fileCanUpdate(file) ? onFileRestore : undefined}\n onFavorite={fileCanUpdate(file) ? onFileFavorite : undefined}\n onRename={fileCanUpdate(file) ? onFileRename : undefined}\n onDownload={fileCanRead(file) ? onFileDownload : undefined}\n onCopy={fileCanRead(file) ? onFileCopy : undefined}\n onMove={fileCanUpdate(file) ? onFileMove : undefined}\n onInfo={onFileInfo}\n onActivity={onFileActivity}\n onDragStart={\n fileCanUpdate(file) ? handleFileDragStart : undefined\n }\n onDragEnd={handleDragEnd}\n onContextMenu={handleFileContextMenu}\n />\n ))}\n </div>\n </div>\n )}\n\n {contextMenu && (\n <ContextMenu\n x={contextMenu.x}\n y={contextMenu.y}\n onClose={closeContextMenu}\n items={getContextMenuItems()}\n />\n )}\n </div>\n );\n }\n\n if (viewMode === \"list\") {\n return (\n <div className=\"@container bg-bg-canvas\">\n <div className=\"hidden @md:flex items-center gap-3 px-3 py-2 bg-bg-surface border-b border-border-seam text-text-secondary font-text-sm font-weight-medium\">\n <div className=\"flex-shrink-0 w-4\" />\n <div className=\"flex-shrink-0 w-6\" />\n <div className=\"flex-1\">\n {tWithFallback(t, \"files.browser.name\", \"Name\")}\n </div>\n <div className=\"hidden @lg:block flex-shrink-0 w-40\">\n {tWithFallback(t, \"files.browser.owner\", \"Owner\")}\n </div>\n <div className=\"hidden @md:block flex-shrink-0 w-24 text-right\">\n {tWithFallback(t, \"files.browser.size\", \"Size\")}\n </div>\n <div className=\"hidden @lg:block flex-shrink-0 w-32 text-right\">\n {tWithFallback(t, \"files.browser.modified\", \"Modified\")}\n </div>\n <div className=\"flex-shrink-0 w-32\" />\n </div>\n\n <div className=\"divide-y divide-border-subtle\">\n {sortedFolders.map((folder) => (\n <div\n key={folder.id}\n className={`group flex items-center gap-3 border-b border-border-seam bg-bg-surface p-3 transition-colors hover:bg-bg-sunken focus-within:bg-bg-sunken ${dragState.dropTargetFolderId === folder.id && draggedItem?.item.id !== folder.id ? \"bg-action-primary-bg/10\" : \"\"} ${draggedItem?.item.id === folder.id ? \"opacity-50\" : \"\"}`}\n onClick={() => {\n if (folderCanRead(folder)) onFolderOpen?.(folder);\n }}\n onKeyDown={(event) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n if (folderCanRead(folder)) onFolderOpen?.(folder);\n }\n }}\n onDragOver={(e) => {\n if (\n draggedItem &&\n draggedItem.item.id !== folder.id &&\n folderCanUpdate(folder)\n ) {\n e.preventDefault();\n handleFolderDragOver(folder.id);\n }\n }}\n onDragLeave={handleFolderDragLeave}\n onDrop={async (e) => {\n e.preventDefault();\n if (\n draggedItem &&\n draggedItem.item.id !== folder.id &&\n folderCanUpdate(folder)\n ) {\n await handleFolderDrop(folder);\n }\n }}\n onContextMenu={(e) => {\n e.preventDefault();\n handleFolderContextMenu(folder, e.clientX, e.clientY);\n }}\n role=\"button\"\n tabIndex={0}\n aria-label={tWithFallback(\n t,\n \"files.browser.openFolder\",\n \"Open folder\",\n )}\n >\n <div className=\"flex-shrink-0\">\n <input\n type=\"checkbox\"\n checked={selectedFolders.has(folder.id)}\n onChange={(e) => {\n e.stopPropagation();\n useFilesStore.getState().toggleFolderSelection(folder.id);\n }}\n className=\"size-4 rounded border-border-default bg-bg-surface text-action-primary-bg focus:ring-2 focus:ring-action-primary-bg focus:ring-offset-2\"\n aria-label={`Select ${folder.name}`}\n />\n </div>\n <Folder className=\"size-6 text-action-primary-bg flex-shrink-0\" />\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2\">\n <span className=\"font-text-md font-weight-medium text-text-primary truncate\">\n {folder.name}\n </span>\n {folder.starred && (\n <Star className=\"size-3 flex-shrink-0 fill-yellow-400 text-yellow-400\" />\n )}\n </div>\n </div>\n <div className=\"hidden @lg:block flex-shrink-0 w-40\">\n {folder.createdBy && (\n <div className=\"flex items-center gap-2\">\n {folder.createdBy.avatar && (\n <img\n src={folder.createdBy.avatar}\n alt={folder.createdBy.name}\n className=\"size-6 rounded-full\"\n />\n )}\n <span className=\"font-text-sm text-text-secondary truncate\">\n {folder.createdBy.name}\n </span>\n </div>\n )}\n </div>\n <div className=\"hidden @md:block flex-shrink-0 w-24 text-right\">\n <span className=\"font-text-sm text-text-secondary\">\n {(folder.filesCount ?? 0) + (folder.subfoldersCount ?? 0)}{\" \"}\n {tWithFallback(t, \"files.browser.items\", \"items\")}\n </span>\n </div>\n <div className=\"hidden @lg:block flex-shrink-0 w-32 text-right\">\n <span className=\"font-text-sm text-text-secondary\">\n {new Date(folder.updatedAt).toLocaleDateString()}\n </span>\n </div>\n\n <div className=\"flex w-32 flex-shrink-0 items-center gap-1 opacity-0 transition-opacity group-hover:opacity-100 group-focus-within:opacity-100\">\n {folderCanShare(folder) && onFolderShare && (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n onFolderShare(folder);\n }}\n className=\"p-1.5 hover:bg-action-ghost-bg-hover rounded transition-colors\"\n aria-label={tWithFallback(\n t,\n \"files.browser.share\",\n \"Share\",\n )}\n title={tWithFallback(\n t,\n \"files.browser.shareFolder\",\n \"Share folder\",\n )}\n >\n <svg\n className=\"size-4 text-text-primary\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M8.684 13.342C8.886 12.938 9 12.482 9 12c0-.482-.114-.938-.316-1.342m0 2.684a3 3 0 110-2.684m0 2.684l6.632 3.316m-6.632-6l6.632-3.316m0 0a3 3 0 105.367-2.684 3 3 0 00-5.367 2.684zm0 9.316a3 3 0 105.368 2.684 3 3 0 00-5.368-2.684z\"\n />\n </svg>\n </button>\n )}\n\n {folderCanUpdate(folder) && onFolderRename && (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n onFolderRename(folder);\n }}\n className=\"hidden @md:block p-1.5 hover:bg-action-ghost-bg-hover rounded transition-colors\"\n aria-label={tWithFallback(\n t,\n \"files.browser.rename\",\n \"Rename\",\n )}\n title={tWithFallback(t, \"files.browser.rename\", \"Rename\")}\n >\n <svg\n className=\"size-4 text-text-primary\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z\"\n />\n </svg>\n </button>\n )}\n\n {folderCanDelete(folder) && onFolderDelete && (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n onFolderDelete(folder);\n }}\n className=\"p-1.5 hover:bg-action-danger-bg-hover rounded transition-colors\"\n aria-label={tWithFallback(\n t,\n \"files.browser.delete\",\n \"Delete\",\n )}\n title={tWithFallback(t, \"files.browser.delete\", \"Delete\")}\n >\n <svg\n className=\"size-4 text-status-error-text\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16\"\n />\n </svg>\n </button>\n )}\n\n <div onClick={(e) => e.stopPropagation()}>\n <ActionMenu\n items={createFolderMenuItems(\n {\n onShare:\n folderCanShare(folder) && onFolderShare\n ? () => onFolderShare(folder)\n : undefined,\n onRename:\n folderCanUpdate(folder) && onFolderRename\n ? () => onFolderRename(folder)\n : undefined,\n onStar:\n folderCanUpdate(folder) && onFolderFavorite\n ? () => onFolderFavorite(folder)\n : undefined,\n onMove:\n folderCanUpdate(folder) && onFolderMove\n ? () => onFolderMove(folder)\n : undefined,\n onInfo: () => onFolderInfo?.(folder),\n onRestore:\n folderCanUpdate(folder) && onFolderRestore\n ? () => onFolderRestore(folder)\n : undefined,\n onDelete:\n folderCanDelete(folder) && onFolderDelete\n ? () => onFolderDelete(folder)\n : undefined,\n isStarred: folder.starred,\n },\n t,\n )}\n isOpen={openMenuId === folder.id}\n onToggle={(open) => setOpenMenuId(open ? folder.id : null)}\n />\n </div>\n </div>\n </div>\n ))}\n\n {sortedFiles.map((file) => (\n <FileListItem\n key={file.id}\n file={file}\n isSelected={selectedFiles.has(file.id)}\n isDragging={draggedItem?.item.id === file.id}\n onPreview={fileCanRead(file) ? onFilePreview : undefined}\n onShare={fileCanShare(file) ? onFileShare : undefined}\n onDelete={fileCanDelete(file) ? onFileDelete : undefined}\n onRestore={fileCanUpdate(file) ? onFileRestore : undefined}\n onFavorite={fileCanUpdate(file) ? onFileFavorite : undefined}\n onRename={fileCanUpdate(file) ? onFileRename : undefined}\n onDownload={fileCanRead(file) ? onFileDownload : undefined}\n onCopy={fileCanRead(file) ? onFileCopy : undefined}\n onMove={fileCanUpdate(file) ? onFileMove : undefined}\n onInfo={onFileInfo}\n onActivity={onFileActivity}\n onDragStart={\n fileCanUpdate(file) ? handleFileDragStart : undefined\n }\n onDragEnd={handleDragEnd}\n onContextMenu={handleFileContextMenu}\n />\n ))}\n </div>\n {contextMenu && (\n <ContextMenu\n x={contextMenu.x}\n y={contextMenu.y}\n onClose={closeContextMenu}\n items={getContextMenuItems()}\n />\n )}\n </div>\n );\n }\n\n return null;\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"FileBrowser.js","names":["_Fragment","FileBrowser","useI18n","useFilesStore","openMenuId","setOpenMenuId","useState","dragState","setDragState","contextMenu","setContextMenu","useDragDrop","handleFileDragStart","startDrag","file","handleFolderDragStart","folder","handleDragEnd","endDrag","handleFolderDrop","draggedItem","handleDrop","handleFolderDragOver","prev","folderId","handleFolderDragLeave","handleFileContextMenu","handleFolderContextMenu","closeContextMenu","fileCanRead","fileCanUpdate","fileCanShare","fileCanDelete","folderCanRead","folderCanUpdate","folderCanShare","folderCanDelete","getContextMenuItems","createFileMenuItems","onFileShare","onFileDownload","onFileCopy","onFileRename","onFileFavorite","onFileMove","onFileInfo","onFileActivity","onFileDelete","onFileRestore","t","createFolderMenuItems","onFolderShare","onFolderRename","onFolderFavorite","onFolderMove","onFolderInfo","onFolderDelete","onFolderRestore","sortedFiles","preserveSortOrder","files","sortFiles","sortBy","sortDirection","sortedFolders","folders","loading","tWithFallback","index","error","Fragment","ContextMenu","viewMode","onFolderOpen","event","selectedFolders","e","Folder","Star","ActionMenu","open","FileListItem","selectedFiles","onFilePreview","FolderCard","onFolderCopy","onFolderActivity","FileCard"],"sources":["../../../src/files/components/FileBrowser.tsx"],"sourcesContent":["import { type FC, useState } from \"react\";\nimport { Folder, Star } from \"lucide-react\";\nimport { useI18n } from \"@burdenoff/fe-libs/shared/providers/shell/I18nProvider\";\nimport type { FileItem, FolderItem } from \"../types\";\nimport { useFilesStore } from \"../store/filesStore\";\nimport { FileCard } from \"./FileCard\";\nimport { FileListItem } from \"./FileListItem\";\nimport { FolderCard } from \"./FolderCard\";\nimport { ActionMenu } from \"./ActionMenu\";\nimport { ContextMenu } from \"./ContextMenu\";\nimport { createFileMenuItems, createFolderMenuItems } from \"./contextMenuItems\";\nimport { sortFiles } from \"../utils\";\nimport { tWithFallback } from \"../utils/i18n\";\nimport {\n useDragDrop,\n type DragData,\n type DragOperation,\n} from \"../hooks/useDragDrop\";\n\ninterface FileBrowserProps {\n files: FileItem[];\n folders: FolderItem[];\n loading?: boolean;\n error?: Error | null;\n preserveSortOrder?: boolean;\n onFilePreview?: (file: FileItem) => void;\n onFileShare?: (file: FileItem) => void;\n onFileDelete?: (file: FileItem) => void;\n onFileRestore?: (file: FileItem) => void;\n onFileFavorite?: (file: FileItem) => void;\n onFileRename?: (file: FileItem) => void;\n onFileDownload?: (file: FileItem) => void;\n onFileCopy?: (file: FileItem) => void;\n onFileMove?: (file: FileItem) => void;\n onFileInfo?: (file: FileItem) => void;\n onFileActivity?: (file: FileItem) => void;\n onFolderOpen?: (folder: FolderItem) => void;\n onFolderShare?: (folder: FolderItem) => void;\n onFolderDelete?: (folder: FolderItem) => void;\n onFolderRestore?: (folder: FolderItem) => void;\n onFolderRename?: (folder: FolderItem) => void;\n onFolderFavorite?: (folder: FolderItem) => void;\n onFolderCopy?: (folder: FolderItem) => void;\n onFolderMove?: (folder: FolderItem) => void;\n onFolderInfo?: (folder: FolderItem) => void;\n onFolderActivity?: (folder: FolderItem) => void;\n onMoveFile?: (fileId: string, targetFolderId: string) => Promise<void>;\n onCopyFile?: (fileId: string, targetFolderId: string) => Promise<void>;\n onMoveFolder?: (folderId: string, targetFolderId: string) => Promise<void>;\n onCopyFolder?: (folderId: string, targetFolderId: string) => Promise<void>;\n}\n\nexport const FileBrowser: FC<FileBrowserProps> = ({\n files,\n folders,\n loading = false,\n error = null,\n preserveSortOrder = false,\n onFilePreview,\n onFileShare,\n onFileDelete,\n onFileRestore,\n onFileFavorite,\n onFileRename,\n onFileDownload,\n onFileCopy,\n onFileMove,\n onFileInfo,\n onFileActivity,\n onFolderOpen,\n onFolderShare,\n onFolderDelete,\n onFolderRestore,\n onFolderRename,\n onFolderFavorite,\n onFolderCopy,\n onFolderMove,\n onFolderInfo,\n onFolderActivity,\n onMoveFile,\n onCopyFile,\n onMoveFolder,\n onCopyFolder,\n}) => {\n const { t } = useI18n();\n const { viewMode, sortBy, sortDirection, selectedFiles, selectedFolders } =\n useFilesStore();\n\n const [openMenuId, setOpenMenuId] = useState<string | null>(null);\n const [dragState, setDragState] = useState<{\n draggedItem: DragData | null;\n dropTargetFolderId: string | null;\n }>({ draggedItem: null, dropTargetFolderId: null });\n const [contextMenu, setContextMenu] = useState<{\n item: FileItem | FolderItem;\n type: \"file\" | \"folder\";\n x: number;\n y: number;\n } | null>(null);\n\n const { draggedItem, startDrag, endDrag, handleDrop } = useDragDrop({\n onMoveFile,\n onCopyFile,\n onMoveFolder,\n onCopyFolder,\n });\n\n const handleFileDragStart = (file: FileItem, operation: DragOperation) => {\n startDrag({ type: \"file\", item: file, operation });\n setDragState({\n draggedItem: { type: \"file\", item: file, operation },\n dropTargetFolderId: null,\n });\n };\n\n const handleFolderDragStart = (\n folder: FolderItem,\n operation: DragOperation,\n ) => {\n startDrag({ type: \"folder\", item: folder, operation });\n setDragState({\n draggedItem: { type: \"folder\", item: folder, operation },\n dropTargetFolderId: null,\n });\n };\n\n const handleDragEnd = () => {\n endDrag();\n setDragState({ draggedItem: null, dropTargetFolderId: null });\n };\n\n const handleFolderDrop = async (folder: FolderItem) => {\n if (draggedItem) {\n await handleDrop(folder.id);\n setDragState({ draggedItem: null, dropTargetFolderId: null });\n }\n };\n\n const handleFolderDragOver = (folderId: string) => {\n setDragState((prev) => ({ ...prev, dropTargetFolderId: folderId }));\n };\n\n const handleFolderDragLeave = () => {\n setDragState((prev) => ({ ...prev, dropTargetFolderId: null }));\n };\n\n const handleFileContextMenu = (file: FileItem, x: number, y: number) => {\n setContextMenu({ item: file, type: \"file\", x, y });\n };\n\n const handleFolderContextMenu = (\n folder: FolderItem,\n x: number,\n y: number,\n ) => {\n setContextMenu({ item: folder, type: \"folder\", x, y });\n };\n\n const closeContextMenu = () => {\n setContextMenu(null);\n };\n\n const fileCanRead = (file: FileItem) =>\n file.canRead === true || file.canUpdate === true || file.canWrite === true;\n const fileCanUpdate = (file: FileItem) =>\n file.canUpdate === true || file.canWrite === true;\n const fileCanShare = (file: FileItem) =>\n file.canShare === true || fileCanUpdate(file);\n const fileCanDelete = (file: FileItem) => file.canDelete === true;\n\n const folderCanRead = (folder: FolderItem) =>\n folder.canRead === true || folder.permissions?.canRead === true;\n const folderCanUpdate = (folder: FolderItem) =>\n folder.canUpdate === true || folder.permissions?.canWrite === true;\n const folderCanShare = (folder: FolderItem) =>\n folder.permissions?.canShare === true || folderCanUpdate(folder);\n const folderCanDelete = (folder: FolderItem) =>\n folder.canDelete === true || folder.permissions?.canDelete === true;\n\n const getContextMenuItems = () => {\n if (!contextMenu) return [];\n if (contextMenu.type === \"file\") {\n const file = contextMenu.item as FileItem;\n return createFileMenuItems(\n {\n onShare:\n onFileShare && fileCanShare(file)\n ? () => onFileShare(file)\n : undefined,\n onDownload:\n onFileDownload && fileCanRead(file)\n ? () => onFileDownload(file)\n : undefined,\n onCopy:\n onFileCopy && fileCanRead(file)\n ? () => onFileCopy(file)\n : undefined,\n onRename:\n onFileRename && fileCanUpdate(file)\n ? () => onFileRename(file)\n : undefined,\n onStar:\n onFileFavorite && fileCanUpdate(file)\n ? () => onFileFavorite(file)\n : undefined,\n onMove:\n onFileMove && fileCanUpdate(file)\n ? () => onFileMove(file)\n : undefined,\n onInfo: onFileInfo ? () => onFileInfo(file) : undefined,\n onActivity: onFileActivity ? () => onFileActivity(file) : undefined,\n onDelete:\n onFileDelete && fileCanDelete(file)\n ? () => onFileDelete(file)\n : undefined,\n onRestore:\n onFileRestore && fileCanUpdate(file)\n ? () => onFileRestore(file)\n : undefined,\n isStarred: file.starred,\n },\n t,\n );\n } else {\n const folder = contextMenu.item as FolderItem;\n return createFolderMenuItems(\n {\n onShare:\n onFolderShare && folderCanShare(folder)\n ? () => onFolderShare(folder)\n : undefined,\n onRename:\n onFolderRename && folderCanUpdate(folder)\n ? () => onFolderRename(folder)\n : undefined,\n onStar:\n onFolderFavorite && folderCanUpdate(folder)\n ? () => onFolderFavorite(folder)\n : undefined,\n onMove:\n onFolderMove && folderCanUpdate(folder)\n ? () => onFolderMove(folder)\n : undefined,\n onInfo: onFolderInfo ? () => onFolderInfo(folder) : undefined,\n onDelete:\n onFolderDelete && folderCanDelete(folder)\n ? () => onFolderDelete(folder)\n : undefined,\n onRestore:\n onFolderRestore && folderCanUpdate(folder)\n ? () => onFolderRestore(folder)\n : undefined,\n isStarred: folder.starred,\n },\n t,\n );\n }\n };\n\n const sortedFiles = preserveSortOrder\n ? files\n : sortFiles(files, sortBy, sortDirection);\n const sortedFolders = preserveSortOrder\n ? folders\n : sortFiles(folders, sortBy, sortDirection);\n\n if (loading) {\n return (\n <div\n className=\"@container p-page-padding\"\n role=\"status\"\n aria-busy=\"true\"\n aria-label={tWithFallback(t, \"files.browser.loading\", \"Loading files…\")}\n >\n <div className=\"grid grid-cols-2 gap-4 @md:grid-cols-3 @lg:grid-cols-4 @xl:grid-cols-5\">\n {Array.from({ length: 10 }).map((_, index) => (\n <div\n key={index}\n className=\"overflow-hidden rounded-card border border-border-seam bg-bg-surface\"\n >\n <div className=\"aspect-[4/3] w-full animate-vc-shimmer bg-bg-sunken\" />\n <div className=\"space-y-2 p-3\">\n <div className=\"h-3 w-3/4 animate-vc-shimmer rounded bg-bg-sunken\" />\n <div className=\"h-3 w-1/2 animate-vc-shimmer rounded bg-bg-sunken\" />\n </div>\n </div>\n ))}\n </div>\n </div>\n );\n }\n\n if (error) {\n return (\n <div className=\"flex items-center justify-center min-h-[500px]\">\n <div className=\"text-center max-w-md\">\n <div className=\"mb-3 text-xl font-semibold text-status-error-text\">\n {tWithFallback(\n t,\n \"files.browser.loadError\",\n \"Failed to load files\",\n )}\n </div>\n <p className=\"mb-6 text-sm text-text-secondary\">\n {error.message ||\n tWithFallback(\n t,\n \"files.browser.unexpectedError\",\n \"An unexpected error occurred\",\n )}\n </p>\n <button\n type=\"button\"\n onClick={() => window.location.reload()}\n className=\"rounded-lg bg-action-primary-bg px-6 py-2.5 text-sm font-medium text-text-inverse transition-colors hover:bg-action-primary-bg-hover\"\n >\n {tWithFallback(t, \"files.browser.retry\", \"Retry\")}\n </button>\n </div>\n </div>\n );\n }\n\n if (files.length === 0 && folders.length === 0) {\n return (\n <>\n {contextMenu && (\n <ContextMenu\n x={contextMenu.x}\n y={contextMenu.y}\n onClose={closeContextMenu}\n items={getContextMenuItems()}\n />\n )}\n </>\n );\n }\n\n if (viewMode !== \"list\") {\n return (\n <div className=\"@container bg-bg-canvas p-page-padding\">\n {/* Folders section */}\n {sortedFolders.length > 0 && (\n <div className={sortedFiles.length > 0 ? \"mb-6\" : \"\"}>\n {sortedFiles.length > 0 && (\n <h2 className=\"text-xs font-semibold text-text-tertiary uppercase tracking-wider mb-3 px-1\">\n {tWithFallback(t, \"files.browser.section.folders\", \"Folders\")}\n </h2>\n )}\n <div className=\"grid grid-cols-1 @sm:grid-cols-2 @lg:grid-cols-3 @xl:grid-cols-4 gap-2\">\n {sortedFolders.map((folder) => (\n <FolderCard\n key={folder.id}\n folder={folder}\n isSelected={selectedFolders.has(folder.id)}\n isDragging={draggedItem?.item.id === folder.id}\n isDropTarget={dragState.dropTargetFolderId === folder.id}\n draggedItem={draggedItem}\n onOpen={folderCanRead(folder) ? onFolderOpen : undefined}\n onShare={folderCanShare(folder) ? onFolderShare : undefined}\n onDelete={\n folderCanDelete(folder) ? onFolderDelete : undefined\n }\n onRestore={\n folderCanUpdate(folder) ? onFolderRestore : undefined\n }\n onRename={\n folderCanUpdate(folder) ? onFolderRename : undefined\n }\n onFavorite={\n folderCanUpdate(folder) ? onFolderFavorite : undefined\n }\n onCopy={onFolderCopy}\n onMove={folderCanUpdate(folder) ? onFolderMove : undefined}\n onInfo={onFolderInfo}\n onActivity={onFolderActivity}\n onDragStart={\n folderCanUpdate(folder) ? handleFolderDragStart : undefined\n }\n onDragEnd={handleDragEnd}\n onDrop={\n folderCanUpdate(folder) ? handleFolderDrop : undefined\n }\n onContextMenu={handleFolderContextMenu}\n />\n ))}\n </div>\n </div>\n )}\n\n {/* Files section */}\n {sortedFiles.length > 0 && (\n <div>\n {sortedFolders.length > 0 && (\n <h2 className=\"text-xs font-semibold text-text-tertiary uppercase tracking-wider mb-3 px-1\">\n {tWithFallback(t, \"files.browser.section.files\", \"Files\")}\n </h2>\n )}\n <div className=\"grid grid-cols-2 @md:grid-cols-3 @lg:grid-cols-4 @xl:grid-cols-5 gap-4\">\n {sortedFiles.map((file) => (\n <FileCard\n key={file.id}\n file={file}\n isSelected={selectedFiles.has(file.id)}\n isDragging={draggedItem?.item.id === file.id}\n onPreview={fileCanRead(file) ? onFilePreview : undefined}\n onShare={fileCanShare(file) ? onFileShare : undefined}\n onDelete={fileCanDelete(file) ? onFileDelete : undefined}\n onRestore={fileCanUpdate(file) ? onFileRestore : undefined}\n onFavorite={fileCanUpdate(file) ? onFileFavorite : undefined}\n onRename={fileCanUpdate(file) ? onFileRename : undefined}\n onDownload={fileCanRead(file) ? onFileDownload : undefined}\n onCopy={fileCanRead(file) ? onFileCopy : undefined}\n onMove={fileCanUpdate(file) ? onFileMove : undefined}\n onInfo={onFileInfo}\n onActivity={onFileActivity}\n onDragStart={\n fileCanUpdate(file) ? handleFileDragStart : undefined\n }\n onDragEnd={handleDragEnd}\n onContextMenu={handleFileContextMenu}\n />\n ))}\n </div>\n </div>\n )}\n\n {contextMenu && (\n <ContextMenu\n x={contextMenu.x}\n y={contextMenu.y}\n onClose={closeContextMenu}\n items={getContextMenuItems()}\n />\n )}\n </div>\n );\n }\n\n if (viewMode === \"list\") {\n return (\n <div className=\"@container bg-bg-canvas\">\n <div className=\"hidden @md:flex items-center gap-3 px-3 py-2 bg-bg-surface border-b border-border-seam text-text-secondary font-text-sm font-weight-medium\">\n <div className=\"flex-shrink-0 w-4\" />\n <div className=\"flex-shrink-0 w-6\" />\n <div className=\"flex-1\">\n {tWithFallback(t, \"files.browser.name\", \"Name\")}\n </div>\n <div className=\"hidden @lg:block flex-shrink-0 w-40\">\n {tWithFallback(t, \"files.browser.owner\", \"Owner\")}\n </div>\n <div className=\"hidden @md:block flex-shrink-0 w-24 text-right\">\n {tWithFallback(t, \"files.browser.size\", \"Size\")}\n </div>\n <div className=\"hidden @lg:block flex-shrink-0 w-32 text-right\">\n {tWithFallback(t, \"files.browser.modified\", \"Modified\")}\n </div>\n <div className=\"flex-shrink-0 w-32\" />\n </div>\n\n <div className=\"divide-y divide-border-subtle\">\n {sortedFolders.map((folder) => (\n <div\n key={folder.id}\n className={`group flex items-center gap-3 border-b border-border-seam bg-bg-surface p-3 transition-colors hover:bg-bg-sunken focus-within:bg-bg-sunken ${dragState.dropTargetFolderId === folder.id && draggedItem?.item.id !== folder.id ? \"bg-action-primary-bg/10\" : \"\"} ${draggedItem?.item.id === folder.id ? \"opacity-50\" : \"\"}`}\n onClick={() => {\n if (folderCanRead(folder)) onFolderOpen?.(folder);\n }}\n onKeyDown={(event) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n if (folderCanRead(folder)) onFolderOpen?.(folder);\n }\n }}\n onDragOver={(e) => {\n if (\n draggedItem &&\n draggedItem.item.id !== folder.id &&\n folderCanUpdate(folder)\n ) {\n e.preventDefault();\n handleFolderDragOver(folder.id);\n }\n }}\n onDragLeave={handleFolderDragLeave}\n onDrop={async (e) => {\n e.preventDefault();\n if (\n draggedItem &&\n draggedItem.item.id !== folder.id &&\n folderCanUpdate(folder)\n ) {\n await handleFolderDrop(folder);\n }\n }}\n onContextMenu={(e) => {\n e.preventDefault();\n handleFolderContextMenu(folder, e.clientX, e.clientY);\n }}\n role=\"button\"\n tabIndex={0}\n aria-label={tWithFallback(\n t,\n \"files.browser.openFolder\",\n \"Open folder\",\n )}\n >\n <div className=\"flex-shrink-0\">\n <input\n type=\"checkbox\"\n checked={selectedFolders.has(folder.id)}\n onChange={(e) => {\n e.stopPropagation();\n useFilesStore.getState().toggleFolderSelection(folder.id);\n }}\n className=\"size-4 rounded border-border-default bg-bg-surface text-action-primary-bg focus:ring-2 focus:ring-action-primary-bg focus:ring-offset-2\"\n aria-label={`Select ${folder.name}`}\n />\n </div>\n <Folder className=\"size-6 text-action-primary-bg flex-shrink-0\" />\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2\">\n <span className=\"font-text-md font-weight-medium text-text-primary truncate\">\n {folder.name}\n </span>\n {folder.starred && (\n <Star className=\"size-3 flex-shrink-0 fill-yellow-400 text-yellow-400\" />\n )}\n </div>\n </div>\n <div className=\"hidden @lg:block flex-shrink-0 w-40\">\n {folder.createdBy && (\n <div className=\"flex items-center gap-2\">\n {folder.createdBy.avatar && (\n <img\n src={folder.createdBy.avatar}\n alt={folder.createdBy.name}\n className=\"size-6 rounded-full\"\n />\n )}\n <span className=\"font-text-sm text-text-secondary truncate\">\n {folder.createdBy.name}\n </span>\n </div>\n )}\n </div>\n <div className=\"hidden @md:block flex-shrink-0 w-24 text-right\">\n <span className=\"font-text-sm text-text-secondary\">\n {(folder.filesCount ?? 0) + (folder.subfoldersCount ?? 0)}{\" \"}\n {tWithFallback(t, \"files.browser.items\", \"items\")}\n </span>\n </div>\n <div className=\"hidden @lg:block flex-shrink-0 w-32 text-right\">\n <span className=\"font-text-sm text-text-secondary\">\n {new Date(folder.updatedAt).toLocaleDateString()}\n </span>\n </div>\n\n <div className=\"flex w-32 flex-shrink-0 items-center gap-1 opacity-0 transition-opacity group-hover:opacity-100 group-focus-within:opacity-100\">\n {folderCanShare(folder) && onFolderShare && (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n onFolderShare(folder);\n }}\n className=\"p-1.5 hover:bg-action-ghost-bg-hover rounded transition-colors\"\n aria-label={tWithFallback(\n t,\n \"files.browser.share\",\n \"Share\",\n )}\n title={tWithFallback(\n t,\n \"files.browser.shareFolder\",\n \"Share folder\",\n )}\n >\n <svg\n className=\"size-4 text-text-primary\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M8.684 13.342C8.886 12.938 9 12.482 9 12c0-.482-.114-.938-.316-1.342m0 2.684a3 3 0 110-2.684m0 2.684l6.632 3.316m-6.632-6l6.632-3.316m0 0a3 3 0 105.367-2.684 3 3 0 00-5.367 2.684zm0 9.316a3 3 0 105.368 2.684 3 3 0 00-5.368-2.684z\"\n />\n </svg>\n </button>\n )}\n\n {folderCanUpdate(folder) && onFolderRename && (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n onFolderRename(folder);\n }}\n className=\"hidden @md:block p-1.5 hover:bg-action-ghost-bg-hover rounded transition-colors\"\n aria-label={tWithFallback(\n t,\n \"files.browser.rename\",\n \"Rename\",\n )}\n title={tWithFallback(t, \"files.browser.rename\", \"Rename\")}\n >\n <svg\n className=\"size-4 text-text-primary\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z\"\n />\n </svg>\n </button>\n )}\n\n {folderCanDelete(folder) && onFolderDelete && (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n onFolderDelete(folder);\n }}\n className=\"p-1.5 hover:bg-action-danger-bg-hover rounded transition-colors\"\n aria-label={tWithFallback(\n t,\n \"files.browser.delete\",\n \"Delete\",\n )}\n title={tWithFallback(t, \"files.browser.delete\", \"Delete\")}\n >\n <svg\n className=\"size-4 text-status-error-text\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16\"\n />\n </svg>\n </button>\n )}\n\n <div onClick={(e) => e.stopPropagation()}>\n <ActionMenu\n items={createFolderMenuItems(\n {\n onShare:\n folderCanShare(folder) && onFolderShare\n ? () => onFolderShare(folder)\n : undefined,\n onRename:\n folderCanUpdate(folder) && onFolderRename\n ? () => onFolderRename(folder)\n : undefined,\n onStar:\n folderCanUpdate(folder) && onFolderFavorite\n ? () => onFolderFavorite(folder)\n : undefined,\n onMove:\n folderCanUpdate(folder) && onFolderMove\n ? () => onFolderMove(folder)\n : undefined,\n onInfo: () => onFolderInfo?.(folder),\n onRestore:\n folderCanUpdate(folder) && onFolderRestore\n ? () => onFolderRestore(folder)\n : undefined,\n onDelete:\n folderCanDelete(folder) && onFolderDelete\n ? () => onFolderDelete(folder)\n : undefined,\n isStarred: folder.starred,\n },\n t,\n )}\n isOpen={openMenuId === folder.id}\n onToggle={(open) => setOpenMenuId(open ? folder.id : null)}\n />\n </div>\n </div>\n </div>\n ))}\n\n {sortedFiles.map((file) => (\n <FileListItem\n key={file.id}\n file={file}\n isSelected={selectedFiles.has(file.id)}\n isDragging={draggedItem?.item.id === file.id}\n onPreview={fileCanRead(file) ? onFilePreview : undefined}\n onShare={fileCanShare(file) ? onFileShare : undefined}\n onDelete={fileCanDelete(file) ? onFileDelete : undefined}\n onRestore={fileCanUpdate(file) ? onFileRestore : undefined}\n onFavorite={fileCanUpdate(file) ? onFileFavorite : undefined}\n onRename={fileCanUpdate(file) ? onFileRename : undefined}\n onDownload={fileCanRead(file) ? onFileDownload : undefined}\n onCopy={fileCanRead(file) ? onFileCopy : undefined}\n onMove={fileCanUpdate(file) ? onFileMove : undefined}\n onInfo={onFileInfo}\n onActivity={onFileActivity}\n onDragStart={\n fileCanUpdate(file) ? handleFileDragStart : undefined\n }\n onDragEnd={handleDragEnd}\n onContextMenu={handleFileContextMenu}\n />\n ))}\n </div>\n {contextMenu && (\n <ContextMenu\n x={contextMenu.x}\n y={contextMenu.y}\n onClose={closeContextMenu}\n items={getContextMenuItems()}\n />\n )}\n </div>\n );\n }\n\n return null;\n};\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FileCard.d.ts","sourceRoot":"","sources":["../../../src/files/components/FileCard.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"FileCard.d.ts","sourceRoot":"","sources":["../../../src/files/components/FileCard.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,EAA6B,MAAM,OAAO,CAAC;AAe3D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAOzC,UAAU,aAAa;IACrB,IAAI,EAAE,QAAQ,CAAC;IACf,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,CAAC;IACrC,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,CAAC;IACnC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,CAAC;IACpC,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,CAAC;IACrC,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,CAAC;IACtC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,CAAC;IACpC,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,CAAC;IACtC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,CAAC;IAClC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,CAAC;IAClC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,CAAC;IAClC,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,CAAC;IACtC,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,KAAK,IAAI,CAAC;IACnE,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;CAChE;AAED,UAAU,sBAAuB,SAAQ,IAAI,CAC3C,aAAa,EACb,aAAa,GAAG,WAAW,CAC5B;IACC,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,KAAK,IAAI,CAAC;IACnE,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;CAChE;AAED,eAAO,MAAM,QAAQ,EAAE,EAAE,CAAC,sBAAsB,CAkZ/C,CAAC"}
|
|
@@ -3,232 +3,240 @@ import { formatFileDate as t, formatFileSize as n, getFileIcon as r } from "../u
|
|
|
3
3
|
import { tWithFallback as i } from "../utils/i18n.js";
|
|
4
4
|
import { ActionMenu as a } from "./ActionMenu.js";
|
|
5
5
|
import { getDragOperation as o } from "../hooks/useDragDrop.js";
|
|
6
|
-
import { useMemo as s,
|
|
7
|
-
import { Activity as
|
|
8
|
-
import { Fragment as
|
|
9
|
-
import { useI18n as
|
|
10
|
-
import { GlassCard as
|
|
6
|
+
import { useMemo as s, useRef as c, useState as l } from "react";
|
|
7
|
+
import { Activity as u, Copy as d, Download as f, Edit as p, FolderInput as m, Info as h, RotateCcw as g, Share2 as _, Star as v, Trash2 as y } from "lucide-react";
|
|
8
|
+
import { Fragment as b, jsx as x, jsxs as S } from "react/jsx-runtime";
|
|
9
|
+
import { useI18n as C } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
10
|
+
import { GlassCard as w } from "@burdenoff/fe-libs/ui";
|
|
11
11
|
//#region src/files/components/FileCard.tsx
|
|
12
|
-
var
|
|
13
|
-
let { t:
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
12
|
+
var T = ({ file: T, isSelected: E = !1, isDragging: D = !1, onSelect: O, onPreview: k, onShare: A, onDelete: j, onRestore: M, onFavorite: N, onRename: P, onDownload: F, onCopy: I, onMove: L, onInfo: R, onActivity: z, onDragStart: B, onDragEnd: V, onContextMenu: H }) => {
|
|
13
|
+
let { t: U } = C(), [W, G] = l(!1), [K, q] = l(!1), J = c(null), Y = (e) => {
|
|
14
|
+
if (q(e), !e) {
|
|
15
|
+
let e = J.current;
|
|
16
|
+
G(!!(e && (e.matches(":hover") || e.contains(e.ownerDocument.activeElement))));
|
|
17
|
+
}
|
|
18
|
+
}, { toggleFileSelection: X } = e(), Z = () => {
|
|
19
|
+
k && k(T);
|
|
20
|
+
}, Q = (e) => {
|
|
21
|
+
e.stopPropagation(), O ? O(T.id) : X(T.id);
|
|
22
|
+
}, $ = (e, t) => {
|
|
23
|
+
e.stopPropagation(), t(), G(!1);
|
|
24
|
+
}, ee = (e) => {
|
|
25
|
+
e.dataTransfer.effectAllowed = "copyMove", e.dataTransfer.setData("application/x-file-id", T.id), e.dataTransfer.setData("application/x-file-type", "file");
|
|
21
26
|
let t = o(e);
|
|
22
|
-
e.dataTransfer.setData("application/x-drag-operation", t),
|
|
23
|
-
},
|
|
24
|
-
|
|
25
|
-
},
|
|
26
|
-
e.preventDefault(), e.stopPropagation(),
|
|
27
|
-
},
|
|
28
|
-
...P ? [{
|
|
29
|
-
label: i(H, "files.card.download", "Download"),
|
|
30
|
-
icon: /* @__PURE__ */ b(d, { className: "size-4" }),
|
|
31
|
-
onClick: () => P(w)
|
|
32
|
-
}] : [],
|
|
33
|
-
...k ? [{
|
|
34
|
-
label: i(H, "files.card.share", "Share"),
|
|
35
|
-
icon: /* @__PURE__ */ b(g, { className: "size-4" }),
|
|
36
|
-
onClick: () => k(w)
|
|
37
|
-
}] : [],
|
|
27
|
+
e.dataTransfer.setData("application/x-drag-operation", t), B?.(T, t);
|
|
28
|
+
}, te = () => {
|
|
29
|
+
V?.();
|
|
30
|
+
}, ne = (e) => {
|
|
31
|
+
e.preventDefault(), e.stopPropagation(), H?.(T, e.clientX, e.clientY);
|
|
32
|
+
}, re = r(T.mimeType), ie = s(() => [
|
|
38
33
|
...F ? [{
|
|
39
|
-
label: i(
|
|
40
|
-
icon: /* @__PURE__ */
|
|
41
|
-
onClick: () => F(
|
|
34
|
+
label: i(U, "files.card.download", "Download"),
|
|
35
|
+
icon: /* @__PURE__ */ x(f, { className: "size-4" }),
|
|
36
|
+
onClick: () => F(T)
|
|
37
|
+
}] : [],
|
|
38
|
+
...A ? [{
|
|
39
|
+
label: i(U, "files.card.share", "Share"),
|
|
40
|
+
icon: /* @__PURE__ */ x(_, { className: "size-4" }),
|
|
41
|
+
onClick: () => A(T)
|
|
42
42
|
}] : [],
|
|
43
43
|
...I ? [{
|
|
44
|
-
label: i(
|
|
45
|
-
icon: /* @__PURE__ */
|
|
46
|
-
onClick: () => I(
|
|
44
|
+
label: i(U, "files.card.makeCopy", "Make a copy"),
|
|
45
|
+
icon: /* @__PURE__ */ x(d, { className: "size-4" }),
|
|
46
|
+
onClick: () => I(T)
|
|
47
47
|
}] : [],
|
|
48
|
-
...
|
|
49
|
-
label: i(
|
|
50
|
-
icon: /* @__PURE__ */
|
|
51
|
-
onClick: () =>
|
|
52
|
-
divider: !0
|
|
48
|
+
...L ? [{
|
|
49
|
+
label: i(U, "files.card.moveTo", "Move to"),
|
|
50
|
+
icon: /* @__PURE__ */ x(m, { className: "size-4" }),
|
|
51
|
+
onClick: () => L(T)
|
|
53
52
|
}] : [],
|
|
54
|
-
...
|
|
55
|
-
label:
|
|
56
|
-
icon: /* @__PURE__ */
|
|
57
|
-
onClick: () =>
|
|
53
|
+
...P ? [{
|
|
54
|
+
label: i(U, "files.card.rename", "Rename"),
|
|
55
|
+
icon: /* @__PURE__ */ x(p, { className: "size-4" }),
|
|
56
|
+
onClick: () => P(T),
|
|
57
|
+
divider: !0
|
|
58
58
|
}] : [],
|
|
59
|
-
...
|
|
60
|
-
label: i(
|
|
61
|
-
icon: /* @__PURE__ */
|
|
62
|
-
onClick: () =>
|
|
59
|
+
...N ? [{
|
|
60
|
+
label: T.starred ? i(U, "files.card.removeFromStarred", "Remove from starred") : i(U, "files.card.addToStarred", "Add to starred"),
|
|
61
|
+
icon: /* @__PURE__ */ x(v, { className: "size-4" }),
|
|
62
|
+
onClick: () => N(T)
|
|
63
63
|
}] : [],
|
|
64
64
|
...R ? [{
|
|
65
|
-
label: i(
|
|
66
|
-
icon: /* @__PURE__ */
|
|
67
|
-
onClick: () => R(
|
|
65
|
+
label: i(U, "files.card.details", "Details"),
|
|
66
|
+
icon: /* @__PURE__ */ x(h, { className: "size-4" }),
|
|
67
|
+
onClick: () => R(T)
|
|
68
68
|
}] : [],
|
|
69
|
-
...
|
|
70
|
-
label: i(
|
|
71
|
-
icon: /* @__PURE__ */
|
|
72
|
-
onClick: () =>
|
|
69
|
+
...z ? [{
|
|
70
|
+
label: i(U, "files.card.activity", "Activity"),
|
|
71
|
+
icon: /* @__PURE__ */ x(u, { className: "size-4" }),
|
|
72
|
+
onClick: () => z(T)
|
|
73
|
+
}] : [],
|
|
74
|
+
...j ? [{
|
|
75
|
+
label: i(U, "files.card.delete", "Delete"),
|
|
76
|
+
icon: /* @__PURE__ */ x(y, { className: "size-4" }),
|
|
77
|
+
onClick: () => j(T),
|
|
73
78
|
variant: "danger",
|
|
74
79
|
divider: !0
|
|
75
80
|
}] : [],
|
|
76
|
-
...
|
|
77
|
-
label: i(
|
|
78
|
-
icon: /* @__PURE__ */
|
|
79
|
-
onClick: () =>
|
|
81
|
+
...M ? [{
|
|
82
|
+
label: i(U, "files.card.restore", "Restore"),
|
|
83
|
+
icon: /* @__PURE__ */ x(g, { className: "size-4" }),
|
|
84
|
+
onClick: () => M(T)
|
|
80
85
|
}] : []
|
|
81
86
|
], [
|
|
82
|
-
|
|
83
|
-
P,
|
|
84
|
-
k,
|
|
87
|
+
T,
|
|
85
88
|
F,
|
|
89
|
+
A,
|
|
86
90
|
I,
|
|
87
|
-
N,
|
|
88
|
-
M,
|
|
89
91
|
L,
|
|
92
|
+
P,
|
|
93
|
+
N,
|
|
90
94
|
R,
|
|
91
|
-
|
|
95
|
+
z,
|
|
92
96
|
j,
|
|
93
|
-
|
|
97
|
+
M,
|
|
98
|
+
U
|
|
94
99
|
]);
|
|
95
|
-
return /* @__PURE__ */
|
|
100
|
+
return /* @__PURE__ */ S(w, {
|
|
101
|
+
ref: J,
|
|
96
102
|
treatment: "insight",
|
|
97
|
-
className: `@container group cursor-pointer overflow-hidden border-border-seam focus-within:shadow-elevation-2 ${
|
|
98
|
-
onClick:
|
|
99
|
-
onContextMenu:
|
|
100
|
-
onMouseEnter: () =>
|
|
101
|
-
onMouseLeave: () =>
|
|
102
|
-
|
|
103
|
+
className: `@container group cursor-pointer overflow-hidden border-border-seam focus-within:shadow-elevation-2 ${D ? "opacity-50" : ""}`,
|
|
104
|
+
onClick: Z,
|
|
105
|
+
onContextMenu: ne,
|
|
106
|
+
onMouseEnter: () => G(!0),
|
|
107
|
+
onMouseLeave: () => {
|
|
108
|
+
K || G(!1);
|
|
109
|
+
},
|
|
110
|
+
onFocus: () => G(!0),
|
|
103
111
|
onBlur: (e) => {
|
|
104
|
-
e.currentTarget.contains(e.relatedTarget)
|
|
112
|
+
!e.currentTarget.contains(e.relatedTarget) && !K && G(!1);
|
|
105
113
|
},
|
|
106
114
|
onKeyDown: (e) => {
|
|
107
|
-
(e.key === "Enter" || e.key === " ") && (e.preventDefault(),
|
|
115
|
+
e.target === e.currentTarget && (e.key === "Enter" || e.key === " ") && (e.preventDefault(), Z());
|
|
108
116
|
},
|
|
109
|
-
draggable: !!
|
|
110
|
-
onDragStart:
|
|
111
|
-
onDragEnd:
|
|
117
|
+
draggable: !!B,
|
|
118
|
+
onDragStart: ee,
|
|
119
|
+
onDragEnd: te,
|
|
112
120
|
role: "button",
|
|
113
121
|
tabIndex: 0,
|
|
114
|
-
"aria-label": `Preview ${
|
|
122
|
+
"aria-label": `Preview ${T.name}`,
|
|
115
123
|
children: [
|
|
116
|
-
/* @__PURE__ */
|
|
117
|
-
className: `absolute top-2 left-2 z-10 transition-opacity ${
|
|
118
|
-
children: /* @__PURE__ */
|
|
124
|
+
/* @__PURE__ */ x("div", {
|
|
125
|
+
className: `absolute top-2 left-2 z-10 transition-opacity ${E ? "opacity-100" : "opacity-0 group-hover:opacity-100 group-focus-within:opacity-100"}`,
|
|
126
|
+
children: /* @__PURE__ */ x("input", {
|
|
119
127
|
type: "checkbox",
|
|
120
|
-
checked:
|
|
121
|
-
onChange:
|
|
128
|
+
checked: E,
|
|
129
|
+
onChange: Q,
|
|
122
130
|
className: "size-4 rounded border-border-default bg-bg-surface text-action-primary-bg focus:ring-2 focus:ring-action-primary-bg focus:ring-offset-2",
|
|
123
|
-
"aria-label": `Select ${
|
|
131
|
+
"aria-label": `Select ${T.name}`
|
|
124
132
|
})
|
|
125
133
|
}),
|
|
126
|
-
|
|
134
|
+
T.starred && /* @__PURE__ */ x("div", {
|
|
127
135
|
className: "absolute top-2 right-2 z-10",
|
|
128
|
-
children: /* @__PURE__ */
|
|
136
|
+
children: /* @__PURE__ */ x(v, { className: "size-4 fill-yellow-400 text-yellow-400" })
|
|
129
137
|
}),
|
|
130
|
-
/* @__PURE__ */
|
|
138
|
+
/* @__PURE__ */ x("div", {
|
|
131
139
|
className: "aspect-[4/3] bg-bg-sunken flex items-center justify-center overflow-hidden",
|
|
132
|
-
children:
|
|
133
|
-
src:
|
|
134
|
-
alt:
|
|
140
|
+
children: T.thumbnailUrl ? /* @__PURE__ */ x("img", {
|
|
141
|
+
src: T.thumbnailUrl,
|
|
142
|
+
alt: T.name,
|
|
135
143
|
className: "h-full w-full object-contain p-2"
|
|
136
|
-
}) : /* @__PURE__ */
|
|
144
|
+
}) : /* @__PURE__ */ x(re, { className: "size-12 @md:size-16 text-text-muted" })
|
|
137
145
|
}),
|
|
138
|
-
/* @__PURE__ */
|
|
146
|
+
/* @__PURE__ */ S("div", {
|
|
139
147
|
className: "p-3 @md:p-4",
|
|
140
148
|
children: [
|
|
141
|
-
/* @__PURE__ */
|
|
149
|
+
/* @__PURE__ */ x("h3", {
|
|
142
150
|
className: "font-text-md font-weight-medium text-text-primary truncate mb-1",
|
|
143
|
-
children:
|
|
151
|
+
children: T.name
|
|
144
152
|
}),
|
|
145
|
-
/* @__PURE__ */
|
|
153
|
+
/* @__PURE__ */ S("div", {
|
|
146
154
|
className: "hidden @sm:flex items-center gap-2 text-text-secondary font-text-sm",
|
|
147
155
|
children: [
|
|
148
|
-
/* @__PURE__ */
|
|
156
|
+
/* @__PURE__ */ x("span", {
|
|
149
157
|
className: "tabular-nums",
|
|
150
|
-
children: n(
|
|
158
|
+
children: n(T.size)
|
|
151
159
|
}),
|
|
152
|
-
/* @__PURE__ */
|
|
160
|
+
/* @__PURE__ */ x("span", {
|
|
153
161
|
className: "text-border-subtle",
|
|
154
162
|
children: "•"
|
|
155
163
|
}),
|
|
156
|
-
/* @__PURE__ */
|
|
164
|
+
/* @__PURE__ */ x("span", { children: t(T.updatedAt) })
|
|
157
165
|
]
|
|
158
166
|
}),
|
|
159
|
-
/* @__PURE__ */
|
|
167
|
+
/* @__PURE__ */ S("div", {
|
|
160
168
|
className: "hidden @md:flex items-center gap-2 mt-2 text-text-muted font-text-xs",
|
|
161
|
-
children: [
|
|
169
|
+
children: [T.createdBy && /* @__PURE__ */ S("div", {
|
|
162
170
|
className: "flex items-center gap-1",
|
|
163
|
-
children: [
|
|
164
|
-
src:
|
|
165
|
-
alt:
|
|
171
|
+
children: [T.createdBy.avatar && /* @__PURE__ */ x("img", {
|
|
172
|
+
src: T.createdBy.avatar,
|
|
173
|
+
alt: T.createdBy.name,
|
|
166
174
|
className: "size-4 rounded-full"
|
|
167
|
-
}), /* @__PURE__ */
|
|
168
|
-
}),
|
|
169
|
-
/* @__PURE__ */
|
|
175
|
+
}), /* @__PURE__ */ x("span", { children: T.createdBy.name })]
|
|
176
|
+
}), T.isShared && /* @__PURE__ */ S(b, { children: [
|
|
177
|
+
/* @__PURE__ */ x("span", {
|
|
170
178
|
className: "text-border-subtle",
|
|
171
179
|
children: "•"
|
|
172
180
|
}),
|
|
173
|
-
/* @__PURE__ */
|
|
174
|
-
/* @__PURE__ */
|
|
181
|
+
/* @__PURE__ */ x(_, { className: "size-3" }),
|
|
182
|
+
/* @__PURE__ */ x("span", { children: i(U, "files.card.shared", "Shared") })
|
|
175
183
|
] })]
|
|
176
184
|
}),
|
|
177
|
-
|
|
185
|
+
T.tags && T.tags.length > 0 && /* @__PURE__ */ S("div", {
|
|
178
186
|
className: "hidden @lg:flex flex-wrap gap-1 mt-2",
|
|
179
|
-
children: [
|
|
187
|
+
children: [T.tags.slice(0, 3).map((e) => /* @__PURE__ */ x("span", {
|
|
180
188
|
className: "px-2 py-0.5 bg-bg-accent text-text-primary font-text-xs rounded-sm",
|
|
181
189
|
children: e
|
|
182
|
-
}, e)),
|
|
190
|
+
}, e)), T.tags.length > 3 && /* @__PURE__ */ S("span", {
|
|
183
191
|
className: "px-2 py-0.5 text-text-muted font-text-xs",
|
|
184
|
-
children: ["+",
|
|
192
|
+
children: ["+", T.tags.length - 3]
|
|
185
193
|
})]
|
|
186
194
|
})
|
|
187
195
|
]
|
|
188
196
|
}),
|
|
189
|
-
|
|
197
|
+
W && /* @__PURE__ */ S("div", {
|
|
190
198
|
className: "absolute bottom-3 right-3 flex items-center gap-1 bg-bg-elevated border border-border-subtle rounded shadow-elevation-2 p-1",
|
|
191
199
|
children: [
|
|
192
|
-
|
|
200
|
+
F && /* @__PURE__ */ x("button", {
|
|
193
201
|
type: "button",
|
|
194
|
-
onClick: (e) =>
|
|
202
|
+
onClick: (e) => $(e, () => F(T)),
|
|
195
203
|
className: "p-1.5 hover:bg-action-ghost-bg-hover rounded transition-colors",
|
|
196
|
-
"aria-label": i(
|
|
197
|
-
title: i(
|
|
198
|
-
children: /* @__PURE__ */
|
|
204
|
+
"aria-label": i(U, "files.card.download", "Download"),
|
|
205
|
+
title: i(U, "files.card.download", "Download"),
|
|
206
|
+
children: /* @__PURE__ */ x(f, { className: "size-4 text-text-primary" })
|
|
199
207
|
}),
|
|
200
|
-
|
|
208
|
+
A && /* @__PURE__ */ x("button", {
|
|
201
209
|
type: "button",
|
|
202
|
-
onClick: (e) =>
|
|
210
|
+
onClick: (e) => $(e, () => A(T)),
|
|
203
211
|
className: "p-1.5 hover:bg-action-ghost-bg-hover rounded transition-colors",
|
|
204
|
-
"aria-label": i(
|
|
205
|
-
title: i(
|
|
206
|
-
children: /* @__PURE__ */
|
|
212
|
+
"aria-label": i(U, "files.card.share", "Share"),
|
|
213
|
+
title: i(U, "files.card.share", "Share"),
|
|
214
|
+
children: /* @__PURE__ */ x(_, { className: "size-4 text-text-primary" })
|
|
207
215
|
}),
|
|
208
|
-
|
|
216
|
+
N && /* @__PURE__ */ x("button", {
|
|
209
217
|
type: "button",
|
|
210
|
-
onClick: (e) =>
|
|
218
|
+
onClick: (e) => $(e, () => N(T)),
|
|
211
219
|
className: "p-1.5 hover:bg-action-ghost-bg-hover rounded transition-colors",
|
|
212
|
-
"aria-label":
|
|
213
|
-
title:
|
|
214
|
-
children: /* @__PURE__ */
|
|
220
|
+
"aria-label": T.starred ? i(U, "files.card.unfavorite", "Unfavorite") : i(U, "files.card.favorite", "Favorite"),
|
|
221
|
+
title: T.starred ? i(U, "files.card.unfavorite", "Unfavorite") : i(U, "files.card.favorite", "Favorite"),
|
|
222
|
+
children: /* @__PURE__ */ x(v, { className: `size-4 ${T.starred ? "fill-status-warning-text text-status-warning-text" : "text-text-primary"}` })
|
|
215
223
|
}),
|
|
216
|
-
|
|
224
|
+
M && /* @__PURE__ */ x("button", {
|
|
217
225
|
type: "button",
|
|
218
|
-
onClick: (e) =>
|
|
226
|
+
onClick: (e) => $(e, () => M(T)),
|
|
219
227
|
className: "p-1.5 hover:bg-status-success-bg-subtle rounded transition-colors",
|
|
220
|
-
"aria-label": i(
|
|
221
|
-
title: i(
|
|
222
|
-
children: /* @__PURE__ */
|
|
228
|
+
"aria-label": i(U, "files.card.restore", "Restore"),
|
|
229
|
+
title: i(U, "files.card.restore", "Restore"),
|
|
230
|
+
children: /* @__PURE__ */ x(g, { className: "size-4 text-status-success-text" })
|
|
223
231
|
}),
|
|
224
|
-
/* @__PURE__ */
|
|
232
|
+
/* @__PURE__ */ x("div", {
|
|
225
233
|
onClick: (e) => e.stopPropagation(),
|
|
226
|
-
children: /* @__PURE__ */
|
|
227
|
-
items:
|
|
234
|
+
children: /* @__PURE__ */ x(a, {
|
|
235
|
+
items: ie,
|
|
228
236
|
align: "right",
|
|
229
237
|
triggerClassName: "p-1.5",
|
|
230
|
-
isOpen:
|
|
231
|
-
onToggle:
|
|
238
|
+
isOpen: K,
|
|
239
|
+
onToggle: Y
|
|
232
240
|
})
|
|
233
241
|
})
|
|
234
242
|
]
|
|
@@ -237,6 +245,6 @@ var w = ({ file: w, isSelected: T = !1, isDragging: E = !1, onSelect: D, onPrevi
|
|
|
237
245
|
});
|
|
238
246
|
};
|
|
239
247
|
//#endregion
|
|
240
|
-
export {
|
|
248
|
+
export { T as FileCard };
|
|
241
249
|
|
|
242
250
|
//# sourceMappingURL=FileCard.js.map
|