Dashboard

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

Навигация

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

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

Встроенная справка (v1.1.22, размещение v1.1.28)

Элемент Описание
Sidebar Пункт Справка внизу меню — между «Мастер настроек» и «Ресурсы», над ссылкой «Документация» (тот же стиль, что у остальных пунктов)
Окно Полноэкранная справка: оглавление по группам меню, поиск, схемы экранов, примеры
Закрытие Крестик или Esc
Языки EN / RU (как интерфейс CRM)
Документация Ссылка на GitHub Pages внизу панели справки

Хлебные крошки (v1.1.22)

Над контентом страницы — цепочка группа меню → раздел (те же названия, что в боковом меню).

Пример URL Крошки
/usage Аналитика → Использование
/system Система → Информация
/info-messages Автоматизация → Публикации
/cards/discount Карты → Скидочные
/posts/:id Объекты → Посты → серийный номер

Группа не является ссылкой; промежуточные разделы (например «Посты» на карточке поста) кликабельны.

Resources (сайдбар)

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

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

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

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

Структура файлов i18n (v1.1.37+)

Базовые строки — dashboard/src/i18n/messages/{en,ru}.ts. Feature-модули вынесены отдельно:

Модуль Файлы
Справка messages/help/{en,ru}.ts
Страница «Модули» messages/features/modules.{en,ru}.ts
Обновления и repair messages/features/updates.{en,ru}.ts
Уведомления модулей/обновлений messages/features/notifications-features.{en,ru}.ts

См. README i18n в репозитории.

Уведомления (v1.1.14, пагинация v1.1.52)

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

Полная страница уведомлений (/notifications) — v1.1.52

Тот же паттерн серверной пагинации, что и в журнале MQTT:

Элемент Поведение
Размер страницы 100 записей за запрос к API
Загрузить ещё Одна кнопка над таблицей — «Загрузить ещё (100 записей)»
Подзаголовок Показано, всего, время последнего обновления
Опрос Live-обновление каждые 3 с (usePolling)

Виджет на Обзоре — компактное превью (10 строк), отдельно от полной страницы.

Обновления ПО и модули (v1.1.34)

Дополнительные типы событий (шаблоны EN/RU в notifications-features.{en,ru}.ts):

  • Обновления ПО — запуск, успех, ошибка (CRM, Dynamic API, PyOrchestrator)
  • Модули — установка, удаление, запуск, остановка, обновление, ошибки

Каналы web и Telegram настраиваются на Обзоре или в Уведомлениях.

Live-режим

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

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

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

Таблицы (DataTable)

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

Возможности

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

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

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

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

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

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

Крупные журналы (серверная «Загрузить ещё»)

На страницах с очень большим объёмом данных используется серверная пагинация (кнопка над таблицей). Пагинация DataTable в подвале (20–100 строк) — только по уже загруженным строкам; второй «Загрузить ещё» в подвале на этих страницах нет.

Раздел Серверная загрузка Примечания
MQTT (/mqtt) Загрузить ещё (100 записей) над таблицей Полный count в подзаголовке
Карты Аналогично, пачки по 100 с API
Уведомления (/notifications) Загрузить ещё (100 записей) над таблицей (v1.1.52) Только web-уведомления
История состояний поста (/posts/:id) Загрузить ещё (100 записей) над таблицей (v1.1.51) Телеметрия state/process; API с count=false; hasMore по размеру страницы

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

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

Обзор (/)

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

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

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

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

Справочник объектов: название, описание, адрес, дата создания, облако, UUID (mapsExternalId) для внешних площадок. Колонка «Количество постов».

UUID (mapsExternalId): назначается автоматически при создании (и при init-seed для существующих моек без поля). Модуль Автомойки рядом отправляет его на сайт «Автомойки рядом» как Owner API external_id — так площадка понимает, какая это мойка, без знания внутреннего Mongo id CRM и без числового id сайта.

Посты (/posts)

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

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

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

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

Блок Описание
Шапка Статус онлайн/оффлайн, название, серийный номер
Описание поста Название, адрес объекта, серийный номер, ТО, фичи (прошивка/гарантия — legacy JSON, в UI не редактируются); сохранение не затирает mqttLogin/mqttPassword (v1.1.54)
Настройки устройства Цены режимов, команды MQTT, префикс dt_pref — см. MQTT
История состояний Телеметрия state/process с фильтром по датам; Загрузить ещё (100 записей) над таблицей; серверные страницы через usePolling (v1.1.51)

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

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

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

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

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

Информация (/system) — v1.1.16, v1.1.22

Страница состояния платформы в группе «Система» (пункт «Информация»). Не путать с группой меню «Система» в целом и с «Публикациями» в автоматизации.

Блок Описание
Сводные карточки ОС, ядра CPU, hostname, uptime сервера
Память / Диск Шкалы занятости и объёмы
Компоненты Версии WASH PRO CRM, Dynamic API, PyOrchestrator (update-bridge)
Приложение Название CRM, версия, окружение, платформа Docker, Node.js API
Детали CPU Модель (fallback /proc/cpuinfo в Docker), ядра, средняя нагрузка
Сеть Таблица интерфейсов хоста с поиском

Live-обновление каждые 30 с (GET /api/dashboard/system через Dynamic API).

Целостность и исправление (/settings) — v1.1.21

Секция в Настройках (перед «Обновления ПО»). Только администраторы (manage_users / manage_api).

Действие Описание
Проверить целостность Диагностика mount /deploy, WASH_HOST_PROJECT_ROOT, DATA_DIR, .env, ключевых файлов, Docker socket, docker compose config, зависших обновлений
Применить исправления Выбранные действия: синхронизация корня в .env, нормализация DATA_DIR (только если путь ошибочно в /deploy), git safe.directory, сброс зависшего job, Mosquitto (fix-mqtt.sh), init-seed

DATA_DIR (v1.1.19+): абсолютные пути на хосте (/mnt/hdd/data, /var/lib/wash-pro-crm) — корректны; предупреждение только при DATA_DIR внутри /deploy.

Git (v1.1.21+): /deploy — bind mount проекта; проверка регистрирует git safe.directory (dubious ownership). Без .git на хосте автообновление недоступно.

API: GET/POST /api/crm/updates/repair (update-bridge).

Обновления ПО (/settings#updates) — v1.1.20

Секция «Обновления ПО» в Настройках и баннер в шапке. Только администраторы.

Элемент Описание
Карточки компонентов WASH PRO CRM, Dynamic API, PyOrchestrator — текущая и последняя версия
Проверить сейчас Принудительная проверка релизов (GitHub API или git ls-remote без токена)
Обновить Запуск job через update-bridge (fetch + reset → build → seed → health)
Скрыть уведомление Dismiss до следующего релиза
Ошибка на карточке Failed job остаётся с текстом ошибки и логом шага (v1.1.20)

Шаг pull CRM (v1.1.20+): git fetch + git reset --hard origin/main — сбрасывает только отслеживаемые файлы; .env, DATA_DIR, docker-compose.override.yml, local/ сохраняются.

Сборка (v1.1.20+): scripts/compose-files.sh — те же -f, что у scripts/start.sh (override, Redis, PyOrchestrator).

Поведение v1.1.18+: загрузка страницы и опрос прогресса job не обращаются к GitHub — только кэш update-bridge. GITHUB_TOKEN в .env опционален (release notes, лимит API).

v1.1.50+: баннер больше не крутит спиннер на зависшей задаче queued, если целевая версия уже установлена; update-bridge закрывает такие задачи и запускает следующую в очереди.

v1.1.51+: перед новым обновлением update-bridge снимает зависшую активную задачу (та же логика, что в проверке целостности).

Состояние: DATA_DIR/update-bridge/state.json. API: GET /api/crm/updates/status, POST /api/crm/updates/check, POST /api/crm/updates/apply/{component}.

Карты (/cards)

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

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

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

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

  • Использование — до/после инкассации, категории regular/service/unlimited.
  • Финансы — наличные, безнал, скидочные, выручка.
  • Архивирование — политики по группам данных (в т.ч. срок хранения MQTT-телеметрии), журнал с колонкой Результат, счётчик проверенных записей, понятное отображение «0 записей», ручная очистка телеметрии (v1.1.49).

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

Раздел Маршрут Описание
Информация /system Ресурсы сервера, версия CRM, Dynamic API / PyOrchestrator; скачивание JSON-диагностики (v1.1.44) (группа «Система»)
Уведомления /notifications CRM-уведомления (web), отметка прочитано; Загрузить ещё (100) — серверная пагинация (v1.1.52); настройки каналов на Обзоре
Профиль /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, валюта по умолчанию, язык интерфейса, брендинг (v1.1.44), полный пакет бэкапа (v1.1.44)
Логи /logs Аудит Dynamic API (Admin)
Публикации /info-messages Новости и акции для информационного бота (картинки — в Telegram); опционально VK публикатортолько текст во VK (v1.1.42) (Admin)
Telegram /telegram Боты PyOrchestrator: Управление / Сервисный / Информационный; QR-ссылка; массовые действия; шаблоны v3.2 / v2.2; stop-all (Admin, PyOrch)
MCP сервер /mcp HTTP MCP Dynamic API и PyOrchestrator; таблица tools; конфиг Cursor (Admin)
Модули /modules Каталог расширений GitHub; install/start/stop; UI настроек в iframe; modules-bridge (Admin)
Резервные копии /backups MongoDB backup, ручной запуск, скачивание; опционально полный пакет (*-extras.tar.gz) (v1.1.44) (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 — одна иконка (радио / пауза) на всех экранах.

Диалоги и обратная связь (v1.1.44)

  • Toast — сообщения success/error/info (справа внизу), автоскрытие
  • Модальное подтверждение — удаление пользователя/группы, бэкап, обновления, исправления целостности — без confirm браузера

Встроенная справка (v1.1.44)

В сайдбаре справки: Мастер настройки, Приветствие, Профиль. Ссылка на полную документацию GitHub Pages (с учётом локали).

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

Двухколоночный layout (как PyOrchestrator): слева брендинг с SVG-фоном (волны/SCADA), справа форма. Название и слоган — из Настройки → Брендинг (v1.1.44). Переключатель темы в правом верхнем углу. Авто-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/modules/ modules-bridge:3024
/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