# design.md — candidates-mail-ui ## Текущая структура (из чтения кода) - `web/app.py` (FastAPI) — роуты: - `GET /candidates` — рендер `candidates.html` (список карточек). - `POST /posts/{id}/approve` — апрув (публикация через publisher). - `POST /posts/{id}/reject` (или аналогичный) — отклонение. - GET /media/{filename} — медиа (добавлен в web-media-preview). - Таблица `posts`: id, source_id (FK), text, direction, lang, views, reactions, media_path, status (new/published/rejected?), classified, created_at. - Таблица `classifications`: post_id, direction, relevance, interest, summary, model. ## Архитектура нового UI ### 1. Левая панель: список + группировка + bulk - Один маршрут `GET /candidates` с query-параметрами: - `group_by` ∈ {source, date, status} (по умолчанию source) - `filter` (статус: new/published/rejected/all) - `q` (поиск по тексту) - Ответ: тот же HTML (серверный рендер, Jinja2), но layout — две колонки (Bootstrap 5 grid, уже подключён). - Список строится из постов (new/rejected), сгруппированных по выбранному признаку. Группы — сворачиваемые (`
`/`` — без JS). - Каждый пост имеет чекбокс ``. - Форма bulk: `POST /candidates/bulk` с `ids[]` и `action` (approve/reject/reject-old). ### 2. Правая панель: детальный просмотр + действия - Выбранный пост: `GET /candidates/{id}` (или та же страница с `?selected=`). - Секции: - Кнопки действий: Опубликовать, Отклонить, Переклассифицировать, Переписать новость (LLM). - «Мой комментарий»: `