From 741edafc4a7167b2e87902ad5abc8ff8199ff17e Mon Sep 17 00:00:00 2001 From: Repinoid Date: Sat, 12 Sep 2026 19:48:37 +0300 Subject: [PATCH] chore: sync local VM mirror state --- .venv/bin/python | 1 - .venv/bin/python3 | 1 - .venv/bin/python3.12 | 1 - .venv/lib64 | 1 - .venv/pyvenv.cfg | 5 ---- PLAN-file-picker.md | 62 ++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 62 insertions(+), 9 deletions(-) delete mode 120000 .venv/bin/python delete mode 120000 .venv/bin/python3 delete mode 120000 .venv/bin/python3.12 delete mode 120000 .venv/lib64 delete mode 100644 .venv/pyvenv.cfg create mode 100644 PLAN-file-picker.md diff --git a/.venv/bin/python b/.venv/bin/python deleted file mode 120000 index b8a0adb..0000000 --- a/.venv/bin/python +++ /dev/null @@ -1 +0,0 @@ -python3 \ No newline at end of file diff --git a/.venv/bin/python3 b/.venv/bin/python3 deleted file mode 120000 index ae65fda..0000000 --- a/.venv/bin/python3 +++ /dev/null @@ -1 +0,0 @@ -/usr/bin/python3 \ No newline at end of file diff --git a/.venv/bin/python3.12 b/.venv/bin/python3.12 deleted file mode 120000 index b8a0adb..0000000 --- a/.venv/bin/python3.12 +++ /dev/null @@ -1 +0,0 @@ -python3 \ No newline at end of file diff --git a/.venv/lib64 b/.venv/lib64 deleted file mode 120000 index 7951405..0000000 --- a/.venv/lib64 +++ /dev/null @@ -1 +0,0 @@ -lib \ No newline at end of file diff --git a/.venv/pyvenv.cfg b/.venv/pyvenv.cfg deleted file mode 100644 index 9376090..0000000 --- a/.venv/pyvenv.cfg +++ /dev/null @@ -1,5 +0,0 @@ -home = /usr/bin -include-system-site-packages = false -version = 3.12.3 -executable = /usr/bin/python3.12 -command = /usr/bin/python3 -m venv /home/naeel/nubes/drhider/.venv diff --git a/PLAN-file-picker.md b/PLAN-file-picker.md new file mode 100644 index 0000000..8363868 --- /dev/null +++ b/PLAN-file-picker.md @@ -0,0 +1,62 @@ +# ПЛАН: компонент выбора файлов/папок/архивов → файловое дерево + +> Для Flash. Vanilla JS, БЕЗ React и сборщика (как drhider). Новое — только если проще. +> Переиспользуемый компонент (слой 1 из `PLAN-upload-layers.md`). + +## Решения (фиксировано) + +| Вопрос | Решение | Почему | +|---|---|---| +| Стек | **vanilla JS**, один модуль | drhider без сборщика; React избыточен | +| ZIP | **`fflate`** (`unzipSync`/`unzip` + `filter`) | заменяет ручной `parseZip` (~200 строк); 8 kB; filter по расширению ДО распаковки | +| Выбор папки | `webkitdirectory` (оставить) | уже в drhider, рекурсивно | +| Дерево | **свой лёгкий** рендер (ленивый + делегирование) | jsTree старые, react — нет | +| Единственная новая зависимость | `fflate` (CDN `unpkg`/`jsdelivr`) | оправдано и проще | + +## Модель узла +``` +node = { type:'dir'|'zip'|'file', name, path, size, file, children, collapsed } +``` +- `path` для file — полный относительный путь: `"Папка/архив.zip/Внутри/файл.txt"`. +- Дубль = `path`+`size` → пропуск; имя то же, размер другой → суффикс `_2`. + +## API компонента +``` +createFilePicker({ container, allowedExt, maxFileBytes, onSelectionChange }) -> { + pickFiles(), pickFolder(), + getFlatFiles() -> [{path,name,size,file}], // в слой закачки + getOverNames(), clear(), setStatus(path, html) +} +``` + +## Сборка дерева +1. **Папка**: `webkitRelativePath="Top/…"` → отбросить `Top` → вставить по сегментам. +2. **Файлы**: в корень; `.zip` → `fflate.unzip` (рекурсивно по вложенным `.zip`), узел `zip` + дети. +3. **Фильтр**: лист принимается только если расширение ∈ `allowedExt`; `.zip` — ради раскрытия. + +## Рендер (сотни файлов) +- Свёрнутый `dir`/`zip` **не рендерит детей** (ленивый). +- Плоский список «видимых строк» одним проходом (или `DocumentFragment`). +- Клики — **делегирование** (один обработчик на контейнер по `data-path`), не сотни слушателей. +- `getFlatFiles()` — обход дерева, только листья-файлы. + +## Шаги (для Flash) +1. Подключить `fflate` (CDN). Написать обёртку `zip.js`: `listZip(f) -> [{path,name,size,file}]` с `filter` по `allowedExt`. +2. Модель узла + вставка по сегментам пути. +3. Сборка из `folderInput` (webkitRelativePath) и `fileInput` (раскрытие zip рекурсивно). +4. Дедуп (`path`+`size`, суффикс `_2`). +5. Рендер дерева: collapse, ленивый рендер, делегирование кликов. +6. Фильтр `allowedExt` + лимит + статус «пропущен (лимит)». +7. `getFlatFiles()` → слой закачки. + +## Чек-лист приёмки +- [ ] дерево папок/архивов сворачивается/разворачивается; +- [ ] путь файла из архива виден (`Папка/архив.zip/…`); +- [ ] дубли исключены, коллизия имени → `_2`; +- [ ] `allowedExt` — параметр (фильтр и в zip, и в папке); +- [ ] сотни файлов не тормозят (ленивый рендер + делегирование); +- [ ] `getFlatFiles()` отдаёт только учитываемые файлы. + +## Не делать (не оправдано) +- React / сборщик / jQuery-деревья (jsTree, Fancytree). +- Виртуализация `react-arborist` — только если появятся тысячи узлов и будет React.