Files

40 lines
3.2 KiB
Markdown

# archive-navigation
Страница «Опубликовано» (`/published`) — настоящий архив с навигацией по годам и месяцам.
## Why
Сейчас `/published` — просто плоский список последних 100 опубликованных постов
без какой-либо навигации. С ростом архива найти пост по дате невозможно: нет ни
периодов, ни фильтров, ни разбивки. Это противоречит назначению страницы —
«архив опубликованного».
Пользователь хочет классический архив: дерево лет/месяцев слева или справа,
посты — за выбранный период. Чтобы не занимать место вверху страницы
(навигация вверху слишком громоздкая), выбрана правая колонка (Q1–Q10,
grill-with-docs 2026-09-20, записано в AGENT.MD).
## What Changes
- **web/app.py**, роут `GET /published`:
- принимает query-параметры `year` (YYYY), `month` (MM), `page` (по умолчанию 1).
- строит дерево навигации: `SELECT strftime('%Y', published_at) y, strftime('%m', published_at) m, COUNT(*) n FROM posts WHERE status='published' GROUP BY y, m` → группировка по годам, внутри — месяцы с количеством. Группа «Без даты» — посты с пустым `published_at` (характер: могут появиться; сейчас 0).
- фильтрует посты по выбранному периоду: `year` + `month` (все посты за год, если месяц не указан), либо «Все посты» (без параметров).
- пагинация по 10 постов (LIMIT 10 OFFSET).
- рендер в `published.html` с деревом навигации, списком постов, подсветкой активного периода.
- **web/templates/published.html**:
- правая колонка (Bootstrap `col-md-3` + sticky) — дерево годов/месяцев со счётчиками, ссылка «Все посты», группа «Без даты»; пустые периоды не выводятся.
- слева — список постов за выбранный период + Bootstrap pagination по 10 (prev/next + номера).
- на мобильных — колонка сворачивается (Bootstrap collapse).
- **web/app.py**: хелпер построения дерева (чистая функция, тестируемая).
- Обновить `STATUS.md`, `CONTEXT.md` (глоссарий уже добавлен).
## Rollback
- Откат: `git checkout -- web/app.py web/templates/published.html` (change фиксирует
состояние до правок), рестарт vesti-web.
## Затронутые сервисы/порты
- vesti-web (:8400), внешний https://vesti.nixg.ru. БД SQLite — только чтение
через существующий `_db()` (WAL + busy_timeout).