zen-gitsync 2.3.8 → 2.3.10
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 +148 -148
- package/package.json +1 -1
- package/src/ui/public/assets/{index-DEKdNhAa.js → index-BpFLzI_f.js} +6 -6
- package/src/ui/public/assets/index-DgUAXo_K.css +1 -0
- package/src/ui/public/assets/vendor-BLnrYq3C.css +1 -0
- package/src/ui/public/assets/vendor-CdN1pgJ5.js +45 -0
- package/src/ui/public/index.html +16 -16
- package/src/ui/server/index.js +3 -2
- package/src/ui/public/assets/index-Oqn6mvQ7.css +0 -1
- package/src/ui/public/assets/vendor-DcgxOoGO.js +0 -45
- package/src/ui/public/assets/vendor-Dp0FkvMe.css +0 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import{d as ws,r as f,c as E,E as n,o as ht,a as bs,l as no,b as ze,w as Re,e as b,f as c,n as yt,g as U,h as e,t as M,i as t,u as a,j as io,k as s,m as G,p as Lt,F as Ce,q as Ge,s as pe,v as Me,x as $e,y as ro,z as tt,A as Nt,B as xt,C as co,D as ut,G as D,H as as,I as at,J as Ht,K as Bt,L as Vt,M as ks,N as ls,O as ns,P as $s,Q as ft,R as ss,S as vt,T as uo,U as is,V as Pt,W as Cs,X as os,Y as Ye,Z as Ss,_ as rs,$ as zt,a0 as Ts,a1 as Jt,a2 as fo,a3 as Vs,a4 as po,a5 as dt,a6 as gt,a7 as mo,a8 as vo,a9 as hs,aa as Fs,ab as go,ac as Et,ad as It,ae as Ft,af as ho,ag as yo,ah as _o,ai as Ls,aj as xs,ak as Bs,al as wo,am as bo,an as ko,ao as zs,ap as ct,aq as $o,ar as Co,as as So,at as To,au as Vo,av as Fo,aw as Lo,ax as xo,ay as Bo,az as zo,aA as Rt,aB as Po,aC as jo,aD as Ps,aE as Oo,aF as Gt,aG as ys,aH as _s,aI as Do,aJ as Mo,aK as Ie,aL as Ro,aM as Go}from"./vendor-DcgxOoGO.js";(function(){const w=document.createElement("link").relList;if(w&&w.supports&&w.supports("modulepreload"))return;for(const h of document.querySelectorAll('link[rel="modulepreload"]'))i(h);new MutationObserver(h=>{for(const u of h)if(u.type==="childList")for(const O of u.addedNodes)O.tagName==="LINK"&&O.rel==="modulepreload"&&i(O)}).observe(document,{childList:!0,subtree:!0});function o(h){const u={};return h.integrity&&(u.integrity=h.integrity),h.referrerPolicy&&(u.referrerPolicy=h.referrerPolicy),h.crossOrigin==="use-credentials"?u.credentials="include":h.crossOrigin==="anonymous"?u.credentials="omit":u.credentials="same-origin",u}function i(h){if(h.ep)return;h.ep=!0;const u=o(h);fetch(h.href,u)}})();const rt=ws("config",()=>{const I=f(""),w=f([]),o=f([]),i=f([]),h=f([]),u=f(!1),O=f(!1),_=E(()=>({defaultCommitMessage:I.value,descriptionTemplates:w.value,scopeTemplates:o.value,messageTemplates:i.value,lockedFiles:h.value}));async function R(x=!1){if(!x&&O.value&&!u.value)return console.log("使用缓存的配置信息"),_.value;try{u.value=!0,console.log("加载配置信息...");const S=await(await fetch("/api/config/getConfig")).json();return I.value=S.defaultCommitMessage||"",w.value=S.descriptionTemplates||[],o.value=S.scopeTemplates||[],i.value=S.messageTemplates||[],h.value=S.lockedFiles||[],O.value=!0,console.log("配置信息加载完成"),_.value}catch(j){return console.error("加载配置失败:",j),n.error(`加载配置失败: ${j.message}`),null}finally{u.value=!1}}async function Z(x){try{const S=await(await fetch("/api/config/saveDefaultMessage",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({defaultCommitMessage:x})})).json();return S.success?(I.value=x,n.success("默认提交信息已保存"),!0):(n.error(`保存失败: ${S.error}`),!1)}catch(j){return n.error(`保存失败: ${j.message}`),!1}}async function J(x,j){try{const q=await(await fetch("/api/config/save-template",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({template:x,type:j})})).json();return q.success?(j==="description"?w.value.includes(x)||w.value.push(x):j==="scope"?o.value.includes(x)||o.value.push(x):j==="message"&&(i.value.includes(x)||i.value.push(x)),n.success("模板已保存"),!0):(n.error(`保存模板失败: ${q.error}`),!1)}catch(S){return n.error(`保存模板失败: ${S.message}`),!1}}async function N(x,j){try{const q=await(await fetch("/api/config/delete-template",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({template:x,type:j})})).json();return q.success?(j==="description"?w.value=w.value.filter(se=>se!==x):j==="scope"?o.value=o.value.filter(se=>se!==x):j==="message"&&(i.value=i.value.filter(se=>se!==x)),n.success("模板已删除"),!0):(n.error(`删除模板失败: ${q.error}`),!1)}catch(S){return n.error(`删除模板失败: ${S.message}`),!1}}async function y(x,j,S){try{const se=await(await fetch("/api/config/update-template",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldTemplate:x,newTemplate:j,type:S})})).json();if(se.success){if(S==="description"){const P=w.value.indexOf(x);P!==-1&&(w.value[P]=j)}else if(S==="scope"){const P=o.value.indexOf(x);P!==-1&&(o.value[P]=j)}else if(S==="message"){const P=i.value.indexOf(x);P!==-1&&(i.value[P]=j)}return n.success("模板已更新"),!0}else return n.error(`更新模板失败: ${se.error}`),!1}catch(q){return n.error(`更新模板失败: ${q.message}`),!1}}async function Q(){try{const j=await(await fetch("/api/locked-files")).json();return j.success?(h.value=j.lockedFiles||[],j.lockedFiles):(n.error(`加载锁定文件列表失败: ${j.error}`),[])}catch(x){return console.error("加载锁定文件列表失败:",x),n.error(`加载锁定文件列表失败: ${x.message}`),[]}}async function $(x){try{const S=await(await fetch("/api/lock-file",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({filePath:x})})).json();return S.success?(await Q(),n.success(`文件已锁定: ${x}`),!0):(n.error(`锁定文件失败: ${S.error}`),!1)}catch(j){return console.error("锁定文件失败:",j),n.error(`锁定文件失败: ${j.message}`),!1}}async function H(x){try{const S=await(await fetch("/api/unlock-file",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({filePath:x})})).json();return S.success?(await Q(),n.success(`文件已解锁: ${x}`),!0):(n.error(`解锁文件失败: ${S.error}`),!1)}catch(j){return console.error("解锁文件失败:",j),n.error(`解锁文件失败: ${j.message}`),!1}}async function X(x){try{const S=await(await fetch("/api/check-file-lock",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({filePath:x})})).json();return S.success?S.isLocked:(console.error("检查文件锁定状态失败:",S.error),!1)}catch(j){return console.error("检查文件锁定状态失败:",j),!1}}return{defaultCommitMessage:I,descriptionTemplates:w,scopeTemplates:o,messageTemplates:i,lockedFiles:h,isLoading:u,isLoaded:O,config:_,loadConfig:R,saveDefaultMessage:Z,saveTemplate:J,deleteTemplate:N,updateTemplate:y,loadLockedFiles:Q,lockFile:$,unlockFile:H,isFileLocked:X}}),Qt=800;function Ao(){const I=window.location.port||"80";if(I==="5173"||I==="4173"||I==="5544"){const o="3000";return console.log(`开发环境:从环境变量读取后端端口 ${o}`),parseInt(o,10)}const w=parseInt(I,10);return console.log(`生产环境:使用当前页面端口 ${w}`),w}const Uo=Ao(),st=ws("git",()=>{const I=rt(),w=f(""),o=f([]),i=f(""),h=f(""),u=f(!1),O=f(!1),_=f(!1),R=f(0),Z=f(""),J=f(!1),N=f(!1),y=f(!1),Q=f(!1),$=f(!1),H=f(0),X=f(0),x=f(!1),j=f(""),S=f(0),q=f(0),se=f(!0),P=f(null),ve=f(""),ee=f(""),g=f([]),z=f({staged:[],unstaged:[],untracked:[]}),A=f([]),ce=f(!1),fe=f(!1),me=f(!1),ge=f(!1),oe=f(!1),te=f([]),ue=f(!1),ke=f(!1),B=f(!1),F=f(!1);function ie(){w.value="",o.value=[],i.value="",h.value="",u.value=!1,O.value=!1,_.value=!1,R.value=0,H.value=0,X.value=0,x.value=!1,j.value="",S.value=0,q.value=0,N.value=!1,y.value=!1,Q.value=!1,$.value=!1,Z.value="",J.value=!1,g.value=[],z.value={staged:[],unstaged:[],untracked:[]},A.value=[],ce.value=!1,fe.value=!1,me.value=!1,ge.value=!1,oe.value=!1}async function le(d=!1,m=!1){if(!_.value)return;const L=Date.now();if(!d&&!m&&L-S.value<3e4){console.log("使用缓存的分支状态");return}try{console.log("获取分支状态...");let C="/api/branch-status";const re=[];d&&re.push("force=true"),m&&re.push("countOnly=true"),re.length>0&&(C+="?"+re.join("&"));const He=await(await fetch(C)).json();He&&(H.value=He.ahead||0,X.value=He.behind||0,x.value=He.hasUpstream||!1,j.value=He.upstreamBranch||"",S.value=L,console.log(`分支状态更新:领先 ${H.value} 个提交,落后 ${X.value} 个提交,上游分支:${x.value?j.value:"无"}`))}catch(C){console.error("获取分支状态失败:",C),H.value=0,X.value=0,x.value=!1,j.value=""}}async function Se(){const d=Date.now();if(d-R.value<1e3)return console.log("使用缓存的Git仓库状态:",_.value?"是":"不是"),_.value;try{const L=await(await fetch("/api/current_directory")).json();return _.value=L.isGitRepo===!0,R.value=d,console.log(`当前目录${_.value?"是":"不是"}Git仓库`),_.value}catch(m){return console.error("检查Git仓库状态失败:",m),_.value=!1,R.value=d,!1}}async function Te(d=!1){try{const C=await(await fetch(d?"/api/branch?force=true":"/api/branch")).json();C.branch&&(w.value=C.branch,console.log(`当前分支更新为: ${C.branch}${d?" (强制刷新)":""}`))}catch(m){console.error("获取分支信息失败:",m)}}async function Oe(){if(_.value)try{console.log("获取所有分支...");const m=await(await fetch("/api/branches")).json();m.branches&&Array.isArray(m.branches)&&(o.value=m.branches,q.value=Date.now(),console.log(`获取到${m.branches.length}个分支`))}catch(d){console.error("获取所有分支信息失败:",d)}}async function we(d){console.log("切换到分支:",d);try{u.value=!0;const L=await(await fetch("/api/checkout",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({branch:d})})).json();return L.success?(n({message:`已切换到分支: ${d}`,type:"success"}),await Te(!0),await le(!0),!0):(n({message:`切换分支失败: ${L.error}`,type:"error"}),!1)}catch(m){return n({message:`切换分支失败: ${m.message}`,type:"error"}),!1}finally{u.value=!1}}async function ne(){try{const m=await(await fetch("/api/user-info")).json();m.name&&m.email&&(i.value=m.name,h.value=m.email)}catch(d){console.error("获取用户信息失败:",d)}}async function Be(d,m){if(!d.trim())return n({message:"分支名称不能为空",type:"warning"}),!1;try{O.value=!0;const C=await(await fetch("/api/create-branch",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({newBranchName:d,baseBranch:m||w.value})})).json();return C.success?(n({message:`已创建并切换到分支: ${d}`,type:"success"}),await Te(!0),await le(!0),await Oe(),!0):(n({message:`创建分支失败: ${C.error}`,type:"error"}),!1)}catch(L){return n({message:`创建分支失败: ${L.message}`,type:"error"}),!1}finally{O.value=!1}}async function De(){try{const m=await(await fetch("/api/clear-user-config",{method:"POST"})).json();return m.success?(i.value="",h.value="",n({message:"已清除Git用户配置",type:"success"}),!0):(n({message:`清除配置失败: ${m.error}`,type:"error"}),!1)}catch(d){return n({message:`清除配置失败: ${d.message}`,type:"error"}),!1}}async function Ze(d,m){try{const C=await(await fetch("/api/restore-user-config",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:d,email:m})})).json();return C.success?(i.value=d,h.value=m,n({message:"已恢复Git用户配置",type:"success"}),!0):(n({message:`恢复配置失败: ${C.error}`,type:"error"}),!1)}catch(L){return n({message:`恢复配置失败: ${L.message}`,type:"error"}),!1}}async function lt(){if(!_.value)return n({message:"当前目录不是Git仓库",type:"warning"}),!1;try{y.value=!0;const m=await(await fetch("/api/pull",{method:"POST"})).json();return m.success?(n({message:"拉取成功",type:"success"}),await le(),!0):(m.needsMerge?n({message:`需要合并更改: ${m.pullOutput||"存在冲突需要手动解决"}`,type:"warning",duration:5e3}):n({message:`拉取失败: ${m.error}`,type:"error"}),!1)}catch(d){return n({message:`拉取失败: ${d.message}`,type:"error"}),!1}finally{y.value=!1}}async function Ke(){if(!_.value)return n({message:"当前目录不是Git仓库",type:"warning"}),!1;try{Q.value=!0;const m=await(await fetch("/api/fetch-all",{method:"POST"})).json();return m.success?(n({message:"获取所有远程分支信息成功",type:"success"}),await le(),!0):(n({message:`获取远程分支信息失败: ${m.error}`,type:"error"}),!1)}catch(d){return n({message:`获取远程分支信息失败: ${d.message}`,type:"error"}),!1}finally{Q.value=!1}}async function ot(){P.value&&P.value.disconnect();try{const d=`http://localhost:${Uo}`;if(console.log("尝试连接Socket.IO服务器:",d),P.value=no(d,{reconnectionDelayMax:1e4,reconnection:!0,reconnectionAttempts:10,reconnectionDelay:1e3,timeout:2e4,autoConnect:!0,forceNew:!0,transports:["websocket","polling"]}),!P.value){console.error("Socket.IO初始化失败: socket为null");return}console.log("Socket.IO客户端已创建,开始注册事件监听器..."),P.value.on("connect",()=>{var m;console.log("✅ Socket.IO连接成功,事件监听器已生效,Socket ID:",(m=P.value)==null?void 0:m.id),se.value&&P.value&&P.value.emit("start_monitoring")}),P.value.on("project_info",m=>{ve.value=m.projectPath,ee.value=m.projectRoomId,console.log(`当前项目: ${m.projectPath}`),console.log(`房间ID: ${m.projectRoomId}`)}),P.value.on("project_changed",m=>{console.log(`项目已切换: ${m.oldProjectPath} -> ${m.newProjectPath}`),ve.value=m.newProjectPath,ee.value=m.newProjectRoomId,P.value&&P.value.emit("join_room",m.newProjectRoomId),console.log(`已加入新项目房间: ${m.newProjectRoomId}`)}),P.value.on("disconnect",m=>{console.log("与Socket.IO服务器断开连接:",m)}),P.value.on("git_status_update",m=>{if(se.value){if(console.log("✅ 成功监听到 git_status_update 事件:",new Date().toLocaleTimeString()),console.log("git_status_update data ==>",m),console.log("currentProjectPath.value ==>",ve.value),console.log("data.projectPath ==>",m.projectPath),m.projectPath&&ve.value&&m.projectPath!==ve.value){console.log(`忽略不同项目的状态更新: ${m.projectPath}`);return}console.log("正在更新 Git 文件状态..."),m.porcelain!==void 0&&Ae(m.porcelain)}}),P.value.on("monitoring_status",m=>{console.log("文件监控状态:",m.active?"已启动":"已停止")}),P.value.on("connect_error",m=>{console.error("Socket连接错误:",m.message)}),P.value.on("connect_timeout",()=>{console.error("Socket连接超时")}),P.value.on("reconnect",m=>{var L;console.log(`Socket重连成功,尝试次数: ${m}`),se.value&&(console.log("重连后重新发送start_monitoring请求"),(L=P.value)==null||L.emit("start_monitoring"))}),P.value.on("reconnect_attempt",m=>{console.log(`Socket尝试重连,第 ${m} 次尝试`)}),P.value.on("reconnect_error",m=>{console.error("Socket重连错误:",m.message)}),P.value.on("reconnect_failed",()=>{console.error("Socket重连失败,已达到最大重试次数")}),console.log("Socket.IO事件监听器注册完成:connect, project_info, project_changed, git_status_update, monitoring_status"),P.value&&!P.value.connected&&(console.log("Socket未连接,尝试手动连接..."),P.value.connect())}catch(d){console.error("Socket.IO连接初始化失败:",d)}}function nt(){if(console.log("toggleAutoUpdate调用,当前值:",se.value),!P.value){console.error("无法切换自动更新状态: socket连接不存在"),n.error("无法连接到服务器,自动更新可能不会生效"),console.log("尝试重新建立socket连接..."),ot(),localStorage.setItem("zen-gitsync-auto-update",se.value.toString());return}try{se.value?(console.log("发送start_monitoring命令..."),P.value.emit("start_monitoring"),n.success("自动更新已启用")):(console.log("发送stop_monitoring命令..."),P.value.emit("stop_monitoring"),n.info("自动更新已禁用")),localStorage.setItem("zen-gitsync-auto-update",se.value.toString()),console.log("已保存自动更新设置到本地存储:",se.value)}catch(d){console.error("切换自动更新状态时出错:",d),n.error(`切换自动更新失败: ${d.message}`)}}function Ae(d){if(d===void 0||d===""){A.value=[];return}const m=d.split(`
|
|
1
|
+
import{d as ws,r as f,c as E,E as n,o as ht,a as bs,l as no,b as ze,w as Re,e as b,f as c,n as yt,g as U,h as e,t as M,i as t,u as a,j as io,k as s,m as G,p as Lt,F as Ce,q as Ge,s as pe,v as Me,x as $e,y as ro,z as tt,A as Nt,B as xt,C as co,D as ut,G as D,H as as,I as at,J as Ht,K as Bt,L as Vt,M as ks,N as ls,O as ns,P as $s,Q as ft,R as ss,S as vt,T as uo,U as is,V as Pt,W as Cs,X as os,Y as Ye,Z as Ss,_ as rs,$ as zt,a0 as Ts,a1 as Jt,a2 as fo,a3 as Vs,a4 as po,a5 as dt,a6 as gt,a7 as mo,a8 as vo,a9 as hs,aa as Fs,ab as go,ac as Et,ad as It,ae as Ft,af as ho,ag as yo,ah as _o,ai as Ls,aj as xs,ak as Bs,al as wo,am as bo,an as ko,ao as zs,ap as ct,aq as $o,ar as Co,as as So,at as To,au as Vo,av as Fo,aw as Lo,ax as xo,ay as Bo,az as zo,aA as Rt,aB as Po,aC as jo,aD as Ps,aE as Oo,aF as Gt,aG as ys,aH as _s,aI as Do,aJ as Mo,aK as Ie,aL as Ro,aM as Go}from"./vendor-CdN1pgJ5.js";(function(){const w=document.createElement("link").relList;if(w&&w.supports&&w.supports("modulepreload"))return;for(const h of document.querySelectorAll('link[rel="modulepreload"]'))i(h);new MutationObserver(h=>{for(const u of h)if(u.type==="childList")for(const O of u.addedNodes)O.tagName==="LINK"&&O.rel==="modulepreload"&&i(O)}).observe(document,{childList:!0,subtree:!0});function o(h){const u={};return h.integrity&&(u.integrity=h.integrity),h.referrerPolicy&&(u.referrerPolicy=h.referrerPolicy),h.crossOrigin==="use-credentials"?u.credentials="include":h.crossOrigin==="anonymous"?u.credentials="omit":u.credentials="same-origin",u}function i(h){if(h.ep)return;h.ep=!0;const u=o(h);fetch(h.href,u)}})();const rt=ws("config",()=>{const I=f(""),w=f([]),o=f([]),i=f([]),h=f([]),u=f(!1),O=f(!1),_=E(()=>({defaultCommitMessage:I.value,descriptionTemplates:w.value,scopeTemplates:o.value,messageTemplates:i.value,lockedFiles:h.value}));async function R(x=!1){if(!x&&O.value&&!u.value)return console.log("使用缓存的配置信息"),_.value;try{u.value=!0,console.log("加载配置信息...");const S=await(await fetch("/api/config/getConfig")).json();return I.value=S.defaultCommitMessage||"",w.value=S.descriptionTemplates||[],o.value=S.scopeTemplates||[],i.value=S.messageTemplates||[],h.value=S.lockedFiles||[],O.value=!0,console.log("配置信息加载完成"),_.value}catch(j){return console.error("加载配置失败:",j),n.error(`加载配置失败: ${j.message}`),null}finally{u.value=!1}}async function Z(x){try{const S=await(await fetch("/api/config/saveDefaultMessage",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({defaultCommitMessage:x})})).json();return S.success?(I.value=x,n.success("默认提交信息已保存"),!0):(n.error(`保存失败: ${S.error}`),!1)}catch(j){return n.error(`保存失败: ${j.message}`),!1}}async function J(x,j){try{const q=await(await fetch("/api/config/save-template",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({template:x,type:j})})).json();return q.success?(j==="description"?w.value.includes(x)||w.value.push(x):j==="scope"?o.value.includes(x)||o.value.push(x):j==="message"&&(i.value.includes(x)||i.value.push(x)),n.success("模板已保存"),!0):(n.error(`保存模板失败: ${q.error}`),!1)}catch(S){return n.error(`保存模板失败: ${S.message}`),!1}}async function N(x,j){try{const q=await(await fetch("/api/config/delete-template",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({template:x,type:j})})).json();return q.success?(j==="description"?w.value=w.value.filter(se=>se!==x):j==="scope"?o.value=o.value.filter(se=>se!==x):j==="message"&&(i.value=i.value.filter(se=>se!==x)),n.success("模板已删除"),!0):(n.error(`删除模板失败: ${q.error}`),!1)}catch(S){return n.error(`删除模板失败: ${S.message}`),!1}}async function y(x,j,S){try{const se=await(await fetch("/api/config/update-template",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldTemplate:x,newTemplate:j,type:S})})).json();if(se.success){if(S==="description"){const P=w.value.indexOf(x);P!==-1&&(w.value[P]=j)}else if(S==="scope"){const P=o.value.indexOf(x);P!==-1&&(o.value[P]=j)}else if(S==="message"){const P=i.value.indexOf(x);P!==-1&&(i.value[P]=j)}return n.success("模板已更新"),!0}else return n.error(`更新模板失败: ${se.error}`),!1}catch(q){return n.error(`更新模板失败: ${q.message}`),!1}}async function Q(){try{const j=await(await fetch("/api/locked-files")).json();return j.success?(h.value=j.lockedFiles||[],j.lockedFiles):(n.error(`加载锁定文件列表失败: ${j.error}`),[])}catch(x){return console.error("加载锁定文件列表失败:",x),n.error(`加载锁定文件列表失败: ${x.message}`),[]}}async function $(x){try{const S=await(await fetch("/api/lock-file",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({filePath:x})})).json();return S.success?(await Q(),n.success(`文件已锁定: ${x}`),!0):(n.error(`锁定文件失败: ${S.error}`),!1)}catch(j){return console.error("锁定文件失败:",j),n.error(`锁定文件失败: ${j.message}`),!1}}async function H(x){try{const S=await(await fetch("/api/unlock-file",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({filePath:x})})).json();return S.success?(await Q(),n.success(`文件已解锁: ${x}`),!0):(n.error(`解锁文件失败: ${S.error}`),!1)}catch(j){return console.error("解锁文件失败:",j),n.error(`解锁文件失败: ${j.message}`),!1}}async function X(x){try{const S=await(await fetch("/api/check-file-lock",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({filePath:x})})).json();return S.success?S.isLocked:(console.error("检查文件锁定状态失败:",S.error),!1)}catch(j){return console.error("检查文件锁定状态失败:",j),!1}}return{defaultCommitMessage:I,descriptionTemplates:w,scopeTemplates:o,messageTemplates:i,lockedFiles:h,isLoading:u,isLoaded:O,config:_,loadConfig:R,saveDefaultMessage:Z,saveTemplate:J,deleteTemplate:N,updateTemplate:y,loadLockedFiles:Q,lockFile:$,unlockFile:H,isFileLocked:X}}),Qt=800;function Ao(){const I=window.location.port||"80";if(I==="5173"||I==="4173"||I==="5544"){const o="3001";return console.log(`开发环境:从环境变量读取后端端口 ${o}`),parseInt(o,10)}const w=parseInt(I,10);return console.log(`生产环境:使用当前页面端口 ${w}`),w}const Uo=Ao(),st=ws("git",()=>{const I=rt(),w=f(""),o=f([]),i=f(""),h=f(""),u=f(!1),O=f(!1),_=f(!1),R=f(0),Z=f(""),J=f(!1),N=f(!1),y=f(!1),Q=f(!1),$=f(!1),H=f(0),X=f(0),x=f(!1),j=f(""),S=f(0),q=f(0),se=f(!0),P=f(null),ve=f(""),ee=f(""),g=f([]),z=f({staged:[],unstaged:[],untracked:[]}),A=f([]),ce=f(!1),fe=f(!1),me=f(!1),ge=f(!1),oe=f(!1),te=f([]),ue=f(!1),ke=f(!1),B=f(!1),F=f(!1);function ie(){w.value="",o.value=[],i.value="",h.value="",u.value=!1,O.value=!1,_.value=!1,R.value=0,H.value=0,X.value=0,x.value=!1,j.value="",S.value=0,q.value=0,N.value=!1,y.value=!1,Q.value=!1,$.value=!1,Z.value="",J.value=!1,g.value=[],z.value={staged:[],unstaged:[],untracked:[]},A.value=[],ce.value=!1,fe.value=!1,me.value=!1,ge.value=!1,oe.value=!1}async function le(d=!1,m=!1){if(!_.value)return;const L=Date.now();if(!d&&!m&&L-S.value<3e4){console.log("使用缓存的分支状态");return}try{console.log("获取分支状态...");let C="/api/branch-status";const re=[];d&&re.push("force=true"),m&&re.push("countOnly=true"),re.length>0&&(C+="?"+re.join("&"));const He=await(await fetch(C)).json();He&&(H.value=He.ahead||0,X.value=He.behind||0,x.value=He.hasUpstream||!1,j.value=He.upstreamBranch||"",S.value=L,console.log(`分支状态更新:领先 ${H.value} 个提交,落后 ${X.value} 个提交,上游分支:${x.value?j.value:"无"}`))}catch(C){console.error("获取分支状态失败:",C),H.value=0,X.value=0,x.value=!1,j.value=""}}async function Se(){const d=Date.now();if(d-R.value<1e3)return console.log("使用缓存的Git仓库状态:",_.value?"是":"不是"),_.value;try{const L=await(await fetch("/api/current_directory")).json();return _.value=L.isGitRepo===!0,R.value=d,console.log(`当前目录${_.value?"是":"不是"}Git仓库`),_.value}catch(m){return console.error("检查Git仓库状态失败:",m),_.value=!1,R.value=d,!1}}async function Te(d=!1){try{const C=await(await fetch(d?"/api/branch?force=true":"/api/branch")).json();C.branch&&(w.value=C.branch,console.log(`当前分支更新为: ${C.branch}${d?" (强制刷新)":""}`))}catch(m){console.error("获取分支信息失败:",m)}}async function Oe(){if(_.value)try{console.log("获取所有分支...");const m=await(await fetch("/api/branches")).json();m.branches&&Array.isArray(m.branches)&&(o.value=m.branches,q.value=Date.now(),console.log(`获取到${m.branches.length}个分支`))}catch(d){console.error("获取所有分支信息失败:",d)}}async function we(d){console.log("切换到分支:",d);try{u.value=!0;const L=await(await fetch("/api/checkout",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({branch:d})})).json();return L.success?(n({message:`已切换到分支: ${d}`,type:"success"}),await Te(!0),await le(!0),!0):(n({message:`切换分支失败: ${L.error}`,type:"error"}),!1)}catch(m){return n({message:`切换分支失败: ${m.message}`,type:"error"}),!1}finally{u.value=!1}}async function ne(){try{const m=await(await fetch("/api/user-info")).json();m.name&&m.email&&(i.value=m.name,h.value=m.email)}catch(d){console.error("获取用户信息失败:",d)}}async function Be(d,m){if(!d.trim())return n({message:"分支名称不能为空",type:"warning"}),!1;try{O.value=!0;const C=await(await fetch("/api/create-branch",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({newBranchName:d,baseBranch:m||w.value})})).json();return C.success?(n({message:`已创建并切换到分支: ${d}`,type:"success"}),await Te(!0),await le(!0),await Oe(),!0):(n({message:`创建分支失败: ${C.error}`,type:"error"}),!1)}catch(L){return n({message:`创建分支失败: ${L.message}`,type:"error"}),!1}finally{O.value=!1}}async function De(){try{const m=await(await fetch("/api/clear-user-config",{method:"POST"})).json();return m.success?(i.value="",h.value="",n({message:"已清除Git用户配置",type:"success"}),!0):(n({message:`清除配置失败: ${m.error}`,type:"error"}),!1)}catch(d){return n({message:`清除配置失败: ${d.message}`,type:"error"}),!1}}async function Ze(d,m){try{const C=await(await fetch("/api/restore-user-config",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:d,email:m})})).json();return C.success?(i.value=d,h.value=m,n({message:"已恢复Git用户配置",type:"success"}),!0):(n({message:`恢复配置失败: ${C.error}`,type:"error"}),!1)}catch(L){return n({message:`恢复配置失败: ${L.message}`,type:"error"}),!1}}async function lt(){if(!_.value)return n({message:"当前目录不是Git仓库",type:"warning"}),!1;try{y.value=!0;const m=await(await fetch("/api/pull",{method:"POST"})).json();return m.success?(n({message:"拉取成功",type:"success"}),await le(),!0):(m.needsMerge?n({message:`需要合并更改: ${m.pullOutput||"存在冲突需要手动解决"}`,type:"warning",duration:5e3}):n({message:`拉取失败: ${m.error}`,type:"error"}),!1)}catch(d){return n({message:`拉取失败: ${d.message}`,type:"error"}),!1}finally{y.value=!1}}async function Ke(){if(!_.value)return n({message:"当前目录不是Git仓库",type:"warning"}),!1;try{Q.value=!0;const m=await(await fetch("/api/fetch-all",{method:"POST"})).json();return m.success?(n({message:"获取所有远程分支信息成功",type:"success"}),await le(),!0):(n({message:`获取远程分支信息失败: ${m.error}`,type:"error"}),!1)}catch(d){return n({message:`获取远程分支信息失败: ${d.message}`,type:"error"}),!1}finally{Q.value=!1}}async function ot(){P.value&&P.value.disconnect();try{const d=`http://localhost:${Uo}`;if(console.log("尝试连接Socket.IO服务器:",d),P.value=no(d,{reconnectionDelayMax:1e4,reconnection:!0,reconnectionAttempts:10,reconnectionDelay:1e3,timeout:2e4,autoConnect:!0,forceNew:!0,transports:["websocket","polling"]}),!P.value){console.error("Socket.IO初始化失败: socket为null");return}console.log("Socket.IO客户端已创建,开始注册事件监听器..."),P.value.on("connect",()=>{var m;console.log("✅ Socket.IO连接成功,事件监听器已生效,Socket ID:",(m=P.value)==null?void 0:m.id),se.value&&P.value&&P.value.emit("start_monitoring")}),P.value.on("project_info",m=>{ve.value=m.projectPath,ee.value=m.projectRoomId,console.log(`当前项目: ${m.projectPath}`),console.log(`房间ID: ${m.projectRoomId}`)}),P.value.on("project_changed",m=>{console.log(`项目已切换: ${m.oldProjectPath} -> ${m.newProjectPath}`),ve.value=m.newProjectPath,ee.value=m.newProjectRoomId,P.value&&P.value.emit("join_room",m.newProjectRoomId),console.log(`已加入新项目房间: ${m.newProjectRoomId}`)}),P.value.on("disconnect",m=>{console.log("与Socket.IO服务器断开连接:",m)}),P.value.on("git_status_update",m=>{if(se.value){if(console.log("✅ 成功监听到 git_status_update 事件:",new Date().toLocaleTimeString()),console.log("git_status_update data ==>",m),console.log("currentProjectPath.value ==>",ve.value),console.log("data.projectPath ==>",m.projectPath),m.projectPath&&ve.value&&m.projectPath!==ve.value){console.log(`忽略不同项目的状态更新: ${m.projectPath}`);return}console.log("正在更新 Git 文件状态..."),m.porcelain!==void 0&&Ae(m.porcelain)}}),P.value.on("monitoring_status",m=>{console.log("文件监控状态:",m.active?"已启动":"已停止")}),P.value.on("connect_error",m=>{console.error("Socket连接错误:",m.message)}),P.value.on("connect_timeout",()=>{console.error("Socket连接超时")}),P.value.on("reconnect",m=>{var L;console.log(`Socket重连成功,尝试次数: ${m}`),se.value&&(console.log("重连后重新发送start_monitoring请求"),(L=P.value)==null||L.emit("start_monitoring"))}),P.value.on("reconnect_attempt",m=>{console.log(`Socket尝试重连,第 ${m} 次尝试`)}),P.value.on("reconnect_error",m=>{console.error("Socket重连错误:",m.message)}),P.value.on("reconnect_failed",()=>{console.error("Socket重连失败,已达到最大重试次数")}),console.log("Socket.IO事件监听器注册完成:connect, project_info, project_changed, git_status_update, monitoring_status"),P.value&&!P.value.connected&&(console.log("Socket未连接,尝试手动连接..."),P.value.connect())}catch(d){console.error("Socket.IO连接初始化失败:",d)}}function nt(){if(console.log("toggleAutoUpdate调用,当前值:",se.value),!P.value){console.error("无法切换自动更新状态: socket连接不存在"),n.error("无法连接到服务器,自动更新可能不会生效"),console.log("尝试重新建立socket连接..."),ot(),localStorage.setItem("zen-gitsync-auto-update",se.value.toString());return}try{se.value?(console.log("发送start_monitoring命令..."),P.value.emit("start_monitoring"),n.success("自动更新已启用")):(console.log("发送stop_monitoring命令..."),P.value.emit("stop_monitoring"),n.info("自动更新已禁用")),localStorage.setItem("zen-gitsync-auto-update",se.value.toString()),console.log("已保存自动更新设置到本地存储:",se.value)}catch(d){console.error("切换自动更新状态时出错:",d),n.error(`切换自动更新失败: ${d.message}`)}}function Ae(d){if(d===void 0||d===""){A.value=[];return}const m=d.split(`
|
|
2
2
|
`),L=[];for(const C of m){const re=C.match(/^([ MADRCU\?]{2})\s+(.+)$/);if(re){let je="";const He=re[1],qe=He.charAt(0),jt=He.charAt(1);qe==="A"||qe==="M"||qe==="D"||qe==="R"?je="added":qe===" "&&jt==="M"?je="modified":qe===" "&&jt==="D"?je="deleted":He==="??"?je="untracked":je="other",L.push({path:re[2],type:je})}}A.value=L}async function We(d=!0){if(!_.value){console.log("当前目录不是Git仓库,跳过加载提交历史");return}try{ce.value=!0,console.log("开始加载提交历史...");const m=new Date().getTime(),C=await(await fetch(`/api/log?page=1&_t=${m}`)).json();C&&C.data&&Array.isArray(C.data)?(g.value=[...C.data],console.log(`提交历史加载完成,共 ${g.value.length} 条记录`)):(console.warn("API返回的提交历史格式不正确:",C),g.value=[])}catch(m){console.error("获取提交历史失败:",m),d&&n({message:`获取提交历史失败: ${m.message}`,type:"error"})}finally{ce.value=!1}}async function T(){if(!_.value){console.log("当前目录不是Git仓库,跳过加载Git状态");return}try{fe.value=!0,await r()}catch(d){console.error("获取Git状态失败:",d),n({message:`获取Git状态失败: ${d.message}`,type:"error"})}finally{fe.value=!1}}async function r(){if(console.log("开始获取Git状态(porcelain格式)..."),!_.value){console.log("当前目录不是Git仓库,跳过加载Git状态");return}try{const m=await(await fetch("/api/status_porcelain")).json();m.status!==void 0?Ae(m.status):A.value=[]}catch(d){console.error("获取Git状态(porcelain)失败:",d),n({message:`获取Git状态(porcelain)失败: ${d.message}`,type:"error"}),A.value=[]}}async function Y(){if(!_.value)return n.warning("当前目录不是Git仓库"),!1;try{me.value=!0;const d=A.value.filter(m=>{const L=m.path.replace(/\\/g,"/");return!I.lockedFiles.some(re=>{const je=re.replace(/\\/g,"/");return L===je})});if(d.length===0)return n({message:"没有需要暂存的文件(所有文件都被锁定)",type:"warning"}),!1;if(d.length===A.value.length){const L=await(await fetch("/api/add",{method:"POST"})).json();return L.success?(n({message:"文件已添加到暂存区",type:"success"}),!0):(n({message:`添加文件失败: ${L.error}`,type:"error"}),!1)}else{const L=await(await fetch("/api/add-filtered",{method:"POST"})).json();if(L.success){const C=A.value.length-d.length;let re=`已添加 ${d.length} 个文件到暂存区`;return C>0&&(re+=`,跳过 ${C} 个锁定文件`),n({message:re,type:"success"}),!0}else return n({message:`添加文件失败: ${L.error}`,type:"error"}),!1}}catch(d){return n({message:`添加文件失败: ${d.message}`,type:"error"}),!1}finally{me.value=!1}}async function de(){if(!_.value)return n.warning("当前目录不是Git仓库"),!1;try{me.value=!0;const m=await(await fetch("/api/add-all",{method:"POST"})).json();return m.success?(n({message:"所有文件已添加到暂存区",type:"success"}),!0):(n({message:`添加文件失败: ${m.error}`,type:"error"}),!1)}catch(d){return n({message:`添加文件失败: ${d.message}`,type:"error"}),!1}finally{me.value=!1}}async function Ve(d){if(!_.value)return n.warning("当前目录不是Git仓库"),!1;try{me.value=!0;const L=await(await fetch("/api/add-file",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({filePath:d})})).json();return L.success?(n({message:"文件已暂存",type:"success"}),T(),!0):(n({message:`暂存文件失败: ${L.error}`,type:"error"}),!1)}catch(m){return n({message:`暂存文件失败: ${m.message}`,type:"error"}),!1}finally{me.value=!1}}async function Ne(d){if(!_.value)return n.warning("当前目录不是Git仓库"),!1;try{oe.value=!0;const L=await(await fetch("/api/unstage-file",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({filePath:d})})).json();return L.success?(n({message:"已取消暂存文件",type:"success"}),T(),!0):(n({message:`取消暂存失败: ${L.error}`,type:"error"}),!1)}catch(m){return n({message:`取消暂存失败: ${m.message}`,type:"error"}),!1}finally{oe.value=!1}}function be(d){return new Promise(m=>setTimeout(m,d))}async function he(d,m=!1){if(!_.value)return n.warning("当前目录不是Git仓库"),!1;try{ge.value=!0;const C=await(await fetch("/api/commit",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({message:d,hasNewlines:d.includes(`
|
|
3
3
|
`),noVerify:m})})).json();return C.success?(n({message:"提交成功",type:"success"}),!0):(n({message:`commitChanges 提交失败: ${C.error}`,type:"error"}),!1)}catch(L){return n({message:`提交失败: ${L.message}`,type:"error"}),!1}finally{ge.value=!1}}async function Ue(){if(!_.value)return n.warning("当前目录不是Git仓库"),!1;try{N.value=!0;const m=await(await fetch("/api/push",{method:"POST"})).json();return m.success?(H.value=0,X.value=0,await Promise.all([T(),We()]),console.log("推送成功,分支状态已设置为同步 (ahead=0, behind=0)"),!0):(n({message:`推送失败: ${m.error}`,type:"error"}),!1)}catch(d){return n({message:`推送失败: ${d.message}`,type:"error"}),!1}finally{N.value=!1}}async function Fe(d,m={}){if(!_.value)return n({message:"当前目录不是Git仓库",type:"warning"}),!1;if(!d)return n({message:"请选择要合并的分支",type:"warning"}),!1;if(d===w.value)return n({message:"不能合并当前分支到自身",type:"warning"}),!1;try{$.value=!0;const L=await fetch("/api/merge",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({branch:d,...m})}),C=await L.json();return L.status===409?(n({message:"合并分支时发生冲突,请手动解决",type:"warning",duration:5e3}),!1):C.success?(n({message:`成功合并分支 ${d} 到 ${w.value}`,type:"success"}),await T(),await le(),!0):(n({message:`合并分支失败: ${C.error}`,type:"error"}),!1)}catch(L){return n({message:`合并分支失败: ${L.message}`,type:"error"}),!1}finally{$.value=!1}}async function ye(d,m=!1){if(console.log("开始暂存并提交操作..."),!await Y())return!1;console.log("暂存完成,等待Git操作完成..."),await be(Qt),console.log("开始提交更改...");const C=await he(d,m);return console.log("暂存并提交操作完成"),C}async function ae(d,m=!1){try{if(console.log("开始暂存文件..."),!await Y()||(console.log("暂存完成,等待Git操作完成..."),await be(Qt),console.log("开始提交更改..."),!await he(d,m)))return!1;console.log("提交完成,等待Git操作完成..."),await be(Qt),console.log("开始推送到远程...");const re=await Ue();return console.log("一键推送操作完成,状态已统一刷新"),re}catch(L){console.error("一键推送操作失败:",L);try{(await(await fetch("/api/remove-lock",{method:"POST"})).json()).success&&n({message:"检测到Git锁定文件冲突,已自动清理,请重试操作",type:"warning"})}catch(C){console.error("清理锁定文件失败:",C)}n({message:`操作失败: ${L.message}`,type:"error"});try{await Promise.all([T(),We(),le()])}catch(C){console.error("刷新状态失败:",C)}return!1}}async function Je(){if(!_.value)return n.warning("当前目录不是Git仓库"),!1;try{oe.value=!0;const m=await(await fetch("/api/reset-head",{method:"POST"})).json();return m.success?(n({message:"已重置暂存区",type:"success"}),T(),!0):(n({message:`重置暂存区失败: ${m.error}`,type:"error"}),!1)}catch(d){return n({message:`重置暂存区失败: ${d.message}`,type:"error"}),!1}finally{oe.value=!1}}async function pt(d){if(!_.value)return n.warning("当前目录不是Git仓库"),!1;try{oe.value=!0;const L=await(await fetch("/api/reset-to-remote",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({branch:d})})).json();return L.success?(n({message:`已重置分支 ${d} 到远程状态`,type:"success"}),T(),We(),!0):(n({message:`重置分支失败: ${L.error}`,type:"error"}),!1)}catch(m){return n({message:`重置分支失败: ${m.message}`,type:"error"}),!1}finally{oe.value=!1}}async function _t(){if(_.value)try{J.value=!0,console.log("获取远程仓库地址...");const m=await(await fetch("/api/remote-url")).json();m.success?(Z.value=m.url||"",console.log(`获取到远程仓库地址: ${Z.value}`)):(console.warn("获取远程仓库地址失败:",m.error),Z.value="")}catch(d){console.error("获取远程仓库地址失败:",d),Z.value=""}finally{J.value=!1}}async function wt(){if(!Z.value)return n({message:"没有可复制的远程仓库地址",type:"warning"}),!1;try{return await navigator.clipboard.writeText(Z.value),n({message:"已复制远程仓库地址",type:"success"}),!0}catch(d){return console.error("复制远程仓库地址失败:",d),n({message:`复制失败: ${d.message}`,type:"error"}),!1}}ht(()=>{const d=localStorage.getItem("zen-gitsync-auto-update");d!==null&&(se.value=d==="true"),ot()});function it(){P.value&&(P.value.disconnect(),P.value=null)}bs(()=>{it()});async function Ee(){if(!_.value)return n.warning("当前目录不是Git仓库"),[];try{ue.value=!0;const m=await(await fetch("/api/stash-list")).json();return m.success?(te.value=m.stashes,m.stashes):(n.error(`获取stash列表失败: ${m.error}`),[])}catch(d){return console.error("获取stash列表失败:",d),n.error(`获取stash列表失败: ${d.message}`),[]}finally{ue.value=!1}}async function bt(d,m=!1,L=!0){if(!_.value)return n.warning("当前目录不是Git仓库"),!1;try{F.value=!0;const re=await(await fetch("/api/stash-save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({message:d,includeUntracked:m,excludeLocked:L})})).json();return re.success?(n.success(re.message),await Ee(),await T(),!0):(n.warning(re.message),!1)}catch(C){return console.error("保存stash失败:",C),n.error(`保存stash失败: ${C.message}`),!1}finally{F.value=!1}}async function k(d,m=!1){if(!_.value)return n.warning("当前目录不是Git仓库"),!1;try{ke.value=!0;const L=await fetch("/api/stash-apply",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({stashId:d,pop:m})}),C=await L.json();return L.status===409?(n.warning("应用stash时发生冲突,请手动解决"),!1):C.success?(n.success(C.message),await Ee(),await T(),!0):(n.error(`应用stash失败: ${C.error}`),!1)}catch(L){return console.error("应用stash失败:",L),n.error(`应用stash失败: ${L.message}`),!1}finally{ke.value=!1}}async function v(d){if(!_.value)return n.warning("当前目录不是Git仓库"),!1;try{B.value=!0;const L=await(await fetch("/api/stash-drop",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({stashId:d})})).json();return L.success?(n.success(L.message),await Ee(),!0):(n.error(`删除stash失败: ${L.error}`),!1)}catch(m){return console.error("删除stash失败:",m),n.error(`删除stash失败: ${m.message}`),!1}finally{B.value=!1}}async function K(){if(!_.value)return n.warning("当前目录不是Git仓库"),!1;try{B.value=!0;const m=await(await fetch("/api/stash-clear",{method:"POST"})).json();return m.success?(n.success(m.message),te.value=[],!0):(n.error(`清空stash失败: ${m.error}`),!1)}catch(d){return console.error("清空stash失败:",d),n.error(`清空stash失败: ${d.message}`),!1}finally{B.value=!1}}return{currentBranch:w,allBranches:o,userName:i,userEmail:h,isChangingBranch:u,isCreatingBranch:O,isGitRepo:_,lastCheckedTime:R,branchAhead:H,branchBehind:X,hasUpstream:x,upstreamBranch:j,lastBranchStatusTime:S,lastBranchesTime:q,remoteUrl:Z,isLoadingRemoteUrl:J,stashes:te,isLoadingStashes:ue,isApplyingStash:ke,isDroppingStash:B,isSavingStash:F,log:g,status:z,fileList:A,isLoadingLog:ce,isLoadingStatus:fe,isAddingFiles:me,isCommiting:ge,isResetting:oe,autoUpdateEnabled:se,isPushing:N,isGitPulling:y,isGitFetching:Q,isGitMerging:$,$reset:ie,checkGitRepo:Se,getCurrentBranch:Te,getAllBranches:Oe,changeBranch:we,getUserInfo:ne,createBranch:Be,clearUserConfig:De,restoreUserConfig:Ze,getBranchStatus:le,gitPull:lt,gitFetchAll:Ke,initSocketConnection:ot,toggleAutoUpdate:nt,parseStatusPorcelain:Ae,fetchLog:We,fetchStatus:T,fetchStatusPorcelain:r,addToStage:Y,addAllToStage:de,addFileToStage:Ve,unstageFile:Ne,commitChanges:he,pushToRemote:Ue,addAndCommit:ye,addCommitAndPush:ae,resetHead:Je,resetToRemote:pt,getRemoteUrl:_t,copyRemoteUrl:wt,mergeBranch:Fe,getStashList:Ee,saveStash:bt,applyStash:k,dropStash:v,clearAllStashes:K,socket:P,disconnectSocket:it}});function Eo(I){return I.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}function Io(I){return I?I.split(`
|
|
4
|
-
`).map(o=>{const i=Eo(o);return o.startsWith("diff --git")||o.startsWith("diff --cc")||o.startsWith("diff --combined")?`<div class="diff-header">${i}</div>`:o.startsWith("---")?`<div class="diff-old-file">${i}</div>`:o.startsWith("+++")?`<div class="diff-new-file">${i}</div>`:o.startsWith("@@")?`<div class="diff-hunk-header">${i}</div>`:o.startsWith("+")?`<div class="diff-added">${i}</div>`:o.startsWith("-")?`<div class="diff-removed">${i}</div>`:`<div class="diff-context">${i}</div>`}).join(""):""}function No(I){return I?I.trim():"(无提交信息)"}function Ho(I){if(!I)return"";const w=/^(feat|fix|docs|style|refactor|perf|test|chore|build|ci|revert)(\([^)]+\))?\s*:\s*(.+)$/s,o=I.match(w);return o?o[3].trim():I.trim()}const Jo="/assets/vscode-twqwGmNt.webp",Wo={key:0,class:"files-panel"},qo={class:"panel-header"},Yo={key:0,class:"file-count"},Ko={class:"files-list"},Qo=["onClick"],Xo={class:"file-name"},Zo={class:"panel-header"},ea={class:"header-right"},ta={class:"selected-file"},sa={class:"path-dir"},oa={class:"path-name"},aa={key:1,class:"action-buttons"},la=["src"],na={class:"diff-content"},ia=["innerHTML"],ra=ze({__name:"FileDiffViewer",props:{files:{},emptyText:{default:"没有找到变更文件"},diffContent:{default:""},selectedFile:{default:""},height:{default:"100%"},showFileList:{type:Boolean,default:!0},context:{default:"git-status"},showOpenButton:{type:Boolean,default:!0}},emits:["file-select","open-file","open-with-vscode"],setup(I,{emit:w}){const o=I,i=w,h=f(""),u=E(()=>o.selectedFile||h.value),O=E(()=>o.files.map($=>({...$,displayName:$.name||$.path.split("/").pop()||$.path}))),_=E(()=>o.diffContent&&o.diffContent.trim()!==""),R=E(()=>{if(!u.value)return"";const $=u.value.split("/");return $.slice(0,-1).join("/")+($.length>1?"/":"")}),Z=E(()=>{if(!u.value)return"";const $=u.value.split("/");return $[$.length-1]||u.value});function J($){h.value=$,i("file-select",$)}function N(){if(!u.value){n.warning("请先选择一个文件");return}i("open-file",u.value,o.context)}function y(){if(!u.value){n.warning("请先选择一个文件");return}i("open-with-vscode",u.value,o.context)}const Q=E(()=>{switch(o.context){case"git-status":return"在系统默认编辑器中打开文件";case"commit-detail":return"打开该提交时的文件版本";case"stash-detail":return"打开该stash中的文件版本";default:return"打开文件"}});return Re(()=>o.selectedFile,$=>{$!==void 0&&(h.value=$)}),Re(()=>o.files,$=>{if($.length>0&&!u.value){const H=$[0];J(H.path)}},{immediate:!0}),($,H)=>(c(),b("div",{class:"file-diff-viewer",style:yt({height:$.height})},[$.showFileList?(c(),b("div",Wo,[e("div",qo,[H[0]||(H[0]=e("h4",null,"变更文件",-1)),$.files.length>0?(c(),b("span",Yo,"("+M($.files.length)+")",1)):U("",!0)]),e("div",Ko,[t(a(io),{height:"100%"},{default:s(()=>[$.files.length===0?(c(),G(a(Lt),{key:0,description:$.emptyText,"image-size":60},null,8,["description"])):U("",!0),(c(!0),b(Ce,null,Ge(O.value,X=>(c(),b("div",{key:X.path,class:pe(["file-item",{active:X.path===u.value,[`file-type-${X.type}`]:X.type,"is-locked":X.locked}]),onClick:x=>J(X.path)},[t(a(tt),{class:"file-icon"},{default:s(()=>[t(a(Nt))]),_:1}),t(a(Me),{content:X.path,placement:"top",disabled:X.displayName.length<=35,"hide-after":1e3,"show-after":200},{default:s(()=>[e("span",Xo,M(X.displayName),1)]),_:2},1032,["content","disabled"]),X.locked?(c(),G(a(Me),{key:0,content:"该文件已被锁定,提交时会被跳过",placement:"top","hide-after":1e3,"show-after":200},{default:s(()=>[t(a(tt),{class:"lock-icon",color:"#E6A23C"},{default:s(()=>[t(a(xt))]),_:1})]),_:1})):U("",!0)],10,Qo))),128))]),_:1})])])):U("",!0),e("div",{class:pe(["diff-panel",{"full-width":!$.showFileList}])},[e("div",Zo,[H[1]||(H[1]=e("h4",null,"文件差异",-1)),e("div",ea,[u.value?(c(),G(a(Me),{key:0,content:u.value,placement:"top",effect:"light","hide-after":1e3,"show-after":200},{default:s(()=>[e("span",ta,[e("span",sa,M(R.value),1),e("span",oa,M(Z.value),1)])]),_:1},8,["content"])):U("",!0),$.showOpenButton&&u.value?(c(),b("div",aa,[t(a(Me),{content:Q.value,placement:"top",effect:"light"},{default:s(()=>[t(a($e),{type:"primary",size:"small",icon:a(ro),onClick:N,class:"open-file-btn"},null,8,["icon"])]),_:1},8,["content"]),t(a(Me),{content:"用VSCode打开文件",placement:"top",effect:"light"},{default:s(()=>[t(a($e),{type:"success",size:"small",onClick:y,class:"vscode-btn"},{default:s(()=>[e("img",{src:a(Jo),alt:"VSCode",class:"vscode-icon"},null,8,la)]),_:1})]),_:1})])):U("",!0)])]),e("div",na,[_.value?(c(),b("div",{key:1,class:"diff-text",innerHTML:a(Io)($.diffContent)},null,8,ia)):(c(),G(a(Lt),{key:0,description:u.value?"该文件没有差异内容":"请选择文件查看差异","image-size":80},null,8,["description"]))])],2)],4))}}),Pe=(I,w)=>{const o=I.__vccOpts||I;for(const[i,h]of w)o[i]=h;return o},cs=Pe(ra,[["__scopeId","data-v-be9a6f24"]]),ca={class:"common-dialog__footer"},ua=ze({__name:"CommonDialog",props:{modelValue:{type:Boolean},title:{},size:{default:"medium"},type:{default:"default"},width:{},height:{},top:{default:"80px"},closeOnClickModal:{type:Boolean,default:!1},closeOnPressEscape:{type:Boolean,default:!0},destroyOnClose:{type:Boolean,default:!1},draggable:{type:Boolean,default:!1},customClass:{},appendToBody:{type:Boolean,default:!1},lockScroll:{type:Boolean,default:!0},heightMode:{default:"max"},heightOffset:{default:"160px"},showFooter:{type:Boolean,default:!1},confirmText:{default:"确定"},cancelText:{default:"取消"},showCancel:{type:Boolean,default:!0},confirmLoading:{type:Boolean,default:!1}},emits:["update:modelValue","confirm","cancel","close","opened","closed"],setup(I,{emit:w}){const o=I,i=w,h=E(()=>{if(o.width)return o.width;switch(o.size){case"small":return"30%";case"medium":return"50%";case"large":return"80%";case"extra-large":return"90%";default:return"50%"}}),u=E(()=>{const y=[];return o.customClass&&y.push(o.customClass),o.type==="flex"&&y.push("common-dialog--flex"),o.type==="full-height"&&y.push("common-dialog--full-height"),y.join(" ")}),O=E(()=>{const y=`calc(100% - ${o.heightOffset})`;return o.heightMode==="fixed"?{height:y}:{maxHeight:y}});function _(){i("update:modelValue",!1),i("close")}function R(){i("confirm")}function Z(){i("cancel"),_()}function J(){i("opened")}function N(){i("closed")}return(y,Q)=>{const $=$e;return c(),G(a(as),{"model-value":y.modelValue,title:y.title,width:h.value,top:y.top,style:yt(O.value),"close-on-click-modal":y.closeOnClickModal,"close-on-press-escape":y.closeOnPressEscape,"destroy-on-close":y.destroyOnClose,draggable:y.draggable,class:pe(u.value),"append-to-body":y.appendToBody,"lock-scroll":y.lockScroll,onClose:_,onOpened:J,onClosed:N},co({default:s(()=>[ut(y.$slots,"default",{},void 0,!0)]),_:2},[y.showFooter||y.$slots.footer?{name:"footer",fn:s(()=>[ut(y.$slots,"footer",{},()=>[e("div",ca,[y.showCancel?(c(),G($,{key:0,onClick:Z},{default:s(()=>[D(M(y.cancelText),1)]),_:1})):U("",!0),t($,{type:"primary",loading:y.confirmLoading,onClick:R},{default:s(()=>[D(M(y.confirmText),1)]),_:1},8,["loading"])])],!0)]),key:"0"}:void 0]),1032,["model-value","title","width","top","style","close-on-click-modal","close-on-press-escape","destroy-on-close","draggable","class","append-to-body","lock-scroll"])}}}),Xe=Pe(ua,[["__scopeId","data-v-b6bed8d9"]]),da={key:0,class:"file-group"},fa={class:"file-list"},pa=["onClick"],ma={class:"file-info"},va={class:"file-name-section"},ga=["title"],ha={class:"file-directory"},ya={class:"file-actions"},_a={key:1,style:{"font-size":"16px","font-weight":"bold"}},wa=ze({__name:"FileGroup",props:{files:{},title:{},groupKey:{},collapsedGroups:{},isFileLocked:{type:Function},isLocking:{type:Function},getFileName:{type:Function},getFileDirectory:{type:Function}},emits:["toggleCollapse","fileClick","toggleFileLock","stageFile","unstageFile","revertFileChanges"],setup(I,{emit:w}){const o=I,i=w,h=E(()=>o.files.length>0),u=E(()=>o.collapsedGroups[o.groupKey]);function O(){i("toggleCollapse",o.groupKey)}function _($){i("fileClick",$)}function R($,H){H.stopPropagation(),i("toggleFileLock",$)}function Z($,H){H.stopPropagation(),i("stageFile",$)}function J($,H){H.stopPropagation(),i("unstageFile",$)}function N($,H){H.stopPropagation(),i("revertFileChanges",$)}function y($){switch($){case"added":return[{type:"unstage",tooltip:"取消暂存",buttonType:"warning",icon:"-",handler:J}];case"modified":case"deleted":return[{type:"stage",tooltip:"添加到暂存区",buttonType:"success",icon:"+",handler:Z},{type:"revert",tooltip:"撤回修改",buttonType:"danger",icon:ns,handler:N}];case"untracked":return[{type:"stage",tooltip:"添加到暂存区",buttonType:"success",icon:"+",handler:Z},{type:"delete",tooltip:"删除文件",buttonType:"danger",icon:ls,handler:N}];default:return[]}}function Q($){switch($){case"added":return"A";case"modified":return"M";case"deleted":return"D";case"untracked":return"U";default:return""}}return($,H)=>{const X=tt,x=Me,j=$e;return h.value?(c(),b("div",da,[e("div",{class:"file-group-header",onClick:O},[t(X,{class:pe(["collapse-icon",{collapsed:u.value}])},{default:s(()=>[t(a(Ht))]),_:1},8,["class"]),e("span",null,M($.title),1)]),at(e("div",fa,[(c(!0),b(Ce,null,Ge($.files,S=>(c(),b("div",{key:S.path,class:pe(["file-item",{"is-loading":o.isLocking(S.path)}]),onClick:q=>_(S)},[e("div",ma,[e("div",{class:pe(["file-status-indicator",[S.type,{locked:o.isFileLocked(S.path)}]])},M(Q(S.type)),3),e("div",va,[t(x,{content:o.getFileName(S.path),placement:"top",disabled:o.getFileName(S.path).length<=25,"hide-after":1e3,"show-after":200},{default:s(()=>[e("span",{class:pe(["file-name",{"locked-file-name":o.isFileLocked(S.path),"deleted-file-name":S.type==="deleted"}])},[D(M(o.getFileName(S.path))+" ",1),o.isFileLocked(S.path)?(c(),G(X,{key:0,class:"lock-indicator"},{default:s(()=>[t(a(xt))]),_:1})):U("",!0)],2)]),_:2},1032,["content","disabled"])]),e("div",{class:"file-path-section",title:o.getFileDirectory(S.path)},[t(x,{content:o.getFileDirectory(S.path),placement:"top",disabled:o.getFileDirectory(S.path).length<=30,"hide-after":1e3,"show-after":200},{default:s(()=>[e("span",ha,M(o.getFileDirectory(S.path)),1)]),_:2},1032,["content","disabled"])],8,ga)]),e("div",ya,[t(x,{content:o.isLocking(S.path)?"处理中...":o.isFileLocked(S.path)?"解锁文件":"锁定文件",placement:"top","hide-after":1e3,"show-after":200},{default:s(()=>[t(j,{type:o.isFileLocked(S.path)?"danger":"info",size:"small",text:"",loading:o.isLocking(S.path),disabled:o.isLocking(S.path),onClick:q=>R(S.path,q),class:"file-action-btn"},{default:s(()=>[o.isLocking(S.path)?U("",!0):(c(),G(X,{key:0,size:"16"},{default:s(()=>[(c(),G(Vt(o.isFileLocked(S.path)?a(xt):a(ks))))]),_:2},1024))]),_:2},1032,["type","loading","disabled","onClick"])]),_:2},1032,["content"]),o.isFileLocked(S.path)?U("",!0):(c(!0),b(Ce,{key:0},Ge(y(S.type),q=>(c(),G(x,{key:q.type,content:q.tooltip,placement:"top","hide-after":1e3,"show-after":200},{default:s(()=>[t(j,{type:q.buttonType,size:"small",text:"",onClick:se=>q.handler(S.path,se),class:"file-action-btn"},{default:s(()=>[typeof q.icon!="string"?(c(),G(X,{key:0,size:"16"},{default:s(()=>[(c(),G(Vt(q.icon)))]),_:2},1024)):(c(),b("span",_a,M(q.icon),1))]),_:2},1032,["type","onClick"])]),_:2},1032,["content"]))),128))])],10,pa))),128))],512),[[Bt,!u.value]])])):U("",!0)}}}),Xt=Pe(wa,[["__scopeId","data-v-edc580d3"]]),ba={class:"git-status-card flex flex-col"},ka={class:"status-header"},$a={class:"header-actions"},Ca=["element-loading-text"],Sa={key:0,class:"status-box"},Ta={key:1,class:"status-box-wrap"},Va={key:0,class:"branch-status-info"},Fa={class:"branch-sync-status"},La={class:"sync-status-content"},xa={class:"status-badges"},Ba={class:"badge-content"},za={class:"badge-content"},Pa={key:1,class:"file-list-container"},ja={key:2,class:"empty-status"},Oa={class:"empty-icon"},Da={class:"lock-feature-description"},Ma={class:"description-header"},Ra={key:0,class:"empty-locked-files"},Ga={class:"empty-icon"},Aa={key:1,class:"locked-files-list"},Ua={class:"locked-files-header"},Ea={class:"locked-file-items"},Ia={class:"file-info"},Na={class:"file-path-container"},Ha={class:"file-name"},Ja={class:"file-directory"},Wa={class:"file-actions"},qa=ze({__name:"GitStatus",props:{initialDirectory:{type:String,default:""}},setup(I,{expose:w}){const o=I,i=st(),h=rt(),u=E(()=>i.isLoadingStatus),O=f(""),_=f(""),R=f(!1),Z=f(!1),J=f(-1),N=f({});function y(B){return!!N.value[B]}const Q=E(()=>i.fileList.map(B=>({path:B.path,name:B.path.split("/").pop()||B.path,type:B.type,locked:te(B.path)})));async function $(B){await ve(B)}async function H(B,F){try{const le=await(await fetch("/api/open-file",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({filePath:B,context:F})})).json();le.success?n.success(le.message):n.error(le.error||"打开文件失败")}catch(ie){n.error(`打开文件失败: ${ie.message}`)}}async function X(B,F){try{const le=await(await fetch("/api/open-with-vscode",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({filePath:B,context:F})})).json();le.success?n.success(le.message):n.error(le.error||"用VSCode打开文件失败")}catch(ie){n.error(`用VSCode打开文件失败: ${ie.message}`)}}const x=f(!1),j=f({staged:!1,unstaged:!1,untracked:!1}),S=f(o.initialDirectory||"");async function q(){try{if(!S.value){const F=await(await fetch("/api/current_directory")).json();S.value=F.directory||"未知目录"}if(!i.isGitRepo)return;await i.fetchStatus(),await i.getBranchStatus(),n({message:"Git 状态已刷新",type:"success"})}catch(B){n({message:"刷新失败: "+B.message,type:"error"})}}async function se(B){try{await Ye.confirm(`确认解锁该文件?
|
|
4
|
+
`).map(o=>{const i=Eo(o);return o.startsWith("diff --git")||o.startsWith("diff --cc")||o.startsWith("diff --combined")?`<div class="diff-header">${i}</div>`:o.startsWith("---")?`<div class="diff-old-file">${i}</div>`:o.startsWith("+++")?`<div class="diff-new-file">${i}</div>`:o.startsWith("@@")?`<div class="diff-hunk-header">${i}</div>`:o.startsWith("+")?`<div class="diff-added">${i}</div>`:o.startsWith("-")?`<div class="diff-removed">${i}</div>`:`<div class="diff-context">${i}</div>`}).join(""):""}function No(I){return I?I.trim():"(无提交信息)"}function Ho(I){if(!I)return"";const w=/^(feat|fix|docs|style|refactor|perf|test|chore|build|ci|revert)(\([^)]+\))?\s*:\s*(.+)$/s,o=I.match(w);return o?o[3].trim():I.trim()}const Jo="/assets/vscode-twqwGmNt.webp",Wo={key:0,class:"files-panel"},qo={class:"panel-header"},Yo={key:0,class:"file-count"},Ko={class:"files-list"},Qo=["onClick"],Xo={class:"file-name"},Zo={class:"panel-header"},ea={class:"header-right"},ta={class:"selected-file"},sa={class:"path-dir"},oa={class:"path-name"},aa={key:1,class:"action-buttons"},la=["src"],na={class:"diff-content"},ia=["innerHTML"],ra=ze({__name:"FileDiffViewer",props:{files:{},emptyText:{default:"没有找到变更文件"},diffContent:{default:""},selectedFile:{default:""},height:{default:"100%"},showFileList:{type:Boolean,default:!0},context:{default:"git-status"},showOpenButton:{type:Boolean,default:!0}},emits:["file-select","open-file","open-with-vscode"],setup(I,{emit:w}){const o=I,i=w,h=f(""),u=E(()=>o.selectedFile||h.value),O=E(()=>o.files.map($=>({...$,displayName:$.name||$.path.split("/").pop()||$.path}))),_=E(()=>o.diffContent&&o.diffContent.trim()!==""),R=E(()=>{if(!u.value)return"";const $=u.value.split("/");return $.slice(0,-1).join("/")+($.length>1?"/":"")}),Z=E(()=>{if(!u.value)return"";const $=u.value.split("/");return $[$.length-1]||u.value});function J($){h.value=$,i("file-select",$)}function N(){if(!u.value){n.warning("请先选择一个文件");return}i("open-file",u.value,o.context)}function y(){if(!u.value){n.warning("请先选择一个文件");return}i("open-with-vscode",u.value,o.context)}const Q=E(()=>{switch(o.context){case"git-status":return"在系统默认编辑器中打开文件";case"commit-detail":return"打开该提交时的文件版本";case"stash-detail":return"打开该stash中的文件版本";default:return"打开文件"}});return Re(()=>o.selectedFile,$=>{$!==void 0&&(h.value=$)}),Re(()=>o.files,$=>{if($.length>0&&!u.value){const H=$[0];J(H.path)}},{immediate:!0}),($,H)=>(c(),b("div",{class:"file-diff-viewer",style:yt({height:$.height})},[$.showFileList?(c(),b("div",Wo,[e("div",qo,[H[0]||(H[0]=e("h4",null,"变更文件",-1)),$.files.length>0?(c(),b("span",Yo,"("+M($.files.length)+")",1)):U("",!0)]),e("div",Ko,[t(a(io),{height:"100%"},{default:s(()=>[$.files.length===0?(c(),G(a(Lt),{key:0,description:$.emptyText,"image-size":60},null,8,["description"])):U("",!0),(c(!0),b(Ce,null,Ge(O.value,X=>(c(),b("div",{key:X.path,class:pe(["file-item",{active:X.path===u.value,[`file-type-${X.type}`]:X.type,"is-locked":X.locked}]),onClick:x=>J(X.path)},[t(a(tt),{class:"file-icon"},{default:s(()=>[t(a(Nt))]),_:1}),t(a(Me),{content:X.path,placement:"top",disabled:X.displayName.length<=35,"hide-after":1e3,"show-after":200},{default:s(()=>[e("span",Xo,M(X.displayName),1)]),_:2},1032,["content","disabled"]),X.locked?(c(),G(a(Me),{key:0,content:"该文件已被锁定,提交时会被跳过",placement:"top","hide-after":1e3,"show-after":200},{default:s(()=>[t(a(tt),{class:"lock-icon",color:"#E6A23C"},{default:s(()=>[t(a(xt))]),_:1})]),_:1})):U("",!0)],10,Qo))),128))]),_:1})])])):U("",!0),e("div",{class:pe(["diff-panel",{"full-width":!$.showFileList}])},[e("div",Zo,[H[1]||(H[1]=e("h4",null,"文件差异",-1)),e("div",ea,[u.value?(c(),G(a(Me),{key:0,content:u.value,placement:"top",effect:"light","hide-after":1e3,"show-after":200},{default:s(()=>[e("span",ta,[e("span",sa,M(R.value),1),e("span",oa,M(Z.value),1)])]),_:1},8,["content"])):U("",!0),$.showOpenButton&&u.value?(c(),b("div",aa,[t(a(Me),{content:Q.value,placement:"top",effect:"light"},{default:s(()=>[t(a($e),{type:"primary",size:"small",icon:a(ro),onClick:N,class:"open-file-btn"},null,8,["icon"])]),_:1},8,["content"]),t(a(Me),{content:"用VSCode打开文件",placement:"top",effect:"light"},{default:s(()=>[t(a($e),{type:"success",size:"small",onClick:y,class:"vscode-btn"},{default:s(()=>[e("img",{src:a(Jo),alt:"VSCode",class:"vscode-icon"},null,8,la)]),_:1})]),_:1})])):U("",!0)])]),e("div",na,[_.value?(c(),b("div",{key:1,class:"diff-text",innerHTML:a(Io)($.diffContent)},null,8,ia)):(c(),G(a(Lt),{key:0,description:u.value?"该文件没有差异内容":"请选择文件查看差异","image-size":80},null,8,["description"]))])],2)],4))}}),Pe=(I,w)=>{const o=I.__vccOpts||I;for(const[i,h]of w)o[i]=h;return o},cs=Pe(ra,[["__scopeId","data-v-454a45f7"]]),ca={class:"common-dialog__footer"},ua=ze({__name:"CommonDialog",props:{modelValue:{type:Boolean},title:{},size:{default:"medium"},type:{default:"default"},width:{},height:{},top:{default:"80px"},closeOnClickModal:{type:Boolean,default:!1},closeOnPressEscape:{type:Boolean,default:!0},destroyOnClose:{type:Boolean,default:!1},draggable:{type:Boolean,default:!1},customClass:{},appendToBody:{type:Boolean,default:!1},lockScroll:{type:Boolean,default:!0},heightMode:{default:"max"},heightOffset:{default:"160px"},showFooter:{type:Boolean,default:!1},confirmText:{default:"确定"},cancelText:{default:"取消"},showCancel:{type:Boolean,default:!0},confirmLoading:{type:Boolean,default:!1}},emits:["update:modelValue","confirm","cancel","close","opened","closed"],setup(I,{emit:w}){const o=I,i=w,h=E(()=>{if(o.width)return o.width;switch(o.size){case"small":return"30%";case"medium":return"50%";case"large":return"80%";case"extra-large":return"90%";default:return"50%"}}),u=E(()=>{const y=[];return o.customClass&&y.push(o.customClass),o.type==="flex"&&y.push("common-dialog--flex"),o.type==="full-height"&&y.push("common-dialog--full-height"),y.join(" ")}),O=E(()=>{const y=`calc(100% - ${o.heightOffset})`;return o.heightMode==="fixed"?{height:y}:{maxHeight:y}});function _(){i("update:modelValue",!1),i("close")}function R(){i("confirm")}function Z(){i("cancel"),_()}function J(){i("opened")}function N(){i("closed")}return(y,Q)=>{const $=$e;return c(),G(a(as),{"model-value":y.modelValue,title:y.title,width:h.value,top:y.top,style:yt(O.value),"close-on-click-modal":y.closeOnClickModal,"close-on-press-escape":y.closeOnPressEscape,"destroy-on-close":y.destroyOnClose,draggable:y.draggable,class:pe(u.value),"append-to-body":y.appendToBody,"lock-scroll":y.lockScroll,onClose:_,onOpened:J,onClosed:N},co({default:s(()=>[ut(y.$slots,"default",{},void 0,!0)]),_:2},[y.showFooter||y.$slots.footer?{name:"footer",fn:s(()=>[ut(y.$slots,"footer",{},()=>[e("div",ca,[y.showCancel?(c(),G($,{key:0,onClick:Z},{default:s(()=>[D(M(y.cancelText),1)]),_:1})):U("",!0),t($,{type:"primary",loading:y.confirmLoading,onClick:R},{default:s(()=>[D(M(y.confirmText),1)]),_:1},8,["loading"])])],!0)]),key:"0"}:void 0]),1032,["model-value","title","width","top","style","close-on-click-modal","close-on-press-escape","destroy-on-close","draggable","class","append-to-body","lock-scroll"])}}}),Xe=Pe(ua,[["__scopeId","data-v-b6bed8d9"]]),da={key:0,class:"file-group"},fa={class:"file-list"},pa=["onClick"],ma={class:"file-info"},va={class:"file-name-section"},ga=["title"],ha={class:"file-directory"},ya={class:"file-actions"},_a={key:1,style:{"font-size":"16px","font-weight":"bold"}},wa=ze({__name:"FileGroup",props:{files:{},title:{},groupKey:{},collapsedGroups:{},isFileLocked:{type:Function},isLocking:{type:Function},getFileName:{type:Function},getFileDirectory:{type:Function}},emits:["toggleCollapse","fileClick","toggleFileLock","stageFile","unstageFile","revertFileChanges"],setup(I,{emit:w}){const o=I,i=w,h=E(()=>o.files.length>0),u=E(()=>o.collapsedGroups[o.groupKey]);function O(){i("toggleCollapse",o.groupKey)}function _($){i("fileClick",$)}function R($,H){H.stopPropagation(),i("toggleFileLock",$)}function Z($,H){H.stopPropagation(),i("stageFile",$)}function J($,H){H.stopPropagation(),i("unstageFile",$)}function N($,H){H.stopPropagation(),i("revertFileChanges",$)}function y($){switch($){case"added":return[{type:"unstage",tooltip:"取消暂存",buttonType:"warning",icon:"-",handler:J}];case"modified":case"deleted":return[{type:"stage",tooltip:"添加到暂存区",buttonType:"success",icon:"+",handler:Z},{type:"revert",tooltip:"撤回修改",buttonType:"danger",icon:ns,handler:N}];case"untracked":return[{type:"stage",tooltip:"添加到暂存区",buttonType:"success",icon:"+",handler:Z},{type:"delete",tooltip:"删除文件",buttonType:"danger",icon:ls,handler:N}];default:return[]}}function Q($){switch($){case"added":return"A";case"modified":return"M";case"deleted":return"D";case"untracked":return"U";default:return""}}return($,H)=>{const X=tt,x=Me,j=$e;return h.value?(c(),b("div",da,[e("div",{class:"file-group-header",onClick:O},[t(X,{class:pe(["collapse-icon",{collapsed:u.value}])},{default:s(()=>[t(a(Ht))]),_:1},8,["class"]),e("span",null,M($.title),1)]),at(e("div",fa,[(c(!0),b(Ce,null,Ge($.files,S=>(c(),b("div",{key:S.path,class:pe(["file-item",{"is-loading":o.isLocking(S.path)}]),onClick:q=>_(S)},[e("div",ma,[e("div",{class:pe(["file-status-indicator",[S.type,{locked:o.isFileLocked(S.path)}]])},M(Q(S.type)),3),e("div",va,[t(x,{content:o.getFileName(S.path),placement:"top",disabled:o.getFileName(S.path).length<=25,"hide-after":1e3,"show-after":200},{default:s(()=>[e("span",{class:pe(["file-name",{"locked-file-name":o.isFileLocked(S.path),"deleted-file-name":S.type==="deleted"}])},[D(M(o.getFileName(S.path))+" ",1),o.isFileLocked(S.path)?(c(),G(X,{key:0,class:"lock-indicator"},{default:s(()=>[t(a(xt))]),_:1})):U("",!0)],2)]),_:2},1032,["content","disabled"])]),e("div",{class:"file-path-section",title:o.getFileDirectory(S.path)},[t(x,{content:o.getFileDirectory(S.path),placement:"top",disabled:o.getFileDirectory(S.path).length<=30,"hide-after":1e3,"show-after":200},{default:s(()=>[e("span",ha,M(o.getFileDirectory(S.path)),1)]),_:2},1032,["content","disabled"])],8,ga)]),e("div",ya,[t(x,{content:o.isLocking(S.path)?"处理中...":o.isFileLocked(S.path)?"解锁文件":"锁定文件",placement:"top","hide-after":1e3,"show-after":200},{default:s(()=>[t(j,{type:o.isFileLocked(S.path)?"danger":"info",size:"small",text:"",loading:o.isLocking(S.path),disabled:o.isLocking(S.path),onClick:q=>R(S.path,q),class:"file-action-btn"},{default:s(()=>[o.isLocking(S.path)?U("",!0):(c(),G(X,{key:0,size:"16"},{default:s(()=>[(c(),G(Vt(o.isFileLocked(S.path)?a(xt):a(ks))))]),_:2},1024))]),_:2},1032,["type","loading","disabled","onClick"])]),_:2},1032,["content"]),o.isFileLocked(S.path)?U("",!0):(c(!0),b(Ce,{key:0},Ge(y(S.type),q=>(c(),G(x,{key:q.type,content:q.tooltip,placement:"top","hide-after":1e3,"show-after":200},{default:s(()=>[t(j,{type:q.buttonType,size:"small",text:"",onClick:se=>q.handler(S.path,se),class:"file-action-btn"},{default:s(()=>[typeof q.icon!="string"?(c(),G(X,{key:0,size:"16"},{default:s(()=>[(c(),G(Vt(q.icon)))]),_:2},1024)):(c(),b("span",_a,M(q.icon),1))]),_:2},1032,["type","onClick"])]),_:2},1032,["content"]))),128))])],10,pa))),128))],512),[[Bt,!u.value]])])):U("",!0)}}}),Xt=Pe(wa,[["__scopeId","data-v-c1bab876"]]),ba={class:"git-status-card flex flex-col"},ka={class:"status-header"},$a={class:"header-actions"},Ca=["element-loading-text"],Sa={key:0,class:"status-box"},Ta={key:1,class:"status-box-wrap"},Va={key:0,class:"branch-status-info"},Fa={class:"branch-sync-status"},La={class:"sync-status-content"},xa={class:"status-badges"},Ba={class:"badge-content"},za={class:"badge-content"},Pa={key:1,class:"file-list-container"},ja={key:2,class:"empty-status"},Oa={class:"empty-icon"},Da={class:"lock-feature-description"},Ma={class:"description-header"},Ra={key:0,class:"empty-locked-files"},Ga={class:"empty-icon"},Aa={key:1,class:"locked-files-list"},Ua={class:"locked-files-header"},Ea={class:"locked-file-items"},Ia={class:"file-info"},Na={class:"file-path-container"},Ha={class:"file-name"},Ja={class:"file-directory"},Wa={class:"file-actions"},qa=ze({__name:"GitStatus",props:{initialDirectory:{type:String,default:""}},setup(I,{expose:w}){const o=I,i=st(),h=rt(),u=E(()=>i.isLoadingStatus),O=f(""),_=f(""),R=f(!1),Z=f(!1),J=f(-1),N=f({});function y(B){return!!N.value[B]}const Q=E(()=>i.fileList.map(B=>({path:B.path,name:B.path.split("/").pop()||B.path,type:B.type,locked:te(B.path)})));async function $(B){await ve(B)}async function H(B,F){try{const le=await(await fetch("/api/open-file",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({filePath:B,context:F})})).json();le.success?n.success(le.message):n.error(le.error||"打开文件失败")}catch(ie){n.error(`打开文件失败: ${ie.message}`)}}async function X(B,F){try{const le=await(await fetch("/api/open-with-vscode",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({filePath:B,context:F})})).json();le.success?n.success(le.message):n.error(le.error||"用VSCode打开文件失败")}catch(ie){n.error(`用VSCode打开文件失败: ${ie.message}`)}}const x=f(!1),j=f({staged:!1,unstaged:!1,untracked:!1}),S=f(o.initialDirectory||"");async function q(){try{if(!S.value){const F=await(await fetch("/api/current_directory")).json();S.value=F.directory||"未知目录"}if(!i.isGitRepo)return;await i.fetchStatus(),await i.getBranchStatus(),n({message:"Git 状态已刷新",type:"success"})}catch(B){n({message:"刷新失败: "+B.message,type:"error"})}}async function se(B){try{await Ye.confirm(`确认解锁该文件?
|
|
5
5
|
${B}`,"确认解锁",{type:"warning",confirmButtonText:"解锁",cancelButtonText:"取消"}),await h.unlockFile(B)}catch{}}async function P(){if(h.lockedFiles.length)try{await Ye.confirm(`确认解锁所有已锁定文件?共 ${h.lockedFiles.length} 个。`,"清空全部锁定",{type:"warning",confirmButtonText:"全部解锁",cancelButtonText:"取消"});const B=[...h.lockedFiles];await Promise.all(B.map(F=>h.unlockFile(F))),await h.loadLockedFiles(),n.success("已清空所有文件锁定")}catch{}}async function ve(B){try{Z.value=!0,O.value=B,J.value=i.fileList.findIndex(ie=>ie.path===B);const F=i.fileList[J.value];if(F&&F.type==="untracked")try{const le=await(await fetch(`/api/file-content?file=${encodeURIComponent(B)}`)).json();le.success&&le.content?_.value=`diff --git a/${B} b/${B}
|
|
6
6
|
新文件: ${B}
|
|
7
7
|
--- /dev/null
|
|
@@ -12,15 +12,15 @@ ${B}`,"确认解锁",{type:"warning",confirmButtonText:"解锁",cancelButtonText
|
|
|
12
12
|
`).map(Se=>`+${Se}`).join(`
|
|
13
13
|
`):_.value=`这是一个新文件,尚未被Git跟踪。
|
|
14
14
|
添加到暂存区后可以提交该文件。`}catch(ie){console.error("获取未跟踪文件内容失败:",ie),_.value=`这是一个新文件,尚未被Git跟踪。
|
|
15
|
-
添加到暂存区后可以提交该文件。`}else if(F&&F.type==="added"){const le=await(await fetch(`/api/diff-cached?file=${encodeURIComponent(B)}`)).json();_.value=le.diff||"没有变更"}else{const le=await(await fetch(`/api/diff?file=${encodeURIComponent(B)}`)).json();_.value=le.diff||"没有变更"}}catch(F){n({message:"获取文件差异失败: "+F.message,type:"error"}),_.value="获取差异失败: "+F.message}finally{Z.value=!1}}function ee(B){if(R.value=!0,i.fileList.length>0){const F=i.fileList.find(ie=>ie.path===B.path)||i.fileList[0];ve(F.path)}}async function g(B){await i.addFileToStage(B)}async function z(B){await i.unstageFile(B)}async function A(){try{if(!i.isGitRepo)return;await i.fetchStatus(),await i.getBranchStatus(!0),n.success("Git 状态已刷新")}catch(B){n.error("刷新失败: "+B.message)}}async function ce(){try{await i.gitPull(),await q()}catch(B){console.error("拉取操作发生错误:",B)}}async function fe(){try{await i.gitFetchAll(),await q()}catch(B){console.error("获取远程分支信息操作发生错误:",B)}}async function me(B){try{await Ye.confirm(`确定要撤回文件 "${B}" 的所有修改吗?此操作无法撤销。`,"撤回修改",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"});const ie=await(await fetch("/api/revert_file",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({filePath:B})})).json();ie.success?(n.success("已撤回文件修改"),await q()):n.error(ie.error?`撤回失败: ${ie.error}`:"撤回文件修改失败,请重试")}catch(F){if(F==="cancel"||F.message==="cancel")return;const ie=F.message||"未知错误";ie!=="undefined"?n.error(`撤回文件修改失败: ${ie}`):n.error("撤回文件修改失败,请重试")}}function ge(B){const F=B.split("/");return F[F.length-1]}function oe(B){const F=B.split("/");return F.length<=1?"":F.slice(0,-1).join("/")}function te(B){const F=B.replace(/\\/g,"/");return h.lockedFiles.some(le=>{const Se=le.replace(/\\/g,"/");return F===Se})}async function ue(B){if(!N.value[B]){N.value[B]=!0;try{te(B)?await h.unlockFile(B):await h.lockFile(B)}finally{delete N.value[B]}}}function ke(B){j.value[B]=!j.value[B]}return ht(()=>{q(),h.loadConfig(),h.loadLockedFiles()}),Re(()=>i.autoUpdateEnabled,(B,F)=>{console.log(`自动更新状态变更: ${F} -> ${B}`),i.toggleAutoUpdate()},{immediate:!1}),w({refreshStatus:A}),(B,F)=>{const ie=$s,le=Me,Se=$e,Te=tt,Oe=Pt,we=is;return c(),b(Ce,null,[e("div",ba,[e("div",ka,[F[4]||(F[4]=e("h2",null,"Git 状态",-1)),e("div",$a,[t(le,{content:a(i).autoUpdateEnabled?"禁用自动更新文件状态":"启用自动更新文件状态",placement:"top","hide-after":1e3,"show-after":200},{default:s(()=>[t(ie,{modelValue:a(i).autoUpdateEnabled,"onUpdate:modelValue":F[0]||(F[0]=ne=>a(i).autoUpdateEnabled=ne),style:{"--el-switch-on-color":"#67C23A","--el-switch-off-color":"#909399","margin-right":"8px"},"inline-prompt":"","active-icon":a(ft),"inactive-icon":a(ls),class:"auto-update-switch"},null,8,["modelValue","active-icon","inactive-icon"])]),_:1},8,["content"]),t(le,{content:"Git Pull (拉取远程更新)",placement:"top","hide-after":1e3,"show-after":200},{default:s(()=>[t(Se,{type:"primary",icon:a(ss),circle:"",size:"small",onClick:ce,loading:a(i).isGitPulling,disabled:!a(i).hasUpstream},null,8,["icon","loading","disabled"])]),_:1}),t(le,{content:"Git Fetch All (获取所有远程分支)",placement:"top","hide-after":1e3,"show-after":200},{default:s(()=>[at(t(Se,{type:"primary",icon:a(vt),circle:"",size:"small",onClick:fe,loading:a(i).isGitFetching},null,8,["icon","loading"]),[[Bt,!1]])]),_:1}),a(h).lockedFiles.length>0?(c(),G(le,{key:0,content:"管理锁定文件",placement:"top","hide-after":1e3,"show-after":200},{default:s(()=>[t(Se,{type:"warning",circle:"",size:"small",onClick:F[1]||(F[1]=ne=>x.value=!0)},{default:s(()=>[t(Te,null,{default:s(()=>[t(a(xt))]),_:1})]),_:1})]),_:1})):U("",!0),t(le,{content:"刷新状态",placement:"top","hide-after":1e3,"show-after":200},{default:s(()=>[t(Se,{type:"primary",icon:a(uo),circle:"",size:"small",onClick:A,loading:u.value},null,8,["icon","loading"])]),_:1})])]),at((c(),b("div",{class:"card-content","element-loading-text":a(i).isGitPulling?"正在拉取代码...":"正在获取远程分支信息..."},[a(i).isGitRepo?(c(),b("div",Ta,[a(i).hasUpstream&&(a(i).branchAhead>0||a(i).branchBehind>0)?(c(),b("div",Va,[e("div",Fa,[e("div",La,[t(le,{content:"本地分支与远程分支的状态对比",placement:"top","show-after":200},{default:s(()=>[e("div",xa,[a(i).branchAhead>0?(c(),G(Oe,{key:0,size:"small",type:"warning",class:"status-badge"},{default:s(()=>[e("span",Ba,[t(Te,null,{default:s(()=>[t(a(Cs))]),_:1}),D(" 你的分支领先 'origin/"+M(a(i).currentBranch)+"' "+M(a(i).branchAhead)+" 个提交 ",1)])]),_:1})):U("",!0),a(i).branchBehind>0?(c(),G(Oe,{key:1,size:"small",type:"info",class:"status-badge"},{default:s(()=>[e("span",za,[t(Te,null,{default:s(()=>[t(a(Ht))]),_:1}),D(" 你的分支落后 'origin/"+M(a(i).currentBranch)+"' "+M(a(i).branchBehind)+" 个提交 ",1)])]),_:1})):U("",!0)])]),_:1})])])])):U("",!0),a(i).fileList.length?(c(),b("div",Pa,[t(Xt,{files:a(i).fileList.filter(ne=>ne.type==="added"),title:"已暂存的更改","group-key":"staged","collapsed-groups":j.value,"is-file-locked":te,"is-locking":y,"get-file-name":ge,"get-file-directory":oe,onToggleCollapse:ke,onFileClick:ee,onToggleFileLock:ue,onUnstageFile:z},null,8,["files","collapsed-groups"]),t(Xt,{files:a(i).fileList.filter(ne=>ne.type==="modified"||ne.type==="deleted"),title:"未暂存的更改","group-key":"unstaged","collapsed-groups":j.value,"is-file-locked":te,"is-locking":y,"get-file-name":ge,"get-file-directory":oe,onToggleCollapse:ke,onFileClick:ee,onToggleFileLock:ue,onStageFile:g,onRevertFileChanges:me},null,8,["files","collapsed-groups"]),t(Xt,{files:a(i).fileList.filter(ne=>ne.type==="untracked"),title:"未跟踪的文件","group-key":"untracked","collapsed-groups":j.value,"is-file-locked":te,"is-locking":y,"get-file-name":ge,"get-file-directory":oe,onToggleCollapse:ke,onFileClick:ee,onToggleFileLock:ue,onStageFile:g,onRevertFileChanges:me},null,8,["files","collapsed-groups"])])):a(i).isGitRepo?(c(),b("div",ja,[e("div",Oa,[t(Te,null,{default:s(()=>[t(a(Nt))]),_:1})]),F[6]||(F[6]=e("div",{class:"empty-text"},"没有检测到任何更改",-1)),F[7]||(F[7]=e("div",{class:"empty-subtext"},"工作区是干净的",-1))])):U("",!0)])):(c(),b("div",Sa,F[5]||(F[5]=[e("div",{class:"empty-status"},[e("p",null,"当前目录不是Git仓库")],-1)])))],8,Ca)),[[we,a(i).isGitPulling||a(i).isGitFetching]])]),t(Xe,{modelValue:R.value,"onUpdate:modelValue":F[2]||(F[2]=ne=>R.value=ne),title:"文件差异","custom-class":"file-diff-dialog",size:"extra-large",type:"flex","destroy-on-close":""},{default:s(()=>[t(cs,{files:Q.value,diffContent:_.value,selectedFile:O.value,context:"git-status",emptyText:"选择文件查看差异",onFileSelect:$,onOpenFile:H,onOpenWithVscode:X},null,8,["files","diffContent","selectedFile"])]),_:1},8,["modelValue"]),t(Xe,{modelValue:x.value,"onUpdate:modelValue":F[3]||(F[3]=ne=>x.value=ne),title:"锁定文件管理",size:"large","destroy-on-close":""},{default:s(()=>[e("div",Da,[e("div",Ma,[t(Te,{class:"description-icon"},{default:s(()=>[t(a(os))]),_:1}),F[8]||(F[8]=e("span",{class:"description-title"},"文件锁定功能说明",-1))]),F[9]||(F[9]=e("div",{class:"description-content"},[e("ul",null,[e("li",null,"锁定的文件在执行 Git 提交时会被自动跳过,不会被添加到暂存区")])],-1))]),a(h).lockedFiles.length===0?(c(),b("div",Ra,[e("div",Ga,[t(Te,null,{default:s(()=>[t(a(xt))]),_:1})]),F[10]||(F[10]=e("p",null,"当前没有锁定的文件",-1)),F[11]||(F[11]=e("p",{class:"empty-tip"},"您可以在文件列表中点击锁定按钮来锁定文件",-1))])):(c(),b("div",Aa,[e("div",Ua,[e("span",null,"🔒 已锁定 "+M(a(h).lockedFiles.length)+" 个文件",1),t(le,{content:"这些文件在提交时会被自动跳过",placement:"top"},{default:s(()=>[t(Te,{class:"info-icon"},{default:s(()=>[t(a(os))]),_:1})]),_:1}),F[13]||(F[13]=e("div",{style:{flex:"1"}},null,-1)),t(Se,{type:"danger",size:"small",plain:"",disabled:!a(h).lockedFiles.length,onClick:P},{default:s(()=>F[12]||(F[12]=[D(" 清空全部锁定 ")])),_:1},8,["disabled"])]),e("div",Ea,[(c(!0),b(Ce,null,Ge(a(h).lockedFiles,ne=>(c(),b("div",{key:ne,class:"locked-file-item"},[e("div",Ia,[F[14]||(F[14]=e("div",{class:"file-status-indicator locked"},null,-1)),e("div",Na,[e("span",Ha,M(ge(ne)),1),e("span",Ja,M(oe(ne)),1)])]),e("div",Wa,[t(le,{content:"解锁文件",placement:"top","hide-after":1e3},{default:s(()=>[t(Se,{type:"danger",size:"small",circle:"",class:"file-action-btn",icon:a(ks),"aria-label":"解锁",onClick:Be=>se(ne)},null,8,["icon","onClick"])]),_:2},1024)])]))),128))])]))]),_:1},8,["modelValue"])],64)}}}),Ya=Pe(qa,[["__scopeId","data-v-bc0c20d8"]]),Ka={class:"loading-container"},Qa={class:"loading-text"},Xa={key:0,class:"loading-progress"},Za=ze({__name:"GlobalLoading",props:{visible:{type:Boolean,default:!1},text:{default:"加载中..."},showProgress:{type:Boolean,default:!1},progress:{default:0},mock:{type:Boolean,default:!1}},setup(I){return(w,o)=>(c(),G(Ss,{to:"body"},[t(rs,{name:"loading-fade"},{default:s(()=>[w.visible||w.mock?(c(),b("div",{key:0,class:"global-loading-overlay",onClick:o[0]||(o[0]=zt(()=>{},["stop"]))},[e("div",Ka,[o[1]||(o[1]=e("div",{class:"loading-spinner"},[e("div",{class:"spinner-ring"}),e("div",{class:"spinner-ring"}),e("div",{class:"spinner-ring"})],-1)),e("div",Qa,M(w.text),1),w.showProgress||w.mock?(c(),b("div",Xa,[e("div",{class:pe(["progress-bar",{"is-mock":w.mock&&!w.showProgress}]),style:yt(w.showProgress?{width:w.progress+"%"}:void 0)},null,6)])):U("",!0)])])):U("",!0)]),_:1})]))}}),el=Pe(Za,[["__scopeId","data-v-bebd2774"]]),tl={class:"success-container"},sl={class:"success-text"},ol={key:0,class:"success-description"},al=ze({__name:"SuccessModal",props:{visible:{type:Boolean,default:!1},text:{default:"操作成功!"},description:{default:""}},setup(I){return(w,o)=>(c(),G(Ss,{to:"body"},[t(rs,{name:"success-fade"},{default:s(()=>[w.visible?(c(),b("div",{key:0,class:"success-overlay",onClick:o[0]||(o[0]=zt(()=>{},["stop"]))},[e("div",tl,[o[1]||(o[1]=e("div",{class:"success-icon"},[e("svg",{viewBox:"0 0 52 52",class:"success-svg"},[e("circle",{class:"success-circle",cx:"26",cy:"26",r:"25",fill:"none"}),e("path",{class:"success-check",fill:"none",d:"m14.1 27.2l7.1 7.2 16.7-16.8"})])],-1)),e("div",sl,M(w.text),1),w.description?(c(),b("div",ol,M(w.description),1)):U("",!0)])])):U("",!0)]),_:1})]))}}),ll=Pe(al,[["__scopeId","data-v-c4fd7ba0"]]),et=Ts({visible:!1,text:"加载中...",showProgress:!1,progress:0});function nl(){return{loadingState:et,show:u=>{et.visible=!0,et.text=(u==null?void 0:u.text)||"加载中...",et.showProgress=(u==null?void 0:u.showProgress)||!1,et.progress=(u==null?void 0:u.progress)||0},hide:()=>{et.visible=!1},updateProgress:u=>{et.progress=Math.max(0,Math.min(100,u))},updateText:u=>{et.text=u},setText:u=>{et.visible&&(et.text=u)}}}const St=Ts({visible:!1,text:"操作成功!",description:""});function il(){const I=o=>{St.visible=!0,St.text=(o==null?void 0:o.text)||"操作成功!",St.description=(o==null?void 0:o.description)||"";const i=(o==null?void 0:o.duration)||2e3;setTimeout(()=>{w()},i)},w=()=>{St.visible=!1};return{successState:St,show:I,hide:w}}const rl={class:"template-form"},cl={class:"template-form-buttons"},ul={key:0,class:"template-list"},dl={key:1,class:"template-list-scroll"},fl={class:"template-content"},pl={class:"template-actions"},ml={key:1,class:"templates-container"},vl={class:"message-templates-list"},gl={class:"templates-scroll-area"},hl={class:"template-content"},yl={class:"template-actions"},_l={key:0,class:"current-default-message"},wl={class:"default-message-content"},bl={key:2,class:"message-help-text"},kl=ze({__name:"TemplateManager",props:{visible:{type:Boolean},type:{},title:{},placeholder:{default:"输入新模板内容"},editPlaceholder:{default:"编辑模板内容"},emptyDescription:{default:"暂无保存的模板"},showDefaultSection:{type:Boolean,default:!1},showHelpText:{type:Boolean,default:!1}},emits:["update:visible","use-template","set-default"],setup(I,{expose:w,emit:o}){const i=I,h=o,u=rt(),O=f(""),_=f(!1),R=f(""),Z=f(-1),J=f(!1),N=f(!1),y=E(()=>{switch(i.type){case"description":return u.descriptionTemplates||[];case"scope":return u.scopeTemplates||[];case"message":return u.messageTemplates||[];default:return[]}}),Q=E(()=>i.type==="message"?u.defaultCommitMessage:""),$=E(()=>_.value?i.editPlaceholder:i.placeholder),H=E(()=>_.value?"更新模板":"添加模板"),X=E({get:()=>i.visible,set:ee=>h("update:visible",ee)});Re(X,ee=>{ee||x()});function x(){O.value="",_.value=!1,R.value="",Z.value=-1}async function j(){if(!O.value.trim()){n.warning("模板内容不能为空");return}try{J.value=!0,_.value?await u.updateTemplate(R.value,O.value,i.type)&&x():await u.saveTemplate(O.value,i.type)&&(O.value="")}catch(ee){n.error(`模板保存失败: ${ee.message}`)}finally{J.value=!1}}function S(ee){h("use-template",ee),i.type!=="message"&&(X.value=!1)}function q(ee,g){_.value=!0,R.value=ee,O.value=ee,Z.value=g}function se(){x()}async function P(ee){try{const g=await u.deleteTemplate(ee,i.type)}catch(g){n.error(`模板删除失败: ${g.message}`)}}async function ve(){if(!(i.type!=="message"||!O.value.trim()))try{N.value=!0,await u.saveDefaultMessage(O.value)&&h("set-default",O.value)}catch(ee){n.error(`设置默认提交信息失败: ${ee.message}`)}finally{N.value=!1}}return w({resetForm:x}),(ee,g)=>{const z=Jt,A=$e,ce=Lt,fe=po,me=Vs,ge=Pt,oe=as;return c(),G(oe,{modelValue:X.value,"onUpdate:modelValue":g[1]||(g[1]=te=>X.value=te),title:ee.title,width:"80vw",top:"70px",style:{height:"calc(100vh - 140px)"},"close-on-click-modal":!1,class:pe(ee.type==="message"?"message-template-dialog":"template-dialog")},{default:s(()=>[e("div",{class:pe(["template-container",{"message-template-container":ee.type==="message"}])},[e("div",rl,[t(z,{modelValue:O.value,"onUpdate:modelValue":g[0]||(g[0]=te=>O.value=te),placeholder:$.value,class:"template-input",clearable:"",onKeyup:fo(j,["enter"])},null,8,["modelValue","placeholder"]),e("div",cl,[_.value?(c(),G(A,{key:0,onClick:se},{default:s(()=>g[2]||(g[2]=[D("取消")])),_:1})):U("",!0),t(A,{type:"primary",onClick:j,disabled:!O.value.trim()||J.value,loading:J.value},{default:s(()=>[D(M(H.value),1)]),_:1},8,["disabled","loading"]),ee.type==="message"?(c(),G(A,{key:1,type:"success",onClick:ve,disabled:!O.value.trim()||N.value,loading:N.value,plain:""},{default:s(()=>g[3]||(g[3]=[D(" 设为默认提交信息 ")])),_:1},8,["disabled","loading"])):U("",!0)])]),ee.type!=="message"?(c(),b("div",ul,[e("h3",null,"已保存"+M(ee.type==="description"?"模板":"作用域"),1),y.value.length===0?(c(),G(ce,{key:0,description:ee.emptyDescription},null,8,["description"])):(c(),b("div",dl,[(c(!0),b(Ce,null,Ge(y.value,(te,ue)=>(c(),G(me,{key:ue,class:"template-item"},{default:s(()=>[t(fe,{justify:"space-between",align:"middle",style:{width:"100%"}},{default:s(()=>[e("div",fl,M(te),1),e("div",pl,[t(A,{type:"primary",size:"small",onClick:ke=>S(te)},{default:s(()=>g[4]||(g[4]=[D("使用")])),_:2},1032,["onClick"]),t(A,{type:"warning",size:"small",icon:a(dt),onClick:ke=>q(te,ue)},{default:s(()=>g[5]||(g[5]=[D(" 编辑 ")])),_:2},1032,["icon","onClick"]),t(A,{type:"danger",size:"small",onClick:ke=>P(te)},{default:s(()=>g[6]||(g[6]=[D("删除")])),_:2},1032,["onClick"])])]),_:2},1024)]),_:2},1024))),128))]))])):(c(),b("div",ml,[e("div",vl,[g[10]||(g[10]=e("h3",null,"已保存模板",-1)),e("div",gl,[y.value.length===0?(c(),G(ce,{key:0,description:ee.emptyDescription},null,8,["description"])):U("",!0),(c(!0),b(Ce,null,Ge(y.value,(te,ue)=>(c(),G(me,{key:ue,class:"template-item"},{default:s(()=>[t(fe,{justify:"space-between",align:"middle",style:{width:"100%"}},{default:s(()=>[e("div",hl,M(te),1),e("div",yl,[t(A,{type:"primary",size:"small",onClick:ke=>S(te)},{default:s(()=>g[7]||(g[7]=[D("使用")])),_:2},1032,["onClick"]),t(A,{type:"warning",size:"small",icon:a(dt),onClick:ke=>q(te,ue)},{default:s(()=>g[8]||(g[8]=[D(" 编辑 ")])),_:2},1032,["icon","onClick"]),t(A,{type:"danger",size:"small",onClick:ke=>P(te)},{default:s(()=>g[9]||(g[9]=[D("删除")])),_:2},1032,["onClick"])])]),_:2},1024)]),_:2},1024))),128))])]),ee.showDefaultSection?(c(),b("div",_l,[g[18]||(g[18]=e("h3",null,"当前默认提交信息",-1)),Q.value?(c(),G(me,{key:0,class:"default-message-card"},{default:s(()=>[e("div",wl,M(Q.value),1)]),_:1})):(c(),G(ce,{key:1,description:"尚未设置默认提交信息","image-size":100})),ee.showHelpText?(c(),b("div",bl,[g[16]||(g[16]=e("h4",null,"关于默认提交信息",-1)),g[17]||(g[17]=e("p",null,"默认提交信息将在未输入提交信息时自动使用。",-1)),e("p",null,[g[13]||(g[13]=D("你可以通过点击左侧模板的")),t(ge,{size:"small",type:"primary"},{default:s(()=>g[11]||(g[11]=[D("使用")])),_:1}),g[14]||(g[14]=D("按钮先选择喜欢的模板,然后点击上方")),t(ge,{size:"small",type:"success"},{default:s(()=>g[12]||(g[12]=[D("设为默认提交信息")])),_:1}),g[15]||(g[15]=D("按钮保存。"))])])):U("",!0)])):U("",!0)]))],2)]),_:1},8,["modelValue","title","class"])}}}),Zt=Pe(kl,[["__scopeId","data-v-820b568b"]]),$l={class:"git-command-preview"},Cl={class:"preview-container"},Sl={class:"preview-title"},Tl={class:"preview-content code-command"},Vl=ze({__name:"GitCommandPreview",props:{command:{},title:{default:"Git命令预览:"},copyButtonText:{default:"复制命令"},placeholder:{default:"<命令内容>"}},setup(I){const w=I,o=E(()=>w.command||w.placeholder);async function i(){if(!w.command){n.warning("没有可复制的命令内容");return}try{await navigator.clipboard.writeText(w.command),n.success("命令已复制到剪贴板")}catch(h){n.error(`复制失败: ${h.message}`)}}return(h,u)=>{const O=tt,_=Me;return c(),b("div",$l,[e("div",Cl,[e("div",Sl,M(h.title),1),e("div",Tl,M(o.value),1),t(_,{content:h.copyButtonText,placement:"bottom",effect:"dark","open-delay":300},{default:s(()=>[e("button",{class:"modern-btn copy-command-btn",onClick:i},[t(O,{class:"btn-icon"},{default:s(()=>[t(a(gt))]),_:1})])]),_:1},8,["content"])])])}}}),Fl=Pe(Vl,[["__scopeId","data-v-9066ce64"]]),Ll={class:"one-push-content"},xl={class:"one-push-text"},Bl={key:0,class:"one-push-desc"},zl=ze({__name:"QuickPushButton",props:{from:{default:"form"},hasUserCommitMessage:{type:Boolean,default:!1},finalCommitMessage:{default:""},skipHooks:{type:Boolean,default:!1}},emits:["beforePush","afterPush","clearFields"],setup(I,{emit:w}){const o=st(),i=rt(),h=I,u=w;function O(y){const Q=y.replace(/\\/g,"/");return i.lockedFiles.some($=>{const H=$.replace(/\\/g,"/");return Q===H})}const _=E(()=>o.fileList.some(y=>!O(y.path))),R=E(()=>!_.value||!h.hasUserCommitMessage||!o.hasUpstream),Z=E(()=>o.isAddingFiles||o.isCommiting||o.isPushing),J=E(()=>_.value?h.hasUserCommitMessage?o.hasUpstream?"一键完成:暂存所有更改 → 提交 → 推送到远程仓库":"当前分支没有上游分支":"请输入提交信息":"没有需要提交的更改");async function N(){u("beforePush");try{const y=await o.addCommitAndPush(h.finalCommitMessage,h.skipHooks);y&&u("clearFields"),u("afterPush",y)}catch(y){console.error("一键推送失败:",y),u("afterPush",!1)}}return(y,Q)=>{const $=tt,H=$e;return c(),G(a(Me),{content:J.value,placement:"top","show-after":200},{default:s(()=>[t(H,{type:"success",onClick:N,loading:Z.value,disabled:R.value,class:pe([y.from,"one-push-button"])},{default:s(()=>[e("div",Ll,[t($,{class:"one-push-icon"},{default:s(()=>[t(a(mo))]),_:1}),e("div",xl,[Q[0]||(Q[0]=e("span",{class:"one-push-title"},"一键推送所有",-1)),y.from==="form"?(c(),b("span",Bl,"暂存 + 提交 + 推送")):U("",!0)])])]),_:1},8,["loading","disabled","class"])]),_:1},8,["content"])}}}),js=Pe(zl,[["__scopeId","data-v-58e155b2"]]),Pl={key:0},jl=ze({__name:"StageButton",props:{from:{default:"form"}},emits:["click"],setup(I,{emit:w}){const o=w,i=st(),h=rt();function u(y){const Q=y.replace(/\\/g,"/");return h.lockedFiles.some($=>{const H=$.replace(/\\/g,"/");return Q===H})}function O(){return h.lockedFiles.length===0?!1:i.fileList.some(y=>["modified","deleted","untracked"].includes(y.type)?u(y.path):!1)}const _=E(()=>i.fileList.filter(y=>["modified","deleted","untracked"].includes(y.type)&&!u(y.path)).length),R=E(()=>i.fileList.some(y=>["modified","deleted","untracked"].includes(y.type)&&!u(y.path))),Z=E(()=>!R.value),J=E(()=>R.value?O()?`暂存${_.value}个未暂存文件(逐个添加)`:"暂存所有更改(git add .)":"没有需要暂存的更改");async function N(){o("click");try{let y;O()?y=await i.addToStage():y=await i.addAllToStage(),y&&i.fetchStatus()}catch(y){console.error("添加文件失败:",y)}}return(y,Q)=>{const $=$e,H=Me;return c(),G(H,{content:J.value,placement:"top"},{default:s(()=>[t($,{type:"primary",onClick:N,loading:a(i).isAddingFiles,disabled:Z.value,class:pe(["stage-button",`from-${y.from}`])},{default:s(()=>[Q[0]||(Q[0]=D(" 暂存更改 ")),_.value>0?(c(),b("span",Pl,"("+M(_.value)+")",1)):U("",!0)]),_:1},8,["loading","disabled","class"])]),_:1},8,["content"])}}}),Os=Pe(jl,[["__scopeId","data-v-01b0a8bc"]]),Ol={key:0},Dl=ze({__name:"CommitButton",props:{from:{default:"form"},hasUserCommitMessage:{type:Boolean,default:!1},finalCommitMessage:{default:""},skipHooks:{type:Boolean,default:!1}},emits:["click","beforeCommit","afterCommit"],setup(I,{emit:w}){const o=I,i=w,h=st(),u=rt();function O(y){const Q=y.replace(/\\/g,"/");return u.lockedFiles.some($=>{const H=$.replace(/\\/g,"/");return Q===H})}const _=E(()=>h.fileList.filter(y=>y.type==="added"&&!O(y.path)).length),R=E(()=>_.value>0),Z=E(()=>!R.value||!o.hasUserCommitMessage),J=E(()=>R.value?o.hasUserCommitMessage?`提交${_.value}个已暂存文件`:"请输入提交信息":"没有已暂存的更改");async function N(){if(o.finalCommitMessage.trim()){i("beforeCommit"),i("click");try{const y=await h.commitChanges(o.finalCommitMessage,o.skipHooks);y&&(h.fetchStatus(),h.fetchLog(),h.getBranchStatus(!0)),i("afterCommit",y)}catch(y){console.error("提交失败:",y),i("afterCommit",!1)}}}return(y,Q)=>{const $=$e,H=Me;return c(),G(H,{content:J.value,placement:"top"},{default:s(()=>[t($,{type:"primary",onClick:N,loading:a(h).isLoadingStatus,disabled:Z.value,class:pe(["commit-button",`from-${y.from}`])},{default:s(()=>[Q[0]||(Q[0]=D(" 提交 ")),_.value>0?(c(),b("span",Ol,"("+M(_.value)+")",1)):U("",!0)]),_:1},8,["loading","disabled","class"])]),_:1},8,["content"])}}}),Ds=Pe(Dl,[["__scopeId","data-v-d171a315"]]),Ml={key:0},Rl=ze({__name:"PushButton",props:{from:{default:"form"}},emits:["click","beforePush","afterPush"],setup(I,{emit:w}){const o=w,i=st(),h=E(()=>i.branchAhead>0),u=E(()=>i.fileList.some(N=>N.type==="added")),O=E(()=>i.hasUpstream&&h.value&&!u.value),_=E(()=>!O.value),R=E(()=>i.hasUpstream?h.value?u.value?"有未提交的暂存更改,请先提交":`推送${i.branchAhead}个本地提交`:"没有需要推送的提交":"当前分支没有上游分支"),Z=E(()=>O.value?{backgroundColor:"#67c23a",borderColor:"#67c23a"}:{});async function J(){o("beforePush"),o("click");try{const N=await i.pushToRemote();N&&await new Promise(y=>setTimeout(y,200)),o("afterPush",N)}catch(N){console.error("推送失败:",N),o("afterPush",!1)}}return(N,y)=>{const Q=$e,$=Me;return c(),G($,{content:R.value,placement:"top"},{default:s(()=>[t(Q,{type:"primary",icon:a(vo),onClick:J,loading:a(i).isPushing,disabled:_.value,style:yt(Z.value),class:pe(["push-button",`from-${N.from}`])},{default:s(()=>[y[0]||(y[0]=D(" 推送 ")),h.value?(c(),b("span",Ml,"("+M(a(i).branchAhead)+")",1)):U("",!0)]),_:1},8,["icon","loading","disabled","style","class"])]),_:1},8,["content"])}}}),Ms=Pe(Rl,[["__scopeId","data-v-1c347c7f"]]),Gl={class:"form-bottom-actions"},Al={class:"actions-flex-container"},Ul={class:"left-actions"},El={class:"button-grid"},Il={class:"right-actions"},Nl=ze({__name:"GitActionButtons",props:{hasUserCommitMessage:{type:Boolean,default:!1},finalCommitMessage:{default:""},skipHooks:{type:Boolean,default:!1},from:{default:"form"}},emits:["afterCommit","afterPush","beforePush","clearFields"],setup(I,{emit:w}){const o=w;function i(_){o("afterCommit",_)}function h(_){o("afterPush",_)}function u(){o("beforePush")}function O(){o("clearFields")}return(_,R)=>(c(),b("div",Gl,[e("div",Al,[e("div",Ul,[e("div",El,[t(Os,{onClick:()=>{},from:_.from},null,8,["from"]),t(Ds,{"has-user-commit-message":_.hasUserCommitMessage,"final-commit-message":_.finalCommitMessage,"skip-hooks":_.skipHooks,onBeforeCommit:()=>{},onAfterCommit:i,onClick:()=>{},from:_.from},null,8,["has-user-commit-message","final-commit-message","skip-hooks","from"]),t(Ms,{onBeforePush:()=>{},onAfterPush:h,onClick:()=>{},from:_.from},null,8,["from"])])]),e("div",Il,[t(js,{from:_.from,"has-user-commit-message":_.hasUserCommitMessage,"final-commit-message":_.finalCommitMessage,"skip-hooks":_.skipHooks,onBeforePush:u,onAfterPush:h,onClearFields:O},null,8,["from","has-user-commit-message","final-commit-message","skip-hooks"])])])]))}}),Hl=Pe(Nl,[["__scopeId","data-v-6cf9ea2c"]]),Jl={class:"option-header"},Wl={class:"option-info"},ql={class:"option-title"},Yl=ze({__name:"OptionSwitchCard",props:{modelValue:{type:Boolean},title:{},tooltip:{},activeText:{},inactiveText:{},activeColor:{},iconClass:{},compact:{type:Boolean}},emits:["update:modelValue"],setup(I,{emit:w}){const o=I,i=w;function h(u){i("update:modelValue",u)}return(u,O)=>{const _=$s,R=Me;return c(),b("div",{class:pe(["option-card",{compact:o.compact}])},[t(R,{content:u.tooltip,placement:"top","hide-after":1e3,"show-after":200},{default:s(()=>[e("div",Jl,[e("div",{class:pe(["option-icon",u.iconClass])},[ut(u.$slots,"icon",{},void 0,!0)],2),e("div",Wl,[e("h4",ql,M(u.title),1)]),t(_,{class:"option-switch","model-value":u.modelValue,"onUpdate:modelValue":h,"active-text":u.activeText,"inactive-text":u.inactiveText,"active-color":u.activeColor,size:"small"},null,8,["model-value","active-text","inactive-text","active-color"])])]),_:3},8,["content"])],2)}}}),es=Pe(Yl,[["__scopeId","data-v-3391f069"]]),Kl={class:"card-header app-card-header"},Ql={key:0,class:"header-switches"},Xl={key:1,class:"header-actions"},Zl={class:"card-content app-card-content"},en={class:"layout-container"},tn={key:0,class:"git-config-warning"},sn={key:1,class:"commit-section"},on={key:0,class:"commit-form"},an={class:"description-container"},ln={key:1,class:"standard-commit-form"},nn={class:"standard-commit-header"},rn={class:"type-scope-container"},cn={class:"scope-wrapper"},un={class:"description-container description-inline"},dn={class:"advanced-fields"},fn={class:"actions-section"},pn={class:"action-groups"},mn={class:"operations-wrapper"},vn={class:"action-group"},gn={class:"group-buttons"},hn={key:0},yn={class:"action-group"},_n={class:"group-buttons"},wn={class:"action-group reset-group"},bn={class:"group-buttons"},kn={key:0},$n={class:"action-group branch-group"},Cn={class:"group-buttons"},Sn={class:"action-group"},Tn={class:"group-buttons"},Vn={class:"editor-header"},Fn={class:"editor-info"},Ln={class:"editor-tips"},xn={class:"json-editor-wrapper"},Bn={class:"editor-footer"},zn={class:"footer-left"},Pn={class:"footer-right"},jn={class:"config-warning-content"},On={class:"warning-message"},Dn={class:"dialog-footer"},Mn={class:"stash-dialog-content"},Rn={class:"stash-info-card"},Gn={class:"info-icon"},An={class:"stash-options"},Un={class:"options-title"},En={class:"option-item"},In={class:"option-item"},Nn={key:0,class:"stash-preview"},Hn={class:"preview-title"},Jn={class:"file-count-info"},Wn={class:"merge-dialog-content"},qn={class:"merge-intro"},Yn={class:"merge-options"},Kn={class:"dialog-footer"},Qn={class:"stash-list-content"},Xn={key:0,class:"stash-header"},Zn={class:"stash-stats"},ei={class:"stat-item"},ti={class:"stat-number"},si={key:0,class:"stash-actions-header"},oi={class:"stash-list-container"},ai={key:0,class:"empty-state"},li={key:1,class:"stash-cards"},ni={class:"stash-card-content"},ii={class:"stash-info"},ri={class:"stash-main-info"},ci={class:"stash-id-badge"},ui={class:"stash-id-text"},di={class:"stash-description"},fi={class:"description-text"},pi={class:"stash-card-actions"},mi={class:"stash-content"},vi={key:0,class:"stash-info-row"},gi={class:"stash-id"},hi={class:"stash-id-value"},yi={class:"stash-description"},_i={class:"stash-description-value"},wi={class:"stash-main-content"},bi={key:0,class:"status-updating-indicator"},ki=ze({__name:"CommitForm",setup(I,{expose:w}){const o=st(),i=rt(),h=f(""),{loadingState:u,show:O,hide:_,setText:R}=nl(),{successState:Z,show:J}=il(),N=f(!1),y=f("输入提交信息..."),Q=f(""),$=f(!1),H=f("feat"),X=f(""),x=f(""),j=f(""),S=f(""),q=f(!1),se=f(""),P=f(!1),ve=f(!1),ee=f(""),g=f([]),z=f(!1),A=f(!1),ce=f(""),fe=f({noFf:!1,squash:!1,noCommit:!1,message:""}),me=f([]),ge=f(!1),oe=f(!1),te=f(!1),ue=f(!1),ke=f(!1),B=[{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: 构建/工具修改"}],F=f(!1),ie=f(!1),le=f(""),Se=f(!1),Te=f(!0),Oe=f(!1),we=f(null),ne=f([]),Be=f(""),De=f(!1),Ze=f("");function lt(){le.value="",Se.value=!1,Te.value=!Wt.value,F.value=!0}async function Ke(){try{const l=await(await fetch("/api/config/check-file-format")).json();let W="";l.success&&(l.exists?l.isValidJson||(W=`系统配置文件格式有误:${l.error}
|
|
15
|
+
添加到暂存区后可以提交该文件。`}else if(F&&F.type==="added"){const le=await(await fetch(`/api/diff-cached?file=${encodeURIComponent(B)}`)).json();_.value=le.diff||"没有变更"}else{const le=await(await fetch(`/api/diff?file=${encodeURIComponent(B)}`)).json();_.value=le.diff||"没有变更"}}catch(F){n({message:"获取文件差异失败: "+F.message,type:"error"}),_.value="获取差异失败: "+F.message}finally{Z.value=!1}}function ee(B){if(R.value=!0,i.fileList.length>0){const F=i.fileList.find(ie=>ie.path===B.path)||i.fileList[0];ve(F.path)}}async function g(B){await i.addFileToStage(B)}async function z(B){await i.unstageFile(B)}async function A(){try{if(!i.isGitRepo)return;await i.fetchStatus(),await i.getBranchStatus(!0),n.success("Git 状态已刷新")}catch(B){n.error("刷新失败: "+B.message)}}async function ce(){try{await i.gitPull(),await q()}catch(B){console.error("拉取操作发生错误:",B)}}async function fe(){try{await i.gitFetchAll(),await q()}catch(B){console.error("获取远程分支信息操作发生错误:",B)}}async function me(B){try{await Ye.confirm(`确定要撤回文件 "${B}" 的所有修改吗?此操作无法撤销。`,"撤回修改",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"});const ie=await(await fetch("/api/revert_file",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({filePath:B})})).json();ie.success?(n.success("已撤回文件修改"),await q()):n.error(ie.error?`撤回失败: ${ie.error}`:"撤回文件修改失败,请重试")}catch(F){if(F==="cancel"||F.message==="cancel")return;const ie=F.message||"未知错误";ie!=="undefined"?n.error(`撤回文件修改失败: ${ie}`):n.error("撤回文件修改失败,请重试")}}function ge(B){const F=B.split("/");return F[F.length-1]}function oe(B){const F=B.split("/");return F.length<=1?"":F.slice(0,-1).join("/")}function te(B){const F=B.replace(/\\/g,"/");return h.lockedFiles.some(le=>{const Se=le.replace(/\\/g,"/");return F===Se})}async function ue(B){if(!N.value[B]){N.value[B]=!0;try{te(B)?await h.unlockFile(B):await h.lockFile(B)}finally{delete N.value[B]}}}function ke(B){j.value[B]=!j.value[B]}return ht(()=>{q(),h.loadConfig(),h.loadLockedFiles()}),Re(()=>i.autoUpdateEnabled,(B,F)=>{console.log(`自动更新状态变更: ${F} -> ${B}`),i.toggleAutoUpdate()},{immediate:!1}),w({refreshStatus:A}),(B,F)=>{const ie=$s,le=Me,Se=$e,Te=tt,Oe=Pt,we=is;return c(),b(Ce,null,[e("div",ba,[e("div",ka,[F[4]||(F[4]=e("h2",null,"Git 状态",-1)),e("div",$a,[t(le,{content:a(i).autoUpdateEnabled?"禁用自动更新文件状态":"启用自动更新文件状态",placement:"top","hide-after":1e3,"show-after":200},{default:s(()=>[t(ie,{modelValue:a(i).autoUpdateEnabled,"onUpdate:modelValue":F[0]||(F[0]=ne=>a(i).autoUpdateEnabled=ne),style:{"--el-switch-on-color":"#67C23A","--el-switch-off-color":"#909399","margin-right":"8px"},"inline-prompt":"","active-icon":a(ft),"inactive-icon":a(ls),class:"auto-update-switch"},null,8,["modelValue","active-icon","inactive-icon"])]),_:1},8,["content"]),t(le,{content:"Git Pull (拉取远程更新)",placement:"top","hide-after":1e3,"show-after":200},{default:s(()=>[t(Se,{type:"primary",icon:a(ss),circle:"",size:"small",onClick:ce,loading:a(i).isGitPulling,disabled:!a(i).hasUpstream},null,8,["icon","loading","disabled"])]),_:1}),t(le,{content:"Git Fetch All (获取所有远程分支)",placement:"top","hide-after":1e3,"show-after":200},{default:s(()=>[at(t(Se,{type:"primary",icon:a(vt),circle:"",size:"small",onClick:fe,loading:a(i).isGitFetching},null,8,["icon","loading"]),[[Bt,!1]])]),_:1}),a(h).lockedFiles.length>0?(c(),G(le,{key:0,content:"管理锁定文件",placement:"top","hide-after":1e3,"show-after":200},{default:s(()=>[t(Se,{type:"warning",circle:"",size:"small",onClick:F[1]||(F[1]=ne=>x.value=!0)},{default:s(()=>[t(Te,null,{default:s(()=>[t(a(xt))]),_:1})]),_:1})]),_:1})):U("",!0),t(le,{content:"刷新状态",placement:"top","hide-after":1e3,"show-after":200},{default:s(()=>[t(Se,{type:"primary",icon:a(uo),circle:"",size:"small",onClick:A,loading:u.value},null,8,["icon","loading"])]),_:1})])]),at((c(),b("div",{class:"card-content","element-loading-text":a(i).isGitPulling?"正在拉取代码...":"正在获取远程分支信息..."},[a(i).isGitRepo?(c(),b("div",Ta,[a(i).hasUpstream&&(a(i).branchAhead>0||a(i).branchBehind>0)?(c(),b("div",Va,[e("div",Fa,[e("div",La,[t(le,{content:"本地分支与远程分支的状态对比",placement:"top","show-after":200},{default:s(()=>[e("div",xa,[a(i).branchAhead>0?(c(),G(Oe,{key:0,size:"small",type:"warning",class:"status-badge"},{default:s(()=>[e("span",Ba,[t(Te,null,{default:s(()=>[t(a(Cs))]),_:1}),D(" 你的分支领先 'origin/"+M(a(i).currentBranch)+"' "+M(a(i).branchAhead)+" 个提交 ",1)])]),_:1})):U("",!0),a(i).branchBehind>0?(c(),G(Oe,{key:1,size:"small",type:"info",class:"status-badge"},{default:s(()=>[e("span",za,[t(Te,null,{default:s(()=>[t(a(Ht))]),_:1}),D(" 你的分支落后 'origin/"+M(a(i).currentBranch)+"' "+M(a(i).branchBehind)+" 个提交 ",1)])]),_:1})):U("",!0)])]),_:1})])])])):U("",!0),a(i).fileList.length?(c(),b("div",Pa,[t(Xt,{files:a(i).fileList.filter(ne=>ne.type==="added"),title:"已暂存的更改","group-key":"staged","collapsed-groups":j.value,"is-file-locked":te,"is-locking":y,"get-file-name":ge,"get-file-directory":oe,onToggleCollapse:ke,onFileClick:ee,onToggleFileLock:ue,onUnstageFile:z},null,8,["files","collapsed-groups"]),t(Xt,{files:a(i).fileList.filter(ne=>ne.type==="modified"||ne.type==="deleted"),title:"未暂存的更改","group-key":"unstaged","collapsed-groups":j.value,"is-file-locked":te,"is-locking":y,"get-file-name":ge,"get-file-directory":oe,onToggleCollapse:ke,onFileClick:ee,onToggleFileLock:ue,onStageFile:g,onRevertFileChanges:me},null,8,["files","collapsed-groups"]),t(Xt,{files:a(i).fileList.filter(ne=>ne.type==="untracked"),title:"未跟踪的文件","group-key":"untracked","collapsed-groups":j.value,"is-file-locked":te,"is-locking":y,"get-file-name":ge,"get-file-directory":oe,onToggleCollapse:ke,onFileClick:ee,onToggleFileLock:ue,onStageFile:g,onRevertFileChanges:me},null,8,["files","collapsed-groups"])])):a(i).isGitRepo?(c(),b("div",ja,[e("div",Oa,[t(Te,null,{default:s(()=>[t(a(Nt))]),_:1})]),F[6]||(F[6]=e("div",{class:"empty-text"},"没有检测到任何更改",-1)),F[7]||(F[7]=e("div",{class:"empty-subtext"},"工作区是干净的",-1))])):U("",!0)])):(c(),b("div",Sa,F[5]||(F[5]=[e("div",{class:"empty-status"},[e("p",null,"当前目录不是Git仓库")],-1)])))],8,Ca)),[[we,a(i).isGitPulling||a(i).isGitFetching]])]),t(Xe,{modelValue:R.value,"onUpdate:modelValue":F[2]||(F[2]=ne=>R.value=ne),title:"文件差异","custom-class":"file-diff-dialog",size:"extra-large",type:"flex","destroy-on-close":""},{default:s(()=>[t(cs,{files:Q.value,diffContent:_.value,selectedFile:O.value,context:"git-status",emptyText:"选择文件查看差异",onFileSelect:$,onOpenFile:H,onOpenWithVscode:X},null,8,["files","diffContent","selectedFile"])]),_:1},8,["modelValue"]),t(Xe,{modelValue:x.value,"onUpdate:modelValue":F[3]||(F[3]=ne=>x.value=ne),title:"锁定文件管理",size:"large","destroy-on-close":""},{default:s(()=>[e("div",Da,[e("div",Ma,[t(Te,{class:"description-icon"},{default:s(()=>[t(a(os))]),_:1}),F[8]||(F[8]=e("span",{class:"description-title"},"文件锁定功能说明",-1))]),F[9]||(F[9]=e("div",{class:"description-content"},[e("ul",null,[e("li",null,"锁定的文件在执行 Git 提交时会被自动跳过,不会被添加到暂存区")])],-1))]),a(h).lockedFiles.length===0?(c(),b("div",Ra,[e("div",Ga,[t(Te,null,{default:s(()=>[t(a(xt))]),_:1})]),F[10]||(F[10]=e("p",null,"当前没有锁定的文件",-1)),F[11]||(F[11]=e("p",{class:"empty-tip"},"您可以在文件列表中点击锁定按钮来锁定文件",-1))])):(c(),b("div",Aa,[e("div",Ua,[e("span",null,"🔒 已锁定 "+M(a(h).lockedFiles.length)+" 个文件",1),t(le,{content:"这些文件在提交时会被自动跳过",placement:"top"},{default:s(()=>[t(Te,{class:"info-icon"},{default:s(()=>[t(a(os))]),_:1})]),_:1}),F[13]||(F[13]=e("div",{style:{flex:"1"}},null,-1)),t(Se,{type:"danger",size:"small",plain:"",disabled:!a(h).lockedFiles.length,onClick:P},{default:s(()=>F[12]||(F[12]=[D(" 清空全部锁定 ")])),_:1},8,["disabled"])]),e("div",Ea,[(c(!0),b(Ce,null,Ge(a(h).lockedFiles,ne=>(c(),b("div",{key:ne,class:"locked-file-item"},[e("div",Ia,[F[14]||(F[14]=e("div",{class:"file-status-indicator locked"},null,-1)),e("div",Na,[e("span",Ha,M(ge(ne)),1),e("span",Ja,M(oe(ne)),1)])]),e("div",Wa,[t(le,{content:"解锁文件",placement:"top","hide-after":1e3},{default:s(()=>[t(Se,{type:"danger",size:"small",circle:"",class:"file-action-btn",icon:a(ks),"aria-label":"解锁",onClick:Be=>se(ne)},null,8,["icon","onClick"])]),_:2},1024)])]))),128))])]))]),_:1},8,["modelValue"])],64)}}}),Ya=Pe(qa,[["__scopeId","data-v-e0b5d9de"]]),Ka={class:"loading-container"},Qa={class:"loading-text"},Xa={key:0,class:"loading-progress"},Za=ze({__name:"GlobalLoading",props:{visible:{type:Boolean,default:!1},text:{default:"加载中..."},showProgress:{type:Boolean,default:!1},progress:{default:0},mock:{type:Boolean,default:!1}},setup(I){return(w,o)=>(c(),G(Ss,{to:"body"},[t(rs,{name:"loading-fade"},{default:s(()=>[w.visible||w.mock?(c(),b("div",{key:0,class:"global-loading-overlay",onClick:o[0]||(o[0]=zt(()=>{},["stop"]))},[e("div",Ka,[o[1]||(o[1]=e("div",{class:"loading-spinner"},[e("div",{class:"spinner-ring"}),e("div",{class:"spinner-ring"}),e("div",{class:"spinner-ring"})],-1)),e("div",Qa,M(w.text),1),w.showProgress||w.mock?(c(),b("div",Xa,[e("div",{class:pe(["progress-bar",{"is-mock":w.mock&&!w.showProgress}]),style:yt(w.showProgress?{width:w.progress+"%"}:void 0)},null,6)])):U("",!0)])])):U("",!0)]),_:1})]))}}),el=Pe(Za,[["__scopeId","data-v-6ac6414b"]]),tl={class:"success-container"},sl={class:"success-text"},ol={key:0,class:"success-description"},al=ze({__name:"SuccessModal",props:{visible:{type:Boolean,default:!1},text:{default:"操作成功!"},description:{default:""}},setup(I){return(w,o)=>(c(),G(Ss,{to:"body"},[t(rs,{name:"success-fade"},{default:s(()=>[w.visible?(c(),b("div",{key:0,class:"success-overlay",onClick:o[0]||(o[0]=zt(()=>{},["stop"]))},[e("div",tl,[o[1]||(o[1]=e("div",{class:"success-icon"},[e("svg",{viewBox:"0 0 52 52",class:"success-svg"},[e("circle",{class:"success-circle",cx:"26",cy:"26",r:"25",fill:"none"}),e("path",{class:"success-check",fill:"none",d:"m14.1 27.2l7.1 7.2 16.7-16.8"})])],-1)),e("div",sl,M(w.text),1),w.description?(c(),b("div",ol,M(w.description),1)):U("",!0)])])):U("",!0)]),_:1})]))}}),ll=Pe(al,[["__scopeId","data-v-cca06f4a"]]),et=Ts({visible:!1,text:"加载中...",showProgress:!1,progress:0});function nl(){return{loadingState:et,show:u=>{et.visible=!0,et.text=(u==null?void 0:u.text)||"加载中...",et.showProgress=(u==null?void 0:u.showProgress)||!1,et.progress=(u==null?void 0:u.progress)||0},hide:()=>{et.visible=!1},updateProgress:u=>{et.progress=Math.max(0,Math.min(100,u))},updateText:u=>{et.text=u},setText:u=>{et.visible&&(et.text=u)}}}const St=Ts({visible:!1,text:"操作成功!",description:""});function il(){const I=o=>{St.visible=!0,St.text=(o==null?void 0:o.text)||"操作成功!",St.description=(o==null?void 0:o.description)||"";const i=(o==null?void 0:o.duration)||2e3;setTimeout(()=>{w()},i)},w=()=>{St.visible=!1};return{successState:St,show:I,hide:w}}const rl={class:"template-form"},cl={class:"template-form-buttons"},ul={key:0,class:"template-list"},dl={key:1,class:"template-list-scroll"},fl={class:"template-content"},pl={class:"template-actions"},ml={key:1,class:"templates-container"},vl={class:"message-templates-list"},gl={class:"templates-scroll-area"},hl={class:"template-content"},yl={class:"template-actions"},_l={key:0,class:"current-default-message"},wl={class:"default-message-content"},bl={key:2,class:"message-help-text"},kl=ze({__name:"TemplateManager",props:{visible:{type:Boolean},type:{},title:{},placeholder:{default:"输入新模板内容"},editPlaceholder:{default:"编辑模板内容"},emptyDescription:{default:"暂无保存的模板"},showDefaultSection:{type:Boolean,default:!1},showHelpText:{type:Boolean,default:!1}},emits:["update:visible","use-template","set-default"],setup(I,{expose:w,emit:o}){const i=I,h=o,u=rt(),O=f(""),_=f(!1),R=f(""),Z=f(-1),J=f(!1),N=f(!1),y=E(()=>{switch(i.type){case"description":return u.descriptionTemplates||[];case"scope":return u.scopeTemplates||[];case"message":return u.messageTemplates||[];default:return[]}}),Q=E(()=>i.type==="message"?u.defaultCommitMessage:""),$=E(()=>_.value?i.editPlaceholder:i.placeholder),H=E(()=>_.value?"更新模板":"添加模板"),X=E({get:()=>i.visible,set:ee=>h("update:visible",ee)});Re(X,ee=>{ee||x()});function x(){O.value="",_.value=!1,R.value="",Z.value=-1}async function j(){if(!O.value.trim()){n.warning("模板内容不能为空");return}try{J.value=!0,_.value?await u.updateTemplate(R.value,O.value,i.type)&&x():await u.saveTemplate(O.value,i.type)&&(O.value="")}catch(ee){n.error(`模板保存失败: ${ee.message}`)}finally{J.value=!1}}function S(ee){h("use-template",ee),i.type!=="message"&&(X.value=!1)}function q(ee,g){_.value=!0,R.value=ee,O.value=ee,Z.value=g}function se(){x()}async function P(ee){try{const g=await u.deleteTemplate(ee,i.type)}catch(g){n.error(`模板删除失败: ${g.message}`)}}async function ve(){if(!(i.type!=="message"||!O.value.trim()))try{N.value=!0,await u.saveDefaultMessage(O.value)&&h("set-default",O.value)}catch(ee){n.error(`设置默认提交信息失败: ${ee.message}`)}finally{N.value=!1}}return w({resetForm:x}),(ee,g)=>{const z=Jt,A=$e,ce=Lt,fe=po,me=Vs,ge=Pt,oe=as;return c(),G(oe,{modelValue:X.value,"onUpdate:modelValue":g[1]||(g[1]=te=>X.value=te),title:ee.title,width:"80vw",top:"70px",style:{height:"calc(100vh - 140px)"},"close-on-click-modal":!1,class:pe(ee.type==="message"?"message-template-dialog":"template-dialog")},{default:s(()=>[e("div",{class:pe(["template-container",{"message-template-container":ee.type==="message"}])},[e("div",rl,[t(z,{modelValue:O.value,"onUpdate:modelValue":g[0]||(g[0]=te=>O.value=te),placeholder:$.value,class:"template-input",clearable:"",onKeyup:fo(j,["enter"])},null,8,["modelValue","placeholder"]),e("div",cl,[_.value?(c(),G(A,{key:0,onClick:se},{default:s(()=>g[2]||(g[2]=[D("取消")])),_:1})):U("",!0),t(A,{type:"primary",onClick:j,disabled:!O.value.trim()||J.value,loading:J.value},{default:s(()=>[D(M(H.value),1)]),_:1},8,["disabled","loading"]),ee.type==="message"?(c(),G(A,{key:1,type:"success",onClick:ve,disabled:!O.value.trim()||N.value,loading:N.value,plain:""},{default:s(()=>g[3]||(g[3]=[D(" 设为默认提交信息 ")])),_:1},8,["disabled","loading"])):U("",!0)])]),ee.type!=="message"?(c(),b("div",ul,[e("h3",null,"已保存"+M(ee.type==="description"?"模板":"作用域"),1),y.value.length===0?(c(),G(ce,{key:0,description:ee.emptyDescription},null,8,["description"])):(c(),b("div",dl,[(c(!0),b(Ce,null,Ge(y.value,(te,ue)=>(c(),G(me,{key:ue,class:"template-item"},{default:s(()=>[t(fe,{justify:"space-between",align:"middle",style:{width:"100%"}},{default:s(()=>[e("div",fl,M(te),1),e("div",pl,[t(A,{type:"primary",size:"small",onClick:ke=>S(te)},{default:s(()=>g[4]||(g[4]=[D("使用")])),_:2},1032,["onClick"]),t(A,{type:"warning",size:"small",icon:a(dt),onClick:ke=>q(te,ue)},{default:s(()=>g[5]||(g[5]=[D(" 编辑 ")])),_:2},1032,["icon","onClick"]),t(A,{type:"danger",size:"small",onClick:ke=>P(te)},{default:s(()=>g[6]||(g[6]=[D("删除")])),_:2},1032,["onClick"])])]),_:2},1024)]),_:2},1024))),128))]))])):(c(),b("div",ml,[e("div",vl,[g[10]||(g[10]=e("h3",null,"已保存模板",-1)),e("div",gl,[y.value.length===0?(c(),G(ce,{key:0,description:ee.emptyDescription},null,8,["description"])):U("",!0),(c(!0),b(Ce,null,Ge(y.value,(te,ue)=>(c(),G(me,{key:ue,class:"template-item"},{default:s(()=>[t(fe,{justify:"space-between",align:"middle",style:{width:"100%"}},{default:s(()=>[e("div",hl,M(te),1),e("div",yl,[t(A,{type:"primary",size:"small",onClick:ke=>S(te)},{default:s(()=>g[7]||(g[7]=[D("使用")])),_:2},1032,["onClick"]),t(A,{type:"warning",size:"small",icon:a(dt),onClick:ke=>q(te,ue)},{default:s(()=>g[8]||(g[8]=[D(" 编辑 ")])),_:2},1032,["icon","onClick"]),t(A,{type:"danger",size:"small",onClick:ke=>P(te)},{default:s(()=>g[9]||(g[9]=[D("删除")])),_:2},1032,["onClick"])])]),_:2},1024)]),_:2},1024))),128))])]),ee.showDefaultSection?(c(),b("div",_l,[g[18]||(g[18]=e("h3",null,"当前默认提交信息",-1)),Q.value?(c(),G(me,{key:0,class:"default-message-card"},{default:s(()=>[e("div",wl,M(Q.value),1)]),_:1})):(c(),G(ce,{key:1,description:"尚未设置默认提交信息","image-size":100})),ee.showHelpText?(c(),b("div",bl,[g[16]||(g[16]=e("h4",null,"关于默认提交信息",-1)),g[17]||(g[17]=e("p",null,"默认提交信息将在未输入提交信息时自动使用。",-1)),e("p",null,[g[13]||(g[13]=D("你可以通过点击左侧模板的")),t(ge,{size:"small",type:"primary"},{default:s(()=>g[11]||(g[11]=[D("使用")])),_:1}),g[14]||(g[14]=D("按钮先选择喜欢的模板,然后点击上方")),t(ge,{size:"small",type:"success"},{default:s(()=>g[12]||(g[12]=[D("设为默认提交信息")])),_:1}),g[15]||(g[15]=D("按钮保存。"))])])):U("",!0)])):U("",!0)]))],2)]),_:1},8,["modelValue","title","class"])}}}),Zt=Pe(kl,[["__scopeId","data-v-8ff4079a"]]),$l={class:"git-command-preview"},Cl={class:"preview-container"},Sl={class:"preview-title"},Tl={class:"preview-content code-command"},Vl=ze({__name:"GitCommandPreview",props:{command:{},title:{default:"Git命令预览:"},copyButtonText:{default:"复制命令"},placeholder:{default:"<命令内容>"}},setup(I){const w=I,o=E(()=>w.command||w.placeholder);async function i(){if(!w.command){n.warning("没有可复制的命令内容");return}try{await navigator.clipboard.writeText(w.command),n.success("命令已复制到剪贴板")}catch(h){n.error(`复制失败: ${h.message}`)}}return(h,u)=>{const O=tt,_=Me;return c(),b("div",$l,[e("div",Cl,[e("div",Sl,M(h.title),1),e("div",Tl,M(o.value),1),t(_,{content:h.copyButtonText,placement:"bottom",effect:"dark","open-delay":300},{default:s(()=>[e("button",{class:"modern-btn copy-command-btn",onClick:i},[t(O,{class:"btn-icon"},{default:s(()=>[t(a(gt))]),_:1})])]),_:1},8,["content"])])])}}}),Fl=Pe(Vl,[["__scopeId","data-v-9066ce64"]]),Ll={class:"one-push-content"},xl={class:"one-push-text"},Bl={key:0,class:"one-push-desc"},zl=ze({__name:"QuickPushButton",props:{from:{default:"form"},hasUserCommitMessage:{type:Boolean,default:!1},finalCommitMessage:{default:""},skipHooks:{type:Boolean,default:!1}},emits:["beforePush","afterPush","clearFields"],setup(I,{emit:w}){const o=st(),i=rt(),h=I,u=w;function O(y){const Q=y.replace(/\\/g,"/");return i.lockedFiles.some($=>{const H=$.replace(/\\/g,"/");return Q===H})}const _=E(()=>o.fileList.some(y=>!O(y.path))),R=E(()=>!_.value||!h.hasUserCommitMessage||!o.hasUpstream),Z=E(()=>o.isAddingFiles||o.isCommiting||o.isPushing),J=E(()=>_.value?h.hasUserCommitMessage?o.hasUpstream?"一键完成:暂存所有更改 → 提交 → 推送到远程仓库":"当前分支没有上游分支":"请输入提交信息":"没有需要提交的更改");async function N(){u("beforePush");try{const y=await o.addCommitAndPush(h.finalCommitMessage,h.skipHooks);y&&u("clearFields"),u("afterPush",y)}catch(y){console.error("一键推送失败:",y),u("afterPush",!1)}}return(y,Q)=>{const $=tt,H=$e;return c(),G(a(Me),{content:J.value,placement:"top","show-after":200},{default:s(()=>[t(H,{type:"success",onClick:N,loading:Z.value,disabled:R.value,class:pe([y.from,"one-push-button"])},{default:s(()=>[e("div",Ll,[t($,{class:"one-push-icon"},{default:s(()=>[t(a(mo))]),_:1}),e("div",xl,[Q[0]||(Q[0]=e("span",{class:"one-push-title"},"一键推送所有",-1)),y.from==="form"?(c(),b("span",Bl,"暂存 + 提交 + 推送")):U("",!0)])])]),_:1},8,["loading","disabled","class"])]),_:1},8,["content"])}}}),js=Pe(zl,[["__scopeId","data-v-58e155b2"]]),Pl={key:0},jl=ze({__name:"StageButton",props:{from:{default:"form"}},emits:["click"],setup(I,{emit:w}){const o=w,i=st(),h=rt();function u(y){const Q=y.replace(/\\/g,"/");return h.lockedFiles.some($=>{const H=$.replace(/\\/g,"/");return Q===H})}function O(){return h.lockedFiles.length===0?!1:i.fileList.some(y=>["modified","deleted","untracked"].includes(y.type)?u(y.path):!1)}const _=E(()=>i.fileList.filter(y=>["modified","deleted","untracked"].includes(y.type)&&!u(y.path)).length),R=E(()=>i.fileList.some(y=>["modified","deleted","untracked"].includes(y.type)&&!u(y.path))),Z=E(()=>!R.value),J=E(()=>R.value?O()?`暂存${_.value}个未暂存文件(逐个添加)`:"暂存所有更改(git add .)":"没有需要暂存的更改");async function N(){o("click");try{let y;O()?y=await i.addToStage():y=await i.addAllToStage(),y&&i.fetchStatus()}catch(y){console.error("添加文件失败:",y)}}return(y,Q)=>{const $=$e,H=Me;return c(),G(H,{content:J.value,placement:"top"},{default:s(()=>[t($,{type:"primary",onClick:N,loading:a(i).isAddingFiles,disabled:Z.value,class:pe(["stage-button",`from-${y.from}`])},{default:s(()=>[Q[0]||(Q[0]=D(" 暂存更改 ")),_.value>0?(c(),b("span",Pl,"("+M(_.value)+")",1)):U("",!0)]),_:1},8,["loading","disabled","class"])]),_:1},8,["content"])}}}),Os=Pe(jl,[["__scopeId","data-v-01b0a8bc"]]),Ol={key:0},Dl=ze({__name:"CommitButton",props:{from:{default:"form"},hasUserCommitMessage:{type:Boolean,default:!1},finalCommitMessage:{default:""},skipHooks:{type:Boolean,default:!1}},emits:["click","beforeCommit","afterCommit"],setup(I,{emit:w}){const o=I,i=w,h=st(),u=rt();function O(y){const Q=y.replace(/\\/g,"/");return u.lockedFiles.some($=>{const H=$.replace(/\\/g,"/");return Q===H})}const _=E(()=>h.fileList.filter(y=>y.type==="added"&&!O(y.path)).length),R=E(()=>_.value>0),Z=E(()=>!R.value||!o.hasUserCommitMessage),J=E(()=>R.value?o.hasUserCommitMessage?`提交${_.value}个已暂存文件`:"请输入提交信息":"没有已暂存的更改");async function N(){if(o.finalCommitMessage.trim()){i("beforeCommit"),i("click");try{const y=await h.commitChanges(o.finalCommitMessage,o.skipHooks);y&&(h.fetchStatus(),h.fetchLog(),h.getBranchStatus(!0)),i("afterCommit",y)}catch(y){console.error("提交失败:",y),i("afterCommit",!1)}}}return(y,Q)=>{const $=$e,H=Me;return c(),G(H,{content:J.value,placement:"top"},{default:s(()=>[t($,{type:"primary",onClick:N,loading:a(h).isLoadingStatus,disabled:Z.value,class:pe(["commit-button",`from-${y.from}`])},{default:s(()=>[Q[0]||(Q[0]=D(" 提交 ")),_.value>0?(c(),b("span",Ol,"("+M(_.value)+")",1)):U("",!0)]),_:1},8,["loading","disabled","class"])]),_:1},8,["content"])}}}),Ds=Pe(Dl,[["__scopeId","data-v-d171a315"]]),Ml={key:0},Rl=ze({__name:"PushButton",props:{from:{default:"form"}},emits:["click","beforePush","afterPush"],setup(I,{emit:w}){const o=w,i=st(),h=E(()=>i.branchAhead>0),u=E(()=>i.fileList.some(N=>N.type==="added")),O=E(()=>i.hasUpstream&&h.value&&!u.value),_=E(()=>!O.value),R=E(()=>i.hasUpstream?h.value?u.value?"有未提交的暂存更改,请先提交":`推送${i.branchAhead}个本地提交`:"没有需要推送的提交":"当前分支没有上游分支"),Z=E(()=>O.value?{backgroundColor:"#67c23a",borderColor:"#67c23a"}:{});async function J(){o("beforePush"),o("click");try{const N=await i.pushToRemote();N&&await new Promise(y=>setTimeout(y,200)),o("afterPush",N)}catch(N){console.error("推送失败:",N),o("afterPush",!1)}}return(N,y)=>{const Q=$e,$=Me;return c(),G($,{content:R.value,placement:"top"},{default:s(()=>[t(Q,{type:"primary",icon:a(vo),onClick:J,loading:a(i).isPushing,disabled:_.value,style:yt(Z.value),class:pe(["push-button",`from-${N.from}`])},{default:s(()=>[y[0]||(y[0]=D(" 推送 ")),h.value?(c(),b("span",Ml,"("+M(a(i).branchAhead)+")",1)):U("",!0)]),_:1},8,["icon","loading","disabled","style","class"])]),_:1},8,["content"])}}}),Ms=Pe(Rl,[["__scopeId","data-v-1c347c7f"]]),Gl={class:"form-bottom-actions"},Al={class:"actions-flex-container"},Ul={class:"left-actions"},El={class:"button-grid"},Il={class:"right-actions"},Nl=ze({__name:"GitActionButtons",props:{hasUserCommitMessage:{type:Boolean,default:!1},finalCommitMessage:{default:""},skipHooks:{type:Boolean,default:!1},from:{default:"form"}},emits:["afterCommit","afterPush","beforePush","clearFields"],setup(I,{emit:w}){const o=w;function i(_){o("afterCommit",_)}function h(_){o("afterPush",_)}function u(){o("beforePush")}function O(){o("clearFields")}return(_,R)=>(c(),b("div",Gl,[e("div",Al,[e("div",Ul,[e("div",El,[t(Os,{onClick:()=>{},from:_.from},null,8,["from"]),t(Ds,{"has-user-commit-message":_.hasUserCommitMessage,"final-commit-message":_.finalCommitMessage,"skip-hooks":_.skipHooks,onBeforeCommit:()=>{},onAfterCommit:i,onClick:()=>{},from:_.from},null,8,["has-user-commit-message","final-commit-message","skip-hooks","from"]),t(Ms,{onBeforePush:()=>{},onAfterPush:h,onClick:()=>{},from:_.from},null,8,["from"])])]),e("div",Il,[t(js,{from:_.from,"has-user-commit-message":_.hasUserCommitMessage,"final-commit-message":_.finalCommitMessage,"skip-hooks":_.skipHooks,onBeforePush:u,onAfterPush:h,onClearFields:O},null,8,["from","has-user-commit-message","final-commit-message","skip-hooks"])])])]))}}),Hl=Pe(Nl,[["__scopeId","data-v-6cf9ea2c"]]),Jl={class:"option-header"},Wl={class:"option-info"},ql={class:"option-title"},Yl=ze({__name:"OptionSwitchCard",props:{modelValue:{type:Boolean},title:{},tooltip:{},activeText:{},inactiveText:{},activeColor:{},iconClass:{},compact:{type:Boolean}},emits:["update:modelValue"],setup(I,{emit:w}){const o=I,i=w;function h(u){i("update:modelValue",u)}return(u,O)=>{const _=$s,R=Me;return c(),b("div",{class:pe(["option-card",{compact:o.compact}])},[t(R,{content:u.tooltip,placement:"top","hide-after":1e3,"show-after":200},{default:s(()=>[e("div",Jl,[e("div",{class:pe(["option-icon",u.iconClass])},[ut(u.$slots,"icon",{},void 0,!0)],2),e("div",Wl,[e("h4",ql,M(u.title),1)]),t(_,{class:"option-switch","model-value":u.modelValue,"onUpdate:modelValue":h,"active-text":u.activeText,"inactive-text":u.inactiveText,"active-color":u.activeColor,size:"small"},null,8,["model-value","active-text","inactive-text","active-color"])])]),_:3},8,["content"])],2)}}}),es=Pe(Yl,[["__scopeId","data-v-2f759bee"]]),Kl={class:"card-header app-card-header"},Ql={key:0,class:"header-switches"},Xl={key:1,class:"header-actions"},Zl={class:"card-content app-card-content"},en={class:"layout-container"},tn={key:0,class:"git-config-warning"},sn={key:1,class:"commit-section"},on={key:0,class:"commit-form"},an={class:"description-container"},ln={key:1,class:"standard-commit-form"},nn={class:"standard-commit-header"},rn={class:"type-scope-container"},cn={class:"scope-wrapper"},un={class:"description-container description-inline"},dn={class:"advanced-fields"},fn={class:"actions-section"},pn={class:"action-groups"},mn={class:"operations-wrapper"},vn={class:"action-group"},gn={class:"group-buttons"},hn={key:0},yn={class:"action-group"},_n={class:"group-buttons"},wn={class:"action-group reset-group"},bn={class:"group-buttons"},kn={key:0},$n={class:"action-group branch-group"},Cn={class:"group-buttons"},Sn={class:"action-group"},Tn={class:"group-buttons"},Vn={class:"editor-header"},Fn={class:"editor-info"},Ln={class:"editor-tips"},xn={class:"json-editor-wrapper"},Bn={class:"editor-footer"},zn={class:"footer-left"},Pn={class:"footer-right"},jn={class:"config-warning-content"},On={class:"warning-message"},Dn={class:"dialog-footer"},Mn={class:"stash-dialog-content"},Rn={class:"stash-info-card"},Gn={class:"info-icon"},An={class:"stash-options"},Un={class:"options-title"},En={class:"option-item"},In={class:"option-item"},Nn={key:0,class:"stash-preview"},Hn={class:"preview-title"},Jn={class:"file-count-info"},Wn={class:"merge-dialog-content"},qn={class:"merge-intro"},Yn={class:"merge-options"},Kn={class:"dialog-footer"},Qn={class:"stash-list-content"},Xn={key:0,class:"stash-header"},Zn={class:"stash-stats"},ei={class:"stat-item"},ti={class:"stat-number"},si={key:0,class:"stash-actions-header"},oi={class:"stash-list-container"},ai={key:0,class:"empty-state"},li={key:1,class:"stash-cards"},ni={class:"stash-card-content"},ii={class:"stash-info"},ri={class:"stash-main-info"},ci={class:"stash-id-badge"},ui={class:"stash-id-text"},di={class:"stash-description"},fi={class:"description-text"},pi={class:"stash-card-actions"},mi={class:"stash-content"},vi={key:0,class:"stash-info-row"},gi={class:"stash-id"},hi={class:"stash-id-value"},yi={class:"stash-description"},_i={class:"stash-description-value"},wi={class:"stash-main-content"},bi={key:0,class:"status-updating-indicator"},ki=ze({__name:"CommitForm",setup(I,{expose:w}){const o=st(),i=rt(),h=f(""),{loadingState:u,show:O,hide:_,setText:R}=nl(),{successState:Z,show:J}=il(),N=f(!1),y=f("输入提交信息..."),Q=f(""),$=f(!1),H=f("feat"),X=f(""),x=f(""),j=f(""),S=f(""),q=f(!1),se=f(""),P=f(!1),ve=f(!1),ee=f(""),g=f([]),z=f(!1),A=f(!1),ce=f(""),fe=f({noFf:!1,squash:!1,noCommit:!1,message:""}),me=f([]),ge=f(!1),oe=f(!1),te=f(!1),ue=f(!1),ke=f(!1),B=[{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: 构建/工具修改"}],F=f(!1),ie=f(!1),le=f(""),Se=f(!1),Te=f(!0),Oe=f(!1),we=f(null),ne=f([]),Be=f(""),De=f(!1),Ze=f("");function lt(){le.value="",Se.value=!1,Te.value=!Wt.value,F.value=!0}async function Ke(){try{const l=await(await fetch("/api/config/check-file-format")).json();let W="";l.success&&(l.exists?l.isValidJson||(W=`系统配置文件格式有误:${l.error}
|
|
16
16
|
编辑后保存可能会覆盖原文件内容。`):W="系统配置文件不存在,将使用默认配置。");const _e=i.config;if(se.value=JSON.stringify(_e,null,2),W){ee.value=W,ve.value=!0;return}q.value=!0}catch{n.error("加载配置失败")}}async function ot(){try{P.value=!0;let p;try{p=JSON.parse(se.value)}catch(_e){n.error(`JSON 解析失败: ${_e.message||_e}`);return}const W=await(await fetch("/api/config/saveAll",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({config:p})})).json();if(!W.success)throw new Error(W.error||"保存失败");await i.loadConfig(!0);try{await i.loadLockedFiles()}catch{}try{Array.isArray(i.descriptionTemplates)&&(g.value=[...i.descriptionTemplates])}catch{}try{Array.isArray(i.scopeTemplates)&&(me.value=[...i.scopeTemplates])}catch{}try{Array.isArray(i.messageTemplates)&&(Fe.value=[...i.messageTemplates])}catch{}n.success("配置已保存"),q.value=!1}catch(p){n.error(`保存配置失败: ${p.message||p}`)}finally{P.value=!1}}async function nt(){try{const p=await fetch("/api/config/open-file",{method:"POST"}),l=await p.json();if(!p.ok||!(l!=null&&l.success))throw new Error((l==null?void 0:l.error)||"打开失败");n.success("已用系统程序打开配置文件")}catch(p){n.error(`打开配置文件失败: ${(p==null?void 0:p.message)||p}`)}}function Ae(p){ve.value=!1,p==="continue"?q.value=!0:p==="open"&&nt()}function We(){o.getStashList(),ie.value=!0}async function T(){try{await o.saveStash(le.value,Se.value,Te.value),F.value=!1}catch(p){console.error("储藏失败:",p)}}async function r(p,l=!1){try{await o.applyStash(p,l),l&&await o.getStashList()}catch(W){console.error("应用储藏失败:",W)}}async function Y(p){Ye.confirm("确定要删除此储藏吗?此操作不可恢复。","删除储藏",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"}).then(async()=>{await o.dropStash(p),await o.getStashList()}).catch(()=>{})}async function de(){Ye.confirm("确定要清空所有储藏吗?此操作不可恢复。","清空所有储藏",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"}).then(async()=>{await o.clearAllStashes(),await o.getStashList()}).catch(()=>{})}async function Ve(p){if(p){we.value=p,Oe.value=!0,De.value=!0,ne.value=[],Be.value="",Ze.value="";try{if(!p.id||p.id.length<7){Be.value="无效的stash ID",De.value=!1;return}const W=await(await fetch(`/api/stash-files?stashId=${encodeURIComponent(p.id)}`)).json();W.success&&Array.isArray(W.files)?(ne.value=W.files,ne.value.length>0?await Ne(p.id,ne.value[0]):Be.value="该stash没有变更文件"):Be.value=`获取文件列表失败: ${W.error||"未知错误"}`}catch(l){Be.value=`获取stash详情失败: ${l.message}`}finally{De.value=!1}}}async function Ne(p,l){De.value=!0,Ze.value=l;try{const _e=await(await fetch(`/api/stash-file-diff?stashId=${encodeURIComponent(p)}&file=${encodeURIComponent(l)}`)).json();_e.success?Be.value=_e.diff||"没有变更内容":Be.value=`获取差异失败: ${_e.error||"未知错误"}`}catch(W){Be.value=`获取差异失败: ${W.message}`}finally{De.value=!1}}function be(p){we.value&&Ne(we.value.id,p)}async function he(p,l){try{const _e=await(await fetch("/api/open-file",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({filePath:p,context:l})})).json();_e.success?n.success(_e.message):n.error(_e.error||"打开文件失败")}catch(W){n.error(`打开文件失败: ${W.message}`)}}async function Ue(p,l){try{const _e=await(await fetch("/api/open-with-vscode",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({filePath:p,context:l})})).json();_e.success?n.success(_e.message):n.error(_e.error||"用VSCode打开文件失败")}catch(W){n.error(`用VSCode打开文件失败: ${W.message}`)}}const Fe=f([]);Re($,p=>{localStorage.setItem("zen-gitsync-standard-commit",p.toString())}),Re(te,p=>{localStorage.setItem("zen-gitsync-skip-hooks",p.toString())}),Re(ue,p=>{localStorage.setItem("zen-gitsync-auto-quick-push",p.toString())});const ye=E(()=>{if(!$.value)return h.value||Q.value;let p=`${H.value||""}`;return X.value&&(p+=`(${X.value})`),p+=`: ${x.value}`,j.value&&(p+=`
|
|
17
17
|
|
|
18
18
|
${j.value}`),S.value&&(p+=`
|
|
19
19
|
|
|
20
20
|
${S.value}`),p}),ae=E(()=>$.value?H.value.trim()!==""&&x.value.trim()!=="":h.value.trim()!==""),Je=E(()=>{const p=`输入提交信息 (默认: ${Q.value})`;return ue.value?`${p}(按回车一键推送)`:p}),pt=E(()=>ue.value?"简短描述(必填,按回车一键推送)":"简短描述(必填)"),_t=E(()=>ne.value.map(p=>({path:p,name:p.split("/").pop()||p}))),wt=E(()=>{let p=`git commit -m "${ye.value}"`;return te.value&&(p+=" --no-verify"),p});function it(){const p=i.config;p&&(y.value=`输入提交信息 (默认: ${p.defaultCommitMessage})`,Q.value=p.defaultCommitMessage||"",p.descriptionTemplates&&Array.isArray(p.descriptionTemplates)&&(g.value=p.descriptionTemplates),p.scopeTemplates&&Array.isArray(p.scopeTemplates)&&(me.value=p.scopeTemplates),p.messageTemplates&&Array.isArray(p.messageTemplates)&&(Fe.value=p.messageTemplates))}function Ee(p){x.value=p,z.value=!1}function bt(p){X.value=p,ge.value=!1}function k(){z.value=!0}function v(){ge.value=!0}function K(){J({text:"操作成功!",description:"已完成操作",duration:2e3})}async function d(){try{await o.gitPull(),await o.fetchStatus(),await o.fetchLog(!1)}catch(p){console.error("拉取操作发生错误:",p)}}async function m(){try{await o.gitFetchAll(),await o.fetchStatus(),await o.fetchLog(!1)}catch(p){console.error("获取远程分支信息操作发生错误:",p)}}async function L(){if(!ye.value.trim()){n({message:"提交信息不能为空",type:"warning"});return}try{await o.addAndCommit(ye.value,te.value),re(),o.fetchStatus(),o.fetchLog()}catch(p){n({message:`暂存并提交失败: ${p.message}`,type:"error"})}}async function C(){try{await Ye.confirm(`确定要重置当前分支 "${o.currentBranch}" 到远程状态吗?这将丢失所有未推送的提交和本地更改。`,"重置到远程分支",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"}),await o.resetToRemote(o.currentBranch)&&(o.fetchStatus(),o.fetchLog())}catch(p){p!=="cancel"&&n({message:`重置到远程分支失败: ${p.message}`,type:"error"})}}function re(){h.value="",x.value="",j.value="",S.value=""}function je(){O({text:"正在暂存文件...",showProgress:!1})}function He(p){if(_(),p){N.value=!0;try{setTimeout(async()=>{try{console.log("推送成功,状态已更新")}catch(l){console.error("一键推送后处理失败:",l)}finally{N.value=!1}},1e3)}catch(l){console.error("一键推送后处理失败:",l),N.value=!1}}}function qe(p){const l=p.replace(/\\/g,"/");return i.lockedFiles.some(W=>{const _e=W.replace(/\\/g,"/");return l===_e})}const jt=E(()=>o.fileList.some(p=>["modified","deleted","untracked"].includes(p.type)&&!qe(p.path))),Ot=E(()=>o.fileList.filter(p=>p.type==="added"&&!qe(p.path)).length),Gs=E(()=>Ot.value>0),As=E(()=>o.fileList.some(p=>!qe(p.path))),Us=E(()=>o.fileList.length>0),Wt=E(()=>o.fileList.length>0&&o.fileList.every(p=>qe(p.path))),Es=E(()=>o.branchAhead>0),qt=E(()=>o.branchBehind>0),us=E(()=>Gs.value),Is=E(()=>o.hasUpstream&&(Es.value||qt.value||As.value));function Ns(p){h.value=p,oe.value=!1}async function ds(p){if(!(!ue.value||!ae.value||!o.fileList.some(W=>!qe(W.path))||!ae.value||!o.hasUpstream)&&p.key==="Enter"&&!p.shiftKey){p.preventDefault();try{je();const W=await o.addCommitAndPush(ye.value,te.value);W&&re(),He(W)}catch(W){console.error("回车自动一键提交失败:",W),He(!1)}}}async function Hs(p){try{await i.saveDefaultMessage(p)&&n.success("默认提交信息设置成功")}catch(l){n.error(`设置默认提交信息失败: ${l.message}`)}}Re(()=>o.isAddingFiles,p=>{p&&u.visible&&R("正在暂存文件...")}),Re(()=>o.isCommiting,p=>{p&&u.visible&&R("正在提交更改...")}),Re(()=>o.isPushing,p=>{p&&u.visible&&R("正在推送...")}),ht(async()=>{const p=localStorage.getItem("zen-gitsync-standard-commit");p!==null&&($.value=p==="true");const l=localStorage.getItem("zen-gitsync-skip-hooks");l!==null&&(te.value=l==="true");const W=localStorage.getItem("zen-gitsync-auto-quick-push");W!==null&&(ue.value=W==="true"),Re(()=>i.config,it,{immediate:!0}),i.config||await i.loadConfig()});function Js(){ce.value="",fe.value={noFf:!1,squash:!1,noCommit:!1,message:""},mt.value="all",A.value=!0,o.allBranches.length===0&&o.getAllBranches()}const mt=f("all"),Ws=E(()=>{const p=o.allBranches.filter(l=>l!==o.currentBranch);if(console.log("筛选分支列表:",{allBranches:o.allBranches,currentBranch:o.currentBranch,branchTypeFilter:mt.value,filteredBranches:p}),mt.value==="local"){const l=p.filter(W=>!W.includes("origin/"));return console.log("本地分支:",l),l}else if(mt.value==="remote"){const l=p.filter(W=>W.includes("origin/"));return console.log("远程分支:",l),l}else return console.log("所有分支:",p),p});async function qs(){if(!ce.value){n({message:"请选择要合并的分支",type:"warning"});return}try{await o.mergeBranch(ce.value,fe.value)&&(A.value=!1,await o.fetchStatus(),await o.fetchLog(!1))}catch(p){console.error("合并分支操作发生错误:",p)}}const Dt=f(!1);function Ys(){Dt.value=!Dt.value}w({openConfigEditor:Ke,toggleGitOperationsDrawer:Ys});function Ks(p,l){const _e=[...p?g.value.filter(Le=>Le.toLowerCase().includes(p.toLowerCase())).map(Le=>({value:Le})):g.value.map(Le=>({value:Le})),{value:"⚙️ 管理模板...",isSettings:!0}];l(_e)}function Qs(p,l){const _e=[...p?me.value.filter(Le=>Le.toLowerCase().includes(p.toLowerCase())).map(Le=>({value:Le})):me.value.map(Le=>({value:Le})),{value:"⚙️ 管理模板...",isSettings:!0}];l(_e)}function Xs(p){p.isSettings?(k(),x.value=""):x.value=p.value}function Zs(p){p.isSettings?(v(),X.value=""):X.value=p.value}function eo(p,l){const _e=[...p?Fe.value.filter(Le=>Le.toLowerCase().includes(p.toLowerCase())).map(Le=>({value:Le})):Fe.value.map(Le=>({value:Le})),{value:"⚙️ 管理模板...",isSettings:!0}];l(_e)}function to(p){p.isSettings?(oe.value=!0,h.value=""):h.value=p.value}return(p,l)=>{const W=tt,_e=Fs,Le=go,fs=Et,ps=It,kt=Jt,xe=$e,Qe=Me,so=yo,Mt=Pt,ms=as,$t=xs,Ct=wo,vs=Ls,Yt=ko,oo=bo,ao=Lt,lo=is;return c(),b(Ce,null,[e("div",{class:pe(["card app-card",{"is-pushing":a(o).isPushing}])},[e("div",Kl,[l[38]||(l[38]=e("h2",null,"提交更改",-1)),a(o).userName!==""&&a(o).userEmail!==""?(c(),b("div",Ql,[t(es,{modelValue:$.value,"onUpdate:modelValue":l[0]||(l[0]=V=>$.value=V),title:"提交模式",tooltip:"选择传统或标准化提交格式","active-text":"标准化","inactive-text":"普通","active-color":"#409eff",compact:""},{icon:s(()=>[t(W,null,{default:s(()=>[t(a(dt))]),_:1})]),_:1},8,["modelValue"]),t(es,{modelValue:te.value,"onUpdate:modelValue":l[1]||(l[1]=V=>te.value=V),title:"跳过钩子检查",tooltip:"添加 --no-verify 参数","active-color":"#f56c6c","icon-class":"warning",compact:""},{icon:s(()=>[t(W,null,{default:s(()=>[t(a(hs))]),_:1})]),_:1},8,["modelValue"]),t(es,{modelValue:ue.value,"onUpdate:modelValue":l[2]||(l[2]=V=>ue.value=V),title:"回车自动提交",tooltip:"输入提交信息后按回车直接执行一键推送","active-color":"#67c23a","icon-class":"success",compact:""},{icon:s(()=>[t(W,null,{default:s(()=>[t(a(ft))]),_:1})]),_:1},8,["modelValue"])])):U("",!0),a(o).userName!==""&&a(o).userEmail!==""?(c(),b("div",Xl,[t(Hl,{"has-user-commit-message":ae.value,"final-commit-message":ye.value,"skip-hooks":te.value,from:"form",onAfterCommit:l[3]||(l[3]=V=>{V&&re()}),onAfterPush:He,onBeforePush:je,onClearFields:re},null,8,["has-user-commit-message","final-commit-message","skip-hooks"])])):U("",!0)]),e("div",Zl,[e("div",en,[a(o).userName===""||a(o).userEmail===""?(c(),b("div",tn,[t(_e,{title:"Git用户信息未配置",type:"warning",closable:!1,"show-icon":""},{default:s(()=>l[39]||(l[39]=[e("p",null,"您需要配置Git用户名和邮箱才能提交代码。请使用以下命令配置:",-1),e("pre",{class:"config-command"},`git config --global user.name "Your Name"
|
|
21
|
-
git config --global user.email "your.email@example.com"`,-1)])),_:1})])):(c(),b("div",sn,[t(Fl,{command:wt.value,title:"提交命令预览:",placeholder:'git commit -m "<提交信息>"'},null,8,["command"]),$.value?(c(),b("div",ln,[e("div",nn,[e("div",rn,[t(ps,{modelValue:H.value,"onUpdate:modelValue":l[5]||(l[5]=V=>H.value=V),placeholder:"提交类型",class:"type-select",clearable:""},{default:s(()=>[(c(),b(Ce,null,Ge(B,V=>t(fs,{key:V.value,label:V.label,value:V.value},null,8,["label","value"])),64))]),_:1},8,["modelValue"]),e("div",cn,[t(Le,{modelValue:X.value,"onUpdate:modelValue":l[6]||(l[6]=V=>X.value=V),"fetch-suggestions":Qs,placeholder:"作用域(可选)",class:"scope-input",clearable:"",onSelect:Zs},null,8,["modelValue"])]),e("div",un,[t(Le,{modelValue:x.value,"onUpdate:modelValue":l[7]||(l[7]=V=>x.value=V),"fetch-suggestions":Ks,placeholder:pt.value,class:"description-input",clearable:"",onSelect:Xs,onKeydown:ds},null,8,["modelValue","placeholder"])])])]),e("div",{class:"advanced-options-toggle",onClick:l[8]||(l[8]=V=>ke.value=!ke.value)},[e("span",null,M(ke.value?"收起":"正文及页脚"),1),t(W,{class:pe(["toggle-icon",{"is-active":ke.value}])},{default:s(()=>[t(a(Ht))]),_:1},8,["class"])]),at(e("div",dn,[t(kt,{modelValue:j.value,"onUpdate:modelValue":l[9]||(l[9]=V=>j.value=V),type:"textarea",rows:4,placeholder:"正文(可选):详细描述本次提交的内容和原因",class:"body-input",clearable:""},null,8,["modelValue"]),t(kt,{modelValue:S.value,"onUpdate:modelValue":l[10]||(l[10]=V=>S.value=V),placeholder:"页脚(可选):如 Closes #123",class:"footer-input",clearable:""},null,8,["modelValue"])],512),[[Bt,ke.value]])])):(c(),b("div",on,[e("div",an,[t(Le,{modelValue:h.value,"onUpdate:modelValue":l[4]||(l[4]=V=>h.value=V),"fetch-suggestions":eo,placeholder:Je.value,type:"textarea",rows:3,resize:"none",class:"commit-message-input",onSelect:to,onKeydown:ds},null,8,["modelValue","placeholder"])])]))]))])])],2),t(so,{modelValue:Dt.value,"onUpdate:modelValue":l[13]||(l[13]=V=>Dt.value=V),title:"Git 操作",direction:"rtl",size:"362px","with-header":!0,"show-close":!0,"destroy-on-close":!1,class:"git-operations-drawer"},{default:s(()=>[e("div",fn,[e("div",pn,[e("div",mn,[e("div",vn,[l[42]||(l[42]=e("div",{class:"group-title"},"基础操作",-1)),e("div",gn,[t(Os,{onClick:()=>{},from:"drawer"}),t(Ds,{"has-user-commit-message":ae.value,"final-commit-message":ye.value,"skip-hooks":te.value,onBeforeCommit:()=>{},onAfterCommit:l[11]||(l[11]=V=>{V&&re()}),onClick:()=>{},from:"drawer"},null,8,["has-user-commit-message","final-commit-message","skip-hooks"]),t(Ms,{onBeforePush:()=>{},onAfterPush:l[12]||(l[12]=V=>{V&&K()}),onClick:()=>{},from:"drawer"}),t(Qe,{content:qt.value?`拉取${a(o).branchBehind}个远程提交`:"git pull",placement:"top"},{default:s(()=>[t(xe,{type:"primary",icon:a(ss),onClick:d,loading:a(o).isGitPulling,disabled:!a(o).hasUpstream,class:"action-button",style:yt(a(o).hasUpstream?{color:"white",backgroundColor:"#1e90ff",borderColor:"#1e90ff"}:{})},{default:s(()=>[l[40]||(l[40]=D(" 拉取 ")),qt.value?(c(),b("span",hn,"("+M(a(o).branchBehind)+")",1)):U("",!0)]),_:1},8,["icon","loading","disabled","style"])]),_:1},8,["content"]),t(Qe,{content:"git fetch --all",placement:"top"},{default:s(()=>[t(xe,{type:"info",icon:a(vt),onClick:m,loading:a(o).isGitFetching,class:"action-button",style:{color:"white","background-color":"#1e90ff","border-color":"#1e90ff"}},{default:s(()=>l[41]||(l[41]=[D(" 获取所有远程分支 ")])),_:1},8,["icon","loading"])]),_:1})])]),e("div",yn,[l[44]||(l[44]=e("div",{class:"group-title"},"组合操作",-1)),e("div",_n,[t(Qe,{content:"git add + git commit",placement:"top"},{default:s(()=>[t(xe,{type:"primary",icon:a(dt),onClick:L,loading:a(o).isAddingFiles||a(o).isCommiting,disabled:!jt.value||!ae.value,class:"action-button"},{default:s(()=>l[43]||(l[43]=[D(" 暂存并提交 ")])),_:1},8,["icon","loading","disabled"])]),_:1}),t(js,{from:"drawer","has-user-commit-message":ae.value,"final-commit-message":ye.value,"skip-hooks":te.value,onBeforePush:je,onAfterPush:He,onClearFields:re},null,8,["has-user-commit-message","final-commit-message","skip-hooks"])])])]),e("div",wn,[l[47]||(l[47]=e("div",{class:"group-title"},"重置操作",-1)),e("div",bn,[t(Qe,{content:us.value?`撤销${Ot.value}个已暂存文件`:"git reset HEAD",placement:"top"},{default:s(()=>[t(xe,{type:"warning",icon:a(ns),onClick:a(o).resetHead,loading:a(o).isResetting,disabled:!us.value,class:"action-button reset-button"},{default:s(()=>[l[45]||(l[45]=D(" 重置暂存区 ")),Ot.value>0?(c(),b("span",kn,"("+M(Ot.value)+")",1)):U("",!0)]),_:1},8,["icon","onClick","loading","disabled"])]),_:1},8,["content"]),t(Qe,{content:"git reset --hard origin/branch",placement:"top"},{default:s(()=>[t(xe,{type:"danger",icon:a(Ft),onClick:C,loading:a(o).isResetting,disabled:!Is.value,class:"action-button danger-button"},{default:s(()=>l[46]||(l[46]=[D(" 重置到远程 ")])),_:1},8,["icon","loading","disabled"])]),_:1})])]),e("div",$n,[l[49]||(l[49]=e("div",{class:"group-title"},"分支操作",-1)),e("div",Cn,[t(Qe,{content:"合并其他分支到当前分支",placement:"top"},{default:s(()=>[t(xe,{type:"primary",icon:a(ho),onClick:Js,loading:a(o).isGitMerging,class:"action-button merge-button"},{default:s(()=>l[48]||(l[48]=[D(" 合并分支 ")])),_:1},8,["icon","loading"])]),_:1})])]),e("div",Sn,[l[52]||(l[52]=e("div",{class:"group-title"},"储藏操作",-1)),e("div",Tn,[t(Qe,{content:"将工作区更改储藏起来",placement:"top"},{default:s(()=>[t(xe,{type:"warning",onClick:lt,loading:a(o).isSavingStash,disabled:!Us.value,class:"action-button"},{default:s(()=>l[50]||(l[50]=[D(" 储藏更改 ")])),_:1},8,["loading","disabled"])]),_:1}),t(Qe,{content:"查看和管理所有储藏记录",placement:"top"},{default:s(()=>[t(xe,{type:"info",onClick:We,class:"action-button"},{default:s(()=>l[51]||(l[51]=[D(" 储藏列表 ")])),_:1})]),_:1})])])])])]),_:1},8,["modelValue"]),t(Xe,{modelValue:q.value,"onUpdate:modelValue":l[16]||(l[16]=V=>q.value=V),title:"编辑配置 JSON",size:"large","height-mode":"fixed","custom-class":"config-editor-dialog","show-footer":!1},{default:s(()=>[e("div",Vn,[e("div",Fn,[t(W,{class:"info-icon"},{default:s(()=>[t(a(dt))]),_:1}),l[53]||(l[53]=e("span",{class:"info-text"},"编辑当前项目的配置文件",-1))]),e("div",Ln,[t(Mt,{size:"small",type:"info"},{default:s(()=>l[54]||(l[54]=[D("支持JSON格式")])),_:1})])]),e("div",xn,[t(kt,{modelValue:se.value,"onUpdate:modelValue":l[14]||(l[14]=V=>se.value=V),type:"textarea",spellcheck:"false",autocomplete:"off",placeholder:"在此编辑当前项目配置的 JSON...",class:"json-editor"},null,8,["modelValue"])]),e("div",Bn,[e("div",zn,[t(xe,{icon:a(vt),onClick:nt,class:"system-config-btn"},{default:s(()=>l[55]||(l[55]=[D(" 打开系统配置文件 ")])),_:1},8,["icon"])]),e("div",Pn,[t(xe,{onClick:l[15]||(l[15]=V=>q.value=!1)},{default:s(()=>l[56]||(l[56]=[D("取消")])),_:1}),t(xe,{type:"primary",loading:P.value,icon:a(ft),onClick:ot,class:"save-btn"},{default:s(()=>l[57]||(l[57]=[D(" 保存配置 ")])),_:1},8,["loading","icon"])])])]),_:1},8,["modelValue"]),t(ms,{modelValue:ve.value,"onUpdate:modelValue":l[20]||(l[20]=V=>ve.value=V),title:"配置文件格式提示",width:"500px","close-on-click-modal":!1,"close-on-press-escape":!1,"show-close":!1},{footer:s(()=>[e("span",Dn,[t(xe,{onClick:l[17]||(l[17]=V=>Ae("cancel"))},{default:s(()=>l[58]||(l[58]=[D("取消")])),_:1}),t(xe,{type:"info",onClick:l[18]||(l[18]=V=>Ae("open"))},{default:s(()=>l[59]||(l[59]=[D("打开系统配置文件")])),_:1}),t(xe,{type:"primary",onClick:l[19]||(l[19]=V=>Ae("continue"))},{default:s(()=>l[60]||(l[60]=[D("继续编辑")])),_:1})])]),default:s(()=>[e("div",jn,[t(W,{class:"warning-icon",color:"#f56c6c",size:"24"},{default:s(()=>[t(a(hs))]),_:1}),e("p",On,M(ee.value),1)])]),_:1},8,["modelValue"]),t(Zt,{visible:z.value,"onUpdate:visible":l[21]||(l[21]=V=>z.value=V),type:"description",title:"简短描述模板设置",placeholder:"输入新模板内容","edit-placeholder":"编辑模板内容","empty-description":"暂无保存的模板",onUseTemplate:Ee},null,8,["visible"]),t(Zt,{visible:ge.value,"onUpdate:visible":l[22]||(l[22]=V=>ge.value=V),type:"scope",title:"作用域模板设置",placeholder:"输入新作用域模板","edit-placeholder":"编辑作用域模板内容","empty-description":"暂无保存的作用域",onUseTemplate:bt},null,8,["visible"]),t(Zt,{visible:oe.value,"onUpdate:visible":l[23]||(l[23]=V=>oe.value=V),type:"message",title:"默认提交信息设置",placeholder:"输入新模板内容","edit-placeholder":"编辑模板内容","empty-description":"暂无保存的模板","show-default-section":!0,"show-help-text":!0,onUseTemplate:Ns,onSetDefault:Hs},null,8,["visible"]),t(Xe,{modelValue:F.value,"onUpdate:modelValue":l[27]||(l[27]=V=>F.value=V),title:"储藏更改 (Git Stash)",size:"medium","close-on-click-modal":!1,"show-footer":"","confirm-text":"储藏","cancel-text":"取消","confirm-loading":a(o).isSavingStash,"custom-class":"stash-dialog",onConfirm:T},{default:s(()=>[e("div",Mn,[e("div",Rn,[e("div",Gn,[t(W,null,{default:s(()=>[t(a(_o))]),_:1})]),l[61]||(l[61]=e("div",{class:"info-content"},[e("h4",null,"储藏工作区更改"),e("p",null,"将当前工作区的更改临时保存,稍后可以重新应用到任何分支")],-1))]),t(vs,{"label-position":"top",class:"stash-form"},{default:s(()=>[t($t,{label:"储藏说明"},{default:s(()=>[t(kt,{modelValue:le.value,"onUpdate:modelValue":l[24]||(l[24]=V=>le.value=V),placeholder:"为这次储藏添加描述信息(可选)",clearable:"",rows:2,type:"textarea",resize:"none",maxlength:"200","show-word-limit":""},null,8,["modelValue"])]),_:1}),e("div",An,[e("h5",Un,[t(W,null,{default:s(()=>[t(a(Bs))]),_:1}),l[62]||(l[62]=D(" 储藏选项 "))]),e("div",En,[t(Ct,{modelValue:Se.value,"onUpdate:modelValue":l[25]||(l[25]=V=>Se.value=V),size:"large"},{default:s(()=>l[63]||(l[63]=[e("span",{class:"option-label"},"包含未跟踪文件",-1)])),_:1},8,["modelValue"]),l[64]||(l[64]=e("p",{class:"option-desc"},"同时储藏新建但未添加到Git的文件 (--include-untracked)",-1))]),e("div",In,[t(Ct,{modelValue:Te.value,"onUpdate:modelValue":l[26]||(l[26]=V=>Te.value=V),disabled:Wt.value,size:"large"},{default:s(()=>l[65]||(l[65]=[e("span",{class:"option-label"},"排除锁定文件",-1)])),_:1},8,["modelValue","disabled"]),e("p",{class:pe(["option-desc",{disabled:Wt.value}])}," 不储藏被锁定的文件,保持其当前状态 ",2)])]),a(o).status.staged.length>0||a(o).status.unstaged.length>0?(c(),b("div",Nn,[e("h5",Hn,[t(W,null,{default:s(()=>[t(a(Nt))]),_:1}),l[66]||(l[66]=D(" 将要储藏的文件 "))]),e("div",Jn,[a(o).status.staged.length>0?(c(),G(Mt,{key:0,type:"success"},{default:s(()=>[D(" 已暂存: "+M(a(o).status.staged.length)+" 个文件 ",1)]),_:1})):U("",!0),a(o).status.unstaged.length>0?(c(),G(Mt,{key:1,type:"warning"},{default:s(()=>[D(" 未暂存: "+M(a(o).status.unstaged.length)+" 个文件 ",1)]),_:1})):U("",!0)])])):U("",!0)]),_:1})])]),_:1},8,["modelValue","confirm-loading"]),t(ms,{title:"合并分支",modelValue:A.value,"onUpdate:modelValue":l[35]||(l[35]=V=>A.value=V),width:"500px","close-on-click-modal":!1,class:"merge-dialog"},{footer:s(()=>[e("div",Kn,[t(xe,{onClick:l[34]||(l[34]=V=>A.value=!1)},{default:s(()=>l[73]||(l[73]=[D("取消")])),_:1}),t(xe,{type:"primary",onClick:qs,loading:a(o).isGitMerging,disabled:!ce.value,class:"merge-confirm-btn"},{default:s(()=>l[74]||(l[74]=[D(" 合并 ")])),_:1},8,["loading","disabled"])])]),default:s(()=>[e("div",Wn,[e("p",qn,"选择要合并到当前分支 ("+M(a(o).currentBranch)+") 的分支:",1),t(vs,{"label-position":"top"},{default:s(()=>[t($t,{label:"分支类型"},{default:s(()=>[t(oo,{modelValue:mt.value,"onUpdate:modelValue":l[28]||(l[28]=V=>mt.value=V),size:"small"},{default:s(()=>[t(Yt,{label:"all"},{default:s(()=>l[67]||(l[67]=[D("所有分支")])),_:1}),t(Yt,{label:"local"},{default:s(()=>l[68]||(l[68]=[D("本地分支")])),_:1}),t(Yt,{label:"remote"},{default:s(()=>l[69]||(l[69]=[D("远程分支")])),_:1})]),_:1},8,["modelValue"])]),_:1}),t($t,{label:"选择分支"},{default:s(()=>[t(ps,{modelValue:ce.value,"onUpdate:modelValue":l[29]||(l[29]=V=>ce.value=V),placeholder:"选择要合并的分支",style:{width:"100%"},filterable:""},{default:s(()=>[(c(!0),b(Ce,null,Ge(Ws.value,V=>(c(),G(fs,{key:V,label:V,value:V},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])]),_:1}),t($t,{label:"合并选项"},{default:s(()=>[e("div",Yn,[t(Ct,{modelValue:fe.value.noFf,"onUpdate:modelValue":l[30]||(l[30]=V=>fe.value.noFf=V)},{default:s(()=>[t(Qe,{content:"创建合并提交,即使可以使用快进合并",placement:"top"},{default:s(()=>l[70]||(l[70]=[e("span",null,"禁用快进合并 (--no-ff)",-1)])),_:1})]),_:1},8,["modelValue"]),t(Ct,{modelValue:fe.value.squash,"onUpdate:modelValue":l[31]||(l[31]=V=>fe.value.squash=V)},{default:s(()=>[t(Qe,{content:"将多个提交压缩为一个提交",placement:"top"},{default:s(()=>l[71]||(l[71]=[e("span",null,"压缩提交 (--squash)",-1)])),_:1})]),_:1},8,["modelValue"]),t(Ct,{modelValue:fe.value.noCommit,"onUpdate:modelValue":l[32]||(l[32]=V=>fe.value.noCommit=V)},{default:s(()=>[t(Qe,{content:"执行合并但不自动创建提交",placement:"top"},{default:s(()=>l[72]||(l[72]=[e("span",null,"不自动提交 (--no-commit)",-1)])),_:1})]),_:1},8,["modelValue"])])]),_:1}),fe.value.noFf&&!fe.value.noCommit?(c(),G($t,{key:0,label:"合并提交信息 (可选)"},{default:s(()=>[t(kt,{modelValue:fe.value.message,"onUpdate:modelValue":l[33]||(l[33]=V=>fe.value.message=V),type:"textarea",rows:3,placeholder:"输入自定义合并提交信息"},null,8,["modelValue"])]),_:1})):U("",!0)]),_:1})])]),_:1},8,["modelValue"]),t(Xe,{modelValue:ie.value,"onUpdate:modelValue":l[36]||(l[36]=V=>ie.value=V),title:"储藏列表 (Git Stash)",size:"large","show-footer":!1,"custom-class":"stash-list-dialog"},{default:s(()=>[e("div",Qn,[a(o).isLoadingStashes?U("",!0):(c(),b("div",Xn,[e("div",Zn,[e("div",ei,[t(W,{class:"stat-icon"},{default:s(()=>[t(a(vt))]),_:1}),e("span",ti,M(a(o).stashes.length),1),l[75]||(l[75]=e("span",{class:"stat-label"},"个储藏",-1))])]),a(o).stashes.length>0?(c(),b("div",si,[t(xe,{type:"danger",size:"small",icon:a(Ft),onClick:de,loading:a(o).isDroppingStash,class:"clear-all-btn"},{default:s(()=>l[76]||(l[76]=[D(" 清空所有储藏 ")])),_:1},8,["icon","loading"])])):U("",!0)])),at((c(),b("div",oi,[a(o).stashes.length===0&&!a(o).isLoadingStashes?(c(),b("div",ai,[t(ao,{description:"暂无储藏记录","image-size":120},{image:s(()=>[t(W,{class:"empty-icon"},{default:s(()=>[t(a(vt))]),_:1})]),description:s(()=>l[77]||(l[77]=[e("p",{class:"empty-text"},"还没有任何储藏记录",-1),e("p",{class:"empty-hint"},"使用 git stash 可以临时保存工作进度",-1)])),_:1})])):(c(),b("div",li,[(c(!0),b(Ce,null,Ge(a(o).stashes,(V,gs)=>(c(),b("div",{key:V.id,class:pe(["stash-card",{"stash-card-latest":gs===0}])},[e("div",ni,[e("div",ii,[e("div",ri,[e("div",ci,[t(W,{class:"badge-icon"},{default:s(()=>[t(a(vt))]),_:1}),e("span",ui,M(V.id),1),gs===0?(c(),G(Mt,{key:0,size:"small",type:"success",class:"latest-tag"},{default:s(()=>l[78]||(l[78]=[D("最新")])),_:1})):U("",!0)]),e("div",di,[e("span",fi,M(V.description),1)])])]),e("div",pi,[t(xe,{size:"small",type:"info",icon:a(dt),onClick:Kt=>Ve(V),loading:De.value,class:"action-btn view-btn"},{default:s(()=>l[79]||(l[79]=[D(" 查看 ")])),_:2},1032,["icon","onClick","loading"]),t(xe,{size:"small",type:"success",icon:a(ss),onClick:Kt=>r(V.id,!1),loading:a(o).isApplyingStash,class:"action-btn apply-btn"},{default:s(()=>l[80]||(l[80]=[D(" 应用 ")])),_:2},1032,["icon","onClick","loading"]),t(xe,{size:"small",type:"primary",icon:a(ft),onClick:Kt=>r(V.id,!0),loading:a(o).isApplyingStash,class:"action-btn apply-pop-btn"},{default:s(()=>l[81]||(l[81]=[D(" 应用并删除 ")])),_:2},1032,["icon","onClick","loading"]),t(xe,{size:"small",type:"danger",icon:a(Ft),onClick:Kt=>Y(V.id),loading:a(o).isDroppingStash,class:"action-btn delete-btn"},{default:s(()=>l[82]||(l[82]=[D(" 删除 ")])),_:2},1032,["icon","onClick","loading"])])])],2))),128))]))])),[[lo,a(o).isLoadingStashes]])])]),_:1},8,["modelValue"]),t(Xe,{modelValue:Oe.value,"onUpdate:modelValue":l[37]||(l[37]=V=>Oe.value=V),title:"储藏详情","custom-class":"stash-detail-dialog",size:"extra-large",type:"flex","close-on-click-modal":!1},{default:s(()=>[e("div",mi,[we.value?(c(),b("div",vi,[e("div",gi,[l[83]||(l[83]=e("span",{class:"info-label"},"Stash ID:",-1)),e("code",hi,M(we.value.id),1)]),e("div",yi,[l[84]||(l[84]=e("span",{class:"info-label"},"描述:",-1)),e("span",_i,M(we.value.description),1)])])):U("",!0),e("div",wi,[t(cs,{files:_t.value,diffContent:Be.value,selectedFile:Ze.value,context:"stash-detail",emptyText:"该stash没有变更文件",onFileSelect:be,onOpenFile:he,onOpenWithVscode:Ue},null,8,["files","diffContent","selectedFile"])])])]),_:1},8,["modelValue"]),t(rs,{name:"el-fade-in-linear"},{default:s(()=>[N.value?(c(),b("div",bi,[t(W,{class:"is-loading"},{default:s(()=>[t(a(zs))]),_:1}),l[85]||(l[85]=e("span",null,"更新状态中...",-1))])):U("",!0)]),_:1}),t(el,{visible:a(u).visible,text:a(u).text,"show-progress":a(u).showProgress,progress:a(u).progress},null,8,["visible","text","show-progress","progress"]),t(ll,{visible:a(Z).visible,text:a(Z).text,description:a(Z).description},null,8,["visible","text","description"])],64)}}}),$i=Pe(ki,[["__scopeId","data-v-aff17a1d"]]),Ci={class:"log-header"},Si={class:"log-actions"},Ti={key:0,class:"filter-panel-header"},Vi={class:"filter-form"},Fi={class:"filter-item"},Li={class:"filter-item"},xi={class:"filter-item"},Bi={class:"filter-item"},zi={class:"filter-actions"},Pi={key:0},ji={key:1,class:"content-area-content"},Oi={key:0,class:"graph-view"},Di={class:"graph-controls"},Mi={class:"zoom-controls"},Ri={class:"scale-info"},Gi={key:1,class:"table-view-container"},Ai=["onClick"],Ui={class:"commit-message-cell"},Ei={class:"message-content"},Ii={key:0,class:"branch-container"},Ni={class:"message-text"},Hi={class:"author-name"};const Ji={class:"commit-detail-container"},Wi={key:0,class:"commit-info"},qi={class:"commit-info-header"},Yi={class:"info-item"},Ki={class:"item-value"},Qi={class:"info-item"},Xi={class:"item-value"},Zi={class:"info-item"},er={class:"item-value"},tr={class:"commit-message-container"},sr=["innerHTML"],Tt=.5,At=1.5,ts=.1,or=ze({__name:"LogList",setup(I,{expose:w}){const o=st();let i=[];const h=f(i),u=f(""),O=f(!1),_=E(()=>o.isLoadingLog||O.value),R=f(!1),Z=f(0),J=f(!1),N=f(null),y=f(1),Q=f(!0),$=f(!1),H=f(null),X=f(!1),x=f(null),j=f([]),S=f(""),q=f(!1),se=f(""),P=f(1),ve=f(!1),ee=f(!1),g=f([]),z=f(""),A=f(null),ce=f([]),fe=f([]),me=f([]),ge=f(!1),oe=f(0),te=f(0),ue=f(null),ke=E(()=>h.value),B=E(()=>j.value.map(k=>({path:k,name:k.split("/").pop()||k})));async function F(k=!1,v=1){if(!st().isGitRepo){u.value="当前目录不是Git仓库";return}try{v>1?$.value=!0:O.value=!0;const d=new URLSearchParams;d.append("page",v.toString()),d.append("all",k.toString()),d.append("with_parents","true"),g.value.length>0&&d.append("author",g.value.join(",")),fe.value.length>0&&d.append("branch",fe.value.join(",")),z.value&&d.append("message",z.value),A.value&&Array.isArray(A.value)&&A.value.length===2&&(d.append("dateFrom",A.value[0]),d.append("dateTo",A.value[1])),d.append("_t",Date.now().toString());const L=await(await fetch(`/api/log?${d.toString()}`)).json();if(!L||!L.data||!Array.isArray(L.data)){u.value="加载提交历史失败: 服务器返回数据格式不正确";return}const C=v>1;C?L.data.forEach(re=>i.push(re)):(i.length=0,L.data.forEach(re=>i.push(re))),h.value=[...i],y.value=v,Z.value=L.total||i.length,Q.value=L.hasMore===!0,C||(ve.value=!0,setTimeout(()=>{ve.value=!1},2e3)),!C&&J.value?setTimeout(ie,0):!C&&!J.value&&!k&&ct(()=>{De(),setTimeout(it,200)}),u.value=""}catch(d){u.value="加载提交历史失败: "+(d instanceof Error?d.message:String(d)),v>1&&(Q.value=!1)}finally{v>1?$.value=!1:O.value=!1}}async function ie(){if(N.value&&i.length!==0)try{N.value.innerHTML="";const k=jo(N.value,{orientation:"vertical-reverse",template:"metro",author:"提交者 <committer@example.com>"}),v={},K=k.branch(o.currentBranch||"main");v[o.currentBranch||"main"]=K,i.forEach(d=>{let m=K;if(d.branch){const L=Te(d.branch.split(",")[0]);v[L]||(v[L]=k.branch(L)),m=v[L]}m.commit({hash:d.hash,subject:d.message,author:`${d.author} <${d.email}>`})}),setTimeout(()=>{We()},100)}catch(k){u.value="渲染图表失败: "+(k instanceof Error?k.message:String(k))}}function le(){J.value=!J.value,J.value&&i.length>0&&setTimeout(ie,0)}function Se(){R.value=!R.value,R.value||(Q.value=!0),y.value=1,F(R.value),ct(()=>{setTimeout(()=>{!J.value&&!R.value&&(De(),it())},300)})}function Te(k){return k.includes("HEAD -> ")?k.replace("HEAD -> ",""):k.includes("origin/")?k:k.trim()}function Oe(k){return k.includes("HEAD")?"success":k.includes("origin/")?"warning":"info"}const we=f(null),ne=f(null);function Be(k){if(J.value||!Q.value||$.value||_.value)return;const v=k.target,{scrollTop:K,scrollHeight:d,clientHeight:m}=v;d-K-m<=20&&be()}function De(){if(!we.value)return;const k=we.value.$el.querySelector(".el-table__body-wrapper");k&&(ne.value=k,ne.value&&(ne.value.removeEventListener("scroll",Be,!0),ne.value.addEventListener("scroll",Be,!0)))}function Ze(){ne.value&&(ne.value.removeEventListener("scroll",Be,!0),ne.value=null)}function lt(k){k.key==="Escape"&&Ee.value&&(Ee.value=!1)}ht(()=>{o.isGitRepo?(o.log.length>0?(i.length=0,o.log.forEach(k=>i.push(k)),Z.value=o.log.length,J.value&&setTimeout(()=>{ie()},100)):F(),Fe()):u.value="当前目录不是Git仓库",ct(()=>{setTimeout(()=>{De()},500)}),Re(()=>we.value,k=>{k&&!J.value&&!R.value&&ct(()=>{De()})}),window.addEventListener("keydown",lt)}),Re(()=>o.allBranches,k=>{k&&k.length>0?me.value=[...k].sort():me.value=[]},{immediate:!0}),$o(()=>{Ze(),H.value!==null&&(window.clearInterval(H.value),H.value=null),window.removeEventListener("keydown",lt)});async function Ke(){await o.fetchLog(!0),i.length=0,o.log.forEach(k=>i.push(k)),h.value=[...i],Z.value=o.log.length,y.value=1,Q.value=!1,ve.value=!0,setTimeout(()=>{ve.value=!1},2e3),J.value&&(await ct(),ie())}Re(()=>o.log,k=>{try{i.length=0,Array.isArray(k)&&k.forEach(v=>v&&i.push(v)),Z.value=i.length,y.value=1,h.value=[...i],ve.value=!0,setTimeout(()=>{ve.value=!1},2e3),J.value&&i.length>0&&setTimeout(ie,0)}catch{}},{immediate:!0}),w({refreshLog:Ke});function ot(){P.value<At&&(P.value=Math.min(At,P.value+ts),Ae())}function nt(){P.value>Tt&&(P.value=Math.max(Tt,P.value-ts),Ae())}function Ae(){if(!N.value)return;const k=N.value.querySelector("svg");k&&(k.style.transform=`scale(${P.value})`,k.style.transformOrigin="top left")}function We(){if(!N.value)return;const k=N.value.querySelector("svg");if(!k)return;const v=k.getBoundingClientRect().width/P.value,K=N.value.clientWidth;v>K?P.value=Math.max(Tt,K/v):P.value=1,Ae()}async function T(k){if(k){x.value=k,X.value=!0,q.value=!0,j.value=[],S.value="",se.value="";try{if(!k.hash||k.hash.length<7){S.value="无效的提交哈希值",q.value=!1;return}const K=await(await fetch(`/api/commit-files?hash=${k.hash}`)).json();K.success&&Array.isArray(K.files)?(j.value=K.files,j.value.length>0?await r(k.hash,j.value[0]):S.value="该提交没有变更文件"):S.value=`获取文件列表失败: ${K.error||"未知错误"}`}catch(v){S.value=`获取提交详情失败: ${v.message}`}finally{q.value=!1}}}async function r(k,v){q.value=!0,se.value=v;try{const d=await(await fetch(`/api/commit-file-diff?hash=${k}&file=${encodeURIComponent(v)}`)).json();d.success?S.value=d.diff||"没有变更内容":S.value=`获取差异失败: ${d.error||"未知错误"}`}catch(K){S.value=`获取差异失败: ${K.message}`}finally{q.value=!1}}function Y(k){x.value&&r(x.value.hash,k)}async function de(k,v){try{const d=await(await fetch("/api/open-file",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({filePath:k,context:v})})).json();d.success?n.success(d.message):n.error(d.error||"打开文件失败")}catch(K){n.error(`打开文件失败: ${K.message}`)}}async function Ve(k,v){try{const d=await(await fetch("/api/open-with-vscode",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({filePath:k,context:v})})).json();d.success?n.success(d.message):n.error(d.error||"用VSCode打开文件失败")}catch(K){n.error(`用VSCode打开文件失败: ${K.message}`)}}async function Ne(k){try{const v=Ho(k);await navigator.clipboard.writeText(v),n.success("提交信息已复制到剪贴板")}catch{n.error("复制失败")}}function be(){!Q.value||$.value||_.value||F(R.value,y.value+1)}function he(){g.value=[],fe.value=[],z.value="",A.value=null,y.value=1,F(R.value,1)}function Ue(){y.value=1,F(R.value,1)}async function Fe(){try{const v=await(await fetch("/api/authors")).json();v.success&&Array.isArray(v.authors)?ce.value=v.authors.sort():ye()}catch{ye()}}function ye(){const k=new Set;h.value.forEach(v=>{v.author&&k.add(v.author)}),ce.value=Array.from(k).sort()}Re(()=>h.value,()=>{},{deep:!0});function ae(k,v,K){K.preventDefault(),oe.value=K.clientY,te.value=K.clientX,ue.value=k,ge.value=!0;const d=()=>{ge.value=!1,document.removeEventListener("click",d)};setTimeout(()=>{document.addEventListener("click",d)},0)}async function Je(k){if(k)try{await Ye.confirm(`确定要撤销提交 ${k.hash.substring(0,7)} 吗?这将创建一个新的提交来撤销这次提交的更改。`,"撤销提交确认",{confirmButtonText:"确认",cancelButtonText:"取消",type:"warning"});const K=await(await fetch("/api/revert-commit",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({hash:k.hash})})).json();K.success?(n.success(K.message||"已成功撤销提交"),Ke(),o.fetchStatus(),o.getBranchStatus()):n.error(K.error||"撤销提交失败")}catch(v){v!=="cancel"&&n.error("撤销提交失败: "+(v.message||v))}}async function pt(k){if(k)try{await Ye.confirm(`确定要将提交 ${k.hash.substring(0,7)} Cherry-Pick 到当前分支吗?`,"Cherry-Pick确认",{confirmButtonText:"确认",cancelButtonText:"取消",type:"warning"});const K=await(await fetch("/api/cherry-pick-commit",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({hash:k.hash})})).json();K.success?(n.success(K.message||"已成功Cherry-Pick提交"),Ke(),o.fetchStatus(),o.getBranchStatus()):n.error(K.error||"Cherry-Pick提交失败")}catch(v){v!=="cancel"&&n.error("Cherry-Pick提交失败: "+(v.message||v))}}async function _t(k){if(k)try{await navigator.clipboard.writeText(k.hash),n.success(`已复制提交哈希: ${k.hash.substring(0,7)}`)}catch(v){n.error(`复制提交哈希失败: ${v.message}`)}}async function wt(k){if(k)try{await Ye.confirm(`确定要将当前分支重置(hard)到提交 ${k.hash.substring(0,7)} 吗?
|
|
21
|
+
git config --global user.email "your.email@example.com"`,-1)])),_:1})])):(c(),b("div",sn,[t(Fl,{command:wt.value,title:"提交命令预览:",placeholder:'git commit -m "<提交信息>"'},null,8,["command"]),$.value?(c(),b("div",ln,[e("div",nn,[e("div",rn,[t(ps,{modelValue:H.value,"onUpdate:modelValue":l[5]||(l[5]=V=>H.value=V),placeholder:"提交类型",class:"type-select",clearable:""},{default:s(()=>[(c(),b(Ce,null,Ge(B,V=>t(fs,{key:V.value,label:V.label,value:V.value},null,8,["label","value"])),64))]),_:1},8,["modelValue"]),e("div",cn,[t(Le,{modelValue:X.value,"onUpdate:modelValue":l[6]||(l[6]=V=>X.value=V),"fetch-suggestions":Qs,placeholder:"作用域(可选)",class:"scope-input",clearable:"",onSelect:Zs},null,8,["modelValue"])]),e("div",un,[t(Le,{modelValue:x.value,"onUpdate:modelValue":l[7]||(l[7]=V=>x.value=V),"fetch-suggestions":Ks,placeholder:pt.value,class:"description-input",clearable:"",onSelect:Xs,onKeydown:ds},null,8,["modelValue","placeholder"])])])]),e("div",{class:"advanced-options-toggle",onClick:l[8]||(l[8]=V=>ke.value=!ke.value)},[e("span",null,M(ke.value?"收起":"正文及页脚"),1),t(W,{class:pe(["toggle-icon",{"is-active":ke.value}])},{default:s(()=>[t(a(Ht))]),_:1},8,["class"])]),at(e("div",dn,[t(kt,{modelValue:j.value,"onUpdate:modelValue":l[9]||(l[9]=V=>j.value=V),type:"textarea",rows:4,placeholder:"正文(可选):详细描述本次提交的内容和原因",class:"body-input",clearable:""},null,8,["modelValue"]),t(kt,{modelValue:S.value,"onUpdate:modelValue":l[10]||(l[10]=V=>S.value=V),placeholder:"页脚(可选):如 Closes #123",class:"footer-input",clearable:""},null,8,["modelValue"])],512),[[Bt,ke.value]])])):(c(),b("div",on,[e("div",an,[t(Le,{modelValue:h.value,"onUpdate:modelValue":l[4]||(l[4]=V=>h.value=V),"fetch-suggestions":eo,placeholder:Je.value,type:"textarea",rows:3,resize:"none",class:"commit-message-input",onSelect:to,onKeydown:ds},null,8,["modelValue","placeholder"])])]))]))])])],2),t(so,{modelValue:Dt.value,"onUpdate:modelValue":l[13]||(l[13]=V=>Dt.value=V),title:"Git 操作",direction:"rtl",size:"362px","with-header":!0,"show-close":!0,"destroy-on-close":!1,class:"git-operations-drawer"},{default:s(()=>[e("div",fn,[e("div",pn,[e("div",mn,[e("div",vn,[l[42]||(l[42]=e("div",{class:"group-title"},"基础操作",-1)),e("div",gn,[t(Os,{onClick:()=>{},from:"drawer"}),t(Ds,{"has-user-commit-message":ae.value,"final-commit-message":ye.value,"skip-hooks":te.value,onBeforeCommit:()=>{},onAfterCommit:l[11]||(l[11]=V=>{V&&re()}),onClick:()=>{},from:"drawer"},null,8,["has-user-commit-message","final-commit-message","skip-hooks"]),t(Ms,{onBeforePush:()=>{},onAfterPush:l[12]||(l[12]=V=>{V&&K()}),onClick:()=>{},from:"drawer"}),t(Qe,{content:qt.value?`拉取${a(o).branchBehind}个远程提交`:"git pull",placement:"top"},{default:s(()=>[t(xe,{type:"primary",icon:a(ss),onClick:d,loading:a(o).isGitPulling,disabled:!a(o).hasUpstream,class:"action-button",style:yt(a(o).hasUpstream?{color:"white",backgroundColor:"#1e90ff",borderColor:"#1e90ff"}:{})},{default:s(()=>[l[40]||(l[40]=D(" 拉取 ")),qt.value?(c(),b("span",hn,"("+M(a(o).branchBehind)+")",1)):U("",!0)]),_:1},8,["icon","loading","disabled","style"])]),_:1},8,["content"]),t(Qe,{content:"git fetch --all",placement:"top"},{default:s(()=>[t(xe,{type:"info",icon:a(vt),onClick:m,loading:a(o).isGitFetching,class:"action-button",style:{color:"white","background-color":"#1e90ff","border-color":"#1e90ff"}},{default:s(()=>l[41]||(l[41]=[D(" 获取所有远程分支 ")])),_:1},8,["icon","loading"])]),_:1})])]),e("div",yn,[l[44]||(l[44]=e("div",{class:"group-title"},"组合操作",-1)),e("div",_n,[t(Qe,{content:"git add + git commit",placement:"top"},{default:s(()=>[t(xe,{type:"primary",icon:a(dt),onClick:L,loading:a(o).isAddingFiles||a(o).isCommiting,disabled:!jt.value||!ae.value,class:"action-button"},{default:s(()=>l[43]||(l[43]=[D(" 暂存并提交 ")])),_:1},8,["icon","loading","disabled"])]),_:1}),t(js,{from:"drawer","has-user-commit-message":ae.value,"final-commit-message":ye.value,"skip-hooks":te.value,onBeforePush:je,onAfterPush:He,onClearFields:re},null,8,["has-user-commit-message","final-commit-message","skip-hooks"])])])]),e("div",wn,[l[47]||(l[47]=e("div",{class:"group-title"},"重置操作",-1)),e("div",bn,[t(Qe,{content:us.value?`撤销${Ot.value}个已暂存文件`:"git reset HEAD",placement:"top"},{default:s(()=>[t(xe,{type:"warning",icon:a(ns),onClick:a(o).resetHead,loading:a(o).isResetting,disabled:!us.value,class:"action-button reset-button"},{default:s(()=>[l[45]||(l[45]=D(" 重置暂存区 ")),Ot.value>0?(c(),b("span",kn,"("+M(Ot.value)+")",1)):U("",!0)]),_:1},8,["icon","onClick","loading","disabled"])]),_:1},8,["content"]),t(Qe,{content:"git reset --hard origin/branch",placement:"top"},{default:s(()=>[t(xe,{type:"danger",icon:a(Ft),onClick:C,loading:a(o).isResetting,disabled:!Is.value,class:"action-button danger-button"},{default:s(()=>l[46]||(l[46]=[D(" 重置到远程 ")])),_:1},8,["icon","loading","disabled"])]),_:1})])]),e("div",$n,[l[49]||(l[49]=e("div",{class:"group-title"},"分支操作",-1)),e("div",Cn,[t(Qe,{content:"合并其他分支到当前分支",placement:"top"},{default:s(()=>[t(xe,{type:"primary",icon:a(ho),onClick:Js,loading:a(o).isGitMerging,class:"action-button merge-button"},{default:s(()=>l[48]||(l[48]=[D(" 合并分支 ")])),_:1},8,["icon","loading"])]),_:1})])]),e("div",Sn,[l[52]||(l[52]=e("div",{class:"group-title"},"储藏操作",-1)),e("div",Tn,[t(Qe,{content:"将工作区更改储藏起来",placement:"top"},{default:s(()=>[t(xe,{type:"warning",onClick:lt,loading:a(o).isSavingStash,disabled:!Us.value,class:"action-button"},{default:s(()=>l[50]||(l[50]=[D(" 储藏更改 ")])),_:1},8,["loading","disabled"])]),_:1}),t(Qe,{content:"查看和管理所有储藏记录",placement:"top"},{default:s(()=>[t(xe,{type:"info",onClick:We,class:"action-button"},{default:s(()=>l[51]||(l[51]=[D(" 储藏列表 ")])),_:1})]),_:1})])])])])]),_:1},8,["modelValue"]),t(Xe,{modelValue:q.value,"onUpdate:modelValue":l[16]||(l[16]=V=>q.value=V),title:"编辑配置 JSON",size:"large","height-mode":"fixed","custom-class":"config-editor-dialog","show-footer":!1},{default:s(()=>[e("div",Vn,[e("div",Fn,[t(W,{class:"info-icon"},{default:s(()=>[t(a(dt))]),_:1}),l[53]||(l[53]=e("span",{class:"info-text"},"编辑当前项目的配置文件",-1))]),e("div",Ln,[t(Mt,{size:"small",type:"info"},{default:s(()=>l[54]||(l[54]=[D("支持JSON格式")])),_:1})])]),e("div",xn,[t(kt,{modelValue:se.value,"onUpdate:modelValue":l[14]||(l[14]=V=>se.value=V),type:"textarea",spellcheck:"false",autocomplete:"off",placeholder:"在此编辑当前项目配置的 JSON...",class:"json-editor"},null,8,["modelValue"])]),e("div",Bn,[e("div",zn,[t(xe,{icon:a(vt),onClick:nt,class:"system-config-btn"},{default:s(()=>l[55]||(l[55]=[D(" 打开系统配置文件 ")])),_:1},8,["icon"])]),e("div",Pn,[t(xe,{onClick:l[15]||(l[15]=V=>q.value=!1)},{default:s(()=>l[56]||(l[56]=[D("取消")])),_:1}),t(xe,{type:"primary",loading:P.value,icon:a(ft),onClick:ot,class:"save-btn"},{default:s(()=>l[57]||(l[57]=[D(" 保存配置 ")])),_:1},8,["loading","icon"])])])]),_:1},8,["modelValue"]),t(ms,{modelValue:ve.value,"onUpdate:modelValue":l[20]||(l[20]=V=>ve.value=V),title:"配置文件格式提示",width:"500px","close-on-click-modal":!1,"close-on-press-escape":!1,"show-close":!1},{footer:s(()=>[e("span",Dn,[t(xe,{onClick:l[17]||(l[17]=V=>Ae("cancel"))},{default:s(()=>l[58]||(l[58]=[D("取消")])),_:1}),t(xe,{type:"info",onClick:l[18]||(l[18]=V=>Ae("open"))},{default:s(()=>l[59]||(l[59]=[D("打开系统配置文件")])),_:1}),t(xe,{type:"primary",onClick:l[19]||(l[19]=V=>Ae("continue"))},{default:s(()=>l[60]||(l[60]=[D("继续编辑")])),_:1})])]),default:s(()=>[e("div",jn,[t(W,{class:"warning-icon",color:"#f56c6c",size:"24"},{default:s(()=>[t(a(hs))]),_:1}),e("p",On,M(ee.value),1)])]),_:1},8,["modelValue"]),t(Zt,{visible:z.value,"onUpdate:visible":l[21]||(l[21]=V=>z.value=V),type:"description",title:"简短描述模板设置",placeholder:"输入新模板内容","edit-placeholder":"编辑模板内容","empty-description":"暂无保存的模板",onUseTemplate:Ee},null,8,["visible"]),t(Zt,{visible:ge.value,"onUpdate:visible":l[22]||(l[22]=V=>ge.value=V),type:"scope",title:"作用域模板设置",placeholder:"输入新作用域模板","edit-placeholder":"编辑作用域模板内容","empty-description":"暂无保存的作用域",onUseTemplate:bt},null,8,["visible"]),t(Zt,{visible:oe.value,"onUpdate:visible":l[23]||(l[23]=V=>oe.value=V),type:"message",title:"默认提交信息设置",placeholder:"输入新模板内容","edit-placeholder":"编辑模板内容","empty-description":"暂无保存的模板","show-default-section":!0,"show-help-text":!0,onUseTemplate:Ns,onSetDefault:Hs},null,8,["visible"]),t(Xe,{modelValue:F.value,"onUpdate:modelValue":l[27]||(l[27]=V=>F.value=V),title:"储藏更改 (Git Stash)",size:"medium","close-on-click-modal":!1,"show-footer":"","confirm-text":"储藏","cancel-text":"取消","confirm-loading":a(o).isSavingStash,"custom-class":"stash-dialog",onConfirm:T},{default:s(()=>[e("div",Mn,[e("div",Rn,[e("div",Gn,[t(W,null,{default:s(()=>[t(a(_o))]),_:1})]),l[61]||(l[61]=e("div",{class:"info-content"},[e("h4",null,"储藏工作区更改"),e("p",null,"将当前工作区的更改临时保存,稍后可以重新应用到任何分支")],-1))]),t(vs,{"label-position":"top",class:"stash-form"},{default:s(()=>[t($t,{label:"储藏说明"},{default:s(()=>[t(kt,{modelValue:le.value,"onUpdate:modelValue":l[24]||(l[24]=V=>le.value=V),placeholder:"为这次储藏添加描述信息(可选)",clearable:"",rows:2,type:"textarea",resize:"none",maxlength:"200","show-word-limit":""},null,8,["modelValue"])]),_:1}),e("div",An,[e("h5",Un,[t(W,null,{default:s(()=>[t(a(Bs))]),_:1}),l[62]||(l[62]=D(" 储藏选项 "))]),e("div",En,[t(Ct,{modelValue:Se.value,"onUpdate:modelValue":l[25]||(l[25]=V=>Se.value=V),size:"large"},{default:s(()=>l[63]||(l[63]=[e("span",{class:"option-label"},"包含未跟踪文件",-1)])),_:1},8,["modelValue"]),l[64]||(l[64]=e("p",{class:"option-desc"},"同时储藏新建但未添加到Git的文件 (--include-untracked)",-1))]),e("div",In,[t(Ct,{modelValue:Te.value,"onUpdate:modelValue":l[26]||(l[26]=V=>Te.value=V),disabled:Wt.value,size:"large"},{default:s(()=>l[65]||(l[65]=[e("span",{class:"option-label"},"排除锁定文件",-1)])),_:1},8,["modelValue","disabled"]),e("p",{class:pe(["option-desc",{disabled:Wt.value}])}," 不储藏被锁定的文件,保持其当前状态 ",2)])]),a(o).status.staged.length>0||a(o).status.unstaged.length>0?(c(),b("div",Nn,[e("h5",Hn,[t(W,null,{default:s(()=>[t(a(Nt))]),_:1}),l[66]||(l[66]=D(" 将要储藏的文件 "))]),e("div",Jn,[a(o).status.staged.length>0?(c(),G(Mt,{key:0,type:"success"},{default:s(()=>[D(" 已暂存: "+M(a(o).status.staged.length)+" 个文件 ",1)]),_:1})):U("",!0),a(o).status.unstaged.length>0?(c(),G(Mt,{key:1,type:"warning"},{default:s(()=>[D(" 未暂存: "+M(a(o).status.unstaged.length)+" 个文件 ",1)]),_:1})):U("",!0)])])):U("",!0)]),_:1})])]),_:1},8,["modelValue","confirm-loading"]),t(ms,{title:"合并分支",modelValue:A.value,"onUpdate:modelValue":l[35]||(l[35]=V=>A.value=V),width:"500px","close-on-click-modal":!1,class:"merge-dialog"},{footer:s(()=>[e("div",Kn,[t(xe,{onClick:l[34]||(l[34]=V=>A.value=!1)},{default:s(()=>l[73]||(l[73]=[D("取消")])),_:1}),t(xe,{type:"primary",onClick:qs,loading:a(o).isGitMerging,disabled:!ce.value,class:"merge-confirm-btn"},{default:s(()=>l[74]||(l[74]=[D(" 合并 ")])),_:1},8,["loading","disabled"])])]),default:s(()=>[e("div",Wn,[e("p",qn,"选择要合并到当前分支 ("+M(a(o).currentBranch)+") 的分支:",1),t(vs,{"label-position":"top"},{default:s(()=>[t($t,{label:"分支类型"},{default:s(()=>[t(oo,{modelValue:mt.value,"onUpdate:modelValue":l[28]||(l[28]=V=>mt.value=V),size:"small"},{default:s(()=>[t(Yt,{label:"all"},{default:s(()=>l[67]||(l[67]=[D("所有分支")])),_:1}),t(Yt,{label:"local"},{default:s(()=>l[68]||(l[68]=[D("本地分支")])),_:1}),t(Yt,{label:"remote"},{default:s(()=>l[69]||(l[69]=[D("远程分支")])),_:1})]),_:1},8,["modelValue"])]),_:1}),t($t,{label:"选择分支"},{default:s(()=>[t(ps,{modelValue:ce.value,"onUpdate:modelValue":l[29]||(l[29]=V=>ce.value=V),placeholder:"选择要合并的分支",style:{width:"100%"},filterable:""},{default:s(()=>[(c(!0),b(Ce,null,Ge(Ws.value,V=>(c(),G(fs,{key:V,label:V,value:V},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])]),_:1}),t($t,{label:"合并选项"},{default:s(()=>[e("div",Yn,[t(Ct,{modelValue:fe.value.noFf,"onUpdate:modelValue":l[30]||(l[30]=V=>fe.value.noFf=V)},{default:s(()=>[t(Qe,{content:"创建合并提交,即使可以使用快进合并",placement:"top"},{default:s(()=>l[70]||(l[70]=[e("span",null,"禁用快进合并 (--no-ff)",-1)])),_:1})]),_:1},8,["modelValue"]),t(Ct,{modelValue:fe.value.squash,"onUpdate:modelValue":l[31]||(l[31]=V=>fe.value.squash=V)},{default:s(()=>[t(Qe,{content:"将多个提交压缩为一个提交",placement:"top"},{default:s(()=>l[71]||(l[71]=[e("span",null,"压缩提交 (--squash)",-1)])),_:1})]),_:1},8,["modelValue"]),t(Ct,{modelValue:fe.value.noCommit,"onUpdate:modelValue":l[32]||(l[32]=V=>fe.value.noCommit=V)},{default:s(()=>[t(Qe,{content:"执行合并但不自动创建提交",placement:"top"},{default:s(()=>l[72]||(l[72]=[e("span",null,"不自动提交 (--no-commit)",-1)])),_:1})]),_:1},8,["modelValue"])])]),_:1}),fe.value.noFf&&!fe.value.noCommit?(c(),G($t,{key:0,label:"合并提交信息 (可选)"},{default:s(()=>[t(kt,{modelValue:fe.value.message,"onUpdate:modelValue":l[33]||(l[33]=V=>fe.value.message=V),type:"textarea",rows:3,placeholder:"输入自定义合并提交信息"},null,8,["modelValue"])]),_:1})):U("",!0)]),_:1})])]),_:1},8,["modelValue"]),t(Xe,{modelValue:ie.value,"onUpdate:modelValue":l[36]||(l[36]=V=>ie.value=V),title:"储藏列表 (Git Stash)",size:"large","show-footer":!1,"custom-class":"stash-list-dialog"},{default:s(()=>[e("div",Qn,[a(o).isLoadingStashes?U("",!0):(c(),b("div",Xn,[e("div",Zn,[e("div",ei,[t(W,{class:"stat-icon"},{default:s(()=>[t(a(vt))]),_:1}),e("span",ti,M(a(o).stashes.length),1),l[75]||(l[75]=e("span",{class:"stat-label"},"个储藏",-1))])]),a(o).stashes.length>0?(c(),b("div",si,[t(xe,{type:"danger",size:"small",icon:a(Ft),onClick:de,loading:a(o).isDroppingStash,class:"clear-all-btn"},{default:s(()=>l[76]||(l[76]=[D(" 清空所有储藏 ")])),_:1},8,["icon","loading"])])):U("",!0)])),at((c(),b("div",oi,[a(o).stashes.length===0&&!a(o).isLoadingStashes?(c(),b("div",ai,[t(ao,{description:"暂无储藏记录","image-size":120},{image:s(()=>[t(W,{class:"empty-icon"},{default:s(()=>[t(a(vt))]),_:1})]),description:s(()=>l[77]||(l[77]=[e("p",{class:"empty-text"},"还没有任何储藏记录",-1),e("p",{class:"empty-hint"},"使用 git stash 可以临时保存工作进度",-1)])),_:1})])):(c(),b("div",li,[(c(!0),b(Ce,null,Ge(a(o).stashes,(V,gs)=>(c(),b("div",{key:V.id,class:pe(["stash-card",{"stash-card-latest":gs===0}])},[e("div",ni,[e("div",ii,[e("div",ri,[e("div",ci,[t(W,{class:"badge-icon"},{default:s(()=>[t(a(vt))]),_:1}),e("span",ui,M(V.id),1),gs===0?(c(),G(Mt,{key:0,size:"small",type:"success",class:"latest-tag"},{default:s(()=>l[78]||(l[78]=[D("最新")])),_:1})):U("",!0)]),e("div",di,[e("span",fi,M(V.description),1)])])]),e("div",pi,[t(xe,{size:"small",type:"info",icon:a(dt),onClick:Kt=>Ve(V),loading:De.value,class:"action-btn view-btn"},{default:s(()=>l[79]||(l[79]=[D(" 查看 ")])),_:2},1032,["icon","onClick","loading"]),t(xe,{size:"small",type:"success",icon:a(ss),onClick:Kt=>r(V.id,!1),loading:a(o).isApplyingStash,class:"action-btn apply-btn"},{default:s(()=>l[80]||(l[80]=[D(" 应用 ")])),_:2},1032,["icon","onClick","loading"]),t(xe,{size:"small",type:"primary",icon:a(ft),onClick:Kt=>r(V.id,!0),loading:a(o).isApplyingStash,class:"action-btn apply-pop-btn"},{default:s(()=>l[81]||(l[81]=[D(" 应用并删除 ")])),_:2},1032,["icon","onClick","loading"]),t(xe,{size:"small",type:"danger",icon:a(Ft),onClick:Kt=>Y(V.id),loading:a(o).isDroppingStash,class:"action-btn delete-btn"},{default:s(()=>l[82]||(l[82]=[D(" 删除 ")])),_:2},1032,["icon","onClick","loading"])])])],2))),128))]))])),[[lo,a(o).isLoadingStashes]])])]),_:1},8,["modelValue"]),t(Xe,{modelValue:Oe.value,"onUpdate:modelValue":l[37]||(l[37]=V=>Oe.value=V),title:"储藏详情","custom-class":"stash-detail-dialog",size:"extra-large",type:"flex","close-on-click-modal":!1},{default:s(()=>[e("div",mi,[we.value?(c(),b("div",vi,[e("div",gi,[l[83]||(l[83]=e("span",{class:"info-label"},"Stash ID:",-1)),e("code",hi,M(we.value.id),1)]),e("div",yi,[l[84]||(l[84]=e("span",{class:"info-label"},"描述:",-1)),e("span",_i,M(we.value.description),1)])])):U("",!0),e("div",wi,[t(cs,{files:_t.value,diffContent:Be.value,selectedFile:Ze.value,context:"stash-detail",emptyText:"该stash没有变更文件",onFileSelect:be,onOpenFile:he,onOpenWithVscode:Ue},null,8,["files","diffContent","selectedFile"])])])]),_:1},8,["modelValue"]),t(rs,{name:"el-fade-in-linear"},{default:s(()=>[N.value?(c(),b("div",bi,[t(W,{class:"is-loading"},{default:s(()=>[t(a(zs))]),_:1}),l[85]||(l[85]=e("span",null,"更新状态中...",-1))])):U("",!0)]),_:1}),t(el,{visible:a(u).visible,text:a(u).text,"show-progress":a(u).showProgress,progress:a(u).progress},null,8,["visible","text","show-progress","progress"]),t(ll,{visible:a(Z).visible,text:a(Z).text,description:a(Z).description},null,8,["visible","text","description"])],64)}}}),$i=Pe(ki,[["__scopeId","data-v-b7c5c496"]]),Ci={class:"log-header"},Si={class:"log-actions"},Ti={key:0,class:"filter-panel-header"},Vi={class:"filter-form"},Fi={class:"filter-item"},Li={class:"filter-item"},xi={class:"filter-item"},Bi={class:"filter-item"},zi={class:"filter-actions"},Pi={key:0},ji={key:1,class:"content-area-content"},Oi={key:0,class:"graph-view"},Di={class:"graph-controls"},Mi={class:"zoom-controls"},Ri={class:"scale-info"},Gi={key:1,class:"table-view-container"},Ai=["onClick"],Ui={class:"commit-message-cell"},Ei={class:"message-content"},Ii={key:0,class:"branch-container"},Ni={class:"message-text"},Hi={class:"author-name"};const Ji={class:"commit-detail-container"},Wi={key:0,class:"commit-info"},qi={class:"commit-info-header"},Yi={class:"info-item"},Ki={class:"item-value"},Qi={class:"info-item"},Xi={class:"item-value"},Zi={class:"info-item"},er={class:"item-value"},tr={class:"commit-message-container"},sr=["innerHTML"],Tt=.5,At=1.5,ts=.1,or=ze({__name:"LogList",setup(I,{expose:w}){const o=st();let i=[];const h=f(i),u=f(""),O=f(!1),_=E(()=>o.isLoadingLog||O.value),R=f(!1),Z=f(0),J=f(!1),N=f(null),y=f(1),Q=f(!0),$=f(!1),H=f(null),X=f(!1),x=f(null),j=f([]),S=f(""),q=f(!1),se=f(""),P=f(1),ve=f(!1),ee=f(!1),g=f([]),z=f(""),A=f(null),ce=f([]),fe=f([]),me=f([]),ge=f(!1),oe=f(0),te=f(0),ue=f(null),ke=E(()=>h.value),B=E(()=>j.value.map(k=>({path:k,name:k.split("/").pop()||k})));async function F(k=!1,v=1){if(!st().isGitRepo){u.value="当前目录不是Git仓库";return}try{v>1?$.value=!0:O.value=!0;const d=new URLSearchParams;d.append("page",v.toString()),d.append("all",k.toString()),d.append("with_parents","true"),g.value.length>0&&d.append("author",g.value.join(",")),fe.value.length>0&&d.append("branch",fe.value.join(",")),z.value&&d.append("message",z.value),A.value&&Array.isArray(A.value)&&A.value.length===2&&(d.append("dateFrom",A.value[0]),d.append("dateTo",A.value[1])),d.append("_t",Date.now().toString());const L=await(await fetch(`/api/log?${d.toString()}`)).json();if(!L||!L.data||!Array.isArray(L.data)){u.value="加载提交历史失败: 服务器返回数据格式不正确";return}const C=v>1;C?L.data.forEach(re=>i.push(re)):(i.length=0,L.data.forEach(re=>i.push(re))),h.value=[...i],y.value=v,Z.value=L.total||i.length,Q.value=L.hasMore===!0,C||(ve.value=!0,setTimeout(()=>{ve.value=!1},2e3)),!C&&J.value?setTimeout(ie,0):!C&&!J.value&&!k&&ct(()=>{De(),setTimeout(it,200)}),u.value=""}catch(d){u.value="加载提交历史失败: "+(d instanceof Error?d.message:String(d)),v>1&&(Q.value=!1)}finally{v>1?$.value=!1:O.value=!1}}async function ie(){if(N.value&&i.length!==0)try{N.value.innerHTML="";const k=jo(N.value,{orientation:"vertical-reverse",template:"metro",author:"提交者 <committer@example.com>"}),v={},K=k.branch(o.currentBranch||"main");v[o.currentBranch||"main"]=K,i.forEach(d=>{let m=K;if(d.branch){const L=Te(d.branch.split(",")[0]);v[L]||(v[L]=k.branch(L)),m=v[L]}m.commit({hash:d.hash,subject:d.message,author:`${d.author} <${d.email}>`})}),setTimeout(()=>{We()},100)}catch(k){u.value="渲染图表失败: "+(k instanceof Error?k.message:String(k))}}function le(){J.value=!J.value,J.value&&i.length>0&&setTimeout(ie,0)}function Se(){R.value=!R.value,R.value||(Q.value=!0),y.value=1,F(R.value),ct(()=>{setTimeout(()=>{!J.value&&!R.value&&(De(),it())},300)})}function Te(k){return k.includes("HEAD -> ")?k.replace("HEAD -> ",""):k.includes("origin/")?k:k.trim()}function Oe(k){return k.includes("HEAD")?"success":k.includes("origin/")?"warning":"info"}const we=f(null),ne=f(null);function Be(k){if(J.value||!Q.value||$.value||_.value)return;const v=k.target,{scrollTop:K,scrollHeight:d,clientHeight:m}=v;d-K-m<=20&&be()}function De(){if(!we.value)return;const k=we.value.$el.querySelector(".el-table__body-wrapper");k&&(ne.value=k,ne.value&&(ne.value.removeEventListener("scroll",Be,!0),ne.value.addEventListener("scroll",Be,!0)))}function Ze(){ne.value&&(ne.value.removeEventListener("scroll",Be,!0),ne.value=null)}function lt(k){k.key==="Escape"&&Ee.value&&(Ee.value=!1)}ht(()=>{o.isGitRepo?(o.log.length>0?(i.length=0,o.log.forEach(k=>i.push(k)),Z.value=o.log.length,J.value&&setTimeout(()=>{ie()},100)):F(),Fe()):u.value="当前目录不是Git仓库",ct(()=>{setTimeout(()=>{De()},500)}),Re(()=>we.value,k=>{k&&!J.value&&!R.value&&ct(()=>{De()})}),window.addEventListener("keydown",lt)}),Re(()=>o.allBranches,k=>{k&&k.length>0?me.value=[...k].sort():me.value=[]},{immediate:!0}),$o(()=>{Ze(),H.value!==null&&(window.clearInterval(H.value),H.value=null),window.removeEventListener("keydown",lt)});async function Ke(){await o.fetchLog(!0),i.length=0,o.log.forEach(k=>i.push(k)),h.value=[...i],Z.value=o.log.length,y.value=1,Q.value=!1,ve.value=!0,setTimeout(()=>{ve.value=!1},2e3),J.value&&(await ct(),ie())}Re(()=>o.log,k=>{try{i.length=0,Array.isArray(k)&&k.forEach(v=>v&&i.push(v)),Z.value=i.length,y.value=1,h.value=[...i],ve.value=!0,setTimeout(()=>{ve.value=!1},2e3),J.value&&i.length>0&&setTimeout(ie,0)}catch{}},{immediate:!0}),w({refreshLog:Ke});function ot(){P.value<At&&(P.value=Math.min(At,P.value+ts),Ae())}function nt(){P.value>Tt&&(P.value=Math.max(Tt,P.value-ts),Ae())}function Ae(){if(!N.value)return;const k=N.value.querySelector("svg");k&&(k.style.transform=`scale(${P.value})`,k.style.transformOrigin="top left")}function We(){if(!N.value)return;const k=N.value.querySelector("svg");if(!k)return;const v=k.getBoundingClientRect().width/P.value,K=N.value.clientWidth;v>K?P.value=Math.max(Tt,K/v):P.value=1,Ae()}async function T(k){if(k){x.value=k,X.value=!0,q.value=!0,j.value=[],S.value="",se.value="";try{if(!k.hash||k.hash.length<7){S.value="无效的提交哈希值",q.value=!1;return}const K=await(await fetch(`/api/commit-files?hash=${k.hash}`)).json();K.success&&Array.isArray(K.files)?(j.value=K.files,j.value.length>0?await r(k.hash,j.value[0]):S.value="该提交没有变更文件"):S.value=`获取文件列表失败: ${K.error||"未知错误"}`}catch(v){S.value=`获取提交详情失败: ${v.message}`}finally{q.value=!1}}}async function r(k,v){q.value=!0,se.value=v;try{const d=await(await fetch(`/api/commit-file-diff?hash=${k}&file=${encodeURIComponent(v)}`)).json();d.success?S.value=d.diff||"没有变更内容":S.value=`获取差异失败: ${d.error||"未知错误"}`}catch(K){S.value=`获取差异失败: ${K.message}`}finally{q.value=!1}}function Y(k){x.value&&r(x.value.hash,k)}async function de(k,v){try{const d=await(await fetch("/api/open-file",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({filePath:k,context:v})})).json();d.success?n.success(d.message):n.error(d.error||"打开文件失败")}catch(K){n.error(`打开文件失败: ${K.message}`)}}async function Ve(k,v){try{const d=await(await fetch("/api/open-with-vscode",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({filePath:k,context:v})})).json();d.success?n.success(d.message):n.error(d.error||"用VSCode打开文件失败")}catch(K){n.error(`用VSCode打开文件失败: ${K.message}`)}}async function Ne(k){try{const v=Ho(k);await navigator.clipboard.writeText(v),n.success("提交信息已复制到剪贴板")}catch{n.error("复制失败")}}function be(){!Q.value||$.value||_.value||F(R.value,y.value+1)}function he(){g.value=[],fe.value=[],z.value="",A.value=null,y.value=1,F(R.value,1)}function Ue(){y.value=1,F(R.value,1)}async function Fe(){try{const v=await(await fetch("/api/authors")).json();v.success&&Array.isArray(v.authors)?ce.value=v.authors.sort():ye()}catch{ye()}}function ye(){const k=new Set;h.value.forEach(v=>{v.author&&k.add(v.author)}),ce.value=Array.from(k).sort()}Re(()=>h.value,()=>{},{deep:!0});function ae(k,v,K){K.preventDefault(),oe.value=K.clientY,te.value=K.clientX,ue.value=k,ge.value=!0;const d=()=>{ge.value=!1,document.removeEventListener("click",d)};setTimeout(()=>{document.addEventListener("click",d)},0)}async function Je(k){if(k)try{await Ye.confirm(`确定要撤销提交 ${k.hash.substring(0,7)} 吗?这将创建一个新的提交来撤销这次提交的更改。`,"撤销提交确认",{confirmButtonText:"确认",cancelButtonText:"取消",type:"warning"});const K=await(await fetch("/api/revert-commit",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({hash:k.hash})})).json();K.success?(n.success(K.message||"已成功撤销提交"),Ke(),o.fetchStatus(),o.getBranchStatus()):n.error(K.error||"撤销提交失败")}catch(v){v!=="cancel"&&n.error("撤销提交失败: "+(v.message||v))}}async function pt(k){if(k)try{await Ye.confirm(`确定要将提交 ${k.hash.substring(0,7)} Cherry-Pick 到当前分支吗?`,"Cherry-Pick确认",{confirmButtonText:"确认",cancelButtonText:"取消",type:"warning"});const K=await(await fetch("/api/cherry-pick-commit",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({hash:k.hash})})).json();K.success?(n.success(K.message||"已成功Cherry-Pick提交"),Ke(),o.fetchStatus(),o.getBranchStatus()):n.error(K.error||"Cherry-Pick提交失败")}catch(v){v!=="cancel"&&n.error("Cherry-Pick提交失败: "+(v.message||v))}}async function _t(k){if(k)try{await navigator.clipboard.writeText(k.hash),n.success(`已复制提交哈希: ${k.hash.substring(0,7)}`)}catch(v){n.error(`复制提交哈希失败: ${v.message}`)}}async function wt(k){if(k)try{await Ye.confirm(`确定要将当前分支重置(hard)到提交 ${k.hash.substring(0,7)} 吗?
|
|
22
22
|
|
|
23
|
-
警告:这将丢失该提交之后的所有更改!`,"重置确认",{confirmButtonText:"确认重置",cancelButtonText:"取消",type:"warning",dangerouslyUseHTMLString:!0});const K=await(await fetch("/api/reset-to-commit",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({hash:k.hash})})).json();K.success?(n.success(K.message||"已成功重置到指定提交"),Ke(),o.fetchStatus(),o.getBranchStatus()):n.error(K.error||"重置到指定提交失败")}catch(v){v!=="cancel"&&n.error("重置到指定提交失败: "+(v.message||v))}}function it(){if(J.value||!Q.value||$.value||_.value||R.value)return;if(!ne.value){De();return}const{scrollTop:k,scrollHeight:v,clientHeight:K}=ne.value;v-k-K<=50&&be()}Re(()=>J.value,k=>{!k&&!R.value&&ct(()=>{De(),setTimeout(it,200)})});const Ee=f(!1);function bt(){Ee.value=!Ee.value,ct(()=>{J.value&&N.value&&ie()})}return(k,v)=>{var L;const K=tt,d=Me,m=is;return c(),b(Ce,null,[e("div",{class:pe(["card",{"fullscreen-mode":Ee.value}])},[e("div",Ci,[v[14]||(v[14]=e("div",{class:"header-left"},[e("h2",null,"提交历史")],-1)),e("div",Si,[J.value?U("",!0):(c(),G(a($e),{key:0,type:ee.value?"primary":"default",size:"small",onClick:v[0]||(v[0]=C=>ee.value=!ee.value),class:pe(["action-button filter-button icon-only-button",{"active-filter":ee.value}])},{icon:s(()=>[t(K,null,{default:s(()=>[t(a(Co))]),_:1})]),_:1},8,["type","class"])),t(a($e),{type:"primary",size:"small",onClick:le,class:pe(["action-button view-mode-button icon-only-button",{"active-view":J.value}])},{icon:s(()=>[t(K,null,{default:s(()=>[(c(),G(Vt(J.value?a(Nt):a(So))))]),_:1})]),_:1},8,["class"]),at(t(a($e),{type:"success",size:"small",onClick:Se,loading:_.value,class:pe(["action-button commit-display-button",{"active-commits":R.value}])},{icon:s(()=>[t(K,null,{default:s(()=>[(c(),G(Vt(R.value?a(To):a(Vo))))]),_:1})]),default:s(()=>[D(" "+M(R.value?"显示分页加载":"显示所有提交"),1)]),_:1},8,["loading","class"]),[[Bt,!1]]),t(a($e),{type:"info",size:"small",onClick:bt,class:pe(["action-button fullscreen-button icon-only-button",{"active-fullscreen":Ee.value}])},{icon:s(()=>[t(K,null,{default:s(()=>[(c(),G(Vt(Ee.value?a(ls):a(Fo))))]),_:1})]),_:1},8,["class"]),t(a($e),{circle:"",size:"small",onClick:v[1]||(v[1]=C=>Ke()),class:pe([{"refresh-button-animated":ve.value},"action-button refresh-button"])},{default:s(()=>[_.value?(c(),G(K,{key:1},{default:s(()=>[t(a(zs))]),_:1})):(c(),G(K,{key:0},{default:s(()=>[t(a(ns))]),_:1}))]),_:1},8,["class"])])]),ee.value&&!J.value?(c(),b("div",Ti,[e("div",Vi,[e("div",Fi,[t(a(It),{modelValue:g.value,"onUpdate:modelValue":v[2]||(v[2]=C=>g.value=C),placeholder:"选择作者",multiple:"",clearable:"",filterable:"",class:"filter-input",size:"small"},{prefix:s(()=>v[15]||(v[15]=[e("span",{class:"compact-label"},"作者",-1)])),default:s(()=>[(c(!0),b(Ce,null,Ge(ce.value,C=>(c(),G(a(Et),{key:C,label:C,value:C},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])]),e("div",Li,[t(a(It),{modelValue:fe.value,"onUpdate:modelValue":v[3]||(v[3]=C=>fe.value=C),placeholder:"选择分支",multiple:"",clearable:"",filterable:"",class:"filter-input",size:"small"},{prefix:s(()=>v[16]||(v[16]=[e("span",{class:"compact-label"},"分支",-1)])),default:s(()=>[(c(!0),b(Ce,null,Ge(me.value,C=>(c(),G(a(Et),{key:C,label:C,value:C},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])]),e("div",xi,[t(a(Jt),{modelValue:z.value,"onUpdate:modelValue":v[4]||(v[4]=C=>z.value=C),placeholder:"提交信息关键词",clearable:"",class:"filter-input",size:"small"},{prefix:s(()=>v[17]||(v[17]=[e("span",{class:"compact-label"},"信息",-1)])),_:1},8,["modelValue"])]),e("div",Bi,[t(a(Lo),{modelValue:A.value,"onUpdate:modelValue":v[5]||(v[5]=C=>A.value=C),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:s(()=>v[18]||(v[18]=[e("span",{class:"compact-label"},"日期",-1)])),_:1},8,["modelValue"])]),e("div",zi,[t(a($e),{type:"primary",size:"small",onClick:Ue,class:"filter-action-button"},{default:s(()=>v[19]||(v[19]=[D("应用")])),_:1}),t(a($e),{type:"info",size:"small",onClick:he,class:"filter-action-button"},{default:s(()=>v[20]||(v[20]=[D("重置")])),_:1})])])])):U("",!0),e("div",{class:pe(["content-area",{"with-filter":ee.value&&!J.value}])},[u.value?(c(),b("div",Pi,M(u.value),1)):(c(),b("div",ji,[J.value?(c(),b("div",Oi,[e("div",Di,[e("div",Mi,[t(a($e),{type:"primary",circle:"",size:"small",onClick:nt,disabled:P.value<=Tt},{default:s(()=>[t(K,null,{default:s(()=>[t(a(xo))]),_:1})]),_:1},8,["disabled"]),t(a(Bo),{modelValue:P.value,"onUpdate:modelValue":v[6]||(v[6]=C=>P.value=C),min:Tt,max:At,step:ts,onChange:Ae,class:"zoom-slider"},null,8,["modelValue"]),t(a($e),{type:"primary",circle:"",size:"small",onClick:ot,disabled:P.value>=At},{default:s(()=>[t(K,null,{default:s(()=>[t(a(zo))]),_:1})]),_:1},8,["disabled"]),t(a($e),{type:"primary",size:"small",onClick:We},{default:s(()=>v[21]||(v[21]=[D(" 自适应大小 ")])),_:1})]),e("div",Ri," 缩放: "+M(Math.round(P.value*100))+"% ",1)]),e("div",{ref_key:"graphContainer",ref:N,class:"graph-container"},null,512)])):(c(),b("div",Gi,[at((c(),G(a(Po),{ref_key:"tableRef",ref:we,data:ke.value,stripe:"",border:"",class:"log-table","empty-text":_.value?"加载中...":"没有匹配的提交记录",height:"450",onRowContextmenu:ae,onRowClick:v[7]||(v[7]=C=>T(C))},{default:s(()=>[t(a(Rt),{label:"哈希",width:"80",resizable:""},{default:s(C=>[e("span",{class:"commit-hash",onClick:re=>T(C.row)},M(C.row.hash.substring(0,6)),9,Ai)]),_:1}),t(a(Rt),{label:"提交信息","min-width":"300"},{default:s(C=>[e("div",Ui,[e("div",Ei,[C.row.branch?(c(),b("div",Ii,[(c(!0),b(Ce,null,Ge(C.row.branch.split(","),(re,je)=>(c(),G(a(Pt),{key:je,size:"small",type:Oe(re),class:"branch-tag"},{default:s(()=>[D(M(Te(re)),1)]),_:2},1032,["type"]))),128))])):U("",!0),e("span",Ni,M(C.row.message),1),t(a($e),{type:"text",icon:a(gt),size:"small",onClick:zt(re=>Ne(C.row.message),["stop"]),class:"copy-message-btn",title:"复制纯净提交信息(不含类型前缀)"},null,8,["icon","onClick"])])])]),_:1}),t(a(Rt),{prop:"date",label:"日期",width:"150",resizable:""}),t(a(Rt),{label:"作者",width:"100",resizable:""},{default:s(C=>[t(d,{content:C.row.email,placement:"top","hide-after":1e3,"show-after":200},{default:s(()=>[e("span",Hi,M(C.row.author),1)]),_:2},1032,["content"])]),_:1})]),_:1},8,["data","empty-text"])),[[m,_.value]]),(R.value,U("",!0))]))]))],2),t(Xe,{modelValue:X.value,"onUpdate:modelValue":v[8]||(v[8]=C=>X.value=C),title:`提交详情: ${(L=x.value)!=null&&L.hash?x.value.hash.substring(0,7):"未知"}`,size:"extra-large",type:"flex","destroy-on-close":"","custom-class":"commit-detail-dialog"},{default:s(()=>[at((c(),b("div",Ji,[x.value?(c(),b("div",Wi,[e("div",qi,[e("div",Yi,[v[25]||(v[25]=e("span",{class:"item-label"},"哈希:",-1)),e("span",Ki,M(x.value.hash),1)]),e("div",Qi,[v[26]||(v[26]=e("span",{class:"item-label"},"作者:",-1)),e("span",Xi,M(x.value.author)+" <"+M(x.value.email)+">",1)]),e("div",Zi,[v[27]||(v[27]=e("span",{class:"item-label"},"日期:",-1)),e("span",er,M(x.value.date),1)])]),e("div",tr,[v[28]||(v[28]=e("div",{class:"message-label"},"提交信息:",-1)),e("div",{class:"message-content",innerHTML:a(No)(x.value.message).replace(/\n/g,"<br>")},null,8,sr)])])):U("",!0),t(cs,{files:B.value,loading:q.value,diffContent:S.value,selectedFile:se.value,context:"commit-detail",emptyText:"没有找到变更文件",onFileSelect:Y,onOpenFile:de,onOpenWithVscode:Ve},null,8,["files","loading","diffContent","selectedFile"])])),[[m,q.value]])]),_:1},8,["modelValue","title"])],2),at(e("div",{class:pe(["context-menu",{"fullscreen-context-menu":Ee.value}]),style:yt({top:oe.value+"px",left:te.value+"px"})},[e("div",{class:"context-menu-item",onClick:v[9]||(v[9]=C=>T(ue.value))},v[29]||(v[29]=[e("i",{class:"el-icon-view"},null,-1),D(" 查看详情 ")])),e("div",{class:"context-menu-item",onClick:v[10]||(v[10]=C=>_t(ue.value))},v[30]||(v[30]=[e("i",{class:"el-icon-document-copy"},null,-1),D(" 复制提交哈希 ")])),e("div",{class:"context-menu-item",onClick:v[11]||(v[11]=C=>wt(ue.value))},v[31]||(v[31]=[e("i",{class:"el-icon-refresh-right"},null,-1),D(" 重置到该提交(hard) ")])),e("div",{class:"context-menu-item",onClick:v[12]||(v[12]=C=>Je(ue.value))},v[32]||(v[32]=[e("i",{class:"el-icon-delete"},null,-1),D(" 撤销提交 (Revert) ")])),e("div",{class:"context-menu-item",onClick:v[13]||(v[13]=C=>pt(ue.value))},v[33]||(v[33]=[e("i",{class:"el-icon-edit"},null,-1),D(" Cherry-Pick 到当前分支 ")]))],6),[[Bt,ge.value]])],64)}}}),ar=Pe(or,[["__scopeId","data-v-
|
|
23
|
+
警告:这将丢失该提交之后的所有更改!`,"重置确认",{confirmButtonText:"确认重置",cancelButtonText:"取消",type:"warning",dangerouslyUseHTMLString:!0});const K=await(await fetch("/api/reset-to-commit",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({hash:k.hash})})).json();K.success?(n.success(K.message||"已成功重置到指定提交"),Ke(),o.fetchStatus(),o.getBranchStatus()):n.error(K.error||"重置到指定提交失败")}catch(v){v!=="cancel"&&n.error("重置到指定提交失败: "+(v.message||v))}}function it(){if(J.value||!Q.value||$.value||_.value||R.value)return;if(!ne.value){De();return}const{scrollTop:k,scrollHeight:v,clientHeight:K}=ne.value;v-k-K<=50&&be()}Re(()=>J.value,k=>{!k&&!R.value&&ct(()=>{De(),setTimeout(it,200)})});const Ee=f(!1);function bt(){Ee.value=!Ee.value,ct(()=>{J.value&&N.value&&ie()})}return(k,v)=>{var L;const K=tt,d=Me,m=is;return c(),b(Ce,null,[e("div",{class:pe(["card",{"fullscreen-mode":Ee.value}])},[e("div",Ci,[v[14]||(v[14]=e("div",{class:"header-left"},[e("h2",null,"提交历史")],-1)),e("div",Si,[J.value?U("",!0):(c(),G(a($e),{key:0,type:ee.value?"primary":"default",size:"small",onClick:v[0]||(v[0]=C=>ee.value=!ee.value),class:pe(["action-button filter-button icon-only-button",{"active-filter":ee.value}])},{icon:s(()=>[t(K,null,{default:s(()=>[t(a(Co))]),_:1})]),_:1},8,["type","class"])),t(a($e),{type:"primary",size:"small",onClick:le,class:pe(["action-button view-mode-button icon-only-button",{"active-view":J.value}])},{icon:s(()=>[t(K,null,{default:s(()=>[(c(),G(Vt(J.value?a(Nt):a(So))))]),_:1})]),_:1},8,["class"]),at(t(a($e),{type:"success",size:"small",onClick:Se,loading:_.value,class:pe(["action-button commit-display-button",{"active-commits":R.value}])},{icon:s(()=>[t(K,null,{default:s(()=>[(c(),G(Vt(R.value?a(To):a(Vo))))]),_:1})]),default:s(()=>[D(" "+M(R.value?"显示分页加载":"显示所有提交"),1)]),_:1},8,["loading","class"]),[[Bt,!1]]),t(a($e),{type:"info",size:"small",onClick:bt,class:pe(["action-button fullscreen-button icon-only-button",{"active-fullscreen":Ee.value}])},{icon:s(()=>[t(K,null,{default:s(()=>[(c(),G(Vt(Ee.value?a(ls):a(Fo))))]),_:1})]),_:1},8,["class"]),t(a($e),{circle:"",size:"small",onClick:v[1]||(v[1]=C=>Ke()),class:pe([{"refresh-button-animated":ve.value},"action-button refresh-button"])},{default:s(()=>[_.value?(c(),G(K,{key:1},{default:s(()=>[t(a(zs))]),_:1})):(c(),G(K,{key:0},{default:s(()=>[t(a(ns))]),_:1}))]),_:1},8,["class"])])]),ee.value&&!J.value?(c(),b("div",Ti,[e("div",Vi,[e("div",Fi,[t(a(It),{modelValue:g.value,"onUpdate:modelValue":v[2]||(v[2]=C=>g.value=C),placeholder:"选择作者",multiple:"",clearable:"",filterable:"",class:"filter-input",size:"small"},{prefix:s(()=>v[15]||(v[15]=[e("span",{class:"compact-label"},"作者",-1)])),default:s(()=>[(c(!0),b(Ce,null,Ge(ce.value,C=>(c(),G(a(Et),{key:C,label:C,value:C},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])]),e("div",Li,[t(a(It),{modelValue:fe.value,"onUpdate:modelValue":v[3]||(v[3]=C=>fe.value=C),placeholder:"选择分支",multiple:"",clearable:"",filterable:"",class:"filter-input",size:"small"},{prefix:s(()=>v[16]||(v[16]=[e("span",{class:"compact-label"},"分支",-1)])),default:s(()=>[(c(!0),b(Ce,null,Ge(me.value,C=>(c(),G(a(Et),{key:C,label:C,value:C},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])]),e("div",xi,[t(a(Jt),{modelValue:z.value,"onUpdate:modelValue":v[4]||(v[4]=C=>z.value=C),placeholder:"提交信息关键词",clearable:"",class:"filter-input",size:"small"},{prefix:s(()=>v[17]||(v[17]=[e("span",{class:"compact-label"},"信息",-1)])),_:1},8,["modelValue"])]),e("div",Bi,[t(a(Lo),{modelValue:A.value,"onUpdate:modelValue":v[5]||(v[5]=C=>A.value=C),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:s(()=>v[18]||(v[18]=[e("span",{class:"compact-label"},"日期",-1)])),_:1},8,["modelValue"])]),e("div",zi,[t(a($e),{type:"primary",size:"small",onClick:Ue,class:"filter-action-button"},{default:s(()=>v[19]||(v[19]=[D("应用")])),_:1}),t(a($e),{type:"info",size:"small",onClick:he,class:"filter-action-button"},{default:s(()=>v[20]||(v[20]=[D("重置")])),_:1})])])])):U("",!0),e("div",{class:pe(["content-area",{"with-filter":ee.value&&!J.value}])},[u.value?(c(),b("div",Pi,M(u.value),1)):(c(),b("div",ji,[J.value?(c(),b("div",Oi,[e("div",Di,[e("div",Mi,[t(a($e),{type:"primary",circle:"",size:"small",onClick:nt,disabled:P.value<=Tt},{default:s(()=>[t(K,null,{default:s(()=>[t(a(xo))]),_:1})]),_:1},8,["disabled"]),t(a(Bo),{modelValue:P.value,"onUpdate:modelValue":v[6]||(v[6]=C=>P.value=C),min:Tt,max:At,step:ts,onChange:Ae,class:"zoom-slider"},null,8,["modelValue"]),t(a($e),{type:"primary",circle:"",size:"small",onClick:ot,disabled:P.value>=At},{default:s(()=>[t(K,null,{default:s(()=>[t(a(zo))]),_:1})]),_:1},8,["disabled"]),t(a($e),{type:"primary",size:"small",onClick:We},{default:s(()=>v[21]||(v[21]=[D(" 自适应大小 ")])),_:1})]),e("div",Ri," 缩放: "+M(Math.round(P.value*100))+"% ",1)]),e("div",{ref_key:"graphContainer",ref:N,class:"graph-container"},null,512)])):(c(),b("div",Gi,[at((c(),G(a(Po),{ref_key:"tableRef",ref:we,data:ke.value,stripe:"",border:"",class:"log-table","empty-text":_.value?"加载中...":"没有匹配的提交记录",height:"450",onRowContextmenu:ae,onRowClick:v[7]||(v[7]=C=>T(C))},{default:s(()=>[t(a(Rt),{label:"哈希",width:"80",resizable:""},{default:s(C=>[e("span",{class:"commit-hash",onClick:re=>T(C.row)},M(C.row.hash.substring(0,6)),9,Ai)]),_:1}),t(a(Rt),{label:"提交信息","min-width":"300"},{default:s(C=>[e("div",Ui,[e("div",Ei,[C.row.branch?(c(),b("div",Ii,[(c(!0),b(Ce,null,Ge(C.row.branch.split(","),(re,je)=>(c(),G(a(Pt),{key:je,size:"small",type:Oe(re),class:"branch-tag"},{default:s(()=>[D(M(Te(re)),1)]),_:2},1032,["type"]))),128))])):U("",!0),e("span",Ni,M(C.row.message),1),t(a($e),{type:"text",icon:a(gt),size:"small",onClick:zt(re=>Ne(C.row.message),["stop"]),class:"copy-message-btn",title:"复制纯净提交信息(不含类型前缀)"},null,8,["icon","onClick"])])])]),_:1}),t(a(Rt),{prop:"date",label:"日期",width:"150",resizable:""}),t(a(Rt),{label:"作者",width:"100",resizable:""},{default:s(C=>[t(d,{content:C.row.email,placement:"top","hide-after":1e3,"show-after":200},{default:s(()=>[e("span",Hi,M(C.row.author),1)]),_:2},1032,["content"])]),_:1})]),_:1},8,["data","empty-text"])),[[m,_.value]]),(R.value,U("",!0))]))]))],2),t(Xe,{modelValue:X.value,"onUpdate:modelValue":v[8]||(v[8]=C=>X.value=C),title:`提交详情: ${(L=x.value)!=null&&L.hash?x.value.hash.substring(0,7):"未知"}`,size:"extra-large",type:"flex","destroy-on-close":"","custom-class":"commit-detail-dialog"},{default:s(()=>[at((c(),b("div",Ji,[x.value?(c(),b("div",Wi,[e("div",qi,[e("div",Yi,[v[25]||(v[25]=e("span",{class:"item-label"},"哈希:",-1)),e("span",Ki,M(x.value.hash),1)]),e("div",Qi,[v[26]||(v[26]=e("span",{class:"item-label"},"作者:",-1)),e("span",Xi,M(x.value.author)+" <"+M(x.value.email)+">",1)]),e("div",Zi,[v[27]||(v[27]=e("span",{class:"item-label"},"日期:",-1)),e("span",er,M(x.value.date),1)])]),e("div",tr,[v[28]||(v[28]=e("div",{class:"message-label"},"提交信息:",-1)),e("div",{class:"message-content",innerHTML:a(No)(x.value.message).replace(/\n/g,"<br>")},null,8,sr)])])):U("",!0),t(cs,{files:B.value,loading:q.value,diffContent:S.value,selectedFile:se.value,context:"commit-detail",emptyText:"没有找到变更文件",onFileSelect:Y,onOpenFile:de,onOpenWithVscode:Ve},null,8,["files","loading","diffContent","selectedFile"])])),[[m,q.value]])]),_:1},8,["modelValue","title"])],2),at(e("div",{class:pe(["context-menu",{"fullscreen-context-menu":Ee.value}]),style:yt({top:oe.value+"px",left:te.value+"px"})},[e("div",{class:"context-menu-item",onClick:v[9]||(v[9]=C=>T(ue.value))},v[29]||(v[29]=[e("i",{class:"el-icon-view"},null,-1),D(" 查看详情 ")])),e("div",{class:"context-menu-item",onClick:v[10]||(v[10]=C=>_t(ue.value))},v[30]||(v[30]=[e("i",{class:"el-icon-document-copy"},null,-1),D(" 复制提交哈希 ")])),e("div",{class:"context-menu-item",onClick:v[11]||(v[11]=C=>wt(ue.value))},v[31]||(v[31]=[e("i",{class:"el-icon-refresh-right"},null,-1),D(" 重置到该提交(hard) ")])),e("div",{class:"context-menu-item",onClick:v[12]||(v[12]=C=>Je(ue.value))},v[32]||(v[32]=[e("i",{class:"el-icon-delete"},null,-1),D(" 撤销提交 (Revert) ")])),e("div",{class:"context-menu-item",onClick:v[13]||(v[13]=C=>pt(ue.value))},v[33]||(v[33]=[e("i",{class:"el-icon-edit"},null,-1),D(" Cherry-Pick 到当前分支 ")]))],6),[[Bt,ge.value]])],64)}}}),ar=Pe(or,[["__scopeId","data-v-7df6c8e0"]]),lr={class:"dialog-toolbar"},nr=["disabled"],ir=["disabled"],rr=["disabled"],cr={class:"history-scroll"},ur={key:0,class:"loading-state"},dr={key:2,class:"history-list"},fr=["onClick"],pr={class:"command-info"},mr={class:"command-text"},vr={class:"command-meta"},gr={class:"timestamp"},hr={class:"duration"},yr={class:"item-actions"},_r=["onClick"],wr=["onClick"],br={key:0,class:"item-details"},kr={key:0,class:"output-section"},$r={class:"output-header"},Cr=["onClick"],Sr={class:"output-content"},Tr={key:0,class:"truncation-notice"},Vr={class:"output-header"},Fr={class:"output-content"},Lr={key:0,class:"truncation-notice"},xr={key:2,class:"output-section error"},Br={class:"output-content"},zr=ze({__name:"CommandHistory",setup(I){const w=st(),o=f([]),i=f(!1),h=f(!1),u=f(!1),O=f(!1),_=f(new Set),R=f(!1),Z=f(!1);function J(){Z.value=!0,o.value.length===0&&N()}async function N(){try{if(i.value=!0,w.socket&&w.socket.connected)w.socket.emit("request_full_history");else{const z=await(await fetch("/api/command-history")).json();z.success?o.value=z.history:n.error(`加载命令历史失败: ${z.error}`)}}catch(g){n.error(`加载命令历史失败: ${g.message}`)}finally{i.value=!1}}async function y(){if(o.value.length===0){n.warning("没有可复制的命令历史");return}try{u.value=!0;const g=o.value.map(z=>{let A=`# ${H(z.timestamp)} (耗时: ${X(z.executionTime)}) - ${z.success?"成功":"失败"}
|
|
24
24
|
`;if(A+=`${z.command}
|
|
25
25
|
`,z.stdout&&(A+=`
|
|
26
26
|
# 输出:
|
|
@@ -42,4 +42,4 @@ ${g.stdout}
|
|
|
42
42
|
${g.stderr}
|
|
43
43
|
|
|
44
44
|
`}g.error&&(z+=`错误信息:
|
|
45
|
-
${g.error}`),await navigator.clipboard.writeText(z.trim()),n({message:"输出已复制到剪贴板",type:"success",zIndex:1e5})}catch(z){n.error(`复制失败: ${z.message}`)}}function ve(){if(!w.socket){console.error("Socket实例不可用");return}w.socket.on("initial_command_history",g=>{o.value=g.history,O.value=!0}),w.socket.on("command_history_update",g=>{o.value.unshift(g.newCommand),o.value.length>100&&o.value.pop(),O.value=!0}),w.socket.on("full_command_history",g=>{o.value=g.history,i.value=!1,O.value=!0}),w.socket.on("command_history_cleared",g=>{g.success&&(o.value=[],n.success("命令历史已清空")),h.value=!1}),w.socket.on("connect",()=>{O.value=!0,n.success("已连接到实时命令历史")}),w.socket.on("disconnect",()=>{O.value=!1,n.warning("实时命令历史连接已断开")})}function ee(){w.socket&&(w.socket.off("initial_command_history"),w.socket.off("command_history_update"),w.socket.off("full_command_history"),w.socket.off("command_history_cleared"))}return ht(()=>{ve(),w.socket||(console.log("尝试初始化Socket连接"),w.initSocketConnection())}),bs(()=>{ee()}),(g,z)=>{const A=tt,ce=Me,fe=Pt,me=Lt,ge=Fs;return c(),b(Ce,null,[t(ce,{content:"查看Git命令历史",placement:"bottom",effect:"dark","open-delay":500},{default:s(()=>[e("button",{class:"modern-btn command-history-button",onClick:J},[t(A,{class:"btn-icon"},{default:s(()=>[t(a(Ps))]),_:1})])]),_:1}),t(Xe,{modelValue:Z.value,"onUpdate:modelValue":z[0]||(z[0]=oe=>Z.value=oe),title:"Git 命令历史",width:"80%",top:"5vh","destroy-on-close":"","custom-class":"command-history-dialog","append-to-body":!0},{default:s(()=>[e("div",lr,[t(fe,{type:O.value?"success":"danger",size:"small",effect:"dark",class:"socket-status"},{default:s(()=>[D(M(O.value?"实时更新":"未连接"),1)]),_:1},8,["type"]),t(ce,{content:"只复制命令列表(不含输出)",placement:"bottom",effect:"dark","open-delay":300},{default:s(()=>[e("button",{class:"modern-btn copy-commands-button enhanced-btn",onClick:Q,disabled:o.value.length===0||R.value},[R.value?(c(),G(A,{key:1,class:"btn-icon is-loading"},{default:s(()=>z[1]||(z[1]=[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 32z"})],-1)])),_:1})):(c(),G(A,{key:0,class:"btn-icon"},{default:s(()=>[t(a(gt))]),_:1})),z[2]||(z[2]=e("span",{class:"btn-text"},"命令",-1))],8,nr)]),_:1}),t(ce,{content:"复制完整命令历史(含输出)",placement:"bottom",effect:"dark","open-delay":300},{default:s(()=>[e("button",{class:"modern-btn copy-all-button enhanced-btn",onClick:y,disabled:o.value.length===0||u.value},[u.value?(c(),G(A,{key:1,class:"btn-icon is-loading"},{default:s(()=>z[3]||(z[3]=[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 32z"})],-1)])),_:1})):(c(),G(A,{key:0,class:"btn-icon"},{default:s(()=>[t(a(gt))]),_:1})),z[4]||(z[4]=e("span",{class:"btn-text"},"全部",-1))],8,ir)]),_:1}),t(ce,{content:"清空命令历史",placement:"bottom",effect:"dark","open-delay":300},{default:s(()=>[e("button",{class:"modern-btn clear-button enhanced-btn danger-btn",onClick:$,disabled:o.value.length===0||h.value},[h.value?(c(),G(A,{key:1,class:"btn-icon is-loading"},{default:s(()=>z[5]||(z[5]=[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 32z"})],-1)])),_:1})):(c(),G(A,{key:0,class:"btn-icon"},{default:s(()=>[t(a(Ft))]),_:1})),z[6]||(z[6]=e("span",{class:"btn-text"},"清空",-1))],8,rr)]),_:1})]),e("div",cr,[i.value&&o.value.length===0?(c(),b("div",ur,[t(A,{class:"loading-icon is-loading"},{default:s(()=>z[7]||(z[7]=[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}),z[8]||(z[8]=e("div",{class:"loading-text"},"加载命令历史...",-1))])):o.value.length===0?(c(),G(me,{key:1,description:"暂无命令历史"})):(c(),b("div",dr,[(c(!0),b(Ce,null,Ge(o.value,(oe,te)=>(c(),b("div",{key:te,class:pe(["history-item",{"is-error":!oe.success}])},[e("div",{class:"item-header",onClick:ue=>x(te)},[e("div",pr,[e("div",mr,[t(fe,{size:"small",type:oe.success?"success":"danger",effect:"dark",class:"status-tag"},{default:s(()=>[D(M(oe.success?"成功":"失败"),1)]),_:2},1032,["type"]),e("code",null,M(oe.command),1)]),e("div",vr,[e("span",gr,M(H(oe.timestamp)),1),e("span",hr,"耗时: "+M(X(oe.executionTime)),1)])]),e("div",yr,[t(ce,{content:"复制命令",placement:"bottom",effect:"dark","open-delay":300},{default:s(()=>[e("button",{class:"modern-btn item-copy-button enhanced-btn",onClick:zt(ue=>S(oe.command),["stop"])},[t(A,{class:"btn-icon"},{default:s(()=>[t(a(gt))]),_:1})],8,_r)]),_:2},1024),t(ce,{content:"展开/收起",placement:"bottom",effect:"dark","open-delay":300},{default:s(()=>[e("button",{class:pe(["modern-btn expand-button enhanced-btn",{"is-expanded":j(te)}]),onClick:zt(ue=>x(te),["stop"])},[t(A,{class:"btn-icon"},{default:s(()=>[j(te)?(c(),G(a(Cs),{key:0})):(c(),G(a(Ht),{key:1}))]),_:2},1024)],10,wr)]),_:2},1024)])],8,fr),j(te)?(c(),b("div",br,[oe.stdout?(c(),b("div",kr,[e("div",$r,[z[9]||(z[9]=e("h4",null,"标准输出",-1)),t(ce,{content:"复制输出",placement:"bottom",effect:"dark","open-delay":300},{default:s(()=>[e("button",{class:"modern-btn output-copy-button enhanced-btn",onClick:ue=>P(oe)},[t(A,{class:"btn-icon"},{default:s(()=>[t(a(gt))]),_:1})],8,Cr)]),_:2},1024)]),e("pre",Sr,M(oe.stdout),1),oe.isStdoutTruncated?(c(),b("div",Tr,[t(ge,{type:"info",closable:!1,"show-icon":""},{default:s(()=>z[10]||(z[10]=[D(" 输出内容过长已被截断,请直接执行命令查看完整输出 ")])),_:1})])):U("",!0)])):U("",!0),oe.stderr?(c(),b("div",{key:1,class:pe(["output-section",se(oe.command)?"":"error"])},[e("div",Vr,[e("h4",null,M(se(oe.command)?"输出信息":"错误输出"),1)]),e("pre",Fr,M(oe.stderr),1),oe.isStderrTruncated?(c(),b("div",Lr,[t(ge,{type:"info",closable:!1,"show-icon":""},{default:s(()=>[D(M(se(oe.command)?"输出信息":"错误输出")+"内容过长已被截断,请直接执行命令查看完整输出 ",1)]),_:2},1024)])):U("",!0)],2)):U("",!0),oe.error?(c(),b("div",xr,[z[11]||(z[11]=e("div",{class:"output-header"},[e("h4",null,"错误信息")],-1)),e("pre",Br,M(oe.error),1)])):U("",!0)])):U("",!0)],2))),128))]))])]),_:1},8,["modelValue"])],64)}}}),Pr=Pe(zr,[["__scopeId","data-v-69b0a7d8"]]),jr={class:"inline-card"},Or={key:0,class:"inline-card__icon"},Dr={class:"inline-card__content"},Mr={class:"inline-card__actions"},Rr=ze({__name:"InlineCard",setup(I){const w=Oo(),o=E(()=>{var h;const i=(h=w.icon)==null?void 0:h.call(w);return Array.isArray(i)?i.length>0:!!i});return(i,h)=>(c(),b("div",jr,[o.value?(c(),b("div",Or,[ut(i.$slots,"icon",{},void 0,!0)])):U("",!0),e("div",Dr,[ut(i.$slots,"content",{},()=>[ut(i.$slots,"default",{},void 0,!0)],!0)]),e("div",Mr,[ut(i.$slots,"actions",{},void 0,!0)])]))}}),Ut=Pe(Rr,[["__scopeId","data-v-94e92561"]]),Gr="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",Ar={class:"main-header app-header"},Ur={class:"header-left"},Er=["src"],Ir={class:"header-info"},Nr={class:"user-name"},Hr={class:"user-email"},Jr={class:"directory-icon"},Wr={class:"directory-display"},qr=["title"],Yr={class:"directory-actions"},Kr={key:0,class:"header-actions"},Qr={key:0,class:"command-history-section"},Xr={key:0,viewBox:"0 0 1024 1024",xmlns:"http://www.w3.org/2000/svg"},Zr={key:1,viewBox:"0 0 1024 1024",xmlns:"http://www.w3.org/2000/svg"},ec={class:"main-container"},tc={key:0,class:"loading-container"},sc={class:"loading-spinner"},oc={key:1,class:"grid-layout"},ac={class:"git-status-panel"},lc={key:0,class:"commit-form-panel"},nc={class:"tips"},ic={key:1,class:"commit-form-panel"},rc={key:2,class:"log-list-panel"},cc={class:"create-branch-content"},uc={class:"form-label"},dc={class:"form-label"},fc={class:"create-branch-footer"},pc={class:"footer-actions"},mc=["disabled"],vc={class:"main-footer app-footer p-4"},gc={key:0,class:"branch-info"},hc={key:1},yc={class:"repo-url"},_c={class:"user-settings-content"},wc={class:"form-group"},bc={class:"form-label"},kc={class:"form-group"},$c={class:"form-label"},Cc={class:"info-section"},Sc={class:"info-card"},Tc={class:"info-icon"},Vc={class:"user-settings-footer"},Fc={class:"footer-actions"},Lc={class:"directory-content"},xc={class:"form-label"},Bc={class:"directory-input-group"},zc={class:"form-label"},Pc={class:"recent-directories"},jc=["onClick"],Oc={class:"dir-path"},Dc={class:"directory-footer"},Mc={class:"footer-actions"},Rc=["disabled"],Gc=ze({__name:"App",setup(I){const w=f(""),o=f(null),i=f(null),h=f(null),u=st(),O=rt(),_=f(!1),R=f(""),Z=f(!1);function J(){Z.value=!Z.value;const T=document.documentElement;Z.value?(T.setAttribute("data-theme","dark"),localStorage.setItem("theme","dark")):(T.removeAttribute("data-theme"),localStorage.setItem("theme","light"))}function N(){const T=localStorage.getItem("theme"),r=window.matchMedia("(prefers-color-scheme: dark)").matches;(T==="dark"||!T&&r)&&(Z.value=!0,document.documentElement.setAttribute("data-theme","dark"))}function y(){O.config&&(w.value=`默认提交信息: ${O.config.defaultCommitMessage}`)}async function Q(){try{const r=await(await fetch("/api/current_directory")).json();return R.value=r.directory||"未知目录",r}catch(T){return console.error("获取当前目录失败:",T),{directory:"未知目录",isGitRepo:!1}}}ht(async()=>{console.log("---------- 页面初始化开始 ----------"),N();try{const T=await Q();O.isLoaded||await O.loadConfig(),y(),u.isGitRepo=T.isGitRepo===!0,u.lastCheckedTime=Date.now(),u.isGitRepo?await Promise.all([u.getCurrentBranch(!0),u.getAllBranches(),u.getUserInfo(),u.getRemoteUrl(),u.getBranchStatus(!0)]):n.warning("当前目录不是Git仓库,部分功能将不可用")}catch(T){console.error("初始化失败:",T)}finally{_.value=!0,console.log("---------- 页面初始化完成 ----------"),setTimeout(()=>{ke()},100)}});const $=f(!1),H=f(""),X=f("");async function x(){await u.createBranch(H.value,X.value)&&($.value=!1,H.value="",i.value&&i.value.refreshStatus(),o.value&&o.value.refreshLog())}function j(){X.value=u.currentBranch,$.value=!0}async function S(T){await u.changeBranch(T)&&(i.value&&i.value.refreshStatus(),o.value&&o.value.refreshLog())}const q=f(!1),se=f(""),P=f("");function ve(){se.value=u.userName,P.value=u.userEmail,q.value=!0}async function ee(){if(!se.value||!P.value){n.warning("用户名和邮箱不能为空");return}await u.restoreUserConfig(se.value,P.value)&&(q.value=!1)}async function g(){await u.clearUserConfig()&&(se.value="",P.value="")}let z=!1,A=!1,ce=!1,fe=0,me=0,ge="",oe="",te=null;function ue(){const T=document.querySelector(".grid-layout");if(!T)return;const r=getComputedStyle(T).gridTemplateColumns.split(" "),Y=getComputedStyle(T).gridTemplateRows.split(" ");if(r.length>=3&&Y.length>=3){const de=parseFloat(r[0]),Ve=parseFloat(r[2]),Ne=de+Ve,be=de/Ne,he=parseFloat(Y[0]),Ue=parseFloat(Y[2]),Fe=he+Ue,ye=he/Fe;localStorage.setItem("zen-gitsync-layout-left-ratio",be.toString()),localStorage.setItem("zen-gitsync-layout-top-ratio",ye.toString()),console.log(`布局比例已保存 - 左侧: ${(be*100).toFixed(0)}%, 上方: ${(ye*100).toFixed(0)}%`),localStorage.setItem("zen-gitsync-layout-bottom-left-ratio",be.toString()),console.log(`底部布局比例已保存 - 左侧: ${(be*100).toFixed(0)}%`)}}function ke(){const T=document.querySelector(".grid-layout");if(!T)return;const r=localStorage.getItem("zen-gitsync-layout-left-ratio"),Y=localStorage.getItem("zen-gitsync-layout-top-ratio");if(r){const de=parseFloat(r),Ve=1-de;T.style.gridTemplateColumns=`${de}fr 8px ${Ve}fr`,console.log(`已恢复左侧比例: ${(de*100).toFixed(0)}%`)}else T.style.gridTemplateColumns="1fr 8px 3fr";if(Y){const de=parseFloat(Y),Ve=1-de;T.style.gridTemplateRows=`${de}fr 8px ${Ve}fr`,console.log(`已恢复上方比例: ${(de*100).toFixed(0)}%`)}}function B(T){var de;const r=T.currentTarget;if(!r||!r.id)return;te=r.id,te==="v-resizer"?z=!0:te==="v-resizer-bottom"&&(A=!0),fe=T.clientX;const Y=document.querySelector(".grid-layout");ge=getComputedStyle(Y).gridTemplateColumns,(de=document.getElementById(te))==null||de.classList.add("active"),document.addEventListener("mousemove",F),document.addEventListener("mouseup",ie),T.preventDefault()}function F(T){if(!z&&!A)return;const r=document.querySelector(".grid-layout"),Y=T.clientX-fe,de=ge.split(" ");if(de.length>=3){const Ve=parseFloat(de[0]),Ne=parseFloat(de[2]),be=Ve+Ne,he=(Ve+Y/r.clientWidth*be)/be,Ue=1-he,Fe=.1,ye=.5;he<Fe?r.style.gridTemplateColumns=`${Fe}fr 8px ${1-Fe}fr`:he>ye?r.style.gridTemplateColumns=`${ye}fr 8px ${1-ye}fr`:r.style.gridTemplateColumns=`${he}fr 8px ${Ue}fr`}}function ie(){var T,r;z=!1,A=!1,(T=document.getElementById("v-resizer"))==null||T.classList.remove("active"),(r=document.getElementById("v-resizer-bottom"))==null||r.classList.remove("active"),document.removeEventListener("mousemove",F),document.removeEventListener("mouseup",ie),ue()}function le(T){var Y;ce=!0,me=T.clientY;const r=document.querySelector(".grid-layout");oe=getComputedStyle(r).gridTemplateRows,(Y=document.getElementById("h-resizer"))==null||Y.classList.add("active"),document.addEventListener("mousemove",Se),document.addEventListener("mouseup",Te),T.preventDefault()}function Se(T){if(!ce)return;const r=document.querySelector(".grid-layout"),Y=T.clientY-me,de=oe.split(" ");if(de.length>=3){const Ve=parseFloat(de[0]),Ne=parseFloat(de[2]),be=Ve+Ne,he=(Ve+Y/r.clientHeight*be)/be,Ue=1-he,Fe=.2,ye=.8;he<Fe?r.style.gridTemplateRows=`${Fe}fr 8px ${1-Fe}fr`:he>ye?r.style.gridTemplateRows=`${ye}fr 8px ${1-ye}fr`:r.style.gridTemplateRows=`${he}fr 8px ${Ue}fr`}}function Te(){var T;ce=!1,(T=document.getElementById("h-resizer"))==null||T.classList.remove("active"),document.removeEventListener("mousemove",Se),document.removeEventListener("mouseup",Te),ue()}const Oe=f(!1),we=f(""),ne=f(!1),Be=f([]);function De(){we.value=R.value,Oe.value=!0,Ze()}async function Ze(){try{const r=await(await fetch("/api/recent_directories")).json();r.success&&Array.isArray(r.directories)&&(Be.value=r.directories)}catch(T){console.error("获取最近目录失败:",T)}}async function lt(){if(!we.value){n.warning("目录路径不能为空");return}try{ne.value=!0;const r=await(await fetch("/api/change_directory",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:we.value})})).json();r.success?(n.success("已切换工作目录"),R.value=r.directory,Oe.value=!1,await Ke(r.directory),await Ze(),u.isGitRepo=r.isGitRepo,await O.loadConfig(!0),r.isGitRepo?(await Promise.all([u.getCurrentBranch(),u.getAllBranches(),u.getUserInfo(),u.getRemoteUrl()]),i.value&&i.value.refreshStatus(),o.value&&o.value.refreshLog()):(n.warning("当前目录不是Git仓库,部分功能将不可用"),u.$reset())):n.error(r.error||"切换目录失败")}catch(T){n.error(`切换目录失败: ${T.message}`)}finally{ne.value=!1}}async function Ke(T){try{await fetch("/api/save_recent_directory",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:T})})}catch(r){console.error("保存最近目录失败:",r)}}async function ot(){try{if(!R.value){n.warning("当前目录路径为空");return}const r=await(await fetch("/api/open_directory",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:R.value})})).json();r.success?n.success("已在文件管理器中打开目录"):r.error&&n.error(r.error)}catch(T){console.error("打开目录失败:",T),n.error(`打开目录失败: ${T.message}`)}}async function nt(){try{const r=await(await fetch("/api/browse_directory",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({currentPath:we.value||R.value})})).json();r.success?Ae(r):r.error&&n.error(r.error)}catch(T){console.error("浏览目录失败:",T),n.error(`浏览目录失败: ${T.message}`)}}function Ae(T){!T||!T.items||Ye.alert(Ie("div",{class:"directory-browser"},[Ie("div",{class:"current-path"},[Ie("span",{class:"path-label"},"当前路径: "),Ie("span",{class:"path-value"},T.path)]),Ie("div",{class:"directory-list"},[T.parentPath?Ie("div",{class:"directory-item parent-dir",onClick:()=>{We(T.parentPath)}},[Ie("span",{class:"dir-icon"},Ie("svg",{class:"folder-icon",viewBox:"0 0 24 24",width:"20",height:"20",style:{fill:"#E6A23C"}},[Ie("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"})])),Ie("span",{class:"dir-name"},"返回上级目录")]):null,...T.items.map(r=>Ie("div",{class:"directory-item",onClick:()=>{We(r.path)}},[Ie("span",{class:"dir-icon"},Ie("svg",{class:"folder-icon",viewBox:"0 0 24 24",width:"20",height:"20",style:{fill:"#409EFF"}},[Ie("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"})])),Ie("span",{class:"dir-name"},r.name)]))])]),"浏览并选择目录",{confirmButtonText:"使用当前目录",customClass:"directory-browser-dialog",callback:r=>{r==="confirm"&&(we.value=T.path)}})}async function We(T){try{Ye.close(),setTimeout(async()=>{try{const Y=await(await fetch("/api/browse_directory",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({currentPath:T})})).json();Y.success?Ae(Y):Y.error&&n.error(Y.error)}catch(r){console.error("浏览目录失败:",r),n.error(`浏览目录失败: ${r.message}`)}},100)}catch(r){console.error("处理目录选择时出错:",r),n.error(`处理目录选择时出错: ${r.message}`)}}return(T,r)=>{const Y=tt,de=Me,Ve=Vs,Ne=$e,be=Jt,he=xs,Ue=Et,Fe=It,ye=Ls;return c(),b(Ce,null,[e("header",Ar,[e("div",Ur,[e("img",{src:a(Gr),alt:"Zen GitSync Logo",class:"logo"},null,8,Er),r[16]||(r[16]=e("h1",null,"Zen GitSync",-1))]),e("div",Ir,[t(Ut,{id:"user-info",class:"user-info-card",compact:""},{content:s(()=>[a(u).userName&&a(u).userEmail?(c(),b(Ce,{key:0},[e("span",Nr,M(a(u).userName),1),e("span",Hr,"<"+M(a(u).userEmail)+">",1)],64)):(c(),b(Ce,{key:1},[r[17]||(r[17]=e("span",{class:"user-label"},"用户: ",-1)),r[18]||(r[18]=e("span",{class:"user-warning"},"未配置",-1))],64))]),actions:s(()=>[t(de,{content:"用户设置",placement:"bottom",effect:"dark","open-delay":500},{default:s(()=>[e("button",{class:"modern-btn user-settings-btn",onClick:ve},[t(Y,{class:"btn-icon"},{default:s(()=>[t(a(Bs))]),_:1})])]),_:1})]),_:1}),t(Ut,{id:"directory-selector",class:"directory-selector",compact:""},{icon:s(()=>[e("div",Jr,[t(Y,null,{default:s(()=>[t(a(Gt))]),_:1})])]),content:s(()=>[e("div",Wr,[e("div",{class:"directory-path",title:R.value},M(R.value),9,qr)])]),actions:s(()=>[e("div",Yr,[t(de,{content:"切换目录",placement:"bottom",effect:"dark","open-delay":500},{default:s(()=>[e("button",{class:"modern-btn dir-btn",onClick:De},[t(Y,{class:"btn-icon"},{default:s(()=>r[19]||(r[19]=[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}),t(de,{content:"在资源管理器中打开",placement:"bottom",effect:"dark","open-delay":500},{default:s(()=>[e("button",{class:"modern-btn dir-btn",onClick:ot},[t(Y,{class:"btn-icon"},{default:s(()=>r[20]||(r[20]=[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})])]),_:1}),a(u).isGitRepo?(c(),b("div",Kr,[a(u).isGitRepo?(c(),b("div",Qr,[t(Pr)])):U("",!0),t(de,{content:"编辑项目配置",placement:"bottom",effect:"dark","open-delay":500},{default:s(()=>[e("button",{class:"modern-btn config-btn",onClick:r[0]||(r[0]=ae=>{var Je;return(Je=h.value)==null?void 0:Je.openConfigEditor()})},[t(Y,{class:"btn-icon"},{default:s(()=>[t(a(dt))]),_:1})])]),_:1}),t(de,{content:Z.value?"切换到浅色主题":"切换到深色主题",placement:"bottom",effect:"dark","open-delay":500},{default:s(()=>[e("button",{class:"modern-btn theme-toggle-btn",onClick:J},[t(Y,{class:"btn-icon"},{default:s(()=>[Z.value?(c(),b("svg",Xr,r[21]||(r[21]=[e("path",{fill:"currentColor",d:"M512 128a384 384 0 1 1 0 768 384 384 0 0 1 0-768zm0 64a320 320 0 1 0 0 640 320 320 0 0 0 0-640z"},null,-1),e("path",{fill:"currentColor",d:"M512 64a32 32 0 0 1 32 32v64a32 32 0 0 1-64 0V96a32 32 0 0 1 32-32zm0 768a32 32 0 0 1 32 32v64a32 32 0 1 1-64 0v-64a32 32 0 0 1 32-32zM195.2 195.2a32 32 0 0 1 45.248 0l45.248 45.248a32 32 0 1 1-45.248 45.248L195.2 240.448a32 32 0 0 1 0-45.248zm543.104 543.104a32 32 0 0 1 45.248 0l45.248 45.248a32 32 0 0 1-45.248 45.248l-45.248-45.248a32 32 0 0 1 0-45.248zM64 512a32 32 0 0 1 32-32h64a32 32 0 0 1 0 64H96a32 32 0 0 1-32-32zm768 0a32 32 0 0 1 32-32h64a32 32 0 1 1 0 64h-64a32 32 0 0 1-32-32zM195.2 828.8a32 32 0 0 1 0-45.248l45.248-45.248a32 32 0 0 1 45.248 45.248L240.448 828.8a32 32 0 0 1-45.248 0zm543.104-543.104a32 32 0 0 1 0-45.248l45.248-45.248a32 32 0 0 1 45.248 45.248l-45.248 45.248a32 32 0 0 1-45.248 0z"},null,-1)]))):(c(),b("svg",Zr,r[22]||(r[22]=[e("path",{fill:"currentColor",d:"M240.448 240.448a384 384 0 1 0 559.424 525.696 448 448 0 0 1-542.016-542.08 390.592 390.592 0 0 0-17.408 16.384zm181.056 362.048a384 384 0 0 0 525.632 16.384A448 448 0 1 1 405.056 76.8a384 384 0 0 0 16.448 525.696z"},null,-1)])))]),_:1})])]),_:1},8,["content"]),t(de,{content:"Git 操作",placement:"bottom",effect:"dark","open-delay":500},{default:s(()=>[e("button",{class:"modern-btn drawer-btn",onClick:r[1]||(r[1]=ae=>{var Je;return(Je=h.value)==null?void 0:Je.toggleGitOperationsDrawer()})},[t(Y,{class:"btn-icon"},{default:s(()=>[t(a(ys))]),_:1})])]),_:1})])):U("",!0)])]),e("main",ec,[_.value?(c(),b("div",oc,[e("div",ac,[t(Ya,{ref_key:"gitStatusRef",ref:i,"initial-directory":R.value},null,8,["initial-directory"])]),e("div",{class:"vertical-resizer",id:"v-resizer",onMousedown:B},null,32),a(u).isGitRepo?(c(),b("div",lc,[!a(u).userName||!a(u).userEmail?(c(),G(Ve,{key:0,shadow:"hover"},{header:s(()=>r[25]||(r[25]=[e("h2",null,"Git用户未配置",-1)])),default:s(()=>[r[29]||(r[29]=e("p",null,"请先配置Git用户信息才能进行提交操作。",-1)),e("div",nc,[r[27]||(r[27]=e("h3",null,"您可以通过以下方式配置:",-1)),r[28]||(r[28]=e("ol",null,[e("li",null,"点击右上角的设置按钮,配置用户名和邮箱"),e("li",null,"或者使用命令行配置:"),e("div",{class:"code-block"},[D(' git config --global user.name "您的用户名"'),e("br"),D(' git config --global user.email "您的邮箱" ')])],-1)),t(Ne,{type:"primary",onClick:ve},{default:s(()=>r[26]||(r[26]=[D(" 立即配置 ")])),_:1})])]),_:1})):(c(),G($i,{key:1,ref_key:"commitFormRef",ref:h},null,512))])):(c(),b("div",ic,[t(Ve,{shadow:"hover"},{header:s(()=>r[30]||(r[30]=[e("h2",null,"Git仓库初始化",-1)])),default:s(()=>[r[31]||(r[31]=e("p",null,"当前目录不是Git仓库,请先初始化Git仓库或切换到Git仓库目录。",-1)),r[32]||(r[32]=e("div",{class:"tips"},[e("h3",null,"可以使用以下命令初始化仓库:"),e("div",{class:"code-block"},"git init")],-1))]),_:1})])),e("div",{class:"horizontal-resizer",id:"h-resizer",onMousedown:le},null,32),a(u).isGitRepo?(c(),b("div",rc,[t(ar,{ref_key:"logListRef",ref:o},null,512)])):U("",!0),t(Xe,{modelValue:$.value,"onUpdate:modelValue":r[5]||(r[5]=ae=>$.value=ae),title:"创建新分支",size:"small","destroy-on-close":!0,"custom-class":"create-branch-dialog"},{footer:s(()=>[e("div",fc,[e("div",pc,[e("button",{type:"button",class:"footer-btn cancel-btn",onClick:r[4]||(r[4]=ae=>$.value=!1)}," 取消 "),e("button",{type:"button",class:"footer-btn primary-btn",onClick:x,disabled:a(u).isCreatingBranch},[a(u).isCreatingBranch?(c(),G(Y,{key:1,class:"is-loading"},{default:s(()=>r[35]||(r[35]=[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 32z"})],-1)])),_:1})):(c(),G(Y,{key:0},{default:s(()=>[t(a(ft))]),_:1})),r[36]||(r[36]=e("span",null,"创建",-1))],8,mc)])])]),default:s(()=>[e("div",cc,[t(ye,{model:{newBranchName:H.value,selectedBaseBranch:X.value},"label-position":"top"},{default:s(()=>[t(he,null,{label:s(()=>[e("div",uc,[t(Y,{class:"label-icon"},{default:s(()=>[t(a(_s))]),_:1}),r[33]||(r[33]=e("span",null,"新分支名称",-1))])]),default:s(()=>[t(be,{modelValue:H.value,"onUpdate:modelValue":r[2]||(r[2]=ae=>H.value=ae),placeholder:"请输入新分支名称",class:"modern-input",size:"large"},null,8,["modelValue"])]),_:1}),t(he,null,{label:s(()=>[e("div",dc,[t(Y,{class:"label-icon"},{default:s(()=>[t(a(ys))]),_:1}),r[34]||(r[34]=e("span",null,"基于分支",-1))])]),default:s(()=>[t(Fe,{modelValue:X.value,"onUpdate:modelValue":r[3]||(r[3]=ae=>X.value=ae),placeholder:"选择基础分支",class:"modern-select",size:"large",style:{width:"100%"}},{default:s(()=>[(c(!0),b(Ce,null,Ge(a(u).allBranches,ae=>(c(),G(Ue,{key:ae,label:ae,value:ae},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])]),_:1})]),_:1},8,["model"])])]),_:1},8,["modelValue"])])):(c(),b("div",tc,[t(Ve,{class:"loading-card"},{default:s(()=>[e("div",sc,[t(Y,{class:"is-loading"},{default:s(()=>r[23]||(r[23]=[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})]),r[24]||(r[24]=e("div",{class:"loading-text"},"加载中...",-1))]),_:1})]))]),e("footer",vc,[a(u).currentBranch?(c(),b("div",gc,[t(Ut,{class:"branch-wrapper",compact:""},{content:s(()=>[r[37]||(r[37]=e("span",{class:"branch-label"},"当前分支:",-1)),t(Fe,{modelValue:a(u).currentBranch,"onUpdate:modelValue":r[6]||(r[6]=ae=>a(u).currentBranch=ae),size:"small",onChange:S,loading:a(u).isChangingBranch,class:"branch-select"},{default:s(()=>[(c(!0),b(Ce,null,Ge(a(u).allBranches,ae=>(c(),G(Ue,{key:ae,label:ae,value:ae},null,8,["label","value"]))),128))]),_:1},8,["modelValue","loading"])]),actions:s(()=>[e("button",{class:"modern-btn create-branch-btn",onClick:j},[t(Y,{class:"btn-icon"},{default:s(()=>[t(a(_s))]),_:1}),r[38]||(r[38]=e("span",{class:"btn-text"},"新建分支",-1))])]),_:1})])):U("",!0),a(u).remoteUrl?(c(),b("div",hc,[t(Ut,{class:"footer-right",compact:""},{content:s(()=>[r[39]||(r[39]=e("span",{class:"repo-url-label"},"远程仓库:",-1)),e("span",yc,M(a(u).remoteUrl),1)]),actions:s(()=>[t(de,{content:"复制仓库地址",placement:"top",effect:"dark","open-delay":500},{default:s(()=>[e("button",{class:"modern-btn copy-url-btn",onClick:r[7]||(r[7]=ae=>a(u).copyRemoteUrl())},[t(Y,{class:"btn-icon"},{default:s(()=>r[40]||(r[40]=[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})]),_:1})])):U("",!0)]),t(Xe,{modelValue:q.value,"onUpdate:modelValue":r[11]||(r[11]=ae=>q.value=ae),title:"Git 用户设置",size:"small","destroy-on-close":!0,"custom-class":"user-settings-dialog"},{footer:s(()=>[e("div",Vc,[e("button",{type:"button",class:"footer-btn danger-btn",onClick:g},[t(Y,null,{default:s(()=>[t(a(Ft))]),_:1}),r[44]||(r[44]=e("span",null,"清除配置",-1))]),e("div",Fc,[e("button",{type:"button",class:"footer-btn cancel-btn",onClick:r[10]||(r[10]=ae=>q.value=!1)}," 取消 "),e("button",{type:"button",class:"footer-btn primary-btn",onClick:ee},[t(Y,null,{default:s(()=>[t(a(ft))]),_:1}),r[45]||(r[45]=e("span",null,"保存设置",-1))])])])]),default:s(()=>[e("div",_c,[t(ye,{class:"user-form",model:{tempUserName:se.value,tempUserEmail:P.value},"label-position":"top"},{default:s(()=>[e("div",wc,[t(he,{class:"form-item"},{label:s(()=>[e("div",bc,[t(Y,{class:"label-icon"},{default:s(()=>[t(a(Do))]),_:1}),r[41]||(r[41]=e("span",null,"用户名",-1))])]),default:s(()=>[t(be,{modelValue:se.value,"onUpdate:modelValue":r[8]||(r[8]=ae=>se.value=ae),placeholder:"请输入 Git 用户名",class:"modern-input",size:"large"},null,8,["modelValue"])]),_:1})]),e("div",kc,[t(he,{class:"form-item"},{label:s(()=>[e("div",$c,[t(Y,{class:"label-icon"},{default:s(()=>[t(a(Mo))]),_:1}),r[42]||(r[42]=e("span",null,"邮箱地址",-1))])]),default:s(()=>[t(be,{modelValue:P.value,"onUpdate:modelValue":r[9]||(r[9]=ae=>P.value=ae),placeholder:"请输入 Git 邮箱地址",class:"modern-input",size:"large"},null,8,["modelValue"])]),_:1})]),e("div",Cc,[e("div",Sc,[e("div",Tc,[t(Y,null,{default:s(()=>[t(a(os))]),_:1})]),r[43]||(r[43]=e("div",{class:"info-content"},[e("p",{class:"info-title"},"全局配置"),e("p",{class:"info-desc"},"这些设置将影响全局 Git 配置,对所有 Git 仓库生效")],-1))])])]),_:1},8,["model"])])]),_:1},8,["modelValue"]),t(Xe,{modelValue:Oe.value,"onUpdate:modelValue":r[15]||(r[15]=ae=>Oe.value=ae),title:"切换工作目录",size:"medium","destroy-on-close":!0,"custom-class":"directory-dialog"},{footer:s(()=>[e("div",Dc,[e("div",Mc,[e("button",{type:"button",class:"footer-btn cancel-btn",onClick:r[13]||(r[13]=ae=>Oe.value=!1)}," 取消 "),e("button",{type:"button",class:"footer-btn primary-btn",onClick:r[14]||(r[14]=ae=>lt()),disabled:ne.value},[ne.value?(c(),G(Y,{key:1,class:"is-loading"},{default:s(()=>r[49]||(r[49]=[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 32z"})],-1)])),_:1})):(c(),G(Y,{key:0},{default:s(()=>[t(a(ft))]),_:1})),r[50]||(r[50]=e("span",null,"切换",-1))],8,Rc)])])]),default:s(()=>[e("div",Lc,[t(ye,{"label-position":"top"},{default:s(()=>[t(he,null,{label:s(()=>[e("div",xc,[t(Y,{class:"label-icon"},{default:s(()=>[t(a(Gt))]),_:1}),r[46]||(r[46]=e("span",null,"目录路径",-1))])]),default:s(()=>[e("div",Bc,[t(be,{modelValue:we.value,"onUpdate:modelValue":r[12]||(r[12]=ae=>we.value=ae),placeholder:"请输入目录路径",class:"modern-input",size:"large"},null,8,["modelValue"]),e("button",{type:"button",class:"browse-btn",onClick:nt},[t(Y,null,{default:s(()=>[t(a(Gt))]),_:1}),r[47]||(r[47]=e("span",null,"浏览",-1))])])]),_:1}),Be.value.length>0?(c(),G(he,{key:0},{label:s(()=>[e("div",zc,[t(Y,{class:"label-icon"},{default:s(()=>[t(a(Ps))]),_:1}),r[48]||(r[48]=e("span",null,"常用目录",-1))])]),default:s(()=>[e("div",Pc,[(c(!0),b(Ce,null,Ge(Be.value,(ae,Je)=>(c(),b("div",{key:Je,class:"recent-dir-item",onClick:pt=>we.value=ae},[t(Y,{class:"dir-icon"},{default:s(()=>[t(a(Gt))]),_:1}),e("span",Oc,M(ae),1)],8,jc))),128))])]),_:1})):U("",!0)]),_:1})])]),_:1},8,["modelValue"])],64)}}}),Ac=Pe(Gc,[["__scopeId","data-v-503f0296"]]),Rs=Ro(Ac);Rs.use(Go());Rs.mount("#app");
|
|
45
|
+
${g.error}`),await navigator.clipboard.writeText(z.trim()),n({message:"输出已复制到剪贴板",type:"success",zIndex:1e5})}catch(z){n.error(`复制失败: ${z.message}`)}}function ve(){if(!w.socket){console.error("Socket实例不可用");return}w.socket.on("initial_command_history",g=>{o.value=g.history,O.value=!0}),w.socket.on("command_history_update",g=>{o.value.unshift(g.newCommand),o.value.length>100&&o.value.pop(),O.value=!0}),w.socket.on("full_command_history",g=>{o.value=g.history,i.value=!1,O.value=!0}),w.socket.on("command_history_cleared",g=>{g.success&&(o.value=[],n.success("命令历史已清空")),h.value=!1}),w.socket.on("connect",()=>{O.value=!0,n.success("已连接到实时命令历史")}),w.socket.on("disconnect",()=>{O.value=!1,n.warning("实时命令历史连接已断开")})}function ee(){w.socket&&(w.socket.off("initial_command_history"),w.socket.off("command_history_update"),w.socket.off("full_command_history"),w.socket.off("command_history_cleared"))}return ht(()=>{ve(),w.socket||(console.log("尝试初始化Socket连接"),w.initSocketConnection())}),bs(()=>{ee()}),(g,z)=>{const A=tt,ce=Me,fe=Pt,me=Lt,ge=Fs;return c(),b(Ce,null,[t(ce,{content:"查看Git命令历史",placement:"bottom",effect:"dark","open-delay":500},{default:s(()=>[e("button",{class:"modern-btn command-history-button",onClick:J},[t(A,{class:"btn-icon"},{default:s(()=>[t(a(Ps))]),_:1})])]),_:1}),t(Xe,{modelValue:Z.value,"onUpdate:modelValue":z[0]||(z[0]=oe=>Z.value=oe),title:"Git 命令历史",width:"80%",top:"5vh","destroy-on-close":"","custom-class":"command-history-dialog","append-to-body":!0},{default:s(()=>[e("div",lr,[t(fe,{type:O.value?"success":"danger",size:"small",effect:"dark",class:"socket-status"},{default:s(()=>[D(M(O.value?"实时更新":"未连接"),1)]),_:1},8,["type"]),t(ce,{content:"只复制命令列表(不含输出)",placement:"bottom",effect:"dark","open-delay":300},{default:s(()=>[e("button",{class:"modern-btn copy-commands-button enhanced-btn",onClick:Q,disabled:o.value.length===0||R.value},[R.value?(c(),G(A,{key:1,class:"btn-icon is-loading"},{default:s(()=>z[1]||(z[1]=[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 32z"})],-1)])),_:1})):(c(),G(A,{key:0,class:"btn-icon"},{default:s(()=>[t(a(gt))]),_:1})),z[2]||(z[2]=e("span",{class:"btn-text"},"命令",-1))],8,nr)]),_:1}),t(ce,{content:"复制完整命令历史(含输出)",placement:"bottom",effect:"dark","open-delay":300},{default:s(()=>[e("button",{class:"modern-btn copy-all-button enhanced-btn",onClick:y,disabled:o.value.length===0||u.value},[u.value?(c(),G(A,{key:1,class:"btn-icon is-loading"},{default:s(()=>z[3]||(z[3]=[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 32z"})],-1)])),_:1})):(c(),G(A,{key:0,class:"btn-icon"},{default:s(()=>[t(a(gt))]),_:1})),z[4]||(z[4]=e("span",{class:"btn-text"},"全部",-1))],8,ir)]),_:1}),t(ce,{content:"清空命令历史",placement:"bottom",effect:"dark","open-delay":300},{default:s(()=>[e("button",{class:"modern-btn clear-button enhanced-btn danger-btn",onClick:$,disabled:o.value.length===0||h.value},[h.value?(c(),G(A,{key:1,class:"btn-icon is-loading"},{default:s(()=>z[5]||(z[5]=[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 32z"})],-1)])),_:1})):(c(),G(A,{key:0,class:"btn-icon"},{default:s(()=>[t(a(Ft))]),_:1})),z[6]||(z[6]=e("span",{class:"btn-text"},"清空",-1))],8,rr)]),_:1})]),e("div",cr,[i.value&&o.value.length===0?(c(),b("div",ur,[t(A,{class:"loading-icon is-loading"},{default:s(()=>z[7]||(z[7]=[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}),z[8]||(z[8]=e("div",{class:"loading-text"},"加载命令历史...",-1))])):o.value.length===0?(c(),G(me,{key:1,description:"暂无命令历史"})):(c(),b("div",dr,[(c(!0),b(Ce,null,Ge(o.value,(oe,te)=>(c(),b("div",{key:te,class:pe(["history-item",{"is-error":!oe.success}])},[e("div",{class:"item-header",onClick:ue=>x(te)},[e("div",pr,[e("div",mr,[t(fe,{size:"small",type:oe.success?"success":"danger",effect:"dark",class:"status-tag"},{default:s(()=>[D(M(oe.success?"成功":"失败"),1)]),_:2},1032,["type"]),e("code",null,M(oe.command),1)]),e("div",vr,[e("span",gr,M(H(oe.timestamp)),1),e("span",hr,"耗时: "+M(X(oe.executionTime)),1)])]),e("div",yr,[t(ce,{content:"复制命令",placement:"bottom",effect:"dark","open-delay":300},{default:s(()=>[e("button",{class:"modern-btn item-copy-button enhanced-btn",onClick:zt(ue=>S(oe.command),["stop"])},[t(A,{class:"btn-icon"},{default:s(()=>[t(a(gt))]),_:1})],8,_r)]),_:2},1024),t(ce,{content:"展开/收起",placement:"bottom",effect:"dark","open-delay":300},{default:s(()=>[e("button",{class:pe(["modern-btn expand-button enhanced-btn",{"is-expanded":j(te)}]),onClick:zt(ue=>x(te),["stop"])},[t(A,{class:"btn-icon"},{default:s(()=>[j(te)?(c(),G(a(Cs),{key:0})):(c(),G(a(Ht),{key:1}))]),_:2},1024)],10,wr)]),_:2},1024)])],8,fr),j(te)?(c(),b("div",br,[oe.stdout?(c(),b("div",kr,[e("div",$r,[z[9]||(z[9]=e("h4",null,"标准输出",-1)),t(ce,{content:"复制输出",placement:"bottom",effect:"dark","open-delay":300},{default:s(()=>[e("button",{class:"modern-btn output-copy-button enhanced-btn",onClick:ue=>P(oe)},[t(A,{class:"btn-icon"},{default:s(()=>[t(a(gt))]),_:1})],8,Cr)]),_:2},1024)]),e("pre",Sr,M(oe.stdout),1),oe.isStdoutTruncated?(c(),b("div",Tr,[t(ge,{type:"info",closable:!1,"show-icon":""},{default:s(()=>z[10]||(z[10]=[D(" 输出内容过长已被截断,请直接执行命令查看完整输出 ")])),_:1})])):U("",!0)])):U("",!0),oe.stderr?(c(),b("div",{key:1,class:pe(["output-section",se(oe.command)?"":"error"])},[e("div",Vr,[e("h4",null,M(se(oe.command)?"输出信息":"错误输出"),1)]),e("pre",Fr,M(oe.stderr),1),oe.isStderrTruncated?(c(),b("div",Lr,[t(ge,{type:"info",closable:!1,"show-icon":""},{default:s(()=>[D(M(se(oe.command)?"输出信息":"错误输出")+"内容过长已被截断,请直接执行命令查看完整输出 ",1)]),_:2},1024)])):U("",!0)],2)):U("",!0),oe.error?(c(),b("div",xr,[z[11]||(z[11]=e("div",{class:"output-header"},[e("h4",null,"错误信息")],-1)),e("pre",Br,M(oe.error),1)])):U("",!0)])):U("",!0)],2))),128))]))])]),_:1},8,["modelValue"])],64)}}}),Pr=Pe(zr,[["__scopeId","data-v-c3f2db73"]]),jr={class:"inline-card"},Or={key:0,class:"inline-card__icon"},Dr={class:"inline-card__content"},Mr={class:"inline-card__actions"},Rr=ze({__name:"InlineCard",setup(I){const w=Oo(),o=E(()=>{var h;const i=(h=w.icon)==null?void 0:h.call(w);return Array.isArray(i)?i.length>0:!!i});return(i,h)=>(c(),b("div",jr,[o.value?(c(),b("div",Or,[ut(i.$slots,"icon",{},void 0,!0)])):U("",!0),e("div",Dr,[ut(i.$slots,"content",{},()=>[ut(i.$slots,"default",{},void 0,!0)],!0)]),e("div",Mr,[ut(i.$slots,"actions",{},void 0,!0)])]))}}),Ut=Pe(Rr,[["__scopeId","data-v-3b762b22"]]),Gr="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",Ar={class:"main-header app-header"},Ur={class:"header-left"},Er=["src"],Ir={class:"header-info"},Nr={class:"user-name"},Hr={class:"user-email"},Jr={class:"directory-icon"},Wr={class:"directory-display"},qr=["title"],Yr={class:"directory-actions"},Kr={key:0,class:"header-actions"},Qr={key:0,class:"command-history-section"},Xr={key:0,viewBox:"0 0 1024 1024",xmlns:"http://www.w3.org/2000/svg"},Zr={key:1,viewBox:"0 0 1024 1024",xmlns:"http://www.w3.org/2000/svg"},ec={class:"main-container"},tc={key:0,class:"loading-container"},sc={class:"loading-spinner"},oc={key:1,class:"grid-layout"},ac={class:"git-status-panel"},lc={key:0,class:"commit-form-panel"},nc={class:"tips"},ic={key:1,class:"commit-form-panel"},rc={key:2,class:"log-list-panel"},cc={class:"create-branch-content"},uc={class:"form-label"},dc={class:"form-label"},fc={class:"create-branch-footer"},pc={class:"footer-actions"},mc=["disabled"],vc={class:"main-footer app-footer p-4"},gc={key:0,class:"branch-info"},hc={key:1},yc={class:"repo-url"},_c={class:"user-settings-content"},wc={class:"form-group"},bc={class:"form-label"},kc={class:"form-group"},$c={class:"form-label"},Cc={class:"info-section"},Sc={class:"info-card"},Tc={class:"info-icon"},Vc={class:"user-settings-footer"},Fc={class:"footer-actions"},Lc={class:"directory-content"},xc={class:"form-label"},Bc={class:"directory-input-group"},zc={class:"form-label"},Pc={class:"recent-directories"},jc=["onClick"],Oc={class:"dir-path"},Dc={class:"directory-footer"},Mc={class:"footer-actions"},Rc=["disabled"],Gc=ze({__name:"App",setup(I){const w=f(""),o=f(null),i=f(null),h=f(null),u=st(),O=rt(),_=f(!1),R=f(""),Z=f(!1);function J(){Z.value=!Z.value;const T=document.documentElement;Z.value?(T.setAttribute("data-theme","dark"),localStorage.setItem("theme","dark")):(T.removeAttribute("data-theme"),localStorage.setItem("theme","light"))}function N(){const T=localStorage.getItem("theme"),r=window.matchMedia("(prefers-color-scheme: dark)").matches;(T==="dark"||!T&&r)&&(Z.value=!0,document.documentElement.setAttribute("data-theme","dark"))}function y(){O.config&&(w.value=`默认提交信息: ${O.config.defaultCommitMessage}`)}async function Q(){try{const r=await(await fetch("/api/current_directory")).json();return R.value=r.directory||"未知目录",r}catch(T){return console.error("获取当前目录失败:",T),{directory:"未知目录",isGitRepo:!1}}}ht(async()=>{console.log("---------- 页面初始化开始 ----------"),N();try{const T=await Q();O.isLoaded||await O.loadConfig(),y(),u.isGitRepo=T.isGitRepo===!0,u.lastCheckedTime=Date.now(),u.isGitRepo?await Promise.all([u.getCurrentBranch(!0),u.getAllBranches(),u.getUserInfo(),u.getRemoteUrl(),u.getBranchStatus(!0)]):n.warning("当前目录不是Git仓库,部分功能将不可用")}catch(T){console.error("初始化失败:",T)}finally{_.value=!0,console.log("---------- 页面初始化完成 ----------"),setTimeout(()=>{ke()},100)}});const $=f(!1),H=f(""),X=f("");async function x(){await u.createBranch(H.value,X.value)&&($.value=!1,H.value="",i.value&&i.value.refreshStatus(),o.value&&o.value.refreshLog())}function j(){X.value=u.currentBranch,$.value=!0}async function S(T){await u.changeBranch(T)&&(i.value&&i.value.refreshStatus(),o.value&&o.value.refreshLog())}const q=f(!1),se=f(""),P=f("");function ve(){se.value=u.userName,P.value=u.userEmail,q.value=!0}async function ee(){if(!se.value||!P.value){n.warning("用户名和邮箱不能为空");return}await u.restoreUserConfig(se.value,P.value)&&(q.value=!1)}async function g(){await u.clearUserConfig()&&(se.value="",P.value="")}let z=!1,A=!1,ce=!1,fe=0,me=0,ge="",oe="",te=null;function ue(){const T=document.querySelector(".grid-layout");if(!T)return;const r=getComputedStyle(T).gridTemplateColumns.split(" "),Y=getComputedStyle(T).gridTemplateRows.split(" ");if(r.length>=3&&Y.length>=3){const de=parseFloat(r[0]),Ve=parseFloat(r[2]),Ne=de+Ve,be=de/Ne,he=parseFloat(Y[0]),Ue=parseFloat(Y[2]),Fe=he+Ue,ye=he/Fe;localStorage.setItem("zen-gitsync-layout-left-ratio",be.toString()),localStorage.setItem("zen-gitsync-layout-top-ratio",ye.toString()),console.log(`布局比例已保存 - 左侧: ${(be*100).toFixed(0)}%, 上方: ${(ye*100).toFixed(0)}%`),localStorage.setItem("zen-gitsync-layout-bottom-left-ratio",be.toString()),console.log(`底部布局比例已保存 - 左侧: ${(be*100).toFixed(0)}%`)}}function ke(){const T=document.querySelector(".grid-layout");if(!T)return;const r=localStorage.getItem("zen-gitsync-layout-left-ratio"),Y=localStorage.getItem("zen-gitsync-layout-top-ratio");if(r){const de=parseFloat(r),Ve=1-de;T.style.gridTemplateColumns=`${de}fr 8px ${Ve}fr`,console.log(`已恢复左侧比例: ${(de*100).toFixed(0)}%`)}else T.style.gridTemplateColumns="1fr 8px 3fr";if(Y){const de=parseFloat(Y),Ve=1-de;T.style.gridTemplateRows=`${de}fr 8px ${Ve}fr`,console.log(`已恢复上方比例: ${(de*100).toFixed(0)}%`)}}function B(T){var de;const r=T.currentTarget;if(!r||!r.id)return;te=r.id,te==="v-resizer"?z=!0:te==="v-resizer-bottom"&&(A=!0),fe=T.clientX;const Y=document.querySelector(".grid-layout");ge=getComputedStyle(Y).gridTemplateColumns,(de=document.getElementById(te))==null||de.classList.add("active"),document.addEventListener("mousemove",F),document.addEventListener("mouseup",ie),T.preventDefault()}function F(T){if(!z&&!A)return;const r=document.querySelector(".grid-layout"),Y=T.clientX-fe,de=ge.split(" ");if(de.length>=3){const Ve=parseFloat(de[0]),Ne=parseFloat(de[2]),be=Ve+Ne,he=(Ve+Y/r.clientWidth*be)/be,Ue=1-he,Fe=.1,ye=.5;he<Fe?r.style.gridTemplateColumns=`${Fe}fr 8px ${1-Fe}fr`:he>ye?r.style.gridTemplateColumns=`${ye}fr 8px ${1-ye}fr`:r.style.gridTemplateColumns=`${he}fr 8px ${Ue}fr`}}function ie(){var T,r;z=!1,A=!1,(T=document.getElementById("v-resizer"))==null||T.classList.remove("active"),(r=document.getElementById("v-resizer-bottom"))==null||r.classList.remove("active"),document.removeEventListener("mousemove",F),document.removeEventListener("mouseup",ie),ue()}function le(T){var Y;ce=!0,me=T.clientY;const r=document.querySelector(".grid-layout");oe=getComputedStyle(r).gridTemplateRows,(Y=document.getElementById("h-resizer"))==null||Y.classList.add("active"),document.addEventListener("mousemove",Se),document.addEventListener("mouseup",Te),T.preventDefault()}function Se(T){if(!ce)return;const r=document.querySelector(".grid-layout"),Y=T.clientY-me,de=oe.split(" ");if(de.length>=3){const Ve=parseFloat(de[0]),Ne=parseFloat(de[2]),be=Ve+Ne,he=(Ve+Y/r.clientHeight*be)/be,Ue=1-he,Fe=.2,ye=.8;he<Fe?r.style.gridTemplateRows=`${Fe}fr 8px ${1-Fe}fr`:he>ye?r.style.gridTemplateRows=`${ye}fr 8px ${1-ye}fr`:r.style.gridTemplateRows=`${he}fr 8px ${Ue}fr`}}function Te(){var T;ce=!1,(T=document.getElementById("h-resizer"))==null||T.classList.remove("active"),document.removeEventListener("mousemove",Se),document.removeEventListener("mouseup",Te),ue()}const Oe=f(!1),we=f(""),ne=f(!1),Be=f([]);function De(){we.value=R.value,Oe.value=!0,Ze()}async function Ze(){try{const r=await(await fetch("/api/recent_directories")).json();r.success&&Array.isArray(r.directories)&&(Be.value=r.directories)}catch(T){console.error("获取最近目录失败:",T)}}async function lt(){if(!we.value){n.warning("目录路径不能为空");return}try{ne.value=!0;const r=await(await fetch("/api/change_directory",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:we.value})})).json();r.success?(n.success("已切换工作目录"),R.value=r.directory,Oe.value=!1,await Ke(r.directory),await Ze(),u.isGitRepo=r.isGitRepo,await O.loadConfig(!0),r.isGitRepo?(await Promise.all([u.getCurrentBranch(),u.getAllBranches(),u.getUserInfo(),u.getRemoteUrl()]),i.value&&i.value.refreshStatus(),o.value&&o.value.refreshLog()):(n.warning("当前目录不是Git仓库,部分功能将不可用"),u.$reset())):n.error(r.error||"切换目录失败")}catch(T){n.error(`切换目录失败: ${T.message}`)}finally{ne.value=!1}}async function Ke(T){try{await fetch("/api/save_recent_directory",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:T})})}catch(r){console.error("保存最近目录失败:",r)}}async function ot(){try{if(!R.value){n.warning("当前目录路径为空");return}const r=await(await fetch("/api/open_directory",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:R.value})})).json();r.success?n.success("已在文件管理器中打开目录"):r.error&&n.error(r.error)}catch(T){console.error("打开目录失败:",T),n.error(`打开目录失败: ${T.message}`)}}async function nt(){try{const r=await(await fetch("/api/browse_directory",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({currentPath:we.value||R.value})})).json();r.success?Ae(r):r.error&&n.error(r.error)}catch(T){console.error("浏览目录失败:",T),n.error(`浏览目录失败: ${T.message}`)}}function Ae(T){!T||!T.items||Ye.alert(Ie("div",{class:"directory-browser"},[Ie("div",{class:"current-path"},[Ie("span",{class:"path-label"},"当前路径: "),Ie("span",{class:"path-value"},T.path)]),Ie("div",{class:"directory-list"},[T.parentPath?Ie("div",{class:"directory-item parent-dir",onClick:()=>{We(T.parentPath)}},[Ie("span",{class:"dir-icon"},Ie("svg",{class:"folder-icon",viewBox:"0 0 24 24",width:"20",height:"20",style:{fill:"#E6A23C"}},[Ie("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"})])),Ie("span",{class:"dir-name"},"返回上级目录")]):null,...T.items.map(r=>Ie("div",{class:"directory-item",onClick:()=>{We(r.path)}},[Ie("span",{class:"dir-icon"},Ie("svg",{class:"folder-icon",viewBox:"0 0 24 24",width:"20",height:"20",style:{fill:"#409EFF"}},[Ie("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"})])),Ie("span",{class:"dir-name"},r.name)]))])]),"浏览并选择目录",{confirmButtonText:"使用当前目录",customClass:"directory-browser-dialog",callback:r=>{r==="confirm"&&(we.value=T.path)}})}async function We(T){try{Ye.close(),setTimeout(async()=>{try{const Y=await(await fetch("/api/browse_directory",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({currentPath:T})})).json();Y.success?Ae(Y):Y.error&&n.error(Y.error)}catch(r){console.error("浏览目录失败:",r),n.error(`浏览目录失败: ${r.message}`)}},100)}catch(r){console.error("处理目录选择时出错:",r),n.error(`处理目录选择时出错: ${r.message}`)}}return(T,r)=>{const Y=tt,de=Me,Ve=Vs,Ne=$e,be=Jt,he=xs,Ue=Et,Fe=It,ye=Ls;return c(),b(Ce,null,[e("header",Ar,[e("div",Ur,[e("img",{src:a(Gr),alt:"Zen GitSync Logo",class:"logo"},null,8,Er),r[16]||(r[16]=e("h1",null,"Zen GitSync",-1))]),e("div",Ir,[t(Ut,{id:"user-info",class:"user-info-card",compact:""},{content:s(()=>[a(u).userName&&a(u).userEmail?(c(),b(Ce,{key:0},[e("span",Nr,M(a(u).userName),1),e("span",Hr,"<"+M(a(u).userEmail)+">",1)],64)):(c(),b(Ce,{key:1},[r[17]||(r[17]=e("span",{class:"user-label"},"用户: ",-1)),r[18]||(r[18]=e("span",{class:"user-warning"},"未配置",-1))],64))]),actions:s(()=>[t(de,{content:"用户设置",placement:"bottom",effect:"dark","open-delay":500},{default:s(()=>[e("button",{class:"modern-btn user-settings-btn",onClick:ve},[t(Y,{class:"btn-icon"},{default:s(()=>[t(a(Bs))]),_:1})])]),_:1})]),_:1}),t(Ut,{id:"directory-selector",class:"directory-selector",compact:""},{icon:s(()=>[e("div",Jr,[t(Y,null,{default:s(()=>[t(a(Gt))]),_:1})])]),content:s(()=>[e("div",Wr,[e("div",{class:"directory-path",title:R.value},M(R.value),9,qr)])]),actions:s(()=>[e("div",Yr,[t(de,{content:"切换目录",placement:"bottom",effect:"dark","open-delay":500},{default:s(()=>[e("button",{class:"modern-btn dir-btn",onClick:De},[t(Y,{class:"btn-icon"},{default:s(()=>r[19]||(r[19]=[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}),t(de,{content:"在资源管理器中打开",placement:"bottom",effect:"dark","open-delay":500},{default:s(()=>[e("button",{class:"modern-btn dir-btn",onClick:ot},[t(Y,{class:"btn-icon"},{default:s(()=>r[20]||(r[20]=[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})])]),_:1}),a(u).isGitRepo?(c(),b("div",Kr,[a(u).isGitRepo?(c(),b("div",Qr,[t(Pr)])):U("",!0),t(de,{content:"编辑项目配置",placement:"bottom",effect:"dark","open-delay":500},{default:s(()=>[e("button",{class:"modern-btn config-btn",onClick:r[0]||(r[0]=ae=>{var Je;return(Je=h.value)==null?void 0:Je.openConfigEditor()})},[t(Y,{class:"btn-icon"},{default:s(()=>[t(a(dt))]),_:1})])]),_:1}),t(de,{content:Z.value?"切换到浅色主题":"切换到深色主题",placement:"bottom",effect:"dark","open-delay":500},{default:s(()=>[e("button",{class:"modern-btn theme-toggle-btn",onClick:J},[t(Y,{class:"btn-icon"},{default:s(()=>[Z.value?(c(),b("svg",Xr,r[21]||(r[21]=[e("path",{fill:"currentColor",d:"M512 128a384 384 0 1 1 0 768 384 384 0 0 1 0-768zm0 64a320 320 0 1 0 0 640 320 320 0 0 0 0-640z"},null,-1),e("path",{fill:"currentColor",d:"M512 64a32 32 0 0 1 32 32v64a32 32 0 0 1-64 0V96a32 32 0 0 1 32-32zm0 768a32 32 0 0 1 32 32v64a32 32 0 1 1-64 0v-64a32 32 0 0 1 32-32zM195.2 195.2a32 32 0 0 1 45.248 0l45.248 45.248a32 32 0 1 1-45.248 45.248L195.2 240.448a32 32 0 0 1 0-45.248zm543.104 543.104a32 32 0 0 1 45.248 0l45.248 45.248a32 32 0 0 1-45.248 45.248l-45.248-45.248a32 32 0 0 1 0-45.248zM64 512a32 32 0 0 1 32-32h64a32 32 0 0 1 0 64H96a32 32 0 0 1-32-32zm768 0a32 32 0 0 1 32-32h64a32 32 0 1 1 0 64h-64a32 32 0 0 1-32-32zM195.2 828.8a32 32 0 0 1 0-45.248l45.248-45.248a32 32 0 0 1 45.248 45.248L240.448 828.8a32 32 0 0 1-45.248 0zm543.104-543.104a32 32 0 0 1 0-45.248l45.248-45.248a32 32 0 0 1 45.248 45.248l-45.248 45.248a32 32 0 0 1-45.248 0z"},null,-1)]))):(c(),b("svg",Zr,r[22]||(r[22]=[e("path",{fill:"currentColor",d:"M240.448 240.448a384 384 0 1 0 559.424 525.696 448 448 0 0 1-542.016-542.08 390.592 390.592 0 0 0-17.408 16.384zm181.056 362.048a384 384 0 0 0 525.632 16.384A448 448 0 1 1 405.056 76.8a384 384 0 0 0 16.448 525.696z"},null,-1)])))]),_:1})])]),_:1},8,["content"]),t(de,{content:"Git 操作",placement:"bottom",effect:"dark","open-delay":500},{default:s(()=>[e("button",{class:"modern-btn drawer-btn",onClick:r[1]||(r[1]=ae=>{var Je;return(Je=h.value)==null?void 0:Je.toggleGitOperationsDrawer()})},[t(Y,{class:"btn-icon"},{default:s(()=>[t(a(ys))]),_:1})])]),_:1})])):U("",!0)])]),e("main",ec,[_.value?(c(),b("div",oc,[e("div",ac,[t(Ya,{ref_key:"gitStatusRef",ref:i,"initial-directory":R.value},null,8,["initial-directory"])]),e("div",{class:"vertical-resizer",id:"v-resizer",onMousedown:B},null,32),a(u).isGitRepo?(c(),b("div",lc,[!a(u).userName||!a(u).userEmail?(c(),G(Ve,{key:0,shadow:"hover"},{header:s(()=>r[25]||(r[25]=[e("h2",null,"Git用户未配置",-1)])),default:s(()=>[r[29]||(r[29]=e("p",null,"请先配置Git用户信息才能进行提交操作。",-1)),e("div",nc,[r[27]||(r[27]=e("h3",null,"您可以通过以下方式配置:",-1)),r[28]||(r[28]=e("ol",null,[e("li",null,"点击右上角的设置按钮,配置用户名和邮箱"),e("li",null,"或者使用命令行配置:"),e("div",{class:"code-block"},[D(' git config --global user.name "您的用户名"'),e("br"),D(' git config --global user.email "您的邮箱" ')])],-1)),t(Ne,{type:"primary",onClick:ve},{default:s(()=>r[26]||(r[26]=[D(" 立即配置 ")])),_:1})])]),_:1})):(c(),G($i,{key:1,ref_key:"commitFormRef",ref:h},null,512))])):(c(),b("div",ic,[t(Ve,{shadow:"hover"},{header:s(()=>r[30]||(r[30]=[e("h2",null,"Git仓库初始化",-1)])),default:s(()=>[r[31]||(r[31]=e("p",null,"当前目录不是Git仓库,请先初始化Git仓库或切换到Git仓库目录。",-1)),r[32]||(r[32]=e("div",{class:"tips"},[e("h3",null,"可以使用以下命令初始化仓库:"),e("div",{class:"code-block"},"git init")],-1))]),_:1})])),e("div",{class:"horizontal-resizer",id:"h-resizer",onMousedown:le},null,32),a(u).isGitRepo?(c(),b("div",rc,[t(ar,{ref_key:"logListRef",ref:o},null,512)])):U("",!0),t(Xe,{modelValue:$.value,"onUpdate:modelValue":r[5]||(r[5]=ae=>$.value=ae),title:"创建新分支",size:"small","destroy-on-close":!0,"custom-class":"create-branch-dialog"},{footer:s(()=>[e("div",fc,[e("div",pc,[e("button",{type:"button",class:"footer-btn cancel-btn",onClick:r[4]||(r[4]=ae=>$.value=!1)}," 取消 "),e("button",{type:"button",class:"footer-btn primary-btn",onClick:x,disabled:a(u).isCreatingBranch},[a(u).isCreatingBranch?(c(),G(Y,{key:1,class:"is-loading"},{default:s(()=>r[35]||(r[35]=[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 32z"})],-1)])),_:1})):(c(),G(Y,{key:0},{default:s(()=>[t(a(ft))]),_:1})),r[36]||(r[36]=e("span",null,"创建",-1))],8,mc)])])]),default:s(()=>[e("div",cc,[t(ye,{model:{newBranchName:H.value,selectedBaseBranch:X.value},"label-position":"top"},{default:s(()=>[t(he,null,{label:s(()=>[e("div",uc,[t(Y,{class:"label-icon"},{default:s(()=>[t(a(_s))]),_:1}),r[33]||(r[33]=e("span",null,"新分支名称",-1))])]),default:s(()=>[t(be,{modelValue:H.value,"onUpdate:modelValue":r[2]||(r[2]=ae=>H.value=ae),placeholder:"请输入新分支名称",class:"modern-input",size:"large"},null,8,["modelValue"])]),_:1}),t(he,null,{label:s(()=>[e("div",dc,[t(Y,{class:"label-icon"},{default:s(()=>[t(a(ys))]),_:1}),r[34]||(r[34]=e("span",null,"基于分支",-1))])]),default:s(()=>[t(Fe,{modelValue:X.value,"onUpdate:modelValue":r[3]||(r[3]=ae=>X.value=ae),placeholder:"选择基础分支",class:"modern-select",size:"large",style:{width:"100%"}},{default:s(()=>[(c(!0),b(Ce,null,Ge(a(u).allBranches,ae=>(c(),G(Ue,{key:ae,label:ae,value:ae},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])]),_:1})]),_:1},8,["model"])])]),_:1},8,["modelValue"])])):(c(),b("div",tc,[t(Ve,{class:"loading-card"},{default:s(()=>[e("div",sc,[t(Y,{class:"is-loading"},{default:s(()=>r[23]||(r[23]=[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})]),r[24]||(r[24]=e("div",{class:"loading-text"},"加载中...",-1))]),_:1})]))]),e("footer",vc,[a(u).currentBranch?(c(),b("div",gc,[t(Ut,{class:"branch-wrapper",compact:""},{content:s(()=>[r[37]||(r[37]=e("span",{class:"branch-label"},"当前分支:",-1)),t(Fe,{modelValue:a(u).currentBranch,"onUpdate:modelValue":r[6]||(r[6]=ae=>a(u).currentBranch=ae),size:"small",onChange:S,loading:a(u).isChangingBranch,class:"branch-select"},{default:s(()=>[(c(!0),b(Ce,null,Ge(a(u).allBranches,ae=>(c(),G(Ue,{key:ae,label:ae,value:ae},null,8,["label","value"]))),128))]),_:1},8,["modelValue","loading"])]),actions:s(()=>[e("button",{class:"modern-btn create-branch-btn",onClick:j},[t(Y,{class:"btn-icon"},{default:s(()=>[t(a(_s))]),_:1}),r[38]||(r[38]=e("span",{class:"btn-text"},"新建分支",-1))])]),_:1})])):U("",!0),a(u).remoteUrl?(c(),b("div",hc,[t(Ut,{class:"footer-right",compact:""},{content:s(()=>[r[39]||(r[39]=e("span",{class:"repo-url-label"},"远程仓库:",-1)),e("span",yc,M(a(u).remoteUrl),1)]),actions:s(()=>[t(de,{content:"复制仓库地址",placement:"top",effect:"dark","open-delay":500},{default:s(()=>[e("button",{class:"modern-btn copy-url-btn",onClick:r[7]||(r[7]=ae=>a(u).copyRemoteUrl())},[t(Y,{class:"btn-icon"},{default:s(()=>r[40]||(r[40]=[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})]),_:1})])):U("",!0)]),t(Xe,{modelValue:q.value,"onUpdate:modelValue":r[11]||(r[11]=ae=>q.value=ae),title:"Git 用户设置",size:"small","destroy-on-close":!0,"custom-class":"user-settings-dialog"},{footer:s(()=>[e("div",Vc,[e("button",{type:"button",class:"footer-btn danger-btn",onClick:g},[t(Y,null,{default:s(()=>[t(a(Ft))]),_:1}),r[44]||(r[44]=e("span",null,"清除配置",-1))]),e("div",Fc,[e("button",{type:"button",class:"footer-btn cancel-btn",onClick:r[10]||(r[10]=ae=>q.value=!1)}," 取消 "),e("button",{type:"button",class:"footer-btn primary-btn",onClick:ee},[t(Y,null,{default:s(()=>[t(a(ft))]),_:1}),r[45]||(r[45]=e("span",null,"保存设置",-1))])])])]),default:s(()=>[e("div",_c,[t(ye,{class:"user-form",model:{tempUserName:se.value,tempUserEmail:P.value},"label-position":"top"},{default:s(()=>[e("div",wc,[t(he,{class:"form-item"},{label:s(()=>[e("div",bc,[t(Y,{class:"label-icon"},{default:s(()=>[t(a(Do))]),_:1}),r[41]||(r[41]=e("span",null,"用户名",-1))])]),default:s(()=>[t(be,{modelValue:se.value,"onUpdate:modelValue":r[8]||(r[8]=ae=>se.value=ae),placeholder:"请输入 Git 用户名",class:"modern-input",size:"large"},null,8,["modelValue"])]),_:1})]),e("div",kc,[t(he,{class:"form-item"},{label:s(()=>[e("div",$c,[t(Y,{class:"label-icon"},{default:s(()=>[t(a(Mo))]),_:1}),r[42]||(r[42]=e("span",null,"邮箱地址",-1))])]),default:s(()=>[t(be,{modelValue:P.value,"onUpdate:modelValue":r[9]||(r[9]=ae=>P.value=ae),placeholder:"请输入 Git 邮箱地址",class:"modern-input",size:"large"},null,8,["modelValue"])]),_:1})]),e("div",Cc,[e("div",Sc,[e("div",Tc,[t(Y,null,{default:s(()=>[t(a(os))]),_:1})]),r[43]||(r[43]=e("div",{class:"info-content"},[e("p",{class:"info-title"},"全局配置"),e("p",{class:"info-desc"},"这些设置将影响全局 Git 配置,对所有 Git 仓库生效")],-1))])])]),_:1},8,["model"])])]),_:1},8,["modelValue"]),t(Xe,{modelValue:Oe.value,"onUpdate:modelValue":r[15]||(r[15]=ae=>Oe.value=ae),title:"切换工作目录",size:"medium","destroy-on-close":!0,"custom-class":"directory-dialog"},{footer:s(()=>[e("div",Dc,[e("div",Mc,[e("button",{type:"button",class:"footer-btn cancel-btn",onClick:r[13]||(r[13]=ae=>Oe.value=!1)}," 取消 "),e("button",{type:"button",class:"footer-btn primary-btn",onClick:r[14]||(r[14]=ae=>lt()),disabled:ne.value},[ne.value?(c(),G(Y,{key:1,class:"is-loading"},{default:s(()=>r[49]||(r[49]=[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 32z"})],-1)])),_:1})):(c(),G(Y,{key:0},{default:s(()=>[t(a(ft))]),_:1})),r[50]||(r[50]=e("span",null,"切换",-1))],8,Rc)])])]),default:s(()=>[e("div",Lc,[t(ye,{"label-position":"top"},{default:s(()=>[t(he,null,{label:s(()=>[e("div",xc,[t(Y,{class:"label-icon"},{default:s(()=>[t(a(Gt))]),_:1}),r[46]||(r[46]=e("span",null,"目录路径",-1))])]),default:s(()=>[e("div",Bc,[t(be,{modelValue:we.value,"onUpdate:modelValue":r[12]||(r[12]=ae=>we.value=ae),placeholder:"请输入目录路径",class:"modern-input",size:"large"},null,8,["modelValue"]),e("button",{type:"button",class:"browse-btn",onClick:nt},[t(Y,null,{default:s(()=>[t(a(Gt))]),_:1}),r[47]||(r[47]=e("span",null,"浏览",-1))])])]),_:1}),Be.value.length>0?(c(),G(he,{key:0},{label:s(()=>[e("div",zc,[t(Y,{class:"label-icon"},{default:s(()=>[t(a(Ps))]),_:1}),r[48]||(r[48]=e("span",null,"常用目录",-1))])]),default:s(()=>[e("div",Pc,[(c(!0),b(Ce,null,Ge(Be.value,(ae,Je)=>(c(),b("div",{key:Je,class:"recent-dir-item",onClick:pt=>we.value=ae},[t(Y,{class:"dir-icon"},{default:s(()=>[t(a(Gt))]),_:1}),e("span",Oc,M(ae),1)],8,jc))),128))])]),_:1})):U("",!0)]),_:1})])]),_:1},8,["modelValue"])],64)}}}),Ac=Pe(Gc,[["__scopeId","data-v-957320d6"]]),Rs=Ro(Ac);Rs.use(Go());Rs.mount("#app");
|