Dashboard
Первое, что вы видите при входе, и, честно говоря, страница, которую вы оставите открытой на весь день.
Лендинг-страница (/, Components/Pages/Index.razor) — это живой, mobile-first командный центр
для активности пользователя across cBot runs, бэктестов, ресурсов и (для админов) кластера узлов.
Она обновляет себя, отлично выглядит на телефоне и никогда не заставляет вас нажимать F5.
Что показывает
Сверху вниз, по приоритету для телефона (каждый блок — full-width stack item на мобильном, responsive grid на планшете/десктопе):
- Header — title, live-индикатор (реальная пульсирующая точка; статичная при
prefers-reduced-motion), время последнего обновления и переключатель периода (1H · 24H · 7D · 30D), который управляет KPI и графиком. - Hero KPIs — четыре беглых карточки, каждая с большим числом + inline SVG sparkline, и (где
уместно) дельту vs предыдущий период:
- Active now — запуски + бэктесты, стартующие/работающие сейчас.
- Success rate — завершённые ÷ (завершённые + проваленные) за период; дельта в процентных пунктах.
- Completed — завершённые запуски/бэктесты за период; дельта vs предыдущий период.
- Failed — провалы за период; дельта (меньше = лучше, поэтому снижение показывается зелёным).
- График активности — ApexCharts area timeline запущенных / завершённых / проваленных per временной корзины.
- Instance status ring — donut диаграмма running / бэктесты / pending / completed / failed, итого в центре.
- Бэктесты — три тайла snapshot (running / completed / failed), click-through на
/backtest. - Copy trading — ваши copy-trading профили с live-индикатором статуса, количеством назначений и Live
badge на работающих профилях; click-through на
/copy-trading. - AI-агенты — ваши trading-агенты с состоянием (archetype · status) и временем последнего действия; click-through на
/agent-studio. - Live-лента активности — 20 самых недавних событий (новые первые) с цветным индикатором статуса и относительной временной меткой.
- Cluster health (только админы) — active-vs-total узлов и gauge использования вместимости.
- Resource tiles — cBots, trading accounts, cTrader IDs, MCP keys (click-through на их страницы).
Настройка dashboard
Каждый блок — это виджет под вашим контролем. Нажмите Customize (вверху справа от header), чтобы открыть диалог, где вы показываете/скрываете любой виджет и переупорядочиваете их стрелками вверх/вниз. Reset to default восстанавливает каталожный порядок. Ваш выбор персистится на сервере per пользователь, поэтому он следует за вами across браузеров и устройств — не только в этой вкладке.
- Виджеты с feature-gate и admin-only (Copy trading, AI agents, Cluster health) появляются в диалоге только когда ваш deployment/роль может их использовать.
- Каталожный источник виджетов — один:
Core/Dashboard/DashboardWidgets.cs; презентация (label + icon + availability) живёт вComponents/Dashboard/DashboardWidgetMeta.cs.
Как остаётся живым
Страница опрашивает GET /api/dashboard/overview?period=<1h|24h|7d|30d> каждые 10 секунд и рендерит
виджеты на месте — без ручной перезагрузки. Транзиентная ошибка fetch'а проглатывается и повторяется на следующем тике;
цикл чисто останавливается при dispose. Первая загрузка показывает skeleton; персистентный сбой показывает error
card с Retry; пользователь без данных видит нулевые KPI и empty-state copy.
Backend
Endpoints/DashboardEndpoints.csмаппит/overview(и сохраняет старые скалярные/stats). Работает per-пользователя и admin-gated черезICurrentUser; часы изTimeProvider. Также маппитGET/PUT /api/dashboard/layout— layout виджетов пользователя, загружаемый при старте страницы и сохраняемый из диалога Customize.- Layout persistence — агрегат
UserDashboard(Core/Dashboard/UserDashboard.cs): одна доска на пользователя (уникальный поUserId), владеющий упорядоченным списком настроек виджетов (visible + order), хранящихся какjsonbколонка. Упорядоченный список мутирует только черезApply/Reset, которые валидируют каждый ключ против каталогаDashboardWidgetsи сохраняют коллекцию полной и дедуплицированной. Неизвестные ключи отклоняются сDomainException→400. Endpoints/DashboardQuery.csстроит композитный read modelDashboardOverview: snapshot статуса за всё время (grouped counts), окно инстансов materialized один раз, и counts ресурсов/нод. Статус инстанса и terminal timestamps живут на TPH-подтипах (не колонках), поэтому строки читаются в памяти через shared helpersInstanceEndpoints.GetStartedAt/GetStoppedAt. Время события =stopped ?? started ?? created.Endpoints/DashboardModels.csсодержит DTO, план period→(window, bucket-count) иDashboardMath— чистую, детерминированную логику бакинга + KPI/delta (без I/O,nowпередаётся).
Дельты KPI сравнивают текущее окно с непосредственно предшествующим (запрос.fetch'ит двойное окно для этого). Нет живого P&L фида — платформа имеет equity только для бэктестов и prop-firm tracking — поэтому dashboard сознательно операционный (активность, throughput, success rate), не брокерский баланс-тикер.
Дизайн & токены
Все цвета из design tokens (var(--app-success|-warning|-error|-info|-primary|-text*)), поэтому
white-label палитра течёт бесплатно — включая график, чьи серии цветов читаются из resolved tokens
в runtime через window.appReadTokens (SVG не может напрямую потреблять CSS-переменные). Нигде нет
hard-coded hex. См. ../ui-guidelines.md.
Ссылка "Powered by cMind"
Dashboard показывает маленькую, уместную ссылку "Powered by cMind", ведущую на этот
документационный сайт. Она показывается по умолчанию — мы гордимся проектом и это помогает другим
трейдерам его найти — но это полностью ваше решение. Реселлеры, запускающие полностью white-labeled
инстанс, ставят App:Branding:ShowSiteLink в false и она исчезает. См.
White-label branding.
Тесты
- Unit-style (
tests/IntegrationTests/DashboardMathTests.cs) — бакинг, success-rate, дельты предыдущего периода, парсинг периода, empty/boundary (событие вnow, guard от деления на ноль). - Unit (
tests/UnitTests/Dashboard/UserDashboardTests.cs) — агрегатUserDashboard: seed по умолчанию, apply order/visibility, append-omitted, duplicate-collapse, отклонение неизвестного ключа, reset. - Integration (
tests/IntegrationTests/DashboardQueryTests.cs,DashboardLayoutTests.cs) — read model против реального Postgres (status/KPI/activity/resources, admin node health, path для пустого пользователя), новые секции бэктестов/copy-profiles/agents, и round-trip layout (сохранить custom layout → перезагрузить → порядок + visibility персистились). - E2E (
tests/E2ETests/DashboardTests.cs,DashboardCustomizeTests.cs) — desktop + mobile: KPI cards, график, ring и лента рендерятся; переключатель периода переключает активный период и перезагружает; KPI drill-through на/run; скрытие виджета персистится при перезагрузке, Reset возвращает, и диалог Customize работает на телефоне без горизонтального overflow./также вPageSmokeTests,MobileLayoutTests(shell + no-overflow) иMobileJourneyTests.