zen-gitsync 2.1.12 → 2.1.13
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.
- package/package.json +1 -1
- package/src/ui/public/assets/{index-Bp-pxa_s.js → index-BQ-ro2xx.js} +2 -2
- package/src/ui/public/assets/{index-B2PuJ0eQ.css → index-C3GOpTEq.css} +1 -1
- package/src/ui/public/assets/vendor-BLnrYq3C.css +1 -0
- package/src/ui/public/assets/vendor-Bd7azFrY.js +45 -0
- package/src/ui/public/index.html +16 -16
- package/src/ui/server/index.js +1735 -1733
- package/src/utils/index.js +2 -1
- package/src/ui/public/assets/vendor-7KY24w-Q.js +0 -45
- package/src/ui/public/assets/vendor-Dp0FkvMe.css +0 -1
package/package.json
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{d as Wt,r as u,o as bt,a as cs,E as n,l as us,b as Vt,c as Ee,w as Ke,e as w,f as m,F as Te,g as e,h as s,i as ft,j as Ut,u as l,k as a,m as Jt,n as Ft,p as qt,q as je,s as Yt,t as Zt,v as ds,x as Kt,y as q,z as ae,A as Lt,B as b,C as At,D as fs,G as M,H as Qt,I as Ge,J as es,K as Bt,L as ps,M as Nt,N as gt,O as Xe,P as Pt,Q as Qe,T as It,R as ts,S as Ot,U as wt,V as yt,W as zt,X as Dt,Y as Tt,Z as xt,_ as ss,$ as kt,a0 as vs,a1 as ms,a2 as as,a3 as ls,a4 as gs,a5 as os,a6 as ns,a7 as hs,a8 as We,a9 as ys,aa as ws,ab as _s,ac as Ht,ad as bs,ae as $s,af as Cs,ag as ks,ah as Ss,ai as Ts,aj as xs,ak as Vs,al as dt,am as Ls,an as As,ao as Xt,ap as Bs,aq as De,ar as Ms,as as Rs}from"./vendor-
|
|
1
|
+
import{d as Wt,r as u,o as bt,a as cs,E as n,l as us,b as Vt,c as Ee,w as Ke,e as w,f as m,F as Te,g as e,h as s,i as ft,j as Ut,u as l,k as a,m as Jt,n as Ft,p as qt,q as je,s as Yt,t as Zt,v as ds,x as Kt,y as q,z as ae,A as Lt,B as b,C as At,D as fs,G as M,H as Qt,I as Ge,J as es,K as Bt,L as ps,M as Nt,N as gt,O as Xe,P as Pt,Q as Qe,T as It,R as ts,S as Ot,U as wt,V as yt,W as zt,X as Dt,Y as Tt,Z as xt,_ as ss,$ as kt,a0 as vs,a1 as ms,a2 as as,a3 as ls,a4 as gs,a5 as os,a6 as ns,a7 as hs,a8 as We,a9 as ys,aa as ws,ab as _s,ac as Ht,ad as bs,ae as $s,af as Cs,ag as ks,ah as Ss,ai as Ts,aj as xs,ak as Vs,al as dt,am as Ls,an as As,ao as Xt,ap as Bs,aq as De,ar as Ms,as as Rs}from"./vendor-Bd7azFrY.js";(function(){const v=document.createElement("link").relList;if(v&&v.supports&&v.supports("modulepreload"))return;for(const g of document.querySelectorAll('link[rel="modulepreload"]'))p(g);new MutationObserver(g=>{for(const O of g)if(O.type==="childList")for(const L of O.addedNodes)L.tagName==="LINK"&&L.rel==="modulepreload"&&p(L)}).observe(document,{childList:!0,subtree:!0});function x(g){const O={};return g.integrity&&(O.integrity=g.integrity),g.referrerPolicy&&(O.referrerPolicy=g.referrerPolicy),g.crossOrigin==="use-credentials"?O.credentials="include":g.crossOrigin==="anonymous"?O.credentials="omit":O.credentials="same-origin",O}function p(g){if(g.ep)return;g.ep=!0;const O=x(g);fetch(g.href,O)}})();const Gt=300,_t=Wt("git",()=>{const $e=u(""),v=u([]),x=u(""),p=u(""),g=u(!1),O=u(!1),L=u(!1),U=u(0),H=u(""),oe=u(!1),z=u(!1),Q=u(!1),A=u(!1),S=u(!1),Y=u(0),X=u(0),K=u(!1),N=u(""),_e=u(0),re=u(0);let E=null;const se=u(!0),D=u([]),pe=u({staged:[],unstaged:[],untracked:[]}),ee=u(""),T=u([]),h=u(!1),W=u(!1),R=u(!1),B=u(!1),ne=u(!1);function xe(){$e.value="",v.value=[],x.value="",p.value="",g.value=!1,O.value=!1,L.value=!1,U.value=0,Y.value=0,X.value=0,K.value=!1,N.value="",_e.value=0,re.value=0,z.value=!1,Q.value=!1,A.value=!1,S.value=!1,H.value="",oe.value=!1,D.value=[],pe.value={staged:[],unstaged:[],untracked:[]},ee.value="",T.value=[],h.value=!1,W.value=!1,R.value=!1,B.value=!1,ne.value=!1}async function Se(){if(L.value)try{console.log("获取分支状态...");const f=await(await fetch("/api/branch-status")).json();f&&(Y.value=f.ahead||0,X.value=f.behind||0,K.value=f.hasUpstream||!1,N.value=f.upstreamBranch||"",_e.value=Date.now(),console.log(`分支状态更新:领先 ${Y.value} 个提交,落后 ${X.value} 个提交,上游分支:${K.value?N.value:"无"}`))}catch(c){console.error("获取分支状态失败:",c),Y.value=0,X.value=0,K.value=!1,N.value=""}}async function Ve(){const c=Date.now();if(c-U.value<1e3)return console.log("使用缓存的Git仓库状态:",L.value?"是":"不是"),L.value;try{const I=await(await fetch("/api/current_directory")).json();return L.value=I.isGitRepo===!0,U.value=c,console.log(`当前目录${L.value?"是":"不是"}Git仓库`),L.value}catch(f){return console.error("检查Git仓库状态失败:",f),L.value=!1,U.value=c,!1}}async function V(){try{const f=await(await fetch("/api/branch")).json();f.branch&&($e.value=f.branch)}catch(c){console.error("获取分支信息失败:",c)}}async function fe(){if(L.value)try{console.log("获取所有分支...");const f=await(await fetch("/api/branches")).json();f.branches&&Array.isArray(f.branches)&&(v.value=f.branches,re.value=Date.now(),console.log(`获取到${f.branches.length}个分支`))}catch(c){console.error("获取所有分支信息失败:",c)}}async function ue(c){console.log("切换到分支:",c);try{g.value=!0;const I=await(await fetch("/api/checkout",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({branch:c})})).json();return I.success?(n({message:`已切换到分支: ${c}`,type:"success"}),await V(),await Se(),!0):(n({message:`切换分支失败: ${I.error}`,type:"error"}),!1)}catch(f){return n({message:`切换分支失败: ${f.message}`,type:"error"}),!1}finally{g.value=!1}}async function le(){try{const f=await(await fetch("/api/user-info")).json();f.name&&f.email&&(x.value=f.name,p.value=f.email)}catch(c){console.error("获取用户信息失败:",c)}}async function Ue(c,f){if(!c.trim())return n({message:"分支名称不能为空",type:"warning"}),!1;try{O.value=!0;const de=await(await fetch("/api/create-branch",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({newBranchName:c,baseBranch:f||$e.value})})).json();return de.success?(n({message:`已创建并切换到分支: ${c}`,type:"success"}),await V(),await Se(),await fe(),!0):(n({message:`创建分支失败: ${de.error}`,type:"error"}),!1)}catch(I){return n({message:`创建分支失败: ${I.message}`,type:"error"}),!1}finally{O.value=!1}}async function Pe(){try{const f=await(await fetch("/api/clear-user-config",{method:"POST"})).json();return f.success?(x.value="",p.value="",n({message:"已清除Git用户配置",type:"success"}),!0):(n({message:`清除配置失败: ${f.error}`,type:"error"}),!1)}catch(c){return n({message:`清除配置失败: ${c.message}`,type:"error"}),!1}}async function Oe(c,f){try{const de=await(await fetch("/api/restore-user-config",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:c,email:f})})).json();return de.success?(x.value=c,p.value=f,n({message:"已恢复Git用户配置",type:"success"}),!0):(n({message:`恢复配置失败: ${de.error}`,type:"error"}),!1)}catch(I){return n({message:`恢复配置失败: ${I.message}`,type:"error"}),!1}}async function Fe(){if(!L.value)return n({message:"当前目录不是Git仓库",type:"warning"}),!1;try{Q.value=!0;const f=await(await fetch("/api/pull",{method:"POST"})).json();return f.success?(n({message:"拉取成功",type:"success"}),await Se(),!0):(f.needsMerge?n({message:`需要合并更改: ${f.pullOutput||"存在冲突需要手动解决"}`,type:"warning",duration:5e3}):n({message:`拉取失败: ${f.error}`,type:"error"}),!1)}catch(c){return n({message:`拉取失败: ${c.message}`,type:"error"}),!1}finally{Q.value=!1}}async function lt(){if(!L.value)return n({message:"当前目录不是Git仓库",type:"warning"}),!1;try{A.value=!0;const f=await(await fetch("/api/fetch-all",{method:"POST"})).json();return f.success?(n({message:"获取所有远程分支信息成功",type:"success"}),await Se(),!0):(n({message:`获取远程分支信息失败: ${f.error}`,type:"error"}),!1)}catch(c){return n({message:`获取远程分支信息失败: ${c.message}`,type:"error"}),!1}finally{A.value=!1}}function Je(){E&&E.disconnect();try{const c="http://localhost:3000";if(console.log("尝试连接Socket.IO服务器:",c),E=us(c,{reconnectionDelayMax:1e4,reconnection:!0,reconnectionAttempts:10,reconnectionDelay:1e3,timeout:2e4,autoConnect:!0,forceNew:!0,transports:["websocket","polling"]}),!E){console.error("Socket.IO初始化失败: socket为null");return}console.log("Socket.IO初始化成功,socket ID:",E.id||"未连接"),E.on("connect",()=>{console.log("成功连接到Socket.IO服务器"),se.value&&E&&E.emit("start_monitoring")}),E.on("disconnect",f=>{console.log("与Socket.IO服务器断开连接:",f)}),E.on("git_status_update",f=>{se.value&&(console.log("收到Git状态更新通知:",new Date().toLocaleTimeString()),f.status&&(ee.value=f.status),f.porcelain!==void 0&&qe(f.porcelain))}),E.on("monitoring_status",f=>{console.log("文件监控状态:",f.active?"已启动":"已停止")}),E.on("connect_error",f=>{console.error("Socket连接错误:",f.message)}),E.on("connect_timeout",()=>{console.error("Socket连接超时")}),E.on("reconnect",f=>{console.log(`Socket重连成功,尝试次数: ${f}`),se.value&&(console.log("重连后重新发送start_monitoring请求"),E==null||E.emit("start_monitoring"))}),E.on("reconnect_attempt",f=>{console.log(`Socket尝试重连,第 ${f} 次尝试`)}),E.on("reconnect_error",f=>{console.error("Socket重连错误:",f.message)}),E.on("reconnect_failed",()=>{console.error("Socket重连失败,已达到最大重试次数")}),E&&!E.connected&&(console.log("Socket未连接,尝试手动连接..."),E.connect())}catch(c){console.error("Socket.IO连接初始化失败:",c)}}function et(){if(console.log("toggleAutoUpdate调用,当前值:",se.value),!E){console.error("无法切换自动更新状态: socket连接不存在"),n.error("无法连接到服务器,自动更新可能不会生效"),console.log("尝试重新建立socket连接..."),Je(),localStorage.setItem("zen-gitsync-auto-update",se.value.toString());return}try{se.value?(console.log("发送start_monitoring命令..."),E.emit("start_monitoring"),n.success("自动更新已启用")):(console.log("发送stop_monitoring命令..."),E.emit("stop_monitoring"),n.info("自动更新已禁用")),localStorage.setItem("zen-gitsync-auto-update",se.value.toString()),console.log("已保存自动更新设置到本地存储:",se.value)}catch(c){console.error("切换自动更新状态时出错:",c),n.error(`切换自动更新失败: ${c.message}`)}}function qe(c){if(c===void 0||c===""){T.value=[];return}const f=c.split(`
|
|
2
2
|
`),I=[];for(const de of f){const Ie=de.match(/^([ MADRCU\?]{2})\s+(.+)$/);if(Ie){let Me="";const Le=Ie[1],Re=Le.charAt(0),Ze=Le.charAt(1);Re==="A"||Re==="M"||Re==="D"||Re==="R"?Me="added":Re===" "&&Ze==="M"?Me="modified":Re===" "&&Ze==="D"?Me="deleted":Le==="??"?Me="untracked":Me="other",I.push({path:Ie[2],type:Me})}}T.value=I}async function ze(c=!0){if(!L.value){console.log("当前目录不是Git仓库,跳过加载提交历史");return}try{h.value=!0,console.log("开始加载提交历史...");const f=new Date().getTime(),de=await(await fetch(`/api/log?page=1&_t=${f}`)).json();de&&de.data&&Array.isArray(de.data)?(D.value=[...de.data],console.log(`提交历史加载完成,共 ${D.value.length} 条记录`)):(console.warn("API返回的提交历史格式不正确:",de),D.value=[]),c&&n({message:"提交历史已更新",type:"success"})}catch(f){console.error("获取提交历史失败:",f),c&&n({message:`获取提交历史失败: ${f.message}`,type:"error"})}finally{h.value=!1}}async function ve(){if(!L.value){console.log("当前目录不是Git仓库,跳过加载Git状态");return}try{W.value=!0;const f=await(await fetch("/api/status")).json();f.status&&(ee.value=f.status,pe.value={staged:f.status.staged||[],unstaged:f.status.unstaged||[],untracked:f.status.untracked||[]}),await Ne()}catch(c){console.error("获取Git状态失败:",c),n({message:`获取Git状态失败: ${c.message}`,type:"error"})}finally{W.value=!1}}async function Ne(){if(console.log("开始获取Git状态(porcelain格式)..."),!L.value){console.log("当前目录不是Git仓库,跳过加载Git状态");return}try{const f=await(await fetch("/api/status_porcelain")).json();f.status!==void 0?qe(f.status):T.value=[]}catch(c){console.error("获取Git状态(porcelain)失败:",c),n({message:`获取Git状态(porcelain)失败: ${c.message}`,type:"error"}),T.value=[]}}async function y(){if(!L.value)return n.warning("当前目录不是Git仓库"),!1;try{R.value=!0;const f=await(await fetch("/api/add",{method:"POST"})).json();return f.success?(n({message:"文件已添加到暂存区",type:"success"}),ve(),!0):(n({message:`添加文件失败: ${f.error}`,type:"error"}),!1)}catch(c){return n({message:`添加文件失败: ${c.message}`,type:"error"}),!1}finally{R.value=!1}}async function i(c){if(!L.value)return n.warning("当前目录不是Git仓库"),!1;try{R.value=!0;const I=await(await fetch("/api/add-file",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({filePath:c})})).json();return I.success?(n({message:"文件已暂存",type:"success"}),ve(),!0):(n({message:`暂存文件失败: ${I.error}`,type:"error"}),!1)}catch(f){return n({message:`暂存文件失败: ${f.message}`,type:"error"}),!1}finally{R.value=!1}}async function J(c){if(!L.value)return n.warning("当前目录不是Git仓库"),!1;try{ne.value=!0;const I=await(await fetch("/api/unstage-file",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({filePath:c})})).json();return I.success?(n({message:"已取消暂存文件",type:"success"}),ve(),!0):(n({message:`取消暂存失败: ${I.error}`,type:"error"}),!1)}catch(f){return n({message:`取消暂存失败: ${f.message}`,type:"error"}),!1}finally{ne.value=!1}}function j(c){return new Promise(f=>setTimeout(f,c))}async function me(c,f=!1){if(!L.value)return n.warning("当前目录不是Git仓库"),!1;try{B.value=!0;const de=await(await fetch("/api/commit",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({message:c,hasNewlines:c.includes(`
|
|
3
3
|
`),noVerify:f})})).json();return de.success?(n({message:"提交成功",type:"success"}),ve(),ze(),Se(),!0):(n({message:`提交失败: ${de.error}`,type:"error"}),!1)}catch(I){return n({message:`提交失败: ${I.message}`,type:"error"}),!1}finally{B.value=!1}}async function Ae(){if(!L.value)return n.warning("当前目录不是Git仓库"),!1;try{z.value=!0;const f=await(await fetch("/api/push",{method:"POST"})).json();return f.success?(n({message:"推送成功",type:"success"}),ve(),ze(),Se(),!0):(n({message:`推送失败: ${f.error}`,type:"error"}),!1)}catch(c){return n({message:`推送失败: ${c.message}`,type:"error"}),!1}finally{z.value=!1}}async function ye(c,f={}){if(!L.value)return n({message:"当前目录不是Git仓库",type:"warning"}),!1;if(!c)return n({message:"请选择要合并的分支",type:"warning"}),!1;if(c===$e.value)return n({message:"不能合并当前分支到自身",type:"warning"}),!1;try{S.value=!0;const I=await fetch("/api/merge",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({branch:c,...f})}),de=await I.json();return I.status===409?(n({message:"合并分支时发生冲突,请手动解决",type:"warning",duration:5e3}),!1):de.success?(n({message:`成功合并分支 ${c} 到 ${$e.value}`,type:"success"}),await ve(),await Se(),!0):(n({message:`合并分支失败: ${de.error}`,type:"error"}),!1)}catch(I){return n({message:`合并分支失败: ${I.message}`,type:"error"}),!1}finally{S.value=!1}}async function ge(c,f=!1){return await y()?(await j(Gt),await me(c,f)):!1}async function Be(c,f=!1){try{return!await y()||(await j(Gt),!await me(c,f))?!1:(await j(Gt),await Ae())}catch(I){try{(await(await fetch("/api/remove-lock",{method:"POST"})).json()).success&&n({message:"已清理锁定文件,请重试操作",type:"warning"})}catch(de){console.error("清理锁定文件失败:",de)}return n({message:`操作失败: ${I.message}`,type:"error"}),ve(),ze(),Se(),!1}}async function Ce(){if(!L.value)return n.warning("当前目录不是Git仓库"),!1;try{ne.value=!0;const f=await(await fetch("/api/reset-head",{method:"POST"})).json();return f.success?(n({message:"已重置暂存区",type:"success"}),ve(),!0):(n({message:`重置暂存区失败: ${f.error}`,type:"error"}),!1)}catch(c){return n({message:`重置暂存区失败: ${c.message}`,type:"error"}),!1}finally{ne.value=!1}}async function be(c){if(!L.value)return n.warning("当前目录不是Git仓库"),!1;try{ne.value=!0;const I=await(await fetch("/api/reset-to-remote",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({branch:c})})).json();return I.success?(n({message:`已重置分支 ${c} 到远程状态`,type:"success"}),ve(),ze(),!0):(n({message:`重置分支失败: ${I.error}`,type:"error"}),!1)}catch(f){return n({message:`重置分支失败: ${f.message}`,type:"error"}),!1}finally{ne.value=!1}}async function ot(){if(L.value)try{oe.value=!0,console.log("获取远程仓库地址...");const f=await(await fetch("/api/remote-url")).json();f.success?(H.value=f.url||"",console.log(`获取到远程仓库地址: ${H.value}`)):(console.warn("获取远程仓库地址失败:",f.error),H.value="")}catch(c){console.error("获取远程仓库地址失败:",c),H.value=""}finally{oe.value=!1}}async function Ye(){if(!H.value)return n({message:"没有可复制的远程仓库地址",type:"warning"}),!1;try{return await navigator.clipboard.writeText(H.value),n({message:"已复制远程仓库地址",type:"success"}),!0}catch(c){return console.error("复制远程仓库地址失败:",c),n({message:`复制失败: ${c.message}`,type:"error"}),!1}}return bt(()=>{const c=localStorage.getItem("zen-gitsync-auto-update");c!==null&&(se.value=c==="true"),Je()}),cs(()=>{E&&(E.disconnect(),E=null)}),{currentBranch:$e,allBranches:v,userName:x,userEmail:p,isChangingBranch:g,isCreatingBranch:O,isGitRepo:L,lastCheckedTime:U,branchAhead:Y,branchBehind:X,hasUpstream:K,upstreamBranch:N,lastBranchStatusTime:_e,lastBranchesTime:re,remoteUrl:H,isLoadingRemoteUrl:oe,log:D,status:pe,statusText:ee,fileList:T,isLoadingLog:h,isLoadingStatus:W,isAddingFiles:R,isCommiting:B,isResetting:ne,autoUpdateEnabled:se,isPushing:z,isGitPulling:Q,isGitFetching:A,isGitMerging:S,$reset:xe,checkGitRepo:Ve,getCurrentBranch:V,getAllBranches:fe,changeBranch:ue,getUserInfo:le,createBranch:Ue,clearUserConfig:Pe,restoreUserConfig:Oe,getBranchStatus:Se,gitPull:Fe,gitFetchAll:lt,initSocketConnection:Je,toggleAutoUpdate:et,parseStatusPorcelain:qe,fetchLog:ze,fetchStatus:ve,fetchStatusPorcelain:Ne,addToStage:y,addFileToStage:i,unstageFile:J,commitChanges:me,pushToRemote:Ae,addAndCommit:ge,addCommitAndPush:Be,resetHead:Ce,resetToRemote:be,getRemoteUrl:ot,copyRemoteUrl:Ye,mergeBranch:ye}}),Es={class:"card"},zs={class:"status-header"},Ds={class:"header-actions"},Gs=["element-loading-text"],js={key:0,class:"status-box"},Us={key:1,class:"status-box-wrap"},Ps={key:0,class:"branch-status-info"},Os={class:"branch-sync-status"},Fs={class:"sync-status-content"},Ns={class:"status-badges"},Is={class:"badge-content"},Hs={class:"badge-content"},Xs={key:1,class:"file-list-container"},Ws={key:0,class:"file-group"},Js={class:"file-list"},qs=["onClick"],Ys={class:"file-info"},Zs={class:"file-path-container"},Ks={class:"file-name"},Qs={class:"file-directory"},ea={class:"file-actions"},ta={key:1,class:"file-group"},sa={class:"file-list"},aa=["onClick"],la={class:"file-info"},oa={class:"file-path-container"},na={class:"file-name"},ia={class:"file-directory"},ra={class:"file-actions"},ca={key:2,class:"file-group"},ua={class:"file-list"},da=["onClick"],fa={class:"file-info"},pa={class:"file-path-container"},va={class:"file-name"},ma={class:"file-directory"},ga={class:"file-actions"},ha={key:2,class:"empty-status"},ya={class:"empty-icon"},wa={class:"diff-content"},_a=["innerHTML"],ba={key:1,class:"no-diff"},$a={class:"file-navigation"},Ca={class:"file-counter"},ka=Vt({__name:"GitStatus",props:{initialDirectory:{type:String,default:""}},setup($e,{expose:v}){const x=$e,p=_t(),g=Ee(()=>p.isLoadingStatus),O=u(""),L=u(""),U=u(!1),H=u(!1),oe=u(-1),z=u(x.initialDirectory||"");async function Q(){try{if(!z.value){const h=await(await fetch("/api/current_directory")).json();z.value=h.directory||"未知目录"}if(!p.isGitRepo)return;await p.fetchStatus(),await p.getBranchStatus(),n({message:"Git 状态已刷新",type:"success"})}catch(T){n({message:"刷新失败: "+T.message,type:"error"})}}function A(T){if(!T)return"";const h=T.split(`
|
|
4
4
|
`);function W(R){return R.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}return h.map(R=>{const B=W(R);return R.startsWith("diff --git")?`<div class="diff-header">${B}</div>`:R.startsWith("---")?`<div class="diff-old-file">${B}</div>`:R.startsWith("+++")?`<div class="diff-new-file">${B}</div>`:R.startsWith("@@")?`<div class="diff-hunk-header">${B}</div>`:R.startsWith("+")?`<div class="diff-added">${B}</div>`:R.startsWith("-")?`<div class="diff-removed">${B}</div>`:`<div class="diff-context">${B}</div>`}).join("")}async function S(T){try{H.value=!0,O.value=T,oe.value=p.fileList.findIndex(W=>W.path===T);const h=p.fileList[oe.value];if(h&&h.type==="untracked"){try{const R=await(await fetch(`/api/file-content?file=${encodeURIComponent(T)}`)).json();R.success&&R.content?L.value=`diff --git a/${T} b/${T}
|
|
@@ -16,7 +16,7 @@ import{d as Wt,r as u,o as bt,a as cs,E as n,l as us,b as Vt,c as Ee,w as Ke,e a
|
|
|
16
16
|
${Q.value}`),A.value&&(o+=`
|
|
17
17
|
|
|
18
18
|
${A.value}`),o}),Ue=Ee(()=>{let o=`git commit -m "${le.value}"`;return ne.value&&(o+=" --no-verify"),o});function Pe(){const o=x.config;o&&(O.value=`输入提交信息 (默认: ${o.defaultCommitMessage})`,L.value=o.defaultCommitMessage||"",o.descriptionTemplates&&Array.isArray(o.descriptionTemplates)&&(S.value=o.descriptionTemplates),o.scopeTemplates&&Array.isArray(o.scopeTemplates)&&(D.value=o.scopeTemplates),o.messageTemplates&&Array.isArray(o.messageTemplates)&&(Ve.value=o.messageTemplates))}async function Oe(){if(!X.value.trim()){n({message:"请输入模板内容",type:"warning"});return}try{if(K.value)await Fe();else{if(S.value.includes(X.value)){n({message:"该模板已存在",type:"warning"});return}await x.saveTemplate(X.value,"description")&&(S.value.includes(X.value)||S.value.push(X.value),S.value=[...S.value],X.value="")}}catch(o){n({message:`保存模板失败: ${o.message}`,type:"error"})}}async function Fe(){if(!X.value.trim()){n({message:"请输入模板内容",type:"warning"});return}try{if(await x.updateTemplate(N.value,X.value,"description")){const t=S.value.indexOf(N.value);t!==-1&&(S.value[t]=X.value),S.value=[...S.value],K.value=!1,N.value="",_e.value=-1,X.value=""}}catch(o){n({message:`更新模板失败: ${o.message}`,type:"error"})}}function lt(o,t){K.value=!0,N.value=o,_e.value=t,X.value=o}function Je(){K.value=!1,N.value="",_e.value=-1,X.value=""}async function et(){if(!ee.value.trim()){n({message:"请输入模板内容",type:"warning"});return}try{if(T.value)await qe();else{if(D.value.includes(ee.value)){n({message:"该模板已存在",type:"warning"});return}await x.saveTemplate(ee.value,"scope")&&(D.value.includes(ee.value)||D.value.push(ee.value),D.value=[...D.value],ee.value="")}}catch(o){n({message:`保存模板失败: ${o.message}`,type:"error"})}}async function qe(){if(!ee.value.trim()){n({message:"请输入模板内容",type:"warning"});return}try{if(await x.updateTemplate(h.value,ee.value,"scope")){const t=D.value.indexOf(h.value);t!==-1&&(D.value[t]=ee.value),D.value=[...D.value],T.value=!1,h.value="",W.value=-1,ee.value=""}}catch(o){n({message:`更新模板失败: ${o.message}`,type:"error"})}}function ze(o,t){T.value=!0,h.value=o,W.value=t,ee.value=o}function ve(){T.value=!1,h.value="",W.value=-1,ee.value=""}async function Ne(o){try{if(await Qe.confirm(`确定要删除描述模板 "${o}" 吗?`,"删除确认",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"}),await x.deleteTemplate(o,"description")){const ke=S.value.indexOf(o);ke!==-1&&S.value.splice(ke,1),S.value=[...S.value]}}catch(t){if(t==="cancel")return;n({message:`删除模板失败: ${t.message}`,type:"error"})}}async function y(o){try{if(await Qe.confirm(`确定要删除作用域模板 "${o}" 吗?`,"删除确认",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"}),await x.deleteTemplate(o,"scope")){const ke=D.value.indexOf(o);ke!==-1&&D.value.splice(ke,1),D.value=[...D.value]}}catch(t){if(t==="cancel")return;n({message:`删除模板失败: ${t.message}`,type:"error"})}}function i(o){z.value=o,Y.value=!1}function J(o){oe.value=o,pe.value=!1}function j(){Y.value=!0}function me(){pe.value=!0}async function Ae(){try{await v.addToStage()&&v.fetchStatus()}catch(o){n({message:`添加文件失败: ${o.message}`,type:"error"})}}async function ye(){if(!le.value.trim()){n({message:"提交信息不能为空",type:"warning"});return}try{await v.commitChanges(le.value,ne.value)&&(f(),v.fetchStatus(),v.fetchLog(),v.getBranchStatus())}catch(o){n({message:`提交失败: ${o.message}`,type:"error"})}}function ge(){g.value=!0,setTimeout(()=>{g.value=!1},2e3)}async function Be(){try{await v.pushToRemote(),ge(),v.getBranchStatus()}catch(o){n({message:`推送失败: ${o.message}`,type:"error"})}finally{}}async function Ce(){try{await v.gitPull(),await v.fetchStatus(),await v.fetchLog(!1)}catch(o){console.error("拉取操作发生错误:",o)}}async function be(){try{await v.gitFetchAll(),await v.fetchStatus(),await v.fetchLog(!1)}catch(o){console.error("获取远程分支信息操作发生错误:",o)}}async function ot(){if(!le.value.trim()){n({message:"提交信息不能为空",type:"warning"});return}try{await v.addAndCommit(le.value,ne.value),f(),v.fetchStatus(),v.fetchLog()}catch(o){n({message:`暂存并提交失败: ${o.message}`,type:"error"})}}async function Ye(){if(!le.value.trim()){n({message:"提交信息不能为空",type:"warning"});return}try{await v.addCommitAndPush(le.value,ne.value),f(),ge()}catch(o){n({message:`暂存、提交并推送失败: ${o.message}`,type:"error"})}}async function c(){try{await Qe.confirm(`确定要重置当前分支 "${v.currentBranch}" 到远程状态吗?这将丢失所有未推送的提交和本地更改。`,"重置到远程分支",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"}),await v.resetToRemote(v.currentBranch)&&(v.fetchStatus(),v.fetchLog())}catch(o){o!=="cancel"&&n({message:`重置到远程分支失败: ${o.message}`,type:"error"})}}function f(){p.value="",z.value="",Q.value="",A.value=""}function I(){B.value=L.value,R.value=!0}async function de(){if(!B.value.trim()){n({message:"请输入默认提交信息",type:"warning"});return}try{await x.saveDefaultMessage(B.value)&&(L.value=B.value,O.value=`输入提交信息 (默认: ${B.value})`,R.value=!1)}catch(o){n({message:`保存默认提交信息失败: ${o.message}`,type:"error"})}}const Ie=Ee(()=>v.fileList.some(o=>["modified","deleted","untracked"].includes(o.type))),Me=Ee(()=>v.fileList.filter(o=>["modified","deleted","untracked"].includes(o.type)).length),Le=Ee(()=>v.fileList.filter(o=>o.type==="added").length),Re=Ee(()=>Le.value>0),Ze=Ee(()=>v.fileList.length>0),He=Ee(()=>v.branchAhead>0),nt=Ee(()=>v.branchBehind>0),pt=Ee(()=>v.hasUpstream&&(He.value||Re.value&&le.value.trim())),$t=Ee(()=>Re.value),Rt=Ee(()=>v.hasUpstream&&(He.value||nt.value||Ze.value));async function vt(){if(!B.value.trim()){n({message:"请输入模板内容",type:"warning"});return}try{if(V.value)await d();else{if(Ve.value.includes(B.value)){n({message:"该模板已存在",type:"warning"});return}Ve.value.push(B.value);const t=await(await fetch("/api/config/save-template",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({template:B.value,type:"message"})})).json();t.success?(n({message:"提交信息模板保存成功!",type:"success"}),B.value=""):n({message:"模板保存失败: "+t.error,type:"error"})}}catch(o){n({message:"模板保存失败: "+o.message,type:"error"})}}async function d(){try{if(ue.value>=0){const o=fe.value,t=B.value;Ve.value[ue.value]=t;const F=await(await fetch("/api/config/update-template",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldTemplate:o,newTemplate:t,type:"message"})})).json();F.success?(n({message:"提交信息模板更新成功!",type:"success"}),V.value=!1,fe.value="",ue.value=-1,B.value=""):n({message:"模板更新失败: "+F.error,type:"error"})}}catch(o){n({message:"模板更新失败: "+o.message,type:"error"})}}function r(o,t){V.value=!0,fe.value=o,ue.value=t,B.value=o}function _(){V.value=!1,fe.value="",ue.value=-1,B.value=""}async function $(o){try{const t=Ve.value.indexOf(o);t!==-1&&Ve.value.splice(t,1);const F=await(await fetch("/api/config/delete-template",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({template:o,type:"message"})})).json();F.success?n({message:"提交信息模板删除成功!",type:"success"}):n({message:"模板删除失败: "+F.error,type:"error"})}catch(t){n({message:"模板删除失败: "+t.message,type:"error"})}}function we(o){p.value=o,B.value=o}bt(async()=>{const o=localStorage.getItem("zen-gitsync-standard-commit");o!==null&&(U.value=o==="true");const t=localStorage.getItem("zen-gitsync-skip-hooks");t!==null&&(ne.value=t==="true"),Ke(()=>x.config,Pe,{immediate:!0}),x.config||await x.loadConfig()});function ce(){E.value="",se.value={noFf:!1,squash:!1,noCommit:!1,message:""},re.value=!0,v.allBranches.length===0&&v.getAllBranches()}async function te(){if(!E.value){n({message:"请选择要合并的分支",type:"warning"});return}try{await v.mergeBranch(E.value,se.value)&&(re.value=!1,await v.fetchStatus(),await v.fetchLog(!1))}catch(o){console.error("合并分支操作发生错误:",o)}}return(o,t)=>{const ke=At,F=ts,he=Jt,Z=Ut,ie=Ot,G=je,k=Tt,P=xt,it=as,rt=gs,tt=ls,ct=Bt,Ct=Lt,mt=ns,ut=hs,Et=os;return m(),w("div",{class:Xe(["card",{"is-pushing":l(v).isPushing}])},[t[77]||(t[77]=e("div",{class:"card-header"},[e("h2",null,"提交更改")],-1)),s(It,{name:"el-fade-in-linear"},{default:a(()=>[l(v).isPushing?(m(),w("div",Ta,t[22]||(t[22]=[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}),s(It,{name:"el-fade-in-linear"},{default:a(()=>[g.value?(m(),w("div",xa,[s(ke,{class:"push-success-icon"},{default:a(()=>[s(l(qt))]),_:1}),t[23]||(t[23]=e("div",{class:"push-success-text"},"推送成功!",-1))])):q("",!0)]),_:1}),e("div",Va,[e("div",La,[l(v).userName===""||l(v).userEmail===""?(m(),w("div",Aa,[s(F,{title:"Git用户信息未配置",type:"warning",closable:!1,"show-icon":""},{default:a(()=>t[24]||(t[24]=[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})])):(m(),w(Te,{key:1},[e("div",Ba,[e("div",Ma,[e("div",Ra,[e("div",Ea,[s(he,{modelValue:U.value,"onUpdate:modelValue":t[0]||(t[0]=C=>U.value=C),"active-text":"标准化提交","inactive-text":"普通提交"},null,8,["modelValue"])]),e("div",za,[s(Z,{content:"跳过 Git 钩子检查 (--no-verify)",placement:"top"},{default:a(()=>[s(he,{modelValue:ne.value,"onUpdate:modelValue":t[1]||(t[1]=C=>ne.value=C),"active-text":"跳过钩子 (--no-verify)"},null,8,["modelValue"])]),_:1})])])]),U.value?(m(),w("div",Ha,[e("div",Xa,[e("div",Wa,[s(P,{modelValue:H.value,"onUpdate:modelValue":t[3]||(t[3]=C=>H.value=C),placeholder:"提交类型",class:"type-select",clearable:""},{default:a(()=>[(m(),w(Te,null,Ge(Se,C=>s(k,{key:C.value,label:C.label,value:C.value},null,8,["label","value"])),64))]),_:1},8,["modelValue"]),e("div",Ja,[s(ie,{modelValue:oe.value,"onUpdate:modelValue":t[4]||(t[4]=C=>oe.value=C),placeholder:"作用域(可选)",class:"scope-input",clearable:""},null,8,["modelValue"]),s(G,{type:"primary",icon:l(wt),circle:"",size:"small",class:"settings-button",onClick:me},null,8,["icon"])])]),e("div",qa,[s(ie,{modelValue:z.value,"onUpdate:modelValue":t[5]||(t[5]=C=>z.value=C),placeholder:"简短描述(必填)",class:"description-input",clearable:""},null,8,["modelValue"]),s(G,{type:"primary",icon:l(wt),circle:"",size:"small",class:"settings-button",onClick:j},null,8,["icon"])])]),e("div",{class:"advanced-options-toggle",onClick:t[6]||(t[6]=C=>xe.value=!xe.value)},[e("span",null,M(xe.value?"收起":"正文及页脚"),1),s(ke,{class:Xe(["toggle-icon",{"is-active":xe.value}])},{default:a(()=>[s(l(Qt))]),_:1},8,["class"])]),ft(e("div",Ya,[s(ie,{modelValue:Q.value,"onUpdate:modelValue":t[7]||(t[7]=C=>Q.value=C),type:"textarea",rows:4,placeholder:"正文(可选):详细描述本次提交的内容和原因",class:"body-input",clearable:""},null,8,["modelValue"]),s(ie,{modelValue:A.value,"onUpdate:modelValue":t[8]||(t[8]=C=>A.value=C),placeholder:"页脚(可选):如 Closes #123",class:"footer-input",clearable:""},null,8,["modelValue"])],512),[[ss,xe.value]]),e("div",Za,[t[29]||(t[29]=e("div",{class:"preview-title",style:{"margin-top":"10px"}},"Git提交命令预览:",-1)),e("pre",Ka,M(Ue.value),1)]),e("div",Qa,[e("div",el,[s(G,{type:"primary",onClick:ye,loading:l(v).isLoadingStatus,disabled:!Re.value||!le.value.trim()},{default:a(()=>[t[30]||(t[30]=b(" 提交 ")),Le.value>0?(m(),w("span",tl,"("+M(Le.value)+")",1)):q("",!0)]),_:1},8,["loading","disabled"]),s(G,{type:"primary",icon:l(zt),onClick:Be,loading:l(v).isPushing,disabled:!pt.value,style:yt(He.value?{backgroundColor:"#67c23a",borderColor:"#67c23a"}:{})},{default:a(()=>[t[31]||(t[31]=b(" 推送 ")),He.value?(m(),w("span",sl,"("+M(l(v).branchAhead)+")",1)):q("",!0)]),_:1},8,["icon","loading","disabled","style"])]),s(G,{type:"success",icon:l(Dt),onClick:Ye,loading:l(v).isAddingFiles||l(v).isCommiting||l(v).isPushing,disabled:!Ze.value||!le.value.trim()||!l(v).hasUpstream,class:"full-width-button"},{default:a(()=>t[32]||(t[32]=[b(" 一键推送所有 ")])),_:1},8,["icon","loading","disabled"])])])):(m(),w("div",Da,[e("div",Ga,[s(ie,{modelValue:p.value,"onUpdate:modelValue":t[2]||(t[2]=C=>p.value=C),placeholder:O.value,type:"textarea",rows:6,resize:"none",class:"commit-message-input"},null,8,["modelValue","placeholder"]),e("div",ja,[s(G,{type:"primary",icon:l(wt),circle:"",size:"small",class:"settings-button",onClick:I},null,8,["icon"])])]),e("div",Ua,[t[25]||(t[25]=e("div",{class:"preview-title"},"Git提交命令预览:",-1)),e("pre",Pa,'git commit -m "'+M(le.value||"<提交信息>")+'"'+M(ne.value?" --no-verify":""),1)]),e("div",Oa,[e("div",Fa,[s(G,{type:"primary",onClick:ye,loading:l(v).isLoadingStatus,disabled:!Re.value||!le.value.trim()},{default:a(()=>[t[26]||(t[26]=b(" 提交 ")),Le.value>0?(m(),w("span",Na,"("+M(Le.value)+")",1)):q("",!0)]),_:1},8,["loading","disabled"]),s(G,{type:"primary",icon:l(zt),onClick:Be,loading:l(v).isPushing,disabled:!pt.value,style:yt(He.value?{backgroundColor:"#67c23a",borderColor:"#67c23a"}:{})},{default:a(()=>[t[27]||(t[27]=b(" 推送 ")),He.value?(m(),w("span",Ia,"("+M(l(v).branchAhead)+")",1)):q("",!0)]),_:1},8,["icon","loading","disabled","style"])]),s(G,{type:"success",icon:l(Dt),onClick:Ye,loading:l(v).isAddingFiles||l(v).isCommiting||l(v).isPushing,disabled:!Ze.value||!le.value.trim()||!l(v).hasUpstream,class:"full-width-button"},{default:a(()=>t[28]||(t[28]=[b(" 一键推送所有 ")])),_:1},8,["icon","loading","disabled"])])]))]),e("div",al,[t[47]||(t[47]=e("h3",null,"Git 操作",-1)),e("div",ll,[e("div",ol,[e("div",nl,[t[38]||(t[38]=e("div",{class:"group-title"},"基础操作",-1)),e("div",il,[s(Z,{content:Ie.value?`暂存${Me.value}个待更改文件`:"git add .",placement:"top",effect:"light","popper-class":"git-cmd-tooltip"},{default:a(()=>[s(G,{type:"primary",onClick:Ae,loading:l(v).isAddingFiles,disabled:!Ie.value,class:"action-button"},{default:a(()=>[t[33]||(t[33]=b(" 暂存更改 ")),Me.value>0?(m(),w("span",rl,"("+M(Me.value)+")",1)):q("",!0)]),_:1},8,["loading","disabled"])]),_:1},8,["content"]),s(Z,{content:Re.value?`提交${Le.value}个已暂存文件`:"git commit",placement:"top",effect:"light","popper-class":"git-cmd-tooltip"},{default:a(()=>[s(G,{type:"primary",onClick:ye,loading:l(v).isLoadingStatus,disabled:!Re.value||!le.value.trim(),class:"action-button"},{default:a(()=>[t[34]||(t[34]=b(" 提交 ")),Le.value>0?(m(),w("span",cl,"("+M(Le.value)+")",1)):q("",!0)]),_:1},8,["loading","disabled"])]),_:1},8,["content"]),s(Z,{content:He.value?`推送${l(v).branchAhead}个本地提交`:"git push",placement:"top",effect:"light","popper-class":"git-cmd-tooltip"},{default:a(()=>[s(G,{type:"primary",icon:l(zt),onClick:Be,loading:l(v).isPushing,disabled:!pt.value,class:Xe(["action-button","push-button",{"is-loading":l(v).isPushing}]),style:yt(He.value?{backgroundColor:"#67c23a !important",borderColor:"#67c23a !important"}:{})},{default:a(()=>[t[35]||(t[35]=b(" 推送 ")),He.value?(m(),w("span",ul,"("+M(l(v).branchAhead)+")",1)):q("",!0)]),_:1},8,["icon","loading","disabled","class","style"])]),_:1},8,["content"]),s(Z,{content:nt.value?`拉取${l(v).branchBehind}个远程提交`:"git pull",placement:"top",effect:"light","popper-class":"git-cmd-tooltip"},{default:a(()=>[s(G,{type:"primary",icon:l(Yt),onClick:Ce,loading:l(v).isGitPulling,disabled:!l(v).hasUpstream,class:"action-button",style:yt(nt.value?{color:"white",backgroundColor:"#E6A23C",borderColor:"#E6A23C"}:{})},{default:a(()=>[t[36]||(t[36]=b(" 拉取 ")),nt.value?(m(),w("span",dl,"("+M(l(v).branchBehind)+")",1)):q("",!0)]),_:1},8,["icon","loading","disabled","style"])]),_:1},8,["content"]),s(Z,{content:"git fetch --all",placement:"top",effect:"light","popper-class":"git-cmd-tooltip"},{default:a(()=>[s(G,{type:"info",icon:l(Zt),onClick:be,loading:l(v).isGitFetching,class:"action-button"},{default:a(()=>t[37]||(t[37]=[b(" 获取所有远程分支 ")])),_:1},8,["icon","loading"])]),_:1})])]),e("div",fl,[t[41]||(t[41]=e("div",{class:"group-title"},"组合操作",-1)),e("div",pl,[s(Z,{content:"git add + git commit",placement:"top",effect:"light","popper-class":"git-cmd-tooltip"},{default:a(()=>[s(G,{type:"primary",icon:l(kt),onClick:ot,loading:l(v).isAddingFiles||l(v).isCommiting,disabled:!Ie.value||!le.value.trim(),class:"action-button"},{default:a(()=>t[39]||(t[39]=[b(" 暂存并提交 ")])),_:1},8,["icon","loading","disabled"])]),_:1}),s(Z,{content:"git add + git commit + git push",placement:"top",effect:"light","popper-class":"git-cmd-tooltip"},{default:a(()=>[s(G,{type:"success",icon:l(Dt),onClick:Ye,loading:l(v).isAddingFiles||l(v).isCommiting||l(v).isPushing,disabled:!Ze.value||!le.value.trim()||!l(v).hasUpstream,class:Xe(["action-button","one-click-push",{"is-loading":l(v).isAddingFiles||l(v).isCommiting||l(v).isPushing}])},{default:a(()=>t[40]||(t[40]=[b(" 一键推送所有 ")])),_:1},8,["icon","loading","disabled","class"])]),_:1})])])]),e("div",vl,[t[44]||(t[44]=e("div",{class:"group-title"},"重置操作",-1)),e("div",ml,[s(Z,{content:$t.value?`撤销${Le.value}个已暂存文件`:"git reset HEAD",placement:"top",effect:"light","popper-class":"git-cmd-tooltip"},{default:a(()=>[s(G,{type:"warning",icon:l(Pt),onClick:l(v).resetHead,loading:l(v).isResetting,disabled:!$t.value,class:"action-button reset-button"},{default:a(()=>[t[42]||(t[42]=b(" 重置暂存区 ")),Le.value>0?(m(),w("span",gl,"("+M(Le.value)+")",1)):q("",!0)]),_:1},8,["icon","onClick","loading","disabled"])]),_:1},8,["content"]),s(Z,{content:"git reset --hard origin/branch",placement:"top",effect:"light","popper-class":"git-cmd-tooltip"},{default:a(()=>[s(G,{type:"danger",icon:l(vs),onClick:c,loading:l(v).isResetting,disabled:!Rt.value,class:"action-button danger-button"},{default:a(()=>t[43]||(t[43]=[b(" 重置到远程 ")])),_:1},8,["icon","loading","disabled"])]),_:1})])]),e("div",hl,[t[46]||(t[46]=e("div",{class:"group-title"},"分支操作",-1)),e("div",yl,[s(Z,{content:"合并其他分支到当前分支",placement:"top",effect:"light","popper-class":"git-cmd-tooltip"},{default:a(()=>[s(G,{type:"primary",icon:l(ms),onClick:ce,loading:l(v).isGitMerging,class:"action-button merge-button"},{default:a(()=>t[45]||(t[45]=[b(" 合并分支 ")])),_:1},8,["icon","loading"])]),_:1})])])])])],64))]),s(ct,{title:"简短描述模板设置",modelValue:Y.value,"onUpdate:modelValue":t[10]||(t[10]=C=>Y.value=C),width:"80vw",top:"70px",style:{height:"calc(100vh - 140px)"},"close-on-click-modal":!1,class:"template-dialog"},{default:a(()=>[e("div",wl,[e("div",_l,[s(ie,{modelValue:X.value,"onUpdate:modelValue":t[9]||(t[9]=C=>X.value=C),placeholder:K.value?"编辑模板内容":"输入新模板内容",class:"template-input",clearable:""},null,8,["modelValue","placeholder"]),e("div",bl,[K.value?(m(),ae(G,{key:0,onClick:Je},{default:a(()=>t[48]||(t[48]=[b("取消")])),_:1})):q("",!0),s(G,{type:"primary",onClick:Oe,disabled:!X.value.trim()},{default:a(()=>[b(M(K.value?"更新模板":"添加模板"),1)]),_:1},8,["disabled"])])]),e("div",$l,[t[52]||(t[52]=e("h3",null,"已保存模板",-1)),S.value.length===0?(m(),ae(it,{key:0,description:"暂无保存的模板"})):q("",!0),(m(!0),w(Te,null,Ge(S.value,(C,st)=>(m(),ae(tt,{key:st,class:"template-item"},{default:a(()=>[s(rt,{justify:"space-between",align:"middle",style:{width:"100%"}},{default:a(()=>[e("div",Cl,M(C),1),e("div",kl,[s(G,{type:"primary",size:"small",onClick:at=>i(C)},{default:a(()=>t[49]||(t[49]=[b("使用")])),_:2},1032,["onClick"]),s(G,{type:"warning",size:"small",icon:l(kt),onClick:at=>lt(C,st)},{default:a(()=>t[50]||(t[50]=[b("编辑")])),_:2},1032,["icon","onClick"]),s(G,{type:"danger",size:"small",onClick:at=>Ne(C)},{default:a(()=>t[51]||(t[51]=[b("删除")])),_:2},1032,["onClick"])])]),_:2},1024)]),_:2},1024))),128))])])]),_:1},8,["modelValue"]),s(ct,{title:"作用域模板设置",modelValue:pe.value,"onUpdate:modelValue":t[12]||(t[12]=C=>pe.value=C),width:"80vw",top:"70px",style:{height:"calc(100vh - 140px)"},"close-on-click-modal":!1,class:"template-dialog"},{default:a(()=>[e("div",Sl,[e("div",Tl,[s(ie,{modelValue:ee.value,"onUpdate:modelValue":t[11]||(t[11]=C=>ee.value=C),placeholder:T.value?"编辑作用域模板内容":"输入新作用域模板",class:"template-input",clearable:""},null,8,["modelValue","placeholder"]),e("div",xl,[T.value?(m(),ae(G,{key:0,onClick:ve},{default:a(()=>t[53]||(t[53]=[b("取消")])),_:1})):q("",!0),s(G,{type:"primary",onClick:et,disabled:!ee.value.trim()},{default:a(()=>[b(M(T.value?"更新模板":"添加模板"),1)]),_:1},8,["disabled"])])]),e("div",Vl,[t[57]||(t[57]=e("h3",null,"已保存作用域",-1)),D.value.length===0?(m(),ae(it,{key:0,description:"暂无保存的作用域"})):q("",!0),(m(!0),w(Te,null,Ge(D.value,(C,st)=>(m(),ae(tt,{key:st,class:"template-item"},{default:a(()=>[s(rt,{justify:"space-between",align:"middle",style:{width:"100%"}},{default:a(()=>[e("div",Ll,M(C),1),e("div",Al,[s(G,{type:"primary",size:"small",onClick:at=>J(C)},{default:a(()=>t[54]||(t[54]=[b("使用")])),_:2},1032,["onClick"]),s(G,{type:"warning",size:"small",icon:l(kt),onClick:at=>ze(C,st)},{default:a(()=>t[55]||(t[55]=[b("编辑")])),_:2},1032,["icon","onClick"]),s(G,{type:"danger",size:"small",onClick:at=>y(C)},{default:a(()=>t[56]||(t[56]=[b("删除")])),_:2},1032,["onClick"])])]),_:2},1024)]),_:2},1024))),128))])])]),_:1},8,["modelValue"]),s(ct,{title:"默认提交信息设置",modelValue:R.value,"onUpdate:modelValue":t[14]||(t[14]=C=>R.value=C),width:"80vw",top:"70px",style:{height:"calc(100vh - 140px)"},"close-on-click-modal":!1,class:"message-template-dialog"},{default:a(()=>[e("div",Bl,[e("div",Ml,[s(ie,{modelValue:B.value,"onUpdate:modelValue":t[13]||(t[13]=C=>B.value=C),placeholder:V.value?"编辑模板内容":"输入新模板内容",class:"template-input",clearable:""},null,8,["modelValue","placeholder"]),e("div",Rl,[V.value?(m(),ae(G,{key:0,onClick:_},{default:a(()=>t[58]||(t[58]=[b("取消")])),_:1})):q("",!0),s(G,{type:"primary",onClick:vt,disabled:!B.value.trim()},{default:a(()=>[b(M(V.value?"更新模板":"添加模板"),1)]),_:1},8,["disabled"]),s(G,{type:"success",onClick:de,disabled:!B.value.trim()},{default:a(()=>t[59]||(t[59]=[b(" 设为默认提交信息 ")])),_:1},8,["disabled"])])]),e("div",El,[e("div",zl,[t[63]||(t[63]=e("h3",null,"已保存模板",-1)),e("div",Dl,[Ve.value.length===0?(m(),ae(it,{key:0,description:"暂无保存的模板"})):q("",!0),(m(!0),w(Te,null,Ge(Ve.value,(C,st)=>(m(),ae(tt,{key:st,class:"template-item"},{default:a(()=>[s(rt,{justify:"space-between",align:"middle",style:{width:"100%"}},{default:a(()=>[e("div",Gl,M(C),1),e("div",jl,[s(G,{type:"primary",size:"small",onClick:at=>we(C)},{default:a(()=>t[60]||(t[60]=[b("使用")])),_:2},1032,["onClick"]),s(G,{type:"warning",size:"small",icon:l(kt),onClick:at=>r(C,st)},{default:a(()=>t[61]||(t[61]=[b("编辑")])),_:2},1032,["icon","onClick"]),s(G,{type:"danger",size:"small",onClick:at=>$(C)},{default:a(()=>t[62]||(t[62]=[b("删除")])),_:2},1032,["onClick"])])]),_:2},1024)]),_:2},1024))),128))])]),e("div",Ul,[t[71]||(t[71]=e("h3",null,"当前默认提交信息",-1)),L.value?(m(),ae(tt,{key:0,class:"default-message-card"},{default:a(()=>[e("div",Pl,M(L.value),1)]),_:1})):(m(),ae(it,{key:1,description:"尚未设置默认提交信息","image-size":100})),e("div",Ol,[t[69]||(t[69]=e("h4",null,"关于默认提交信息",-1)),t[70]||(t[70]=e("p",null,"默认提交信息将在未输入提交信息时自动使用。",-1)),e("p",null,[t[66]||(t[66]=b("你可以通过点击左侧模板的")),s(Ct,{size:"small",type:"primary"},{default:a(()=>t[64]||(t[64]=[b("使用")])),_:1}),t[67]||(t[67]=b("按钮先选择喜欢的模板,然后点击上方")),s(Ct,{size:"small",type:"success"},{default:a(()=>t[65]||(t[65]=[b("设为默认提交信息")])),_:1}),t[68]||(t[68]=b("按钮保存。"))])])])])])]),_:1},8,["modelValue"]),s(ct,{title:"合并分支",modelValue:re.value,"onUpdate:modelValue":t[21]||(t[21]=C=>re.value=C),width:"500px","close-on-click-modal":!1,class:"merge-dialog"},{footer:a(()=>[e("div",Hl,[s(G,{onClick:t[20]||(t[20]=C=>re.value=!1)},{default:a(()=>t[75]||(t[75]=[b("取消")])),_:1}),s(G,{type:"primary",onClick:te,loading:l(v).isGitMerging,disabled:!E.value,class:"merge-confirm-btn"},{default:a(()=>t[76]||(t[76]=[b(" 合并 ")])),_:1},8,["loading","disabled"])])]),default:a(()=>[e("div",Fl,[e("p",Nl,"选择要合并到当前分支 ("+M(l(v).currentBranch)+") 的分支:",1),s(Et,{"label-position":"top"},{default:a(()=>[s(mt,{label:"选择分支"},{default:a(()=>[s(P,{modelValue:E.value,"onUpdate:modelValue":t[15]||(t[15]=C=>E.value=C),placeholder:"选择要合并的分支",style:{width:"100%"},filterable:""},{default:a(()=>[(m(!0),w(Te,null,Ge(l(v).allBranches.filter(C=>C!==l(v).currentBranch),C=>(m(),ae(k,{key:C,label:C,value:C},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])]),_:1}),s(mt,{label:"合并选项"},{default:a(()=>[e("div",Il,[s(ut,{modelValue:se.value.noFf,"onUpdate:modelValue":t[16]||(t[16]=C=>se.value.noFf=C)},{default:a(()=>[s(Z,{content:"创建合并提交,即使可以使用快进合并",placement:"top"},{default:a(()=>t[72]||(t[72]=[e("span",null,"禁用快进合并 (--no-ff)",-1)])),_:1})]),_:1},8,["modelValue"]),s(ut,{modelValue:se.value.squash,"onUpdate:modelValue":t[17]||(t[17]=C=>se.value.squash=C)},{default:a(()=>[s(Z,{content:"将多个提交压缩为一个提交",placement:"top"},{default:a(()=>t[73]||(t[73]=[e("span",null,"压缩提交 (--squash)",-1)])),_:1})]),_:1},8,["modelValue"]),s(ut,{modelValue:se.value.noCommit,"onUpdate:modelValue":t[18]||(t[18]=C=>se.value.noCommit=C)},{default:a(()=>[s(Z,{content:"执行合并但不自动创建提交",placement:"top"},{default:a(()=>t[74]||(t[74]=[e("span",null,"不自动提交 (--no-commit)",-1)])),_:1})]),_:1},8,["modelValue"])])]),_:1}),se.value.noFf&&!se.value.noCommit?(m(),ae(mt,{key:0,label:"合并提交信息 (可选)"},{default:a(()=>[s(ie,{modelValue:se.value.message,"onUpdate:modelValue":t[19]||(t[19]=C=>se.value.message=C),type:"textarea",rows:3,placeholder:"输入自定义合并提交信息"},null,8,["modelValue"])]),_:1})):q("",!0)]),_:1})])]),_:1},8,["modelValue"])])],2)}}}),Wl=Mt(Xl,[["__scopeId","data-v-33800bb9"]]),Jl={class:"card"},ql={key:0,class:"refresh-notification"},Yl={class:"log-header"},Zl={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,class:"content-area-content"},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=["id"],mo=["onClick"],go={class:"author-name"},ho={key:0,class:"branch-container"};const yo={class:"commit-detail-container"},wo={key:0,class:"commit-info"},_o={class:"commit-info-header"},bo={class:"info-item"},$o={class:"item-value"},Co={class:"info-item"},ko={class:"item-value"},So={class:"info-item"},To={class:"item-value"},xo={class:"commit-message-container"},Vo=["innerHTML"],Lo={class:"commit-files-diff"},Ao={class:"files-list"},Bo={key:1},Mo=["onClick"],Ro={class:"file-diff"},Eo={key:0},zo={key:1},Do=["innerHTML"],ht=.5,St=1.5,jt=.1,Go=Vt({__name:"LogList",setup($e,{expose:v}){const x=_t();let p=[];const g=u(p),O=u(""),L=u(!1),U=Ee(()=>x.isLoadingLog||L.value),H=u(!1),oe=u(0),z=u(!1),Q=u(null),A=u(1),S=u(!0),Y=u(!1),X=u(null),K=u(!1),N=u(null),_e=u([]),re=u(""),E=u(!1),se=u(""),D=u(1),pe=u(!1),ee=u(!1),T=u([]),h=u(""),W=u(null),R=u([]),B=u([]),ne=u([]),xe=u(!1),Se=u(0),Ve=u(0),V=u(null),fe=u(new Map),ue=u([]),le=u(1),Ue=u(new Map),Pe=Ee(()=>g.value);async function Oe(d=!1,r=1){if(!_t().isGitRepo){O.value="当前目录不是Git仓库";return}try{r>1?Y.value=!0:L.value=!0,console.log(`加载提交历史: page=${r}, all=${d}`);const $=new URLSearchParams;$.append("page",r.toString()),$.append("all",d.toString()),$.append("with_parents","true"),T.value.length>0&&$.append("author",T.value.join(",")),B.value.length>0&&$.append("branch",B.value.join(",")),h.value&&$.append("message",h.value),W.value&&Array.isArray(W.value)&&W.value.length===2&&($.append("dateFrom",W.value[0]),$.append("dateTo",W.value[1])),$.append("_t",Date.now().toString());const ce=await(await fetch(`/api/log?${$.toString()}`)).json();if(!ce||!ce.data||!Array.isArray(ce.data)){console.error("API返回的数据格式不正确:",ce),O.value="加载提交历史失败: 服务器返回数据格式不正确";return}const te=r>1;te?ce.data.forEach(o=>p.push(o)):(p.length=0,ce.data.forEach(o=>p.push(o))),g.value=[...p],A.value=r,oe.value=ce.total||p.length,S.value=ce.hasMore===!0,console.log(`加载完成: 当前页=${A.value}, 是否有更多=${S.value}, 总条数=${oe.value}`),S.value||console.log("已加载所有提交记录"),te||(pe.value=!0,setTimeout(()=>{pe.value=!1},2e3)),!te&&z.value?setTimeout(Fe,0):!te&&!z.value&&!d&&We(()=>{y(),setTimeout(vt,200)}),O.value=""}catch($){O.value="加载提交历史失败: "+($ instanceof Error?$.message:String($)),console.error("加载日志失败:",$),r>1&&(S.value=!1)}finally{r>1?Y.value=!1:L.value=!1}}async function Fe(){if(console.log(`开始渲染图表...数据长度: ${p.length}`),!Q.value){console.error("图表容器未找到");return}if(p.length===0){console.error("没有日志数据可渲染");return}try{Q.value.innerHTML="",console.log(`创建gitgraph实例,分支: ${x.currentBranch||"main"}`);const d=As(Q.value,{orientation:"vertical-reverse",template:"metro",author:"提交者 <committer@example.com>"}),r={},_=d.branch(x.currentBranch||"main");r[x.currentBranch||"main"]=_,console.log(`开始创建提交图...共${p.length}条提交`),p.forEach(($,we)=>{let ce=_;if($.branch){const te=et($.branch.split(",")[0]);r[te]||(r[te]=d.branch(te)),ce=r[te]}ce.commit({hash:$.hash,subject:$.message,author:`${$.author} <${$.email}>`}),we%10===0&&console.log(`已渲染 ${we+1}/${p.length} 个提交`)}),console.log("图表渲染完成"),setTimeout(()=>{Be()},100)}catch(d){console.error("渲染图表失败:",d),O.value="渲染图表失败: "+(d instanceof Error?d.message:String(d))}}function lt(){z.value=!z.value,z.value&&p.length>0&&setTimeout(Fe,0)}function Je(){H.value=!H.value,H.value||(S.value=!0),A.value=1,Oe(H.value),We(()=>{setTimeout(()=>{!z.value&&!H.value&&(y(),vt())},300)})}function et(d){return d.includes("HEAD -> ")?d.replace("HEAD -> ",""):d.includes("origin/")?d:d.trim()}function qe(d){return d.includes("HEAD")?"success":d.includes("origin/")?"warning":"info"}const ze=u(null),ve=u(null);function Ne(d){if(z.value||!S.value||Y.value||U.value)return;const r=d.target,{scrollTop:_,scrollHeight:$,clientHeight:we}=r,ce=$-_-we;console.log("表格滚动:",{scrollTop:_,scrollHeight:$,clientHeight:we,scrollDistance:ce,hasMoreData:S.value,isLoadingMore:Y.value,isLoading:U.value}),ce<=20&&(console.log("已滚动到底部,加载更多数据"),c())}function y(){if(console.log("设置表格滚动监听 - 开始"),!ze.value){console.error("tableRef.value 不存在");return}const d=ze.value.$el.querySelector(".el-table__body-wrapper");if(!d){console.error("未找到表格的body-wrapper元素");return}console.log("找到表格的body-wrapper元素"),ve.value=d,ve.value&&(ve.value.removeEventListener("scroll",Ne,!0),ve.value.addEventListener("scroll",Ne,!0),console.log("成功添加表格滚动监听"))}function i(){console.log("移除表格滚动监听 - 开始"),ve.value?(ve.value.removeEventListener("scroll",Ne,!0),console.log("成功移除表格滚动监听"),ve.value=null):console.log("tableBodyWrapper.value 不存在,无需移除监听")}bt(()=>{x.isGitRepo?(x.log.length>0?(console.log("使用已加载的日志数据"),p.length=0,x.log.forEach(d=>p.push(d)),oe.value=x.log.length,z.value?setTimeout(()=>{console.log(`准备渲染图表,数据长度: ${p.length}`),Fe()},100):setTimeout(()=>{Me()},100)):(console.log("初始加载日志数据"),Oe()),de()):O.value="当前目录不是Git仓库",We(()=>{setTimeout(()=>{y()},500)}),We(()=>{setTimeout(()=>{z.value||Me()},500)}),Ke(()=>ze.value,d=>{d&&!z.value&&!H.value&&(console.log("表格引用已创建,设置滚动监听"),We(()=>{y()}))})}),Ke(()=>x.allBranches,d=>{d&&d.length>0?(ne.value=[...d].sort(),console.log(`分支数据更新,共 ${ne.value.length} 个分支`)):(ne.value=[],console.warn("gitStore 中没有分支数据"))},{immediate:!0}),ys(()=>{i(),X.value!==null&&(window.clearInterval(X.value),X.value=null)});function J(d,r){let _=null;return function(...$){_&&clearTimeout(_),_=window.setTimeout(()=>{d(...$),_=null},r)}}const j=J(Me,200);async function me(){await x.fetchLog(!0),p.length=0,x.log.forEach(d=>p.push(d)),g.value=[...p],oe.value=x.log.length,A.value=1,S.value=!1,pe.value=!0,setTimeout(()=>{pe.value=!1},2e3),z.value?(await We(),Fe()):(fe.value.clear(),ue.value=[],le.value=1,await We(),j())}Ke(()=>x.log,d=>{console.log("监听到gitStore.log变化,更新图表数据");try{p.length=0,Array.isArray(d)&&d.forEach(r=>r&&p.push(r)),oe.value=p.length,A.value=1,g.value=[...p],pe.value=!0,setTimeout(()=>{pe.value=!1},2e3),console.log(`数据更新完成,共${g.value.length}条记录,准备渲染图表`),z.value&&p.length>0&&setTimeout(Fe,0)}catch(r){console.error("更新日志数据失败:",r)}},{immediate:!0}),v({refreshLog:me});function Ae(){D.value<St&&(D.value=Math.min(St,D.value+jt),ge())}function ye(){D.value>ht&&(D.value=Math.max(ht,D.value-jt),ge())}function ge(){if(!Q.value)return;const d=Q.value.querySelector("svg");d&&(d.style.transform=`scale(${D.value})`,d.style.transformOrigin="top left")}function Be(){if(!Q.value)return;const d=Q.value.querySelector("svg");if(!d)return;const r=d.getBoundingClientRect().width/D.value,_=Q.value.clientWidth;r>_?D.value=Math.max(ht,_/r):D.value=1,ge()}async function Ce(d){if(d){N.value=d,K.value=!0,E.value=!0,_e.value=[],re.value="",se.value="",console.log("提交详情对象:",JSON.stringify(d,null,2)),console.log("哈希值类型和长度:",typeof d.hash,d.hash?d.hash.length:0),console.log("提交信息类型和长度:",typeof d.message,d.message?d.message.length:0),console.log("提交分支:",d.branch);try{if(console.log(`获取提交详情: ${d.hash}`),!d.hash||d.hash.length<7){console.error("无效的提交哈希值:",d.hash),re.value="无效的提交哈希值",E.value=!1;return}const r=await fetch(`/api/commit-files?hash=${d.hash}`);console.log("API响应状态: ",r.status);const _=await r.json();console.log("文件列表数据: ",_),_.success&&Array.isArray(_.files)?(_e.value=_.files,_e.value.length>0?await be(d.hash,_e.value[0]):(console.log("没有找到变更文件"),re.value="该提交没有变更文件")):(console.error("获取提交文件列表失败:",_.error||"未知错误"),re.value=`获取文件列表失败: ${_.error||"未知错误"}`)}catch(r){console.error("获取提交详情失败:",r),re.value=`获取提交详情失败: ${r.message}`}finally{E.value=!1}}}async function be(d,r){E.value=!0,se.value=r;try{console.log(`获取文件差异: hash=${d}, file=${r}`);const _=await fetch(`/api/commit-file-diff?hash=${d}&file=${encodeURIComponent(r)}`);console.log("差异API响应状态: ",_.status);const $=await _.json();console.log("差异数据: ",$.success,typeof $.diff),$.success?re.value=$.diff||"没有变更内容":(console.error("获取差异失败: ",$.error),re.value=`获取差异失败: ${$.error||"未知错误"}`)}catch(_){console.error("获取文件差异失败:",_),re.value=`获取差异失败: ${_.message}`}finally{E.value=!1}}function ot(d){if(!d)return"";const r=d.split(`
|
|
19
|
+
git config --global user.email "your.email@example.com"`,-1)])),_:1})])):(m(),w(Te,{key:1},[e("div",Ba,[e("div",Ma,[e("div",Ra,[e("div",Ea,[s(he,{modelValue:U.value,"onUpdate:modelValue":t[0]||(t[0]=C=>U.value=C),"active-text":"标准化提交","inactive-text":"普通提交"},null,8,["modelValue"])]),e("div",za,[s(Z,{content:"跳过 Git 钩子检查 (--no-verify)",placement:"top"},{default:a(()=>[s(he,{modelValue:ne.value,"onUpdate:modelValue":t[1]||(t[1]=C=>ne.value=C),"active-text":"跳过钩子 (--no-verify)"},null,8,["modelValue"])]),_:1})])])]),U.value?(m(),w("div",Ha,[e("div",Xa,[e("div",Wa,[s(P,{modelValue:H.value,"onUpdate:modelValue":t[3]||(t[3]=C=>H.value=C),placeholder:"提交类型",class:"type-select",clearable:""},{default:a(()=>[(m(),w(Te,null,Ge(Se,C=>s(k,{key:C.value,label:C.label,value:C.value},null,8,["label","value"])),64))]),_:1},8,["modelValue"]),e("div",Ja,[s(ie,{modelValue:oe.value,"onUpdate:modelValue":t[4]||(t[4]=C=>oe.value=C),placeholder:"作用域(可选)",class:"scope-input",clearable:""},null,8,["modelValue"]),s(G,{type:"primary",icon:l(wt),circle:"",size:"small",class:"settings-button",onClick:me},null,8,["icon"])])]),e("div",qa,[s(ie,{modelValue:z.value,"onUpdate:modelValue":t[5]||(t[5]=C=>z.value=C),placeholder:"简短描述(必填)",class:"description-input",clearable:""},null,8,["modelValue"]),s(G,{type:"primary",icon:l(wt),circle:"",size:"small",class:"settings-button",onClick:j},null,8,["icon"])])]),e("div",{class:"advanced-options-toggle",onClick:t[6]||(t[6]=C=>xe.value=!xe.value)},[e("span",null,M(xe.value?"收起":"正文及页脚"),1),s(ke,{class:Xe(["toggle-icon",{"is-active":xe.value}])},{default:a(()=>[s(l(Qt))]),_:1},8,["class"])]),ft(e("div",Ya,[s(ie,{modelValue:Q.value,"onUpdate:modelValue":t[7]||(t[7]=C=>Q.value=C),type:"textarea",rows:4,placeholder:"正文(可选):详细描述本次提交的内容和原因",class:"body-input",clearable:""},null,8,["modelValue"]),s(ie,{modelValue:A.value,"onUpdate:modelValue":t[8]||(t[8]=C=>A.value=C),placeholder:"页脚(可选):如 Closes #123",class:"footer-input",clearable:""},null,8,["modelValue"])],512),[[ss,xe.value]]),e("div",Za,[t[29]||(t[29]=e("div",{class:"preview-title",style:{"margin-top":"10px"}},"Git提交命令预览:",-1)),e("pre",Ka,M(Ue.value),1)]),e("div",Qa,[e("div",el,[s(G,{type:"primary",onClick:ye,loading:l(v).isLoadingStatus,disabled:!Re.value||!le.value.trim()},{default:a(()=>[t[30]||(t[30]=b(" 提交 ")),Le.value>0?(m(),w("span",tl,"("+M(Le.value)+")",1)):q("",!0)]),_:1},8,["loading","disabled"]),s(G,{type:"primary",icon:l(zt),onClick:Be,loading:l(v).isPushing,disabled:!pt.value,style:yt(He.value?{backgroundColor:"#67c23a",borderColor:"#67c23a"}:{})},{default:a(()=>[t[31]||(t[31]=b(" 推送 ")),He.value?(m(),w("span",sl,"("+M(l(v).branchAhead)+")",1)):q("",!0)]),_:1},8,["icon","loading","disabled","style"])]),s(G,{type:"success",icon:l(Dt),onClick:Ye,loading:l(v).isAddingFiles||l(v).isCommiting||l(v).isPushing,disabled:!Ze.value||!le.value.trim()||!l(v).hasUpstream,class:"full-width-button"},{default:a(()=>t[32]||(t[32]=[b(" 一键推送所有 ")])),_:1},8,["icon","loading","disabled"])])])):(m(),w("div",Da,[e("div",Ga,[s(ie,{modelValue:p.value,"onUpdate:modelValue":t[2]||(t[2]=C=>p.value=C),placeholder:O.value,type:"textarea",rows:6,resize:"none",class:"commit-message-input"},null,8,["modelValue","placeholder"]),e("div",ja,[s(G,{type:"primary",icon:l(wt),circle:"",size:"small",class:"settings-button",onClick:I},null,8,["icon"])])]),e("div",Ua,[t[25]||(t[25]=e("div",{class:"preview-title"},"Git提交命令预览:",-1)),e("pre",Pa,'git commit -m "'+M(le.value||"<提交信息>")+'"'+M(ne.value?" --no-verify":""),1)]),e("div",Oa,[e("div",Fa,[s(G,{type:"primary",onClick:ye,loading:l(v).isLoadingStatus,disabled:!Re.value||!le.value.trim()},{default:a(()=>[t[26]||(t[26]=b(" 提交 ")),Le.value>0?(m(),w("span",Na,"("+M(Le.value)+")",1)):q("",!0)]),_:1},8,["loading","disabled"]),s(G,{type:"primary",icon:l(zt),onClick:Be,loading:l(v).isPushing,disabled:!pt.value,style:yt(He.value?{backgroundColor:"#67c23a",borderColor:"#67c23a"}:{})},{default:a(()=>[t[27]||(t[27]=b(" 推送 ")),He.value?(m(),w("span",Ia,"("+M(l(v).branchAhead)+")",1)):q("",!0)]),_:1},8,["icon","loading","disabled","style"])]),s(G,{type:"success",icon:l(Dt),onClick:Ye,loading:l(v).isAddingFiles||l(v).isCommiting||l(v).isPushing,disabled:!Ze.value||!le.value.trim()||!l(v).hasUpstream,class:"full-width-button"},{default:a(()=>t[28]||(t[28]=[b(" 一键推送所有 ")])),_:1},8,["icon","loading","disabled"])])]))]),e("div",al,[t[47]||(t[47]=e("h3",null,"Git 操作",-1)),e("div",ll,[e("div",ol,[e("div",nl,[t[38]||(t[38]=e("div",{class:"group-title"},"基础操作",-1)),e("div",il,[s(Z,{content:Ie.value?`暂存${Me.value}个待更改文件`:"git add .",placement:"top",effect:"light","popper-class":"git-cmd-tooltip"},{default:a(()=>[s(G,{type:"primary",onClick:Ae,loading:l(v).isAddingFiles,disabled:!Ie.value,class:"action-button"},{default:a(()=>[t[33]||(t[33]=b(" 暂存更改 ")),Me.value>0?(m(),w("span",rl,"("+M(Me.value)+")",1)):q("",!0)]),_:1},8,["loading","disabled"])]),_:1},8,["content"]),s(Z,{content:Re.value?`提交${Le.value}个已暂存文件`:"git commit",placement:"top",effect:"light","popper-class":"git-cmd-tooltip"},{default:a(()=>[s(G,{type:"primary",onClick:ye,loading:l(v).isLoadingStatus,disabled:!Re.value||!le.value.trim(),class:"action-button"},{default:a(()=>[t[34]||(t[34]=b(" 提交 ")),Le.value>0?(m(),w("span",cl,"("+M(Le.value)+")",1)):q("",!0)]),_:1},8,["loading","disabled"])]),_:1},8,["content"]),s(Z,{content:He.value?`推送${l(v).branchAhead}个本地提交`:"git push",placement:"top",effect:"light","popper-class":"git-cmd-tooltip"},{default:a(()=>[s(G,{type:"primary",icon:l(zt),onClick:Be,loading:l(v).isPushing,disabled:!pt.value,class:Xe(["action-button","push-button",{"is-loading":l(v).isPushing}]),style:yt(He.value?{backgroundColor:"#67c23a !important",borderColor:"#67c23a !important"}:{})},{default:a(()=>[t[35]||(t[35]=b(" 推送 ")),He.value?(m(),w("span",ul,"("+M(l(v).branchAhead)+")",1)):q("",!0)]),_:1},8,["icon","loading","disabled","class","style"])]),_:1},8,["content"]),s(Z,{content:nt.value?`拉取${l(v).branchBehind}个远程提交`:"git pull",placement:"top",effect:"light","popper-class":"git-cmd-tooltip"},{default:a(()=>[s(G,{type:"primary",icon:l(Yt),onClick:Ce,loading:l(v).isGitPulling,disabled:!l(v).hasUpstream,class:"action-button",style:yt(nt.value?{color:"white",backgroundColor:"#E6A23C",borderColor:"#E6A23C"}:{})},{default:a(()=>[t[36]||(t[36]=b(" 拉取 ")),nt.value?(m(),w("span",dl,"("+M(l(v).branchBehind)+")",1)):q("",!0)]),_:1},8,["icon","loading","disabled","style"])]),_:1},8,["content"]),s(Z,{content:"git fetch --all",placement:"top",effect:"light","popper-class":"git-cmd-tooltip"},{default:a(()=>[s(G,{type:"info",icon:l(Zt),onClick:be,loading:l(v).isGitFetching,class:"action-button"},{default:a(()=>t[37]||(t[37]=[b(" 获取所有远程分支 ")])),_:1},8,["icon","loading"])]),_:1})])]),e("div",fl,[t[41]||(t[41]=e("div",{class:"group-title"},"组合操作",-1)),e("div",pl,[s(Z,{content:"git add + git commit",placement:"top",effect:"light","popper-class":"git-cmd-tooltip"},{default:a(()=>[s(G,{type:"primary",icon:l(kt),onClick:ot,loading:l(v).isAddingFiles||l(v).isCommiting,disabled:!Ie.value||!le.value.trim(),class:"action-button"},{default:a(()=>t[39]||(t[39]=[b(" 暂存并提交 ")])),_:1},8,["icon","loading","disabled"])]),_:1}),s(Z,{content:"git add + git commit + git push",placement:"top",effect:"light","popper-class":"git-cmd-tooltip"},{default:a(()=>[s(G,{type:"success",icon:l(Dt),onClick:Ye,loading:l(v).isAddingFiles||l(v).isCommiting||l(v).isPushing,disabled:!Ze.value||!le.value.trim()||!l(v).hasUpstream,class:Xe(["action-button","one-click-push",{"is-loading":l(v).isAddingFiles||l(v).isCommiting||l(v).isPushing}])},{default:a(()=>t[40]||(t[40]=[b(" 一键推送所有 ")])),_:1},8,["icon","loading","disabled","class"])]),_:1})])])]),e("div",vl,[t[44]||(t[44]=e("div",{class:"group-title"},"重置操作",-1)),e("div",ml,[s(Z,{content:$t.value?`撤销${Le.value}个已暂存文件`:"git reset HEAD",placement:"top",effect:"light","popper-class":"git-cmd-tooltip"},{default:a(()=>[s(G,{type:"warning",icon:l(Pt),onClick:l(v).resetHead,loading:l(v).isResetting,disabled:!$t.value,class:"action-button reset-button"},{default:a(()=>[t[42]||(t[42]=b(" 重置暂存区 ")),Le.value>0?(m(),w("span",gl,"("+M(Le.value)+")",1)):q("",!0)]),_:1},8,["icon","onClick","loading","disabled"])]),_:1},8,["content"]),s(Z,{content:"git reset --hard origin/branch",placement:"top",effect:"light","popper-class":"git-cmd-tooltip"},{default:a(()=>[s(G,{type:"danger",icon:l(vs),onClick:c,loading:l(v).isResetting,disabled:!Rt.value,class:"action-button danger-button"},{default:a(()=>t[43]||(t[43]=[b(" 重置到远程 ")])),_:1},8,["icon","loading","disabled"])]),_:1})])]),e("div",hl,[t[46]||(t[46]=e("div",{class:"group-title"},"分支操作",-1)),e("div",yl,[s(Z,{content:"合并其他分支到当前分支",placement:"top",effect:"light","popper-class":"git-cmd-tooltip"},{default:a(()=>[s(G,{type:"primary",icon:l(ms),onClick:ce,loading:l(v).isGitMerging,class:"action-button merge-button"},{default:a(()=>t[45]||(t[45]=[b(" 合并分支 ")])),_:1},8,["icon","loading"])]),_:1})])])])])],64))]),s(ct,{title:"简短描述模板设置",modelValue:Y.value,"onUpdate:modelValue":t[10]||(t[10]=C=>Y.value=C),width:"80vw",top:"70px",style:{height:"calc(100vh - 140px)"},"close-on-click-modal":!1,class:"template-dialog"},{default:a(()=>[e("div",wl,[e("div",_l,[s(ie,{modelValue:X.value,"onUpdate:modelValue":t[9]||(t[9]=C=>X.value=C),placeholder:K.value?"编辑模板内容":"输入新模板内容",class:"template-input",clearable:""},null,8,["modelValue","placeholder"]),e("div",bl,[K.value?(m(),ae(G,{key:0,onClick:Je},{default:a(()=>t[48]||(t[48]=[b("取消")])),_:1})):q("",!0),s(G,{type:"primary",onClick:Oe,disabled:!X.value.trim()},{default:a(()=>[b(M(K.value?"更新模板":"添加模板"),1)]),_:1},8,["disabled"])])]),e("div",$l,[t[52]||(t[52]=e("h3",null,"已保存模板",-1)),S.value.length===0?(m(),ae(it,{key:0,description:"暂无保存的模板"})):q("",!0),(m(!0),w(Te,null,Ge(S.value,(C,st)=>(m(),ae(tt,{key:st,class:"template-item"},{default:a(()=>[s(rt,{justify:"space-between",align:"middle",style:{width:"100%"}},{default:a(()=>[e("div",Cl,M(C),1),e("div",kl,[s(G,{type:"primary",size:"small",onClick:at=>i(C)},{default:a(()=>t[49]||(t[49]=[b("使用")])),_:2},1032,["onClick"]),s(G,{type:"warning",size:"small",icon:l(kt),onClick:at=>lt(C,st)},{default:a(()=>t[50]||(t[50]=[b("编辑")])),_:2},1032,["icon","onClick"]),s(G,{type:"danger",size:"small",onClick:at=>Ne(C)},{default:a(()=>t[51]||(t[51]=[b("删除")])),_:2},1032,["onClick"])])]),_:2},1024)]),_:2},1024))),128))])])]),_:1},8,["modelValue"]),s(ct,{title:"作用域模板设置",modelValue:pe.value,"onUpdate:modelValue":t[12]||(t[12]=C=>pe.value=C),width:"80vw",top:"70px",style:{height:"calc(100vh - 140px)"},"close-on-click-modal":!1,class:"template-dialog"},{default:a(()=>[e("div",Sl,[e("div",Tl,[s(ie,{modelValue:ee.value,"onUpdate:modelValue":t[11]||(t[11]=C=>ee.value=C),placeholder:T.value?"编辑作用域模板内容":"输入新作用域模板",class:"template-input",clearable:""},null,8,["modelValue","placeholder"]),e("div",xl,[T.value?(m(),ae(G,{key:0,onClick:ve},{default:a(()=>t[53]||(t[53]=[b("取消")])),_:1})):q("",!0),s(G,{type:"primary",onClick:et,disabled:!ee.value.trim()},{default:a(()=>[b(M(T.value?"更新模板":"添加模板"),1)]),_:1},8,["disabled"])])]),e("div",Vl,[t[57]||(t[57]=e("h3",null,"已保存作用域",-1)),D.value.length===0?(m(),ae(it,{key:0,description:"暂无保存的作用域"})):q("",!0),(m(!0),w(Te,null,Ge(D.value,(C,st)=>(m(),ae(tt,{key:st,class:"template-item"},{default:a(()=>[s(rt,{justify:"space-between",align:"middle",style:{width:"100%"}},{default:a(()=>[e("div",Ll,M(C),1),e("div",Al,[s(G,{type:"primary",size:"small",onClick:at=>J(C)},{default:a(()=>t[54]||(t[54]=[b("使用")])),_:2},1032,["onClick"]),s(G,{type:"warning",size:"small",icon:l(kt),onClick:at=>ze(C,st)},{default:a(()=>t[55]||(t[55]=[b("编辑")])),_:2},1032,["icon","onClick"]),s(G,{type:"danger",size:"small",onClick:at=>y(C)},{default:a(()=>t[56]||(t[56]=[b("删除")])),_:2},1032,["onClick"])])]),_:2},1024)]),_:2},1024))),128))])])]),_:1},8,["modelValue"]),s(ct,{title:"默认提交信息设置",modelValue:R.value,"onUpdate:modelValue":t[14]||(t[14]=C=>R.value=C),width:"80vw",top:"70px",style:{height:"calc(100vh - 140px)"},"close-on-click-modal":!1,class:"message-template-dialog"},{default:a(()=>[e("div",Bl,[e("div",Ml,[s(ie,{modelValue:B.value,"onUpdate:modelValue":t[13]||(t[13]=C=>B.value=C),placeholder:V.value?"编辑模板内容":"输入新模板内容",class:"template-input",clearable:""},null,8,["modelValue","placeholder"]),e("div",Rl,[V.value?(m(),ae(G,{key:0,onClick:_},{default:a(()=>t[58]||(t[58]=[b("取消")])),_:1})):q("",!0),s(G,{type:"primary",onClick:vt,disabled:!B.value.trim()},{default:a(()=>[b(M(V.value?"更新模板":"添加模板"),1)]),_:1},8,["disabled"]),s(G,{type:"success",onClick:de,disabled:!B.value.trim()},{default:a(()=>t[59]||(t[59]=[b(" 设为默认提交信息 ")])),_:1},8,["disabled"])])]),e("div",El,[e("div",zl,[t[63]||(t[63]=e("h3",null,"已保存模板",-1)),e("div",Dl,[Ve.value.length===0?(m(),ae(it,{key:0,description:"暂无保存的模板"})):q("",!0),(m(!0),w(Te,null,Ge(Ve.value,(C,st)=>(m(),ae(tt,{key:st,class:"template-item"},{default:a(()=>[s(rt,{justify:"space-between",align:"middle",style:{width:"100%"}},{default:a(()=>[e("div",Gl,M(C),1),e("div",jl,[s(G,{type:"primary",size:"small",onClick:at=>we(C)},{default:a(()=>t[60]||(t[60]=[b("使用")])),_:2},1032,["onClick"]),s(G,{type:"warning",size:"small",icon:l(kt),onClick:at=>r(C,st)},{default:a(()=>t[61]||(t[61]=[b("编辑")])),_:2},1032,["icon","onClick"]),s(G,{type:"danger",size:"small",onClick:at=>$(C)},{default:a(()=>t[62]||(t[62]=[b("删除")])),_:2},1032,["onClick"])])]),_:2},1024)]),_:2},1024))),128))])]),e("div",Ul,[t[71]||(t[71]=e("h3",null,"当前默认提交信息",-1)),L.value?(m(),ae(tt,{key:0,class:"default-message-card"},{default:a(()=>[e("div",Pl,M(L.value),1)]),_:1})):(m(),ae(it,{key:1,description:"尚未设置默认提交信息","image-size":100})),e("div",Ol,[t[69]||(t[69]=e("h4",null,"关于默认提交信息",-1)),t[70]||(t[70]=e("p",null,"默认提交信息将在未输入提交信息时自动使用。",-1)),e("p",null,[t[66]||(t[66]=b("你可以通过点击左侧模板的")),s(Ct,{size:"small",type:"primary"},{default:a(()=>t[64]||(t[64]=[b("使用")])),_:1}),t[67]||(t[67]=b("按钮先选择喜欢的模板,然后点击上方")),s(Ct,{size:"small",type:"success"},{default:a(()=>t[65]||(t[65]=[b("设为默认提交信息")])),_:1}),t[68]||(t[68]=b("按钮保存。"))])])])])])]),_:1},8,["modelValue"]),s(ct,{title:"合并分支",modelValue:re.value,"onUpdate:modelValue":t[21]||(t[21]=C=>re.value=C),width:"500px","close-on-click-modal":!1,class:"merge-dialog"},{footer:a(()=>[e("div",Hl,[s(G,{onClick:t[20]||(t[20]=C=>re.value=!1)},{default:a(()=>t[75]||(t[75]=[b("取消")])),_:1}),s(G,{type:"primary",onClick:te,loading:l(v).isGitMerging,disabled:!E.value,class:"merge-confirm-btn"},{default:a(()=>t[76]||(t[76]=[b(" 合并 ")])),_:1},8,["loading","disabled"])])]),default:a(()=>[e("div",Fl,[e("p",Nl,"选择要合并到当前分支 ("+M(l(v).currentBranch)+") 的分支:",1),s(Et,{"label-position":"top"},{default:a(()=>[s(mt,{label:"选择分支"},{default:a(()=>[s(P,{modelValue:E.value,"onUpdate:modelValue":t[15]||(t[15]=C=>E.value=C),placeholder:"选择要合并的分支",style:{width:"100%"},filterable:""},{default:a(()=>[(m(!0),w(Te,null,Ge(l(v).allBranches.filter(C=>C!==l(v).currentBranch),C=>(m(),ae(k,{key:C,label:C,value:C},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])]),_:1}),s(mt,{label:"合并选项"},{default:a(()=>[e("div",Il,[s(ut,{modelValue:se.value.noFf,"onUpdate:modelValue":t[16]||(t[16]=C=>se.value.noFf=C)},{default:a(()=>[s(Z,{content:"创建合并提交,即使可以使用快进合并",placement:"top"},{default:a(()=>t[72]||(t[72]=[e("span",null,"禁用快进合并 (--no-ff)",-1)])),_:1})]),_:1},8,["modelValue"]),s(ut,{modelValue:se.value.squash,"onUpdate:modelValue":t[17]||(t[17]=C=>se.value.squash=C)},{default:a(()=>[s(Z,{content:"将多个提交压缩为一个提交",placement:"top"},{default:a(()=>t[73]||(t[73]=[e("span",null,"压缩提交 (--squash)",-1)])),_:1})]),_:1},8,["modelValue"]),s(ut,{modelValue:se.value.noCommit,"onUpdate:modelValue":t[18]||(t[18]=C=>se.value.noCommit=C)},{default:a(()=>[s(Z,{content:"执行合并但不自动创建提交",placement:"top"},{default:a(()=>t[74]||(t[74]=[e("span",null,"不自动提交 (--no-commit)",-1)])),_:1})]),_:1},8,["modelValue"])])]),_:1}),se.value.noFf&&!se.value.noCommit?(m(),ae(mt,{key:0,label:"合并提交信息 (可选)"},{default:a(()=>[s(ie,{modelValue:se.value.message,"onUpdate:modelValue":t[19]||(t[19]=C=>se.value.message=C),type:"textarea",rows:3,placeholder:"输入自定义合并提交信息"},null,8,["modelValue"])]),_:1})):q("",!0)]),_:1})])]),_:1},8,["modelValue"])])],2)}}}),Wl=Mt(Xl,[["__scopeId","data-v-82d0f844"]]),Jl={class:"card"},ql={key:0,class:"refresh-notification"},Yl={class:"log-header"},Zl={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,class:"content-area-content"},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=["id"],mo=["onClick"],go={class:"author-name"},ho={key:0,class:"branch-container"};const yo={class:"commit-detail-container"},wo={key:0,class:"commit-info"},_o={class:"commit-info-header"},bo={class:"info-item"},$o={class:"item-value"},Co={class:"info-item"},ko={class:"item-value"},So={class:"info-item"},To={class:"item-value"},xo={class:"commit-message-container"},Vo=["innerHTML"],Lo={class:"commit-files-diff"},Ao={class:"files-list"},Bo={key:1},Mo=["onClick"],Ro={class:"file-diff"},Eo={key:0},zo={key:1},Do=["innerHTML"],ht=.5,St=1.5,jt=.1,Go=Vt({__name:"LogList",setup($e,{expose:v}){const x=_t();let p=[];const g=u(p),O=u(""),L=u(!1),U=Ee(()=>x.isLoadingLog||L.value),H=u(!1),oe=u(0),z=u(!1),Q=u(null),A=u(1),S=u(!0),Y=u(!1),X=u(null),K=u(!1),N=u(null),_e=u([]),re=u(""),E=u(!1),se=u(""),D=u(1),pe=u(!1),ee=u(!1),T=u([]),h=u(""),W=u(null),R=u([]),B=u([]),ne=u([]),xe=u(!1),Se=u(0),Ve=u(0),V=u(null),fe=u(new Map),ue=u([]),le=u(1),Ue=u(new Map),Pe=Ee(()=>g.value);async function Oe(d=!1,r=1){if(!_t().isGitRepo){O.value="当前目录不是Git仓库";return}try{r>1?Y.value=!0:L.value=!0,console.log(`加载提交历史: page=${r}, all=${d}`);const $=new URLSearchParams;$.append("page",r.toString()),$.append("all",d.toString()),$.append("with_parents","true"),T.value.length>0&&$.append("author",T.value.join(",")),B.value.length>0&&$.append("branch",B.value.join(",")),h.value&&$.append("message",h.value),W.value&&Array.isArray(W.value)&&W.value.length===2&&($.append("dateFrom",W.value[0]),$.append("dateTo",W.value[1])),$.append("_t",Date.now().toString());const ce=await(await fetch(`/api/log?${$.toString()}`)).json();if(!ce||!ce.data||!Array.isArray(ce.data)){console.error("API返回的数据格式不正确:",ce),O.value="加载提交历史失败: 服务器返回数据格式不正确";return}const te=r>1;te?ce.data.forEach(o=>p.push(o)):(p.length=0,ce.data.forEach(o=>p.push(o))),g.value=[...p],A.value=r,oe.value=ce.total||p.length,S.value=ce.hasMore===!0,console.log(`加载完成: 当前页=${A.value}, 是否有更多=${S.value}, 总条数=${oe.value}`),S.value||console.log("已加载所有提交记录"),te||(pe.value=!0,setTimeout(()=>{pe.value=!1},2e3)),!te&&z.value?setTimeout(Fe,0):!te&&!z.value&&!d&&We(()=>{y(),setTimeout(vt,200)}),O.value=""}catch($){O.value="加载提交历史失败: "+($ instanceof Error?$.message:String($)),console.error("加载日志失败:",$),r>1&&(S.value=!1)}finally{r>1?Y.value=!1:L.value=!1}}async function Fe(){if(console.log(`开始渲染图表...数据长度: ${p.length}`),!Q.value){console.error("图表容器未找到");return}if(p.length===0){console.error("没有日志数据可渲染");return}try{Q.value.innerHTML="",console.log(`创建gitgraph实例,分支: ${x.currentBranch||"main"}`);const d=As(Q.value,{orientation:"vertical-reverse",template:"metro",author:"提交者 <committer@example.com>"}),r={},_=d.branch(x.currentBranch||"main");r[x.currentBranch||"main"]=_,console.log(`开始创建提交图...共${p.length}条提交`),p.forEach(($,we)=>{let ce=_;if($.branch){const te=et($.branch.split(",")[0]);r[te]||(r[te]=d.branch(te)),ce=r[te]}ce.commit({hash:$.hash,subject:$.message,author:`${$.author} <${$.email}>`}),we%10===0&&console.log(`已渲染 ${we+1}/${p.length} 个提交`)}),console.log("图表渲染完成"),setTimeout(()=>{Be()},100)}catch(d){console.error("渲染图表失败:",d),O.value="渲染图表失败: "+(d instanceof Error?d.message:String(d))}}function lt(){z.value=!z.value,z.value&&p.length>0&&setTimeout(Fe,0)}function Je(){H.value=!H.value,H.value||(S.value=!0),A.value=1,Oe(H.value),We(()=>{setTimeout(()=>{!z.value&&!H.value&&(y(),vt())},300)})}function et(d){return d.includes("HEAD -> ")?d.replace("HEAD -> ",""):d.includes("origin/")?d:d.trim()}function qe(d){return d.includes("HEAD")?"success":d.includes("origin/")?"warning":"info"}const ze=u(null),ve=u(null);function Ne(d){if(z.value||!S.value||Y.value||U.value)return;const r=d.target,{scrollTop:_,scrollHeight:$,clientHeight:we}=r,ce=$-_-we;console.log("表格滚动:",{scrollTop:_,scrollHeight:$,clientHeight:we,scrollDistance:ce,hasMoreData:S.value,isLoadingMore:Y.value,isLoading:U.value}),ce<=20&&(console.log("已滚动到底部,加载更多数据"),c())}function y(){if(console.log("设置表格滚动监听 - 开始"),!ze.value){console.error("tableRef.value 不存在");return}const d=ze.value.$el.querySelector(".el-table__body-wrapper");if(!d){console.error("未找到表格的body-wrapper元素");return}console.log("找到表格的body-wrapper元素"),ve.value=d,ve.value&&(ve.value.removeEventListener("scroll",Ne,!0),ve.value.addEventListener("scroll",Ne,!0),console.log("成功添加表格滚动监听"))}function i(){console.log("移除表格滚动监听 - 开始"),ve.value?(ve.value.removeEventListener("scroll",Ne,!0),console.log("成功移除表格滚动监听"),ve.value=null):console.log("tableBodyWrapper.value 不存在,无需移除监听")}bt(()=>{x.isGitRepo?(x.log.length>0?(console.log("使用已加载的日志数据"),p.length=0,x.log.forEach(d=>p.push(d)),oe.value=x.log.length,z.value?setTimeout(()=>{console.log(`准备渲染图表,数据长度: ${p.length}`),Fe()},100):setTimeout(()=>{Me()},100)):(console.log("初始加载日志数据"),Oe()),de()):O.value="当前目录不是Git仓库",We(()=>{setTimeout(()=>{y()},500)}),We(()=>{setTimeout(()=>{z.value||Me()},500)}),Ke(()=>ze.value,d=>{d&&!z.value&&!H.value&&(console.log("表格引用已创建,设置滚动监听"),We(()=>{y()}))})}),Ke(()=>x.allBranches,d=>{d&&d.length>0?(ne.value=[...d].sort(),console.log(`分支数据更新,共 ${ne.value.length} 个分支`)):(ne.value=[],console.warn("gitStore 中没有分支数据"))},{immediate:!0}),ys(()=>{i(),X.value!==null&&(window.clearInterval(X.value),X.value=null)});function J(d,r){let _=null;return function(...$){_&&clearTimeout(_),_=window.setTimeout(()=>{d(...$),_=null},r)}}const j=J(Me,200);async function me(){await x.fetchLog(!0),p.length=0,x.log.forEach(d=>p.push(d)),g.value=[...p],oe.value=x.log.length,A.value=1,S.value=!1,pe.value=!0,setTimeout(()=>{pe.value=!1},2e3),z.value?(await We(),Fe()):(fe.value.clear(),ue.value=[],le.value=1,await We(),j())}Ke(()=>x.log,d=>{console.log("监听到gitStore.log变化,更新图表数据");try{p.length=0,Array.isArray(d)&&d.forEach(r=>r&&p.push(r)),oe.value=p.length,A.value=1,g.value=[...p],pe.value=!0,setTimeout(()=>{pe.value=!1},2e3),console.log(`数据更新完成,共${g.value.length}条记录,准备渲染图表`),z.value&&p.length>0&&setTimeout(Fe,0)}catch(r){console.error("更新日志数据失败:",r)}},{immediate:!0}),v({refreshLog:me});function Ae(){D.value<St&&(D.value=Math.min(St,D.value+jt),ge())}function ye(){D.value>ht&&(D.value=Math.max(ht,D.value-jt),ge())}function ge(){if(!Q.value)return;const d=Q.value.querySelector("svg");d&&(d.style.transform=`scale(${D.value})`,d.style.transformOrigin="top left")}function Be(){if(!Q.value)return;const d=Q.value.querySelector("svg");if(!d)return;const r=d.getBoundingClientRect().width/D.value,_=Q.value.clientWidth;r>_?D.value=Math.max(ht,_/r):D.value=1,ge()}async function Ce(d){if(d){N.value=d,K.value=!0,E.value=!0,_e.value=[],re.value="",se.value="",console.log("提交详情对象:",JSON.stringify(d,null,2)),console.log("哈希值类型和长度:",typeof d.hash,d.hash?d.hash.length:0),console.log("提交信息类型和长度:",typeof d.message,d.message?d.message.length:0),console.log("提交分支:",d.branch);try{if(console.log(`获取提交详情: ${d.hash}`),!d.hash||d.hash.length<7){console.error("无效的提交哈希值:",d.hash),re.value="无效的提交哈希值",E.value=!1;return}const r=await fetch(`/api/commit-files?hash=${d.hash}`);console.log("API响应状态: ",r.status);const _=await r.json();console.log("文件列表数据: ",_),_.success&&Array.isArray(_.files)?(_e.value=_.files,_e.value.length>0?await be(d.hash,_e.value[0]):(console.log("没有找到变更文件"),re.value="该提交没有变更文件")):(console.error("获取提交文件列表失败:",_.error||"未知错误"),re.value=`获取文件列表失败: ${_.error||"未知错误"}`)}catch(r){console.error("获取提交详情失败:",r),re.value=`获取提交详情失败: ${r.message}`}finally{E.value=!1}}}async function be(d,r){E.value=!0,se.value=r;try{console.log(`获取文件差异: hash=${d}, file=${r}`);const _=await fetch(`/api/commit-file-diff?hash=${d}&file=${encodeURIComponent(r)}`);console.log("差异API响应状态: ",_.status);const $=await _.json();console.log("差异数据: ",$.success,typeof $.diff),$.success?re.value=$.diff||"没有变更内容":(console.error("获取差异失败: ",$.error),re.value=`获取差异失败: ${$.error||"未知错误"}`)}catch(_){console.error("获取文件差异失败:",_),re.value=`获取差异失败: ${_.message}`}finally{E.value=!1}}function ot(d){if(!d)return"";const r=d.split(`
|
|
20
20
|
`);function _($){return $.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}return r.map($=>{const we=_($);return $.startsWith("diff --git")?`<div class="diff-header">${we}</div>`:$.startsWith("---")?`<div class="diff-old-file">${we}</div>`:$.startsWith("+++")?`<div class="diff-new-file">${we}</div>`:$.startsWith("@@")?`<div class="diff-hunk-header">${we}</div>`:$.startsWith("+")?`<div class="diff-added">${we}</div>`:$.startsWith("-")?`<div class="diff-removed">${we}</div>`:`<div class="diff-context">${we}</div>`}).join("")}function Ye(d){return d?(console.log("格式化前的提交信息:",d),console.log("提交信息中的换行符数量:",(d.match(/\n/g)||[]).length),d.trim()):"(无提交信息)"}function c(){if(!S.value||Y.value||U.value){console.log("不满足加载更多条件:",{hasMoreData:S.value,isLoadingMore:Y.value,isLoading:U.value});return}console.log(`加载更多日志,当前页码: ${A.value},下一页: ${A.value+1}`),Oe(H.value,A.value+1)}function f(){T.value=[],B.value=[],h.value="",W.value=null,A.value=1,Oe(H.value,1)}function I(){A.value=1,Oe(H.value,1)}async function de(){try{console.log("获取所有可用作者...");const r=await(await fetch("/api/authors")).json();r.success&&Array.isArray(r.authors)?(R.value=r.authors.sort(),console.log(`获取到${R.value.length}位作者`)):(console.warn("从API获取作者列表失败,将从现有日志中提取作者列表"),Ie())}catch(d){console.error("获取作者列表失败:",d),Ie()}}function Ie(){const d=new Set;g.value.forEach(r=>{r.author&&d.add(r.author)}),R.value=Array.from(d).sort(),console.log(`从现有日志中提取了${R.value.length}位作者`)}function Me(){!ze.value||z.value||(fe.value.clear(),ue.value=[],le.value=1,Le(),We(()=>{Ze()}))}function Le(){fe.value.clear(),ue.value=[],Ue.value.clear();const d=new Map,r=new Map;g.value.forEach(F=>{F.hash&&(F.parents&&F.parents.length>0?(d.set(F.hash,[...F.parents]),F.parents.forEach(he=>{var Z;r.has(he)||r.set(he,[]),(Z=r.get(he))==null||Z.push(F.hash)})):d.set(F.hash,[]))});const _=0,$="#2196f3",we=["#e91e63","#4caf50","#ff9800","#9c27b0","#00bcd4","#ff5722","#607d8b"],ce=new Map;g.value.forEach(F=>{if(!F.hash||!F.branch)return;const he=F.branch.match(/(HEAD -> |origin\/)?([^\s,]+)/g);if(he&&he.length>0){const Z=he.find(ie=>ie.includes("HEAD -> "));if(Z){const ie=Z.replace("HEAD -> ","").trim();ce.set(F.hash,ie)}else{const ie=he[0].replace("origin/","").trim();ce.set(F.hash,ie)}}});const te=new Map;let o=0;te.set("main",_),te.set("master",_),o++;const t=new Map;t.set("main",$),t.set("master",$);const ke=new Map;return g.value.forEach((F,he)=>{if(!F.hash)return;const Z=F.hash,ie=ce.get(Z)||"main";if(!te.has(ie)){te.set(ie,o++);const k=(te.get(ie)||0)%we.length;t.set(ie,we[k])}const G=te.get(ie)||0;ke.set(Z,G),fe.value.set(Z,{hash:Z,parents:F.parents||[],column:G,row:he,branch:ie}),Ue.value.has(ie)||Ue.value.set(ie,{name:ie,color:t.get(ie)||$,column:G})}),g.value.forEach((F,he)=>{if(!F.hash||!F.parents||F.parents.length===0)return;const Z=fe.value.get(F.hash);if(!Z)return;const ie=Z.column,G=Z.branch||"main",k=t.get(G)||$;F.parents.forEach((P,it)=>{const rt=g.value.findIndex(Et=>Et.hash===P);if(rt<0)return;const tt=fe.value.get(P);if(!tt)return;const ct=tt.column,Ct=tt.branch||"main",mt=t.get(Ct)||$;let ut=k;F.parents&&F.parents.length>1&&it>0&&(ut=mt),ue.value.push({fromRow:he,fromColumn:ie,toRow:rt,toColumn:ct,color:ut})})}),le.value=o,{mainBranchColor:$,branchColorMap:t}}let Re=!1;function Ze(){if(Re){console.log("已有渲染进行中,跳过");return}try{Re=!0;const d=new Map;d.set("main","#2196f3"),d.set("master","#2196f3");const r="#2196f3";if(ue.value.length===0){if(console.log("branchLines为空,重新计算"),Le(),ue.value.length===0&&g.value.length>1){console.log("创建默认分支线");for(let _=0;_<g.value.length-1;_++)g.value[_].hash&&g.value[_+1].hash&&ue.value.push({fromRow:_,fromColumn:0,toRow:_+1,toColumn:0,color:r})}}else console.log(`使用现有分支线,数量: ${ue.value.length}`);g.value.forEach((_,$)=>{if(!_.hash)return;const we=`commit-graph-${_.hash.substring(0,7)}`,ce=document.getElementById(we);if(!ce||ce.querySelector("svg"))return;const te=document.createElementNS("http://www.w3.org/2000/svg","svg");te.setAttribute("width","100%"),te.setAttribute("height","100%"),te.setAttribute("viewBox","0 0 100 100"),te.style.display="block",te.style.overflow="visible",ce.innerHTML="",ce.appendChild(te);const o=fe.value.get(_.hash);if(!o)return;const t=20,ke=10+o.column*t,F=50,he=[];for(const k of ue.value)k.fromRow<$&&k.toRow>$&&he.push({...k,type:"through",x:10+k.fromColumn*t});for(const k of ue.value)k.fromRow===$&&he.push({...k,type:"from",fromX:10+k.fromColumn*t,toX:10+k.toColumn*t});for(const k of ue.value)k.toRow===$&&he.push({...k,type:"to",fromX:10+k.fromColumn*t,toX:10+k.toColumn*t});he.length===0&&$<g.value.length-1&&(ue.value.length>0?he.push({...ue.value[0],type:"from",fromX:ke,toX:ke}):he.push({type:"from",fromX:ke,toX:ke,fromRow:$,fromColumn:0,toRow:$+1,toColumn:0,color:r})),he.filter(k=>k.type==="through").forEach(k=>{const P=document.createElementNS("http://www.w3.org/2000/svg","line");P.setAttribute("x1",k.x.toString()),P.setAttribute("y1","-20"),P.setAttribute("x2",k.x.toString()),P.setAttribute("y2","120"),P.setAttribute("stroke",k.color),P.setAttribute("stroke-width","2"),te.appendChild(P)}),he.filter(k=>k.type==="to").forEach(k=>{if(k.fromColumn===k.toColumn){const P=document.createElementNS("http://www.w3.org/2000/svg","line");P.setAttribute("x1",k.toX.toString()),P.setAttribute("y1","-20"),P.setAttribute("x2",k.toX.toString()),P.setAttribute("y2",F.toString()),P.setAttribute("stroke",k.color),P.setAttribute("stroke-width","2"),te.appendChild(P)}else{const P=document.createElementNS("http://www.w3.org/2000/svg","path");k.fromColumn<k.toColumn?P.setAttribute("d",`M${k.fromX},-20 C${k.fromX},15 ${k.toX},30 ${k.toX},${F}`):P.setAttribute("d",`M${k.fromX},-20 C${k.fromX},15 ${k.toX},30 ${k.toX},${F}`),P.setAttribute("stroke",k.color),P.setAttribute("stroke-width","2"),P.setAttribute("fill","none"),te.appendChild(P)}}),he.filter(k=>k.type==="from").forEach(k=>{if(k.fromColumn===k.toColumn){const P=document.createElementNS("http://www.w3.org/2000/svg","line");P.setAttribute("x1",k.fromX.toString()),P.setAttribute("y1",F.toString()),P.setAttribute("x2",k.fromX.toString()),P.setAttribute("y2","120"),P.setAttribute("stroke",k.color),P.setAttribute("stroke-width","2"),te.appendChild(P)}else{const P=document.createElementNS("http://www.w3.org/2000/svg","path");k.fromColumn<k.toColumn?P.setAttribute("d",`M${k.fromX},${F} C${k.fromX},70 ${k.toX},85 ${k.toX},120`):P.setAttribute("d",`M${k.fromX},${F} C${k.fromX},70 ${k.toX},85 ${k.toX},120`),P.setAttribute("stroke",k.color),P.setAttribute("stroke-width","2"),P.setAttribute("fill","none"),te.appendChild(P)}});const Z=document.createElementNS("http://www.w3.org/2000/svg","circle");Z.setAttribute("cx",ke.toString()),Z.setAttribute("cy",F.toString()),Z.setAttribute("r","6");const ie=o.branch||"",G=d.get(ie)||r;Z.setAttribute("fill",G),Z.setAttribute("stroke","#fff"),Z.setAttribute("stroke-width","2"),te.appendChild(Z)})}catch(d){console.error("渲染分支图失败:",d),O.value="渲染分支图失败: "+(d instanceof Error?d.message:String(d))}finally{Re=!1}}Ke(()=>g.value,()=>{We(()=>{z.value||j()})},{deep:!0});function He(d,r,_){console.log("handleContextMenu",d,r,_),_.preventDefault(),Se.value=_.clientY,Ve.value=_.clientX,V.value=d,xe.value=!0;const $=()=>{xe.value=!1,document.removeEventListener("click",$)};setTimeout(()=>{document.addEventListener("click",$)},0)}async function nt(d){if(d)try{await Qe.confirm(`确定要撤销提交 ${d.hash.substring(0,7)} 吗?这将创建一个新的提交来撤销这次提交的更改。`,"撤销提交确认",{confirmButtonText:"确认",cancelButtonText:"取消",type:"warning"});const _=await(await fetch("/api/revert-commit",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({hash:d.hash})})).json();_.success?(n.success(_.message||"已成功撤销提交"),me(),x.fetchStatus(),x.getBranchStatus()):n.error(_.error||"撤销提交失败")}catch(r){r!=="cancel"&&(console.error("撤销提交出错:",r),n.error("撤销提交失败: "+(r.message||r)))}}async function pt(d){if(d)try{await Qe.confirm(`确定要将提交 ${d.hash.substring(0,7)} Cherry-Pick 到当前分支吗?`,"Cherry-Pick确认",{confirmButtonText:"确认",cancelButtonText:"取消",type:"warning"});const _=await(await fetch("/api/cherry-pick-commit",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({hash:d.hash})})).json();_.success?(n.success(_.message||"已成功Cherry-Pick提交"),me(),x.fetchStatus(),x.getBranchStatus()):n.error(_.error||"Cherry-Pick提交失败")}catch(r){r!=="cancel"&&(console.error("Cherry-Pick提交出错:",r),n.error("Cherry-Pick提交失败: "+(r.message||r)))}}async function $t(d){if(d)try{await navigator.clipboard.writeText(d.hash),n.success(`已复制提交哈希: ${d.hash.substring(0,7)}`)}catch(r){console.error("复制提交哈希失败:",r),n.error(`复制提交哈希失败: ${r.message}`)}}async function Rt(d){if(d)try{await Qe.confirm(`确定要将当前分支重置(hard)到提交 ${d.hash.substring(0,7)} 吗?
|
|
21
21
|
|
|
22
22
|
警告:这将丢失该提交之后的所有更改!`,"重置确认",{confirmButtonText:"确认重置",cancelButtonText:"取消",type:"warning",dangerouslyUseHTMLString:!0});const _=await(await fetch("/api/reset-to-commit",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({hash:d.hash})})).json();_.success?(n.success(_.message||"已成功重置到指定提交"),me(),x.fetchStatus(),x.getBranchStatus()):n.error(_.error||"重置到指定提交失败")}catch(r){r!=="cancel"&&(console.error("重置到指定提交出错:",r),n.error("重置到指定提交失败: "+(r.message||r)))}}function vt(){if(console.log("检查是否需要加载更多数据"),z.value||!S.value||Y.value||U.value||H.value){console.log("不满足加载条件:",{showGraphView:z.value,hasMoreData:S.value,isLoadingMore:Y.value,isLoading:U.value,showAllCommits:H.value});return}if(!ve.value){console.log("表格容器不存在,重新设置滚动监听"),y();return}const{scrollTop:d,scrollHeight:r,clientHeight:_}=ve.value,$=r-d-_;console.log("表格滚动位置:",{scrollTop:d,scrollHeight:r,clientHeight:_,scrollDistance:$}),$<=50&&(console.log("表格已滚动到底部,加载更多数据"),c())}return Ke(()=>z.value,d=>{!d&&!H.value&&(console.log("切换到表格视图,设置滚动监听和定时检查"),We(()=>{y(),setTimeout(vt,200)}))}),(d,r)=>{var te;const _=At,$=Ut,we=as,ce=Kt;return m(),w(Te,null,[e("div",Jl,[pe.value?(m(),w("div",ql,"提交历史已刷新")):q("",!0),e("div",Yl,[r[14]||(r[14]=e("div",{class:"header-left"},[e("h2",null,"提交历史")],-1)),e("div",Zl,[z.value?q("",!0):(m(),ae(l(je),{key:0,type:ee.value?"primary":"default",size:"small",onClick:r[0]||(r[0]=o=>ee.value=!ee.value),class:Xe(["action-button filter-button",{"active-filter":ee.value}])},{icon:a(()=>[s(_,null,{default:a(()=>[s(l(_s))]),_:1})]),default:a(()=>[r[13]||(r[13]=b(" 筛选 ")),Pe.value.length!==g.value.length?(m(),ae(l(ws),{key:0,value:Pe.value.length,class:"filter-badge"},null,8,["value"])):q("",!0)]),_:1},8,["type","class"])),s(l(je),{type:"primary",size:"small",onClick:lt,class:Xe(["action-button view-mode-button",{"active-view":z.value}])},{icon:a(()=>[s(_,null,{default:a(()=>[(m(),ae(Ht(z.value?l(es):l(bs))))]),_:1})]),default:a(()=>[b(" "+M(z.value?"表格视图":"图表视图"),1)]),_:1},8,["class"]),s(l(je),{type:"success",size:"small",onClick:Je,loading:U.value,class:Xe(["action-button commit-display-button",{"active-commits":H.value}])},{icon:a(()=>[s(_,null,{default:a(()=>[(m(),ae(Ht(H.value?l($s):l(Cs))))]),_:1})]),default:a(()=>[b(" "+M(H.value?"显示分页加载":"显示所有提交"),1)]),_:1},8,["loading","class"]),s(l(je),{circle:"",size:"small",onClick:r[1]||(r[1]=o=>me()),class:Xe([{"refresh-button-animated":pe.value},"action-button refresh-button"])},{default:a(()=>[U.value?(m(),ae(_,{key:1},{default:a(()=>[s(l(ks))]),_:1})):(m(),ae(_,{key:0},{default:a(()=>[s(l(Pt))]),_:1}))]),_:1},8,["class"])])]),ee.value&&!z.value?(m(),w("div",Kl,[e("div",Ql,[e("div",eo,[s(l(xt),{modelValue:T.value,"onUpdate:modelValue":r[2]||(r[2]=o=>T.value=o),placeholder:"选择作者",multiple:"",clearable:"",filterable:"",class:"filter-input",size:"small"},{prefix:a(()=>r[15]||(r[15]=[e("span",{class:"compact-label"},"作者",-1)])),default:a(()=>[(m(!0),w(Te,null,Ge(R.value,o=>(m(),ae(l(Tt),{key:o,label:o,value:o},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])]),e("div",to,[s(l(xt),{modelValue:B.value,"onUpdate:modelValue":r[3]||(r[3]=o=>B.value=o),placeholder:"选择分支",multiple:"",clearable:"",filterable:"",class:"filter-input",size:"small"},{prefix:a(()=>r[16]||(r[16]=[e("span",{class:"compact-label"},"分支",-1)])),default:a(()=>[(m(!0),w(Te,null,Ge(ne.value,o=>(m(),ae(l(Tt),{key:o,label:o,value:o},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])]),e("div",so,[s(l(Ot),{modelValue:h.value,"onUpdate:modelValue":r[4]||(r[4]=o=>h.value=o),placeholder:"提交信息关键词",clearable:"",class:"filter-input",size:"small"},{prefix:a(()=>r[17]||(r[17]=[e("span",{class:"compact-label"},"信息",-1)])),_:1},8,["modelValue"])]),e("div",ao,[s(l(Ss),{modelValue:W.value,"onUpdate:modelValue":r[5]||(r[5]=o=>W.value=o),type:"daterange","range-separator":"至","start-placeholder":"开始日期","end-placeholder":"结束日期",format:"YYYY-MM-DD","value-format":"YYYY-MM-DD",class:"filter-input date-range",size:"small"},{prefix:a(()=>r[18]||(r[18]=[e("span",{class:"compact-label"},"日期",-1)])),_:1},8,["modelValue"])]),e("div",lo,[s(l(je),{type:"primary",size:"small",onClick:I,class:"filter-action-button"},{default:a(()=>r[19]||(r[19]=[b("应用")])),_:1}),s(l(je),{type:"info",size:"small",onClick:f,class:"filter-action-button"},{default:a(()=>r[20]||(r[20]=[b("重置")])),_:1})])])])):q("",!0),e("div",{class:Xe(["content-area",{"with-filter":ee.value&&!z.value}])},[O.value?(m(),w("div",oo,M(O.value),1)):(m(),w("div",no,[z.value?(m(),w("div",io,[l(p).length>0?(m(),w("div",ro," 显示 "+M(l(p).length)+" 条提交记录 "+M(H.value?"(全部)":"(分页加载,每页100条)"),1)):q("",!0),e("div",co,[e("div",uo,[s(l(je),{type:"primary",circle:"",size:"small",onClick:ye,disabled:D.value<=ht},{default:a(()=>[s(_,null,{default:a(()=>[s(l(Ts))]),_:1})]),_:1},8,["disabled"]),s(l(xs),{modelValue:D.value,"onUpdate:modelValue":r[6]||(r[6]=o=>D.value=o),min:ht,max:St,step:jt,onChange:ge,class:"zoom-slider"},null,8,["modelValue"]),s(l(je),{type:"primary",circle:"",size:"small",onClick:Ae,disabled:D.value>=St},{default:a(()=>[s(_,null,{default:a(()=>[s(l(Vs))]),_:1})]),_:1},8,["disabled"]),s(l(je),{type:"primary",size:"small",onClick:Be},{default:a(()=>r[21]||(r[21]=[b(" 自适应大小 ")])),_:1})]),e("div",fo," 缩放: "+M(Math.round(D.value*100))+"% ",1)]),e("div",{ref_key:"graphContainer",ref:Q,class:"graph-container"},null,512)])):(m(),w("div",po,[ft((m(),ae(l(Ls),{ref_key:"tableRef",ref:ze,data:Pe.value,stripe:"",border:"",class:"log-table","empty-text":U.value?"加载中...":"没有匹配的提交记录",height:"500",onRowContextmenu:He},{default:a(()=>[s(l(dt),{width:"60","class-name":"branch-graph-column"},{default:a(o=>[e("div",{class:"branch-graph-cell",id:`commit-graph-${o.row.hash.substring(0,7)}`},null,8,vo)]),_:1}),s(l(dt),{label:"提交哈希",width:"100",resizable:""},{default:a(o=>[e("span",{class:"commit-hash",onClick:t=>Ce(o.row)},M(o.row.hash.substring(0,7)),9,mo)]),_:1}),s(l(dt),{prop:"date",label:"日期",width:"120",resizable:""}),s(l(dt),{label:"作者",width:"120",resizable:""},{default:a(o=>[s($,{content:o.row.email,placement:"top","hide-after":1e3},{default:a(()=>[e("span",go,M(o.row.author),1)]),_:2},1032,["content"])]),_:1}),s(l(dt),{label:"分支",width:"180",resizable:""},{default:a(o=>[o.row.branch?(m(),w("div",ho,[(m(!0),w(Te,null,Ge(o.row.branch.split(","),(t,ke)=>(m(),ae(l(Lt),{key:ke,size:"small",type:qe(t),class:"branch-tag"},{default:a(()=>[b(M(et(t)),1)]),_:2},1032,["type"]))),128))])):q("",!0)]),_:1}),s(l(dt),{prop:"message",label:"提交信息","min-width":"250"})]),_:1},8,["data","empty-text"])),[[ce,U.value]]),(H.value,q("",!0))]))]))],2),s(l(Bt),{modelValue:K.value,"onUpdate:modelValue":r[7]||(r[7]=o=>K.value=o),title:`提交详情: ${(te=N.value)!=null&&te.hash?N.value.hash.substring(0,7):"未知"}`,width:"80%","destroy-on-close":"",class:"commit-detail-dialog"},{default:a(()=>[ft((m(),w("div",yo,[N.value?(m(),w("div",wo,[e("div",_o,[e("div",bo,[r[25]||(r[25]=e("span",{class:"item-label"},"哈希:",-1)),e("span",$o,M(N.value.hash),1)]),e("div",Co,[r[26]||(r[26]=e("span",{class:"item-label"},"作者:",-1)),e("span",ko,M(N.value.author)+" <"+M(N.value.email)+">",1)]),e("div",So,[r[27]||(r[27]=e("span",{class:"item-label"},"日期:",-1)),e("span",To,M(N.value.date),1)])]),e("div",xo,[r[28]||(r[28]=e("div",{class:"message-label"},"提交信息:",-1)),e("div",{class:"message-content",innerHTML:Ye(N.value.message).replace(/\n/g,"<br>")},null,8,Vo)])])):q("",!0),e("div",Lo,[e("div",Ao,[r[29]||(r[29]=e("h3",null,"变更文件",-1)),_e.value.length===0?(m(),ae(we,{key:0,description:"没有找到变更文件"})):(m(),w("ul",Bo,[(m(!0),w(Te,null,Ge(_e.value,o=>(m(),w("li",{key:o,class:Xe({"active-file":o===se.value}),onClick:t=>be(N.value.hash,o)},M(o),11,Mo))),128))]))]),e("div",Ro,[se.value?(m(),w("h3",Eo," 文件差异: "+M(se.value),1)):(m(),w("h3",zo,"文件差异")),!re.value&&!E.value?(m(),ae(we,{key:2,description:"选择文件查看差异"})):re.value?(m(),w("div",{key:3,innerHTML:ot(re.value),class:"diff-content"},null,8,Do)):q("",!0)])])])),[[ce,E.value]])]),_:1},8,["modelValue","title"])]),ft(e("div",{class:"context-menu",style:yt({top:Se.value+"px",left:Ve.value+"px"})},[e("div",{class:"context-menu-item",onClick:r[8]||(r[8]=o=>Ce(V.value))},r[30]||(r[30]=[e("i",{class:"el-icon-view"},null,-1),b(" 查看详情 ")])),e("div",{class:"context-menu-item",onClick:r[9]||(r[9]=o=>$t(V.value))},r[31]||(r[31]=[e("i",{class:"el-icon-document-copy"},null,-1),b(" 复制提交哈希 ")])),e("div",{class:"context-menu-item",onClick:r[10]||(r[10]=o=>Rt(V.value))},r[32]||(r[32]=[e("i",{class:"el-icon-refresh-right"},null,-1),b(" 重置到该提交(hard) ")])),e("div",{class:"context-menu-item",onClick:r[11]||(r[11]=o=>nt(V.value))},r[33]||(r[33]=[e("i",{class:"el-icon-delete"},null,-1),b(" 撤销提交 (Revert) ")])),e("div",{class:"context-menu-item",onClick:r[12]||(r[12]=o=>pt(V.value))},r[34]||(r[34]=[e("i",{class:"el-icon-edit"},null,-1),b(" Cherry-Pick 到当前分支 ")]))],4),[[ss,xe.value]])],64)}}}),jo=Mt(Go,[["__scopeId","data-v-4ca4673a"]]),Uo="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",Po={class:"main-header"},Oo={class:"header-left"},Fo=["src"],No={class:"header-info"},Io={key:0,id:"user-info"},Ho={class:"user-name"},Xo={class:"user-email"},Wo={key:1,id:"user-info"},Jo={class:"directory-selector"},qo={class:"directory-display"},Yo={class:"directory-icon"},Zo=["title"],Ko={class:"directory-actions"},Qo={class:"main-container"},en={key:0,class:"loading-container"},tn={class:"loading-spinner"},sn={key:1,class:"grid-layout"},an={class:"git-status-panel"},ln={key:0,class:"commit-form-panel"},on={key:0,class:"card"},nn={class:"tips"},rn={key:1,class:"commit-form-panel"},cn={key:2,class:"log-list-panel"},un={class:"dialog-footer"},dn={class:"main-footer"},fn={key:0,class:"branch-info"},pn={class:"branch-wrapper"},vn={key:1,class:"footer-right"},mn={class:"repo-url"},gn={class:"dialog-footer"},hn={class:"directory-input-group"},yn={class:"recent-directories"},wn={class:"dialog-footer"},_n=Vt({__name:"App",setup($e){const v=u(""),x=u(null),p=u(null),g=_t(),O=is(),L=u(!1),U=u("");function H(){O.config&&(v.value=`默认提交信息: ${O.config.defaultCommitMessage}`)}async function oe(){try{const i=await(await fetch("/api/current_directory")).json();return U.value=i.directory||"未知目录",i}catch(y){return console.error("获取当前目录失败:",y),{directory:"未知目录",isGitRepo:!1}}}bt(async()=>{console.log("---------- 页面初始化开始 ----------");try{const y=await oe();O.isLoaded||await O.loadConfig(),H(),g.isGitRepo=y.isGitRepo===!0,g.lastCheckedTime=Date.now(),g.isGitRepo?await Promise.all([g.getCurrentBranch(),g.getAllBranches(),g.getUserInfo(),g.getRemoteUrl()]):n.warning("当前目录不是Git仓库,部分功能将不可用")}catch(y){console.error("初始化失败:",y)}finally{L.value=!0,console.log("---------- 页面初始化完成 ----------"),setTimeout(()=>{B()},100)}});const z=u(!1),Q=u(""),A=u("");async function S(){await g.createBranch(Q.value,A.value)&&(z.value=!1,Q.value="",p.value&&p.value.refreshStatus(),x.value&&x.value.refreshLog())}function Y(){A.value=g.currentBranch,z.value=!0}async function X(y){await g.changeBranch(y)&&(p.value&&p.value.refreshStatus(),x.value&&x.value.refreshLog())}const K=u(!1),N=u(""),_e=u("");function re(){N.value=g.userName,_e.value=g.userEmail,K.value=!0}async function E(){if(!N.value||!_e.value){n.warning("用户名和邮箱不能为空");return}await g.restoreUserConfig(N.value,_e.value)&&(K.value=!1)}async function se(){await g.clearUserConfig()&&(N.value="",_e.value="")}let D=!1,pe=!1,ee=0,T=0,h="",W="";function R(){const y=document.querySelector(".grid-layout");if(!y)return;const i=getComputedStyle(y).gridTemplateColumns.split(" "),J=getComputedStyle(y).gridTemplateRows.split(" ");if(i.length>=3&&J.length>=3){const j=parseFloat(i[0]),me=parseFloat(i[2]),Ae=j+me,ye=j/Ae,ge=parseFloat(J[0]),Be=parseFloat(J[2]),Ce=ge+Be,be=ge/Ce;localStorage.setItem("zen-gitsync-layout-left-ratio",ye.toString()),localStorage.setItem("zen-gitsync-layout-top-ratio",be.toString()),console.log(`布局比例已保存 - 左侧: ${(ye*100).toFixed(0)}%, 上方: ${(be*100).toFixed(0)}%`)}}function B(){const y=document.querySelector(".grid-layout");if(!y)return;const i=localStorage.getItem("zen-gitsync-layout-left-ratio"),J=localStorage.getItem("zen-gitsync-layout-top-ratio");if(i){const j=parseFloat(i),me=1-j;y.style.gridTemplateColumns=`${j}fr 8px ${me}fr`,console.log(`已恢复左侧比例: ${(j*100).toFixed(0)}%`)}else y.style.gridTemplateColumns="1fr 8px 3fr";if(J){const j=parseFloat(J),me=1-j;y.style.gridTemplateRows=`${j}fr 8px ${me}fr`,console.log(`已恢复上方比例: ${(j*100).toFixed(0)}%`)}}function ne(y){var J;D=!0,ee=y.clientX;const i=document.querySelector(".grid-layout");h=getComputedStyle(i).gridTemplateColumns,(J=document.getElementById("v-resizer"))==null||J.classList.add("active"),document.addEventListener("mousemove",xe),document.addEventListener("mouseup",Se),y.preventDefault()}function xe(y){if(!D)return;const i=document.querySelector(".grid-layout"),J=y.clientX-ee,j=h.split(" ");if(j.length>=3){const me=parseFloat(j[0]),Ae=parseFloat(j[2]),ye=me+Ae,ge=(me+J/i.clientWidth*ye)/ye,Be=1-ge,Ce=.1,be=.5;ge<Ce?i.style.gridTemplateColumns=`${Ce}fr 8px ${1-Ce}fr`:ge>be?i.style.gridTemplateColumns=`${be}fr 8px ${1-be}fr`:i.style.gridTemplateColumns=`${ge}fr 8px ${Be}fr`}}function Se(){var y;D=!1,(y=document.getElementById("v-resizer"))==null||y.classList.remove("active"),document.removeEventListener("mousemove",xe),document.removeEventListener("mouseup",Se),R()}function Ve(y){var J;pe=!0,T=y.clientY;const i=document.querySelector(".grid-layout");W=getComputedStyle(i).gridTemplateRows,(J=document.getElementById("h-resizer"))==null||J.classList.add("active"),document.addEventListener("mousemove",V),document.addEventListener("mouseup",fe),y.preventDefault()}function V(y){if(!pe)return;const i=document.querySelector(".grid-layout"),J=y.clientY-T,j=W.split(" ");if(j.length>=3){const me=parseFloat(j[0]),Ae=parseFloat(j[2]),ye=me+Ae,ge=(me+J/i.clientHeight*ye)/ye,Be=1-ge,Ce=.2,be=.8;ge<Ce?i.style.gridTemplateRows=`${Ce}fr 8px ${1-Ce}fr`:ge>be?i.style.gridTemplateRows=`${be}fr 8px ${1-be}fr`:i.style.gridTemplateRows=`${ge}fr 8px ${Be}fr`}}function fe(){var y;pe=!1,(y=document.getElementById("h-resizer"))==null||y.classList.remove("active"),document.removeEventListener("mousemove",V),document.removeEventListener("mouseup",fe),R()}const ue=u(!1),le=u(""),Ue=u(!1),Pe=u([]);async function Oe(){if(!U.value){n.warning("当前目录路径为空");return}try{await navigator.clipboard.writeText(U.value),n.success("已复制目录路径")}catch(y){console.error("复制目录路径失败:",y),n.error(`复制失败: ${y.message}`)}}function Fe(){le.value=U.value,ue.value=!0,lt()}async function lt(){try{const i=await(await fetch("/api/recent_directories")).json();i.success&&Array.isArray(i.directories)&&(Pe.value=i.directories)}catch(y){console.error("获取最近目录失败:",y)}}async function Je(){if(!le.value){n.warning("目录路径不能为空");return}try{Ue.value=!0;const i=await(await fetch("/api/change_directory",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:le.value})})).json();i.success?(n.success("已切换工作目录"),U.value=i.directory,ue.value=!1,await et(i.directory),g.isGitRepo=i.isGitRepo,i.isGitRepo?(await Promise.all([g.getCurrentBranch(),g.getAllBranches(),g.getUserInfo(),g.getRemoteUrl()]),p.value&&p.value.refreshStatus(),x.value&&x.value.refreshLog()):(n.warning("当前目录不是Git仓库,部分功能将不可用"),g.$reset())):n.error(i.error||"切换目录失败")}catch(y){n.error(`切换目录失败: ${y.message}`)}finally{Ue.value=!1}}async function et(y){try{await fetch("/api/save_recent_directory",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:y})})}catch(i){console.error("保存最近目录失败:",i)}}async function qe(){try{if(!U.value){n.warning("当前目录路径为空");return}const i=await(await fetch("/api/open_directory",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:U.value})})).json();i.success?n.success("已在文件管理器中打开目录"):i.error&&n.error(i.error)}catch(y){console.error("打开目录失败:",y),n.error(`打开目录失败: ${y.message}`)}}async function ze(){try{const i=await(await fetch("/api/browse_directory",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({currentPath:le.value||U.value})})).json();i.success?ve(i):i.error&&n.error(i.error)}catch(y){console.error("浏览目录失败:",y),n.error(`浏览目录失败: ${y.message}`)}}function ve(y){!y||!y.items||Qe.alert(De("div",{class:"directory-browser"},[De("div",{class:"current-path"},[De("span",{class:"path-label"},"当前路径: "),De("span",{class:"path-value"},y.path)]),De("div",{class:"directory-list"},[y.parentPath?De("div",{class:"directory-item parent-dir",onClick:()=>{Ne(y.parentPath)}},[De("span",{class:"dir-icon"},De("svg",{class:"folder-icon",viewBox:"0 0 24 24",width:"20",height:"20",style:{fill:"#E6A23C"}},[De("path",{d:"M10 4H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V8c0-1.1-.9-2-2-2h-8l-2-2z"})])),De("span",{class:"dir-name"},"返回上级目录")]):null,...y.items.map(i=>De("div",{class:"directory-item",onClick:()=>{Ne(i.path)}},[De("span",{class:"dir-icon"},De("svg",{class:"folder-icon",viewBox:"0 0 24 24",width:"20",height:"20",style:{fill:"#409EFF"}},[De("path",{d:"M10 4H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V8c0-1.1-.9-2-2-2h-8l-2-2z"})])),De("span",{class:"dir-name"},i.name)]))])]),"浏览并选择目录",{confirmButtonText:"使用当前目录",customClass:"directory-browser-dialog",callback:i=>{i==="confirm"&&(le.value=y.path)}})}async function Ne(y){try{Qe.close(),setTimeout(async()=>{try{const J=await(await fetch("/api/browse_directory",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({currentPath:y})})).json();J.success?ve(J):J.error&&n.error(J.error)}catch(i){console.error("浏览目录失败:",i),n.error(`浏览目录失败: ${i.message}`)}},100)}catch(i){console.error("处理目录选择时出错:",i),n.error(`处理目录选择时出错: ${i.message}`)}}return(y,i)=>{const J=At,j=je,me=ls,Ae=Ot,ye=ns,ge=Tt,Be=xt,Ce=os,be=Bt,ot=ts,Ye=Lt;return m(),w(Te,null,[e("header",Po,[e("div",Oo,[e("img",{src:l(Uo),alt:"Zen GitSync Logo",class:"logo"},null,8,Fo),i[14]||(i[14]=e("h1",null,"Zen GitSync UI",-1))]),e("div",No,[l(g).userName&&l(g).userEmail?(m(),w("div",Io,[i[15]||(i[15]=e("span",{class:"user-label"},"用户:",-1)),e("span",Ho,M(l(g).userName),1),e("span",Xo,"<"+M(l(g).userEmail)+">",1),s(j,{type:"primary",size:"small",onClick:re,class:"user-settings-btn",circle:""},{default:a(()=>[s(J,null,{default:a(()=>[s(l(wt))]),_:1})]),_:1})])):(m(),w("div",Wo,[i[16]||(i[16]=e("span",{class:"user-label"},"用户: ",-1)),i[17]||(i[17]=e("span",{class:"user-warning"},"未配置",-1)),s(j,{type:"primary",size:"small",onClick:re,class:"user-settings-btn",circle:""},{default:a(()=>[s(J,null,{default:a(()=>[s(l(wt))]),_:1})]),_:1})])),e("div",Jo,[e("div",qo,[e("div",Yo,[s(J,null,{default:a(()=>[s(l(Xt))]),_:1})]),e("div",{class:"directory-path",title:U.value},M(U.value),9,Zo)]),e("div",Ko,[s(j,{type:"primary",size:"small",onClick:Fe,class:"dir-button",circle:"",title:"切换目录"},{default:a(()=>[s(J,null,{default:a(()=>i[18]||(i[18]=[e("svg",{viewBox:"0 0 1024 1024",xmlns:"http://www.w3.org/2000/svg"},[e("path",{fill:"currentColor",d:"M128 192v640h768V320H485.76L357.504 192H128zm-32-64h287.872l128.384 128H928a32 32 0 0 1 32 32v576a32 32 0 0 1-32 32H96a32 32 0 0 1-32-32V160a32 32 0 0 1 32-32z"})],-1)])),_:1})]),_:1}),s(j,{type:"success",size:"small",onClick:qe,class:"dir-button",circle:"",title:"在资源管理器中打开"},{default:a(()=>[s(J,null,{default:a(()=>i[19]||(i[19]=[e("svg",{viewBox:"0 0 1024 1024",xmlns:"http://www.w3.org/2000/svg"},[e("path",{fill:"currentColor",d:"M928 444H820V330.4c0-17.7-14.3-32-32-32H473L355.7 186.2a8.15 8.15 0 0 0-5.5-2.2H96c-17.7 0-32 14.3-32 32v592c0 17.7 14.3 32 32 32h698c13 0 24.8-7.9 29.7-20l134-332c1.5-3.8 2.3-7.9 2.3-12 0-17.7-14.3-32-32-32zM136 256h188.5l119.6 114.4H748V444H238c-13 0-24.8 7.9-29.7 20L136 643.2V256zm635.3 512H159l103.3-256h612.4L771.3 768z"})],-1)])),_:1})]),_:1}),s(j,{type:"info",size:"small",onClick:Oe,class:"dir-button",circle:"",title:"复制路径"},{default:a(()=>[s(J,null,{default:a(()=>i[20]||(i[20]=[e("svg",{viewBox:"0 0 1024 1024",xmlns:"http://www.w3.org/2000/svg"},[e("path",{fill:"currentColor",d:"M768 832a128 128 0 0 1-128 128H192A128 128 0 0 1 64 832V384a128 128 0 0 1 128-128v64a64 64 0 0 0-64 64v448a64 64 0 0 0 64 64h448a64 64 0 0 0 64-64h64z"}),e("path",{fill:"currentColor",d:"M384 128a64 64 0 0 0-64 64v448a64 64 0 0 0 64 64h448a64 64 0 0 0 64-64V192a64 64 0 0 0-64-64H384zm0-64h448a128 128 0 0 1 128 128v448a128 128 0 0 1-128 128H384a128 128 0 0 1-128-128V192A128 128 0 0 1 384 64z"})],-1)])),_:1})]),_:1})])])])]),e("main",Qo,[L.value?(m(),w("div",sn,[e("div",an,[s(Sa,{ref_key:"gitStatusRef",ref:p,"initial-directory":U.value},null,8,["initial-directory"])]),e("div",{class:"vertical-resizer",id:"v-resizer",onMousedown:ne},null,32),l(g).isGitRepo?(m(),w("div",ln,[!l(g).userName||!l(g).userEmail?(m(),w("div",on,[i[26]||(i[26]=e("h2",null,"Git用户未配置",-1)),i[27]||(i[27]=e("p",null,"请先配置Git用户信息才能进行提交操作。",-1)),e("div",nn,[i[24]||(i[24]=e("h3",null,"您可以通过以下方式配置:",-1)),i[25]||(i[25]=e("ol",null,[e("li",null,"点击右上角的设置按钮,配置用户名和邮箱"),e("li",null,"或者使用命令行配置:"),e("div",{class:"code-block"},[b(' git config --global user.name "您的用户名"'),e("br"),b(' git config --global user.email "您的邮箱" ')])],-1)),s(j,{type:"primary",onClick:re},{default:a(()=>i[23]||(i[23]=[b(" 立即配置 ")])),_:1})])])):(m(),ae(Wl,{key:1}))])):(m(),w("div",rn,i[28]||(i[28]=[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:Ve},null,32),l(g).isGitRepo?(m(),w("div",cn,[s(jo,{ref_key:"logListRef",ref:x},null,512)])):q("",!0),s(be,{modelValue:z.value,"onUpdate:modelValue":i[3]||(i[3]=c=>z.value=c),title:"创建新分支",width:"30%","destroy-on-close":""},{footer:a(()=>[e("span",un,[s(j,{onClick:i[2]||(i[2]=c=>z.value=!1)},{default:a(()=>i[29]||(i[29]=[b("取消")])),_:1}),s(j,{type:"primary",onClick:S,loading:l(g).isCreatingBranch},{default:a(()=>i[30]||(i[30]=[b(" 创建 ")])),_:1},8,["loading"])])]),default:a(()=>[s(Ce,{model:{newBranchName:Q.value,selectedBaseBranch:A.value}},{default:a(()=>[s(ye,{label:"新分支名称"},{default:a(()=>[s(Ae,{modelValue:Q.value,"onUpdate:modelValue":i[0]||(i[0]=c=>Q.value=c),placeholder:"请输入新分支名称"},null,8,["modelValue"])]),_:1}),s(ye,{label:"基于分支"},{default:a(()=>[s(Be,{modelValue:A.value,"onUpdate:modelValue":i[1]||(i[1]=c=>A.value=c),placeholder:"选择基础分支",style:{width:"100%"}},{default:a(()=>[(m(!0),w(Te,null,Ge(l(g).allBranches,c=>(m(),ae(ge,{key:c,label:c,value:c},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])]),_:1})]),_:1},8,["model"])]),_:1},8,["modelValue"])])):(m(),w("div",en,[s(me,{class:"loading-card"},{default:a(()=>[e("div",tn,[s(J,{class:"is-loading"},{default:a(()=>i[21]||(i[21]=[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})]),i[22]||(i[22]=e("div",{class:"loading-text"},"加载中...",-1))]),_:1})]))]),e("footer",dn,[l(g).currentBranch?(m(),w("div",fn,[e("div",pn,[i[32]||(i[32]=e("span",{class:"branch-label"},"当前分支:",-1)),s(Be,{modelValue:l(g).currentBranch,"onUpdate:modelValue":i[4]||(i[4]=c=>l(g).currentBranch=c),size:"small",onChange:X,loading:l(g).isChangingBranch,class:"branch-select"},{default:a(()=>[(m(!0),w(Te,null,Ge(l(g).allBranches,c=>(m(),ae(ge,{key:c,label:c,value:c},null,8,["label","value"]))),128))]),_:1},8,["modelValue","loading"]),s(j,{type:"primary",size:"small",onClick:Y,class:"create-branch-btn"},{default:a(()=>[s(J,null,{default:a(()=>[s(l(Bs))]),_:1}),i[31]||(i[31]=b(" 新建分支 "))]),_:1})])])):q("",!0),l(g).remoteUrl?(m(),w("div",vn,[i[34]||(i[34]=e("span",{class:"repo-url-label"},"远程仓库:",-1)),e("span",mn,M(l(g).remoteUrl),1),s(j,{type:"primary",circle:"",size:"small",onClick:i[5]||(i[5]=c=>l(g).copyRemoteUrl()),class:"copy-url-btn",title:"复制仓库地址"},{default:a(()=>[s(J,null,{default:a(()=>i[33]||(i[33]=[e("svg",{viewBox:"0 0 1024 1024",xmlns:"http://www.w3.org/2000/svg"},[e("path",{fill:"currentColor",d:"M768 832a128 128 0 0 1-128 128H192A128 128 0 0 1 64 832V384a128 128 0 0 1 128-128v64a64 64 0 0 0-64 64v448a64 64 0 0 0 64 64h448a64 64 0 0 0 64-64h64z"}),e("path",{fill:"currentColor",d:"M384 128a64 64 0 0 0-64 64v448a64 64 0 0 0 64 64h448a64 64 0 0 0 64-64V192a64 64 0 0 0-64-64H384zm0-64h448a128 128 0 0 1 128 128v448a128 128 0 0 1-128 128H384a128 128 0 0 1-128-128V192A128 128 0 0 1 384 64z"})],-1)])),_:1})]),_:1})])):q("",!0)]),s(be,{modelValue:K.value,"onUpdate:modelValue":i[9]||(i[9]=c=>K.value=c),title:"Git用户设置",width:"30%","destroy-on-close":""},{footer:a(()=>[e("span",gn,[s(j,{type:"danger",onClick:se},{default:a(()=>i[36]||(i[36]=[b(" 清除配置 ")])),_:1}),s(j,{onClick:i[8]||(i[8]=c=>K.value=!1)},{default:a(()=>i[37]||(i[37]=[b("取消")])),_:1}),s(j,{type:"primary",onClick:E},{default:a(()=>i[38]||(i[38]=[b(" 保存 ")])),_:1})])]),default:a(()=>[s(Ce,null,{default:a(()=>[s(ye,{label:"用户名"},{default:a(()=>[s(Ae,{modelValue:N.value,"onUpdate:modelValue":i[6]||(i[6]=c=>N.value=c),placeholder:"请输入Git用户名"},null,8,["modelValue"])]),_:1}),s(ye,{label:"邮箱"},{default:a(()=>[s(Ae,{modelValue:_e.value,"onUpdate:modelValue":i[7]||(i[7]=c=>_e.value=c),placeholder:"请输入Git邮箱"},null,8,["modelValue"])]),_:1}),s(ye,null,{default:a(()=>[s(ot,{type:"info",closable:!1,"show-icon":""},{default:a(()=>i[35]||(i[35]=[b(" 这些设置将影响全局Git配置,对所有Git仓库生效。 ")])),_:1})]),_:1})]),_:1})]),_:1},8,["modelValue"]),s(be,{modelValue:ue.value,"onUpdate:modelValue":i[13]||(i[13]=c=>ue.value=c),title:"切换工作目录",width:"50%","destroy-on-close":""},{footer:a(()=>[e("span",wn,[s(j,{onClick:i[11]||(i[11]=c=>ue.value=!1)},{default:a(()=>i[40]||(i[40]=[b("取消")])),_:1}),s(j,{type:"primary",onClick:i[12]||(i[12]=c=>Je()),loading:Ue.value},{default:a(()=>i[41]||(i[41]=[b(" 切换 ")])),_:1},8,["loading"])])]),default:a(()=>[s(Ce,null,{default:a(()=>[s(ye,{label:"目录路径"},{default:a(()=>[e("div",hn,[s(Ae,{modelValue:le.value,"onUpdate:modelValue":i[10]||(i[10]=c=>le.value=c),placeholder:"请输入目录路径"},null,8,["modelValue"]),s(j,{type:"primary",onClick:ze},{default:a(()=>[s(J,null,{default:a(()=>[s(l(Xt))]),_:1}),i[39]||(i[39]=b(" 浏览 "))]),_:1})])]),_:1}),Pe.value.length>0?(m(),ae(ye,{key:0,label:"常用目录"},{default:a(()=>[e("div",yn,[(m(!0),w(Te,null,Ge(Pe.value,(c,f)=>(m(),ae(Ye,{key:f,class:"recent-dir-tag",onClick:I=>le.value=c,effect:"plain"},{default:a(()=>[b(M(c),1)]),_:2},1032,["onClick"]))),128))])]),_:1})):q("",!0)]),_:1})]),_:1},8,["modelValue"])],64)}}}),bn=Mt(_n,[["__scopeId","data-v-98ed32bc"]]),rs=Ms(bn);rs.use(Rs());rs.mount("#app");
|