Page - Analytics

abstract

Monthly P&L analytics — calendar heatmap showing daily profit/loss, monthly summary stats (win rate, total P&L, best/worst day), and a drill-down sheet for individual day trades.

Route

PropertyValue
Path/analytics
Filefrontend/src/app/analytics/page.tsx
Auth RequiredNo
LayoutRoot layout with sidebar
Dynamic SegmentNone

Component Tree

AnalyticsPage (page.tsx)
├── AppHeader (title="Analytics")
├── MonthlyStats (summary cards: total P&L, win rate, trade count, best day)
│   └── Receives calData + calLoading from page state
├── PnlCalendar (main calendar heatmap)
│   └── Fetches GET /api/v1/analytics/daily internally
│   └── onDaySelect → opens TradeDrillDown sheet
│   └── onDataChange → updates calData/calLoading state
└── TradeDrillDown (Sheet component)
    └── Opens when user clicks a day on calendar
    └── Shows trades for selected date

Data Layer

Server State — Fetched inside child components

ComponentEndpointTrigger
PnlCalendarGET /api/v1/analytics/dailyOn mount + month navigation
MonthlyStatsReceives data via onDataChange propReactive to PnlCalendar fetch
TradeDrillDownGET /api/v1/trades filtered by dateWhen sheet opens

Local State — useState

VariableTypeInitialPurpose
selectedDatestring | nullnullDate clicked on calendar
selectedEntryDailyEntry | nullnullEntry data for drill-down
sheetOpenbooleanfalseControls TradeDrillDown visibility
calDataDailyPnLResponse | nullnullCalendar data passed to MonthlyStats
calLoadingbooleanfalseLoading state for MonthlyStats

Page Lifecycle

Validation & Conditions

Render Conditions

ConditionWhat Shows
calLoadingSkeleton in MonthlyStats
No active accountCalendar shows empty / no-account state
Day with pnl > 0Green cell on calendar
Day with pnl < 0Red cell on calendar
Day with no tradesGray / neutral cell
sheetOpenTradeDrillDown slide-over sheet
RoleLink
Backend APIAPI-GET-v1-Analytics
DB SchemaDB - trades