- base.html: container -> container-fluid (nav and content full width)
- Right pane: large buttons Publish / Process with local model /
Rewrite / Reject (for new candidates)
- Left pane bottom: bulk operations panel with 4 visible buttons
(Publish / Process / Reject / Stale) instead of hidden select
- bulk: action 'process' reclassifies selected with local model
(impl_reclassify extracted); ids optional (empty selection ->
no_selection redirect instead of 422); redirect preserves filters
- Tests: full width, buttons present, bulk empty/process, published/metrics — green
- Группировка вынесена из onchange-сабмита bulk-формы в GET-ссылки
(/candidates?group_by=...&filters...&selected=...)
- Чекбоксы bulk привязаны к форме атрибутом form='bulk-form' (без JS,
HTML5) — устранены вложенные формы (невалидный HTML)
- Выбор поста — ссылкой GET (selected=id) вместо POST /candidates/select
- app.py: добавлен filters_qs (query-string фильтров для ссылок),
импорт urllib.parse.quote; /candidates/select оставлен для обратной
совместимости (сабмит старых форм)
- Тест: смена группировки, bulk reject, выбор поста, фильтры — зелёные