161 lines
6.7 KiB
Markdown
161 lines
6.7 KiB
Markdown
# План улучшений файлового менеджера Verstak2
|
||
|
||
> **Архитектура:** Плагин `verstak.files` в монорепозитории `verstak-official-plugins`.
|
||
> Код: `plugins/files/frontend/src/index.js` (vanilla JS, VerstakPluginRegister).
|
||
> API: `api.files.*`, `api.workbench.openResource()`, `api.settings`, `api.events`, `api.commands`.
|
||
|
||
## Порядок реализации
|
||
|
||
| # | Feature | Приоритет | Зависит от |
|
||
|---|---------|-----------|------------|
|
||
| 1 | Контекстное меню (правый клик) | 🔥 High | — |
|
||
| 2 | Open External / Show in Explorer | 🔥 High | — |
|
||
| 3 | Кастомный ConfirmModal | 🔥 High | — |
|
||
| 4 | Duplicate | 🔥 High | — |
|
||
| 5 | Cut/Copy/Paste | 🔥 High | — |
|
||
| 6 | Множественное выделение | 🔥 High | — |
|
||
| 7 | Drag-and-Drop | 🔥 High | — |
|
||
| 8 | Клавиатурная навигация (Ctrl+A, Escape, стрелки) | Medium | #6 |
|
||
| 9 | Богатые иконки (как в v1) | Medium | — |
|
||
| 10 | История навигации | Medium | — |
|
||
| 11 | Rename с валидацией | Medium | — |
|
||
|
||
---
|
||
|
||
### Feature 1: Контекстное меню (правый клик)
|
||
|
||
**Описание:** При правом клике на файле/папке показывать меню с действиями.
|
||
|
||
**Пункты меню:** Open, Open External, Show in Explorer, Rename, Duplicate, Cut, Copy, Delete — с разделителями.
|
||
|
||
**Архитектура:**
|
||
- Событие `contextmenu` на `.files-item`
|
||
- Позиционирование у курсора (event.clientX/Y)
|
||
- Кастомный `<div>` с пунктами, закрывается по клику вне или Escape
|
||
- Класс `.files-context-menu` для стилей
|
||
|
||
**Файлы:** `plugins/files/frontend/src/index.js`
|
||
|
||
---
|
||
|
||
### Feature 2: Open External / Show in Explorer
|
||
|
||
**Описание:** Кнопки/пункты меню для открытия файла во внешнем приложении и показа папки в системном файловом менеджере.
|
||
|
||
**Архитектура:** В v1 использовались Wails методы `OpenFile`/`OpenFolder`. В v2 нужно договориться — либо через Go runtime (пока нет), либо через IPC/events.
|
||
|
||
На первом этапе: добавить пункты в контекстное меню, но если runtime не поддерживает — показывать путь к файлу (можно скопировать в буфер обмена).
|
||
|
||
**Файлы:** `plugins/files/frontend/src/index.js`
|
||
|
||
---
|
||
|
||
### Feature 3: Кастомный ConfirmModal
|
||
|
||
**Описание:** Вместо `window.confirm()` — стилизованный modal с кнопками Отмена/Удалить, опасным стилем (красная кнопка).
|
||
|
||
**Архитектура:**
|
||
- Функция `confirmModal(message, options)` возвращает Promise
|
||
- Создаёт overlay + modal в DOM
|
||
- Закрывается по Escape или кнопке Отмена
|
||
|
||
**Файлы:** `plugins/files/frontend/src/index.js`
|
||
|
||
---
|
||
|
||
### Feature 4: Duplicate
|
||
|
||
**Описание:** Копирование файла/папки в той же папке с добавлением суффикса (напр. "filename_copy.ext", "filename_2.ext").
|
||
|
||
**Архитектура:**
|
||
- Для файла: `api.files.readText()` + `api.files.writeText()` с новым именем
|
||
- Для папки: рекурсивное копирование (сложнее, можно defer)
|
||
- Пункт в контекстном меню: "Duplicate"
|
||
|
||
**Файлы:** `plugins/files/frontend/src/index.js`
|
||
|
||
---
|
||
|
||
### Feature 5: Cut/Copy/Paste
|
||
|
||
**Описание:** Буфер обмена внутри файлового менеджера. Cut → перенос. Copy → дублирование. Paste в текущую папку.
|
||
|
||
**Архитектура:**
|
||
- `clipboard: { items: [...], mode: 'cut'|'copy' }`
|
||
- Клавиши Ctrl+X/C/V
|
||
- Пункты в контекстном меню
|
||
|
||
**Файлы:** `plugins/files/frontend/src/index.js`
|
||
|
||
---
|
||
|
||
### Feature 6: Множественное выделение
|
||
|
||
**Описание:** Ctrl+click (toggle), Shift+click (range), Ctrl+A (select all). Массовые операции (Trash, Copy, Paste).
|
||
|
||
**Архитектура:**
|
||
- `selectedPaths: Set<string>` вместо `selectedPath: string`
|
||
- Ctrl+click → toggle entry в Set
|
||
- Shift+click → range select от последнего клика
|
||
- Действия применяются ко всем выделенным
|
||
|
||
**Файлы:** `plugins/files/frontend/src/index.js`
|
||
|
||
---
|
||
|
||
### Feature 7: Drag-and-Drop
|
||
|
||
**Описание:** Перемещение файлов/папок между папками через drag-and-drop.
|
||
|
||
**Архитектура:**
|
||
- HTML5 DnD API: `dragstart`, `dragover`, `drop` на `.files-item`
|
||
- При drop на папку → `api.files.move()`
|
||
- Визуальная индикация (подсветка папки при наведении)
|
||
- Отмена по Escape
|
||
|
||
**Файлы:** `plugins/files/frontend/src/index.js`
|
||
|
||
---
|
||
|
||
### Feature 8: Клавиатурная навигация
|
||
|
||
**Описание:** Escape (снять выделение), Ctrl+A (select all), стрелки (навигация по строкам).
|
||
|
||
**Зависит от:** Feature 6 (множественное выделение)
|
||
|
||
**Файлы:** `plugins/files/frontend/src/index.js`
|
||
|
||
---
|
||
|
||
### Feature 9: Богатые иконки
|
||
|
||
**Описание:** Как в v1 — отдельные SVG иконки для image, video, audio, pdf, document, spreadsheet, presentation, archive, code, text.
|
||
|
||
**Архитектура:** Расширить функцию `fileIcon()`.
|
||
|
||
**Файлы:** `plugins/files/frontend/src/index.js`
|
||
|
||
---
|
||
|
||
### Feature 10: История навигации
|
||
|
||
**Описание:** Кнопки Back/Forward в тулбаре, как в браузере. Хранение стека посещённых папок.
|
||
|
||
**Архитектура:**
|
||
- `historyStack: string[]` с индексом
|
||
- back() / forward() / push(path)
|
||
|
||
**Файлы:** `plugins/files/frontend/src/index.js`
|
||
|
||
---
|
||
|
||
### Feature 11: Rename с валидацией
|
||
|
||
**Описание:** Проверять имя через API до применения. Показывать ошибку под полем, а не в placeholder.
|
||
|
||
**Архитектура:**
|
||
- Проверка: не пустое, нет `/`, нет null byte, не `.verstak`
|
||
- API коллизии: `api.files.metadata(newPath)` — если существует, ошибка
|
||
|
||
**Файлы:** `plugins/files/frontend/src/index.js`
|