diff --git a/site/static/files.js b/site/static/files.js index b4a2fba..6f5151a 100644 --- a/site/static/files.js +++ b/site/static/files.js @@ -1,21 +1,16 @@ /** - * files.js — Модуль работы с файлами (Фаза 1, decoupling-final-plan.md). + * files.js — Модуль работы с файлами. * - * ВЫНЕСЕНО из app.js: - * - statusToHTML(st) — чистая: структура → HTML - * - renderFiles(state) — рендер таблицы файлов - * - syncDB() — синхронизация БД с fileQueue - * - toggleClassifyDetail(i) — раскрыть результат классификации - * - uploadFile(file, cb) — XHR-загрузка одного файла (.doc/.docx/.pdf) - * - refreshSupps() — обновить supplement_id для файлов + * ⛔⛔⛔ НЕ МЕНЯТЬ БЕЗ РАЗРЕШЕНИЯ НАЕЛЯ ⛔⛔⛔ * - * ЗАВИСИМОСТИ (глобальные, загружаются раньше): - * state.js → state (центральное состояние) - * app_utils.js → escHtml, formatSize, formatDate - * app.js → render(), stepDone, stepActive, resetStepper, showClassifyBtn + * v2.0.2: fetch() + прогресс + таблица сразу + * Проверено в бою 2026-07-16. Любое изменение = риск сломать загрузку. * - * ЗАГРУЖАЕТСЯ: после app_utils.js, перед app.js - */ + * КЛЮЧЕВЫЕ ФУНКЦИИ (не трогать): + * - uploadFile() — fetch-загрузка с имитацией прогресса + * - onFilesSelected() — все строки в таблицу сразу, потом загрузка по одной + * - statusToHTML() — рендер статуса (↑ N%, ✓) + * - renderFiles() — рендер всей таблицы /** * statusToHTML(status) — Чистая функция: структура → HTML (Фаза 1). @@ -208,12 +203,11 @@ window.toggleClassifyDetail = async function(i) { }; /** - * uploadFile(file, onProgress) — загрузка одного файла на бэкенд. + * ⛔ НЕ МЕНЯТЬ ⛔ uploadFile — fetch-загрузка с имитацией прогресса. * - * v2.0.1: fetch() вместо XHR — XHR давал ERR_CONNECTION_RESET (drhider v0.0.29) - * v2.0.2: убрана конвертация .doc (libreoffice недоступен на Штурвале) - * Прогресс: без процентов (fetch не поддерживает), только статус. - * Возвращает Promise<ответ API> + * v2.0.2: fetch() вместо XHR (XHR давал ERR_CONNECTION_RESET). + * Прогресс: setInterval 200ms, кап 90%, затем 100% при ответе. + * Кэш-бастинг: ?_=Date.now() */ function uploadFile(file, onProgress, zipSource) { if (onProgress) onProgress(0); @@ -495,17 +489,10 @@ async function finalizeUpload() { } /** - * onFilesSelected(newFiles) — Оркестратор загрузки (Фаза 1). + * ⛔ НЕ МЕНЯТЬ ⛔ onFilesSelected — все строки сразу, потом загрузка. * - * ПАТТЕРН: - * 1. Для каждого файла: addZipFile (ZIP) или addRegularFile (обычный) - * 2. finalizeUpload — завершить цикл - * - * НЕ удаляет существующие файлы — только добавляет новые. - * Дубликаты обрабатываются через confirm() в addRegularFile. - * Удаление — только вручную (кнопка ✕). - * - * Вызывается из fileInput.addEventListener('change', ...). + * v2.0.2: Фаза 1 — все строки в таблицу. Фаза 2 — загрузка по одной. + * Юзер видит таблицу целиком, каждая строка обновляется независимо. */ async function onFilesSelected(newFiles) { if (newFiles.length === 0) return;