2 lines
18 KiB
JavaScript
2 lines
18 KiB
JavaScript
import{t as Je,r as a,v as Ye,j as e,D as d,w as es,x as ss,y as ts,z as ns,A as ge,B as as,C as ls,E as is,F as rs,G as cs,H as os,I as ds,J as ms,K as hs}from"./index-Cvh4tLHo.js";import{M as l}from"./Modal-CCihVZTY.js";import{A as us}from"./AdminAlert-Bt3L8_zJ.js";import{A as r}from"./AdminButton-BKglG8kI.js";import{A as ps}from"./AdminTable-BQ5Lf7EC.js";import{E as xs}from"./EmptyState-D6lCh4WN.js";import{P as js}from"./PageHeader-D6k34vvM.js";function f(h,n){return h==="/"?`/${n}`:`${h.replace(/\/$/,"")}/${n}`}function Ne(h){const n=h.replace(/\/$/,"").split("/").filter(Boolean);return n.pop(),n.length===0?"/":`/${n.join("/")}`}function be(h){return h<1024?`${h} B`:h<1024*1024?`${(h/1024).toFixed(1)} KB`:h<1024*1024*1024?`${(h/1024/1024).toFixed(1)} MB`:`${(h/1024/1024/1024).toFixed(2)} GB`}const fs=[".txt",".html",".htm",".css",".js",".json",".xml",".md",".py",".php",".sh",".conf",".env",".ini",".log",".yml",".yaml"];function Ss(){const[h]=Je(),[n,Ce]=a.useState("/"),[W,K]=a.useState("/"),[k,ye]=a.useState([]),[M,U]=a.useState(!0),[G,m]=a.useState(""),[H,ve]=a.useState(""),[g,N]=a.useState(()=>new Set),[u,b]=a.useState(null),[O,q]=a.useState({}),[ke,Q]=a.useState(null),[V,X]=a.useState(!1),[S,w]=a.useState(null),[Z,J]=a.useState(""),[Y,ee]=a.useState(!1),[Se,F]=a.useState(!1),[se,z]=a.useState(""),[we,$]=a.useState(!1),[te,D]=a.useState(""),[x,P]=a.useState(null),[T,B]=a.useState(""),[Fe,I]=a.useState(!1),[j,_]=a.useState(null),[ne,ae]=a.useState("0644"),[le,ie]=a.useState(!1),[ze,C]=a.useState(!1),[R,A]=a.useState("archive.zip"),[$e,L]=a.useState(!1),[E,De]=a.useState(""),[re,ce]=a.useState(!1),[oe,de]=a.useState([]),me=a.useRef(null),c=a.useCallback(s=>{U(!0),m(""),N(new Set),Ye(s).then(t=>{Ce(t.path),K(t.path),ye(t.items.sort((i,v)=>i.is_dir===v.is_dir?0:i.is_dir?-1:1)),q({})}).catch(t=>m(t.message)).finally(()=>U(!1))},[]);a.useEffect(()=>{const s=h.get("path");let t="/";if(s&&s.trim())try{t=decodeURIComponent(s.trim())}catch{t=s.trim()}c(t)},[h,c]);const p=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,Pe=s=>{N(t=>{const i=new Set(t);return i.has(s)?i.delete(s):i.add(s),i})},Be=()=>{g.size===p.length?N(new Set):N(new Set(p.map(s=>s.name)))},o=a.useMemo(()=>p.filter(s=>g.has(s.name)),[p,g]),ue=s=>{s.is_dir&&c(f(n,s.name))},Ie=()=>{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),ss(t).catch(i=>m(i.message)).finally(()=>Q(null))},_e=s=>{var i;const t=(i=s.target.files)==null?void 0:i[0];t&&(X(!0),m(""),es(n,t).then(()=>c(n)).catch(v=>m(v.message)).finally(()=>{X(!1),s.target.value=""}))},Ee=s=>{const t=f(n,s.name);hs(t).then(i=>{w(t),J(typeof i.content=="string"?i.content:String(i.content))}).catch(i=>m(i.message))},Me=()=>{S&&(ee(!0),os(S,Z).then(()=>{w(null),c(n)}).catch(s=>m(s.message)).finally(()=>ee(!1)))},He=s=>fs.some(t=>s.toLowerCase().endsWith(t)),Te=s=>{s.preventDefault();const t=se.trim();t&&ls(n,t).then(()=>{F(!1),z(""),c(n)}).catch(i=>m(i.message))},Re=s=>{s.preventDefault();const t=te.trim();t&&is(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){P(null);return}ms(n,x.name,s).then(()=>{P(null),B(""),c(n)}).catch(t=>m(t.message))},Ae=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))},Le=()=>{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))},We=()=>{o.length!==0&&b({op:"copy",entries:o.map(s=>({parent:n,name:s.name}))})},Ke=()=>{o.length!==0&&b({op:"cut",entries:o.map(s=>({parent:n,name:s.name}))})},Ue=()=>{if(!u||u.entries.length===0)return;const s=u.entries.map(t=>u.op==="copy"?ts(t.parent,t.name,n):ns(t.parent,t.name,n));Promise.all(s).then(()=>{(u==null?void 0:u.op)==="cut"&&b(null),c(n)}).catch(t=>m(t.message))},Ge=s=>{_(s),ae(s.mode?s.mode.padStart(3,"0"):"0644"),ie(s.is_dir),I(!0)},Oe=()=>{if(!j)return;const s=f(n,j.name);rs(s,ne,le&&j.is_dir).then(()=>{I(!1),_(null),c(n)}).catch(t=>m(t.message))},qe=()=>{(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||cs(n,s,R.trim()).then(()=>{C(!1),c(n)}).catch(t=>m(t.message))},Ve=s=>{if(!s.is_dir)return;const t=f(n,s.name);ds(t).then(i=>q(v=>({...v,[s.name]:i.size}))).catch(i=>m(i.message))},fe=()=>{const s=E.trim();s&&(ce(!0),de([]),as(s,n,300).then(t=>{de(t.results),L(!0)}).catch(t=>m(t.message)).finally(()=>ce(!1)))},Xe=s=>{L(!1),s.is_dir?c(s.path):c(Ne(s.path))},Ze=s=>{if(s<0){c("/");return}const t=y.slice(0,s+1);c(`/${t.join("/")}`)};return e.jsxs(e.Fragment,{children:[e.jsx(js,{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:Ie,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:_e}),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:We,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:Ke,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:Ue,disabled:!u||u.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:qe,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:Le,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=>K(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=>ve(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:E,onChange:s=>De(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:()=>Ze(t),children:s})},`${s}-${t}`))]})})]})}),e.jsxs(l,{show:Se,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:Te,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:we,onHide:()=>{$(!1),D("")},centered:!0,children:[e.jsx(l.Header,{closeButton:!0,children:e.jsx(l.Title,{children:"New file"})}),e.jsxs("form",{onSubmit:Re,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:Fe,onHide:()=>{I(!1),_(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:()=>{I(!1),_(null)},children:"Cancel"}),e.jsx(r,{variant:"primary",onClick:Oe,children:"Apply"})]})]}),e.jsxs(l,{show:ze,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:$e,onHide:()=>L(!1),size:"lg",scrollable:!0,children:[e.jsx(l.Header,{closeButton:!0,children:e.jsxs(l.Title,{children:["Search results",E?`: “${E}”`:""]})}),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:()=>Xe(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:Me,disabled:Y,children:Y?"Saving…":"Save"})]})]}),G?e.jsx(us,{className:"mb-3",children:G}):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(ps,{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:p.length>0&&g.size===p.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:p.length===0?e.jsx("tr",{children:e.jsx("td",{colSpan:7,className:"p-0",children:e.jsx(xs,{title:"Empty directory",description:"Upload files, create a folder, or adjust the path filter."})})}):p.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:()=>Pe(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?O[s.name]!==void 0?be(O[s.name]):e.jsx("button",{type:"button",className:"btn btn-link btn-sm p-0",onClick:()=>Ve(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=>B(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:()=>{P(null),B("")},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:ke===s.name,children:[e.jsx("i",{className:"ti ti-download me-2"}),"Download"]}),He(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:()=>{P(s),B(s.name)},children:[e.jsx("i",{className:"ti ti-pencil me-2"}),"Rename"]}),e.jsxs(d.Item,{onClick:()=>Ge(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:()=>Ae(s),children:[e.jsx("i",{className:"ti ti-trash me-2"}),"Delete"]})]})]})})]},s.name))})]}),!M&&p.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:p.filter(s=>s.is_dir).length})]}),e.jsxs("span",{children:["Files:"," ",e.jsx("strong",{children:p.filter(s=>!s.is_dir).length})]}),e.jsxs("span",{children:["Showing ",e.jsx("strong",{children:p.length})," of ",e.jsx("strong",{children:k.length})," in folder"]})]}):null]})}),u&&u.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:u.op})," (",u.entries.length," item) — use ",e.jsx("strong",{children:"Paste"})," in the target folder."]}):null]})}export{Ss as FilesPage};
|