From f45ecb603de2c520ba767ac4abbd331eaf7aab4d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E2=80=9CNaeel=E2=80=9D?=
Date: Mon, 24 Aug 2026 16:47:48 +0300
Subject: [PATCH] =?UTF-8?q?v0.0.68:=20=D0=BA=D0=BD=D0=BE=D0=BF=D0=BA=D0=B0?=
=?UTF-8?q?=20=C2=AB=D0=92=D1=8B=D0=B1=D1=80=D0=B0=D1=82=D1=8C=20=D0=BF?=
=?UTF-8?q?=D0=B0=D0=BF=D0=BA=D1=83=C2=BB=20=E2=80=94=20=D1=80=D0=B5=D0=BA?=
=?UTF-8?q?=D1=83=D1=80=D1=81=D0=B8=D0=B2=D0=BD=D1=8B=D0=B9=20=D0=B2=D1=8B?=
=?UTF-8?q?=D0=B1=D0=BE=D1=80=20=D0=BF=D0=B0=D0=BF=D0=BA=D0=B8=20=D1=81=20?=
=?UTF-8?q?=D0=BF=D0=BE=D0=B4=D0=BF=D0=B0=D0=BF=D0=BA=D0=B0=D0=BC=D0=B8=20?=
=?UTF-8?q?(webkitdirectory),=20=D0=BE=D1=82=D0=BD=D0=BE=D1=81=D0=B8=D1=82?=
=?UTF-8?q?=D0=B5=D0=BB=D1=8C=D0=BD=D1=8B=D0=B9=20=D0=BF=D1=83=D1=82=D1=8C?=
=?UTF-8?q?=20=D1=81=D0=BE=D1=85=D1=80=D0=B0=D0=BD=D1=8F=D0=B5=D1=82=D1=81?=
=?UTF-8?q?=D1=8F?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
History/README.md | 1 +
.../2026-08-24-folder-select-implemented.md | 18 +++++++
site/app.py | 2 +-
site/templates/index.html | 47 +++++++++++++++++++
4 files changed, 67 insertions(+), 1 deletion(-)
create mode 100644 History/ux-frontend/2026-08-24-folder-select-implemented.md
diff --git a/History/README.md b/History/README.md
index 112b81f..418b597 100644
--- a/History/README.md
+++ b/History/README.md
@@ -104,6 +104,7 @@
- **2026-08-24-interrupt-eta-design.md** — дизайн: TTL-фикс + прерывание с сохранением + оценка времени + 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-folder-select-implemented.md** — v0.0.68: кнопка «Выбрать папку» (webkitdirectory, рекурсивно, относительный путь).
- **2026-08-24-ui-locks-session-freeze.md** — v0.0.66: блокировки UI (выбор/удаление) на время работы, заморозка сессии + кнопка «Новая сессия».
## upload/ — загрузка файлов
diff --git a/History/ux-frontend/2026-08-24-folder-select-implemented.md b/History/ux-frontend/2026-08-24-folder-select-implemented.md
new file mode 100644
index 0000000..a502406
--- /dev/null
+++ b/History/ux-frontend/2026-08-24-folder-select-implemented.md
@@ -0,0 +1,18 @@
+# v0.0.68 — Кнопка «Выбрать папку» (webkitdirectory, рекурсивно) (2026-08-24)
+
+_ux-frontend. По плану `plans/2026-08-24-folder-select-plan.md`. Код: `site/templates/index.html`._
+
+## Что сделано
+- Кнопка «📁 Выбрать папку» (`#folderBtn`) + скрытый ``.
+- Обработчик `change` `#folderInput`:
+ - `if (busy) return` — во время загрузки/обработки выбор папки заблокирован.
+ - Берёт `webkitRelativePath` (`TopFolder/Подпапка/file.pdf`), **отбрасывает верхнюю папку** → `rel`.
+ - `.zip` → раскрывает `listZipFiles`, префикс пути папки к именам; при ошибке — zip как есть.
+ - Документы (`.pdf .doc .docx .txt .md`) → `addFileWithDedup(new File([...], rel))`.
+ - Прочее — пропускается. Индикатор «Разбираю папку…», после — «✅ Добавлено N файлов».
+- Дедуп/лимиты работают штатно (имя = относительный путь → подпапки не сливаются).
+- Поддержка: Chrome/Edge — полно, Firefox — частично, Safari — нет (best-effort).
+
+## Проверка
+- `node --check` — OK; `py_compile` — OK.
+- Версия 0.0.67 → 0.0.68.
diff --git a/site/app.py b/site/app.py
index 8bc5576..4b20c5c 100644
--- a/site/app.py
+++ b/site/app.py
@@ -21,7 +21,7 @@ if _sys_path_root not in sys.path:
sys.path.insert(0, _sys_path_root)
# Версия приложения (меняется при изменениях)
-VERSION = "0.0.67"
+VERSION = "0.0.68"
def setup_logging():
diff --git a/site/templates/index.html b/site/templates/index.html
index 2a77d17..97222b2 100644
--- a/site/templates/index.html
+++ b/site/templates/index.html
@@ -144,6 +144,8 @@
+
+