Dashboard

React-приложение со светлой, тёмной и системной темой (следует настройкам ОС без перезагрузки), фиксированным боковым меню, live-обновлением данных и двухколоночной страницей входа (макет как у PyOrchestrator, свой фон).

Навигация

Группа Разделы
Главное Обзор, Состояние (все посты, график, онлайн/оффлайн)
Объекты Автомойки, Посты
Данные MQTT
Карты Скидочные, Сервисные, VIP, Инкассация
Аналитика Статистика использования, Финансовая статистика, Архивирование
Справочники Режимы работы, Валюты, Типы скидок (Admin)
Автоматизация Информация, Telegram, MCP сервер, Резервные копии (Admin)
Система Уведомления, Пользователи, Группы и права, Настройки, Логи (Admin)

Разделы с пометкой admin доступны только Administrator (manage_users или view_logs в JWT).
Профиль — ссылка в шапке (/profile). Мастер настройки/setup (при первом входе или ?restart=1).

Resources (сайдбар)

Элемент Описание
Dynamic API Панель :8080, статус online/offline
PyOrchestrator Панель :8090, статус через bridge health
Документация / GitHub Внешние ссылки

Подробнее о встроенных платформах: Встроенные сервисы.

Язык интерфейса (v1.1.13+)

Элемент Описание
Локали English (по умолчанию), Русский
Переключатель Шапка (флаги 🇺🇸/🇷🇺; одна иконка) и Настройки → Language
Область Меню, статусы, сообщения, подписи таблиц, логи UI; данные пользователя не переводятся
Хранение localStorage (wash_locale)

Уведомления (v1.1.14)

На странице Уведомления и в виджете на Обзоре отображаются локализованные шаблоны по типу события (mqtt_credit, user_login, wash_created и др.), а не сырой текст из БД. Параметры (сумма, логин, имя объекта) извлекаются из старых записей. Метки severity и CSV-экспорт следуют выбранному языку интерфейса.

Live-режим

Оперативные данные обновляются автоматически (usePolling). В шапке — индикатор live-режима.

Интервал Страницы
3 с Текущее состояние постов, Посты, карточка поста
5 с Обзор
10 с Карты, финансы, использование, уведомления
15 с Автомойки, архив, бэкапы, валюты, типы скидок, логи, пользователи, группы, мастер настройки

На странице Текущее состояние время режима тикает в реальном времени (LiveModeTimer).

Таблицы (DataTable)

Все основные таблицы CRM используют общий компонент DataTable с единой пагинацией.

Возможности

  • поиск по текстовым полям;
  • сортировку по клику на заголовок;
  • фильтры (выпадающие списки);
  • выбор видимых колонок (иконка настроек таблицы);
  • пагинацию (см. ниже);
  • массовые действия (экспорт CSV, удаление — где доступно).

Пагинация (v1.1.5+)

В подвале каждой таблицы:

Элемент Описание
На странице Выпадающий список: 20 / 40 / 60 / 80 / 100 записей (по умолчанию 20)
Назад / Далее Переход между страницами среди уже загруженных строк
Загрузить ещё (N записей) Догрузка следующей порции из отфильтрованного набора (N = выбранный размер страницы)

Подпись в подвале: N записей · стр. X из Y · загружено M — если есть ещё не показанные строки в текущем наборе данных.

При смене размера страницы, поиске или фильтрах счётчик сбрасывается на первую страницу.

Крупные журналы (двухуровневая загрузка)

На страницах с очень большим объёмом данных используется два уровня загрузки:

Раздел Загрузка с API Пагинация в таблице
MQTT (/mqtt) Кнопка над таблицей «Загрузить ещё (100 записей)» — следующая страница телеметрии с сервера DataTable: 20–100 строк на страницу, Назад/Далее, Загрузить ещё
Карты Аналогично, пачки по 100 с API DataTable в подвале
История состояний поста (/posts/:id) Телеметрия state/process подгружается порциями при фильтре по дате DataTable: не выводит тысячи строк сразу

Виджет «Последние уведомления» на Обзоре — компактное превью (10 строк по умолчанию, значение 10 доступно в списке «На странице»).

Разделы подробно

Обзор (/)

KPI-карточки до инкассации: наличная / безналичная / общая выручка / сумма скидок / активные ошибки.

Суммы по финансам и использованию — сумма последних записей каждого поста (не всех исторических строк).

Графики (Recharts): статус постов, круговые диаграммы «Использование» (клиенты / сервис / VIP) и доли оплаты (наличные / безнал / скидки), выручка по датам, загруженность по датам (v1.1.15). Таблица последних уведомлений (кнопка «Удалить все» на полной странице уведомлений).

Автомойки (/washes)

Справочник объектов: название, описание, адрес, дата создания, облако. Колонка «Количество постов».

Посты (/posts)

Посты с привязкой к автомойке: статус онлайн/оффлайн, номер, название, серийный номер, MQTT-логин, объект. Каскадное удаление связанных данных.

В колонке действий — иконка (настройки устройства) → страница поста. При создании/редактировании — логин и пароль MQTT для панели поста.

Онлайн — если lastMessageAt не старше 30 секунд (как на Обзоре).

Карточка поста (/posts/:id)

Блок Описание
Шапка Статус онлайн/оффлайн, название, серийный номер
Описание поста Название, адрес объекта, серийный номер, ТО, фичи
Настройки устройства Цены режимов, команды MQTT, префикс dt_pref — см. MQTT
История состояний Таблица телеметрии state/process с фильтром по датам; пагинация 20–100 строк, Загрузить ещё

Якорь #device-settings прокручивает к блоку настроек устройства.

Текущее состояние (/states)

Все посты всех объектов. Колонка Статус (онлайн/оффлайн), фильтр по статусу.

Интерактивный график на всю ширину (Recharts): переключение метрик (время режима / баланс / бесплатная пауза), tooltip с деталями, brush при большом числе постов, live-обновление времени режима.

Таблица: адрес, номер поста, баланс, пауза, скидка, live-таймер режима, название режима, дата последнего сообщения.

Карты (/cards)

Подраздел cardType
Скидочные regular
Сервисные service
VIP unlimited

Журнал применений: каждое событие NFC (state/card с поста) создаёт новую строку. Активная сессия обновляется по данным state/process (баланс, скидка).

Тип скидки — номер 15 из справочника. Статусы: success, rejected. Инкассация (cardType: collection на устройстве) — уведомление в CRM, без строки в разделе карт.

Аналитика (/usage, /finance, /archive)

  • Использование — до/после инкассации, категории regular/service/unlimited.
  • Финансы — наличные, безнал, скидочные, выручка.
  • Архивирование — политики по группам данных, журнал операций.

Система и автоматизация

Раздел Маршрут Описание
Уведомления /notifications CRM-уведомления, отметка прочитано; настройки каналов web/Telegram на Обзоре
Профиль /profile Имя, email, смена пароля (ссылка в шапке)
Мастер настройки /setup Первичная настройка CRM; повторный запуск /setup?restart=1 (Admin/Operator)
Пользователи /users Учётные записи Dynamic API, Telegram user_id, назначение групп (Admin)
Группы и права /groups RBAC-группы и матрица permissions (Admin)
Настройки /settings MQTT, Telegram notify, обновление CRM, валюта по умолчанию, язык интерфейса
Логи /logs Аудит Dynamic API (Admin)
Информация /info-messages Новости и акции для информационного бота; статус «По расписанию» → «Опубликовано» после наступления времени (Admin)
Telegram /telegram Боты PyOrchestrator: Управление / Сервисный / Информационный; QR-ссылка; массовые действия; шаблоны v3.2 / v2.2; stop-all (Admin, PyOrch)
MCP сервер /mcp HTTP MCP Dynamic API и PyOrchestrator; таблица tools; конфиг Cursor (Admin)
Резервные копии /backups MongoDB backup, ручной запуск, скачивание (Admin)
Режимы работы /work-modes Справочник режимов 0–9 (Admin)
Валюты /currency Справочник /api/crm/currencies (Admin)
Типы скидок /discount-types Номера 1–5 и названия (Admin)

Стабильность навигации (v1.1.12)

  • повторная загрузка JS-чанков при сбое сети (lazyPage);
  • RouteErrorBoundary вместо серого экрана;
  • таймаут polling 60 с; на Обзоре — сообщение об ошибке вместо бесконечного Loading.

Переключатели в шапке (v1.1.14)

  • переключатель языка — одна иконка с флагом текущей локали (на всех экранах);
  • Live/Static — одна иконка (радио / пауза) на всех экранах.

Страница входа (/login)

Двухколоночный layout (как PyOrchestrator): слева брендинг с SVG-фоном (волны/SCADA), справа форма. Переключатель темы в правом верхнем углу. Авто-refresh JWT; при истечении сессии — перенаправление на /login.

Роли пользователей

Группа Права в Dashboard
Administrator Полный доступ + разделы Система (admin)
Operator view, create, update — CRM без admin-разделов
Viewer view — только просмотр
Service Внутренний API-аккаунт (не для UI)

Управление пользователями: Dashboard → Пользователи / Группы и права или Dynamic API Panel → Users / Groups.

Прокси Dashboard (nginx)

Путь Upstream
/api/ dynamic-api:3001
/api/telegram-bots/ pyorch-bridge:3021
/api/crm/backup-files/ backup:3020
/api/crm/post-device/ message-processor:3022 (цены и команды поста)
/api/mcp Dynamic API MCP (JWT)
/api/pyorch-mcp/ PyOrchestrator MCP :8010 (если PyOrch включён)
/pyorch/ pyorch-backend:8000 (если PyOrch включён)

Демо-данные

./scripts/generate-demo-data.sh
./scripts/generate-demo-cards.sh

Сборка

cd dashboard && npm install && npm run dev    # :5173
npm run build                                  # dist/ → Docker

Технологии

React 18 · TypeScript · Vite · Tailwind · Lucide · Recharts · usePolling / LiveModeContext