From 1414569b636c1e66bf88df2d27d82df5f252973e Mon Sep 17 00:00:00 2001 From: CaIon Date: Thu, 18 Jun 2026 12:13:53 +0800 Subject: [PATCH] feat(stat): enhance log stat cards with compact number formatting and improved layout --- .../components/models/log-stat-cards.tsx | 61 ++++++++++++++----- .../pricing/components/model-perf-badge.tsx | 4 +- 2 files changed, 49 insertions(+), 16 deletions(-) diff --git a/web/default/src/features/dashboard/components/models/log-stat-cards.tsx b/web/default/src/features/dashboard/components/models/log-stat-cards.tsx index 5466ed40..92431560 100644 --- a/web/default/src/features/dashboard/components/models/log-stat-cards.tsx +++ b/web/default/src/features/dashboard/components/models/log-stat-cards.tsx @@ -18,8 +18,9 @@ For commercial licensing, please contact support@quantumnous.com */ import { useEffect, useState } from 'react' import { useAuthStore } from '@/stores/auth-store' -import { formatNumber, formatQuota } from '@/lib/format' +import { formatCompactNumber, formatNumber, formatQuota } from '@/lib/format' import { computeTimeRange } from '@/lib/time' +import { cn } from '@/lib/utils' import { Skeleton } from '@/components/ui/skeleton' import { getUserQuotaDates } from '@/features/dashboard/api' import { useModelStatCardsConfig } from '@/features/dashboard/hooks/use-dashboard-config' @@ -38,6 +39,21 @@ interface LogStatCardsProps { onDataUpdate?: (data: QuotaDataItem[], loading: boolean) => void } +const MAX_INLINE_STAT_CHARS = 9 + +function formatStatNumber(value: number) { + const fullValue = formatNumber(value) + const displayValue = + fullValue.length > MAX_INLINE_STAT_CHARS + ? formatCompactNumber(value) + : fullValue + + return { + displayValue, + fullValue, + } +} + export function LogStatCards(props: LogStatCardsProps) { const statCardsConfig = useModelStatCardsConfig() const user = useAuthStore((state) => state.auth.user) @@ -100,27 +116,41 @@ export function LogStatCards(props: LogStatCardsProps) { tpm: stats?.totalTokens ?? 0, } - const items = statCardsConfig.map((config) => ({ - title: config.title, - value: + const items = statCardsConfig.map((config) => { + const rawValue = config.getValue(adaptedStats, timeRangeMinutes) + const formatted = config.key === 'quota' - ? formatQuota(config.getValue(adaptedStats, timeRangeMinutes)) - : formatNumber(config.getValue(adaptedStats, timeRangeMinutes)), - desc: config.description, - icon: config.icon, - })) + ? { + displayValue: formatQuota(rawValue), + fullValue: formatQuota(rawValue), + } + : formatStatNumber(rawValue) + + return { + title: config.title, + value: formatted.displayValue, + fullValue: formatted.fullValue, + desc: config.description, + icon: config.icon, + } + }) return (
-
+
{items.map((it, idx) => { const Icon = it.icon return (
-
+
{it.title} @@ -128,7 +158,7 @@ export function LogStatCards(props: LogStatCardsProps) {
{loading ? ( -
+
@@ -143,7 +173,10 @@ export function LogStatCards(props: LogStatCardsProps) { ) : ( <> -
+
{it.value}
diff --git a/web/default/src/features/pricing/components/model-perf-badge.tsx b/web/default/src/features/pricing/components/model-perf-badge.tsx index 5176836a..010fd83d 100644 --- a/web/default/src/features/pricing/components/model-perf-badge.tsx +++ b/web/default/src/features/pricing/components/model-perf-badge.tsx @@ -45,8 +45,8 @@ function formatCompactLatency(ms: number): string { function formatCompactThroughput(tps: number): string { if (!Number.isFinite(tps) || tps <= 0) return '—' - if (tps >= 1_000) return `${formatCompactNumber(tps / 1_000)}Ktps` - return `${formatCompactNumber(tps)}tps` + if (tps >= 1_000) return `${formatCompactNumber(tps / 1_000)}Kt` + return `${formatCompactNumber(tps)}t` } export const ModelPerfBadge = memo(function ModelPerfBadge(