From 1beb98366be7af620b5f501acd0d26c316fb4603 Mon Sep 17 00:00:00 2001 From: catlog22 Date: Mon, 2 Feb 2026 10:49:21 +0800 Subject: [PATCH] refactor(frontend): change API Settings from sidebar to horizontal tabs layout Refactor ApiSettingsPage to use horizontal Tabs component like CodexLens page, replacing the previous vertical sidebar navigation. Changes: - Replace Card-based sidebar with horizontal TabsList/TabsTrigger components - Remove split-panel layout (sidebar + main panel) - Use TabsContent to wrap each tab's content - Import and use Tabs, TabsList, TabsTrigger, TabsContent from ui/Tabs - Add api-settings.json import to en/zh locale index files for i18n support Layout comparison: - Before: Vertical sidebar (lg:w-64) with Card + nav buttons - After: Horizontal tabs (TabsList) with tab triggers --- ccw/frontend/src/locales/en/index.ts | 2 + ccw/frontend/src/locales/zh/index.ts | 2 + ccw/frontend/src/pages/ApiSettingsPage.tsx | 153 ++++++++------------- 3 files changed, 59 insertions(+), 98 deletions(-) diff --git a/ccw/frontend/src/locales/en/index.ts b/ccw/frontend/src/locales/en/index.ts index e4a6d32a..303ecbca 100644 --- a/ccw/frontend/src/locales/en/index.ts +++ b/ccw/frontend/src/locales/en/index.ts @@ -24,6 +24,7 @@ import cliManager from './cli-manager.json'; import cliMonitor from './cli-monitor.json'; import mcpManager from './mcp-manager.json'; import codexlens from './codexlens.json'; +import apiSettings from './api-settings.json'; import theme from './theme.json'; import executionMonitor from './execution-monitor.json'; import cliHooks from './cli-hooks.json'; @@ -82,6 +83,7 @@ export default { ...flattenMessages(cliMonitor, 'cliMonitor'), ...flattenMessages(mcpManager, 'mcp'), ...flattenMessages(codexlens, 'codexlens'), + ...flattenMessages(apiSettings, 'apiSettings'), ...flattenMessages(theme, 'theme'), ...flattenMessages(cliHooks, 'cliHooks'), ...flattenMessages(executionMonitor, 'executionMonitor'), diff --git a/ccw/frontend/src/locales/zh/index.ts b/ccw/frontend/src/locales/zh/index.ts index 517d57fd..339587de 100644 --- a/ccw/frontend/src/locales/zh/index.ts +++ b/ccw/frontend/src/locales/zh/index.ts @@ -24,6 +24,7 @@ import cliManager from './cli-manager.json'; import cliMonitor from './cli-monitor.json'; import mcpManager from './mcp-manager.json'; import codexlens from './codexlens.json'; +import apiSettings from './api-settings.json'; import theme from './theme.json'; import executionMonitor from './execution-monitor.json'; import cliHooks from './cli-hooks.json'; @@ -82,6 +83,7 @@ export default { ...flattenMessages(cliMonitor, 'cliMonitor'), ...flattenMessages(mcpManager, 'mcp'), ...flattenMessages(codexlens, 'codexlens'), + ...flattenMessages(apiSettings, 'apiSettings'), ...flattenMessages(theme, 'theme'), ...flattenMessages(cliHooks, 'cliHooks'), ...flattenMessages(executionMonitor, 'executionMonitor'), diff --git a/ccw/frontend/src/pages/ApiSettingsPage.tsx b/ccw/frontend/src/pages/ApiSettingsPage.tsx index f9520b9a..d203cc12 100644 --- a/ccw/frontend/src/pages/ApiSettingsPage.tsx +++ b/ccw/frontend/src/pages/ApiSettingsPage.tsx @@ -7,14 +7,10 @@ import { useState, useMemo } from 'react'; import { useIntl } from 'react-intl'; import { Server, - Link, - Database, - Layers, - Settings as SettingsIcon, RefreshCw, } from 'lucide-react'; -import { Card } from '@/components/ui/Card'; import { Button } from '@/components/ui/Button'; +import { Tabs, TabsList, TabsTrigger, TabsContent } from '@/components/ui/Tabs'; import { ProviderList, ProviderModal, @@ -30,20 +26,10 @@ import { } from '@/components/api-settings'; import { useProviders, useEndpoints, useModelPools, useCliSettings } from '@/hooks/useApiSettings'; import { useNotifications } from '@/hooks/useNotifications'; -import { cn } from '@/lib/utils'; // Tab type definitions type TabType = 'providers' | 'endpoints' | 'cache' | 'modelPools' | 'cliSettings'; -// Tab configuration -const TABS: { value: TabType; icon: React.ElementType }[] = [ - { value: 'providers', icon: Server }, - { value: 'endpoints', icon: Link }, - { value: 'cache', icon: Database }, - { value: 'modelPools', icon: Layers }, - { value: 'cliSettings', icon: SettingsIcon }, -]; - export function ApiSettingsPage() { const { formatMessage } = useIntl(); const { showNotification } = useNotifications(); @@ -192,52 +178,6 @@ export function ApiSettingsPage() { } }; - // Render the active tab's main content - const renderMainContent = () => { - switch (activeTab) { - case 'providers': - return ( - - ); - - case 'endpoints': - return ( - - ); - - case 'cache': - return ; - - case 'modelPools': - return ( - - ); - - case 'cliSettings': - return ( - - ); - - default: - return null; - } - }; - return (
{/* Page Header */} @@ -257,44 +197,61 @@ export function ApiSettingsPage() {
- {/* Split Panel Layout */} -
- {/* Left Sidebar - Tabs */} - + {/* Tabbed Interface */} + setActiveTab(v as TabType)}> + + + {formatMessage({ id: 'apiSettings.tabs.providers' })} + + + {formatMessage({ id: 'apiSettings.tabs.endpoints' })} + + + {formatMessage({ id: 'apiSettings.tabs.cache' })} + + + {formatMessage({ id: 'apiSettings.tabs.modelPools' })} + + + {formatMessage({ id: 'apiSettings.tabs.cliSettings' })} + + - {/* Right Main Panel - Content */} -
- {renderMainContent()} -
-
+ + + + + + + + + + + + + + + + + + + + {/* Modals */}