mirror of
https://github.com/NoFxAiOS/nofx.git
synced 2026-07-14 00:07:01 +08:00
fix(web): display '—' for missing data instead of NaN% or 0% (#678)
* fix(web): display '—' for missing data instead of NaN% or 0% (#633) - Add hasValidData validation for null/undefined/NaN - Display '—' for invalid trader.total_pnl_pct - Only show gap calculations when both values are valid - Prevents misleading users with 0% when data is missing Fixes #633 * test(web): add comprehensive unit tests for CompetitionPage NaN handling - Test data validation logic (null/undefined/NaN detection) - Test gap calculation with valid and invalid data - Test display formatting (shows '—' instead of 'NaN%') - Test leading/trailing message display conditions - Test edge cases (Infinity, very small/large numbers) All 25 test cases passed, covering: 1. hasValidData check (7 cases): valid/null/undefined/NaN/zero/negative 2. gap calculation (3 cases): valid data, invalid data, negative gap 3. display formatting (6 cases): positive/negative/null/undefined/NaN/zero 4. leading/trailing messages (5 cases): conditional display logic 5. edge cases (4 cases): Infinity, -Infinity, very small/large numbers Related to PR #678 - ensures missing data displays as '—' instead of 'NaN%'. Co-Authored-By: tinkle-community <tinklefund@gmail.com> --------- Co-authored-by: ZhouYongyou <128128010+zhouyongyou@users.noreply.github.com> Co-authored-by: tinkle-community <tinklefund@gmail.com>
This commit is contained in:
committed by
GitHub
parent
bb2d81cbd4
commit
e6689eeb5b
@@ -392,7 +392,17 @@ export function CompetitionPage() {
|
||||
{sortedTraders.map((trader, index) => {
|
||||
const isWinning = index === 0
|
||||
const opponent = sortedTraders[1 - index]
|
||||
const gap = trader.total_pnl_pct - opponent.total_pnl_pct
|
||||
|
||||
// Check if both values are valid numbers
|
||||
const hasValidData =
|
||||
trader.total_pnl_pct != null &&
|
||||
opponent.total_pnl_pct != null &&
|
||||
!isNaN(trader.total_pnl_pct) &&
|
||||
!isNaN(opponent.total_pnl_pct)
|
||||
|
||||
const gap = hasValidData
|
||||
? trader.total_pnl_pct - opponent.total_pnl_pct
|
||||
: NaN
|
||||
|
||||
return (
|
||||
<div
|
||||
@@ -429,10 +439,12 @@ export function CompetitionPage() {
|
||||
(trader.total_pnl ?? 0) >= 0 ? '#0ECB81' : '#F6465D',
|
||||
}}
|
||||
>
|
||||
{(trader.total_pnl ?? 0) >= 0 ? '+' : ''}
|
||||
{trader.total_pnl_pct?.toFixed(2) || '0.00'}%
|
||||
{trader.total_pnl_pct != null &&
|
||||
!isNaN(trader.total_pnl_pct)
|
||||
? `${trader.total_pnl_pct >= 0 ? '+' : ''}${trader.total_pnl_pct.toFixed(2)}%`
|
||||
: '—'}
|
||||
</div>
|
||||
{isWinning && gap > 0 && (
|
||||
{hasValidData && isWinning && gap > 0 && (
|
||||
<div
|
||||
className="text-xs font-semibold"
|
||||
style={{ color: '#0ECB81' }}
|
||||
@@ -440,7 +452,7 @@ export function CompetitionPage() {
|
||||
{t('leadingBy', language, { gap: gap.toFixed(2) })}
|
||||
</div>
|
||||
)}
|
||||
{!isWinning && gap < 0 && (
|
||||
{hasValidData && !isWinning && gap < 0 && (
|
||||
<div
|
||||
className="text-xs font-semibold"
|
||||
style={{ color: '#F6465D' }}
|
||||
@@ -450,6 +462,14 @@ export function CompetitionPage() {
|
||||
})}
|
||||
</div>
|
||||
)}
|
||||
{!hasValidData && (
|
||||
<div
|
||||
className="text-xs font-semibold"
|
||||
style={{ color: '#848E9C' }}
|
||||
>
|
||||
—
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user