diff --git a/frontend/src/components/kubernetes/PodExecTerminal.tsx b/frontend/src/components/kubernetes/PodExecTerminal.tsx index 921adfd..ee11441 100644 --- a/frontend/src/components/kubernetes/PodExecTerminal.tsx +++ b/frontend/src/components/kubernetes/PodExecTerminal.tsx @@ -130,7 +130,8 @@ export function PodExecTerminal({ } else if (msg.status === 1) { // 服务端 resize 确认,忽略 } else if (msg.status === 2 || msg.error) { - term.write(`\r\n\x1b[31m${msg.message || msg.error || '执行错误'}\x1b[0m\r\n`); + const errMsg = msg.data || msg.message || msg.error || '执行错误'; + term.write(errMsg.includes('\\x1b') ? errMsg : `\\r\\n\\x1b[31m${errMsg}\\x1b[0m\\r\\n`); } } catch { if (typeof event.data === 'string') term.write(event.data); diff --git a/frontend/src/components/kubernetes/YamlViewer.tsx b/frontend/src/components/kubernetes/YamlViewer.tsx index 698fbc4..b8cc405 100644 --- a/frontend/src/components/kubernetes/YamlViewer.tsx +++ b/frontend/src/components/kubernetes/YamlViewer.tsx @@ -14,23 +14,27 @@ interface YamlViewerProps { onSaved?: () => void; /** 进入编辑模式前是否清理只读/噪音字段(managedFields/uid/status 等) */ cleanBeforeEdit?: boolean; + /** 打开即自动进入编辑模式(编辑按钮专用入口) */ + autoEdit?: boolean; } -export function YamlViewer({ clusterCode, namespace, resource, name, onClose, onSaved, cleanBeforeEdit = false }: YamlViewerProps) { +export function YamlViewer({ clusterCode, namespace, resource, name, onClose, onSaved, cleanBeforeEdit = false, autoEdit = false }: YamlViewerProps) { const { toast } = useToast(); const [rawYaml, setRawYaml] = useState(''); // 原始(只读展示用) const [editYaml, setEditYaml] = useState(''); // 编辑态(可能被清理过) const [loading, setLoading] = useState(true); const [saving, setSaving] = useState(false); - const [editing, setEditing] = useState(false); + const [editing, setEditing] = useState(autoEdit); // autoEdit → 初始即编辑态 const [copied, setCopied] = useState(false); + // autoEdit 时隐式启用清理(编辑入口必须有清理,否则 status/managedFields 会被 K8s 拒绝) + const effectiveClean = cleanBeforeEdit || autoEdit; const loadYaml = async () => { setLoading(true); try { const text = await kubernetesApi.getResourceYaml(clusterCode, namespace, resource, name); setRawYaml(text); - setEditYaml(text); + setEditYaml(effectiveClean ? cleanYAML(text) : text); } catch (e: any) { toast({ title: '获取YAML失败', description: e.message, variant: 'destructive' }); const err = `# Error: ${e.message}`; @@ -41,10 +45,10 @@ export function YamlViewer({ clusterCode, namespace, resource, name, onClose, on const enterEdit = () => { // 进入编辑前可选清理 - const cleaned = cleanBeforeEdit ? cleanYAML(rawYaml) : rawYaml; + const cleaned = effectiveClean ? cleanYAML(rawYaml) : rawYaml; setEditYaml(cleaned); setEditing(true); - if (cleanBeforeEdit) { + if (effectiveClean) { toast({ title: '已清理只读字段', description: '已剥离 status / managedFields / uid 等' }); } };