Files
jellybit/openspec/changes/archive/2026-07-01-web-ui-list-detail/proposal.md
T
avandClaude Opus 4.8 c0b5ab7295 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>
2026-07-01 09:50:24 +03:00

6.5 KiB

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_onsource_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 (фолбек на распознанное/источник отработает штатно).