3 lines
13 KiB
JavaScript
3 lines
13 KiB
JavaScript
import{u as ae,y as O,n as S,z as I,B as le,C as ne,o as r,c as i,d as o,g as u,b as l,e as a,p as V,q as E,t as d,h as D,r as p,k as y,F as g,j as v,D as h,_ as oe,E as F,S as M,G as re,f as ie,v as ue,i as L,H as P,m as T}from"./index-5e93ecd0.js";import{_ as de}from"./LayoutHeader-596b102d.js";import{_ as me}from"./EmptyState-1ecba3e9.js";const ve={class:"flex flex-col h-full"},ce={class:"flex-1 overflow-auto p-5"},pe={class:"mb-4 flex items-center gap-3 flex-wrap"},ge={class:"flex items-center gap-2"},fe={class:"flex gap-1"},ye=["onClick"],xe={key:0,class:"flex flex-col items-center justify-center h-64 gap-3"},_e={key:1,class:"flex items-center justify-center h-64"},ke={key:2,class:"flex flex-col items-center justify-center h-64 gap-3"},be={class:"text-xs text-ink-gray-4"},we={key:3,class:"grid gap-4 sm:grid-cols-2 lg:grid-cols-3"},he=["onClick"],Ce={class:"flex items-start justify-between mb-3"},$e={class:"flex items-center gap-3"},Se={class:"font-medium text-ink-gray-9"},Ve={class:"text-sm text-ink-gray-5"},De={class:"grid grid-cols-2 gap-2 text-sm mb-2"},Fe={class:"font-mono text-ink-gray-7"},Re={class:"text-ink-gray-4 text-xs"},Ue={class:"text-ink-gray-7"},qe={class:"flex items-center justify-between text-xs text-ink-gray-4 pt-2 border-t"},Ee={class:"space-y-4"},Le={key:0,class:"flex items-center gap-2 text-sm text-ink-gray-5 py-2"},je={key:1,class:"text-sm text-red-500 py-2"},Be={class:"flex items-center gap-2 pt-2"},Oe={key:3,class:"space-y-3 border rounded-lg p-3 bg-surface-gray-1"},Ie={class:"text-ink-gray-5 w-20"},Me={class:"text-ink-gray-7 font-mono text-xs flex-1"},Ne={key:4,class:"text-sm text-red-500 bg-red-50 p-2 rounded"},ze={class:"space-y-4"},Pe={key:0,class:"flex flex-col items-center gap-4 py-6"},Te={class:"flex items-center gap-3"},Ae={key:0,class:"mt-4"},Ge={class:"bg-surface-gray-1 rounded-lg p-3 max-h-64 overflow-y-auto font-mono text-xs"},We={__name:"Sites",setup(Qe){const A=ae(),R=p(""),U=p("all"),c=p(""),b=p(!1),j=p(!1),_=p(""),C=p(!1),w=p(!1),x=p({success:!1,message:"",logs:[]}),$=O({url:"admin_panel.api.servers.get_container_servers",auto:!0}),G=S(()=>{const t=$.data||[];return t.length===0?[]:t.map(e=>({label:`${e.name}${e.status!=="online"?" (offline)":""}`,value:e.name}))}),f=O({url:"admin_panel.api.sites.get_all_containers",auto:!1}),k=O({url:"admin_panel.api.sites.get_images",auto:!1});function B(t){t&&(f.fetch({target_server:t}),k.fetch({target_server:t}))}I(c,t=>{t&&B(t)}),I(()=>$.data,t=>{t&&t.length>0&&!c.value&&(c.value=t[0].name,B(t[0].name))},{immediate:!0});const n=p({name:"",image:"",owner:"",target_server:"",fullDeploy:!1,pool_name:"default",volumes:[{name:"mysql",source_path:"/var/lib/mysql",device_name:"mysql"},{name:"frontend",source_path:"/home/frappe/frappe-bench/sites/frontend",device_name:"frontend"}]}),Q=S(()=>($.data||[]).map(e=>({label:`${e.name}${e.status!=="online"?" ("+e.status+")":""}`,value:e.name})));I(()=>n.value.target_server,t=>{t&&(n.value.image="",k.fetch({target_server:t}))});const H=S(()=>(k.data||[]).map(e=>{var s;return{label:e.alias||e.description||((s=e.fingerprint)==null?void 0:s.slice(0,12))||"Unknown",value:e.alias||e.fingerprint}})),J=[{value:"all",label:"All"},{value:"Running",label:"Running"},{value:"Stopped",label:"Stopped"},{value:"Error",label:"Error"}],K=S(()=>f.data||[]),N=S(()=>{let t=K.value;if(U.value!=="all"&&(t=t.filter(e=>e.status===U.value)),R.value){const e=R.value.toLowerCase();t=t.filter(s=>{var m,q;return s.name.toLowerCase().includes(e)||((m=s.container_name)==null?void 0:m.toLowerCase().includes(e))||((q=s.owner)==null?void 0:q.toLowerCase().includes(e))})}return t});function W(t){return{Running:"bg-green-100",Stopped:"bg-orange-100",Error:"bg-red-100",Creating:"bg-blue-100"}[t]||"bg-surface-gray-2"}function X(t){return{Running:"play-circle",Stopped:"pause-circle",Error:"alert-circle",Creating:"loader"}[t]||"server"}function Y(t){return{Running:"text-green-600",Stopped:"text-orange-600",Error:"text-red-600",Creating:"text-blue-600"}[t]||"text-ink-gray-5"}function Z(t){return{Running:"success",Stopped:"warning",Error:"error",Creating:"info"}[t]||"subtle"}function ee(){c.value&&B(c.value)}function te(t){A.push({name:"SiteDetail",params:{siteId:t.container_name},query:{server:t.server||c.value||""}})}function z(){_.value="",n.value.target_server=c.value||"",b.value=!0,n.value.target_server&&k.fetch({target_server:n.value.target_server})}async function se(){if(_.value="",!n.value.name){_.value="Container name is required";return}if(!n.value.image){_.value="Please select an image";return}j.value=!0;try{if(n.value.fullDeploy){b.value=!1,w.value=!0,x.value={success:!1,message:"",logs:[]},C.value=!0;const t=await T("admin_panel.api.sites.deploy_container_full",{container_name:n.value.name,image:n.value.image,pool_name:n.value.pool_name,volumes_config:JSON.stringify(n.value.volumes),target_server:n.value.target_server||null});w.value=!1,x.value={success:t.success,message:t.message,logs:t.logs||[]}}else await T("admin_panel.api.sites.create_container",{container_name:n.value.name,image:n.value.image,container_type:"container",target_server:n.value.target_server||null}),b.value=!1,f.reload();n.value={name:"",image:"",owner:"",target_server:c.value||"",fullDeploy:!1,pool_name:"default",volumes:[{name:"mysql",source_path:"/var/lib/mysql",device_name:"mysql"},{name:"frontend",source_path:"/home/frappe/frappe-bench/sites/frontend",device_name:"frontend"}]}}catch(t){console.error("Failed to create container:",t),w.value=!1,C.value?x.value={success:!1,message:t.message||t.exc||"Deploy failed",logs:[`Error: ${t.message||t.exc}`]}:_.value=t.message||t.exc||"Failed to create container"}finally{j.value=!1}}return le(()=>{}),ne(()=>{}),(t,e)=>(r(),i("div",ve,[o(de,{title:t.$t("sites.title")},{right:u(()=>[o(a(y),{variant:"subtle",onClick:ee,loading:a(f).loading},{prefix:u(()=>[o(a(g),{name:"refresh-cw",class:"h-4 w-4"})]),default:u(()=>[v(" "+d(t.$t("common.refresh")),1)]),_:1},8,["loading"]),o(a(y),{variant:"solid",onClick:z},{prefix:u(()=>[o(a(g),{name:"plus",class:"h-4 w-4"})]),default:u(()=>[v(" "+d(t.$t("sites.newSite")),1)]),_:1})]),_:1},8,["title"]),l("div",ce,[l("div",pe,[l("div",ge,[o(a(g),{name:"cloud",class:"h-4 w-4 text-ink-gray-4"}),o(a(h),{modelValue:c.value,"onUpdate:modelValue":e[0]||(e[0]=s=>c.value=s),type:"select",options:G.value,class:"w-40"},null,8,["modelValue","options"])]),e[15]||(e[15]=l("div",{class:"h-6 w-px bg-gray-200"},null,-1)),o(a(oe),{modelValue:R.value,"onUpdate:modelValue":e[1]||(e[1]=s=>R.value=s),type:"text",placeholder:t.$t("common.search")+"...",class:"w-56"},{prefix:u(()=>[o(a(g),{name:"search",class:"h-4 w-4 text-ink-gray-4"})]),_:1},8,["modelValue","placeholder"]),l("div",fe,[(r(),i(V,null,E(J,s=>l("button",{key:s.value,class:F(["px-3 py-1 rounded text-sm transition-colors",U.value===s.value?"bg-surface-selected shadow-sm text-ink-gray-9 font-medium":"text-ink-gray-5 hover:bg-surface-gray-2"]),onClick:m=>U.value=s.value},d(s.label),11,ye)),64))])]),a($).data&&a($).data.length===0?(r(),i("div",xe,[o(a(g),{name:"cloud-off",class:"h-10 w-10 text-ink-gray-4"}),e[17]||(e[17]=l("p",{class:"text-sm text-ink-gray-7 font-medium"},"No container servers configured",-1)),e[18]||(e[18]=l("p",{class:"text-xs text-ink-gray-5"},'Add a server with "Container Server" role in the Servers tab',-1)),o(a(y),{variant:"solid",onClick:e[2]||(e[2]=s=>t.$router.push({name:"Servers"}))},{default:u(()=>[...e[16]||(e[16]=[v(" Go to Servers ",-1)])]),_:1})])):a(f).loading?(r(),i("div",_e,[o(a(M),{class:"h-8 w-8"})])):a(f).error?(r(),i("div",ke,[o(a(g),{name:"alert-circle",class:"h-10 w-10 text-red-500"}),e[20]||(e[20]=l("p",{class:"text-sm text-ink-gray-5"},"Failed to load containers",-1)),l("p",be,d(a(f).error),1),o(a(y),{variant:"subtle",onClick:e[3]||(e[3]=s=>a(f).reload())},{default:u(()=>[...e[19]||(e[19]=[v("Retry",-1)])]),_:1})])):N.value.length?(r(),i("div",we,[(r(!0),i(V,null,E(N.value,s=>(r(),i("div",{key:s.container_name,class:"rounded-lg border p-4 shadow-sm hover:shadow-md transition-shadow cursor-pointer",onClick:m=>te(s)},[l("div",Ce,[l("div",$e,[l("div",{class:F(["flex h-10 w-10 items-center justify-center rounded-lg",W(s.status)])},[o(a(g),{name:X(s.status),class:F(["h-5 w-5",Y(s.status)])},null,8,["name","class"])],2),l("div",null,[l("p",Se,d(s.name),1),l("p",Ve,d(s.image||s.type),1)])]),o(a(re),{variant:Z(s.status),label:s.status},null,8,["variant","label"])]),l("div",De,[l("div",null,[e[21]||(e[21]=l("p",{class:"text-ink-gray-4 text-xs"},"IP",-1)),l("p",Fe,d(s.ip_address||"-"),1)]),l("div",null,[l("p",Re,d(t.$t("sites.siteOwner")),1),l("p",Ue,d(s.owner||"-"),1)])]),l("div",qe,[l("span",null,d(s.created),1),o(a(g),{name:"chevron-right",class:"h-4 w-4"})])],8,he))),128))])):(r(),D(me,{key:4,icon:"server",title:t.$t("sites.noSites"),description:t.$t("sites.createFirst")},{action:u(()=>[o(a(y),{variant:"solid",onClick:z},{default:u(()=>[v(d(t.$t("sites.newSite")),1)]),_:1})]),_:1},8,["title","description"]))]),o(a(P),{modelValue:b.value,"onUpdate:modelValue":e[12]||(e[12]=s=>b.value=s),options:{title:t.$t("sites.newSite")}},{"body-content":u(()=>[l("div",Ee,[o(a(h),{modelValue:n.value.name,"onUpdate:modelValue":e[4]||(e[4]=s=>n.value.name=s),label:t.$t("sites.siteName"),type:"text",required:""},null,8,["modelValue","label"]),a(k).loading?(r(),i("div",Le,[o(a(M),{class:"h-4 w-4"}),e[22]||(e[22]=v(" Loading images... ",-1))])):a(k).error?(r(),i("div",je,[e[24]||(e[24]=v(" Failed to load images ",-1)),o(a(y),{variant:"link",size:"sm",onClick:e[5]||(e[5]=s=>a(k).reload())},{default:u(()=>[...e[23]||(e[23]=[v("Retry",-1)])]),_:1})])):(r(),D(a(h),{key:2,modelValue:n.value.image,"onUpdate:modelValue":e[6]||(e[6]=s=>n.value.image=s),label:t.$t("sites.siteImage"),type:"select",options:H.value},null,8,["modelValue","label","options"])),o(a(h),{modelValue:n.value.owner,"onUpdate:modelValue":e[7]||(e[7]=s=>n.value.owner=s),label:t.$t("sites.siteOwner"),type:"text"},null,8,["modelValue","label"]),o(a(h),{modelValue:n.value.target_server,"onUpdate:modelValue":e[8]||(e[8]=s=>n.value.target_server=s),label:t.$t("sites.targetServer"),type:"select",options:Q.value,description:t.$t("sites.targetServerDesc")},null,8,["modelValue","label","options","description"]),l("div",Be,[ie(l("input",{id:"fullDeploy","onUpdate:modelValue":e[9]||(e[9]=s=>n.value.fullDeploy=s),type:"checkbox",class:"h-4 w-4 rounded border-gray-300"},null,512),[[ue,n.value.fullDeploy]]),e[25]||(e[25]=l("label",{for:"fullDeploy",class:"text-sm text-ink-gray-7"}," Full deploy with volumes (MySQL + Frontend) ",-1))]),n.value.fullDeploy?(r(),i("div",Oe,[e[26]||(e[26]=l("p",{class:"text-xs font-medium text-ink-gray-5 uppercase"},"Volume Configuration",-1)),o(a(h),{modelValue:n.value.pool_name,"onUpdate:modelValue":e[10]||(e[10]=s=>n.value.pool_name=s),label:"Storage Pool",type:"text"},null,8,["modelValue"]),(r(!0),i(V,null,E(n.value.volumes,(s,m)=>(r(),i("div",{key:m,class:"flex items-center gap-2 text-sm"},[l("span",Ie,d(s.name),1),l("span",Me,d(s.source_path),1)]))),128))])):L("",!0),_.value?(r(),i("div",Ne,d(_.value),1)):L("",!0)])]),actions:u(()=>[o(a(y),{variant:"subtle",onClick:e[11]||(e[11]=s=>b.value=!1)},{default:u(()=>[v(d(t.$t("common.cancel")),1)]),_:1}),o(a(y),{variant:"solid",onClick:se,loading:j.value},{default:u(()=>[v(d(n.value.fullDeploy?"Deploy":t.$t("common.create")),1)]),_:1},8,["loading"])]),_:1},8,["modelValue","options"]),o(a(P),{modelValue:C.value,"onUpdate:modelValue":e[14]||(e[14]=s=>C.value=s),options:{title:w.value?"Deploying...":"Deploy Result",size:"lg"}},{"body-content":u(()=>{var s;return[l("div",ze,[w.value?(r(),i("div",Pe,[o(a(M),{class:"h-10 w-10 text-blue-500"}),e[27]||(e[27]=l("div",{class:"text-center"},[l("p",{class:"text-sm font-medium text-ink-gray-8"},"Creating container with volumes..."),l("p",{class:"text-xs text-ink-gray-5 mt-1"},"This may take a few minutes")],-1)),e[28]||(e[28]=l("div",{class:"w-full bg-surface-gray-2 rounded-full h-2 overflow-hidden"},[l("div",{class:"h-full bg-blue-500 rounded-full animate-pulse",style:{width:"60%"}})],-1))])):(r(),i(V,{key:1},[l("div",Te,[x.value.success?(r(),D(a(g),{key:0,name:"check-circle",class:"h-6 w-6 text-green-600"})):(r(),D(a(g),{key:1,name:"x-circle",class:"h-6 w-6 text-red-600"})),l("span",{class:F(["text-sm font-medium",x.value.success?"text-green-700":"text-red-700"])},d(x.value.message),3)]),(s=x.value.logs)!=null&&s.length?(r(),i("div",Ae,[e[29]||(e[29]=l("p",{class:"text-xs font-medium text-ink-gray-5 uppercase mb-2"},"Deploy Logs",-1)),l("div",Ge,[(r(!0),i(V,null,E(x.value.logs,(m,q)=>(r(),i("div",{key:q,class:F(["py-0.5",{"text-green-600":m.includes("✓"),"text-red-600":m.includes("✗")||m.includes("Error"),"text-ink-gray-6":!m.includes("✓")&&!m.includes("✗"),"font-semibold":m.includes("===")}])},d(m),3))),128))])])):L("",!0)],64))])]}),actions:u(()=>[w.value?L("",!0):(r(),D(a(y),{key:0,variant:"solid",onClick:e[13]||(e[13]=s=>{C.value=!1,a(f).reload()})},{default:u(()=>[...e[30]||(e[30]=[v(" Close ",-1)])]),_:1}))]),_:1},8,["modelValue","options"])]))}};export{We as default};
|
|
//# sourceMappingURL=Sites-ab8bbafc.js.map
|