Files
Nexus/web/app/assets/PushPage-Cs9NOffy.js
T
Your Name 51948469c2 build(frontend): track Vite output in Git for Gitea deploy
- Stop ignoring web/app/index.html and web/app/assets/
- Bundle index-DBKIQT7H.js from current vite build (~101MB assets)

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-03 00:52:44 +08:00

1 line
33 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import{a as e}from"./VDataTable-Cg7NJV7B.js";import{$n as t,Er as n,F as r,Gn as i,Ir as a,Jn as o,Kn as s,L as c,Lt as l,M as u,Mr as d,N as f,Nt as p,O as m,P as h,Pn as g,Pr as _,Qn as v,Qt as y,Sn as b,Tr as x,Xn as S,Y as C,Yn as w,Zn as T,_r as ee,br as E,dn as D,dr as te,en as O,er as k,fr as A,h as ne,j,mr as M,o as N,or as P,q as F,rr as I,s as re,sn as L,t as R,tn as z,tr as B,ur as ie,v as ae,w as V}from"./index-ociiHzMi.js";import{a as oe,i as se,n as ce,r as le,t as H}from"./VSelectionControl-6v8XsKxV.js";import{n as U,t as W}from"./VRow-Bj9GMKOo.js";import{t as G}from"./VSpacer-XdxCYq4Q.js";import{t as K}from"./useSnackbar-D7YOfKok.js";import{t as q}from"./VChip-4zXNrE63.js";import{t as J}from"./VDialog-CITafQ2C.js";import{t as Y}from"./VSelect-Dd2017LC.js";import{t as ue}from"./VCheckbox-aPhUCa5k.js";import{t as de}from"./VDataTableServer-D2dkMwtS.js";import{t as X}from"./VAlert-CxMdcmuN.js";import{t as fe}from"./wsUrl-CqmqkTTE.js";var pe=I({__name:`PushDiagnoseDialog`,props:{modelValue:{type:Boolean},loading:{type:Boolean},result:{},targetName:{}},emits:[`update:modelValue`],setup(e){return(t,n)=>(A(),S(J,{"model-value":e.modelValue,"max-width":`520`,"onUpdate:modelValue":n[1]||=e=>t.$emit(`update:modelValue`,e)},{default:E(()=>[B(u,{border:``},{default:E(()=>[B(h,null,{default:E(()=>[k(`推送失败诊断 — `+a(e.targetName),1)]),_:1}),B(f,null,{default:E(()=>[e.loading?(A(),S(F,{key:0,indeterminate:``,class:`mb-3`})):e.result?(A(),v(s,{key:1},[B(V,{density:`compact`},{default:E(()=>[B(m,{title:`SSH 连接`},{append:E(()=>[B(C,{color:e.result.ssh_ok?`success`:`error`},{default:E(()=>[k(a(e.result.ssh_ok?`mdi-check`:`mdi-close`),1)]),_:1},8,[`color`])]),_:1}),e.result.disk_avail?(A(),S(m,{key:0,title:`磁盘可用: ${e.result.disk_avail}`},null,8,[`title`])):T(``,!0),e.result.disk_used_pct==null?T(``,!0):(A(),S(m,{key:1,title:`磁盘使用率: ${e.result.disk_used_pct}%`},null,8,[`title`])),B(m,{title:`目标路径存在`},{append:E(()=>[B(C,{color:e.result.path_exists?`success`:`error`},{default:E(()=>[k(a(e.result.path_exists?`mdi-check`:`mdi-close`),1)]),_:1},8,[`color`])]),_:1}),e.result.path_perms?(A(),S(m,{key:2,subtitle:e.result.path_perms,title:`权限`},null,8,[`subtitle`])):T(``,!0),B(m,{title:`目标路径可写`},{append:E(()=>[B(C,{color:e.result.path_writable?`success`:`error`},{default:E(()=>[k(a(e.result.path_writable?`mdi-check`:`mdi-close`),1)]),_:1},8,[`color`])]),_:1})]),_:1}),(A(!0),v(s,null,M(e.result.errors,(e,t)=>(A(),S(X,{key:t,type:`error`,density:`compact`,variant:`tonal`,class:`mt-2`},{default:E(()=>[k(a(e),1)]),_:2},1024))),128))],64)):T(``,!0)]),_:1}),B(r,null,{default:E(()=>[B(G),B(c,{variant:`text`,onClick:n[0]||=e=>t.$emit(`update:modelValue`,!1)},{default:E(()=>[...n[2]||=[k(`关闭`,-1)]]),_:1})]),_:1})]),_:1})]),_:1},8,[`model-value`]))}});function Z(e){return e<1024?`${e} B`:e<1048576?`${(e/1024).toFixed(1)} KB`:`${(e/1048576).toFixed(1)} MB`}function me(e){if(!e)return`—`;let t=new Date(e);return Number.isNaN(t.getTime())?e:t.toLocaleString(`zh-CN`,{hour12:!1})}function he(e){switch(e){case`success`:return`成功`;case`failed`:return`失败`;case`running`:return`进行中`;case`cancelled`:return`已取消`;default:return e}}function ge(e){switch(e){case`success`:return`success`;case`failed`:return`error`;case`cancelled`:return`grey`;case`running`:return`info`;default:return`warning`}}function _e(e){switch(e){case`incremental`:return`增量`;case`full`:return`全量`;case`checksum`:return`校验和`;case`overwrite`:return`覆盖`;default:return e||`—`}}function ve(e){return e===`成功`?`success`:e===`失败`?`error`:e===`已取消`?`grey`:`warning`}function ye(e){return e?`success`:`error`}var be={class:`text-caption`},xe={class:`text-caption text-medium-emphasis`},Se=[`title`],Ce={key:1,class:`text-caption text-medium-emphasis`},we=I({__name:`PushHistoryTable`,props:{items:{},headers:{},total:{},loading:{type:Boolean},page:{},statusFilter:{},syncModeFilter:{},serverFilter:{},statusOptions:{},syncModeOptions:{},serverOptions:{},reconciling:{type:Boolean}},emits:[`update:page`,`update:statusFilter`,`update:syncModeFilter`,`update:serverFilter`,`filter-change`,`page-change`,`reconcile`,`diagnose`],setup(e){return(t,n)=>(A(),S(u,{elevation:`0`,border:``,rounded:`lg`},{default:E(()=>[B(h,{class:`d-flex flex-wrap align-center ga-2`},{default:E(()=>[n[6]||=w(`span`,null,`推送历史`,-1),B(G),B(Y,{"model-value":e.statusFilter,items:e.statusOptions,"item-title":`label`,"item-value":`value`,label:`状态`,variant:`outlined`,density:`compact`,"hide-details":``,clearable:``,style:{"max-width":`120px`},"onUpdate:modelValue":n[0]||=e=>{t.$emit(`update:statusFilter`,e),t.$emit(`filter-change`)}},null,8,[`model-value`,`items`]),B(Y,{"model-value":e.syncModeFilter,items:e.syncModeOptions,"item-title":`label`,"item-value":`value`,label:`模式`,variant:`outlined`,density:`compact`,"hide-details":``,clearable:``,style:{"max-width":`120px`},"onUpdate:modelValue":n[1]||=e=>{t.$emit(`update:syncModeFilter`,e),t.$emit(`filter-change`)}},null,8,[`model-value`,`items`]),B(Y,{"model-value":e.serverFilter,items:e.serverOptions,"item-title":`title`,"item-value":`value`,label:`服务器`,variant:`outlined`,density:`compact`,"hide-details":``,clearable:``,style:{"max-width":`180px`},"onUpdate:modelValue":n[2]||=e=>{t.$emit(`update:serverFilter`,e),t.$emit(`filter-change`)}},null,8,[`model-value`,`items`]),B(c,{size:`small`,variant:`tonal`,"prepend-icon":`mdi-wrench`,loading:e.reconciling,onClick:n[3]||=e=>t.$emit(`reconcile`)},{default:E(()=>[...n[5]||=[k(` 修复卡住记录 `,-1)]]),_:1},8,[`loading`])]),_:1}),B(de,{items:e.items,headers:e.headers,"items-length":e.total,loading:e.loading,page:e.page,"items-per-page":15,hover:``,density:`comfortable`,"onUpdate:page":n[4]||=e=>{t.$emit(`update:page`,e),t.$emit(`page-change`)}},{"item.status":E(({item:e})=>[B(q,{color:d(ge)(e.status),size:`x-small`,variant:`tonal`,label:``,border:`sm`},{default:E(()=>[k(a(d(he)(e.status)),1)]),_:2},1032,[`color`])]),"item.sync_mode":E(({item:e})=>[w(`span`,be,a(d(_e)(e.sync_mode)),1)]),"item.started_at":E(({item:e})=>[w(`span`,xe,a(d(me)(e.started_at)),1)]),"item.error_message":E(({item:e})=>[e.error_message?(A(),v(`span`,{key:0,class:`text-caption text-error text-truncate d-inline-block`,style:{"max-width":`200px`},title:e.error_message},a(e.error_message),9,Se)):(A(),v(`span`,Ce,`—`))]),"item.actions":E(({item:e})=>[e.status===`failed`?(A(),S(c,{key:0,size:`x-small`,variant:`tonal`,"prepend-icon":`mdi-stethoscope`,onClick:n=>t.$emit(`diagnose`,e)},{default:E(()=>[...n[7]||=[k(` 诊断 `,-1)]]),_:1},8,[`onClick`])):T(``,!0)]),"no-data":E(()=>[...n[8]||=[w(`div`,{class:`text-center text-medium-emphasis py-6`},`暂无数据`,-1)]]),_:1},8,[`items`,`headers`,`items-length`,`loading`,`page`])]),_:1}))}}),Te={class:`text-caption text-medium-emphasis`},Ee={key:2,class:`mb-2 text-body-2`},De={key:0,class:`text-error text-caption`},Oe={key:1,class:`text-warning text-caption`},ke={key:2,class:`text-caption text-medium-emphasis`},Ae=I({__name:`PushPreviewDialog`,props:{modelValue:{type:Boolean},loading:{type:Boolean},results:{},selectedCount:{},previewDone:{},previewTotal:{},largeBatch:{type:Boolean},warnThreshold:{},errorCount:{},syncMode:{}},emits:[`update:modelValue`,`confirm-push`],setup(t){return(n,i)=>(A(),S(J,{"model-value":t.modelValue,"max-width":`800`,"onUpdate:modelValue":i[2]||=e=>n.$emit(`update:modelValue`,e)},{default:E(()=>[B(u,{border:``},{default:E(()=>[B(h,{class:`d-flex align-center`},{default:E(()=>[i[3]||=k(` 推送预览 `,-1),B(G),w(`span`,Te,[t.loading?(A(),v(s,{key:0},[k(a(t.previewDone)+` / `+a(t.previewTotal)+` 台`,1)],64)):(A(),v(s,{key:1},[k(a(t.results.length)+` 台`,1)],64))])]),_:1}),B(f,null,{default:E(()=>[t.loading?(A(),S(F,{key:0,"model-value":t.previewTotal?Math.round(t.previewDone/t.previewTotal*100):0,class:`mb-3`},null,8,[`model-value`])):T(``,!0),t.largeBatch&&!t.loading?(A(),S(X,{key:1,type:`info`,density:`compact`,variant:`tonal`,class:`mb-2`},{default:E(()=>[k(` 已预览 `+a(t.results.length)+` 台服务器(超过 `+a(t.warnThreshold)+` 台时推送耗时可能较长) `,1)]),_:1})):T(``,!0),t.loading?T(``,!0):(A(),v(`div`,Ee,[i[4]||=k(` 将推送到 `,-1),w(`strong`,null,a(t.selectedCount),1),i[5]||=k(` 台服务器 `,-1)])),t.results.length?(A(),S(e,{key:3,density:`compact`},{default:E(()=>[i[6]||=w(`thead`,null,[w(`tr`,null,[w(`th`,null,`服务器`),w(`th`,null,`文件数`),w(`th`,null,`预计传输`),w(`th`,null,`大小`),w(`th`,null,`备注`)])],-1),w(`tbody`,null,[(A(!0),v(s,null,M(t.results,e=>(A(),v(`tr`,{key:e.server_id},[w(`td`,null,a(e.server_name),1),w(`td`,null,a(e.stats?.files_total??`—`),1),w(`td`,null,a(e.stats?.files_transferred??`—`),1),w(`td`,null,a(e.stats?d(Z)(e.stats.transfer_size_bytes??0):`—`),1),w(`td`,null,[e.error?(A(),v(`span`,De,a(e.error),1)):t.syncMode===`full`&&(e.stats?.files_deleted??0)>0?(A(),v(`span`,Oe,`将删除 `+a(e.stats?.files_deleted)+` 个远端文件`,1)):(A(),v(`span`,ke,`—`))])]))),128))])]),_:1})):T(``,!0),t.errorCount>0&&!t.loading?(A(),S(X,{key:4,type:`warning`,density:`compact`,variant:`tonal`,class:`mt-3`},{default:E(()=>[k(a(t.errorCount)+` 台预览失败,推送时这些服务器可能仍会失败 `,1)]),_:1})):T(``,!0)]),_:1}),B(r,null,{default:E(()=>[B(G),B(c,{variant:`text`,onClick:i[0]||=e=>n.$emit(`update:modelValue`,!1)},{default:E(()=>[...i[7]||=[k(`关闭`,-1)]]),_:1}),B(c,{color:`primary`,variant:`flat`,disabled:t.loading,onClick:i[1]||=e=>n.$emit(`confirm-push`)},{default:E(()=>[...i[8]||=[k(`确认推送`,-1)]]),_:1},8,[`disabled`])]),_:1})]),_:1})]),_:1},8,[`model-value`]))}}),je={key:1,class:`text-caption text-medium-emphasis mb-2`},Me=I({__name:`PushProgressList`,props:{items:{},batchId:{},pushing:{type:Boolean},cancelling:{type:Boolean},doneCount:{},totalProgress:{}},emits:[`cancel`],setup(e){return(n,r)=>e.items.length>0?(A(),S(u,{key:0,class:`mb-4`,elevation:`0`,border:``,rounded:`lg`},{default:E(()=>[B(h,{class:`d-flex align-center text-subtitle-1`},{default:E(()=>[r[2]||=k(` 推送进度 `,-1),B(G),e.batchId&&e.items.some(e=>e.status===`running`||e.status===`pending`)&&e.pushing?(A(),S(c,{key:0,size:`small`,variant:`tonal`,color:`error`,class:`mr-2`,loading:e.cancelling,onClick:r[0]||=e=>n.$emit(`cancel`)},{default:E(()=>[...r[1]||=[k(` 取消推送 `,-1)]]),_:1},8,[`loading`])):T(``,!0),B(q,{size:`small`,variant:`tonal`,color:`primary`},{default:E(()=>[k(a(e.items.filter(e=>e.status===`success`).length)+`/`+a(e.items.length)+` 完成 `,1)]),_:1})]),_:1}),B(j),B(f,null,{default:E(()=>[e.pushing||e.totalProgress>0?(A(),S(F,{key:0,"model-value":e.totalProgress,color:`primary`,height:`8`,rounded:``,class:`mb-3`},null,8,[`model-value`])):T(``,!0),e.items.length?(A(),v(`div`,je,a(e.doneCount)+` / `+a(e.items.length)+` 台已结束 `,1)):T(``,!0),B(V,{density:`compact`},{default:E(()=>[(A(!0),v(s,null,M(e.items,e=>(A(),S(m,{key:e.id,title:e.name},t({append:E(()=>[e.status===`pending`?(A(),S(C,{key:0,color:`grey`},{default:E(()=>[...r[3]||=[k(`mdi-clock-outline`,-1)]]),_:1})):e.status===`running`?(A(),S(C,{key:1,color:`blue`,class:`mdi-spin`},{default:E(()=>[...r[4]||=[k(`mdi-loading`,-1)]]),_:1})):e.status===`success`?(A(),S(C,{key:2,color:`green`},{default:E(()=>[...r[5]||=[k(`mdi-check-circle`,-1)]]),_:1})):e.status===`cancelled`?(A(),S(C,{key:3,color:`grey`},{default:E(()=>[...r[6]||=[k(`mdi-cancel`,-1)]]),_:1})):(A(),S(C,{key:4,color:`red`},{default:E(()=>[...r[7]||=[k(`mdi-alert-circle`,-1)]]),_:1}))]),_:2},[e.detail?{name:`subtitle`,fn:E(()=>[w(`span`,{class:_(e.status===`failed`?`text-error`:`text-medium-emphasis`)},a(e.detail),3)]),key:`0`}:void 0]),1032,[`title`]))),128))]),_:1})]),_:1})]),_:1})):T(``,!0)}}),Ne={key:0,class:`text-center text-medium-emphasis py-6`},Pe={class:`d-flex align-center px-2 mb-2`},Fe={class:`text-caption text-medium-emphasis ml-1`},Ie={class:`d-flex align-center ga-2`},Le={class:`text-body-2 font-weight-medium text-truncate`},Re={class:`text-caption text-medium-emphasis text-truncate`},ze={key:0,class:`text-caption mt-1`},Be=I({__name:`PushServerGrid`,props:{selectAll:{type:Boolean},serverSearch:{},serversLoading:{type:Boolean},serversByCategory:{},selectedIds:{},pushStatus:{},isCategoryAllSelected:{type:Function}},emits:[`update:serverSearch`,`toggle-all`,`refresh`,`toggle-category`,`toggle-server`],setup(e){return(t,n)=>(A(),S(u,{elevation:`0`,border:``,rounded:`lg`,class:`mb-4`},{default:E(()=>[B(h,{class:`d-flex align-center`},{default:E(()=>[B(ue,{"model-value":e.selectAll,label:`全选`,density:`compact`,"hide-details":``,class:`mr-4`,"onUpdate:modelValue":n[0]||=e=>t.$emit(`toggle-all`)},null,8,[`model-value`]),B(R,{"model-value":e.serverSearch,"prepend-inner-icon":`mdi-magnify`,label:`搜索服务器...`,density:`compact`,"hide-details":``,variant:`outlined`,rounded:``,style:{"max-width":`240px`},"onUpdate:modelValue":n[1]||=e=>t.$emit(`update:serverSearch`,e)},null,8,[`model-value`]),B(c,{icon:`mdi-refresh`,variant:`text`,size:`small`,loading:e.serversLoading,title:`刷新在线状态`,onClick:n[2]||=e=>t.$emit(`refresh`)},null,8,[`loading`])]),_:1}),B(j),B(f,{class:`pa-2`},{default:E(()=>[e.serversByCategory.length===0?(A(),v(`div`,Ne,`暂无服务器`)):(A(!0),v(s,{key:1},M(e.serversByCategory,r=>(A(),v(`div`,{key:r.category,class:`mb-4`},[w(`div`,Pe,[B(c,{size:`x-small`,variant:`text`,color:e.isCategoryAllSelected(r.category)?`primary`:`default`,onClick:e=>t.$emit(`toggle-category`,r.category)},{default:E(()=>[B(C,{size:`16`,class:`mr-1`},{default:E(()=>[k(a(e.isCategoryAllSelected(r.category)?`mdi-checkbox-marked`:`mdi-checkbox-blank-outline`),1)]),_:2},1024),k(` `+a(r.category),1)]),_:2},1032,[`color`,`onClick`]),w(`span`,Fe,` (`+a(r.servers.filter(t=>e.selectedIds.has(t.id)).length)+`/`+a(r.servers.length)+`) `,1)]),B(W,{dense:``},{default:E(()=>[(A(!0),v(s,null,M(r.servers,r=>(A(),S(U,{key:r.id,cols:`6`,sm:`4`,md:`3`,lg:`2`},{default:E(()=>[B(u,{color:e.selectedIds.has(r.id)?`primary`:void 0,variant:e.selectedIds.has(r.id)?`tonal`:`outlined`,rounded:`lg`,class:`pa-3 cursor-pointer`,onClick:e=>t.$emit(`toggle-server`,r.id)},{default:E(()=>[w(`div`,Ie,[B(C,{color:d(ye)(r.is_online),size:`12`},{default:E(()=>[...n[3]||=[k(`mdi-circle`,-1)]]),_:1},8,[`color`]),w(`span`,Le,a(r.name),1)]),w(`div`,Re,a(r.domain),1),e.pushStatus[r.id]?(A(),v(`div`,ze,[B(q,{color:d(ve)(e.pushStatus[r.id]),size:`x-small`,variant:`tonal`,label:``,border:`sm`},{default:E(()=>[k(a(e.pushStatus[r.id]),1)]),_:2},1032,[`color`])])):T(``,!0)]),_:2},1032,[`color`,`variant`,`onClick`])]),_:2},1024))),128))]),_:2},1024)]))),128))]),_:1})]),_:1}))}}),Ve=D({...ce({falseIcon:`$radioOff`,trueIcon:`$radioOn`})},`VRadio`),Q=L()({name:`VRadio`,props:Ve(),setup(e,{slots:t}){return z(()=>B(H,P(H.filterProps(e),{class:[`v-radio`,e.class],style:e.style,type:`radio`}),t)),{}}}),He=D({height:{type:[Number,String],default:`auto`},...g(re(),[`direction`]),...g(se(),[`multiple`]),trueIcon:{type:O,default:`$radioOn`},falseIcon:{type:O,default:`$radioOff`},type:{type:String,default:`radio`}},`VRadioGroup`),Ue=L()({name:`VRadioGroup`,inheritAttrs:!1,props:He(),emits:{"update:modelValue":e=>!0},setup(e,{attrs:t,slots:r}){let i=ee(),a=o(()=>e.id||`radio-group-${i}`),c=y(e,`modelValue`),l=n();return z(()=>{let[n,i]=b(t),o=N.filterProps(e),u=H.filterProps(e),d=r.label?r.label({label:e.label,props:{for:a.value}}):e.label;return B(N,P({ref:l,class:[`v-radio-group`,e.class],style:e.style},n,o,{modelValue:c.value,"onUpdate:modelValue":e=>c.value=e,id:a.value}),{...r,default:({id:t,messagesId:n,isDisabled:a,isReadonly:o})=>w(s,null,[d&&B(ne,{id:t.value},{default:()=>[d]}),B(le,P(u,{id:t.value,"aria-describedby":n.value,defaultsTarget:`VRadio`,trueIcon:e.trueIcon,falseIcon:e.falseIcon,type:e.type,disabled:a.value,readonly:o.value,"aria-labelledby":d?t.value:void 0,multiple:!1},i,{modelValue:c.value,"onUpdate:modelValue":e=>c.value=e}),r)])})}),ae({},l)}}),We={class:`text-caption text-medium-emphasis mt-1`},Ge=I({__name:`PushSyncModeCard`,props:{syncMode:{},syncModeDesc:{}},emits:[`update:syncMode`],setup(e){return(t,n)=>(A(),S(u,{elevation:`0`,border:``,rounded:`lg`,class:`mb-4`},{default:E(()=>[B(h,{class:`text-subtitle-1`},{default:E(()=>[...n[1]||=[k(`同步模式`,-1)]]),_:1}),B(f,null,{default:E(()=>[B(Ue,{"model-value":e.syncMode,inline:``,density:`compact`,"onUpdate:modelValue":n[0]||=e=>t.$emit(`update:syncMode`,e)},{default:E(()=>[B(Q,{label:`增量同步`,value:`incremental`}),B(Q,{label:`全量同步`,value:`full`}),B(Q,{label:`校验和同步`,value:`checksum`})]),_:1},8,[`model-value`]),e.syncMode===`full`?(A(),S(X,{key:0,type:`warning`,density:`compact`,variant:`tonal`,class:`mt-2`},{default:E(()=>[...n[2]||=[k(` 全量同步会删除目标目录中不存在于源目录的文件 `,-1)]]),_:1})):T(``,!0),w(`div`,We,a(e.syncModeDesc),1)]),_:1})]),_:1}))}}),Ke=I({__name:`PushToolbar`,props:{sourcePath:{},targetPath:{},zipLocked:{type:Boolean},pushing:{type:Boolean}},emits:[`update:sourcePath`,`update:targetPath`,`preview`,`push`],setup(e){return(t,n)=>(A(),S(u,{elevation:`0`,border:``,rounded:`lg`,class:`mb-4 pa-4`},{default:E(()=>[B(W,{align:`center`,dense:``},{default:E(()=>[B(U,{cols:`12`,sm:`4`},{default:E(()=>[B(R,{"model-value":e.sourcePath,label:`推送源路径`,variant:`outlined`,density:`compact`,"prepend-inner-icon":`mdi-folder`,disabled:e.zipLocked,hint:e.zipLocked?`已使用 ZIP 解压目录作为源路径`:void 0,"persistent-hint":``,"onUpdate:modelValue":n[0]||=e=>t.$emit(`update:sourcePath`,e)},null,8,[`model-value`,`disabled`,`hint`])]),_:1}),B(U,{cols:`12`,sm:`4`},{default:E(()=>[B(R,{"model-value":e.targetPath,label:`目标路径`,variant:`outlined`,density:`compact`,"prepend-inner-icon":`mdi-folder-marker`,"onUpdate:modelValue":n[1]||=e=>t.$emit(`update:targetPath`,e)},null,8,[`model-value`])]),_:1}),B(U,{cols:`12`,sm:`4`,class:`d-flex ga-2 justify-end`},{default:E(()=>[B(c,{size:`small`,variant:`tonal`,"prepend-icon":`mdi-eye`,onClick:n[2]||=e=>t.$emit(`preview`)},{default:E(()=>[...n[4]||=[k(`预览`,-1)]]),_:1}),B(c,{size:`small`,color:`primary`,variant:`flat`,"prepend-icon":`mdi-upload`,loading:e.pushing,onClick:n[3]||=e=>t.$emit(`push`)},{default:E(()=>[...n[5]||=[k(` 推送 `,-1)]]),_:1},8,[`loading`])]),_:1})]),_:1})]),_:1}))}}),qe={key:0},Je={key:1,class:`d-flex align-center`},Ye=I({__name:`PushZipUpload`,props:{uploadedZip:{},isDragging:{type:Boolean},zipUploading:{type:Boolean}},emits:[`dragover`,`dragleave`,`drop`,`file-select`,`clear`],setup(e){let t=n(null);return(n,r)=>(A(),S(u,{elevation:`0`,border:``,rounded:`lg`,class:`mb-4`},{default:E(()=>[B(h,{class:`text-subtitle-1`},{default:E(()=>[...r[6]||=[k(`源文件`,-1)]]),_:1}),B(f,null,{default:E(()=>[e.uploadedZip?(A(),v(`div`,Je,[B(C,{class:`mr-2`},{default:E(()=>[...r[10]||=[k(`mdi-folder-zip`,-1)]]),_:1}),w(`span`,null,a(e.uploadedZip.name)+` (`+a(e.uploadedZip.fileCount)+` 个文件, `+a(d(Z)(e.uploadedZip.size))+`)`,1),B(G),B(c,{size:`small`,variant:`text`,color:`error`,onClick:r[5]||=e=>n.$emit(`clear`)},{default:E(()=>[...r[11]||=[k(`清除`,-1)]]),_:1})])):(A(),v(`div`,qe,[w(`div`,{class:_([`border-dashed border rounded pa-6 text-center cursor-pointer`,{"border-primary bg-primary-lighten-5":e.isDragging}]),onDragover:r[0]||=i(e=>n.$emit(`dragover`),[`prevent`]),onDragleave:r[1]||=e=>n.$emit(`dragleave`),onDrop:r[2]||=i(e=>n.$emit(`drop`,e),[`prevent`]),onClick:r[3]||=e=>t.value?.click()},[B(C,{size:`48`,color:`grey`},{default:E(()=>[...r[7]||=[k(`mdi-cloud-upload-outline`,-1)]]),_:1}),r[8]||=w(`div`,{class:`text-body-2 mt-2`},`拖拽 ZIP 文件到此处,或点击选择`,-1),r[9]||=w(`div`,{class:`text-caption text-medium-emphasis`},`支持 .zip 格式`,-1)],34),w(`input`,{ref_key:`zipInputRef`,ref:t,type:`file`,accept:`.zip`,hidden:``,onChange:r[4]||=e=>n.$emit(`file-select`,e)},null,544)])),e.zipUploading?(A(),S(F,{key:2,indeterminate:``,class:`mt-2`})):T(``,!0)]),_:1})]),_:1}))}}),$=[`success`,`failed`,`cancelled`];function Xe(){let e=K(),t=n(``),r=n(``),i=n(`incremental`),a=n(!1),s=n(null),c=n(!1),u=o(()=>{switch(i.value){case`incremental`:return`仅传输新增或修改的文件`;case`full`:return`使目标目录与源目录完全一致,会删除不存在于源的文件`;case`checksum`:return`通过文件内容校验和判断是否需要传输`;default:return``}});function d(){return s.value?.sourcePath||t.value}function f(t){return d()?r.value.trim()?t===0?(e(`请选择至少一台服务器`,`warning`),!1):!0:(e(`请填写目标路径`,`warning`),!1):(e(`请选择源路径或上传 ZIP 文件`,`warning`),!1)}async function p(e){a.value=!1;let t=e.dataTransfer?.files[0];t?.name.endsWith(`.zip`)&&await h(t)}function m(e){let t=e.target.files?.[0];t&&h(t)}async function h(t){c.value=!0;try{let n=new FormData;n.append(`file`,t);let r=await l.upload(`/sync/upload-zip`,n);s.value={name:t.name,sourcePath:r.source_path,fileCount:r.file_count,size:r.size},e(`ZIP 上传成功`)}catch(t){e(t instanceof Error?t.message:`上传失败`,`error`)}finally{c.value=!1}}function g(){s.value=null}return{sourcePath:t,targetPath:r,syncMode:i,syncModeDesc:u,isDragging:a,uploadedZip:s,zipUploading:c,effectiveSourcePath:d,validateForm:f,handleZipDrop:p,handleZipSelect:m,clearZipUpload:g}}function Ze(e){let t=n([]),r=n(!1),i=n(``),a=n(new Set),s=null;async function c(){r.value=!0;try{t.value=(await l.get(`/servers/`,{per_page:200})).items||[]}catch{t.value=[]}finally{r.value=!1}}function u(e){d(),s=setInterval(()=>{e()||c()},6e4)}function d(){s&&=(clearInterval(s),null)}let f=o(()=>{if(!i.value)return t.value;let e=i.value.toLowerCase();return t.value.filter(t=>t.name.toLowerCase().includes(e)||(t.domain||``).toLowerCase().includes(e))}),p=o(()=>{let e=f.value;return e.length>0&&e.every(e=>a.value.has(e.id))}),m=o(()=>{let e={};for(let t of f.value){let n=t.category||`未分类`;e[n]||(e[n]=[]),e[n].push(t)}return Object.entries(e).map(([e,t])=>({category:e,servers:t}))});function h(e){let t=m.value.find(t=>t.category===e);return!t||t.servers.length===0?!1:t.servers.every(e=>a.value.has(e.id))}function g(e){let t=m.value.find(t=>t.category===e);if(!t)return;let n=new Set(a.value),r=t.servers.every(e=>n.has(e.id));for(let e of t.servers)r?n.delete(e.id):n.add(e.id);a.value=n}function _(e){let t=new Set(a.value);t.has(e)?t.delete(e):t.add(e),a.value=t}function v(){let e=f.value,t=e.length>0&&e.every(e=>a.value.has(e.id)),n=new Set(a.value);for(let r of e)t?n.delete(r.id):n.add(r.id);a.value=n}return{servers:t,serversLoading:r,serverSearch:i,selectedIds:a,pushStatus:e,filteredServers:f,selectAll:p,serversByCategory:m,loadServers:c,startAutoRefresh:u,stopAutoRefresh:d,isCategoryAllSelected:h,toggleCategory:g,toggleServer:_,toggleAll:v}}function Qe(e,t,r){let i=K(),a=p(),s=n(!1),c=n(!1),u=n([]),d=n(``),f=n(null),m=[],h=o(()=>u.value.filter(e=>$.includes(e.status)).length),g=o(()=>{let e=u.value.length;return e?Math.round(h.value/e*100):0});function _(){m.forEach(e=>clearTimeout(e)),m.length=0}function v(){let e=u.value.length;if(!e||!s.value||u.value.filter(e=>$.includes(e.status)).length<e)return;s.value=!1,x(),r();let t=u.value.filter(e=>e.status===`failed`).length,n=u.value.filter(e=>e.status===`cancelled`).length,a=u.value.filter(e=>e.status===`success`).length;i(`推送完成:${a} 成功,${t} 失败${n?`${n} 取消`:``}`)}function y(e){if(e.type!==`sync_progress`||e.batch_id!==d.value||e.server_id==null)return;let n=u.value.findIndex(t=>t.id===e.server_id);if(n===-1)return;let r=u.value[n],i=e.status;if(i===`running`)r.status=`running`,r.detail=`同步中...`;else if(i===`success`){r.status=`success`;let n=e.duration_seconds;r.detail=n==null?`完成`:`完成(${n}s`,t.pushStatus.value[e.server_id]=`成功`}else i===`failed`?(r.status=`failed`,r.detail=e.error_message||`失败`,t.pushStatus.value[e.server_id]=`失败`):i===`cancelled`&&(r.status=`cancelled`,r.detail=e.error_message||`已取消`,t.pushStatus.value[e.server_id]=`已取消`);v()}function b(){if(!a.token)return;x();let e=fe(`/ws/sync`,{token:a.token}),n=new WebSocket(e);n.onmessage=e=>{if(e.data!==`pong`)try{let t=JSON.parse(e.data);if(t.type===`ping`){n.send(`pong`);return}y(t)}catch{}},n.onclose=e=>{f.value=null,e.code!==1e3&&s.value&&(u.value.forEach(e=>{(e.status===`pending`||e.status===`running`)&&(e.status=`failed`,e.detail=`连接中断`,t.pushStatus.value[e.id]=`失败`)}),s.value=!1,i(`推送进度连接中断,部分服务器状态未知`,`warning`),r())},f.value=n}function x(){f.value&&=(f.value.close(1e3),null)}async function S(){if(d.value){c.value=!0;try{await l.post(`/sync/cancel`,{batch_id:d.value}),u.value.forEach(e=>{(e.status===`pending`||e.status===`running`)&&(e.status=`cancelled`,e.detail=`已取消`,t.pushStatus.value[e.id]=`已取消`)}),s.value=!1,x(),r(),i(`推送已取消`)}catch(e){i(e instanceof Error?e.message:`取消失败`,`error`)}finally{c.value=!1}}}async function C(){if(s.value||!e.validateForm(t.selectedIds.value.size))return;_(),x(),d.value=``,t.pushStatus.value={};let n=[...t.selectedIds.value];u.value=n.map(e=>({id:e,name:t.servers.value.find(t=>t.id===e)?.name||`#${e}`,status:`pending`})),s.value=!0;try{if(d.value=(await l.post(`/sync/files`,{source_path:e.effectiveSourcePath(),target_path:e.targetPath.value,server_ids:n,sync_mode:e.syncMode.value})).batch_id||``,!d.value)throw Error(`未返回 batch_id,无法追踪进度`);b()}catch(e){let t=e instanceof Error?e.message:`推送请求失败`;u.value.forEach(e=>{e.status=`failed`,e.detail=t}),s.value=!1,i(t,`error`);return}let a=setTimeout(()=>{s.value&&(u.value.forEach(e=>{(e.status===`pending`||e.status===`running`)&&(e.status=`failed`,e.detail=`等待超时`,t.pushStatus.value[e.id]=`失败`)}),s.value=!1,x(),r(),i(`推送超时,${h.value}/${u.value.length} 台已有结果`,`warning`))},3e5);m.push(a)}function w(){x(),_()}return{pushing:s,cancelling:c,wsProgressItems:u,pushBatchId:d,doneCount:h,totalProgress:g,doPush:C,cancelPush:S,dispose:w}}function $e(e,t){let r=n(!1),i=n([]),a=n(!1),s=n(0),c=n(0),u=o(()=>s.value>30),d=o(()=>i.value.filter(e=>e.error).length);async function f(t,n){try{let r=await l.post(`/sync/preview`,{source_path:e.effectiveSourcePath(),target_path:e.targetPath.value,server_id:t,sync_mode:e.syncMode.value});return r.error?{server_id:t,server_name:n,error:r.error}:{server_id:t,server_name:r.server_name||n,stats:r.stats}}catch(e){return{server_id:t,server_name:n,error:e instanceof Error?e.message:`预览失败`}}}async function p(){if(!e.validateForm(t.selectedIds.value.size))return;let n=[...t.selectedIds.value];s.value=n.length,c.value=0,r.value=!0,a.value=!0,i.value=[];let o=n.map(e=>({id:e,name:t.servers.value.find(t=>t.id===e)?.name||`#${e}`}));for(let e=0;e<o.length;e+=4){let t=o.slice(e,e+4),n=await Promise.all(t.map(e=>f(e.id,e.name)));i.value=[...i.value,...n],c.value=i.value.length}a.value=!1}function m(){r.value=!1}function h(e){r.value=!1,e()}return{showPreview:r,previewResults:i,previewLoading:a,previewTotal:s,previewDone:c,previewLargeBatch:u,previewWarnThreshold:30,previewErrorCount:d,doPreview:p,closePreview:m,confirmAndPush:h}}var et=[{label:`成功`,value:`success`},{label:`失败`,value:`failed`},{label:`进行中`,value:`running`},{label:`已取消`,value:`cancelled`}],tt=[{label:`增量`,value:`incremental`},{label:`全量`,value:`full`},{label:`校验和`,value:`checksum`}],nt=[{title:`时间`,key:`started_at`,width:170},{title:`服务器`,key:`server_name`,width:120},{title:`状态`,key:`status`,width:88},{title:`模式`,key:`sync_mode`,width:88},{title:`源路径`,key:`source_path`},{title:`目标路径`,key:`target_path`},{title:`错误`,key:`error_message`,width:200},{title:`操作`,key:`actions`,width:88,sortable:!1}];function rt(e,t){let r=K(),i=n([]),a=n(0),s=n(!1),c=n(1),u=n(null),d=n(null),f=n(null),p=n(!1),m=n(!1),h=n(!1),g=n(null),_=n(null),v=o(()=>t.servers.value.map(e=>({title:e.name,value:e.id})));function y(){c.value=1,b()}async function b(){s.value=!0;try{let e={page:c.value,per_page:15};u.value&&(e.status=u.value),d.value&&(e.sync_mode=d.value),f.value!=null&&(e.server_id=f.value);let t=await l.get(`/servers/logs`,e);i.value=t.items||[],a.value=t.total||0}catch{i.value=[],a.value=0}finally{s.value=!1}}async function x(){p.value=!0;try{let e=(await l.post(`/sync/reconcile-stale-logs`,{max_age_minutes:120})).reconciled??0;r(e>0?`已订正 ${e} 条卡住的推送记录`:`没有需要订正的记录`),await b()}catch(e){r(e instanceof Error?e.message:`订正失败`,`error`)}finally{p.value=!1}}async function S(t){_.value=t,g.value=null,m.value=!0,h.value=!0;try{g.value=await l.post(`/sync/diagnose`,{server_id:t.server_id,target_path:t.target_path||e.targetPath.value||void 0})}catch(e){r(e instanceof Error?e.message:`诊断失败`,`error`),m.value=!1}finally{h.value=!1}}function C(){m.value=!1}return{logs:i,logTotal:a,logLoading:s,logPage:c,logStatusFilter:u,logSyncModeFilter:d,logServerFilter:f,reconcilingLogs:p,logStatusOptions:et,logSyncModeOptions:tt,logHeaders:nt,logServerOptions:v,showDiagnose:m,diagnoseLoading:h,diagnoseResult:g,diagnoseTarget:_,onLogFilterChange:y,loadLogs:b,reconcileStaleLogs:x,openDiagnose:S,closeDiagnose:C}}function it(){let e=Xe(),t=Ze(n({})),r=rt(e,t),i=Qe(e,t,()=>r.loadLogs()),a=$e(e,t);function o(){a.confirmAndPush(()=>i.doPush())}return ie(()=>{t.loadServers(),r.loadLogs(),t.startAutoRefresh(()=>i.pushing.value)}),te(()=>{i.dispose(),t.stopAutoRefresh()}),{form:x(e),servers:x(t),progress:x(i),preview:x(a),logs:x(r),onConfirmAndPush:o}}var at=I({__name:`PushPage`,setup(e){let{form:t,servers:n,progress:r,preview:i,logs:a,onConfirmAndPush:o}=it();return(e,s)=>(A(),S(oe,{fluid:``,class:`pa-6`},{default:E(()=>[B(Ye,{"uploaded-zip":d(t).uploadedZip,"is-dragging":d(t).isDragging,"zip-uploading":d(t).zipUploading,onDragover:s[0]||=e=>d(t).isDragging=!0,onDragleave:s[1]||=e=>d(t).isDragging=!1,onDrop:d(t).handleZipDrop,onFileSelect:d(t).handleZipSelect,onClear:d(t).clearZipUpload},null,8,[`uploaded-zip`,`is-dragging`,`zip-uploading`,`onDrop`,`onFileSelect`,`onClear`]),B(Ke,{"source-path":d(t).sourcePath,"onUpdate:sourcePath":s[2]||=e=>d(t).sourcePath=e,"target-path":d(t).targetPath,"onUpdate:targetPath":s[3]||=e=>d(t).targetPath=e,"zip-locked":!!d(t).uploadedZip,pushing:d(r).pushing,onPreview:d(i).doPreview,onPush:d(r).doPush},null,8,[`source-path`,`target-path`,`zip-locked`,`pushing`,`onPreview`,`onPush`]),B(Be,{"select-all":d(n).selectAll,"server-search":d(n).serverSearch,"onUpdate:serverSearch":s[4]||=e=>d(n).serverSearch=e,"servers-loading":d(n).serversLoading,"servers-by-category":d(n).serversByCategory,"selected-ids":d(n).selectedIds,"push-status":d(n).pushStatus,"is-category-all-selected":d(n).isCategoryAllSelected,onToggleAll:d(n).toggleAll,onRefresh:d(n).loadServers,onToggleCategory:d(n).toggleCategory,onToggleServer:d(n).toggleServer},null,8,[`select-all`,`server-search`,`servers-loading`,`servers-by-category`,`selected-ids`,`push-status`,`is-category-all-selected`,`onToggleAll`,`onRefresh`,`onToggleCategory`,`onToggleServer`]),B(Ge,{"sync-mode":d(t).syncMode,"onUpdate:syncMode":s[5]||=e=>d(t).syncMode=e,"sync-mode-desc":d(t).syncModeDesc},null,8,[`sync-mode`,`sync-mode-desc`]),B(Me,{items:d(r).wsProgressItems,"batch-id":d(r).pushBatchId,pushing:d(r).pushing,cancelling:d(r).cancelling,"done-count":d(r).doneCount,"total-progress":d(r).totalProgress,onCancel:d(r).cancelPush},null,8,[`items`,`batch-id`,`pushing`,`cancelling`,`done-count`,`total-progress`,`onCancel`]),B(Ae,{modelValue:d(i).showPreview,"onUpdate:modelValue":s[6]||=e=>d(i).showPreview=e,loading:d(i).previewLoading,results:d(i).previewResults,"selected-count":d(n).selectedIds.size,"preview-done":d(i).previewDone,"preview-total":d(i).previewTotal,"large-batch":d(i).previewLargeBatch,"warn-threshold":d(i).previewWarnThreshold,"error-count":d(i).previewErrorCount,"sync-mode":d(t).syncMode,onConfirmPush:d(o)},null,8,[`modelValue`,`loading`,`results`,`selected-count`,`preview-done`,`preview-total`,`large-batch`,`warn-threshold`,`error-count`,`sync-mode`,`onConfirmPush`]),B(pe,{modelValue:d(a).showDiagnose,"onUpdate:modelValue":s[7]||=e=>d(a).showDiagnose=e,loading:d(a).diagnoseLoading,result:d(a).diagnoseResult,"target-name":d(a).diagnoseTarget?.server_name},null,8,[`modelValue`,`loading`,`result`,`target-name`]),B(we,{items:d(a).logs,headers:d(a).logHeaders,total:d(a).logTotal,loading:d(a).logLoading,page:d(a).logPage,"onUpdate:page":s[8]||=e=>d(a).logPage=e,"status-filter":d(a).logStatusFilter,"onUpdate:statusFilter":s[9]||=e=>d(a).logStatusFilter=e,"sync-mode-filter":d(a).logSyncModeFilter,"onUpdate:syncModeFilter":s[10]||=e=>d(a).logSyncModeFilter=e,"server-filter":d(a).logServerFilter,"onUpdate:serverFilter":s[11]||=e=>d(a).logServerFilter=e,"status-options":d(a).logStatusOptions,"sync-mode-options":d(a).logSyncModeOptions,"server-options":d(a).logServerOptions,reconciling:d(a).reconcilingLogs,onFilterChange:d(a).onLogFilterChange,onPageChange:d(a).loadLogs,onReconcile:d(a).reconcileStaleLogs,onDiagnose:d(a).openDiagnose},null,8,[`items`,`headers`,`total`,`loading`,`page`,`status-filter`,`sync-mode-filter`,`server-filter`,`status-options`,`sync-mode-options`,`server-options`,`reconciling`,`onFilterChange`,`onPageChange`,`onReconcile`,`onDiagnose`])]),_:1}))}});export{at as default};