zen-gitsync 2.1.11 → 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-BQ-ro2xx.js +22 -0
- package/src/ui/public/assets/index-C3GOpTEq.css +1 -0
- 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 +5 -5
- package/src/ui/server/index.js +79 -13
- package/src/utils/index.js +2 -1
- package/src/ui/public/assets/index-2zWLRJg9.css +0 -1
- package/src/ui/public/assets/index-BKaSsEOq.js +0 -22
- package/src/ui/public/assets/vendor-Dp0FkvMe.css +0 -1
- package/src/ui/public/assets/vendor-lzd7uK7e.js +0 -45
package/package.json
CHANGED
|
@@ -0,0 +1,22 @@
|
|
|
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
|
+
`),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
|
+
`),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
|
+
`);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}
|
|
5
|
+
新文件: ${T}
|
|
6
|
+
--- /dev/null
|
|
7
|
+
+++ b/${T}
|
|
8
|
+
@@ -0,0 +1,${R.content.split(`
|
|
9
|
+
`).length} @@
|
|
10
|
+
`+R.content.split(`
|
|
11
|
+
`).map(B=>`+${B}`).join(`
|
|
12
|
+
`):L.value=`这是一个新文件,尚未被Git跟踪。
|
|
13
|
+
添加到暂存区后可以提交该文件。`}catch(W){console.error("获取未跟踪文件内容失败:",W),L.value=`这是一个新文件,尚未被Git跟踪。
|
|
14
|
+
添加到暂存区后可以提交该文件。`}U.value=!0}else if(h&&h.type==="added"){const R=await(await fetch(`/api/diff-cached?file=${encodeURIComponent(T)}`)).json();L.value=R.diff||"没有变更",U.value=!0}else{const R=await(await fetch(`/api/diff?file=${encodeURIComponent(T)}`)).json();L.value=R.diff||"没有变更",U.value=!0}}catch(h){n({message:"获取文件差异失败: "+h.message,type:"error"}),L.value="获取差异失败: "+h.message}finally{H.value=!1}}async function Y(){if(p.fileList.length===0||oe.value<=0)return;const T=oe.value-1,h=p.fileList[T];await S(h.path)}async function X(){if(p.fileList.length===0||oe.value>=p.fileList.length-1)return;const T=oe.value+1,h=p.fileList[T];await S(h.path)}function K(T){S(T.path)}async function N(T){await p.addFileToStage(T)}async function _e(T){await p.unstageFile(T)}async function re(){await Q()}async function E(){try{await p.gitPull(),await Q()}catch(T){console.error("拉取操作发生错误:",T)}}async function se(){try{await p.gitFetchAll(),await Q()}catch(T){console.error("获取远程分支信息操作发生错误:",T)}}async function D(T){try{await Qe.confirm(`确定要撤回文件 "${T}" 的所有修改吗?此操作无法撤销。`,"撤回修改",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"});const W=await(await fetch("/api/revert_file",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({filePath:T})})).json();W.success?(n.success("已撤回文件修改"),await Q()):n.error(W.error?`撤回失败: ${W.error}`:"撤回文件修改失败,请重试")}catch(h){if(h==="cancel"||h.message==="cancel")return;const W=h.message||"未知错误";W!=="undefined"?n.error(`撤回文件修改失败: ${W}`):n.error("撤回文件修改失败,请重试")}}function pe(T){const h=T.split("/");return h[h.length-1]}function ee(T){const h=T.split("/");return h.length<=1?"":h.slice(0,-1).join("/")}return bt(()=>{Q()}),Ke(()=>p.autoUpdateEnabled,(T,h)=>{console.log(`自动更新状态变更: ${h} -> ${T}`),p.toggleAutoUpdate()},{immediate:!1}),v({refreshStatus:re}),(T,h)=>{const W=Jt,R=Ut,B=je,ne=At,xe=Lt,Se=Bt,Ve=Kt;return m(),w(Te,null,[e("div",Es,[e("div",zs,[h[2]||(h[2]=e("h2",null,"Git 状态",-1)),e("div",Ds,[s(R,{content:l(p).autoUpdateEnabled?"禁用自动更新文件状态":"启用自动更新文件状态",placement:"top","hide-after":1e3},{default:a(()=>[s(W,{modelValue:l(p).autoUpdateEnabled,"onUpdate:modelValue":h[0]||(h[0]=V=>l(p).autoUpdateEnabled=V),style:{"--el-switch-on-color":"#67C23A","--el-switch-off-color":"#909399","margin-right":"10px"},"inline-prompt":"","active-icon":l(qt),"inactive-icon":l(Ft),class:"auto-update-switch"},null,8,["modelValue","active-icon","inactive-icon"])]),_:1},8,["content"]),s(R,{content:"Git Pull (拉取远程更新)",placement:"top","hide-after":1e3},{default:a(()=>[s(B,{type:"primary",icon:l(Yt),circle:"",size:"small",onClick:E,loading:l(p).isGitPulling,disabled:!l(p).hasUpstream},null,8,["icon","loading","disabled"])]),_:1}),s(R,{content:"Git Fetch All (获取所有远程分支)",placement:"top","hide-after":1e3},{default:a(()=>[s(B,{type:"info",icon:l(Zt),circle:"",size:"small",onClick:se,loading:l(p).isGitFetching},null,8,["icon","loading"])]),_:1}),s(R,{content:"刷新状态",placement:"top","hide-after":1e3},{default:a(()=>[s(B,{type:"primary",icon:l(ds),circle:"",size:"small",onClick:re,loading:g.value},null,8,["icon","loading"])]),_:1})])]),ft((m(),w("div",{class:"card-content","element-loading-text":l(p).isGitPulling?"正在拉取代码...":"正在获取远程分支信息..."},[l(p).isGitRepo?(m(),w("div",Us,[l(p).hasUpstream&&(l(p).branchAhead>0||l(p).branchBehind>0)?(m(),w("div",Ps,[e("div",Os,[e("div",Fs,[s(R,{content:"本地分支与远程分支的状态对比",placement:"top"},{default:a(()=>[e("div",Ns,[l(p).branchAhead>0?(m(),ae(xe,{key:0,size:"small",type:"warning",class:"status-badge"},{default:a(()=>[e("span",Is,[s(ne,null,{default:a(()=>[s(l(fs))]),_:1}),b(" 你的分支领先 'origin/"+M(l(p).currentBranch)+"' "+M(l(p).branchAhead)+" 个提交 ",1)])]),_:1})):q("",!0),l(p).branchBehind>0?(m(),ae(xe,{key:1,size:"small",type:"info",class:"status-badge"},{default:a(()=>[e("span",Hs,[s(ne,null,{default:a(()=>[s(l(Qt))]),_:1}),b(" 你的分支落后 'origin/"+M(l(p).currentBranch)+"' "+M(l(p).branchBehind)+" 个提交 ",1)])]),_:1})):q("",!0)])]),_:1})])])])):q("",!0),l(p).fileList.length?(m(),w("div",Xs,[l(p).fileList.some(V=>V.type==="added")?(m(),w("div",Ws,[h[5]||(h[5]=e("div",{class:"file-group-header"},"已暂存的更改",-1)),e("div",Js,[(m(!0),w(Te,null,Ge(l(p).fileList.filter(V=>V.type==="added"),V=>(m(),w("div",{key:V.path,class:"file-item",onClick:fe=>K(V)},[e("div",Ys,[e("div",Zs,[e("span",Ks,M(pe(V.path)),1),e("span",Qs,M(ee(V.path)),1)])]),e("div",ea,[s(R,{content:"取消暂存",placement:"top","hide-after":1e3},{default:a(()=>[s(B,{type:"warning",size:"small",circle:"",onClick:gt(fe=>_e(V.path),["stop"])},{default:a(()=>h[4]||(h[4]=[b("-")])),_:2},1032,["onClick"])]),_:2},1024)])],8,qs))),128))])])):q("",!0),l(p).fileList.some(V=>V.type==="modified"||V.type==="deleted")?(m(),w("div",ta,[h[7]||(h[7]=e("div",{class:"file-group-header"},"未暂存的更改",-1)),e("div",sa,[(m(!0),w(Te,null,Ge(l(p).fileList.filter(V=>V.type==="modified"||V.type==="deleted"),V=>(m(),w("div",{key:V.path,class:"file-item",onClick:fe=>K(V)},[e("div",la,[e("div",{class:Xe(["file-status-indicator",V.type])},null,2),e("div",oa,[e("span",na,M(pe(V.path)),1),e("span",ia,M(ee(V.path)),1)])]),e("div",ra,[s(R,{content:"添加到暂存区",placement:"top","hide-after":1e3},{default:a(()=>[s(B,{type:"success",size:"small",circle:"",onClick:gt(fe=>N(V.path),["stop"])},{default:a(()=>h[6]||(h[6]=[b("+")])),_:2},1032,["onClick"])]),_:2},1024),s(R,{content:"撤回修改",placement:"top","hide-after":1e3},{default:a(()=>[s(B,{type:"danger",size:"small",icon:l(Pt),circle:"",onClick:gt(fe=>D(V.path),["stop"])},null,8,["icon","onClick"])]),_:2},1024)])],8,aa))),128))])])):q("",!0),l(p).fileList.some(V=>V.type==="untracked")?(m(),w("div",ca,[h[10]||(h[10]=e("div",{class:"file-group-header"},"未跟踪的文件",-1)),e("div",ua,[(m(!0),w(Te,null,Ge(l(p).fileList.filter(V=>V.type==="untracked"),V=>(m(),w("div",{key:V.path,class:"file-item",onClick:fe=>K(V)},[e("div",fa,[h[8]||(h[8]=e("div",{class:"file-status-indicator untracked"},null,-1)),e("div",pa,[e("span",va,M(pe(V.path)),1),e("span",ma,M(ee(V.path)),1)])]),e("div",ga,[s(R,{content:"添加到暂存区",placement:"top","hide-after":1e3},{default:a(()=>[s(B,{type:"success",size:"small",circle:"",onClick:gt(fe=>N(V.path),["stop"])},{default:a(()=>h[9]||(h[9]=[b("+")])),_:2},1032,["onClick"])]),_:2},1024),s(R,{content:"删除文件",placement:"top","hide-after":1e3},{default:a(()=>[s(B,{type:"danger",size:"small",icon:l(Ft),circle:"",onClick:gt(fe=>D(V.path),["stop"])},null,8,["icon","onClick"])]),_:2},1024)])],8,da))),128))])])):q("",!0)])):l(p).isGitRepo?(m(),w("div",ha,[e("div",ya,[s(ne,null,{default:a(()=>[s(l(es))]),_:1})]),h[11]||(h[11]=e("div",{class:"empty-text"},"没有检测到任何更改",-1)),h[12]||(h[12]=e("div",{class:"empty-subtext"},"工作区是干净的",-1))])):q("",!0)])):(m(),w("div",js,h[3]||(h[3]=[e("div",{class:"empty-status"},[e("p",null,"当前目录不是Git仓库")],-1)])))],8,Gs)),[[Ve,l(p).isGitPulling||l(p).isGitFetching]])]),s(Se,{modelValue:U.value,"onUpdate:modelValue":h[1]||(h[1]=V=>U.value=V),title:`文件差异: ${O.value}`,width:"80%","destroy-on-close":"",class:"diff-dialog"},{footer:a(()=>[e("div",$a,[s(B,{type:"primary",icon:l(ps),onClick:Y,disabled:oe.value<=0||l(p).fileList.length===0,plain:"",class:"nav-button"},{default:a(()=>h[13]||(h[13]=[b(" 上一个文件 ")])),_:1},8,["icon","disabled"]),e("div",Ca,[s(xe,{type:"info",effect:"plain",class:"counter-tag"},{default:a(()=>[b(M(oe.value+1)+" / "+M(l(p).fileList.length),1)]),_:1})]),s(B,{type:"primary",icon:l(Nt),onClick:X,disabled:oe.value>=l(p).fileList.length-1||l(p).fileList.length===0,plain:"",class:"nav-button"},{icon:a(()=>[s(ne,{class:"el-icon--right"},{default:a(()=>[s(l(Nt))]),_:1})]),default:a(()=>[h[14]||(h[14]=b(" 下一个文件 "))]),_:1},8,["icon","disabled"])])]),default:a(()=>[ft((m(),w("div",wa,[L.value?(m(),w("div",{key:0,innerHTML:A(L.value),class:"diff-formatted"},null,8,_a)):(m(),w("div",ba,"该文件没有差异或是新文件"))])),[[Ve,H.value]])]),_:1},8,["modelValue","title"])],64)}}}),Mt=($e,v)=>{const x=$e.__vccOpts||$e;for(const[p,g]of v)x[p]=g;return x},Sa=Mt(ka,[["__scopeId","data-v-c005b533"]]),is=Wt("config",()=>{const $e=u(""),v=u([]),x=u([]),p=u([]),g=u(!1),O=u(!1),L=Ee(()=>({defaultCommitMessage:$e.value,descriptionTemplates:v.value,scopeTemplates:x.value,messageTemplates:p.value}));async function U(){if(O.value&&!g.value)return console.log("使用缓存的配置信息"),L.value;try{g.value=!0,console.log("加载配置信息...");const S=await(await fetch("/api/config/getConfig")).json();return $e.value=S.defaultCommitMessage||"",v.value=S.descriptionTemplates||[],x.value=S.scopeTemplates||[],p.value=S.messageTemplates||[],O.value=!0,console.log("配置信息加载完成"),L.value}catch(A){return console.error("加载配置失败:",A),n.error(`加载配置失败: ${A.message}`),null}finally{g.value=!1}}async function H(A){try{const Y=await(await fetch("/api/config/saveDefaultMessage",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({defaultCommitMessage:A})})).json();return Y.success?($e.value=A,n.success("默认提交信息已保存"),!0):(n.error(`保存失败: ${Y.error}`),!1)}catch(S){return n.error(`保存失败: ${S.message}`),!1}}async function oe(A,S){try{const X=await(await fetch("/api/config/save-template",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({template:A,type:S})})).json();return X.success?(S==="description"?v.value.includes(A)||v.value.push(A):S==="scope"?x.value.includes(A)||x.value.push(A):S==="message"&&(p.value.includes(A)||p.value.push(A)),n.success("模板已保存"),!0):(n.error(`保存模板失败: ${X.error}`),!1)}catch(Y){return n.error(`保存模板失败: ${Y.message}`),!1}}async function z(A,S){try{const X=await(await fetch("/api/config/delete-template",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({template:A,type:S})})).json();return X.success?(S==="description"?v.value=v.value.filter(K=>K!==A):S==="scope"?x.value=x.value.filter(K=>K!==A):S==="message"&&(p.value=p.value.filter(K=>K!==A)),n.success("模板已删除"),!0):(n.error(`删除模板失败: ${X.error}`),!1)}catch(Y){return n.error(`删除模板失败: ${Y.message}`),!1}}async function Q(A,S,Y){try{const K=await(await fetch("/api/config/update-template",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldTemplate:A,newTemplate:S,type:Y})})).json();if(K.success){if(Y==="description"){const N=v.value.indexOf(A);N!==-1&&(v.value[N]=S)}else if(Y==="scope"){const N=x.value.indexOf(A);N!==-1&&(x.value[N]=S)}else if(Y==="message"){const N=p.value.indexOf(A);N!==-1&&(p.value[N]=S)}return n.success("模板已更新"),!0}else return n.error(`更新模板失败: ${K.error}`),!1}catch(X){return n.error(`更新模板失败: ${X.message}`),!1}}return{defaultCommitMessage:$e,descriptionTemplates:v,scopeTemplates:x,messageTemplates:p,isLoading:g,isLoaded:O,config:L,loadConfig:U,saveDefaultMessage:H,saveTemplate:oe,deleteTemplate:z,updateTemplate:Q}}),Ta={key:0,class:"pushing-indicator"},xa={key:0,class:"push-success-indicator"},Va={class:"card-content"},La={class:"layout-container"},Aa={key:0,class:"git-config-warning"},Ba={class:"commit-section"},Ma={class:"commit-options"},Ra={class:"options-row"},Ea={class:"commit-mode-toggle"},za={class:"no-verify-toggle"},Da={key:0,class:"commit-form"},Ga={class:"description-container"},ja={class:"input-actions"},Ua={class:"preview-section"},Pa={class:"preview-content code-command"},Oa={class:"form-bottom-actions"},Fa={class:"button-row"},Na={key:0},Ia={key:0},Ha={key:1,class:"standard-commit-form"},Xa={class:"standard-commit-header"},Wa={class:"type-scope-container"},Ja={class:"scope-wrapper"},qa={class:"description-container"},Ya={class:"advanced-fields"},Za={class:"preview-section"},Ka={class:"preview-content code-command"},Qa={class:"form-bottom-actions"},el={class:"button-row"},tl={key:0},sl={key:0},al={class:"actions-section"},ll={class:"action-groups"},ol={class:"operations-wrapper"},nl={class:"action-group"},il={class:"group-buttons"},rl={key:0},cl={key:0},ul={key:0},dl={key:0},fl={class:"action-group"},pl={class:"group-buttons"},vl={class:"action-group reset-group"},ml={class:"group-buttons"},gl={key:0},hl={class:"action-group branch-group"},yl={class:"group-buttons"},wl={class:"template-container"},_l={class:"template-form"},bl={class:"template-form-buttons"},$l={class:"template-list"},Cl={class:"template-content"},kl={class:"template-actions"},Sl={class:"template-container"},Tl={class:"template-form"},xl={class:"template-form-buttons"},Vl={class:"template-list"},Ll={class:"template-content"},Al={class:"template-actions"},Bl={class:"template-container message-template-container"},Ml={class:"template-form"},Rl={class:"template-form-buttons"},El={class:"templates-container"},zl={class:"message-templates-list"},Dl={class:"templates-scroll-area"},Gl={class:"template-content"},jl={class:"template-actions"},Ul={class:"current-default-message"},Pl={class:"default-message-content"},Ol={class:"message-help-text"},Fl={class:"merge-dialog-content"},Nl={class:"merge-intro"},Il={class:"merge-options"},Hl={class:"dialog-footer"},Xl=Vt({__name:"CommitForm",setup($e){const v=_t(),x=is(),p=u(""),g=u(!1),O=u("输入提交信息..."),L=u(""),U=u(!1),H=u("feat"),oe=u(""),z=u(""),Q=u(""),A=u(""),S=u([]),Y=u(!1),X=u(""),K=u(!1),N=u(""),_e=u(-1),re=u(!1),E=u(""),se=u({noFf:!1,squash:!1,noCommit:!1,message:""}),D=u([]),pe=u(!1),ee=u(""),T=u(!1),h=u(""),W=u(-1),R=u(!1),B=u(""),ne=u(!1),xe=u(!1),Se=[{value:"feat",label:"feat: 新功能"},{value:"fix",label:"fix: 修复bug"},{value:"docs",label:"docs: 文档修改"},{value:"style",label:"style: 样式修改"},{value:"refactor",label:"refactor: 代码重构"},{value:"test",label:"test: 测试代码"},{value:"chore",label:"chore: 构建/工具修改"}],Ve=u([]),V=u(!1),fe=u(""),ue=u(-1);Ke(U,o=>{localStorage.setItem("zen-gitsync-standard-commit",o.toString())}),Ke(ne,o=>{localStorage.setItem("zen-gitsync-skip-hooks",o.toString())});const le=Ee(()=>{if(!U.value)return p.value||L.value;let o=`${H.value||""}`;return oe.value&&(o+=`(${oe.value})`),o+=`: ${z.value}`,Q.value&&(o+=`
|
|
15
|
+
|
|
16
|
+
${Q.value}`),A.value&&(o+=`
|
|
17
|
+
|
|
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-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
|
+
`);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
|
+
|
|
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");
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.card[data-v-c005b533]{background-color:#fff;border-radius:12px;box-shadow:0 2px 12px #0000000a;border:1px solid rgba(0,0,0,.03);height:100%;width:100%;display:flex;flex-direction:column;overflow:hidden;transition:all .3s ease;position:relative}.status-header[data-v-c005b533]{display:flex;justify-content:space-between;align-items:center;padding:12px 16px;border-bottom:1px solid #f0f0f0}.status-header h2[data-v-c005b533]{margin:0;font-size:16px;font-weight:500;color:#303133}.header-actions[data-v-c005b533]{display:flex;align-items:center;gap:8px}.card-content[data-v-c005b533]{padding:16px;overflow-y:auto;overflow-x:hidden;flex:1;display:flex;flex-direction:column}.status-box[data-v-c005b533]{white-space:pre-wrap;font-family:monospace;background-color:#f8f9fa;padding:16px;border-radius:8px;margin-bottom:20px;max-height:200px;overflow-y:auto;overflow-x:hidden;border:1px solid #f0f0f0;font-size:14px;line-height:1.5;width:100%;box-sizing:border-box}.file-list-container[data-v-c005b533]{flex:1;overflow:hidden;display:flex;flex-direction:column;gap:16px;height:auto;min-height:100px;width:100%;box-sizing:border-box}.file-group[data-v-c005b533]{background-color:#f8f9fa;border-radius:8px;overflow:hidden;border:1px solid #ebeef5;margin-bottom:0;display:flex;flex-direction:column;transition:box-shadow .3s ease}.file-group[data-v-c005b533]:hover{box-shadow:0 4px 12px #0000000d}.file-group[data-v-c005b533]{flex:0 1 auto}.file-group[data-v-c005b533]:last-child{margin-bottom:0;flex:1 1 auto}.file-group-header[data-v-c005b533]{font-size:14px;font-weight:700;padding:10px 16px;background-color:#f0f2f5;color:#606266;border-bottom:1px solid #ebeef5;flex-shrink:0}.file-list[data-v-c005b533]{overflow-y:auto;min-height:40px;max-height:200px;flex-grow:1;padding:0;margin:0;scrollbar-width:thin;scrollbar-color:rgba(144,147,153,.3) transparent}.file-list[data-v-c005b533]::-webkit-scrollbar{width:6px;height:6px}.file-list[data-v-c005b533]::-webkit-scrollbar-thumb{background-color:#9093994d;border-radius:4px}.file-list[data-v-c005b533]::-webkit-scrollbar-thumb:hover{background-color:#90939980}.file-list[data-v-c005b533]::-webkit-scrollbar-track{background-color:transparent}.file-list[data-v-c005b533]:empty{display:none}.empty-file-container[data-v-c005b533]{overflow-y:hidden!important;display:flex;flex-direction:column;align-items:stretch;flex:1}.empty-file-group[data-v-c005b533]{padding:16px;text-align:center;color:#909399;font-size:13px;font-style:italic;display:flex;align-items:center;justify-content:center;min-height:50px;background-color:#f8f9fa;border-radius:4px;margin:8px}.file-item[data-v-c005b533]{padding:10px 16px;display:flex;align-items:center;justify-content:space-between;border-bottom:1px solid #ebeef5;cursor:pointer;transition:all .2s ease}.file-item[data-v-c005b533]:last-child{border-bottom:none}.file-item[data-v-c005b533]:hover{background-color:#ecf5ff}.file-info[data-v-c005b533]{display:flex;align-items:center;flex-grow:1;overflow:hidden;white-space:nowrap;gap:10px}.file-status-indicator[data-v-c005b533]{width:8px;height:8px;border-radius:50%;background-color:#409eff;flex-shrink:0}.file-status-indicator.added[data-v-c005b533]{background-color:#67c23a}.file-status-indicator.modified[data-v-c005b533]{background-color:#409eff}.file-status-indicator.deleted[data-v-c005b533]{background-color:#f56c6c}.file-status-indicator.untracked[data-v-c005b533]{background-color:#e6a23c}.file-path-container[data-v-c005b533]{display:flex;flex-direction:column;overflow:hidden}.file-name[data-v-c005b533]{font-weight:500;color:#303133;overflow:hidden;text-overflow:ellipsis;line-height:1.4}.file-directory[data-v-c005b533]{font-size:12px;color:#909399;max-width:200px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.file-actions[data-v-c005b533]{display:flex;gap:8px;opacity:0;transition:opacity .2s ease}.file-item:hover .file-actions[data-v-c005b533]{opacity:1}.empty-status[data-v-c005b533]{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:40px 20px;text-align:center;background-color:#f9f9f9;border-radius:8px;flex-grow:1}.empty-icon[data-v-c005b533]{width:64px;height:64px;display:flex;align-items:center;justify-content:center;background-color:#f0f2f5;border-radius:50%;margin-bottom:16px;font-size:28px;color:#909399;animation:pulse-c005b533 2s infinite ease-in-out}@keyframes pulse-c005b533{0%{transform:scale(1);opacity:.7}50%{transform:scale(1.05);opacity:1}to{transform:scale(1);opacity:.7}}.empty-text[data-v-c005b533]{font-size:18px;font-weight:500;color:#606266;margin-bottom:8px}.empty-subtext[data-v-c005b533]{font-size:14px;color:#909399;margin-bottom:20px}.status-box-wrap[data-v-c005b533]{height:100%;display:flex;flex-direction:column;gap:16px}.branch-status-info[data-v-c005b533]{margin-bottom:0;background-color:#f8f9fa;border-radius:8px;overflow:hidden;border:1px solid #ebeef5;transition:all .3s ease}.branch-status-info[data-v-c005b533]:hover{box-shadow:0 4px 12px #0000000d}.branch-sync-status[data-v-c005b533]{display:flex;align-items:center;padding:12px 16px;border-left:3px solid #e6a23c;margin-bottom:0;background-color:#fdf6ec}.sync-status-content[data-v-c005b533]{display:flex;align-items:center;flex-wrap:wrap;gap:10px;width:100%}.status-badges[data-v-c005b533]{display:flex;flex-direction:column;gap:8px;width:100%}.status-badge[data-v-c005b533]{display:flex;align-items:center;width:100%;border-radius:4px;padding:8px 12px;transition:all .3s ease}.status-badge.el-tag--warning[data-v-c005b533]{background-color:#fdf6ec;border-color:#faecd8}.status-badge.el-tag--info[data-v-c005b533]{background-color:#f4f4f5;border-color:#e9e9eb}.status-badge[data-v-c005b533]:hover{transform:translateY(-2px);box-shadow:0 2px 8px #0000000d}.badge-content[data-v-c005b533]{display:flex;align-items:center;gap:8px;font-size:13px}.diff-dialog[data-v-c005b533]{height:calc(100vh - 150px)}[data-v-c005b533] .el-dialog__body{height:calc(100vh - 320px);overflow:auto;padding:0}.diff-content[data-v-c005b533]{flex:1;overflow-y:auto;padding:16px 20px;background-color:#fafafa;height:100%}.diff-formatted[data-v-c005b533]{font-family:JetBrains Mono,Fira Code,Consolas,Courier New,monospace;font-size:14px;line-height:1.6;white-space:pre-wrap;padding-bottom:20px}.no-diff[data-v-c005b533]{display:flex;align-items:center;justify-content:center;height:100%;color:#909399;font-size:14px}.file-navigation[data-v-c005b533]{display:flex;justify-content:space-between;align-items:center;padding:12px 20px;border-top:1px solid #ebeef5;background-color:#f9f9fb}.counter-tag[data-v-c005b533]{font-family:monospace;font-size:14px;padding:6px 12px;min-width:80px;text-align:center}.nav-button[data-v-c005b533]{min-width:120px;transition:all .3s ease}.nav-button[data-v-c005b533]:hover:not(:disabled){transform:translateY(-2px);box-shadow:0 2px 8px #0000001a}.diff-formatted[data-v-c005b533]::-webkit-scrollbar,.diff-content[data-v-c005b533]::-webkit-scrollbar{width:6px;height:6px}.diff-formatted[data-v-c005b533]::-webkit-scrollbar-thumb,.diff-content[data-v-c005b533]::-webkit-scrollbar-thumb{background-color:#9093994d;border-radius:4px}.diff-formatted[data-v-c005b533]::-webkit-scrollbar-thumb:hover,.diff-content[data-v-c005b533]::-webkit-scrollbar-thumb:hover{background-color:#90939980}.diff-formatted[data-v-c005b533]::-webkit-scrollbar-track,.diff-content[data-v-c005b533]::-webkit-scrollbar-track{background-color:transparent}.diff-formatted[data-v-c005b533],.diff-content[data-v-c005b533]{scrollbar-width:thin;scrollbar-color:rgba(144,147,153,.3) transparent}.auto-update-switch[data-v-c005b533] .el-switch__core{transition:all .3s ease-in-out;box-shadow:0 2px 5px #0000001a}.auto-update-switch[data-v-c005b533] .el-switch__core:hover{box-shadow:0 2px 8px #0003}.auto-update-switch.is-checked[data-v-c005b533] .el-switch__core{box-shadow:0 2px 5px #67c23a4d}.auto-update-switch.is-checked[data-v-c005b533] .el-switch__core:hover{box-shadow:0 2px 8px #67c23a80}.el-button[data-v-c005b533]{transition:all .3s ease}.el-button[data-v-c005b533]:not(:disabled):hover{transform:translateY(-2px);box-shadow:0 2px 8px #0000001a}.card-content[data-v-c005b533] .el-loading-mask{background-color:#fffc;-webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px);z-index:10}.card-content[data-v-c005b533] .el-loading-spinner{transform:scale(1.2)}.card-content[data-v-c005b533] .el-loading-text{font-size:16px;color:#409eff;font-weight:700;margin-top:10px}.diff-header{font-weight:700;background-color:#e6f1fc;padding:8px 12px;margin:10px 0;border-radius:6px;color:#0366d6;border-bottom:1px solid #c8e1ff}.diff-old-file,.diff-new-file{color:#586069;padding:4px 8px;font-family:monospace}.diff-hunk-header{color:#6f42c1;background-color:#f1f8ff;padding:4px 8px;margin:8px 0;border-radius:4px;font-family:monospace}.diff-added{background-color:#e6ffed;color:#22863a;padding:2px 8px;border-left:4px solid #22863a;font-family:monospace;display:block;margin:2px 0}.diff-removed{background-color:#ffeef0;color:#cb2431;padding:2px 8px;border-left:4px solid #cb2431;font-family:monospace;display:block;margin:2px 0}.diff-context{color:#444;padding:2px 8px;font-family:monospace;display:block;margin:2px 0;background-color:#fafbfc}@keyframes snakeBorder-82d0f844{0%,to{border-top:2px solid #409EFF;border-right:2px solid transparent;border-bottom:2px solid transparent;border-left:2px solid transparent}25%{border-top:2px solid #409EFF;border-right:2px solid #67C23A;border-bottom:2px solid transparent;border-left:2px solid transparent}50%{border-top:2px solid transparent;border-right:2px solid #67C23A;border-bottom:2px solid #409EFF;border-left:2px solid transparent}75%{border-top:2px solid transparent;border-right:2px solid transparent;border-bottom:2px solid #409EFF;border-left:2px solid #67C23A}}@keyframes glowPulse-82d0f844{0%,to{box-shadow:0 0 8px #409eff66}50%{box-shadow:0 0 12px #67c23a80}}.card[data-v-82d0f844]{background-color:#fff;border-radius:8px;box-shadow:0 2px 10px #00000008;border:1px solid rgba(0,0,0,.03);height:100%;width:100%;display:flex;flex-direction:column;overflow:hidden;position:relative}.card-header[data-v-82d0f844]{padding:8px 16px;border-bottom:1px solid #f0f0f0;display:flex;justify-content:space-between;align-items:center}.card-header h2[data-v-82d0f844]{margin:0;font-size:16px;font-weight:500;color:#303133}.card-content[data-v-82d0f844]{padding:15px;overflow-y:auto;flex:1}.layout-container[data-v-82d0f844]{display:flex;flex-direction:column;gap:15px;height:100%}.commit-section[data-v-82d0f844]{flex:1;min-width:0}.actions-section[data-v-82d0f844]{width:100%;flex-shrink:0}.actions-section h3[data-v-82d0f844]{margin-top:0;margin-bottom:10px;padding-bottom:8px;border-bottom:1px solid #dcdfe6;font-size:16px;color:#303133;font-weight:500}.operations-wrapper[data-v-82d0f844]{display:flex;gap:10px}.action-groups[data-v-82d0f844]{display:flex;flex-direction:column;gap:12px}.action-group[data-v-82d0f844]{background-color:#f9f9f9;border-radius:6px;padding:8px 10px;box-shadow:0 1px 3px #0000000d;border-left:3px solid #409EFF;flex:1}.action-group[data-v-82d0f844]:nth-child(2){border-left-color:#e6a23c}.action-group[data-v-82d0f844]:nth-child(3){border-left-color:#909399}.group-title[data-v-82d0f844]{font-size:13px;font-weight:700;margin-bottom:8px;color:#606266;text-align:left;display:block;position:relative;padding-left:6px;border-bottom:1px solid rgba(0,0,0,.06);padding-bottom:6px}.group-buttons[data-v-82d0f844]{display:flex;flex-direction:row;flex-wrap:wrap;gap:8px;padding:0}.action-button[data-v-82d0f844]{font-size:14px;font-weight:500;flex:1;min-width:100px;border-radius:4px;height:36px;padding:0 10px}.action-button[data-v-82d0f844]:hover{transform:translateY(-1px);box-shadow:0 2px 5px #00000026}.action-button[data-v-82d0f844]:active{transform:translateY(0)}.command-text[data-v-82d0f844],.command-text-long[data-v-82d0f844]{display:none}.standard-commit-form[data-v-82d0f844]{display:flex;flex-direction:column;gap:15px;margin-bottom:15px}.standard-commit-header[data-v-82d0f844]{display:flex;flex-direction:column;gap:10px;width:100%}.type-scope-container[data-v-82d0f844]{display:flex;gap:10px;width:100%;margin-bottom:10px}.type-select[data-v-82d0f844]{width:35%}.scope-wrapper[data-v-82d0f844]{display:flex;align-items:center;gap:5px;width:65%}.description-container[data-v-82d0f844]{display:flex;align-items:center;gap:5px;width:100%}.scope-input[data-v-82d0f844],.description-input[data-v-82d0f844]{flex-grow:1}.settings-button[data-v-82d0f844]{flex-shrink:0}.preview-section[data-v-82d0f844]{background-color:#f5f7fa;padding:10px;border-radius:4px}.preview-title[data-v-82d0f844]{font-weight:700;margin-bottom:5px}.preview-content[data-v-82d0f844]{white-space:pre-wrap;font-family:monospace;margin:0;padding:10px;background-color:#ebeef5;border-radius:4px}.template-container[data-v-82d0f844]{display:flex;flex-direction:column;height:calc(85vh - 100px);overflow-y:auto;padding:5px}.template-form[data-v-82d0f844]{margin-bottom:20px;background-color:#f8f9fa;padding:15px;border-radius:6px;border:1px solid #ebeef5}.template-form-buttons[data-v-82d0f844]{display:flex;gap:10px;margin-top:12px;justify-content:flex-end}.template-input[data-v-82d0f844]{flex-grow:1}.template-list[data-v-82d0f844]{overflow-y:auto;height:100%}.template-list h3[data-v-82d0f844]{margin-top:0;margin-bottom:15px;font-size:16px;font-weight:500;color:#303133;padding-bottom:8px;border-bottom:1px solid #ebeef5}.template-item[data-v-82d0f844]{margin-bottom:10px;transition:all .2s ease;border:1px solid #ebeef5}.template-item[data-v-82d0f844]:hover{background-color:#f5f7fa;transform:translateY(-2px);box-shadow:0 2px 12px #0000001a}.template-content[data-v-82d0f844]{flex-grow:1;margin-right:10px;word-break:break-all;padding:5px 0;color:#303133;font-weight:500}.template-actions[data-v-82d0f844]{display:flex;gap:8px;justify-content:flex-end;min-width:180px;flex-shrink:0}.options-row[data-v-82d0f844]{display:flex;justify-content:space-between;align-items:center;margin-bottom:15px}.code-command[data-v-82d0f844]{background-color:#2d2d2d;color:#f8f8f2;font-family:Courier New,Courier,monospace;padding:10px;border-radius:4px;overflow-x:auto;white-space:pre;font-size:14px}@media (min-width: 768px){.layout-container[data-v-82d0f844]{flex-direction:row}.commit-section[data-v-82d0f844]{flex:3}.actions-section[data-v-82d0f844]{width:320px}.operations-wrapper[data-v-82d0f844]{flex-direction:column}}.git-config-warning[data-v-82d0f844]{width:100%}.config-command[data-v-82d0f844]{background-color:#2d2d2d;color:#f8f8f2;font-family:Courier New,Courier,monospace;padding:10px;border-radius:4px;margin-top:10px;white-space:pre}@keyframes pushing-pulse-82d0f844{0%{box-shadow:0 0 #67c23a66}70%{box-shadow:0 0 0 15px #67c23a00}to{box-shadow:0 0 #67c23a00}}@keyframes pushing-border-82d0f844{0%{border-color:#67c23a}50%{border-color:#85ce61}to{border-color:#67c23a}}.card.is-pushing[data-v-82d0f844]{animation:pushing-border-82d0f844 1.5s infinite ease-in-out;box-shadow:0 4px 12px #0000001a;transition:all .3s ease}.push-button[data-v-82d0f844]{background-color:#67c23a;border-color:#67c23a}.push-button[data-v-82d0f844]:hover{background-color:#85ce61;border-color:#85ce61}.push-button.is-loading[data-v-82d0f844],.push-button.is-loading[data-v-82d0f844]:hover,.push-button.is-loading[data-v-82d0f844]:focus{animation:pushing-pulse-82d0f844 1.5s infinite;background-color:#67c23a!important;border-color:#67c23a!important}.el-button.push-button.is-loading .el-loading-spinner[data-v-82d0f844]{color:#fff!important}@keyframes one-click-push-glow-82d0f844{0%{box-shadow:0 0 5px #67c23a80}50%{box-shadow:0 0 20px #67c23acc}to{box-shadow:0 0 5px #67c23a80}}.action-button.one-click-push[data-v-82d0f844]{position:relative;overflow:hidden}.action-button.one-click-push.is-loading[data-v-82d0f844],.action-button.one-click-push.is-loading[data-v-82d0f844]:hover{animation:one-click-push-glow-82d0f844 1.5s infinite;background-color:#67c23a!important;border-color:#67c23a!important}@keyframes push-success-82d0f844{0%{transform:scale(1)}50%{transform:scale(1.1)}to{transform:scale(1)}}.push-success-indicator[data-v-82d0f844]{position:absolute;top:0;right:0;bottom:0;left:0;margin:auto;background-color:#fff;border-radius:12px;padding:20px 30px;box-shadow:0 8px 24px #00000026;display:flex;flex-direction:column;align-items:center;justify-content:center;animation:push-success-82d0f844 .5s ease-out;z-index:9999;width:200px;height:200px}.push-success-icon[data-v-82d0f844]{font-size:64px;color:#67c23a;margin-bottom:16px;animation:bounce-82d0f844 .8s ease-in-out}@keyframes bounce-82d0f844{0%,20%,50%,80%,to{transform:translateY(0)}40%{transform:translateY(-20px)}60%{transform:translateY(-10px)}}.push-success-text[data-v-82d0f844]{font-size:20px;font-weight:700;color:#303133;text-align:center}.reset-button[data-v-82d0f844]{background-color:#909399;border-color:#909399}.reset-button[data-v-82d0f844]:hover{background-color:#a6a9ad;border-color:#a6a9ad}.el-button+.el-button[data-v-82d0f844]{margin-left:0}.pushing-indicator[data-v-82d0f844]{position:absolute;top:0;right:0;bottom:0;left:0;margin:auto;background-color:#409eff;border-radius:12px;padding:20px 30px;box-shadow:0 8px 24px #00000026;display:flex;flex-direction:column;align-items:center;justify-content:center;z-index:9999;width:200px;height:200px;color:#fff}.form-bottom-actions[data-v-82d0f844]{display:flex;flex-direction:column;gap:10px;margin-top:15px;padding:12px;background-color:#f5f7fa;border-radius:6px;box-shadow:0 1px 3px #0000000d;border-left:3px solid #67C23A}.button-row[data-v-82d0f844]{display:flex;justify-content:space-between;gap:10px;width:100%}.button-row .el-button[data-v-82d0f844]{flex:1;min-width:100px}.full-width-button[data-v-82d0f844]{width:100%;margin-top:5px;font-weight:500;height:40px}.form-bottom-actions .el-button[data-v-82d0f844]{font-weight:500;border-radius:4px;transition:all .3s}.form-bottom-actions .el-button[data-v-82d0f844]:hover{transform:translateY(-1px);box-shadow:0 2px 5px #00000026}.pushing-text[data-v-82d0f844]{font-size:20px;font-weight:700;text-align:center}.pushing-spinner[data-v-82d0f844]{margin-bottom:16px}.circular[data-v-82d0f844]{height:64px;width:64px;animation:pushing-rotate-82d0f844 2s linear infinite}.path[data-v-82d0f844]{stroke:#fff;stroke-width:4;stroke-linecap:round;stroke-dasharray:90,150;stroke-dashoffset:0;animation:pushing-dash-82d0f844 1.5s ease-in-out infinite}@keyframes pushing-rotate-82d0f844{to{transform:rotate(360deg)}}@keyframes pushing-dash-82d0f844{0%{stroke-dasharray:1,150;stroke-dashoffset:0}50%{stroke-dasharray:90,150;stroke-dashoffset:-35}to{stroke-dasharray:90,150;stroke-dashoffset:-124}}.message-template-container[data-v-82d0f844]{display:flex;flex-direction:column;height:calc(100vh - 278px);overflow:hidden}.templates-container[data-v-82d0f844]{display:flex;gap:20px;margin-top:15px;flex:1;overflow:hidden}.message-templates-list[data-v-82d0f844]{flex:3;display:flex;flex-direction:column;border-right:1px solid #ebeef5;padding-right:15px;height:calc(100vh - 432px)}.message-templates-list h3[data-v-82d0f844]{margin-top:0;margin-bottom:15px;font-size:16px;font-weight:500;color:#303133;padding-bottom:8px;border-bottom:1px solid #ebeef5}.current-default-message[data-v-82d0f844]{flex:2;display:flex;flex-direction:column;gap:15px;padding-left:15px}.current-default-message h3[data-v-82d0f844]{margin-top:0;margin-bottom:15px;font-size:16px;font-weight:500;color:#303133;padding-bottom:8px;border-bottom:1px solid #ebeef5}.templates-scroll-area[data-v-82d0f844]{overflow-y:auto;padding-right:5px;flex:1}.default-message-card[data-v-82d0f844]{margin-bottom:15px;box-shadow:0 2px 8px #00000014;border-radius:4px;transition:all .3s ease}.default-message-card[data-v-82d0f844]:hover{box-shadow:0 4px 12px #0000001f}.default-message-content[data-v-82d0f844]{padding:12px 15px;background-color:#f0f9eb;border-left:3px solid #67c23a;font-weight:500;word-break:break-all;min-height:60px;display:flex;align-items:center;border-radius:0 4px 4px 0;color:#303133}.message-help-text[data-v-82d0f844]{background-color:#f8f9fa;border-radius:4px;padding:15px;font-size:14px;color:#606266;border-left:3px solid #909399;margin-top:auto;box-shadow:0 2px 8px #0000000d}.message-help-text h4[data-v-82d0f844]{margin-top:0;margin-bottom:10px;color:#303133;font-size:15px}.message-help-text p[data-v-82d0f844]{margin:8px 0;line-height:1.5}.advanced-options-toggle[data-v-82d0f844]{display:flex;align-items:center;justify-content:center;padding:8px 0;background-color:#f5f7fa;border-radius:4px;cursor:pointer;transition:all .3s ease;-webkit-user-select:none;user-select:none}.advanced-options-toggle[data-v-82d0f844]:hover{background-color:#ebeef5;color:#409eff}.toggle-icon[data-v-82d0f844]{margin-left:8px;transition:transform .3s ease}.toggle-icon.is-active[data-v-82d0f844]{transform:rotate(180deg)}.advanced-fields[data-v-82d0f844]{margin-top:10px;display:flex;flex-direction:column;gap:15px;animation:fade-in-82d0f844 .3s ease-in-out}@keyframes fade-in-82d0f844{0%{opacity:0;transform:translateY(-10px)}to{opacity:1;transform:translateY(0)}}.merge-dialog-content[data-v-82d0f844]{padding:0 10px}.merge-intro[data-v-82d0f844]{margin-bottom:20px;color:#606266}.merge-options[data-v-82d0f844]{display:flex;flex-direction:column;gap:10px}.dialog-footer[data-v-82d0f844]{display:flex;justify-content:flex-end;gap:10px}.merge-confirm-btn[data-v-82d0f844]{margin-left:10px}.merge-button[data-v-82d0f844]{background-color:#409eff;border-color:#409eff}.branch-group[data-v-82d0f844]{margin-top:20px;border-top:1px solid #f0f0f0;padding-top:16px}.branch-group .group-title[data-v-82d0f844]{color:#606266;font-weight:500;margin-bottom:12px}[data-v-82d0f844] .el-checkbox__label{white-space:normal;line-height:1.4}.git-cmd-tooltip{font-family:Consolas,Courier New,monospace!important;font-size:13px!important;font-weight:500!important;color:#303133!important;background-color:#f5f7fa!important;border:1px solid #dcdfe6!important;border-radius:4px!important;padding:8px 12px!important;box-shadow:0 2px 12px #0000001a!important}.template-dialog .el-dialog__header,.message-template-dialog .el-dialog__header,.merge-dialog .el-dialog__header{padding:15px 20px;margin-right:0;border-bottom:1px solid #ebeef5;background-color:#f8f9fa}.template-dialog .el-dialog__title,.message-template-dialog .el-dialog__title,.merge-dialog .el-dialog__title{font-size:16px;font-weight:600;color:#303133}.template-dialog .el-dialog__body,.message-template-dialog .el-dialog__body,.merge-dialog .el-dialog__body{padding:20px}.merge-dialog .el-dialog__footer{padding:15px 20px;border-top:1px solid #f0f0f0}.template-dialog .el-dialog__headerbtn,.message-template-dialog .el-dialog__headerbtn,.merge-dialog .el-dialog__headerbtn{top:15px;right:20px}.template-dialog .el-input__inner,.message-template-dialog .el-input__inner,.merge-dialog .el-input__inner{height:40px;line-height:40px}.template-dialog .el-button,.message-template-dialog .el-button{border-radius:4px;font-weight:500}.template-dialog .el-card,.message-template-dialog .el-card{border-radius:4px;overflow:hidden}.template-dialog .el-card__body,.message-template-dialog .el-card__body{padding:12px 15px}.template-dialog .el-empty__image,.message-template-dialog .el-empty__image{width:80px;height:80px}.card[data-v-4ca4673a]{background-color:#fff;border-radius:12px;box-shadow:0 2px 12px #0000000a;height:100%;width:100%;display:flex;flex-direction:column;border:1px solid rgba(0,0,0,.03);overflow:hidden;transition:all .3s ease}.log-header[data-v-4ca4673a]{display:flex;justify-content:space-between;align-items:center;margin-bottom:0;padding:12px 16px;background-color:#fff;border-bottom:1px solid #f0f0f0;position:sticky;top:0;z-index:100;flex-shrink:0}.header-left[data-v-4ca4673a]{display:flex;align-items:center;gap:12px}.log-header h2[data-v-4ca4673a]{margin:0;font-size:16px;font-weight:500}.log-actions[data-v-4ca4673a]{display:flex;gap:12px}.action-button[data-v-4ca4673a]{transition:all .3s ease;border-radius:8px;border:1px solid transparent;box-shadow:0 2px 4px #0000001a;font-weight:500;padding:8px 16px;min-width:120px;display:flex;align-items:center;justify-content:center;gap:8px}.action-button[data-v-4ca4673a]:hover{transform:translateY(-2px);box-shadow:0 4px 8px #00000026}.filter-button[data-v-4ca4673a]{background:linear-gradient(135deg,#e6a23c,#f0c78a);color:#fff;min-width:90px}.filter-button.active-filter[data-v-4ca4673a]{background:linear-gradient(135deg,#d48806,#e6a23c)}.filter-button .filter-badge[data-v-4ca4673a] .el-badge__content{background-color:#f56c6c;color:#fff;border:2px solid white;box-shadow:0 0 0 1px #e6a23c}.view-mode-button[data-v-4ca4673a]{background:linear-gradient(135deg,#409eff,#53a8ff);color:#fff}.view-mode-button.active-view[data-v-4ca4673a]{background:linear-gradient(135deg,#1890ff,#096dd9)}.commit-display-button[data-v-4ca4673a]{background:linear-gradient(135deg,#67c23a,#85ce61);color:#fff}.commit-display-button.active-commits[data-v-4ca4673a]{background:linear-gradient(135deg,#52c41a,#389e0d)}.refresh-button[data-v-4ca4673a]{background:linear-gradient(135deg,#909399,#c0c4cc);color:#fff;min-width:unset;padding:8px;border-radius:50%;width:36px;height:36px}.refresh-button[data-v-4ca4673a]:hover{background:linear-gradient(135deg,#606266,#909399)}.refresh-button-animated[data-v-4ca4673a]{animation:spin-4ca4673a 1s linear}@keyframes spin-4ca4673a{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.content-area[data-v-4ca4673a]{padding:10px 16px;flex:1;min-height:100px;height:calc(100% - 52px);display:flex;flex-direction:column}.content-area-content[data-v-4ca4673a]{height:100%}.content-area.with-filter[data-v-4ca4673a]{height:calc(100% - 112px);padding-top:0}.content-area>div[data-v-4ca4673a]{flex:1;display:flex;flex-direction:column}.el-table[data-v-4ca4673a]{--el-table-border-color: #f0f0f0;--el-table-header-bg-color: #f8f9fa;border-radius:8px;overflow:hidden}[data-v-4ca4673a] .el-table__header-wrapper{background-color:#f8f9fa}[data-v-4ca4673a] .el-table__header th{background-color:#f8f9fa;color:#606266;font-weight:600;height:48px}[data-v-4ca4673a] .el-table__row{transition:all .2s ease}[data-v-4ca4673a] .el-table__row:hover{background-color:#ecf5ff!important}[data-v-4ca4673a] .el-table--striped .el-table__row--striped{background-color:#fafafa}[data-v-4ca4673a] .el-table__cell{padding:8px 0}.branch-container[data-v-4ca4673a]{display:flex;flex-wrap:wrap;gap:6px}.branch-tag[data-v-4ca4673a]{margin-right:0;border-radius:4px;transition:all .2s ease}.branch-tag[data-v-4ca4673a]:hover{transform:translateY(-1px);box-shadow:0 2px 4px #0000001a}.commit-count[data-v-4ca4673a]{margin-bottom:12px;font-size:14px;color:#606266;text-align:right}.graph-view[data-v-4ca4673a]{width:100%;flex:1;display:flex;flex-direction:column;overflow-y:auto;padding:0 8px}.graph-container[data-v-4ca4673a]{width:100%;flex:1;min-height:500px;border:1px solid #ebeef5;border-radius:8px;padding:16px;background-color:#fff;position:relative;box-shadow:0 2px 8px #00000008}.graph-container svg[data-v-4ca4673a]{transform-origin:top left;transition:transform .2s ease}.graph-controls[data-v-4ca4673a]{display:flex;justify-content:space-between;align-items:center;margin-bottom:16px;background-color:#f8f9fa;padding:12px;border-radius:8px;border:1px solid #ebeef5}.zoom-controls[data-v-4ca4673a]{display:flex;gap:12px;align-items:center}.zoom-slider[data-v-4ca4673a]{width:200px}.scale-info[data-v-4ca4673a]{font-size:14px;color:#606266;background-color:#fff;padding:4px 10px;border-radius:4px;border:1px solid #ebeef5}.refresh-notification[data-v-4ca4673a]{background-color:#f0f9eb;color:#67c23a;padding:10px 15px;border-radius:8px;font-size:14px;border-left:4px solid #67c23a;animation:fadeOut-4ca4673a 2s forwards;position:fixed;top:20px;right:20px;z-index:9999;box-shadow:0 4px 12px #0000001a;max-width:300px;text-align:center}@keyframes fadeOut-4ca4673a{0%{opacity:0;transform:translateY(-20px)}20%{opacity:1;transform:translateY(0)}80%{opacity:1}to{opacity:0}}.author-name[data-v-4ca4673a]{cursor:pointer;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:inline-block;max-width:100%;font-weight:500}.commit-hash[data-v-4ca4673a]{cursor:pointer;color:#409eff;font-family:JetBrains Mono,Fira Code,Consolas,monospace;font-weight:500;border-radius:4px;padding:2px 4px;background-color:#ecf5ff;transition:all .2s ease}.commit-hash[data-v-4ca4673a]:hover{text-decoration:none;background-color:#d9ecff;box-shadow:0 2px 4px #0000000d}.commit-detail-container[data-v-4ca4673a]{display:flex;flex-direction:column;gap:20px}.commit-info[data-v-4ca4673a]{padding:16px;background-color:#f5f7fa;border-radius:8px;font-size:14px;display:flex;flex-direction:column;gap:16px}.commit-info-header[data-v-4ca4673a]{display:flex;flex-wrap:wrap;gap:16px;align-items:center;background-color:#fff;padding:16px;border-radius:8px;border:1px solid #e4e7ed}.info-item[data-v-4ca4673a]{display:flex;align-items:center;gap:8px}.item-label[data-v-4ca4673a]{font-weight:700;color:#606266;white-space:nowrap}.item-value[data-v-4ca4673a]{color:#333;word-break:break-all}.commit-message-container[data-v-4ca4673a]{display:flex;flex-direction:column;gap:8px}.message-label[data-v-4ca4673a]{font-weight:700;color:#606266}.message-content[data-v-4ca4673a]{background-color:#fff;padding:16px;border-radius:8px;font-family:JetBrains Mono,Fira Code,Consolas,monospace;white-space:pre-wrap;line-height:1.6;border:1px solid #e4e7ed;border-left:4px solid #409eff}.commit-files-diff[data-v-4ca4673a]{margin-top:8px;display:flex;gap:20px;height:60vh}.files-list[data-v-4ca4673a]{width:25%;overflow-y:auto;background-color:#f5f7fa;border-radius:8px;padding:16px}.files-list h3[data-v-4ca4673a]{margin-top:0;padding-bottom:12px;border-bottom:1px solid #dcdfe6;font-size:16px;font-weight:500}.files-list ul[data-v-4ca4673a]{list-style:none;padding:0;margin:0}.files-list li[data-v-4ca4673a]{padding:10px 12px;cursor:pointer;border-radius:4px;margin-bottom:6px;font-family:JetBrains Mono,Fira Code,Consolas,monospace;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:13px;transition:all .2s ease;border:1px solid transparent}.files-list li[data-v-4ca4673a]:hover{background-color:#ecf5ff;border-color:#d9ecff}.files-list li.active-file[data-v-4ca4673a]{background-color:#409eff;color:#fff;box-shadow:0 2px 6px #409eff4d}.file-diff[data-v-4ca4673a]{flex:1;display:flex;flex-direction:column;background-color:#f5f7fa;border-radius:8px;padding:16px;overflow:hidden}.file-diff h3[data-v-4ca4673a]{margin-top:0;padding-bottom:12px;border-bottom:1px solid #dcdfe6;font-size:16px;font-weight:500}.diff-content[data-v-4ca4673a]{flex:1;overflow-y:auto;background-color:#fff;padding:16px;border-radius:8px;font-family:JetBrains Mono,Fira Code,Consolas,monospace;font-size:13px;line-height:1.6;border:1px solid #ebeef5}.diff-content[data-v-4ca4673a]::-webkit-scrollbar,.files-list[data-v-4ca4673a]::-webkit-scrollbar{width:6px;height:6px}.diff-content[data-v-4ca4673a]::-webkit-scrollbar-thumb,.files-list[data-v-4ca4673a]::-webkit-scrollbar-thumb{background-color:#9093994d;border-radius:4px}.diff-content[data-v-4ca4673a]::-webkit-scrollbar-thumb:hover,.files-list[data-v-4ca4673a]::-webkit-scrollbar-thumb:hover{background-color:#90939980}.diff-content[data-v-4ca4673a]::-webkit-scrollbar-track,.files-list[data-v-4ca4673a]::-webkit-scrollbar-track{background-color:transparent}.diff-content[data-v-4ca4673a],.files-list[data-v-4ca4673a]{scrollbar-width:thin;scrollbar-color:rgba(144,147,153,.3) transparent}[data-v-4ca4673a] .commit-detail-dialog{--el-dialog-margin-top: 7vh}[data-v-4ca4673a] .commit-detail-dialog .el-dialog__body{padding:16px}.filter-panel-header[data-v-4ca4673a]{background-color:#f5f7fa;padding:12px 16px;border-bottom:1px solid #e4e7ed;position:sticky;top:36px;z-index:99;transition:all .3s ease;flex-shrink:0;margin-bottom:10px;box-shadow:0 2px 8px #0000000d;border-radius:0 0 8px 8px}.filter-panel-header .filter-form[data-v-4ca4673a]{display:flex;align-items:center;gap:12px;flex-wrap:nowrap;justify-content:space-between}.filter-panel-header .filter-item[data-v-4ca4673a]{margin-right:0;flex:1;min-width:0}.filter-panel-header .filter-input[data-v-4ca4673a]{width:100%}.filter-panel-header .filter-input.date-range[data-v-4ca4673a]{width:100%;max-width:280px}.compact-label[data-v-4ca4673a]{color:#909399;font-size:12px;margin-right:6px;white-space:nowrap;font-weight:700;border-right:1px solid #dcdfe6;padding-right:8px}.filter-action-button[data-v-4ca4673a]{padding:8px 16px;border-radius:6px;transition:all .3s;min-width:70px;font-weight:500}.filter-action-button[data-v-4ca4673a]:hover{transform:translateY(-2px);box-shadow:0 2px 8px #0000001a}.filter-actions[data-v-4ca4673a]{display:flex;align-items:center;gap:10px;white-space:nowrap;flex-shrink:0}.table-view-container[data-v-4ca4673a]{display:flex;flex-direction:column;flex:1;min-height:400px}.log-table[data-v-4ca4673a]{width:100%;height:100%;min-height:300px;flex:1}.load-more-container[data-v-4ca4673a]{display:flex;flex-direction:column;align-items:center;padding:8px 0;border-top:1px dashed #ebeef5;gap:8px}.pagination-info[data-v-4ca4673a]{font-size:13px;color:#909399;margin-bottom:4px}.loading-more[data-v-4ca4673a]{display:flex;align-items:center;color:#909399;font-size:13px;gap:8px}.loading-spinner[data-v-4ca4673a]{width:16px;height:16px;border:2px solid #dcdfe6;border-top-color:#409eff;border-radius:50%;animation:spinner-4ca4673a 1s linear infinite}@keyframes spinner-4ca4673a{to{transform:rotate(360deg)}}.load-more-button[data-v-4ca4673a]{cursor:pointer;color:#409eff;font-size:13px;padding:6px 16px;border:1px solid #d9ecff;background-color:#ecf5ff;border-radius:4px;transition:all .3s;font-weight:500}.no-more-data[data-v-4ca4673a]{color:#909399;font-size:13px;font-style:italic;display:flex;flex-direction:column;align-items:center}.total-loaded[data-v-4ca4673a]{font-size:12px;margin-top:4px;color:#c0c4cc}.context-menu[data-v-4ca4673a]{position:fixed;background:#fff;border:1px solid #dcdfe6;border-radius:8px;box-shadow:0 4px 16px #0000001a;padding:6px 0;z-index:3000;min-width:200px;animation:fadeIn-4ca4673a .15s ease-out}@keyframes fadeIn-4ca4673a{0%{opacity:0;transform:translateY(5px)}to{opacity:1;transform:translateY(0)}}.context-menu-item[data-v-4ca4673a]{padding:10px 16px;cursor:pointer;font-size:14px;display:flex;align-items:center;transition:all .2s ease;color:#606266}.context-menu-item[data-v-4ca4673a]:hover{background-color:#f5f7fa;color:#409eff}.context-menu-item i[data-v-4ca4673a]{margin-right:10px;font-size:16px}.branch-graph-column[data-v-4ca4673a]{padding:0!important;overflow:visible}.branch-graph-cell[data-v-4ca4673a]{height:40px;width:100%;position:relative;padding:0;margin:0}.branch-graph-column .cell[data-v-4ca4673a]{padding:0!important;height:100%;margin:0;overflow:visible}.el-table .branch-graph-column[data-v-4ca4673a]{width:60px!important;padding:0!important}[data-v-4ca4673a] .el-table .el-table__cell{padding:0!important}[data-v-4ca4673a] .branch-graph-cell svg{display:block!important;width:100%!important;height:100%!important;overflow:visible!important;z-index:10!important}[data-v-4ca4673a] .branch-graph-cell svg line,[data-v-4ca4673a] .branch-graph-cell svg path{stroke-width:2!important}[data-v-4ca4673a] .branch-graph-cell svg circle{r:6!important;stroke-width:2!important}.branch-graph-column[data-v-4ca4673a]{min-width:60px!important;width:60px!important}.branch-graph-cell[data-v-4ca4673a]{position:relative!important;overflow:visible!important;z-index:1!important}[data-v-4ca4673a] .el-table--border .el-table__inner-wrapper tr{border:none!important}[data-v-4ca4673a] .el-table--border .el-table__inner-wrapper td{border-right:none!important;border-bottom:none!important}[data-v-4ca4673a] .el-table--border .el-table__inner-wrapper th{border-right:none!important}[data-v-4ca4673a] .el-table--border,[data-v-4ca4673a] .el-table--border .el-table__inner-wrapper{border:none!important}[data-v-4ca4673a] .el-table--border:after,[data-v-4ca4673a] .el-table--border:before,[data-v-4ca4673a] .el-table__inner-wrapper:after,[data-v-4ca4673a] .el-table__inner-wrapper:before{display:none!important}[data-v-4ca4673a] .el-table tr{background-color:transparent!important}[data-v-4ca4673a] .el-table--striped .el-table__body tr.el-table__row--striped td{background-color:#00000005!important}.el-table .el-table__cell .cell{word-break:break-all}.diff-header{font-weight:700;background-color:#e6f1fc;padding:10px 16px;margin:12px 0;border-radius:6px;color:#0366d6;border-bottom:1px solid #c8e1ff}.diff-old-file,.diff-new-file{color:#586069;padding:4px 8px;font-family:JetBrains Mono,Fira Code,Consolas,monospace}.diff-old-file{color:#cb2431}.diff-new-file{color:#22863a}.diff-hunk-header{color:#6f42c1;background-color:#f1f8ff;padding:4px 8px;margin:8px 0;border-radius:4px;font-family:JetBrains Mono,Fira Code,Consolas,monospace}.diff-added{background-color:#e6ffed;color:#22863a;padding:2px 8px;border-left:4px solid #22863a;font-family:JetBrains Mono,Fira Code,Consolas,monospace;display:block;margin:2px 0}.diff-removed{background-color:#ffeef0;color:#cb2431;padding:2px 8px;border-left:4px solid #cb2431;font-family:JetBrains Mono,Fira Code,Consolas,monospace;display:block;margin:2px 0}.diff-context{color:#444;padding:2px 8px;font-family:JetBrains Mono,Fira Code,Consolas,monospace;display:block;margin:2px 0;background-color:#fafbfc}.load-more-button:hover{background-color:#d9ecff;box-shadow:0 2px 6px #409eff26;transform:translateY(-1px)}body{font-family:Arial,sans-serif;margin:0;padding:0;background-color:#f5f5f5;overflow:hidden;height:100vh}.main-container{position:fixed;top:60px;bottom:60px;left:0;right:0;padding:10px;overflow:hidden}.grid-layout{display:grid;grid-template-columns:2fr 8px 3fr;grid-template-rows:1fr 8px 1fr;grid-template-areas:"git-status v-resizer commit-form" "h-resizer h-resizer h-resizer" "log-list log-list log-list";gap:10px;height:100%}.git-status-panel{grid-area:git-status;overflow:hidden;max-height:100%;padding:0}.commit-form-panel{grid-area:commit-form;overflow:hidden;max-height:100%;padding:0}.log-list-panel{grid-area:log-list;overflow:hidden;max-height:100%;padding:0}.card{background-color:#fff;border-radius:8px;box-shadow:0 4px 12px #0000000d;border:1px solid rgba(0,0,0,.03);height:100%;overflow:hidden;display:flex;flex-direction:column}.main-header{background-color:#24292e;color:#fff;padding:0 20px;display:flex;justify-content:space-between;align-items:center;position:fixed;top:0;left:0;right:0;z-index:1000;box-shadow:0 2px 10px #0003;height:60px;box-sizing:border-box}.header-left{display:flex;align-items:center;gap:10px;min-width:220px;flex:1}.logo{height:32px;width:auto}h1{margin:0;font-size:24px}.header-info{display:flex;align-items:center;gap:10px;justify-content:flex-end}#user-info{display:flex;align-items:center;background-color:#282c34b3;padding:6px 10px;border-radius:4px;border:1px solid rgba(255,255,255,.15);margin-right:10px;flex-shrink:0}.directory-selector{display:flex;flex-direction:row;justify-content:space-between;align-items:center;background-color:#282c34b3;border-radius:4px;padding:6px 10px;border:1px solid rgba(255,255,255,.15);box-shadow:0 2px 8px #00000026;flex-shrink:0}.directory-display{display:flex;align-items:center;gap:8px;flex:1;min-width:0}.directory-path{font-family:monospace;color:#fff;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:14px;font-weight:500;background-color:#0003;padding:4px 8px;border-radius:3px;border-left:3px solid #409EFF;flex:1;min-width:0;max-width:500px}.branch-label,.user-label,.user-name{font-weight:700;margin-right:5px}.user-email{color:#e0e0e0}.branch-name{font-family:monospace}.status-box{background-color:#f6f8fa;border:1px solid #e1e4e8;border-radius:3px;padding:15px;white-space:pre-wrap;font-family:monospace;overflow-y:auto}.tips{margin-top:20px;padding:15px;background-color:#f5f7fa;border-radius:5px;border-left:4px solid #409eff}.tips h3{margin-top:0;font-size:16px;margin-bottom:10px}.code-block{background-color:#2d2d2d;color:#f8f8f2;font-family:monospace;padding:10px 15px;border-radius:4px;margin-bottom:10px}.loading-container{display:flex;justify-content:center;align-items:center;height:100%}.loading-card{width:300px;text-align:center;padding:30px}.loading-spinner{font-size:48px;margin-bottom:20px;color:#409eff}.loading-text{font-size:18px;color:#606266}.user-settings-btn{margin-left:10px}.user-warning{color:#e6a23c;font-weight:700}.main-footer{background-color:#24292e;color:#fff;padding:10px 20px;display:flex;justify-content:space-between;align-items:center;position:fixed;bottom:0;left:0;right:0;z-index:100;box-shadow:0 -2px 10px #0000001a;height:60px;box-sizing:border-box}@media (max-width: 768px){.grid-layout{grid-template-columns:1fr;grid-template-rows:auto auto auto auto auto;grid-template-areas:"git-status" "v-resizer" "commit-form" "h-resizer" "log-list";gap:10px}.vertical-resizer{height:10px;cursor:row-resize}.vertical-resizer:after{width:30px;height:4px}.git-status-panel,.commit-form-panel,.log-list-panel{padding:0;max-height:none}.git-status-panel,.commit-form-panel{max-height:30vh}.log-list-panel{max-height:40vh}}.logo[data-v-98ed32bc]{will-change:filter;transition:filter .3s}.logo[data-v-98ed32bc]:hover{filter:drop-shadow(0 0 2em #42b883aa)}.branch-info[data-v-98ed32bc]{display:flex;align-items:center;gap:10px}.branch-wrapper[data-v-98ed32bc]{display:flex;align-items:center;background-color:#ffffff26;border-radius:4px;padding:8px 12px;box-shadow:0 2px 4px #0003;transition:all .3s}.branch-wrapper[data-v-98ed32bc]:hover{background-color:#fff3}.branch-label[data-v-98ed32bc]{font-weight:700;margin-right:10px;color:#fff}.branch-select[data-v-98ed32bc]{width:200px;margin-right:10px}.create-branch-btn[data-v-98ed32bc]{background-color:#2ea44f;border-color:#2ea44f;transition:all .3s;box-shadow:0 2px 4px #0003}.create-branch-btn[data-v-98ed32bc]:hover{background-color:#3bbc63;border-color:#3bbc63;transform:translateY(-2px);box-shadow:0 4px 8px #0003}.footer-right[data-v-98ed32bc]{display:flex;align-items:center;gap:10px;color:#ffffffe6;font-size:13px;background-color:#ffffff1a;padding:8px 12px;border-radius:4px;box-shadow:0 2px 4px #0003}.repo-url-label[data-v-98ed32bc]{font-weight:700;margin-right:8px;color:#fff}.repo-url[data-v-98ed32bc]{color:#e6f7ff;font-family:monospace;max-width:300px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.copy-url-btn[data-v-98ed32bc]{transition:all .3s;background-color:#1890ff;border-color:#1890ff;box-shadow:0 2px 4px #0003}.copy-url-btn[data-v-98ed32bc]:hover{background-color:#40a9ff;border-color:#40a9ff;transform:translateY(-2px);box-shadow:0 4px 8px #0003}.vertical-resizer[data-v-98ed32bc]{grid-area:v-resizer;background-color:#e8e8e8;cursor:col-resize;transition:background-color .2s,box-shadow .2s;position:relative;z-index:10;border-radius:8px;box-shadow:0 0 3px #0000001a}.vertical-resizer[data-v-98ed32bc]:after{content:"";position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:4px;height:50px;background-color:#a0a0a0;border-radius:4px;transition:background-color .2s,width .2s,box-shadow .2s}.vertical-resizer[data-v-98ed32bc]:hover,.vertical-resizer.active[data-v-98ed32bc]{background-color:#d0d0d0;box-shadow:0 0 5px #0003}.vertical-resizer[data-v-98ed32bc]:hover:after,.vertical-resizer.active[data-v-98ed32bc]:after{background-color:#409eff;width:6px;box-shadow:0 0 8px #409eff99}.horizontal-resizer[data-v-98ed32bc]{grid-area:h-resizer;background-color:#e8e8e8;cursor:row-resize;transition:background-color .2s,box-shadow .2s;position:relative;z-index:10;border-radius:8px;box-shadow:0 0 3px #0000001a}.horizontal-resizer[data-v-98ed32bc]:after{content:"";position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:50px;height:4px;background-color:#a0a0a0;border-radius:4px;transition:background-color .2s,height .2s,box-shadow .2s}.horizontal-resizer[data-v-98ed32bc]:hover,.horizontal-resizer.active[data-v-98ed32bc]{background-color:#d0d0d0;box-shadow:0 0 5px #0003}.horizontal-resizer[data-v-98ed32bc]:hover:after,.horizontal-resizer.active[data-v-98ed32bc]:after{background-color:#409eff;height:6px;box-shadow:0 0 8px #409eff99}.directory-selector[data-v-98ed32bc]{display:flex;flex-direction:row;justify-content:space-between;align-items:center;background-color:#282c34b3;border-radius:4px;padding:8px 12px;margin-bottom:8px;border:1px solid rgba(255,255,255,.2);box-shadow:0 2px 8px #0003}.directory-display[data-v-98ed32bc]{display:flex;align-items:center;gap:8px;flex:1;min-width:0}.directory-path[data-v-98ed32bc]{font-family:monospace;color:#fff;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:14px;font-weight:500;background-color:#0003;padding:4px 8px;border-radius:3px;border-left:3px solid #409EFF;flex:1;min-width:0;max-width:350px}.directory-actions[data-v-98ed32bc]{display:flex;gap:4px;margin-left:8px}.dir-button[data-v-98ed32bc]{padding:6px;height:28px;width:28px;border-radius:50%;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg,#409eff,#53a8ff);color:#fff;border:none;box-shadow:0 2px 4px #0003;transition:all .3s}.dir-button[data-v-98ed32bc]:hover{transform:translateY(-1px);box-shadow:0 3px 6px #0000004d;background:linear-gradient(135deg,#53a8ff,#66b1ff)}.dir-button.el-button--info[data-v-98ed32bc]{background:linear-gradient(135deg,#909399,#a6a9ad)}.dir-button.el-button--info[data-v-98ed32bc]:hover{background:linear-gradient(135deg,#a6a9ad,#c0c4cc)}.directory-icon[data-v-98ed32bc]{display:flex;justify-content:center;align-items:center;width:24px;height:24px;border-radius:3px;background-color:#409eff1a;color:#409eff;margin-right:2px}.directory-input-group[data-v-98ed32bc]{display:flex;align-items:center;gap:8px;width:100%}.recent-directories[data-v-98ed32bc]{display:flex;flex-wrap:wrap;gap:4px}.recent-dir-tag[data-v-98ed32bc]{cursor:pointer;background-color:#e6f7ff;border:1px solid #91d5ff;padding:4px 8px;border-radius:4px}.directory-browser[data-v-98ed32bc]{width:100%;height:400px;overflow:auto}.current-path[data-v-98ed32bc]{padding:10px;background-color:#f5f7fa;border-radius:4px;margin-bottom:10px;border:1px solid #e4e7ed;display:flex;align-items:center;width:100%;box-sizing:border-box}.path-label[data-v-98ed32bc]{font-weight:700;margin-right:5px;white-space:nowrap;flex-shrink:0}.path-value[data-v-98ed32bc]{font-family:monospace;word-break:break-all;flex:1;min-width:0;background-color:#fff;padding:5px 8px;border-radius:3px;border:1px solid #dcdfe6;box-shadow:inset 0 1px 2px #0000000d;width:100%}.directory-list[data-v-98ed32bc]{list-style:none!important;padding:0;margin:0;border:1px solid #e4e7ed;border-radius:4px;max-height:300px;overflow-y:auto;background-color:#fff;display:flex;flex-direction:column;width:100%;box-sizing:border-box}.directory-item[data-v-98ed32bc]{padding:10px 12px;border-bottom:1px solid #ebeef5;cursor:pointer;display:flex;align-items:center;transition:all .2s ease;position:relative;width:100%;box-sizing:border-box;list-style:none!important}.directory-item[data-v-98ed32bc]:hover{background-color:#ecf5ff}.directory-item[data-v-98ed32bc]:last-child{border-bottom:none}.parent-dir[data-v-98ed32bc]{background-color:#f5f7fa;font-weight:500}.dir-icon[data-v-98ed32bc]{margin-right:12px;display:flex;align-items:center;justify-content:center;width:24px;height:24px;flex-shrink:0}.dir-name[data-v-98ed32bc]{display:flex;align-items:center;font-size:14px;line-height:1.4}.folder-icon[data-v-98ed32bc]{filter:drop-shadow(0 1px 2px rgba(0,0,0,.1));transition:all .2s ease}.directory-item:hover .folder-icon[data-v-98ed32bc]{transform:scale(1.1)}[data-v-98ed32bc] .directory-browser-dialog{border-radius:8px;overflow:hidden}[data-v-98ed32bc] .directory-browser-dialog .el-message-box__header{background-color:#f5f7fa;padding:15px 20px;border-bottom:1px solid #e4e7ed;position:relative}[data-v-98ed32bc] .directory-browser-dialog .el-message-box__title{color:#409eff;font-weight:500;font-size:18px}[data-v-98ed32bc] .directory-browser-dialog .el-message-box__headerbtn{position:absolute;top:15px;right:15px;width:24px;height:24px;border-radius:50%;background-color:#0000000d;transition:all .3s;display:flex;align-items:center;justify-content:center}[data-v-98ed32bc] .directory-browser-dialog .el-message-box__headerbtn:hover{background-color:#0000001a;transform:rotate(90deg)}[data-v-98ed32bc] .directory-browser-dialog .el-message-box__headerbtn .el-message-box__close{color:#606266;font-weight:700;font-size:16px}[data-v-98ed32bc] .directory-browser-dialog .el-message-box__headerbtn:hover .el-message-box__close{color:#409eff}[data-v-98ed32bc] .directory-browser-dialog .el-message-box__content{padding:20px}.el-message-box__message{width:100%}.directory-browser-dialog{border-radius:8px;overflow:hidden}.directory-browser-dialog .el-message-box__header{background-color:#f5f7fa;padding:15px 20px;border-bottom:1px solid #e4e7ed;position:relative}.directory-browser-dialog .el-message-box__title{color:#409eff;font-weight:500;font-size:18px}.directory-browser-dialog .el-message-box__headerbtn{position:absolute;top:15px;right:15px;width:24px;height:24px;border-radius:50%;background-color:#0000000d;transition:all .3s;display:flex;align-items:center;justify-content:center}.directory-browser-dialog .el-message-box__headerbtn:hover{background-color:#0000001a;transform:rotate(90deg)}.directory-browser-dialog .el-message-box__headerbtn .el-message-box__close{color:#606266;font-weight:700;font-size:16px}.directory-browser-dialog .el-message-box__headerbtn:hover .el-message-box__close{color:#409eff}.directory-browser-dialog .el-message-box__content{padding:20px}.directory-browser-dialog .el-message-box__btns{padding:10px 20px 15px;border-top:1px solid #e4e7ed}.directory-browser{width:100%;height:400px;overflow:auto}.current-path{padding:10px;background-color:#f5f7fa;border-radius:4px;margin-bottom:10px;border:1px solid #e4e7ed;display:flex;align-items:center;width:100%;box-sizing:border-box}.path-label{font-weight:700;margin-right:5px;white-space:nowrap;flex-shrink:0}.path-value{font-family:monospace;word-break:break-all;flex:1;min-width:0;background-color:#fff;padding:5px 8px;border-radius:3px;border:1px solid #dcdfe6;box-shadow:inset 0 1px 2px #0000000d;width:100%}.directory-list{list-style:none!important;padding:0;margin:0;border:1px solid #e4e7ed;border-radius:4px;max-height:300px;overflow-y:auto;background-color:#fff;display:flex;flex-direction:column;width:100%;box-sizing:border-box}.directory-item{padding:10px 12px;border-bottom:1px solid #ebeef5;cursor:pointer;display:flex;align-items:center;transition:all .2s ease;position:relative;width:100%;box-sizing:border-box;list-style:none!important}.directory-item:hover{background-color:#ecf5ff}.directory-item:last-child{border-bottom:none}.parent-dir{background-color:#f5f7fa;font-weight:500}.dir-icon{margin-right:12px;display:flex;align-items:center;justify-content:center;width:24px;height:24px;flex-shrink:0}.dir-name{display:flex;align-items:center;font-size:14px;line-height:1.4}.folder-icon{filter:drop-shadow(0 1px 2px rgba(0,0,0,.1));transition:all .2s ease}.directory-item:hover .folder-icon{transform:scale(1.1)}*{margin:0;padding:0}div{box-sizing:border-box}
|