From 22e85df4485f3636c7bebcff1da27e69d5b4c7d5 Mon Sep 17 00:00:00 2001 From: Blake <80996688+BlakeTnr@users.noreply.github.com> Date: Thu, 20 Nov 2025 16:26:36 -0500 Subject: [PATCH] Support folder drag-n-drop (#19320) --- .../workspace/Knowledge/KnowledgeBase.svelte | 36 ++++++++++++++++--- 1 file changed, 31 insertions(+), 5 deletions(-) diff --git a/src/lib/components/workspace/Knowledge/KnowledgeBase.svelte b/src/lib/components/workspace/Knowledge/KnowledgeBase.svelte index 0054eb2964..0121c37d0a 100644 --- a/src/lib/components/workspace/Knowledge/KnowledgeBase.svelte +++ b/src/lib/components/workspace/Knowledge/KnowledgeBase.svelte @@ -546,14 +546,40 @@ e.preventDefault(); dragged = false; + const handleUploadingFileFolder = (items) => { + for(const item of items) { + + if(item.isFile) { + item.file((file) => { + uploadFileHandler(file); + }) + continue; + } + + // Not sure why you have to call webkitGetAsEntry and isDirectory seperate, but it won't work if you try item.webkitGetAsEntry().isDirectory + const wkentry = item.webkitGetAsEntry(); + const isDirectory = wkentry.isDirectory; + if(isDirectory) { + // Read the directory + wkentry.createReader().readEntries((entries) => { + handleUploadingFileFolder(entries) + }, (error) => { + console.error('Error reading directory entries:', error); + }); + } else { + toast.info($i18n.t('Uploading file...')); + uploadFileHandler(item.getAsFile()); + toast.success($i18n.t('File uploaded!')); + } + } + } + if (e.dataTransfer?.types?.includes('Files')) { if (e.dataTransfer?.files) { - const inputFiles = e.dataTransfer?.files; + const inputItems = e.dataTransfer?.items; - if (inputFiles && inputFiles.length > 0) { - for (const file of inputFiles) { - await uploadFileHandler(file); - } + if (inputItems && inputItems.length > 0) { + handleUploadingFileFolder(inputItems) } else { toast.error($i18n.t(`File not found.`)); }