diff --git a/api/route/public.py b/api/route/public.py index 69990a0..6cd54bf 100644 --- a/api/route/public.py +++ b/api/route/public.py @@ -62,9 +62,13 @@ async def list_news( ) if category: - cat = (await db.execute(select(Category).where(Category.slug == category))).scalar_one_or_none() - if cat: - base = base.where(Article.category_id == cat.id) + # Поддержка нескольких колледжей: category="slug1,slug2,..." + slugs = [s for s in (part.strip() for part in category.split(",")) if s] + cat_ids = ( + await db.execute(select(Category.id).where(Category.slug.in_(slugs))) + ).scalars().all() + if cat_ids: + base = base.where(Article.category_id.in_(cat_ids)) else: return {"total": 0, "offset": offset, "limit": limit, "has_more": False, "items": []} diff --git a/web-react/src/components/FilterBar.jsx b/web-react/src/components/FilterBar.jsx index 87c077b..e4567fe 100644 --- a/web-react/src/components/FilterBar.jsx +++ b/web-react/src/components/FilterBar.jsx @@ -11,19 +11,28 @@ const DATE_PRESETS = [ export default function FilterBar({ categories, tags, filters, onChange }) { const set = key => val => onChange({ ...filters, [key]: val }) + // Мультивыбор колледжей: filters.category — массив slug'ов + const selected = filters.category ?? [] + const toggleCategory = slug => { + const next = selected.includes(slug) + ? selected.filter(s => s !== slug) + : [...selected, slug] + set('category')(next) + } + return (