import { useState, useEffect } from 'react'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Textarea } from '@/components/ui/textarea'; import { Label } from '@/components/ui/label'; import { RadioGroup, RadioGroupItem } from '@/components/ui/radio-group'; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from '@/components/ui/dialog'; import { kubernetesApi } from '@/services/api'; const emptyForm = { name: '', version: '', description: '', config_type: 1, // 0=Token, 1=Kubeconfig api_server: '', token: '', kube_config: '', }; export function KubernetesClusterDialog({ open, onOpenChange, editingCluster, onSaved, }: { open: boolean; onOpenChange: (open: boolean) => void; editingCluster: any; onSaved: () => void; }) { const [formData, setFormData] = useState({ ...emptyForm }); const [submitting, setSubmitting] = useState(false); const [hasToken, setHasToken] = useState(false); // 已配置 Token 标记 // Logan.Li const [hasKubeConfig, setHasKubeConfig] = useState(false); // 已配置 Kubeconfig 标记 // 打开时同步表单(编辑时拉取详情,新建时重置) useEffect(() => { if (!open) return; if (editingCluster && editingCluster.id) { // 编辑模式:拉取详情获取 has_token/has_kube_config 标记 // Logan.Li kubernetesApi.getClusterDetail(editingCluster.id).then((res: any) => { const d = res || {}; setHasToken(!!d.has_token); setHasKubeConfig(!!d.has_kube_config); setFormData({ name: d.name || '', version: d.version || '', description: d.description || '', config_type: Number(d.config_type ?? 1), api_server: d.api_server || '', token: '', // 不回填原文,留空不修改 kube_config: '', // 不回填原文,留空不修改 }); }).catch(() => { // 降级:用列表数据 setFormData({ name: editingCluster.name || '', version: editingCluster.version || '', description: editingCluster.description || '', config_type: Number(editingCluster.config_type ?? 1), api_server: editingCluster.api_server || '', token: '', kube_config: '', }); }); } else { setHasToken(false); setHasKubeConfig(false); setFormData({ ...emptyForm }); } }, [open, editingCluster]); // 从 kubeconfig YAML 中解析 server 地址 const parseApiServer = (yaml: string): string => { const match = yaml.match(/^\s*server:\s*(\S+)\s*$/m); return match ? match[1] : ''; }; const handleKubeConfigChange = (value: string) => { const server = parseApiServer(value); setFormData((prev) => ({ ...prev, kube_config: value, api_server: server || prev.api_server, })); }; const handleSubmit = async () => { if (!formData.name.trim()) return; try { setSubmitting(true); const payload = { name: formData.name, version: formData.version, description: formData.description, config_type: formData.config_type, api_server: formData.api_server, token: formData.config_type === 0 ? formData.token : '', kube_config: formData.config_type === 1 ? formData.kube_config : '', }; if (editingCluster) { await kubernetesApi.updateCluster(editingCluster.id, payload); } else { await kubernetesApi.createCluster(payload); } onOpenChange(false); onSaved(); } catch (e) { console.error('保存集群失败:', e); } finally { setSubmitting(false); } }; return ( {editingCluster ? '编辑集群' : '添加集群'} {editingCluster ? '修改集群接入配置' : '配置新的 Kubernetes 集群接入信息'}
setFormData({ ...formData, name: e.target.value })} placeholder="例如:prod-cluster" className="bg-[var(--dg-bg-tertiary)] border-[var(--dg-border)] text-[var(--dg-text-primary)] placeholder:text-[var(--dg-text-muted)]" />
setFormData({ ...formData, version: e.target.value })} placeholder="例如:1.28.0" className="bg-[var(--dg-bg-tertiary)] border-[var(--dg-border)] text-[var(--dg-text-primary)] placeholder:text-[var(--dg-text-muted)]" />
setFormData({ ...formData, description: e.target.value })} placeholder="集群用途描述" className="bg-[var(--dg-bg-tertiary)] border-[var(--dg-border)] text-[var(--dg-text-primary)] placeholder:text-[var(--dg-text-muted)]" />
setFormData({ ...formData, config_type: Number(v) })} className="flex gap-4" >
setFormData({ ...formData, api_server: e.target.value })} placeholder="https://10.0.0.1:6443" className="bg-[var(--dg-bg-tertiary)] border-[var(--dg-border)] text-[var(--dg-text-primary)] placeholder:text-[var(--dg-text-muted)]" />
{formData.config_type === 0 ? (