|
2400 | 2400 | </button> |
2401 | 2401 | </div> |
2402 | 2402 | </td> |
2403 | | - </tr>`}function ia(t){t.addEventListener("click",async e=>{let a=e.target.closest('[data-action="delete-user"]');if(!(!a||!await E("Delete User","Delete this user? This cannot be undone.")))try{await m.delete(`/users/${a.dataset.uid}`),a.closest("tr").remove(),c.success("User deleted")}catch(n){c.error(n.message)}}),t.addEventListener("click",async e=>{let a=e.target.closest('[data-action="edit-user"]');a&&he(t,a.dataset.uid)})}h.register("dashboard",t=>Dt(t));h.register("sites",t=>qt(t));h.register("site-detail",(t,e)=>ge(t,e));h.register("users",t=>fe(t));h.register("settings",t=>Ht(t));h.register("security",t=>At(t));h.register("admin-logs",t=>Tt(t));h.register("audit-log",t=>It(t));document.addEventListener("click",t=>{let e=t.target.closest("[data-view]");e&&(t.preventDefault(),h.go(e.dataset.view))});document.addEventListener("click",async t=>{let e=t.target.closest("[data-action]");if(!e)return;t.stopPropagation();let{action:a,id:s}=e.dataset;switch(a){case"manage":h.go("site-detail",{id:s});break;case"start":await pt(s,"start","Starting Site","Starting all containers - please wait...");break;case"stop":await pt(s,"stop","Stopping Site","Gracefully stopping all containers - please wait...");break;case"restart":await pt(s,"restart","Restarting Site","Restarting all containers - please wait...");break;case"flush":await pt(s,"flush","Flushing Caches","Clearing container caches - please wait...");break;case"edit":{let n=await m.get(`/sites/${s}`);tt(n.site);break}case"clone":{let n=await Z(e.dataset.name??s);if(!n)break;S("Cloning Site","Copying files and database \u2014 this may take a few minutes...");try{let i=await m.post(`/sites/${s}/clone`,{name:n}),r=!1,o=0;for(;!r&&o<60;)await new Promise(u=>setTimeout(u,3e3)),r=(await m.get("/sites")).some(u=>u.ID===i.id&&u.SiteStatus===1),o++;y(),r?(c.success(`Site cloned as '${n}'`),h.go("sites")):c.error("Clone timed out \u2014 check container logs")}catch(i){y(),c.error(i.message)}break}case"delete":await oa(s);break;case"recreate":S("Recreating Pod","Recreating containers for this site - this may take a few minutes...");try{await m.post(`/sites/${s}/recreate`),y(),c.success("Pod recreated"),h.go("sites")}catch(n){y(),c.error(n.message)}break}});document.addEventListener("kp:bulk-action",async t=>{let{action:e,ids:a}=t.detail;if(!a.length)return;let s={start:"Starting",stop:"Stopping",restart:"Restarting",flush:"Flushing Caches",recreate:"Recreating"},n=e==="recreate"?"Please hold while we update your Pods":"Please wait...",i=e==="recreate"?{prune:!0}:void 0,r=e==="recreate"?1200*1e3:void 0;S(`${s[e]} ${a.length} Site${a.length!==1?"s":""}`,n);let o=await Promise.allSettled(a.map(u=>m.post(`/sites/${u}/${e}`,i,r)));y();let l=o.filter(u=>u.status==="rejected").length;l===0?c.success(`${e.charAt(0).toUpperCase()+e.slice(1)} complete for ${a.length} site${a.length!==1?"s":""}`):c.error(`${l} of ${a.length} sites failed \u2014 check logs`),["start","stop","restart","recreate"].includes(e)&&h.go("sites")});async function pt(t,e,a,s){S(a,s);try{await m.post(`/sites/${t}/${e}`),y(),c.success(a+" complete")}catch(n){y(),c.error(n.message)}}async function oa(t){if(!await E("Delete Site",`This will stop and permanently remove the pod and all its data. Are you sure? |
| 2403 | + </tr>`}function ia(t){t.addEventListener("click",async e=>{let a=e.target.closest('[data-action="delete-user"]');if(!(!a||!await E("Delete User","Delete this user? This cannot be undone.")))try{await m.delete(`/users/${a.dataset.uid}`),a.closest("tr").remove(),c.success("User deleted")}catch(n){c.error(n.message)}}),t.addEventListener("click",async e=>{let a=e.target.closest('[data-action="edit-user"]');a&&he(t,a.dataset.uid)})}h.register("dashboard",t=>Dt(t));h.register("sites",t=>qt(t));h.register("site-detail",(t,e)=>ge(t,e));h.register("users",t=>fe(t));h.register("settings",t=>Ht(t));h.register("security",t=>At(t));h.register("admin-logs",t=>Tt(t));h.register("audit-log",t=>It(t));document.addEventListener("keydown",t=>{let e=t.target;e?.matches?.("input, textarea, select, [contenteditable='true']")&&e.id!=="wpcli-input"&&["ArrowLeft","ArrowRight","ArrowUp","ArrowDown","Home","End"].includes(t.key)&&t.stopPropagation()},!0);document.addEventListener("click",t=>{let e=t.target.closest("[data-view]");e&&(t.preventDefault(),h.go(e.dataset.view))});document.addEventListener("click",async t=>{let e=t.target.closest("[data-action]");if(!e)return;t.stopPropagation();let{action:a,id:s}=e.dataset;switch(a){case"manage":h.go("site-detail",{id:s});break;case"start":await pt(s,"start","Starting Site","Starting all containers - please wait...");break;case"stop":await pt(s,"stop","Stopping Site","Gracefully stopping all containers - please wait...");break;case"restart":await pt(s,"restart","Restarting Site","Restarting all containers - please wait...");break;case"flush":await pt(s,"flush","Flushing Caches","Clearing container caches - please wait...");break;case"edit":{let n=await m.get(`/sites/${s}`);tt(n.site);break}case"clone":{let n=await Z(e.dataset.name??s);if(!n)break;S("Cloning Site","Copying files and database \u2014 this may take a few minutes...");try{let i=await m.post(`/sites/${s}/clone`,{name:n}),r=!1,o=0;for(;!r&&o<60;)await new Promise(u=>setTimeout(u,3e3)),r=(await m.get("/sites")).some(u=>u.ID===i.id&&u.SiteStatus===1),o++;y(),r?(c.success(`Site cloned as '${n}'`),h.go("sites")):c.error("Clone timed out \u2014 check container logs")}catch(i){y(),c.error(i.message)}break}case"delete":await oa(s);break;case"recreate":S("Recreating Pod","Recreating containers for this site - this may take a few minutes...");try{await m.post(`/sites/${s}/recreate`),y(),c.success("Pod recreated"),h.go("sites")}catch(n){y(),c.error(n.message)}break}});document.addEventListener("kp:bulk-action",async t=>{let{action:e,ids:a}=t.detail;if(!a.length)return;let s={start:"Starting",stop:"Stopping",restart:"Restarting",flush:"Flushing Caches",recreate:"Recreating"},n=e==="recreate"?"Please hold while we update your Pods":"Please wait...",i=e==="recreate"?{prune:!0}:void 0,r=e==="recreate"?1200*1e3:void 0;S(`${s[e]} ${a.length} Site${a.length!==1?"s":""}`,n);let o=await Promise.allSettled(a.map(u=>m.post(`/sites/${u}/${e}`,i,r)));y();let l=o.filter(u=>u.status==="rejected").length;l===0?c.success(`${e.charAt(0).toUpperCase()+e.slice(1)} complete for ${a.length} site${a.length!==1?"s":""}`):c.error(`${l} of ${a.length} sites failed \u2014 check logs`),["start","stop","restart","recreate"].includes(e)&&h.go("sites")});async function pt(t,e,a,s){S(a,s);try{await m.post(`/sites/${t}/${e}`),y(),c.success(a+" complete")}catch(n){y(),c.error(n.message)}}async function oa(t){if(!await E("Delete Site",`This will stop and permanently remove the pod and all its data. Are you sure? |
2404 | 2404 |
|
2405 | | -A final backup will be created before deletion. This may take a moment.`))return;S("Deleting Site","Creating final backup and removing the pod \u2014 please wait...");let a;try{a=await fetch(`/api/sites/${t}`,{method:"DELETE"})}catch{}if(y(),a?.ok&&a.headers.get("Content-Type")?.includes("gzip")){let r=(a.headers.get("Content-Disposition")??"").match(/filename="([^"]+)"/)?.[1]??`${t}_final.tar.gz`,o=await a.blob(),l=document.createElement("a");l.href=URL.createObjectURL(o),l.download=r,l.click(),URL.revokeObjectURL(l.href),c.success("Site deleted. Final backup downloaded."),h.go("sites");return}let s=!1,n=0;for(;!s&&n<10;){try{await new Promise(r=>setTimeout(r,2e3)),s=!(await m.get("/sites")).find(r=>r.ID===parseInt(t))}catch{}n++}s?(c.success("Site deleted. Final backup saved to S3."),h.go("sites")):c.error("Delete failed - site still exists after 20s")}if(window.KP?.user?.role===99){let t=document.getElementById("kp-resource-warning"),e=document.getElementById("kp-resource-warning-msg"),a=async()=>{try{let s=await m.get("/settings/resource-warning");s?.active&&t&&e?(e.textContent=`${s.current_mb}MB used, threshold ${s.threshold_mb}MB \u2014 throttling ${s.offender}.`,t.style.display=""):t&&(t.style.display="none")}catch{}};a(),setInterval(a,3e4)}window.addEventListener("hashchange",()=>{if(h._ownHashChange)return;let{view:t,params:e}=kt();h.go(t,e)});var{view:la,params:ra}=kt();h.go(la,ra);})(); |
| 2405 | +A final backup will be created before deletion. This may take a moment.`))return;S("Deleting Site","Creating final backup and removing the pod \u2014 please wait...");let a;try{a=await fetch(`/api/sites/${t}`,{method:"DELETE"})}catch{}if(y(),a?.ok&&a.headers.get("Content-Type")?.includes("gzip")){let r=(a.headers.get("Content-Disposition")??"").match(/filename="([^"]+)"/)?.[1]??`${t}_final.tar.gz`,o=await a.blob(),l=document.createElement("a");l.href=URL.createObjectURL(o),l.download=r,l.click(),URL.revokeObjectURL(l.href),c.success("Site deleted. Final backup downloaded."),h.go("sites");return}let s=!1,n=0;for(;!s&&n<10;){try{await new Promise(r=>setTimeout(r,2e3)),s=!(await m.get("/sites")).find(r=>r.ID===parseInt(t))}catch{}n++}s?(c.success("Site deleted. Final backup saved to S3."),h.go("sites")):c.error("Delete failed - site still exists after 20s")}if(window.KP?.user?.role===99){let t=document.getElementById("kp-resource-warning"),e=document.getElementById("kp-resource-warning-msg"),a=async()=>{try{let s=await m.get("/settings/resource-warning");s?.active&&t&&e?(e.textContent=`${s.current_mb}MB used, threshold ${s.threshold_mb}MB \u2014 throttling ${s.offender}.`,t.style.display=""):t&&(t.style.display="none")}catch{}};a(),setInterval(a,3e4)}window.addEventListener("hashchange",()=>{if(h._ownHashChange)return;let{view:t,params:e}=kt();h.go(t,e)});(()=>{let t=document.getElementById("kp-totop");if(!t)return;let e=()=>{t.classList.toggle("is-visible",window.scrollY>150)};window.addEventListener("scroll",e,{passive:!0}),e(),t.addEventListener("click",()=>{window.scrollTo({top:0,behavior:"smooth"})})})();var{view:la,params:ra}=kt();h.go(la,ra);})(); |
0 commit comments