Веб-UI: основной идентификатор карточек — download.id вместо infohash

В карточке списка и шапке /download/{id} показываем и копируем download.id
(ULID) — тот же ключ, что в логах (download_id), удобно грепать. Infohash
остаётся в блоке «Информация о торренте». Поиск по списку расширен: матчит
любой идентификатор (download.id ИЛИ infohash), плюс название/контекст.
Удалены осиротевшие поля Infohash/InfohashShort и хелпер shortenHash.

Дельта web-ui влита в спеки, change заархивирован.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
av
2026-07-04 09:47:27 +03:00
co-authored by Claude Opus 4.8
parent 80e725eb9a
commit 9ed732e49e
12 changed files with 220 additions and 64 deletions
+14 -10
View File
@@ -5,8 +5,8 @@
Презентационный слой веб-интерфейса: встроенная (`go:embed`) отдача статики и
self-hosted шрифтов, единая дизайн-система (`jellybit.css`, тёмная тема по
настройке ОС), рендеринг страниц (список загрузок, ревью, просмотр) с бейджами
состояний и клиентскими взаимодействиями без сборки (копирование infohash,
спойлер контекста). Превью раскладки берётся из единой логики `internal/layout`,
состояний и клиентскими взаимодействиями без сборки (копирование идентификатора
загрузки, спойлер контекста). Превью раскладки берётся из единой логики `internal/layout`,
а не дублируется в шаблонах. Тонкий транспорт над ядром (приём — `ingest`,
команды — `worker`, чтение — `store`).
## Requirements
@@ -130,8 +130,8 @@ self-hosted шрифтов, единая дизайн-система (`jellybit.
- **WHEN** клиент запрашивает список с параметрами фильтра по состоянию и/или
строкой поиска (`GET /?f=review&q=дюна`)
- **THEN** сервер возвращает только подходящие загрузки (по группе состояний и
совпадению строки в названии/infohash/контексте), отфильтрованные на стороне
БД, а не на клиенте
совпадению строки в названии, любом идентификаторе загрузки — `download.id`
ИЛИ infohash — и контексте), отфильтрованные на стороне БД, а не на клиенте
### Requirement: Порядок списка загрузок
@@ -262,14 +262,18 @@ jellybit (`created_at`). Порядок MUST быть согласован ме
### Requirement: Клиентские взаимодействия без сборки
Веб-UI SHALL реализовывать клиентскую логику без шага сборки и без реактивных
фреймворков: копирование infohash (vanilla JS) и раскрытие контекста нативным
`<details>`. Все действия над загрузкой SHALL выполняться через формы/htmx
(раундтрип на сервер), без клиентского пересчёта доменного состояния.
фреймворков: копирование идентификатора загрузки (vanilla JS) и раскрытие
контекста нативным `<details>`. Основной копируемый идентификатор в карточке
списка и в шапке страницы просмотра SHALL быть `download.id` (ULID) — тот же
ключ, что пишется в логи (`download_id`). Все действия над загрузкой SHALL
выполняться через формы/htmx (раундтрип на сервер), без клиентского пересчёта
доменного состояния.
#### Scenario: Копирование infohash
#### Scenario: Копирование идентификатора загрузки
- **WHEN** пользователь нажимает кнопку копирования рядом с infohash
- **THEN** значение infohash копируется в буфер обмена без перезагрузки
- **WHEN** пользователь нажимает кнопку копирования рядом с идентификатором
загрузки (`download.id`) в карточке списка или шапке страницы просмотра
- **THEN** значение `download.id` копируется в буфер обмена без перезагрузки
страницы
#### Scenario: Раскрытие контекста без JS