Dashboard
Веб-интерфейс WASH PRO CRM — мойки, клиенты, аналитика, SCADA в реальном времени, настройки, модули и администрирование.
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 (баланс, скидка).
Тип скидки — номер 1–5 из справочника. Статусы: 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