feat: grouped nav tree with badges, dashboard events section with filtered chart

Navigation:
- Restructure flat nav into grouped tree: Notification (Trackers,
  Configs, Templates), Commands (same), Bots (Telegram), Settings
  (Common, Users)
- Collapsible groups with expand/collapse state persisted in localStorage
- Auto-expand group containing the active page
- Counter badges on groups (sum of children) and individual items
- New /api/status/counts endpoint for nav badge data
- Mobile bottom nav uses flattened key pages

Dashboard:
- Rename "Recent Events" to "Events"
- Move chart under Events section (after filters, before event list)
- Filters (event type, provider, search) now affect both the event
  list AND the chart simultaneously
- Add event_type, provider_id, search filter params to /api/status/chart
This commit is contained in:
2026-03-21 23:07:55 +03:00
parent ddcbfdaa0b
commit 2c740ff2d2
5 changed files with 366 additions and 65 deletions
+36 -12
View File
@@ -16,7 +16,17 @@
"cmdTemplateConfigs": "Шаблоны команд",
"users": "Пользователи",
"settings": "Настройки",
"logout": "Выход"
"logout": "Выход",
"notification": "Уведомления",
"commands": "Команды",
"bots": "Боты",
"trackers": "Трекеры",
"configs": "Настройки",
"templates": "Шаблоны",
"telegram": "Telegram",
"email": "Email",
"matrix": "Matrix",
"common": "Общие"
},
"auth": {
"signIn": "Войти",
@@ -39,7 +49,7 @@
"providers": "Провайдеры",
"activeTrackers": "Активные трекеры",
"targets": "Получатели",
"recentEvents": "Последние события",
"recentEvents": "События",
"noEvents": "Событий пока нет. Создайте трекер для отслеживания.",
"loading": "Загрузка...",
"justNow": "только что",
@@ -253,7 +263,7 @@
"enabledCommands": "Включённые команды",
"defaultCount": "Кол-во по умолчанию",
"responseMode": "Режим ответа",
"modeMedia": "Медиа (фото)",
"modeMedia": "Медиа (файлы)",
"modeText": "Только текст",
"botLocale": "Язык бота",
"rateLimits": "Ограничения частоты",
@@ -396,13 +406,27 @@
"invalidFormat": "Некорректная строка формата"
},
"templateVars": {
"message_assets_added": { "description": "Уведомление о добавлении файлов в альбом" },
"message_assets_removed": { "description": "Уведомление об удалении файлов из альбома" },
"message_album_renamed": { "description": "Уведомление о переименовании альбома" },
"message_album_deleted": { "description": "Уведомление об удалении альбома" },
"periodic_summary_message": { "description": "Периодическая сводка альбомов (планировщик не реализован)" },
"scheduled_assets_message": { "description": "Запланированная подборка фото (планировщик не реализован)" },
"memory_mode_message": { "description": "«В этот день» — воспоминания (планировщик не реализован)" },
"message_assets_added": {
"description": "Уведомление о добавлении файлов в альбом"
},
"message_assets_removed": {
"description": "Уведомление об удалении файлов из альбома"
},
"message_album_renamed": {
"description": "Уведомление о переименовании альбома"
},
"message_album_deleted": {
"description": "Уведомление об удалении альбома"
},
"periodic_summary_message": {
"description": "Периодическая сводка альбомов (планировщик не реализован)"
},
"scheduled_assets_message": {
"description": "Запланированная подборка фото (планировщик не реализован)"
},
"memory_mode_message": {
"description": "«В этот день» — воспоминания (планировщик не реализован)"
},
"album_id": "ID альбома (UUID)",
"album_name": "Название альбома",
"album_url": "Публичная ссылка (пусто, если не расшарен)",
@@ -544,7 +568,7 @@
"enabledCommands": "Включённые команды",
"locale": "Язык",
"responseMode": "Режим ответа",
"modeMedia": "Медиа (фото)",
"modeMedia": "Медиа (файлы)",
"modeText": "Только текст",
"defaultCount": "Кол-во по умолчанию",
"rateLimits": "Ограничения частоты",
@@ -662,4 +686,4 @@
"line": "строка",
"add": "Добавить"
}
}
}