(allFiles)
| 1475 | XHR-based submitFiles (fallback when Resumable is unavailable) |
| 1476 | ------------------------------------------------------ */ |
| 1477 | function submitFiles(allFiles) { |
| 1478 | const folderToUse = (() => { |
| 1479 | const f = window.currentFolder || "root"; |
| 1480 | try { return decodeURIComponent(f); } catch (e) { return f; } |
| 1481 | })(); |
| 1482 | |
| 1483 | const progressContainer = document.getElementById("uploadProgressContainer"); |
| 1484 | const fileInput = document.getElementById("file"); |
| 1485 | if (!progressContainer) { |
| 1486 | console.warn("submitFiles called but #uploadProgressContainer not found"); |
| 1487 | return; |
| 1488 | } |
| 1489 | |
| 1490 | // --- Ensure there are progress list items for these files --- |
| 1491 | let listItems = progressContainer.querySelectorAll("li.upload-progress-item"); |
| 1492 | |
| 1493 | if (!listItems.length) { |
| 1494 | // Guarantee each file has a stable uploadIndex |
| 1495 | allFiles.forEach((file, index) => { |
| 1496 | if (file.uploadIndex === undefined || file.uploadIndex === null) { |
| 1497 | file.uploadIndex = index; |
| 1498 | } |
| 1499 | }); |
| 1500 | |
| 1501 | // Build the UI rows for these files |
| 1502 | // This will also set window.selectedFiles and fileInfoContainer, etc. |
| 1503 | processFiles(allFiles); |
| 1504 | |
| 1505 | // Re-query now that processFiles has populated the DOM |
| 1506 | listItems = progressContainer.querySelectorAll("li.upload-progress-item"); |
| 1507 | } |
| 1508 | |
| 1509 | const progressElements = {}; |
| 1510 | listItems.forEach(item => { |
| 1511 | progressElements[item.dataset.uploadIndex] = item; |
| 1512 | }); |
| 1513 | |
| 1514 | let finishedCount = 0; |
| 1515 | let allSucceeded = true; |
| 1516 | const uploadResults = new Array(allFiles.length).fill(false); |
| 1517 | |
| 1518 | allFiles.forEach(file => { |
| 1519 | const formData = new FormData(); |
| 1520 | const uploadFile = file.file || file; |
| 1521 | if (!(uploadFile instanceof Blob)) { |
| 1522 | const li = progressElements[file.uploadIndex]; |
| 1523 | if (li && li.progressBar) { |
| 1524 | li.progressBar.innerText = "Error"; |
| 1525 | } |
| 1526 | try { |
| 1527 | showToast(t('upload_read_error'), 6000, 'error'); |
| 1528 | } catch (e) {} |
| 1529 | uploadResults[file.uploadIndex] = false; |
| 1530 | allSucceeded = false; |
| 1531 | finishedCount++; |
| 1532 | return; |
| 1533 | } |
| 1534 | const uploadName = uploadFile.name || file.name || file.fileName || "upload.bin"; |
no test coverage detected