2.4 KiB
2.4 KiB
v0.0.66 — Блокировки UI: предсказуемое поведение во всех состояниях (2026-08-24)
ux-frontend. По замечанию: во время обработки «Выбрать файлы» оставалась активной — юзер мог менять список и ломать состояние/индексы. Требование: ВСЁ предсказуемо, учтены ВСЕ действия юзера.
Состояния и доступные действия
| Состояние | Выбрать файлы | ✕ удалить | Обфусцировать | Прервать | Скачать | Новая сессия |
|---|---|---|---|---|---|---|
| Простой | ✅ | ✅ | ✅ | — | — | — |
| Загрузка (1/2) | 🔒 | 🔒 | 🔒 | — | — | — |
| Обработка (2/2) | 🔒 | 🔒 | 🔒 | ✅ | — | — |
| Результат готов | 🔒 | 🔒 | 🔒 | — | ✅ | ✅ |
| Ошибка | ✅ | ✅ | ✅ | — | — | — |
Реализация
- Глобальный флаг
busy+setBusy(b): блокируетfileInputи скрывает кнопки «✕» (CSSbody.busy .remove-btn { display:none }). - Двойная защита: обработчики
change(выбор файлов) иrm(удаление) игнорируют вызовы приbusy. uploadFiles(): guardif (busy) return+setBusy(true); ранние выходы (ошибки фазы 1, test-режим) —setBusy(false).- Заморозка сессии после результата:
complete/cancelled→sessionDone=true,fi/uploadBtnвыключены, показаны «Скачать» и новая кнопка «🔄 Новая сессия» (resetAll). Ошибки — снимают блокировку (можно повторить). - При закрытии вкладки (beforeunload) —
resetAllсбрасывает всё.
Найденный и исправленный баг при правке
- При добавлении заморозки случайно затёрлась строка
activeES.addEventListener('complete', ...)— JS-синтаксис сломался («Missing catch»). Восстановлено ДО пуша;node --check— OK.
Проверка
node --check(извлечённый <script>) — OK;py_compile— OK.