2 lines
37 KiB
JavaScript
2 lines
37 KiB
JavaScript
import{r as h,j as e}from"./vendor-codemirror-B1SGo4xl.js";import{B as j}from"./index-Bp-M7P_8.js";import{p as B,c as Z,g as ie,M as le,d as ue,b as xe,e as pe,f as me,y as he}from"./PodFileBrowser-CVjj8HxI.js";import{I as E}from"./input-Bnlm--la.js";import{L as S}from"./label-NkONM5Mp.js";import{T as be}from"./textarea-BvOVhaCD.js";import{S as F,a as G,b as W,c as q,d as Y}from"./select-DbhcBWnH.js";import{u as ve}from"./use-toast-DNZLibQY.js";import{k as _,d as ge}from"./index-BkulU9RM.js";import{D as ke,f as Re,N as Ee,j as ye,F as je,X as Ve,L as I,P as z,T as O,$}from"./vendor-icons-BWk-DH7F.js";function ee(i,b,c){switch(i){case"services":return{apiVersion:"v1",kind:"Service",metadata:{name:c,namespace:b},spec:{type:"ClusterIP",selector:{},ports:[{name:"http",port:80,targetPort:80,protocol:"TCP"}]}};case"ingresses":return{apiVersion:"networking.k8s.io/v1",kind:"Ingress",metadata:{name:c,namespace:b},spec:{ingressClassName:"nginx",rules:[{host:"",http:{paths:[{path:"/",pathType:"Prefix",backend:{service:{name:"",port:{number:80}}}}]}}]}};case"configmaps":return{apiVersion:"v1",kind:"ConfigMap",metadata:{name:c,namespace:b},data:{}};case"secrets":return{apiVersion:"v1",kind:"Secret",metadata:{name:c,namespace:b},type:"Opaque",data:{}};case"pvcs":return{apiVersion:"v1",kind:"PersistentVolumeClaim",metadata:{name:c,namespace:b},spec:{accessModes:["ReadWriteOnce"],resources:{requests:{storage:"1Gi"}}}};default:return{apiVersion:"v1",kind:"Unknown",metadata:{name:c,namespace:b}}}}function Ae({clusterCode:i,namespace:b,resource:c,name:y,onClose:k,onSaved:f,isCreate:v=!1}){const{toast:d}=ve(),[w,m]=h.useState(!0),[g,V]=h.useState(!1),[N,r]=h.useState(""),[t,x]=h.useState(null),[R,P]=h.useState("visual"),[l,n]=h.useState(""),[p,s]=h.useState(""),[o,a]=h.useState(!1),[C,A]=h.useState(!1),[se,U]=h.useState(!1),H=h.useCallback(async()=>{m(!0);try{if(v){const K=ee(c,b,y||""),Q=await B(K);x(K),n(Q),s(Q),r(""),a(!0);return}const u=await _.getResourceYaml(i,b,c,y);r(u);const{manifest:T,yaml:M}=await Z(u);n(M),s(M),a(!1),A(!1),x(T),T||(P("yaml"),d({title:"可视化编辑不可用",description:"无法解析资源结构,已切换到 YAML 编辑模式"}))}catch(u){d({title:"加载失败",description:u.message,variant:"destructive"})}finally{m(!1)}},[i,b,c,y,v]);h.useEffect(()=>{H()},[H]);const L=async u=>{V(!0);try{const T=await B(u),M=u?.metadata?.name||y;if(v){if(!M?.trim()){d({title:"请填写名称",variant:"destructive"});return}await _.applyYAML(i,T),d({title:"创建成功",description:`${c}/${M}`})}else await _.updateResourceYaml(i,b,c,y,T),d({title:"保存成功",description:`${c}/${y} 已更新`});f?.(),k()}catch(T){d({title:v?"创建失败":"保存失败",description:T.message,variant:"destructive"})}finally{V(!1)}},te=async()=>{V(!0);try{const u=await me(p);v?(await _.applyYAML(i,u),d({title:"创建成功",description:"YAML 已应用"})):(await _.updateResourceYaml(i,b,c,y,u),d({title:"保存成功",description:`${c}/${y} 已更新`})),a(!1),n(u),s(u),v||r(u),f?.(),k()}catch(u){d({title:"保存失败",description:u.message,variant:"destructive"})}finally{V(!1)}},re=async()=>{const u=await pe(p);if(!u){d({title:"无法解析 YAML",description:"请检查语法后继续用 YAML 模式",variant:"destructive"});return}x(u),P("visual")},oe=async()=>{if(t){const u=await B(t);n(u),s(u)}a(!1),A(!1),P("yaml")},X=()=>o?p:C?N:l,ae=async()=>{await navigator.clipboard.writeText(X()),U(!0),setTimeout(()=>U(!1),2e3)},ce=()=>{const u=he(c,b,y||t?.metadata?.name||"resource");ge(u,X()),d({title:"已下载",description:u})},ne=ie(c),J={configmaps:{title:"ConfigMap",icon:je,color:"text-blue-400"},secrets:{title:"Secret",icon:ye,color:"text-amber-400"},services:{title:"Service",icon:Ee,color:"text-cyan-400"},ingresses:{title:"Ingress",icon:Re,color:"text-purple-400"},pvcs:{title:"PersistentVolumeClaim",icon:ke,color:"text-emerald-400"}},D=J[c]||J.configmaps,de=D.icon;return e.jsx(le,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:169:5",onClose:k,children:e.jsxs("div",{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:170:7",className:"bg-[var(--dg-bg-primary)] border border-[var(--dg-border)] rounded-xl w-[90vw] max-w-3xl h-[85vh] flex flex-col shadow-2xl",onClick:u=>u.stopPropagation(),children:[e.jsxs("div",{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:175:9",className:"flex items-center justify-between p-4 border-b border-[var(--dg-border)]",children:[e.jsxs("div",{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:176:11",className:"flex items-center gap-2",children:[e.jsx(de,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:177:13",className:`h-5 w-5 ${D.color}`}),e.jsxs("div",{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:178:13",children:[e.jsx("h2",{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:179:15",className:"text-lg font-bold text-[var(--dg-text-primary)]",children:v?`新建 ${D.title}`:`${D.title} 编辑`}),e.jsxs("p",{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:180:15",className:"text-xs text-[var(--dg-text-muted)]",children:[v?b:y," · ",b," · ",i]})]})]}),e.jsxs("div",{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:183:11",className:"flex items-center gap-2",children:[e.jsxs("div",{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:185:13",className:"flex rounded-lg border border-[var(--dg-border)] overflow-hidden",children:[e.jsx("button",{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:186:15",className:`px-3 py-1.5 text-xs font-medium transition-colors ${R==="visual"?"bg-blue-600 text-white":"bg-transparent text-[var(--dg-text-secondary)] hover:bg-[var(--dg-bg-tertiary)]"}`,onClick:()=>{R==="yaml"?re():P("visual")},disabled:!t&&R!=="yaml",children:"可视化编辑"}),e.jsx("button",{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:191:15",className:`px-3 py-1.5 text-xs font-medium transition-colors ${R==="yaml"?"bg-blue-600 text-white":"bg-transparent text-[var(--dg-text-secondary)] hover:bg-[var(--dg-bg-tertiary)]"}`,onClick:()=>{R==="visual"?oe():P("yaml")},children:"YAML 编辑"})]}),e.jsx(j,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:196:13",variant:"ghost",size:"icon",className:"h-8 w-8 text-[var(--dg-text-secondary)]",onClick:k,children:e.jsx(Ve,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:196:119",className:"h-4 w-4"})})]})]}),e.jsx("div",{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:201:9",className:`flex-1 min-h-0 p-4 ${R==="yaml"?"flex flex-col overflow-hidden":"overflow-auto"}`,children:w?e.jsx("div",{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:203:13",className:"flex items-center justify-center h-full py-20",children:e.jsx(I,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:203:76",className:"h-6 w-6 animate-spin text-[var(--dg-text-muted)]"})}):R==="yaml"?e.jsxs("div",{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:205:13",className:"flex flex-col flex-1 min-h-0 gap-3",children:[e.jsx("div",{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:206:15",className:"flex justify-end shrink-0",children:e.jsx(ue,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:207:17",editing:o,saving:g,copied:se,showRaw:C,compact:!0,readOnly:ne.readOnly,showRawToggle:!v&&!!N,onCopy:ae,onDownload:ce,onEdit:()=>{s(l),a(!0),A(!1)},onCancel:async()=>{if(a(!1),v){const T=ee(c,b,y||""),M=await B(T);n(M),s(M);return}const{yaml:u}=await Z(N);n(u),s(u)},onSave:te,onToggleRaw:()=>A(u=>!u)})}),e.jsx(xe,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:235:15",value:o?p:C?N:l,editing:o,fill:!0,fontSize:"12px",onChange:u=>o&&s(u)})]}):t?e.jsxs(e.Fragment,{children:[c==="configmaps"&&e.jsx(Ne,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:245:45",manifest:t,onSave:L,saving:g,isCreate:v}),c==="secrets"&&e.jsx(fe,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:246:42",manifest:t,onSave:L,saving:g,isCreate:v}),c==="services"&&e.jsx(we,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:247:43",manifest:t,onSave:L,saving:g,isCreate:v}),c==="ingresses"&&e.jsx(Se,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:248:44",manifest:t,onSave:L,saving:g,isCreate:v}),c==="pvcs"&&e.jsx(Ce,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:249:39",manifest:t,onSave:L,saving:g,isCreate:v}),!["configmaps","secrets","services","ingresses","pvcs"].includes(c)&&e.jsxs("div",{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:251:17",className:"text-center py-12 text-[var(--dg-text-muted)]",children:[e.jsx("p",{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:252:19",children:"该资源类型暂不支持可视化编辑"}),e.jsx(j,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:253:19",variant:"outline",size:"sm",className:"mt-4",onClick:()=>P("yaml"),children:"切换到 YAML 编辑"})]})]}):e.jsxs("div",{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:258:13",className:"text-center py-12 text-[var(--dg-text-muted)]",children:[e.jsx("p",{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:259:15",children:"无法解析资源结构"}),e.jsx(j,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:260:15",variant:"outline",size:"sm",className:"mt-4",onClick:()=>P("yaml"),children:"切换到 YAML 编辑"})]})})]})})}function Ne({manifest:i,onSave:b,saving:c,isCreate:y}){const k=i?.data||{},[f,v]=h.useState(i?.metadata?.name||""),[d,w]=h.useState(Object.entries(k).map(([r,t])=>({key:r,value:String(t)}))),m=(r,t,x)=>{const R=[...d];R[r]={...R[r],[t]:x},w(R)},g=()=>w([...d,{key:"",value:""}]),V=r=>w(d.filter((t,x)=>x!==r)),N=()=>{const r={};d.forEach(t=>{t.key.trim()&&(r[t.key.trim()]=t.value)}),b({...i,metadata:{...i.metadata,name:f.trim()},data:r})};return e.jsxs("div",{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:297:5",className:"space-y-4",children:[e.jsxs("div",{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:298:7",children:[e.jsx(S,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:299:9",className:"text-[var(--dg-text-secondary)] text-xs",children:"名称"}),e.jsx(E,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:300:9",value:f,onChange:r=>v(r.target.value),readOnly:!y,className:"mt-1 font-mono text-xs bg-[var(--dg-bg-tertiary)]"})]}),e.jsxs("div",{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:302:7",children:[e.jsxs("div",{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:303:9",className:"flex items-center justify-between mb-2",children:[e.jsx(S,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:304:11",className:"text-[var(--dg-text-secondary)] text-sm",children:"配置数据 (键值对)"}),e.jsxs(j,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:305:11",variant:"outline",size:"sm",className:"h-7 text-xs",onClick:g,children:[e.jsx(z,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:305:88",className:"h-3 w-3 mr-1"}),"添加"]})]}),e.jsxs("div",{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:307:9",className:"space-y-2 max-h-[45vh] overflow-y-auto pr-1",children:[d.map((r,t)=>e.jsxs("div",{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:309:13",className:"flex items-start gap-2 p-2 rounded-lg border border-[var(--dg-border)] bg-[var(--dg-bg-secondary)]",children:[e.jsx(E,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:310:15",value:r.key,onChange:x=>m(t,"key",x.target.value),placeholder:"键名 (如 LOG_LEVEL)",className:"flex-1 font-mono text-xs h-8 bg-[var(--dg-bg-tertiary)] border-[var(--dg-border)] text-[var(--dg-text-primary)]"}),e.jsx(be,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:316:15",value:r.value,onChange:x=>m(t,"value",x.target.value),placeholder:"值",className:"flex-[2] font-mono text-xs min-h-[36px] max-h-[120px] bg-[var(--dg-bg-tertiary)] border-[var(--dg-border)] text-[var(--dg-text-primary)]"}),e.jsx(j,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:322:15",variant:"ghost",size:"icon",className:"h-8 w-8 text-red-400 hover:text-red-300 shrink-0",onClick:()=>V(t),children:e.jsx(O,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:323:17",className:"h-3.5 w-3.5"})})]},t)),d.length===0&&e.jsx("div",{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:328:13",className:"text-center py-8 text-[var(--dg-text-muted)] text-xs",children:"暂无配置数据,点击「添加」创建"})]})]}),e.jsx("div",{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:332:7",className:"flex justify-end gap-2 pt-2 border-t border-[var(--dg-border)]",children:e.jsxs(j,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:333:9",size:"sm",className:"bg-blue-600 hover:bg-blue-700",onClick:N,disabled:c,children:[c?e.jsx(I,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:334:21",className:"h-3.5 w-3.5 animate-spin mr-1"}):e.jsx($,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:334:77",className:"h-3.5 w-3.5 mr-1"}),"保存配置"]})})]})}function fe({manifest:i,onSave:b,saving:c,isCreate:y}){const k=i?.data||{},[f,v]=h.useState(i?.metadata?.name||""),[d,w]=h.useState(Object.entries(k).map(([r,t])=>{const x=String(t);try{const R=atob(x);return{key:r,value:R,encoded:!0}}catch{return{key:r,value:x,encoded:!1}}})),m=(r,t,x)=>{const R=[...d];R[r]={...R[r],[t]:x},w(R)},g=()=>w([...d,{key:"",value:"",encoded:!0}]),V=r=>w(d.filter((t,x)=>x!==r)),N=()=>{const r={};d.forEach(t=>{t.key.trim()&&(r[t.key.trim()]=t.encoded?btoa(t.value):t.value)}),b({...i,metadata:{...i.metadata,name:f.trim()},data:r})};return e.jsxs("div",{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:383:5",className:"space-y-4",children:[e.jsxs("div",{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:384:7",children:[e.jsx(S,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:385:9",className:"text-[var(--dg-text-secondary)] text-xs",children:"名称"}),e.jsx(E,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:386:9",value:f,onChange:r=>v(r.target.value),readOnly:!y,className:"mt-1 font-mono text-xs bg-[var(--dg-bg-tertiary)]"})]}),e.jsxs("div",{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:388:7",children:[e.jsx(S,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:389:9",className:"text-[var(--dg-text-secondary)] text-xs",children:"类型"}),e.jsx(E,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:390:9",value:i?.type||"Opaque",readOnly:!0,className:"mt-1 font-mono text-xs bg-[var(--dg-bg-tertiary)]"})]}),e.jsxs("div",{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:392:7",children:[e.jsxs("div",{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:393:9",className:"flex items-center justify-between mb-2",children:[e.jsx(S,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:394:11",className:"text-[var(--dg-text-secondary)] text-sm",children:"密钥数据 (已自动解码 Base64)"}),e.jsxs(j,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:395:11",variant:"outline",size:"sm",className:"h-7 text-xs",onClick:g,children:[e.jsx(z,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:395:88",className:"h-3 w-3 mr-1"}),"添加"]})]}),e.jsxs("div",{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:397:9",className:"space-y-2 max-h-[45vh] overflow-y-auto pr-1",children:[d.map((r,t)=>e.jsxs("div",{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:399:13",className:"flex items-start gap-2 p-2 rounded-lg border border-[var(--dg-border)] bg-[var(--dg-bg-secondary)]",children:[e.jsx(E,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:400:15",value:r.key,onChange:x=>m(t,"key",x.target.value),placeholder:"键名 (如 password)",className:"flex-1 font-mono text-xs h-8 bg-[var(--dg-bg-tertiary)] border-[var(--dg-border)] text-[var(--dg-text-primary)]"}),e.jsx(E,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:406:15",value:r.value,onChange:x=>m(t,"value",x.target.value),placeholder:"明文值",className:"flex-[2] font-mono text-xs h-8 bg-[var(--dg-bg-tertiary)] border-[var(--dg-border)] text-[var(--dg-text-primary)]"}),e.jsx(j,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:412:15",variant:"ghost",size:"icon",className:"h-8 w-8 text-red-400 hover:text-red-300 shrink-0",onClick:()=>V(t),children:e.jsx(O,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:413:17",className:"h-3.5 w-3.5"})})]},t)),d.length===0&&e.jsx("div",{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:418:13",className:"text-center py-8 text-[var(--dg-text-muted)] text-xs",children:"暂无密钥数据,点击「添加」创建"})]})]}),e.jsx("div",{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:422:7",className:"flex justify-end gap-2 pt-2 border-t border-[var(--dg-border)]",children:e.jsxs(j,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:423:9",size:"sm",className:"bg-blue-600 hover:bg-blue-700",onClick:N,disabled:c,children:[c?e.jsx(I,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:424:21",className:"h-3.5 w-3.5 animate-spin mr-1"}):e.jsx($,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:424:77",className:"h-3.5 w-3.5 mr-1"}),"保存密钥"]})})]})}function we({manifest:i,onSave:b,saving:c,isCreate:y}){const k=i?.spec||{},[f,v]=h.useState(i?.metadata?.name||""),[d,w]=h.useState(k.type||"ClusterIP"),[m,g]=h.useState((k.ports||[]).map(s=>({name:s.name||"",port:String(s.port||""),targetPort:String(s.targetPort||""),protocol:s.protocol||"TCP",nodePort:s.nodePort?String(s.nodePort):""}))),[V,N]=h.useState(Object.entries(k.selector||{}).map(([s,o])=>({key:s,value:String(o)}))),r=(s,o,a)=>{const C=[...m];C[s]={...C[s],[o]:a},g(C)},t=()=>g([...m,{name:"",port:"",targetPort:"",protocol:"TCP",nodePort:""}]),x=s=>g(m.filter((o,a)=>a!==s)),R=(s,o,a)=>{const C=[...V];C[s]={...C[s],[o]:a},N(C)},P=()=>N([...V,{key:"",value:""}]),l=s=>N(V.filter((o,a)=>a!==s)),n=()=>{const s={...k};s.type=d,s.ports=m.map(a=>{const C={port:parseInt(a.port)||80,targetPort:parseInt(a.targetPort)||parseInt(a.port)||80,protocol:a.protocol};return a.name&&(C.name=a.name),a.nodePort&&d==="NodePort"&&(C.nodePort=parseInt(a.nodePort)),C});const o={};V.forEach(a=>{a.key.trim()&&(o[a.key.trim()]=a.value)}),s.selector=o,b({...i,metadata:{...i.metadata,name:f.trim()},spec:s})},p=[{value:"ClusterIP",label:"ClusterIP"},{value:"NodePort",label:"NodePort"},{value:"LoadBalancer",label:"LoadBalancer"}];return e.jsxs("div",{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:494:5",className:"space-y-5",children:[e.jsxs("div",{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:495:7",children:[e.jsx(S,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:496:9",className:"text-[var(--dg-text-secondary)] text-xs",children:"服务名称"}),e.jsx(E,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:497:9",value:f,onChange:s=>v(s.target.value),readOnly:!y,className:"mt-1 font-mono text-xs bg-[var(--dg-bg-tertiary)]"})]}),e.jsxs("div",{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:499:7",children:[e.jsx(S,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:500:9",className:"text-[var(--dg-text-secondary)] text-xs mb-2 block",children:"服务类型"}),e.jsx("div",{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:501:9",className:"flex rounded-lg border border-[var(--dg-border)] overflow-hidden w-fit",children:p.map(s=>e.jsx("button",{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:503:13",type:"button",className:`px-3 py-1.5 text-xs transition-colors ${d===s.value?"bg-blue-600 text-white":"text-[var(--dg-text-secondary)] hover:bg-[var(--dg-bg-tertiary)]"}`,onClick:()=>w(s.value),children:s.label},s.value))})]}),e.jsxs("div",{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:516:7",children:[e.jsxs("div",{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:517:9",className:"flex items-center justify-between mb-2",children:[e.jsx(S,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:518:11",className:"text-[var(--dg-text-secondary)] text-sm",children:"端口映射"}),e.jsxs(j,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:519:11",variant:"outline",size:"sm",className:"h-7 text-xs",onClick:t,children:[e.jsx(z,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:519:89",className:"h-3 w-3 mr-1"}),"添加端口"]})]}),e.jsxs("div",{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:521:9",className:"space-y-2",children:[m.map((s,o)=>e.jsxs("div",{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:523:13",className:"grid grid-cols-[1fr_80px_80px_80px_80px_32px] gap-2 items-center",children:[e.jsx(E,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:524:15",value:s.name,onChange:a=>r(o,"name",a.target.value),placeholder:"名称",className:"font-mono text-xs h-7 bg-[var(--dg-bg-tertiary)] border-[var(--dg-border)] text-[var(--dg-text-primary)]"}),e.jsx(E,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:525:15",value:s.port,onChange:a=>r(o,"port",a.target.value),placeholder:"端口",type:"number",className:"font-mono text-xs h-7 bg-[var(--dg-bg-tertiary)] border-[var(--dg-border)] text-[var(--dg-text-primary)]"}),e.jsx(E,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:526:15",value:s.targetPort,onChange:a=>r(o,"targetPort",a.target.value),placeholder:"目标",type:"number",className:"font-mono text-xs h-7 bg-[var(--dg-bg-tertiary)] border-[var(--dg-border)] text-[var(--dg-text-primary)]"}),e.jsxs(F,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:527:15",value:s.protocol,onValueChange:a=>r(o,"protocol",a),children:[e.jsx(G,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:528:17",className:"h-7 text-xs bg-[var(--dg-bg-tertiary)] border-[var(--dg-border)] text-[var(--dg-text-primary)]",children:e.jsx(W,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:528:139"})}),e.jsxs(q,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:529:17",children:[e.jsx(Y,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:529:32",value:"TCP",children:"TCP"}),e.jsx(Y,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:529:72",value:"UDP",children:"UDP"})]})]}),d==="NodePort"?e.jsx(E,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:532:17",value:s.nodePort,onChange:a=>r(o,"nodePort",a.target.value),placeholder:"NodePort",type:"number",className:"font-mono text-xs h-7 bg-[var(--dg-bg-tertiary)] border-[var(--dg-border)] text-[var(--dg-text-primary)]"}):e.jsx("div",{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:533:19"}),e.jsx(j,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:534:15",variant:"ghost",size:"icon",className:"h-7 w-7 text-red-400 hover:text-red-300",onClick:()=>x(o),children:e.jsx(O,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:534:133",className:"h-3 w-3"})})]},o)),m.length===0&&e.jsx("div",{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:537:34",className:"text-center py-4 text-[var(--dg-text-muted)] text-xs",children:"暂无端口,点击「添加端口」"})]})]}),e.jsxs("div",{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:542:7",children:[e.jsxs("div",{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:543:9",className:"flex items-center justify-between mb-2",children:[e.jsx(S,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:544:11",className:"text-[var(--dg-text-secondary)] text-sm",children:"选择器 (Selector)"}),e.jsxs(j,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:545:11",variant:"outline",size:"sm",className:"h-7 text-xs",onClick:P,children:[e.jsx(z,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:545:93",className:"h-3 w-3 mr-1"}),"添加标签"]})]}),e.jsxs("div",{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:547:9",className:"space-y-2",children:[V.map((s,o)=>e.jsxs("div",{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:549:13",className:"flex items-center gap-2",children:[e.jsx(E,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:550:15",value:s.key,onChange:a=>R(o,"key",a.target.value),placeholder:"键 (如 app)",className:"flex-1 font-mono text-xs h-7 bg-[var(--dg-bg-tertiary)] border-[var(--dg-border)] text-[var(--dg-text-primary)]"}),e.jsx("span",{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:551:15",className:"text-[var(--dg-text-muted)] text-xs",children:"="}),e.jsx(E,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:552:15",value:s.value,onChange:a=>R(o,"value",a.target.value),placeholder:"值 (如 nginx)",className:"flex-1 font-mono text-xs h-7 bg-[var(--dg-bg-tertiary)] border-[var(--dg-border)] text-[var(--dg-text-primary)]"}),e.jsx(j,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:553:15",variant:"ghost",size:"icon",className:"h-7 w-7 text-red-400 hover:text-red-300",onClick:()=>l(o),children:e.jsx(O,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:553:137",className:"h-3 w-3"})})]},o)),V.length===0&&e.jsx("div",{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:556:37",className:"text-center py-4 text-[var(--dg-text-muted)] text-xs",children:"暂无选择器"})]})]}),e.jsx("div",{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:560:7",className:"flex justify-end gap-2 pt-2 border-t border-[var(--dg-border)]",children:e.jsxs(j,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:561:9",size:"sm",className:"bg-blue-600 hover:bg-blue-700",onClick:n,disabled:c,children:[c?e.jsx(I,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:562:21",className:"h-3.5 w-3.5 animate-spin mr-1"}):e.jsx($,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:562:77",className:"h-3.5 w-3.5 mr-1"}),"保存 Service"]})})]})}function Se({manifest:i,onSave:b,saving:c,isCreate:y}){const k=i?.spec||{},[f,v]=h.useState(i?.metadata?.name||""),[d,w]=h.useState(k.ingressClassName||"nginx"),[m,g]=h.useState((k.rules||[]).map(l=>({host:l.host||"",paths:l.http?.backend?.servicePort!=null?[{path:"/",pathType:"Prefix",serviceName:l.http?.backend?.serviceName||"",servicePort:String(l.http?.backend?.servicePort||"80")}]:(l.http?.paths||[]).map(n=>({path:n.path||"/",pathType:n.pathType||"Prefix",serviceName:n.backend?.service?.name||n.backend?.serviceName||"",servicePort:String(n.backend?.service?.port?.number??n.backend?.servicePort??"80")}))}))),V=(l,n)=>{const p=[...m];p[l]={...p[l],host:n},g(p)},N=()=>g([...m,{host:"",paths:[{path:"/",pathType:"Prefix",serviceName:"",servicePort:"80"}]}]),r=l=>g(m.filter((n,p)=>p!==l)),t=(l,n,p,s)=>{const o=[...m];o[l].paths[n]={...o[l].paths[n],[p]:s},g(o)},x=l=>{const n=[...m];n[l].paths.push({path:"/",pathType:"Prefix",serviceName:"",servicePort:"80"}),g(n)},R=(l,n)=>{const p=[...m];p[l].paths=p[l].paths.filter((s,o)=>o!==n),g(p)},P=()=>{const l=m.map(p=>({host:p.host,http:{paths:p.paths.map(s=>({path:s.path,pathType:s.pathType,backend:{service:{name:s.serviceName,port:{number:parseInt(s.servicePort)||80}}}}))}})),n={...k,rules:l};d.trim()?n.ingressClassName=d.trim():delete n.ingressClassName,b({...i,metadata:{...i.metadata,name:f.trim()},spec:n})};return e.jsxs("div",{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:635:5",className:"space-y-4",children:[e.jsxs("div",{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:636:7",className:"grid grid-cols-2 gap-4",children:[e.jsxs("div",{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:637:9",children:[e.jsx(S,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:638:11",className:"text-[var(--dg-text-secondary)] text-xs",children:"名称"}),e.jsx(E,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:639:11",value:f,onChange:l=>v(l.target.value),readOnly:!y,className:"mt-1 font-mono text-xs bg-[var(--dg-bg-tertiary)]"})]}),e.jsxs("div",{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:641:9",children:[e.jsx(S,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:642:11",className:"text-[var(--dg-text-secondary)] text-xs",children:"Ingress Class"}),e.jsx(E,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:643:11",value:d,onChange:l=>w(l.target.value),placeholder:"nginx / alb",className:"mt-1 font-mono text-xs h-8 bg-[var(--dg-bg-tertiary)]"})]})]}),e.jsxs("div",{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:646:7",children:[e.jsxs("div",{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:647:9",className:"flex items-center justify-between mb-2",children:[e.jsx(S,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:648:11",className:"text-[var(--dg-text-secondary)] text-sm",children:"路由规则"}),e.jsxs(j,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:649:11",variant:"outline",size:"sm",className:"h-7 text-xs",onClick:N,children:[e.jsx(z,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:649:89",className:"h-3 w-3 mr-1"}),"添加 Host"]})]}),e.jsxs("div",{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:651:9",className:"space-y-3 max-h-[50vh] overflow-y-auto pr-1",children:[m.map((l,n)=>e.jsxs("div",{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:653:13",className:"p-3 rounded-lg border border-[var(--dg-border)] bg-[var(--dg-bg-secondary)] space-y-2",children:[e.jsxs("div",{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:654:15",className:"flex items-center gap-2",children:[e.jsx(E,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:655:17",value:l.host,onChange:p=>V(n,p.target.value),placeholder:"域名 (如 api.example.com)",className:"flex-1 font-mono text-xs h-7 bg-[var(--dg-bg-tertiary)] border-[var(--dg-border)] text-[var(--dg-text-primary)]"}),e.jsx(j,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:661:17",variant:"ghost",size:"icon",className:"h-7 w-7 text-red-400 hover:text-red-300",onClick:()=>r(n),children:e.jsx(O,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:661:136",className:"h-3 w-3"})})]}),l.paths.map((p,s)=>e.jsxs("div",{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:664:17",className:"grid grid-cols-[1fr_100px_1fr_60px_28px] gap-1.5 items-center pl-4",children:[e.jsx(E,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:665:19",value:p.path,onChange:o=>t(n,s,"path",o.target.value),placeholder:"路径 /",className:"font-mono text-xs h-7 bg-[var(--dg-bg-tertiary)] border-[var(--dg-border)] text-[var(--dg-text-primary)]"}),e.jsxs(F,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:666:19",value:p.pathType,onValueChange:o=>t(n,s,"pathType",o),children:[e.jsx(G,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:667:21",className:"h-7 text-xs bg-[var(--dg-bg-tertiary)] border-[var(--dg-border)] text-[var(--dg-text-primary)]",children:e.jsx(W,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:667:143"})}),e.jsxs(q,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:668:21",children:[e.jsx(Y,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:668:36",value:"Prefix",children:"Prefix"}),e.jsx(Y,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:668:82",value:"Exact",children:"Exact"})]})]}),e.jsx(E,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:670:19",value:p.serviceName,onChange:o=>t(n,s,"serviceName",o.target.value),placeholder:"Service",className:"font-mono text-xs h-7 bg-[var(--dg-bg-tertiary)] border-[var(--dg-border)] text-[var(--dg-text-primary)]"}),e.jsx(E,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:671:19",value:p.servicePort,onChange:o=>t(n,s,"servicePort",o.target.value),placeholder:"端口",type:"number",className:"font-mono text-xs h-7 bg-[var(--dg-bg-tertiary)] border-[var(--dg-border)] text-[var(--dg-text-primary)]"}),e.jsx(j,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:672:19",variant:"ghost",size:"icon",className:"h-7 w-7 text-red-400 hover:text-red-300",onClick:()=>R(n,s),children:e.jsx(O,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:672:142",className:"h-3 w-3"})})]},s)),e.jsxs(j,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:675:15",variant:"ghost",size:"sm",className:"h-6 text-xs text-[var(--dg-text-muted)]",onClick:()=>x(n),children:[e.jsx(z,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:675:129",className:"h-3 w-3 mr-1"}),"添加路径"]})]},n)),m.length===0&&e.jsx("div",{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:678:34",className:"text-center py-4 text-[var(--dg-text-muted)] text-xs",children:"暂无路由规则,点击「添加 Host」"})]})]}),e.jsx("div",{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:681:7",className:"flex justify-end gap-2 pt-2 border-t border-[var(--dg-border)]",children:e.jsxs(j,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:682:9",size:"sm",className:"bg-blue-600 hover:bg-blue-700",onClick:P,disabled:c,children:[c?e.jsx(I,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:683:21",className:"h-3.5 w-3.5 animate-spin mr-1"}):e.jsx($,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:683:77",className:"h-3.5 w-3.5 mr-1"}),"保存 Ingress"]})})]})}function Ce({manifest:i,onSave:b,saving:c,isCreate:y}){const k=i?.spec||{},f=k.resources?.requests||{},[v,d]=h.useState(i?.metadata?.name||""),[w,m]=h.useState(f.storage||"1Gi"),[g,V]=h.useState(k.accessModes?.[0]||"ReadWriteOnce"),[N,r]=h.useState(k.storageClassName||""),t=()=>{b({...i,metadata:{...i.metadata,name:v.trim()},spec:{...k,accessModes:[g],storageClassName:N||void 0,resources:{requests:{storage:w}}}})};return e.jsxs("div",{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:716:5",className:"space-y-4",children:[e.jsxs("div",{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:717:7",children:[e.jsx(S,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:718:9",className:"text-[var(--dg-text-secondary)] text-xs",children:"名称"}),e.jsx(E,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:719:9",value:v,onChange:x=>d(x.target.value),readOnly:!y,className:"mt-1 font-mono text-xs bg-[var(--dg-bg-tertiary)]"})]}),e.jsxs("div",{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:721:7",className:"grid grid-cols-2 gap-4",children:[e.jsxs("div",{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:722:9",children:[e.jsx(S,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:723:11",className:"text-[var(--dg-text-secondary)] text-xs",children:"存储大小"}),e.jsx(E,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:724:11",value:w,onChange:x=>m(x.target.value),placeholder:"如 10Gi",className:"mt-1 font-mono text-xs h-8 bg-[var(--dg-bg-tertiary)] border-[var(--dg-border)] text-[var(--dg-text-primary)]"}),e.jsx("p",{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:730:11",className:"text-[10px] text-[var(--dg-text-muted)] mt-1",children:"单位:Gi (GiB), Mi (MiB), Ti (TiB)"})]}),e.jsxs("div",{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:732:9",children:[e.jsx(S,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:733:11",className:"text-[var(--dg-text-secondary)] text-xs",children:"访问模式"}),e.jsxs(F,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:734:11",value:g,onValueChange:V,children:[e.jsx(G,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:735:13",className:"mt-1 h-8 bg-[var(--dg-bg-tertiary)] border-[var(--dg-border)] text-[var(--dg-text-primary)] text-xs",children:e.jsx(W,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:736:15"})}),e.jsxs(q,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:738:13",children:[e.jsx(Y,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:739:15",value:"ReadWriteOnce",children:"ReadWriteOnce (单节点读写)"}),e.jsx(Y,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:740:15",value:"ReadOnlyMany",children:"ReadOnlyMany (多节点只读)"}),e.jsx(Y,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:741:15",value:"ReadWriteMany",children:"ReadWriteMany (多节点读写)"})]})]})]})]}),e.jsxs("div",{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:746:7",children:[e.jsx(S,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:747:9",className:"text-[var(--dg-text-secondary)] text-xs",children:"StorageClass"}),e.jsx(E,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:748:9",value:N,onChange:x=>r(x.target.value),placeholder:"留空使用默认 StorageClass",className:"mt-1 font-mono text-xs h-8 bg-[var(--dg-bg-tertiary)] border-[var(--dg-border)] text-[var(--dg-text-primary)]"})]}),e.jsx("div",{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:755:7",className:"flex justify-end gap-2 pt-2 border-t border-[var(--dg-border)]",children:e.jsxs(j,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:756:9",size:"sm",className:"bg-blue-600 hover:bg-blue-700",onClick:t,disabled:c,children:[c?e.jsx(I,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:757:21",className:"h-3.5 w-3.5 animate-spin mr-1"}):e.jsx($,{"code-path":"src/components/kubernetes/ResourceVisualEditor.tsx:757:77",className:"h-3.5 w-3.5 mr-1"}),"保存 PVC"]})})]})}export{Ae as R};
|