Bläddra i källkod

refactor(myUsage): streamline JSON structure and improve filter handling

- Removed redundant nesting in myUsage JSON files for cleaner structure.
- Updated filter handling in the usage logs section to use a default value of "__all__" for model and status filters, enhancing user experience.
- Ensured consistent terminology across multiple language files for better localization support.

This refactor improves the maintainability of the code and enhances the user interface for filtering usage logs.
ding113 3 månader sedan
förälder
incheckning
6144e98f41

+ 56 - 58
messages/en/myUsage.json

@@ -1,64 +1,62 @@
 {
-  "myUsage": {
-    "header": {
-      "title": "My Usage",
-      "subtitle": "View your quotas and usage logs",
-      "logout": "Logout"
+  "header": {
+    "title": "My Usage",
+    "subtitle": "View your quotas and usage logs",
+    "logout": "Logout"
+  },
+  "quota": {
+    "5h": "5h Quota",
+    "daily": "Daily Quota",
+    "weekly": "Weekly Quota",
+    "monthly": "Monthly Quota",
+    "total": "Total Quota",
+    "concurrent": "Concurrent Sessions",
+    "keyLevel": "Key",
+    "userLevel": "User",
+    "unlimited": "Unlimited",
+    "empty": "No quota data"
+  },
+  "today": {
+    "title": "Today's Usage",
+    "autoRefresh": "Auto refresh every {seconds}s",
+    "refresh": "Refresh",
+    "calls": "Calls",
+    "tokensIn": "Input tokens",
+    "tokensOut": "Output tokens",
+    "cost": "{currency} cost",
+    "modelBreakdown": "By model",
+    "unknownModel": "Unknown model",
+    "billingModel": "Billing model: {model}",
+    "callsShort": "{count} calls",
+    "tokensShort": "In {in} / Out {out}",
+    "noData": "No data today"
+  },
+  "logs": {
+    "title": "Usage Logs",
+    "filters": {
+      "startDate": "Start date",
+      "endDate": "End date",
+      "model": "Model",
+      "status": "Status",
+      "allModels": "All models",
+      "allStatus": "All status",
+      "apply": "Apply",
+      "reset": "Reset"
     },
-    "quota": {
-      "5h": "5h Quota",
-      "daily": "Daily Quota",
-      "weekly": "Weekly Quota",
-      "monthly": "Monthly Quota",
-      "total": "Total Quota",
-      "concurrent": "Concurrent Sessions",
-      "keyLevel": "Key",
-      "userLevel": "User",
-      "unlimited": "Unlimited",
-      "empty": "No quota data"
-    },
-    "today": {
-      "title": "Today's Usage",
-      "autoRefresh": "Auto refresh every {seconds}s",
-      "refresh": "Refresh",
-      "calls": "Calls",
-      "tokensIn": "Input tokens",
-      "tokensOut": "Output tokens",
+    "loadFailed": "Failed to load logs",
+    "table": {
+      "time": "Time",
+      "model": "Model",
+      "tokens": "Tokens (in/out)",
       "cost": "{currency} cost",
-      "modelBreakdown": "By model",
-      "unknownModel": "Unknown model",
-      "billingModel": "Billing model: {model}",
-      "callsShort": "{count} calls",
-      "tokensShort": "In {in} / Out {out}",
-      "noData": "No data today"
+      "status": "Status",
+      "endpoint": "Endpoint"
     },
-    "logs": {
-      "title": "Usage Logs",
-      "filters": {
-        "startDate": "Start date",
-        "endDate": "End date",
-        "model": "Model",
-        "status": "Status",
-        "allModels": "All models",
-        "allStatus": "All status",
-        "apply": "Apply",
-        "reset": "Reset"
-      },
-      "loadFailed": "Failed to load logs",
-      "table": {
-        "time": "Time",
-        "model": "Model",
-        "tokens": "Tokens (in/out)",
-        "cost": "{currency} cost",
-        "status": "Status",
-        "endpoint": "Endpoint"
-      },
-      "pagination": "Showing {from}-{to} of {total}",
-      "prev": "Prev",
-      "next": "Next",
-      "noLogs": "No logs",
-      "unknownModel": "Unknown model",
-      "billingModel": "Billing: {model}"
-    }
+    "pagination": "Showing {from}-{to} of {total}",
+    "prev": "Prev",
+    "next": "Next",
+    "noLogs": "No logs",
+    "unknownModel": "Unknown model",
+    "billingModel": "Billing: {model}"
   }
 }

+ 56 - 58
messages/ja/myUsage.json

@@ -1,64 +1,62 @@
 {
-  "myUsage": {
-    "header": {
-      "title": "マイ利用状況",
-      "subtitle": "クォータと利用ログを確認",
-      "logout": "ログアウト"
+  "header": {
+    "title": "マイ利用状況",
+    "subtitle": "クォータと利用ログを確認",
+    "logout": "ログアウト"
+  },
+  "quota": {
+    "5h": "5時間クォータ",
+    "daily": "日次クォータ",
+    "weekly": "週次クォータ",
+    "monthly": "月次クォータ",
+    "total": "総クォータ",
+    "concurrent": "同時セッション",
+    "keyLevel": "キー",
+    "userLevel": "ユーザー",
+    "unlimited": "無制限",
+    "empty": "クォータ情報がありません"
+  },
+  "today": {
+    "title": "本日の利用",
+    "autoRefresh": "{seconds}秒ごとに自動更新",
+    "refresh": "更新",
+    "calls": "リクエスト数",
+    "tokensIn": "入力トークン",
+    "tokensOut": "出力トークン",
+    "cost": "{currency} コスト",
+    "modelBreakdown": "モデル別",
+    "unknownModel": "不明なモデル",
+    "billingModel": "課金モデル: {model}",
+    "callsShort": "{count} 回",
+    "tokensShort": "入力 {in} / 出力 {out}",
+    "noData": "本日のデータはありません"
+  },
+  "logs": {
+    "title": "利用ログ",
+    "filters": {
+      "startDate": "開始日",
+      "endDate": "終了日",
+      "model": "モデル",
+      "status": "ステータス",
+      "allModels": "すべてのモデル",
+      "allStatus": "すべてのステータス",
+      "apply": "適用",
+      "reset": "リセット"
     },
-    "quota": {
-      "5h": "5時間クォータ",
-      "daily": "日次クォータ",
-      "weekly": "週次クォータ",
-      "monthly": "月次クォータ",
-      "total": "総クォータ",
-      "concurrent": "同時セッション",
-      "keyLevel": "キー",
-      "userLevel": "ユーザー",
-      "unlimited": "無制限",
-      "empty": "クォータ情報がありません"
-    },
-    "today": {
-      "title": "本日の利用",
-      "autoRefresh": "{seconds}秒ごとに自動更新",
-      "refresh": "更新",
-      "calls": "リクエスト数",
-      "tokensIn": "入力トークン",
-      "tokensOut": "出力トークン",
+    "loadFailed": "ログの取得に失敗しました",
+    "table": {
+      "time": "時間",
+      "model": "モデル",
+      "tokens": "トークン (入/出)",
       "cost": "{currency} コスト",
-      "modelBreakdown": "モデル別",
-      "unknownModel": "不明なモデル",
-      "billingModel": "課金モデル: {model}",
-      "callsShort": "{count} 回",
-      "tokensShort": "入力 {in} / 出力 {out}",
-      "noData": "本日のデータはありません"
+      "status": "ステータス",
+      "endpoint": "エンドポイント"
     },
-    "logs": {
-      "title": "利用ログ",
-      "filters": {
-        "startDate": "開始日",
-        "endDate": "終了日",
-        "model": "モデル",
-        "status": "ステータス",
-        "allModels": "すべてのモデル",
-        "allStatus": "すべてのステータス",
-        "apply": "適用",
-        "reset": "リセット"
-      },
-      "loadFailed": "ログの取得に失敗しました",
-      "table": {
-        "time": "時間",
-        "model": "モデル",
-        "tokens": "トークン (入/出)",
-        "cost": "{currency} コスト",
-        "status": "ステータス",
-        "endpoint": "エンドポイント"
-      },
-      "pagination": "{from}-{to}/{total} を表示",
-      "prev": "前へ",
-      "next": "次へ",
-      "noLogs": "ログがありません",
-      "unknownModel": "不明なモデル",
-      "billingModel": "課金: {model}"
-    }
+    "pagination": "{from}-{to}/{total} を表示",
+    "prev": "前へ",
+    "next": "次へ",
+    "noLogs": "ログがありません",
+    "unknownModel": "不明なモデル",
+    "billingModel": "課金: {model}"
   }
 }

+ 56 - 58
messages/ru/myUsage.json

@@ -1,64 +1,62 @@
 {
-  "myUsage": {
-    "header": {
-      "title": "Мои расходы",
-      "subtitle": "Лимиты и журналы использования",
-      "logout": "Выйти"
+  "header": {
+    "title": "Мои расходы",
+    "subtitle": "Лимиты и журналы использования",
+    "logout": "Выйти"
+  },
+  "quota": {
+    "5h": "Лимит 5 часов",
+    "daily": "Дневной лимит",
+    "weekly": "Недельный лимит",
+    "monthly": "Месячный лимит",
+    "total": "Общий лимит",
+    "concurrent": "Одновременные сессии",
+    "keyLevel": "Ключ",
+    "userLevel": "Пользователь",
+    "unlimited": "Без лимита",
+    "empty": "Нет данных о лимитах"
+  },
+  "today": {
+    "title": "Использование сегодня",
+    "autoRefresh": "Автообновление каждые {seconds}с",
+    "refresh": "Обновить",
+    "calls": "Запросы",
+    "tokensIn": "Входные токены",
+    "tokensOut": "Выходные токены",
+    "cost": "Стоимость {currency}",
+    "modelBreakdown": "По моделям",
+    "unknownModel": "Неизвестная модель",
+    "billingModel": "Биллинговая модель: {model}",
+    "callsShort": "{count} раз",
+    "tokensShort": "Вх {in} / Вых {out}",
+    "noData": "Нет данных за сегодня"
+  },
+  "logs": {
+    "title": "Журнал использования",
+    "filters": {
+      "startDate": "Дата начала",
+      "endDate": "Дата окончания",
+      "model": "Модель",
+      "status": "Статус",
+      "allModels": "Все модели",
+      "allStatus": "Все статусы",
+      "apply": "Применить",
+      "reset": "Сбросить"
     },
-    "quota": {
-      "5h": "Лимит 5 часов",
-      "daily": "Дневной лимит",
-      "weekly": "Недельный лимит",
-      "monthly": "Месячный лимит",
-      "total": "Общий лимит",
-      "concurrent": "Одновременные сессии",
-      "keyLevel": "Ключ",
-      "userLevel": "Пользователь",
-      "unlimited": "Без лимита",
-      "empty": "Нет данных о лимитах"
-    },
-    "today": {
-      "title": "Использование сегодня",
-      "autoRefresh": "Автообновление каждые {seconds}с",
-      "refresh": "Обновить",
-      "calls": "Запросы",
-      "tokensIn": "Входные токены",
-      "tokensOut": "Выходные токены",
+    "loadFailed": "Не удалось загрузить логи",
+    "table": {
+      "time": "Время",
+      "model": "Модель",
+      "tokens": "Токены (вх/вых)",
       "cost": "Стоимость {currency}",
-      "modelBreakdown": "По моделям",
-      "unknownModel": "Неизвестная модель",
-      "billingModel": "Биллинговая модель: {model}",
-      "callsShort": "{count} раз",
-      "tokensShort": "Вх {in} / Вых {out}",
-      "noData": "Нет данных за сегодня"
+      "status": "Статус",
+      "endpoint": "Endpoint"
     },
-    "logs": {
-      "title": "Журнал использования",
-      "filters": {
-        "startDate": "Дата начала",
-        "endDate": "Дата окончания",
-        "model": "Модель",
-        "status": "Статус",
-        "allModels": "Все модели",
-        "allStatus": "Все статусы",
-        "apply": "Применить",
-        "reset": "Сбросить"
-      },
-      "loadFailed": "Не удалось загрузить логи",
-      "table": {
-        "time": "Время",
-        "model": "Модель",
-        "tokens": "Токены (вх/вых)",
-        "cost": "Стоимость {currency}",
-        "status": "Статус",
-        "endpoint": "Endpoint"
-      },
-      "pagination": "Показано {from}-{to} из {total}",
-      "prev": "Назад",
-      "next": "Вперед",
-      "noLogs": "Нет записей",
-      "unknownModel": "Неизвестная модель",
-      "billingModel": "Биллинг: {model}"
-    }
+    "pagination": "Показано {from}-{to} из {total}",
+    "prev": "Назад",
+    "next": "Вперед",
+    "noLogs": "Нет записей",
+    "unknownModel": "Неизвестная модель",
+    "billingModel": "Биллинг: {model}"
   }
 }

+ 56 - 58
messages/zh-CN/myUsage.json

@@ -1,64 +1,62 @@
 {
-  "myUsage": {
-    "header": {
-      "title": "我的用量",
-      "subtitle": "查看额度与使用记录",
-      "logout": "退出登录"
+  "header": {
+    "title": "我的用量",
+    "subtitle": "查看额度与使用记录",
+    "logout": "退出登录"
+  },
+  "quota": {
+    "5h": "5小时额度",
+    "daily": "日额度",
+    "weekly": "周额度",
+    "monthly": "月额度",
+    "total": "总额度",
+    "concurrent": "并发会话",
+    "keyLevel": "密钥",
+    "userLevel": "用户",
+    "unlimited": "不限",
+    "empty": "暂无额度数据"
+  },
+  "today": {
+    "title": "今日使用",
+    "autoRefresh": "每{seconds}s自动刷新",
+    "refresh": "刷新",
+    "calls": "调用次数",
+    "tokensIn": "输入 Tokens",
+    "tokensOut": "输出 Tokens",
+    "cost": "{currency} 消耗",
+    "modelBreakdown": "按模型",
+    "unknownModel": "未知模型",
+    "billingModel": "计费模型:{model}",
+    "callsShort": "{count} 次",
+    "tokensShort": "入 {in} / 出 {out}",
+    "noData": "今日暂无数据"
+  },
+  "logs": {
+    "title": "使用日志",
+    "filters": {
+      "startDate": "开始日期",
+      "endDate": "结束日期",
+      "model": "模型",
+      "status": "状态码",
+      "allModels": "全部模型",
+      "allStatus": "全部状态",
+      "apply": "应用",
+      "reset": "重置"
     },
-    "quota": {
-      "5h": "5小时额度",
-      "daily": "日额度",
-      "weekly": "周额度",
-      "monthly": "月额度",
-      "total": "总额度",
-      "concurrent": "并发会话",
-      "keyLevel": "密钥",
-      "userLevel": "用户",
-      "unlimited": "不限",
-      "empty": "暂无额度数据"
-    },
-    "today": {
-      "title": "今日使用",
-      "autoRefresh": "每{seconds}s自动刷新",
-      "refresh": "刷新",
-      "calls": "调用次数",
-      "tokensIn": "输入 Tokens",
-      "tokensOut": "输出 Tokens",
+    "loadFailed": "日志加载失败",
+    "table": {
+      "time": "时间",
+      "model": "模型",
+      "tokens": "Tokens (入/出)",
       "cost": "{currency} 消耗",
-      "modelBreakdown": "按模型",
-      "unknownModel": "未知模型",
-      "billingModel": "计费模型:{model}",
-      "callsShort": "{count} 次",
-      "tokensShort": "入 {in} / 出 {out}",
-      "noData": "今日暂无数据"
+      "status": "状态",
+      "endpoint": "Endpoint"
     },
-    "logs": {
-      "title": "使用日志",
-      "filters": {
-        "startDate": "开始日期",
-        "endDate": "结束日期",
-        "model": "模型",
-        "status": "状态码",
-        "allModels": "全部模型",
-        "allStatus": "全部状态",
-        "apply": "应用",
-        "reset": "重置"
-      },
-      "loadFailed": "日志加载失败",
-      "table": {
-        "time": "时间",
-        "model": "模型",
-        "tokens": "Tokens (入/出)",
-        "cost": "{currency} 消耗",
-        "status": "状态",
-        "endpoint": "Endpoint"
-      },
-      "pagination": "显示 {from}-{to} / {total}",
-      "prev": "上一页",
-      "next": "下一页",
-      "noLogs": "暂无日志",
-      "unknownModel": "未知模型",
-      "billingModel": "计费:{model}"
-    }
+    "pagination": "显示 {from}-{to} / {total}",
+    "prev": "上一页",
+    "next": "下一页",
+    "noLogs": "暂无日志",
+    "unknownModel": "未知模型",
+    "billingModel": "计费:{model}"
   }
 }

+ 56 - 58
messages/zh-TW/myUsage.json

@@ -1,64 +1,62 @@
 {
-  "myUsage": {
-    "header": {
-      "title": "我的用量",
-      "subtitle": "查看額度與使用記錄",
-      "logout": "登出"
+  "header": {
+    "title": "我的用量",
+    "subtitle": "查看額度與使用記錄",
+    "logout": "登出"
+  },
+  "quota": {
+    "5h": "5小時額度",
+    "daily": "日額度",
+    "weekly": "週額度",
+    "monthly": "月額度",
+    "total": "總額度",
+    "concurrent": "並發會話",
+    "keyLevel": "金鑰",
+    "userLevel": "使用者",
+    "unlimited": "不限",
+    "empty": "暫無額度資料"
+  },
+  "today": {
+    "title": "今日使用",
+    "autoRefresh": "每{seconds}s自動刷新",
+    "refresh": "刷新",
+    "calls": "呼叫次數",
+    "tokensIn": "輸入 Tokens",
+    "tokensOut": "輸出 Tokens",
+    "cost": "{currency} 花費",
+    "modelBreakdown": "按模型",
+    "unknownModel": "未知模型",
+    "billingModel": "計費模型:{model}",
+    "callsShort": "{count} 次",
+    "tokensShort": "入 {in} / 出 {out}",
+    "noData": "今日無資料"
+  },
+  "logs": {
+    "title": "使用紀錄",
+    "filters": {
+      "startDate": "開始日期",
+      "endDate": "結束日期",
+      "model": "模型",
+      "status": "狀態碼",
+      "allModels": "全部模型",
+      "allStatus": "全部狀態",
+      "apply": "套用",
+      "reset": "重置"
     },
-    "quota": {
-      "5h": "5小時額度",
-      "daily": "日額度",
-      "weekly": "週額度",
-      "monthly": "月額度",
-      "total": "總額度",
-      "concurrent": "並發會話",
-      "keyLevel": "金鑰",
-      "userLevel": "使用者",
-      "unlimited": "不限",
-      "empty": "暫無額度資料"
-    },
-    "today": {
-      "title": "今日使用",
-      "autoRefresh": "每{seconds}s自動刷新",
-      "refresh": "刷新",
-      "calls": "呼叫次數",
-      "tokensIn": "輸入 Tokens",
-      "tokensOut": "輸出 Tokens",
+    "loadFailed": "載入日誌失敗",
+    "table": {
+      "time": "時間",
+      "model": "模型",
+      "tokens": "Tokens (入/出)",
       "cost": "{currency} 花費",
-      "modelBreakdown": "按模型",
-      "unknownModel": "未知模型",
-      "billingModel": "計費模型:{model}",
-      "callsShort": "{count} 次",
-      "tokensShort": "入 {in} / 出 {out}",
-      "noData": "今日無資料"
+      "status": "狀態",
+      "endpoint": "Endpoint"
     },
-    "logs": {
-      "title": "使用紀錄",
-      "filters": {
-        "startDate": "開始日期",
-        "endDate": "結束日期",
-        "model": "模型",
-        "status": "狀態碼",
-        "allModels": "全部模型",
-        "allStatus": "全部狀態",
-        "apply": "套用",
-        "reset": "重置"
-      },
-      "loadFailed": "載入日誌失敗",
-      "table": {
-        "time": "時間",
-        "model": "模型",
-        "tokens": "Tokens (入/出)",
-        "cost": "{currency} 花費",
-        "status": "狀態",
-        "endpoint": "Endpoint"
-      },
-      "pagination": "顯示 {from}-{to} / {total}",
-      "prev": "上一頁",
-      "next": "下一頁",
-      "noLogs": "暫無日誌",
-      "unknownModel": "未知模型",
-      "billingModel": "計費:{model}"
-    }
+    "pagination": "顯示 {from}-{to} / {total}",
+    "prev": "上一頁",
+    "next": "下一頁",
+    "noLogs": "暫無日誌",
+    "unknownModel": "未知模型",
+    "billingModel": "計費:{model}"
   }
 }

+ 6 - 6
src/app/[locale]/my-usage/_components/usage-logs-section.tsx

@@ -118,14 +118,14 @@ export function UsageLogsSection({ initialData = null }: UsageLogsSectionProps)
           <div className="space-y-1.5">
             <Label>{t("filters.model")}</Label>
             <Select
-              value={filters.model ?? ""}
-              onValueChange={(value) => handleFilterChange({ model: value || undefined })}
+              value={filters.model ?? "__all__"}
+              onValueChange={(value) => handleFilterChange({ model: value === "__all__" ? undefined : value })}
             >
               <SelectTrigger>
                 <SelectValue placeholder={t("filters.allModels")} />
               </SelectTrigger>
               <SelectContent>
-                <SelectItem value="">{t("filters.allModels")}</SelectItem>
+                <SelectItem value="__all__">{t("filters.allModels")}</SelectItem>
                 {models.map((model) => (
                   <SelectItem key={model} value={model}>
                     {model}
@@ -137,16 +137,16 @@ export function UsageLogsSection({ initialData = null }: UsageLogsSectionProps)
           <div className="space-y-1.5">
             <Label>{t("filters.status")}</Label>
             <Select
-              value={filters.statusCode?.toString() ?? ""}
+              value={filters.statusCode?.toString() ?? "__all__"}
               onValueChange={(value) =>
-                handleFilterChange({ statusCode: value ? parseInt(value, 10) : undefined })
+                handleFilterChange({ statusCode: value === "__all__" ? undefined : parseInt(value, 10) })
               }
             >
               <SelectTrigger>
                 <SelectValue placeholder={t("filters.allStatus")} />
               </SelectTrigger>
               <SelectContent>
-                <SelectItem value="">{t("filters.allStatus")}</SelectItem>
+                <SelectItem value="__all__">{t("filters.allStatus")}</SelectItem>
                 <SelectItem value="200">200</SelectItem>
                 <SelectItem value="400">400</SelectItem>
                 <SelectItem value="401">401</SelectItem>