5 lines
82 KiB
JavaScript
5 lines
82 KiB
JavaScript
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/initMonaco-DTDMLv7Z.js","assets/chunk-DK3Fl9T5.js","assets/index-a0fi5f-0.js","assets/index-BNJe_ogF.css","assets/initMonaco-DX2BVZF3.css"])))=>i.map(i=>d[i]);
|
||
import{t as e}from"./VDataTable-pRRodit6.js";import{_ as t,t as n}from"./VSelect-3h-EI23Y.js";import{n as r,t as i}from"./VRow-qjxp2VJ5.js";import{$ as a,Ar as o,B as s,Dr as c,Er as l,Fr as u,I as d,Jr as f,L as p,Lr as m,Mn as h,Nn as g,Nr as _,On as v,Or as y,Q as b,Qt as x,Rr as S,Sn as C,Sr as ee,Tr as w,V as T,Vr as E,Wr as D,X as O,Yr as te,Z as k,_i as A,_t as ne,b as re,bi as ie,br as j,ci as ae,cn as oe,cr as se,dt as ce,en as le,fi as ue,ft as de,g as M,h as N,in as P,jr as F,kn as I,ln as fe,mi as pe,mt as me,oi as he,on as ge,pt as L,q as _e,qr as R,r as z,ri as B,rn as V,sn as ve,ti as ye,tt as be,u as xe,ui as H,ut as Se,v as U,vt as Ce,wr as W,xi as G,xn as we,xr as Te,y as K,yi as q,yr as J,zr as Ee}from"./index-a0fi5f-0.js";import{a as De,i as Oe,n as ke,t as Ae}from"./initMonaco-DTDMLv7Z.js";import{t as je}from"./_plugin-vue_export-helper-BDNMzG2s.js";import{t as Me}from"./useSnackbar-u_XK4ZNm.js";import{t as Ne}from"./dataTable-esDY4cOk.js";import{i as Y,n as X,o as Pe,t as Z}from"./VCard-BwwttBcf.js";import{t as Fe}from"./VCheckbox-RnLQ4WBr.js";import{t as Ie}from"./VTextField-GUQr1tUN.js";import{t as Le}from"./apiError-BUh3zCmq.js";import{t as Re}from"./useServerList-6fsbQxWS.js";import{t as ze}from"./VDialog-BFQGuuXw.js";import{a as Be,i as Q,n as Ve,o as He,r as $,s as Ue,t as We}from"./remotePath-D3rG2Z3e.js";import{i as Ge,t as Ke}from"./VTabs-BX9iYxVa.js";import{n as qe,t as Je}from"./VTooltip-BbRT1OE8.js";import{t as Ye}from"./VAutocomplete-B1NSIBuv.js";import{r as Xe}from"./validation-BMzYTJL4.js";var Ze=Symbol(`filesPage`);function Qe(e){f(Ze,ae(e))}function $e(){let e=u(Ze);if(!e)throw Error(`useFilesPageContext() must be used inside FilesPage`);return e}var et=g({divider:[Number,String],...h()},`VBreadcrumbsDivider`),tt=v()({name:`VBreadcrumbsDivider`,props:et(),setup(e,{slots:t}){return C(()=>w(`li`,{"aria-hidden":`true`,class:q([`v-breadcrumbs-divider`,e.class]),style:ie(e.style)},[t?.default?.()??e.divider])),{}}}),nt=g({active:Boolean,activeClass:String,activeColor:String,color:String,disabled:Boolean,title:String,...h(),...se(O(),[`width`,`maxWidth`]),...s(),...de({tag:`li`})},`VBreadcrumbsItem`),rt=v()({name:`VBreadcrumbsItem`,props:nt(),setup(e,{slots:t,attrs:n}){let r=T(e,n),i=W(()=>e.active||r.isActive?.value),{dimensionStyles:a}=k(e),{textColorClasses:o,textColorStyles:s}=ce(()=>i.value?e.activeColor:e.color);return C(()=>F(e.tag,{class:q([`v-breadcrumbs-item`,{"v-breadcrumbs-item--active":i.value,"v-breadcrumbs-item--disabled":e.disabled,[`${e.activeClass}`]:i.value&&e.activeClass},o.value,e.class]),style:ie([s.value,a.value,e.style]),"aria-current":i.value?`page`:void 0},{default:()=>[r.isLink.value?w(`a`,m({class:`v-breadcrumbs-item--link`,onClick:r.navigate.value},r.linkProps),[t.default?.()??e.title]):t.default?.()??e.title]})),{}}}),it=g({activeClass:String,activeColor:String,bgColor:String,color:String,disabled:Boolean,divider:{type:String,default:`/`},icon:we,items:{type:Array,default:()=>[]},...h(),...ne(),...L(),...de({tag:`ul`})},`VBreadcrumbs`),at=v()({name:`VBreadcrumbs`,props:it(),setup(e,{slots:t}){let{backgroundColorClasses:n,backgroundColorStyles:r}=Se(()=>e.bgColor),{densityClasses:i}=Ce(e),{roundedClasses:o}=me(e);I({VBreadcrumbsDivider:{divider:pe(()=>e.divider)},VBreadcrumbsItem:{activeClass:pe(()=>e.activeClass),activeColor:pe(()=>e.activeColor),color:pe(()=>e.color),disabled:pe(()=>e.disabled)}});let s=W(()=>e.items.map(e=>typeof e==`string`?{item:{title:e},raw:e}:{item:e,raw:e}));return C(()=>{let c=!!(t.prepend||e.icon);return F(e.tag,{class:q([`v-breadcrumbs`,n.value,i.value,o.value,e.class]),style:ie([r.value,e.style])},{default:()=>[c&&w(`li`,{key:`prepend`,class:`v-breadcrumbs__prepend`},[t.prepend?F(be,{key:`prepend-defaults`,disabled:!e.icon,defaults:{VIcon:{icon:e.icon,start:!0}}},t.prepend):F(a,{key:`prepend-icon`,start:!0,icon:e.icon},null)]),s.value.map(({item:e,raw:n},r,i)=>w(Te,null,[t.item?.({item:e,index:r})??F(rt,m({key:r,disabled:r>=i.length-1},typeof e==`string`?{title:e}:e),{default:t.title?()=>t.title?.({item:e,index:r}):void 0}),r<i.length-1&&F(tt,null,{default:t.divider?()=>t.divider?.({item:n,index:r}):void 0})])),t.default?.()]})}),{}}}),ot={class:`text-body-2 mr-4`},st=_({__name:`FilesBreadcrumb`,setup(e){let t=$e();return(e,n)=>(R(),y(Te,null,[F(at,{items:A(t).breadcrumbs,class:`pa-0 mb-2`},{item:B(({item:e,index:n})=>[F(rt,{disabled:e.disabled,class:q({"text-primary":!e.disabled,"cursor-pointer":!e.disabled}),onClick:e=>A(t).onBreadcrumbClick(n)},{default:B(()=>[o(G(e.title),1)]),_:2},1032,[`disabled`,`class`,`onClick`])]),divider:B(()=>[...n[1]||=[o(`/`,-1)]]),_:1},8,[`items`]),A(t).selectedFileCount>0?(R(),l(Z,{key:0,class:`mb-4`,color:`primary`,variant:`tonal`,rounded:`lg`},{default:B(()=>[F(X,{class:`d-flex align-center py-2`},{default:B(()=>[w(`span`,ot,`已选择 `+G(A(t).selectedFileCount)+` 个文件`,1),F(U),F(p,{size:`small`,variant:`text`,color:`error`,onClick:A(t).batchDelete},{default:B(()=>[...n[2]||=[o(`批量删除`,-1)]]),_:1},8,[`onClick`]),F(p,{size:`small`,variant:`text`,onClick:n[0]||=e=>A(t).selectedFiles=[]},{default:B(()=>[...n[3]||=[o(`取消选择`,-1)]]),_:1})]),_:1})]),_:1})):c(``,!0)],64))}}),ct={key:1,class:`file-dir-tree-embedded-bar d-flex align-center px-2 py-1`},lt={key:0,class:`text-caption text-medium-emphasis pa-3`},ut={key:2,class:`text-caption text-medium-emphasis pa-3`},dt=[`onClick`],ft=[`onClick`,`onContextmenu`],pt=je(_({__name:`FileDirectoryTree`,props:{serverId:{},currentPath:{},rootPath:{},embedded:{type:Boolean}},emits:[`navigate`,`paste-target`],setup(e,{emit:t}){let n=e,r=Me(),i=W(()=>Q(n.rootPath||`/www/wwwroot`)),s=t,c=H(!1),u=H(null),d=H(new Set),f=H(new Map);function m(e){let t=new Set(d.value);e(t),d.value=t}function h(e){let t=new Map(f.value);e(t),f.value=t}function g(){d.value=new Set([i.value])}let _=W(()=>{let e=[],t=(n,r)=>{let i=f.value.get(n)??[];for(let n of i)e.push({...n,depth:r}),d.value.has(n.path)&&t(n.path,r+1)};return t(i.value,0),e});async function v(e){if(!n.serverId)return[];let{items:t}=Ue(await P.post(`/sync/browse`,{server_id:n.serverId,path:Q(e)}));return t.filter(e=>e.type===`directory`).sort((e,t)=>e.name.localeCompare(t.name)).map(t=>({path:$(e,t.name),name:t.name,depth:0,hasChildren:!0,loaded:!1}))}async function x(e){if(n.serverId){u.value=e;try{let t=await v(e);h(n=>{n.set(e,t);for(let e of t)n.has(e.path)||n.set(e.path,[])})}catch(e){r(e instanceof Error?e.message:`加载目录失败`,`error`)}finally{u.value=null}}}async function S(){if(!n.serverId)return;c.value=!0,f.value=new Map,g();let e=i.value;try{await x(e),h(t=>{for(let n of t.get(e)??[])t.has(n.path)||t.set(n.path,[])})}finally{c.value=!1}}async function C(e){if(d.value.has(e.path)){m(t=>{t.delete(e.path)});return}f.value.has(e.path)||await x(e.path),m(t=>{t.add(e.path)})}function ee(e){let t=Q(e),n=i.value;t!==n&&m(e=>{if(e.add(n),!t.startsWith(n))return;let r=t.slice(n.length).replace(/^\//,``);if(!r)return;let i=n;for(let t of r.split(`/`).filter(Boolean))i=$(i,t),e.add(i)})}ye(()=>[n.serverId,i.value],([e])=>{e?S():(f.value=new Map,d.value=new Set)},{immediate:!0});async function T(e){if(!n.serverId)return;let t=Q(e),r=i.value;if(ee(t),f.value.has(r)||await x(r),t===r||!t.startsWith(r))return;let a=t.slice(r.length).replace(/^\//,``).split(`/`).filter(Boolean),o=r;for(let e of a)f.value.has(o)||await x(o),o=$(o,e)}return ye(()=>n.currentPath,e=>{e&&T(e)},{immediate:!0}),(t,n)=>(R(),l(Z,{border:``,rounded:`lg`,class:q([`file-dir-tree d-flex flex-column`,{"file-dir-tree--embedded":e.embedded}])},{default:B(()=>[e.embedded?(R(),y(`div`,ct,[F(a,{size:`16`,class:`mr-1 text-medium-emphasis`},{default:B(()=>[...n[2]||=[o(`mdi-file-tree`,-1)]]),_:1}),n[3]||=w(`span`,{class:`text-caption text-medium-emphasis`},`目录`,-1),F(U),F(p,{icon:`mdi-refresh`,size:`x-small`,variant:`text`,disabled:!e.serverId,onClick:S},null,8,[`disabled`])])):(R(),l(Y,{key:0,class:`text-subtitle-2 py-2 px-3 d-flex align-center`},{default:B(()=>[F(a,{size:`18`,class:`mr-1`},{default:B(()=>[...n[0]||=[o(`mdi-file-tree`,-1)]]),_:1}),n[1]||=o(` 目录 `,-1),F(U),F(p,{icon:`mdi-refresh`,size:`x-small`,variant:`text`,disabled:!e.serverId,onClick:S},null,8,[`disabled`])]),_:1})),F(K),F(X,{class:`file-dir-tree-body pa-0 flex-grow-1`},{default:B(()=>[e.serverId?c.value?(R(),l(_e,{key:1,indeterminate:``})):_.value.length===0?(R(),y(`div`,ut,` 暂无子目录(可点刷新) `)):(R(),l(xe,{key:3,density:`compact`,nav:``,class:`py-0`},{default:B(()=>[(R(!0),y(Te,null,te(_.value,t=>(R(),y(`div`,{key:t.path,class:`file-dir-tree-row d-flex align-center`,style:ie({paddingLeft:`${8+t.depth*14}px`})},[w(`button`,{type:`button`,class:`file-dir-tree-toggle`,onClick:j(e=>C(t),[`stop`])},[u.value===t.path?(R(),l(b,{key:0,indeterminate:``,size:`14`,width:`2`})):(R(),l(a,{key:1,size:`16`},{default:B(()=>[o(G(d.value.has(t.path)?`mdi-chevron-down`:`mdi-chevron-right`),1)]),_:2},1024))],8,dt),w(`button`,{type:`button`,class:q([`file-dir-tree-label text-body-2 text-truncate`,{"file-dir-tree-label--active":A(Q)(e.currentPath)===t.path}]),onClick:e=>s(`navigate`,t.path),onContextmenu:j(e=>s(`paste-target`,t.path),[`prevent`])},[F(a,{size:`14`,class:`mr-1`},{default:B(()=>[...n[4]||=[o(`mdi-folder-outline`,-1)]]),_:1}),o(` `+G(t.name),1)],42,ft)],4))),128))]),_:1})):(R(),y(`div`,lt,`请先选择服务器`))]),_:1})]),_:1},8,[`class`]))}}),[[`__scopeId`,`data-v-d76d91c6`]]);function mt(e,t){try{let n=localStorage.getItem(e);if(!n)return t;let r=JSON.parse(n);if(typeof r.x==`number`&&typeof r.y==`number`&&typeof r.w==`number`&&typeof r.h==`number`)return r}catch{}return t}function ht(e,t){try{localStorage.setItem(e,JSON.stringify(t))}catch{}}function gt(e,t,n={}){let r=n.minW??480,i=n.minH??320,a=n.maxW??1400,o=n.maxH??900,s=H(mt(e,t)),c={px:0,py:0,rx:0,ry:0},l=!1,u={px:0,py:0,rw:0,rh:0},d=W(()=>({left:`${s.value.x}px`,top:`${s.value.y}px`,width:`${s.value.w}px`,height:`${s.value.h}px`}));function f(){let e=Math.min(window.innerWidth-16,a),t=Math.min(window.innerHeight-16,o);s.value.w=Math.max(r,Math.min(s.value.w,e)),s.value.h=Math.max(i,Math.min(s.value.h,t)),s.value.x=Math.max(8,Math.min(s.value.x,window.innerWidth-s.value.w-8)),s.value.y=Math.max(8,Math.min(s.value.y,window.innerHeight-s.value.h-8))}function p(e){if(l){s.value.w=Math.max(r,u.rw+e.clientX-u.px),s.value.h=Math.max(i,u.rh+e.clientY-u.py),f();return}s.value.x=c.rx+e.clientX-c.px,s.value.y=c.ry+e.clientY-c.py,f()}function m(){l=!1,window.removeEventListener(`mousemove`,p),window.removeEventListener(`mouseup`,m),ht(e,s.value)}function h(e){e.button===0&&(e.preventDefault(),c={px:e.clientX,py:e.clientY,rx:s.value.x,ry:s.value.y},window.addEventListener(`mousemove`,p),window.addEventListener(`mouseup`,m))}function g(e){e.button===0&&(e.stopPropagation(),l=!0,u={px:e.clientX,py:e.clientY,rw:s.value.w,rh:s.value.h},window.addEventListener(`mousemove`,p),window.addEventListener(`mouseup`,m))}function _(){s.value.x=Math.max(16,(window.innerWidth-s.value.w)/2),s.value.y=Math.max(16,(window.innerHeight-s.value.h)/2),ht(e,s.value)}return E(()=>{window.removeEventListener(`mousemove`,p),window.removeEventListener(`mouseup`,m)}),{rect:s,panelStyle:d,startDrag:h,startResize:g,centerOnScreen:_,clampToViewport:f}}var _t={js:`javascript`,mjs:`javascript`,cjs:`javascript`,jsx:`javascript`,ts:`typescript`,mts:`typescript`,cts:`typescript`,tsx:`typescript`,vue:`html`,py:`python`,pyw:`python`,rb:`ruby`,sh:`shell`,bash:`shell`,zsh:`shell`,fish:`shell`,php:`php`,phtml:`php`,java:`java`,go:`go`,rs:`rust`,c:`c`,cpp:`cpp`,cc:`cpp`,cxx:`cpp`,h:`c`,hpp:`cpp`,cs:`csharp`,swift:`swift`,kt:`kotlin`,kts:`kotlin`,html:`html`,htm:`html`,xhtml:`html`,css:`css`,scss:`scss`,sass:`scss`,less:`less`,json:`json`,jsonc:`json`,xml:`xml`,xsl:`xml`,xsd:`xml`,svg:`xml`,yaml:`yaml`,yml:`yaml`,toml:`toml`,md:`markdown`,mdx:`mdx`,sql:`sql`,graphql:`graphql`,gql:`graphql`,dockerfile:`dockerfile`,conf:`ini`,cfg:`ini`,cnf:`ini`,ini:`ini`,properties:`ini`,env:`ini`,tpl:`html`,twig:`twig`,blade:`php`,lua:`lua`,pl:`perl`,pm:`perl`,ps1:`powershell`,psm1:`powershell`,bat:`bat`,cmd:`bat`,r:`r`,dart:`dart`,scala:`scala`,clj:`clojure`,ex:`elixir`,exs:`elixir`,erl:`elixir`,hs:`haskell`,ml:`fsharp`,fs:`fsharp`,fsx:`fsharp`,vb:`vb`,pas:`pascal`,dockerignore:`plaintext`,gitignore:`plaintext`,gitattributes:`plaintext`,editorconfig:`ini`,htaccess:`shell`,service:`ini`,socket:`ini`,timer:`ini`,mount:`ini`,fstab:`ini`,crt:`plaintext`,pem:`plaintext`,key:`plaintext`,pub:`plaintext`,log:`plaintext`,lock:`json`},vt={dockerfile:`dockerfile`,makefile:`makefile`,gnumakefile:`makefile`,"cmakelists.txt":`plaintext`,gemfile:`ruby`,rakefile:`ruby`,vagrantfile:`ruby`,nginx:`nginx`,"nginx.conf":`nginx`,".env":`ini`,".env.example":`ini`,".env.local":`ini`,".gitignore":`plaintext`,".dockerignore":`plaintext`,".htaccess":`shell`,hosts:`plaintext`,crontab:`shell`,"supervisord.conf":`ini`,"php.ini":`ini`,"my.cnf":`ini`},yt=[{title:`自动`,value:`auto`},{title:`Plain Text`,value:`plaintext`},{title:`PHP`,value:`php`},{title:`JavaScript`,value:`javascript`},{title:`TypeScript`,value:`typescript`},{title:`JSON`,value:`json`},{title:`HTML`,value:`html`},{title:`CSS`,value:`css`},{title:`SCSS`,value:`scss`},{title:`Shell`,value:`shell`},{title:`Python`,value:`python`},{title:`Go`,value:`go`},{title:`Rust`,value:`rust`},{title:`Java`,value:`java`},{title:`C`,value:`c`},{title:`C++`,value:`cpp`},{title:`C#`,value:`csharp`},{title:`SQL`,value:`sql`},{title:`YAML`,value:`yaml`},{title:`TOML`,value:`toml`},{title:`INI / Config`,value:`ini`},{title:`Markdown`,value:`markdown`},{title:`Dockerfile`,value:`dockerfile`},{title:`Nginx`,value:`nginx`},{title:`XML`,value:`xml`},{title:`Vue (HTML)`,value:`html`},{title:`Ruby`,value:`ruby`},{title:`Perl`,value:`perl`},{title:`PowerShell`,value:`powershell`}];function bt(e,t){let n=e.toLowerCase(),r=(t?.split(`/`).pop()??e).toLowerCase();if(vt[r])return vt[r];if(vt[n])return vt[n];if(n.endsWith(`.blade.php`))return`php`;let i=n.split(`.`);if(i.length>2&&i[i.length-1]===`php`&&i.slice(-2).join(`.`)===`blade.php`)return`php`;let a=n.includes(`.`)?n.split(`.`).pop()??``:``;return a&&_t[a]?_t[a]:r.includes(`nginx`)&&(r.endsWith(`.conf`)||r===`nginx.conf`)?`nginx`:`plaintext`}function xt(e,t,n){return n&&n!==`auto`?n:bt(e,t)}var St={class:`text-truncate`,style:{"max-width":`130px`}},Ct={key:0,class:`text-warning ml-1`,style:{"font-size":`10px`}},wt={class:`file-editor-main d-flex flex-grow-1 min-h-0`},Tt={class:`file-editor-content d-flex flex-column flex-grow-1 min-w-0 min-h-0`},Et={class:`file-editor-body flex-grow-1 position-relative min-h-0`},Dt={class:`file-editor-status text-caption px-3 py-1 d-flex flex-wrap align-center ga-3`},Ot={class:`text-mono`},kt={key:0,class:`text-primary`,style:{"font-size":`11px`}},At={class:`text-truncate flex-grow-1 text-medium-emphasis`},jt={key:2,class:`text-warning`},Mt={key:0,class:`text-warning ml-1`},Nt=`nexus_file_editor_float`,Pt=je(_({__name:`FileEditorWorkbench`,props:{serverId:{},currentPath:{}},emits:[`saved`,`closed`,`path-change`,`paste-target`],setup(e,{expose:t,emit:r}){let i=ke(),s=e,u=r,d=Me(),f=Math.min(1120,Math.round(window.innerWidth*.88)),m=Math.min(760,Math.round(window.innerHeight*.82)),{panelStyle:h,startDrag:g,startResize:_,clampToViewport:v}=gt(Nt,{x:Math.max(24,(window.innerWidth-f)/2),y:Math.max(24,(window.innerHeight-m)/2),w:f,h:m}),b=ue([]),x=H(null),C=H(!1),T=H(!1),D=H(!1),O=H(!1),k=H(!1),ne=H(1),ae=H(1),oe=H(s.currentPath||`/www/wwwroot`),se=W(()=>{let e=Q(s.currentPath||`/www/wwwroot`);return e===`/`||e.startsWith(`/www/wwwroot`)?We:e}),ce=H(!0),de=H(!1),M=H(null),N=H(),I=null,fe=null,pe=0;function me(){b.value=b.value.slice()}function ge(e,t){e.modified!==t&&(e.modified=t,me())}let L=H(null),z=H(!1),V=W(()=>b.value.find(e=>e.id===x.value)??null),ve=W(()=>V.value?xt(V.value.name,V.value.path,V.value.languageId):`plaintext`),be=W({get:()=>{let e=V.value?.languageId;return e==null||e===``?`auto`:String(e)},set:e=>{if(!V.value)return;let t=e==null?`auto`:String(e);V.value.languageId=t===`auto`?null:t}}),xe=W(()=>T.value?void 0:h.value),Se=W(()=>z.value?`关闭编辑器`:`关闭文件`),Ce=W(()=>{let e=(L.value?b.value.find(e=>e.id===L.value):b.value.find(e=>e.modified))?.name??`文件`;return z.value?`「${e}」等未保存的更改将丢失,确定吗?`:`「${e}」已修改但未保存,确定要关闭吗?`}),we=W(()=>M.value?b.value.find(e=>e.id===M.value)?.name??``:``);function J(e){return e.replace(/\r\n/g,`
|
||
`).replace(/\r/g,`
|
||
`)}function Ee(e,t){let n=J(e);return t===`CRLF`?n.replace(/\n/g,`\r
|
||
`):n}function De(e){return xt(e.name,e.path,e.languageId)}function je(e){return`${s.serverId}:${Q(e)}`}function Ne(e){let t=Be(Q(e));t&&(oe.value=t)}function Fe(e){oe.value=Q(e),u(`path-change`,oe.value)}function Ie(e){T.value||e.target.closest(`button, .v-tab, .v-btn, input, a`)||g(e)}function Le(){if(!I)return;let e=I.getPosition();ne.value=e?.lineNumber??1,ae.value=e?.column??1}function Re(e=!1){if(!I||!V.value)return;let t=V.value,n=I.saveViewState();t.viewState=n?he(n):null;let r=()=>{!I||V.value?.id!==t.id||(t.content=J(I.getValue()),ge(t,t.content!==t.originalContent))};if(e){fe&&=(clearTimeout(fe),null),r();return}fe&&clearTimeout(fe),fe=setTimeout(r,250)}async function Ve(){let e=++pe;if(await S(),await S(),e!==pe||!V.value)return;Je();let t=(n=0)=>{if(e!==pe||!I)return;I.layout();let r=N.value;r&&(r.clientWidth<2||r.clientHeight<2)&&n<12&&setTimeout(()=>t(n+1),50)};requestAnimationFrame(()=>t())}function He(){pe++,fe&&=(clearTimeout(fe),null),I?.dispose(),I=null,O.value=!1}function $(){for(let e of b.value)e.model?.dispose();b.value=[],x.value=null,He(),T.value=!1,C.value=!1}function Ue(e){let t=V.value;!t||!t.model||(t.languageId=e===`auto`||!e?null:e,i.editor.setModelLanguage(t.model,De(t)))}function qe(e){if(I){if(!e.model){let t=De(e),n=J(e.content);e.model=he(i.editor.createModel(n,t,i.Uri.parse(`nexus://${s.serverId}${e.path}`)))}I.setModel(e.model),e.viewState&&I.restoreViewState(e.viewState),i.editor.setModelLanguage(e.model,De(e)),Ne(e.path),Le()}}function Je(){if(!N.value||!V.value)return;He(),O.value=!1;let e=V.value;if(!e.model){let t=De(e),n=J(e.content);e.model=he(i.editor.createModel(n,t,i.Uri.parse(`nexus://${s.serverId}${e.path}`)))}I=i.editor.create(N.value,{...Ae(),model:e.model,wordWrap:ce.value?`on`:`off`,automaticLayout:!0}),e.viewState&&I.restoreViewState(e.viewState),I.onDidChangeModelContent(()=>{Re(),Le()}),I.onDidChangeCursorPosition(()=>{Le()}),I.addCommand(i.KeyMod.CtrlCmd|i.KeyCode.KeyS,()=>{at()}),I.addCommand(i.KeyCode.Escape,()=>{T.value&&=!1}),I.addCommand(i.KeyMod.Alt|i.KeyCode.KeyZ,()=>{it()}),Ne(e.path),Oe(i),O.value=!0,Le()}function Ye(e){if(typeof e!=`string`||!e)return;Re(!0),x.value=e;let t=b.value.find(t=>t.id===e);t&&(I?qe(t):Ve())}function Xe(e){x.value=e,C.value=!1,S(()=>{v();let t=b.value.find(t=>t.id===e);t&&(I?qe(t):Ve())})}function Ze(e){let t=je(e.path),n=b.value.find(e=>e.id===t);if(n){x.value=t,C.value=!1,Ve().then(()=>{I&&qe(n)});return}try{let n=J(e.content),r=xt(e.name,e.path,null),a=i.Uri.parse(`nexus://${s.serverId}${e.path}`),o=i.editor.getModel(a);o&&o.dispose();let c=he(i.editor.createModel(n,r,a));b.value=[...b.value,{id:t,path:e.path,name:e.name,content:n,originalContent:n,modified:!1,languageId:null,eol:e.eol,etag:e.etag,mtime:e.mtime,model:c,viewState:null}],x.value=t,C.value=!1,Ne(e.path),Ve()}catch(e){d(e instanceof Error?e.message:`无法打开编辑器`,`error`),console.error(`[FileEditorWorkbench] openFile failed`,e)}}function Qe(e){let t=b.value.findIndex(t=>t.id===e);if(!(t<0)){if(b.value[t].model?.dispose(),b.value=b.value.filter(t=>t.id!==e),b.value.length===0){x.value=null,He(),T.value=!1,C.value=!1,u(`closed`);return}if(x.value===e){let e=b.value[Math.min(t,b.value.length-1)];x.value=e.id,Ve().then(()=>{let t=b.value.find(t=>t.id===e.id);t&&I&&qe(t)})}}}function $e(e){let t=b.value.find(t=>t.id===e);if(!t)return;if(x.value===e&&Re(!0),t.modified){L.value=e,z.value=!1,k.value=!0;return}let n=x.value===e;n&&He(),Qe(e),n&&x.value&&Ve()}function et(){if(Re(!0),b.value.some(e=>e.modified)){L.value=null,z.value=!0,k.value=!0;return}$(),u(`closed`)}function tt(){k.value=!1,L.value=null,z.value=!1}function nt(){if(k.value=!1,z.value)$(),u(`closed`);else if(L.value){let e=L.value,t=x.value===e;t&&He(),Qe(e),t&&x.value&&Ve()}L.value=null,z.value=!1}async function rt(){let e=z.value,t=L.value;if(await at(),k.value=!1,z.value=!1,L.value=null,e){b.value.some(e=>e.modified)||($(),u(`closed`));return}if(t){let e=b.value.find(e=>e.id===t);if(e&&!e.modified){let e=x.value===t;e&&He(),Qe(t),e&&x.value&&Ve()}}}function it(){ce.value=!ce.value,I?.updateOptions({wordWrap:ce.value?`on`:`off`})}async function at(e=!1){if(!s.serverId){d(`请先选择服务器`,`error`);return}Re(!0);let t=V.value;if(!t||!t.modified)return;let n=Ee(I?.getValue()??t.content,t.eol);D.value=!0;try{let r=await P.post(`/sync/write-file`,{server_id:s.serverId,path:t.path,content:n,etag:e?null:t.etag}),i=J(n);t.content=i,t.originalContent=i,ge(t,!1),t.etag=r?.etag??null,me(),d(`文件已保存`),u(`saved`,t.path)}catch(e){if(e instanceof le&&e.status===409){M.value=t.id,de.value=!0;return}d(e instanceof le||e instanceof Error?e.message:`保存失败`,`error`)}finally{D.value=!1}}function ot(){de.value=!1,M.value=null}async function st(){de.value=!1;let e=M.value;M.value=null,!(!e||x.value!==e)&&await at(!0)}function ct(){de.value=!1;let e=M.value;if(M.value=null,!e)return;let t=b.value.find(t=>t.id===e);if(t){if(t.content=t.originalContent,ge(t,!1),t.model){let e=Ee(t.originalContent,t.eol);t.model.setValue(J(e))}me(),d(`已放弃本地修改`,`info`)}}ye(()=>s.currentPath,e=>{e&&(oe.value=Q(e))}),ye(T,()=>{S(()=>I?.layout())}),ye(C,e=>{e||S(()=>I?.layout())});function lt(){return b.value.length>0}return t({openFile:Ze,hasOpenTabs:lt}),E(()=>{for(let e of b.value)e.model?.dispose();He()}),(t,r)=>(R(),y(Te,null,[(R(),l(ee,{to:`body`},[b.value.length>0&&!C.value&&V.value?(R(),y(`div`,{key:0,class:q([`file-editor-float`,{"file-editor-float--maximized":T.value}]),style:ie(xe.value)},[F(Z,{border:``,rounded:`lg`,class:`file-editor-panel d-flex flex-column h-100`},{default:B(()=>[w(`div`,{class:q([`file-editor-toolbar d-flex align-center flex-shrink-0`,{"file-editor-toolbar--draggable":!T.value}]),onMousedown:Ie},[T.value?c(``,!0):(R(),l(a,{key:0,size:`16`,class:`ml-2 mr-1 text-disabled file-editor-drag-hint`,onMousedown:r[0]||=j(()=>{},[`stop`])},{default:B(()=>[...r[19]||=[o(` mdi-drag `,-1)]]),_:1})),F(Ke,{"model-value":x.value??void 0,density:`compact`,"show-arrows":``,class:`file-editor-tabs flex-grow-1 min-w-0`,"onUpdate:modelValue":Ye,onMousedown:r[1]||=j(()=>{},[`stop`])},{default:B(()=>[(R(!0),y(Te,null,te(b.value,e=>(R(),l(Ge,{key:e.id,value:e.id,class:`text-none px-2`},{default:B(()=>[w(`span`,St,G(e.name),1),e.modified?(R(),y(`span`,Ct,`●`)):c(``,!0),F(p,{icon:`mdi-close`,size:`x-small`,variant:`text`,class:`ml-1 opacity-60`,density:`compact`,onClick:j(t=>$e(e.id),[`stop`])},null,8,[`onClick`])]),_:2},1032,[`value`]))),128))]),_:1},8,[`model-value`]),F(K,{vertical:``,class:`mx-1`,style:{height:`20px`,"align-self":`center`},onMousedown:r[2]||=j(()=>{},[`stop`])}),F(n,{modelValue:be.value,"onUpdate:modelValue":[r[3]||=e=>be.value=e,Ue],items:A(yt),"item-title":`title`,"item-value":`value`,density:`compact`,variant:`plain`,"hide-details":``,class:`file-editor-lang-select flex-shrink-0`,onMousedown:r[4]||=j(()=>{},[`stop`])},null,8,[`modelValue`,`items`]),F(p,{size:`small`,variant:`text`,color:ce.value?`primary`:void 0,title:ce.value?`关闭自动换行 (Alt+Z)`:`开启自动换行 (Alt+Z)`,density:`compact`,class:`flex-shrink-0 text-none px-2`,onMousedown:r[5]||=j(()=>{},[`stop`]),onClick:it},{default:B(()=>[...r[20]||=[o(` 自动换行 `,-1)]]),_:1},8,[`color`,`title`]),F(K,{vertical:``,class:`mx-1`,style:{height:`20px`,"align-self":`center`},onMousedown:r[6]||=j(()=>{},[`stop`])}),F(p,{size:`small`,variant:`tonal`,"prepend-icon":`mdi-content-save`,loading:D.value,disabled:!V.value?.modified||!O.value,class:`flex-shrink-0 mr-1`,onMousedown:r[7]||=j(()=>{},[`stop`]),onClick:at},{default:B(()=>[...r[21]||=[o(` 保存 `,-1)]]),_:1},8,[`loading`,`disabled`]),F(p,{size:`small`,variant:`text`,icon:T.value?`mdi-fullscreen-exit`:`mdi-fullscreen`,title:T.value?`退出全屏 (Esc)`:`全屏`,density:`compact`,onMousedown:r[8]||=j(()=>{},[`stop`]),onClick:r[9]||=e=>T.value=!T.value},null,8,[`icon`,`title`]),F(p,{size:`small`,variant:`text`,icon:`mdi-window-minimize`,title:`最小化`,density:`compact`,onMousedown:r[10]||=j(()=>{},[`stop`]),onClick:r[11]||=e=>C.value=!0}),F(p,{size:`small`,variant:`text`,icon:`mdi-close`,title:`关闭编辑器`,density:`compact`,class:`mr-1`,onMousedown:r[12]||=j(()=>{},[`stop`]),onClick:et})],34),w(`div`,wt,[w(`aside`,{class:`file-editor-sidebar flex-shrink-0`,onMousedown:r[14]||=j(()=>{},[`stop`])},[F(pt,{embedded:``,"server-id":e.serverId||null,"root-path":se.value,"current-path":oe.value,onNavigate:Fe,onPasteTarget:r[13]||=e=>u(`paste-target`,e)},null,8,[`server-id`,`root-path`,`current-path`])],32),w(`div`,Tt,[w(`div`,Et,[O.value?c(``,!0):(R(),l(_e,{key:0,indeterminate:``,absolute:``,class:`file-editor-progress`})),w(`div`,{ref_key:`editorHost`,ref:N,class:`file-editor-host`},null,512)]),w(`div`,Dt,[w(`span`,Ot,G(ne.value)+`:`+G(ae.value),1),F(K,{vertical:``,style:{height:`12px`}}),w(`span`,null,G(ve.value),1),F(K,{vertical:``,style:{height:`12px`}}),ce.value?(R(),y(`span`,kt,`换行`)):c(``,!0),ce.value?(R(),l(K,{key:1,vertical:``,style:{height:`12px`}})):c(``,!0),w(`span`,At,G(V.value?.path??``),1),V.value?.modified?(R(),y(`span`,jt,`未保存`)):c(``,!0)])])]),T.value?c(``,!0):(R(),y(`div`,{key:0,class:`file-editor-resize`,title:`拖动调整大小`,onMousedown:r[15]||=j((...e)=>A(_)&&A(_)(...e),[`stop`])},null,32))]),_:1})],6)):c(``,!0),b.value.length>0&&C.value?(R(),l(Z,{key:1,border:``,rounded:`lg`,class:`file-editor-dock`},{default:B(()=>[r[22]||=w(`span`,{class:`text-caption text-medium-emphasis mr-2`},`编辑器`,-1),(R(!0),y(Te,null,te(b.value,e=>(R(),l(re,{key:e.id,size:`small`,color:e.id===x.value?`primary`:void 0,variant:`tonal`,class:`cursor-pointer`,onClick:t=>Xe(e.id)},{default:B(()=>[o(G(e.name)+` `,1),e.modified?(R(),y(`span`,Mt,`●`)):c(``,!0)]),_:2},1032,[`color`,`onClick`]))),128)),F(U),F(p,{size:`x-small`,variant:`text`,icon:`mdi-dock-window`,title:`展开`,onClick:r[16]||=e=>C.value=!1}),F(p,{size:`x-small`,variant:`text`,icon:`mdi-close`,title:`关闭全部`,onClick:et})]),_:1})):c(``,!0)])),F(ze,{modelValue:k.value,"onUpdate:modelValue":r[17]||=e=>k.value=e,"max-width":`400`},{default:B(()=>[F(Z,{border:``},{default:B(()=>[F(Y,null,{default:B(()=>[o(G(Se.value),1)]),_:1}),F(X,null,{default:B(()=>[o(G(Ce.value),1)]),_:1}),F(Pe,null,{default:B(()=>[F(U),F(p,{variant:`text`,onClick:tt},{default:B(()=>[...r[23]||=[o(`取消`,-1)]]),_:1}),F(p,{color:`error`,variant:`flat`,onClick:nt},{default:B(()=>[...r[24]||=[o(`不保存`,-1)]]),_:1}),F(p,{color:`primary`,variant:`flat`,onClick:rt},{default:B(()=>[...r[25]||=[o(`保存`,-1)]]),_:1})]),_:1})]),_:1})]),_:1},8,[`modelValue`]),F(ze,{modelValue:de.value,"onUpdate:modelValue":r[18]||=e=>de.value=e,"max-width":`440`,persistent:``},{default:B(()=>[F(Z,{border:``},{default:B(()=>[F(Y,{class:`text-warning`},{default:B(()=>[F(a,{start:``},{default:B(()=>[...r[26]||=[o(`mdi-alert-outline`,-1)]]),_:1}),r[27]||=o(` 文件冲突 `,-1)]),_:1}),F(X,null,{default:B(()=>[o(` 「`+G(we.value)+`」已被外部修改。`,1),r[28]||=w(`br`,null,null,-1),r[29]||=w(`strong`,null,`覆盖`,-1),r[30]||=o(`会以当前编辑内容覆盖服务器版本;`,-1),r[31]||=w(`strong`,null,`放弃`,-1),r[32]||=o(`会丢弃本地修改。 `,-1)]),_:1}),F(Pe,null,{default:B(()=>[F(U),F(p,{variant:`text`,onClick:ot},{default:B(()=>[...r[33]||=[o(`取消`,-1)]]),_:1}),F(p,{color:`error`,variant:`flat`,onClick:ct},{default:B(()=>[...r[34]||=[o(`放弃本地修改`,-1)]]),_:1}),F(p,{color:`warning`,variant:`flat`,onClick:st},{default:B(()=>[...r[35]||=[o(`强制覆盖`,-1)]]),_:1})]),_:1})]),_:1})]),_:1},8,[`modelValue`])],64))}}),[[`__scopeId`,`data-v-509107ff`]]);function Ft(e){return e==null?``:String(e).trim()}function It(e){if(e.type===`symlink`)return`—`;let t=Ft(e.owner),n=Ft(e.group);return t?!n||n===t?t:`${t}:${n}`:`—`}function Lt(e){if(e===`root`)return`warning`}function Rt(e){let t=[];e.permissions&&t.push(e.permissions),e.mode_octal&&t.push(e.mode_octal);let n=Ft(e.owner),r=Ft(e.group);return n&&t.push(r&&r!==n?`${n}:${r}`:n),t.join(` · `)||`—`}var zt=[{label:`文件 644`,mode:`644`,for:`file`},{label:`目录 755`,mode:`755`,for:`directory`},{label:`私密 600`,mode:`600`,for:`file`},{label:`协作 775`,mode:`775`,for:`directory`},{label:`可执行 755`,mode:`755`,for:`file`}],Bt=`docs/deploy/nexus-files-sudoers.example`;function Vt(e){let t=e.toLowerCase();return t.includes(`permission denied`)||t.includes(`operation not permitted`)||t.includes(`无法访问`)||t.includes(`无权限`)||t.includes(`无写入权限`)||t.includes(`读取失败`)||t.includes(`chmod 失败`)}function Ht(e,t){if(!t||t===`root`||e.type!==`file`)return!1;let n=e.permissions??``;if(n.length<10)return!1;let r=Ft(e.owner),i=Ft(e.group),a=n.slice(1,4),o=n.slice(4,7),s=n.slice(7,10);return r===t?!a.includes(`r`):(i&&i===t||!s.includes(`r`))&&!o.includes(`r`)}function Ut(){return`目标机安装示例:${Bt}(复制到 /etc/sudoers.d/nexus-files 后执行 visudo -cf 校验)`}function Wt(e){if(e.isRootSsh)return null;let t=[],n=e.unreadableCount??0;if(e.lastReadDeniedPath&&t.push(`无法读取「${e.lastReadDeniedPath}」:当前 SSH 用户无权限。`),n>0&&e.sshUser&&t.push(`当前目录约 ${n} 个文件对 SSH 用户「${e.sshUser}」不可读。`),t.length>0&&(e.filesElevation===`off`?t.push(`此服务器「文件提权」已关闭,不会自动 sudo。`):e.canSudo?e.whitelistOk?t.push(`系统已自动尝试 sudo -n 提权,如仍失败请检查 sudoers 白名单。`):t.push(`已有 sudo 但白名单不完整(须含 bash、chmod、chown、tee、cat 等)。`):t.push(`请配置免密 sudo(NOPASSWD)或使用「一键配置」,或改用 root SSH 用户。`)),!t.length)return null;let r=e.filesElevation===`off`||!e.canSudo||!e.whitelistOk?` ${Ut()}`:``;return{type:!e.canSudo||e.filesElevation===`off`?`error`:`warning`,text:`${t.join(` `)}${r}`}}var Gt={key:0,class:`text-body-2 mb-3 text-medium-emphasis`},Kt={key:1,class:`text-caption mb-4`},qt={class:`d-flex flex-wrap ga-2 mb-4`},Jt={class:`d-flex align-center flex-wrap ga-2 mb-2`},Yt={class:`text-body-2`},Xt={key:0,class:`text-caption mt-1`},Zt={class:`text-caption text-medium-emphasis mb-0`},Qt=_({__name:`FilePermissionDialog`,props:{modelValue:{type:Boolean},file:{},serverId:{},loading:{type:Boolean}},emits:[`update:modelValue`,`apply`],setup(e,{emit:t}){let n=e,r=t,i=H(``),a=H(``),s=H(``),u=H(``),f=H(``),m=H(``),h=H(null),g=H(!1),_=H(!1),v=W(()=>n.file?.type===`directory`),b=W(()=>n.file?.name??``),x=W(()=>n.file?Rt(n.file):``),S=W(()=>{let e=n.file?.type===`directory`?`directory`:`file`;return zt.filter(t=>t.for===e||t.for===`file`)}),C=W(()=>h.value?h.value.is_root||h.value.can_sudo_nopasswd&&h.value.whitelist_ok?`success`:h.value.can_sudo_nopasswd?`warning`:`error`:`info`);ye(()=>[n.modelValue,n.file],([e,t])=>{if(!e||!t)return;let r=t.owner||``,o=t.group||``;i.value=t.mode_octal||``,a.value=r,s.value=o&&o!==r?o:``,u.value=i.value,f.value=r,m.value=o,_.value=!1,h.value=null,n.serverId&&T()});function ee(e){return e===`off`?`关闭提权`:e===`always_sudo`?`始终 sudo`:`自动 sudo`}async function T(){if(n.serverId){g.value=!0;try{h.value=await P.get(`/servers/${n.serverId}/files-capability`)}catch(e){h.value={ssh_user:``,is_root:!1,files_elevation:`auto_sudo`,can_sudo_nopasswd:!1,whitelist_ok:!1,message:e instanceof Error?e.message:`检测失败`,docs_path:`docs/deploy/nexus-files-sudoers.example`}}finally{g.value=!1}}}function E(e){return t=>!!String(t||``).trim()||`${e}不能为空`}function D(e){return/^[0-7]{3,4}$/.test(String(e||``).trim())||`格式: 3–4 位八进制`}let O=/^[a-zA-Z0-9_.-]+$/;function k(e){let t=String(e||``).trim();return t?O.test(t)||`仅允许字母、数字、._-`:!0}function ne(e){let t=String(e||``).trim();return t?a.value.trim()?O.test(t)||`仅允许字母、数字、._-`:`请先填写属主`:!0}function ie(e){i.value=e}function j(){let e=i.value.trim();if(!/^[0-7]{3,4}$/.test(e))return;let t=a.value.trim(),o=s.value.trim(),c=v.value&&_.value,l=t!==f.value.trim(),u=o!==(m.value.trim()&&m.value.trim()!==f.value.trim()?m.value.trim():``);if(c){let t=n.file?.name??`该目录`;if(!window.confirm(`确认对目录「${t}」及其全部子项递归应用权限 ${e}?此操作影响范围大且不可自动撤销。`))return}r(`apply`,{mode:e,owner:(l||u)&&t||void 0,group:u&&o||void 0,recursive:c||void 0})}return(t,n)=>(R(),l(ze,{"model-value":e.modelValue,"max-width":`520`,"onUpdate:modelValue":n[5]||=e=>r(`update:modelValue`,e)},{default:B(()=>[F(Z,{border:``},{default:B(()=>[F(Y,null,{default:B(()=>[...n[6]||=[o(`修改权限`,-1)]]),_:1}),F(X,null,{default:B(()=>[b.value?(R(),y(`p`,Gt,G(b.value),1)):c(``,!0),x.value?(R(),y(`p`,Kt,` 当前:`+G(x.value),1)):c(``,!0),w(`div`,qt,[(R(!0),y(Te,null,te(S.value,e=>(R(),l(re,{key:e.mode+e.label,size:`small`,variant:`tonal`,color:`primary`,onClick:t=>ie(e.mode)},{default:B(()=>[o(G(e.label),1)]),_:2},1032,[`onClick`]))),128))]),F(Ie,{modelValue:i.value,"onUpdate:modelValue":n[0]||=e=>i.value=e,label:`八进制权限`,variant:`outlined`,density:`compact`,placeholder:`644 / 755`,rules:[E(`权限`),D],class:`mb-2`,onKeydown:J(j,[`enter`])},null,8,[`modelValue`,`rules`]),F(Ie,{modelValue:a.value,"onUpdate:modelValue":n[1]||=e=>a.value=e,label:`属主(可选)`,variant:`outlined`,density:`compact`,placeholder:`www`,rules:[k],class:`mb-2`},null,8,[`modelValue`,`rules`]),F(Ie,{modelValue:s.value,"onUpdate:modelValue":n[2]||=e=>s.value=e,label:`属组(可选)`,variant:`outlined`,density:`compact`,placeholder:`www`,rules:[ne],class:`mb-2`},null,8,[`modelValue`,`rules`]),v.value?(R(),l(Fe,{key:2,modelValue:_.value,"onUpdate:modelValue":n[3]||=e=>_.value=e,label:`同时修改子项(递归 chmod/chown)`,density:`compact`,"hide-details":``,color:`warning`,class:`mb-2`},null,8,[`modelValue`])):c(``,!0),F(K,{class:`my-4`}),w(`div`,Jt,[n[8]||=w(`span`,{class:`text-caption text-medium-emphasis`},`提权能力`,-1),F(p,{size:`small`,variant:`tonal`,loading:g.value,disabled:!e.serverId,onClick:T},{default:B(()=>[...n[7]||=[o(` 检测提权能力 `,-1)]]),_:1},8,[`loading`,`disabled`])]),h.value?(R(),l(d,{key:3,type:C.value,variant:`tonal`,density:`compact`,class:`mb-2`},{default:B(()=>[w(`div`,Yt,G(h.value.message),1),h.value.ssh_user?(R(),y(`div`,Xt,` SSH 用户:`+G(h.value.ssh_user)+` · 策略:`+G(ee(h.value.files_elevation)),1)):c(``,!0)]),_:1},8,[`type`])):c(``,!0),w(`p`,Zt,[n[9]||=o(` 非 root 用户写/chmod 失败时将按服务器策略尝试 `,-1),n[10]||=w(`code`,null,`sudo -n`,-1),o(`。 `+G(A(Ut)()),1)])]),_:1}),F(Pe,null,{default:B(()=>[F(U),F(p,{variant:`text`,onClick:n[4]||=e=>r(`update:modelValue`,!1)},{default:B(()=>[...n[11]||=[o(`取消`,-1)]]),_:1}),F(p,{color:`primary`,variant:`flat`,loading:e.loading,onClick:j},{default:B(()=>[...n[12]||=[o(`应用`,-1)]]),_:1},8,[`loading`])]),_:1})]),_:1})]),_:1},8,[`model-value`]))}}),$t={class:`text-body-2 mb-3`},en={class:`text-body-2 mb-2 text-truncate`},tn={class:`text-truncate`},nn={key:1,class:`files-preview-body text-body-2`},rn=je(_({__name:`FilesDialogs`,setup(e){let t=$e();return(e,r)=>(R(),y(Te,null,[F(ze,{modelValue:A(t).showUpload,"onUpdate:modelValue":r[2]||=e=>A(t).showUpload=e,"max-width":`500`},{default:B(()=>[F(Z,{border:``},{default:B(()=>[F(Y,null,{default:B(()=>[...r[25]||=[o(`上传文件`,-1)]]),_:1}),F(X,null,{default:B(()=>[F(qe,{modelValue:A(t).uploadFiles,"onUpdate:modelValue":r[0]||=e=>A(t).uploadFiles=e,label:`选择文件`,variant:`outlined`,multiple:``,"show-size":``},null,8,[`modelValue`])]),_:1}),F(Pe,null,{default:B(()=>[F(U),F(p,{variant:`text`,onClick:r[1]||=e=>A(t).showUpload=!1},{default:B(()=>[...r[26]||=[o(`取消`,-1)]]),_:1}),F(p,{color:`primary`,variant:`flat`,loading:A(t).uploading,onClick:A(t).doUpload},{default:B(()=>[...r[27]||=[o(`上传`,-1)]]),_:1},8,[`loading`,`onClick`])]),_:1})]),_:1})]),_:1},8,[`modelValue`]),F(ze,{modelValue:A(t).showNewFile,"onUpdate:modelValue":r[5]||=e=>A(t).showNewFile=e,"max-width":`400`},{default:B(()=>[F(Z,{border:``},{default:B(()=>[F(Y,null,{default:B(()=>[...r[28]||=[o(`新建文件`,-1)]]),_:1}),F(X,null,{default:B(()=>[F(Ie,{modelValue:A(t).newFileName,"onUpdate:modelValue":r[3]||=e=>A(t).newFileName=e,label:`文件名`,variant:`outlined`,density:`compact`,rules:[A(t).validatePathSegment],placeholder:`example.conf`,autofocus:``,onKeydown:J(A(t).doNewFile,[`enter`])},null,8,[`modelValue`,`rules`,`onKeydown`])]),_:1}),F(Pe,null,{default:B(()=>[F(U),F(p,{variant:`text`,onClick:r[4]||=e=>A(t).showNewFile=!1},{default:B(()=>[...r[29]||=[o(`取消`,-1)]]),_:1}),F(p,{color:`primary`,variant:`flat`,loading:A(t).actionLoading,onClick:A(t).doNewFile},{default:B(()=>[...r[30]||=[o(`创建`,-1)]]),_:1},8,[`loading`,`onClick`])]),_:1})]),_:1})]),_:1},8,[`modelValue`]),F(ze,{modelValue:A(t).showMkdir,"onUpdate:modelValue":r[8]||=e=>A(t).showMkdir=e,"max-width":`400`},{default:B(()=>[F(Z,{border:``},{default:B(()=>[F(Y,null,{default:B(()=>[...r[31]||=[o(`新建目录`,-1)]]),_:1}),F(X,null,{default:B(()=>[F(Ie,{modelValue:A(t).mkdirName,"onUpdate:modelValue":r[6]||=e=>A(t).mkdirName=e,label:`目录名`,variant:`outlined`,density:`compact`,rules:[A(t).validatePathSegment],onKeydown:J(A(t).doMkdir,[`enter`])},null,8,[`modelValue`,`rules`,`onKeydown`])]),_:1}),F(Pe,null,{default:B(()=>[F(U),F(p,{variant:`text`,onClick:r[7]||=e=>A(t).showMkdir=!1},{default:B(()=>[...r[32]||=[o(`取消`,-1)]]),_:1}),F(p,{color:`primary`,variant:`flat`,onClick:A(t).doMkdir},{default:B(()=>[...r[33]||=[o(`创建`,-1)]]),_:1},8,[`onClick`])]),_:1})]),_:1})]),_:1},8,[`modelValue`]),F(ze,{modelValue:A(t).showFileDelete,"onUpdate:modelValue":r[10]||=e=>A(t).showFileDelete=e,"max-width":`400`},{default:B(()=>[F(Z,{border:``},{default:B(()=>[F(Y,null,{default:B(()=>[...r[34]||=[o(`确认删除`,-1)]]),_:1}),F(X,null,{default:B(()=>[r[35]||=o(` 确定要删除 `,-1),w(`strong`,null,G(A(t).deletingFile?.name),1),r[36]||=o(` 吗? `,-1)]),_:1}),F(Pe,null,{default:B(()=>[F(U),F(p,{variant:`text`,onClick:r[9]||=e=>A(t).showFileDelete=!1},{default:B(()=>[...r[37]||=[o(`取消`,-1)]]),_:1}),F(p,{color:`error`,variant:`flat`,onClick:A(t).doDeleteFile},{default:B(()=>[...r[38]||=[o(`删除`,-1)]]),_:1},8,[`onClick`])]),_:1})]),_:1})]),_:1},8,[`modelValue`]),F(ze,{modelValue:A(t).showRename,"onUpdate:modelValue":r[13]||=e=>A(t).showRename=e,"max-width":`400`},{default:B(()=>[F(Z,{border:``},{default:B(()=>[F(Y,null,{default:B(()=>[...r[39]||=[o(`重命名`,-1)]]),_:1}),F(X,null,{default:B(()=>[F(Ie,{modelValue:A(t).newName,"onUpdate:modelValue":r[11]||=e=>A(t).newName=e,label:`新名称`,variant:`outlined`,density:`compact`,rules:[A(t).required(`名称`)],autofocus:``,onKeydown:J(A(t).doRename,[`enter`])},null,8,[`modelValue`,`rules`,`onKeydown`])]),_:1}),F(Pe,null,{default:B(()=>[F(U),F(p,{variant:`text`,onClick:r[12]||=e=>A(t).showRename=!1},{default:B(()=>[...r[40]||=[o(`取消`,-1)]]),_:1}),F(p,{color:`primary`,variant:`flat`,onClick:A(t).doRename},{default:B(()=>[...r[41]||=[o(`确定`,-1)]]),_:1},8,[`onClick`])]),_:1})]),_:1})]),_:1},8,[`modelValue`]),F(Qt,{modelValue:A(t).showChmod,"onUpdate:modelValue":r[14]||=e=>A(t).showChmod=e,file:A(t).chmodFile,"server-id":A(t).selectedServer,loading:A(t).chmodLoading,onApply:A(t).doChmod},null,8,[`modelValue`,`file`,`server-id`,`loading`,`onApply`]),F(ze,{modelValue:A(t).showCompress,"onUpdate:modelValue":r[18]||=e=>A(t).showCompress=e,"max-width":`440`},{default:B(()=>[F(Z,{border:``},{default:B(()=>[F(Y,null,{default:B(()=>[...r[42]||=[o(`压缩`,-1)]]),_:1}),F(X,null,{default:B(()=>[w(`p`,$t,`将压缩 `+G(A(t).compressPaths.length)+` 项到当前目录`,1),F(Ie,{modelValue:A(t).compressDest,"onUpdate:modelValue":r[15]||=e=>A(t).compressDest=e,label:`压缩包路径`,variant:`outlined`,density:`compact`},null,8,[`modelValue`]),F(n,{modelValue:A(t).compressFormat,"onUpdate:modelValue":r[16]||=e=>A(t).compressFormat=e,items:[{title:`tar.gz`,value:`tar.gz`},{title:`zip`,value:`zip`}],"item-title":`title`,"item-value":`value`,label:`格式`,variant:`outlined`,density:`compact`},null,8,[`modelValue`])]),_:1}),F(Pe,null,{default:B(()=>[F(U),F(p,{variant:`text`,onClick:r[17]||=e=>A(t).showCompress=!1},{default:B(()=>[...r[43]||=[o(`取消`,-1)]]),_:1}),F(p,{color:`primary`,variant:`flat`,loading:A(t).actionLoading,onClick:A(t).doCompress},{default:B(()=>[...r[44]||=[o(`压缩`,-1)]]),_:1},8,[`loading`,`onClick`])]),_:1})]),_:1})]),_:1},8,[`modelValue`]),F(ze,{modelValue:A(t).showDecompress,"onUpdate:modelValue":r[21]||=e=>A(t).showDecompress=e,"max-width":`440`},{default:B(()=>[F(Z,{border:``},{default:B(()=>[F(Y,null,{default:B(()=>[...r[45]||=[o(`解压`,-1)]]),_:1}),F(X,null,{default:B(()=>[w(`p`,en,G(A(t).decompressSource),1),F(Ie,{modelValue:A(t).decompressDest,"onUpdate:modelValue":r[19]||=e=>A(t).decompressDest=e,label:`解压到目录`,variant:`outlined`,density:`compact`},null,8,[`modelValue`])]),_:1}),F(Pe,null,{default:B(()=>[F(U),F(p,{variant:`text`,onClick:r[20]||=e=>A(t).showDecompress=!1},{default:B(()=>[...r[46]||=[o(`取消`,-1)]]),_:1}),F(p,{color:`primary`,variant:`flat`,loading:A(t).actionLoading,onClick:A(t).doDecompress},{default:B(()=>[...r[47]||=[o(`解压`,-1)]]),_:1},8,[`loading`,`onClick`])]),_:1})]),_:1})]),_:1},8,[`modelValue`]),F(ze,{modelValue:A(t).showPreview,"onUpdate:modelValue":r[24]||=e=>A(t).showPreview=e,"max-width":`900`,scrollable:``},{default:B(()=>[F(Z,{border:``},{default:B(()=>[F(Y,{class:`d-flex align-center`},{default:B(()=>[w(`span`,tn,G(A(t).previewTitle),1),F(U),F(p,{icon:`mdi-close`,variant:`text`,onClick:r[22]||=e=>A(t).showPreview=!1})]),_:1}),F(K),F(X,{style:{"max-height":`70vh`}},{default:B(()=>[A(t).previewLoading?(R(),l(_e,{key:0,indeterminate:``,class:`mb-2`})):(R(),y(`pre`,nn,G(A(t).previewContent),1))]),_:1}),F(Pe,null,{default:B(()=>[F(U),F(p,{variant:`text`,onClick:r[23]||=e=>A(t).showPreview=!1},{default:B(()=>[...r[48]||=[o(`关闭`,-1)]]),_:1})]),_:1})]),_:1})]),_:1},8,[`modelValue`])],64))}}),[[`__scopeId`,`data-v-110ea120`]]),an=`nexus:files:last_server_id`,on=`nexus:files-hint-dismissed`,sn=[{value:25,title:`25`},{value:50,title:`50`},{value:100,title:`100`},{value:250,title:`250`},...Ne.filter(e=>e.value===-1)],cn=5e3,ln={class:`d-flex align-center ga-2 min-w-0`},un={class:`min-w-0`},dn={key:0,class:`text-caption text-medium-emphasis text-truncate`},fn={class:`text-medium-emphasis`},pn={class:`text-medium-emphasis`},mn={class:`files-row-actions`},hn={key:0,class:`text-center text-medium-emphasis py-8`},gn={key:0,class:`text-caption mt-2 text-disabled`},_n=je(_({__name:`FilesList`,setup(t){let n=$e();return(t,r)=>(R(),y(Te,null,[F(Z,{elevation:`0`,border:``,rounded:`lg`,class:q([`position-relative`,{"files-drop-active":A(n).dropActive}]),onDragenter:r[1]||=j(e=>A(n).dropActive=!0,[`prevent`]),onDragover:r[2]||=j(e=>A(n).dropActive=!0,[`prevent`]),onDragleave:r[3]||=j(e=>A(n).dropActive=!1,[`prevent`]),onDrop:j(A(n).onDropFiles,[`prevent`])},{default:B(()=>[A(n).loadingVisible?(R(),l(_e,{key:0,indeterminate:``,color:`primary`,height:`2`,class:`files-table-progress`})):c(``,!0),F(e,{modelValue:A(n).selectedFiles,"onUpdate:modelValue":r[0]||=e=>A(n).selectedFiles=e,items:A(n).displayedFiles,headers:A(n).fileHeaders,loading:A(n).loadingVisible,"items-per-page":A(50),"items-per-page-options":[...A(sn)],"show-select":``,"return-object":``,hover:``,density:`compact`,"item-value":`name`,"row-props":A(n).fileRowProps},{"item.name":B(({item:e})=>[w(`div`,ln,[F(a,{color:A(n).entryIconColor(e),size:`18`},{default:B(()=>[o(G(A(n).entryIcon(e)),1)]),_:2},1032,[`color`]),A(n).isEntryLikelyUnreadable(e,A(n).sshUserForFiles)?(R(),l(a,{key:0,size:`18`,color:`warning`,title:`当前 SSH 用户可能无法读取`},{default:B(()=>[...r[20]||=[o(` mdi-shield-lock `,-1)]]),_:1})):c(``,!0),w(`div`,un,[w(`span`,{class:q({"font-weight-medium":e.type===`directory`})},G(e.name),3),e.type===`symlink`&&e.link_target?(R(),y(`div`,dn,` → `+G(e.link_target),1)):c(``,!0)])])]),"item.owner":B(({item:e})=>[F(Je,{text:A(n).permissionTooltip(e),location:`top`},{activator:B(({props:t})=>[F(re,m(t,{size:`small`,variant:`tonal`,color:A(n).ownerChipColor(e.owner||``),class:`text-none`}),{default:B(()=>[o(G(A(n).formatOwnerChip(e)),1)]),_:2},1040,[`color`])]),_:2},1032,[`text`])]),"item.size":B(({item:e})=>[w(`span`,fn,G(e.type===`directory`?`—`:A(n).formatSize(e.size)),1)]),"item.modified":B(({item:e})=>[w(`span`,pn,G(e.modified||`—`),1)]),"item.actions":B(({item:e})=>[w(`div`,mn,[A(n).isRegularFile(e)?(R(),l(p,{key:0,variant:`text`,size:`x-small`,color:`primary`,density:`compact`,onClick:j(t=>A(n).editFile(e),[`stop`])},{default:B(()=>[...r[21]||=[o(` 编辑 `,-1)]]),_:1},8,[`onClick`])):c(``,!0),A(n).isRegularFile(e)?(R(),l(p,{key:1,variant:`text`,size:`x-small`,density:`compact`,onClick:j(t=>A(n).previewFile(e),[`stop`])},{default:B(()=>[...r[22]||=[o(` 查看 `,-1)]]),_:1},8,[`onClick`])):c(``,!0),F(p,{variant:`text`,size:`x-small`,color:`error`,density:`compact`,onClick:j(t=>A(n).confirmDeleteFile(e),[`stop`])},{default:B(()=>[...r[23]||=[o(` 删除 `,-1)]]),_:1},8,[`onClick`])])]),"no-data":B(()=>[A(n).pageReady&&!A(n).loading&&!A(n).loadingVisible&&A(n).files.length===0?(R(),y(`div`,hn,[F(a,{size:`40`,class:`mb-2`},{default:B(()=>[...r[24]||=[o(`mdi-folder-open-outline`,-1)]]),_:1}),w(`div`,null,G(A(n).emptyHint),1),A(n).selectedServer?(R(),y(`div`,gn,` 单击目录进入 · 双击文件编辑 · Ctrl+A 全选 · Ctrl+C/V 复制粘贴 `)):c(``,!0)])):c(``,!0)]),_:1},8,[`modelValue`,`items`,`headers`,`loading`,`items-per-page`,`items-per-page-options`,`row-props`])]),_:1},8,[`class`,`onDrop`]),F(z,{modelValue:A(n).showContextMenu,"onUpdate:modelValue":r[19]||=e=>A(n).showContextMenu=e,target:[A(n).contextX,A(n).contextY],location:`bottom start`},{default:B(()=>[F(xe,{density:`compact`,nav:``},{default:B(()=>[A(n).contextFile&&A(n).contextFile.type===`directory`?(R(),l(N,{key:0,"prepend-icon":`mdi-folder-open`,onClick:r[4]||=e=>A(n).contextAction(`open`)},{default:B(()=>[F(M,null,{default:B(()=>[...r[25]||=[o(`打开`,-1)]]),_:1})]),_:1})):c(``,!0),A(n).contextFile&&A(n).isRegularFile(A(n).contextFile)?(R(),l(N,{key:1,"prepend-icon":`mdi-pencil`,onClick:r[5]||=e=>A(n).contextAction(`edit`)},{default:B(()=>[F(M,null,{default:B(()=>[...r[26]||=[o(`编辑`,-1)]]),_:1})]),_:1})):c(``,!0),A(n).contextFile&&A(n).isRegularFile(A(n).contextFile)?(R(),l(N,{key:2,"prepend-icon":`mdi-eye`,onClick:r[6]||=e=>A(n).contextAction(`preview`)},{default:B(()=>[F(M,null,{default:B(()=>[...r[27]||=[o(`查看`,-1)]]),_:1})]),_:1})):c(``,!0),A(n).contextFile?(R(),l(N,{key:3,"prepend-icon":`mdi-content-copy`,onClick:r[7]||=e=>A(n).contextAction(`copy`)},{default:B(()=>[F(M,null,{default:B(()=>[...r[28]||=[o(`复制 (Ctrl+C)`,-1)]]),_:1})]),_:1})):c(``,!0),A(n).contextFile?(R(),l(N,{key:4,"prepend-icon":`mdi-content-cut`,onClick:r[8]||=e=>A(n).contextAction(`cut`)},{default:B(()=>[F(M,null,{default:B(()=>[...r[29]||=[o(`剪切 (Ctrl+X)`,-1)]]),_:1})]),_:1})):c(``,!0),F(N,{"prepend-icon":`mdi-content-paste`,disabled:!A(n).canPasteHere,onClick:r[9]||=e=>A(n).contextAction(`paste`)},{default:B(()=>[F(M,null,{default:B(()=>[...r[30]||=[o(`粘贴到当前目录 (Ctrl+V)`,-1)]]),_:1})]),_:1},8,[`disabled`]),A(n).contextFile?.type===`directory`&&A(n).canPasteHere?(R(),l(N,{key:5,"prepend-icon":`mdi-folder-arrow-down`,onClick:r[10]||=e=>A(n).contextAction(`pasteInto`)},{default:B(()=>[F(M,null,{default:B(()=>[o(`粘贴到「`+G(A(n).contextFile.name)+`」`,1)]),_:1})]),_:1})):c(``,!0),F(N,{"prepend-icon":`mdi-link-variant`,onClick:r[11]||=e=>A(n).contextAction(`copyPath`)},{default:B(()=>[F(M,null,{default:B(()=>[...r[31]||=[o(`复制路径`,-1)]]),_:1})]),_:1}),F(N,{"prepend-icon":`mdi-console`,onClick:r[12]||=e=>A(n).contextAction(`terminal`)},{default:B(()=>[F(M,null,{default:B(()=>[...r[32]||=[o(`终端`,-1)]]),_:1})]),_:1}),F(K),A(n).contextFile?(R(),l(N,{key:6,"prepend-icon":`mdi-server-network`,onClick:r[13]||=e=>A(n).contextAction(`sendToServer`)},{default:B(()=>[F(M,null,{default:B(()=>[...r[33]||=[o(`发送到其他服务器`,-1)]]),_:1})]),_:1})):c(``,!0),A(n).contextFile&&(A(n).isRegularFile(A(n).contextFile)||A(n).contextFile.type===`directory`)?(R(),l(N,{key:7,"prepend-icon":`mdi-zip-box`,onClick:r[14]||=e=>A(n).contextAction(`compress`)},{default:B(()=>[F(M,null,{default:B(()=>[...r[34]||=[o(`压缩`,-1)]]),_:1})]),_:1})):c(``,!0),A(n).contextFile&&A(n).isArchiveName(A(n).contextFile.name)?(R(),l(N,{key:8,"prepend-icon":`mdi-package-up`,onClick:r[15]||=e=>A(n).contextAction(`decompress`)},{default:B(()=>[F(M,null,{default:B(()=>[...r[35]||=[o(`解压`,-1)]]),_:1})]),_:1})):c(``,!0),F(K),F(N,{"prepend-icon":`mdi-file-rename-box`,onClick:r[16]||=e=>A(n).contextAction(`rename`)},{default:B(()=>[F(M,null,{default:B(()=>[...r[36]||=[o(`重命名`,-1)]]),_:1})]),_:1}),F(N,{"prepend-icon":`mdi-lock`,onClick:r[17]||=e=>A(n).contextAction(`chmod`)},{default:B(()=>[F(M,null,{default:B(()=>[...r[37]||=[o(`修改权限`,-1)]]),_:1})]),_:1}),F(K),F(N,{"prepend-icon":`mdi-delete`,onClick:r[18]||=e=>A(n).contextAction(`delete`)},{default:B(()=>[F(M,{class:`text-error`},{default:B(()=>[...r[38]||=[o(`删除`,-1)]]),_:1})]),_:1})]),_:1})]),_:1},8,[`modelValue`,`target`])],64))}}),[[`__scopeId`,`data-v-d6579a39`]]),vn={class:`d-flex flex-wrap align-center justify-space-between ga-2`},yn=_({__name:`FilesPermissionAlert`,setup(e){let t=$e();return(e,n)=>A(t).filesAccessHint?(R(),l(d,{key:0,type:A(t).filesAccessHint.type,variant:`tonal`,closable:``,prominent:``,density:`comfortable`,class:`mb-4`,icon:`mdi-shield-lock-outline`,"onClick:close":A(t).dismissFilesAccessHint},{default:B(()=>[w(`div`,vn,[w(`span`,null,G(A(t).filesAccessHint.text.split(`目标机安装示例`)[0].trim()),1),A(t).sshUserForFiles&&A(t).sshUserForFiles!==`root`?(R(),l(p,{key:0,size:`small`,variant:`flat`,color:`primary`,"prepend-icon":`mdi-auto-fix`,loading:A(t).setupSudoLoading,disabled:A(t).setupSudoDone,onClick:j(A(t).setupFilesSudo,[`stop`])},{default:B(()=>[o(G(A(t).setupSudoDone?`已配置`:`一键配置 sudo 权限`),1)]),_:1},8,[`loading`,`disabled`,`onClick`])):c(``,!0)])]),_:1},8,[`type`,`onClick:close`])):c(``,!0)}}),bn={class:`text-caption text-medium-emphasis mb-2 d-flex flex-wrap align-center ga-2`},xn=_({__name:`FilesStatusBar`,setup(e){let t=$e();return(e,n)=>(R(),y(`div`,bn,[w(`span`,null,G(A(t).statusSummary),1),A(t).browseError?(R(),l(re,{key:0,size:`x-small`,color:`warning`,variant:`tonal`},{default:B(()=>[o(G(A(t).browseError),1)]),_:1})):c(``,!0),A(t).hasClipboard?(R(),l(re,{key:1,size:`x-small`,color:`info`,variant:`tonal`,class:`cursor-pointer`,onClick:n[0]||=()=>A(t).pasteClipboard()},{default:B(()=>[o(G(A(t).clipboardSummary)+` → `+G(A(t).pasteDestLabel)+` · Ctrl+V 粘贴 `,1)]),_:1})):c(``,!0)]))}}),Sn=_({__name:`FilesToolbar`,setup(e){let t=$e();return(e,s)=>(R(),l(Z,{elevation:`0`,border:``,rounded:`lg`,class:`mb-4 pa-4`},{default:B(()=>[F(i,{align:`center`,dense:``},{default:B(()=>[F(r,{cols:`12`,sm:`4`},{default:B(()=>[F(Ye,{modelValue:A(t).selectedServer,"onUpdate:modelValue":[s[0]||=e=>A(t).selectedServer=e,A(t).onServerChange],search:A(t).serverSearchQuery,"onUpdate:search":s[1]||=e=>A(t).serverSearchQuery=e,items:A(t).filteredServerList,loading:A(t).serversLoading,"item-title":`name`,"item-value":`id`,label:`选择服务器`,placeholder:`搜索名称 / 域名 / 路径 / ID`,variant:`outlined`,density:`compact`,"prepend-inner-icon":`mdi-server`,"custom-filter":()=>!0},{item:B(({props:e,item:t})=>[F(N,m(e,{subtitle:t.domain||t.target_path}),{prepend:B(()=>[F(a,{color:t.is_online?`success`:`grey`,size:`8`,class:`mr-2`},{default:B(()=>[...s[12]||=[o(` mdi-circle `,-1)]]),_:1},8,[`color`])]),_:2},1040,[`subtitle`])]),_:1},8,[`modelValue`,`search`,`items`,`loading`,`onUpdate:modelValue`])]),_:1}),F(r,{cols:`12`,sm:`4`},{default:B(()=>[F(Ie,{modelValue:A(t).currentPath,"onUpdate:modelValue":s[2]||=e=>A(t).currentPath=e,label:`路径`,variant:`outlined`,density:`compact`,"prepend-inner-icon":`mdi-folder`,"append-inner-icon":`mdi-arrow-right`,"onClick:appendInner":A(t).browseCurrent,onKeydown:J(A(t).browseCurrent,[`enter`])},null,8,[`modelValue`,`onClick:appendInner`,`onKeydown`])]),_:1}),F(r,{cols:`12`,sm:`3`},{default:B(()=>[F(Ie,{modelValue:A(t).fileFilter,"onUpdate:modelValue":s[3]||=e=>A(t).fileFilter=e,label:`筛选文件名`,variant:`outlined`,density:`compact`,"prepend-inner-icon":`mdi-magnify`,clearable:``,"hide-details":``},null,8,[`modelValue`])]),_:1}),F(r,{cols:`12`,sm:`3`},{default:B(()=>[F(n,{modelValue:A(t).extFilter,"onUpdate:modelValue":s[4]||=e=>A(t).extFilter=e,items:A(t).FILE_EXT_FILTERS,"item-title":`title`,"item-value":`value`,label:`类型`,variant:`outlined`,density:`compact`,"hide-details":``,clearable:``},null,8,[`modelValue`,`items`])]),_:1}),F(r,{cols:`12`,sm:`2`},{default:B(()=>[F(n,{modelValue:A(t).sortBy,"onUpdate:modelValue":s[5]||=e=>A(t).sortBy=e,items:A(t).sortOptions,"item-title":`title`,"item-value":`value`,label:`排序`,variant:`outlined`,density:`compact`,"hide-details":``},null,8,[`modelValue`,`items`])]),_:1}),F(r,{cols:`12`,class:`d-flex ga-2 flex-wrap justify-end`},{default:B(()=>[F(p,{size:`small`,variant:`tonal`,"prepend-icon":`mdi-upload`,onClick:s[6]||=e=>A(t).showUpload=!0},{default:B(()=>[...s[13]||=[o(` 上传 `,-1)]]),_:1}),F(p,{size:`small`,variant:`tonal`,"prepend-icon":`mdi-file-plus`,onClick:s[7]||=e=>A(t).openNewFileDialog()},{default:B(()=>[...s[14]||=[o(` 新建文件 `,-1)]]),_:1}),F(p,{size:`small`,variant:`tonal`,"prepend-icon":`mdi-folder-plus`,onClick:s[8]||=e=>A(t).showMkdir=!0},{default:B(()=>[...s[15]||=[o(` 新建目录 `,-1)]]),_:1}),F(p,{size:`small`,variant:`tonal`,"prepend-icon":`mdi-zip-box`,disabled:!A(t).selectedServer||!A(t).selectedFileCount,onClick:s[9]||=e=>A(t).openCompressDialog()},{default:B(()=>[...s[16]||=[o(` 压缩 `,-1)]]),_:1},8,[`disabled`]),F(p,{size:`small`,variant:`tonal`,"prepend-icon":`mdi-server-network`,disabled:!A(t).selectedServer||!A(t).selectedFileCount,onClick:s[10]||=e=>A(t).goToServerTransfer()},{default:B(()=>[...s[17]||=[o(` 发送到其他服务器 `,-1)]]),_:1},8,[`disabled`]),F(p,{size:`small`,variant:`tonal`,"prepend-icon":`mdi-content-paste`,disabled:!A(t).canPasteHere,onClick:s[11]||=()=>A(t).pasteClipboard()},{default:B(()=>[...s[18]||=[o(` 粘贴 `,-1)]]),_:1},8,[`disabled`]),F(p,{size:`small`,variant:`tonal`,"prepend-icon":`mdi-arrow-up`,disabled:!A(t).canGoUp,onClick:A(t).goUp},{default:B(()=>[...s[19]||=[o(` 上级 `,-1)]]),_:1},8,[`disabled`,`onClick`]),F(p,{size:`small`,variant:`tonal`,"prepend-icon":`mdi-refresh`,onClick:A(t).browseCurrent},{default:B(()=>[...s[20]||=[o(`刷新`,-1)]]),_:1},8,[`onClick`]),F(p,{size:`small`,variant:`tonal`,"prepend-icon":`mdi-console`,disabled:!A(t).selectedServer,onClick:A(t).openInTerminal},{default:B(()=>[...s[21]||=[o(` 终端 `,-1)]]),_:1},8,[`disabled`,`onClick`])]),_:1})]),_:1})]),_:1}))}}),Cn=H(null);function wn(){let e=W(()=>Cn.value!==null),t=W(()=>Cn.value?`${Cn.value.mode===`cut`?`已剪切`:`已复制`} ${Cn.value.paths.length} 项`:``);function n(e,t,n){if(!n.length)return!1;let r=[...new Set(n.map(e=>Q(e)))];return Cn.value={mode:e,serverId:t,paths:r,label:r.map(e=>e.split(`/`).pop()||e).join(`, `)},!0}function r(){Cn.value=null}function i(e){return!!(Cn.value&&e&&Cn.value.serverId===e)}function a(e,t){let n=Q(t);for(let t of e){let e=Q(t);if(n===e)return`「${e.split(`/`).pop()||e}」与目标路径相同,无需粘贴`;if(n.startsWith(`${e}/`))return`不能粘贴到源目录「${e}」的内部`}return null}async function o(e){let t=Cn.value;if(!t)throw Error(`剪贴板为空`);let n=Q(e),i=a(t.paths,n);if(i)throw Error(i);let o=t.mode===`cut`?`move`:`copy`;await P.post(`/sync/file-clipboard`,{server_id:t.serverId,mode:o,sources:t.paths,dest_dir:n}),t.mode===`cut`&&r()}return{clipboard:Cn,hasClipboard:e,clipboardSummary:t,setFromSelection:n,clear:r,canPasteOnServer:i,validatePasteTarget:a,pasteToDirectory:o}}function Tn(e){if(!(e instanceof HTMLElement))return!1;let t=e.tagName;return t===`INPUT`||t===`TEXTAREA`||e.isContentEditable}function En(e,t,n){function r(r){if(!Tn(r.target)){if(r.key===`F5`){r.preventDefault(),e.refresh();return}if(r.key===`Backspace`){r.preventDefault(),e.goUp();return}if(r.key===`F2`&&t.value.length===1){r.preventDefault(),e.renameSelection();return}if(r.key===`Delete`&&t.value.length>0&&(r.preventDefault(),e.deleteSelection()),(r.ctrlKey||r.metaKey)&&r.key.toLowerCase()===`a`){r.preventDefault(),e.selectAll();return}if((r.ctrlKey||r.metaKey)&&r.key.toLowerCase()===`c`){t.value.length>0&&(r.preventDefault(),e.copySelection());return}if((r.ctrlKey||r.metaKey)&&r.key.toLowerCase()===`x`){t.value.length>0&&(r.preventDefault(),e.cutSelection());return}(r.ctrlKey||r.metaKey)&&r.key.toLowerCase()===`v`&&n.value&&(r.preventDefault(),e.pasteClipboard())}}D(()=>window.addEventListener(`keydown`,r)),E(()=>window.removeEventListener(`keydown`,r))}function Dn(e,t){return`${e}:${t}`}var On=ge(`files`,()=>{let e=H(null),t=H(We),n=H([]),r=H(!1),i=H(!1),a=H(``),o=H(null),s=H(null),c=H(!1),l=H(!1),u=H(!1),d=H(!1),f=H(!1),p=H(!1),m=new Map;function h(e){return Date.now()-e.at<=cn}function g(e,t){return m.get(Dn(e,t))??null}function _(e,t){let n=g(e,t);return!n||!h(n)?null:n.items}function v(e,t){return g(e,t)?.etag}function y(e,t){let n=g(e,t);n&&(n.at=Date.now())}function b(e,t,n,r){let i=Dn(e,t);if(m.set(i,{items:n,at:Date.now(),etag:r??void 0}),m.size>50){let e=[...m.entries()].sort((e,t)=>e[1].at-t[1].at)[0];e&&m.delete(e[0])}}function x(e,t){if(e==null){m.clear();return}if(t==null){let t=`${e}:`;for(let e of[...m.keys()])e.startsWith(t)&&m.delete(e);return}m.delete(Dn(e,t))}function S(){s.value=null,c.value=!1,u.value=!1}return{selectedServer:e,currentPath:t,files:n,loading:r,loadingVisible:i,browseError:a,filesCapability:o,lastReadDeniedPath:s,accessHintDismissed:c,setupSudoLoading:l,setupSudoDone:u,pageReady:d,routeReady:f,initing:p,getCacheEntry:g,getCached:_,getCachedEtag:v,touchCache:y,setCached:b,invalidateCache:x,resetForServerChange:S}}),kn={directory:0,symlink:1,file:2};function An(e,t,n){let r=n===`asc`?1:-1;return[...e].sort((e,n)=>{let i=kn[e.type]??9,a=kn[n.type]??9;if(i!==a)return i-a;let o=0;return o=t===`name`?e.name.localeCompare(n.name):t===`size`?(e.size??0)-(n.size??0):(e.modified??``).localeCompare(n.modified??``),o*r})}var jn=[{title:`全部`,value:``},{title:`.conf / .ini`,value:`conf,ini`},{title:`.log`,value:`log`},{title:`.sh`,value:`sh`},{title:`.py`,value:`py`},{title:`.json`,value:`json`},{title:`.yml / .yaml`,value:`yml,yaml`},{title:`.txt`,value:`txt`},{title:`.php`,value:`php`},{title:`.js / .ts`,value:`js,ts`}];function Mn(e,t){if(!t)return!0;let n=e.toLowerCase();return t.split(`,`).some(e=>n.endsWith(`.${e.trim()}`))}function Nn(e){let t=e.toLowerCase();return t.endsWith(`.tar.gz`)||t.endsWith(`.tgz`)||t.endsWith(`.zip`)}var Pn=300*1024,Fn=2*1024*1024,In=40,Ln=4,Rn=new Map;function zn(e,t){return`${e}:${Q(t)}`}function Bn(e){let t=Q(e),n=t.lastIndexOf(`/`);return n<=0?`/`:t.slice(0,n)||`/`}function Vn(){Rn.clear()}function Hn(e,t){let n=Q(t);for(let t of[...Rn.keys()]){if(!t.startsWith(`${e}:`)){Rn.delete(t);continue}Bn(t.slice(`${e}:`.length))!==n&&Rn.delete(t)}}function Un(e,t){Rn.delete(zn(e,t))}function Wn(e){if(e.type!==`file`)return!1;let t=e.size??0;return t>0&&t<=307200}function Gn(e){return e!=null&&e>0&&e>2097152}function Kn(e){return typeof e==`string`?{content:e,mtime:null,etag:null,eol:`LF`}:{content:e.content??JSON.stringify(e,null,2),mtime:e.mtime??null,etag:e.etag??null,eol:e.eol??`LF`}}async function qn(e,t,n=Pn){let r=zn(e,t),i=Rn.get(r);if(i!==void 0)return i;let a=Kn(await P.post(`/sync/read-file`,{server_id:e,path:Q(t),max_size:n}));return Rn.set(r,a),a}function Jn(e,t,n){let r=n.filter(Wn).sort((e,t)=>(e.size??0)-(t.size??0)).slice(0,In);if(!r.length)return;let i=0,a=async()=>{for(;i<r.length;){let n=r[i++],a=$(t,n.name),o=zn(e,a);if(!Rn.has(o))try{await qn(e,a)}catch{}}},o=Math.min(Ln,r.length);Promise.all(Array.from({length:o},()=>a()))}function Yn(e){let t=Me(),n=fe(),{selectedServer:r,currentPath:i}=ve(On()),{selectedFiles:a,selectedAbsolutePaths:o,clearSelection:s}=e.selection,{setFromSelection:c,canPasteOnServer:l,pasteToDirectory:u}=wn(),d=H(!1),f=H(!1),p=H(!1),m=H(``),h=H(!1),g=H(!1),_=H(``),v=H(`tar.gz`),y=H([]),b=H(!1),x=H(``),C=H(`.`),ee=H(!1),w=H([]),T=H(!1),E=H(``),D=e.actionLoading??H(!1),O=H(null),te=H(!1),k=H(``),A=H(null),ne=H(!1),re=H(!1),ie=H(null),j=H(!1),ae=H(0),oe=H(0),se=H(null);function ce(e){if(!r.value){t(`请先选择服务器`,`warning`);return}let a=o(e);if(!a.length){t(`请先选择文件或目录`,`warning`);return}n.push({path:`/server-transfer`,query:{source:String(r.value),path:i.value,paths:a.join(`|`)}})}function le(e){if(e)return Q(e);let t=a.value.filter(e=>e.type===`directory`);return t.length===1&&a.value.length===1?$(i.value,t[0].name):Q(i.value)}let ue=W(()=>{let e=le();return e===Q(i.value)?`当前目录`:e});function de(e){if(!r.value)return;let n=o(e);if(!n.length){t(`请先选择文件或目录`,`warning`);return}c(`copy`,r.value,n)&&t(`已复制 ${n.length} 项`)}function M(e){if(!r.value)return;let n=o(e);if(!n.length){t(`请先选择文件或目录`,`warning`);return}c(`cut`,r.value,n)&&t(`已剪切 ${n.length} 项`)}async function N(n){if(!r.value){t(`请先选择服务器`,`warning`);return}if(!l(r.value)){t(`剪贴板为空或服务器不一致`,`warning`);return}let i=le(n);D.value=!0;try{await u(i),s(),e.invalidateAfterMutation(i),await e.browse({force:!0}),t(`已粘贴到 ${i}`)}catch(e){t(e instanceof Error?e.message:`粘贴失败`,`error`)}finally{D.value=!1}}async function F(e){if(d.value=!1,!r.value){t(`请先选择服务器`,`warning`);return}let n=e.dataTransfer?.files;n?.length&&(w.value=Array.from(n),await U())}function I(t){if(j.value=!1,!se.value)return;let n=se.value;switch(t){case`open`:e.openEntry(n);break;case`copy`:de([n]);break;case`cut`:M([n]);break;case`paste`:N();break;case`pasteInto`:n.type===`directory`&&N($(i.value,n.name));break;case`edit`:e.editFile(n);break;case`preview`:e.previewFile(n);break;case`copyPath`:pe(n);break;case`terminal`:e.openInTerminal();break;case`compress`:me([n]);break;case`decompress`:he(n);break;case`sendToServer`:ce([n]);break;case`rename`:R(n);break;case`chmod`:B(n);break;case`delete`:be(n);break}}async function pe(e){let n=$(i.value,e.name);try{await navigator.clipboard.writeText(n),t(`路径已复制`)}catch{t(`复制失败`,`error`)}}function me(e){if(!r.value)return;let n=e?.length?e:a.value.length?a.value:[];if(!n.length){t(`请选择要压缩的文件或目录`,`warning`);return}y.value=n.map(e=>$(i.value,e.name));let o=n.length===1?n[0].name.replace(/\.[^.]+$/,``):`archive`;_.value=$(i.value,`${o}.tar.gz`),v.value=`tar.gz`,g.value=!0}function he(e){if(r.value){if(!Nn(e.name)){t(`仅支持 .tar.gz / .tgz / .zip`,`warning`);return}x.value=$(i.value,e.name),C.value=i.value,b.value=!0}}async function ge(){if(!(!r.value||!y.value.length||!_.value)){D.value=!0;try{let n=_.value;v.value===`zip`&&!n.endsWith(`.zip`)&&(n=n.replace(/\.tar\.gz$/i,`.zip`),n.endsWith(`.zip`)||(n+=`.zip`)),await P.post(`/sync/compress`,{server_id:r.value,paths:y.value,dest:n,format:v.value}),g.value=!1,s(),e.invalidateAfterMutation(),await e.browse({force:!0}),t(`压缩完成`)}catch(e){t(e instanceof Error?e.message:`压缩失败`,`error`)}finally{D.value=!1}}}async function L(){if(!(!r.value||!x.value)){D.value=!0;try{await P.post(`/sync/decompress`,{server_id:r.value,path:x.value,dest:C.value||`.`}),b.value=!1,e.invalidateAfterMutation(),await e.browse({force:!0}),t(`解压完成`)}catch(e){t(e instanceof Error?e.message:`解压失败`,`error`)}finally{D.value=!1}}}async function _e(){if(!r.value){t(`请先选择服务器`,`warning`);return}if(!m.value)return;let n=He(m.value);if(n!==!0){t(n,`warning`);return}let a=m.value,o=$(i.value,a);D.value=!0;try{await P.post(`/sync/write-file`,{server_id:r.value,path:o,content:``}),p.value=!1,m.value=``,Un(r.value,o),e.invalidateAfterMutation(),await e.browse({force:!0}),t(`文件已创建`),await S();let n=await e.waitForEditorWorkbench?.()??e.editorWorkbench.value;if(!n?.openFile){t(`文件已创建;编辑器未就绪,请从列表双击打开`,`warning`);return}n.openFile({path:o,name:a,content:``,eol:`LF`,etag:null,mtime:null})}catch(e){t(e instanceof Error?e.message:`创建失败`,`error`)}finally{D.value=!1}}function R(e){A.value=e,k.value=e.name,te.value=!0}async function z(){if(!(!r.value||!A.value||!k.value))try{await P.post(`/sync/file-ops`,{server_id:r.value,operation:`rename`,path:$(i.value,A.value.name),new_path:$(i.value,k.value)}),te.value=!1,e.invalidateAfterMutation(),await e.browse({force:!0}),t(`重命名成功`)}catch(e){t(e instanceof Error?e.message:`重命名失败`,`error`)}}function B(e){ie.value=e,ne.value=!0}async function V(n){if(!(!r.value||!ie.value)){re.value=!0;try{await P.post(`/sync/chmod`,{server_id:r.value,path:$(i.value,ie.value.name),mode:n.mode,owner:n.owner,group:n.group,recursive:n.recursive??!1}),ne.value=!1,e.invalidateAfterMutation(),await e.browse({force:!0}),t(`权限已修改`)}catch(e){t(e instanceof Error?e.message:`修改权限失败`,`error`)}finally{re.value=!1}}}async function ye(){if(!r.value||!a.value.length||!confirm(`确定删除 ${a.value.length} 个文件?`))return;let n=0,o=0;for(let e of a.value)try{await P.post(`/sync/file-ops`,{server_id:r.value,operation:`delete`,path:$(i.value,e.name)}),n++}catch{o++}s(),e.invalidateAfterMutation(),await e.browse({force:!0}),o===0?t(`已删除 ${n} 项`):t(`删除完成:成功 ${n},失败 ${o}`,o>0?`warning`:`success`)}async function be(e){O.value=e,ee.value=!0}async function xe(){if(!(!r.value||!O.value)){D.value=!0;try{await P.post(`/sync/file-ops`,{server_id:r.value,operation:`delete`,path:$(i.value,O.value.name)}),ee.value=!1,e.invalidateAfterMutation(),await e.browse({force:!0}),t(`已删除`)}catch(e){t(e instanceof Error?e.message:`删除失败`,`error`)}finally{D.value=!1}}}async function Se(){if(!r.value||!E.value)return;let n=He(E.value);if(n!==!0){t(n,`warning`);return}D.value=!0;try{await P.post(`/sync/file-ops`,{server_id:r.value,operation:`mkdir`,path:$(i.value,E.value)}),h.value=!1,E.value=``,e.invalidateAfterMutation(),await e.browse({force:!0}),t(`目录已创建`)}catch(e){t(e instanceof Error?e.message:`创建失败`,`error`)}finally{D.value=!1}}async function U(){if(!(!r.value||!w.value.length)){T.value=!0;try{let n=new FormData;for(let e of w.value)n.append(`file`,e);n.append(`server_id`,String(r.value)),n.append(`remote_path`,i.value);let a=await P.upload(`/sync/upload`,n);f.value=!1,w.value=[],e.invalidateAfterMutation(),await e.browse({force:!0});let o=a?.permission_fixup;o?.error?t(`上传成功,但权限修正失败: ${o.error}`,`warning`):t(`上传成功`)}catch(e){t(e instanceof Error?e.message:`上传失败`,`error`)}finally{T.value=!1}}}function Ce(e){return e instanceof HTMLElement?!!e.closest(`button, a, input, .v-checkbox, .v-selection-control`):!1}function G(e){let t=e.item;return{class:t.type===`directory`?`files-row--dir`:void 0,style:{cursor:t.type===`directory`||t.type===`symlink`?`pointer`:`default`},onClick:e=>{Ce(e.target)||e.detail===1&&we(e,{item:t})},onDblclick:e=>{Ce(e.target)||Te(e,{item:t})},onContextmenu:e=>{Ce(e.target)||K(e,{item:t})}}}function we(t,{item:n}){(n.type===`directory`||n.type===`symlink`)&&e.openEntry(n)}function Te(t,{item:n}){n.type===`file`&&e.editFile(n)}function K(e,{item:t}){e.preventDefault(),se.value=t,ae.value=e.clientX,oe.value=e.clientY,j.value=!0}function q(){if(!r.value){t(`请先选择服务器`,`warning`);return}p.value=!0}return{dropActive:d,showUpload:f,showNewFile:p,newFileName:m,showMkdir:h,showCompress:g,compressDest:_,compressFormat:v,compressPaths:y,showDecompress:b,decompressSource:x,decompressDest:C,showFileDelete:ee,uploadFiles:w,uploading:T,mkdirName:E,actionLoading:D,deletingFile:O,showRename:te,newName:k,renamingFile:A,showChmod:ne,chmodLoading:re,chmodFile:ie,showContextMenu:j,contextX:ae,contextY:oe,contextFile:se,goToServerTransfer:ce,copyToClipboard:de,cutToClipboard:M,pasteClipboard:N,onDropFiles:F,contextAction:I,openCompressDialog:me,openDecompressDialog:he,doCompress:ge,doDecompress:L,doNewFile:_e,openNewFileDialog:q,startRename:R,doRename:z,startChmod:B,doChmod:V,batchDelete:ye,confirmDeleteFile:be,doDeleteFile:xe,doMkdir:Se,doUpload:U,fileRowProps:G,pasteDestLabel:ue}}var Xn=!1;function Zn(){x(async()=>{let{initMonaco:e}=await import(`./initMonaco-DTDMLv7Z.js`).then(e=>e.r);return{initMonaco:e}},__vite__mapDeps([0,1,2,3,4])).then(({initMonaco:e})=>{e(),De()})}function Qn(){Xn||(Xn=!0,typeof requestIdleCallback==`function`?requestIdleCallback(Zn,{timeout:3e3}):setTimeout(Zn,300))}var $n=200,er=0,tr=null,nr=``,rr=null;function ir(e){return e.includes(`No such file or directory`)||e.includes(`not a directory`)}function ar(e,t){return ir(e)?`路径不存在:${t},请检查服务器「target_path」设置`:e.includes(`Permission denied`)||e.includes(`Operation not permitted`)?`无读取权限(${t})`:e.includes(`connection_error`)||e.includes(`SSH pool at capacity`)?`SSH 连接失败或连接池繁忙,请稍后点「刷新」重试`:e.includes(`timed out`)||e.includes(`timeout`)?`远程命令超时(${t}),请检查目标机负载或网络`:e}function or(e){e.loading=!0,!rr&&(rr=setTimeout(()=>{rr=null,e.loading&&(e.loadingVisible=!0)},$n))}function sr(e){e.loading=!1,rr&&=(clearTimeout(rr),null),e.loadingVisible=!1}async function cr(e,t,n){let r={};n&&(r[`If-None-Match`]=n);try{return await V(`/files/browse`,{method:`GET`,params:{server_id:e,path:t},headers:r})}catch(n){if(!(n instanceof le&&(n.status>=500||n.status===404||n.status===405)))throw n;return{status:200,data:await P.post(`/sync/browse`,{server_id:e,path:t}),etag:null}}}function lr(e){let t=Me(),n=oe(),r=fe(),i=On(),{selectedServer:a,currentPath:o,files:s,loading:c,loadingVisible:l,browseError:u,pageReady:d,filesCapability:f}=ve(i);function p(){let e={...n.query};a.value?(e.server_id=String(a.value),e.path=o.value===`/www/wwwroot`?void 0:o.value):(delete e.server_id,delete e.path),r.replace({query:e})}let m=W(()=>d.value?a.value?u.value?u.value:e?.value.trim()?`无匹配文件`:f.value?.is_root?`目录为空(${o.value}),可在上方修改路径或到「服务器」核对 target_path`:`目录为空(${o.value})`:`请先选择服务器`:`正在加载…`);function h(e,n,r,a,c){if(c!==er)return!1;let{items:l,error:d}=Ue(r??{items:[]});if(d&&ir(d)&&n!==`/`){u.value=``;let e=Be(n);if(e)return t(`路径 "${n}" 不存在,已自动跳转到上级目录`,`info`),o.value=e,g(),!0}return u.value=d?ar(d,n):``,d&&!ir(d)&&t(ar(d,n),`warning`),s.value=l,d||i.setCached(e,n,l,a??void 0),e&&l.length&&(Hn(e,n),Jn(e,n,l),Qn()),!0}async function g(e){if(!a.value)return;let n=Q(o.value),r=a.value,c=`${r}:${n}`,l=e?.force?null:i.getCached(r,n);if(l&&(s.value=l,u.value=``),tr&&nr===c)return tr;nr=c;let d=++er;e?.silent||or(i),o.value=n;let f=e?.force?void 0:i.getCachedEtag(r,n);return tr=(async()=>{try{let e=await cr(r,n,f);if(d!==er)return;if(e.status===304){let t=i.getCacheEntry(r,n);if(t){s.value=t.items,i.touchCache(r,n),u.value=``;return}if(e=await cr(r,n),d!==er)return}h(r,n,e.data,e.etag,d)}catch(e){if(d!==er)return;let n=Le(e,`浏览目录失败`);u.value=n,t(n,`error`)}finally{d===er&&(e?.silent?(i.loading=!1,i.loadingVisible=!1):sr(i),p()),nr===c&&(tr=null,nr=``)}})(),tr}function _(){if(!a.value){t(`请先选择服务器`,`warning`);return}o.value=Q(o.value),i.invalidateCache(a.value,o.value),g({force:!0})}function v(e){if(!a.value)return;let t=e??o.value;i.invalidateCache(a.value,Q(t)),Vn()}return{emptyHint:m,browse:g,browseCurrent:_,invalidateAfterMutation:v,loadingVisible:l}}function ur(e){return e?e<1024?`${e} B`:e<1024*1024?`${(e/1024).toFixed(1)} KB`:`${(e/1024/1024).toFixed(1)} MB`:`—`}function dr(e){let t=Me(),{selectedServer:n,currentPath:r,lastReadDeniedPath:i,accessHintDismissed:a}=ve(On()),o=H(!1),s=H(``),c=H(``),l=H(!1),u=H(null);async function d(){let e=Date.now()+8e3;for(;Date.now()<e;){if(u.value?.openFile)return u.value;await new Promise(e=>setTimeout(e,40)),await S()}return u.value}function f(e,n){return Gn(e.size)?(t(`文件超过 2MB(${ur(e.size)}),无法${n},请使用终端`,`warning`),!0):!1}function p(t){n.value&&t&&Un(n.value,t),e.invalidateAfterMutation(),e.browse({force:!0})}async function m(e){if(!n.value||f(e,`查看`))return;let u=$(r.value,e.name);s.value=e.name,c.value=``,l.value=!0,o.value=!0,(e.size??0)>307200&&t(`文件较大(${ur(e.size)}),正在加载…`,`info`);try{c.value=(await qn(n.value,u,2097152)).content||`(空文件)`}catch(n){let r=n instanceof Error?n.message:`读取失败`;c.value=r,Vt(r)&&(i.value=e.name,a.value=!1),t(r,`error`)}finally{l.value=!1}}async function h(o){if(n.value&&!f(o,`编辑`)){(o.size??0)>307200&&t(`文件较大(${ur(o.size)}),正在加载…`,`info`),e.actionLoading.value=!0;try{let e=$(r.value,o.name),i=await qn(n.value,e,Fn),a=await d();if(!a){t(`编辑器尚未就绪,请稍后重试`,`error`);return}a.openFile({path:e,name:o.name,content:i.content,eol:i.eol,etag:i.etag,mtime:i.mtime})}catch(e){let n=e instanceof Error?e.message:`读取失败`;Vt(n)&&(i.value=o.name,a.value=!1),t(n,`error`)}finally{e.actionLoading.value=!1}}}return{showPreview:o,previewTitle:s,previewContent:c,previewLoading:l,editorWorkbench:u,waitForEditorWorkbench:d,previewFile:m,editFile:h,onEditorSaved:p,formatSize:ur}}function fr(e){let t=Me(),n=oe(),r=fe(),{servers:i,loading:a,loadServers:o}=Re(),s=H(``);function c(e,t){return e.name.toLowerCase().includes(t)||(e.domain||``).toLowerCase().includes(t)||(e.target_path||``).toLowerCase().includes(t)||String(e.id).includes(t)}let l=W(()=>{let e=s.value.toLowerCase().trim(),t=e?i.value.filter(t=>c(t,e)):i.value,n=d.value;if(n!=null&&!t.some(e=>e.id===n)){let e=i.value.find(e=>e.id===n);e&&(t=[e,...t])}return t}),u=On(),{selectedServer:d,currentPath:f,pageReady:p,routeReady:m,initing:h,accessHintDismissed:g}=ve(u),_=W(()=>Ve(f.value)),v=W(()=>Be(f.value)!==null);function y(e){if(e==null)return We;let t=i.value.find(t=>t.id===e)?.target_path?.trim();return t?Q(t):We}function b(){let e=n.query.path;return typeof e==`string`&&e.trim()?Q(e):y(d.value)}function x(){let e=n.query.server_id;if(e){let t=Number(e);if(Number.isFinite(t)&&i.value.some(e=>e.id===t))return t}let t=sessionStorage.getItem(an);if(t){let e=Number(t);if(Number.isFinite(e)&&i.value.some(t=>t.id===e))return e}return i.value[0]?.id??null}function S(n){if(!d.value){t(`请先选择服务器`,`warning`);return}f.value=Q(n),e.clearSelection(),e.browse()}function C(e){if(e.type===`directory`){S($(f.value,e.name));return}if(e.type===`symlink`){let n=e.link_target?.trim();n?.startsWith(`/`)?S(n):t(n?`符号链接 → ${n}`:`相对符号链接(请在终端中打开)`,`info`)}}function ee(){let e=Be(f.value);e!=null&&S(e)}function w(e){let t=_.value[e];t&&!t.disabled&&S(t.path)}function T(){d.value&&r.push({path:`/terminal`,query:{server_id:String(d.value),path:f.value||`/`}})}function E(){h.value||(s.value=``,d.value&&sessionStorage.setItem(an,String(d.value)),u.invalidateCache(),f.value=y(d.value),e.clearSelection(),u.resetForServerChange(),sessionStorage.removeItem(on),(async()=>{await e.refreshFilesCapability(),await e.browse({force:!0})})())}let O=!1;return D(async()=>{h.value=!0;try{if(await o({all:!0}),sessionStorage.getItem(`nexus:files-hint-dismissed`)&&(g.value=!0),!i.value.length){t(`暂无可用服务器,请先在「服务器」页添加`,`warning`),p.value=!0;return}let r=x();if(r==null){p.value=!0;return}d.value=r;let a=n.query.path;f.value=typeof a==`string`&&a?Q(a):y(r),await e.refreshFilesCapability(),await e.browse(),p.value=!0,m.value=!0}finally{h.value=!1,O=!0}}),Ee(()=>{!O||!p.value||!d.value||e.browse({silent:!0})}),ye(()=>n.query.server_id,t=>{m.value&&t&&Number(t)!==d.value&&(d.value=Number(t),f.value=b(),u.resetForServerChange(),(async()=>{await e.refreshFilesCapability(),await e.browse({force:!0})})())}),ye(()=>n.query.path,()=>{if(!m.value||!d.value)return;let t=b();t!==Q(f.value)&&(f.value=t,e.clearSelection(),e.browse())}),{serverList:i,filteredServerList:l,serverSearchQuery:s,serversLoading:a,breadcrumbs:_,canGoUp:v,navigateToPath:S,openEntry:C,goUp:ee,onBreadcrumbClick:w,openInTerminal:T,onServerChange:E,defaultPathForServer:y}}function pr(e){let t=Me(),{selectedServer:n,files:r,browseError:i,filesCapability:a,lastReadDeniedPath:o,accessHintDismissed:s,setupSudoLoading:c,setupSudoDone:l}=ve(On()),u=W(()=>a.value?.ssh_user??null),d=W(()=>{let e=u.value;return e?r.value.filter(t=>Ht(t,e)).length:0}),f=W(()=>{if(s.value||!n.value||i.value&&ir(i.value))return null;let e=a.value;return Wt({sshUser:e?.ssh_user,canSudo:e?.can_sudo_nopasswd??!1,whitelistOk:e?.whitelist_ok??!1,isRootSsh:e?.is_root??!1,filesElevation:e?.files_elevation,capabilityMessage:e?.message,lastReadDeniedPath:o.value,unreadableCount:d.value})});function p(){s.value=!0,sessionStorage.setItem(on,`1`)}async function m(){if(!n.value){a.value=null;return}try{a.value=await P.get(`/servers/${n.value}/files-capability`)}catch{a.value=null}}async function h(){if(n.value){c.value=!0;try{let r=await P.post(`/servers/${n.value}/setup-files-sudo`,{});l.value=!0,t(r.message||`sudoers 配置成功,文件管理器现在可自动提权`,`success`),p(),await m(),await e.browse({force:!0})}catch(e){t(`一键配置失败:${e instanceof Error?e.message:`配置失败`}`,`error`)}finally{c.value=!1}}}return{sshUserForFiles:u,filesAccessHint:f,dismissFilesAccessHint:p,refreshFilesCapability:m,setupFilesSudo:h}}function mr(){let{currentPath:e}=ve(On()),t=H([]),n=W(()=>t.value.length);function r(){t.value=[]}function i(n){return(n?.length?n:t.value).map(t=>$(e.value,t.name))}return{selectedFiles:t,selectedFileCount:n,clearSelection:r,selectedAbsolutePaths:i}}function hr(){let e=H(``),t=H(``),n=H(`name`),r=[{title:`名称`,value:`name`},{title:`大小`,value:`size`},{title:`修改时间`,value:`modified`}],{selectedServer:i,currentPath:a,files:o,loading:s,browseError:c,pageReady:l,setupSudoLoading:u,setupSudoDone:d}=ve(On()),f=mr(),{selectedFiles:p,selectedFileCount:m,clearSelection:h}=f,{emptyHint:g,browse:_,browseCurrent:v,invalidateAfterMutation:y,loadingVisible:b}=lr(e),x=pr({browse:_}),{sshUserForFiles:S,filesAccessHint:C,dismissFilesAccessHint:ee,setupFilesSudo:w}=x,T=fr({browse:_,refreshFilesCapability:x.refreshFilesCapability,clearSelection:h}),E=H(!1),D=dr({browse:_,invalidateAfterMutation:y,actionLoading:E}),O=Yn({browse:_,invalidateAfterMutation:y,selection:f,openEntry:T.openEntry,editFile:D.editFile,previewFile:D.previewFile,openInTerminal:T.openInTerminal,editorWorkbench:D.editorWorkbench,waitForEditorWorkbench:D.waitForEditorWorkbench,actionLoading:E}),{hasClipboard:te,clipboardSummary:k,canPasteOnServer:A}=wn(),ne=W(()=>A(i.value)),re=W(()=>{let r=An(o.value,n.value,`asc`),i=t.value;i&&(r=r.filter(e=>Mn(e.name,i)));let a=e.value.trim().toLowerCase();return a&&(r=r.filter(e=>e.name.toLowerCase().includes(a))),r}),ie=W(()=>{let e=o.value.filter(e=>e.type===`directory`).length,t=o.value.filter(e=>e.type===`file`).length,n=o.value.filter(e=>e.type===`symlink`).length,r=o.value.filter(Wn).length,i=[`${e} 个目录`,`${t} 个文件`];return n&&i.push(`${n} 个链接`),r&&i.push(`${r} 个 ≤300KB 可预加载`),`${i.join(`,`)} · ${a.value}`});function j(e){return Nn(e)}function ae(e){return e.type===`directory`?`mdi-folder`:e.type===`symlink`?`mdi-link-variant`:`mdi-file-outline`}function oe(e){return e.type===`directory`?`amber`:e.type===`symlink`?`teal`:`blue`}function se(e){return e.type===`file`}return En({refresh:v,goUp:T.goUp,renameSelection:()=>{p.value.length===1&&O.startRename(p.value[0])},deleteSelection:()=>{p.value.length>0&&O.batchDelete()},selectAll:()=>{p.value=[...re.value]},copySelection:()=>O.copyToClipboard(),cutSelection:()=>O.cutToClipboard(),pasteClipboard:()=>{O.pasteClipboard()}},p,ne),{FILE_EXT_FILTERS:jn,validatePathSegment:He,required:Xe,fileFilter:e,extFilter:t,sortBy:n,sortOptions:r,selectedServer:i,currentPath:a,files:o,loading:s,loadingVisible:b,browseError:c,pageReady:l,setupSudoLoading:u,setupSudoDone:d,serverList:T.serverList,filteredServerList:T.filteredServerList,serverSearchQuery:T.serverSearchQuery,serversLoading:T.serversLoading,onServerChange:T.onServerChange,browseCurrent:v,filesAccessHint:C,dismissFilesAccessHint:ee,setupFilesSudo:w,sshUserForFiles:S,statusSummary:ie,hasClipboard:te,clipboardSummary:k,pasteDestLabel:O.pasteDestLabel,canPasteHere:ne,breadcrumbs:T.breadcrumbs,onBreadcrumbClick:T.onBreadcrumbClick,canGoUp:T.canGoUp,goUp:T.goUp,selectedFiles:p,selectedFileCount:m,displayedFiles:re,fileHeaders:[{title:`名称`,key:`name`},{title:`归属`,key:`owner`,width:110,sortable:!1},{title:`大小`,key:`size`,width:120},{title:`修改时间`,key:`modified`,width:180},{title:`操作`,key:`actions`,width:160,sortable:!1,align:`end`}],fileRowProps:O.fileRowProps,dropActive:O.dropActive,onDropFiles:O.onDropFiles,emptyHint:g,entryIcon:ae,entryIconColor:oe,isEntryLikelyUnreadable:Ht,formatOwnerChip:It,ownerChipColor:Lt,permissionTooltip:Rt,formatSize:D.formatSize,isRegularFile:se,isArchiveName:j,showUpload:O.showUpload,uploadFiles:O.uploadFiles,uploading:O.uploading,doUpload:O.doUpload,showNewFile:O.showNewFile,newFileName:O.newFileName,doNewFile:O.doNewFile,openNewFileDialog:O.openNewFileDialog,showMkdir:O.showMkdir,mkdirName:O.mkdirName,doMkdir:O.doMkdir,showFileDelete:O.showFileDelete,deletingFile:O.deletingFile,doDeleteFile:O.doDeleteFile,showRename:O.showRename,newName:O.newName,doRename:O.doRename,showChmod:O.showChmod,chmodFile:O.chmodFile,chmodLoading:O.chmodLoading,doChmod:O.doChmod,showCompress:O.showCompress,compressDest:O.compressDest,compressFormat:O.compressFormat,compressPaths:O.compressPaths,doCompress:O.doCompress,showDecompress:O.showDecompress,decompressSource:O.decompressSource,decompressDest:O.decompressDest,doDecompress:O.doDecompress,showContextMenu:O.showContextMenu,contextX:O.contextX,contextY:O.contextY,contextFile:O.contextFile,contextAction:O.contextAction,actionLoading:E,batchDelete:O.batchDelete,openCompressDialog:O.openCompressDialog,goToServerTransfer:O.goToServerTransfer,showPreview:D.showPreview,previewTitle:D.previewTitle,previewContent:D.previewContent,previewLoading:D.previewLoading,editorWorkbench:D.editorWorkbench,onEditorSaved:D.onEditorSaved,navigateToPath:T.navigateToPath,pasteClipboard:O.pasteClipboard,editFile:D.editFile,previewFile:D.previewFile,confirmDeleteFile:O.confirmDeleteFile,openInTerminal:T.openInTerminal}}var gr=_({name:`FilesPage`,__name:`FilesPage`,setup(e){let n=hr();Qe(n);let{editorWorkbench:r}=n,{selectedServer:i,currentPath:a}=ve(On());return(e,o)=>(R(),l(t,{fluid:``,class:`pa-6`},{default:B(()=>[F(Sn),F(yn),F(xn),F(st),F(_n),F(rn),F(Pt,{ref_key:`editorWorkbench`,ref:r,"server-id":A(i)??0,"current-path":A(a),onSaved:o[0]||=e=>A(n).onEditorSaved(e),onPathChange:A(n).navigateToPath,onPasteTarget:A(n).pasteClipboard},null,8,[`server-id`,`current-path`,`onPathChange`,`onPasteTarget`])]),_:1}))}});export{gr as default}; |