Files
yakpanel-core/YakPanel-server/frontend/dist/assets/FilesPage-DLgTKzsa.js
2026-04-07 09:46:22 +05:30

2 lines
17 KiB
JavaScript

import{r as a,p as Ze,j as e,D as d,q as Je,t as Ye,v as es,w as ss,x as ge,y as ts,z as ns,A as as,B as ls,C as is,E as rs,F as cs,G as os,H as ds}from"./index-CRR9sQ49.js";import{M as l}from"./Modal-B7V4w_St.js";import{A as ms}from"./AdminAlert-DW1IRWce.js";import{A as r}from"./AdminButton-Bd2cLTu3.js";import{A as hs}from"./AdminTable-BLiLxfnS.js";import{E as us}from"./EmptyState-C61VdEFl.js";import{P as ps}from"./PageHeader-BcjNf7GG.js";function f(n,p){return n==="/"?`/${p}`:`${n.replace(/\/$/,"")}/${p}`}function Ne(n){const p=n.replace(/\/$/,"").split("/").filter(Boolean);return p.pop(),p.length===0?"/":`/${p.join("/")}`}function be(n){return n<1024?`${n} B`:n<1024*1024?`${(n/1024).toFixed(1)} KB`:n<1024*1024*1024?`${(n/1024/1024).toFixed(1)} MB`:`${(n/1024/1024/1024).toFixed(2)} GB`}const xs=[".txt",".html",".htm",".css",".js",".json",".xml",".md",".py",".php",".sh",".conf",".env",".ini",".log",".yml",".yaml"];function vs(){const[n,p]=a.useState("/"),[W,G]=a.useState("/"),[k,Ce]=a.useState([]),[M,K]=a.useState(!0),[O,m]=a.useState(""),[H,ye]=a.useState(""),[g,N]=a.useState(()=>new Set),[h,b]=a.useState(null),[U,q]=a.useState({}),[ve,Q]=a.useState(null),[V,X]=a.useState(!1),[S,w]=a.useState(null),[Z,J]=a.useState(""),[Y,ee]=a.useState(!1),[ke,F]=a.useState(!1),[se,z]=a.useState(""),[Se,$]=a.useState(!1),[te,D]=a.useState(""),[x,B]=a.useState(null),[T,_]=a.useState(""),[we,P]=a.useState(!1),[j,E]=a.useState(null),[ne,ae]=a.useState("0644"),[le,ie]=a.useState(!1),[Fe,C]=a.useState(!1),[R,A]=a.useState("archive.zip"),[ze,L]=a.useState(!1),[I,$e]=a.useState(""),[re,ce]=a.useState(!1),[oe,de]=a.useState([]),me=a.useRef(null),c=a.useCallback(s=>{K(!0),m(""),N(new Set),Ze(s).then(t=>{p(t.path),G(t.path),Ce(t.items.sort((i,v)=>i.is_dir===v.is_dir?0:i.is_dir?-1:1)),q({})}).catch(t=>m(t.message)).finally(()=>K(!1))},[]);a.useEffect(()=>{c(n)},[]);const u=a.useMemo(()=>{const s=H.trim().toLowerCase();return s?k.filter(t=>t.name.toLowerCase().includes(s)):k},[k,H]),y=n.replace(/\/$/,"").split("/").filter(Boolean),he=y.length>0,De=s=>{N(t=>{const i=new Set(t);return i.has(s)?i.delete(s):i.add(s),i})},Be=()=>{g.size===u.length?N(new Set):N(new Set(u.map(s=>s.name)))},o=a.useMemo(()=>u.filter(s=>g.has(s.name)),[u,g]),ue=s=>{s.is_dir&&c(f(n,s.name))},_e=()=>{he&&c(Ne(n))},pe=()=>{const s=W.trim()||"/";c(s.startsWith("/")?s:`/${s}`)},xe=s=>{if(s.is_dir)return;const t=f(n,s.name);Q(s.name),Ye(t).catch(i=>m(i.message)).finally(()=>Q(null))},Pe=s=>{var i;const t=(i=s.target.files)==null?void 0:i[0];t&&(X(!0),m(""),Je(n,t).then(()=>c(n)).catch(v=>m(v.message)).finally(()=>{X(!1),s.target.value=""}))},Ee=s=>{const t=f(n,s.name);ds(t).then(i=>{w(t),J(typeof i.content=="string"?i.content:String(i.content))}).catch(i=>m(i.message))},Ie=()=>{S&&(ee(!0),rs(S,Z).then(()=>{w(null),c(n)}).catch(s=>m(s.message)).finally(()=>ee(!1)))},Me=s=>xs.some(t=>s.toLowerCase().endsWith(t)),He=s=>{s.preventDefault();const t=se.trim();t&&ns(n,t).then(()=>{F(!1),z(""),c(n)}).catch(i=>m(i.message))},Te=s=>{s.preventDefault();const t=te.trim();t&&as(n,t).then(()=>{$(!1),D(""),c(n)}).catch(i=>m(i.message))},je=()=>{if(!x||!T.trim())return;const s=T.trim();if(s===x.name){B(null);return}os(n,x.name,s).then(()=>{B(null),_(""),c(n)}).catch(t=>m(t.message))},Re=s=>{confirm(`Delete ${s.is_dir?"folder":"file"} "${s.name}"?`)&&ge(n,s.name,s.is_dir).then(()=>c(n)).catch(t=>m(t.message))},Ae=()=>{o.length!==0&&confirm(`Delete ${o.length} item(s)?`)&&Promise.all(o.map(s=>ge(n,s.name,s.is_dir))).then(()=>c(n)).catch(s=>m(s.message))},Le=()=>{o.length!==0&&b({op:"copy",entries:o.map(s=>({parent:n,name:s.name}))})},We=()=>{o.length!==0&&b({op:"cut",entries:o.map(s=>({parent:n,name:s.name}))})},Ge=()=>{if(!h||h.entries.length===0)return;const s=h.entries.map(t=>h.op==="copy"?es(t.parent,t.name,n):ss(t.parent,t.name,n));Promise.all(s).then(()=>{(h==null?void 0:h.op)==="cut"&&b(null),c(n)}).catch(t=>m(t.message))},Ke=s=>{E(s),ae(s.mode?s.mode.padStart(3,"0"):"0644"),ie(s.is_dir),P(!0)},Oe=()=>{if(!j)return;const s=f(n,j.name);ls(s,ne,le&&j.is_dir).then(()=>{P(!1),E(null),c(n)}).catch(t=>m(t.message))},Ue=()=>{(o.length>0?o.map(t=>t.name):[]).length!==0&&(A(`archive-${Date.now()}.zip`),C(!0))},qe=()=>{const s=o.length>0?o.map(t=>t.name):[];!R.trim()||s.length===0||is(n,s,R.trim()).then(()=>{C(!1),c(n)}).catch(t=>m(t.message))},Qe=s=>{if(!s.is_dir)return;const t=f(n,s.name);cs(t).then(i=>q(v=>({...v,[s.name]:i.size}))).catch(i=>m(i.message))},fe=()=>{const s=I.trim();s&&(ce(!0),de([]),ts(s,n,300).then(t=>{de(t.results),L(!0)}).catch(t=>m(t.message)).finally(()=>ce(!1)))},Ve=s=>{L(!1),s.is_dir?c(s.path):c(Ne(s.path))},Xe=s=>{if(s<0){c("/");return}const t=y.slice(0,s+1);c(`/${t.join("/")}`)};return e.jsxs(e.Fragment,{children:[e.jsx(ps,{title:"Files"}),e.jsx("div",{className:"card mb-3",children:e.jsxs("div",{className:"card-body py-2",children:[e.jsxs("div",{className:"d-flex flex-wrap align-items-center gap-2 mb-2",children:[e.jsxs(r,{variant:"secondary",size:"sm",onClick:_e,disabled:!he,children:[e.jsx("i",{className:"ti ti-arrow-left me-1","aria-hidden":!0}),"Back"]}),e.jsxs(r,{variant:"outline-secondary",size:"sm",onClick:()=>c(n),disabled:M,children:[e.jsx("i",{className:"ti ti-refresh me-1","aria-hidden":!0}),"Refresh"]}),e.jsxs(d,{as:"span",children:[e.jsxs(d.Toggle,{variant:"success",size:"sm",id:"files-new-dropdown",children:[e.jsx("i",{className:"ti ti-plus me-1","aria-hidden":!0}),"New"]}),e.jsxs(d.Menu,{children:[e.jsxs(d.Item,{onClick:()=>F(!0),children:[e.jsx("i",{className:"ti ti-folder-plus me-2"}),"Folder"]}),e.jsxs(d.Item,{onClick:()=>$(!0),children:[e.jsx("i",{className:"ti ti-file-plus me-2"}),"File"]})]})]}),e.jsx("input",{ref:me,type:"file",className:"d-none",onChange:Pe}),e.jsxs(r,{variant:"primary",size:"sm",onClick:()=>{var s;return(s=me.current)==null?void 0:s.click()},disabled:V,children:[V?e.jsx("span",{className:"spinner-border spinner-border-sm me-1",role:"status"}):e.jsx("i",{className:"ti ti-upload me-1","aria-hidden":!0}),"Upload"]}),o.length===1&&!o[0].is_dir?e.jsxs(r,{variant:"outline-primary",size:"sm",onClick:()=>xe(o[0]),children:[e.jsx("i",{className:"ti ti-download me-1","aria-hidden":!0}),"Download"]}):null,e.jsxs(r,{variant:"outline-secondary",size:"sm",onClick:Le,disabled:o.length===0,children:[e.jsx("i",{className:"ti ti-copy me-1","aria-hidden":!0}),"Copy"]}),e.jsxs(r,{variant:"outline-secondary",size:"sm",onClick:We,disabled:o.length===0,children:[e.jsx("i",{className:"ti ti-cut me-1","aria-hidden":!0}),"Cut"]}),e.jsxs(r,{variant:"outline-primary",size:"sm",onClick:Ge,disabled:!h||h.entries.length===0,children:[e.jsx("i",{className:"ti ti-clipboard me-1","aria-hidden":!0}),"Paste"]}),e.jsxs(r,{variant:"warning",size:"sm",onClick:Ue,disabled:o.length===0,children:[e.jsx("i",{className:"ti ti-file-zip me-1","aria-hidden":!0}),"Compress"]}),e.jsxs(r,{variant:"outline-danger",size:"sm",onClick:Ae,disabled:o.length===0,children:[e.jsx("i",{className:"ti ti-trash me-1","aria-hidden":!0}),"Delete"]})]}),e.jsxs("div",{className:"d-flex flex-wrap align-items-center gap-2",children:[e.jsxs("div",{className:"input-group input-group-sm",style:{minWidth:240,maxWidth:480},children:[e.jsx("span",{className:"input-group-text",children:"Path"}),e.jsx("input",{className:"form-control font-monospace small",value:W,onChange:s=>G(s.target.value),onKeyDown:s=>s.key==="Enter"&&pe()}),e.jsx(r,{variant:"primary",size:"sm",className:"rounded-0 rounded-end",type:"button",onClick:pe,children:"Go"})]}),e.jsxs("div",{className:"input-group input-group-sm flex-grow-1",style:{minWidth:200},children:[e.jsx("span",{className:"input-group-text",children:e.jsx("i",{className:"ti ti-search","aria-hidden":!0})}),e.jsx("input",{className:"form-control",placeholder:"Filter current folder…",value:H,onChange:s=>ye(s.target.value)})]}),e.jsxs("div",{className:"input-group input-group-sm",style:{minWidth:200},children:[e.jsx("input",{className:"form-control",placeholder:"Search subfolders…",value:I,onChange:s=>$e(s.target.value),onKeyDown:s=>s.key==="Enter"&&fe()}),e.jsx(r,{variant:"outline-secondary",size:"sm",type:"button",onClick:fe,disabled:re,children:re?e.jsx("span",{className:"spinner-border spinner-border-sm",role:"status"}):"Search"})]})]}),e.jsx("nav",{"aria-label":"breadcrumb",className:"mt-2 mb-0",children:e.jsxs("ol",{className:"breadcrumb mb-0 small py-1",children:[e.jsx("li",{className:"breadcrumb-item",children:e.jsx("button",{type:"button",className:"btn btn-link btn-sm p-0 text-decoration-none",onClick:()=>c("/"),children:"/"})}),y.map((s,t)=>e.jsx("li",{className:`breadcrumb-item${t===y.length-1?" active":""}`,children:t===y.length-1?s:e.jsx("button",{type:"button",className:"btn btn-link btn-sm p-0 text-decoration-none",onClick:()=>Xe(t),children:s})},`${s}-${t}`))]})})]})}),e.jsxs(l,{show:ke,onHide:()=>{F(!1),z("")},centered:!0,children:[e.jsx(l.Header,{closeButton:!0,children:e.jsx(l.Title,{children:"New folder"})}),e.jsxs("form",{onSubmit:He,children:[e.jsx(l.Body,{children:e.jsx("input",{value:se,onChange:s=>z(s.target.value),placeholder:"Folder name",className:"form-control",autoFocus:!0})}),e.jsxs(l.Footer,{children:[e.jsx(r,{type:"button",variant:"secondary",onClick:()=>{F(!1),z("")},children:"Cancel"}),e.jsx(r,{type:"submit",variant:"success",children:"Create"})]})]})]}),e.jsxs(l,{show:Se,onHide:()=>{$(!1),D("")},centered:!0,children:[e.jsx(l.Header,{closeButton:!0,children:e.jsx(l.Title,{children:"New file"})}),e.jsxs("form",{onSubmit:Te,children:[e.jsx(l.Body,{children:e.jsx("input",{value:te,onChange:s=>D(s.target.value),placeholder:"filename.txt",className:"form-control",autoFocus:!0})}),e.jsxs(l.Footer,{children:[e.jsx(r,{type:"button",variant:"secondary",onClick:()=>{$(!1),D("")},children:"Cancel"}),e.jsx(r,{type:"submit",variant:"primary",children:"Create"})]})]})]}),e.jsxs(l,{show:we,onHide:()=>{P(!1),E(null)},centered:!0,children:[e.jsx(l.Header,{closeButton:!0,children:e.jsx(l.Title,{children:"Permissions"})}),e.jsx(l.Body,{children:j?e.jsxs(e.Fragment,{children:[e.jsx("p",{className:"small font-monospace text-break mb-2",children:f(n,j.name)}),e.jsx("label",{className:"form-label small",children:"Mode (octal)"}),e.jsx("input",{className:"form-control mb-2 font-monospace",value:ne,onChange:s=>ae(s.target.value),placeholder:"0644"}),j.is_dir?e.jsxs("div",{className:"form-check",children:[e.jsx("input",{className:"form-check-input",type:"checkbox",id:"chmod-rec",checked:le,onChange:s=>ie(s.target.checked)}),e.jsx("label",{className:"form-check-label small",htmlFor:"chmod-rec",children:"Recursive (chmod entire tree)"})]}):null]}):null}),e.jsxs(l.Footer,{children:[e.jsx(r,{variant:"secondary",onClick:()=>{P(!1),E(null)},children:"Cancel"}),e.jsx(r,{variant:"primary",onClick:Oe,children:"Apply"})]})]}),e.jsxs(l,{show:Fe,onHide:()=>C(!1),centered:!0,children:[e.jsx(l.Header,{closeButton:!0,children:e.jsx(l.Title,{children:"Compress to ZIP"})}),e.jsxs(l.Body,{children:[e.jsxs("p",{className:"small text-secondary mb-2",children:[o.length," item(s) selected"]}),e.jsx("label",{className:"form-label small",children:"Archive name"}),e.jsx("input",{className:"form-control font-monospace",value:R,onChange:s=>A(s.target.value)})]}),e.jsxs(l.Footer,{children:[e.jsx(r,{variant:"secondary",onClick:()=>C(!1),children:"Cancel"}),e.jsx(r,{variant:"primary",onClick:qe,children:"Create ZIP"})]})]}),e.jsxs(l,{show:ze,onHide:()=>L(!1),size:"lg",scrollable:!0,children:[e.jsx(l.Header,{closeButton:!0,children:e.jsxs(l.Title,{children:["Search results",I?`: “${I}`:""]})}),e.jsx(l.Body,{children:oe.length===0?e.jsx("p",{className:"text-secondary small mb-0",children:"No matches."}):e.jsx("ul",{className:"list-group list-group-flush",children:oe.map(s=>e.jsxs("li",{className:"list-group-item d-flex justify-content-between align-items-center",children:[e.jsx("span",{className:"small font-monospace text-break me-2",children:s.path}),e.jsx(r,{size:"sm",variant:"outline-primary",onClick:()=>Ve(s),children:"Open"})]},s.path))})})]}),e.jsxs(l,{show:!!S,onHide:()=>w(null),fullscreen:"lg-down",size:"lg",children:[e.jsx(l.Header,{closeButton:!0,children:e.jsx(l.Title,{className:"text-break small font-monospace",children:S})}),e.jsx(l.Body,{className:"d-flex flex-column p-0",style:{minHeight:400},children:e.jsx("textarea",{value:Z,onChange:s=>J(s.target.value),className:"form-control font-monospace small flex-grow-1 rounded-0 border-0",style:{minHeight:400},spellCheck:!1})}),e.jsxs(l.Footer,{children:[e.jsx(r,{variant:"secondary",onClick:()=>w(null),children:"Cancel"}),e.jsx(r,{variant:"primary",onClick:Ie,disabled:Y,children:Y?"Saving…":"Save"})]})]}),O?e.jsx(ms,{className:"mb-3",children:O}):null,e.jsx("div",{className:"card",children:M?e.jsx("div",{className:"card-body text-center py-5",children:e.jsx("span",{className:"spinner-border text-secondary",role:"status"})}):e.jsxs(e.Fragment,{children:[e.jsxs(hs,{children:[e.jsx("thead",{children:e.jsxs("tr",{children:[e.jsx("th",{style:{width:40},children:e.jsx("input",{type:"checkbox",className:"form-check-input",checked:u.length>0&&g.size===u.length,onChange:Be,"aria-label":"Select all"})}),e.jsx("th",{children:"Name"}),e.jsx("th",{children:"Size"}),e.jsx("th",{className:"d-none d-lg-table-cell",children:"Modified"}),e.jsx("th",{className:"d-none d-md-table-cell",children:"Permission"}),e.jsx("th",{className:"d-none d-xl-table-cell",children:"Owner"}),e.jsx("th",{className:"text-end",style:{minWidth:120},children:"Operation"})]})}),e.jsx("tbody",{children:u.length===0?e.jsx("tr",{children:e.jsx("td",{colSpan:7,className:"p-0",children:e.jsx(us,{title:"Empty directory",description:"Upload files, create a folder, or adjust the path filter."})})}):u.map(s=>e.jsxs("tr",{children:[e.jsx("td",{onClick:t=>t.stopPropagation(),children:e.jsx("input",{type:"checkbox",className:"form-check-input",checked:g.has(s.name),onChange:()=>De(s.name),"aria-label":`Select ${s.name}`})}),e.jsx("td",{children:s.is_dir?e.jsxs("button",{type:"button",onClick:()=>ue(s),className:"btn btn-link text-start text-decoration-none p-0 d-inline-flex align-items-center gap-2",children:[e.jsx("i",{className:"ti ti-folder text-warning","aria-hidden":!0}),e.jsx("span",{children:s.name})]}):e.jsxs("span",{className:"d-inline-flex align-items-center gap-2",children:[e.jsx("i",{className:"ti ti-file text-secondary","aria-hidden":!0}),s.name]})}),e.jsx("td",{className:"text-secondary small",children:s.is_dir?U[s.name]!==void 0?be(U[s.name]):e.jsx("button",{type:"button",className:"btn btn-link btn-sm p-0",onClick:()=>Qe(s),children:"Calculate"}):be(s.size)}),e.jsx("td",{className:"small text-secondary d-none d-lg-table-cell",children:s.mtime??"—"}),e.jsx("td",{className:"small font-monospace d-none d-md-table-cell",children:s.mode_symbolic?e.jsx(e.Fragment,{children:e.jsx("span",{title:`${s.mode_symbolic} (${s.mode})`,children:s.mode_symbolic})}):s.mode??"—"}),e.jsx("td",{className:"small d-none d-xl-table-cell",children:s.owner?`${s.owner}:${s.group??""}`:"—"}),e.jsx("td",{className:"text-end",children:(x==null?void 0:x.name)===s.name?e.jsxs("span",{className:"d-inline-flex gap-1 align-items-center flex-wrap justify-content-end",children:[e.jsx("input",{value:T,onChange:t=>_(t.target.value),onKeyDown:t=>t.key==="Enter"&&je(),className:"form-control form-control-sm",style:{width:"7rem"},autoFocus:!0}),e.jsx("button",{type:"button",className:"btn btn-link btn-sm text-success p-1",title:"Save",onClick:je,children:e.jsx("i",{className:"ti ti-check","aria-hidden":!0})}),e.jsx("button",{type:"button",className:"btn btn-link btn-sm p-1",onClick:()=>{B(null),_("")},children:"Cancel"})]}):e.jsxs(d,{align:"end",onClick:t=>t.stopPropagation(),children:[e.jsx(d.Toggle,{variant:"light",size:"sm",className:"py-0 border",children:"More"}),e.jsxs(d.Menu,{children:[s.is_dir?e.jsxs(d.Item,{onClick:()=>ue(s),children:[e.jsx("i",{className:"ti ti-folder-open me-2"}),"Open"]}):e.jsxs(e.Fragment,{children:[e.jsxs(d.Item,{onClick:()=>xe(s),disabled:ve===s.name,children:[e.jsx("i",{className:"ti ti-download me-2"}),"Download"]}),Me(s.name)?e.jsxs(d.Item,{onClick:()=>Ee(s),children:[e.jsx("i",{className:"ti ti-edit me-2"}),"Edit"]}):null]}),e.jsx(d.Divider,{}),e.jsxs(d.Item,{onClick:()=>{b({op:"copy",entries:[{parent:n,name:s.name}]})},children:[e.jsx("i",{className:"ti ti-copy me-2"}),"Copy"]}),e.jsxs(d.Item,{onClick:()=>{b({op:"cut",entries:[{parent:n,name:s.name}]})},children:[e.jsx("i",{className:"ti ti-cut me-2"}),"Cut"]}),e.jsxs(d.Item,{onClick:()=>{B(s),_(s.name)},children:[e.jsx("i",{className:"ti ti-pencil me-2"}),"Rename"]}),e.jsxs(d.Item,{onClick:()=>Ke(s),children:[e.jsx("i",{className:"ti ti-lock me-2"}),"Permission"]}),e.jsxs(d.Item,{onClick:()=>{N(new Set([s.name])),A(`${s.name.replace(/\.[^/.]+$/,"")||"archive"}.zip`),C(!0)},children:[e.jsx("i",{className:"ti ti-file-zip me-2"}),"Compress"]}),e.jsx(d.Divider,{}),e.jsxs(d.Item,{className:"text-danger",onClick:()=>Re(s),children:[e.jsx("i",{className:"ti ti-trash me-2"}),"Delete"]})]})]})})]},s.name))})]}),!M&&u.length>0?e.jsxs("div",{className:"card-footer py-2 small text-secondary d-flex flex-wrap gap-3",children:[e.jsxs("span",{children:["Directories:"," ",e.jsx("strong",{children:u.filter(s=>s.is_dir).length})]}),e.jsxs("span",{children:["Files:"," ",e.jsx("strong",{children:u.filter(s=>!s.is_dir).length})]}),e.jsxs("span",{children:["Showing ",e.jsx("strong",{children:u.length})," of ",e.jsx("strong",{children:k.length})," in folder"]})]}):null]})}),h&&h.entries.length>0?e.jsxs("div",{className:"alert alert-light border mt-3 mb-0 small py-2",children:[e.jsx("i",{className:"ti ti-clipboard me-1","aria-hidden":!0}),"Clipboard: ",e.jsx("strong",{children:h.op})," (",h.entries.length," item) — use ",e.jsx("strong",{children:"Paste"})," in the target folder."]}):null]})}export{vs as FilesPage};