fix(files-overlay): fall back to getAsFile when webkitGetAsEntry returns null
webkitGetAsEntry() only returns an Entry for real OS-originated drag-drops; synthetic DragEvents (and some browsers without folder-drop support) get null back. Per-item fallback to getAsFile() keeps single-file drops working in those cases without sacrificing the whole-folder upload path on real OS drops. Caught while end-to-end testing on the deploy box: a programmatically- dispatched drop fired the listener and reached preventDefault(), but no upload row appeared because the file collection loop never enqueued. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
2d3c98866a
commit
76cd7ddda0
1 changed files with 19 additions and 6 deletions
|
|
@ -890,17 +890,30 @@
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// External drop — collect entries via webkitGetAsEntry if available,
|
// External drop — collect entries via webkitGetAsEntry where it
|
||||||
// else fall back to flat dataTransfer.files.
|
// 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 items = event.dataTransfer.items;
|
||||||
const files = [];
|
const files = [];
|
||||||
const tasks = [];
|
const tasks = [];
|
||||||
if (items && items[0] && typeof items[0].webkitGetAsEntry === "function") {
|
if (items && items.length) {
|
||||||
for (let i = 0; i < items.length; i++) {
|
for (let i = 0; i < items.length; i++) {
|
||||||
const entry = items[i].webkitGetAsEntry();
|
const item = items[i];
|
||||||
if (entry) tasks.push(walkEntry(entry, "", files));
|
if (typeof item.webkitGetAsEntry === "function") {
|
||||||
|
const entry = item.webkitGetAsEntry();
|
||||||
|
if (entry) {
|
||||||
|
tasks.push(walkEntry(entry, "", files));
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
} else {
|
}
|
||||||
|
// 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 if (event.dataTransfer.files) {
|
||||||
for (let i = 0; i < event.dataTransfer.files.length; i++) {
|
for (let i = 0; i < event.dataTransfer.files.length; i++) {
|
||||||
files.push({ file: event.dataTransfer.files[i], rel: event.dataTransfer.files[i].name });
|
files.push({ file: event.dataTransfer.files[i], rel: event.dataTransfer.files[i].name });
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue