zen-gitsync 2.0.4 → 2.0.6
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/README.md +31 -2
- package/package.json +3 -1
- package/src/ui/client/components.d.ts +1 -0
- package/src/ui/client/src/App.vue +626 -186
- package/src/ui/client/src/components/CommitForm.vue +508 -401
- package/src/ui/client/src/components/GitStatus.vue +590 -224
- package/src/ui/client/src/components/LogList.vue +809 -83
- package/src/ui/client/src/stores/gitLogStore.ts +440 -125
- package/src/ui/client/src/stores/gitStore.ts +86 -1
- package/src/ui/client/stats.html +1 -1
- package/src/ui/public/assets/index-DaPynzAr.js +10 -0
- package/src/ui/public/assets/index-qfIezZmd.css +1 -0
- package/src/ui/public/assets/vendor-BcSuWc8z.js +45 -0
- package/src/ui/public/index.html +3 -3
- package/src/ui/server/index.js +375 -44
- package/src/ui/public/assets/index-D5irnfho.css +0 -1
- package/src/ui/public/assets/index-DBck3u67.js +0 -8
- package/src/ui/public/assets/vendor-CdJ34PvS.js +0 -45
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import{d as Qe,r as d,E as i,o as Ve,a as pt,l as mt,b as Ee,c as he,w as De,e as $,f as m,g as e,h as t,i as Fe,u as n,j as o,k as et,m as Ze,n as vt,p as ge,q as gt,s as le,t as Pe,v as Oe,x as B,y as L,F as de,z as me,A as Ge,B as Be,C as tt,D as st,G as je,H as ze,I as yt,J as Te,K as Q,L as ot,M as ht,N as _t,O as Ce,P as at,Q as lt,R as nt,S as Me,T as Ne,U as xe,V as it,W as rt,X as wt,Y as Xe,Z as Ke,_ as $t,$ as kt,a0 as Ct,a1 as bt,a2 as St,a3 as Tt,a4 as Le,a5 as Vt,a6 as Lt,a7 as Rt,a8 as be,a9 as Dt,aa as Gt,ab as zt,ac as xt,ad as Et}from"./vendor-BcSuWc8z.js";(function(){const v=document.createElement("link").relList;if(v&&v.supports&&v.supports("modulepreload"))return;for(const u of document.querySelectorAll('link[rel="modulepreload"]'))w(u);new MutationObserver(u=>{for(const j of u)if(j.type==="childList")for(const D of j.addedNodes)D.tagName==="LINK"&&D.rel==="modulepreload"&&w(D)}).observe(document,{childList:!0,subtree:!0});function V(u){const j={};return u.integrity&&(j.integrity=u.integrity),u.referrerPolicy&&(j.referrerPolicy=u.referrerPolicy),u.crossOrigin==="use-credentials"?j.credentials="include":u.crossOrigin==="anonymous"?j.credentials="omit":j.credentials="same-origin",j}function w(u){if(u.ep)return;u.ep=!0;const j=V(u);fetch(u.href,j)}})();const _e=Qe("git",()=>{const Z=d(""),v=d([]),V=d(""),w=d(""),u=d(!1),j=d(!1),D=d(!1),J=d(0);function te(){Z.value="",v.value=[],V.value="",w.value="",u.value=!1,j.value=!1,D.value=!1,J.value=0}async function M(){const C=Date.now();if(C-J.value<1e3)return console.log("使用缓存的Git仓库状态:",D.value?"是":"不是"),D.value;try{const W=await(await fetch("/api/current_directory")).json();return D.value=W.isGitRepo===!0,J.value=C,console.log(`当前目录${D.value?"是":"不是"}Git仓库`),D.value}catch(y){return console.error("检查Git仓库状态失败:",y),D.value=!1,J.value=C,!1}}async function I(){try{const y=await(await fetch("/api/branch")).json();y.branch&&(Z.value=y.branch)}catch(C){console.error("获取分支信息失败:",C)}}async function F(){try{const y=await(await fetch("/api/branches")).json();y.branches&&Array.isArray(y.branches)&&(v.value=y.branches)}catch(C){console.error("获取所有分支信息失败:",C)}}async function A(C){console.log("切换到分支:",C);try{u.value=!0;const W=await(await fetch("/api/checkout",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({branch:C})})).json();return W.success?(i({message:`已切换到分支: ${C}`,type:"success"}),I(),!0):(i({message:`切换分支失败: ${W.error}`,type:"error"}),!1)}catch(y){return i({message:`切换分支失败: ${y.message}`,type:"error"}),!1}finally{u.value=!1}}async function X(){try{const y=await(await fetch("/api/user-info")).json();y.name&&y.email&&(V.value=y.name,w.value=y.email)}catch(C){console.error("获取用户信息失败:",C)}}async function Y(C,y){if(!C.trim())return i({message:"分支名称不能为空",type:"warning"}),!1;try{j.value=!0;const H=await(await fetch("/api/create-branch",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({newBranchName:C,baseBranch:y||Z.value})})).json();return H.success?(i({message:`已创建并切换到分支: ${C}`,type:"success"}),I(),F(),!0):(i({message:`创建分支失败: ${H.error}`,type:"error"}),!1)}catch(W){return i({message:`创建分支失败: ${W.message}`,type:"error"}),!1}finally{j.value=!1}}async function R(){await M()?(I(),F(),X()):(Z.value="",v.value=[],V.value="",w.value="")}async function G(){try{const y=await(await fetch("/api/clear-user-config",{method:"POST"})).json();return y.success?(V.value="",w.value="",i({message:"已清除Git用户配置",type:"success"}),!0):(i({message:`清除配置失败: ${y.error}`,type:"error"}),!1)}catch(C){return i({message:`清除配置失败: ${C.message}`,type:"error"}),!1}}async function O(C,y){try{const H=await(await fetch("/api/restore-user-config",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:C,email:y})})).json();return H.success?(V.value=C,w.value=y,i({message:"已恢复Git用户配置",type:"success"}),!0):(i({message:`恢复配置失败: ${H.error}`,type:"error"}),!1)}catch(W){return i({message:`恢复配置失败: ${W.message}`,type:"error"}),!1}}return{currentBranch:Z,allBranches:v,userName:V,userEmail:w,isChangingBranch:u,isCreatingBranch:j,isGitRepo:D,lastCheckedTime:J,$reset:te,checkGitRepo:M,getCurrentBranch:I,getAllBranches:F,changeBranch:A,getUserInfo:X,createBranch:Y,loadInitialData:R,clearUserConfig:G,restoreUserConfig:O}}),Ue=300,He=Qe("gitLog",()=>{const Z=_e();let v=null;const V=d(!0),w=d([]),u=d({staged:[],unstaged:[],untracked:[]}),j=d(""),D=d([]),J=d(!1),te=d(!1),M=d(!1),I=d(!1),F=d(!1),A=d(!1);function X(){v&&v.disconnect();try{const h="http://localhost:3000";if(console.log("尝试连接Socket.IO服务器:",h),v=mt(h,{reconnectionDelayMax:1e4,reconnection:!0,reconnectionAttempts:10,reconnectionDelay:1e3,timeout:2e4,autoConnect:!0,forceNew:!0,transports:["websocket","polling"]}),!v){console.error("Socket.IO初始化失败: socket为null");return}console.log("Socket.IO初始化成功,socket ID:",v.id||"未连接"),v.on("connect",()=>{console.log("成功连接到Socket.IO服务器"),V.value&&v&&v.emit("start_monitoring")}),v.on("disconnect",g=>{console.log("与Socket.IO服务器断开连接:",g)}),v.on("git_status_update",g=>{if(!V.value)return;console.log("收到Git状态更新通知:",new Date().toLocaleTimeString()),g.status&&(j.value=g.status),g.porcelain!==void 0&&R(g.porcelain),D.value.length>0&&G(!1)}),v.on("monitoring_status",g=>{console.log("文件监控状态:",g.active?"已启动":"已停止")}),v.on("connect_error",g=>{console.error("Socket连接错误:",g.message)}),v.on("connect_timeout",()=>{console.error("Socket连接超时")}),v.on("reconnect",g=>{console.log(`Socket重连成功,尝试次数: ${g}`),V.value&&(console.log("重连后重新发送start_monitoring请求"),v==null||v.emit("start_monitoring"))}),v.on("reconnect_attempt",g=>{console.log(`Socket尝试重连,第 ${g} 次尝试`)}),v.on("reconnect_error",g=>{console.error("Socket重连错误:",g.message)}),v.on("reconnect_failed",()=>{console.error("Socket重连失败,已达到最大重试次数")}),v&&!v.connected&&(console.log("Socket未连接,尝试手动连接..."),v.connect())}catch(h){console.error("Socket.IO连接初始化失败:",h)}}function Y(){if(console.log("toggleAutoUpdate调用,当前值:",V.value),!v){console.error("无法切换自动更新状态: socket连接不存在"),i.error("无法连接到服务器,自动更新可能不会生效"),console.log("尝试重新建立socket连接..."),X(),localStorage.setItem("zen-gitsync-auto-update",V.value.toString());return}try{V.value?(console.log("发送start_monitoring命令..."),v.emit("start_monitoring"),i.success("自动更新已启用")):(console.log("发送stop_monitoring命令..."),v.emit("stop_monitoring"),i.info("自动更新已禁用")),localStorage.setItem("zen-gitsync-auto-update",V.value.toString()),console.log("已保存自动更新设置到本地存储:",V.value)}catch(h){console.error("切换自动更新状态时出错:",h),i.error(`切换自动更新失败: ${h.message}`)}}function R(h){if(h===void 0||h===""){D.value=[];return}const g=h.split(`
|
|
2
|
+
`),N=[];for(const oe of g){const ce=oe.match(/^([ MADRCU\?]{2})\s+(.+)$/);if(ce){let ae="";const S=ce[1],a=S.charAt(0),U=S.charAt(1);a==="A"||a==="M"||a==="D"||a==="R"?ae="added":a===" "&&U==="M"?ae="modified":a===" "&&U==="D"?ae="deleted":S==="??"?ae="untracked":ae="other",N.push({path:ce[2],type:ae})}}D.value=N}async function G(h=!0){if(!Z.isGitRepo){console.log("当前目录不是Git仓库,跳过加载提交历史");return}try{J.value=!0,console.log("开始加载提交历史...");const N=await(await fetch("/api/log")).json();N&&Array.isArray(N)&&(w.value=N),console.log(`提交历史加载完成,共 ${w.value.length} 条记录`),h&&i({message:"提交历史已更新",type:"success"})}catch(g){console.error("获取提交历史失败:",g),h&&i({message:`获取提交历史失败: ${g.message}`,type:"error"})}finally{J.value=!1}}async function O(){if(!Z.isGitRepo){console.log("当前目录不是Git仓库,跳过加载Git状态");return}try{te.value=!0;const g=await(await fetch("/api/status")).json();g.status&&(j.value=g.status,u.value={staged:g.status.staged||[],unstaged:g.status.unstaged||[],untracked:g.status.untracked||[]}),await C()}catch(h){console.error("获取Git状态失败:",h),i({message:`获取Git状态失败: ${h.message}`,type:"error"})}finally{te.value=!1}}async function C(){if(console.log("开始获取Git状态(porcelain格式)..."),!Z.isGitRepo){console.log("当前目录不是Git仓库,跳过加载Git状态");return}try{const g=await(await fetch("/api/status_porcelain")).json();g.status!==void 0?R(g.status):D.value=[]}catch(h){console.error("获取Git状态(porcelain)失败:",h),i({message:`获取Git状态(porcelain)失败: ${h.message}`,type:"error"}),D.value=[]}}async function y(){if(!Z.isGitRepo)return i.warning("当前目录不是Git仓库"),!1;try{M.value=!0;const g=await(await fetch("/api/add",{method:"POST"})).json();return g.success?(i({message:"文件已添加到暂存区",type:"success"}),O(),!0):(i({message:`添加文件失败: ${g.error}`,type:"error"}),!1)}catch(h){return i({message:`添加文件失败: ${h.message}`,type:"error"}),!1}finally{M.value=!1}}async function W(h){if(!Z.isGitRepo)return i.warning("当前目录不是Git仓库"),!1;try{M.value=!0;const N=await(await fetch("/api/add-file",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({filePath:h})})).json();return N.success?(i({message:"文件已暂存",type:"success"}),O(),!0):(i({message:`暂存文件失败: ${N.error}`,type:"error"}),!1)}catch(g){return i({message:`暂存文件失败: ${g.message}`,type:"error"}),!1}finally{M.value=!1}}async function H(h){if(!Z.isGitRepo)return i.warning("当前目录不是Git仓库"),!1;try{A.value=!0;const N=await(await fetch("/api/unstage-file",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({filePath:h})})).json();return N.success?(i({message:"已取消暂存文件",type:"success"}),O(),!0):(i({message:`取消暂存失败: ${N.error}`,type:"error"}),!1)}catch(g){return i({message:`取消暂存失败: ${g.message}`,type:"error"}),!1}finally{A.value=!1}}function q(h){return new Promise(g=>setTimeout(g,h))}async function ee(h,g=!1){if(!Z.isGitRepo)return i.warning("当前目录不是Git仓库"),!1;try{I.value=!0;const oe=await(await fetch("/api/commit",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({message:h,hasNewlines:h.includes(`
|
|
3
|
+
`),noVerify:g})})).json();return oe.success?(i({message:"提交成功",type:"success"}),O(),G(),!0):(i({message:`提交失败: ${oe.error}`,type:"error"}),!1)}catch(N){return i({message:`提交失败: ${N.message}`,type:"error"}),!1}finally{I.value=!1}}async function K(){if(!Z.isGitRepo)return i.warning("当前目录不是Git仓库"),!1;try{F.value=!0;const g=await(await fetch("/api/push",{method:"POST"})).json();return g.success?(i({message:"推送成功",type:"success"}),O(),G(),!0):(i({message:`推送失败: ${g.error}`,type:"error"}),!1)}catch(h){return i({message:`推送失败: ${h.message}`,type:"error"}),!1}finally{F.value=!1}}async function re(h,g=!1){return await y()?(await q(Ue),await ee(h,g)):!1}async function fe(h,g=!1){try{return!await y()||(await q(Ue),!await ee(h,g))?!1:(await q(Ue),await K())}catch(N){try{(await(await fetch("/api/remove-lock",{method:"POST"})).json()).success&&i({message:"已清理锁定文件,请重试操作",type:"warning"})}catch(oe){console.error("清理锁定文件失败:",oe)}return i({message:`操作失败: ${N.message}`,type:"error"}),!1}}async function se(){if(!Z.isGitRepo)return i.warning("当前目录不是Git仓库"),!1;try{A.value=!0;const g=await(await fetch("/api/reset-head",{method:"POST"})).json();return g.success?(i({message:"已重置暂存区",type:"success"}),O(),!0):(i({message:`重置暂存区失败: ${g.error}`,type:"error"}),!1)}catch(h){return i({message:`重置暂存区失败: ${h.message}`,type:"error"}),!1}finally{A.value=!1}}async function ve(h){if(!Z.isGitRepo)return i.warning("当前目录不是Git仓库"),!1;try{A.value=!0;const N=await(await fetch("/api/reset-to-remote",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({branch:h})})).json();return N.success?(i({message:`已重置分支 ${h} 到远程状态`,type:"success"}),O(),G(),!0):(i({message:`重置分支失败: ${N.error}`,type:"error"}),!1)}catch(g){return i({message:`重置分支失败: ${g.message}`,type:"error"}),!1}finally{A.value=!1}}return Ve(()=>{const h=localStorage.getItem("zen-gitsync-auto-update");h!==null&&(V.value=h==="true"),X()}),pt(()=>{v&&(v.disconnect(),v=null)}),{log:w,status:u,statusText:j,fileList:D,isLoadingLog:J,isLoadingStatus:te,isAddingFiles:M,isResetting:A,isCommiting:I,isPushing:F,autoUpdateEnabled:V,fetchLog:G,fetchStatus:O,fetchStatusPorcelain:C,parseStatusPorcelain:R,addToStage:y,addFileToStage:W,unstageFile:H,commitChanges:ee,pushToRemote:K,addAndCommit:re,addCommitAndPush:fe,resetHead:se,resetToRemote:ve,toggleAutoUpdate:Y}}),Bt={class:"card"},jt={class:"status-header"},At={class:"header-actions"},Ot={class:"card-content"},Ut={class:"current-directory"},It={key:0,class:"status-box"},Ft={key:1,class:"file-list-container"},Pt={key:0,class:"file-group"},Mt={class:"file-list"},Nt=["onClick"],Ht={class:"file-info"},Wt={class:"file-path-container"},Jt={class:"file-name"},Yt={class:"file-directory"},qt={class:"file-actions"},Zt={key:1,class:"file-group"},Xt={class:"file-list"},Kt=["onClick"],Qt={class:"file-info"},es={class:"file-path-container"},ts={class:"file-name"},ss={class:"file-directory"},os={class:"file-actions"},as={key:2,class:"file-group"},ls={class:"file-list"},ns=["onClick"],is={class:"file-info"},rs={class:"file-path-container"},cs={class:"file-name"},us={class:"file-directory"},ds={class:"file-actions"},fs={key:2,class:"empty-status"},ps={class:"empty-icon"},ms={class:"directory-buttons"},vs={class:"browser-current-path"},gs={key:0,class:"browser-error"},ys={class:"directory-browser"},hs={class:"browser-nav"},_s={class:"directory-items-container"},ws={class:"directory-items"},$s=["onClick"],ks={class:"diff-content"},Cs=["innerHTML"],bs={key:1,class:"no-diff"},Ss={class:"file-navigation"},Ts={class:"file-counter"},Vs=Ee({__name:"GitStatus",props:{initialDirectory:{type:String,default:""}},setup(Z,{expose:v}){const V=Z,w=He(),u=_e(),j=he(()=>w.isLoadingStatus),D=d(""),J=d(""),te=d(!1),M=d(!1),I=d(-1),F=d(!1),A=d(""),X=d(!1),Y=d(!1),R=d(""),G=d([]),O=d(!1),C=d(""),y=d(V.initialDirectory||"");async function W(){try{if(!y.value){const c=await(await fetch("/api/current_directory")).json();y.value=c.directory||"未知目录"}if(!u.isGitRepo)return;await w.fetchStatus(),i({message:"Git 状态已刷新",type:"success"})}catch(_){i({message:"刷新失败: "+_.message,type:"error"})}}function H(_){if(!_)return"";const c=_.split(`
|
|
4
|
+
`);function x(T){return T.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}return c.map(T=>{const l=x(T);return T.startsWith("diff --git")?`<div class="diff-header">${l}</div>`:T.startsWith("---")?`<div class="diff-old-file">${l}</div>`:T.startsWith("+++")?`<div class="diff-new-file">${l}</div>`:T.startsWith("@@")?`<div class="diff-hunk-header">${l}</div>`:T.startsWith("+")?`<div class="diff-added">${l}</div>`:T.startsWith("-")?`<div class="diff-removed">${l}</div>`:`<div class="diff-context">${l}</div>`}).join("")}async function q(_){try{M.value=!0,D.value=_,I.value=w.fileList.findIndex(T=>T.path===_);const x=await(await fetch(`/api/diff?file=${encodeURIComponent(_)}`)).json();J.value=x.diff||"没有变更",te.value=!0}catch(c){i({message:"获取文件差异失败: "+c.message,type:"error"}),J.value="获取差异失败: "+c.message}finally{M.value=!1}}async function ee(){if(w.fileList.length===0||I.value<=0)return;const _=I.value-1,c=w.fileList[_];await q(c.path)}async function K(){if(w.fileList.length===0||I.value>=w.fileList.length-1)return;const _=I.value+1,c=w.fileList[_];await q(c.path)}function re(){A.value=y.value,F.value=!0}function fe(){C.value="",R.value=A.value||y.value,Y.value=!0,se(R.value)}async function se(_){try{O.value=!0,C.value="";let c=_;/^[A-Za-z]:$/.test(c)&&(c+="/");const x=await fetch(`/api/browse_directory?path=${encodeURIComponent(c)}`);if(x.status===403){const l=await x.json();C.value=l.error||"目录浏览功能未启用";return}if(!x.ok){const l=await x.json();C.value=l.error||"获取目录内容失败";return}const T=await x.json();T.success?(G.value=T.items,R.value=T.currentPath):C.value=T.error||"获取目录内容失败"}catch(c){C.value=`获取目录内容失败: ${c.message}`}finally{O.value=!1}}function ve(){if(/^[A-Za-z]:$/.test(R.value)||/^[A-Za-z]:[\\/]$/.test(R.value)||R.value==="/")return;let _=R.value.split(/[/\\]/);_.pop();let c=_.join("/");_.length===1&&/^[A-Za-z]:$/.test(_[0])&&(c=_[0]+"/"),c&&se(c)}function h(_){_.type==="directory"&&se(_.path)}function g(){A.value=R.value,Y.value=!1}async function N(){if(!A.value){i.warning("目录路径不能为空");return}try{X.value=!0;const c=await(await fetch("/api/change_directory",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:A.value})})).json();c.success?(i.success("已切换工作目录"),y.value=c.directory,F.value=!1,u.isGitRepo=c.isGitRepo,c.isGitRepo?(await Promise.all([u.getCurrentBranch(),u.getAllBranches(),u.getUserInfo()]),await W()):(i.warning("当前目录不是一个Git仓库"),u.$reset())):i.error(c.error||"切换目录失败")}catch(_){i.error(`切换目录失败: ${_.message}`)}finally{X.value=!1}}function oe(_){q(_.path)}async function ce(_){await w.addFileToStage(_)}async function ae(_){await w.unstageFile(_)}async function S(){await W()}async function a(_){try{await lt.confirm(`确定要撤回文件 "${_}" 的所有修改吗?此操作无法撤销。`,"撤回修改",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"});const x=await(await fetch("/api/revert_file",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({filePath:_})})).json();x.success?(i.success("已撤回文件修改"),await W()):i.error(x.error?`撤回失败: ${x.error}`:"撤回文件修改失败,请重试")}catch(c){if(c==="cancel"||c.message==="cancel")return;const x=c.message||"未知错误";x!=="undefined"?i.error(`撤回文件修改失败: ${x}`):i.error("撤回文件修改失败,请重试")}}function U(_){const c=_.split("/");return c[c.length-1]}function z(_){const c=_.split("/");return c.length<=1?"":c.slice(0,-1).join("/")}return Ve(()=>{W()}),De(()=>w.autoUpdateEnabled,(_,c)=>{console.log(`自动更新状态变更: ${c} -> ${_}`),w.toggleAutoUpdate()},{immediate:!1}),v({refreshStatus:S}),(_,c)=>{const x=et,T=Fe,l=ge,r=Pe,k=je,P=st,b=tt,ne=Be,pe=ot;return m(),$("div",Bt,[e("div",jt,[c[5]||(c[5]=e("h2",null,"Git 状态",-1)),e("div",At,[t(T,{content:n(w).autoUpdateEnabled?"禁用自动更新文件状态":"启用自动更新文件状态",placement:"top","hide-after":1e3},{default:o(()=>[t(x,{modelValue:n(w).autoUpdateEnabled,"onUpdate:modelValue":c[0]||(c[0]=f=>n(w).autoUpdateEnabled=f),style:{"--el-switch-on-color":"#67C23A","--el-switch-off-color":"#909399","margin-right":"10px"},"inline-prompt":"","active-icon":n(vt),"inactive-icon":n(Ze),class:"auto-update-switch"},null,8,["modelValue","active-icon","inactive-icon"])]),_:1},8,["content"]),t(T,{content:"刷新状态",placement:"top","hide-after":1e3},{default:o(()=>[t(l,{type:"primary",icon:n(gt),circle:"",size:"small",onClick:S,loading:j.value},null,8,["icon","loading"])]),_:1})])]),e("div",Ot,[e("div",Ut,[t(r,null,{default:o(()=>[t(n(Oe))]),_:1}),e("span",null,B(y.value),1),t(l,{type:"primary",size:"small",onClick:re,plain:""},{default:o(()=>c[6]||(c[6]=[L(" 切换目录 ")])),_:1})]),n(u).isGitRepo?le("",!0):(m(),$("div",It," 当前目录不是一个Git仓库 ")),n(w).fileList.length?(m(),$("div",Ft,[n(w).fileList.some(f=>f.type==="added")?(m(),$("div",Pt,[c[8]||(c[8]=e("div",{class:"file-group-header"},"已暂存的更改",-1)),e("div",Mt,[(m(!0),$(de,null,me(n(w).fileList.filter(f=>f.type==="added"),f=>(m(),$("div",{key:f.path,class:"file-item",onClick:p=>oe(f)},[e("div",Ht,[e("div",Wt,[e("span",Jt,B(U(f.path)),1),e("span",Yt,B(z(f.path)),1)])]),e("div",qt,[t(T,{content:"取消暂存",placement:"top","hide-after":1e3},{default:o(()=>[t(l,{type:"warning",size:"small",circle:"",onClick:Ce(p=>ae(f.path),["stop"])},{default:o(()=>c[7]||(c[7]=[L("-")])),_:2},1032,["onClick"])]),_:2},1024)])],8,Nt))),128))])])):le("",!0),n(w).fileList.some(f=>f.type==="modified"||f.type==="deleted")?(m(),$("div",Zt,[c[10]||(c[10]=e("div",{class:"file-group-header"},"未暂存的更改",-1)),e("div",Xt,[(m(!0),$(de,null,me(n(w).fileList.filter(f=>f.type==="modified"||f.type==="deleted"),f=>(m(),$("div",{key:f.path,class:"file-item",onClick:p=>oe(f)},[e("div",Qt,[e("div",{class:Te(["file-status-indicator",f.type])},null,2),e("div",es,[e("span",ts,B(U(f.path)),1),e("span",ss,B(z(f.path)),1)])]),e("div",os,[t(T,{content:"添加到暂存区",placement:"top","hide-after":1e3},{default:o(()=>[t(l,{type:"success",size:"small",circle:"",onClick:Ce(p=>ce(f.path),["stop"])},{default:o(()=>c[9]||(c[9]=[L("+")])),_:2},1032,["onClick"])]),_:2},1024),t(T,{content:"撤回修改",placement:"top","hide-after":1e3},{default:o(()=>[t(l,{type:"danger",size:"small",icon:n(at),circle:"",onClick:Ce(p=>a(f.path),["stop"])},null,8,["icon","onClick"])]),_:2},1024)])],8,Kt))),128))])])):le("",!0),n(w).fileList.some(f=>f.type==="untracked")?(m(),$("div",as,[c[13]||(c[13]=e("div",{class:"file-group-header"},"未跟踪的文件",-1)),e("div",ls,[(m(!0),$(de,null,me(n(w).fileList.filter(f=>f.type==="untracked"),f=>(m(),$("div",{key:f.path,class:"file-item",onClick:p=>oe(f)},[e("div",is,[c[11]||(c[11]=e("div",{class:"file-status-indicator untracked"},null,-1)),e("div",rs,[e("span",cs,B(U(f.path)),1),e("span",us,B(z(f.path)),1)])]),e("div",ds,[t(T,{content:"添加到暂存区",placement:"top","hide-after":1e3},{default:o(()=>[t(l,{type:"success",size:"small",circle:"",onClick:Ce(p=>ce(f.path),["stop"])},{default:o(()=>c[12]||(c[12]=[L("+")])),_:2},1032,["onClick"])]),_:2},1024),t(T,{content:"删除文件",placement:"top","hide-after":1e3},{default:o(()=>[t(l,{type:"danger",size:"small",icon:n(Ze),circle:"",onClick:Ce(p=>a(f.path),["stop"])},null,8,["icon","onClick"])]),_:2},1024)])],8,ns))),128))])])):le("",!0)])):n(u).isGitRepo?(m(),$("div",fs,[e("div",ps,[t(r,null,{default:o(()=>[t(n(Ge))]),_:1})]),c[14]||(c[14]=e("div",{class:"empty-text"},"没有检测到任何更改",-1))])):le("",!0)]),t(ne,{modelValue:F.value,"onUpdate:modelValue":c[2]||(c[2]=f=>F.value=f),title:"切换工作目录",width:"500px"},{default:o(()=>[t(b,null,{default:o(()=>[t(P,{label:"目录路径"},{default:o(()=>[t(k,{modelValue:A.value,"onUpdate:modelValue":c[1]||(c[1]=f=>A.value=f),placeholder:"请输入目录路径",clearable:""},null,8,["modelValue"]),e("div",ms,[t(l,{onClick:fe,type:"primary",plain:"",class:"no-padding-left"},{default:o(()=>[t(r,null,{default:o(()=>[t(n(Oe))]),_:1}),c[15]||(c[15]=L(" 浏览 "))]),_:1}),t(l,{onClick:N,loading:X.value,type:"primary"},{default:o(()=>c[16]||(c[16]=[L(" 切换 ")])),_:1},8,["loading"])])]),_:1})]),_:1})]),_:1},8,["modelValue"]),t(ne,{modelValue:Y.value,"onUpdate:modelValue":c[3]||(c[3]=f=>Y.value=f),title:"浏览目录",width:"600px"},{default:o(()=>[e("div",vs,[e("span",null,"当前路径: "+B(R.value),1)]),C.value?(m(),$("div",gs,B(C.value),1)):le("",!0),ze((m(),$("div",ys,[e("div",hs,[t(l,{onClick:ve,disabled:!R.value||O.value,size:"small",class:"no-padding-left"},{default:o(()=>[t(r,null,{default:o(()=>[t(n(yt))]),_:1}),c[17]||(c[17]=L(" 上级目录 "))]),_:1},8,["disabled"]),t(l,{onClick:g,type:"primary",size:"small",class:"no-padding-left"},{default:o(()=>c[18]||(c[18]=[L(" 选择当前目录 ")])),_:1})]),e("div",_s,[e("ul",ws,[(m(!0),$(de,null,me(G.value,f=>(m(),$("li",{key:f.path,class:Te(["directory-item",f.type]),onClick:p=>h(f)},[f.type==="directory"?(m(),Q(r,{key:0},{default:o(()=>[t(n(Oe))]),_:1})):(m(),Q(r,{key:1},{default:o(()=>[t(n(Ge))]),_:1})),e("span",null,B(f.name),1)],10,$s))),128))])])])),[[pe,O.value]])]),_:1},8,["modelValue"]),t(ne,{modelValue:te.value,"onUpdate:modelValue":c[4]||(c[4]=f=>te.value=f),title:`文件差异: ${D.value}`,width:"80%","destroy-on-close":"",class:"diff-dialog"},{default:o(()=>[ze((m(),$("div",ks,[J.value?(m(),$("div",{key:0,innerHTML:H(J.value),class:"diff-formatted"},null,8,Cs)):(m(),$("div",bs,"该文件没有差异或是新文件"))])),[[pe,M.value]]),e("div",Ss,[t(l,{icon:n(ht),onClick:ee,disabled:I.value<=0||n(w).fileList.length===0,circle:""},null,8,["icon","disabled"]),e("span",Ts,B(I.value+1)+" / "+B(n(w).fileList.length),1),t(l,{icon:n(_t),onClick:K,disabled:I.value>=n(w).fileList.length-1||n(w).fileList.length===0,circle:""},null,8,["icon","disabled"])])]),_:1},8,["modelValue","title"])])}}}),Ae=(Z,v)=>{const V=Z.__vccOpts||Z;for(const[w,u]of v)V[w]=u;return V},Ls=Ae(Vs,[["__scopeId","data-v-eb92d5f0"]]),Rs={class:"card-content"},Ds={class:"layout-container"},Gs={key:0,class:"git-config-warning"},zs={class:"commit-section"},xs={class:"commit-options"},Es={class:"options-row"},Bs={class:"commit-mode-toggle"},js={class:"no-verify-toggle"},As={key:0,class:"commit-form"},Os={key:1,class:"standard-commit-form"},Us={class:"standard-commit-header"},Is={class:"scope-container"},Fs={class:"description-container"},Ps={class:"preview-section"},Ms={class:"preview-content"},Ns={class:"preview-content code-command"},Hs={class:"actions-section"},Ws={class:"action-groups"},Js={class:"action-group"},Ys={class:"group-buttons"},qs={class:"action-group"},Zs={class:"group-buttons"},Xs={class:"action-group"},Ks={class:"group-buttons"},Qs={class:"template-container"},eo={class:"template-form"},to={class:"template-form-buttons"},so={class:"template-list"},oo={class:"template-content"},ao={class:"template-actions"},lo={class:"template-container"},no={class:"template-form"},io={class:"template-form-buttons"},ro={class:"template-list"},co={class:"template-content"},uo={class:"template-actions"},fo=Ee({__name:"CommitForm",setup(Z){const v=He(),V=_e(),w=d(""),u=d(!1),j=d("输入提交信息..."),D=d(""),J=d(!1),te=d("feat"),M=d(""),I=d(""),F=d(""),A=d(""),X=d([]),Y=d(!1),R=d(""),G=d(!1),O=d(""),C=d(-1),y=d([]),W=d(!1),H=d(""),q=d(!1),ee=d(""),K=d(-1),re=d(!1),fe=[{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: 构建/工具修改"}];De(J,p=>{localStorage.setItem("zen-gitsync-standard-commit",p.toString())}),De(re,p=>{localStorage.setItem("zen-gitsync-skip-hooks",p.toString())});const se=he(()=>{if(!J.value)return w.value||D.value;let p=`${te.value||""}`;return M.value&&(p+=`(${M.value})`),p+=`: ${I.value}`,F.value&&(p+=`
|
|
5
|
+
|
|
6
|
+
${F.value}`),A.value&&(p+=`
|
|
7
|
+
|
|
8
|
+
${A.value}`),p}),ve=he(()=>{let p=`git commit -m "${se.value}"`;return re.value&&(p+=" --no-verify"),p});async function h(){try{const s=await(await fetch("/api/config/getConfig")).json();j.value=`输入提交信息 (默认: ${s.defaultCommitMessage})`,D.value=s.defaultCommitMessage||"",s.descriptionTemplates&&Array.isArray(s.descriptionTemplates)&&(X.value=s.descriptionTemplates),s.scopeTemplates&&Array.isArray(s.scopeTemplates)&&(y.value=s.scopeTemplates)}catch(p){console.error("加载配置失败:",p)}}async function g(){if(!R.value.trim()){i({message:"请输入模板内容",type:"warning"});return}try{if(G.value)await N();else{if(X.value.includes(R.value)){i({message:"该模板已存在",type:"warning"});return}X.value.push(R.value);const s=await(await fetch("/api/config/save-template",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({template:R.value,type:"description"})})).json();s.success?(i({message:"模板保存成功!",type:"success"}),R.value=""):i({message:"模板保存失败: "+s.error,type:"error"})}}catch(p){i({message:"模板保存失败: "+p.message,type:"error"})}}async function N(){try{if(C.value>=0){const p=O.value,s=R.value;X.value[C.value]=s;const ue=await(await fetch("/api/config/update-template",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldTemplate:p,newTemplate:s,type:"description"})})).json();ue.success?(i({message:"模板更新成功!",type:"success"}),G.value=!1,O.value="",C.value=-1,R.value=""):i({message:"模板更新失败: "+ue.error,type:"error"})}}catch(p){i({message:"模板更新失败: "+p.message,type:"error"})}}function oe(p,s){G.value=!0,O.value=p,C.value=s,R.value=p}function ce(){G.value=!1,O.value="",C.value=-1,R.value=""}async function ae(){if(!H.value.trim()){i({message:"请输入模板内容",type:"warning"});return}try{if(q.value)await S();else{if(y.value.includes(H.value)){i({message:"该模板已存在",type:"warning"});return}y.value.push(H.value);const s=await(await fetch("/api/config/save-template",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({template:H.value,type:"scope"})})).json();s.success?(i({message:"作用域模板保存成功!",type:"success"}),H.value=""):i({message:"作用域模板保存失败: "+s.error,type:"error"})}}catch(p){i({message:"作用域模板保存失败: "+p.message,type:"error"})}}async function S(){try{if(K.value>=0){const p=ee.value,s=H.value;y.value[K.value]=s;const ue=await(await fetch("/api/config/update-template",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldTemplate:p,newTemplate:s,type:"scope"})})).json();ue.success?(i({message:"作用域模板更新成功!",type:"success"}),q.value=!1,ee.value="",K.value=-1,H.value=""):i({message:"作用域模板更新失败: "+ue.error,type:"error"})}}catch(p){i({message:"作用域模板更新失败: "+p.message,type:"error"})}}function a(p,s){q.value=!0,ee.value=p,K.value=s,H.value=p}function U(){q.value=!1,ee.value="",K.value=-1,H.value=""}async function z(p){try{const s=X.value.indexOf(p);s!==-1&&X.value.splice(s,1);const ue=await(await fetch("/api/config/delete-template",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({template:p,type:"description"})})).json();ue.success?i({message:"模板删除成功!",type:"success"}):i({message:"模板删除失败: "+ue.error,type:"error"})}catch(s){i({message:"模板删除失败: "+s.message,type:"error"})}}async function _(p){try{const s=y.value.indexOf(p);s!==-1&&y.value.splice(s,1);const ue=await(await fetch("/api/config/delete-template",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({template:p,type:"scope"})})).json();ue.success?i({message:"作用域模板删除成功!",type:"success"}):i({message:"作用域模板删除失败: "+ue.error,type:"error"})}catch(s){i({message:"作用域模板删除失败: "+s.message,type:"error"})}}function c(p){I.value=p,Y.value=!1}function x(p){M.value=p,W.value=!1}function T(){Y.value=!0}function l(){W.value=!0}async function r(){try{await v.addToStage()&&v.fetchStatus()}catch(p){i({message:`添加文件失败: ${p.message}`,type:"error"})}}async function k(){if(!se.value.trim()){i({message:"提交信息不能为空",type:"warning"});return}try{await v.commitChanges(se.value,re.value)&&(f(),v.fetchStatus(),v.fetchLog())}catch(p){i({message:`提交失败: ${p.message}`,type:"error"})}}async function P(){try{u.value=!0,await v.pushToRemote()&&(V.getCurrentBranch(),v.fetchLog())}catch(p){i({message:`推送失败: ${p.message}`,type:"error"})}finally{u.value=!1}}async function b(){if(!se.value.trim()){i({message:"提交信息不能为空",type:"warning"});return}try{await v.addAndCommit(se.value,re.value),f(),v.fetchStatus(),v.fetchLog()}catch(p){i({message:`暂存并提交失败: ${p.message}`,type:"error"})}}async function ne(){if(!se.value.trim()){i({message:"提交信息不能为空",type:"warning"});return}try{await v.addCommitAndPush(se.value,re.value),f(),V.getCurrentBranch(),v.fetchLog()}catch(p){i({message:`暂存、提交并推送失败: ${p.message}`,type:"error"})}finally{}}async function pe(){try{await lt.confirm(`确定要重置当前分支 "${V.currentBranch}" 到远程状态吗?这将丢失所有未推送的提交和本地更改。`,"重置到远程分支",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"}),await v.resetToRemote(V.currentBranch)&&(v.fetchStatus(),v.fetchLog())}catch(p){p!=="cancel"&&i({message:`重置到远程分支失败: ${p.message}`,type:"error"})}}function f(){w.value="",I.value="",F.value="",A.value=""}return Ve(()=>{h();const p=localStorage.getItem("zen-gitsync-standard-commit");p!==null&&(J.value=p==="true");const s=localStorage.getItem("zen-gitsync-skip-hooks");s!==null&&(re.value=s==="true")}),(p,s)=>{const we=nt,ue=et,ut=Fe,ye=je,dt=Me,ft=Ne,ie=ge,We=it,Je=wt,Ye=rt,qe=Be;return m(),$("div",{class:Te(["card",{"is-pushing":n(v).isPushing||u.value}])},[s[35]||(s[35]=e("div",{class:"card-header"},[e("h2",null,"提交更改")],-1)),e("div",Rs,[e("div",Ds,[n(V).userName===""||n(V).userEmail===""?(m(),$("div",Gs,[t(we,{title:"Git用户信息未配置",type:"warning",closable:!1,"show-icon":""},{default:o(()=>s[12]||(s[12]=[e("p",null,"您需要配置Git用户名和邮箱才能提交代码。请使用以下命令配置:",-1),e("pre",{class:"config-command"},`git config --global user.name "Your Name"
|
|
9
|
+
git config --global user.email "your.email@example.com"`,-1)])),_:1})])):(m(),$(de,{key:1},[e("div",zs,[e("div",xs,[e("div",Es,[e("div",Bs,[t(ue,{modelValue:J.value,"onUpdate:modelValue":s[0]||(s[0]=E=>J.value=E),"active-text":"标准化提交","inactive-text":"普通提交"},null,8,["modelValue"])]),e("div",js,[t(ut,{content:"跳过 Git 钩子检查 (--no-verify)",placement:"top"},{default:o(()=>[t(ue,{modelValue:re.value,"onUpdate:modelValue":s[1]||(s[1]=E=>re.value=E),"active-text":"跳过钩子 (--no-verify)"},null,8,["modelValue"])]),_:1})])])]),J.value?(m(),$("div",Os,[e("div",Us,[t(ft,{modelValue:te.value,"onUpdate:modelValue":s[3]||(s[3]=E=>te.value=E),placeholder:"提交类型",class:"type-select",clearable:""},{default:o(()=>[(m(),$(de,null,me(fe,E=>t(dt,{key:E.value,label:E.label,value:E.value},null,8,["label","value"])),64))]),_:1},8,["modelValue"]),e("div",Is,[t(ye,{modelValue:M.value,"onUpdate:modelValue":s[4]||(s[4]=E=>M.value=E),placeholder:"作用域(可选)",class:"scope-input",clearable:""},null,8,["modelValue"]),t(ie,{type:"primary",icon:n(xe),circle:"",size:"small",class:"settings-button",onClick:l},null,8,["icon"])]),e("div",Fs,[t(ye,{modelValue:I.value,"onUpdate:modelValue":s[5]||(s[5]=E=>I.value=E),placeholder:"简短描述(必填)",class:"description-input",clearable:""},null,8,["modelValue"]),t(ie,{type:"primary",icon:n(xe),circle:"",size:"small",class:"settings-button",onClick:T},null,8,["icon"])])]),t(ye,{modelValue:F.value,"onUpdate:modelValue":s[6]||(s[6]=E=>F.value=E),type:"textarea",rows:4,placeholder:"正文(可选):详细描述本次提交的内容和原因",class:"body-input",clearable:""},null,8,["modelValue"]),t(ye,{modelValue:A.value,"onUpdate:modelValue":s[7]||(s[7]=E=>A.value=E),placeholder:"页脚(可选):如 Closes #123",class:"footer-input",clearable:""},null,8,["modelValue"]),e("div",Ps,[s[13]||(s[13]=e("div",{class:"preview-title"},"提交信息预览:",-1)),e("pre",Ms,B(se.value),1),s[14]||(s[14]=e("div",{class:"preview-title",style:{"margin-top":"10px"}},"Git命令预览:",-1)),e("pre",Ns,B(ve.value),1)])])):(m(),$("div",As,[t(ye,{modelValue:w.value,"onUpdate:modelValue":s[2]||(s[2]=E=>w.value=E),placeholder:j.value,clearable:""},null,8,["modelValue","placeholder"])]))]),e("div",Hs,[s[24]||(s[24]=e("h3",null,"Git 操作",-1)),e("div",Ws,[e("div",Js,[s[18]||(s[18]=e("div",{class:"group-title"},"基础操作",-1)),e("div",Ys,[t(ie,{type:"primary",onClick:r,loading:n(v).isAddingFiles,class:"action-button"},{default:o(()=>s[15]||(s[15]=[L(" 暂存更改 "),e("span",{class:"command-text"},"git add .",-1)])),_:1},8,["loading"]),t(ie,{type:"primary",onClick:k,loading:n(v).isLoadingStatus,class:"action-button"},{default:o(()=>s[16]||(s[16]=[L(" 提交 "),e("span",{class:"command-text"},"git commit",-1)])),_:1},8,["loading"]),t(ie,{type:"success",onClick:P,loading:n(v).isPushing,class:"action-button push-button"},{default:o(()=>s[17]||(s[17]=[L(" 推送 "),e("span",{class:"command-text"},"git push",-1)])),_:1},8,["loading"])])]),e("div",qs,[s[21]||(s[21]=e("div",{class:"group-title"},"组合操作",-1)),e("div",Zs,[t(ie,{type:"warning",onClick:b,loading:n(v).isAddingFiles||n(v).isCommiting,class:"action-button"},{default:o(()=>s[19]||(s[19]=[L(" 暂存并提交 "),e("span",{class:"command-text"},"git add + commit",-1)])),_:1},8,["loading"]),t(ie,{type:"danger",onClick:ne,loading:n(v).isAddingFiles||n(v).isCommiting||n(v).isPushing,class:"action-button"},{default:o(()=>s[20]||(s[20]=[L(" 一键推送 "),e("span",{class:"command-text command-text-long"},"git add + commit + push",-1)])),_:1},8,["loading"])])]),e("div",Xs,[s[23]||(s[23]=e("div",{class:"group-title"},"重置操作",-1)),e("div",Ks,[t(ie,{type:"info",onClick:pe,loading:n(v).isResetting,class:"action-button reset-button"},{default:o(()=>s[22]||(s[22]=[L(" 重置到远程 "),e("span",{class:"command-text command-text-long"},"git reset --hard origin/branch",-1)])),_:1},8,["loading"])])])])])],64))]),t(qe,{title:"简短描述模板设置",modelValue:Y.value,"onUpdate:modelValue":s[9]||(s[9]=E=>Y.value=E),width:"80vw",style:{height:"80vh"}},{default:o(()=>[e("div",Qs,[e("div",eo,[t(ye,{modelValue:R.value,"onUpdate:modelValue":s[8]||(s[8]=E=>R.value=E),placeholder:G.value?"编辑模板内容":"输入新模板内容",class:"template-input",clearable:""},null,8,["modelValue","placeholder"]),e("div",to,[G.value?(m(),Q(ie,{key:0,onClick:ce},{default:o(()=>s[25]||(s[25]=[L("取消")])),_:1})):le("",!0),t(ie,{type:"primary",onClick:g,disabled:!R.value.trim()},{default:o(()=>[L(B(G.value?"更新模板":"添加模板"),1)]),_:1},8,["disabled"])])]),e("div",so,[s[29]||(s[29]=e("h3",null,"已保存模板",-1)),X.value.length===0?(m(),Q(We,{key:0,description:"暂无保存的模板"})):le("",!0),(m(!0),$(de,null,me(X.value,(E,$e)=>(m(),Q(Ye,{key:$e,class:"template-item"},{default:o(()=>[t(Je,{justify:"space-between",align:"middle",style:{width:"100%"}},{default:o(()=>[e("div",oo,B(E),1),e("div",ao,[t(ie,{type:"primary",size:"small",onClick:ke=>c(E)},{default:o(()=>s[26]||(s[26]=[L("使用")])),_:2},1032,["onClick"]),t(ie,{type:"warning",size:"small",icon:n(Xe),onClick:ke=>oe(E,$e)},{default:o(()=>s[27]||(s[27]=[L("编辑")])),_:2},1032,["icon","onClick"]),t(ie,{type:"danger",size:"small",onClick:ke=>z(E)},{default:o(()=>s[28]||(s[28]=[L("删除")])),_:2},1032,["onClick"])])]),_:2},1024)]),_:2},1024))),128))])])]),_:1},8,["modelValue"]),t(qe,{title:"作用域模板设置",modelValue:W.value,"onUpdate:modelValue":s[11]||(s[11]=E=>W.value=E),width:"80%",style:{height:"80vh"}},{default:o(()=>[e("div",lo,[e("div",no,[t(ye,{modelValue:H.value,"onUpdate:modelValue":s[10]||(s[10]=E=>H.value=E),placeholder:q.value?"编辑作用域模板内容":"输入新作用域模板",class:"template-input",clearable:""},null,8,["modelValue","placeholder"]),e("div",io,[q.value?(m(),Q(ie,{key:0,onClick:U},{default:o(()=>s[30]||(s[30]=[L("取消")])),_:1})):le("",!0),t(ie,{type:"primary",onClick:ae,disabled:!H.value.trim()},{default:o(()=>[L(B(q.value?"更新模板":"添加模板"),1)]),_:1},8,["disabled"])])]),e("div",ro,[s[34]||(s[34]=e("h3",null,"已保存作用域",-1)),y.value.length===0?(m(),Q(We,{key:0,description:"暂无保存的作用域"})):le("",!0),(m(!0),$(de,null,me(y.value,(E,$e)=>(m(),Q(Ye,{key:$e,class:"template-item"},{default:o(()=>[t(Je,{justify:"space-between",align:"middle",style:{width:"100%"}},{default:o(()=>[e("div",co,B(E),1),e("div",uo,[t(ie,{type:"primary",size:"small",onClick:ke=>x(E)},{default:o(()=>s[31]||(s[31]=[L("使用")])),_:2},1032,["onClick"]),t(ie,{type:"warning",size:"small",icon:n(Xe),onClick:ke=>a(E,$e)},{default:o(()=>s[32]||(s[32]=[L("编辑")])),_:2},1032,["icon","onClick"]),t(ie,{type:"danger",size:"small",onClick:ke=>_(E)},{default:o(()=>s[33]||(s[33]=[L("删除")])),_:2},1032,["onClick"])])]),_:2},1024)]),_:2},1024))),128))])])]),_:1},8,["modelValue"])])],2)}}}),po=Ae(fo,[["__scopeId","data-v-1d6e6f1a"]]),mo={class:"card"},vo={key:0,class:"refresh-notification"},go={class:"log-header"},yo={class:"log-actions"},ho={class:"content-area"},_o={key:0},wo={key:1},$o={key:0,class:"graph-view"},ko={key:0,class:"commit-count"},Co={class:"graph-controls"},bo={class:"zoom-controls"},So={class:"scale-info"},To={key:1},Vo={class:"history-controls"},Lo={class:"history-stats"},Ro={class:"filter-actions"},Do={key:0,class:"filter-panel"},Go={class:"filter-form"},zo={class:"filter-item"},xo={class:"filter-item"},Eo={class:"filter-item"},Bo={class:"filter-actions"},jo=["onClick"],Ao={class:"author-name"},Oo={key:0,class:"branch-container"},Uo={class:"commit-detail-container"},Io={key:0,class:"commit-info"},Fo={class:"commit-info-header"},Po={class:"info-item"},Mo={class:"item-value"},No={class:"info-item"},Ho={class:"item-value"},Wo={class:"info-item"},Jo={class:"item-value"},Yo={class:"commit-message-container"},qo=["innerHTML"],Zo={class:"commit-files-diff"},Xo={class:"files-list"},Ko={key:1},Qo=["onClick"],ea={class:"file-diff"},ta={key:0},sa={key:1},oa=["innerHTML"],Se=.5,Re=1.5,Ie=.1,aa=Ee({__name:"LogList",setup(Z,{expose:v}){const V=He(),w=_e();let u=[];const j=d(u),D=d(""),J=d(!1),te=he(()=>V.isLoadingLog||J.value),M=d(!1),I=d(0),F=d(!1),A=d(null),X=d(!1),Y=d(null),R=d([]),G=d(""),O=d(!1),C=d(""),y=d(1),W=d(!1),H=d(!1),q=d(""),ee=d(""),K=d(null),re=he(()=>{const l=new Set;return j.value.forEach(r=>{r.author&&l.add(r.author)}),Array.from(l).sort()}),fe=he(()=>!q.value&&!ee.value&&!K.value?j.value:j.value.filter(l=>{if(q.value&&l.author!==q.value||ee.value&&!l.message.toLowerCase().includes(ee.value.toLowerCase()))return!1;if(K.value&&K.value.length===2){const r=new Date(l.date),[k,P]=K.value,b=new Date(k),ne=new Date(P);if(b.setHours(0,0,0,0),ne.setHours(23,59,59,999),r<b||r>ne)return!1}return!0}));function se(){q.value="",ee.value="",K.value=null}async function ve(l=!1){if(!_e().isGitRepo){D.value="当前目录不是Git仓库";return}try{M.value=l,J.value=!0;const k=l?"/api/log?all=true&graph=true":"/api/log?graph=true";console.log(`加载日志数据: ${k}`);const b=await(await fetch(k)).json();if(u.length=0,Array.isArray(b))console.log(`日志加载完成: 共${b.length}条记录`),b.forEach(ne=>u.push(ne)),I.value=b.length;else if(b.log&&Array.isArray(b.log))console.log(`日志加载完成: 共${b.log.length}条记录`),b.log.forEach(ne=>u.push(ne)),I.value=b.log.length;else{console.error("未知的日志数据格式:",b),D.value="日志数据格式错误";return}j.value=[...u],console.log(`logsData长度: ${u.length}`),W.value=!0,setTimeout(()=>{W.value=!1},2e3),F.value&&setTimeout(h,0),D.value=""}catch(k){D.value="加载提交历史失败: "+(k instanceof Error?k.message:String(k)),console.error("加载日志失败:",k)}finally{J.value=!1}}async function h(){if(console.log(`开始渲染图表...数据长度: ${u.length}`),!A.value){console.error("图表容器未找到");return}if(u.length===0){console.error("没有日志数据可渲染");return}try{A.value.innerHTML="",console.log(`创建gitgraph实例,分支: ${w.currentBranch||"main"}`);const l=Gt(A.value,{orientation:"vertical-reverse",template:"metro",author:"提交者 <committer@example.com>"}),r={},k=l.branch(w.currentBranch||"main");r[w.currentBranch||"main"]=k,console.log(`开始创建提交图...共${u.length}条提交`),u.forEach((P,b)=>{let ne=k;if(P.branch){const pe=oe(P.branch.split(",")[0]);r[pe]||(r[pe]=l.branch(pe)),ne=r[pe]}ne.commit({hash:P.hash,subject:P.message,author:`${P.author} <${P.email}>`}),b%10===0&&console.log(`已渲染 ${b+1}/${u.length} 个提交`)}),console.log("图表渲染完成"),setTimeout(()=>{z()},100)}catch(l){console.error("渲染图表失败:",l),D.value="渲染图表失败: "+(l instanceof Error?l.message:String(l))}}function g(){F.value=!F.value,F.value&&u.length>0&&setTimeout(h,0)}function N(){ve(!M.value)}function oe(l){return l.includes("HEAD -> ")?l.replace("HEAD -> ",""):l.includes("origin/")?l:l.trim()}function ce(l){return l.includes("HEAD")?"success":l.includes("origin/")?"warning":"info"}Ve(()=>{w.isGitRepo?V.log.length>0?(console.log("使用已加载的日志数据"),u.length=0,V.log.forEach(l=>u.push(l)),I.value=V.log.length,F.value&&setTimeout(()=>{console.log(`准备渲染图表,数据长度: ${u.length}`),h()},100)):(console.log("初始加载日志数据"),ve()):D.value="当前目录不是Git仓库"});const ae=()=>{if(!w.isGitRepo){D.value="当前目录不是Git仓库";return}ve(M.value)};De(()=>V.log,l=>{console.log("监听到gitLogStore.log变化,更新图表数据"),u.length=0,l.forEach(r=>u.push(r)),I.value=l.length;try{j.value=[...u]}catch(r){console.warn("无法更新logs.value:",r)}console.log(`数据更新完成,准备渲染图表(${u.length}条记录)`),F.value&&u.length>0&&setTimeout(h,0)}),v({refreshLog:ae});function S(){y.value<Re&&(y.value=Math.min(Re,y.value+Ie),U())}function a(){y.value>Se&&(y.value=Math.max(Se,y.value-Ie),U())}function U(){if(!A.value)return;const l=A.value.querySelector("svg");l&&(l.style.transform=`scale(${y.value})`,l.style.transformOrigin="top left")}function z(){if(!A.value)return;const l=A.value.querySelector("svg");if(!l)return;const r=l.getBoundingClientRect().width/y.value,k=A.value.clientWidth;r>k?y.value=Math.max(Se,k/r):y.value=1,U()}async function _(l){Y.value=l,X.value=!0,O.value=!0,R.value=[],G.value="",C.value="",console.log("提交详情对象:",JSON.stringify(l,null,2)),console.log("哈希值类型和长度:",typeof l.hash,l.hash?l.hash.length:0),console.log("提交信息类型和长度:",typeof l.message,l.message?l.message.length:0),console.log("提交分支:",l.branch);try{if(console.log(`获取提交详情: ${l.hash}`),!l.hash||l.hash.length<7){console.error("无效的提交哈希值:",l.hash),G.value="无效的提交哈希值",O.value=!1;return}const r=await fetch(`/api/commit-files?hash=${l.hash}`);console.log("API响应状态: ",r.status);const k=await r.json();console.log("文件列表数据: ",k),k.success&&Array.isArray(k.files)?(R.value=k.files,R.value.length>0?await c(l.hash,R.value[0]):(console.log("没有找到变更文件"),G.value="该提交没有变更文件")):(console.error("获取提交文件列表失败:",k.error||"未知错误"),G.value=`获取文件列表失败: ${k.error||"未知错误"}`)}catch(r){console.error("获取提交详情失败:",r),G.value=`获取提交详情失败: ${r.message}`}finally{O.value=!1}}async function c(l,r){O.value=!0,C.value=r;try{console.log(`获取文件差异: hash=${l}, file=${r}`);const k=await fetch(`/api/commit-file-diff?hash=${l}&file=${encodeURIComponent(r)}`);console.log("差异API响应状态: ",k.status);const P=await k.json();console.log("差异数据: ",P.success,typeof P.diff),P.success?G.value=P.diff||"没有变更内容":(console.error("获取差异失败: ",P.error),G.value=`获取差异失败: ${P.error||"未知错误"}`)}catch(k){console.error("获取文件差异失败:",k),G.value=`获取差异失败: ${k.message}`}finally{O.value=!1}}function x(l){if(!l)return"";const r=l.split(`
|
|
10
|
+
`);function k(P){return P.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}return r.map(P=>{const b=k(P);return P.startsWith("diff --git")?`<div class="diff-header">${b}</div>`:P.startsWith("---")?`<div class="diff-old-file">${b}</div>`:P.startsWith("+++")?`<div class="diff-new-file">${b}</div>`:P.startsWith("@@")?`<div class="diff-hunk-header">${b}</div>`:P.startsWith("+")?`<div class="diff-added">${b}</div>`:P.startsWith("-")?`<div class="diff-removed">${b}</div>`:`<div class="diff-context">${b}</div>`}).join("")}function T(l){return l?(console.log("格式化前的提交信息:",l),console.log("提交信息中的换行符数量:",(l.match(/\n/g)||[]).length),l.trim()):"(无提交信息)"}return(l,r)=>{var pe;const k=Pe,P=Fe,b=it,ne=ot;return m(),$("div",mo,[W.value?(m(),$("div",vo," 提交历史已刷新 ")):le("",!0),e("div",go,[r[7]||(r[7]=e("h2",null,"提交历史",-1)),e("div",yo,[t(n(ge),{type:"primary",size:"small",onClick:g},{icon:o(()=>[t(k,null,{default:o(()=>[(m(),Q(Ke(F.value?n(Ge):n($t))))]),_:1})]),default:o(()=>[L(" "+B(F.value?"表格视图":"图表视图"),1)]),_:1}),t(n(ge),{type:"primary",size:"small",onClick:N,loading:te.value},{icon:o(()=>[t(k,null,{default:o(()=>[(m(),Q(Ke(M.value?n(kt):n(Ct))))]),_:1})]),default:o(()=>[L(" "+B(M.value?"显示最近30条":"显示所有提交"),1)]),_:1},8,["loading"]),t(n(ge),{circle:"",size:"small",onClick:r[0]||(r[0]=f=>ae()),loading:te.value,class:Te({"refresh-button-animated":W.value})},{default:o(()=>[t(k,null,{default:o(()=>[t(n(at))]),_:1})]),_:1},8,["loading","class"])])]),e("div",ho,[D.value?(m(),$("div",_o,B(D.value),1)):(m(),$("div",wo,[F.value?(m(),$("div",$o,[n(u).length>0?(m(),$("div",ko," 显示 "+B(n(u).length)+" 条提交记录 "+B(M.value?"(全部)":"(最近30条)"),1)):le("",!0),e("div",Co,[e("div",bo,[t(n(ge),{type:"primary",circle:"",size:"small",onClick:a,disabled:y.value<=Se},{default:o(()=>[t(k,null,{default:o(()=>[t(n(bt))]),_:1})]),_:1},8,["disabled"]),t(n(St),{modelValue:y.value,"onUpdate:modelValue":r[1]||(r[1]=f=>y.value=f),min:Se,max:Re,step:Ie,onChange:U,class:"zoom-slider"},null,8,["modelValue"]),t(n(ge),{type:"primary",circle:"",size:"small",onClick:S,disabled:y.value>=Re},{default:o(()=>[t(k,null,{default:o(()=>[t(n(Tt))]),_:1})]),_:1},8,["disabled"]),t(n(ge),{type:"primary",size:"small",onClick:z},{default:o(()=>r[8]||(r[8]=[L(" 自适应大小 ")])),_:1})]),e("div",So," 缩放: "+B(Math.round(y.value*100))+"% ",1)]),e("div",{ref_key:"graphContainer",ref:A,class:"graph-container"},null,512)])):(m(),$("div",To,[e("div",Vo,[e("div",Lo,[t(n(Le),{type:"info",effect:"plain",size:"large",class:"record-count"},{icon:o(()=>[t(k,null,{default:o(()=>[t(n(Ge))]),_:1})]),default:o(()=>[L(" 显示 "+B(fe.value.length)+"/"+B(j.value.length)+" 条记录 ",1),M.value?(m(),Q(n(Le),{key:1,type:"success",size:"small",effect:"plain",style:{"margin-left":"5px"}},{default:o(()=>r[10]||(r[10]=[L(" 全部 ")])),_:1})):(m(),Q(n(Le),{key:0,type:"warning",size:"small",effect:"plain",style:{"margin-left":"5px"}},{default:o(()=>r[9]||(r[9]=[L(" 最近30条 ")])),_:1}))]),_:1})]),e("div",Ro,[t(n(ge),{type:H.value?"primary":"default",size:"default",onClick:r[2]||(r[2]=f=>H.value=!H.value)},{icon:o(()=>[t(k,null,{default:o(()=>[t(n(Lt))]),_:1})]),default:o(()=>[r[11]||(r[11]=L(" 筛选 ")),fe.value.length!==j.value.length?(m(),Q(n(Vt),{key:0,value:fe.value.length,class:"filter-badge"},null,8,["value"])):le("",!0)]),_:1},8,["type"])])]),H.value?(m(),$("div",Do,[e("div",Go,[e("div",zo,[r[12]||(r[12]=e("div",{class:"filter-label"},"作者:",-1)),t(n(Ne),{modelValue:q.value,"onUpdate:modelValue":r[3]||(r[3]=f=>q.value=f),placeholder:"选择作者",clearable:"",filterable:"",class:"filter-input"},{default:o(()=>[(m(!0),$(de,null,me(re.value,f=>(m(),Q(n(Me),{key:f,label:f,value:f},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])]),e("div",xo,[r[13]||(r[13]=e("div",{class:"filter-label"},"提交信息包含:",-1)),t(n(je),{modelValue:ee.value,"onUpdate:modelValue":r[4]||(r[4]=f=>ee.value=f),placeholder:"关键词",clearable:"",class:"filter-input"},null,8,["modelValue"])]),e("div",Eo,[r[14]||(r[14]=e("div",{class:"filter-label"},"日期范围:",-1)),t(n(Rt),{modelValue:K.value,"onUpdate:modelValue":r[5]||(r[5]=f=>K.value=f),type:"daterange","range-separator":"至","start-placeholder":"开始日期","end-placeholder":"结束日期",format:"YYYY-MM-DD","value-format":"YYYY-MM-DD",class:"filter-input date-range"},null,8,["modelValue"])]),e("div",Bo,[t(n(ge),{type:"info",size:"small",onClick:se},{default:o(()=>r[15]||(r[15]=[L("重置")])),_:1})])])])):le("",!0),ze((m(),Q(n(Dt),{data:fe.value,style:{width:"100%"},stripe:"",border:""},{default:o(()=>[t(n(be),{label:"提交哈希",width:"100",resizable:""},{default:o(f=>[e("span",{class:"commit-hash",onClick:p=>_(f.row)},B(f.row.hash.substring(0,7)),9,jo)]),_:1}),t(n(be),{prop:"date",label:"日期",width:"120",resizable:""}),t(n(be),{label:"作者",width:"120",resizable:""},{default:o(f=>[t(P,{content:f.row.email,placement:"top","hide-after":1e3},{default:o(()=>[e("span",Ao,B(f.row.author),1)]),_:2},1032,["content"])]),_:1}),t(n(be),{label:"分支",width:"180",resizable:""},{default:o(f=>[f.row.branch?(m(),$("div",Oo,[(m(!0),$(de,null,me(f.row.branch.split(","),(p,s)=>(m(),Q(n(Le),{key:s,size:"small",type:ce(p),class:"branch-tag"},{default:o(()=>[L(B(oe(p)),1)]),_:2},1032,["type"]))),128))])):le("",!0)]),_:1}),t(n(be),{prop:"message",label:"提交信息","min-width":"250"})]),_:1},8,["data"])),[[ne,te.value]])]))]))]),t(n(Be),{modelValue:X.value,"onUpdate:modelValue":r[6]||(r[6]=f=>X.value=f),title:`提交详情: ${(pe=Y.value)!=null&&pe.hash?Y.value.hash.substring(0,7):"未知"}`,width:"80%","destroy-on-close":"",class:"commit-detail-dialog"},{default:o(()=>[ze((m(),$("div",Uo,[Y.value?(m(),$("div",Io,[e("div",Fo,[e("div",Po,[r[16]||(r[16]=e("span",{class:"item-label"},"哈希:",-1)),e("span",Mo,B(Y.value.hash),1)]),e("div",No,[r[17]||(r[17]=e("span",{class:"item-label"},"作者:",-1)),e("span",Ho,B(Y.value.author)+" <"+B(Y.value.email)+">",1)]),e("div",Wo,[r[18]||(r[18]=e("span",{class:"item-label"},"日期:",-1)),e("span",Jo,B(Y.value.date),1)])]),e("div",Yo,[r[19]||(r[19]=e("div",{class:"message-label"},"提交信息:",-1)),e("div",{class:"message-content",innerHTML:T(Y.value.message).replace(/\n/g,"<br>")},null,8,qo)])])):le("",!0),e("div",Zo,[e("div",Xo,[r[20]||(r[20]=e("h3",null,"变更文件",-1)),R.value.length===0?(m(),Q(b,{key:0,description:"没有找到变更文件"})):(m(),$("ul",Ko,[(m(!0),$(de,null,me(R.value,f=>(m(),$("li",{key:f,class:Te({"active-file":f===C.value}),onClick:p=>c(Y.value.hash,f)},B(f),11,Qo))),128))]))]),e("div",ea,[C.value?(m(),$("h3",ta,"文件差异: "+B(C.value),1)):(m(),$("h3",sa,"文件差异")),!G.value&&!O.value?(m(),Q(b,{key:2,description:"选择文件查看差异"})):G.value?(m(),$("div",{key:3,innerHTML:x(G.value),class:"diff-content"},null,8,oa)):le("",!0)])])])),[[ne,O.value]])]),_:1},8,["modelValue","title"])])}}}),la=Ae(aa,[["__scopeId","data-v-3e613361"]]),na="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",ia={class:"main-header"},ra={class:"header-left"},ca=["src"],ua={class:"header-info"},da={key:0,id:"user-info"},fa={class:"user-name"},pa={class:"user-email"},ma={key:1,id:"user-info"},va={class:"main-container"},ga={key:0,class:"loading-container"},ya={class:"loading-spinner"},ha={key:1,class:"grid-layout"},_a={class:"git-status-panel"},wa={key:0,class:"commit-form-panel"},$a={key:0,class:"card"},ka={class:"tips"},Ca={key:1,class:"commit-form-panel"},ba={key:2,class:"log-list-panel"},Sa={class:"dialog-footer"},Ta={class:"main-footer"},Va={key:0,class:"branch-info"},La={class:"branch-wrapper"},Ra={class:"dialog-footer"},Da=Ee({__name:"App",setup(Z){const v=d(""),V=d(null),w=d(null),u=_e(),j=d(!1),D=d("");async function J(){try{const a=await(await fetch("/api/config/getConfig")).json();v.value=`默认提交信息: ${a.defaultCommitMessage}`}catch(S){console.error("加载配置失败:",S)}}async function te(){try{const a=await(await fetch("/api/current_directory")).json();return D.value=a.directory||"未知目录",a}catch(S){return console.error("获取当前目录失败:",S),{directory:"未知目录",isGitRepo:!1}}}Ve(async()=>{console.log("---------- 页面初始化开始 ----------");try{const[S,a]=await Promise.all([J(),te()]);u.isGitRepo=a.isGitRepo===!0,u.lastCheckedTime=Date.now(),u.isGitRepo?await Promise.all([u.getCurrentBranch(),u.getAllBranches(),u.getUserInfo()]):i.warning("当前目录不是Git仓库,部分功能将不可用")}catch(S){console.error("初始化失败:",S)}finally{j.value=!0,console.log("---------- 页面初始化完成 ----------"),setTimeout(()=>{ve()},100)}});const M=d(!1),I=d(""),F=d("");async function A(){await u.createBranch(I.value,F.value)&&(M.value=!1,I.value="",w.value&&w.value.refreshStatus(),V.value&&V.value.refreshLog())}function X(){F.value=u.currentBranch,M.value=!0}async function Y(S){await u.changeBranch(S)&&(w.value&&w.value.refreshStatus(),V.value&&V.value.refreshLog())}const R=d(!1),G=d(""),O=d("");function C(){G.value=u.userName,O.value=u.userEmail,R.value=!0}async function y(){if(!G.value||!O.value){i.warning("用户名和邮箱不能为空");return}await u.restoreUserConfig(G.value,O.value)&&(R.value=!1)}async function W(){await u.clearUserConfig()&&(G.value="",O.value="")}let H=!1,q=!1,ee=0,K=0,re="",fe="";function se(){const S=document.querySelector(".grid-layout");if(!S)return;const a=getComputedStyle(S).gridTemplateColumns.split(" "),U=getComputedStyle(S).gridTemplateRows.split(" ");if(a.length>=3&&U.length>=3){const z=parseFloat(a[0]),_=parseFloat(a[2]),c=z+_,x=z/c,T=parseFloat(U[0]),l=parseFloat(U[2]),r=T+l,k=T/r;localStorage.setItem("zen-gitsync-layout-left-ratio",x.toString()),localStorage.setItem("zen-gitsync-layout-top-ratio",k.toString()),console.log(`布局比例已保存 - 左侧: ${(x*100).toFixed(0)}%, 上方: ${(k*100).toFixed(0)}%`)}}function ve(){const S=document.querySelector(".grid-layout");if(!S)return;const a=localStorage.getItem("zen-gitsync-layout-left-ratio"),U=localStorage.getItem("zen-gitsync-layout-top-ratio");if(a){const z=parseFloat(a),_=1-z;S.style.gridTemplateColumns=`${z}fr 8px ${_}fr`,console.log(`已恢复左侧比例: ${(z*100).toFixed(0)}%`)}else S.style.gridTemplateColumns="1fr 8px 3fr";if(U){const z=parseFloat(U),_=1-z;S.style.gridTemplateRows=`${z}fr 8px ${_}fr`,console.log(`已恢复上方比例: ${(z*100).toFixed(0)}%`)}}function h(S){var U;H=!0,ee=S.clientX;const a=document.querySelector(".grid-layout");re=getComputedStyle(a).gridTemplateColumns,(U=document.getElementById("v-resizer"))==null||U.classList.add("active"),document.addEventListener("mousemove",g),document.addEventListener("mouseup",N),S.preventDefault()}function g(S){if(!H)return;const a=document.querySelector(".grid-layout"),U=S.clientX-ee,z=re.split(" ");if(z.length>=3){const _=parseFloat(z[0]),c=parseFloat(z[2]),x=_+c,T=(_+U/a.clientWidth*x)/x,l=1-T,r=.1,k=.5;T<r?a.style.gridTemplateColumns=`${r}fr 8px ${1-r}fr`:T>k?a.style.gridTemplateColumns=`${k}fr 8px ${1-k}fr`:a.style.gridTemplateColumns=`${T}fr 8px ${l}fr`}}function N(){var S;H=!1,(S=document.getElementById("v-resizer"))==null||S.classList.remove("active"),document.removeEventListener("mousemove",g),document.removeEventListener("mouseup",N),se()}function oe(S){var U;q=!0,K=S.clientY;const a=document.querySelector(".grid-layout");fe=getComputedStyle(a).gridTemplateRows,(U=document.getElementById("h-resizer"))==null||U.classList.add("active"),document.addEventListener("mousemove",ce),document.addEventListener("mouseup",ae),S.preventDefault()}function ce(S){if(!q)return;const a=document.querySelector(".grid-layout"),U=S.clientY-K,z=fe.split(" ");if(z.length>=3){const _=parseFloat(z[0]),c=parseFloat(z[2]),x=_+c,T=(_+U/a.clientHeight*x)/x,l=1-T,r=.2,k=.8;T<r?a.style.gridTemplateRows=`${r}fr 8px ${1-r}fr`:T>k?a.style.gridTemplateRows=`${k}fr 8px ${1-k}fr`:a.style.gridTemplateRows=`${T}fr 8px ${l}fr`}}function ae(){var S;q=!1,(S=document.getElementById("h-resizer"))==null||S.classList.remove("active"),document.removeEventListener("mousemove",ce),document.removeEventListener("mouseup",ae),se()}return(S,a)=>{const U=Pe,z=ge,_=rt,c=je,x=st,T=Me,l=Ne,r=tt,k=Be,P=nt;return m(),$(de,null,[e("header",ia,[e("div",ra,[e("img",{src:n(na),alt:"Zen GitSync Logo",class:"logo"},null,8,ca),a[9]||(a[9]=e("h1",null,"Zen GitSync UI",-1))]),e("div",ua,[n(u).userName&&n(u).userEmail?(m(),$("div",da,[a[10]||(a[10]=e("span",{class:"user-label"},"用户:",-1)),e("span",fa,B(n(u).userName),1),e("span",pa,"<"+B(n(u).userEmail)+">",1),t(z,{type:"primary",size:"small",onClick:C,class:"user-settings-btn",circle:""},{default:o(()=>[t(U,null,{default:o(()=>[t(n(xe))]),_:1})]),_:1})])):(m(),$("div",ma,[a[11]||(a[11]=e("span",{class:"user-label"},"用户: ",-1)),a[12]||(a[12]=e("span",{class:"user-warning"},"未配置",-1)),t(z,{type:"primary",size:"small",onClick:C,class:"user-settings-btn",circle:""},{default:o(()=>[t(U,null,{default:o(()=>[t(n(xe))]),_:1})]),_:1})]))])]),e("main",va,[j.value?(m(),$("div",ha,[e("div",_a,[t(Ls,{ref_key:"gitStatusRef",ref:w,"initial-directory":D.value},null,8,["initial-directory"])]),e("div",{class:"vertical-resizer",id:"v-resizer",onMousedown:h},null,32),n(u).isGitRepo?(m(),$("div",wa,[!n(u).userName||!n(u).userEmail?(m(),$("div",$a,[a[18]||(a[18]=e("h2",null,"Git用户未配置",-1)),a[19]||(a[19]=e("p",null,"请先配置Git用户信息才能进行提交操作。",-1)),e("div",ka,[a[16]||(a[16]=e("h3",null,"您可以通过以下方式配置:",-1)),a[17]||(a[17]=e("ol",null,[e("li",null,"点击右上角的设置按钮,配置用户名和邮箱"),e("li",null,"或者使用命令行配置:"),e("div",{class:"code-block"},[L(' git config --global user.name "您的用户名"'),e("br"),L(' git config --global user.email "您的邮箱" ')])],-1)),t(z,{type:"primary",onClick:C},{default:o(()=>a[15]||(a[15]=[L(" 立即配置 ")])),_:1})])])):(m(),Q(po,{key:1}))])):(m(),$("div",Ca,a[20]||(a[20]=[e("div",{class:"card"},[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:oe},null,32),n(u).isGitRepo?(m(),$("div",ba,[t(la,{ref_key:"logListRef",ref:V},null,512)])):le("",!0),t(k,{modelValue:M.value,"onUpdate:modelValue":a[3]||(a[3]=b=>M.value=b),title:"创建新分支",width:"30%","destroy-on-close":""},{footer:o(()=>[e("span",Sa,[t(z,{onClick:a[2]||(a[2]=b=>M.value=!1)},{default:o(()=>a[21]||(a[21]=[L("取消")])),_:1}),t(z,{type:"primary",onClick:A,loading:n(u).isCreatingBranch},{default:o(()=>a[22]||(a[22]=[L(" 创建 ")])),_:1},8,["loading"])])]),default:o(()=>[t(r,{model:{newBranchName:I.value,selectedBaseBranch:F.value}},{default:o(()=>[t(x,{label:"新分支名称"},{default:o(()=>[t(c,{modelValue:I.value,"onUpdate:modelValue":a[0]||(a[0]=b=>I.value=b),placeholder:"请输入新分支名称"},null,8,["modelValue"])]),_:1}),t(x,{label:"基于分支"},{default:o(()=>[t(l,{modelValue:F.value,"onUpdate:modelValue":a[1]||(a[1]=b=>F.value=b),placeholder:"选择基础分支",style:{width:"100%"}},{default:o(()=>[(m(!0),$(de,null,me(n(u).allBranches,b=>(m(),Q(T,{key:b,label:b,value:b},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])]),_:1})]),_:1},8,["model"])]),_:1},8,["modelValue"])])):(m(),$("div",ga,[t(_,{class:"loading-card"},{default:o(()=>[e("div",ya,[t(U,{class:"is-loading"},{default:o(()=>a[13]||(a[13]=[e("svg",{viewBox:"0 0 1024 1024",xmlns:"http://www.w3.org/2000/svg"},[e("path",{fill:"currentColor",d:"M512 64a32 32 0 0 1 32 32v192a32 32 0 0 1-64 0V96a32 32 0 0 1 32-32zm0 640a32 32 0 0 1 32 32v192a32 32 0 1 1-64 0V736a32 32 0 0 1 32-32zm448-192a32 32 0 0 1-32 32H736a32 32 0 1 1 0-64h192a32 32 0 0 1 32 32zm-640 0a32 32 0 0 1-32 32H96a32 32 0 0 1 0-64h192a32 32 0 0 1 32 32zM195.2 195.2a32 32 0 0 1 45.248 0L376.32 331.008a32 32 0 0 1-45.248 45.248L195.2 240.448a32 32 0 0 1 0-45.248zm452.544 452.544a32 32 0 0 1 45.248 0L828.8 783.552a32 32 0 0 1-45.248 45.248L647.744 692.992a32 32 0 0 1 0-45.248zM828.8 195.264a32 32 0 0 1 0 45.184L692.992 376.32a32 32 0 0 1-45.248-45.248l135.808-135.808a32 32 0 0 1 45.248 0zm-452.544 452.48a32 32 0 0 1 0 45.248L240.448 828.8a32 32 0 0 1-45.248-45.248l135.808-135.808a32 32 0 0 1 45.248 0z"})],-1)])),_:1})]),a[14]||(a[14]=e("div",{class:"loading-text"},"加载中...",-1))]),_:1})]))]),e("footer",Ta,[n(u).currentBranch?(m(),$("div",Va,[e("div",La,[a[24]||(a[24]=e("span",{class:"branch-label"},"当前分支:",-1)),t(l,{modelValue:n(u).currentBranch,"onUpdate:modelValue":a[4]||(a[4]=b=>n(u).currentBranch=b),size:"small",onChange:Y,loading:n(u).isChangingBranch,class:"branch-select"},{default:o(()=>[(m(!0),$(de,null,me(n(u).allBranches,b=>(m(),Q(T,{key:b,label:b,value:b},null,8,["label","value"]))),128))]),_:1},8,["modelValue","loading"]),t(z,{type:"primary",size:"small",onClick:X,class:"create-branch-btn"},{default:o(()=>[t(U,null,{default:o(()=>[t(n(zt))]),_:1}),a[23]||(a[23]=L(" 新建分支 "))]),_:1})])])):le("",!0),a[25]||(a[25]=e("div",{class:"footer-right"},null,-1))]),t(k,{modelValue:R.value,"onUpdate:modelValue":a[8]||(a[8]=b=>R.value=b),title:"Git用户设置",width:"30%","destroy-on-close":""},{footer:o(()=>[e("span",Ra,[t(z,{type:"danger",onClick:W},{default:o(()=>a[27]||(a[27]=[L(" 清除配置 ")])),_:1}),t(z,{onClick:a[7]||(a[7]=b=>R.value=!1)},{default:o(()=>a[28]||(a[28]=[L("取消")])),_:1}),t(z,{type:"primary",onClick:y},{default:o(()=>a[29]||(a[29]=[L(" 保存 ")])),_:1})])]),default:o(()=>[t(r,null,{default:o(()=>[t(x,{label:"用户名"},{default:o(()=>[t(c,{modelValue:G.value,"onUpdate:modelValue":a[5]||(a[5]=b=>G.value=b),placeholder:"请输入Git用户名"},null,8,["modelValue"])]),_:1}),t(x,{label:"邮箱"},{default:o(()=>[t(c,{modelValue:O.value,"onUpdate:modelValue":a[6]||(a[6]=b=>O.value=b),placeholder:"请输入Git邮箱"},null,8,["modelValue"])]),_:1}),t(x,null,{default:o(()=>[t(P,{type:"info",closable:!1,"show-icon":""},{default:o(()=>a[26]||(a[26]=[L(" 这些设置将影响全局Git配置,对所有Git仓库生效。 ")])),_:1})]),_:1})]),_:1})]),_:1},8,["modelValue"])],64)}}}),Ga=Ae(Da,[["__scopeId","data-v-8ba54a98"]]),ct=xt(Ga);ct.use(Et());ct.mount("#app");
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.card[data-v-eb92d5f0]{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}.status-header[data-v-eb92d5f0]{display:flex;justify-content:space-between;align-items:center;padding:8px 16px;border-bottom:1px solid #f0f0f0;height:36px}.status-header h2[data-v-eb92d5f0]{margin:0;font-size:16px;font-weight:500;color:#303133}.header-actions[data-v-eb92d5f0]{display:flex;align-items:center}.card-content[data-v-eb92d5f0]{padding:15px;overflow-y:auto;flex:1;display:flex;flex-direction:column}.current-directory[data-v-eb92d5f0]{display:flex;align-items:center;margin-bottom:16px;padding:10px;background-color:#f8f9fa;border-radius:6px;font-family:monospace;border:1px solid #f0f0f0}.current-directory .el-icon[data-v-eb92d5f0]{margin-right:8px;color:#409eff}.current-directory span[data-v-eb92d5f0]{flex-grow:1;word-break:break-all;margin-right:10px}.status-box[data-v-eb92d5f0]{white-space:pre-wrap;font-family:monospace;background-color:#f8f9fa;padding:16px;border-radius:6px;margin-bottom:20px;max-height:200px;overflow-y:auto;border:1px solid #f0f0f0;font-size:14px;line-height:1.5}.file-list-container[data-v-eb92d5f0]{flex:1;overflow:hidden;display:flex;flex-direction:column;margin-bottom:0;gap:12px;height:calc(100% - 70px)}.file-group[data-v-eb92d5f0]{background-color:#f8f9fa;border-radius:6px;overflow:hidden;border:1px solid #ebeef5;margin-bottom:12px;display:flex;flex-direction:column}.file-group[data-v-eb92d5f0]{flex:0 1 auto}.file-group[data-v-eb92d5f0]:last-child{margin-bottom:0;flex:1 1 auto}.file-group-header[data-v-eb92d5f0]{font-size:14px;font-weight:700;padding:8px 12px;background-color:#f0f2f5;color:#606266;border-bottom:1px solid #ebeef5;flex-shrink:0}.file-list[data-v-eb92d5f0]{overflow-y:auto;min-height:40px;flex-grow:1;padding:0;margin:0;scrollbar-width:thin;scrollbar-color:rgba(144,147,153,.3) transparent}.file-list[data-v-eb92d5f0]::-webkit-scrollbar{width:6px;height:6px}.file-list[data-v-eb92d5f0]::-webkit-scrollbar-thumb{background-color:#9093994d;border-radius:4px}.file-list[data-v-eb92d5f0]::-webkit-scrollbar-thumb:hover{background-color:#90939980}.file-list[data-v-eb92d5f0]::-webkit-scrollbar-track{background-color:transparent}.file-list[data-v-eb92d5f0]:empty{display:none}.file-list[data-v-eb92d5f0]:has(.empty-file-group){overflow-y:hidden}.empty-file-container[data-v-eb92d5f0]{overflow-y:hidden!important;display:flex;flex-direction:column;align-items:stretch;flex:1}.empty-file-group[data-v-eb92d5f0]{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-group[data-v-eb92d5f0]:nth-child(1){flex:0 1 auto}.file-group[data-v-eb92d5f0]:nth-child(2){flex:0 1 auto}.file-group[data-v-eb92d5f0]:nth-child(3){flex:1 1 auto}.file-item[data-v-eb92d5f0]{padding:8px 12px;display:flex;align-items:center;justify-content:space-between;border-bottom:1px solid #ebeef5;cursor:pointer;transition:background-color .2s}.file-item[data-v-eb92d5f0]:last-child{border-bottom:none}.file-item[data-v-eb92d5f0]:hover{background-color:#ecf5ff}.file-info[data-v-eb92d5f0]{display:flex;align-items:center;flex-grow:1;overflow:hidden;white-space:nowrap;gap:8px}.file-status-indicator[data-v-eb92d5f0]{width:6px;height:6px;border-radius:50%;background-color:#409eff;flex-shrink:0}.file-status-indicator.added[data-v-eb92d5f0]{background-color:#67c23a}.file-status-indicator.modified[data-v-eb92d5f0]{background-color:#409eff}.file-status-indicator.deleted[data-v-eb92d5f0]{background-color:#f56c6c}.file-status-indicator.untracked[data-v-eb92d5f0]{background-color:#e6a23c}.file-path-container[data-v-eb92d5f0]{display:flex;flex-direction:column;overflow:hidden}.file-name[data-v-eb92d5f0]{font-weight:500;color:#303133;overflow:hidden;text-overflow:ellipsis;line-height:1.2}.file-directory[data-v-eb92d5f0]{font-size:12px;color:#909399;overflow:hidden;text-overflow:ellipsis;line-height:1.2}.file-actions[data-v-eb92d5f0]{display:flex;gap:5px;opacity:0;transition:opacity .2s}.file-item:hover .file-actions[data-v-eb92d5f0]{opacity:1}.empty-status[data-v-eb92d5f0]{display:flex;flex-direction:column;align-items:center;justify-content:center;height:calc(100% - 70px);background-color:#f8f9fa;border-radius:6px;border:1px solid #ebeef5;margin-top:15px}.empty-icon[data-v-eb92d5f0]{font-size:32px;color:#c0c4cc;margin-bottom:10px}.empty-text[data-v-eb92d5f0]{color:#909399;font-size:14px}.card-content[data-v-eb92d5f0]:empty{display:flex;align-items:center;justify-content:center;background-color:#f8f9fa;border-radius:6px;border:1px dashed #dcdfe6;color:#909399;height:100%}.card-content[data-v-eb92d5f0]:empty:after{content:"没有Git状态信息可显示";font-size:14px}.browser-current-path[data-v-eb92d5f0]{font-family:monospace;margin-bottom:15px;padding:10px;background-color:#f5f7fa;border-radius:6px;overflow-x:auto;white-space:nowrap;border:1px solid #ebeef5}.browser-error[data-v-eb92d5f0]{color:#f56c6c;margin:10px 0;padding:10px;background-color:#fef0f0;border-radius:4px;border-left:3px solid #f56c6c}.browser-nav[data-v-eb92d5f0]{display:flex;gap:10px;margin-bottom:10px}.no-padding-left[data-v-eb92d5f0]{padding-left:12px}.directory-browser[data-v-eb92d5f0]{height:400px;border:1px solid #ebeef5;border-radius:6px;overflow:hidden;display:flex;flex-direction:column}.directory-items-container[data-v-eb92d5f0]{flex:1;overflow-y:auto;background-color:#f8f9fa;padding:10px}.directory-items[data-v-eb92d5f0]{list-style:none;padding:0;margin:0;display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:10px}.directory-item[data-v-eb92d5f0]{display:flex;align-items:center;padding:8px;cursor:pointer;border-radius:4px;background-color:#fff;border:1px solid #ebeef5;transition:all .2s;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;gap:5px}.directory-item[data-v-eb92d5f0]:hover{background-color:#ecf5ff;border-color:#c6e2ff}.directory-item.directory[data-v-eb92d5f0]{background-color:#f0f7ff;color:#409eff}.directory-item .el-icon[data-v-eb92d5f0]{margin-right:5px;flex-shrink:0}.directory-item.directory .el-icon[data-v-eb92d5f0]{color:#409eff}.directory-item.file .el-icon[data-v-eb92d5f0]{color:#909399}.directory-buttons[data-v-eb92d5f0]{display:flex;gap:10px;margin-top:10px}.diff-header{font-weight:700;background-color:#e6f1fc;padding:5px;margin:8px 0;border-radius:4px;color:#0366d6;border-bottom:1px solid #c8e1ff}.diff-old-file,.diff-new-file{color:#586069;padding:2px 5px;font-family:monospace}.diff-old-file{color:#cb2431}.diff-new-file{color:#22863a}.diff-hunk-header{color:#6f42c1;background-color:#f1f8ff;padding:2px 5px;margin:5px 0;border-radius:3px;font-family:monospace}.diff-added{background-color:#e6ffed;color:#22863a;padding:0 5px;border-left:4px solid #22863a;font-family:monospace;display:block;margin:2px 0}.diff-removed{background-color:#ffeef0;color:#cb2431;padding:0 5px;border-left:4px solid #cb2431;font-family:monospace;display:block;margin:2px 0}.diff-context{color:#444;padding:0 5px;font-family:monospace;display:block;margin:2px 0;background-color:#fafbfc}.auto-update-switch .el-switch__core{transition:all .3s ease-in-out;box-shadow:0 2px 5px #0000001a}.auto-update-switch .el-switch__core:hover{box-shadow:0 2px 8px #0003}.auto-update-switch.is-checked .el-switch__core{box-shadow:0 2px 5px #67c23a4d}.auto-update-switch.is-checked .el-switch__core:hover{box-shadow:0 2px 8px #67c23a80}@keyframes snakeBorder-1d6e6f1a{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-1d6e6f1a{0%,to{box-shadow:0 0 8px #409eff66}50%{box-shadow:0 0 12px #67c23a80}}.card[data-v-1d6e6f1a]{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}.card-header[data-v-1d6e6f1a]{padding:8px 16px;border-bottom:1px solid #f0f0f0;display:flex;justify-content:space-between;align-items:center;height:36px}.card-header h2[data-v-1d6e6f1a]{margin:0;font-size:16px;font-weight:500;color:#303133}.card-content[data-v-1d6e6f1a]{padding:15px;overflow-y:auto;flex:1}.layout-container[data-v-1d6e6f1a]{display:flex;gap:20px;height:100%}.commit-section[data-v-1d6e6f1a]{flex:1;min-width:0}.actions-section[data-v-1d6e6f1a]{width:300px;flex-shrink:0}.actions-section h3[data-v-1d6e6f1a]{margin-top:0;margin-bottom:15px;padding-bottom:10px;border-bottom:1px solid #dcdfe6;font-size:18px;color:#303133;font-weight:500}.commit-form[data-v-1d6e6f1a]{display:flex;margin-bottom:15px;gap:10px}.git-actions[data-v-1d6e6f1a]{margin-top:20px}.action-groups[data-v-1d6e6f1a]{display:flex;flex-direction:column;gap:15px}.action-group[data-v-1d6e6f1a]{background-color:#f9f9f9;border-radius:8px;padding:12px 15px;box-shadow:0 1px 3px #0000000d;border-left:4px solid #409EFF;overflow:hidden}.action-group[data-v-1d6e6f1a]:nth-child(2){border-left-color:#e6a23c}.action-group[data-v-1d6e6f1a]:nth-child(3){border-left-color:#909399}.group-title[data-v-1d6e6f1a]{font-size:14px;font-weight:700;margin-bottom:10px;color:#606266;text-align:left;display:block;position:relative;padding-left:10px;border-bottom:1px solid rgba(0,0,0,.06);padding-bottom:8px}.group-buttons[data-v-1d6e6f1a]{display:flex;flex-direction:column;gap:8px;padding:0 2px}.action-button[data-v-1d6e6f1a]{position:relative;padding:14px 0 24px;width:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;height:auto;text-align:center;font-size:16px;border-radius:6px;border:none}.action-button[data-v-1d6e6f1a]:hover{transform:translateY(-2px);box-shadow:0 2px 8px #00000026}.action-button[data-v-1d6e6f1a]:active{transform:translateY(0)}.action-button[data-v-1d6e6f1a] .el-button__content{display:flex;flex-direction:column;align-items:center;justify-content:center;width:100%;min-height:40px}.action-button[data-v-1d6e6f1a] .el-icon{margin-right:0;margin-bottom:4px;font-size:18px}.action-button[data-v-1d6e6f1a] .el-icon.is-loading{position:absolute;top:calc(50% - 10px);left:16px;margin-top:0}.command-text[data-v-1d6e6f1a]{position:absolute;bottom:6px;font-size:14px;font-family:monospace;width:100%;text-align:center;left:0;white-space:nowrap}.standard-commit-form[data-v-1d6e6f1a]{display:flex;flex-direction:column;gap:15px;margin-bottom:15px}.standard-commit-header[data-v-1d6e6f1a]{display:flex;flex-direction:column;gap:10px;width:100%}.type-select[data-v-1d6e6f1a]{width:100%}.scope-container[data-v-1d6e6f1a]{display:flex;align-items:center;gap:5px;width:100%}.scope-input[data-v-1d6e6f1a]{flex-grow:1}.description-container[data-v-1d6e6f1a]{display:flex;align-items:center;gap:5px;width:100%}.description-input[data-v-1d6e6f1a]{flex-grow:1}.settings-button[data-v-1d6e6f1a]{flex-shrink:0}.preview-section[data-v-1d6e6f1a]{background-color:#f5f7fa;padding:10px;border-radius:4px}.preview-title[data-v-1d6e6f1a]{font-weight:700;margin-bottom:5px}.preview-content[data-v-1d6e6f1a]{white-space:pre-wrap;font-family:monospace;margin:0;padding:10px;background-color:#ebeef5;border-radius:4px}.template-container[data-v-1d6e6f1a]{display:flex;flex-direction:column;height:calc(85vh - 100px);overflow-y:auto}.template-form[data-v-1d6e6f1a]{margin-bottom:20px}.template-list[data-v-1d6e6f1a]{flex:1;overflow-y:auto}.template-input[data-v-1d6e6f1a]{flex-grow:1}.template-list[data-v-1d6e6f1a]{overflow-y:auto;height:100%}.template-item[data-v-1d6e6f1a]{margin-bottom:10px}.template-item[data-v-1d6e6f1a]:hover{background-color:#f5f7fa}.template-content[data-v-1d6e6f1a]{flex-grow:1;margin-right:10px;word-break:break-all}.template-actions[data-v-1d6e6f1a]{display:flex;gap:5px;justify-content:flex-end;min-width:120px;flex-shrink:0}.options-row[data-v-1d6e6f1a]{display:flex;justify-content:space-between;align-items:center;margin-bottom:15px}.code-command[data-v-1d6e6f1a]{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 (max-width: 768px){.layout-container[data-v-1d6e6f1a]{flex-direction:column}.actions-section[data-v-1d6e6f1a]{width:100%}.group-buttons[data-v-1d6e6f1a]{flex-direction:row;flex-wrap:wrap}.action-button[data-v-1d6e6f1a]{flex:1;min-width:120px}}.git-config-warning[data-v-1d6e6f1a]{width:100%}.config-command[data-v-1d6e6f1a]{background-color:#2d2d2d;color:#f8f8f2;font-family:Courier New,Courier,monospace;padding:10px;border-radius:4px;margin-top:10px;white-space:pre}.push-button[data-v-1d6e6f1a]{background-color:#67c23a;border-color:#67c23a}.push-button[data-v-1d6e6f1a]:hover{background-color:#85ce61;border-color:#85ce61}.reset-button[data-v-1d6e6f1a]{background-color:#909399;border-color:#909399}.reset-button[data-v-1d6e6f1a]:hover{background-color:#a6a9ad;border-color:#a6a9ad}.el-button+.el-button[data-v-1d6e6f1a]{margin-left:0}.card[data-v-3e613361]{background-color:#fff;border-radius:8px;box-shadow:0 2px 10px #00000008;height:100%;width:100%;display:flex;flex-direction:column;border:1px solid rgba(0,0,0,.03);overflow:hidden}.log-header[data-v-3e613361]{display:flex;justify-content:space-between;align-items:center;margin-bottom:0;padding:8px 16px;background-color:#fff;border-bottom:1px solid #f0f0f0;position:sticky;top:0;z-index:100;height:36px}.log-header h2[data-v-3e613361]{margin:0;font-size:16px;font-weight:500}.log-actions[data-v-3e613361]{display:flex;gap:8px}.content-area[data-v-3e613361]{padding:0 20px 20px;overflow-y:auto;flex:1;min-height:100px;height:calc(100% - 52px)}.el-table[data-v-3e613361]{--el-table-border-color: #f0f0f0;--el-table-header-bg-color: #f8f9fa;border-radius:4px;overflow:hidden}.log-actions[data-v-3e613361]{display:flex;gap:12px}.branch-container[data-v-3e613361]{display:flex;flex-wrap:wrap;gap:4px}.branch-tag[data-v-3e613361]{margin-right:4px}.commit-count[data-v-3e613361]{margin-bottom:10px;font-size:14px;color:#606266;text-align:right}.graph-container[data-v-3e613361]{width:100%;height:600px;overflow:auto;border:1px solid #ebeef5;border-radius:4px;padding:10px;background-color:#fff;position:relative}.graph-container svg[data-v-3e613361]{transform-origin:top left;transition:transform .2s ease}.graph-view[data-v-3e613361]{width:100%}.graph-controls[data-v-3e613361]{display:flex;justify-content:space-between;align-items:center;margin-bottom:10px}.zoom-controls[data-v-3e613361]{display:flex;gap:8px}.zoom-slider[data-v-3e613361]{width:200px}.scale-info[data-v-3e613361]{font-size:14px;color:#606266}.refresh-button-animated[data-v-3e613361]{animation:pulse-3e613361 1s}.refresh-notification[data-v-3e613361]{background-color:#f0f9eb;color:#67c23a;padding:10px 15px;border-radius:8px;font-size:14px;border-left:4px solid #67c23a;animation:fadeOut-3e613361 2s forwards;position:fixed;top:20px;right:20px;z-index:9999;box-shadow:0 4px 12px #0000001a;max-width:300px;text-align:center}@keyframes pulse-3e613361{0%{transform:scale(1)}50%{transform:scale(1.2)}to{transform:scale(1)}}@keyframes fadeOut-3e613361{0%{opacity:0;transform:translateY(-20px)}20%{opacity:1;transform:translateY(0)}80%{opacity:1}to{opacity:0}}.author-name[data-v-3e613361]{cursor:pointer;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:inline-block;max-width:100%}.commit-hash[data-v-3e613361]{cursor:pointer;color:#409eff;font-family:monospace}.commit-hash[data-v-3e613361]:hover{text-decoration:underline}.commit-detail-container[data-v-3e613361]{display:flex;flex-direction:column;gap:20px}.commit-info[data-v-3e613361]{padding:12px;background-color:#f5f7fa;border-radius:8px;font-size:14px;display:flex;flex-direction:column;gap:12px}.commit-info-header[data-v-3e613361]{display:flex;flex-wrap:wrap;gap:15px;align-items:center;background-color:#fff;padding:10px;border-radius:4px;border:1px solid #e4e7ed}.info-item[data-v-3e613361]{display:flex;align-items:center;gap:5px}.item-label[data-v-3e613361]{font-weight:700;color:#606266;white-space:nowrap}.item-value[data-v-3e613361]{color:#333;word-break:break-all}.commit-message-container[data-v-3e613361]{display:flex;flex-direction:column;gap:5px}.message-label[data-v-3e613361]{font-weight:700;color:#606266}.message-content[data-v-3e613361]{background-color:#fff;padding:12px;border-radius:4px;font-family:monospace;white-space:pre-wrap;line-height:1.5;border:1px solid #e4e7ed;border-left:4px solid #409EFF}.commit-files-diff[data-v-3e613361]{margin-top:5px;display:flex;gap:20px;height:60vh}.files-list[data-v-3e613361]{width:25%;overflow-y:auto;background-color:#f5f7fa;border-radius:8px;padding:10px}.files-list h3[data-v-3e613361]{margin-top:0;padding-bottom:10px;border-bottom:1px solid #dcdfe6;font-size:16px}.files-list ul[data-v-3e613361]{list-style:none;padding:0;margin:0}.files-list li[data-v-3e613361]{padding:8px 10px;cursor:pointer;border-radius:4px;margin-bottom:5px;font-family:monospace;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:13px}.files-list li[data-v-3e613361]:hover{background-color:#ecf5ff}.files-list li.active-file[data-v-3e613361]{background-color:#409eff;color:#fff}.file-diff[data-v-3e613361]{flex:1;display:flex;flex-direction:column;background-color:#f5f7fa;border-radius:8px;padding:10px;overflow:hidden}.file-diff h3[data-v-3e613361]{margin-top:0;padding-bottom:10px;border-bottom:1px solid #dcdfe6;font-size:16px}.diff-content[data-v-3e613361]{flex:1;overflow-y:auto;background-color:#fff;padding:10px;border-radius:4px;font-family:monospace;font-size:13px;line-height:1.5}.diff-header[data-v-3e613361]{font-weight:700;color:#409eff}.diff-old-file[data-v-3e613361]{color:#e6a23c}.diff-new-file[data-v-3e613361]{color:#67c23a}.diff-hunk-header[data-v-3e613361]{font-weight:700;color:#409eff}.diff-added[data-v-3e613361]{background-color:#f0f9eb;color:#67c23a}.diff-removed[data-v-3e613361]{background-color:#fef2f2;color:#f56c6c}.diff-context[data-v-3e613361]{background-color:#f5f7fa}[data-v-3e613361] .commit-detail-dialog{--el-dialog-margin-top: 5vh}.history-controls[data-v-3e613361]{display:flex;justify-content:space-between;align-items:center;margin-bottom:15px;padding:0}.history-stats[data-v-3e613361]{display:flex;align-items:center}.record-count[data-v-3e613361]{display:flex;align-items:center;height:36px;padding-left:15px;padding-right:15px}.record-count[data-v-3e613361] .el-icon{margin-right:6px}.filter-badge[data-v-3e613361] .el-badge__content{background-color:#409eff}.filter-panel[data-v-3e613361]{background-color:#f5f7fa;border-radius:8px;padding:15px;margin-bottom:15px;border:1px solid #e4e7ed;box-shadow:0 2px 12px #0000000d}.filter-form[data-v-3e613361]{display:flex;flex-wrap:wrap;gap:15px;align-items:flex-end}.filter-item[data-v-3e613361]{display:flex;flex-direction:column;gap:5px}.filter-label[data-v-3e613361]{font-size:13px;color:#606266;font-weight:700}.filter-input[data-v-3e613361]{width:200px}.filter-input.date-range[data-v-3e613361]{width:350px}.filter-actions[data-v-3e613361]{display:flex;align-items:center;gap:10px}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:1fr 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:15px 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}.logo{height:32px;width:auto}h1{margin:0;font-size:24px}.header-info{display:flex;flex-direction:column;align-items:flex-end;gap:5px}#branch-info,#user-info{background-color:#ffffff1a;padding:4px 8px;border-radius:4px;font-size:14px}.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-8ba54a98]{will-change:filter;transition:filter .3s}.logo[data-v-8ba54a98]:hover{filter:drop-shadow(0 0 2em #42b883aa)}.branch-info[data-v-8ba54a98]{display:flex;align-items:center;gap:10px}.branch-wrapper[data-v-8ba54a98]{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-8ba54a98]:hover{background-color:#fff3}.branch-label[data-v-8ba54a98]{font-weight:700;margin-right:10px;color:#fff}.branch-select[data-v-8ba54a98]{width:200px;margin-right:10px}.create-branch-btn[data-v-8ba54a98]{background-color:#2ea44f;border-color:#2ea44f;transition:all .3s;box-shadow:0 2px 4px #0003}.create-branch-btn[data-v-8ba54a98]:hover{background-color:#3bbc63;border-color:#3bbc63;transform:translateY(-2px);box-shadow:0 4px 8px #0003}.footer-right[data-v-8ba54a98]{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}.vertical-resizer[data-v-8ba54a98]{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-8ba54a98]: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-8ba54a98]:hover,.vertical-resizer.active[data-v-8ba54a98]{background-color:#d0d0d0;box-shadow:0 0 5px #0003}.vertical-resizer[data-v-8ba54a98]:hover:after,.vertical-resizer.active[data-v-8ba54a98]:after{background-color:#409eff;width:6px;box-shadow:0 0 8px #409eff99}.horizontal-resizer[data-v-8ba54a98]{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-8ba54a98]: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-8ba54a98]:hover,.horizontal-resizer.active[data-v-8ba54a98]{background-color:#d0d0d0;box-shadow:0 0 5px #0003}.horizontal-resizer[data-v-8ba54a98]:hover:after,.horizontal-resizer.active[data-v-8ba54a98]:after{background-color:#409eff;height:6px;box-shadow:0 0 8px #409eff99}
|