2 lines
8.2 KiB
JavaScript
2 lines
8.2 KiB
JavaScript
import{r as l,V as I,a as R,j as e,W as X,X as Z,Y as z,Z as G}from"./index-cE9w-Kq7.js";import{M as n}from"./Modal-CL3xZqxR.js";import{A as J}from"./AdminAlert-yrdXFH0e.js";import{A as m}from"./AdminButton-ByutG8m-.js";import{A as K}from"./AdminTable-eCi7S__-.js";import{E as ee}from"./EmptyState-CmnFWkSO.js";import{P as q}from"./PageHeader-HdM4gpcn.js";function de(){var A,D;const[g,v]=l.useState([]),[u,L]=l.useState([]),[h,$]=l.useState([]),[w,k]=l.useState(!0),[_,d]=l.useState(""),[F,x]=l.useState(!1),[S,P]=l.useState(!1),[r,p]=l.useState(null),[c,C]=l.useState("site"),[b,T]=l.useState(!1),[f,B]=l.useState(null),[E,H]=l.useState("site"),N=()=>{I().then(v).catch(a=>d(a.message))};l.useEffect(()=>{k(!0),Promise.all([I(),R("/site/list"),R("/database/list")]).then(([a,s,t])=>{v(a),L(s),$(t.filter(i=>["MySQL","PostgreSQL","MongoDB"].includes(i.db_type)))}).catch(a=>d(a.message)).finally(()=>k(!1))},[]);const M=a=>{a.preventDefault();const s=a.currentTarget,t=s.elements.namedItem("name").value.trim(),i=s.elements.namedItem("plan_type").value,o=Number(s.elements.namedItem("target_id").value),j=s.elements.namedItem("schedule").value.trim(),y=s.elements.namedItem("enabled").checked;if(!t||!j||!o){d("Name, target and schedule are required");return}P(!0),G({name:t,plan_type:i,target_id:o,schedule:j,enabled:y}).then(()=>{x(!1),s.reset(),N()}).catch(W=>d(W.message)).finally(()=>P(!1))},V=(a,s)=>{confirm(`Delete backup plan "${s}"?`)&&Z(a).then(N).catch(t=>d(t.message))},Q=a=>{p(a),C(a.plan_type)},U=a=>{if(a.preventDefault(),!r)return;const s=a.currentTarget,t=s.elements.namedItem("edit_name").value.trim(),i=Number(s.elements.namedItem("edit_target_id").value),o=s.elements.namedItem("edit_schedule").value.trim(),j=s.elements.namedItem("edit_enabled").checked;!t||!o||!i||z(r.id,{name:t,plan_type:c,target_id:i,schedule:o,enabled:j}).then(()=>{p(null),N()}).catch(y=>d(y.message))},Y=()=>{T(!0),B(null),X().then(a=>B(a.results)).catch(a=>d(a.message)).finally(()=>T(!1))},O=a=>{if(a.plan_type==="site"){const t=u.find(i=>i.id===a.target_id);return t?t.name:`#${a.target_id}`}const s=h.find(t=>t.id===a.target_id);return s?s.name:`#${a.target_id}`};return w?e.jsxs(e.Fragment,{children:[e.jsx(q,{title:"Backup Plans"}),e.jsx("p",{className:"text-secondary",children:"Loading…"})]}):e.jsxs(e.Fragment,{children:[e.jsx(q,{title:"Backup Plans",actions:e.jsxs("div",{className:"d-flex flex-wrap gap-2",children:[e.jsxs(m,{variant:"primary",disabled:b,onClick:Y,children:[b?e.jsx("span",{className:"spinner-border spinner-border-sm me-1",role:"status"}):e.jsx("i",{className:"ti ti-player-play me-1","aria-hidden":!0}),b?"Running…":"Run Scheduled"]}),e.jsxs(m,{variant:"primary",onClick:()=>x(!0),children:[e.jsx("i",{className:"ti ti-plus me-1","aria-hidden":!0}),"Add Plan"]})]})}),_?e.jsx(J,{className:"mb-3",children:_}):null,f&&f.length>0?e.jsx("div",{className:"card mb-3",children:e.jsxs("div",{className:"card-body py-3",children:[e.jsx("h6",{className:"mb-2",children:"Last run results"}),e.jsx("ul",{className:"mb-0 small list-unstyled",children:f.map((a,s)=>e.jsxs("li",{children:[a.plan,": ",a.status==="ok"?"✓":a.status==="skipped"?"⊘":"✗"," ",a.msg||""]},s))})]})}):null,e.jsxs("p",{className:"small text-secondary mb-3",children:["Schedule automated backups. Add a cron entry (e.g. ",e.jsx("code",{children:"0 * * * *"})," hourly) to call"," ",e.jsx("code",{children:"POST /api/v1/backup/run-scheduled"})," with your auth token."]}),e.jsx("div",{className:"card",children:e.jsxs(K,{children:[e.jsx("thead",{children:e.jsxs("tr",{children:[e.jsx("th",{children:"Name"}),e.jsx("th",{children:"Type"}),e.jsx("th",{children:"Target"}),e.jsx("th",{children:"Schedule"}),e.jsx("th",{children:"Enabled"}),e.jsx("th",{className:"text-end",children:"Actions"})]})}),e.jsx("tbody",{children:g.length===0?e.jsx("tr",{children:e.jsx("td",{colSpan:6,className:"p-0",children:e.jsx(ee,{title:"No backup plans",description:'Click "Add Plan" to create one.'})})}):g.map(a=>e.jsxs("tr",{children:[e.jsx("td",{children:a.name}),e.jsx("td",{children:a.plan_type}),e.jsx("td",{children:O(a)}),e.jsx("td",{children:e.jsx("code",{className:"small",children:a.schedule})}),e.jsx("td",{children:a.enabled?"Yes":"No"}),e.jsxs("td",{className:"text-end",children:[e.jsx("button",{type:"button",className:"btn btn-link btn-sm text-primary p-1",title:"Edit",onClick:()=>Q(a),children:e.jsx("i",{className:"ti ti-pencil","aria-hidden":!0})}),e.jsx("button",{type:"button",className:"btn btn-link btn-sm text-danger p-1",title:"Delete",onClick:()=>V(a.id,a.name),children:e.jsx("i",{className:"ti ti-trash","aria-hidden":!0})})]})]},a.id))})]})}),e.jsxs(n,{show:!!r,onHide:()=>p(null),centered:!0,children:[e.jsx(n.Header,{closeButton:!0,children:e.jsx(n.Title,{children:"Edit Backup Plan"})}),r?e.jsxs("form",{onSubmit:U,children:[e.jsxs(n.Body,{children:[e.jsxs("div",{className:"mb-3",children:[e.jsx("label",{className:"form-label",children:"Name"}),e.jsx("input",{name:"edit_name",type:"text",defaultValue:r.name,className:"form-control",required:!0})]}),e.jsxs("div",{className:"mb-3",children:[e.jsx("label",{className:"form-label",children:"Type"}),e.jsxs("select",{value:c,onChange:a=>C(a.target.value),className:"form-select",children:[e.jsx("option",{value:"site",children:"Site"}),e.jsx("option",{value:"database",children:"Database"})]})]}),e.jsxs("div",{className:"mb-3",children:[e.jsx("label",{className:"form-label",children:"Target"}),e.jsx("select",{name:"edit_target_id",defaultValue:c===r.plan_type?r.target_id:c==="site"?(A=u[0])==null?void 0:A.id:(D=h[0])==null?void 0:D.id,className:"form-select",required:!0,children:c==="site"?u.map(a=>e.jsx("option",{value:a.id,children:a.name},`s-${a.id}`)):h.map(a=>e.jsxs("option",{value:a.id,children:[a.name," (",a.db_type,")"]},`d-${a.id}`))},c)]}),e.jsxs("div",{className:"mb-3",children:[e.jsx("label",{className:"form-label",children:"Schedule (cron)"}),e.jsx("input",{name:"edit_schedule",type:"text",defaultValue:r.schedule,className:"form-control",required:!0})]}),e.jsxs("div",{className:"form-check",children:[e.jsx("input",{name:"edit_enabled",type:"checkbox",defaultChecked:r.enabled,className:"form-check-input",id:"edit_enabled"}),e.jsx("label",{className:"form-check-label",htmlFor:"edit_enabled",children:"Enabled"})]})]}),e.jsxs(n.Footer,{children:[e.jsx(m,{type:"button",variant:"secondary",onClick:()=>p(null),children:"Cancel"}),e.jsx(m,{type:"submit",variant:"primary",children:"Update"})]})]}):null]}),e.jsxs(n,{show:F,onHide:()=>x(!1),centered:!0,children:[e.jsx(n.Header,{closeButton:!0,children:e.jsx(n.Title,{children:"Add Backup Plan"})}),e.jsxs("form",{onSubmit:M,children:[e.jsxs(n.Body,{children:[e.jsxs("div",{className:"mb-3",children:[e.jsx("label",{className:"form-label",children:"Name"}),e.jsx("input",{name:"name",type:"text",placeholder:"Daily site backup",className:"form-control",required:!0})]}),e.jsxs("div",{className:"mb-3",children:[e.jsx("label",{className:"form-label",children:"Type"}),e.jsxs("select",{name:"plan_type",value:E,onChange:a=>H(a.target.value),className:"form-select",children:[e.jsx("option",{value:"site",children:"Site"}),e.jsx("option",{value:"database",children:"Database"})]})]}),e.jsxs("div",{className:"mb-3",children:[e.jsx("label",{className:"form-label",children:"Target"}),e.jsxs("select",{name:"target_id",className:"form-select",required:!0,children:[e.jsx("option",{value:"",children:"Select…"}),E==="site"?u.map(a=>e.jsx("option",{value:a.id,children:a.name},`s-${a.id}`)):h.map(a=>e.jsxs("option",{value:a.id,children:[a.name," (",a.db_type,")"]},`d-${a.id}`))]})]}),e.jsxs("div",{className:"mb-3",children:[e.jsx("label",{className:"form-label",children:"Schedule (cron)"}),e.jsx("input",{name:"schedule",type:"text",placeholder:"0 2 * * *",className:"form-control",required:!0}),e.jsx("div",{className:"form-text",children:"e.g. 0 2 * * * = daily at 2am, 0 */6 * * * = every 6 hours"})]}),e.jsxs("div",{className:"form-check",children:[e.jsx("input",{name:"enabled",type:"checkbox",defaultChecked:!0,className:"form-check-input",id:"plan_enabled"}),e.jsx("label",{className:"form-check-label",htmlFor:"plan_enabled",children:"Enabled"})]})]}),e.jsxs(n.Footer,{children:[e.jsx(m,{type:"button",variant:"secondary",onClick:()=>x(!1),children:"Cancel"}),e.jsx(m,{type:"submit",variant:"primary",disabled:S,children:S?"Creating…":"Create"})]})]})]})]})}export{de as BackupPlansPage};
|