zen-gitsync 2.1.2 → 2.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  import{d as Ct,r,E as o,o as qe,a as ss,l as as,b as lt,c as _e,w as Ye,e as ls,f as g,g as u,h as e,i as t,j as St,u as a,k as s,m as At,n as yt,p as bt,q as Ce,s as Et,t as jt,v as os,x as ot,y as ht,z as C,A as h,B as q,C as re,D as Tt,F as _t,G as he,H as be,I as tt,J as nt,K as Mt,L as Pt,M as it,N as Ue,O as Ve,P as Ut,Q as ns,R as zt,S as Ne,T as xt,U as Oe,V as Gt,W as Ot,X as Je,Y as st,Z as at,_ as is,$ as Ft,a0 as kt,a1 as rs,a2 as Qe,a3 as cs,a4 as us,a5 as It,a6 as Nt,a7 as ds,a8 as fs,a9 as ps,aa as vs,ab as ms,ac as Dt,ad as gs,ae as ys,af as hs,ag as _s,ah as ws,ai as $s,aj as bs,ak as He,al as ks,am as Cs,an as Ss,ao as Ts,ap as xs}from"./vendor-Dy1zosHw.js";(function(){const p=document.createElement("link").relList;if(p&&p.supports&&p.supports("modulepreload"))return;for(const i of document.querySelectorAll('link[rel="modulepreload"]'))y(i);new MutationObserver(i=>{for(const D of i)if(D.type==="childList")for(const E of D.addedNodes)E.tagName==="LINK"&&E.rel==="modulepreload"&&y(E)}).observe(document,{childList:!0,subtree:!0});function $(i){const D={};return i.integrity&&(D.integrity=i.integrity),i.referrerPolicy&&(D.referrerPolicy=i.referrerPolicy),i.crossOrigin==="use-credentials"?D.credentials="include":i.crossOrigin==="anonymous"?D.credentials="omit":D.credentials="same-origin",D}function y(i){if(i.ep)return;i.ep=!0;const D=$(i);fetch(i.href,D)}})();const Fe=Ct("git",()=>{const Q=r(""),p=r([]),$=r(""),y=r(""),i=r(!1),D=r(!1),E=r(!1),ee=r(0),te=r(0),X=r(0),O=r(!1),b=r(""),k=r(0),F=r(0);function K(){Q.value="",p.value=[],$.value="",y.value="",i.value=!1,D.value=!1,E.value=!1,ee.value=0,te.value=0,X.value=0,O.value=!1,b.value="",k.value=0,F.value=0}async function P(){if(E.value)try{console.log("获取分支状态...");const S=await(await fetch("/api/branch-status")).json();S&&(te.value=S.ahead||0,X.value=S.behind||0,O.value=S.hasUpstream||!1,b.value=S.upstreamBranch||"",k.value=Date.now(),console.log(`分支状态更新:领先 ${te.value} 个提交,落后 ${X.value} 个提交,上游分支:${O.value?b.value:"无"}`))}catch(x){console.error("获取分支状态失败:",x),te.value=0,X.value=0,O.value=!1,b.value=""}}async function Y(){const x=Date.now();if(x-ee.value<1e3)return console.log("使用缓存的Git仓库状态:",E.value?"是":"不是"),E.value;try{const ae=await(await fetch("/api/current_directory")).json();return E.value=ae.isGitRepo===!0,ee.value=x,console.log(`当前目录${E.value?"是":"不是"}Git仓库`),E.value}catch(S){return console.error("检查Git仓库状态失败:",S),E.value=!1,ee.value=x,!1}}async function A(){try{const S=await(await fetch("/api/branch")).json();S.branch&&(Q.value=S.branch)}catch(x){console.error("获取分支信息失败:",x)}}async function H(){if(E.value)try{console.log("获取所有分支...");const S=await(await fetch("/api/branches")).json();S.branches&&Array.isArray(S.branches)&&(p.value=S.branches,F.value=Date.now(),console.log(`获取到${S.branches.length}个分支`))}catch(x){console.error("获取所有分支信息失败:",x)}}async function J(x){console.log("切换到分支:",x);try{i.value=!0;const ae=await(await fetch("/api/checkout",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({branch:x})})).json();return ae.success?(o({message:`已切换到分支: ${x}`,type:"success"}),await A(),await P(),!0):(o({message:`切换分支失败: ${ae.error}`,type:"error"}),!1)}catch(S){return o({message:`切换分支失败: ${S.message}`,type:"error"}),!1}finally{i.value=!1}}async function le(){try{const S=await(await fetch("/api/user-info")).json();S.name&&S.email&&($.value=S.name,y.value=S.email)}catch(x){console.error("获取用户信息失败:",x)}}async function ce(x,S){if(!x.trim())return o({message:"分支名称不能为空",type:"warning"}),!1;try{D.value=!0;const _=await(await fetch("/api/create-branch",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({newBranchName:x,baseBranch:S||Q.value})})).json();return _.success?(o({message:`已创建并切换到分支: ${x}`,type:"success"}),await A(),await P(),await H(),!0):(o({message:`创建分支失败: ${_.error}`,type:"error"}),!1)}catch(ae){return o({message:`创建分支失败: ${ae.message}`,type:"error"}),!1}finally{D.value=!1}}async function ue(){try{const S=await(await fetch("/api/clear-user-config",{method:"POST"})).json();return S.success?($.value="",y.value="",o({message:"已清除Git用户配置",type:"success"}),!0):(o({message:`清除配置失败: ${S.error}`,type:"error"}),!1)}catch(x){return o({message:`清除配置失败: ${x.message}`,type:"error"}),!1}}async function j(x,S){try{const _=await(await fetch("/api/restore-user-config",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:x,email:S})})).json();return _.success?($.value=x,y.value=S,o({message:"已恢复Git用户配置",type:"success"}),!0):(o({message:`恢复配置失败: ${_.error}`,type:"error"}),!1)}catch(ae){return o({message:`恢复配置失败: ${ae.message}`,type:"error"}),!1}}async function fe(){if(!E.value)return o({message:"当前目录不是Git仓库",type:"warning"}),!1;try{const S=await(await fetch("/api/pull",{method:"POST"})).json();return S.success?(o({message:"拉取成功",type:"success"}),await P(),!0):(S.needsMerge?o({message:`需要合并更改: ${S.pullOutput||"存在冲突需要手动解决"}`,type:"warning",duration:5e3}):o({message:`拉取失败: ${S.error}`,type:"error"}),!1)}catch(x){return o({message:`拉取失败: ${x.message}`,type:"error"}),!1}}async function se(){if(!E.value)return o({message:"当前目录不是Git仓库",type:"warning"}),!1;try{const S=await(await fetch("/api/fetch-all",{method:"POST"})).json();return S.success?(o({message:"获取所有远程分支信息成功",type:"success"}),await P(),!0):(o({message:`获取远程分支信息失败: ${S.error}`,type:"error"}),!1)}catch(x){return o({message:`获取远程分支信息失败: ${x.message}`,type:"error"}),!1}}return{currentBranch:Q,allBranches:p,userName:$,userEmail:y,isChangingBranch:i,isCreatingBranch:D,isGitRepo:E,lastCheckedTime:ee,branchAhead:te,branchBehind:X,hasUpstream:O,upstreamBranch:b,lastBranchStatusTime:k,lastBranchesTime:F,$reset:K,checkGitRepo:Y,getCurrentBranch:A,getAllBranches:H,changeBranch:J,getUserInfo:le,createBranch:ce,clearUserConfig:ue,restoreUserConfig:j,getBranchStatus:P,gitPull:fe,gitFetchAll:se}}),wt=300,Lt=Ct("gitLog",()=>{const Q=Fe();let p=null;const $=r(!0),y=r([]),i=r({staged:[],unstaged:[],untracked:[]}),D=r(""),E=r([]),ee=r(!1),te=r(!1),X=r(!1),O=r(!1),b=r(!1),k=r(!1);function F(){p&&p.disconnect();try{const _="http://localhost:3000";if(console.log("尝试连接Socket.IO服务器:",_),p=as(_,{reconnectionDelayMax:1e4,reconnection:!0,reconnectionAttempts:10,reconnectionDelay:1e3,timeout:2e4,autoConnect:!0,forceNew:!0,transports:["websocket","polling"]}),!p){console.error("Socket.IO初始化失败: socket为null");return}console.log("Socket.IO初始化成功,socket ID:",p.id||"未连接"),p.on("connect",()=>{console.log("成功连接到Socket.IO服务器"),$.value&&p&&p.emit("start_monitoring")}),p.on("disconnect",v=>{console.log("与Socket.IO服务器断开连接:",v)}),p.on("git_status_update",v=>{$.value&&(console.log("收到Git状态更新通知:",new Date().toLocaleTimeString()),v.status&&(D.value=v.status),v.porcelain!==void 0&&P(v.porcelain))}),p.on("monitoring_status",v=>{console.log("文件监控状态:",v.active?"已启动":"已停止")}),p.on("connect_error",v=>{console.error("Socket连接错误:",v.message)}),p.on("connect_timeout",()=>{console.error("Socket连接超时")}),p.on("reconnect",v=>{console.log(`Socket重连成功,尝试次数: ${v}`),$.value&&(console.log("重连后重新发送start_monitoring请求"),p==null||p.emit("start_monitoring"))}),p.on("reconnect_attempt",v=>{console.log(`Socket尝试重连,第 ${v} 次尝试`)}),p.on("reconnect_error",v=>{console.error("Socket重连错误:",v.message)}),p.on("reconnect_failed",()=>{console.error("Socket重连失败,已达到最大重试次数")}),p&&!p.connected&&(console.log("Socket未连接,尝试手动连接..."),p.connect())}catch(_){console.error("Socket.IO连接初始化失败:",_)}}function K(){if(console.log("toggleAutoUpdate调用,当前值:",$.value),!p){console.error("无法切换自动更新状态: socket连接不存在"),o.error("无法连接到服务器,自动更新可能不会生效"),console.log("尝试重新建立socket连接..."),F(),localStorage.setItem("zen-gitsync-auto-update",$.value.toString());return}try{$.value?(console.log("发送start_monitoring命令..."),p.emit("start_monitoring"),o.success("自动更新已启用")):(console.log("发送stop_monitoring命令..."),p.emit("stop_monitoring"),o.info("自动更新已禁用")),localStorage.setItem("zen-gitsync-auto-update",$.value.toString()),console.log("已保存自动更新设置到本地存储:",$.value)}catch(_){console.error("切换自动更新状态时出错:",_),o.error(`切换自动更新失败: ${_.message}`)}}function P(_){if(_===void 0||_===""){E.value=[];return}const v=_.split(`
2
2
  `),N=[];for(const oe of v){const ke=oe.match(/^([ MADRCU\?]{2})\s+(.+)$/);if(ke){let ne="";const pe=ke[1],T=pe.charAt(0),d=pe.charAt(1);T==="A"||T==="M"||T==="D"||T==="R"?ne="added":T===" "&&d==="M"?ne="modified":T===" "&&d==="D"?ne="deleted":pe==="??"?ne="untracked":ne="other",N.push({path:ke[2],type:ne})}}E.value=N}async function Y(_=!0){if(!Q.isGitRepo){console.log("当前目录不是Git仓库,跳过加载提交历史");return}try{ee.value=!0,console.log("开始加载提交历史...");const v=new Date().getTime(),oe=await(await fetch(`/api/log?page=1&_t=${v}`)).json();oe&&oe.data&&Array.isArray(oe.data)?(y.value=[...oe.data],console.log(`提交历史加载完成,共 ${y.value.length} 条记录`)):(console.warn("API返回的提交历史格式不正确:",oe),y.value=[]),_&&o({message:"提交历史已更新",type:"success"})}catch(v){console.error("获取提交历史失败:",v),_&&o({message:`获取提交历史失败: ${v.message}`,type:"error"})}finally{ee.value=!1}}async function A(){if(!Q.isGitRepo){console.log("当前目录不是Git仓库,跳过加载Git状态");return}try{te.value=!0;const v=await(await fetch("/api/status")).json();v.status&&(D.value=v.status,i.value={staged:v.status.staged||[],unstaged:v.status.unstaged||[],untracked:v.status.untracked||[]}),await H()}catch(_){console.error("获取Git状态失败:",_),o({message:`获取Git状态失败: ${_.message}`,type:"error"})}finally{te.value=!1}}async function H(){if(console.log("开始获取Git状态(porcelain格式)..."),!Q.isGitRepo){console.log("当前目录不是Git仓库,跳过加载Git状态");return}try{const v=await(await fetch("/api/status_porcelain")).json();v.status!==void 0?P(v.status):E.value=[]}catch(_){console.error("获取Git状态(porcelain)失败:",_),o({message:`获取Git状态(porcelain)失败: ${_.message}`,type:"error"}),E.value=[]}}async function J(){if(!Q.isGitRepo)return o.warning("当前目录不是Git仓库"),!1;try{X.value=!0;const v=await(await fetch("/api/add",{method:"POST"})).json();return v.success?(o({message:"文件已添加到暂存区",type:"success"}),A(),!0):(o({message:`添加文件失败: ${v.error}`,type:"error"}),!1)}catch(_){return o({message:`添加文件失败: ${_.message}`,type:"error"}),!1}finally{X.value=!1}}async function le(_){if(!Q.isGitRepo)return o.warning("当前目录不是Git仓库"),!1;try{X.value=!0;const N=await(await fetch("/api/add-file",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({filePath:_})})).json();return N.success?(o({message:"文件已暂存",type:"success"}),A(),!0):(o({message:`暂存文件失败: ${N.error}`,type:"error"}),!1)}catch(v){return o({message:`暂存文件失败: ${v.message}`,type:"error"}),!1}finally{X.value=!1}}async function ce(_){if(!Q.isGitRepo)return o.warning("当前目录不是Git仓库"),!1;try{k.value=!0;const N=await(await fetch("/api/unstage-file",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({filePath:_})})).json();return N.success?(o({message:"已取消暂存文件",type:"success"}),A(),!0):(o({message:`取消暂存失败: ${N.error}`,type:"error"}),!1)}catch(v){return o({message:`取消暂存失败: ${v.message}`,type:"error"}),!1}finally{k.value=!1}}function ue(_){return new Promise(v=>setTimeout(v,_))}async function j(_,v=!1){if(!Q.isGitRepo)return o.warning("当前目录不是Git仓库"),!1;try{O.value=!0;const oe=await(await fetch("/api/commit",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({message:_,hasNewlines:_.includes(`
3
- `),noVerify:v})})).json();return oe.success?(o({message:"提交成功",type:"success"}),A(),Y(),Q.getBranchStatus(),!0):(o({message:`提交失败: ${oe.error}`,type:"error"}),!1)}catch(N){return o({message:`提交失败: ${N.message}`,type:"error"}),!1}finally{O.value=!1}}async function fe(){if(!Q.isGitRepo)return o.warning("当前目录不是Git仓库"),!1;try{b.value=!0;const v=await(await fetch("/api/push",{method:"POST"})).json();return v.success?(o({message:"推送成功",type:"success"}),A(),Y(),Q.getBranchStatus(),!0):(o({message:`推送失败: ${v.error}`,type:"error"}),!1)}catch(_){return o({message:`推送失败: ${_.message}`,type:"error"}),!1}finally{b.value=!1}}async function se(_,v=!1){return await J()?(await ue(wt),await j(_,v)):!1}async function x(_,v=!1){try{return!await J()||(await ue(wt),!await j(_,v))?!1:(await ue(wt),await fe())}catch(N){try{(await(await fetch("/api/remove-lock",{method:"POST"})).json()).success&&o({message:"已清理锁定文件,请重试操作",type:"warning"})}catch(oe){console.error("清理锁定文件失败:",oe)}return o({message:`操作失败: ${N.message}`,type:"error"}),A(),Y(),Q.getBranchStatus(),!1}}async function S(){if(!Q.isGitRepo)return o.warning("当前目录不是Git仓库"),!1;try{k.value=!0;const v=await(await fetch("/api/reset-head",{method:"POST"})).json();return v.success?(o({message:"已重置暂存区",type:"success"}),A(),!0):(o({message:`重置暂存区失败: ${v.error}`,type:"error"}),!1)}catch(_){return o({message:`重置暂存区失败: ${_.message}`,type:"error"}),!1}finally{k.value=!1}}async function ae(_){if(!Q.isGitRepo)return o.warning("当前目录不是Git仓库"),!1;try{k.value=!0;const N=await(await fetch("/api/reset-to-remote",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({branch:_})})).json();return N.success?(o({message:`已重置分支 ${_} 到远程状态`,type:"success"}),A(),Y(),!0):(o({message:`重置分支失败: ${N.error}`,type:"error"}),!1)}catch(v){return o({message:`重置分支失败: ${v.message}`,type:"error"}),!1}finally{k.value=!1}}return qe(()=>{const _=localStorage.getItem("zen-gitsync-auto-update");_!==null&&($.value=_==="true"),F()}),ss(()=>{p&&(p.disconnect(),p=null)}),{log:y,status:i,statusText:D,fileList:E,isLoadingLog:ee,isLoadingStatus:te,isAddingFiles:X,isResetting:k,isCommiting:O,isPushing:b,autoUpdateEnabled:$,fetchLog:Y,fetchStatus:A,fetchStatusPorcelain:H,parseStatusPorcelain:P,addToStage:J,addFileToStage:le,unstageFile:ce,commitChanges:j,pushToRemote:fe,addAndCommit:se,addCommitAndPush:x,resetHead:S,resetToRemote:ae,toggleAutoUpdate:K}}),Ls={class:"card"},Vs={class:"status-header"},Bs={class:"header-actions"},Rs={class:"card-content"},zs={class:"current-directory"},Gs={key:0,class:"status-box"},Ds={class:"empty-status"},As={key:1},Es={key:0,class:"branch-sync-status"},js={class:"sync-status-content"},Ms={class:"status-badges"},Ps={class:"badge-content"},Us={class:"badge-content"},Os={key:1,class:"git-status-message"},Fs={key:2,class:"file-list-container"},Is={key:0,class:"file-group"},Ns={class:"file-list"},Hs=["onClick"],Ws={class:"file-info"},Js={class:"file-path-container"},Ys={class:"file-name"},qs={class:"file-directory"},Zs={class:"file-actions"},Xs={key:1,class:"file-group"},Ks={class:"file-list"},Qs=["onClick"],ea={class:"file-info"},ta={class:"file-path-container"},sa={class:"file-name"},aa={class:"file-directory"},la={class:"file-actions"},oa={key:2,class:"file-group"},na={class:"file-list"},ia=["onClick"],ra={class:"file-info"},ca={class:"file-path-container"},ua={class:"file-name"},da={class:"file-directory"},fa={class:"file-actions"},pa={key:3,class:"empty-status"},va={class:"empty-icon"},ma={class:"branch-info"},ga={key:0},ya={key:0,class:"branch-sync-info warning"},ha={key:1,class:"branch-sync-info info"},_a={key:2,class:"branch-sync-info success"},wa={class:"directory-buttons"},$a={class:"browser-current-path"},ba={key:0,class:"browser-error"},ka={class:"directory-browser"},Ca={class:"browser-nav"},Sa={class:"directory-items-container"},Ta={class:"directory-items"},xa=["onClick"],La={class:"diff-dialog-header"},Va={class:"file-title"},Ba={class:"file-path"},Ra={class:"header-actions"},za={class:"diff-content"},Ga=["innerHTML"],Da={key:1,class:"no-diff"},Aa={class:"file-navigation"},Ea={class:"file-counter"},ja=lt({__name:"GitStatus",props:{initialDirectory:{type:String,default:""}},setup(Q,{expose:p}){const $=Q,y=Lt(),i=Fe(),D=_e(()=>y.isLoadingStatus),E=r(""),ee=r(""),te=r(!1),X=r(!1),O=r(-1),b=r(!1),k=r(""),F=r(!1),K=r(!1),P=r(""),Y=r([]),A=r(!1),H=r(""),J=r(!1),le=r(!1),ce=r($.initialDirectory||"");async function ue(){try{if(!ce.value){const c=await(await fetch("/api/current_directory")).json();ce.value=c.directory||"未知目录"}if(!i.isGitRepo)return;await y.fetchStatus(),await i.getBranchStatus(),o({message:"Git 状态已刷新",type:"success"})}catch(w){o({message:"刷新失败: "+w.message,type:"error"})}}function j(w){if(!w)return"";const c=w.split(`
3
+ `),noVerify:v})})).json();return oe.success?(o({message:"提交成功",type:"success"}),A(),Y(),Q.getBranchStatus(),!0):(o({message:`提交失败: ${oe.error}`,type:"error"}),!1)}catch(N){return o({message:`提交失败: ${N.message}`,type:"error"}),!1}finally{O.value=!1}}async function fe(){if(!Q.isGitRepo)return o.warning("当前目录不是Git仓库"),!1;try{b.value=!0;const v=await(await fetch("/api/push",{method:"POST"})).json();return v.success?(o({message:"推送成功",type:"success"}),A(),Y(),Q.getBranchStatus(),!0):(o({message:`推送失败: ${v.error}`,type:"error"}),!1)}catch(_){return o({message:`推送失败: ${_.message}`,type:"error"}),!1}finally{b.value=!1}}async function se(_,v=!1){return await J()?(await ue(wt),await j(_,v)):!1}async function x(_,v=!1){try{return!await J()||(await ue(wt),!await j(_,v))?!1:(await ue(wt),await fe())}catch(N){try{(await(await fetch("/api/remove-lock",{method:"POST"})).json()).success&&o({message:"已清理锁定文件,请重试操作",type:"warning"})}catch(oe){console.error("清理锁定文件失败:",oe)}return o({message:`操作失败: ${N.message}`,type:"error"}),A(),Y(),Q.getBranchStatus(),!1}}async function S(){if(!Q.isGitRepo)return o.warning("当前目录不是Git仓库"),!1;try{k.value=!0;const v=await(await fetch("/api/reset-head",{method:"POST"})).json();return v.success?(o({message:"已重置暂存区",type:"success"}),A(),!0):(o({message:`重置暂存区失败: ${v.error}`,type:"error"}),!1)}catch(_){return o({message:`重置暂存区失败: ${_.message}`,type:"error"}),!1}finally{k.value=!1}}async function ae(_){if(!Q.isGitRepo)return o.warning("当前目录不是Git仓库"),!1;try{k.value=!0;const N=await(await fetch("/api/reset-to-remote",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({branch:_})})).json();return N.success?(o({message:`已重置分支 ${_} 到远程状态`,type:"success"}),A(),Y(),!0):(o({message:`重置分支失败: ${N.error}`,type:"error"}),!1)}catch(v){return o({message:`重置分支失败: ${v.message}`,type:"error"}),!1}finally{k.value=!1}}return qe(()=>{const _=localStorage.getItem("zen-gitsync-auto-update");_!==null&&($.value=_==="true"),F()}),ss(()=>{p&&(p.disconnect(),p=null)}),{log:y,status:i,statusText:D,fileList:E,isLoadingLog:ee,isLoadingStatus:te,isAddingFiles:X,isResetting:k,isCommiting:O,isPushing:b,autoUpdateEnabled:$,fetchLog:Y,fetchStatus:A,fetchStatusPorcelain:H,parseStatusPorcelain:P,addToStage:J,addFileToStage:le,unstageFile:ce,commitChanges:j,pushToRemote:fe,addAndCommit:se,addCommitAndPush:x,resetHead:S,resetToRemote:ae,toggleAutoUpdate:K}}),Ls={class:"card"},Vs={class:"status-header"},Rs={class:"header-actions"},Bs={class:"card-content"},zs={class:"current-directory"},Gs={key:0,class:"status-box"},Ds={class:"empty-status"},As={key:1},Es={key:0,class:"branch-sync-status"},js={class:"sync-status-content"},Ms={class:"status-badges"},Ps={class:"badge-content"},Us={class:"badge-content"},Os={key:1,class:"git-status-message"},Fs={key:2,class:"file-list-container"},Is={key:0,class:"file-group"},Ns={class:"file-list"},Hs=["onClick"],Ws={class:"file-info"},Js={class:"file-path-container"},Ys={class:"file-name"},qs={class:"file-directory"},Zs={class:"file-actions"},Xs={key:1,class:"file-group"},Ks={class:"file-list"},Qs=["onClick"],ea={class:"file-info"},ta={class:"file-path-container"},sa={class:"file-name"},aa={class:"file-directory"},la={class:"file-actions"},oa={key:2,class:"file-group"},na={class:"file-list"},ia=["onClick"],ra={class:"file-info"},ca={class:"file-path-container"},ua={class:"file-name"},da={class:"file-directory"},fa={class:"file-actions"},pa={key:3,class:"empty-status"},va={class:"empty-icon"},ma={class:"branch-info"},ga={key:0},ya={key:0,class:"branch-sync-info warning"},ha={key:1,class:"branch-sync-info info"},_a={key:2,class:"branch-sync-info success"},wa={class:"directory-buttons"},$a={class:"browser-current-path"},ba={key:0,class:"browser-error"},ka={class:"directory-browser"},Ca={class:"browser-nav"},Sa={class:"directory-items-container"},Ta={class:"directory-items"},xa=["onClick"],La={class:"diff-dialog-header"},Va={class:"file-title"},Ra={class:"file-path"},Ba={class:"header-actions"},za={class:"diff-content"},Ga=["innerHTML"],Da={key:1,class:"no-diff"},Aa={class:"file-navigation"},Ea={class:"file-counter"},ja=lt({__name:"GitStatus",props:{initialDirectory:{type:String,default:""}},setup(Q,{expose:p}){const $=Q,y=Lt(),i=Fe(),D=_e(()=>y.isLoadingStatus),E=r(""),ee=r(""),te=r(!1),X=r(!1),O=r(-1),b=r(!1),k=r(""),F=r(!1),K=r(!1),P=r(""),Y=r([]),A=r(!1),H=r(""),J=r(!1),le=r(!1),ce=r($.initialDirectory||"");async function ue(){try{if(!ce.value){const c=await(await fetch("/api/current_directory")).json();ce.value=c.directory||"未知目录"}if(!i.isGitRepo)return;await y.fetchStatus(),await i.getBranchStatus(),o({message:"Git 状态已刷新",type:"success"})}catch(w){o({message:"刷新失败: "+w.message,type:"error"})}}function j(w){if(!w)return"";const c=w.split(`
4
4
  `);function I(V){return V.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#039;")}return c.map(V=>{const W=I(V);return V.startsWith("diff --git")?`<div class="diff-header">${W}</div>`:V.startsWith("---")?`<div class="diff-old-file">${W}</div>`:V.startsWith("+++")?`<div class="diff-new-file">${W}</div>`:V.startsWith("@@")?`<div class="diff-hunk-header">${W}</div>`:V.startsWith("+")?`<div class="diff-added">${W}</div>`:V.startsWith("-")?`<div class="diff-removed">${W}</div>`:`<div class="diff-context">${W}</div>`}).join("")}async function fe(w){try{X.value=!0,E.value=w,O.value=y.fileList.findIndex(I=>I.path===w);const c=y.fileList[O.value];if(c&&c.type==="untracked"){try{const V=await(await fetch(`/api/file-content?file=${encodeURIComponent(w)}`)).json();V.success&&V.content?ee.value=`diff --git a/${w} b/${w}
5
5
  新文件: ${w}
6
6
  --- /dev/null
@@ -11,10 +11,10 @@ import{d as Ct,r,E as o,o as qe,a as ss,l as as,b as lt,c as _e,w as Ye,e as ls,
11
11
  `).map(W=>`+${W}`).join(`
12
12
  `):ee.value=`这是一个新文件,尚未被Git跟踪。
13
13
  添加到暂存区后可以提交该文件。`}catch(I){console.error("获取未跟踪文件内容失败:",I),ee.value=`这是一个新文件,尚未被Git跟踪。
14
- 添加到暂存区后可以提交该文件。`}te.value=!0}else{const V=await(await fetch(`/api/diff?file=${encodeURIComponent(w)}`)).json();ee.value=V.diff||"没有变更",te.value=!0}}catch(c){o({message:"获取文件差异失败: "+c.message,type:"error"}),ee.value="获取差异失败: "+c.message}finally{X.value=!1}}async function se(){if(y.fileList.length===0||O.value<=0)return;const w=O.value-1,c=y.fileList[w];await fe(c.path)}async function x(){if(y.fileList.length===0||O.value>=y.fileList.length-1)return;const w=O.value+1,c=y.fileList[w];await fe(c.path)}function S(){k.value=ce.value,b.value=!0}function ae(){H.value="",P.value=k.value||ce.value,K.value=!0,_(P.value)}async function _(w){try{A.value=!0,H.value="";let c=w;/^[A-Za-z]:$/.test(c)&&(c+="/");const I=await fetch(`/api/browse_directory?path=${encodeURIComponent(c)}`);if(I.status===403){const W=await I.json();H.value=W.error||"目录浏览功能未启用";return}if(!I.ok){const W=await I.json();H.value=W.error||"获取目录内容失败";return}const V=await I.json();V.success?(Y.value=V.items,P.value=V.currentPath):H.value=V.error||"获取目录内容失败"}catch(c){H.value=`获取目录内容失败: ${c.message}`}finally{A.value=!1}}function v(){if(/^[A-Za-z]:$/.test(P.value)||/^[A-Za-z]:[\\/]$/.test(P.value)||P.value==="/")return;let w=P.value.split(/[/\\]/);w.pop();let c=w.join("/");w.length===1&&/^[A-Za-z]:$/.test(w[0])&&(c=w[0]+"/"),c&&_(c)}function N(w){w.type==="directory"&&_(w.path)}function oe(){k.value=P.value,K.value=!1}async function ke(){if(!k.value){o.warning("目录路径不能为空");return}try{F.value=!0;const c=await(await fetch("/api/change_directory",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:k.value})})).json();c.success?(o.success("已切换工作目录"),ce.value=c.directory,b.value=!1,i.isGitRepo=c.isGitRepo,c.isGitRepo?(await Promise.all([i.getCurrentBranch(),i.getAllBranches(),i.getUserInfo()]),await ue()):(o.warning("当前目录不是一个Git仓库"),i.$reset())):o.error(c.error||"切换目录失败")}catch(w){o.error(`切换目录失败: ${w.message}`)}finally{F.value=!1}}function ne(w){fe(w.path)}async function pe(w){await y.addFileToStage(w)}async function T(w){await y.unstageFile(w)}async function d(){await ue()}async function U(){J.value=!0;try{await i.gitPull(),await ue()}finally{J.value=!1}}async function Z(){le.value=!0;try{await i.gitFetchAll(),await ue()}finally{le.value=!1}}async function ge(w){try{await Oe.confirm(`确定要撤回文件 "${w}" 的所有修改吗?此操作无法撤销。`,"撤回修改",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"});const I=await(await fetch("/api/revert_file",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({filePath:w})})).json();I.success?(o.success("已撤回文件修改"),await ue()):o.error(I.error?`撤回失败: ${I.error}`:"撤回文件修改失败,请重试")}catch(c){if(c==="cancel"||c.message==="cancel")return;const I=c.message||"未知错误";I!=="undefined"?o.error(`撤回文件修改失败: ${I}`):o.error("撤回文件修改失败,请重试")}}function ye(w){const c=w.split("/");return c[c.length-1]}function ve(w){const c=w.split("/");return c.length<=1?"":c.slice(0,-1).join("/")}return qe(()=>{ue()}),Ye(()=>y.autoUpdateEnabled,(w,c)=>{console.log(`自动更新状态变更: ${c} -> ${w}`),y.toggleAutoUpdate()},{immediate:!1}),p({refreshStatus:d}),(w,c)=>{const I=At,V=St,W=Ce,M=ot,xe=Tt,Ee=ls("ArrowDown"),Be=it,je=Pt,Me=Mt,Re=nt,Pe=Ut;return u(),g("div",Ls,[e("div",Vs,[c[6]||(c[6]=e("h2",null,"Git 状态",-1)),e("div",Bs,[t(V,{content:a(y).autoUpdateEnabled?"禁用自动更新文件状态":"启用自动更新文件状态",placement:"top","hide-after":1e3},{default:s(()=>[t(I,{modelValue:a(y).autoUpdateEnabled,"onUpdate:modelValue":c[0]||(c[0]=L=>a(y).autoUpdateEnabled=L),style:{"--el-switch-on-color":"#67C23A","--el-switch-off-color":"#909399","margin-right":"10px"},"inline-prompt":"","active-icon":a(bt),"inactive-icon":a(yt),class:"auto-update-switch"},null,8,["modelValue","active-icon","inactive-icon"])]),_:1},8,["content"]),t(V,{content:"Git Pull (拉取远程更新)",placement:"top","hide-after":1e3},{default:s(()=>[t(W,{type:"primary",icon:a(Et),circle:"",size:"small",onClick:U,loading:J.value,disabled:!a(i).hasUpstream},null,8,["icon","loading","disabled"])]),_:1}),t(V,{content:"Git Fetch All (获取所有远程分支)",placement:"top","hide-after":1e3},{default:s(()=>[t(W,{type:"info",icon:a(jt),circle:"",size:"small",onClick:Z,loading:le.value},null,8,["icon","loading"])]),_:1}),t(V,{content:"刷新状态",placement:"top","hide-after":1e3},{default:s(()=>[t(W,{type:"primary",icon:a(os),circle:"",size:"small",onClick:d,loading:D.value},null,8,["icon","loading"])]),_:1})])]),e("div",Rs,[e("div",zs,[t(M,null,{default:s(()=>[t(a(ht))]),_:1}),e("span",null,C(ce.value),1),t(W,{type:"primary",size:"small",onClick:S,plain:""},{default:s(()=>c[7]||(c[7]=[h(" 切换目录 ")])),_:1})]),a(i).isGitRepo?(u(),g("div",As,[a(i).hasUpstream&&(a(i).branchAhead>0||a(i).branchBehind>0)?(u(),g("div",Es,[e("div",js,[t(V,{content:"本地分支与远程分支的状态对比",placement:"top"},{default:s(()=>[e("div",Ms,[a(i).branchAhead>0?(u(),re(xe,{key:0,size:"small",type:"warning",class:"status-badge"},{default:s(()=>[e("span",Ps,[t(M,null,{default:s(()=>[t(a(_t))]),_:1}),h(" 你的分支领先 'origin/"+C(a(i).currentBranch)+"' "+C(a(i).branchAhead)+" 个提交 ",1)])]),_:1})):q("",!0),a(i).branchBehind>0?(u(),re(xe,{key:1,size:"small",type:"info",class:"status-badge"},{default:s(()=>[e("span",Us,[t(M,null,{default:s(()=>[t(Ee)]),_:1}),h(" 你的分支落后 'origin/"+C(a(i).currentBranch)+"' "+C(a(i).branchBehind)+" 个提交 ",1)])]),_:1})):q("",!0)])]),_:1})])])):q("",!0),!a(i).hasUpstream||a(i).branchAhead===0&&a(i).branchBehind===0?(u(),g("div",Os,[e("p",null,[c[10]||(c[10]=h("当前工作在 ")),t(xe,{size:"small",type:"success"},{default:s(()=>[h(C(a(i).currentBranch),1)]),_:1}),c[11]||(c[11]=h(" 分支"))])])):q("",!0),a(y).fileList.length?(u(),g("div",Fs,[a(y).fileList.some(L=>L.type==="added")?(u(),g("div",Is,[c[13]||(c[13]=e("div",{class:"file-group-header"},"已暂存的更改",-1)),e("div",Ns,[(u(!0),g(he,null,be(a(y).fileList.filter(L=>L.type==="added"),L=>(u(),g("div",{key:L.path,class:"file-item",onClick:we=>ne(L)},[e("div",Ws,[e("div",Js,[e("span",Ys,C(ye(L.path)),1),e("span",qs,C(ve(L.path)),1)])]),e("div",Zs,[t(V,{content:"取消暂存",placement:"top","hide-after":1e3},{default:s(()=>[t(W,{type:"warning",size:"small",circle:"",onClick:Ne(we=>T(L.path),["stop"])},{default:s(()=>c[12]||(c[12]=[h("-")])),_:2},1032,["onClick"])]),_:2},1024)])],8,Hs))),128))])])):q("",!0),a(y).fileList.some(L=>L.type==="modified"||L.type==="deleted")?(u(),g("div",Xs,[c[15]||(c[15]=e("div",{class:"file-group-header"},"未暂存的更改",-1)),e("div",Ks,[(u(!0),g(he,null,be(a(y).fileList.filter(L=>L.type==="modified"||L.type==="deleted"),L=>(u(),g("div",{key:L.path,class:"file-item",onClick:we=>ne(L)},[e("div",ea,[e("div",{class:Ve(["file-status-indicator",L.type])},null,2),e("div",ta,[e("span",sa,C(ye(L.path)),1),e("span",aa,C(ve(L.path)),1)])]),e("div",la,[t(V,{content:"添加到暂存区",placement:"top","hide-after":1e3},{default:s(()=>[t(W,{type:"success",size:"small",circle:"",onClick:Ne(we=>pe(L.path),["stop"])},{default:s(()=>c[14]||(c[14]=[h("+")])),_:2},1032,["onClick"])]),_:2},1024),t(V,{content:"撤回修改",placement:"top","hide-after":1e3},{default:s(()=>[t(W,{type:"danger",size:"small",icon:a(xt),circle:"",onClick:Ne(we=>ge(L.path),["stop"])},null,8,["icon","onClick"])]),_:2},1024)])],8,Qs))),128))])])):q("",!0),a(y).fileList.some(L=>L.type==="untracked")?(u(),g("div",oa,[c[18]||(c[18]=e("div",{class:"file-group-header"},"未跟踪的文件",-1)),e("div",na,[(u(!0),g(he,null,be(a(y).fileList.filter(L=>L.type==="untracked"),L=>(u(),g("div",{key:L.path,class:"file-item",onClick:we=>ne(L)},[e("div",ra,[c[16]||(c[16]=e("div",{class:"file-status-indicator untracked"},null,-1)),e("div",ca,[e("span",ua,C(ye(L.path)),1),e("span",da,C(ve(L.path)),1)])]),e("div",fa,[t(V,{content:"添加到暂存区",placement:"top","hide-after":1e3},{default:s(()=>[t(W,{type:"success",size:"small",circle:"",onClick:Ne(we=>pe(L.path),["stop"])},{default:s(()=>c[17]||(c[17]=[h("+")])),_:2},1032,["onClick"])]),_:2},1024),t(V,{content:"删除文件",placement:"top","hide-after":1e3},{default:s(()=>[t(W,{type:"danger",size:"small",icon:a(yt),circle:"",onClick:Ne(we=>ge(L.path),["stop"])},null,8,["icon","onClick"])]),_:2},1024)])],8,ia))),128))])])):q("",!0)])):a(i).isGitRepo?(u(),g("div",pa,[e("div",va,[t(M,null,{default:s(()=>[t(a(tt))]),_:1})]),c[21]||(c[21]=e("div",{class:"empty-text"},"没有检测到任何更改",-1)),c[22]||(c[22]=e("div",{class:"empty-subtext"},"工作区是干净的",-1)),e("div",ma,[e("p",null,[c[19]||(c[19]=h("当前工作在 ")),t(xe,{size:"small",type:"success"},{default:s(()=>[h(C(a(i).currentBranch),1)]),_:1}),c[20]||(c[20]=h(" 分支"))]),a(i).hasUpstream?(u(),g("div",ga,[a(i).branchAhead>0?(u(),g("span",ya,[t(M,null,{default:s(()=>[t(a(_t))]),_:1}),h(" 你的分支领先 'origin/"+C(a(i).currentBranch)+"' "+C(a(i).branchAhead)+" 个提交 ",1)])):a(i).branchBehind>0?(u(),g("span",ha,[t(M,null,{default:s(()=>[t(Ee)]),_:1}),h(" 你的分支落后 'origin/"+C(a(i).currentBranch)+"' "+C(a(i).branchBehind)+" 个提交 ",1)])):(u(),g("span",_a,[t(M,null,{default:s(()=>[t(a(bt))]),_:1}),h(" 你的分支与 'origin/"+C(a(i).currentBranch)+"' 同步 ",1)]))])):q("",!0)])])):q("",!0)])):(u(),g("div",Gs,[e("div",Ds,[c[9]||(c[9]=e("p",null,"当前目录不是Git仓库",-1)),t(W,{type:"primary",size:"small",onClick:S},{default:s(()=>c[8]||(c[8]=[h(" 切换目录 ")])),_:1})])]))]),t(Re,{modelValue:b.value,"onUpdate:modelValue":c[2]||(c[2]=L=>b.value=L),title:"切换工作目录",width:"80vw",top:"10vh",style:{height:"200px"}},{default:s(()=>[t(Me,null,{default:s(()=>[t(je,{label:"目录路径"},{default:s(()=>[t(Be,{modelValue:k.value,"onUpdate:modelValue":c[1]||(c[1]=L=>k.value=L),placeholder:"请输入目录路径",clearable:""},null,8,["modelValue"]),e("div",wa,[t(W,{onClick:ae,type:"primary",plain:"",class:"no-padding-left"},{default:s(()=>[t(M,null,{default:s(()=>[t(a(ht))]),_:1}),c[23]||(c[23]=h(" 浏览 "))]),_:1}),t(W,{onClick:ke,loading:F.value,type:"primary"},{default:s(()=>c[24]||(c[24]=[h(" 切换 ")])),_:1},8,["loading"])])]),_:1})]),_:1})]),_:1},8,["modelValue"]),t(Re,{modelValue:K.value,"onUpdate:modelValue":c[3]||(c[3]=L=>K.value=L),title:"浏览目录",width:"80vw",top:"70px"},{default:s(()=>[e("div",$a,[e("span",null,"当前路径: "+C(P.value),1)]),H.value?(u(),g("div",ba,C(H.value),1)):q("",!0),Ue((u(),g("div",ka,[e("div",Ca,[t(W,{onClick:v,disabled:!P.value||A.value,size:"small",class:"no-padding-left"},{default:s(()=>[t(M,null,{default:s(()=>[t(a(_t))]),_:1}),c[25]||(c[25]=h(" 上级目录 "))]),_:1},8,["disabled"]),t(W,{onClick:oe,type:"primary",size:"small",class:"no-padding-left"},{default:s(()=>c[26]||(c[26]=[h(" 选择当前目录 ")])),_:1})]),e("div",Sa,[e("ul",Ta,[(u(!0),g(he,null,be(Y.value,L=>(u(),g("li",{key:L.path,class:Ve(["directory-item",L.type]),onClick:we=>N(L)},[L.type==="directory"?(u(),re(M,{key:0},{default:s(()=>[t(a(ht))]),_:1})):(u(),re(M,{key:1},{default:s(()=>[t(a(tt))]),_:1})),e("span",null,C(L.name),1)],10,xa))),128))])])])),[[Pe,A.value]])]),_:1},8,["modelValue"]),t(Re,{modelValue:te.value,"onUpdate:modelValue":c[5]||(c[5]=L=>te.value=L),width:"80vw",top:"70px","destroy-on-close":"",class:"diff-dialog","show-close":!1,style:{height:"calc(100vh - 140px)"},"modal-append-to-body":!1,"close-on-click-modal":!1},{header:s(()=>[e("div",La,[e("div",Va,[t(M,{class:"file-icon"},{default:s(()=>[t(a(tt))]),_:1}),e("span",Ba,C(E.value),1)]),e("div",Ra,[t(W,{onClick:c[4]||(c[4]=L=>te.value=!1),circle:"",size:"small",icon:a(yt),class:"close-button"},null,8,["icon"])])])]),footer:s(()=>[e("div",Aa,[t(W,{type:"primary",icon:a(ns),onClick:se,disabled:O.value<=0||a(y).fileList.length===0,plain:"",class:"nav-button"},{default:s(()=>c[27]||(c[27]=[h(" 上一个文件 ")])),_:1},8,["icon","disabled"]),e("div",Ea,[t(xe,{type:"info",effect:"plain",class:"counter-tag"},{default:s(()=>[h(C(O.value+1)+" / "+C(a(y).fileList.length),1)]),_:1})]),t(W,{type:"primary",icon:a(zt),onClick:x,disabled:O.value>=a(y).fileList.length-1||a(y).fileList.length===0,plain:"",class:"nav-button"},{icon:s(()=>[t(M,{class:"el-icon--right"},{default:s(()=>[t(a(zt))]),_:1})]),default:s(()=>[c[28]||(c[28]=h(" 下一个文件 "))]),_:1},8,["icon","disabled"])])]),default:s(()=>[Ue((u(),g("div",za,[ee.value?(u(),g("div",{key:0,innerHTML:j(ee.value),class:"diff-formatted"},null,8,Ga)):(u(),g("div",Da,"该文件没有差异或是新文件"))])),[[Pe,X.value]])]),_:1},8,["modelValue"])])}}}),rt=(Q,p)=>{const $=Q.__vccOpts||Q;for(const[y,i]of p)$[y]=i;return $},Ma=rt(ja,[["__scopeId","data-v-1fbfdf49"]]),Ht=Ct("config",()=>{const Q=r(""),p=r([]),$=r([]),y=r([]),i=r(!1),D=r(!1);async function E(){if(D.value&&!i.value)return console.log("使用缓存的配置信息"),{defaultCommitMessage:Q.value,descriptionTemplates:p.value,scopeTemplates:$.value,messageTemplates:y.value};try{i.value=!0,console.log("加载配置信息...");const k=await(await fetch("/api/config/getConfig")).json();return Q.value=k.defaultCommitMessage||"",p.value=k.descriptionTemplates||[],$.value=k.scopeTemplates||[],y.value=k.messageTemplates||[],D.value=!0,console.log("配置信息加载完成"),k}catch(b){return console.error("加载配置失败:",b),o.error(`加载配置失败: ${b.message}`),null}finally{i.value=!1}}async function ee(b){try{const F=await(await fetch("/api/config/saveDefaultMessage",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({defaultCommitMessage:b})})).json();return F.success?(Q.value=b,o.success("默认提交信息已保存"),!0):(o.error(`保存失败: ${F.error}`),!1)}catch(k){return o.error(`保存失败: ${k.message}`),!1}}async function te(b,k){try{const K=await(await fetch("/api/config/save-template",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({template:b,type:k})})).json();return K.success?(k==="description"?p.value.includes(b)||p.value.push(b):k==="scope"?$.value.includes(b)||$.value.push(b):k==="message"&&(y.value.includes(b)||y.value.push(b)),o.success("模板已保存"),!0):(o.error(`保存模板失败: ${K.error}`),!1)}catch(F){return o.error(`保存模板失败: ${F.message}`),!1}}async function X(b,k){try{const K=await(await fetch("/api/config/delete-template",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({template:b,type:k})})).json();return K.success?(k==="description"?p.value=p.value.filter(P=>P!==b):k==="scope"?$.value=$.value.filter(P=>P!==b):k==="message"&&(y.value=y.value.filter(P=>P!==b)),o.success("模板已删除"),!0):(o.error(`删除模板失败: ${K.error}`),!1)}catch(F){return o.error(`删除模板失败: ${F.message}`),!1}}async function O(b,k,F){try{const P=await(await fetch("/api/config/update-template",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldTemplate:b,newTemplate:k,type:F})})).json();if(P.success){if(F==="description"){const Y=p.value.indexOf(b);Y!==-1&&(p.value[Y]=k)}else if(F==="scope"){const Y=$.value.indexOf(b);Y!==-1&&($.value[Y]=k)}else if(F==="message"){const Y=y.value.indexOf(b);Y!==-1&&(y.value[Y]=k)}return o.success("模板已更新"),!0}else return o.error(`更新模板失败: ${P.error}`),!1}catch(K){return o.error(`更新模板失败: ${K.message}`),!1}}return{defaultCommitMessage:Q,descriptionTemplates:p,scopeTemplates:$,messageTemplates:y,isLoading:i,isLoaded:D,loadConfig:E,saveDefaultMessage:ee,saveTemplate:te,deleteTemplate:X,updateTemplate:O}}),Pa={key:0,class:"pushing-indicator"},Ua={key:0,class:"push-success-indicator"},Oa={class:"card-content"},Fa={class:"layout-container"},Ia={key:0,class:"git-config-warning"},Na={class:"commit-section"},Ha={class:"commit-options"},Wa={class:"options-row"},Ja={class:"commit-mode-toggle"},Ya={class:"no-verify-toggle"},qa={key:0,class:"commit-form"},Za={class:"description-container"},Xa={class:"input-actions"},Ka={class:"preview-section"},Qa={class:"preview-content code-command"},el={key:1,class:"standard-commit-form"},tl={class:"standard-commit-header"},sl={class:"type-scope-container"},al={class:"scope-wrapper"},ll={class:"description-container"},ol={class:"advanced-fields"},nl={class:"preview-section"},il={class:"preview-content"},rl={class:"preview-content code-command"},cl={class:"actions-section"},ul={class:"action-groups"},dl={class:"operations-wrapper"},fl={class:"action-group"},pl={class:"group-buttons"},vl={key:0},ml={key:0},gl={key:0},yl={key:0},hl={class:"action-group"},_l={class:"group-buttons"},wl={class:"action-group reset-group"},$l={class:"group-buttons"},bl={key:0},kl={class:"template-container"},Cl={class:"template-form"},Sl={class:"template-form-buttons"},Tl={class:"template-list"},xl={class:"template-content"},Ll={class:"template-actions"},Vl={class:"template-container"},Bl={class:"template-form"},Rl={class:"template-form-buttons"},zl={class:"template-list"},Gl={class:"template-content"},Dl={class:"template-actions"},Al={class:"template-container message-template-container"},El={class:"template-form"},jl={class:"template-form-buttons"},Ml={class:"templates-container"},Pl={class:"message-templates-list"},Ul={class:"templates-scroll-area"},Ol={class:"template-content"},Fl={class:"template-actions"},Il={class:"current-default-message"},Nl={class:"default-message-content"},Hl={class:"message-help-text"},Wl=lt({__name:"CommitForm",setup(Q){const p=Lt(),$=Fe(),y=Ht(),i=r(""),D=r(!1),E=r(!1),ee=r(!1),te=r(!1),X=r("输入提交信息..."),O=r(""),b=r(!1),k=r("feat"),F=r(""),K=r(""),P=r(""),Y=r(""),A=r([]),H=r(!1),J=r(""),le=r(!1),ce=r(""),ue=r(-1),j=r([]),fe=r(!1),se=r(""),x=r(!1),S=r(""),ae=r(-1),_=r(!1),v=r(""),N=r(!1),oe=r(!1),ke=[{value:"feat",label:"feat: 新功能"},{value:"fix",label:"fix: 修复bug"},{value:"docs",label:"docs: 文档修改"},{value:"style",label:"style: 样式修改"},{value:"refactor",label:"refactor: 代码重构"},{value:"test",label:"test: 测试代码"},{value:"chore",label:"chore: 构建/工具修改"}],ne=r([]),pe=r(!1),T=r(""),d=r(-1);Ye(b,f=>{localStorage.setItem("zen-gitsync-standard-commit",f.toString())}),Ye(N,f=>{localStorage.setItem("zen-gitsync-skip-hooks",f.toString())});const U=_e(()=>{if(!b.value)return i.value||O.value;let f=`${k.value||""}`;return F.value&&(f+=`(${F.value})`),f+=`: ${K.value}`,P.value&&(f+=`
14
+ 添加到暂存区后可以提交该文件。`}te.value=!0}else{const V=await(await fetch(`/api/diff?file=${encodeURIComponent(w)}`)).json();ee.value=V.diff||"没有变更",te.value=!0}}catch(c){o({message:"获取文件差异失败: "+c.message,type:"error"}),ee.value="获取差异失败: "+c.message}finally{X.value=!1}}async function se(){if(y.fileList.length===0||O.value<=0)return;const w=O.value-1,c=y.fileList[w];await fe(c.path)}async function x(){if(y.fileList.length===0||O.value>=y.fileList.length-1)return;const w=O.value+1,c=y.fileList[w];await fe(c.path)}function S(){k.value=ce.value,b.value=!0}function ae(){H.value="",P.value=k.value||ce.value,K.value=!0,_(P.value)}async function _(w){try{A.value=!0,H.value="";let c=w;/^[A-Za-z]:$/.test(c)&&(c+="/");const I=await fetch(`/api/browse_directory?path=${encodeURIComponent(c)}`);if(I.status===403){const W=await I.json();H.value=W.error||"目录浏览功能未启用";return}if(!I.ok){const W=await I.json();H.value=W.error||"获取目录内容失败";return}const V=await I.json();V.success?(Y.value=V.items,P.value=V.currentPath):H.value=V.error||"获取目录内容失败"}catch(c){H.value=`获取目录内容失败: ${c.message}`}finally{A.value=!1}}function v(){if(/^[A-Za-z]:$/.test(P.value)||/^[A-Za-z]:[\\/]$/.test(P.value)||P.value==="/")return;let w=P.value.split(/[/\\]/);w.pop();let c=w.join("/");w.length===1&&/^[A-Za-z]:$/.test(w[0])&&(c=w[0]+"/"),c&&_(c)}function N(w){w.type==="directory"&&_(w.path)}function oe(){k.value=P.value,K.value=!1}async function ke(){if(!k.value){o.warning("目录路径不能为空");return}try{F.value=!0;const c=await(await fetch("/api/change_directory",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:k.value})})).json();c.success?(o.success("已切换工作目录"),ce.value=c.directory,b.value=!1,i.isGitRepo=c.isGitRepo,c.isGitRepo?(await Promise.all([i.getCurrentBranch(),i.getAllBranches(),i.getUserInfo()]),await ue()):(o.warning("当前目录不是一个Git仓库"),i.$reset())):o.error(c.error||"切换目录失败")}catch(w){o.error(`切换目录失败: ${w.message}`)}finally{F.value=!1}}function ne(w){fe(w.path)}async function pe(w){await y.addFileToStage(w)}async function T(w){await y.unstageFile(w)}async function d(){await ue()}async function U(){J.value=!0;try{await i.gitPull(),await ue()}finally{J.value=!1}}async function Z(){le.value=!0;try{await i.gitFetchAll(),await ue()}finally{le.value=!1}}async function ge(w){try{await Oe.confirm(`确定要撤回文件 "${w}" 的所有修改吗?此操作无法撤销。`,"撤回修改",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"});const I=await(await fetch("/api/revert_file",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({filePath:w})})).json();I.success?(o.success("已撤回文件修改"),await ue()):o.error(I.error?`撤回失败: ${I.error}`:"撤回文件修改失败,请重试")}catch(c){if(c==="cancel"||c.message==="cancel")return;const I=c.message||"未知错误";I!=="undefined"?o.error(`撤回文件修改失败: ${I}`):o.error("撤回文件修改失败,请重试")}}function ye(w){const c=w.split("/");return c[c.length-1]}function ve(w){const c=w.split("/");return c.length<=1?"":c.slice(0,-1).join("/")}return qe(()=>{ue()}),Ye(()=>y.autoUpdateEnabled,(w,c)=>{console.log(`自动更新状态变更: ${c} -> ${w}`),y.toggleAutoUpdate()},{immediate:!1}),p({refreshStatus:d}),(w,c)=>{const I=At,V=St,W=Ce,M=ot,xe=Tt,Ee=ls("ArrowDown"),Re=it,je=Pt,Me=Mt,Be=nt,Pe=Ut;return u(),g("div",Ls,[e("div",Vs,[c[6]||(c[6]=e("h2",null,"Git 状态",-1)),e("div",Rs,[t(V,{content:a(y).autoUpdateEnabled?"禁用自动更新文件状态":"启用自动更新文件状态",placement:"top","hide-after":1e3},{default:s(()=>[t(I,{modelValue:a(y).autoUpdateEnabled,"onUpdate:modelValue":c[0]||(c[0]=L=>a(y).autoUpdateEnabled=L),style:{"--el-switch-on-color":"#67C23A","--el-switch-off-color":"#909399","margin-right":"10px"},"inline-prompt":"","active-icon":a(bt),"inactive-icon":a(yt),class:"auto-update-switch"},null,8,["modelValue","active-icon","inactive-icon"])]),_:1},8,["content"]),t(V,{content:"Git Pull (拉取远程更新)",placement:"top","hide-after":1e3},{default:s(()=>[t(W,{type:"primary",icon:a(Et),circle:"",size:"small",onClick:U,loading:J.value,disabled:!a(i).hasUpstream},null,8,["icon","loading","disabled"])]),_:1}),t(V,{content:"Git Fetch All (获取所有远程分支)",placement:"top","hide-after":1e3},{default:s(()=>[t(W,{type:"info",icon:a(jt),circle:"",size:"small",onClick:Z,loading:le.value},null,8,["icon","loading"])]),_:1}),t(V,{content:"刷新状态",placement:"top","hide-after":1e3},{default:s(()=>[t(W,{type:"primary",icon:a(os),circle:"",size:"small",onClick:d,loading:D.value},null,8,["icon","loading"])]),_:1})])]),e("div",Bs,[e("div",zs,[t(M,null,{default:s(()=>[t(a(ht))]),_:1}),e("span",null,C(ce.value),1),t(W,{type:"primary",size:"small",onClick:S,plain:""},{default:s(()=>c[7]||(c[7]=[h(" 切换目录 ")])),_:1})]),a(i).isGitRepo?(u(),g("div",As,[a(i).hasUpstream&&(a(i).branchAhead>0||a(i).branchBehind>0)?(u(),g("div",Es,[e("div",js,[t(V,{content:"本地分支与远程分支的状态对比",placement:"top"},{default:s(()=>[e("div",Ms,[a(i).branchAhead>0?(u(),re(xe,{key:0,size:"small",type:"warning",class:"status-badge"},{default:s(()=>[e("span",Ps,[t(M,null,{default:s(()=>[t(a(_t))]),_:1}),h(" 你的分支领先 'origin/"+C(a(i).currentBranch)+"' "+C(a(i).branchAhead)+" 个提交 ",1)])]),_:1})):q("",!0),a(i).branchBehind>0?(u(),re(xe,{key:1,size:"small",type:"info",class:"status-badge"},{default:s(()=>[e("span",Us,[t(M,null,{default:s(()=>[t(Ee)]),_:1}),h(" 你的分支落后 'origin/"+C(a(i).currentBranch)+"' "+C(a(i).branchBehind)+" 个提交 ",1)])]),_:1})):q("",!0)])]),_:1})])])):q("",!0),!a(i).hasUpstream||a(i).branchAhead===0&&a(i).branchBehind===0?(u(),g("div",Os,[e("p",null,[c[10]||(c[10]=h("当前工作在 ")),t(xe,{size:"small",type:"success"},{default:s(()=>[h(C(a(i).currentBranch),1)]),_:1}),c[11]||(c[11]=h(" 分支"))])])):q("",!0),a(y).fileList.length?(u(),g("div",Fs,[a(y).fileList.some(L=>L.type==="added")?(u(),g("div",Is,[c[13]||(c[13]=e("div",{class:"file-group-header"},"已暂存的更改",-1)),e("div",Ns,[(u(!0),g(he,null,be(a(y).fileList.filter(L=>L.type==="added"),L=>(u(),g("div",{key:L.path,class:"file-item",onClick:we=>ne(L)},[e("div",Ws,[e("div",Js,[e("span",Ys,C(ye(L.path)),1),e("span",qs,C(ve(L.path)),1)])]),e("div",Zs,[t(V,{content:"取消暂存",placement:"top","hide-after":1e3},{default:s(()=>[t(W,{type:"warning",size:"small",circle:"",onClick:Ne(we=>T(L.path),["stop"])},{default:s(()=>c[12]||(c[12]=[h("-")])),_:2},1032,["onClick"])]),_:2},1024)])],8,Hs))),128))])])):q("",!0),a(y).fileList.some(L=>L.type==="modified"||L.type==="deleted")?(u(),g("div",Xs,[c[15]||(c[15]=e("div",{class:"file-group-header"},"未暂存的更改",-1)),e("div",Ks,[(u(!0),g(he,null,be(a(y).fileList.filter(L=>L.type==="modified"||L.type==="deleted"),L=>(u(),g("div",{key:L.path,class:"file-item",onClick:we=>ne(L)},[e("div",ea,[e("div",{class:Ve(["file-status-indicator",L.type])},null,2),e("div",ta,[e("span",sa,C(ye(L.path)),1),e("span",aa,C(ve(L.path)),1)])]),e("div",la,[t(V,{content:"添加到暂存区",placement:"top","hide-after":1e3},{default:s(()=>[t(W,{type:"success",size:"small",circle:"",onClick:Ne(we=>pe(L.path),["stop"])},{default:s(()=>c[14]||(c[14]=[h("+")])),_:2},1032,["onClick"])]),_:2},1024),t(V,{content:"撤回修改",placement:"top","hide-after":1e3},{default:s(()=>[t(W,{type:"danger",size:"small",icon:a(xt),circle:"",onClick:Ne(we=>ge(L.path),["stop"])},null,8,["icon","onClick"])]),_:2},1024)])],8,Qs))),128))])])):q("",!0),a(y).fileList.some(L=>L.type==="untracked")?(u(),g("div",oa,[c[18]||(c[18]=e("div",{class:"file-group-header"},"未跟踪的文件",-1)),e("div",na,[(u(!0),g(he,null,be(a(y).fileList.filter(L=>L.type==="untracked"),L=>(u(),g("div",{key:L.path,class:"file-item",onClick:we=>ne(L)},[e("div",ra,[c[16]||(c[16]=e("div",{class:"file-status-indicator untracked"},null,-1)),e("div",ca,[e("span",ua,C(ye(L.path)),1),e("span",da,C(ve(L.path)),1)])]),e("div",fa,[t(V,{content:"添加到暂存区",placement:"top","hide-after":1e3},{default:s(()=>[t(W,{type:"success",size:"small",circle:"",onClick:Ne(we=>pe(L.path),["stop"])},{default:s(()=>c[17]||(c[17]=[h("+")])),_:2},1032,["onClick"])]),_:2},1024),t(V,{content:"删除文件",placement:"top","hide-after":1e3},{default:s(()=>[t(W,{type:"danger",size:"small",icon:a(yt),circle:"",onClick:Ne(we=>ge(L.path),["stop"])},null,8,["icon","onClick"])]),_:2},1024)])],8,ia))),128))])])):q("",!0)])):a(i).isGitRepo?(u(),g("div",pa,[e("div",va,[t(M,null,{default:s(()=>[t(a(tt))]),_:1})]),c[21]||(c[21]=e("div",{class:"empty-text"},"没有检测到任何更改",-1)),c[22]||(c[22]=e("div",{class:"empty-subtext"},"工作区是干净的",-1)),e("div",ma,[e("p",null,[c[19]||(c[19]=h("当前工作在 ")),t(xe,{size:"small",type:"success"},{default:s(()=>[h(C(a(i).currentBranch),1)]),_:1}),c[20]||(c[20]=h(" 分支"))]),a(i).hasUpstream?(u(),g("div",ga,[a(i).branchAhead>0?(u(),g("span",ya,[t(M,null,{default:s(()=>[t(a(_t))]),_:1}),h(" 你的分支领先 'origin/"+C(a(i).currentBranch)+"' "+C(a(i).branchAhead)+" 个提交 ",1)])):a(i).branchBehind>0?(u(),g("span",ha,[t(M,null,{default:s(()=>[t(Ee)]),_:1}),h(" 你的分支落后 'origin/"+C(a(i).currentBranch)+"' "+C(a(i).branchBehind)+" 个提交 ",1)])):(u(),g("span",_a,[t(M,null,{default:s(()=>[t(a(bt))]),_:1}),h(" 你的分支与 'origin/"+C(a(i).currentBranch)+"' 同步 ",1)]))])):q("",!0)])])):q("",!0)])):(u(),g("div",Gs,[e("div",Ds,[c[9]||(c[9]=e("p",null,"当前目录不是Git仓库",-1)),t(W,{type:"primary",size:"small",onClick:S},{default:s(()=>c[8]||(c[8]=[h(" 切换目录 ")])),_:1})])]))]),t(Be,{modelValue:b.value,"onUpdate:modelValue":c[2]||(c[2]=L=>b.value=L),title:"切换工作目录",width:"80vw",top:"10vh",style:{height:"200px"}},{default:s(()=>[t(Me,null,{default:s(()=>[t(je,{label:"目录路径"},{default:s(()=>[t(Re,{modelValue:k.value,"onUpdate:modelValue":c[1]||(c[1]=L=>k.value=L),placeholder:"请输入目录路径",clearable:""},null,8,["modelValue"]),e("div",wa,[t(W,{onClick:ae,type:"primary",plain:"",class:"no-padding-left"},{default:s(()=>[t(M,null,{default:s(()=>[t(a(ht))]),_:1}),c[23]||(c[23]=h(" 浏览 "))]),_:1}),t(W,{onClick:ke,loading:F.value,type:"primary"},{default:s(()=>c[24]||(c[24]=[h(" 切换 ")])),_:1},8,["loading"])])]),_:1})]),_:1})]),_:1},8,["modelValue"]),t(Be,{modelValue:K.value,"onUpdate:modelValue":c[3]||(c[3]=L=>K.value=L),title:"浏览目录",width:"80vw",top:"70px"},{default:s(()=>[e("div",$a,[e("span",null,"当前路径: "+C(P.value),1)]),H.value?(u(),g("div",ba,C(H.value),1)):q("",!0),Ue((u(),g("div",ka,[e("div",Ca,[t(W,{onClick:v,disabled:!P.value||A.value,size:"small",class:"no-padding-left"},{default:s(()=>[t(M,null,{default:s(()=>[t(a(_t))]),_:1}),c[25]||(c[25]=h(" 上级目录 "))]),_:1},8,["disabled"]),t(W,{onClick:oe,type:"primary",size:"small",class:"no-padding-left"},{default:s(()=>c[26]||(c[26]=[h(" 选择当前目录 ")])),_:1})]),e("div",Sa,[e("ul",Ta,[(u(!0),g(he,null,be(Y.value,L=>(u(),g("li",{key:L.path,class:Ve(["directory-item",L.type]),onClick:we=>N(L)},[L.type==="directory"?(u(),re(M,{key:0},{default:s(()=>[t(a(ht))]),_:1})):(u(),re(M,{key:1},{default:s(()=>[t(a(tt))]),_:1})),e("span",null,C(L.name),1)],10,xa))),128))])])])),[[Pe,A.value]])]),_:1},8,["modelValue"]),t(Be,{modelValue:te.value,"onUpdate:modelValue":c[5]||(c[5]=L=>te.value=L),width:"80vw",top:"70px","destroy-on-close":"",class:"diff-dialog","show-close":!1,style:{height:"calc(100vh - 140px)"},"modal-append-to-body":!1,"close-on-click-modal":!1},{header:s(()=>[e("div",La,[e("div",Va,[t(M,{class:"file-icon"},{default:s(()=>[t(a(tt))]),_:1}),e("span",Ra,C(E.value),1)]),e("div",Ba,[t(W,{onClick:c[4]||(c[4]=L=>te.value=!1),circle:"",size:"small",icon:a(yt),class:"close-button"},null,8,["icon"])])])]),footer:s(()=>[e("div",Aa,[t(W,{type:"primary",icon:a(ns),onClick:se,disabled:O.value<=0||a(y).fileList.length===0,plain:"",class:"nav-button"},{default:s(()=>c[27]||(c[27]=[h(" 上一个文件 ")])),_:1},8,["icon","disabled"]),e("div",Ea,[t(xe,{type:"info",effect:"plain",class:"counter-tag"},{default:s(()=>[h(C(O.value+1)+" / "+C(a(y).fileList.length),1)]),_:1})]),t(W,{type:"primary",icon:a(zt),onClick:x,disabled:O.value>=a(y).fileList.length-1||a(y).fileList.length===0,plain:"",class:"nav-button"},{icon:s(()=>[t(M,{class:"el-icon--right"},{default:s(()=>[t(a(zt))]),_:1})]),default:s(()=>[c[28]||(c[28]=h(" 下一个文件 "))]),_:1},8,["icon","disabled"])])]),default:s(()=>[Ue((u(),g("div",za,[ee.value?(u(),g("div",{key:0,innerHTML:j(ee.value),class:"diff-formatted"},null,8,Ga)):(u(),g("div",Da,"该文件没有差异或是新文件"))])),[[Pe,X.value]])]),_:1},8,["modelValue"])])}}}),rt=(Q,p)=>{const $=Q.__vccOpts||Q;for(const[y,i]of p)$[y]=i;return $},Ma=rt(ja,[["__scopeId","data-v-1fbfdf49"]]),Ht=Ct("config",()=>{const Q=r(""),p=r([]),$=r([]),y=r([]),i=r(!1),D=r(!1);async function E(){if(D.value&&!i.value)return console.log("使用缓存的配置信息"),{defaultCommitMessage:Q.value,descriptionTemplates:p.value,scopeTemplates:$.value,messageTemplates:y.value};try{i.value=!0,console.log("加载配置信息...");const k=await(await fetch("/api/config/getConfig")).json();return Q.value=k.defaultCommitMessage||"",p.value=k.descriptionTemplates||[],$.value=k.scopeTemplates||[],y.value=k.messageTemplates||[],D.value=!0,console.log("配置信息加载完成"),k}catch(b){return console.error("加载配置失败:",b),o.error(`加载配置失败: ${b.message}`),null}finally{i.value=!1}}async function ee(b){try{const F=await(await fetch("/api/config/saveDefaultMessage",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({defaultCommitMessage:b})})).json();return F.success?(Q.value=b,o.success("默认提交信息已保存"),!0):(o.error(`保存失败: ${F.error}`),!1)}catch(k){return o.error(`保存失败: ${k.message}`),!1}}async function te(b,k){try{const K=await(await fetch("/api/config/save-template",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({template:b,type:k})})).json();return K.success?(k==="description"?p.value.includes(b)||p.value.push(b):k==="scope"?$.value.includes(b)||$.value.push(b):k==="message"&&(y.value.includes(b)||y.value.push(b)),o.success("模板已保存"),!0):(o.error(`保存模板失败: ${K.error}`),!1)}catch(F){return o.error(`保存模板失败: ${F.message}`),!1}}async function X(b,k){try{const K=await(await fetch("/api/config/delete-template",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({template:b,type:k})})).json();return K.success?(k==="description"?p.value=p.value.filter(P=>P!==b):k==="scope"?$.value=$.value.filter(P=>P!==b):k==="message"&&(y.value=y.value.filter(P=>P!==b)),o.success("模板已删除"),!0):(o.error(`删除模板失败: ${K.error}`),!1)}catch(F){return o.error(`删除模板失败: ${F.message}`),!1}}async function O(b,k,F){try{const P=await(await fetch("/api/config/update-template",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldTemplate:b,newTemplate:k,type:F})})).json();if(P.success){if(F==="description"){const Y=p.value.indexOf(b);Y!==-1&&(p.value[Y]=k)}else if(F==="scope"){const Y=$.value.indexOf(b);Y!==-1&&($.value[Y]=k)}else if(F==="message"){const Y=y.value.indexOf(b);Y!==-1&&(y.value[Y]=k)}return o.success("模板已更新"),!0}else return o.error(`更新模板失败: ${P.error}`),!1}catch(K){return o.error(`更新模板失败: ${K.message}`),!1}}return{defaultCommitMessage:Q,descriptionTemplates:p,scopeTemplates:$,messageTemplates:y,isLoading:i,isLoaded:D,loadConfig:E,saveDefaultMessage:ee,saveTemplate:te,deleteTemplate:X,updateTemplate:O}}),Pa={key:0,class:"pushing-indicator"},Ua={key:0,class:"push-success-indicator"},Oa={class:"card-content"},Fa={class:"layout-container"},Ia={key:0,class:"git-config-warning"},Na={class:"commit-section"},Ha={class:"commit-options"},Wa={class:"options-row"},Ja={class:"commit-mode-toggle"},Ya={class:"no-verify-toggle"},qa={key:0,class:"commit-form"},Za={class:"description-container"},Xa={class:"input-actions"},Ka={class:"preview-section"},Qa={class:"preview-content code-command"},el={key:1,class:"standard-commit-form"},tl={class:"standard-commit-header"},sl={class:"type-scope-container"},al={class:"scope-wrapper"},ll={class:"description-container"},ol={class:"advanced-fields"},nl={class:"preview-section"},il={class:"preview-content"},rl={class:"preview-content code-command"},cl={class:"actions-section"},ul={class:"action-groups"},dl={class:"operations-wrapper"},fl={class:"action-group"},pl={class:"group-buttons"},vl={key:0},ml={key:0},gl={key:0},yl={key:0},hl={class:"action-group"},_l={class:"group-buttons"},wl={class:"action-group reset-group"},$l={class:"group-buttons"},bl={key:0},kl={class:"template-container"},Cl={class:"template-form"},Sl={class:"template-form-buttons"},Tl={class:"template-list"},xl={class:"template-content"},Ll={class:"template-actions"},Vl={class:"template-container"},Rl={class:"template-form"},Bl={class:"template-form-buttons"},zl={class:"template-list"},Gl={class:"template-content"},Dl={class:"template-actions"},Al={class:"template-container message-template-container"},El={class:"template-form"},jl={class:"template-form-buttons"},Ml={class:"templates-container"},Pl={class:"message-templates-list"},Ul={class:"templates-scroll-area"},Ol={class:"template-content"},Fl={class:"template-actions"},Il={class:"current-default-message"},Nl={class:"default-message-content"},Hl={class:"message-help-text"},Wl=lt({__name:"CommitForm",setup(Q){const p=Lt(),$=Fe(),y=Ht(),i=r(""),D=r(!1),E=r(!1),ee=r(!1),te=r(!1),X=r("输入提交信息..."),O=r(""),b=r(!1),k=r("feat"),F=r(""),K=r(""),P=r(""),Y=r(""),A=r([]),H=r(!1),J=r(""),le=r(!1),ce=r(""),ue=r(-1),j=r([]),fe=r(!1),se=r(""),x=r(!1),S=r(""),ae=r(-1),_=r(!1),v=r(""),N=r(!1),oe=r(!1),ke=[{value:"feat",label:"feat: 新功能"},{value:"fix",label:"fix: 修复bug"},{value:"docs",label:"docs: 文档修改"},{value:"style",label:"style: 样式修改"},{value:"refactor",label:"refactor: 代码重构"},{value:"test",label:"test: 测试代码"},{value:"chore",label:"chore: 构建/工具修改"}],ne=r([]),pe=r(!1),T=r(""),d=r(-1);Ye(b,f=>{localStorage.setItem("zen-gitsync-standard-commit",f.toString())}),Ye(N,f=>{localStorage.setItem("zen-gitsync-skip-hooks",f.toString())});const U=_e(()=>{if(!b.value)return i.value||O.value;let f=`${k.value||""}`;return F.value&&(f+=`(${F.value})`),f+=`: ${K.value}`,P.value&&(f+=`
15
15
 
16
16
  ${P.value}`),Y.value&&(f+=`
17
17
 
18
- ${Y.value}`),f}),Z=_e(()=>{let f=`git commit -m "${U.value}"`;return N.value&&(f+=" --no-verify"),f});async function ge(){try{const f=await y.loadConfig();f&&(X.value=`输入提交信息 (默认: ${f.defaultCommitMessage})`,O.value=f.defaultCommitMessage||"",f.descriptionTemplates&&Array.isArray(f.descriptionTemplates)&&(A.value=f.descriptionTemplates),f.scopeTemplates&&Array.isArray(f.scopeTemplates)&&(j.value=f.scopeTemplates),f.messageTemplates&&Array.isArray(f.messageTemplates)&&(ne.value=f.messageTemplates))}catch(f){console.error("加载配置失败:",f)}}async function ye(){if(!J.value.trim()){o({message:"请输入模板内容",type:"warning"});return}try{if(le.value)await ve();else{if(A.value.includes(J.value)){o({message:"该模板已存在",type:"warning"});return}await y.saveTemplate(J.value,"description")&&(A.value.includes(J.value)||A.value.push(J.value),A.value=[...A.value],J.value="")}}catch(f){o({message:`保存模板失败: ${f.message}`,type:"error"})}}async function ve(){if(!J.value.trim()){o({message:"请输入模板内容",type:"warning"});return}try{if(await y.updateTemplate(ce.value,J.value,"description")){const l=A.value.indexOf(ce.value);l!==-1&&(A.value[l]=J.value),A.value=[...A.value],le.value=!1,ce.value="",ue.value=-1,J.value=""}}catch(f){o({message:`更新模板失败: ${f.message}`,type:"error"})}}function w(f,l){le.value=!0,ce.value=f,ue.value=l,J.value=f}function c(){le.value=!1,ce.value="",ue.value=-1,J.value=""}async function I(){if(!se.value.trim()){o({message:"请输入模板内容",type:"warning"});return}try{if(x.value)await V();else{if(j.value.includes(se.value)){o({message:"该模板已存在",type:"warning"});return}await y.saveTemplate(se.value,"scope")&&(j.value.includes(se.value)||j.value.push(se.value),j.value=[...j.value],se.value="")}}catch(f){o({message:`保存模板失败: ${f.message}`,type:"error"})}}async function V(){if(!se.value.trim()){o({message:"请输入模板内容",type:"warning"});return}try{if(await y.updateTemplate(S.value,se.value,"scope")){const l=j.value.indexOf(S.value);l!==-1&&(j.value[l]=se.value),j.value=[...j.value],x.value=!1,S.value="",ae.value=-1,se.value=""}}catch(f){o({message:`更新模板失败: ${f.message}`,type:"error"})}}function W(f,l){x.value=!0,S.value=f,ae.value=l,se.value=f}function M(){x.value=!1,S.value="",ae.value=-1,se.value=""}async function xe(f){try{if(await Oe.confirm(`确定要删除描述模板 "${f}" 吗?`,"删除确认",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"}),await y.deleteTemplate(f,"description")){const Se=A.value.indexOf(f);Se!==-1&&A.value.splice(Se,1),A.value=[...A.value]}}catch(l){if(l==="cancel")return;o({message:`删除模板失败: ${l.message}`,type:"error"})}}async function Ee(f){try{if(await Oe.confirm(`确定要删除作用域模板 "${f}" 吗?`,"删除确认",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"}),await y.deleteTemplate(f,"scope")){const Se=j.value.indexOf(f);Se!==-1&&j.value.splice(Se,1),j.value=[...j.value]}}catch(l){if(l==="cancel")return;o({message:`删除模板失败: ${l.message}`,type:"error"})}}function Be(f){K.value=f,H.value=!1}function je(f){F.value=f,fe.value=!1}function Me(){H.value=!0}function Re(){fe.value=!0}async function Pe(){try{await p.addToStage()&&p.fetchStatus()}catch(f){o({message:`添加文件失败: ${f.message}`,type:"error"})}}async function L(){if(!U.value.trim()){o({message:"提交信息不能为空",type:"warning"});return}try{await p.commitChanges(U.value,N.value)&&(Ie(),p.fetchStatus(),p.fetchLog(),$.getBranchStatus())}catch(f){o({message:`提交失败: ${f.message}`,type:"error"})}}function we(){E.value=!0,setTimeout(()=>{E.value=!1},2e3)}async function ct(){D.value=!0;try{await p.pushToRemote(),we(),$.getBranchStatus()}catch(f){o({message:`推送失败: ${f.message}`,type:"error"})}finally{D.value=!1}}async function ut(){ee.value=!0;try{await $.gitPull(),await p.fetchStatus()}catch(f){o({message:`拉取失败: ${f.message}`,type:"error"})}finally{ee.value=!1}}async function dt(){te.value=!0;try{await $.gitFetchAll(),await p.fetchStatus()}catch(f){o({message:`获取远程分支信息失败: ${f.message}`,type:"error"})}finally{te.value=!1}}async function Ze(){if(!U.value.trim()){o({message:"提交信息不能为空",type:"warning"});return}try{await p.addAndCommit(U.value,N.value),Ie(),p.fetchStatus(),p.fetchLog()}catch(f){o({message:`暂存并提交失败: ${f.message}`,type:"error"})}}async function ft(){if(!U.value.trim()){o({message:"提交信息不能为空",type:"warning"});return}try{D.value=!0,await p.addCommitAndPush(U.value,N.value),Ie(),$.getCurrentBranch(),p.fetchLog(),$.getBranchStatus(),D.value=!1,we()}catch(f){o({message:`暂存、提交并推送失败: ${f.message}`,type:"error"}),D.value=!1}}async function pt(){try{await Oe.confirm(`确定要重置当前分支 "${$.currentBranch}" 到远程状态吗?这将丢失所有未推送的提交和本地更改。`,"重置到远程分支",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"}),await p.resetToRemote($.currentBranch)&&(p.fetchStatus(),p.fetchLog())}catch(f){f!=="cancel"&&o({message:`重置到远程分支失败: ${f.message}`,type:"error"})}}function Ie(){i.value="",K.value="",P.value="",Y.value=""}function m(){v.value=O.value,_.value=!0}async function n(){if(!v.value.trim()){o({message:"请输入默认提交信息",type:"warning"});return}try{await y.saveDefaultMessage(v.value)&&(O.value=v.value,X.value=`输入提交信息 (默认: ${v.value})`,_.value=!1)}catch(f){o({message:`保存默认提交信息失败: ${f.message}`,type:"error"})}}const R=_e(()=>p.fileList.some(f=>["modified","deleted","untracked"].includes(f.type))),B=_e(()=>p.fileList.filter(f=>["modified","deleted","untracked"].includes(f.type)).length),de=_e(()=>p.fileList.filter(f=>f.type==="added").length),me=_e(()=>de.value>0),$e=_e(()=>p.fileList.length>0),z=_e(()=>$.branchAhead>0),Le=_e(()=>$.branchBehind>0),vt=_e(()=>$.hasUpstream&&(z.value||me.value&&U.value.trim())),Vt=_e(()=>me.value),Jt=_e(()=>$.hasUpstream&&(z.value||Le.value||$e.value));async function Yt(){if(!v.value.trim()){o({message:"请输入模板内容",type:"warning"});return}try{if(pe.value)await qt();else{if(ne.value.includes(v.value)){o({message:"该模板已存在",type:"warning"});return}ne.value.push(v.value);const l=await(await fetch("/api/config/save-template",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({template:v.value,type:"message"})})).json();l.success?(o({message:"提交信息模板保存成功!",type:"success"}),v.value=""):o({message:"模板保存失败: "+l.error,type:"error"})}}catch(f){o({message:"模板保存失败: "+f.message,type:"error"})}}async function qt(){try{if(d.value>=0){const f=T.value,l=v.value;ne.value[d.value]=l;const Ae=await(await fetch("/api/config/update-template",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldTemplate:f,newTemplate:l,type:"message"})})).json();Ae.success?(o({message:"提交信息模板更新成功!",type:"success"}),pe.value=!1,T.value="",d.value=-1,v.value=""):o({message:"模板更新失败: "+Ae.error,type:"error"})}}catch(f){o({message:"模板更新失败: "+f.message,type:"error"})}}function Zt(f,l){pe.value=!0,T.value=f,d.value=l,v.value=f}function Xt(){pe.value=!1,T.value="",d.value=-1,v.value=""}async function Kt(f){try{const l=ne.value.indexOf(f);l!==-1&&ne.value.splice(l,1);const Ae=await(await fetch("/api/config/delete-template",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({template:f,type:"message"})})).json();Ae.success?o({message:"提交信息模板删除成功!",type:"success"}):o({message:"模板删除失败: "+Ae.error,type:"error"})}catch(l){o({message:"模板删除失败: "+l.message,type:"error"})}}function Qt(f){i.value=f,v.value=f}return qe(()=>{ge();const f=localStorage.getItem("zen-gitsync-standard-commit");f!==null&&(b.value=f==="true");const l=localStorage.getItem("zen-gitsync-skip-hooks");l!==null&&(N.value=l==="true")}),(f,l)=>{const Se=ot,Ae=Ot,Bt=At,Te=St,ze=it,ie=Ce,es=st,ts=at,Xe=It,mt=ds,Ke=Nt,gt=nt,Rt=Tt;return u(),g("div",{class:Ve(["card",{"is-pushing":a(p).isPushing||D.value}])},[l[58]||(l[58]=e("div",{class:"card-header"},[e("h2",null,"提交更改")],-1)),t(Gt,{name:"el-fade-in-linear"},{default:s(()=>[D.value?(u(),g("div",Pa,l[15]||(l[15]=[e("div",{class:"pushing-spinner"},[e("svg",{viewBox:"0 0 50 50",class:"circular"},[e("circle",{class:"path",cx:"25",cy:"25",r:"20",fill:"none"})])],-1),e("div",{class:"pushing-text"},"正在推送...",-1)]))):q("",!0)]),_:1}),t(Gt,{name:"el-fade-in-linear"},{default:s(()=>[E.value?(u(),g("div",Ua,[t(Se,{class:"push-success-icon"},{default:s(()=>[t(a(bt))]),_:1}),l[16]||(l[16]=e("div",{class:"push-success-text"},"推送成功!",-1))])):q("",!0)]),_:1}),e("div",Oa,[e("div",Fa,[a($).userName===""||a($).userEmail===""?(u(),g("div",Ia,[t(Ae,{title:"Git用户信息未配置",type:"warning",closable:!1,"show-icon":""},{default:s(()=>l[17]||(l[17]=[e("p",null,"您需要配置Git用户名和邮箱才能提交代码。请使用以下命令配置:",-1),e("pre",{class:"config-command"},`git config --global user.name "Your Name"
19
- git config --global user.email "your.email@example.com"`,-1)])),_:1})])):(u(),g(he,{key:1},[e("div",Na,[e("div",Ha,[e("div",Wa,[e("div",Ja,[t(Bt,{modelValue:b.value,"onUpdate:modelValue":l[0]||(l[0]=G=>b.value=G),"active-text":"标准化提交","inactive-text":"普通提交"},null,8,["modelValue"])]),e("div",Ya,[t(Te,{content:"跳过 Git 钩子检查 (--no-verify)",placement:"top"},{default:s(()=>[t(Bt,{modelValue:N.value,"onUpdate:modelValue":l[1]||(l[1]=G=>N.value=G),"active-text":"跳过钩子 (--no-verify)"},null,8,["modelValue"])]),_:1})])])]),b.value?(u(),g("div",el,[e("div",tl,[e("div",sl,[t(ts,{modelValue:k.value,"onUpdate:modelValue":l[3]||(l[3]=G=>k.value=G),placeholder:"提交类型",class:"type-select",clearable:""},{default:s(()=>[(u(),g(he,null,be(ke,G=>t(es,{key:G.value,label:G.label,value:G.value},null,8,["label","value"])),64))]),_:1},8,["modelValue"]),e("div",al,[t(ze,{modelValue:F.value,"onUpdate:modelValue":l[4]||(l[4]=G=>F.value=G),placeholder:"作用域(可选)",class:"scope-input",clearable:""},null,8,["modelValue"]),t(ie,{type:"primary",icon:a(Je),circle:"",size:"small",class:"settings-button",onClick:Re},null,8,["icon"])])]),e("div",ll,[t(ze,{modelValue:K.value,"onUpdate:modelValue":l[5]||(l[5]=G=>K.value=G),placeholder:"简短描述(必填)",class:"description-input",clearable:""},null,8,["modelValue"]),t(ie,{type:"primary",icon:a(Je),circle:"",size:"small",class:"settings-button",onClick:Me},null,8,["icon"])])]),e("div",{class:"advanced-options-toggle",onClick:l[6]||(l[6]=G=>oe.value=!oe.value)},[e("span",null,C(oe.value?"收起":"正文及页脚"),1),t(Se,{class:Ve(["toggle-icon",{"is-active":oe.value}])},{default:s(()=>[t(a(is))]),_:1},8,["class"])]),Ue(e("div",ol,[t(ze,{modelValue:P.value,"onUpdate:modelValue":l[7]||(l[7]=G=>P.value=G),type:"textarea",rows:4,placeholder:"正文(可选):详细描述本次提交的内容和原因",class:"body-input",clearable:""},null,8,["modelValue"]),t(ze,{modelValue:Y.value,"onUpdate:modelValue":l[8]||(l[8]=G=>Y.value=G),placeholder:"页脚(可选):如 Closes #123",class:"footer-input",clearable:""},null,8,["modelValue"])],512),[[Ft,oe.value]]),e("div",nl,[l[19]||(l[19]=e("div",{class:"preview-title"},"提交信息预览:",-1)),e("pre",il,C(U.value),1),l[20]||(l[20]=e("div",{class:"preview-title",style:{"margin-top":"10px"}},"Git提交命令预览:",-1)),e("pre",rl,C(Z.value),1)])])):(u(),g("div",qa,[e("div",Za,[t(ze,{modelValue:i.value,"onUpdate:modelValue":l[2]||(l[2]=G=>i.value=G),placeholder:X.value,type:"textarea",rows:6,resize:"none",class:"commit-message-input"},null,8,["modelValue","placeholder"]),e("div",Xa,[t(ie,{type:"primary",icon:a(Je),circle:"",size:"small",class:"settings-button",onClick:m},null,8,["icon"])])]),e("div",Ka,[l[18]||(l[18]=e("div",{class:"preview-title"},"Git提交命令预览:",-1)),e("pre",Qa,'git commit -m "'+C(U.value||"<提交信息>")+'"'+C(N.value?" --no-verify":""),1)])]))]),e("div",cl,[l[33]||(l[33]=e("h3",null,"Git 操作",-1)),e("div",ul,[e("div",dl,[e("div",fl,[l[26]||(l[26]=e("div",{class:"group-title"},"基础操作",-1)),e("div",pl,[t(Te,{content:R.value?`暂存${B.value}个待更改文件`:"git add .",placement:"top",effect:"light","popper-class":"git-cmd-tooltip"},{default:s(()=>[t(ie,{type:"primary",onClick:Pe,loading:a(p).isAddingFiles,disabled:!R.value,class:"action-button"},{default:s(()=>[l[21]||(l[21]=h(" 暂存更改 ")),B.value>0?(u(),g("span",vl,"("+C(B.value)+")",1)):q("",!0)]),_:1},8,["loading","disabled"])]),_:1},8,["content"]),t(Te,{content:me.value?`提交${de.value}个已暂存文件`:"git commit",placement:"top",effect:"light","popper-class":"git-cmd-tooltip"},{default:s(()=>[t(ie,{type:"primary",onClick:L,loading:a(p).isLoadingStatus,disabled:!me.value||!U.value.trim(),class:"action-button"},{default:s(()=>[l[22]||(l[22]=h(" 提交 ")),de.value>0?(u(),g("span",ml,"("+C(de.value)+")",1)):q("",!0)]),_:1},8,["loading","disabled"])]),_:1},8,["content"]),t(Te,{content:z.value?`推送${a($).branchAhead}个本地提交`:"git push",placement:"top",effect:"light","popper-class":"git-cmd-tooltip"},{default:s(()=>[t(ie,{type:"primary",icon:a(rs),onClick:ct,loading:a(p).isPushing,disabled:!vt.value,class:Ve(["action-button","push-button",{"is-loading":a(p).isPushing||D.value}]),style:kt(z.value?{backgroundColor:"#67c23a !important",borderColor:"#67c23a !important"}:{})},{default:s(()=>[l[23]||(l[23]=h(" 推送 ")),z.value?(u(),g("span",gl,"("+C(a($).branchAhead)+")",1)):q("",!0)]),_:1},8,["icon","loading","disabled","class","style"])]),_:1},8,["content"]),t(Te,{content:Le.value?`拉取${a($).branchBehind}个远程提交`:"git pull",placement:"top",effect:"light","popper-class":"git-cmd-tooltip"},{default:s(()=>[t(ie,{type:"primary",icon:a(Et),onClick:ut,loading:ee.value,disabled:!a($).hasUpstream,class:"action-button",style:kt(Le.value?{color:"white",backgroundColor:"#E6A23C",borderColor:"#E6A23C"}:{})},{default:s(()=>[l[24]||(l[24]=h(" 拉取 ")),Le.value?(u(),g("span",yl,"("+C(a($).branchBehind)+")",1)):q("",!0)]),_:1},8,["icon","loading","disabled","style"])]),_:1},8,["content"]),t(Te,{content:"git fetch --all",placement:"top",effect:"light","popper-class":"git-cmd-tooltip"},{default:s(()=>[t(ie,{type:"info",icon:a(jt),onClick:dt,loading:te.value,class:"action-button"},{default:s(()=>l[25]||(l[25]=[h(" 获取所有远程分支 ")])),_:1},8,["icon","loading"])]),_:1})])]),e("div",hl,[l[29]||(l[29]=e("div",{class:"group-title"},"组合操作",-1)),e("div",_l,[t(Te,{content:"git add + git commit",placement:"top",effect:"light","popper-class":"git-cmd-tooltip"},{default:s(()=>[t(ie,{type:"primary",icon:a(Qe),onClick:Ze,loading:a(p).isAddingFiles||a(p).isCommiting,disabled:!R.value||!U.value.trim(),class:"action-button"},{default:s(()=>l[27]||(l[27]=[h(" 暂存并提交 ")])),_:1},8,["icon","loading","disabled"])]),_:1}),t(Te,{content:"git add + git commit + git push",placement:"top",effect:"light","popper-class":"git-cmd-tooltip"},{default:s(()=>[t(ie,{type:"success",icon:a(cs),onClick:ft,loading:a(p).isAddingFiles||a(p).isCommiting||a(p).isPushing,disabled:!$e.value||!U.value.trim()||!a($).hasUpstream,class:Ve(["action-button","one-click-push",{"is-loading":a(p).isAddingFiles||a(p).isCommiting||a(p).isPushing}])},{default:s(()=>l[28]||(l[28]=[h(" 一键推送 ")])),_:1},8,["icon","loading","disabled","class"])]),_:1})])])]),e("div",wl,[l[32]||(l[32]=e("div",{class:"group-title"},"重置操作",-1)),e("div",$l,[t(Te,{content:Vt.value?`撤销${de.value}个已暂存文件`:"git reset HEAD",placement:"top",effect:"light","popper-class":"git-cmd-tooltip"},{default:s(()=>[t(ie,{type:"warning",icon:a(xt),onClick:a(p).resetHead,loading:a(p).isResetting,disabled:!Vt.value,class:"action-button reset-button"},{default:s(()=>[l[30]||(l[30]=h(" 重置暂存区 ")),de.value>0?(u(),g("span",bl,"("+C(de.value)+")",1)):q("",!0)]),_:1},8,["icon","onClick","loading","disabled"])]),_:1},8,["content"]),t(Te,{content:"git reset --hard origin/branch",placement:"top",effect:"light","popper-class":"git-cmd-tooltip"},{default:s(()=>[t(ie,{type:"danger",icon:a(us),onClick:pt,loading:a(p).isResetting,disabled:!Jt.value,class:"action-button danger-button"},{default:s(()=>l[31]||(l[31]=[h(" 重置到远程 ")])),_:1},8,["icon","loading","disabled"])]),_:1})])])])])],64))]),t(gt,{title:"简短描述模板设置",modelValue:H.value,"onUpdate:modelValue":l[10]||(l[10]=G=>H.value=G),width:"80vw",top:"70px",style:{height:"calc(100vh - 140px)"},"close-on-click-modal":!1,class:"template-dialog"},{default:s(()=>[e("div",kl,[e("div",Cl,[t(ze,{modelValue:J.value,"onUpdate:modelValue":l[9]||(l[9]=G=>J.value=G),placeholder:le.value?"编辑模板内容":"输入新模板内容",class:"template-input",clearable:""},null,8,["modelValue","placeholder"]),e("div",Sl,[le.value?(u(),re(ie,{key:0,onClick:c},{default:s(()=>l[34]||(l[34]=[h("取消")])),_:1})):q("",!0),t(ie,{type:"primary",onClick:ye,disabled:!J.value.trim()},{default:s(()=>[h(C(le.value?"更新模板":"添加模板"),1)]),_:1},8,["disabled"])])]),e("div",Tl,[l[38]||(l[38]=e("h3",null,"已保存模板",-1)),A.value.length===0?(u(),re(Xe,{key:0,description:"暂无保存的模板"})):q("",!0),(u(!0),g(he,null,be(A.value,(G,Ge)=>(u(),re(Ke,{key:Ge,class:"template-item"},{default:s(()=>[t(mt,{justify:"space-between",align:"middle",style:{width:"100%"}},{default:s(()=>[e("div",xl,C(G),1),e("div",Ll,[t(ie,{type:"primary",size:"small",onClick:De=>Be(G)},{default:s(()=>l[35]||(l[35]=[h("使用")])),_:2},1032,["onClick"]),t(ie,{type:"warning",size:"small",icon:a(Qe),onClick:De=>w(G,Ge)},{default:s(()=>l[36]||(l[36]=[h("编辑")])),_:2},1032,["icon","onClick"]),t(ie,{type:"danger",size:"small",onClick:De=>xe(G)},{default:s(()=>l[37]||(l[37]=[h("删除")])),_:2},1032,["onClick"])])]),_:2},1024)]),_:2},1024))),128))])])]),_:1},8,["modelValue"]),t(gt,{title:"作用域模板设置",modelValue:fe.value,"onUpdate:modelValue":l[12]||(l[12]=G=>fe.value=G),width:"80vw",top:"70px",style:{height:"calc(100vh - 140px)"},"close-on-click-modal":!1,class:"template-dialog"},{default:s(()=>[e("div",Vl,[e("div",Bl,[t(ze,{modelValue:se.value,"onUpdate:modelValue":l[11]||(l[11]=G=>se.value=G),placeholder:x.value?"编辑作用域模板内容":"输入新作用域模板",class:"template-input",clearable:""},null,8,["modelValue","placeholder"]),e("div",Rl,[x.value?(u(),re(ie,{key:0,onClick:M},{default:s(()=>l[39]||(l[39]=[h("取消")])),_:1})):q("",!0),t(ie,{type:"primary",onClick:I,disabled:!se.value.trim()},{default:s(()=>[h(C(x.value?"更新模板":"添加模板"),1)]),_:1},8,["disabled"])])]),e("div",zl,[l[43]||(l[43]=e("h3",null,"已保存作用域",-1)),j.value.length===0?(u(),re(Xe,{key:0,description:"暂无保存的作用域"})):q("",!0),(u(!0),g(he,null,be(j.value,(G,Ge)=>(u(),re(Ke,{key:Ge,class:"template-item"},{default:s(()=>[t(mt,{justify:"space-between",align:"middle",style:{width:"100%"}},{default:s(()=>[e("div",Gl,C(G),1),e("div",Dl,[t(ie,{type:"primary",size:"small",onClick:De=>je(G)},{default:s(()=>l[40]||(l[40]=[h("使用")])),_:2},1032,["onClick"]),t(ie,{type:"warning",size:"small",icon:a(Qe),onClick:De=>W(G,Ge)},{default:s(()=>l[41]||(l[41]=[h("编辑")])),_:2},1032,["icon","onClick"]),t(ie,{type:"danger",size:"small",onClick:De=>Ee(G)},{default:s(()=>l[42]||(l[42]=[h("删除")])),_:2},1032,["onClick"])])]),_:2},1024)]),_:2},1024))),128))])])]),_:1},8,["modelValue"]),t(gt,{title:"默认提交信息设置",modelValue:_.value,"onUpdate:modelValue":l[14]||(l[14]=G=>_.value=G),width:"80vw",top:"70px",style:{height:"calc(100vh - 140px)"},"close-on-click-modal":!1,class:"message-template-dialog"},{default:s(()=>[e("div",Al,[e("div",El,[t(ze,{modelValue:v.value,"onUpdate:modelValue":l[13]||(l[13]=G=>v.value=G),placeholder:pe.value?"编辑模板内容":"输入新模板内容",class:"template-input",clearable:""},null,8,["modelValue","placeholder"]),e("div",jl,[pe.value?(u(),re(ie,{key:0,onClick:Xt},{default:s(()=>l[44]||(l[44]=[h("取消")])),_:1})):q("",!0),t(ie,{type:"primary",onClick:Yt,disabled:!v.value.trim()},{default:s(()=>[h(C(pe.value?"更新模板":"添加模板"),1)]),_:1},8,["disabled"]),t(ie,{type:"success",onClick:n,disabled:!v.value.trim()},{default:s(()=>l[45]||(l[45]=[h(" 设为默认提交信息 ")])),_:1},8,["disabled"])])]),e("div",Ml,[e("div",Pl,[l[49]||(l[49]=e("h3",null,"已保存模板",-1)),e("div",Ul,[ne.value.length===0?(u(),re(Xe,{key:0,description:"暂无保存的模板"})):q("",!0),(u(!0),g(he,null,be(ne.value,(G,Ge)=>(u(),re(Ke,{key:Ge,class:"template-item"},{default:s(()=>[t(mt,{justify:"space-between",align:"middle",style:{width:"100%"}},{default:s(()=>[e("div",Ol,C(G),1),e("div",Fl,[t(ie,{type:"primary",size:"small",onClick:De=>Qt(G)},{default:s(()=>l[46]||(l[46]=[h("使用")])),_:2},1032,["onClick"]),t(ie,{type:"warning",size:"small",icon:a(Qe),onClick:De=>Zt(G,Ge)},{default:s(()=>l[47]||(l[47]=[h("编辑")])),_:2},1032,["icon","onClick"]),t(ie,{type:"danger",size:"small",onClick:De=>Kt(G)},{default:s(()=>l[48]||(l[48]=[h("删除")])),_:2},1032,["onClick"])])]),_:2},1024)]),_:2},1024))),128))])]),e("div",Il,[l[57]||(l[57]=e("h3",null,"当前默认提交信息",-1)),O.value?(u(),re(Ke,{key:0,class:"default-message-card"},{default:s(()=>[e("div",Nl,C(O.value),1)]),_:1})):(u(),re(Xe,{key:1,description:"尚未设置默认提交信息","image-size":100})),e("div",Hl,[l[55]||(l[55]=e("h4",null,"关于默认提交信息",-1)),l[56]||(l[56]=e("p",null,"默认提交信息将在未输入提交信息时自动使用。",-1)),e("p",null,[l[52]||(l[52]=h("你可以通过点击左侧模板的")),t(Rt,{size:"small",type:"primary"},{default:s(()=>l[50]||(l[50]=[h("使用")])),_:1}),l[53]||(l[53]=h("按钮先选择喜欢的模板,然后点击上方")),t(Rt,{size:"small",type:"success"},{default:s(()=>l[51]||(l[51]=[h("设为默认提交信息")])),_:1}),l[54]||(l[54]=h("按钮保存。"))])])])])])]),_:1},8,["modelValue"])])],2)}}}),Jl=rt(Wl,[["__scopeId","data-v-194f08d6"]]),Yl={class:"card"},ql={key:0,class:"refresh-notification"},Zl={class:"log-header"},Xl={class:"log-actions"},Kl={key:1,class:"filter-panel-header"},Ql={class:"filter-form"},eo={class:"filter-item"},to={class:"filter-item"},so={class:"filter-item"},ao={class:"filter-item"},lo={class:"filter-actions"},oo={key:0},no={key:1},io={key:0,class:"graph-view"},ro={key:0,class:"commit-count"},co={class:"graph-controls"},uo={class:"zoom-controls"},fo={class:"scale-info"},po={key:1,class:"table-view-container"},vo=["onClick"],mo={class:"author-name"},go={key:0,class:"branch-container"},yo={key:0,class:"load-more-container"},ho={class:"pagination-info"},_o={key:0,class:"loading-more"},wo={key:2,class:"no-more-data"},$o={key:0,class:"total-loaded"},bo={class:"commit-detail-container"},ko={key:0,class:"commit-info"},Co={class:"commit-info-header"},So={class:"info-item"},To={class:"item-value"},xo={class:"info-item"},Lo={class:"item-value"},Vo={class:"info-item"},Bo={class:"item-value"},Ro={class:"commit-message-container"},zo=["innerHTML"],Go={class:"commit-files-diff"},Do={class:"files-list"},Ao={key:1},Eo=["onClick"],jo={class:"file-diff"},Mo={key:0},Po={key:1},Uo=["innerHTML"],We=.5,et=1.5,$t=.1,Oo=lt({__name:"LogList",setup(Q,{expose:p}){const $=Lt(),y=Fe();let i=[];const D=r(i),E=r(""),ee=r(!1),te=_e(()=>$.isLoadingLog||ee.value),X=r(!1),O=r(0),b=r(!1),k=r(null),F=r(1),K=r(!0),P=r(!1),Y=r(null),A=r(!1),H=r(null),J=r([]),le=r(""),ce=r(!1),ue=r(""),j=r(1),fe=r(!1),se=r(!1),x=r([]),S=r(""),ae=r(null),_=r([]),v=r([]),N=r([]),oe=r(!1),ke=r(0),ne=r(0),pe=r(null),T=_e(()=>D.value);async function d(m=!1,n=1){if(!Fe().isGitRepo){E.value="当前目录不是Git仓库";return}try{n>1?P.value=!0:ee.value=!0,console.log(`加载提交历史: page=${n}, all=${m}`);const B=new URLSearchParams;B.append("page",n.toString()),B.append("all",m.toString()),x.value.length>0&&B.append("author",x.value.join(",")),v.value.length>0&&B.append("branch",v.value.join(",")),S.value&&B.append("message",S.value),ae.value&&Array.isArray(ae.value)&&ae.value.length===2&&(B.append("dateFrom",ae.value[0]),B.append("dateTo",ae.value[1])),B.append("_t",Date.now().toString());const me=await(await fetch(`/api/log?${B.toString()}`)).json();if(!me||!me.data||!Array.isArray(me.data)){console.error("API返回的数据格式不正确:",me),E.value="加载提交历史失败: 服务器返回数据格式不正确";return}const $e=n>1;$e?me.data.forEach(z=>i.push(z)):(i.length=0,me.data.forEach(z=>i.push(z))),D.value=[...i],F.value=n,O.value=me.total||i.length,K.value=me.hasMore===!0,K.value||console.log("已加载所有提交记录"),$e||(fe.value=!0,setTimeout(()=>{fe.value=!1},2e3)),!$e&&b.value&&setTimeout(U,0),E.value=""}catch(B){E.value="加载提交历史失败: "+(B instanceof Error?B.message:String(B)),console.error("加载日志失败:",B),n>1&&(K.value=!1)}finally{n>1?P.value=!1:ee.value=!1}}async function U(){if(console.log(`开始渲染图表...数据长度: ${i.length}`),!k.value){console.error("图表容器未找到");return}if(i.length===0){console.error("没有日志数据可渲染");return}try{k.value.innerHTML="",console.log(`创建gitgraph实例,分支: ${y.currentBranch||"main"}`);const m=Cs(k.value,{orientation:"vertical-reverse",template:"metro",author:"提交者 <committer@example.com>"}),n={},R=m.branch(y.currentBranch||"main");n[y.currentBranch||"main"]=R,console.log(`开始创建提交图...共${i.length}条提交`),i.forEach((B,de)=>{let me=R;if(B.branch){const $e=ye(B.branch.split(",")[0]);n[$e]||(n[$e]=m.branch($e)),me=n[$e]}me.commit({hash:B.hash,subject:B.message,author:`${B.author} <${B.email}>`}),de%10===0&&console.log(`已渲染 ${de+1}/${i.length} 个提交`)}),console.log("图表渲染完成"),setTimeout(()=>{je()},100)}catch(m){console.error("渲染图表失败:",m),E.value="渲染图表失败: "+(m instanceof Error?m.message:String(m))}}function Z(){b.value=!b.value,b.value&&i.length>0&&setTimeout(U,0)}function ge(){d(!X.value)}function ye(m){return m.includes("HEAD -> ")?m.replace("HEAD -> ",""):m.includes("origin/")?m:m.trim()}function ve(m){return m.includes("HEAD")?"success":m.includes("origin/")?"warning":"info"}const w=r(null),c=r(null);function I(m){if(b.value||!K.value||P.value||te.value)return;const n=m.target,{scrollTop:R,scrollHeight:B,clientHeight:de}=n,me=B-R-de;console.log("表格滚动:",{scrollTop:R,scrollHeight:B,clientHeight:de,scrollDistance:me}),me<=20&&(console.log("已滚动到底部,加载更多数据"),we())}function V(){w.value&&(c.value=w.value.$el.querySelector(".el-table__body-wrapper"),c.value?(console.log("添加表格滚动监听"),c.value.addEventListener("scroll",I,!0)):console.error("未找到表格的body-wrapper元素"))}function W(){c.value&&(console.log("移除表格滚动监听"),c.value.removeEventListener("scroll",I,!0),c.value=null)}qe(()=>{y.isGitRepo?($.log.length>0?(console.log("使用已加载的日志数据"),i.length=0,$.log.forEach(m=>i.push(m)),O.value=$.log.length,b.value&&setTimeout(()=>{console.log(`准备渲染图表,数据长度: ${i.length}`),U()},100)):(console.log("初始加载日志数据"),d()),dt()):E.value="当前目录不是Git仓库",fs(()=>{setTimeout(()=>{V()},500)})}),Ye(()=>y.allBranches,m=>{m&&m.length>0?(N.value=[...m].sort(),console.log(`分支数据更新,共 ${N.value.length} 个分支`)):(N.value=[],console.warn("gitStore 中没有分支数据"))},{immediate:!0}),ps(()=>{W(),Y.value!==null&&(window.clearInterval(Y.value),Y.value=null)});const M=()=>{if(!y.isGitRepo){E.value="当前目录不是Git仓库";return}F.value=1,K.value=!0,d(X.value,1)};Ye(()=>$.log,m=>{console.log("监听到gitLogStore.log变化,更新图表数据");try{i.length=0,Array.isArray(m)&&m.forEach(n=>n&&i.push(n)),O.value=i.length,F.value=1,D.value=[...i],fe.value=!0,setTimeout(()=>{fe.value=!1},2e3),console.log(`数据更新完成,共${D.value.length}条记录,准备渲染图表`),b.value&&i.length>0&&setTimeout(U,0)}catch(n){console.error("更新日志数据失败:",n)}},{immediate:!0}),p({refreshLog:M});function xe(){j.value<et&&(j.value=Math.min(et,j.value+$t),Be())}function Ee(){j.value>We&&(j.value=Math.max(We,j.value-$t),Be())}function Be(){if(!k.value)return;const m=k.value.querySelector("svg");m&&(m.style.transform=`scale(${j.value})`,m.style.transformOrigin="top left")}function je(){if(!k.value)return;const m=k.value.querySelector("svg");if(!m)return;const n=m.getBoundingClientRect().width/j.value,R=k.value.clientWidth;n>R?j.value=Math.max(We,R/n):j.value=1,Be()}async function Me(m){if(m){H.value=m,A.value=!0,ce.value=!0,J.value=[],le.value="",ue.value="",console.log("提交详情对象:",JSON.stringify(m,null,2)),console.log("哈希值类型和长度:",typeof m.hash,m.hash?m.hash.length:0),console.log("提交信息类型和长度:",typeof m.message,m.message?m.message.length:0),console.log("提交分支:",m.branch);try{if(console.log(`获取提交详情: ${m.hash}`),!m.hash||m.hash.length<7){console.error("无效的提交哈希值:",m.hash),le.value="无效的提交哈希值",ce.value=!1;return}const n=await fetch(`/api/commit-files?hash=${m.hash}`);console.log("API响应状态: ",n.status);const R=await n.json();console.log("文件列表数据: ",R),R.success&&Array.isArray(R.files)?(J.value=R.files,J.value.length>0?await Re(m.hash,J.value[0]):(console.log("没有找到变更文件"),le.value="该提交没有变更文件")):(console.error("获取提交文件列表失败:",R.error||"未知错误"),le.value=`获取文件列表失败: ${R.error||"未知错误"}`)}catch(n){console.error("获取提交详情失败:",n),le.value=`获取提交详情失败: ${n.message}`}finally{ce.value=!1}}}async function Re(m,n){ce.value=!0,ue.value=n;try{console.log(`获取文件差异: hash=${m}, file=${n}`);const R=await fetch(`/api/commit-file-diff?hash=${m}&file=${encodeURIComponent(n)}`);console.log("差异API响应状态: ",R.status);const B=await R.json();console.log("差异数据: ",B.success,typeof B.diff),B.success?le.value=B.diff||"没有变更内容":(console.error("获取差异失败: ",B.error),le.value=`获取差异失败: ${B.error||"未知错误"}`)}catch(R){console.error("获取文件差异失败:",R),le.value=`获取差异失败: ${R.message}`}finally{ce.value=!1}}function Pe(m){if(!m)return"";const n=m.split(`
20
- `);function R(B){return B.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#039;")}return n.map(B=>{const de=R(B);return B.startsWith("diff --git")?`<div class="diff-header">${de}</div>`:B.startsWith("---")?`<div class="diff-old-file">${de}</div>`:B.startsWith("+++")?`<div class="diff-new-file">${de}</div>`:B.startsWith("@@")?`<div class="diff-hunk-header">${de}</div>`:B.startsWith("+")?`<div class="diff-added">${de}</div>`:B.startsWith("-")?`<div class="diff-removed">${de}</div>`:`<div class="diff-context">${de}</div>`}).join("")}function L(m){return m?(console.log("格式化前的提交信息:",m),console.log("提交信息中的换行符数量:",(m.match(/\n/g)||[]).length),m.trim()):"(无提交信息)"}function we(){!K.value||P.value||te.value||(console.log(`加载更多日志,页码: ${F.value+1}`),d(X.value,F.value+1))}function ct(){x.value=[],v.value=[],S.value="",ae.value=null,F.value=1,d(X.value,1)}function ut(){F.value=1,d(X.value,1)}async function dt(){try{console.log("获取所有可用作者...");const n=await(await fetch("/api/authors")).json();n.success&&Array.isArray(n.authors)?(_.value=n.authors.sort(),console.log(`获取到${_.value.length}位作者`)):(console.warn("从API获取作者列表失败,将从现有日志中提取作者列表"),Ze())}catch(m){console.error("获取作者列表失败:",m),Ze()}}function Ze(){const m=new Set;D.value.forEach(n=>{n.author&&m.add(n.author)}),_.value=Array.from(m).sort(),console.log(`从现有日志中提取了${_.value.length}位作者`)}function ft(m,n,R){console.log("handleContextMenu",m,n,R),R.preventDefault(),ke.value=R.clientY,ne.value=R.clientX,pe.value=m,oe.value=!0;const B=()=>{oe.value=!1,document.removeEventListener("click",B)};setTimeout(()=>{document.addEventListener("click",B)},0)}async function pt(m){if(m)try{await Oe.confirm(`确定要撤销提交 ${m.hash.substring(0,7)} 吗?这将创建一个新的提交来撤销这次提交的更改。`,"撤销提交确认",{confirmButtonText:"确认",cancelButtonText:"取消",type:"warning"});const R=await(await fetch("/api/revert-commit",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({hash:m.hash})})).json();R.success?(o.success(R.message||"已成功撤销提交"),M(),$.fetchStatus(),y.getBranchStatus()):o.error(R.error||"撤销提交失败")}catch(n){n!=="cancel"&&(console.error("撤销提交出错:",n),o.error("撤销提交失败: "+(n.message||n)))}}async function Ie(m){if(m)try{await Oe.confirm(`确定要将提交 ${m.hash.substring(0,7)} Cherry-Pick 到当前分支吗?`,"Cherry-Pick确认",{confirmButtonText:"确认",cancelButtonText:"取消",type:"warning"});const R=await(await fetch("/api/cherry-pick-commit",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({hash:m.hash})})).json();R.success?(o.success(R.message||"已成功Cherry-Pick提交"),M(),$.fetchStatus(),y.getBranchStatus()):o.error(R.error||"Cherry-Pick提交失败")}catch(n){n!=="cancel"&&(console.error("Cherry-Pick提交出错:",n),o.error("Cherry-Pick提交失败: "+(n.message||n)))}}return(m,n)=>{var $e;const R=ot,B=St,de=It,me=Ut;return u(),g(he,null,[e("div",Yl,[fe.value?(u(),g("div",ql," 提交历史已刷新 ")):q("",!0),e("div",Zl,[n[12]||(n[12]=e("div",{class:"header-left"},[e("h2",null,"提交历史")],-1)),e("div",Xl,[b.value?q("",!0):(u(),re(a(Ce),{key:0,type:se.value?"primary":"default",size:"small",onClick:n[0]||(n[0]=z=>se.value=!se.value)},{icon:s(()=>[t(R,null,{default:s(()=>[t(a(ms))]),_:1})]),default:s(()=>[n[11]||(n[11]=h(" 筛选 ")),T.value.length!==D.value.length?(u(),re(a(vs),{key:0,value:T.value.length,class:"filter-badge"},null,8,["value"])):q("",!0)]),_:1},8,["type"])),t(a(Ce),{type:"primary",size:"small",onClick:Z},{icon:s(()=>[t(R,null,{default:s(()=>[(u(),re(Dt(b.value?a(tt):a(gs))))]),_:1})]),default:s(()=>[h(" "+C(b.value?"表格视图":"图表视图"),1)]),_:1}),t(a(Ce),{type:"primary",size:"small",onClick:ge,loading:te.value},{icon:s(()=>[t(R,null,{default:s(()=>[(u(),re(Dt(X.value?a(ys):a(hs))))]),_:1})]),default:s(()=>[h(" "+C(X.value?"显示分页加载 (每页100条)":"显示所有提交"),1)]),_:1},8,["loading"]),t(a(Ce),{circle:"",size:"small",onClick:n[1]||(n[1]=z=>M()),loading:te.value,class:Ve({"refresh-button-animated":fe.value})},{default:s(()=>[t(R,null,{default:s(()=>[t(a(xt))]),_:1})]),_:1},8,["loading","class"])])]),se.value&&!b.value?(u(),g("div",Kl,[e("div",Ql,[e("div",eo,[n[13]||(n[13]=e("div",{class:"filter-label"},"作者:",-1)),t(a(at),{modelValue:x.value,"onUpdate:modelValue":n[2]||(n[2]=z=>x.value=z),placeholder:"选择作者",multiple:"",clearable:"",filterable:"",class:"filter-input",size:"small"},{default:s(()=>[(u(!0),g(he,null,be(_.value,z=>(u(),re(a(st),{key:z,label:z,value:z},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])]),e("div",to,[n[14]||(n[14]=e("div",{class:"filter-label"},"分支:",-1)),t(a(at),{modelValue:v.value,"onUpdate:modelValue":n[3]||(n[3]=z=>v.value=z),placeholder:"选择分支",multiple:"",clearable:"",filterable:"",class:"filter-input",size:"small"},{default:s(()=>[(u(!0),g(he,null,be(N.value,z=>(u(),re(a(st),{key:z,label:z,value:z},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])]),e("div",so,[n[15]||(n[15]=e("div",{class:"filter-label"},"提交信息包含:",-1)),t(a(it),{modelValue:S.value,"onUpdate:modelValue":n[4]||(n[4]=z=>S.value=z),placeholder:"关键词",clearable:"",class:"filter-input",size:"small"},null,8,["modelValue"])]),e("div",ao,[n[16]||(n[16]=e("div",{class:"filter-label"},"日期范围:",-1)),t(a(_s),{modelValue:ae.value,"onUpdate:modelValue":n[5]||(n[5]=z=>ae.value=z),type:"daterange","range-separator":"至","start-placeholder":"开始日期","end-placeholder":"结束日期",format:"YYYY-MM-DD","value-format":"YYYY-MM-DD",class:"filter-input date-range",size:"small"},null,8,["modelValue"])]),e("div",lo,[t(a(Ce),{type:"primary",size:"small",onClick:ut},{default:s(()=>n[17]||(n[17]=[h("应用筛选")])),_:1}),t(a(Ce),{type:"info",size:"small",onClick:ct},{default:s(()=>n[18]||(n[18]=[h("重置")])),_:1})])])])):q("",!0),e("div",{class:Ve(["content-area",{"with-filter":se.value&&!b.value}])},[E.value?(u(),g("div",oo,C(E.value),1)):(u(),g("div",no,[b.value?(u(),g("div",io,[a(i).length>0?(u(),g("div",ro," 显示 "+C(a(i).length)+" 条提交记录 "+C(X.value?"(全部)":"(分页加载,每页100条)"),1)):q("",!0),e("div",co,[e("div",uo,[t(a(Ce),{type:"primary",circle:"",size:"small",onClick:Ee,disabled:j.value<=We},{default:s(()=>[t(R,null,{default:s(()=>[t(a(ws))]),_:1})]),_:1},8,["disabled"]),t(a($s),{modelValue:j.value,"onUpdate:modelValue":n[6]||(n[6]=z=>j.value=z),min:We,max:et,step:$t,onChange:Be,class:"zoom-slider"},null,8,["modelValue"]),t(a(Ce),{type:"primary",circle:"",size:"small",onClick:xe,disabled:j.value>=et},{default:s(()=>[t(R,null,{default:s(()=>[t(a(bs))]),_:1})]),_:1},8,["disabled"]),t(a(Ce),{type:"primary",size:"small",onClick:je},{default:s(()=>n[19]||(n[19]=[h(" 自适应大小 ")])),_:1})]),e("div",fo," 缩放: "+C(Math.round(j.value*100))+"% ",1)]),e("div",{ref_key:"graphContainer",ref:k,class:"graph-container"},null,512)])):(u(),g("div",po,[Ue((u(),re(a(ks),{ref_key:"tableRef",ref:w,data:T.value,stripe:"",border:"",class:"log-table","empty-text":te.value?"加载中...":"没有匹配的提交记录",height:"500",onRowContextmenu:ft},{default:s(()=>[t(a(He),{label:"提交哈希",width:"100",resizable:""},{default:s(z=>[e("span",{class:"commit-hash",onClick:Le=>Me(z.row)},C(z.row.hash.substring(0,7)),9,vo)]),_:1}),t(a(He),{prop:"date",label:"日期",width:"120",resizable:""}),t(a(He),{label:"作者",width:"120",resizable:""},{default:s(z=>[t(B,{content:z.row.email,placement:"top","hide-after":1e3},{default:s(()=>[e("span",mo,C(z.row.author),1)]),_:2},1032,["content"])]),_:1}),t(a(He),{label:"分支",width:"180",resizable:""},{default:s(z=>[z.row.branch?(u(),g("div",go,[(u(!0),g(he,null,be(z.row.branch.split(","),(Le,vt)=>(u(),re(a(Tt),{key:vt,size:"small",type:ve(Le),class:"branch-tag"},{default:s(()=>[h(C(ye(Le)),1)]),_:2},1032,["type"]))),128))])):q("",!0)]),_:1}),t(a(He),{prop:"message",label:"提交信息","min-width":"250"})]),_:1},8,["data","empty-text"])),[[me,te.value]]),X.value?q("",!0):(u(),g("div",yo,[e("div",ho,[e("span",null,"第 "+C(F.value)+" 页 "+C(O.value>0?`/ 共 ${Math.ceil(O.value/100)||1} 页`:"")+" (总计 "+C(O.value)+" 条记录)",1)]),P.value?(u(),g("div",_o,n[20]||(n[20]=[e("div",{class:"loading-spinner"},null,-1),e("span",null,"加载更多...",-1)]))):K.value?(u(),g("div",{key:1,class:"load-more-button",onClick:we},n[21]||(n[21]=[e("span",null,"加载更多",-1)]))):(u(),g("div",wo,[n[22]||(n[22]=e("span",null,"没有更多数据了",-1)),D.value.length>0?(u(),g("span",$o,"(已加载 "+C(D.value.length)+" 条记录)",1)):q("",!0)]))]))]))]))],2),t(a(nt),{modelValue:A.value,"onUpdate:modelValue":n[7]||(n[7]=z=>A.value=z),title:`提交详情: ${($e=H.value)!=null&&$e.hash?H.value.hash.substring(0,7):"未知"}`,width:"80%","destroy-on-close":"",class:"commit-detail-dialog"},{default:s(()=>[Ue((u(),g("div",bo,[H.value?(u(),g("div",ko,[e("div",Co,[e("div",So,[n[23]||(n[23]=e("span",{class:"item-label"},"哈希:",-1)),e("span",To,C(H.value.hash),1)]),e("div",xo,[n[24]||(n[24]=e("span",{class:"item-label"},"作者:",-1)),e("span",Lo,C(H.value.author)+" <"+C(H.value.email)+">",1)]),e("div",Vo,[n[25]||(n[25]=e("span",{class:"item-label"},"日期:",-1)),e("span",Bo,C(H.value.date),1)])]),e("div",Ro,[n[26]||(n[26]=e("div",{class:"message-label"},"提交信息:",-1)),e("div",{class:"message-content",innerHTML:L(H.value.message).replace(/\n/g,"<br>")},null,8,zo)])])):q("",!0),e("div",Go,[e("div",Do,[n[27]||(n[27]=e("h3",null,"变更文件",-1)),J.value.length===0?(u(),re(de,{key:0,description:"没有找到变更文件"})):(u(),g("ul",Ao,[(u(!0),g(he,null,be(J.value,z=>(u(),g("li",{key:z,class:Ve({"active-file":z===ue.value}),onClick:Le=>Re(H.value.hash,z)},C(z),11,Eo))),128))]))]),e("div",jo,[ue.value?(u(),g("h3",Mo,"文件差异: "+C(ue.value),1)):(u(),g("h3",Po,"文件差异")),!le.value&&!ce.value?(u(),re(de,{key:2,description:"选择文件查看差异"})):le.value?(u(),g("div",{key:3,innerHTML:Pe(le.value),class:"diff-content"},null,8,Uo)):q("",!0)])])])),[[me,ce.value]])]),_:1},8,["modelValue","title"])]),n[33]||(n[33]=h()),Ue(e("div",{class:"context-menu",style:kt({top:ke.value+"px",left:ne.value+"px"})},[e("div",{class:"context-menu-item",onClick:n[8]||(n[8]=z=>Me(pe.value))},n[28]||(n[28]=[e("i",{class:"el-icon-view"},null,-1),h(" 查看详情 ")])),n[31]||(n[31]=h()),e("div",{class:"context-menu-item",onClick:n[9]||(n[9]=z=>pt(pe.value))},n[29]||(n[29]=[e("i",{class:"el-icon-delete"},null,-1),h(" 撤销提交 (Revert) ")])),n[32]||(n[32]=h()),e("div",{class:"context-menu-item",onClick:n[10]||(n[10]=z=>Ie(pe.value))},n[30]||(n[30]=[e("i",{class:"el-icon-edit"},null,-1),h(" Cherry-Pick 到当前分支 ")]))],4),[[Ft,oe.value]])],64)}}}),Fo=rt(Oo,[["__scopeId","data-v-7e7ea077"]]),Io="data:image/svg+xml,%3csvg%20width='200'%20height='200'%20viewBox='0%200%20200%20200'%20xmlns='http://www.w3.org/2000/svg'%3e%3c!--%20主分支%20--%3e%3cline%20x1='40'%20y1='40'%20x2='40'%20y2='160'%20stroke='%2334495e'%20stroke-width='8'%20stroke-linecap='round'%20/%3e%3c!--%20特性分支%20--%3e%3cpath%20d='M40,70%20C60,70%2080,90%2080,110%20L80,130'%20stroke='%233498db'%20stroke-width='8'%20stroke-linecap='round'%20stroke-linejoin='round'%20fill='none'%20/%3e%3c!--%20开发分支%20--%3e%3cpath%20d='M40,100%20C60,100%20100,110%20100,130%20L100,160'%20stroke='%232ecc71'%20stroke-width='8'%20stroke-linecap='round'%20stroke-linejoin='round'%20fill='none'%20/%3e%3c!--%20修复分支%20--%3e%3cpath%20d='M40,130%20C60,130%20120,140%20120,160'%20stroke='%23e74c3c'%20stroke-width='8'%20stroke-linecap='round'%20stroke-linejoin='round'%20fill='none'%20/%3e%3c!--%20合并点%20--%3e%3cpath%20d='M80,130%20C80,145%2060,145%2040,145'%20stroke='%233498db'%20stroke-width='8'%20stroke-linecap='round'%20stroke-linejoin='round'%20fill='none'%20/%3e%3c!--%20节点%20--%3e%3ccircle%20cx='40'%20cy='40'%20r='10'%20fill='%2334495e'%20/%3e%3ccircle%20cx='40'%20cy='70'%20r='10'%20fill='%2334495e'%20/%3e%3ccircle%20cx='40'%20cy='100'%20r='10'%20fill='%2334495e'%20/%3e%3ccircle%20cx='40'%20cy='130'%20r='10'%20fill='%2334495e'%20/%3e%3ccircle%20cx='40'%20cy='145'%20r='10'%20fill='%2334495e'%20/%3e%3ccircle%20cx='40'%20cy='160'%20r='10'%20fill='%2334495e'%20/%3e%3ccircle%20cx='80'%20cy='130'%20r='10'%20fill='%233498db'%20/%3e%3ccircle%20cx='100'%20cy='160'%20r='10'%20fill='%232ecc71'%20/%3e%3ccircle%20cx='120'%20cy='160'%20r='10'%20fill='%23e74c3c'%20/%3e%3c/svg%3e",No={class:"main-header"},Ho={class:"header-left"},Wo=["src"],Jo={class:"header-info"},Yo={key:0,id:"user-info"},qo={class:"user-name"},Zo={class:"user-email"},Xo={key:1,id:"user-info"},Ko={class:"main-container"},Qo={key:0,class:"loading-container"},en={class:"loading-spinner"},tn={key:1,class:"grid-layout"},sn={class:"git-status-panel"},an={key:0,class:"commit-form-panel"},ln={key:0,class:"card"},on={class:"tips"},nn={key:1,class:"commit-form-panel"},rn={key:2,class:"log-list-panel"},cn={class:"dialog-footer"},un={class:"main-footer"},dn={key:0,class:"branch-info"},fn={class:"branch-wrapper"},pn={class:"dialog-footer"},vn=lt({__name:"App",setup(Q){const p=r(""),$=r(null),y=r(null),i=Fe(),D=Ht(),E=r(!1),ee=r("");async function te(){try{const T=await D.loadConfig();T&&(p.value=`默认提交信息: ${T.defaultCommitMessage}`)}catch(T){console.error("加载配置失败:",T)}}async function X(){try{const d=await(await fetch("/api/current_directory")).json();return ee.value=d.directory||"未知目录",d}catch(T){return console.error("获取当前目录失败:",T),{directory:"未知目录",isGitRepo:!1}}}qe(async()=>{console.log("---------- 页面初始化开始 ----------");try{const[T,d]=await Promise.all([te(),X()]);i.isGitRepo=d.isGitRepo===!0,i.lastCheckedTime=Date.now(),i.isGitRepo?await Promise.all([i.getCurrentBranch(),i.getAllBranches(),i.getUserInfo()]):o.warning("当前目录不是Git仓库,部分功能将不可用")}catch(T){console.error("初始化失败:",T)}finally{E.value=!0,console.log("---------- 页面初始化完成 ----------"),setTimeout(()=>{_()},100)}});const O=r(!1),b=r(""),k=r("");async function F(){await i.createBranch(b.value,k.value)&&(O.value=!1,b.value="",y.value&&y.value.refreshStatus(),$.value&&$.value.refreshLog())}function K(){k.value=i.currentBranch,O.value=!0}async function P(T){await i.changeBranch(T)&&(y.value&&y.value.refreshStatus(),$.value&&$.value.refreshLog())}const Y=r(!1),A=r(""),H=r("");function J(){A.value=i.userName,H.value=i.userEmail,Y.value=!0}async function le(){if(!A.value||!H.value){o.warning("用户名和邮箱不能为空");return}await i.restoreUserConfig(A.value,H.value)&&(Y.value=!1)}async function ce(){await i.clearUserConfig()&&(A.value="",H.value="")}let ue=!1,j=!1,fe=0,se=0,x="",S="";function ae(){const T=document.querySelector(".grid-layout");if(!T)return;const d=getComputedStyle(T).gridTemplateColumns.split(" "),U=getComputedStyle(T).gridTemplateRows.split(" ");if(d.length>=3&&U.length>=3){const Z=parseFloat(d[0]),ge=parseFloat(d[2]),ye=Z+ge,ve=Z/ye,w=parseFloat(U[0]),c=parseFloat(U[2]),I=w+c,V=w/I;localStorage.setItem("zen-gitsync-layout-left-ratio",ve.toString()),localStorage.setItem("zen-gitsync-layout-top-ratio",V.toString()),console.log(`布局比例已保存 - 左侧: ${(ve*100).toFixed(0)}%, 上方: ${(V*100).toFixed(0)}%`)}}function _(){const T=document.querySelector(".grid-layout");if(!T)return;const d=localStorage.getItem("zen-gitsync-layout-left-ratio"),U=localStorage.getItem("zen-gitsync-layout-top-ratio");if(d){const Z=parseFloat(d),ge=1-Z;T.style.gridTemplateColumns=`${Z}fr 8px ${ge}fr`,console.log(`已恢复左侧比例: ${(Z*100).toFixed(0)}%`)}else T.style.gridTemplateColumns="1fr 8px 3fr";if(U){const Z=parseFloat(U),ge=1-Z;T.style.gridTemplateRows=`${Z}fr 8px ${ge}fr`,console.log(`已恢复上方比例: ${(Z*100).toFixed(0)}%`)}}function v(T){var U;ue=!0,fe=T.clientX;const d=document.querySelector(".grid-layout");x=getComputedStyle(d).gridTemplateColumns,(U=document.getElementById("v-resizer"))==null||U.classList.add("active"),document.addEventListener("mousemove",N),document.addEventListener("mouseup",oe),T.preventDefault()}function N(T){if(!ue)return;const d=document.querySelector(".grid-layout"),U=T.clientX-fe,Z=x.split(" ");if(Z.length>=3){const ge=parseFloat(Z[0]),ye=parseFloat(Z[2]),ve=ge+ye,w=(ge+U/d.clientWidth*ve)/ve,c=1-w,I=.1,V=.5;w<I?d.style.gridTemplateColumns=`${I}fr 8px ${1-I}fr`:w>V?d.style.gridTemplateColumns=`${V}fr 8px ${1-V}fr`:d.style.gridTemplateColumns=`${w}fr 8px ${c}fr`}}function oe(){var T;ue=!1,(T=document.getElementById("v-resizer"))==null||T.classList.remove("active"),document.removeEventListener("mousemove",N),document.removeEventListener("mouseup",oe),ae()}function ke(T){var U;j=!0,se=T.clientY;const d=document.querySelector(".grid-layout");S=getComputedStyle(d).gridTemplateRows,(U=document.getElementById("h-resizer"))==null||U.classList.add("active"),document.addEventListener("mousemove",ne),document.addEventListener("mouseup",pe),T.preventDefault()}function ne(T){if(!j)return;const d=document.querySelector(".grid-layout"),U=T.clientY-se,Z=S.split(" ");if(Z.length>=3){const ge=parseFloat(Z[0]),ye=parseFloat(Z[2]),ve=ge+ye,w=(ge+U/d.clientHeight*ve)/ve,c=1-w,I=.2,V=.8;w<I?d.style.gridTemplateRows=`${I}fr 8px ${1-I}fr`:w>V?d.style.gridTemplateRows=`${V}fr 8px ${1-V}fr`:d.style.gridTemplateRows=`${w}fr 8px ${c}fr`}}function pe(){var T;j=!1,(T=document.getElementById("h-resizer"))==null||T.classList.remove("active"),document.removeEventListener("mousemove",ne),document.removeEventListener("mouseup",pe),ae()}return(T,d)=>{const U=ot,Z=Ce,ge=Nt,ye=it,ve=Pt,w=st,c=at,I=Mt,V=nt,W=Ot;return u(),g(he,null,[e("header",No,[e("div",Ho,[e("img",{src:a(Io),alt:"Zen GitSync Logo",class:"logo"},null,8,Wo),d[9]||(d[9]=e("h1",null,"Zen GitSync UI",-1))]),e("div",Jo,[a(i).userName&&a(i).userEmail?(u(),g("div",Yo,[d[10]||(d[10]=e("span",{class:"user-label"},"用户:",-1)),e("span",qo,C(a(i).userName),1),e("span",Zo,"<"+C(a(i).userEmail)+">",1),t(Z,{type:"primary",size:"small",onClick:J,class:"user-settings-btn",circle:""},{default:s(()=>[t(U,null,{default:s(()=>[t(a(Je))]),_:1})]),_:1})])):(u(),g("div",Xo,[d[11]||(d[11]=e("span",{class:"user-label"},"用户: ",-1)),d[12]||(d[12]=e("span",{class:"user-warning"},"未配置",-1)),t(Z,{type:"primary",size:"small",onClick:J,class:"user-settings-btn",circle:""},{default:s(()=>[t(U,null,{default:s(()=>[t(a(Je))]),_:1})]),_:1})]))])]),e("main",Ko,[E.value?(u(),g("div",tn,[e("div",sn,[t(Ma,{ref_key:"gitStatusRef",ref:y,"initial-directory":ee.value},null,8,["initial-directory"])]),e("div",{class:"vertical-resizer",id:"v-resizer",onMousedown:v},null,32),a(i).isGitRepo?(u(),g("div",an,[!a(i).userName||!a(i).userEmail?(u(),g("div",ln,[d[18]||(d[18]=e("h2",null,"Git用户未配置",-1)),d[19]||(d[19]=e("p",null,"请先配置Git用户信息才能进行提交操作。",-1)),e("div",on,[d[16]||(d[16]=e("h3",null,"您可以通过以下方式配置:",-1)),d[17]||(d[17]=e("ol",null,[e("li",null,"点击右上角的设置按钮,配置用户名和邮箱"),e("li",null,"或者使用命令行配置:"),e("div",{class:"code-block"},[h(' git config --global user.name "您的用户名"'),e("br"),h(' git config --global user.email "您的邮箱" ')])],-1)),t(Z,{type:"primary",onClick:J},{default:s(()=>d[15]||(d[15]=[h(" 立即配置 ")])),_:1})])])):(u(),re(Jl,{key:1}))])):(u(),g("div",nn,d[20]||(d[20]=[e("div",{class:"card",style:{padding:"20px"}},[e("h2",null,"Git仓库初始化"),e("p",null,"当前目录不是Git仓库,请先初始化Git仓库或切换到Git仓库目录。"),e("div",{class:"tips"},[e("h3",null,"可以使用以下命令初始化仓库:"),e("div",{class:"code-block"},"git init")])],-1)]))),e("div",{class:"horizontal-resizer",id:"h-resizer",onMousedown:ke},null,32),a(i).isGitRepo?(u(),g("div",rn,[t(Fo,{ref_key:"logListRef",ref:$},null,512)])):q("",!0),t(V,{modelValue:O.value,"onUpdate:modelValue":d[3]||(d[3]=M=>O.value=M),title:"创建新分支",width:"30%","destroy-on-close":""},{footer:s(()=>[e("span",cn,[t(Z,{onClick:d[2]||(d[2]=M=>O.value=!1)},{default:s(()=>d[21]||(d[21]=[h("取消")])),_:1}),t(Z,{type:"primary",onClick:F,loading:a(i).isCreatingBranch},{default:s(()=>d[22]||(d[22]=[h(" 创建 ")])),_:1},8,["loading"])])]),default:s(()=>[t(I,{model:{newBranchName:b.value,selectedBaseBranch:k.value}},{default:s(()=>[t(ve,{label:"新分支名称"},{default:s(()=>[t(ye,{modelValue:b.value,"onUpdate:modelValue":d[0]||(d[0]=M=>b.value=M),placeholder:"请输入新分支名称"},null,8,["modelValue"])]),_:1}),t(ve,{label:"基于分支"},{default:s(()=>[t(c,{modelValue:k.value,"onUpdate:modelValue":d[1]||(d[1]=M=>k.value=M),placeholder:"选择基础分支",style:{width:"100%"}},{default:s(()=>[(u(!0),g(he,null,be(a(i).allBranches,M=>(u(),re(w,{key:M,label:M,value:M},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])]),_:1})]),_:1},8,["model"])]),_:1},8,["modelValue"])])):(u(),g("div",Qo,[t(ge,{class:"loading-card"},{default:s(()=>[e("div",en,[t(U,{class:"is-loading"},{default:s(()=>d[13]||(d[13]=[e("svg",{viewBox:"0 0 1024 1024",xmlns:"http://www.w3.org/2000/svg"},[e("path",{fill:"currentColor",d:"M512 64a32 32 0 0 1 32 32v192a32 32 0 0 1-64 0V96a32 32 0 0 1 32-32zm0 640a32 32 0 0 1 32 32v192a32 32 0 1 1-64 0V736a32 32 0 0 1 32-32zm448-192a32 32 0 0 1-32 32H736a32 32 0 1 1 0-64h192a32 32 0 0 1 32 32zm-640 0a32 32 0 0 1-32 32H96a32 32 0 0 1 0-64h192a32 32 0 0 1 32 32zM195.2 195.2a32 32 0 0 1 45.248 0L376.32 331.008a32 32 0 0 1-45.248 45.248L195.2 240.448a32 32 0 0 1 0-45.248zm452.544 452.544a32 32 0 0 1 45.248 0L828.8 783.552a32 32 0 0 1-45.248 45.248L647.744 692.992a32 32 0 0 1 0-45.248zM828.8 195.264a32 32 0 0 1 0 45.184L692.992 376.32a32 32 0 0 1-45.248-45.248l135.808-135.808a32 32 0 0 1 45.248 0zm-452.544 452.48a32 32 0 0 1 0 45.248L240.448 828.8a32 32 0 0 1-45.248-45.248l135.808-135.808a32 32 0 0 1 45.248 0z"})],-1)])),_:1})]),d[14]||(d[14]=e("div",{class:"loading-text"},"加载中...",-1))]),_:1})]))]),e("footer",un,[a(i).currentBranch?(u(),g("div",dn,[e("div",fn,[d[24]||(d[24]=e("span",{class:"branch-label"},"当前分支:",-1)),t(c,{modelValue:a(i).currentBranch,"onUpdate:modelValue":d[4]||(d[4]=M=>a(i).currentBranch=M),size:"small",onChange:P,loading:a(i).isChangingBranch,class:"branch-select"},{default:s(()=>[(u(!0),g(he,null,be(a(i).allBranches,M=>(u(),re(w,{key:M,label:M,value:M},null,8,["label","value"]))),128))]),_:1},8,["modelValue","loading"]),t(Z,{type:"primary",size:"small",onClick:K,class:"create-branch-btn"},{default:s(()=>[t(U,null,{default:s(()=>[t(a(Ss))]),_:1}),d[23]||(d[23]=h(" 新建分支 "))]),_:1})])])):q("",!0),d[25]||(d[25]=e("div",{class:"footer-right"},null,-1))]),t(V,{modelValue:Y.value,"onUpdate:modelValue":d[8]||(d[8]=M=>Y.value=M),title:"Git用户设置",width:"30%","destroy-on-close":""},{footer:s(()=>[e("span",pn,[t(Z,{type:"danger",onClick:ce},{default:s(()=>d[27]||(d[27]=[h(" 清除配置 ")])),_:1}),t(Z,{onClick:d[7]||(d[7]=M=>Y.value=!1)},{default:s(()=>d[28]||(d[28]=[h("取消")])),_:1}),t(Z,{type:"primary",onClick:le},{default:s(()=>d[29]||(d[29]=[h(" 保存 ")])),_:1})])]),default:s(()=>[t(I,null,{default:s(()=>[t(ve,{label:"用户名"},{default:s(()=>[t(ye,{modelValue:A.value,"onUpdate:modelValue":d[5]||(d[5]=M=>A.value=M),placeholder:"请输入Git用户名"},null,8,["modelValue"])]),_:1}),t(ve,{label:"邮箱"},{default:s(()=>[t(ye,{modelValue:H.value,"onUpdate:modelValue":d[6]||(d[6]=M=>H.value=M),placeholder:"请输入Git邮箱"},null,8,["modelValue"])]),_:1}),t(ve,null,{default:s(()=>[t(W,{type:"info",closable:!1,"show-icon":""},{default:s(()=>d[26]||(d[26]=[h(" 这些设置将影响全局Git配置,对所有Git仓库生效。 ")])),_:1})]),_:1})]),_:1})]),_:1},8,["modelValue"])],64)}}}),mn=rt(vn,[["__scopeId","data-v-b9b417fd"]]),Wt=Ts(mn);Wt.use(xs());Wt.mount("#app");
18
+ ${Y.value}`),f}),Z=_e(()=>{let f=`git commit -m "${U.value}"`;return N.value&&(f+=" --no-verify"),f});async function ge(){try{const f=await y.loadConfig();f&&(X.value=`输入提交信息 (默认: ${f.defaultCommitMessage})`,O.value=f.defaultCommitMessage||"",f.descriptionTemplates&&Array.isArray(f.descriptionTemplates)&&(A.value=f.descriptionTemplates),f.scopeTemplates&&Array.isArray(f.scopeTemplates)&&(j.value=f.scopeTemplates),f.messageTemplates&&Array.isArray(f.messageTemplates)&&(ne.value=f.messageTemplates))}catch(f){console.error("加载配置失败:",f)}}async function ye(){if(!J.value.trim()){o({message:"请输入模板内容",type:"warning"});return}try{if(le.value)await ve();else{if(A.value.includes(J.value)){o({message:"该模板已存在",type:"warning"});return}await y.saveTemplate(J.value,"description")&&(A.value.includes(J.value)||A.value.push(J.value),A.value=[...A.value],J.value="")}}catch(f){o({message:`保存模板失败: ${f.message}`,type:"error"})}}async function ve(){if(!J.value.trim()){o({message:"请输入模板内容",type:"warning"});return}try{if(await y.updateTemplate(ce.value,J.value,"description")){const l=A.value.indexOf(ce.value);l!==-1&&(A.value[l]=J.value),A.value=[...A.value],le.value=!1,ce.value="",ue.value=-1,J.value=""}}catch(f){o({message:`更新模板失败: ${f.message}`,type:"error"})}}function w(f,l){le.value=!0,ce.value=f,ue.value=l,J.value=f}function c(){le.value=!1,ce.value="",ue.value=-1,J.value=""}async function I(){if(!se.value.trim()){o({message:"请输入模板内容",type:"warning"});return}try{if(x.value)await V();else{if(j.value.includes(se.value)){o({message:"该模板已存在",type:"warning"});return}await y.saveTemplate(se.value,"scope")&&(j.value.includes(se.value)||j.value.push(se.value),j.value=[...j.value],se.value="")}}catch(f){o({message:`保存模板失败: ${f.message}`,type:"error"})}}async function V(){if(!se.value.trim()){o({message:"请输入模板内容",type:"warning"});return}try{if(await y.updateTemplate(S.value,se.value,"scope")){const l=j.value.indexOf(S.value);l!==-1&&(j.value[l]=se.value),j.value=[...j.value],x.value=!1,S.value="",ae.value=-1,se.value=""}}catch(f){o({message:`更新模板失败: ${f.message}`,type:"error"})}}function W(f,l){x.value=!0,S.value=f,ae.value=l,se.value=f}function M(){x.value=!1,S.value="",ae.value=-1,se.value=""}async function xe(f){try{if(await Oe.confirm(`确定要删除描述模板 "${f}" 吗?`,"删除确认",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"}),await y.deleteTemplate(f,"description")){const Se=A.value.indexOf(f);Se!==-1&&A.value.splice(Se,1),A.value=[...A.value]}}catch(l){if(l==="cancel")return;o({message:`删除模板失败: ${l.message}`,type:"error"})}}async function Ee(f){try{if(await Oe.confirm(`确定要删除作用域模板 "${f}" 吗?`,"删除确认",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"}),await y.deleteTemplate(f,"scope")){const Se=j.value.indexOf(f);Se!==-1&&j.value.splice(Se,1),j.value=[...j.value]}}catch(l){if(l==="cancel")return;o({message:`删除模板失败: ${l.message}`,type:"error"})}}function Re(f){K.value=f,H.value=!1}function je(f){F.value=f,fe.value=!1}function Me(){H.value=!0}function Be(){fe.value=!0}async function Pe(){try{await p.addToStage()&&p.fetchStatus()}catch(f){o({message:`添加文件失败: ${f.message}`,type:"error"})}}async function L(){if(!U.value.trim()){o({message:"提交信息不能为空",type:"warning"});return}try{await p.commitChanges(U.value,N.value)&&(Ie(),p.fetchStatus(),p.fetchLog(),$.getBranchStatus())}catch(f){o({message:`提交失败: ${f.message}`,type:"error"})}}function we(){E.value=!0,setTimeout(()=>{E.value=!1},2e3)}async function ct(){D.value=!0;try{await p.pushToRemote(),we(),$.getBranchStatus()}catch(f){o({message:`推送失败: ${f.message}`,type:"error"})}finally{D.value=!1}}async function ut(){ee.value=!0;try{await $.gitPull(),await p.fetchStatus()}catch(f){o({message:`拉取失败: ${f.message}`,type:"error"})}finally{ee.value=!1}}async function dt(){te.value=!0;try{await $.gitFetchAll(),await p.fetchStatus()}catch(f){o({message:`获取远程分支信息失败: ${f.message}`,type:"error"})}finally{te.value=!1}}async function Ze(){if(!U.value.trim()){o({message:"提交信息不能为空",type:"warning"});return}try{await p.addAndCommit(U.value,N.value),Ie(),p.fetchStatus(),p.fetchLog()}catch(f){o({message:`暂存并提交失败: ${f.message}`,type:"error"})}}async function ft(){if(!U.value.trim()){o({message:"提交信息不能为空",type:"warning"});return}try{D.value=!0,await p.addCommitAndPush(U.value,N.value),Ie(),D.value=!1,we()}catch(f){o({message:`暂存、提交并推送失败: ${f.message}`,type:"error"}),D.value=!1}}async function pt(){try{await Oe.confirm(`确定要重置当前分支 "${$.currentBranch}" 到远程状态吗?这将丢失所有未推送的提交和本地更改。`,"重置到远程分支",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"}),await p.resetToRemote($.currentBranch)&&(p.fetchStatus(),p.fetchLog())}catch(f){f!=="cancel"&&o({message:`重置到远程分支失败: ${f.message}`,type:"error"})}}function Ie(){i.value="",K.value="",P.value="",Y.value=""}function m(){v.value=O.value,_.value=!0}async function n(){if(!v.value.trim()){o({message:"请输入默认提交信息",type:"warning"});return}try{await y.saveDefaultMessage(v.value)&&(O.value=v.value,X.value=`输入提交信息 (默认: ${v.value})`,_.value=!1)}catch(f){o({message:`保存默认提交信息失败: ${f.message}`,type:"error"})}}const B=_e(()=>p.fileList.some(f=>["modified","deleted","untracked"].includes(f.type))),R=_e(()=>p.fileList.filter(f=>["modified","deleted","untracked"].includes(f.type)).length),de=_e(()=>p.fileList.filter(f=>f.type==="added").length),me=_e(()=>de.value>0),$e=_e(()=>p.fileList.length>0),z=_e(()=>$.branchAhead>0),Le=_e(()=>$.branchBehind>0),vt=_e(()=>$.hasUpstream&&(z.value||me.value&&U.value.trim())),Vt=_e(()=>me.value),Jt=_e(()=>$.hasUpstream&&(z.value||Le.value||$e.value));async function Yt(){if(!v.value.trim()){o({message:"请输入模板内容",type:"warning"});return}try{if(pe.value)await qt();else{if(ne.value.includes(v.value)){o({message:"该模板已存在",type:"warning"});return}ne.value.push(v.value);const l=await(await fetch("/api/config/save-template",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({template:v.value,type:"message"})})).json();l.success?(o({message:"提交信息模板保存成功!",type:"success"}),v.value=""):o({message:"模板保存失败: "+l.error,type:"error"})}}catch(f){o({message:"模板保存失败: "+f.message,type:"error"})}}async function qt(){try{if(d.value>=0){const f=T.value,l=v.value;ne.value[d.value]=l;const Ae=await(await fetch("/api/config/update-template",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldTemplate:f,newTemplate:l,type:"message"})})).json();Ae.success?(o({message:"提交信息模板更新成功!",type:"success"}),pe.value=!1,T.value="",d.value=-1,v.value=""):o({message:"模板更新失败: "+Ae.error,type:"error"})}}catch(f){o({message:"模板更新失败: "+f.message,type:"error"})}}function Zt(f,l){pe.value=!0,T.value=f,d.value=l,v.value=f}function Xt(){pe.value=!1,T.value="",d.value=-1,v.value=""}async function Kt(f){try{const l=ne.value.indexOf(f);l!==-1&&ne.value.splice(l,1);const Ae=await(await fetch("/api/config/delete-template",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({template:f,type:"message"})})).json();Ae.success?o({message:"提交信息模板删除成功!",type:"success"}):o({message:"模板删除失败: "+Ae.error,type:"error"})}catch(l){o({message:"模板删除失败: "+l.message,type:"error"})}}function Qt(f){i.value=f,v.value=f}return qe(()=>{ge();const f=localStorage.getItem("zen-gitsync-standard-commit");f!==null&&(b.value=f==="true");const l=localStorage.getItem("zen-gitsync-skip-hooks");l!==null&&(N.value=l==="true")}),(f,l)=>{const Se=ot,Ae=Ot,Rt=At,Te=St,ze=it,ie=Ce,es=st,ts=at,Xe=It,mt=ds,Ke=Nt,gt=nt,Bt=Tt;return u(),g("div",{class:Ve(["card",{"is-pushing":a(p).isPushing||D.value}])},[l[58]||(l[58]=e("div",{class:"card-header"},[e("h2",null,"提交更改")],-1)),t(Gt,{name:"el-fade-in-linear"},{default:s(()=>[D.value?(u(),g("div",Pa,l[15]||(l[15]=[e("div",{class:"pushing-spinner"},[e("svg",{viewBox:"0 0 50 50",class:"circular"},[e("circle",{class:"path",cx:"25",cy:"25",r:"20",fill:"none"})])],-1),e("div",{class:"pushing-text"},"正在推送...",-1)]))):q("",!0)]),_:1}),t(Gt,{name:"el-fade-in-linear"},{default:s(()=>[E.value?(u(),g("div",Ua,[t(Se,{class:"push-success-icon"},{default:s(()=>[t(a(bt))]),_:1}),l[16]||(l[16]=e("div",{class:"push-success-text"},"推送成功!",-1))])):q("",!0)]),_:1}),e("div",Oa,[e("div",Fa,[a($).userName===""||a($).userEmail===""?(u(),g("div",Ia,[t(Ae,{title:"Git用户信息未配置",type:"warning",closable:!1,"show-icon":""},{default:s(()=>l[17]||(l[17]=[e("p",null,"您需要配置Git用户名和邮箱才能提交代码。请使用以下命令配置:",-1),e("pre",{class:"config-command"},`git config --global user.name "Your Name"
19
+ git config --global user.email "your.email@example.com"`,-1)])),_:1})])):(u(),g(he,{key:1},[e("div",Na,[e("div",Ha,[e("div",Wa,[e("div",Ja,[t(Rt,{modelValue:b.value,"onUpdate:modelValue":l[0]||(l[0]=G=>b.value=G),"active-text":"标准化提交","inactive-text":"普通提交"},null,8,["modelValue"])]),e("div",Ya,[t(Te,{content:"跳过 Git 钩子检查 (--no-verify)",placement:"top"},{default:s(()=>[t(Rt,{modelValue:N.value,"onUpdate:modelValue":l[1]||(l[1]=G=>N.value=G),"active-text":"跳过钩子 (--no-verify)"},null,8,["modelValue"])]),_:1})])])]),b.value?(u(),g("div",el,[e("div",tl,[e("div",sl,[t(ts,{modelValue:k.value,"onUpdate:modelValue":l[3]||(l[3]=G=>k.value=G),placeholder:"提交类型",class:"type-select",clearable:""},{default:s(()=>[(u(),g(he,null,be(ke,G=>t(es,{key:G.value,label:G.label,value:G.value},null,8,["label","value"])),64))]),_:1},8,["modelValue"]),e("div",al,[t(ze,{modelValue:F.value,"onUpdate:modelValue":l[4]||(l[4]=G=>F.value=G),placeholder:"作用域(可选)",class:"scope-input",clearable:""},null,8,["modelValue"]),t(ie,{type:"primary",icon:a(Je),circle:"",size:"small",class:"settings-button",onClick:Be},null,8,["icon"])])]),e("div",ll,[t(ze,{modelValue:K.value,"onUpdate:modelValue":l[5]||(l[5]=G=>K.value=G),placeholder:"简短描述(必填)",class:"description-input",clearable:""},null,8,["modelValue"]),t(ie,{type:"primary",icon:a(Je),circle:"",size:"small",class:"settings-button",onClick:Me},null,8,["icon"])])]),e("div",{class:"advanced-options-toggle",onClick:l[6]||(l[6]=G=>oe.value=!oe.value)},[e("span",null,C(oe.value?"收起":"正文及页脚"),1),t(Se,{class:Ve(["toggle-icon",{"is-active":oe.value}])},{default:s(()=>[t(a(is))]),_:1},8,["class"])]),Ue(e("div",ol,[t(ze,{modelValue:P.value,"onUpdate:modelValue":l[7]||(l[7]=G=>P.value=G),type:"textarea",rows:4,placeholder:"正文(可选):详细描述本次提交的内容和原因",class:"body-input",clearable:""},null,8,["modelValue"]),t(ze,{modelValue:Y.value,"onUpdate:modelValue":l[8]||(l[8]=G=>Y.value=G),placeholder:"页脚(可选):如 Closes #123",class:"footer-input",clearable:""},null,8,["modelValue"])],512),[[Ft,oe.value]]),e("div",nl,[l[19]||(l[19]=e("div",{class:"preview-title"},"提交信息预览:",-1)),e("pre",il,C(U.value),1),l[20]||(l[20]=e("div",{class:"preview-title",style:{"margin-top":"10px"}},"Git提交命令预览:",-1)),e("pre",rl,C(Z.value),1)])])):(u(),g("div",qa,[e("div",Za,[t(ze,{modelValue:i.value,"onUpdate:modelValue":l[2]||(l[2]=G=>i.value=G),placeholder:X.value,type:"textarea",rows:6,resize:"none",class:"commit-message-input"},null,8,["modelValue","placeholder"]),e("div",Xa,[t(ie,{type:"primary",icon:a(Je),circle:"",size:"small",class:"settings-button",onClick:m},null,8,["icon"])])]),e("div",Ka,[l[18]||(l[18]=e("div",{class:"preview-title"},"Git提交命令预览:",-1)),e("pre",Qa,'git commit -m "'+C(U.value||"<提交信息>")+'"'+C(N.value?" --no-verify":""),1)])]))]),e("div",cl,[l[33]||(l[33]=e("h3",null,"Git 操作",-1)),e("div",ul,[e("div",dl,[e("div",fl,[l[26]||(l[26]=e("div",{class:"group-title"},"基础操作",-1)),e("div",pl,[t(Te,{content:B.value?`暂存${R.value}个待更改文件`:"git add .",placement:"top",effect:"light","popper-class":"git-cmd-tooltip"},{default:s(()=>[t(ie,{type:"primary",onClick:Pe,loading:a(p).isAddingFiles,disabled:!B.value,class:"action-button"},{default:s(()=>[l[21]||(l[21]=h(" 暂存更改 ")),R.value>0?(u(),g("span",vl,"("+C(R.value)+")",1)):q("",!0)]),_:1},8,["loading","disabled"])]),_:1},8,["content"]),t(Te,{content:me.value?`提交${de.value}个已暂存文件`:"git commit",placement:"top",effect:"light","popper-class":"git-cmd-tooltip"},{default:s(()=>[t(ie,{type:"primary",onClick:L,loading:a(p).isLoadingStatus,disabled:!me.value||!U.value.trim(),class:"action-button"},{default:s(()=>[l[22]||(l[22]=h(" 提交 ")),de.value>0?(u(),g("span",ml,"("+C(de.value)+")",1)):q("",!0)]),_:1},8,["loading","disabled"])]),_:1},8,["content"]),t(Te,{content:z.value?`推送${a($).branchAhead}个本地提交`:"git push",placement:"top",effect:"light","popper-class":"git-cmd-tooltip"},{default:s(()=>[t(ie,{type:"primary",icon:a(rs),onClick:ct,loading:a(p).isPushing,disabled:!vt.value,class:Ve(["action-button","push-button",{"is-loading":a(p).isPushing||D.value}]),style:kt(z.value?{backgroundColor:"#67c23a !important",borderColor:"#67c23a !important"}:{})},{default:s(()=>[l[23]||(l[23]=h(" 推送 ")),z.value?(u(),g("span",gl,"("+C(a($).branchAhead)+")",1)):q("",!0)]),_:1},8,["icon","loading","disabled","class","style"])]),_:1},8,["content"]),t(Te,{content:Le.value?`拉取${a($).branchBehind}个远程提交`:"git pull",placement:"top",effect:"light","popper-class":"git-cmd-tooltip"},{default:s(()=>[t(ie,{type:"primary",icon:a(Et),onClick:ut,loading:ee.value,disabled:!a($).hasUpstream,class:"action-button",style:kt(Le.value?{color:"white",backgroundColor:"#E6A23C",borderColor:"#E6A23C"}:{})},{default:s(()=>[l[24]||(l[24]=h(" 拉取 ")),Le.value?(u(),g("span",yl,"("+C(a($).branchBehind)+")",1)):q("",!0)]),_:1},8,["icon","loading","disabled","style"])]),_:1},8,["content"]),t(Te,{content:"git fetch --all",placement:"top",effect:"light","popper-class":"git-cmd-tooltip"},{default:s(()=>[t(ie,{type:"info",icon:a(jt),onClick:dt,loading:te.value,class:"action-button"},{default:s(()=>l[25]||(l[25]=[h(" 获取所有远程分支 ")])),_:1},8,["icon","loading"])]),_:1})])]),e("div",hl,[l[29]||(l[29]=e("div",{class:"group-title"},"组合操作",-1)),e("div",_l,[t(Te,{content:"git add + git commit",placement:"top",effect:"light","popper-class":"git-cmd-tooltip"},{default:s(()=>[t(ie,{type:"primary",icon:a(Qe),onClick:Ze,loading:a(p).isAddingFiles||a(p).isCommiting,disabled:!B.value||!U.value.trim(),class:"action-button"},{default:s(()=>l[27]||(l[27]=[h(" 暂存并提交 ")])),_:1},8,["icon","loading","disabled"])]),_:1}),t(Te,{content:"git add + git commit + git push",placement:"top",effect:"light","popper-class":"git-cmd-tooltip"},{default:s(()=>[t(ie,{type:"success",icon:a(cs),onClick:ft,loading:a(p).isAddingFiles||a(p).isCommiting||a(p).isPushing,disabled:!$e.value||!U.value.trim()||!a($).hasUpstream,class:Ve(["action-button","one-click-push",{"is-loading":a(p).isAddingFiles||a(p).isCommiting||a(p).isPushing}])},{default:s(()=>l[28]||(l[28]=[h(" 一键推送 ")])),_:1},8,["icon","loading","disabled","class"])]),_:1})])])]),e("div",wl,[l[32]||(l[32]=e("div",{class:"group-title"},"重置操作",-1)),e("div",$l,[t(Te,{content:Vt.value?`撤销${de.value}个已暂存文件`:"git reset HEAD",placement:"top",effect:"light","popper-class":"git-cmd-tooltip"},{default:s(()=>[t(ie,{type:"warning",icon:a(xt),onClick:a(p).resetHead,loading:a(p).isResetting,disabled:!Vt.value,class:"action-button reset-button"},{default:s(()=>[l[30]||(l[30]=h(" 重置暂存区 ")),de.value>0?(u(),g("span",bl,"("+C(de.value)+")",1)):q("",!0)]),_:1},8,["icon","onClick","loading","disabled"])]),_:1},8,["content"]),t(Te,{content:"git reset --hard origin/branch",placement:"top",effect:"light","popper-class":"git-cmd-tooltip"},{default:s(()=>[t(ie,{type:"danger",icon:a(us),onClick:pt,loading:a(p).isResetting,disabled:!Jt.value,class:"action-button danger-button"},{default:s(()=>l[31]||(l[31]=[h(" 重置到远程 ")])),_:1},8,["icon","loading","disabled"])]),_:1})])])])])],64))]),t(gt,{title:"简短描述模板设置",modelValue:H.value,"onUpdate:modelValue":l[10]||(l[10]=G=>H.value=G),width:"80vw",top:"70px",style:{height:"calc(100vh - 140px)"},"close-on-click-modal":!1,class:"template-dialog"},{default:s(()=>[e("div",kl,[e("div",Cl,[t(ze,{modelValue:J.value,"onUpdate:modelValue":l[9]||(l[9]=G=>J.value=G),placeholder:le.value?"编辑模板内容":"输入新模板内容",class:"template-input",clearable:""},null,8,["modelValue","placeholder"]),e("div",Sl,[le.value?(u(),re(ie,{key:0,onClick:c},{default:s(()=>l[34]||(l[34]=[h("取消")])),_:1})):q("",!0),t(ie,{type:"primary",onClick:ye,disabled:!J.value.trim()},{default:s(()=>[h(C(le.value?"更新模板":"添加模板"),1)]),_:1},8,["disabled"])])]),e("div",Tl,[l[38]||(l[38]=e("h3",null,"已保存模板",-1)),A.value.length===0?(u(),re(Xe,{key:0,description:"暂无保存的模板"})):q("",!0),(u(!0),g(he,null,be(A.value,(G,Ge)=>(u(),re(Ke,{key:Ge,class:"template-item"},{default:s(()=>[t(mt,{justify:"space-between",align:"middle",style:{width:"100%"}},{default:s(()=>[e("div",xl,C(G),1),e("div",Ll,[t(ie,{type:"primary",size:"small",onClick:De=>Re(G)},{default:s(()=>l[35]||(l[35]=[h("使用")])),_:2},1032,["onClick"]),t(ie,{type:"warning",size:"small",icon:a(Qe),onClick:De=>w(G,Ge)},{default:s(()=>l[36]||(l[36]=[h("编辑")])),_:2},1032,["icon","onClick"]),t(ie,{type:"danger",size:"small",onClick:De=>xe(G)},{default:s(()=>l[37]||(l[37]=[h("删除")])),_:2},1032,["onClick"])])]),_:2},1024)]),_:2},1024))),128))])])]),_:1},8,["modelValue"]),t(gt,{title:"作用域模板设置",modelValue:fe.value,"onUpdate:modelValue":l[12]||(l[12]=G=>fe.value=G),width:"80vw",top:"70px",style:{height:"calc(100vh - 140px)"},"close-on-click-modal":!1,class:"template-dialog"},{default:s(()=>[e("div",Vl,[e("div",Rl,[t(ze,{modelValue:se.value,"onUpdate:modelValue":l[11]||(l[11]=G=>se.value=G),placeholder:x.value?"编辑作用域模板内容":"输入新作用域模板",class:"template-input",clearable:""},null,8,["modelValue","placeholder"]),e("div",Bl,[x.value?(u(),re(ie,{key:0,onClick:M},{default:s(()=>l[39]||(l[39]=[h("取消")])),_:1})):q("",!0),t(ie,{type:"primary",onClick:I,disabled:!se.value.trim()},{default:s(()=>[h(C(x.value?"更新模板":"添加模板"),1)]),_:1},8,["disabled"])])]),e("div",zl,[l[43]||(l[43]=e("h3",null,"已保存作用域",-1)),j.value.length===0?(u(),re(Xe,{key:0,description:"暂无保存的作用域"})):q("",!0),(u(!0),g(he,null,be(j.value,(G,Ge)=>(u(),re(Ke,{key:Ge,class:"template-item"},{default:s(()=>[t(mt,{justify:"space-between",align:"middle",style:{width:"100%"}},{default:s(()=>[e("div",Gl,C(G),1),e("div",Dl,[t(ie,{type:"primary",size:"small",onClick:De=>je(G)},{default:s(()=>l[40]||(l[40]=[h("使用")])),_:2},1032,["onClick"]),t(ie,{type:"warning",size:"small",icon:a(Qe),onClick:De=>W(G,Ge)},{default:s(()=>l[41]||(l[41]=[h("编辑")])),_:2},1032,["icon","onClick"]),t(ie,{type:"danger",size:"small",onClick:De=>Ee(G)},{default:s(()=>l[42]||(l[42]=[h("删除")])),_:2},1032,["onClick"])])]),_:2},1024)]),_:2},1024))),128))])])]),_:1},8,["modelValue"]),t(gt,{title:"默认提交信息设置",modelValue:_.value,"onUpdate:modelValue":l[14]||(l[14]=G=>_.value=G),width:"80vw",top:"70px",style:{height:"calc(100vh - 140px)"},"close-on-click-modal":!1,class:"message-template-dialog"},{default:s(()=>[e("div",Al,[e("div",El,[t(ze,{modelValue:v.value,"onUpdate:modelValue":l[13]||(l[13]=G=>v.value=G),placeholder:pe.value?"编辑模板内容":"输入新模板内容",class:"template-input",clearable:""},null,8,["modelValue","placeholder"]),e("div",jl,[pe.value?(u(),re(ie,{key:0,onClick:Xt},{default:s(()=>l[44]||(l[44]=[h("取消")])),_:1})):q("",!0),t(ie,{type:"primary",onClick:Yt,disabled:!v.value.trim()},{default:s(()=>[h(C(pe.value?"更新模板":"添加模板"),1)]),_:1},8,["disabled"]),t(ie,{type:"success",onClick:n,disabled:!v.value.trim()},{default:s(()=>l[45]||(l[45]=[h(" 设为默认提交信息 ")])),_:1},8,["disabled"])])]),e("div",Ml,[e("div",Pl,[l[49]||(l[49]=e("h3",null,"已保存模板",-1)),e("div",Ul,[ne.value.length===0?(u(),re(Xe,{key:0,description:"暂无保存的模板"})):q("",!0),(u(!0),g(he,null,be(ne.value,(G,Ge)=>(u(),re(Ke,{key:Ge,class:"template-item"},{default:s(()=>[t(mt,{justify:"space-between",align:"middle",style:{width:"100%"}},{default:s(()=>[e("div",Ol,C(G),1),e("div",Fl,[t(ie,{type:"primary",size:"small",onClick:De=>Qt(G)},{default:s(()=>l[46]||(l[46]=[h("使用")])),_:2},1032,["onClick"]),t(ie,{type:"warning",size:"small",icon:a(Qe),onClick:De=>Zt(G,Ge)},{default:s(()=>l[47]||(l[47]=[h("编辑")])),_:2},1032,["icon","onClick"]),t(ie,{type:"danger",size:"small",onClick:De=>Kt(G)},{default:s(()=>l[48]||(l[48]=[h("删除")])),_:2},1032,["onClick"])])]),_:2},1024)]),_:2},1024))),128))])]),e("div",Il,[l[57]||(l[57]=e("h3",null,"当前默认提交信息",-1)),O.value?(u(),re(Ke,{key:0,class:"default-message-card"},{default:s(()=>[e("div",Nl,C(O.value),1)]),_:1})):(u(),re(Xe,{key:1,description:"尚未设置默认提交信息","image-size":100})),e("div",Hl,[l[55]||(l[55]=e("h4",null,"关于默认提交信息",-1)),l[56]||(l[56]=e("p",null,"默认提交信息将在未输入提交信息时自动使用。",-1)),e("p",null,[l[52]||(l[52]=h("你可以通过点击左侧模板的")),t(Bt,{size:"small",type:"primary"},{default:s(()=>l[50]||(l[50]=[h("使用")])),_:1}),l[53]||(l[53]=h("按钮先选择喜欢的模板,然后点击上方")),t(Bt,{size:"small",type:"success"},{default:s(()=>l[51]||(l[51]=[h("设为默认提交信息")])),_:1}),l[54]||(l[54]=h("按钮保存。"))])])])])])]),_:1},8,["modelValue"])])],2)}}}),Jl=rt(Wl,[["__scopeId","data-v-be53b96f"]]),Yl={class:"card"},ql={key:0,class:"refresh-notification"},Zl={class:"log-header"},Xl={class:"log-actions"},Kl={key:1,class:"filter-panel-header"},Ql={class:"filter-form"},eo={class:"filter-item"},to={class:"filter-item"},so={class:"filter-item"},ao={class:"filter-item"},lo={class:"filter-actions"},oo={key:0},no={key:1},io={key:0,class:"graph-view"},ro={key:0,class:"commit-count"},co={class:"graph-controls"},uo={class:"zoom-controls"},fo={class:"scale-info"},po={key:1,class:"table-view-container"},vo=["onClick"],mo={class:"author-name"},go={key:0,class:"branch-container"},yo={key:0,class:"load-more-container"},ho={class:"pagination-info"},_o={key:0,class:"loading-more"},wo={key:2,class:"no-more-data"},$o={key:0,class:"total-loaded"},bo={class:"commit-detail-container"},ko={key:0,class:"commit-info"},Co={class:"commit-info-header"},So={class:"info-item"},To={class:"item-value"},xo={class:"info-item"},Lo={class:"item-value"},Vo={class:"info-item"},Ro={class:"item-value"},Bo={class:"commit-message-container"},zo=["innerHTML"],Go={class:"commit-files-diff"},Do={class:"files-list"},Ao={key:1},Eo=["onClick"],jo={class:"file-diff"},Mo={key:0},Po={key:1},Uo=["innerHTML"],We=.5,et=1.5,$t=.1,Oo=lt({__name:"LogList",setup(Q,{expose:p}){const $=Lt(),y=Fe();let i=[];const D=r(i),E=r(""),ee=r(!1),te=_e(()=>$.isLoadingLog||ee.value),X=r(!1),O=r(0),b=r(!1),k=r(null),F=r(1),K=r(!0),P=r(!1),Y=r(null),A=r(!1),H=r(null),J=r([]),le=r(""),ce=r(!1),ue=r(""),j=r(1),fe=r(!1),se=r(!1),x=r([]),S=r(""),ae=r(null),_=r([]),v=r([]),N=r([]),oe=r(!1),ke=r(0),ne=r(0),pe=r(null),T=_e(()=>D.value);async function d(m=!1,n=1){if(!Fe().isGitRepo){E.value="当前目录不是Git仓库";return}try{n>1?P.value=!0:ee.value=!0,console.log(`加载提交历史: page=${n}, all=${m}`);const R=new URLSearchParams;R.append("page",n.toString()),R.append("all",m.toString()),x.value.length>0&&R.append("author",x.value.join(",")),v.value.length>0&&R.append("branch",v.value.join(",")),S.value&&R.append("message",S.value),ae.value&&Array.isArray(ae.value)&&ae.value.length===2&&(R.append("dateFrom",ae.value[0]),R.append("dateTo",ae.value[1])),R.append("_t",Date.now().toString());const me=await(await fetch(`/api/log?${R.toString()}`)).json();if(!me||!me.data||!Array.isArray(me.data)){console.error("API返回的数据格式不正确:",me),E.value="加载提交历史失败: 服务器返回数据格式不正确";return}const $e=n>1;$e?me.data.forEach(z=>i.push(z)):(i.length=0,me.data.forEach(z=>i.push(z))),D.value=[...i],F.value=n,O.value=me.total||i.length,K.value=me.hasMore===!0,K.value||console.log("已加载所有提交记录"),$e||(fe.value=!0,setTimeout(()=>{fe.value=!1},2e3)),!$e&&b.value&&setTimeout(U,0),E.value=""}catch(R){E.value="加载提交历史失败: "+(R instanceof Error?R.message:String(R)),console.error("加载日志失败:",R),n>1&&(K.value=!1)}finally{n>1?P.value=!1:ee.value=!1}}async function U(){if(console.log(`开始渲染图表...数据长度: ${i.length}`),!k.value){console.error("图表容器未找到");return}if(i.length===0){console.error("没有日志数据可渲染");return}try{k.value.innerHTML="",console.log(`创建gitgraph实例,分支: ${y.currentBranch||"main"}`);const m=Cs(k.value,{orientation:"vertical-reverse",template:"metro",author:"提交者 <committer@example.com>"}),n={},B=m.branch(y.currentBranch||"main");n[y.currentBranch||"main"]=B,console.log(`开始创建提交图...共${i.length}条提交`),i.forEach((R,de)=>{let me=B;if(R.branch){const $e=ye(R.branch.split(",")[0]);n[$e]||(n[$e]=m.branch($e)),me=n[$e]}me.commit({hash:R.hash,subject:R.message,author:`${R.author} <${R.email}>`}),de%10===0&&console.log(`已渲染 ${de+1}/${i.length} 个提交`)}),console.log("图表渲染完成"),setTimeout(()=>{je()},100)}catch(m){console.error("渲染图表失败:",m),E.value="渲染图表失败: "+(m instanceof Error?m.message:String(m))}}function Z(){b.value=!b.value,b.value&&i.length>0&&setTimeout(U,0)}function ge(){d(!X.value)}function ye(m){return m.includes("HEAD -> ")?m.replace("HEAD -> ",""):m.includes("origin/")?m:m.trim()}function ve(m){return m.includes("HEAD")?"success":m.includes("origin/")?"warning":"info"}const w=r(null),c=r(null);function I(m){if(b.value||!K.value||P.value||te.value)return;const n=m.target,{scrollTop:B,scrollHeight:R,clientHeight:de}=n,me=R-B-de;console.log("表格滚动:",{scrollTop:B,scrollHeight:R,clientHeight:de,scrollDistance:me}),me<=20&&(console.log("已滚动到底部,加载更多数据"),we())}function V(){w.value&&(c.value=w.value.$el.querySelector(".el-table__body-wrapper"),c.value?(console.log("添加表格滚动监听"),c.value.addEventListener("scroll",I,!0)):console.error("未找到表格的body-wrapper元素"))}function W(){c.value&&(console.log("移除表格滚动监听"),c.value.removeEventListener("scroll",I,!0),c.value=null)}qe(()=>{y.isGitRepo?($.log.length>0?(console.log("使用已加载的日志数据"),i.length=0,$.log.forEach(m=>i.push(m)),O.value=$.log.length,b.value&&setTimeout(()=>{console.log(`准备渲染图表,数据长度: ${i.length}`),U()},100)):(console.log("初始加载日志数据"),d()),dt()):E.value="当前目录不是Git仓库",fs(()=>{setTimeout(()=>{V()},500)})}),Ye(()=>y.allBranches,m=>{m&&m.length>0?(N.value=[...m].sort(),console.log(`分支数据更新,共 ${N.value.length} 个分支`)):(N.value=[],console.warn("gitStore 中没有分支数据"))},{immediate:!0}),ps(()=>{W(),Y.value!==null&&(window.clearInterval(Y.value),Y.value=null)});const M=()=>{if(!y.isGitRepo){E.value="当前目录不是Git仓库";return}F.value=1,K.value=!0,d(X.value,1)};Ye(()=>$.log,m=>{console.log("监听到gitLogStore.log变化,更新图表数据");try{i.length=0,Array.isArray(m)&&m.forEach(n=>n&&i.push(n)),O.value=i.length,F.value=1,D.value=[...i],fe.value=!0,setTimeout(()=>{fe.value=!1},2e3),console.log(`数据更新完成,共${D.value.length}条记录,准备渲染图表`),b.value&&i.length>0&&setTimeout(U,0)}catch(n){console.error("更新日志数据失败:",n)}},{immediate:!0}),p({refreshLog:M});function xe(){j.value<et&&(j.value=Math.min(et,j.value+$t),Re())}function Ee(){j.value>We&&(j.value=Math.max(We,j.value-$t),Re())}function Re(){if(!k.value)return;const m=k.value.querySelector("svg");m&&(m.style.transform=`scale(${j.value})`,m.style.transformOrigin="top left")}function je(){if(!k.value)return;const m=k.value.querySelector("svg");if(!m)return;const n=m.getBoundingClientRect().width/j.value,B=k.value.clientWidth;n>B?j.value=Math.max(We,B/n):j.value=1,Re()}async function Me(m){if(m){H.value=m,A.value=!0,ce.value=!0,J.value=[],le.value="",ue.value="",console.log("提交详情对象:",JSON.stringify(m,null,2)),console.log("哈希值类型和长度:",typeof m.hash,m.hash?m.hash.length:0),console.log("提交信息类型和长度:",typeof m.message,m.message?m.message.length:0),console.log("提交分支:",m.branch);try{if(console.log(`获取提交详情: ${m.hash}`),!m.hash||m.hash.length<7){console.error("无效的提交哈希值:",m.hash),le.value="无效的提交哈希值",ce.value=!1;return}const n=await fetch(`/api/commit-files?hash=${m.hash}`);console.log("API响应状态: ",n.status);const B=await n.json();console.log("文件列表数据: ",B),B.success&&Array.isArray(B.files)?(J.value=B.files,J.value.length>0?await Be(m.hash,J.value[0]):(console.log("没有找到变更文件"),le.value="该提交没有变更文件")):(console.error("获取提交文件列表失败:",B.error||"未知错误"),le.value=`获取文件列表失败: ${B.error||"未知错误"}`)}catch(n){console.error("获取提交详情失败:",n),le.value=`获取提交详情失败: ${n.message}`}finally{ce.value=!1}}}async function Be(m,n){ce.value=!0,ue.value=n;try{console.log(`获取文件差异: hash=${m}, file=${n}`);const B=await fetch(`/api/commit-file-diff?hash=${m}&file=${encodeURIComponent(n)}`);console.log("差异API响应状态: ",B.status);const R=await B.json();console.log("差异数据: ",R.success,typeof R.diff),R.success?le.value=R.diff||"没有变更内容":(console.error("获取差异失败: ",R.error),le.value=`获取差异失败: ${R.error||"未知错误"}`)}catch(B){console.error("获取文件差异失败:",B),le.value=`获取差异失败: ${B.message}`}finally{ce.value=!1}}function Pe(m){if(!m)return"";const n=m.split(`
20
+ `);function B(R){return R.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#039;")}return n.map(R=>{const de=B(R);return R.startsWith("diff --git")?`<div class="diff-header">${de}</div>`:R.startsWith("---")?`<div class="diff-old-file">${de}</div>`:R.startsWith("+++")?`<div class="diff-new-file">${de}</div>`:R.startsWith("@@")?`<div class="diff-hunk-header">${de}</div>`:R.startsWith("+")?`<div class="diff-added">${de}</div>`:R.startsWith("-")?`<div class="diff-removed">${de}</div>`:`<div class="diff-context">${de}</div>`}).join("")}function L(m){return m?(console.log("格式化前的提交信息:",m),console.log("提交信息中的换行符数量:",(m.match(/\n/g)||[]).length),m.trim()):"(无提交信息)"}function we(){!K.value||P.value||te.value||(console.log(`加载更多日志,页码: ${F.value+1}`),d(X.value,F.value+1))}function ct(){x.value=[],v.value=[],S.value="",ae.value=null,F.value=1,d(X.value,1)}function ut(){F.value=1,d(X.value,1)}async function dt(){try{console.log("获取所有可用作者...");const n=await(await fetch("/api/authors")).json();n.success&&Array.isArray(n.authors)?(_.value=n.authors.sort(),console.log(`获取到${_.value.length}位作者`)):(console.warn("从API获取作者列表失败,将从现有日志中提取作者列表"),Ze())}catch(m){console.error("获取作者列表失败:",m),Ze()}}function Ze(){const m=new Set;D.value.forEach(n=>{n.author&&m.add(n.author)}),_.value=Array.from(m).sort(),console.log(`从现有日志中提取了${_.value.length}位作者`)}function ft(m,n,B){console.log("handleContextMenu",m,n,B),B.preventDefault(),ke.value=B.clientY,ne.value=B.clientX,pe.value=m,oe.value=!0;const R=()=>{oe.value=!1,document.removeEventListener("click",R)};setTimeout(()=>{document.addEventListener("click",R)},0)}async function pt(m){if(m)try{await Oe.confirm(`确定要撤销提交 ${m.hash.substring(0,7)} 吗?这将创建一个新的提交来撤销这次提交的更改。`,"撤销提交确认",{confirmButtonText:"确认",cancelButtonText:"取消",type:"warning"});const B=await(await fetch("/api/revert-commit",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({hash:m.hash})})).json();B.success?(o.success(B.message||"已成功撤销提交"),M(),$.fetchStatus(),y.getBranchStatus()):o.error(B.error||"撤销提交失败")}catch(n){n!=="cancel"&&(console.error("撤销提交出错:",n),o.error("撤销提交失败: "+(n.message||n)))}}async function Ie(m){if(m)try{await Oe.confirm(`确定要将提交 ${m.hash.substring(0,7)} Cherry-Pick 到当前分支吗?`,"Cherry-Pick确认",{confirmButtonText:"确认",cancelButtonText:"取消",type:"warning"});const B=await(await fetch("/api/cherry-pick-commit",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({hash:m.hash})})).json();B.success?(o.success(B.message||"已成功Cherry-Pick提交"),M(),$.fetchStatus(),y.getBranchStatus()):o.error(B.error||"Cherry-Pick提交失败")}catch(n){n!=="cancel"&&(console.error("Cherry-Pick提交出错:",n),o.error("Cherry-Pick提交失败: "+(n.message||n)))}}return(m,n)=>{var $e;const B=ot,R=St,de=It,me=Ut;return u(),g(he,null,[e("div",Yl,[fe.value?(u(),g("div",ql," 提交历史已刷新 ")):q("",!0),e("div",Zl,[n[12]||(n[12]=e("div",{class:"header-left"},[e("h2",null,"提交历史")],-1)),e("div",Xl,[b.value?q("",!0):(u(),re(a(Ce),{key:0,type:se.value?"primary":"default",size:"small",onClick:n[0]||(n[0]=z=>se.value=!se.value)},{icon:s(()=>[t(B,null,{default:s(()=>[t(a(ms))]),_:1})]),default:s(()=>[n[11]||(n[11]=h(" 筛选 ")),T.value.length!==D.value.length?(u(),re(a(vs),{key:0,value:T.value.length,class:"filter-badge"},null,8,["value"])):q("",!0)]),_:1},8,["type"])),t(a(Ce),{type:"primary",size:"small",onClick:Z},{icon:s(()=>[t(B,null,{default:s(()=>[(u(),re(Dt(b.value?a(tt):a(gs))))]),_:1})]),default:s(()=>[h(" "+C(b.value?"表格视图":"图表视图"),1)]),_:1}),t(a(Ce),{type:"primary",size:"small",onClick:ge,loading:te.value},{icon:s(()=>[t(B,null,{default:s(()=>[(u(),re(Dt(X.value?a(ys):a(hs))))]),_:1})]),default:s(()=>[h(" "+C(X.value?"显示分页加载 (每页100条)":"显示所有提交"),1)]),_:1},8,["loading"]),t(a(Ce),{circle:"",size:"small",onClick:n[1]||(n[1]=z=>M()),loading:te.value,class:Ve({"refresh-button-animated":fe.value})},{default:s(()=>[t(B,null,{default:s(()=>[t(a(xt))]),_:1})]),_:1},8,["loading","class"])])]),se.value&&!b.value?(u(),g("div",Kl,[e("div",Ql,[e("div",eo,[n[13]||(n[13]=e("div",{class:"filter-label"},"作者:",-1)),t(a(at),{modelValue:x.value,"onUpdate:modelValue":n[2]||(n[2]=z=>x.value=z),placeholder:"选择作者",multiple:"",clearable:"",filterable:"",class:"filter-input",size:"small"},{default:s(()=>[(u(!0),g(he,null,be(_.value,z=>(u(),re(a(st),{key:z,label:z,value:z},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])]),e("div",to,[n[14]||(n[14]=e("div",{class:"filter-label"},"分支:",-1)),t(a(at),{modelValue:v.value,"onUpdate:modelValue":n[3]||(n[3]=z=>v.value=z),placeholder:"选择分支",multiple:"",clearable:"",filterable:"",class:"filter-input",size:"small"},{default:s(()=>[(u(!0),g(he,null,be(N.value,z=>(u(),re(a(st),{key:z,label:z,value:z},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])]),e("div",so,[n[15]||(n[15]=e("div",{class:"filter-label"},"提交信息包含:",-1)),t(a(it),{modelValue:S.value,"onUpdate:modelValue":n[4]||(n[4]=z=>S.value=z),placeholder:"关键词",clearable:"",class:"filter-input",size:"small"},null,8,["modelValue"])]),e("div",ao,[n[16]||(n[16]=e("div",{class:"filter-label"},"日期范围:",-1)),t(a(_s),{modelValue:ae.value,"onUpdate:modelValue":n[5]||(n[5]=z=>ae.value=z),type:"daterange","range-separator":"至","start-placeholder":"开始日期","end-placeholder":"结束日期",format:"YYYY-MM-DD","value-format":"YYYY-MM-DD",class:"filter-input date-range",size:"small"},null,8,["modelValue"])]),e("div",lo,[t(a(Ce),{type:"primary",size:"small",onClick:ut},{default:s(()=>n[17]||(n[17]=[h("应用筛选")])),_:1}),t(a(Ce),{type:"info",size:"small",onClick:ct},{default:s(()=>n[18]||(n[18]=[h("重置")])),_:1})])])])):q("",!0),e("div",{class:Ve(["content-area",{"with-filter":se.value&&!b.value}])},[E.value?(u(),g("div",oo,C(E.value),1)):(u(),g("div",no,[b.value?(u(),g("div",io,[a(i).length>0?(u(),g("div",ro," 显示 "+C(a(i).length)+" 条提交记录 "+C(X.value?"(全部)":"(分页加载,每页100条)"),1)):q("",!0),e("div",co,[e("div",uo,[t(a(Ce),{type:"primary",circle:"",size:"small",onClick:Ee,disabled:j.value<=We},{default:s(()=>[t(B,null,{default:s(()=>[t(a(ws))]),_:1})]),_:1},8,["disabled"]),t(a($s),{modelValue:j.value,"onUpdate:modelValue":n[6]||(n[6]=z=>j.value=z),min:We,max:et,step:$t,onChange:Re,class:"zoom-slider"},null,8,["modelValue"]),t(a(Ce),{type:"primary",circle:"",size:"small",onClick:xe,disabled:j.value>=et},{default:s(()=>[t(B,null,{default:s(()=>[t(a(bs))]),_:1})]),_:1},8,["disabled"]),t(a(Ce),{type:"primary",size:"small",onClick:je},{default:s(()=>n[19]||(n[19]=[h(" 自适应大小 ")])),_:1})]),e("div",fo," 缩放: "+C(Math.round(j.value*100))+"% ",1)]),e("div",{ref_key:"graphContainer",ref:k,class:"graph-container"},null,512)])):(u(),g("div",po,[Ue((u(),re(a(ks),{ref_key:"tableRef",ref:w,data:T.value,stripe:"",border:"",class:"log-table","empty-text":te.value?"加载中...":"没有匹配的提交记录",height:"500",onRowContextmenu:ft},{default:s(()=>[t(a(He),{label:"提交哈希",width:"100",resizable:""},{default:s(z=>[e("span",{class:"commit-hash",onClick:Le=>Me(z.row)},C(z.row.hash.substring(0,7)),9,vo)]),_:1}),t(a(He),{prop:"date",label:"日期",width:"120",resizable:""}),t(a(He),{label:"作者",width:"120",resizable:""},{default:s(z=>[t(R,{content:z.row.email,placement:"top","hide-after":1e3},{default:s(()=>[e("span",mo,C(z.row.author),1)]),_:2},1032,["content"])]),_:1}),t(a(He),{label:"分支",width:"180",resizable:""},{default:s(z=>[z.row.branch?(u(),g("div",go,[(u(!0),g(he,null,be(z.row.branch.split(","),(Le,vt)=>(u(),re(a(Tt),{key:vt,size:"small",type:ve(Le),class:"branch-tag"},{default:s(()=>[h(C(ye(Le)),1)]),_:2},1032,["type"]))),128))])):q("",!0)]),_:1}),t(a(He),{prop:"message",label:"提交信息","min-width":"250"})]),_:1},8,["data","empty-text"])),[[me,te.value]]),X.value?q("",!0):(u(),g("div",yo,[e("div",ho,[e("span",null,"第 "+C(F.value)+" 页 "+C(O.value>0?`/ 共 ${Math.ceil(O.value/100)||1} 页`:"")+" (总计 "+C(O.value)+" 条记录)",1)]),P.value?(u(),g("div",_o,n[20]||(n[20]=[e("div",{class:"loading-spinner"},null,-1),e("span",null,"加载更多...",-1)]))):K.value?(u(),g("div",{key:1,class:"load-more-button",onClick:we},n[21]||(n[21]=[e("span",null,"加载更多",-1)]))):(u(),g("div",wo,[n[22]||(n[22]=e("span",null,"没有更多数据了",-1)),D.value.length>0?(u(),g("span",$o,"(已加载 "+C(D.value.length)+" 条记录)",1)):q("",!0)]))]))]))]))],2),t(a(nt),{modelValue:A.value,"onUpdate:modelValue":n[7]||(n[7]=z=>A.value=z),title:`提交详情: ${($e=H.value)!=null&&$e.hash?H.value.hash.substring(0,7):"未知"}`,width:"80%","destroy-on-close":"",class:"commit-detail-dialog"},{default:s(()=>[Ue((u(),g("div",bo,[H.value?(u(),g("div",ko,[e("div",Co,[e("div",So,[n[23]||(n[23]=e("span",{class:"item-label"},"哈希:",-1)),e("span",To,C(H.value.hash),1)]),e("div",xo,[n[24]||(n[24]=e("span",{class:"item-label"},"作者:",-1)),e("span",Lo,C(H.value.author)+" <"+C(H.value.email)+">",1)]),e("div",Vo,[n[25]||(n[25]=e("span",{class:"item-label"},"日期:",-1)),e("span",Ro,C(H.value.date),1)])]),e("div",Bo,[n[26]||(n[26]=e("div",{class:"message-label"},"提交信息:",-1)),e("div",{class:"message-content",innerHTML:L(H.value.message).replace(/\n/g,"<br>")},null,8,zo)])])):q("",!0),e("div",Go,[e("div",Do,[n[27]||(n[27]=e("h3",null,"变更文件",-1)),J.value.length===0?(u(),re(de,{key:0,description:"没有找到变更文件"})):(u(),g("ul",Ao,[(u(!0),g(he,null,be(J.value,z=>(u(),g("li",{key:z,class:Ve({"active-file":z===ue.value}),onClick:Le=>Be(H.value.hash,z)},C(z),11,Eo))),128))]))]),e("div",jo,[ue.value?(u(),g("h3",Mo,"文件差异: "+C(ue.value),1)):(u(),g("h3",Po,"文件差异")),!le.value&&!ce.value?(u(),re(de,{key:2,description:"选择文件查看差异"})):le.value?(u(),g("div",{key:3,innerHTML:Pe(le.value),class:"diff-content"},null,8,Uo)):q("",!0)])])])),[[me,ce.value]])]),_:1},8,["modelValue","title"])]),n[33]||(n[33]=h()),Ue(e("div",{class:"context-menu",style:kt({top:ke.value+"px",left:ne.value+"px"})},[e("div",{class:"context-menu-item",onClick:n[8]||(n[8]=z=>Me(pe.value))},n[28]||(n[28]=[e("i",{class:"el-icon-view"},null,-1),h(" 查看详情 ")])),n[31]||(n[31]=h()),e("div",{class:"context-menu-item",onClick:n[9]||(n[9]=z=>pt(pe.value))},n[29]||(n[29]=[e("i",{class:"el-icon-delete"},null,-1),h(" 撤销提交 (Revert) ")])),n[32]||(n[32]=h()),e("div",{class:"context-menu-item",onClick:n[10]||(n[10]=z=>Ie(pe.value))},n[30]||(n[30]=[e("i",{class:"el-icon-edit"},null,-1),h(" Cherry-Pick 到当前分支 ")]))],4),[[Ft,oe.value]])],64)}}}),Fo=rt(Oo,[["__scopeId","data-v-7e7ea077"]]),Io="data:image/svg+xml,%3csvg%20width='200'%20height='200'%20viewBox='0%200%20200%20200'%20xmlns='http://www.w3.org/2000/svg'%3e%3c!--%20主分支%20--%3e%3cline%20x1='40'%20y1='40'%20x2='40'%20y2='160'%20stroke='%2334495e'%20stroke-width='8'%20stroke-linecap='round'%20/%3e%3c!--%20特性分支%20--%3e%3cpath%20d='M40,70%20C60,70%2080,90%2080,110%20L80,130'%20stroke='%233498db'%20stroke-width='8'%20stroke-linecap='round'%20stroke-linejoin='round'%20fill='none'%20/%3e%3c!--%20开发分支%20--%3e%3cpath%20d='M40,100%20C60,100%20100,110%20100,130%20L100,160'%20stroke='%232ecc71'%20stroke-width='8'%20stroke-linecap='round'%20stroke-linejoin='round'%20fill='none'%20/%3e%3c!--%20修复分支%20--%3e%3cpath%20d='M40,130%20C60,130%20120,140%20120,160'%20stroke='%23e74c3c'%20stroke-width='8'%20stroke-linecap='round'%20stroke-linejoin='round'%20fill='none'%20/%3e%3c!--%20合并点%20--%3e%3cpath%20d='M80,130%20C80,145%2060,145%2040,145'%20stroke='%233498db'%20stroke-width='8'%20stroke-linecap='round'%20stroke-linejoin='round'%20fill='none'%20/%3e%3c!--%20节点%20--%3e%3ccircle%20cx='40'%20cy='40'%20r='10'%20fill='%2334495e'%20/%3e%3ccircle%20cx='40'%20cy='70'%20r='10'%20fill='%2334495e'%20/%3e%3ccircle%20cx='40'%20cy='100'%20r='10'%20fill='%2334495e'%20/%3e%3ccircle%20cx='40'%20cy='130'%20r='10'%20fill='%2334495e'%20/%3e%3ccircle%20cx='40'%20cy='145'%20r='10'%20fill='%2334495e'%20/%3e%3ccircle%20cx='40'%20cy='160'%20r='10'%20fill='%2334495e'%20/%3e%3ccircle%20cx='80'%20cy='130'%20r='10'%20fill='%233498db'%20/%3e%3ccircle%20cx='100'%20cy='160'%20r='10'%20fill='%232ecc71'%20/%3e%3ccircle%20cx='120'%20cy='160'%20r='10'%20fill='%23e74c3c'%20/%3e%3c/svg%3e",No={class:"main-header"},Ho={class:"header-left"},Wo=["src"],Jo={class:"header-info"},Yo={key:0,id:"user-info"},qo={class:"user-name"},Zo={class:"user-email"},Xo={key:1,id:"user-info"},Ko={class:"main-container"},Qo={key:0,class:"loading-container"},en={class:"loading-spinner"},tn={key:1,class:"grid-layout"},sn={class:"git-status-panel"},an={key:0,class:"commit-form-panel"},ln={key:0,class:"card"},on={class:"tips"},nn={key:1,class:"commit-form-panel"},rn={key:2,class:"log-list-panel"},cn={class:"dialog-footer"},un={class:"main-footer"},dn={key:0,class:"branch-info"},fn={class:"branch-wrapper"},pn={class:"dialog-footer"},vn=lt({__name:"App",setup(Q){const p=r(""),$=r(null),y=r(null),i=Fe(),D=Ht(),E=r(!1),ee=r("");async function te(){try{const T=await D.loadConfig();T&&(p.value=`默认提交信息: ${T.defaultCommitMessage}`)}catch(T){console.error("加载配置失败:",T)}}async function X(){try{const d=await(await fetch("/api/current_directory")).json();return ee.value=d.directory||"未知目录",d}catch(T){return console.error("获取当前目录失败:",T),{directory:"未知目录",isGitRepo:!1}}}qe(async()=>{console.log("---------- 页面初始化开始 ----------");try{const[T,d]=await Promise.all([te(),X()]);i.isGitRepo=d.isGitRepo===!0,i.lastCheckedTime=Date.now(),i.isGitRepo?await Promise.all([i.getCurrentBranch(),i.getAllBranches(),i.getUserInfo()]):o.warning("当前目录不是Git仓库,部分功能将不可用")}catch(T){console.error("初始化失败:",T)}finally{E.value=!0,console.log("---------- 页面初始化完成 ----------"),setTimeout(()=>{_()},100)}});const O=r(!1),b=r(""),k=r("");async function F(){await i.createBranch(b.value,k.value)&&(O.value=!1,b.value="",y.value&&y.value.refreshStatus(),$.value&&$.value.refreshLog())}function K(){k.value=i.currentBranch,O.value=!0}async function P(T){await i.changeBranch(T)&&(y.value&&y.value.refreshStatus(),$.value&&$.value.refreshLog())}const Y=r(!1),A=r(""),H=r("");function J(){A.value=i.userName,H.value=i.userEmail,Y.value=!0}async function le(){if(!A.value||!H.value){o.warning("用户名和邮箱不能为空");return}await i.restoreUserConfig(A.value,H.value)&&(Y.value=!1)}async function ce(){await i.clearUserConfig()&&(A.value="",H.value="")}let ue=!1,j=!1,fe=0,se=0,x="",S="";function ae(){const T=document.querySelector(".grid-layout");if(!T)return;const d=getComputedStyle(T).gridTemplateColumns.split(" "),U=getComputedStyle(T).gridTemplateRows.split(" ");if(d.length>=3&&U.length>=3){const Z=parseFloat(d[0]),ge=parseFloat(d[2]),ye=Z+ge,ve=Z/ye,w=parseFloat(U[0]),c=parseFloat(U[2]),I=w+c,V=w/I;localStorage.setItem("zen-gitsync-layout-left-ratio",ve.toString()),localStorage.setItem("zen-gitsync-layout-top-ratio",V.toString()),console.log(`布局比例已保存 - 左侧: ${(ve*100).toFixed(0)}%, 上方: ${(V*100).toFixed(0)}%`)}}function _(){const T=document.querySelector(".grid-layout");if(!T)return;const d=localStorage.getItem("zen-gitsync-layout-left-ratio"),U=localStorage.getItem("zen-gitsync-layout-top-ratio");if(d){const Z=parseFloat(d),ge=1-Z;T.style.gridTemplateColumns=`${Z}fr 8px ${ge}fr`,console.log(`已恢复左侧比例: ${(Z*100).toFixed(0)}%`)}else T.style.gridTemplateColumns="1fr 8px 3fr";if(U){const Z=parseFloat(U),ge=1-Z;T.style.gridTemplateRows=`${Z}fr 8px ${ge}fr`,console.log(`已恢复上方比例: ${(Z*100).toFixed(0)}%`)}}function v(T){var U;ue=!0,fe=T.clientX;const d=document.querySelector(".grid-layout");x=getComputedStyle(d).gridTemplateColumns,(U=document.getElementById("v-resizer"))==null||U.classList.add("active"),document.addEventListener("mousemove",N),document.addEventListener("mouseup",oe),T.preventDefault()}function N(T){if(!ue)return;const d=document.querySelector(".grid-layout"),U=T.clientX-fe,Z=x.split(" ");if(Z.length>=3){const ge=parseFloat(Z[0]),ye=parseFloat(Z[2]),ve=ge+ye,w=(ge+U/d.clientWidth*ve)/ve,c=1-w,I=.1,V=.5;w<I?d.style.gridTemplateColumns=`${I}fr 8px ${1-I}fr`:w>V?d.style.gridTemplateColumns=`${V}fr 8px ${1-V}fr`:d.style.gridTemplateColumns=`${w}fr 8px ${c}fr`}}function oe(){var T;ue=!1,(T=document.getElementById("v-resizer"))==null||T.classList.remove("active"),document.removeEventListener("mousemove",N),document.removeEventListener("mouseup",oe),ae()}function ke(T){var U;j=!0,se=T.clientY;const d=document.querySelector(".grid-layout");S=getComputedStyle(d).gridTemplateRows,(U=document.getElementById("h-resizer"))==null||U.classList.add("active"),document.addEventListener("mousemove",ne),document.addEventListener("mouseup",pe),T.preventDefault()}function ne(T){if(!j)return;const d=document.querySelector(".grid-layout"),U=T.clientY-se,Z=S.split(" ");if(Z.length>=3){const ge=parseFloat(Z[0]),ye=parseFloat(Z[2]),ve=ge+ye,w=(ge+U/d.clientHeight*ve)/ve,c=1-w,I=.2,V=.8;w<I?d.style.gridTemplateRows=`${I}fr 8px ${1-I}fr`:w>V?d.style.gridTemplateRows=`${V}fr 8px ${1-V}fr`:d.style.gridTemplateRows=`${w}fr 8px ${c}fr`}}function pe(){var T;j=!1,(T=document.getElementById("h-resizer"))==null||T.classList.remove("active"),document.removeEventListener("mousemove",ne),document.removeEventListener("mouseup",pe),ae()}return(T,d)=>{const U=ot,Z=Ce,ge=Nt,ye=it,ve=Pt,w=st,c=at,I=Mt,V=nt,W=Ot;return u(),g(he,null,[e("header",No,[e("div",Ho,[e("img",{src:a(Io),alt:"Zen GitSync Logo",class:"logo"},null,8,Wo),d[9]||(d[9]=e("h1",null,"Zen GitSync UI",-1))]),e("div",Jo,[a(i).userName&&a(i).userEmail?(u(),g("div",Yo,[d[10]||(d[10]=e("span",{class:"user-label"},"用户:",-1)),e("span",qo,C(a(i).userName),1),e("span",Zo,"<"+C(a(i).userEmail)+">",1),t(Z,{type:"primary",size:"small",onClick:J,class:"user-settings-btn",circle:""},{default:s(()=>[t(U,null,{default:s(()=>[t(a(Je))]),_:1})]),_:1})])):(u(),g("div",Xo,[d[11]||(d[11]=e("span",{class:"user-label"},"用户: ",-1)),d[12]||(d[12]=e("span",{class:"user-warning"},"未配置",-1)),t(Z,{type:"primary",size:"small",onClick:J,class:"user-settings-btn",circle:""},{default:s(()=>[t(U,null,{default:s(()=>[t(a(Je))]),_:1})]),_:1})]))])]),e("main",Ko,[E.value?(u(),g("div",tn,[e("div",sn,[t(Ma,{ref_key:"gitStatusRef",ref:y,"initial-directory":ee.value},null,8,["initial-directory"])]),e("div",{class:"vertical-resizer",id:"v-resizer",onMousedown:v},null,32),a(i).isGitRepo?(u(),g("div",an,[!a(i).userName||!a(i).userEmail?(u(),g("div",ln,[d[18]||(d[18]=e("h2",null,"Git用户未配置",-1)),d[19]||(d[19]=e("p",null,"请先配置Git用户信息才能进行提交操作。",-1)),e("div",on,[d[16]||(d[16]=e("h3",null,"您可以通过以下方式配置:",-1)),d[17]||(d[17]=e("ol",null,[e("li",null,"点击右上角的设置按钮,配置用户名和邮箱"),e("li",null,"或者使用命令行配置:"),e("div",{class:"code-block"},[h(' git config --global user.name "您的用户名"'),e("br"),h(' git config --global user.email "您的邮箱" ')])],-1)),t(Z,{type:"primary",onClick:J},{default:s(()=>d[15]||(d[15]=[h(" 立即配置 ")])),_:1})])])):(u(),re(Jl,{key:1}))])):(u(),g("div",nn,d[20]||(d[20]=[e("div",{class:"card",style:{padding:"20px"}},[e("h2",null,"Git仓库初始化"),e("p",null,"当前目录不是Git仓库,请先初始化Git仓库或切换到Git仓库目录。"),e("div",{class:"tips"},[e("h3",null,"可以使用以下命令初始化仓库:"),e("div",{class:"code-block"},"git init")])],-1)]))),e("div",{class:"horizontal-resizer",id:"h-resizer",onMousedown:ke},null,32),a(i).isGitRepo?(u(),g("div",rn,[t(Fo,{ref_key:"logListRef",ref:$},null,512)])):q("",!0),t(V,{modelValue:O.value,"onUpdate:modelValue":d[3]||(d[3]=M=>O.value=M),title:"创建新分支",width:"30%","destroy-on-close":""},{footer:s(()=>[e("span",cn,[t(Z,{onClick:d[2]||(d[2]=M=>O.value=!1)},{default:s(()=>d[21]||(d[21]=[h("取消")])),_:1}),t(Z,{type:"primary",onClick:F,loading:a(i).isCreatingBranch},{default:s(()=>d[22]||(d[22]=[h(" 创建 ")])),_:1},8,["loading"])])]),default:s(()=>[t(I,{model:{newBranchName:b.value,selectedBaseBranch:k.value}},{default:s(()=>[t(ve,{label:"新分支名称"},{default:s(()=>[t(ye,{modelValue:b.value,"onUpdate:modelValue":d[0]||(d[0]=M=>b.value=M),placeholder:"请输入新分支名称"},null,8,["modelValue"])]),_:1}),t(ve,{label:"基于分支"},{default:s(()=>[t(c,{modelValue:k.value,"onUpdate:modelValue":d[1]||(d[1]=M=>k.value=M),placeholder:"选择基础分支",style:{width:"100%"}},{default:s(()=>[(u(!0),g(he,null,be(a(i).allBranches,M=>(u(),re(w,{key:M,label:M,value:M},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])]),_:1})]),_:1},8,["model"])]),_:1},8,["modelValue"])])):(u(),g("div",Qo,[t(ge,{class:"loading-card"},{default:s(()=>[e("div",en,[t(U,{class:"is-loading"},{default:s(()=>d[13]||(d[13]=[e("svg",{viewBox:"0 0 1024 1024",xmlns:"http://www.w3.org/2000/svg"},[e("path",{fill:"currentColor",d:"M512 64a32 32 0 0 1 32 32v192a32 32 0 0 1-64 0V96a32 32 0 0 1 32-32zm0 640a32 32 0 0 1 32 32v192a32 32 0 1 1-64 0V736a32 32 0 0 1 32-32zm448-192a32 32 0 0 1-32 32H736a32 32 0 1 1 0-64h192a32 32 0 0 1 32 32zm-640 0a32 32 0 0 1-32 32H96a32 32 0 0 1 0-64h192a32 32 0 0 1 32 32zM195.2 195.2a32 32 0 0 1 45.248 0L376.32 331.008a32 32 0 0 1-45.248 45.248L195.2 240.448a32 32 0 0 1 0-45.248zm452.544 452.544a32 32 0 0 1 45.248 0L828.8 783.552a32 32 0 0 1-45.248 45.248L647.744 692.992a32 32 0 0 1 0-45.248zM828.8 195.264a32 32 0 0 1 0 45.184L692.992 376.32a32 32 0 0 1-45.248-45.248l135.808-135.808a32 32 0 0 1 45.248 0zm-452.544 452.48a32 32 0 0 1 0 45.248L240.448 828.8a32 32 0 0 1-45.248-45.248l135.808-135.808a32 32 0 0 1 45.248 0z"})],-1)])),_:1})]),d[14]||(d[14]=e("div",{class:"loading-text"},"加载中...",-1))]),_:1})]))]),e("footer",un,[a(i).currentBranch?(u(),g("div",dn,[e("div",fn,[d[24]||(d[24]=e("span",{class:"branch-label"},"当前分支:",-1)),t(c,{modelValue:a(i).currentBranch,"onUpdate:modelValue":d[4]||(d[4]=M=>a(i).currentBranch=M),size:"small",onChange:P,loading:a(i).isChangingBranch,class:"branch-select"},{default:s(()=>[(u(!0),g(he,null,be(a(i).allBranches,M=>(u(),re(w,{key:M,label:M,value:M},null,8,["label","value"]))),128))]),_:1},8,["modelValue","loading"]),t(Z,{type:"primary",size:"small",onClick:K,class:"create-branch-btn"},{default:s(()=>[t(U,null,{default:s(()=>[t(a(Ss))]),_:1}),d[23]||(d[23]=h(" 新建分支 "))]),_:1})])])):q("",!0),d[25]||(d[25]=e("div",{class:"footer-right"},null,-1))]),t(V,{modelValue:Y.value,"onUpdate:modelValue":d[8]||(d[8]=M=>Y.value=M),title:"Git用户设置",width:"30%","destroy-on-close":""},{footer:s(()=>[e("span",pn,[t(Z,{type:"danger",onClick:ce},{default:s(()=>d[27]||(d[27]=[h(" 清除配置 ")])),_:1}),t(Z,{onClick:d[7]||(d[7]=M=>Y.value=!1)},{default:s(()=>d[28]||(d[28]=[h("取消")])),_:1}),t(Z,{type:"primary",onClick:le},{default:s(()=>d[29]||(d[29]=[h(" 保存 ")])),_:1})])]),default:s(()=>[t(I,null,{default:s(()=>[t(ve,{label:"用户名"},{default:s(()=>[t(ye,{modelValue:A.value,"onUpdate:modelValue":d[5]||(d[5]=M=>A.value=M),placeholder:"请输入Git用户名"},null,8,["modelValue"])]),_:1}),t(ve,{label:"邮箱"},{default:s(()=>[t(ye,{modelValue:H.value,"onUpdate:modelValue":d[6]||(d[6]=M=>H.value=M),placeholder:"请输入Git邮箱"},null,8,["modelValue"])]),_:1}),t(ve,null,{default:s(()=>[t(W,{type:"info",closable:!1,"show-icon":""},{default:s(()=>d[26]||(d[26]=[h(" 这些设置将影响全局Git配置,对所有Git仓库生效。 ")])),_:1})]),_:1})]),_:1})]),_:1},8,["modelValue"])],64)}}}),mn=rt(vn,[["__scopeId","data-v-b9b417fd"]]),Wt=Ts(mn);Wt.use(xs());Wt.mount("#app");