UI/UX списка и карточки загрузки: серверные фильтр/поиск/пагинация, матч-ссылка, имя раздачи (web-ui-list-detail)
- Список: серверные фильтр по группе состояний, поиск и пагинация (GET
f/q/page/all, по 25), сортировка по времени добавления в qBittorrent
(added_on) с фолбеком на created_at и tie-break по id.
- Заголовок загрузки = имя раздачи (display_name) → распознанное название →
усечённый источник; сырой magnet вынесен в блок «Информация о торренте».
- Матч метабазы показан ссылкой на запись (страница загрузки и ревью);
URL берётся у выбранного кандидата либо строится по provider+id и типу.
- Полировка вёрстки; клиентская JS-фильтрация убрана (всё серверное, без JS).
- Миграция 0005 (display_name, source_added_at); воркер однократно
фиксирует source_added_at при поллинге/усыновлении; ER-схема обновлена.
- OpenSpec: дельты влиты в specs/{web-ui,ingest}, change заархивирован.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,72 @@
|
||||
## Why
|
||||
|
||||
Пачка UI/UX-задач беклога («Главная: список вместо таблицы», «Расширенная
|
||||
информация о загрузке», «показывать матч с записью метабазы», «список: фильтр,
|
||||
поиск, пагинация», «Полировка веб-UI») частично уже закрыта при внедрении
|
||||
современного server-rendered UI. Осталось довести хвосты: список не масштабируется
|
||||
на рост БД (нет серверной пагинации, фильтр/поиск чисто клиентские по уже
|
||||
загруженным карточкам), подтверждённый матч метабазы показывается без ссылки на
|
||||
запись, заголовок карточки — сырой magnet вместо имени раздачи, и есть мелкие
|
||||
дефекты вёрстки. Собираем это в одно небольшое изменение.
|
||||
|
||||
## What Changes
|
||||
|
||||
- **Список загрузок — серверные фильтр, поиск и пагинация.** Фильтр по группе
|
||||
состояний, поиск по названию/infohash/контексту и постраничная выдача (по 25)
|
||||
через query-параметры (`?f=`, `?q=`, `?page=`), на стороне `store`/`httpapi`;
|
||||
заменяет текущую клиентскую фильтрацию по отрендеренным карточкам. Сортировка —
|
||||
по времени добавления торрента в источник (qBittorrent `added_on`), фолбек —
|
||||
время создания загрузки в jellybit. Скрытие `deleted` по умолчанию сохраняется.
|
||||
Живой прогресс активных карточек (htmx-поллинг) не ломается.
|
||||
- **Заголовок загрузки = имя раздачи qBittorrent.** При приёме сохраняем
|
||||
выведенное отображаемое имя (`rename`, что уходит в qBittorrent) в новую колонку
|
||||
`display_name`. Заголовок карточки и шапка страницы берут его; если пусто —
|
||||
распознанное название из плана; если и его нет — сырой источник (magnet) **одной
|
||||
строкой как обычный заголовок** (усечённо), а не в три строки.
|
||||
- **Матч с записью метабазы со ссылкой.** На странице просмотра
|
||||
(`/download/{id}`) и в блоке «Источник совпадения» ревью подтверждённый матч
|
||||
(TMDB/TVDB/IMDb) показывается как ссылка на запись (название, год, провайдер-id,
|
||||
URL), а не только `провайдер · id`.
|
||||
- **Блок «Информация о торренте» на странице загрузки.** Полный magnet/сырой
|
||||
источник и infohash выносятся в отдельный блок, чтобы заголовок оставался чистым.
|
||||
- **Полировка вёрстки:** блок «Распознано как» растянуть на всю ширину (снять
|
||||
`max-width` у списка полей); в блоке «Файлы и раскладка» приклеить стрелку к
|
||||
строке файла-источника, чтобы источник и цель шли строго друг под другом.
|
||||
|
||||
Вне объёма (отдельные задачи беклога): полный лог переходов состояний (требует
|
||||
таблицы истории), собственный идентификатор загрузки, выбор источника матча с
|
||||
предпросмотром полей, показ матча в Telegram, SSE.
|
||||
|
||||
## Capabilities
|
||||
|
||||
### New Capabilities
|
||||
|
||||
Нет.
|
||||
|
||||
### Modified Capabilities
|
||||
|
||||
- `web-ui`: список получает серверные фильтр/поиск/пагинацию (было — клиентская
|
||||
фильтрация без пагинации); заголовок загрузки берётся из сохранённого имени
|
||||
раздачи с фолбеком; страница просмотра получает блок «Информация о торренте» и
|
||||
показывает подтверждённый матч метабазы ссылкой на запись.
|
||||
- `ingest`: выведенное отображаемое имя теперь не только уходит в qBittorrent, но
|
||||
и **сохраняется** у загрузки (для показа в веб-UI); прежний инвариант «не влияет
|
||||
на пути/распознавание/раскладку» сохраняется.
|
||||
|
||||
## Impact
|
||||
|
||||
- **БД (миграция):** новые колонки `download.display_name` и
|
||||
`download.source_added_at` (время добавления в qBittorrent); обновление
|
||||
ER-схемы `docs/specs/database.md`. Новые запросы списка с
|
||||
`WHERE`/`LIKE`/`ORDER BY`/`LIMIT`/`OFFSET` и счётчиком (`store`).
|
||||
- **Код:** `internal/store` (колонки, запрос списка с фильтром/поиском/сортировкой/
|
||||
пагинацией и count), `internal/ingest` (запись `display_name` при создании
|
||||
загрузки), `internal/worker` (захват `added_on` → `source_added_at` при
|
||||
поллинге),
|
||||
`internal/httpapi` (разбор query-параметров списка, view-модели, ссылка на матч,
|
||||
блок торрента, заголовок с фолбеком), шаблоны `web/templates` (index, download,
|
||||
review, layout_widget) и `web/static/css` (полировка), возможно `web/static/js`
|
||||
(упрощение/удаление клиентской фильтрации).
|
||||
- **Обратная совместимость:** REST API (`/api/downloads`) не меняется в контракте;
|
||||
добавление query-параметров списка — аддитивно. Существующие строки БД получат
|
||||
пустой `display_name` (фолбек на распознанное/источник отработает штатно).
|
||||
Reference in New Issue
Block a user