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-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-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-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 (выбор/удаление) на время работы, заморозка сессии + кнопка «Новая сессия».
|
- **2026-08-24-ui-locks-session-freeze.md** — v0.0.66: блокировки UI (выбор/удаление) на время работы, заморозка сессии + кнопка «Новая сессия».
|
||||||
|
|
||||||
## upload/ — загрузка файлов
|
## 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)
|
sys.path.insert(0, _sys_path_root)
|
||||||
|
|
||||||
# Версия приложения (меняется при изменениях)
|
# Версия приложения (меняется при изменениях)
|
||||||
VERSION = "0.0.68"
|
VERSION = "0.0.69"
|
||||||
|
|
||||||
|
|
||||||
def setup_logging():
|
def setup_logging():
|
||||||
|
|||||||
@@ -555,7 +555,8 @@ fi.addEventListener('change', async () => {
|
|||||||
if (f.name.toLowerCase().endsWith('.zip')) {
|
if (f.name.toLowerCase().endsWith('.zip')) {
|
||||||
try {
|
try {
|
||||||
const nested = await listZipFiles(f);
|
const nested = await listZipFiles(f);
|
||||||
nested.forEach(x => addFileWithDedup(x));
|
if (nested.length) nested.forEach(x => addFileWithDedup(x));
|
||||||
|
else addFileWithDedup(f); // в архиве нет документов — добавить архив как есть
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
addFileWithDedup(f); // не удалось распаковать — добавить zip как есть
|
addFileWithDedup(f); // не удалось распаковать — добавить zip как есть
|
||||||
}
|
}
|
||||||
@@ -596,9 +597,15 @@ folderInput.addEventListener('change', async () => {
|
|||||||
if (low.endsWith('.zip')) {
|
if (low.endsWith('.zip')) {
|
||||||
try {
|
try {
|
||||||
const nested = await listZipFiles(f);
|
const nested = await listZipFiles(f);
|
||||||
for (const nf of nested) {
|
if (nested.length) {
|
||||||
const nm = relDir ? relDir + '/' + nf.name : nf.name;
|
for (const nf of nested) {
|
||||||
addFileWithDedup(new File([nf], nm, { lastModified: nf.lastModified }));
|
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++;
|
added++;
|
||||||
}
|
}
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
@@ -616,7 +623,12 @@ folderInput.addEventListener('change', async () => {
|
|||||||
}
|
}
|
||||||
folderInput.value = ''; // чтобы повторный выбор той же папки сработал
|
folderInput.value = ''; // чтобы повторный выбор той же папки сработал
|
||||||
rr();
|
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; }
|
function ss(idx, h) { const e = document.getElementById('st-' + idx); if (e) e.innerHTML = h; }
|
||||||
|
|||||||
Reference in New Issue
Block a user