From 0d28d811a85e59cd38e37cffc28a736e09155b10 Mon Sep 17 00:00:00 2001 From: Linus Rath <139418639+rathlinus@users.noreply.github.com> Date: Sat, 21 Mar 2026 04:07:30 +0100 Subject: [PATCH] feat: support uploading folders via drag-and-drop and toolbar button --- components/files/file-browser.tsx | 39 ++++++-- components/files/file-upload-area.tsx | 16 +++- lib/webdav/drop-utils.ts | 126 ++++++++++++++++++++++++++ locales/de/common.json | 2 +- locales/en/common.json | 2 +- locales/es/common.json | 2 +- locales/fr/common.json | 2 +- locales/it/common.json | 2 +- locales/ja/common.json | 2 +- locales/nl/common.json | 2 +- locales/pt/common.json | 2 +- stores/file-store.ts | 5 +- 12 files changed, 179 insertions(+), 23 deletions(-) create mode 100644 lib/webdav/drop-utils.ts diff --git a/components/files/file-browser.tsx b/components/files/file-browser.tsx index e62042f8..ef62d814 100644 --- a/components/files/file-browser.tsx +++ b/components/files/file-browser.tsx @@ -21,6 +21,7 @@ import { loadFilesSettings } from "@/components/files/files-settings-dialog"; import type { FolderLayout } from "@/components/files/files-settings-dialog"; import { FolderTreeSidebar } from "@/components/files/folder-tree-sidebar"; import { ResizeHandle } from "@/components/layout/resize-handle"; +import { getDroppedFilesAndFolders } from "@/lib/webdav/drop-utils"; import type { FileResource } from "@/stores/file-store"; type SortKey = "name" | "size" | "modified"; @@ -624,16 +625,20 @@ export function FileBrowser({ e.stopPropagation(); setIsDraggingOver(false); - const files = Array.from(e.dataTransfer.files); - if (files.length > 0) { - setIsUploading(true); - try { - await onUploadFiles(files); - } finally { - setIsUploading(false); + setIsUploading(true); + try { + const { files, hasDirectories } = await getDroppedFilesAndFolders(e.dataTransfer); + if (files.length > 0) { + if (hasDirectories) { + await onUploadFolder(files); + } else { + await onUploadFiles(files); + } } + } finally { + setIsUploading(false); } - }, [onUploadFiles]); + }, [onUploadFiles, onUploadFolder]); const handleFileInputChange = async (e: React.ChangeEvent) => { const files = Array.from(e.target.files || []); @@ -945,6 +950,16 @@ export function FileBrowser({ > +