diff --git a/l4d2web/static/js/files-overlay.js b/l4d2web/static/js/files-overlay.js index 3740f1c..d3c500a 100644 --- a/l4d2web/static/js/files-overlay.js +++ b/l4d2web/static/js/files-overlay.js @@ -890,17 +890,30 @@ return; } - // External drop — collect entries via webkitGetAsEntry if available, - // else fall back to flat dataTransfer.files. + // External drop — collect entries via webkitGetAsEntry where it + // returns an Entry (real OS drag with folder support), and fall back + // to getAsFile() for any item whose entry is null (synthetic events, + // browsers without the API, or items that have no folder structure). const items = event.dataTransfer.items; const files = []; const tasks = []; - if (items && items[0] && typeof items[0].webkitGetAsEntry === "function") { + if (items && items.length) { for (let i = 0; i < items.length; i++) { - const entry = items[i].webkitGetAsEntry(); - if (entry) tasks.push(walkEntry(entry, "", files)); + const item = items[i]; + if (typeof item.webkitGetAsEntry === "function") { + const entry = item.webkitGetAsEntry(); + if (entry) { + tasks.push(walkEntry(entry, "", files)); + continue; + } + } + // Fallback: treat as a flat file. + if (typeof item.getAsFile === "function") { + const f = item.getAsFile(); + if (f) files.push({ file: f, rel: f.name }); + } } - } else { + } else if (event.dataTransfer.files) { for (let i = 0; i < event.dataTransfer.files.length; i++) { files.push({ file: event.dataTransfer.files[i], rel: event.dataTransfer.files[i].name }); }