import { useState, useEffect, useCallback, useMemo } from 'react'; import { useParams, useNavigate } from 'react-router-dom'; import { Button } from '@/components/ui/button'; import { Badge } from '@/components/ui/badge'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '@/components/ui/select'; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from '@/components/ui/table'; import { RefreshCw, BarChart3, Download, Cpu, HardDrive } from 'lucide-react'; import { kubernetesApi } from '@/api'; import { PageShell } from '@/components/layout/PageShell'; import { ContentPanel } from '@/components/layout/ContentPanel'; import type { JsonData } from '@/types/common'; import i18n from '@/i18n'; export default function CapacityPage() { const { clusterCode } = useParams<{ clusterCode: string }>(); const navigate = useNavigate(); const [loading, setLoading] = useState(false); const [capacity, setCapacity] = useState([]); const [clusters, setClusters] = useState([]); const [namespaces, setNamespaces] = useState([]); const [selectedNs, setSelectedNs] = useState('all'); const [activeCluster, setActiveCluster] = useState(clusterCode || ''); useEffect(() => { kubernetesApi.getClusters().then((res: JsonData) => { const list = res?.list || []; setClusters(list); if (!activeCluster && list.length > 0) { const code = list[0].code || String(list[0].id); setActiveCluster(code); navigate(`/kubernetes/${code}/capacity`, { replace: true }); } }).catch(() => {}); // eslint-disable-next-line react-hooks/exhaustive-deps }, []); useEffect(() => { if (!activeCluster) return; kubernetesApi.getNamespaces(activeCluster).then((res: JsonData) => { setNamespaces(Array.isArray(res) ? res : (res?.list || res?.data || [])); }).catch(() => {}); }, [activeCluster]); const loadCapacity = useCallback(async () => { if (!activeCluster) return; setLoading(true); try { const ns = selectedNs === 'all' ? undefined : selectedNs; const res: JsonData = await kubernetesApi.getCapacity(activeCluster, ns); setCapacity(Array.isArray(res) ? res : (res?.list || [])); } catch { setCapacity([]); } finally { setLoading(false); } }, [activeCluster, selectedNs]); useEffect(() => { loadCapacity(); }, [loadCapacity]); const rows = useMemo(() => capacity.flatMap((d: JsonData) => (d.containers || []).map((c: JsonData) => ({ namespace: d.namespace, deployment: d.name, replicas: d.replicas, container: c.name, cpu_req: c.cpu_request || '-', cpu_lim: c.cpu_limit || '-', mem_req: c.mem_request || '-', mem_lim: c.mem_limit || '-', })) ), [capacity]); const exportCSV = () => kubernetesApi.exportAsCSV(`capacity-${activeCluster}.csv`, rows); const clusterName = clusters.find((c: JsonData) => (c.code || String(c.id)) === activeCluster)?.name; return ( } actions={( <> )} > Deployment {i18n.t("common.namespaceLabel")} {i18n.t("common.replicasLabel")} {i18n.t("common.containerLabel")} CPU Req CPU Lim Mem Req Mem Lim {rows.length === 0 ? ( {i18n.t('common.noData')} ) : rows.map((r, i) => ( {r.deployment} {r.namespace} {r.replicas} {r.container} {r.cpu_req} {r.cpu_lim} {r.mem_req} {r.mem_lim} ))}
); }