diff --git a/frontend/src/pages/Deploy/JenkinsManager/List/index.tsx b/frontend/src/pages/Deploy/JenkinsManager/List/index.tsx index ff00b616..623c6040 100644 --- a/frontend/src/pages/Deploy/JenkinsManager/List/index.tsx +++ b/frontend/src/pages/Deploy/JenkinsManager/List/index.tsx @@ -1,6 +1,6 @@ -import React, { useState, useEffect } from 'react'; +import React, { useState, useEffect, useRef } from 'react'; import { PageContainer } from '@/components/ui/page-container'; -import { RefreshCw, ChevronRight } from 'lucide-react'; +import { RefreshCw, ChevronLeft, ChevronRight } from 'lucide-react'; import { Card, CardContent, @@ -15,7 +15,12 @@ import { } from "@/components/ui/select"; import { Badge } from "@/components/ui/badge"; import { useToast } from "@/components/ui/use-toast"; -import { Separator } from "@/components/ui/separator"; +import { + Tabs, + TabsContent, + TabsList, + TabsTrigger, +} from "@/components/ui/tabs"; import type { JenkinsInstance, JenkinsInstanceDTO } from './types'; import { getJenkinsInstances, getJenkinsInstance, syncViews, syncJobs, syncBuilds } from './service'; @@ -25,12 +30,13 @@ const JenkinsManagerList: React.FC = () => { const [currentJenkins, setCurrentJenkins] = useState(); const [instanceDetails, setInstanceDetails] = useState(); const [loading, setLoading] = useState(false); + const [currentView, setCurrentView] = useState(); const [syncing, setSyncing] = useState>({ views: false, jobs: false, builds: false }); - const [expandedViews, setExpandedViews] = useState>({}); + const tabsRef = useRef(null); const { toast } = useToast(); // 获取 Jenkins 实例列表 @@ -110,13 +116,12 @@ const JenkinsManagerList: React.FC = () => { } }; - // 添加切换展开/收起的处理函数 - const toggleView = (viewId: number) => { - setExpandedViews(prev => ({ - ...prev, - [viewId]: !prev[viewId] - })); - }; + // 在获取实例详情后设置默认视图 + useEffect(() => { + if (instanceDetails?.jenkinsViewList.length > 0) { + setCurrentView(String(instanceDetails.jenkinsViewList[0].id)); + } + }, [instanceDetails]); useEffect(() => { loadJenkinsList(); @@ -133,6 +138,19 @@ const JenkinsManagerList: React.FC = () => { return time; }; + const handleScroll = (direction: 'left' | 'right') => { + if (tabsRef.current) { + const scrollAmount = 200; // 每次滚动的距离 + const newScrollLeft = direction === 'left' + ? tabsRef.current.scrollLeft - scrollAmount + : tabsRef.current.scrollLeft + scrollAmount; + tabsRef.current.scrollTo({ + left: newScrollLeft, + behavior: 'smooth' + }); + } + }; + return (
@@ -226,67 +244,97 @@ const JenkinsManagerList: React.FC = () => { )} - - -

Views

-
- {loading ? ( -
- -
- ) : instanceDetails?.jenkinsViewList.map((view, index) => ( -
- {index > 0 && } -
-
toggleView(view.id)} + {loading ? ( + + + + + + ) : instanceDetails && ( + +
+
+ +
+ +
+ + {instanceDetails.jenkinsViewList.map(view => ( + -
-

{view.viewName}

+
+ {view.viewName} {view.description && ( -

{view.description}

+ + ({view.description}) + )}
- -
- {expandedViews[view.id] && ( -
- {instanceDetails.jenkinsJobList - .filter(job => job.viewId === view.id) - .map(job => ( -
-
- - {job.jobName} - - {job.description && ( -

{job.description}

- )} -
-
- - #{job.lastBuildNumber} - {job.lastBuildStatus} - - {formatTime(job.lastBuildTime)} -
-
- ))} -
- )} -
-
- ))} + + ))} + +
+ +
+ +
- - + + {instanceDetails.jenkinsViewList.map(view => ( + + + +
+ {instanceDetails.jenkinsJobList + .filter(job => job.viewId === view.id) + .map(job => ( +
+
+ + {job.jobName} + + {job.description && ( +

{job.description}

+ )} +
+
+ + #{job.lastBuildNumber} - {job.lastBuildStatus} + + {formatTime(job.lastBuildTime)} +
+
+ ))} +
+
+
+
+ ))} + + )} ); };