Files
vesti/openspec/changes/archive-navigation/proposal.md
T

3.2 KiB
Raw Blame History

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).