diff --git a/site/app.py b/site/app.py index 6e92d63..fab97b3 100644 --- a/site/app.py +++ b/site/app.py @@ -20,7 +20,7 @@ if _sys_path_root not in sys.path: sys.path.insert(0, _sys_path_root) # Версия приложения (меняется при изменениях) -VERSION = "0.0.8" +VERSION = "0.0.9" def create_app(): diff --git a/site/templates/index.html b/site/templates/index.html index 6e8f59f..1983238 100644 --- a/site/templates/index.html +++ b/site/templates/index.html @@ -205,6 +205,8 @@ async function uploadFiles() { // Фаза 2: обработка (SSE — прогресс по каждому файлу) for (let i = 0; i < total; i++) ss(i, ''); + const fileTimers = {}; // idx -> performance.now() + const fileIntervals = {}; // idx -> setInterval id st.className = 'status progress'; st.textContent = 'Обработка...'; const t0 = performance.now(); @@ -218,11 +220,17 @@ async function uploadFiles() { const es = new EventSource('/api/process_stream/' + currentSid); es.addEventListener('start', function(e) { const d = JSON.parse(e.data); - ss(d.idx, '⏳ обработка'); + fileTimers[d.idx] = performance.now(); + fileIntervals[d.idx] = setInterval(function() { + const elapsed = ((performance.now() - fileTimers[d.idx]) / 1000).toFixed(1); + ss(d.idx, '⏳ ' + elapsed + 'с'); + }, 200); }); es.addEventListener('done', function(e) { const d = JSON.parse(e.data); - ss(d.idx, ''); + clearInterval(fileIntervals[d.idx]); + const elapsed = ((performance.now() - (fileTimers[d.idx] || performance.now())) / 1000).toFixed(1); + ss(d.idx, '✓ ' + elapsed + 'с'); }); es.addEventListener('complete', function(e) { es.close();