diff --git a/site/templates/upload.html b/site/templates/upload.html
index 81d580b..0159342 100644
--- a/site/templates/upload.html
+++ b/site/templates/upload.html
@@ -59,7 +59,7 @@
 }})
-
Сверка договоров v1.13
+
Сверка договоров v1.14
@@ -155,9 +155,9 @@
window.removeFile = removeFile;
- // ── Загрузка файла (XHR с прогрессом) ──────────────────────
+ // ── Загрузка файла (XHR, возвращает Promise только при успехе/ошибке) ──
- function uploadFile(file, cid) {
+ function uploadFileXHR(file, cid, onProgress) {
return new Promise(function(resolve, reject) {
var xhr = new XMLHttpRequest();
var url = '/' + (cid ? '?cid=' + cid : '');
@@ -165,9 +165,8 @@
xhr.timeout = 120000;
xhr.upload.onprogress = function(e) {
- if (e.lengthComputable) {
- var pct = Math.round(e.loaded / e.total * 100);
- resolve({_progress: true, pct: pct});
+ if (e.lengthComputable && onProgress) {
+ onProgress(Math.round(e.loaded / e.total * 100));
}
};
@@ -203,56 +202,35 @@
var f = newFiles[i];
if (fileQueue.find(function(q) { return q.name === f.name && q.size === f.size && !q.isZipChild; })) continue;
- // Добавить строку с прогрессом
var entry = { name: f.name, lastModified: f.lastModified, size: f.size, status: '↑ 0%' };
fileQueue.push(entry);
var rowIdx = fileQueue.length - 1;
renderTable();
- var row = document.getElementById('row_' + rowIdx);
-
var startTime = Date.now();
- // Загружаем
- var lastPct = 0;
- var done = false;
-
- uploadFile(f, contractId).then(
- function(res) {
- if (done) return;
- if (res._progress) {
- var pct = res.pct;
- if (pct !== lastPct) {
- lastPct = pct;
- fileQueue[rowIdx].status = '↑ ' + pct + '%';
- renderTable();
- }
- return; // ждём следующий прогресс или завершение
- }
- // Завершено
- done = true;
- contractId = res.contract_id;
- var elapsed = ((Date.now() - startTime) / 1000).toFixed(1);
- fileQueue[rowIdx].status = '✓ ' + elapsed + 'с';
- fileQueue[rowIdx].uploaded = true;
+ try {
+ var resp = await uploadFileXHR(f, contractId, function(pct) {
+ fileQueue[rowIdx].status = '↑ ' + pct + '%';
renderTable();
+ });
+ contractId = resp.contract_id;
+ var elapsed = ((Date.now() - startTime) / 1000).toFixed(1);
+ fileQueue[rowIdx].status = '✓ ' + elapsed + 'с';
+ fileQueue[rowIdx].uploaded = true;
+ renderTable();
- // ZIP: показать содержимое
- if (f.type === 'application/zip' || f.name.toLowerCase().endsWith('.zip')) {
- showZipContents(f);
- }
- },
- function(err) {
- if (done) return;
- done = true;
- fileQueue[rowIdx].status = '✗ ' + err.message + '';
- renderTable();
+ if (f.type === 'application/zip' || f.name.toLowerCase().endsWith('.zip')) {
+ await showZipContents(f);
}
- );
+ } catch(err) {
+ fileQueue[rowIdx].status = '✗ ' + err.message + '';
+ renderTable();
+ }
}
fileInput.value = '';
fileInput.disabled = false;
- parseBtn.disabled = false;
+ parseBtn.disabled = (contractId === null);
parseBtn.innerHTML = ' Парсинг';
lucide.createIcons();
});