feat: add totals row to Positions page
ci/woodpecker/push/test Pipeline was successful
ci/woodpecker/push/build-2 Pipeline was successful
ci/woodpecker/push/build-3 Pipeline was successful
ci/woodpecker/push/build-1 Pipeline was successful
ci/woodpecker/push/finalize Pipeline was successful
Build and Push / lint-and-test (push) Has been cancelled
Build and Push / build-services (map[cmd:python -m services.adapters.broker_adapter name:broker-adapter]) (push) Has been cancelled
Build and Push / build-services (map[cmd:python -m services.aggregation.worker name:aggregation]) (push) Has been cancelled
Build and Push / build-services (map[cmd:python -m services.extractor.worker name:extractor]) (push) Has been cancelled
Build and Push / build-services (map[cmd:python -m services.ingestion.worker name:ingestion]) (push) Has been cancelled
Build and Push / build-services (map[cmd:python -m services.lake_publisher.worker name:lake-publisher]) (push) Has been cancelled
Build and Push / build-services (map[cmd:python -m services.parser.worker name:parser]) (push) Has been cancelled
Build and Push / build-services (map[cmd:python -m services.recommendation.worker name:recommendation]) (push) Has been cancelled
Build and Push / build-services (map[cmd:python -m services.scheduler.app name:scheduler]) (push) Has been cancelled
Build and Push / build-services (map[cmd:uvicorn services.api.app:app --host 0.0.0.0 --port 8000 name:query-api]) (push) Has been cancelled
Build and Push / build-services (map[cmd:uvicorn services.risk.app:app --host 0.0.0.0 --port 8000 name:risk]) (push) Has been cancelled
Build and Push / build-services (map[cmd:uvicorn services.symbol_registry.app:app --host 0.0.0.0 --port 8000 name:symbol-registry]) (push) Has been cancelled
Build and Push / build-services (map[cmd:uvicorn services.trading.app:app --host 0.0.0.0 --port 8000 name:trading-engine]) (push) Has been cancelled
Build and Push / build-dashboard (push) Has been cancelled
Build and Push / build-superset (push) Has been cancelled
Build and Push / integration-test (push) Has been cancelled
Build and Push / beta-gate (push) Has been cancelled

This commit is contained in:
Celes Renata
2026-04-21 05:45:44 +00:00
parent 08b93ad119
commit 53fa190ec3
+31 -1
View File
@@ -28,14 +28,44 @@ export function PositionsPage() {
if (isLoading) return <LoadingSpinner />;
const positions = data ?? [];
const totals = positions.reduce(
(acc, p) => ({
quantity: acc.quantity + p.quantity,
unrealized_pnl: acc.unrealized_pnl + (p.unrealized_pnl ?? 0),
realized_pnl: acc.realized_pnl + (p.realized_pnl ?? 0),
market_value: acc.market_value + p.quantity * (p.current_price ?? 0),
cost_basis: acc.cost_basis + p.quantity * p.avg_entry_price,
}),
{ quantity: 0, unrealized_pnl: 0, realized_pnl: 0, market_value: 0, cost_basis: 0 },
);
return (
<div>
<h1 className="mb-4 text-xl font-semibold text-gray-100">Positions</h1>
<DataTable<Position>
data={data ?? []}
data={positions}
columns={columns}
keyField="id"
/>
{positions.length > 0 && (
<div className="mt-px overflow-x-auto rounded-b-lg border border-t-0 border-surface-700 bg-surface-900">
<table className="w-full text-sm">
<tfoot>
<tr className="font-semibold text-gray-200">
<td className="px-3 py-2">Totals</td>
<td className="px-3 py-2">{totals.quantity}</td>
<td className="px-3 py-2">{fmtUsd(totals.cost_basis)}</td>
<td className="px-3 py-2">{fmtUsd(totals.market_value)}</td>
<td className={`px-3 py-2 ${pnlColor(totals.unrealized_pnl)}`}>{fmtUsd(totals.unrealized_pnl)}</td>
<td className={`px-3 py-2 ${pnlColor(totals.realized_pnl)}`}>{fmtUsd(totals.realized_pnl)}</td>
<td className="px-3 py-2" />
</tr>
</tfoot>
</table>
</div>
)}
</div>
);
}