v0.0.69: архивы из папки не теряются — zip без документов добавляется как есть; раскрытие zip с документами; склонение счётчика
Deploy drhider / validate (push) Canceled after 0s

This commit is contained in:
“Naeel”
2026-08-24 17:10:21 +03:00
parent f45ecb603d
commit 2a49155b05
4 changed files with 52 additions and 6 deletions
+1
View File
@@ -105,6 +105,7 @@
- **2026-08-24-interrupt-eta-implemented.md** — v0.0.63: реализовано прерывание с сохранением + ETA + UI-таблица.
- **2026-08-24-time-tickers-estimates.md** — v0.0.640.0.65: тикер текущего файла на всех этапах, мгновенные оценки времени по файлам и суммарно.
- **2026-08-24-folder-select-implemented.md** — v0.0.68: кнопка «Выбрать папку» (webkitdirectory, рекурсивно, относительный путь).
- **2026-08-24-folder-zip-not-lost.md** — v0.0.69: архивы из папки без документов не теряются (добавляются как есть); раскрытие zip с документами; склонение счётчика.
- **2026-08-24-ui-locks-session-freeze.md** — v0.0.66: блокировки UI (выбор/удаление) на время работы, заморозка сессии + кнопка «Новая сессия».
## upload/ — загрузка файлов
@@ -0,0 +1,33 @@
# v0.0.69 — Архивы из папки: не терять, раскрывать документы (2026-08-24)
_ux-frontend. После ретеста v0.0.68 пользователем на проде._
## Ситуация
Пользователь выбрал папку, в которой лежали `iviconfig8257.zip` (17.1 KB) и
`Nail_Nevrolog_20250602.PDF`. Добавился только PDF («Добавлено из папки: 1 файлов»),
zip не раскрылся. Требование: «если в папке архив — его надо раскрывать!».
## Диагностика (Playwright на проде, v0.0.68)
- Сервер отдавал v0.0.68 с кнопкой — деплой прошёл; первая загрузка страницы
показывала старый кэш v0.0.67 (нужен reload).
- Собранный в браузере валидный zip с документами в подпапке — обработчик папки
РАСКРЫВАЕТ корректно: файлы добавляются с префиксом пути (`Подпапка/Договор…`),
статус «Добавлено из папки: 4 файлов».
- Вывод: `iviconfig8257.zip` не раскрылся, потому что ВНУТРИ нет документов
(конфиги/прочее) — `listZipFiles` вернул пусто. Оба обработчика (fileInput и
folderInput) молча ТЕРЯЛИ такой архив.
## Фикс (site/templates/index.html)
1. `fi`-обработчик: `nested.length` → добавлять файлы; иначе — архив как есть.
2. `folder`-обработчик: то же для zip из папки (если документов нет — архив как есть).
3. Склонение счётчика: «1 файл / 2 файла / 5 файлов».
Поведение после фикса:
- В папке zip с документами → раскрывается (файлы с путём в таблицу).
- В папке zip без документов / нераспакованный → добавляется как zip, не теряется.
## Проверка
- `node --check` — OK, `py_compile` — OK.
- Локальный запуск на 127.0.0.1:5010 (v0.0.69), сценарий папки
[zip-конфиг + PDF] → «✅ Добавлено из папки: 2 файла», в таблице оба файла.
- Версия 0.0.68 → 0.0.69.
+1 -1
View File
@@ -21,7 +21,7 @@ if _sys_path_root not in sys.path:
sys.path.insert(0, _sys_path_root)
# Версия приложения (меняется при изменениях)
VERSION = "0.0.68"
VERSION = "0.0.69"
def setup_logging():
+17 -5
View File
@@ -555,7 +555,8 @@ fi.addEventListener('change', async () => {
if (f.name.toLowerCase().endsWith('.zip')) {
try {
const nested = await listZipFiles(f);
nested.forEach(x => addFileWithDedup(x));
if (nested.length) nested.forEach(x => addFileWithDedup(x));
else addFileWithDedup(f); // в архиве нет документов — добавить архив как есть
} catch (err) {
addFileWithDedup(f); // не удалось распаковать — добавить zip как есть
}
@@ -596,9 +597,15 @@ folderInput.addEventListener('change', async () => {
if (low.endsWith('.zip')) {
try {
const nested = await listZipFiles(f);
for (const nf of nested) {
const nm = relDir ? relDir + '/' + nf.name : nf.name;
addFileWithDedup(new File([nf], nm, { lastModified: nf.lastModified }));
if (nested.length) {
for (const nf of nested) {
const nm = relDir ? relDir + '/' + nf.name : nf.name;
addFileWithDedup(new File([nf], nm, { lastModified: nf.lastModified }));
added++;
}
} else {
// в архиве нет документов — добавить архив как есть, чтобы не терялся
addFileWithDedup(new File([f], rel, { lastModified: f.lastModified }));
added++;
}
} catch (err) {
@@ -616,7 +623,12 @@ folderInput.addEventListener('change', async () => {
}
folderInput.value = ''; // чтобы повторный выбор той же папки сработал
rr();
if (added) { st.className = 'status done'; st.textContent = '✅ Добавлено из папки: ' + added + ' файлов'; }
if (added) {
st.className = 'status done';
const n = added;
const w = (n % 10 === 1 && n % 100 !== 11) ? 'файл' : (n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14)) ? 'файла' : 'файлов';
st.textContent = '✅ Добавлено из папки: ' + n + ' ' + w;
}
});
function ss(idx, h) { const e = document.getElementById('st-' + idx); if (e) e.innerHTML = h; }