diff --git a/messages/en/myUsage.json b/messages/en/myUsage.json
index 0ebe076a2..0e39e8496 100644
--- a/messages/en/myUsage.json
+++ b/messages/en/myUsage.json
@@ -92,6 +92,9 @@
"keyStats": "Key",
"userStats": "User",
"noData": "No data for selected period",
+ "breakdownPrevPage": "Previous page",
+ "breakdownNextPage": "Next page",
+ "breakdownPageIndicator": "{current} / {total}",
"unknownModel": "Unknown",
"modal": {
"requests": "Requests",
diff --git a/messages/ja/myUsage.json b/messages/ja/myUsage.json
index 4d0b1bb7e..901e10ab6 100644
--- a/messages/ja/myUsage.json
+++ b/messages/ja/myUsage.json
@@ -92,6 +92,9 @@
"keyStats": "キー",
"userStats": "ユーザー",
"noData": "選択期間のデータがありません",
+ "breakdownPrevPage": "前のページ",
+ "breakdownNextPage": "次のページ",
+ "breakdownPageIndicator": "{current} / {total}",
"unknownModel": "不明",
"modal": {
"requests": "リクエスト",
diff --git a/messages/ru/myUsage.json b/messages/ru/myUsage.json
index bb3b61bd7..5ccfec871 100644
--- a/messages/ru/myUsage.json
+++ b/messages/ru/myUsage.json
@@ -92,6 +92,9 @@
"keyStats": "Ключ",
"userStats": "Пользователь",
"noData": "Нет данных за выбранный период",
+ "breakdownPrevPage": "Предыдущая страница",
+ "breakdownNextPage": "Следующая страница",
+ "breakdownPageIndicator": "{current} / {total}",
"unknownModel": "Неизвестно",
"modal": {
"requests": "Запросов",
diff --git a/messages/zh-CN/myUsage.json b/messages/zh-CN/myUsage.json
index 9eaaf7925..6cf939337 100644
--- a/messages/zh-CN/myUsage.json
+++ b/messages/zh-CN/myUsage.json
@@ -92,6 +92,9 @@
"keyStats": "密钥",
"userStats": "用户",
"noData": "所选时段无数据",
+ "breakdownPrevPage": "上一页",
+ "breakdownNextPage": "下一页",
+ "breakdownPageIndicator": "{current} / {total}",
"unknownModel": "未知",
"modal": {
"requests": "请求",
diff --git a/messages/zh-TW/myUsage.json b/messages/zh-TW/myUsage.json
index b5247a160..f803a617b 100644
--- a/messages/zh-TW/myUsage.json
+++ b/messages/zh-TW/myUsage.json
@@ -92,6 +92,9 @@
"keyStats": "金鑰",
"userStats": "使用者",
"noData": "所選時段無資料",
+ "breakdownPrevPage": "上一頁",
+ "breakdownNextPage": "下一頁",
+ "breakdownPageIndicator": "{current} / {total}",
"unknownModel": "不明",
"modal": {
"requests": "請求",
diff --git a/src/app/[locale]/dashboard/logs/_components/usage-logs-view-virtualized.tsx b/src/app/[locale]/dashboard/logs/_components/usage-logs-view-virtualized.tsx
index 6e17b6934..d57980e91 100644
--- a/src/app/[locale]/dashboard/logs/_components/usage-logs-view-virtualized.tsx
+++ b/src/app/[locale]/dashboard/logs/_components/usage-logs-view-virtualized.tsx
@@ -251,26 +251,29 @@ function UsageLogsViewContent({
};
}, []);
+ const statsFilters = {
+ userId: filters.userId,
+ keyId: filters.keyId,
+ providerId: filters.providerId,
+ sessionId: filters.sessionId,
+ startTime: filters.startTime,
+ endTime: filters.endTime,
+ statusCode: filters.statusCode,
+ excludeStatusCode200: filters.excludeStatusCode200,
+ model: filters.model,
+ endpoint: filters.endpoint,
+ minRetryCount: filters.minRetryCount,
+ };
+
+ const hasStatsFilters = Object.values(statsFilters).some((v) => v !== undefined && v !== false);
+
return (
<>
{/* Stats Summary - Collapsible */}
-
+ {hasStatsFilters && (
+
+ )}
{/* Filter Criteria */}
diff --git a/src/app/[locale]/dashboard/logs/_components/usage-logs-view.tsx b/src/app/[locale]/dashboard/logs/_components/usage-logs-view.tsx
deleted file mode 100644
index 4f6eba172..000000000
--- a/src/app/[locale]/dashboard/logs/_components/usage-logs-view.tsx
+++ /dev/null
@@ -1,262 +0,0 @@
-"use client";
-
-import { Pause, Play, RefreshCw } from "lucide-react";
-import { useRouter, useSearchParams } from "next/navigation";
-import { useTranslations } from "next-intl";
-import { useCallback, useEffect, useRef, useState, useTransition } from "react";
-import { getUsageLogs } from "@/actions/usage-logs";
-import { Button } from "@/components/ui/button";
-import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
-import { useVisibilityPolling } from "@/hooks/use-visibility-polling";
-import type { CurrencyCode } from "@/lib/utils/currency";
-import type { UsageLogsResult } from "@/repository/usage-logs";
-import type { Key } from "@/types/key";
-import type { ProviderDisplay } from "@/types/provider";
-import type { BillingModelSource } from "@/types/system-config";
-import { buildLogsUrlQuery, parseLogsUrlFilters } from "../_utils/logs-query";
-import { UsageLogsFilters } from "./usage-logs-filters";
-import { UsageLogsStatsPanel } from "./usage-logs-stats-panel";
-import { UsageLogsTable } from "./usage-logs-table";
-
-interface UsageLogsViewProps {
- isAdmin: boolean;
- providers: ProviderDisplay[];
- initialKeys: Key[];
- searchParams: { [key: string]: string | string[] | undefined };
- currencyCode?: CurrencyCode;
- billingModelSource?: BillingModelSource;
- serverTimeZone?: string;
-}
-
-export function UsageLogsView({
- isAdmin,
- providers,
- initialKeys,
- searchParams,
- currencyCode = "USD",
- billingModelSource = "original",
- serverTimeZone,
-}: UsageLogsViewProps) {
- const t = useTranslations("dashboard");
- const router = useRouter();
- const params = useSearchParams();
- const [isPending, startTransition] = useTransition();
- const [data, setData] = useState(null);
- const [error, setError] = useState(null);
- const [isAutoRefresh, setIsAutoRefresh] = useState(true);
- const [isManualRefreshing, setIsManualRefreshing] = useState(false);
-
- // 追踪新增记录(用于动画高亮)
- const [newLogIds, setNewLogIds] = useState>(new Set());
- const previousLogsRef = useRef