feat: schedule filters overhaul, local fonts, configurable statuses/levels

Schedule filters:
- Airbnb-style filter modal with sections: directions, trainer, status, level, days, time
- Multi-select trainer filter with search input
- Custom time range (from-to) with preset shortcuts
- Gold tag design for class types, statuses, and levels
- Hover tooltips on level/status options with descriptions from config
- Filter icon button inline with view toggle (По дням / По группам)

Admin schedule:
- Configurable experience levels and statuses (add/edit/reorder/delete)
- New scheduleConfig DB section with auto-save
- Status/level dropdowns in class editor read from config
- Status select built dynamically from config
- New status field on ScheduleClass for custom statuses

Other:
- Local fonts (Inter + Oswald) bundled in public/fonts — no Google Fonts dependency
- SelectField combobox: search in main input field, no separate search inside dropdown
- Fix carousel trainer label flash on drag release
This commit is contained in:
2026-03-27 19:13:43 +03:00
parent d5541a8bc9
commit a69c08482f
17 changed files with 755 additions and 266 deletions
+11
View File
@@ -520,6 +520,7 @@ const SECTION_KEYS = [
"news",
"contact",
"popups",
"scheduleConfig",
] as const;
export function getSiteContent(): SiteContent | null {
@@ -557,6 +558,16 @@ export function getSiteContent(): SiteContent | null {
instagramHint: "По вопросам пишите в Instagram",
},
contact: sections.contact,
scheduleConfig: sections.scheduleConfig ?? {
levels: [
{ value: "Начинающий/Без опыта", description: "Для тех, кто только начинает" },
{ value: "Продвинутый", description: "Для учеников с опытом от 6 месяцев" },
],
statuses: [
{ key: "hasSlots", label: "Есть места", description: "В группе есть свободные места" },
{ key: "recruiting", label: "Набор открыт", description: "Идёт набор в новую группу" },
],
},
team: {
title: teamSection.title || "",
members: members.map(({ id, ...rest }) => rest),