From 13ea0efcd71f32633dfd25127b8bbd795bb0051d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CNaeel=E2=80=9D?= Date: Sat, 5 Sep 2026 13:11:25 +0300 Subject: [PATCH] Resolve Opus review code findings --- HISTORY/2026-09-05-opus-4.8-review.md | 24 +++++++++++++++------- upload/frontend/table/init_upload_table.js | 5 ----- upload/frontend/table/on_folder_change.js | 8 +------- upload/frontend/table/rebase_tree.js | 6 ++++++ upload/frontend/zip/list_zip_files.js | 8 +------- 5 files changed, 25 insertions(+), 26 deletions(-) create mode 100644 upload/frontend/table/rebase_tree.js diff --git a/HISTORY/2026-09-05-opus-4.8-review.md b/HISTORY/2026-09-05-opus-4.8-review.md index 6cc1dc4..301fce9 100644 --- a/HISTORY/2026-09-05-opus-4.8-review.md +++ b/HISTORY/2026-09-05-opus-4.8-review.md @@ -20,15 +20,25 @@ VM-upload отсутствуют; в рабочем дереве обнаруж **OPEN:** это локальные игнорируемые артефакты, не попадающие в Git. Удаление не выполнялось, поскольку удаление файлов требует отдельного решения. 4. **`set_status.js` и `api.setBusy` выглядят неиспользуемыми.** - **OPEN:** код не удалялся; требуется отдельное решение, оставить ли их как - API-задел или удалить после проверки всех интеграций. + **PARTIALLY RESOLVED:** публичный `api.setBusy` удалён как неиспользуемый. + `set_status.js` сохранён как legacy-файл до отдельного решения об удалении. 5. **`rebaseTree` дублируется в ZIP- и folder-обработчиках.** - **OPEN:** рефакторинг не выполнялся, чтобы не расширять текущую задачу - документирования ревью. + **RESOLVED:** функция вынесена в общий модуль + `upload/frontend/table/rebase_tree.js`. ## Вывод Критичных дефектов в picker-only коде ревью не выявило. Основное замечание по -рассинхронизации документации устранено. Открыты три технические задачи: -решение по локальным `__pycache__`, решение по мёртвому API/модулю и устранение -дублирования `rebaseTree`. +рассинхронизации документации устранено. После дополнительной проверки и +рефакторинга остаются две технические задачи: решение по локальным +`__pycache__` и отдельное решение по удалению либо сохранению legacy-файла +`set_status.js`. + +### Проверка после исправлений + +- Все frontend `.js` файлы проходят `node --input-type=module --check`. +- `site/app.py` проходит `python3 -m py_compile`. +- ZIP-функциональность в браузере сохранена: разрешённые leaf-файлы приняты, + `.exe` отфильтрован. +- Общий `rebaseTree` загружается, дублированных реализаций нет. +- `api.setBusy` отсутствует в публичном API. diff --git a/upload/frontend/table/init_upload_table.js b/upload/frontend/table/init_upload_table.js index b8b051b..19d4cda 100644 --- a/upload/frontend/table/init_upload_table.js +++ b/upload/frontend/table/init_upload_table.js @@ -57,11 +57,6 @@ export function initUploadTable(cfg) { state.fileKeys.clear(); render(state, elements); }, - setBusy: (busy) => { - state.busy = busy; - elements.fileInputEl.disabled = busy; - elements.folderInputEl.disabled = busy; - }, }; api.render(); return api; diff --git a/upload/frontend/table/on_folder_change.js b/upload/frontend/table/on_folder_change.js index ac5506f..dc80259 100644 --- a/upload/frontend/table/on_folder_change.js +++ b/upload/frontend/table/on_folder_change.js @@ -1,14 +1,8 @@ import { listZipFiles } from '../zip/list_zip_files.js'; import { addFileWithDedup } from './add_file_with_dedup.js'; +import { rebaseTree } from './rebase_tree.js'; import { render } from './render.js'; -function rebaseTree(root, prefix) { - root.path = `${prefix}/${root.path}`; - if (root.file) root.file = new File([root.file], root.path, { lastModified: root.file.lastModified }); - root.children.forEach((child) => rebaseTree(child, prefix)); - return root; -} - export function onFolderChange(state, cfg, elements) { return async () => { if (state.busy) return; diff --git a/upload/frontend/table/rebase_tree.js b/upload/frontend/table/rebase_tree.js new file mode 100644 index 0000000..3fb16cc --- /dev/null +++ b/upload/frontend/table/rebase_tree.js @@ -0,0 +1,6 @@ +export function rebaseTree(root, prefix) { + root.path = `${prefix}/${root.path}`; + if (root.file) root.file = new File([root.file], root.path, { lastModified: root.file.lastModified }); + root.children.forEach((child) => rebaseTree(child, prefix)); + return root; +} diff --git a/upload/frontend/zip/list_zip_files.js b/upload/frontend/zip/list_zip_files.js index 48f27af..6e86f07 100644 --- a/upload/frontend/zip/list_zip_files.js +++ b/upload/frontend/zip/list_zip_files.js @@ -1,4 +1,5 @@ // Построить дерево ZIP с файлами только разрешённых расширений. +import { rebaseTree } from '../table/rebase_tree.js'; function extensionAllowed(name, allowedExt) { const lowerName = name.toLowerCase(); @@ -20,13 +21,6 @@ function node(kind, name, path, children = [], file = null) { return { id: crypto.randomUUID(), kind, name, path, children, file, expanded: true }; } -function rebaseTree(root, prefix) { - root.path = `${prefix}/${root.path}`; - if (root.file) root.file = new File([root.file], root.path, { lastModified: root.file.lastModified }); - root.children.forEach((child) => rebaseTree(child, prefix)); - return root; -} - function addPath(root, parts, fileNode) { let current = root; parts.forEach((part, index) => {