diff --git a/ui/src/pages/Exchanges/ExchangeHeader.module.css b/ui/src/pages/Exchanges/ExchangeHeader.module.css index 5b35a056..e14c43a4 100644 --- a/ui/src/pages/Exchanges/ExchangeHeader.module.css +++ b/ui/src/pages/Exchanges/ExchangeHeader.module.css @@ -115,6 +115,15 @@ flex-shrink: 0; } +.chainTotal { + font-family: var(--font-mono); + font-size: 10px; + font-weight: 600; + color: var(--text-secondary); + margin-right: 0.5rem; + flex-shrink: 0; +} + .chainEntry { display: inline-flex; align-items: center; diff --git a/ui/src/pages/Exchanges/ExchangeHeader.tsx b/ui/src/pages/Exchanges/ExchangeHeader.tsx index df809d7d..55795e1d 100644 --- a/ui/src/pages/Exchanges/ExchangeHeader.tsx +++ b/ui/src/pages/Exchanges/ExchangeHeader.tsx @@ -93,6 +93,12 @@ export function ExchangeHeader({ detail, onCorrelatedSelect }: ExchangeHeaderPro {/* Correlation chain */}
Correlated + {showChain && (() => { + const starts = chain.map((ce: any) => new Date(ce.startTime).getTime()).filter((t: number) => !isNaN(t)); + const ends = chain.map((ce: any) => new Date(ce.endTime ?? ce.startTime).getTime() + (ce.durationMs ?? 0)).filter((t: number) => !isNaN(t)); + const totalMs = starts.length > 0 && ends.length > 0 ? Math.max(...ends) - Math.min(...starts) : 0; + return totalMs > 0 ? Duration: {formatDuration(totalMs)} : null; + })()} {showChain ? chain.map((ce: any, i: number) => { const isCurrent = ce.executionId === detail.executionId; const variant = statusVariant(ce.status);