v0.0.69: архивы из папки не теряются — zip без документов добавляется как есть; раскрытие zip с документами; склонение счётчика
Deploy drhider / validate (push) Canceled after 0s
Deploy drhider / validate (push) Canceled after 0s
This commit is contained in:
@@ -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.64–0.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
@@ -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():
|
||||
|
||||
@@ -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; }
|
||||
|
||||
Reference in New Issue
Block a user