zen-gitsync 2.1.26 → 2.1.27
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/ui/public/assets/index-CS5ScLac.css +1 -0
- package/src/ui/public/assets/index-Cklbt9PZ.js +22 -0
- package/src/ui/public/assets/vendor-0cEbNeyt.js +45 -0
- package/src/ui/public/index.html +3 -3
- package/src/ui/server/index.js +97 -58
- package/src/ui/public/assets/index-Cj-n4CZW.css +0 -1
- package/src/ui/public/assets/index-LmXVzmKV.js +0 -22
- package/src/ui/public/assets/vendor-LDRpPx4a.js +0 -45
package/package.json
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.card[data-v-d672dbfb]{background-color:#fff;border-radius:12px;box-shadow:0 2px 12px #0000000a;border:1px solid rgba(0,0,0,.03);height:100%;width:100%;display:flex;flex-direction:column;overflow:hidden;transition:all .3s ease;position:relative}.status-header[data-v-d672dbfb]{display:flex;justify-content:space-between;align-items:center;padding:12px 16px;border-bottom:1px solid #f0f0f0}.status-header h2[data-v-d672dbfb]{margin:0;font-size:16px;font-weight:500;color:#303133}.header-actions[data-v-d672dbfb]{display:flex;align-items:center;gap:8px}.card-content[data-v-d672dbfb]{padding:16px;overflow-y:auto;overflow-x:hidden;flex:1;display:flex;flex-direction:column}.status-box[data-v-d672dbfb]{white-space:pre-wrap;font-family:monospace;background-color:#f8f9fa;padding:16px;border-radius:8px;margin-bottom:20px;max-height:200px;overflow-y:auto;overflow-x:hidden;border:1px solid #f0f0f0;font-size:14px;line-height:1.5;width:100%;box-sizing:border-box}.file-list-container[data-v-d672dbfb]{flex:1;overflow:hidden;display:flex;flex-direction:column;gap:16px;height:auto;min-height:100px;width:100%;box-sizing:border-box}.file-group[data-v-d672dbfb]{background-color:#f8f9fa;border-radius:8px;overflow:hidden;border:1px solid #ebeef5;margin-bottom:0;display:flex;flex-direction:column;transition:box-shadow .3s ease}.file-group[data-v-d672dbfb]:hover{box-shadow:0 4px 12px #0000000d}.file-group[data-v-d672dbfb]{flex:0 1 auto}.file-group[data-v-d672dbfb]:last-child{margin-bottom:0;flex:1 1 auto}.file-group-header[data-v-d672dbfb]{font-size:14px;font-weight:700;padding:10px 16px;background-color:#f0f2f5;color:#606266;border-bottom:1px solid #ebeef5;flex-shrink:0}.file-list[data-v-d672dbfb]{overflow-y:auto;min-height:40px;max-height:200px;flex-grow:1;padding:0;margin:0;scrollbar-width:thin;scrollbar-color:rgba(144,147,153,.3) transparent}.file-list[data-v-d672dbfb]::-webkit-scrollbar{width:6px;height:6px}.file-list[data-v-d672dbfb]::-webkit-scrollbar-thumb{background-color:#9093994d;border-radius:4px}.file-list[data-v-d672dbfb]::-webkit-scrollbar-thumb:hover{background-color:#90939980}.file-list[data-v-d672dbfb]::-webkit-scrollbar-track{background-color:transparent}.file-list[data-v-d672dbfb]:empty{display:none}.empty-file-container[data-v-d672dbfb]{overflow-y:hidden!important;display:flex;flex-direction:column;align-items:stretch;flex:1}.empty-file-group[data-v-d672dbfb]{padding:16px;text-align:center;color:#909399;font-size:13px;font-style:italic;display:flex;align-items:center;justify-content:center;min-height:50px;background-color:#f8f9fa;border-radius:4px;margin:8px}.file-item[data-v-d672dbfb]{padding:10px 16px;display:flex;align-items:center;justify-content:space-between;border-bottom:1px solid #ebeef5;cursor:pointer;transition:all .2s ease}.file-item[data-v-d672dbfb]:last-child{border-bottom:none}.file-item[data-v-d672dbfb]:hover{background-color:#ecf5ff}.file-info[data-v-d672dbfb]{display:flex;align-items:center;flex-grow:1;overflow:hidden;white-space:nowrap;gap:10px}.file-status-indicator[data-v-d672dbfb]{width:8px;height:8px;border-radius:50%;background-color:#409eff;flex-shrink:0}.file-status-indicator.added[data-v-d672dbfb]{background-color:#67c23a}.file-status-indicator.modified[data-v-d672dbfb]{background-color:#409eff}.file-status-indicator.deleted[data-v-d672dbfb]{background-color:#f56c6c}.file-status-indicator.untracked[data-v-d672dbfb]{background-color:#e6a23c}.file-path-container[data-v-d672dbfb]{display:flex;flex-direction:column;overflow:hidden}.file-name[data-v-d672dbfb]{font-weight:500;color:#303133;overflow:hidden;text-overflow:ellipsis;line-height:1.4}.file-directory[data-v-d672dbfb]{font-size:12px;color:#909399;max-width:200px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.file-actions[data-v-d672dbfb]{display:flex;gap:8px;opacity:0;transition:opacity .2s ease}.file-item:hover .file-actions[data-v-d672dbfb]{opacity:1}.empty-status[data-v-d672dbfb]{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:40px 20px;text-align:center;background-color:#f9f9f9;border-radius:8px;flex-grow:1}.empty-icon[data-v-d672dbfb]{width:64px;height:64px;display:flex;align-items:center;justify-content:center;background-color:#f0f2f5;border-radius:50%;margin-bottom:16px;font-size:28px;color:#909399;animation:pulse-d672dbfb 2s infinite ease-in-out}@keyframes pulse-d672dbfb{0%{transform:scale(1);opacity:.7}50%{transform:scale(1.05);opacity:1}to{transform:scale(1);opacity:.7}}.empty-text[data-v-d672dbfb]{font-size:18px;font-weight:500;color:#606266;margin-bottom:8px}.empty-subtext[data-v-d672dbfb]{font-size:14px;color:#909399;margin-bottom:20px}.status-box-wrap[data-v-d672dbfb]{height:100%;display:flex;flex-direction:column;gap:16px}.branch-status-info[data-v-d672dbfb]{margin-bottom:0;background-color:#f8f9fa;border-radius:8px;overflow:hidden;border:1px solid #ebeef5;transition:all .3s ease}.branch-status-info[data-v-d672dbfb]:hover{box-shadow:0 4px 12px #0000000d}.branch-sync-status[data-v-d672dbfb]{display:flex;align-items:center;padding:12px 16px;border-left:3px solid #e6a23c;margin-bottom:0;background-color:#fdf6ec}.sync-status-content[data-v-d672dbfb]{display:flex;align-items:center;flex-wrap:wrap;gap:10px;width:100%}.status-badges[data-v-d672dbfb]{display:flex;flex-direction:column;gap:8px;width:100%}.status-badge[data-v-d672dbfb]{display:flex;align-items:center;width:100%;border-radius:4px;padding:8px 12px;transition:all .3s ease}.status-badge.el-tag--warning[data-v-d672dbfb]{background-color:#fdf6ec;border-color:#faecd8}.status-badge.el-tag--info[data-v-d672dbfb]{background-color:#f4f4f5;border-color:#e9e9eb}.status-badge[data-v-d672dbfb]:hover{transform:translateY(-2px);box-shadow:0 2px 8px #0000000d}.badge-content[data-v-d672dbfb]{display:flex;align-items:center;gap:8px;font-size:13px}.diff-dialog[data-v-d672dbfb]{height:calc(100vh - 150px)}[data-v-d672dbfb] .el-dialog__body{height:calc(100vh - 320px);overflow:auto;padding:0}.diff-content[data-v-d672dbfb]{flex:1;overflow-y:auto;padding:16px 20px;background-color:#fafafa;height:100%}.diff-formatted[data-v-d672dbfb]{font-family:JetBrains Mono,Fira Code,Consolas,Courier New,monospace;font-size:14px;line-height:1.6;white-space:pre-wrap;padding-bottom:20px}.no-diff[data-v-d672dbfb]{display:flex;align-items:center;justify-content:center;height:100%;color:#909399;font-size:14px}.file-navigation[data-v-d672dbfb]{display:flex;justify-content:space-between;align-items:center;padding:12px 20px;border-top:1px solid #ebeef5;background-color:#f9f9fb}.counter-tag[data-v-d672dbfb]{font-family:monospace;font-size:14px;padding:6px 12px;min-width:80px;text-align:center}.nav-button[data-v-d672dbfb]{min-width:120px;transition:all .3s ease}.nav-button[data-v-d672dbfb]:hover:not(:disabled){transform:translateY(-2px);box-shadow:0 2px 8px #0000001a}.diff-formatted[data-v-d672dbfb]::-webkit-scrollbar,.diff-content[data-v-d672dbfb]::-webkit-scrollbar{width:6px;height:6px}.diff-formatted[data-v-d672dbfb]::-webkit-scrollbar-thumb,.diff-content[data-v-d672dbfb]::-webkit-scrollbar-thumb{background-color:#9093994d;border-radius:4px}.diff-formatted[data-v-d672dbfb]::-webkit-scrollbar-thumb:hover,.diff-content[data-v-d672dbfb]::-webkit-scrollbar-thumb:hover{background-color:#90939980}.diff-formatted[data-v-d672dbfb]::-webkit-scrollbar-track,.diff-content[data-v-d672dbfb]::-webkit-scrollbar-track{background-color:transparent}.diff-formatted[data-v-d672dbfb],.diff-content[data-v-d672dbfb]{scrollbar-width:thin;scrollbar-color:rgba(144,147,153,.3) transparent}.auto-update-switch[data-v-d672dbfb] .el-switch__core{transition:all .3s ease-in-out;box-shadow:0 2px 5px #0000001a}.auto-update-switch[data-v-d672dbfb] .el-switch__core:hover{box-shadow:0 2px 8px #0003}.auto-update-switch.is-checked[data-v-d672dbfb] .el-switch__core{box-shadow:0 2px 5px #67c23a4d}.auto-update-switch.is-checked[data-v-d672dbfb] .el-switch__core:hover{box-shadow:0 2px 8px #67c23a80}.el-button[data-v-d672dbfb]{transition:all .3s ease}.el-button[data-v-d672dbfb]:not(:disabled):hover{transform:translateY(-2px);box-shadow:0 2px 8px #0000001a}.card-content[data-v-d672dbfb] .el-loading-mask{background-color:#fffc;-webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px);z-index:10}.card-content[data-v-d672dbfb] .el-loading-spinner{transform:scale(1.2)}.card-content[data-v-d672dbfb] .el-loading-text{font-size:16px;color:#409eff;font-weight:700;margin-top:10px}.diff-header{font-weight:700;background-color:#e6f1fc;padding:8px 12px;margin:10px 0;border-radius:6px;color:#0366d6;border-bottom:1px solid #c8e1ff}.diff-old-file,.diff-new-file{color:#586069;padding:4px 8px;font-family:monospace}.diff-hunk-header{color:#6f42c1;background-color:#f1f8ff;padding:4px 8px;margin:8px 0;border-radius:4px;font-family:monospace}.diff-added{background-color:#e6ffed;color:#22863a;padding:2px 8px;border-left:4px solid #22863a;font-family:monospace;display:block;margin:2px 0}.diff-removed{background-color:#ffeef0;color:#cb2431;padding:2px 8px;border-left:4px solid #cb2431;font-family:monospace;display:block;margin:2px 0}.diff-context{color:#444;padding:2px 8px;font-family:monospace;display:block;margin:2px 0;background-color:#fafbfc}@keyframes snakeBorder-a1d647fa{0%,to{border-top:2px solid #409EFF;border-right:2px solid transparent;border-bottom:2px solid transparent;border-left:2px solid transparent}25%{border-top:2px solid #409EFF;border-right:2px solid #67C23A;border-bottom:2px solid transparent;border-left:2px solid transparent}50%{border-top:2px solid transparent;border-right:2px solid #67C23A;border-bottom:2px solid #409EFF;border-left:2px solid transparent}75%{border-top:2px solid transparent;border-right:2px solid transparent;border-bottom:2px solid #409EFF;border-left:2px solid #67C23A}}@keyframes glowPulse-a1d647fa{0%,to{box-shadow:0 0 8px #409eff66}50%{box-shadow:0 0 12px #67c23a80}}.card[data-v-a1d647fa]{background-color:#fff;border-radius:8px;box-shadow:0 2px 10px #00000008;border:1px solid rgba(0,0,0,.03);height:100%;width:100%;display:flex;flex-direction:column;overflow:hidden;position:relative}.card-header h2[data-v-a1d647fa]{margin:0;font-size:16px;font-weight:500;color:#303133}.card-content[data-v-a1d647fa]{padding:15px;overflow-y:auto;flex:1}.actions-section h3[data-v-a1d647fa]{margin-top:0;margin-bottom:10px;padding-bottom:8px;border-bottom:1px solid #dcdfe6;font-size:16px;color:#303133;font-weight:500}.operations-wrapper[data-v-a1d647fa]{display:flex;gap:10px}.action-groups[data-v-a1d647fa]{display:flex;flex-direction:column;gap:12px}.action-group[data-v-a1d647fa]{background-color:#f9f9f9;border-radius:6px;padding:12px 14px;box-shadow:0 2px 8px #00000014;transition:all .3s ease;flex:1}.action-group[data-v-a1d647fa]:hover{box-shadow:0 4px 12px #0000001f}.group-title[data-v-a1d647fa]{font-size:13px;font-weight:700;margin-bottom:8px;color:#606266;text-align:left;display:block;position:relative;padding-left:6px;border-bottom:1px solid rgba(0,0,0,.06);padding-bottom:6px}.group-buttons[data-v-a1d647fa]{display:flex;flex-direction:row;flex-wrap:wrap;gap:8px;padding:0}.action-button[data-v-a1d647fa]{font-size:14px;font-weight:500;flex:1;min-width:100px;border-radius:4px;height:36px;padding:0 10px}.action-button[data-v-a1d647fa]:hover{transform:translateY(-1px);box-shadow:0 2px 5px #00000026}.action-button[data-v-a1d647fa]:active{transform:translateY(0)}.command-text[data-v-a1d647fa],.command-text-long[data-v-a1d647fa]{display:none}.standard-commit-form[data-v-a1d647fa]{display:flex;flex-direction:column;gap:8px;margin-bottom:15px}.standard-commit-header[data-v-a1d647fa]{display:flex;flex-direction:column;gap:4px;width:100%}.type-scope-container[data-v-a1d647fa]{display:flex;gap:10px;width:100%;margin-bottom:10px}.type-select[data-v-a1d647fa]{width:35%}.scope-wrapper[data-v-a1d647fa]{display:flex;align-items:center;gap:5px;width:65%}.commit-form[data-v-a1d647fa]{display:flex;flex-direction:column;gap:8px}.description-container[data-v-a1d647fa]{display:flex;align-items:center;gap:5px;width:100%}.scope-input[data-v-a1d647fa],.description-input[data-v-a1d647fa]{flex-grow:1}.settings-button[data-v-a1d647fa]{flex-shrink:0}.preview-section[data-v-a1d647fa]{background-color:#f5f7fa;padding:10px;border-radius:4px}.preview-title[data-v-a1d647fa]{font-weight:700;margin-bottom:5px}.preview-content[data-v-a1d647fa]{white-space:pre-wrap;font-family:monospace;margin:0;padding:10px;background-color:#ebeef5;border-radius:4px}.template-container[data-v-a1d647fa]{display:flex;flex-direction:column;height:calc(85vh - 100px);overflow-y:auto;padding:5px}.template-form[data-v-a1d647fa]{margin-bottom:20px;background-color:#f8f9fa;padding:15px;border-radius:6px;border:1px solid #ebeef5}.template-form-buttons[data-v-a1d647fa]{display:flex;gap:10px;margin-top:12px;justify-content:flex-end}.template-input[data-v-a1d647fa]{flex-grow:1}.template-list[data-v-a1d647fa]{overflow-y:auto;height:100%}.template-list h3[data-v-a1d647fa]{margin-top:0;margin-bottom:15px;font-size:16px;font-weight:500;color:#303133;padding-bottom:8px;border-bottom:1px solid #ebeef5}.template-item[data-v-a1d647fa]{margin-bottom:10px;transition:all .2s ease;border:1px solid #ebeef5}.template-item[data-v-a1d647fa]:hover{background-color:#f5f7fa;transform:translateY(-2px);box-shadow:0 2px 12px #0000001a}.template-content[data-v-a1d647fa]{flex-grow:1;margin-right:10px;word-break:break-all;padding:5px 0;color:#303133;font-weight:500}.template-actions[data-v-a1d647fa]{display:flex;gap:8px;justify-content:flex-end;min-width:180px;flex-shrink:0}.options-row[data-v-a1d647fa]{display:flex;justify-content:space-between;align-items:center;margin-bottom:15px}.code-command[data-v-a1d647fa]{background-color:#2d2d2d;color:#f8f8f2;font-family:Courier New,Courier,monospace;padding:10px;border-radius:4px;overflow-x:auto;white-space:pre;font-size:14px}@media (min-width: 768px){.layout-container[data-v-a1d647fa]{flex-direction:row}.commit-section[data-v-a1d647fa]{flex:3}.actions-section[data-v-a1d647fa]{width:320px}.operations-wrapper[data-v-a1d647fa]{flex-direction:column}}.git-config-warning[data-v-a1d647fa]{width:100%}.config-command[data-v-a1d647fa]{background-color:#2d2d2d;color:#f8f8f2;font-family:Courier New,Courier,monospace;padding:10px;border-radius:4px;margin-top:10px;white-space:pre}@keyframes pushing-pulse-a1d647fa{0%{box-shadow:0 0 #67c23a66}70%{box-shadow:0 0 0 15px #67c23a00}to{box-shadow:0 0 #67c23a00}}@keyframes pushing-border-a1d647fa{0%{border-color:#67c23a}50%{border-color:#85ce61}to{border-color:#67c23a}}.card.is-pushing[data-v-a1d647fa]{animation:pushing-border-a1d647fa 1.5s infinite ease-in-out;box-shadow:0 4px 12px #0000001a;transition:all .3s ease}.push-button[data-v-a1d647fa]{background-color:#67c23a;border-color:#67c23a}.push-button[data-v-a1d647fa]:hover{background-color:#85ce61;border-color:#85ce61}.push-button.is-loading[data-v-a1d647fa],.push-button.is-loading[data-v-a1d647fa]:hover,.push-button.is-loading[data-v-a1d647fa]:focus{animation:pushing-pulse-a1d647fa 1.5s infinite;background-color:#67c23a!important;border-color:#67c23a!important}.el-button.push-button.is-loading .el-loading-spinner[data-v-a1d647fa]{color:#fff!important}@keyframes one-click-push-glow-a1d647fa{0%{box-shadow:0 0 5px #67c23a80}50%{box-shadow:0 0 20px #67c23acc}to{box-shadow:0 0 5px #67c23a80}}.action-button.one-click-push[data-v-a1d647fa]{position:relative;overflow:hidden}.action-button.one-click-push.is-loading[data-v-a1d647fa],.action-button.one-click-push.is-loading[data-v-a1d647fa]:hover{animation:one-click-push-glow-a1d647fa 1.5s infinite;background-color:#67c23a!important;border-color:#67c23a!important}@keyframes push-success-a1d647fa{0%{transform:scale(1)}50%{transform:scale(1.1)}to{transform:scale(1)}}.push-success-indicator[data-v-a1d647fa]{position:absolute;top:0;right:0;bottom:0;left:0;margin:auto;background-color:#fff;border-radius:12px;padding:20px 30px;box-shadow:0 8px 24px #00000026;display:flex;flex-direction:column;align-items:center;justify-content:center;animation:push-success-a1d647fa .5s ease-out;z-index:9999;width:200px;height:200px}.push-success-icon[data-v-a1d647fa]{font-size:64px;color:#67c23a;margin-bottom:16px;animation:bounce-a1d647fa .8s ease-in-out}@keyframes bounce-a1d647fa{0%,20%,50%,80%,to{transform:translateY(0)}40%{transform:translateY(-20px)}60%{transform:translateY(-10px)}}.push-success-text[data-v-a1d647fa]{font-size:20px;font-weight:700;color:#303133;text-align:center}.reset-button[data-v-a1d647fa]{background-color:#909399;border-color:#909399}.reset-button[data-v-a1d647fa]:hover{background-color:#a6a9ad;border-color:#a6a9ad}.el-button+.el-button[data-v-a1d647fa]{margin-left:0}.pushing-indicator[data-v-a1d647fa]{position:absolute;top:0;right:0;bottom:0;left:0;margin:auto;background-color:#409eff;border-radius:12px;padding:20px 30px;box-shadow:0 8px 24px #00000026;display:flex;flex-direction:column;align-items:center;justify-content:center;z-index:9999;width:200px;height:200px;color:#fff}.form-bottom-actions[data-v-a1d647fa]{display:block;padding:8px;background-color:#f5f7fa;border-radius:6px;box-shadow:0 2px 8px #00000014;transition:all .3s ease}.form-bottom-actions[data-v-a1d647fa]:hover{box-shadow:0 4px 12px #0000001f}.actions-flex-container[data-v-a1d647fa]{display:flex;justify-content:space-between;gap:10px;width:100%}.left-actions[data-v-a1d647fa]{flex:3;display:flex;align-items:center}.right-actions[data-v-a1d647fa]{flex:2;display:flex;align-items:center;justify-content:center}.button-grid[data-v-a1d647fa]{display:grid;grid-template-columns:1fr 1fr;grid-template-rows:1fr 1fr;gap:6px;width:100%;height:100%}.button-grid .el-button[data-v-a1d647fa]{margin:0;height:100%;min-height:36px;display:flex;align-items:center;justify-content:center;padding:8px 15px}.button-grid .el-button[data-v-a1d647fa]:first-child{grid-column:1 / 2;grid-row:1 / 2}.button-grid .el-button[data-v-a1d647fa]:nth-child(2){grid-column:2 / 3;grid-row:1 / 2}.button-grid .el-button[data-v-a1d647fa]:last-child{grid-column:1 / 3;grid-row:2 / 3}.one-push-button[data-v-a1d647fa]{height:100%;width:100%;padding:10px 15px;background:linear-gradient(135deg,#4169e1,#5e81f4);border:none;border-radius:8px;box-shadow:0 4px 10px #4169e140;transition:all .3s ease}.one-push-content[data-v-a1d647fa]{display:flex;align-items:center;justify-content:center;height:100%}.one-push-icon[data-v-a1d647fa]{font-size:24px;margin-right:10px}.one-push-desc[data-v-a1d647fa]{font-size:12px;opacity:.8;margin-top:4px}.pushing-text[data-v-a1d647fa]{font-size:20px;font-weight:700;text-align:center}.pushing-spinner[data-v-a1d647fa]{margin-bottom:16px}.circular[data-v-a1d647fa]{height:64px;width:64px;animation:pushing-rotate-a1d647fa 2s linear infinite}.path[data-v-a1d647fa]{stroke:#fff;stroke-width:4;stroke-linecap:round;stroke-dasharray:90,150;stroke-dashoffset:0;animation:pushing-dash-a1d647fa 1.5s ease-in-out infinite}@keyframes pushing-rotate-a1d647fa{to{transform:rotate(360deg)}}@keyframes pushing-dash-a1d647fa{0%{stroke-dasharray:1,150;stroke-dashoffset:0}50%{stroke-dasharray:90,150;stroke-dashoffset:-35}to{stroke-dasharray:90,150;stroke-dashoffset:-124}}.message-template-container[data-v-a1d647fa]{display:flex;flex-direction:column;height:calc(100vh - 278px);overflow:hidden}.templates-container[data-v-a1d647fa]{display:flex;gap:20px;margin-top:15px;flex:1;overflow:hidden}.message-templates-list[data-v-a1d647fa]{flex:3;display:flex;flex-direction:column;border-right:1px solid #ebeef5;padding-right:15px;height:calc(100vh - 432px)}.message-templates-list h3[data-v-a1d647fa]{margin-top:0;margin-bottom:15px;font-size:16px;font-weight:500;color:#303133;padding-bottom:8px;border-bottom:1px solid #ebeef5}.current-default-message[data-v-a1d647fa]{flex:2;display:flex;flex-direction:column;gap:15px;padding-left:15px}.current-default-message h3[data-v-a1d647fa]{margin-top:0;margin-bottom:15px;font-size:16px;font-weight:500;color:#303133;padding-bottom:8px;border-bottom:1px solid #ebeef5}.templates-scroll-area[data-v-a1d647fa]{overflow-y:auto;padding-right:5px;flex:1}.default-message-card[data-v-a1d647fa]{margin-bottom:15px;box-shadow:0 2px 8px #00000014;border-radius:4px;transition:all .3s ease}.default-message-card[data-v-a1d647fa]:hover{box-shadow:0 4px 12px #0000001f}.default-message-content[data-v-a1d647fa]{padding:12px 15px;background-color:#f0f9eb;border-left:3px solid #67c23a;font-weight:500;word-break:break-all;min-height:60px;display:flex;align-items:center;border-radius:0 4px 4px 0;color:#303133}.message-help-text[data-v-a1d647fa]{background-color:#f8f9fa;border-radius:4px;padding:15px;font-size:14px;color:#606266;border-left:3px solid #909399;margin-top:auto;box-shadow:0 2px 8px #0000000d}.message-help-text h4[data-v-a1d647fa]{margin-top:0;margin-bottom:10px;color:#303133;font-size:15px}.message-help-text p[data-v-a1d647fa]{margin:8px 0;line-height:1.5}.advanced-options-toggle[data-v-a1d647fa]{display:flex;align-items:center;justify-content:center;padding:8px 0;background-color:#f5f7fa;border-radius:4px;cursor:pointer;transition:all .3s ease;-webkit-user-select:none;user-select:none}.advanced-options-toggle[data-v-a1d647fa]:hover{background-color:#ebeef5;color:#409eff}.toggle-icon[data-v-a1d647fa]{margin-left:8px;transition:transform .3s ease}.toggle-icon.is-active[data-v-a1d647fa]{transform:rotate(180deg)}.advanced-fields[data-v-a1d647fa]{margin-top:10px;display:flex;flex-direction:column;gap:15px;animation:fade-in-a1d647fa .3s ease-in-out}@keyframes fade-in-a1d647fa{0%{opacity:0;transform:translateY(-10px)}to{opacity:1;transform:translateY(0)}}.merge-dialog-content[data-v-a1d647fa]{padding:0 10px}.merge-intro[data-v-a1d647fa]{margin-bottom:20px;color:#606266}.merge-options[data-v-a1d647fa]{display:flex;flex-direction:column;gap:10px}.dialog-footer[data-v-a1d647fa]{display:flex;justify-content:flex-end;gap:10px}.merge-confirm-btn[data-v-a1d647fa]{margin-left:10px}.merge-button[data-v-a1d647fa]{background-color:#409eff;border-color:#409eff}.branch-group[data-v-a1d647fa]{border-top:none}.branch-group .group-title[data-v-a1d647fa]{color:#606266;font-weight:500;margin-bottom:12px}[data-v-a1d647fa] .el-checkbox__label{white-space:normal;line-height:1.4}.stash-list-content[data-v-a1d647fa]{padding:20px 0}.stash-list-actions[data-v-a1d647fa]{margin-top:20px;display:flex;justify-content:flex-end}.stash-dialog-content p[data-v-a1d647fa]{margin-bottom:20px;color:#606266}.reset-group[data-v-a1d647fa]{border-top:none}.card-header[data-v-a1d647fa]{padding:8px 16px;border-bottom:1px solid #f0f0f0;display:flex;justify-content:space-between;align-items:center}.git-tools-button[data-v-a1d647fa]{transition:transform .3s}.git-tools-button[data-v-a1d647fa]:hover{transform:rotate(90deg)}.layout-container[data-v-a1d647fa]{display:flex;flex-direction:column;gap:15px;height:100%}.commit-section[data-v-a1d647fa]{flex:1;width:100%;min-width:0}[data-v-a1d647fa] .git-operations-drawer .el-drawer__header{margin-bottom:10px;padding:12px 16px;border-bottom:1px solid #f0f0f0;font-size:16px;font-weight:500}[data-v-a1d647fa] .git-operations-drawer .el-drawer__body{padding:10px;overflow-y:auto}.actions-section[data-v-a1d647fa]{padding:0}.center-button-container[data-v-a1d647fa]{display:flex;justify-content:space-between;align-items:center;margin-top:10px;position:relative}.button-divider[data-v-a1d647fa]{height:1px;background:linear-gradient(to right,#dcdfe600,#dcdfe6,#dcdfe600);flex:1;margin:0 15px}.one-push-button[data-v-a1d647fa]{padding:0 25px;min-width:160px;height:40px;font-weight:500;border-radius:20px;box-shadow:0 2px 6px #4169e14d;transition:all .3s;position:relative;z-index:2}.one-push-button[data-v-a1d647fa]:hover{transform:translateY(-1px);box-shadow:0 4px 8px #4169e166}.action-separator[data-v-a1d647fa]{position:relative;text-align:center;margin:12px 0;height:20px}.separator-text[data-v-a1d647fa]{background-color:#f5f7fa;padding:0 10px;font-size:12px;color:#909399;position:relative;z-index:1}.action-separator[data-v-a1d647fa]:before{content:"";position:absolute;top:50%;left:0;right:0;height:1px;background-color:#e4e7ed;z-index:0}.one-push-container[data-v-a1d647fa]{display:flex;justify-content:center}.one-push-button[data-v-a1d647fa]{width:100%;max-width:300px;height:auto;padding:10px 20px;background:linear-gradient(135deg,#4169e1,#5e81f4);border:none;border-radius:8px;box-shadow:0 4px 10px #4169e140;transition:all .3s ease}.one-push-button[data-v-a1d647fa]:hover{transform:translateY(-2px);box-shadow:0 6px 12px #4169e159;background:linear-gradient(135deg,#3a5ecc,#4b6edf)}.one-push-button[data-v-a1d647fa]:active{transform:translateY(0);box-shadow:0 2px 6px #4169e133}.one-push-content[data-v-a1d647fa]{display:flex;align-items:center;justify-content:center}.one-push-icon[data-v-a1d647fa]{font-size:20px;margin-right:10px}.one-push-text[data-v-a1d647fa]{display:flex;flex-direction:column;align-items:flex-start;text-align:left}.one-push-title[data-v-a1d647fa]{font-size:16px;font-weight:500;line-height:1.2}.one-push-desc[data-v-a1d647fa]{font-size:12px;opacity:.8;margin-top:2px}.button-row[data-v-a1d647fa]{display:flex;justify-content:space-between;gap:10px;width:100%}.button-row .el-button[data-v-a1d647fa]{flex:1;min-width:100px}.center-button-container[data-v-a1d647fa],.button-divider[data-v-a1d647fa]{display:none}.git-cmd-tooltip{font-family:Consolas,Courier New,monospace!important;font-size:13px!important;font-weight:500!important;color:#303133!important;background-color:#f5f7fa!important;border:1px solid #dcdfe6!important;border-radius:4px!important;padding:8px 12px!important;box-shadow:0 2px 12px #0000001a!important}.template-dialog .el-dialog__header,.message-template-dialog .el-dialog__header,.merge-dialog .el-dialog__header{padding:15px 20px;margin-right:0;border-bottom:1px solid #ebeef5;background-color:#f8f9fa}.template-dialog .el-dialog__title,.message-template-dialog .el-dialog__title,.merge-dialog .el-dialog__title{font-size:16px;font-weight:600;color:#303133}.template-dialog .el-dialog__body,.message-template-dialog .el-dialog__body,.merge-dialog .el-dialog__body{padding:20px}.merge-dialog .el-dialog__footer{padding:15px 20px;border-top:1px solid #f0f0f0}.template-dialog .el-dialog__headerbtn,.message-template-dialog .el-dialog__headerbtn,.merge-dialog .el-dialog__headerbtn{top:15px;right:20px}.template-dialog .el-input__inner,.message-template-dialog .el-input__inner,.merge-dialog .el-input__inner{height:40px;line-height:40px}.template-dialog .el-button,.message-template-dialog .el-button{border-radius:4px;font-weight:500}.template-dialog .el-card,.message-template-dialog .el-card{border-radius:4px;overflow:hidden}.template-dialog .el-card__body,.message-template-dialog .el-card__body{padding:12px 15px}.template-dialog .el-empty__image,.message-template-dialog .el-empty__image{width:80px;height:80px}.card[data-v-f12ff603]{background-color:#fff;border-radius:8px;box-shadow:0 2px 12px #0000001a;margin-bottom:20px;display:flex;flex-direction:column;height:100%;overflow:hidden;position:relative}.log-header[data-v-f12ff603]{display:flex;justify-content:space-between;align-items:center;padding:16px;margin-bottom:16px;border-bottom:1px solid #ebeef5;position:sticky;top:0;background-color:#fff;z-index:100}.fullscreen-mode .log-header[data-v-f12ff603]{margin-bottom:10px;box-shadow:0 2px 8px #0000000d}.header-left[data-v-f12ff603]{display:flex;align-items:center;gap:16px}.header-left h2[data-v-f12ff603]{margin:0;font-size:20px;font-weight:600;color:#303133}.log-actions[data-v-f12ff603]{display:flex;align-items:center;gap:12px}.action-button[data-v-f12ff603]{transition:all .3s ease;border-radius:8px;border:1px solid transparent;box-shadow:0 2px 4px #0000001a;font-weight:500;padding:8px 16px;display:flex;align-items:center;justify-content:center;gap:8px}.action-button[data-v-f12ff603]:hover{transform:translateY(-2px);box-shadow:0 4px 8px #00000026}.filter-button[data-v-f12ff603]{background:linear-gradient(135deg,#e6a23c,#f0c78a);color:#fff;min-width:90px}.filter-button.active-filter[data-v-f12ff603]{background:linear-gradient(135deg,#d48806,#e6a23c)}.filter-button .filter-badge[data-v-f12ff603] .el-badge__content{background-color:#f56c6c;color:#fff;border:2px solid white;box-shadow:0 0 0 1px #e6a23c}.view-mode-button[data-v-f12ff603]{background:linear-gradient(135deg,#409eff,#53a8ff);color:#fff}.view-mode-button.active-view[data-v-f12ff603]{background:linear-gradient(135deg,#1890ff,#096dd9)}.commit-display-button[data-v-f12ff603]{background:linear-gradient(135deg,#67c23a,#85ce61);color:#fff}.commit-display-button.active-commits[data-v-f12ff603]{background:linear-gradient(135deg,#52c41a,#389e0d)}.refresh-button[data-v-f12ff603]{background:linear-gradient(135deg,#909399,#c0c4cc);color:#fff;min-width:unset;padding:8px;border-radius:50%;width:36px;height:36px}.refresh-button[data-v-f12ff603]:hover{background:linear-gradient(135deg,#606266,#909399)}.refresh-button-animated[data-v-f12ff603]{animation:spin-f12ff603 1s linear}@keyframes spin-f12ff603{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.content-area[data-v-f12ff603]{padding:10px 16px;flex:1;min-height:100px;height:calc(100% - 52px);display:flex;flex-direction:column;overflow:auto}.content-area-content[data-v-f12ff603]{height:100%;display:flex;flex-direction:column}.content-area.with-filter[data-v-f12ff603]{height:calc(100% - 112px);padding-top:0}.content-area>div[data-v-f12ff603]{flex:1;display:flex;flex-direction:column}.el-table[data-v-f12ff603]{--el-table-border-color: #f0f0f0;--el-table-header-bg-color: #f8f9fa;border-radius:8px;overflow:hidden}[data-v-f12ff603] .el-table__header-wrapper{background-color:#f8f9fa}[data-v-f12ff603] .el-table__header th{background-color:#f8f9fa;color:#606266;font-weight:600;height:48px}[data-v-f12ff603] .el-table__row{transition:all .2s ease}[data-v-f12ff603] .el-table__row:hover{background-color:#ecf5ff!important}[data-v-f12ff603] .el-table--striped .el-table__row--striped{background-color:#fafafa}[data-v-f12ff603] .el-table__cell{padding:8px 0}.branch-container[data-v-f12ff603]{display:flex;flex-wrap:wrap;gap:6px}.branch-tag[data-v-f12ff603]{margin-right:0;border-radius:4px;transition:all .2s ease}.branch-tag[data-v-f12ff603]:hover{transform:translateY(-1px);box-shadow:0 2px 4px #0000001a}.commit-count[data-v-f12ff603]{margin-bottom:12px;font-size:14px;color:#606266;text-align:right}.graph-view[data-v-f12ff603]{width:100%;flex:1;display:flex;flex-direction:column;overflow-y:auto;padding:0 8px}.graph-container[data-v-f12ff603]{width:100%;flex:1;min-height:500px;border:1px solid #ebeef5;border-radius:8px;padding:16px;background-color:#fff;position:relative;box-shadow:0 2px 8px #00000008}.graph-container svg[data-v-f12ff603]{transform-origin:top left;transition:transform .2s ease}.graph-controls[data-v-f12ff603]{display:flex;justify-content:space-between;align-items:center;margin-bottom:16px;background-color:#f8f9fa;padding:12px;border-radius:8px;border:1px solid #ebeef5}.zoom-controls[data-v-f12ff603]{display:flex;gap:12px;align-items:center}.zoom-slider[data-v-f12ff603]{width:200px}.scale-info[data-v-f12ff603]{font-size:14px;color:#606266;background-color:#fff;padding:4px 10px;border-radius:4px;border:1px solid #ebeef5}.refresh-notification[data-v-f12ff603]{background-color:#f0f9eb;color:#67c23a;padding:10px 15px;border-radius:8px;font-size:14px;border-left:4px solid #67c23a;animation:fadeOut-f12ff603 2s forwards;position:fixed;top:20px;right:20px;z-index:9999;box-shadow:0 4px 12px #0000001a;max-width:300px;text-align:center}@keyframes fadeOut-f12ff603{0%{opacity:0;transform:translateY(-20px)}20%{opacity:1;transform:translateY(0)}80%{opacity:1}to{opacity:0}}.author-name[data-v-f12ff603]{cursor:pointer;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:inline-block;max-width:100%;font-weight:500}.commit-hash[data-v-f12ff603]{cursor:pointer;color:#409eff;font-family:JetBrains Mono,Fira Code,Consolas,monospace;font-weight:500;border-radius:4px;padding:2px 4px;background-color:#ecf5ff;transition:all .2s ease}.commit-hash[data-v-f12ff603]:hover{text-decoration:none;background-color:#d9ecff;box-shadow:0 2px 4px #0000000d}.commit-detail-container[data-v-f12ff603]{display:flex;flex-direction:column;gap:20px}.commit-info[data-v-f12ff603]{padding:16px;background-color:#f5f7fa;border-radius:8px;font-size:14px;display:flex;flex-direction:column;gap:16px}.commit-info-header[data-v-f12ff603]{display:flex;flex-wrap:wrap;gap:16px;align-items:center;background-color:#fff;padding:16px;border-radius:8px;border:1px solid #e4e7ed}.info-item[data-v-f12ff603]{display:flex;align-items:center;gap:8px}.item-label[data-v-f12ff603]{font-weight:700;color:#606266;white-space:nowrap}.item-value[data-v-f12ff603]{color:#333;word-break:break-all}.commit-message-container[data-v-f12ff603]{display:flex;flex-direction:column;gap:8px}.message-label[data-v-f12ff603]{font-weight:700;color:#606266}.message-content[data-v-f12ff603]{background-color:#fff;padding:16px;border-radius:8px;font-family:JetBrains Mono,Fira Code,Consolas,monospace;white-space:pre-wrap;line-height:1.6;border:1px solid #e4e7ed;border-left:4px solid #409eff}.commit-files-diff[data-v-f12ff603]{margin-top:8px;display:flex;gap:20px;height:60vh}.files-list[data-v-f12ff603]{width:25%;overflow-y:auto;background-color:#f5f7fa;border-radius:8px;padding:16px}.files-list h3[data-v-f12ff603]{margin-top:0;padding-bottom:12px;border-bottom:1px solid #dcdfe6;font-size:16px;font-weight:500}.files-list ul[data-v-f12ff603]{list-style:none;padding:0;margin:0}.files-list li[data-v-f12ff603]{padding:10px 12px;cursor:pointer;border-radius:4px;margin-bottom:6px;font-family:JetBrains Mono,Fira Code,Consolas,monospace;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:13px;transition:all .2s ease;border:1px solid transparent}.files-list li[data-v-f12ff603]:hover{background-color:#ecf5ff;border-color:#d9ecff}.files-list li.active-file[data-v-f12ff603]{background-color:#409eff;color:#fff;box-shadow:0 2px 6px #409eff4d}.file-diff[data-v-f12ff603]{flex:1;display:flex;flex-direction:column;background-color:#f5f7fa;border-radius:8px;padding:16px;overflow:hidden}.file-diff h3[data-v-f12ff603]{margin-top:0;padding-bottom:12px;border-bottom:1px solid #dcdfe6;font-size:16px;font-weight:500}.diff-content[data-v-f12ff603]{flex:1;overflow-y:auto;background-color:#fff;padding:16px;border-radius:8px;font-family:JetBrains Mono,Fira Code,Consolas,monospace;font-size:13px;line-height:1.6;border:1px solid #ebeef5}.diff-content[data-v-f12ff603]::-webkit-scrollbar,.files-list[data-v-f12ff603]::-webkit-scrollbar{width:6px;height:6px}.diff-content[data-v-f12ff603]::-webkit-scrollbar-thumb,.files-list[data-v-f12ff603]::-webkit-scrollbar-thumb{background-color:#9093994d;border-radius:4px}.diff-content[data-v-f12ff603]::-webkit-scrollbar-thumb:hover,.files-list[data-v-f12ff603]::-webkit-scrollbar-thumb:hover{background-color:#90939980}.diff-content[data-v-f12ff603]::-webkit-scrollbar-track,.files-list[data-v-f12ff603]::-webkit-scrollbar-track{background-color:transparent}.diff-content[data-v-f12ff603],.files-list[data-v-f12ff603]{scrollbar-width:thin;scrollbar-color:rgba(144,147,153,.3) transparent}[data-v-f12ff603] .commit-detail-dialog{--el-dialog-margin-top: 7vh}[data-v-f12ff603] .commit-detail-dialog .el-dialog__body{padding:16px}.filter-panel-header[data-v-f12ff603]{background-color:#f5f7fa;padding:16px;margin-bottom:16px;border-radius:8px;box-shadow:0 2px 12px #0000000d;transition:all .3s ease;width:100%;position:sticky;top:36px;z-index:99}.fullscreen-mode .filter-panel-header[data-v-f12ff603]{position:sticky;top:60px;z-index:9;background-color:#fff;width:100%;border-radius:0;border-bottom:1px solid #ebeef5;box-shadow:0 2px 8px #0000000d}.filter-form[data-v-f12ff603]{display:flex;flex-wrap:wrap;gap:12px;align-items:center;justify-content:space-between}.filter-item[data-v-f12ff603]{flex:1;min-width:200px}.filter-actions[data-v-f12ff603]{display:flex;align-items:center;gap:10px;white-space:nowrap;flex-shrink:0}.filter-input[data-v-f12ff603]{width:100%}.filter-input.date-range[data-v-f12ff603]{width:100%;max-width:280px}.compact-label[data-v-f12ff603]{color:#909399;font-size:12px;margin-right:6px;white-space:nowrap;font-weight:700;border-right:1px solid #dcdfe6;padding-right:8px}.filter-action-button[data-v-f12ff603]{padding:8px 16px;border-radius:6px;transition:all .3s;min-width:70px;font-weight:500}.filter-action-button[data-v-f12ff603]:hover{transform:translateY(-2px);box-shadow:0 2px 8px #0000001a}.table-view-container[data-v-f12ff603]{height:100%;display:flex;flex-direction:column;flex:1}.log-table[data-v-f12ff603]{flex:1;width:100%}.fullscreen-mode .table-view-container[data-v-f12ff603]{height:calc(100vh - 160px)}.fullscreen-mode .log-table[data-v-f12ff603]{height:100%}.load-more-container[data-v-f12ff603]{display:flex;flex-direction:column;align-items:center;padding:8px 0;border-top:1px dashed #ebeef5;gap:8px}.pagination-info[data-v-f12ff603]{font-size:13px;color:#909399;margin-bottom:4px}.loading-more[data-v-f12ff603]{display:flex;align-items:center;color:#909399;font-size:13px;gap:8px}.loading-spinner[data-v-f12ff603]{width:16px;height:16px;border:2px solid #dcdfe6;border-top-color:#409eff;border-radius:50%;animation:spinner-f12ff603 1s linear infinite}@keyframes spinner-f12ff603{to{transform:rotate(360deg)}}.load-more-button[data-v-f12ff603]{cursor:pointer;color:#409eff;font-size:13px;padding:6px 16px;border:1px solid #d9ecff;background-color:#ecf5ff;border-radius:4px;transition:all .3s;font-weight:500}.no-more-data[data-v-f12ff603]{color:#909399;font-size:13px;font-style:italic;display:flex;flex-direction:column;align-items:center}.total-loaded[data-v-f12ff603]{font-size:12px;margin-top:4px;color:#c0c4cc}@keyframes fadeIn-f12ff603{0%{opacity:0;transform:translateY(5px)}to{opacity:1;transform:translateY(0)}}.context-menu-item[data-v-f12ff603]{padding:10px 16px;cursor:pointer;font-size:14px;display:flex;align-items:center;transition:all .2s ease;color:#606266}.context-menu-item[data-v-f12ff603]:hover{background-color:#f5f7fa;color:#409eff}.context-menu-item i[data-v-f12ff603]{margin-right:10px;font-size:16px}.branch-graph-column[data-v-f12ff603]{padding:0!important;overflow:visible}.branch-graph-cell[data-v-f12ff603]{height:40px;width:100%;position:relative;padding:0;margin:0}.branch-graph-column .cell[data-v-f12ff603]{padding:0!important;height:100%;margin:0;overflow:visible}.el-table .branch-graph-column[data-v-f12ff603]{width:60px!important;padding:0!important}[data-v-f12ff603] .el-table .el-table__cell{padding:0!important}[data-v-f12ff603] .branch-graph-cell svg{display:block!important;width:100%!important;height:100%!important;overflow:visible!important;z-index:10!important}[data-v-f12ff603] .branch-graph-cell svg line,[data-v-f12ff603] .branch-graph-cell svg path{stroke-width:2!important}[data-v-f12ff603] .branch-graph-cell svg circle{r:6!important;stroke-width:2!important}.branch-graph-column[data-v-f12ff603]{min-width:60px!important;width:60px!important}.branch-graph-cell[data-v-f12ff603]{position:relative!important;overflow:visible!important;z-index:1!important}[data-v-f12ff603] .el-table--border .el-table__inner-wrapper tr{border:none!important}[data-v-f12ff603] .el-table--border .el-table__inner-wrapper td{border-right:none!important;border-bottom:none!important}[data-v-f12ff603] .el-table--border .el-table__inner-wrapper th{border-right:none!important}[data-v-f12ff603] .el-table--border,[data-v-f12ff603] .el-table--border .el-table__inner-wrapper{border:none!important}[data-v-f12ff603] .el-table--border:after,[data-v-f12ff603] .el-table--border:before,[data-v-f12ff603] .el-table__inner-wrapper:after,[data-v-f12ff603] .el-table__inner-wrapper:before{display:none!important}[data-v-f12ff603] .el-table tr{background-color:transparent!important}[data-v-f12ff603] .el-table--striped .el-table__body tr.el-table__row--striped td{background-color:#00000005!important}.fullscreen-mode[data-v-f12ff603]{position:fixed;top:0;left:0;width:100vw;height:100vh;z-index:9999;margin:0;border-radius:0;border:none;box-shadow:none;background-color:#fff;display:flex;flex-direction:column;padding:16px;overflow:auto}.fullscreen-mode .log-header[data-v-f12ff603]{position:sticky;top:0;z-index:10;background-color:#fff;padding:16px;margin-bottom:10px;width:100%}.fullscreen-mode .filter-panel-header[data-v-f12ff603]{position:sticky;top:60px;z-index:9;background-color:#fff;width:100%}.fullscreen-mode .content-area[data-v-f12ff603]{height:100vh;max-height:none;flex:1;overflow:auto}.fullscreen-mode .el-table[data-v-f12ff603]{height:calc(100vh - 60px)}.fullscreen-mode .graph-view[data-v-f12ff603]{height:calc(100vh - 140px)}.fullscreen-button[data-v-f12ff603]{background:linear-gradient(135deg,#909399,#c0c4cc);color:#fff}.fullscreen-button.active-fullscreen[data-v-f12ff603]{background:linear-gradient(135deg,#606266,#909399)}.context-menu[data-v-f12ff603]{position:fixed;background:#fff;border:1px solid #dcdfe6;border-radius:8px;box-shadow:0 4px 16px #0000001a;padding:6px 0;z-index:3000;min-width:200px;animation:fadeIn-f12ff603 .15s ease-out}.fullscreen-context-menu[data-v-f12ff603]{z-index:999999}.icon-only-button[data-v-f12ff603]{min-width:unset;width:36px;height:36px;padding:8px;border-radius:8px;display:flex;align-items:center;justify-content:center}.icon-only-button .el-icon[data-v-f12ff603]{margin-right:0}.el-table .el-table__cell .cell{word-break:break-all}.diff-header{font-weight:700;background-color:#e6f1fc;padding:10px 16px;margin:12px 0;border-radius:6px;color:#0366d6;border-bottom:1px solid #c8e1ff}.diff-old-file,.diff-new-file{color:#586069;padding:4px 8px;font-family:JetBrains Mono,Fira Code,Consolas,monospace}.diff-old-file{color:#cb2431}.diff-new-file{color:#22863a}.diff-hunk-header{color:#6f42c1;background-color:#f1f8ff;padding:4px 8px;margin:8px 0;border-radius:4px;font-family:JetBrains Mono,Fira Code,Consolas,monospace}.diff-added{background-color:#e6ffed;color:#22863a;padding:2px 8px;border-left:4px solid #22863a;font-family:JetBrains Mono,Fira Code,Consolas,monospace;display:block;margin:2px 0}.diff-removed{background-color:#ffeef0;color:#cb2431;padding:2px 8px;border-left:4px solid #cb2431;font-family:JetBrains Mono,Fira Code,Consolas,monospace;display:block;margin:2px 0}.diff-context{color:#444;padding:2px 8px;font-family:JetBrains Mono,Fira Code,Consolas,monospace;display:block;margin:2px 0;background-color:#fafbfc}.load-more-button:hover{background-color:#d9ecff;box-shadow:0 2px 6px #409eff26;transform:translateY(-1px)}body{font-family:Arial,sans-serif;margin:0;padding:0;background-color:#f5f5f5;overflow:hidden;height:100vh}.main-container{position:fixed;top:60px;bottom:60px;left:0;right:0;padding:10px;overflow:hidden;z-index:1001}.grid-layout{display:grid;grid-template-columns:2fr 4px 3fr;grid-template-rows:1fr 4px 1fr;grid-template-areas:"git-status v-resizer commit-form" "h-resizer h-resizer h-resizer" "log-list log-list log-list";gap:6px;height:100%}.git-status-panel{grid-area:git-status;overflow:hidden;max-height:100%;padding:0}.commit-form-panel{grid-area:commit-form;overflow:hidden;max-height:100%;padding:0}.log-list-panel{grid-area:log-list;overflow:hidden;max-height:100%;padding:0}.card{background-color:#fff;border-radius:8px;box-shadow:0 4px 12px #0000000d;border:1px solid rgba(0,0,0,.03);height:100%;overflow:hidden;display:flex;flex-direction:column}.main-header{background-color:#24292e;color:#fff;padding:0 20px;display:flex;justify-content:space-between;align-items:center;position:fixed;top:0;left:0;right:0;z-index:1000;box-shadow:0 2px 10px #0003;height:60px;box-sizing:border-box}.header-left{display:flex;align-items:center;gap:10px;min-width:220px;flex:1}.logo{height:32px;width:auto}h1{margin:0;font-size:24px}.header-info{display:flex;align-items:center;gap:10px;justify-content:flex-end}#user-info{display:flex;align-items:center;background-color:#282c34b3;padding:6px 10px;border-radius:4px;border:1px solid rgba(255,255,255,.15);margin-right:10px;flex-shrink:0}.directory-selector{display:flex;flex-direction:row;justify-content:space-between;align-items:center;background-color:#282c34b3;border-radius:4px;padding:6px 10px;border:1px solid rgba(255,255,255,.15);box-shadow:0 2px 8px #00000026;flex-shrink:0}.directory-display{display:flex;align-items:center;gap:8px;flex:1;min-width:0}.directory-path{font-family:monospace;color:#fff;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:14px;font-weight:500;background-color:#0003;padding:4px 8px;border-radius:3px;border-left:3px solid #409EFF;flex:1;min-width:0;max-width:500px}.branch-label,.user-label,.user-name{font-weight:700;margin-right:5px}.user-email{color:#e0e0e0}.branch-name{font-family:monospace}.status-box{background-color:#f6f8fa;border:1px solid #e1e4e8;border-radius:3px;padding:15px;white-space:pre-wrap;font-family:monospace;overflow-y:auto}.tips{margin-top:20px;padding:15px;background-color:#f5f7fa;border-radius:5px;border-left:4px solid #409eff}.tips h3{margin-top:0;font-size:16px;margin-bottom:10px}.code-block{background-color:#2d2d2d;color:#f8f8f2;font-family:monospace;padding:10px 15px;border-radius:4px;margin-bottom:10px}.loading-container{display:flex;justify-content:center;align-items:center;height:100%}.loading-card{width:300px;text-align:center;padding:30px}.loading-spinner{font-size:48px;margin-bottom:20px;color:#409eff}.loading-text{font-size:18px;color:#606266}.user-settings-btn{margin-left:10px}.user-warning{color:#e6a23c;font-weight:700}.main-footer{background-color:#24292e;color:#fff;padding:10px 20px;display:flex;justify-content:space-between;align-items:center;position:fixed;bottom:0;left:0;right:0;z-index:100;box-shadow:0 -2px 10px #0000001a;height:60px;box-sizing:border-box}@media (max-width: 768px){.grid-layout{grid-template-columns:1fr;grid-template-rows:auto auto auto auto auto;grid-template-areas:"git-status" "v-resizer" "commit-form" "h-resizer" "log-list";gap:10px}.vertical-resizer{height:10px;cursor:row-resize}.vertical-resizer:after{width:30px;height:4px}.git-status-panel,.commit-form-panel,.log-list-panel{padding:0;max-height:none}.git-status-panel,.commit-form-panel{max-height:30vh}.log-list-panel{max-height:40vh}}.logo[data-v-f48609ab]{will-change:filter;transition:filter .3s}.logo[data-v-f48609ab]:hover{filter:drop-shadow(0 0 2em #42b883aa)}.branch-info[data-v-f48609ab]{display:flex;align-items:center;gap:10px}.branch-wrapper[data-v-f48609ab]{display:flex;align-items:center;background-color:#ffffff26;border-radius:4px;padding:8px 12px;box-shadow:0 2px 4px #0003;transition:all .3s}.branch-wrapper[data-v-f48609ab]:hover{background-color:#fff3}.branch-label[data-v-f48609ab]{font-weight:700;margin-right:10px;color:#fff}.branch-select[data-v-f48609ab]{width:200px;margin-right:10px}.create-branch-btn[data-v-f48609ab]{background-color:#2ea44f;border-color:#2ea44f;transition:all .3s;box-shadow:0 2px 4px #0003}.create-branch-btn[data-v-f48609ab]:hover{background-color:#3bbc63;border-color:#3bbc63;transform:translateY(-2px);box-shadow:0 4px 8px #0003}.footer-right[data-v-f48609ab]{display:flex;align-items:center;gap:10px;color:#ffffffe6;font-size:13px;background-color:#ffffff1a;padding:8px 12px;border-radius:4px;box-shadow:0 2px 4px #0003}.repo-url-label[data-v-f48609ab]{font-weight:700;margin-right:8px;color:#fff}.repo-url[data-v-f48609ab]{color:#e6f7ff;font-family:monospace;max-width:300px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.copy-url-btn[data-v-f48609ab]{transition:all .3s;background-color:#1890ff;border-color:#1890ff;box-shadow:0 2px 4px #0003}.copy-url-btn[data-v-f48609ab]:hover{background-color:#40a9ff;border-color:#40a9ff;transform:translateY(-2px);box-shadow:0 4px 8px #0003}.vertical-resizer[data-v-f48609ab]{grid-area:v-resizer;background-color:#e8e8e8;cursor:col-resize;transition:background-color .2s,box-shadow .2s;position:relative;z-index:10;border-radius:4px;box-shadow:0 0 2px #0000001a}.vertical-resizer[data-v-f48609ab]:after{content:"";position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:2px;height:40px;background-color:#a0a0a0;border-radius:2px;transition:background-color .2s,width .2s,box-shadow .2s}.vertical-resizer[data-v-f48609ab]:hover,.vertical-resizer.active[data-v-f48609ab]{background-color:#d0d0d0;box-shadow:0 0 4px #0003}.vertical-resizer[data-v-f48609ab]:hover:after,.vertical-resizer.active[data-v-f48609ab]:after{background-color:#409eff;width:3px;box-shadow:0 0 6px #409eff99}.horizontal-resizer[data-v-f48609ab]{grid-area:h-resizer;background-color:#e8e8e8;cursor:row-resize;transition:background-color .2s,box-shadow .2s;position:relative;z-index:10;border-radius:4px;box-shadow:0 0 2px #0000001a}.horizontal-resizer[data-v-f48609ab]:after{content:"";position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:40px;height:2px;background-color:#a0a0a0;border-radius:2px;transition:background-color .2s,height .2s,box-shadow .2s}.horizontal-resizer[data-v-f48609ab]:hover,.horizontal-resizer.active[data-v-f48609ab]{background-color:#d0d0d0;box-shadow:0 0 4px #0003}.horizontal-resizer[data-v-f48609ab]:hover:after,.horizontal-resizer.active[data-v-f48609ab]:after{background-color:#409eff;height:3px;box-shadow:0 0 6px #409eff99}.directory-selector[data-v-f48609ab]{display:flex;flex-direction:row;justify-content:space-between;align-items:center;background-color:#282c34b3;border-radius:4px;padding:8px 12px;margin-bottom:8px;border:1px solid rgba(255,255,255,.2);box-shadow:0 2px 8px #0003}.directory-display[data-v-f48609ab]{display:flex;align-items:center;gap:8px;flex:1;min-width:0}.directory-path[data-v-f48609ab]{font-family:monospace;color:#fff;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:14px;font-weight:500;background-color:#0003;padding:4px 8px;border-radius:3px;border-left:3px solid #409EFF;flex:1;min-width:0;max-width:350px}.directory-actions[data-v-f48609ab]{display:flex;gap:4px;margin-left:8px}.dir-button[data-v-f48609ab]{padding:6px;height:28px;width:28px;border-radius:50%;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg,#409eff,#53a8ff);color:#fff;border:none;box-shadow:0 2px 4px #0003;transition:all .3s}.dir-button[data-v-f48609ab]:hover{transform:translateY(-1px);box-shadow:0 3px 6px #0000004d;background:linear-gradient(135deg,#53a8ff,#66b1ff)}.dir-button.el-button--info[data-v-f48609ab]{background:linear-gradient(135deg,#909399,#a6a9ad)}.dir-button.el-button--info[data-v-f48609ab]:hover{background:linear-gradient(135deg,#a6a9ad,#c0c4cc)}.directory-icon[data-v-f48609ab]{display:flex;justify-content:center;align-items:center;width:24px;height:24px;border-radius:3px;background-color:#409eff1a;color:#409eff;margin-right:2px}.directory-input-group[data-v-f48609ab]{display:flex;align-items:center;gap:8px;width:100%}.recent-directories[data-v-f48609ab]{display:flex;flex-wrap:wrap;gap:4px}.recent-dir-tag[data-v-f48609ab]{cursor:pointer;background-color:#e6f7ff;border:1px solid #91d5ff;padding:4px 8px;border-radius:4px}.directory-browser[data-v-f48609ab]{width:100%;height:400px;overflow:auto}.current-path[data-v-f48609ab]{padding:10px;background-color:#f5f7fa;border-radius:4px;margin-bottom:10px;border:1px solid #e4e7ed;display:flex;align-items:center;width:100%;box-sizing:border-box}.path-label[data-v-f48609ab]{font-weight:700;margin-right:5px;white-space:nowrap;flex-shrink:0}.path-value[data-v-f48609ab]{font-family:monospace;word-break:break-all;flex:1;min-width:0;background-color:#fff;padding:5px 8px;border-radius:3px;border:1px solid #dcdfe6;box-shadow:inset 0 1px 2px #0000000d;width:100%}.directory-list[data-v-f48609ab]{list-style:none!important;padding:0;margin:0;border:1px solid #e4e7ed;border-radius:4px;max-height:300px;overflow-y:auto;background-color:#fff;display:flex;flex-direction:column;width:100%;box-sizing:border-box}.directory-item[data-v-f48609ab]{padding:10px 12px;border-bottom:1px solid #ebeef5;cursor:pointer;display:flex;align-items:center;transition:all .2s ease;position:relative;width:100%;box-sizing:border-box;list-style:none!important}.directory-item[data-v-f48609ab]:hover{background-color:#ecf5ff}.directory-item[data-v-f48609ab]:last-child{border-bottom:none}.parent-dir[data-v-f48609ab]{background-color:#f5f7fa;font-weight:500}.dir-icon[data-v-f48609ab]{margin-right:12px;display:flex;align-items:center;justify-content:center;width:24px;height:24px;flex-shrink:0}.dir-name[data-v-f48609ab]{display:flex;align-items:center;font-size:14px;line-height:1.4}.folder-icon[data-v-f48609ab]{filter:drop-shadow(0 1px 2px rgba(0,0,0,.1));transition:all .2s ease}.directory-item:hover .folder-icon[data-v-f48609ab]{transform:scale(1.1)}[data-v-f48609ab] .directory-browser-dialog{border-radius:8px;overflow:hidden}[data-v-f48609ab] .directory-browser-dialog .el-message-box__header{background-color:#f5f7fa;padding:15px 20px;border-bottom:1px solid #e4e7ed;position:relative}[data-v-f48609ab] .directory-browser-dialog .el-message-box__title{color:#409eff;font-weight:500;font-size:18px}[data-v-f48609ab] .directory-browser-dialog .el-message-box__headerbtn{position:absolute;top:15px;right:15px;width:24px;height:24px;border-radius:50%;background-color:#0000000d;transition:all .3s;display:flex;align-items:center;justify-content:center}[data-v-f48609ab] .directory-browser-dialog .el-message-box__headerbtn:hover{background-color:#0000001a;transform:rotate(90deg)}[data-v-f48609ab] .directory-browser-dialog .el-message-box__headerbtn .el-message-box__close{color:#606266;font-weight:700;font-size:16px}[data-v-f48609ab] .directory-browser-dialog .el-message-box__headerbtn:hover .el-message-box__close{color:#409eff}[data-v-f48609ab] .directory-browser-dialog .el-message-box__content{padding:20px}.el-message-box__message{width:100%}.directory-browser-dialog{border-radius:8px;overflow:hidden}.directory-browser-dialog .el-message-box__header{background-color:#f5f7fa;padding:15px 20px;border-bottom:1px solid #e4e7ed;position:relative}.directory-browser-dialog .el-message-box__title{color:#409eff;font-weight:500;font-size:18px}.directory-browser-dialog .el-message-box__headerbtn{position:absolute;top:15px;right:15px;width:24px;height:24px;border-radius:50%;background-color:#0000000d;transition:all .3s;display:flex;align-items:center;justify-content:center}.directory-browser-dialog .el-message-box__headerbtn:hover{background-color:#0000001a;transform:rotate(90deg)}.directory-browser-dialog .el-message-box__headerbtn .el-message-box__close{color:#606266;font-weight:700;font-size:16px}.directory-browser-dialog .el-message-box__headerbtn:hover .el-message-box__close{color:#409eff}.directory-browser-dialog .el-message-box__content{padding:20px}.directory-browser-dialog .el-message-box__btns{padding:10px 20px 15px;border-top:1px solid #e4e7ed}.directory-browser{width:100%;height:400px;overflow:auto}.current-path{padding:10px;background-color:#f5f7fa;border-radius:4px;margin-bottom:10px;border:1px solid #e4e7ed;display:flex;align-items:center;width:100%;box-sizing:border-box}.path-label{font-weight:700;margin-right:5px;white-space:nowrap;flex-shrink:0}.path-value{font-family:monospace;word-break:break-all;flex:1;min-width:0;background-color:#fff;padding:5px 8px;border-radius:3px;border:1px solid #dcdfe6;box-shadow:inset 0 1px 2px #0000000d;width:100%}.directory-list{list-style:none!important;padding:0;margin:0;border:1px solid #e4e7ed;border-radius:4px;max-height:300px;overflow-y:auto;background-color:#fff;display:flex;flex-direction:column;width:100%;box-sizing:border-box}.directory-item{padding:10px 12px;border-bottom:1px solid #ebeef5;cursor:pointer;display:flex;align-items:center;transition:all .2s ease;position:relative;width:100%;box-sizing:border-box;list-style:none!important}.directory-item:hover{background-color:#ecf5ff}.directory-item:last-child{border-bottom:none}.parent-dir{background-color:#f5f7fa;font-weight:500}.dir-icon{margin-right:12px;display:flex;align-items:center;justify-content:center;width:24px;height:24px;flex-shrink:0}.dir-name{display:flex;align-items:center;font-size:14px;line-height:1.4}.folder-icon{filter:drop-shadow(0 1px 2px rgba(0,0,0,.1));transition:all .2s ease}.directory-item:hover .folder-icon{transform:scale(1.1)}*{margin:0;padding:0}div{box-sizing:border-box}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import{d as fs,r,o as Lt,a as As,E as o,l as Ms,b as jt,c as ze,w as nt,e as $,f as m,F as De,g as e,h as s,i as it,j as ts,u as l,k as a,m as ps,n as es,p as vs,q as He,s as ms,t as gs,v as zt,x as Ds,y as ss,z as J,A as oe,B as Ut,C as h,D as Ot,G as Rs,H as D,I as hs,J as Ue,K as ys,L as Pt,M as zs,N as us,O as kt,P as Fe,Q as as,R as st,S as Es,T as cs,U as ws,V as ls,W as xt,X as Tt,Y as Wt,Z as qt,_ as Et,$ as Gt,a0 as Dt,a1 as Gs,a2 as js,a3 as Us,a4 as _s,a5 as bs,a6 as Os,a7 as $s,a8 as Cs,a9 as Ps,aa as Fs,ab as Ns,ac as ks,ad as yt,ae as tt,af as Is,ag as Hs,ah as Yt,ai as Xs,aj as Js,ak as Ws,al as qs,am as Ys,an as Ks,ao as Zs,ap as Qs,aq as ea,ar as ta,as as ds,at as sa,au as je,av as aa,aw as la}from"./vendor-0cEbNeyt.js";(function(){const u=document.createElement("link").relList;if(u&&u.supports&&u.supports("modulepreload"))return;for(const g of document.querySelectorAll('link[rel="modulepreload"]'))v(g);new MutationObserver(g=>{for(const I of g)if(I.type==="childList")for(const L of I.addedNodes)L.tagName==="LINK"&&L.rel==="modulepreload"&&v(L)}).observe(document,{childList:!0,subtree:!0});function V(g){const I={};return g.integrity&&(I.integrity=g.integrity),g.referrerPolicy&&(I.referrerPolicy=g.referrerPolicy),g.crossOrigin==="use-credentials"?I.credentials="include":g.crossOrigin==="anonymous"?I.credentials="omit":I.credentials="same-origin",I}function v(g){if(g.ep)return;g.ep=!0;const I=V(g);fetch(g.href,I)}})();const Kt={},Zt=300;function oa(){try{const ve=Kt.resolve(process.cwd(),"../../../.port");if(Kt.existsSync(ve)){const u=Kt.readFileSync(ve,"utf8").trim();return console.log(`检测到后端服务器端口: ${u}`),parseInt(u,10)}}catch(ve){console.error("读取后端端口失败:",ve)}return console.log("使用默认后端端口: 3000"),3e3}const na=oa(),Vt=fs("git",()=>{const ve=r(""),u=r([]),V=r(""),v=r(""),g=r(!1),I=r(!1),L=r(!1),F=r(0),W=r(""),ne=r(!1),U=r(!1),ee=r(!1),M=r(!1),T=r(!1),K=r(0),q=r(0),Z=r(!1),H=r(""),be=r(0),ue=r(0);let j=null;const le=r(!0),O=r([]),ge=r({staged:[],unstaged:[],untracked:[]}),se=r(""),x=r([]),w=r(!1),Y=r(!1),G=r(!1),R=r(!1),ie=r(!1),Be=r([]),Ne=r(!1),Re=r(!1),B=r(!1),de=r(!1);function pe(){ve.value="",u.value=[],V.value="",v.value="",g.value=!1,I.value=!1,L.value=!1,F.value=0,K.value=0,q.value=0,Z.value=!1,H.value="",be.value=0,ue.value=0,U.value=!1,ee.value=!1,M.value=!1,T.value=!1,W.value="",ne.value=!1,O.value=[],ge.value={staged:[],unstaged:[],untracked:[]},se.value="",x.value=[],w.value=!1,Y.value=!1,G.value=!1,R.value=!1,ie.value=!1}async function he(){if(L.value)try{console.log("获取分支状态...");const d=await(await fetch("/api/branch-status")).json();d&&(K.value=d.ahead||0,q.value=d.behind||0,Z.value=d.hasUpstream||!1,H.value=d.upstreamBranch||"",be.value=Date.now(),console.log(`分支状态更新:领先 ${K.value} 个提交,落后 ${q.value} 个提交,上游分支:${Z.value?H.value:"无"}`))}catch(p){console.error("获取分支状态失败:",p),K.value=0,q.value=0,Z.value=!1,H.value=""}}async function Ye(){const p=Date.now();if(p-F.value<1e3)return console.log("使用缓存的Git仓库状态:",L.value?"是":"不是"),L.value;try{const z=await(await fetch("/api/current_directory")).json();return L.value=z.isGitRepo===!0,F.value=p,console.log(`当前目录${L.value?"是":"不是"}Git仓库`),L.value}catch(d){return console.error("检查Git仓库状态失败:",d),L.value=!1,F.value=p,!1}}async function Ke(){try{const d=await(await fetch("/api/branch")).json();d.branch&&(ve.value=d.branch)}catch(p){console.error("获取分支信息失败:",p)}}async function Ie(){if(L.value)try{console.log("获取所有分支...");const d=await(await fetch("/api/branches")).json();d.branches&&Array.isArray(d.branches)&&(u.value=d.branches,ue.value=Date.now(),console.log(`获取到${d.branches.length}个分支`))}catch(p){console.error("获取所有分支信息失败:",p)}}async function Xe(p){console.log("切换到分支:",p);try{g.value=!0;const z=await(await fetch("/api/checkout",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({branch:p})})).json();return z.success?(o({message:`已切换到分支: ${p}`,type:"success"}),await Ke(),await he(),!0):(o({message:`切换分支失败: ${z.error}`,type:"error"}),!1)}catch(d){return o({message:`切换分支失败: ${d.message}`,type:"error"}),!1}finally{g.value=!1}}async function ft(){try{const d=await(await fetch("/api/user-info")).json();d.name&&d.email&&(V.value=d.name,v.value=d.email)}catch(p){console.error("获取用户信息失败:",p)}}async function Oe(p,d){if(!p.trim())return o({message:"分支名称不能为空",type:"warning"}),!1;try{I.value=!0;const te=await(await fetch("/api/create-branch",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({newBranchName:p,baseBranch:d||ve.value})})).json();return te.success?(o({message:`已创建并切换到分支: ${p}`,type:"success"}),await Ke(),await he(),await Ie(),!0):(o({message:`创建分支失败: ${te.error}`,type:"error"}),!1)}catch(z){return o({message:`创建分支失败: ${z.message}`,type:"error"}),!1}finally{I.value=!1}}async function Pe(){try{const d=await(await fetch("/api/clear-user-config",{method:"POST"})).json();return d.success?(V.value="",v.value="",o({message:"已清除Git用户配置",type:"success"}),!0):(o({message:`清除配置失败: ${d.error}`,type:"error"}),!1)}catch(p){return o({message:`清除配置失败: ${p.message}`,type:"error"}),!1}}async function at(p,d){try{const te=await(await fetch("/api/restore-user-config",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:p,email:d})})).json();return te.success?(V.value=p,v.value=d,o({message:"已恢复Git用户配置",type:"success"}),!0):(o({message:`恢复配置失败: ${te.error}`,type:"error"}),!1)}catch(z){return o({message:`恢复配置失败: ${z.message}`,type:"error"}),!1}}async function Ee(){if(!L.value)return o({message:"当前目录不是Git仓库",type:"warning"}),!1;try{ee.value=!0;const d=await(await fetch("/api/pull",{method:"POST"})).json();return d.success?(o({message:"拉取成功",type:"success"}),await he(),!0):(d.needsMerge?o({message:`需要合并更改: ${d.pullOutput||"存在冲突需要手动解决"}`,type:"warning",duration:5e3}):o({message:`拉取失败: ${d.error}`,type:"error"}),!1)}catch(p){return o({message:`拉取失败: ${p.message}`,type:"error"}),!1}finally{ee.value=!1}}async function re(){if(!L.value)return o({message:"当前目录不是Git仓库",type:"warning"}),!1;try{M.value=!0;const d=await(await fetch("/api/fetch-all",{method:"POST"})).json();return d.success?(o({message:"获取所有远程分支信息成功",type:"success"}),await he(),!0):(o({message:`获取远程分支信息失败: ${d.error}`,type:"error"}),!1)}catch(p){return o({message:`获取远程分支信息失败: ${p.message}`,type:"error"}),!1}finally{M.value=!1}}function Je(){j&&j.disconnect();try{const p=`http://localhost:${na}`;if(console.log("尝试连接Socket.IO服务器:",p),j=Ms(p,{reconnectionDelayMax:1e4,reconnection:!0,reconnectionAttempts:10,reconnectionDelay:1e3,timeout:2e4,autoConnect:!0,forceNew:!0,transports:["websocket","polling"]}),!j){console.error("Socket.IO初始化失败: socket为null");return}console.log("Socket.IO初始化成功,socket ID:",j.id||"未连接"),j.on("connect",()=>{console.log("成功连接到Socket.IO服务器"),le.value&&j&&j.emit("start_monitoring")}),j.on("disconnect",d=>{console.log("与Socket.IO服务器断开连接:",d)}),j.on("git_status_update",d=>{le.value&&(console.log("收到Git状态更新通知:",new Date().toLocaleTimeString()),d.status&&(se.value=d.status),d.porcelain!==void 0&&n(d.porcelain))}),j.on("monitoring_status",d=>{console.log("文件监控状态:",d.active?"已启动":"已停止")}),j.on("connect_error",d=>{console.error("Socket连接错误:",d.message)}),j.on("connect_timeout",()=>{console.error("Socket连接超时")}),j.on("reconnect",d=>{console.log(`Socket重连成功,尝试次数: ${d}`),le.value&&(console.log("重连后重新发送start_monitoring请求"),j==null||j.emit("start_monitoring"))}),j.on("reconnect_attempt",d=>{console.log(`Socket尝试重连,第 ${d} 次尝试`)}),j.on("reconnect_error",d=>{console.error("Socket重连错误:",d.message)}),j.on("reconnect_failed",()=>{console.error("Socket重连失败,已达到最大重试次数")}),j&&!j.connected&&(console.log("Socket未连接,尝试手动连接..."),j.connect())}catch(p){console.error("Socket.IO连接初始化失败:",p)}}function _(){if(console.log("toggleAutoUpdate调用,当前值:",le.value),!j){console.error("无法切换自动更新状态: socket连接不存在"),o.error("无法连接到服务器,自动更新可能不会生效"),console.log("尝试重新建立socket连接..."),Je(),localStorage.setItem("zen-gitsync-auto-update",le.value.toString());return}try{le.value?(console.log("发送start_monitoring命令..."),j.emit("start_monitoring"),o.success("自动更新已启用")):(console.log("发送stop_monitoring命令..."),j.emit("stop_monitoring"),o.info("自动更新已禁用")),localStorage.setItem("zen-gitsync-auto-update",le.value.toString()),console.log("已保存自动更新设置到本地存储:",le.value)}catch(p){console.error("切换自动更新状态时出错:",p),o.error(`切换自动更新失败: ${p.message}`)}}function n(p){if(p===void 0||p===""){x.value=[];return}const d=p.split(`
|
|
2
|
+
`),z=[];for(const te of d){const We=te.match(/^([ MADRCU\?]{2})\s+(.+)$/);if(We){let Ve="";const ye=We[1],Ge=ye.charAt(0),c=ye.charAt(1);Ge==="A"||Ge==="M"||Ge==="D"||Ge==="R"?Ve="added":Ge===" "&&c==="M"?Ve="modified":Ge===" "&&c==="D"?Ve="deleted":ye==="??"?Ve="untracked":Ve="other",z.push({path:We[2],type:Ve})}}x.value=z}async function N(p=!0){if(!L.value){console.log("当前目录不是Git仓库,跳过加载提交历史");return}try{w.value=!0,console.log("开始加载提交历史...");const d=new Date().getTime(),te=await(await fetch(`/api/log?page=1&_t=${d}`)).json();te&&te.data&&Array.isArray(te.data)?(O.value=[...te.data],console.log(`提交历史加载完成,共 ${O.value.length} 条记录`)):(console.warn("API返回的提交历史格式不正确:",te),O.value=[])}catch(d){console.error("获取提交历史失败:",d),p&&o({message:`获取提交历史失败: ${d.message}`,type:"error"})}finally{w.value=!1}}async function E(){if(!L.value){console.log("当前目录不是Git仓库,跳过加载Git状态");return}try{Y.value=!0;const d=await(await fetch("/api/status")).json();d.status&&(se.value=d.status,ge.value={staged:d.status.staged||[],unstaged:d.status.unstaged||[],untracked:d.status.untracked||[]}),await Te()}catch(p){console.error("获取Git状态失败:",p),o({message:`获取Git状态失败: ${p.message}`,type:"error"})}finally{Y.value=!1}}async function Te(){if(console.log("开始获取Git状态(porcelain格式)..."),!L.value){console.log("当前目录不是Git仓库,跳过加载Git状态");return}try{const d=await(await fetch("/api/status_porcelain")).json();d.status!==void 0?n(d.status):x.value=[]}catch(p){console.error("获取Git状态(porcelain)失败:",p),o({message:`获取Git状态(porcelain)失败: ${p.message}`,type:"error"}),x.value=[]}}async function $e(){if(!L.value)return o.warning("当前目录不是Git仓库"),!1;try{G.value=!0;const d=await(await fetch("/api/add",{method:"POST"})).json();return d.success?(o({message:"文件已添加到暂存区",type:"success"}),E(),!0):(o({message:`添加文件失败: ${d.error}`,type:"error"}),!1)}catch(p){return o({message:`添加文件失败: ${p.message}`,type:"error"}),!1}finally{G.value=!1}}async function Ce(p){if(!L.value)return o.warning("当前目录不是Git仓库"),!1;try{G.value=!0;const z=await(await fetch("/api/add-file",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({filePath:p})})).json();return z.success?(o({message:"文件已暂存",type:"success"}),E(),!0):(o({message:`暂存文件失败: ${z.error}`,type:"error"}),!1)}catch(d){return o({message:`暂存文件失败: ${d.message}`,type:"error"}),!1}finally{G.value=!1}}async function xe(p){if(!L.value)return o.warning("当前目录不是Git仓库"),!1;try{ie.value=!0;const z=await(await fetch("/api/unstage-file",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({filePath:p})})).json();return z.success?(o({message:"已取消暂存文件",type:"success"}),E(),!0):(o({message:`取消暂存失败: ${z.error}`,type:"error"}),!1)}catch(d){return o({message:`取消暂存失败: ${d.message}`,type:"error"}),!1}finally{ie.value=!1}}function Ae(p){return new Promise(d=>setTimeout(d,p))}async function ke(p,d=!1){if(!L.value)return o.warning("当前目录不是Git仓库"),!1;try{R.value=!0;const te=await(await fetch("/api/commit",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({message:p,hasNewlines:p.includes(`
|
|
3
|
+
`),noVerify:d})})).json();return te.success?(o({message:"提交成功",type:"success"}),E(),N(),he(),!0):(o({message:`提交失败: ${te.error}`,type:"error"}),!1)}catch(z){return o({message:`提交失败: ${z.message}`,type:"error"}),!1}finally{R.value=!1}}async function Se(){if(!L.value)return o.warning("当前目录不是Git仓库"),!1;try{U.value=!0;const d=await(await fetch("/api/push",{method:"POST"})).json();return d.success?(o({message:"推送成功",type:"success"}),E(),N(),he(),!0):(o({message:`推送失败: ${d.error}`,type:"error"}),!1)}catch(p){return o({message:`推送失败: ${p.message}`,type:"error"}),!1}finally{U.value=!1}}async function rt(p,d={}){if(!L.value)return o({message:"当前目录不是Git仓库",type:"warning"}),!1;if(!p)return o({message:"请选择要合并的分支",type:"warning"}),!1;if(p===ve.value)return o({message:"不能合并当前分支到自身",type:"warning"}),!1;try{T.value=!0;const z=await fetch("/api/merge",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({branch:p,...d})}),te=await z.json();return z.status===409?(o({message:"合并分支时发生冲突,请手动解决",type:"warning",duration:5e3}),!1):te.success?(o({message:`成功合并分支 ${p} 到 ${ve.value}`,type:"success"}),await E(),await he(),!0):(o({message:`合并分支失败: ${te.error}`,type:"error"}),!1)}catch(z){return o({message:`合并分支失败: ${z.message}`,type:"error"}),!1}finally{T.value=!1}}async function pt(p,d=!1){return await $e()?(await Ae(Zt),await ke(p,d)):!1}async function X(p,d=!1){try{return!await $e()||(await Ae(Zt),!await ke(p,d))?!1:(await Ae(Zt),await Se())}catch(z){try{(await(await fetch("/api/remove-lock",{method:"POST"})).json()).success&&o({message:"已清理锁定文件,请重试操作",type:"warning"})}catch(te){console.error("清理锁定文件失败:",te)}return o({message:`操作失败: ${z.message}`,type:"error"}),E(),N(),he(),!1}}async function ut(){if(!L.value)return o.warning("当前目录不是Git仓库"),!1;try{ie.value=!0;const d=await(await fetch("/api/reset-head",{method:"POST"})).json();return d.success?(o({message:"已重置暂存区",type:"success"}),E(),!0):(o({message:`重置暂存区失败: ${d.error}`,type:"error"}),!1)}catch(p){return o({message:`重置暂存区失败: ${p.message}`,type:"error"}),!1}finally{ie.value=!1}}async function ct(p){if(!L.value)return o.warning("当前目录不是Git仓库"),!1;try{ie.value=!0;const z=await(await fetch("/api/reset-to-remote",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({branch:p})})).json();return z.success?(o({message:`已重置分支 ${p} 到远程状态`,type:"success"}),E(),N(),!0):(o({message:`重置分支失败: ${z.error}`,type:"error"}),!1)}catch(d){return o({message:`重置分支失败: ${d.message}`,type:"error"}),!1}finally{ie.value=!1}}async function vt(){if(L.value)try{ne.value=!0,console.log("获取远程仓库地址...");const d=await(await fetch("/api/remote-url")).json();d.success?(W.value=d.url||"",console.log(`获取到远程仓库地址: ${W.value}`)):(console.warn("获取远程仓库地址失败:",d.error),W.value="")}catch(p){console.error("获取远程仓库地址失败:",p),W.value=""}finally{ne.value=!1}}async function wt(){if(!W.value)return o({message:"没有可复制的远程仓库地址",type:"warning"}),!1;try{return await navigator.clipboard.writeText(W.value),o({message:"已复制远程仓库地址",type:"success"}),!0}catch(p){return console.error("复制远程仓库地址失败:",p),o({message:`复制失败: ${p.message}`,type:"error"}),!1}}Lt(()=>{const p=localStorage.getItem("zen-gitsync-auto-update");p!==null&&(le.value=p==="true"),Je()}),As(()=>{j&&(j.disconnect(),j=null)});async function Ze(){if(!L.value)return o.warning("当前目录不是Git仓库"),[];try{Ne.value=!0;const d=await(await fetch("/api/stash-list")).json();return d.success?(Be.value=d.stashes,d.stashes):(o.error(`获取stash列表失败: ${d.error}`),[])}catch(p){return console.error("获取stash列表失败:",p),o.error(`获取stash列表失败: ${p.message}`),[]}finally{Ne.value=!1}}async function mt(p,d=!1){if(!L.value)return o.warning("当前目录不是Git仓库"),!1;try{de.value=!0;const te=await(await fetch("/api/stash-save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({message:p,includeUntracked:d})})).json();return te.success?(o.success(te.message),await Ze(),await E(),!0):(o.warning(te.message),!1)}catch(z){return console.error("保存stash失败:",z),o.error(`保存stash失败: ${z.message}`),!1}finally{de.value=!1}}async function _t(p,d=!1){if(!L.value)return o.warning("当前目录不是Git仓库"),!1;try{Re.value=!0;const z=await fetch("/api/stash-apply",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({stashId:p,pop:d})}),te=await z.json();return z.status===409?(o.warning("应用stash时发生冲突,请手动解决"),!1):te.success?(o.success(te.message),await Ze(),await E(),!0):(o.error(`应用stash失败: ${te.error}`),!1)}catch(z){return console.error("应用stash失败:",z),o.error(`应用stash失败: ${z.message}`),!1}finally{Re.value=!1}}async function gt(p){if(!L.value)return o.warning("当前目录不是Git仓库"),!1;try{B.value=!0;const z=await(await fetch("/api/stash-drop",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({stashId:p})})).json();return z.success?(o.success(z.message),await Ze(),!0):(o.error(`删除stash失败: ${z.error}`),!1)}catch(d){return console.error("删除stash失败:",d),o.error(`删除stash失败: ${d.message}`),!1}finally{B.value=!1}}async function ht(){if(!L.value)return o.warning("当前目录不是Git仓库"),!1;try{B.value=!0;const d=await(await fetch("/api/stash-clear",{method:"POST"})).json();return d.success?(o.success(d.message),Be.value=[],!0):(o.error(`清空stash失败: ${d.error}`),!1)}catch(p){return console.error("清空stash失败:",p),o.error(`清空stash失败: ${p.message}`),!1}finally{B.value=!1}}return{currentBranch:ve,allBranches:u,userName:V,userEmail:v,isChangingBranch:g,isCreatingBranch:I,isGitRepo:L,lastCheckedTime:F,branchAhead:K,branchBehind:q,hasUpstream:Z,upstreamBranch:H,lastBranchStatusTime:be,lastBranchesTime:ue,remoteUrl:W,isLoadingRemoteUrl:ne,stashes:Be,isLoadingStashes:Ne,isApplyingStash:Re,isDroppingStash:B,isSavingStash:de,log:O,status:ge,statusText:se,fileList:x,isLoadingLog:w,isLoadingStatus:Y,isAddingFiles:G,isCommiting:R,isResetting:ie,autoUpdateEnabled:le,isPushing:U,isGitPulling:ee,isGitFetching:M,isGitMerging:T,$reset:pe,checkGitRepo:Ye,getCurrentBranch:Ke,getAllBranches:Ie,changeBranch:Xe,getUserInfo:ft,createBranch:Oe,clearUserConfig:Pe,restoreUserConfig:at,getBranchStatus:he,gitPull:Ee,gitFetchAll:re,initSocketConnection:Je,toggleAutoUpdate:_,parseStatusPorcelain:n,fetchLog:N,fetchStatus:E,fetchStatusPorcelain:Te,addToStage:$e,addFileToStage:Ce,unstageFile:xe,commitChanges:ke,pushToRemote:Se,addAndCommit:pt,addCommitAndPush:X,resetHead:ut,resetToRemote:ct,getRemoteUrl:vt,copyRemoteUrl:wt,mergeBranch:rt,getStashList:Ze,saveStash:mt,applyStash:_t,dropStash:gt,clearAllStashes:ht}}),ia={class:"card"},ra={class:"status-header"},ua={class:"header-actions"},ca=["element-loading-text"],da={key:0,class:"status-box"},fa={key:1,class:"status-box-wrap"},pa={key:0,class:"branch-status-info"},va={class:"branch-sync-status"},ma={class:"sync-status-content"},ga={class:"status-badges"},ha={class:"badge-content"},ya={class:"badge-content"},wa={key:1,class:"file-list-container"},_a={key:0,class:"file-group"},ba={class:"file-list"},$a=["onClick"],Ca={class:"file-info"},ka={class:"file-path-container"},Sa={class:"file-name"},Ta={class:"file-directory"},xa={class:"file-actions"},Va={key:1,class:"file-group"},La={class:"file-list"},Ba=["onClick"],Aa={class:"file-info"},Ma={class:"file-path-container"},Da={class:"file-name"},Ra={class:"file-directory"},za={class:"file-actions"},Ea={key:2,class:"file-group"},Ga={class:"file-list"},ja=["onClick"],Ua={class:"file-info"},Oa={class:"file-path-container"},Pa={class:"file-name"},Fa={class:"file-directory"},Na={class:"file-actions"},Ia={key:2,class:"empty-status"},Ha={class:"empty-icon"},Xa={class:"diff-content"},Ja=["innerHTML"],Wa={key:1,class:"no-diff"},qa={class:"file-navigation"},Ya={class:"file-counter"},Ka=jt({__name:"GitStatus",props:{initialDirectory:{type:String,default:""}},setup(ve,{expose:u}){const V=ve,v=Vt(),g=ze(()=>v.isLoadingStatus),I=r(""),L=r(""),F=r(!1),W=r(!1),ne=r(-1),U=r(V.initialDirectory||"");async function ee(){try{if(!U.value){const w=await(await fetch("/api/current_directory")).json();U.value=w.directory||"未知目录"}if(!v.isGitRepo)return;await v.fetchStatus(),await v.getBranchStatus(),o({message:"Git 状态已刷新",type:"success"})}catch(x){o({message:"刷新失败: "+x.message,type:"error"})}}function M(x){if(!x)return"";const w=x.split(`
|
|
4
|
+
`);function Y(G){return G.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}return w.map(G=>{const R=Y(G);return G.startsWith("diff --git")?`<div class="diff-header">${R}</div>`:G.startsWith("---")?`<div class="diff-old-file">${R}</div>`:G.startsWith("+++")?`<div class="diff-new-file">${R}</div>`:G.startsWith("@@")?`<div class="diff-hunk-header">${R}</div>`:G.startsWith("+")?`<div class="diff-added">${R}</div>`:G.startsWith("-")?`<div class="diff-removed">${R}</div>`:`<div class="diff-context">${R}</div>`}).join("")}async function T(x){try{W.value=!0,I.value=x,ne.value=v.fileList.findIndex(Y=>Y.path===x);const w=v.fileList[ne.value];if(w&&w.type==="untracked"){try{const G=await(await fetch(`/api/file-content?file=${encodeURIComponent(x)}`)).json();G.success&&G.content?L.value=`diff --git a/${x} b/${x}
|
|
5
|
+
新文件: ${x}
|
|
6
|
+
--- /dev/null
|
|
7
|
+
+++ b/${x}
|
|
8
|
+
@@ -0,0 +1,${G.content.split(`
|
|
9
|
+
`).length} @@
|
|
10
|
+
`+G.content.split(`
|
|
11
|
+
`).map(R=>`+${R}`).join(`
|
|
12
|
+
`):L.value=`这是一个新文件,尚未被Git跟踪。
|
|
13
|
+
添加到暂存区后可以提交该文件。`}catch(Y){console.error("获取未跟踪文件内容失败:",Y),L.value=`这是一个新文件,尚未被Git跟踪。
|
|
14
|
+
添加到暂存区后可以提交该文件。`}F.value=!0}else if(w&&w.type==="added"){const G=await(await fetch(`/api/diff-cached?file=${encodeURIComponent(x)}`)).json();L.value=G.diff||"没有变更",F.value=!0}else{const G=await(await fetch(`/api/diff?file=${encodeURIComponent(x)}`)).json();L.value=G.diff||"没有变更",F.value=!0}}catch(w){o({message:"获取文件差异失败: "+w.message,type:"error"}),L.value="获取差异失败: "+w.message}finally{W.value=!1}}async function K(){if(v.fileList.length===0||ne.value<=0)return;const x=ne.value-1,w=v.fileList[x];await T(w.path)}async function q(){if(v.fileList.length===0||ne.value>=v.fileList.length-1)return;const x=ne.value+1,w=v.fileList[x];await T(w.path)}function Z(x){T(x.path)}async function H(x){await v.addFileToStage(x)}async function be(x){await v.unstageFile(x)}async function ue(){await ee()}async function j(){try{await v.gitPull(),await ee()}catch(x){console.error("拉取操作发生错误:",x)}}async function le(){try{await v.gitFetchAll(),await ee()}catch(x){console.error("获取远程分支信息操作发生错误:",x)}}async function O(x){try{await st.confirm(`确定要撤回文件 "${x}" 的所有修改吗?此操作无法撤销。`,"撤回修改",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"});const Y=await(await fetch("/api/revert_file",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({filePath:x})})).json();Y.success?(o.success("已撤回文件修改"),await ee()):o.error(Y.error?`撤回失败: ${Y.error}`:"撤回文件修改失败,请重试")}catch(w){if(w==="cancel"||w.message==="cancel")return;const Y=w.message||"未知错误";Y!=="undefined"?o.error(`撤回文件修改失败: ${Y}`):o.error("撤回文件修改失败,请重试")}}function ge(x){const w=x.split("/");return w[w.length-1]}function se(x){const w=x.split("/");return w.length<=1?"":w.slice(0,-1).join("/")}return Lt(()=>{ee()}),nt(()=>v.autoUpdateEnabled,(x,w)=>{console.log(`自动更新状态变更: ${w} -> ${x}`),v.toggleAutoUpdate()},{immediate:!1}),u({refreshStatus:ue}),(x,w)=>{const Y=ps,G=ts,R=He,ie=Ot,Be=Ut,Ne=Pt,Re=ss;return m(),$(De,null,[e("div",ia,[e("div",ra,[w[2]||(w[2]=e("h2",null,"Git 状态",-1)),e("div",ua,[s(G,{content:l(v).autoUpdateEnabled?"禁用自动更新文件状态":"启用自动更新文件状态",placement:"top","hide-after":1e3},{default:a(()=>[s(Y,{modelValue:l(v).autoUpdateEnabled,"onUpdate:modelValue":w[0]||(w[0]=B=>l(v).autoUpdateEnabled=B),style:{"--el-switch-on-color":"#67C23A","--el-switch-off-color":"#909399","margin-right":"10px"},"inline-prompt":"","active-icon":l(vs),"inactive-icon":l(es),class:"auto-update-switch"},null,8,["modelValue","active-icon","inactive-icon"])]),_:1},8,["content"]),s(G,{content:"Git Pull (拉取远程更新)",placement:"top","hide-after":1e3},{default:a(()=>[s(R,{type:"primary",icon:l(ms),circle:"",size:"small",onClick:j,loading:l(v).isGitPulling,disabled:!l(v).hasUpstream},null,8,["icon","loading","disabled"])]),_:1}),s(G,{content:"Git Fetch All (获取所有远程分支)",placement:"top","hide-after":1e3},{default:a(()=>[it(s(R,{type:"primary",icon:l(gs),circle:"",size:"small",onClick:le,loading:l(v).isGitFetching},null,8,["icon","loading"]),[[zt,!1]])]),_:1}),s(G,{content:"刷新状态",placement:"top","hide-after":1e3},{default:a(()=>[s(R,{type:"primary",icon:l(Ds),circle:"",size:"small",onClick:ue,loading:g.value},null,8,["icon","loading"])]),_:1})])]),it((m(),$("div",{class:"card-content","element-loading-text":l(v).isGitPulling?"正在拉取代码...":"正在获取远程分支信息..."},[l(v).isGitRepo?(m(),$("div",fa,[l(v).hasUpstream&&(l(v).branchAhead>0||l(v).branchBehind>0)?(m(),$("div",pa,[e("div",va,[e("div",ma,[s(G,{content:"本地分支与远程分支的状态对比",placement:"top"},{default:a(()=>[e("div",ga,[l(v).branchAhead>0?(m(),oe(Be,{key:0,size:"small",type:"warning",class:"status-badge"},{default:a(()=>[e("span",ha,[s(ie,null,{default:a(()=>[s(l(Rs))]),_:1}),h(" 你的分支领先 'origin/"+D(l(v).currentBranch)+"' "+D(l(v).branchAhead)+" 个提交 ",1)])]),_:1})):J("",!0),l(v).branchBehind>0?(m(),oe(Be,{key:1,size:"small",type:"info",class:"status-badge"},{default:a(()=>[e("span",ya,[s(ie,null,{default:a(()=>[s(l(hs))]),_:1}),h(" 你的分支落后 'origin/"+D(l(v).currentBranch)+"' "+D(l(v).branchBehind)+" 个提交 ",1)])]),_:1})):J("",!0)])]),_:1})])])])):J("",!0),l(v).fileList.length?(m(),$("div",wa,[l(v).fileList.some(B=>B.type==="added")?(m(),$("div",_a,[w[5]||(w[5]=e("div",{class:"file-group-header"},"已暂存的更改",-1)),e("div",ba,[(m(!0),$(De,null,Ue(l(v).fileList.filter(B=>B.type==="added"),B=>(m(),$("div",{key:B.path,class:"file-item",onClick:de=>Z(B)},[e("div",Ca,[e("div",ka,[e("span",Sa,D(ge(B.path)),1),e("span",Ta,D(se(B.path)),1)])]),e("div",xa,[s(G,{content:"取消暂存",placement:"top","hide-after":1e3},{default:a(()=>[s(R,{type:"warning",size:"small",circle:"",onClick:kt(de=>be(B.path),["stop"])},{default:a(()=>w[4]||(w[4]=[h("-")])),_:2},1032,["onClick"])]),_:2},1024)])],8,$a))),128))])])):J("",!0),l(v).fileList.some(B=>B.type==="modified"||B.type==="deleted")?(m(),$("div",Va,[w[7]||(w[7]=e("div",{class:"file-group-header"},"未暂存的更改",-1)),e("div",La,[(m(!0),$(De,null,Ue(l(v).fileList.filter(B=>B.type==="modified"||B.type==="deleted"),B=>(m(),$("div",{key:B.path,class:"file-item",onClick:de=>Z(B)},[e("div",Aa,[e("div",{class:Fe(["file-status-indicator",B.type])},null,2),e("div",Ma,[e("span",Da,D(ge(B.path)),1),e("span",Ra,D(se(B.path)),1)])]),e("div",za,[s(G,{content:"添加到暂存区",placement:"top","hide-after":1e3},{default:a(()=>[s(R,{type:"success",size:"small",circle:"",onClick:kt(de=>H(B.path),["stop"])},{default:a(()=>w[6]||(w[6]=[h("+")])),_:2},1032,["onClick"])]),_:2},1024),s(G,{content:"撤回修改",placement:"top","hide-after":1e3},{default:a(()=>[s(R,{type:"danger",size:"small",icon:l(as),circle:"",onClick:kt(de=>O(B.path),["stop"])},null,8,["icon","onClick"])]),_:2},1024)])],8,Ba))),128))])])):J("",!0),l(v).fileList.some(B=>B.type==="untracked")?(m(),$("div",Ea,[w[10]||(w[10]=e("div",{class:"file-group-header"},"未跟踪的文件",-1)),e("div",Ga,[(m(!0),$(De,null,Ue(l(v).fileList.filter(B=>B.type==="untracked"),B=>(m(),$("div",{key:B.path,class:"file-item",onClick:de=>Z(B)},[e("div",Ua,[w[8]||(w[8]=e("div",{class:"file-status-indicator untracked"},null,-1)),e("div",Oa,[e("span",Pa,D(ge(B.path)),1),e("span",Fa,D(se(B.path)),1)])]),e("div",Na,[s(G,{content:"添加到暂存区",placement:"top","hide-after":1e3},{default:a(()=>[s(R,{type:"success",size:"small",circle:"",onClick:kt(de=>H(B.path),["stop"])},{default:a(()=>w[9]||(w[9]=[h("+")])),_:2},1032,["onClick"])]),_:2},1024),s(G,{content:"删除文件",placement:"top","hide-after":1e3},{default:a(()=>[s(R,{type:"danger",size:"small",icon:l(es),circle:"",onClick:kt(de=>O(B.path),["stop"])},null,8,["icon","onClick"])]),_:2},1024)])],8,ja))),128))])])):J("",!0)])):l(v).isGitRepo?(m(),$("div",Ia,[e("div",Ha,[s(ie,null,{default:a(()=>[s(l(ys))]),_:1})]),w[11]||(w[11]=e("div",{class:"empty-text"},"没有检测到任何更改",-1)),w[12]||(w[12]=e("div",{class:"empty-subtext"},"工作区是干净的",-1))])):J("",!0)])):(m(),$("div",da,w[3]||(w[3]=[e("div",{class:"empty-status"},[e("p",null,"当前目录不是Git仓库")],-1)])))],8,ca)),[[Re,l(v).isGitPulling||l(v).isGitFetching]])]),s(Ne,{modelValue:F.value,"onUpdate:modelValue":w[1]||(w[1]=B=>F.value=B),title:`文件差异: ${I.value}`,width:"80%","destroy-on-close":"",class:"diff-dialog"},{footer:a(()=>[e("div",qa,[s(R,{type:"primary",icon:l(zs),onClick:K,disabled:ne.value<=0||l(v).fileList.length===0,plain:"",class:"nav-button"},{default:a(()=>w[13]||(w[13]=[h(" 上一个文件 ")])),_:1},8,["icon","disabled"]),e("div",Ya,[s(Be,{type:"info",effect:"plain",class:"counter-tag"},{default:a(()=>[h(D(ne.value+1)+" / "+D(l(v).fileList.length),1)]),_:1})]),s(R,{type:"primary",icon:l(us),onClick:q,disabled:ne.value>=l(v).fileList.length-1||l(v).fileList.length===0,plain:"",class:"nav-button"},{icon:a(()=>[s(ie,{class:"el-icon--right"},{default:a(()=>[s(l(us))]),_:1})]),default:a(()=>[w[14]||(w[14]=h(" 下一个文件 "))]),_:1},8,["icon","disabled"])])]),default:a(()=>[it((m(),$("div",Xa,[L.value?(m(),$("div",{key:0,innerHTML:M(L.value),class:"diff-formatted"},null,8,Ja)):(m(),$("div",Wa,"该文件没有差异或是新文件"))])),[[Re,W.value]])]),_:1},8,["modelValue","title"])],64)}}}),Ft=(ve,u)=>{const V=ve.__vccOpts||ve;for(const[v,g]of u)V[v]=g;return V},Za=Ft(Ka,[["__scopeId","data-v-d672dbfb"]]),Ss=fs("config",()=>{const ve=r(""),u=r([]),V=r([]),v=r([]),g=r(!1),I=r(!1),L=ze(()=>({defaultCommitMessage:ve.value,descriptionTemplates:u.value,scopeTemplates:V.value,messageTemplates:v.value}));async function F(){if(I.value&&!g.value)return console.log("使用缓存的配置信息"),L.value;try{g.value=!0,console.log("加载配置信息...");const T=await(await fetch("/api/config/getConfig")).json();return ve.value=T.defaultCommitMessage||"",u.value=T.descriptionTemplates||[],V.value=T.scopeTemplates||[],v.value=T.messageTemplates||[],I.value=!0,console.log("配置信息加载完成"),L.value}catch(M){return console.error("加载配置失败:",M),o.error(`加载配置失败: ${M.message}`),null}finally{g.value=!1}}async function W(M){try{const K=await(await fetch("/api/config/saveDefaultMessage",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({defaultCommitMessage:M})})).json();return K.success?(ve.value=M,o.success("默认提交信息已保存"),!0):(o.error(`保存失败: ${K.error}`),!1)}catch(T){return o.error(`保存失败: ${T.message}`),!1}}async function ne(M,T){try{const q=await(await fetch("/api/config/save-template",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({template:M,type:T})})).json();return q.success?(T==="description"?u.value.includes(M)||u.value.push(M):T==="scope"?V.value.includes(M)||V.value.push(M):T==="message"&&(v.value.includes(M)||v.value.push(M)),o.success("模板已保存"),!0):(o.error(`保存模板失败: ${q.error}`),!1)}catch(K){return o.error(`保存模板失败: ${K.message}`),!1}}async function U(M,T){try{const q=await(await fetch("/api/config/delete-template",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({template:M,type:T})})).json();return q.success?(T==="description"?u.value=u.value.filter(Z=>Z!==M):T==="scope"?V.value=V.value.filter(Z=>Z!==M):T==="message"&&(v.value=v.value.filter(Z=>Z!==M)),o.success("模板已删除"),!0):(o.error(`删除模板失败: ${q.error}`),!1)}catch(K){return o.error(`删除模板失败: ${K.message}`),!1}}async function ee(M,T,K){try{const Z=await(await fetch("/api/config/update-template",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldTemplate:M,newTemplate:T,type:K})})).json();if(Z.success){if(K==="description"){const H=u.value.indexOf(M);H!==-1&&(u.value[H]=T)}else if(K==="scope"){const H=V.value.indexOf(M);H!==-1&&(V.value[H]=T)}else if(K==="message"){const H=v.value.indexOf(M);H!==-1&&(v.value[H]=T)}return o.success("模板已更新"),!0}else return o.error(`更新模板失败: ${Z.error}`),!1}catch(q){return o.error(`更新模板失败: ${q.message}`),!1}}return{defaultCommitMessage:ve,descriptionTemplates:u,scopeTemplates:V,messageTemplates:v,isLoading:g,isLoaded:I,config:L,loadConfig:F,saveDefaultMessage:W,saveTemplate:ne,deleteTemplate:U,updateTemplate:ee}}),Qa={class:"card-header"},el={key:0,class:"pushing-indicator"},tl={key:0,class:"push-success-indicator"},sl={class:"card-content"},al={class:"layout-container"},ll={key:0,class:"git-config-warning"},ol={key:1,class:"commit-section"},nl={class:"commit-options"},il={class:"options-row"},rl={class:"commit-mode-toggle"},ul={class:"no-verify-toggle"},cl={key:0,class:"commit-form"},dl={class:"description-container"},fl={class:"input-actions"},pl={class:"preview-section"},vl={class:"preview-content code-command"},ml={class:"form-bottom-actions"},gl={class:"actions-flex-container"},hl={class:"left-actions"},yl={class:"button-grid"},wl={key:0},_l={key:0},bl={key:0},$l={class:"right-actions"},Cl={class:"one-push-content"},kl={key:1,class:"standard-commit-form"},Sl={class:"standard-commit-header"},Tl={class:"type-scope-container"},xl={class:"scope-wrapper"},Vl={class:"description-container"},Ll={class:"advanced-fields"},Bl={class:"preview-section"},Al={class:"preview-content code-command"},Ml={class:"form-bottom-actions"},Dl={class:"actions-flex-container"},Rl={class:"left-actions"},zl={class:"button-grid"},El={key:0},Gl={key:0},jl={key:0},Ul={class:"right-actions"},Ol={class:"one-push-content"},Pl={class:"actions-section"},Fl={class:"action-groups"},Nl={class:"operations-wrapper"},Il={class:"action-group"},Hl={class:"group-buttons"},Xl={key:0},Jl={key:0},Wl={key:0},ql={key:0},Yl={class:"action-group"},Kl={class:"group-buttons"},Zl={class:"action-group reset-group"},Ql={class:"group-buttons"},eo={key:0},to={class:"action-group branch-group"},so={class:"group-buttons"},ao={class:"action-group"},lo={class:"group-buttons"},oo={class:"template-container"},no={class:"template-form"},io={class:"template-form-buttons"},ro={class:"template-list"},uo={class:"template-content"},co={class:"template-actions"},fo={class:"template-container"},po={class:"template-form"},vo={class:"template-form-buttons"},mo={class:"template-list"},go={class:"template-content"},ho={class:"template-actions"},yo={class:"template-container message-template-container"},wo={class:"template-form"},_o={class:"template-form-buttons"},bo={class:"templates-container"},$o={class:"message-templates-list"},Co={class:"templates-scroll-area"},ko={class:"template-content"},So={class:"template-actions"},To={class:"current-default-message"},xo={class:"default-message-content"},Vo={class:"message-help-text"},Lo={class:"merge-dialog-content"},Bo={class:"merge-intro"},Ao={class:"merge-options"},Mo={class:"dialog-footer"},Do={class:"stash-list-content"},Ro={key:0,class:"stash-list-actions"},zo={class:"stash-dialog-content"},Eo={class:"dialog-footer"},Go=jt({__name:"CommitForm",setup(ve){const u=Vt(),V=Ss(),v=r(""),g=r(!1),I=r("输入提交信息..."),L=r(""),F=r(!1),W=r("feat"),ne=r(""),U=r(""),ee=r(""),M=r(""),T=r([]),K=r(!1),q=r(""),Z=r(!1),H=r(""),be=r(-1),ue=r(!1),j=r(""),le=r({noFf:!1,squash:!1,noCommit:!1,message:""}),O=r([]),ge=r(!1),se=r(""),x=r(!1),w=r(""),Y=r(-1),G=r(!1),R=r(""),ie=r(!1),Be=r(!1),Ne=[{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: 构建/工具修改"}],Re=r(!1),B=r(!1),de=r(""),pe=r(!1);function he(){de.value="",pe.value=!1,Re.value=!0}function Ye(){u.getStashList(),B.value=!0}async function Ke(){try{await u.saveStash(de.value,pe.value),Re.value=!1}catch(f){console.error("储藏失败:",f)}}async function Ie(f,t=!1){try{await u.applyStash(f,t),t&&await u.getStashList()}catch(S){console.error("应用储藏失败:",S)}}async function Xe(f){st.confirm("确定要删除此储藏吗?此操作不可恢复。","删除储藏",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"}).then(async()=>{await u.dropStash(f),await u.getStashList()}).catch(()=>{})}async function ft(){st.confirm("确定要清空所有储藏吗?此操作不可恢复。","清空所有储藏",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"}).then(async()=>{await u.clearAllStashes(),await u.getStashList()}).catch(()=>{})}const Oe=r([]),Pe=r(!1),at=r(""),Ee=r(-1);nt(F,f=>{localStorage.setItem("zen-gitsync-standard-commit",f.toString())}),nt(ie,f=>{localStorage.setItem("zen-gitsync-skip-hooks",f.toString())});const re=ze(()=>{if(!F.value)return v.value||L.value;let f=`${W.value||""}`;return ne.value&&(f+=`(${ne.value})`),f+=`: ${U.value}`,ee.value&&(f+=`
|
|
15
|
+
|
|
16
|
+
${ee.value}`),M.value&&(f+=`
|
|
17
|
+
|
|
18
|
+
${M.value}`),f}),Je=ze(()=>{let f=`git commit -m "${re.value}"`;return ie.value&&(f+=" --no-verify"),f});function _(){const f=V.config;f&&(I.value=`输入提交信息 (默认: ${f.defaultCommitMessage})`,L.value=f.defaultCommitMessage||"",f.descriptionTemplates&&Array.isArray(f.descriptionTemplates)&&(T.value=f.descriptionTemplates),f.scopeTemplates&&Array.isArray(f.scopeTemplates)&&(O.value=f.scopeTemplates),f.messageTemplates&&Array.isArray(f.messageTemplates)&&(Oe.value=f.messageTemplates))}async function n(){if(!q.value.trim()){o({message:"请输入模板内容",type:"warning"});return}try{if(Z.value)await N();else{if(T.value.includes(q.value)){o({message:"该模板已存在",type:"warning"});return}await V.saveTemplate(q.value,"description")&&(T.value.includes(q.value)||T.value.push(q.value),T.value=[...T.value],q.value="")}}catch(f){o({message:`保存模板失败: ${f.message}`,type:"error"})}}async function N(){if(!q.value.trim()){o({message:"请输入模板内容",type:"warning"});return}try{if(await V.updateTemplate(H.value,q.value,"description")){const t=T.value.indexOf(H.value);t!==-1&&(T.value[t]=q.value),T.value=[...T.value],Z.value=!1,H.value="",be.value=-1,q.value=""}}catch(f){o({message:`更新模板失败: ${f.message}`,type:"error"})}}function E(f,t){Z.value=!0,H.value=f,be.value=t,q.value=f}function Te(){Z.value=!1,H.value="",be.value=-1,q.value=""}async function $e(){if(!se.value.trim()){o({message:"请输入模板内容",type:"warning"});return}try{if(x.value)await Ce();else{if(O.value.includes(se.value)){o({message:"该模板已存在",type:"warning"});return}await V.saveTemplate(se.value,"scope")&&(O.value.includes(se.value)||O.value.push(se.value),O.value=[...O.value],se.value="")}}catch(f){o({message:`保存模板失败: ${f.message}`,type:"error"})}}async function Ce(){if(!se.value.trim()){o({message:"请输入模板内容",type:"warning"});return}try{if(await V.updateTemplate(w.value,se.value,"scope")){const t=O.value.indexOf(w.value);t!==-1&&(O.value[t]=se.value),O.value=[...O.value],x.value=!1,w.value="",Y.value=-1,se.value=""}}catch(f){o({message:`更新模板失败: ${f.message}`,type:"error"})}}function xe(f,t){x.value=!0,w.value=f,Y.value=t,se.value=f}function Ae(){x.value=!1,w.value="",Y.value=-1,se.value=""}async function ke(f){try{if(await st.confirm(`确定要删除描述模板 "${f}" 吗?`,"删除确认",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"}),await V.deleteTemplate(f,"description")){const S=T.value.indexOf(f);S!==-1&&T.value.splice(S,1),T.value=[...T.value]}}catch(t){if(t==="cancel")return;o({message:`删除模板失败: ${t.message}`,type:"error"})}}async function Se(f){try{if(await st.confirm(`确定要删除作用域模板 "${f}" 吗?`,"删除确认",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"}),await V.deleteTemplate(f,"scope")){const S=O.value.indexOf(f);S!==-1&&O.value.splice(S,1),O.value=[...O.value]}}catch(t){if(t==="cancel")return;o({message:`删除模板失败: ${t.message}`,type:"error"})}}function rt(f){U.value=f,K.value=!1}function pt(f){ne.value=f,ge.value=!1}function X(){K.value=!0}function ut(){ge.value=!0}async function ct(){try{await u.addToStage()&&u.fetchStatus()}catch(f){o({message:`添加文件失败: ${f.message}`,type:"error"})}}async function vt(){if(!re.value.trim()){o({message:"提交信息不能为空",type:"warning"});return}try{await u.commitChanges(re.value,ie.value)&&(d(),u.fetchStatus(),u.fetchLog(),u.getBranchStatus())}catch(f){o({message:`提交失败: ${f.message}`,type:"error"})}}function wt(){g.value=!0,setTimeout(()=>{g.value=!1},2e3)}async function Ze(){try{await u.pushToRemote(),wt(),u.getBranchStatus()}catch(f){o({message:`推送失败: ${f.message}`,type:"error"})}finally{}}async function mt(){try{await u.gitPull(),await u.fetchStatus(),await u.fetchLog(!1)}catch(f){console.error("拉取操作发生错误:",f)}}async function _t(){try{await u.gitFetchAll(),await u.fetchStatus(),await u.fetchLog(!1)}catch(f){console.error("获取远程分支信息操作发生错误:",f)}}async function gt(){if(!re.value.trim()){o({message:"提交信息不能为空",type:"warning"});return}try{await u.addAndCommit(re.value,ie.value),d(),u.fetchStatus(),u.fetchLog()}catch(f){o({message:`暂存并提交失败: ${f.message}`,type:"error"})}}async function ht(){if(!re.value.trim()){o({message:"提交信息不能为空",type:"warning"});return}try{await u.addCommitAndPush(re.value,ie.value),d(),wt()}catch(f){o({message:`暂存、提交并推送失败: ${f.message}`,type:"error"})}}async function p(){try{await st.confirm(`确定要重置当前分支 "${u.currentBranch}" 到远程状态吗?这将丢失所有未推送的提交和本地更改。`,"重置到远程分支",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"}),await u.resetToRemote(u.currentBranch)&&(u.fetchStatus(),u.fetchLog())}catch(f){f!=="cancel"&&o({message:`重置到远程分支失败: ${f.message}`,type:"error"})}}function d(){v.value="",U.value="",ee.value="",M.value=""}function z(){R.value=L.value,G.value=!0}async function te(){if(!R.value.trim()){o({message:"请输入默认提交信息",type:"warning"});return}try{await V.saveDefaultMessage(R.value)&&(L.value=R.value,I.value=`输入提交信息 (默认: ${R.value})`,G.value=!1)}catch(f){o({message:`保存默认提交信息失败: ${f.message}`,type:"error"})}}const We=ze(()=>u.fileList.some(f=>["modified","deleted","untracked"].includes(f.type))),Ve=ze(()=>u.fileList.filter(f=>["modified","deleted","untracked"].includes(f.type)).length),ye=ze(()=>u.fileList.filter(f=>f.type==="added").length),Ge=ze(()=>ye.value>0),c=ze(()=>u.fileList.length>0),i=ze(()=>u.branchAhead>0),b=ze(()=>u.branchBehind>0),C=ze(()=>u.hasUpstream&&i.value&&!Ge.value),me=ze(()=>Ge.value),ce=ze(()=>u.hasUpstream&&(i.value||b.value||c.value));async function ae(){if(!R.value.trim()){o({message:"请输入模板内容",type:"warning"});return}try{if(Pe.value)await A();else{if(Oe.value.includes(R.value)){o({message:"该模板已存在",type:"warning"});return}Oe.value.push(R.value);const t=await(await fetch("/api/config/save-template",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({template:R.value,type:"message"})})).json();t.success?(o({message:"提交信息模板保存成功!",type:"success"}),R.value=""):o({message:"模板保存失败: "+t.error,type:"error"})}}catch(f){o({message:"模板保存失败: "+f.message,type:"error"})}}async function A(){try{if(Ee.value>=0){const f=at.value,t=R.value;Oe.value[Ee.value]=t;const qe=await(await fetch("/api/config/update-template",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldTemplate:f,newTemplate:t,type:"message"})})).json();qe.success?(o({message:"提交信息模板更新成功!",type:"success"}),Pe.value=!1,at.value="",Ee.value=-1,R.value=""):o({message:"模板更新失败: "+qe.error,type:"error"})}}catch(f){o({message:"模板更新失败: "+f.message,type:"error"})}}function Le(f,t){Pe.value=!0,at.value=f,Ee.value=t,R.value=f}function Qe(){Pe.value=!1,at.value="",Ee.value=-1,R.value=""}async function Q(f){try{const t=Oe.value.indexOf(f);t!==-1&&Oe.value.splice(t,1);const qe=await(await fetch("/api/config/delete-template",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({template:f,type:"message"})})).json();qe.success?o({message:"提交信息模板删除成功!",type:"success"}):o({message:"模板删除失败: "+qe.error,type:"error"})}catch(t){o({message:"模板删除失败: "+t.message,type:"error"})}}function we(f){v.value=f,R.value=f}Lt(async()=>{const f=localStorage.getItem("zen-gitsync-standard-commit");f!==null&&(F.value=f==="true");const t=localStorage.getItem("zen-gitsync-skip-hooks");t!==null&&(ie.value=t==="true"),nt(()=>V.config,_,{immediate:!0}),V.config||await V.loadConfig()});function _e(){j.value="",le.value={noFf:!1,squash:!1,noCommit:!1,message:""},fe.value="all",ue.value=!0,u.allBranches.length===0&&u.getAllBranches()}const fe=r("all"),ot=ze(()=>{const f=u.allBranches.filter(t=>t!==u.currentBranch);if(console.log("筛选分支列表:",{allBranches:u.allBranches,currentBranch:u.currentBranch,branchTypeFilter:fe.value,filteredBranches:f}),fe.value==="local"){const t=f.filter(S=>!S.includes("origin/"));return console.log("本地分支:",t),t}else if(fe.value==="remote"){const t=f.filter(S=>S.includes("origin/"));return console.log("远程分支:",t),t}else return console.log("所有分支:",f),f});async function k(){if(!j.value){o({message:"请选择要合并的分支",type:"warning"});return}try{await u.mergeBranch(j.value,le.value)&&(ue.value=!1,await u.fetchStatus(),await u.fetchLog(!1))}catch(f){console.error("合并分支操作发生错误:",f)}}const P=r(!1);function Nt(){P.value=!P.value}return(f,t)=>{const S=He,qe=Ot,It=ws,Ct=ps,Me=ts,lt=ls,os=Et,ns=Gt,xs=Us,Bt=_s,Ht=Os,At=bs,bt=Pt,is=Ut,Xt=Fs,Vs=Ps,$t=Cs,Mt=Ns,rs=$s,Jt=yt,Ls=ks,Bs=ss;return m(),$("div",{class:Fe(["card",{"is-pushing":l(u).isPushing}])},[e("div",Qa,[t[29]||(t[29]=e("h2",null,"提交更改",-1)),s(S,{type:"primary",icon:l(Es),size:"small",circle:"",onClick:Nt,class:"git-tools-button"},null,8,["icon"])]),s(cs,{name:"el-fade-in-linear"},{default:a(()=>[l(u).isPushing?(m(),$("div",el,t[30]||(t[30]=[e("div",{class:"pushing-spinner"},[e("svg",{viewBox:"0 0 50 50",class:"circular"},[e("circle",{class:"path",cx:"25",cy:"25",r:"20",fill:"none"})])],-1),e("div",{class:"pushing-text"},"正在推送...",-1)]))):J("",!0)]),_:1}),s(cs,{name:"el-fade-in-linear"},{default:a(()=>[g.value?(m(),$("div",tl,[s(qe,{class:"push-success-icon"},{default:a(()=>[s(l(vs))]),_:1}),t[31]||(t[31]=e("div",{class:"push-success-text"},"推送成功!",-1))])):J("",!0)]),_:1}),e("div",sl,[e("div",al,[l(u).userName===""||l(u).userEmail===""?(m(),$("div",ll,[s(It,{title:"Git用户信息未配置",type:"warning",closable:!1,"show-icon":""},{default:a(()=>t[32]||(t[32]=[e("p",null,"您需要配置Git用户名和邮箱才能提交代码。请使用以下命令配置:",-1),e("pre",{class:"config-command"},`git config --global user.name "Your Name"
|
|
19
|
+
git config --global user.email "your.email@example.com"`,-1)])),_:1})])):(m(),$("div",ol,[e("div",nl,[e("div",il,[e("div",rl,[s(Ct,{modelValue:F.value,"onUpdate:modelValue":t[0]||(t[0]=y=>F.value=y),"active-text":"标准化提交","inactive-text":"普通提交"},null,8,["modelValue"])]),e("div",ul,[s(Me,{content:"跳过 Git 钩子检查 (--no-verify)",placement:"top"},{default:a(()=>[s(Ct,{modelValue:ie.value,"onUpdate:modelValue":t[1]||(t[1]=y=>ie.value=y),"active-text":"跳过钩子 (--no-verify)"},null,8,["modelValue"])]),_:1})])])]),F.value?(m(),$("div",kl,[e("div",Sl,[e("div",Tl,[s(ns,{modelValue:W.value,"onUpdate:modelValue":t[3]||(t[3]=y=>W.value=y),placeholder:"提交类型",class:"type-select",clearable:""},{default:a(()=>[(m(),$(De,null,Ue(Ne,y=>s(os,{key:y.value,label:y.label,value:y.value},null,8,["label","value"])),64))]),_:1},8,["modelValue"]),e("div",xl,[s(lt,{modelValue:ne.value,"onUpdate:modelValue":t[4]||(t[4]=y=>ne.value=y),placeholder:"作用域(可选)",class:"scope-input",clearable:""},null,8,["modelValue"]),s(S,{type:"primary",icon:l(xt),circle:"",size:"small",class:"settings-button",onClick:ut},null,8,["icon"])])]),e("div",Vl,[s(lt,{modelValue:U.value,"onUpdate:modelValue":t[5]||(t[5]=y=>U.value=y),placeholder:"简短描述(必填)",class:"description-input",clearable:""},null,8,["modelValue"]),s(S,{type:"primary",icon:l(xt),circle:"",size:"small",class:"settings-button",onClick:X},null,8,["icon"])])]),e("div",{class:"advanced-options-toggle",onClick:t[6]||(t[6]=y=>Be.value=!Be.value)},[e("span",null,D(Be.value?"收起":"正文及页脚"),1),s(qe,{class:Fe(["toggle-icon",{"is-active":Be.value}])},{default:a(()=>[s(l(hs))]),_:1},8,["class"])]),it(e("div",Ll,[s(lt,{modelValue:ee.value,"onUpdate:modelValue":t[7]||(t[7]=y=>ee.value=y),type:"textarea",rows:4,placeholder:"正文(可选):详细描述本次提交的内容和原因",class:"body-input",clearable:""},null,8,["modelValue"]),s(lt,{modelValue:M.value,"onUpdate:modelValue":t[8]||(t[8]=y=>M.value=y),placeholder:"页脚(可选):如 Closes #123",class:"footer-input",clearable:""},null,8,["modelValue"])],512),[[zt,Be.value]]),e("div",Bl,[t[38]||(t[38]=e("div",{class:"preview-title"},"Git提交命令预览:",-1)),e("pre",Al,D(Je.value),1)]),e("div",Ml,[e("div",Dl,[e("div",Rl,[e("div",zl,[s(S,{type:"primary",onClick:ct,loading:l(u).isAddingFiles,disabled:!We.value,class:"stage-button"},{default:a(()=>[t[39]||(t[39]=h(" 暂存更改 ")),Ve.value>0?(m(),$("span",El,"("+D(Ve.value)+")",1)):J("",!0)]),_:1},8,["loading","disabled"]),s(S,{type:"primary",onClick:vt,loading:l(u).isLoadingStatus,disabled:!Ge.value||!re.value.trim()},{default:a(()=>[t[40]||(t[40]=h(" 提交 ")),ye.value>0?(m(),$("span",Gl,"("+D(ye.value)+")",1)):J("",!0)]),_:1},8,["loading","disabled"]),s(S,{type:"primary",icon:l(Wt),onClick:Ze,loading:l(u).isPushing,disabled:!C.value,style:Tt(C.value?{backgroundColor:"#67c23a",borderColor:"#67c23a"}:{})},{default:a(()=>[t[41]||(t[41]=h(" 推送 ")),i.value?(m(),$("span",jl,"("+D(l(u).branchAhead)+")",1)):J("",!0)]),_:1},8,["icon","loading","disabled","style"])])]),e("div",Ul,[s(S,{type:"success",onClick:ht,loading:l(u).isAddingFiles||l(u).isCommiting||l(u).isPushing,disabled:!c.value||!re.value.trim()||!l(u).hasUpstream,class:"one-push-button"},{default:a(()=>[e("div",Ol,[s(qe,{class:"one-push-icon"},{default:a(()=>[s(l(qt))]),_:1}),t[42]||(t[42]=e("div",{class:"one-push-text"},[e("span",{class:"one-push-title"},"一键推送所有"),e("span",{class:"one-push-desc"},"暂存 + 提交 + 推送")],-1))])]),_:1},8,["loading","disabled"])])])])])):(m(),$("div",cl,[e("div",dl,[s(lt,{modelValue:v.value,"onUpdate:modelValue":t[2]||(t[2]=y=>v.value=y),placeholder:I.value,type:"textarea",rows:6,resize:"none",class:"commit-message-input"},null,8,["modelValue","placeholder"]),e("div",fl,[s(S,{type:"primary",icon:l(xt),circle:"",size:"small",class:"settings-button",onClick:z},null,8,["icon"])])]),e("div",pl,[t[33]||(t[33]=e("div",{class:"preview-title"},"Git提交命令预览:",-1)),e("pre",vl,'git commit -m "'+D(re.value||"<提交信息>")+'"'+D(ie.value?" --no-verify":""),1)]),e("div",ml,[e("div",gl,[e("div",hl,[e("div",yl,[s(S,{type:"primary",onClick:ct,loading:l(u).isAddingFiles,disabled:!We.value,class:"stage-button"},{default:a(()=>[t[34]||(t[34]=h(" 暂存更改 ")),Ve.value>0?(m(),$("span",wl,"("+D(Ve.value)+")",1)):J("",!0)]),_:1},8,["loading","disabled"]),s(S,{type:"primary",onClick:vt,loading:l(u).isLoadingStatus,disabled:!Ge.value||!re.value.trim()},{default:a(()=>[t[35]||(t[35]=h(" 提交 ")),ye.value>0?(m(),$("span",_l,"("+D(ye.value)+")",1)):J("",!0)]),_:1},8,["loading","disabled"]),s(S,{type:"primary",icon:l(Wt),onClick:Ze,loading:l(u).isPushing,disabled:!C.value,style:Tt(C.value?{backgroundColor:"#67c23a",borderColor:"#67c23a"}:{})},{default:a(()=>[t[36]||(t[36]=h(" 推送 ")),i.value?(m(),$("span",bl,"("+D(l(u).branchAhead)+")",1)):J("",!0)]),_:1},8,["icon","loading","disabled","style"])])]),e("div",$l,[s(S,{type:"success",onClick:ht,loading:l(u).isAddingFiles||l(u).isCommiting||l(u).isPushing,disabled:!c.value||!re.value.trim()||!l(u).hasUpstream,class:"one-push-button"},{default:a(()=>[e("div",Cl,[s(qe,{class:"one-push-icon"},{default:a(()=>[s(l(qt))]),_:1}),t[37]||(t[37]=e("div",{class:"one-push-text"},[e("span",{class:"one-push-title"},"一键推送所有"),e("span",{class:"one-push-desc"},"暂存 + 提交 + 推送")],-1))])]),_:1},8,["loading","disabled"])])])])]))]))]),s(xs,{modelValue:P.value,"onUpdate:modelValue":t[9]||(t[9]=y=>P.value=y),title:"Git 操作",direction:"rtl",size:"340px","with-header":!0,"show-close":!0,"destroy-on-close":!1,class:"git-operations-drawer"},{default:a(()=>[e("div",Pl,[e("div",Fl,[e("div",Nl,[e("div",Il,[t[48]||(t[48]=e("div",{class:"group-title"},"基础操作",-1)),e("div",Hl,[s(Me,{content:We.value?`暂存${Ve.value}个待更改文件`:"git add .",placement:"top",effect:"light","popper-class":"git-cmd-tooltip"},{default:a(()=>[s(S,{type:"primary",onClick:ct,loading:l(u).isAddingFiles,disabled:!We.value,class:"action-button"},{default:a(()=>[t[43]||(t[43]=h(" 暂存更改 ")),Ve.value>0?(m(),$("span",Xl,"("+D(Ve.value)+")",1)):J("",!0)]),_:1},8,["loading","disabled"])]),_:1},8,["content"]),s(Me,{content:Ge.value?`提交${ye.value}个已暂存文件`:"git commit",placement:"top",effect:"light","popper-class":"git-cmd-tooltip"},{default:a(()=>[s(S,{type:"primary",onClick:vt,loading:l(u).isLoadingStatus,disabled:!Ge.value||!re.value.trim(),class:"action-button"},{default:a(()=>[t[44]||(t[44]=h(" 提交 ")),ye.value>0?(m(),$("span",Jl,"("+D(ye.value)+")",1)):J("",!0)]),_:1},8,["loading","disabled"])]),_:1},8,["content"]),s(Me,{content:i.value?`推送${l(u).branchAhead}个本地提交`:"git push",placement:"top",effect:"light","popper-class":"git-cmd-tooltip"},{default:a(()=>[s(S,{type:"primary",icon:l(Wt),onClick:Ze,loading:l(u).isPushing,disabled:!C.value,class:Fe(["action-button","push-button",{"is-loading":l(u).isPushing}]),style:Tt(C.value?{backgroundColor:"#67c23a",borderColor:"#67c23a"}:{})},{default:a(()=>[t[45]||(t[45]=h(" 推送 ")),i.value?(m(),$("span",Wl,"("+D(l(u).branchAhead)+")",1)):J("",!0)]),_:1},8,["icon","loading","disabled","class","style"])]),_:1},8,["content"]),s(Me,{content:b.value?`拉取${l(u).branchBehind}个远程提交`:"git pull",placement:"top",effect:"light","popper-class":"git-cmd-tooltip"},{default:a(()=>[s(S,{type:"primary",icon:l(ms),onClick:mt,loading:l(u).isGitPulling,disabled:!l(u).hasUpstream,class:"action-button",style:Tt(l(u).hasUpstream?{color:"white",backgroundColor:"#1e90ff",borderColor:"#1e90ff"}:{})},{default:a(()=>[t[46]||(t[46]=h(" 拉取 ")),b.value?(m(),$("span",ql,"("+D(l(u).branchBehind)+")",1)):J("",!0)]),_:1},8,["icon","loading","disabled","style"])]),_:1},8,["content"]),s(Me,{content:"git fetch --all",placement:"top",effect:"light","popper-class":"git-cmd-tooltip"},{default:a(()=>[s(S,{type:"info",icon:l(gs),onClick:_t,loading:l(u).isGitFetching,class:"action-button",style:{color:"white","background-color":"#1e90ff","border-color":"#1e90ff"}},{default:a(()=>t[47]||(t[47]=[h(" 获取所有远程分支 ")])),_:1},8,["icon","loading"])]),_:1})])]),e("div",Yl,[t[51]||(t[51]=e("div",{class:"group-title"},"组合操作",-1)),e("div",Kl,[s(Me,{content:"git add + git commit",placement:"top",effect:"light","popper-class":"git-cmd-tooltip"},{default:a(()=>[s(S,{type:"primary",icon:l(Dt),onClick:gt,loading:l(u).isAddingFiles||l(u).isCommiting,disabled:!We.value||!re.value.trim(),class:"action-button"},{default:a(()=>t[49]||(t[49]=[h(" 暂存并提交 ")])),_:1},8,["icon","loading","disabled"])]),_:1}),s(Me,{content:"git add + git commit + git push",placement:"top",effect:"light","popper-class":"git-cmd-tooltip"},{default:a(()=>[s(S,{type:"success",icon:l(qt),onClick:ht,loading:l(u).isAddingFiles||l(u).isCommiting||l(u).isPushing,disabled:!c.value||!re.value.trim()||!l(u).hasUpstream,class:Fe(["action-button","one-click-push",{"is-loading":l(u).isAddingFiles||l(u).isCommiting||l(u).isPushing}])},{default:a(()=>t[50]||(t[50]=[h(" 一键推送所有 ")])),_:1},8,["icon","loading","disabled","class"])]),_:1})])])]),e("div",Zl,[t[54]||(t[54]=e("div",{class:"group-title"},"重置操作",-1)),e("div",Ql,[s(Me,{content:me.value?`撤销${ye.value}个已暂存文件`:"git reset HEAD",placement:"top",effect:"light","popper-class":"git-cmd-tooltip"},{default:a(()=>[s(S,{type:"warning",icon:l(as),onClick:l(u).resetHead,loading:l(u).isResetting,disabled:!me.value,class:"action-button reset-button"},{default:a(()=>[t[52]||(t[52]=h(" 重置暂存区 ")),ye.value>0?(m(),$("span",eo,"("+D(ye.value)+")",1)):J("",!0)]),_:1},8,["icon","onClick","loading","disabled"])]),_:1},8,["content"]),s(Me,{content:"git reset --hard origin/branch",placement:"top",effect:"light","popper-class":"git-cmd-tooltip"},{default:a(()=>[s(S,{type:"danger",icon:l(Gs),onClick:p,loading:l(u).isResetting,disabled:!ce.value,class:"action-button danger-button"},{default:a(()=>t[53]||(t[53]=[h(" 重置到远程 ")])),_:1},8,["icon","loading","disabled"])]),_:1})])]),e("div",to,[t[56]||(t[56]=e("div",{class:"group-title"},"分支操作",-1)),e("div",so,[s(Me,{content:"合并其他分支到当前分支",placement:"top",effect:"light","popper-class":"git-cmd-tooltip"},{default:a(()=>[s(S,{type:"primary",icon:l(js),onClick:_e,loading:l(u).isGitMerging,class:"action-button merge-button"},{default:a(()=>t[55]||(t[55]=[h(" 合并分支 ")])),_:1},8,["icon","loading"])]),_:1})])]),e("div",ao,[t[59]||(t[59]=e("div",{class:"group-title"},"储藏操作",-1)),e("div",lo,[s(Me,{content:"将工作区更改储藏起来",placement:"top",effect:"light","popper-class":"git-cmd-tooltip"},{default:a(()=>[s(S,{type:"warning",onClick:he,loading:l(u).isSavingStash,disabled:!c.value,class:"action-button"},{default:a(()=>t[57]||(t[57]=[h(" 储藏更改 ")])),_:1},8,["loading","disabled"])]),_:1}),s(Me,{content:"查看和管理所有储藏记录",placement:"top",effect:"light","popper-class":"git-cmd-tooltip"},{default:a(()=>[s(S,{type:"info",onClick:Ye,class:"action-button"},{default:a(()=>t[58]||(t[58]=[h(" 储藏列表 ")])),_:1})]),_:1})])])])])]),_:1},8,["modelValue"]),s(bt,{title:"简短描述模板设置",modelValue:K.value,"onUpdate:modelValue":t[11]||(t[11]=y=>K.value=y),width:"80vw",top:"70px",style:{height:"calc(100vh - 140px)"},"close-on-click-modal":!1,class:"template-dialog"},{default:a(()=>[e("div",oo,[e("div",no,[s(lt,{modelValue:q.value,"onUpdate:modelValue":t[10]||(t[10]=y=>q.value=y),placeholder:Z.value?"编辑模板内容":"输入新模板内容",class:"template-input",clearable:""},null,8,["modelValue","placeholder"]),e("div",io,[Z.value?(m(),oe(S,{key:0,onClick:Te},{default:a(()=>t[60]||(t[60]=[h("取消")])),_:1})):J("",!0),s(S,{type:"primary",onClick:n,disabled:!q.value.trim()},{default:a(()=>[h(D(Z.value?"更新模板":"添加模板"),1)]),_:1},8,["disabled"])])]),e("div",ro,[t[64]||(t[64]=e("h3",null,"已保存模板",-1)),T.value.length===0?(m(),oe(Bt,{key:0,description:"暂无保存的模板"})):J("",!0),(m(!0),$(De,null,Ue(T.value,(y,et)=>(m(),oe(At,{key:et,class:"template-item"},{default:a(()=>[s(Ht,{justify:"space-between",align:"middle",style:{width:"100%"}},{default:a(()=>[e("div",uo,D(y),1),e("div",co,[s(S,{type:"primary",size:"small",onClick:dt=>rt(y)},{default:a(()=>t[61]||(t[61]=[h("使用")])),_:2},1032,["onClick"]),s(S,{type:"warning",size:"small",icon:l(Dt),onClick:dt=>E(y,et)},{default:a(()=>t[62]||(t[62]=[h("编辑")])),_:2},1032,["icon","onClick"]),s(S,{type:"danger",size:"small",onClick:dt=>ke(y)},{default:a(()=>t[63]||(t[63]=[h("删除")])),_:2},1032,["onClick"])])]),_:2},1024)]),_:2},1024))),128))])])]),_:1},8,["modelValue"]),s(bt,{title:"作用域模板设置",modelValue:ge.value,"onUpdate:modelValue":t[13]||(t[13]=y=>ge.value=y),width:"80vw",top:"70px",style:{height:"calc(100vh - 140px)"},"close-on-click-modal":!1,class:"template-dialog"},{default:a(()=>[e("div",fo,[e("div",po,[s(lt,{modelValue:se.value,"onUpdate:modelValue":t[12]||(t[12]=y=>se.value=y),placeholder:x.value?"编辑作用域模板内容":"输入新作用域模板",class:"template-input",clearable:""},null,8,["modelValue","placeholder"]),e("div",vo,[x.value?(m(),oe(S,{key:0,onClick:Ae},{default:a(()=>t[65]||(t[65]=[h("取消")])),_:1})):J("",!0),s(S,{type:"primary",onClick:$e,disabled:!se.value.trim()},{default:a(()=>[h(D(x.value?"更新模板":"添加模板"),1)]),_:1},8,["disabled"])])]),e("div",mo,[t[69]||(t[69]=e("h3",null,"已保存作用域",-1)),O.value.length===0?(m(),oe(Bt,{key:0,description:"暂无保存的作用域"})):J("",!0),(m(!0),$(De,null,Ue(O.value,(y,et)=>(m(),oe(At,{key:et,class:"template-item"},{default:a(()=>[s(Ht,{justify:"space-between",align:"middle",style:{width:"100%"}},{default:a(()=>[e("div",go,D(y),1),e("div",ho,[s(S,{type:"primary",size:"small",onClick:dt=>pt(y)},{default:a(()=>t[66]||(t[66]=[h("使用")])),_:2},1032,["onClick"]),s(S,{type:"warning",size:"small",icon:l(Dt),onClick:dt=>xe(y,et)},{default:a(()=>t[67]||(t[67]=[h("编辑")])),_:2},1032,["icon","onClick"]),s(S,{type:"danger",size:"small",onClick:dt=>Se(y)},{default:a(()=>t[68]||(t[68]=[h("删除")])),_:2},1032,["onClick"])])]),_:2},1024)]),_:2},1024))),128))])])]),_:1},8,["modelValue"]),s(bt,{title:"默认提交信息设置",modelValue:G.value,"onUpdate:modelValue":t[15]||(t[15]=y=>G.value=y),width:"80vw",top:"70px",style:{height:"calc(100vh - 140px)"},"close-on-click-modal":!1,class:"message-template-dialog"},{default:a(()=>[e("div",yo,[e("div",wo,[s(lt,{modelValue:R.value,"onUpdate:modelValue":t[14]||(t[14]=y=>R.value=y),placeholder:Pe.value?"编辑模板内容":"输入新模板内容",class:"template-input",clearable:""},null,8,["modelValue","placeholder"]),e("div",_o,[Pe.value?(m(),oe(S,{key:0,onClick:Qe},{default:a(()=>t[70]||(t[70]=[h("取消")])),_:1})):J("",!0),s(S,{type:"primary",onClick:ae,disabled:!R.value.trim()},{default:a(()=>[h(D(Pe.value?"更新模板":"添加模板"),1)]),_:1},8,["disabled"]),s(S,{type:"success",onClick:te,disabled:!R.value.trim()},{default:a(()=>t[71]||(t[71]=[h(" 设为默认提交信息 ")])),_:1},8,["disabled"])])]),e("div",bo,[e("div",$o,[t[75]||(t[75]=e("h3",null,"已保存模板",-1)),e("div",Co,[Oe.value.length===0?(m(),oe(Bt,{key:0,description:"暂无保存的模板"})):J("",!0),(m(!0),$(De,null,Ue(Oe.value,(y,et)=>(m(),oe(At,{key:et,class:"template-item"},{default:a(()=>[s(Ht,{justify:"space-between",align:"middle",style:{width:"100%"}},{default:a(()=>[e("div",ko,D(y),1),e("div",So,[s(S,{type:"primary",size:"small",onClick:dt=>we(y)},{default:a(()=>t[72]||(t[72]=[h("使用")])),_:2},1032,["onClick"]),s(S,{type:"warning",size:"small",icon:l(Dt),onClick:dt=>Le(y,et)},{default:a(()=>t[73]||(t[73]=[h("编辑")])),_:2},1032,["icon","onClick"]),s(S,{type:"danger",size:"small",onClick:dt=>Q(y)},{default:a(()=>t[74]||(t[74]=[h("删除")])),_:2},1032,["onClick"])])]),_:2},1024)]),_:2},1024))),128))])]),e("div",To,[t[83]||(t[83]=e("h3",null,"当前默认提交信息",-1)),L.value?(m(),oe(At,{key:0,class:"default-message-card"},{default:a(()=>[e("div",xo,D(L.value),1)]),_:1})):(m(),oe(Bt,{key:1,description:"尚未设置默认提交信息","image-size":100})),e("div",Vo,[t[81]||(t[81]=e("h4",null,"关于默认提交信息",-1)),t[82]||(t[82]=e("p",null,"默认提交信息将在未输入提交信息时自动使用。",-1)),e("p",null,[t[78]||(t[78]=h("你可以通过点击左侧模板的")),s(is,{size:"small",type:"primary"},{default:a(()=>t[76]||(t[76]=[h("使用")])),_:1}),t[79]||(t[79]=h("按钮先选择喜欢的模板,然后点击上方")),s(is,{size:"small",type:"success"},{default:a(()=>t[77]||(t[77]=[h("设为默认提交信息")])),_:1}),t[80]||(t[80]=h("按钮保存。"))])])])])])]),_:1},8,["modelValue"]),s(bt,{title:"合并分支",modelValue:ue.value,"onUpdate:modelValue":t[23]||(t[23]=y=>ue.value=y),width:"500px","close-on-click-modal":!1,class:"merge-dialog"},{footer:a(()=>[e("div",Mo,[s(S,{onClick:t[22]||(t[22]=y=>ue.value=!1)},{default:a(()=>t[90]||(t[90]=[h("取消")])),_:1}),s(S,{type:"primary",onClick:k,loading:l(u).isGitMerging,disabled:!j.value,class:"merge-confirm-btn"},{default:a(()=>t[91]||(t[91]=[h(" 合并 ")])),_:1},8,["loading","disabled"])])]),default:a(()=>[e("div",Lo,[e("p",Bo,"选择要合并到当前分支 ("+D(l(u).currentBranch)+") 的分支:",1),s(rs,{"label-position":"top"},{default:a(()=>[s($t,{label:"分支类型"},{default:a(()=>[s(Vs,{modelValue:fe.value,"onUpdate:modelValue":t[16]||(t[16]=y=>fe.value=y),size:"small"},{default:a(()=>[s(Xt,{label:"all"},{default:a(()=>t[84]||(t[84]=[h("所有分支")])),_:1}),s(Xt,{label:"local"},{default:a(()=>t[85]||(t[85]=[h("本地分支")])),_:1}),s(Xt,{label:"remote"},{default:a(()=>t[86]||(t[86]=[h("远程分支")])),_:1})]),_:1},8,["modelValue"])]),_:1}),s($t,{label:"选择分支"},{default:a(()=>[s(ns,{modelValue:j.value,"onUpdate:modelValue":t[17]||(t[17]=y=>j.value=y),placeholder:"选择要合并的分支",style:{width:"100%"},filterable:""},{default:a(()=>[(m(!0),$(De,null,Ue(ot.value,y=>(m(),oe(os,{key:y,label:y,value:y},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])]),_:1}),s($t,{label:"合并选项"},{default:a(()=>[e("div",Ao,[s(Mt,{modelValue:le.value.noFf,"onUpdate:modelValue":t[18]||(t[18]=y=>le.value.noFf=y)},{default:a(()=>[s(Me,{content:"创建合并提交,即使可以使用快进合并",placement:"top"},{default:a(()=>t[87]||(t[87]=[e("span",null,"禁用快进合并 (--no-ff)",-1)])),_:1})]),_:1},8,["modelValue"]),s(Mt,{modelValue:le.value.squash,"onUpdate:modelValue":t[19]||(t[19]=y=>le.value.squash=y)},{default:a(()=>[s(Me,{content:"将多个提交压缩为一个提交",placement:"top"},{default:a(()=>t[88]||(t[88]=[e("span",null,"压缩提交 (--squash)",-1)])),_:1})]),_:1},8,["modelValue"]),s(Mt,{modelValue:le.value.noCommit,"onUpdate:modelValue":t[20]||(t[20]=y=>le.value.noCommit=y)},{default:a(()=>[s(Me,{content:"执行合并但不自动创建提交",placement:"top"},{default:a(()=>t[89]||(t[89]=[e("span",null,"不自动提交 (--no-commit)",-1)])),_:1})]),_:1},8,["modelValue"])])]),_:1}),le.value.noFf&&!le.value.noCommit?(m(),oe($t,{key:0,label:"合并提交信息 (可选)"},{default:a(()=>[s(lt,{modelValue:le.value.message,"onUpdate:modelValue":t[21]||(t[21]=y=>le.value.message=y),type:"textarea",rows:3,placeholder:"输入自定义合并提交信息"},null,8,["modelValue"])]),_:1})):J("",!0)]),_:1})])]),_:1},8,["modelValue"]),s(bt,{title:"储藏列表 (Git Stash)",modelValue:B.value,"onUpdate:modelValue":t[24]||(t[24]=y=>B.value=y),width:"600px","close-on-click-modal":!1},{default:a(()=>[e("div",Do,[it((m(),oe(Ls,{data:l(u).stashes,stripe:"",style:{width:"100%"},"empty-text":"暂无储藏记录"},{default:a(()=>[s(Jt,{prop:"id",label:"ID",width:"100"}),s(Jt,{prop:"description",label:"描述"}),s(Jt,{label:"操作",width:"220"},{default:a(y=>[s(S,{size:"small",onClick:et=>Ie(y.row.id,!1),loading:l(u).isApplyingStash},{default:a(()=>t[92]||(t[92]=[h(" 应用 ")])),_:2},1032,["onClick","loading"]),s(S,{size:"small",type:"primary",onClick:et=>Ie(y.row.id,!0),loading:l(u).isApplyingStash},{default:a(()=>t[93]||(t[93]=[h(" 应用并删除 ")])),_:2},1032,["onClick","loading"]),s(S,{size:"small",type:"danger",onClick:et=>Xe(y.row.id),loading:l(u).isDroppingStash},{default:a(()=>t[94]||(t[94]=[h(" 删除 ")])),_:2},1032,["onClick","loading"])]),_:1})]),_:1},8,["data"])),[[Bs,l(u).isLoadingStashes]]),l(u).stashes.length>0?(m(),$("div",Ro,[s(S,{type:"danger",onClick:ft,loading:l(u).isDroppingStash},{default:a(()=>t[95]||(t[95]=[h(" 清空所有储藏 ")])),_:1},8,["loading"])])):J("",!0)])]),_:1},8,["modelValue"]),s(bt,{title:"储藏更改 (Git Stash)",modelValue:Re.value,"onUpdate:modelValue":t[28]||(t[28]=y=>Re.value=y),width:"500px","close-on-click-modal":!1},{footer:a(()=>[e("div",Eo,[s(S,{onClick:t[27]||(t[27]=y=>Re.value=!1)},{default:a(()=>t[98]||(t[98]=[h("取消")])),_:1}),s(S,{type:"primary",onClick:Ke,loading:l(u).isSavingStash},{default:a(()=>t[99]||(t[99]=[h(" 储藏 ")])),_:1},8,["loading"])])]),default:a(()=>[e("div",zo,[t[97]||(t[97]=e("p",null,"将当前工作区的更改储藏起来,稍后可以再次应用。",-1)),s(rs,{"label-position":"top"},{default:a(()=>[s($t,{label:"储藏说明 (可选)"},{default:a(()=>[s(lt,{modelValue:de.value,"onUpdate:modelValue":t[25]||(t[25]=y=>de.value=y),placeholder:"输入储藏说明(可选)",clearable:""},null,8,["modelValue"])]),_:1}),s($t,null,{default:a(()=>[s(Mt,{modelValue:pe.value,"onUpdate:modelValue":t[26]||(t[26]=y=>pe.value=y)},{default:a(()=>t[96]||(t[96]=[h(" 包含未跟踪文件 (--include-untracked) ")])),_:1},8,["modelValue"])]),_:1})]),_:1})])]),_:1},8,["modelValue"])])],2)}}}),jo=Ft(Go,[["__scopeId","data-v-a1d647fa"]]),Uo={class:"log-header"},Oo={class:"log-actions"},Po={key:0,class:"filter-panel-header"},Fo={class:"filter-form"},No={class:"filter-item"},Io={class:"filter-item"},Ho={class:"filter-item"},Xo={class:"filter-item"},Jo={class:"filter-actions"},Wo={key:0},qo={key:1,class:"content-area-content"},Yo={key:0,class:"graph-view"},Ko={key:0,class:"commit-count"},Zo={class:"graph-controls"},Qo={class:"zoom-controls"},en={class:"scale-info"},tn={key:1,class:"table-view-container"},sn=["id"],an=["onClick"],ln={class:"author-name"},on={key:0,class:"branch-container"};const nn={class:"commit-detail-container"},rn={key:0,class:"commit-info"},un={class:"commit-info-header"},cn={class:"info-item"},dn={class:"item-value"},fn={class:"info-item"},pn={class:"item-value"},vn={class:"info-item"},mn={class:"item-value"},gn={class:"commit-message-container"},hn=["innerHTML"],yn={class:"commit-files-diff"},wn={class:"files-list"},_n={key:1},bn=["onClick"],$n={class:"file-diff"},Cn={key:0},kn={key:1},Sn=["innerHTML"],St=.5,Rt=1.5,Qt=.1,Tn=jt({__name:"LogList",setup(ve,{expose:u}){const V=Vt();let v=[];const g=r(v),I=r(""),L=r(!1),F=ze(()=>V.isLoadingLog||L.value),W=r(!1),ne=r(0),U=r(!1),ee=r(null),M=r(1),T=r(!0),K=r(!1),q=r(null),Z=r(!1),H=r(null),be=r([]),ue=r(""),j=r(!1),le=r(""),O=r(1),ge=r(!1),se=r(!1),x=r([]),w=r(""),Y=r(null),G=r([]),R=r([]),ie=r([]),Be=r(!1),Ne=r(0),Re=r(0),B=r(null),de=r(new Map),pe=r([]),he=r(1),Ye=r(new Map),Ke=ze(()=>g.value);async function Ie(c=!1,i=1){if(!Vt().isGitRepo){I.value="当前目录不是Git仓库";return}try{i>1?K.value=!0:L.value=!0,console.log(`加载提交历史: page=${i}, all=${c}`);const C=new URLSearchParams;C.append("page",i.toString()),C.append("all",c.toString()),C.append("with_parents","true"),x.value.length>0&&C.append("author",x.value.join(",")),R.value.length>0&&C.append("branch",R.value.join(",")),w.value&&C.append("message",w.value),Y.value&&Array.isArray(Y.value)&&Y.value.length===2&&(C.append("dateFrom",Y.value[0]),C.append("dateTo",Y.value[1])),C.append("_t",Date.now().toString());const ce=await(await fetch(`/api/log?${C.toString()}`)).json();if(!ce||!ce.data||!Array.isArray(ce.data)){console.error("API返回的数据格式不正确:",ce),I.value="加载提交历史失败: 服务器返回数据格式不正确";return}const ae=i>1;ae?ce.data.forEach(A=>v.push(A)):(v.length=0,ce.data.forEach(A=>v.push(A))),g.value=[...v],M.value=i,ne.value=ce.total||v.length,T.value=ce.hasMore===!0,console.log(`加载完成: 当前页=${M.value}, 是否有更多=${T.value}, 总条数=${ne.value}`),T.value||console.log("已加载所有提交记录"),ae||(ge.value=!0,setTimeout(()=>{ge.value=!1},2e3)),!ae&&U.value?setTimeout(Xe,0):!ae&&!U.value&&!c&&tt(()=>{_(),setTimeout(Ve,200)}),I.value=""}catch(C){I.value="加载提交历史失败: "+(C instanceof Error?C.message:String(C)),console.error("加载日志失败:",C),i>1&&(T.value=!1)}finally{i>1?K.value=!1:L.value=!1}}async function Xe(){if(console.log(`开始渲染图表...数据长度: ${v.length}`),!ee.value){console.error("图表容器未找到");return}if(v.length===0){console.error("没有日志数据可渲染");return}try{ee.value.innerHTML="",console.log(`创建gitgraph实例,分支: ${V.currentBranch||"main"}`);const c=ta(ee.value,{orientation:"vertical-reverse",template:"metro",author:"提交者 <committer@example.com>"}),i={},b=c.branch(V.currentBranch||"main");i[V.currentBranch||"main"]=b,console.log(`开始创建提交图...共${v.length}条提交`),v.forEach((C,me)=>{let ce=b;if(C.branch){const ae=Pe(C.branch.split(",")[0]);i[ae]||(i[ae]=c.branch(ae)),ce=i[ae]}ce.commit({hash:C.hash,subject:C.message,author:`${C.author} <${C.email}>`}),me%10===0&&console.log(`已渲染 ${me+1}/${v.length} 个提交`)}),console.log("图表渲染完成"),setTimeout(()=>{ke()},100)}catch(c){console.error("渲染图表失败:",c),I.value="渲染图表失败: "+(c instanceof Error?c.message:String(c))}}function ft(){U.value=!U.value,U.value&&v.length>0&&setTimeout(Xe,0)}function Oe(){W.value=!W.value,W.value||(T.value=!0),M.value=1,Ie(W.value),tt(()=>{setTimeout(()=>{!U.value&&!W.value&&(_(),Ve())},300)})}function Pe(c){return c.includes("HEAD -> ")?c.replace("HEAD -> ",""):c.includes("origin/")?c:c.trim()}function at(c){return c.includes("HEAD")?"success":c.includes("origin/")?"warning":"info"}const Ee=r(null),re=r(null);function Je(c){if(U.value||!T.value||K.value||F.value)return;const i=c.target,{scrollTop:b,scrollHeight:C,clientHeight:me}=i,ce=C-b-me;console.log("表格滚动:",{scrollTop:b,scrollHeight:C,clientHeight:me,scrollDistance:ce,hasMoreData:T.value,isLoadingMore:K.value,isLoading:F.value}),ce<=20&&(console.log("已滚动到底部,加载更多数据"),ut())}function _(){if(console.log("设置表格滚动监听 - 开始"),!Ee.value){console.error("tableRef.value 不存在");return}const c=Ee.value.$el.querySelector(".el-table__body-wrapper");if(!c){console.error("未找到表格的body-wrapper元素");return}console.log("找到表格的body-wrapper元素"),re.value=c,re.value&&(re.value.removeEventListener("scroll",Je,!0),re.value.addEventListener("scroll",Je,!0),console.log("成功添加表格滚动监听"))}function n(){console.log("移除表格滚动监听 - 开始"),re.value?(re.value.removeEventListener("scroll",Je,!0),console.log("成功移除表格滚动监听"),re.value=null):console.log("tableBodyWrapper.value 不存在,无需移除监听")}function N(c){c.key==="Escape"&&ye.value&&(ye.value=!1)}Lt(()=>{V.isGitRepo?(V.log.length>0?(console.log("使用已加载的日志数据"),v.length=0,V.log.forEach(c=>v.push(c)),ne.value=V.log.length,U.value?setTimeout(()=>{console.log(`准备渲染图表,数据长度: ${v.length}`),Xe()},100):setTimeout(()=>{mt()},100)):(console.log("初始加载日志数据"),Ie()),wt()):I.value="当前目录不是Git仓库",tt(()=>{setTimeout(()=>{_()},500)}),tt(()=>{setTimeout(()=>{U.value||mt()},500)}),nt(()=>Ee.value,c=>{c&&!U.value&&!W.value&&(console.log("表格引用已创建,设置滚动监听"),tt(()=>{_()}))}),window.addEventListener("keydown",N)}),nt(()=>V.allBranches,c=>{c&&c.length>0?(ie.value=[...c].sort(),console.log(`分支数据更新,共 ${ie.value.length} 个分支`)):(ie.value=[],console.warn("gitStore 中没有分支数据"))},{immediate:!0}),Is(()=>{n(),q.value!==null&&(window.clearInterval(q.value),q.value=null),window.removeEventListener("keydown",N)});function E(c,i){let b=null;return function(...C){b&&clearTimeout(b),b=window.setTimeout(()=>{c(...C),b=null},i)}}const Te=E(mt,200);async function $e(){await V.fetchLog(!0),v.length=0,V.log.forEach(c=>v.push(c)),g.value=[...v],ne.value=V.log.length,M.value=1,T.value=!1,ge.value=!0,setTimeout(()=>{ge.value=!1},2e3),U.value?(await tt(),Xe()):(de.value.clear(),pe.value=[],he.value=1,await tt(),Te())}nt(()=>V.log,c=>{console.log("监听到gitStore.log变化,更新图表数据");try{v.length=0,Array.isArray(c)&&c.forEach(i=>i&&v.push(i)),ne.value=v.length,M.value=1,g.value=[...v],ge.value=!0,setTimeout(()=>{ge.value=!1},2e3),console.log(`数据更新完成,共${g.value.length}条记录,准备渲染图表`),U.value&&v.length>0&&setTimeout(Xe,0)}catch(i){console.error("更新日志数据失败:",i)}},{immediate:!0}),u({refreshLog:$e});function Ce(){O.value<Rt&&(O.value=Math.min(Rt,O.value+Qt),Ae())}function xe(){O.value>St&&(O.value=Math.max(St,O.value-Qt),Ae())}function Ae(){if(!ee.value)return;const c=ee.value.querySelector("svg");c&&(c.style.transform=`scale(${O.value})`,c.style.transformOrigin="top left")}function ke(){if(!ee.value)return;const c=ee.value.querySelector("svg");if(!c)return;const i=c.getBoundingClientRect().width/O.value,b=ee.value.clientWidth;i>b?O.value=Math.max(St,b/i):O.value=1,Ae()}async function Se(c){if(c){H.value=c,Z.value=!0,j.value=!0,be.value=[],ue.value="",le.value="",console.log("提交详情对象:",JSON.stringify(c,null,2)),console.log("哈希值类型和长度:",typeof c.hash,c.hash?c.hash.length:0),console.log("提交信息类型和长度:",typeof c.message,c.message?c.message.length:0),console.log("提交分支:",c.branch);try{if(console.log(`获取提交详情: ${c.hash}`),!c.hash||c.hash.length<7){console.error("无效的提交哈希值:",c.hash),ue.value="无效的提交哈希值",j.value=!1;return}const i=await fetch(`/api/commit-files?hash=${c.hash}`);console.log("API响应状态: ",i.status);const b=await i.json();console.log("文件列表数据: ",b),b.success&&Array.isArray(b.files)?(be.value=b.files,be.value.length>0?await rt(c.hash,be.value[0]):(console.log("没有找到变更文件"),ue.value="该提交没有变更文件")):(console.error("获取提交文件列表失败:",b.error||"未知错误"),ue.value=`获取文件列表失败: ${b.error||"未知错误"}`)}catch(i){console.error("获取提交详情失败:",i),ue.value=`获取提交详情失败: ${i.message}`}finally{j.value=!1}}}async function rt(c,i){j.value=!0,le.value=i;try{console.log(`获取文件差异: hash=${c}, file=${i}`);const b=await fetch(`/api/commit-file-diff?hash=${c}&file=${encodeURIComponent(i)}`);console.log("差异API响应状态: ",b.status);const C=await b.json();console.log("差异数据: ",C.success,typeof C.diff),C.success?ue.value=C.diff||"没有变更内容":(console.error("获取差异失败: ",C.error),ue.value=`获取差异失败: ${C.error||"未知错误"}`)}catch(b){console.error("获取文件差异失败:",b),ue.value=`获取差异失败: ${b.message}`}finally{j.value=!1}}function pt(c){if(!c)return"";const i=c.split(`
|
|
20
|
+
`);function b(C){return C.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}return i.map(C=>{const me=b(C);return C.startsWith("diff --git")?`<div class="diff-header">${me}</div>`:C.startsWith("---")?`<div class="diff-old-file">${me}</div>`:C.startsWith("+++")?`<div class="diff-new-file">${me}</div>`:C.startsWith("@@")?`<div class="diff-hunk-header">${me}</div>`:C.startsWith("+")?`<div class="diff-added">${me}</div>`:C.startsWith("-")?`<div class="diff-removed">${me}</div>`:`<div class="diff-context">${me}</div>`}).join("")}function X(c){return c?(console.log("格式化前的提交信息:",c),console.log("提交信息中的换行符数量:",(c.match(/\n/g)||[]).length),c.trim()):"(无提交信息)"}function ut(){if(!T.value||K.value||F.value){console.log("不满足加载更多条件:",{hasMoreData:T.value,isLoadingMore:K.value,isLoading:F.value});return}console.log(`加载更多日志,当前页码: ${M.value},下一页: ${M.value+1}`),Ie(W.value,M.value+1)}function ct(){x.value=[],R.value=[],w.value="",Y.value=null,M.value=1,Ie(W.value,1)}function vt(){M.value=1,Ie(W.value,1)}async function wt(){try{console.log("获取所有可用作者...");const i=await(await fetch("/api/authors")).json();i.success&&Array.isArray(i.authors)?(G.value=i.authors.sort(),console.log(`获取到${G.value.length}位作者`)):(console.warn("从API获取作者列表失败,将从现有日志中提取作者列表"),Ze())}catch(c){console.error("获取作者列表失败:",c),Ze()}}function Ze(){const c=new Set;g.value.forEach(i=>{i.author&&c.add(i.author)}),G.value=Array.from(c).sort(),console.log(`从现有日志中提取了${G.value.length}位作者`)}function mt(){!Ee.value||U.value||(de.value.clear(),pe.value=[],he.value=1,_t(),tt(()=>{ht()}))}function _t(){de.value.clear(),pe.value=[],Ye.value.clear();const c=new Map,i=new Map;g.value.forEach(Q=>{Q.hash&&(Q.parents&&Q.parents.length>0?(c.set(Q.hash,[...Q.parents]),Q.parents.forEach(we=>{var _e;i.has(we)||i.set(we,[]),(_e=i.get(we))==null||_e.push(Q.hash)})):c.set(Q.hash,[]))});const b=0,C="#2196f3",me=["#e91e63","#4caf50","#ff9800","#9c27b0","#00bcd4","#ff5722","#607d8b"],ce=new Map;g.value.forEach(Q=>{if(!Q.hash||!Q.branch)return;const we=Q.branch.match(/(HEAD -> |origin\/)?([^\s,]+)/g);if(we&&we.length>0){const _e=we.find(fe=>fe.includes("HEAD -> "));if(_e){const fe=_e.replace("HEAD -> ","").trim();ce.set(Q.hash,fe)}else{const fe=we[0].replace("origin/","").trim();ce.set(Q.hash,fe)}}});const ae=new Map;let A=0;ae.set("main",b),ae.set("master",b),A++;const Le=new Map;Le.set("main",C),Le.set("master",C);const Qe=new Map;return g.value.forEach((Q,we)=>{if(!Q.hash)return;const _e=Q.hash,fe=ce.get(_e)||"main";if(!ae.has(fe)){ae.set(fe,A++);const k=(ae.get(fe)||0)%me.length;Le.set(fe,me[k])}const ot=ae.get(fe)||0;Qe.set(_e,ot),de.value.set(_e,{hash:_e,parents:Q.parents||[],column:ot,row:we,branch:fe}),Ye.value.has(fe)||Ye.value.set(fe,{name:fe,color:Le.get(fe)||C,column:ot})}),g.value.forEach((Q,we)=>{if(!Q.hash||!Q.parents||Q.parents.length===0)return;const _e=de.value.get(Q.hash);if(!_e)return;const fe=_e.column,ot=_e.branch||"main",k=Le.get(ot)||C;Q.parents.forEach((P,Nt)=>{const f=g.value.findIndex(Me=>Me.hash===P);if(f<0)return;const t=de.value.get(P);if(!t)return;const S=t.column,qe=t.branch||"main",It=Le.get(qe)||C;let Ct=k;Q.parents&&Q.parents.length>1&&Nt>0&&(Ct=It),pe.value.push({fromRow:we,fromColumn:fe,toRow:f,toColumn:S,color:Ct})})}),he.value=A,{mainBranchColor:C,branchColorMap:Le}}let gt=!1;function ht(){if(gt){console.log("已有渲染进行中,跳过");return}try{gt=!0;const c=new Map;c.set("main","#2196f3"),c.set("master","#2196f3");const i="#2196f3";if(pe.value.length===0){if(console.log("branchLines为空,重新计算"),_t(),pe.value.length===0&&g.value.length>1){console.log("创建默认分支线");for(let b=0;b<g.value.length-1;b++)g.value[b].hash&&g.value[b+1].hash&&pe.value.push({fromRow:b,fromColumn:0,toRow:b+1,toColumn:0,color:i})}}else console.log(`使用现有分支线,数量: ${pe.value.length}`);g.value.forEach((b,C)=>{if(!b.hash)return;const me=`commit-graph-${b.hash.substring(0,7)}`,ce=document.getElementById(me);if(!ce||ce.querySelector("svg"))return;const ae=document.createElementNS("http://www.w3.org/2000/svg","svg");ae.setAttribute("width","100%"),ae.setAttribute("height","100%"),ae.setAttribute("viewBox","0 0 100 100"),ae.style.display="block",ae.style.overflow="visible",ce.innerHTML="",ce.appendChild(ae);const A=de.value.get(b.hash);if(!A)return;const Le=20,Qe=10+A.column*Le,Q=50,we=[];for(const k of pe.value)k.fromRow<C&&k.toRow>C&&we.push({...k,type:"through",x:10+k.fromColumn*Le});for(const k of pe.value)k.fromRow===C&&we.push({...k,type:"from",fromX:10+k.fromColumn*Le,toX:10+k.toColumn*Le});for(const k of pe.value)k.toRow===C&&we.push({...k,type:"to",fromX:10+k.fromColumn*Le,toX:10+k.toColumn*Le});we.length===0&&C<g.value.length-1&&(pe.value.length>0?we.push({...pe.value[0],type:"from",fromX:Qe,toX:Qe}):we.push({type:"from",fromX:Qe,toX:Qe,fromRow:C,fromColumn:0,toRow:C+1,toColumn:0,color:i})),we.filter(k=>k.type==="through").forEach(k=>{const P=document.createElementNS("http://www.w3.org/2000/svg","line");P.setAttribute("x1",k.x.toString()),P.setAttribute("y1","-20"),P.setAttribute("x2",k.x.toString()),P.setAttribute("y2","120"),P.setAttribute("stroke",k.color),P.setAttribute("stroke-width","2"),ae.appendChild(P)}),we.filter(k=>k.type==="to").forEach(k=>{if(k.fromColumn===k.toColumn){const P=document.createElementNS("http://www.w3.org/2000/svg","line");P.setAttribute("x1",k.toX.toString()),P.setAttribute("y1","-20"),P.setAttribute("x2",k.toX.toString()),P.setAttribute("y2",Q.toString()),P.setAttribute("stroke",k.color),P.setAttribute("stroke-width","2"),ae.appendChild(P)}else{const P=document.createElementNS("http://www.w3.org/2000/svg","path");k.fromColumn<k.toColumn?P.setAttribute("d",`M${k.fromX},-20 C${k.fromX},15 ${k.toX},30 ${k.toX},${Q}`):P.setAttribute("d",`M${k.fromX},-20 C${k.fromX},15 ${k.toX},30 ${k.toX},${Q}`),P.setAttribute("stroke",k.color),P.setAttribute("stroke-width","2"),P.setAttribute("fill","none"),ae.appendChild(P)}}),we.filter(k=>k.type==="from").forEach(k=>{if(k.fromColumn===k.toColumn){const P=document.createElementNS("http://www.w3.org/2000/svg","line");P.setAttribute("x1",k.fromX.toString()),P.setAttribute("y1",Q.toString()),P.setAttribute("x2",k.fromX.toString()),P.setAttribute("y2","120"),P.setAttribute("stroke",k.color),P.setAttribute("stroke-width","2"),ae.appendChild(P)}else{const P=document.createElementNS("http://www.w3.org/2000/svg","path");k.fromColumn<k.toColumn?P.setAttribute("d",`M${k.fromX},${Q} C${k.fromX},70 ${k.toX},85 ${k.toX},120`):P.setAttribute("d",`M${k.fromX},${Q} C${k.fromX},70 ${k.toX},85 ${k.toX},120`),P.setAttribute("stroke",k.color),P.setAttribute("stroke-width","2"),P.setAttribute("fill","none"),ae.appendChild(P)}});const _e=document.createElementNS("http://www.w3.org/2000/svg","circle");_e.setAttribute("cx",Qe.toString()),_e.setAttribute("cy",Q.toString()),_e.setAttribute("r","6");const fe=A.branch||"",ot=c.get(fe)||i;_e.setAttribute("fill",ot),_e.setAttribute("stroke","#fff"),_e.setAttribute("stroke-width","2"),ae.appendChild(_e)})}catch(c){console.error("渲染分支图失败:",c),I.value="渲染分支图失败: "+(c instanceof Error?c.message:String(c))}finally{gt=!1}}nt(()=>g.value,()=>{tt(()=>{U.value||Te()})},{deep:!0});function p(c,i,b){console.log("handleContextMenu",c,i,b),b.preventDefault(),Ne.value=b.clientY,Re.value=b.clientX,B.value=c,Be.value=!0;const C=()=>{Be.value=!1,document.removeEventListener("click",C)};setTimeout(()=>{document.addEventListener("click",C)},0)}async function d(c){if(c)try{await st.confirm(`确定要撤销提交 ${c.hash.substring(0,7)} 吗?这将创建一个新的提交来撤销这次提交的更改。`,"撤销提交确认",{confirmButtonText:"确认",cancelButtonText:"取消",type:"warning"});const b=await(await fetch("/api/revert-commit",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({hash:c.hash})})).json();b.success?(o.success(b.message||"已成功撤销提交"),$e(),V.fetchStatus(),V.getBranchStatus()):o.error(b.error||"撤销提交失败")}catch(i){i!=="cancel"&&(console.error("撤销提交出错:",i),o.error("撤销提交失败: "+(i.message||i)))}}async function z(c){if(c)try{await st.confirm(`确定要将提交 ${c.hash.substring(0,7)} Cherry-Pick 到当前分支吗?`,"Cherry-Pick确认",{confirmButtonText:"确认",cancelButtonText:"取消",type:"warning"});const b=await(await fetch("/api/cherry-pick-commit",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({hash:c.hash})})).json();b.success?(o.success(b.message||"已成功Cherry-Pick提交"),$e(),V.fetchStatus(),V.getBranchStatus()):o.error(b.error||"Cherry-Pick提交失败")}catch(i){i!=="cancel"&&(console.error("Cherry-Pick提交出错:",i),o.error("Cherry-Pick提交失败: "+(i.message||i)))}}async function te(c){if(c)try{await navigator.clipboard.writeText(c.hash),o.success(`已复制提交哈希: ${c.hash.substring(0,7)}`)}catch(i){console.error("复制提交哈希失败:",i),o.error(`复制提交哈希失败: ${i.message}`)}}async function We(c){if(c)try{await st.confirm(`确定要将当前分支重置(hard)到提交 ${c.hash.substring(0,7)} 吗?
|
|
21
|
+
|
|
22
|
+
警告:这将丢失该提交之后的所有更改!`,"重置确认",{confirmButtonText:"确认重置",cancelButtonText:"取消",type:"warning",dangerouslyUseHTMLString:!0});const b=await(await fetch("/api/reset-to-commit",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({hash:c.hash})})).json();b.success?(o.success(b.message||"已成功重置到指定提交"),$e(),V.fetchStatus(),V.getBranchStatus()):o.error(b.error||"重置到指定提交失败")}catch(i){i!=="cancel"&&(console.error("重置到指定提交出错:",i),o.error("重置到指定提交失败: "+(i.message||i)))}}function Ve(){if(console.log("检查是否需要加载更多数据"),U.value||!T.value||K.value||F.value||W.value){console.log("不满足加载条件:",{showGraphView:U.value,hasMoreData:T.value,isLoadingMore:K.value,isLoading:F.value,showAllCommits:W.value});return}if(!re.value){console.log("表格容器不存在,重新设置滚动监听"),_();return}const{scrollTop:c,scrollHeight:i,clientHeight:b}=re.value,C=i-c-b;console.log("表格滚动位置:",{scrollTop:c,scrollHeight:i,clientHeight:b,scrollDistance:C}),C<=50&&(console.log("表格已滚动到底部,加载更多数据"),ut())}nt(()=>U.value,c=>{!c&&!W.value&&(console.log("切换到表格视图,设置滚动监听和定时检查"),tt(()=>{_(),setTimeout(Ve,200)}))});const ye=r(!1);function Ge(){ye.value=!ye.value,tt(()=>{U.value&&ee.value&&Xe()})}return(c,i)=>{var ae;const b=Ot,C=ts,me=_s,ce=ss;return m(),$(De,null,[e("div",{class:Fe(["card",{"fullscreen-mode":ye.value}])},[e("div",Uo,[i[13]||(i[13]=e("div",{class:"header-left"},[e("h2",null,"提交历史")],-1)),e("div",Oo,[U.value?J("",!0):(m(),oe(l(He),{key:0,type:se.value?"primary":"default",size:"small",onClick:i[0]||(i[0]=A=>se.value=!se.value),class:Fe(["action-button filter-button icon-only-button",{"active-filter":se.value}])},{icon:a(()=>[s(b,null,{default:a(()=>[s(l(Hs))]),_:1})]),_:1},8,["type","class"])),s(l(He),{type:"primary",size:"small",onClick:ft,class:Fe(["action-button view-mode-button icon-only-button",{"active-view":U.value}])},{icon:a(()=>[s(b,null,{default:a(()=>[(m(),oe(Yt(U.value?l(ys):l(Xs))))]),_:1})]),_:1},8,["class"]),it(s(l(He),{type:"success",size:"small",onClick:Oe,loading:F.value,class:Fe(["action-button commit-display-button",{"active-commits":W.value}])},{icon:a(()=>[s(b,null,{default:a(()=>[(m(),oe(Yt(W.value?l(Js):l(Ws))))]),_:1})]),default:a(()=>[h(" "+D(W.value?"显示分页加载":"显示所有提交"),1)]),_:1},8,["loading","class"]),[[zt,!1]]),s(l(He),{type:"info",size:"small",onClick:Ge,class:Fe(["action-button fullscreen-button icon-only-button",{"active-fullscreen":ye.value}])},{icon:a(()=>[s(b,null,{default:a(()=>[(m(),oe(Yt(ye.value?l(es):l(qs))))]),_:1})]),_:1},8,["class"]),s(l(He),{circle:"",size:"small",onClick:i[1]||(i[1]=A=>$e()),class:Fe([{"refresh-button-animated":ge.value},"action-button refresh-button"])},{default:a(()=>[F.value?(m(),oe(b,{key:1},{default:a(()=>[s(l(Ys))]),_:1})):(m(),oe(b,{key:0},{default:a(()=>[s(l(as))]),_:1}))]),_:1},8,["class"])])]),se.value&&!U.value?(m(),$("div",Po,[e("div",Fo,[e("div",No,[s(l(Gt),{modelValue:x.value,"onUpdate:modelValue":i[2]||(i[2]=A=>x.value=A),placeholder:"选择作者",multiple:"",clearable:"",filterable:"",class:"filter-input",size:"small"},{prefix:a(()=>i[14]||(i[14]=[e("span",{class:"compact-label"},"作者",-1)])),default:a(()=>[(m(!0),$(De,null,Ue(G.value,A=>(m(),oe(l(Et),{key:A,label:A,value:A},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])]),e("div",Io,[s(l(Gt),{modelValue:R.value,"onUpdate:modelValue":i[3]||(i[3]=A=>R.value=A),placeholder:"选择分支",multiple:"",clearable:"",filterable:"",class:"filter-input",size:"small"},{prefix:a(()=>i[15]||(i[15]=[e("span",{class:"compact-label"},"分支",-1)])),default:a(()=>[(m(!0),$(De,null,Ue(ie.value,A=>(m(),oe(l(Et),{key:A,label:A,value:A},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])]),e("div",Ho,[s(l(ls),{modelValue:w.value,"onUpdate:modelValue":i[4]||(i[4]=A=>w.value=A),placeholder:"提交信息关键词",clearable:"",class:"filter-input",size:"small"},{prefix:a(()=>i[16]||(i[16]=[e("span",{class:"compact-label"},"信息",-1)])),_:1},8,["modelValue"])]),e("div",Xo,[s(l(Ks),{modelValue:Y.value,"onUpdate:modelValue":i[5]||(i[5]=A=>Y.value=A),type:"daterange","range-separator":"至","start-placeholder":"开始日期","end-placeholder":"结束日期",format:"YYYY-MM-DD","value-format":"YYYY-MM-DD",class:"filter-input date-range",size:"small"},{prefix:a(()=>i[17]||(i[17]=[e("span",{class:"compact-label"},"日期",-1)])),_:1},8,["modelValue"])]),e("div",Jo,[s(l(He),{type:"primary",size:"small",onClick:vt,class:"filter-action-button"},{default:a(()=>i[18]||(i[18]=[h("应用")])),_:1}),s(l(He),{type:"info",size:"small",onClick:ct,class:"filter-action-button"},{default:a(()=>i[19]||(i[19]=[h("重置")])),_:1})])])])):J("",!0),e("div",{class:Fe(["content-area",{"with-filter":se.value&&!U.value}])},[I.value?(m(),$("div",Wo,D(I.value),1)):(m(),$("div",qo,[U.value?(m(),$("div",Yo,[l(v).length>0?(m(),$("div",Ko," 显示 "+D(l(v).length)+" 条提交记录 "+D(W.value?"(全部)":"(分页加载,每页100条)"),1)):J("",!0),e("div",Zo,[e("div",Qo,[s(l(He),{type:"primary",circle:"",size:"small",onClick:xe,disabled:O.value<=St},{default:a(()=>[s(b,null,{default:a(()=>[s(l(Zs))]),_:1})]),_:1},8,["disabled"]),s(l(Qs),{modelValue:O.value,"onUpdate:modelValue":i[6]||(i[6]=A=>O.value=A),min:St,max:Rt,step:Qt,onChange:Ae,class:"zoom-slider"},null,8,["modelValue"]),s(l(He),{type:"primary",circle:"",size:"small",onClick:Ce,disabled:O.value>=Rt},{default:a(()=>[s(b,null,{default:a(()=>[s(l(ea))]),_:1})]),_:1},8,["disabled"]),s(l(He),{type:"primary",size:"small",onClick:ke},{default:a(()=>i[20]||(i[20]=[h(" 自适应大小 ")])),_:1})]),e("div",en," 缩放: "+D(Math.round(O.value*100))+"% ",1)]),e("div",{ref_key:"graphContainer",ref:ee,class:"graph-container"},null,512)])):(m(),$("div",tn,[it((m(),oe(l(ks),{ref_key:"tableRef",ref:Ee,data:Ke.value,stripe:"",border:"",class:"log-table","empty-text":F.value?"加载中...":"没有匹配的提交记录",height:"500",onRowContextmenu:p},{default:a(()=>[s(l(yt),{width:"60","class-name":"branch-graph-column"},{default:a(A=>[e("div",{class:"branch-graph-cell",id:`commit-graph-${A.row.hash.substring(0,7)}`},null,8,sn)]),_:1}),s(l(yt),{label:"提交哈希",width:"100",resizable:""},{default:a(A=>[e("span",{class:"commit-hash",onClick:Le=>Se(A.row)},D(A.row.hash.substring(0,7)),9,an)]),_:1}),s(l(yt),{prop:"date",label:"日期",width:"120",resizable:""}),s(l(yt),{label:"作者",width:"120",resizable:""},{default:a(A=>[s(C,{content:A.row.email,placement:"top","hide-after":1e3},{default:a(()=>[e("span",ln,D(A.row.author),1)]),_:2},1032,["content"])]),_:1}),s(l(yt),{label:"分支",width:"180",resizable:""},{default:a(A=>[A.row.branch?(m(),$("div",on,[(m(!0),$(De,null,Ue(A.row.branch.split(","),(Le,Qe)=>(m(),oe(l(Ut),{key:Qe,size:"small",type:at(Le),class:"branch-tag"},{default:a(()=>[h(D(Pe(Le)),1)]),_:2},1032,["type"]))),128))])):J("",!0)]),_:1}),s(l(yt),{prop:"message",label:"提交信息","min-width":"250"})]),_:1},8,["data","empty-text"])),[[ce,F.value]]),(W.value,J("",!0))]))]))],2),s(l(Pt),{modelValue:Z.value,"onUpdate:modelValue":i[7]||(i[7]=A=>Z.value=A),title:`提交详情: ${(ae=H.value)!=null&&ae.hash?H.value.hash.substring(0,7):"未知"}`,width:"80%","destroy-on-close":"",class:"commit-detail-dialog"},{default:a(()=>[it((m(),$("div",nn,[H.value?(m(),$("div",rn,[e("div",un,[e("div",cn,[i[24]||(i[24]=e("span",{class:"item-label"},"哈希:",-1)),e("span",dn,D(H.value.hash),1)]),e("div",fn,[i[25]||(i[25]=e("span",{class:"item-label"},"作者:",-1)),e("span",pn,D(H.value.author)+" <"+D(H.value.email)+">",1)]),e("div",vn,[i[26]||(i[26]=e("span",{class:"item-label"},"日期:",-1)),e("span",mn,D(H.value.date),1)])]),e("div",gn,[i[27]||(i[27]=e("div",{class:"message-label"},"提交信息:",-1)),e("div",{class:"message-content",innerHTML:X(H.value.message).replace(/\n/g,"<br>")},null,8,hn)])])):J("",!0),e("div",yn,[e("div",wn,[i[28]||(i[28]=e("h3",null,"变更文件",-1)),be.value.length===0?(m(),oe(me,{key:0,description:"没有找到变更文件"})):(m(),$("ul",_n,[(m(!0),$(De,null,Ue(be.value,A=>(m(),$("li",{key:A,class:Fe({"active-file":A===le.value}),onClick:Le=>rt(H.value.hash,A)},D(A),11,bn))),128))]))]),e("div",$n,[le.value?(m(),$("h3",Cn," 文件差异: "+D(le.value),1)):(m(),$("h3",kn,"文件差异")),!ue.value&&!j.value?(m(),oe(me,{key:2,description:"选择文件查看差异"})):ue.value?(m(),$("div",{key:3,innerHTML:pt(ue.value),class:"diff-content"},null,8,Sn)):J("",!0)])])])),[[ce,j.value]])]),_:1},8,["modelValue","title"])],2),it(e("div",{class:Fe(["context-menu",{"fullscreen-context-menu":ye.value}]),style:Tt({top:Ne.value+"px",left:Re.value+"px"})},[e("div",{class:"context-menu-item",onClick:i[8]||(i[8]=A=>Se(B.value))},i[29]||(i[29]=[e("i",{class:"el-icon-view"},null,-1),h(" 查看详情 ")])),e("div",{class:"context-menu-item",onClick:i[9]||(i[9]=A=>te(B.value))},i[30]||(i[30]=[e("i",{class:"el-icon-document-copy"},null,-1),h(" 复制提交哈希 ")])),e("div",{class:"context-menu-item",onClick:i[10]||(i[10]=A=>We(B.value))},i[31]||(i[31]=[e("i",{class:"el-icon-refresh-right"},null,-1),h(" 重置到该提交(hard) ")])),e("div",{class:"context-menu-item",onClick:i[11]||(i[11]=A=>d(B.value))},i[32]||(i[32]=[e("i",{class:"el-icon-delete"},null,-1),h(" 撤销提交 (Revert) ")])),e("div",{class:"context-menu-item",onClick:i[12]||(i[12]=A=>z(B.value))},i[33]||(i[33]=[e("i",{class:"el-icon-edit"},null,-1),h(" Cherry-Pick 到当前分支 ")]))],6),[[zt,Be.value]])],64)}}}),xn=Ft(Tn,[["__scopeId","data-v-f12ff603"]]),Vn="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",Ln={class:"main-header"},Bn={class:"header-left"},An=["src"],Mn={class:"header-info"},Dn={key:0,id:"user-info"},Rn={class:"user-name"},zn={class:"user-email"},En={key:1,id:"user-info"},Gn={class:"directory-selector"},jn={class:"directory-display"},Un={class:"directory-icon"},On=["title"],Pn={class:"directory-actions"},Fn={class:"main-container"},Nn={key:0,class:"loading-container"},In={class:"loading-spinner"},Hn={key:1,class:"grid-layout"},Xn={class:"git-status-panel"},Jn={key:0,class:"commit-form-panel"},Wn={key:0,class:"card"},qn={class:"tips"},Yn={key:1,class:"commit-form-panel"},Kn={key:2,class:"log-list-panel"},Zn={class:"dialog-footer"},Qn={class:"main-footer"},ei={key:0,class:"branch-info"},ti={class:"branch-wrapper"},si={key:1,class:"footer-right"},ai={class:"repo-url"},li={class:"dialog-footer"},oi={class:"directory-input-group"},ni={class:"recent-directories"},ii={class:"dialog-footer"},ri=jt({__name:"App",setup(ve){const u=r(""),V=r(null),v=r(null),g=Vt(),I=Ss(),L=r(!1),F=r("");function W(){I.config&&(u.value=`默认提交信息: ${I.config.defaultCommitMessage}`)}async function ne(){try{const n=await(await fetch("/api/current_directory")).json();return F.value=n.directory||"未知目录",n}catch(_){return console.error("获取当前目录失败:",_),{directory:"未知目录",isGitRepo:!1}}}Lt(async()=>{console.log("---------- 页面初始化开始 ----------");try{const _=await ne();I.isLoaded||await I.loadConfig(),W(),g.isGitRepo=_.isGitRepo===!0,g.lastCheckedTime=Date.now(),g.isGitRepo?await Promise.all([g.getCurrentBranch(),g.getAllBranches(),g.getUserInfo(),g.getRemoteUrl()]):o.warning("当前目录不是Git仓库,部分功能将不可用")}catch(_){console.error("初始化失败:",_)}finally{L.value=!0,console.log("---------- 页面初始化完成 ----------"),setTimeout(()=>{R()},100)}});const U=r(!1),ee=r(""),M=r("");async function T(){await g.createBranch(ee.value,M.value)&&(U.value=!1,ee.value="",v.value&&v.value.refreshStatus(),V.value&&V.value.refreshLog())}function K(){M.value=g.currentBranch,U.value=!0}async function q(_){await g.changeBranch(_)&&(v.value&&v.value.refreshStatus(),V.value&&V.value.refreshLog())}const Z=r(!1),H=r(""),be=r("");function ue(){H.value=g.userName,be.value=g.userEmail,Z.value=!0}async function j(){if(!H.value||!be.value){o.warning("用户名和邮箱不能为空");return}await g.restoreUserConfig(H.value,be.value)&&(Z.value=!1)}async function le(){await g.clearUserConfig()&&(H.value="",be.value="")}let O=!1,ge=!1,se=0,x=0,w="",Y="";function G(){const _=document.querySelector(".grid-layout");if(!_)return;const n=getComputedStyle(_).gridTemplateColumns.split(" "),N=getComputedStyle(_).gridTemplateRows.split(" ");if(n.length>=3&&N.length>=3){const E=parseFloat(n[0]),Te=parseFloat(n[2]),$e=E+Te,Ce=E/$e,xe=parseFloat(N[0]),Ae=parseFloat(N[2]),ke=xe+Ae,Se=xe/ke;localStorage.setItem("zen-gitsync-layout-left-ratio",Ce.toString()),localStorage.setItem("zen-gitsync-layout-top-ratio",Se.toString()),console.log(`布局比例已保存 - 左侧: ${(Ce*100).toFixed(0)}%, 上方: ${(Se*100).toFixed(0)}%`)}}function R(){const _=document.querySelector(".grid-layout");if(!_)return;const n=localStorage.getItem("zen-gitsync-layout-left-ratio"),N=localStorage.getItem("zen-gitsync-layout-top-ratio");if(n){const E=parseFloat(n),Te=1-E;_.style.gridTemplateColumns=`${E}fr 8px ${Te}fr`,console.log(`已恢复左侧比例: ${(E*100).toFixed(0)}%`)}else _.style.gridTemplateColumns="1fr 8px 3fr";if(N){const E=parseFloat(N),Te=1-E;_.style.gridTemplateRows=`${E}fr 8px ${Te}fr`,console.log(`已恢复上方比例: ${(E*100).toFixed(0)}%`)}}function ie(_){var N;O=!0,se=_.clientX;const n=document.querySelector(".grid-layout");w=getComputedStyle(n).gridTemplateColumns,(N=document.getElementById("v-resizer"))==null||N.classList.add("active"),document.addEventListener("mousemove",Be),document.addEventListener("mouseup",Ne),_.preventDefault()}function Be(_){if(!O)return;const n=document.querySelector(".grid-layout"),N=_.clientX-se,E=w.split(" ");if(E.length>=3){const Te=parseFloat(E[0]),$e=parseFloat(E[2]),Ce=Te+$e,xe=(Te+N/n.clientWidth*Ce)/Ce,Ae=1-xe,ke=.1,Se=.5;xe<ke?n.style.gridTemplateColumns=`${ke}fr 8px ${1-ke}fr`:xe>Se?n.style.gridTemplateColumns=`${Se}fr 8px ${1-Se}fr`:n.style.gridTemplateColumns=`${xe}fr 8px ${Ae}fr`}}function Ne(){var _;O=!1,(_=document.getElementById("v-resizer"))==null||_.classList.remove("active"),document.removeEventListener("mousemove",Be),document.removeEventListener("mouseup",Ne),G()}function Re(_){var N;ge=!0,x=_.clientY;const n=document.querySelector(".grid-layout");Y=getComputedStyle(n).gridTemplateRows,(N=document.getElementById("h-resizer"))==null||N.classList.add("active"),document.addEventListener("mousemove",B),document.addEventListener("mouseup",de),_.preventDefault()}function B(_){if(!ge)return;const n=document.querySelector(".grid-layout"),N=_.clientY-x,E=Y.split(" ");if(E.length>=3){const Te=parseFloat(E[0]),$e=parseFloat(E[2]),Ce=Te+$e,xe=(Te+N/n.clientHeight*Ce)/Ce,Ae=1-xe,ke=.2,Se=.8;xe<ke?n.style.gridTemplateRows=`${ke}fr 8px ${1-ke}fr`:xe>Se?n.style.gridTemplateRows=`${Se}fr 8px ${1-Se}fr`:n.style.gridTemplateRows=`${xe}fr 8px ${Ae}fr`}}function de(){var _;ge=!1,(_=document.getElementById("h-resizer"))==null||_.classList.remove("active"),document.removeEventListener("mousemove",B),document.removeEventListener("mouseup",de),G()}const pe=r(!1),he=r(""),Ye=r(!1),Ke=r([]);async function Ie(){if(!F.value){o.warning("当前目录路径为空");return}try{await navigator.clipboard.writeText(F.value),o.success("已复制目录路径")}catch(_){console.error("复制目录路径失败:",_),o.error(`复制失败: ${_.message}`)}}function Xe(){he.value=F.value,pe.value=!0,ft()}async function ft(){try{const n=await(await fetch("/api/recent_directories")).json();n.success&&Array.isArray(n.directories)&&(Ke.value=n.directories)}catch(_){console.error("获取最近目录失败:",_)}}async function Oe(){if(!he.value){o.warning("目录路径不能为空");return}try{Ye.value=!0;const n=await(await fetch("/api/change_directory",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:he.value})})).json();n.success?(o.success("已切换工作目录"),F.value=n.directory,pe.value=!1,await Pe(n.directory),g.isGitRepo=n.isGitRepo,n.isGitRepo?(await Promise.all([g.getCurrentBranch(),g.getAllBranches(),g.getUserInfo(),g.getRemoteUrl()]),v.value&&v.value.refreshStatus(),V.value&&V.value.refreshLog()):(o.warning("当前目录不是Git仓库,部分功能将不可用"),g.$reset())):o.error(n.error||"切换目录失败")}catch(_){o.error(`切换目录失败: ${_.message}`)}finally{Ye.value=!1}}async function Pe(_){try{await fetch("/api/save_recent_directory",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:_})})}catch(n){console.error("保存最近目录失败:",n)}}async function at(){try{if(!F.value){o.warning("当前目录路径为空");return}const n=await(await fetch("/api/open_directory",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:F.value})})).json();n.success?o.success("已在文件管理器中打开目录"):n.error&&o.error(n.error)}catch(_){console.error("打开目录失败:",_),o.error(`打开目录失败: ${_.message}`)}}async function Ee(){try{const n=await(await fetch("/api/browse_directory",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({currentPath:he.value||F.value})})).json();n.success?re(n):n.error&&o.error(n.error)}catch(_){console.error("浏览目录失败:",_),o.error(`浏览目录失败: ${_.message}`)}}function re(_){!_||!_.items||st.alert(je("div",{class:"directory-browser"},[je("div",{class:"current-path"},[je("span",{class:"path-label"},"当前路径: "),je("span",{class:"path-value"},_.path)]),je("div",{class:"directory-list"},[_.parentPath?je("div",{class:"directory-item parent-dir",onClick:()=>{Je(_.parentPath)}},[je("span",{class:"dir-icon"},je("svg",{class:"folder-icon",viewBox:"0 0 24 24",width:"20",height:"20",style:{fill:"#E6A23C"}},[je("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"})])),je("span",{class:"dir-name"},"返回上级目录")]):null,..._.items.map(n=>je("div",{class:"directory-item",onClick:()=>{Je(n.path)}},[je("span",{class:"dir-icon"},je("svg",{class:"folder-icon",viewBox:"0 0 24 24",width:"20",height:"20",style:{fill:"#409EFF"}},[je("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"})])),je("span",{class:"dir-name"},n.name)]))])]),"浏览并选择目录",{confirmButtonText:"使用当前目录",customClass:"directory-browser-dialog",callback:n=>{n==="confirm"&&(he.value=_.path)}})}async function Je(_){try{st.close(),setTimeout(async()=>{try{const N=await(await fetch("/api/browse_directory",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({currentPath:_})})).json();N.success?re(N):N.error&&o.error(N.error)}catch(n){console.error("浏览目录失败:",n),o.error(`浏览目录失败: ${n.message}`)}},100)}catch(n){console.error("处理目录选择时出错:",n),o.error(`处理目录选择时出错: ${n.message}`)}}return(_,n)=>{const N=Ot,E=He,Te=bs,$e=ls,Ce=Cs,xe=Et,Ae=Gt,ke=$s,Se=Pt,rt=ws,pt=Ut;return m(),$(De,null,[e("header",Ln,[e("div",Bn,[e("img",{src:l(Vn),alt:"Zen GitSync Logo",class:"logo"},null,8,An),n[14]||(n[14]=e("h1",null,"Zen GitSync UI",-1))]),e("div",Mn,[l(g).userName&&l(g).userEmail?(m(),$("div",Dn,[n[15]||(n[15]=e("span",{class:"user-label"},"用户:",-1)),e("span",Rn,D(l(g).userName),1),e("span",zn,"<"+D(l(g).userEmail)+">",1),s(E,{type:"primary",size:"small",onClick:ue,class:"user-settings-btn",circle:""},{default:a(()=>[s(N,null,{default:a(()=>[s(l(xt))]),_:1})]),_:1})])):(m(),$("div",En,[n[16]||(n[16]=e("span",{class:"user-label"},"用户: ",-1)),n[17]||(n[17]=e("span",{class:"user-warning"},"未配置",-1)),s(E,{type:"primary",size:"small",onClick:ue,class:"user-settings-btn",circle:""},{default:a(()=>[s(N,null,{default:a(()=>[s(l(xt))]),_:1})]),_:1})])),e("div",Gn,[e("div",jn,[e("div",Un,[s(N,null,{default:a(()=>[s(l(ds))]),_:1})]),e("div",{class:"directory-path",title:F.value},D(F.value),9,On)]),e("div",Pn,[s(E,{type:"primary",size:"small",onClick:Xe,class:"dir-button",circle:"",title:"切换目录"},{default:a(()=>[s(N,null,{default:a(()=>n[18]||(n[18]=[e("svg",{viewBox:"0 0 1024 1024",xmlns:"http://www.w3.org/2000/svg"},[e("path",{fill:"currentColor",d:"M128 192v640h768V320H485.76L357.504 192H128zm-32-64h287.872l128.384 128H928a32 32 0 0 1 32 32v576a32 32 0 0 1-32 32H96a32 32 0 0 1-32-32V160a32 32 0 0 1 32-32z"})],-1)])),_:1})]),_:1}),s(E,{type:"success",size:"small",onClick:at,class:"dir-button",circle:"",title:"在资源管理器中打开"},{default:a(()=>[s(N,null,{default:a(()=>n[19]||(n[19]=[e("svg",{viewBox:"0 0 1024 1024",xmlns:"http://www.w3.org/2000/svg"},[e("path",{fill:"currentColor",d:"M928 444H820V330.4c0-17.7-14.3-32-32-32H473L355.7 186.2a8.15 8.15 0 0 0-5.5-2.2H96c-17.7 0-32 14.3-32 32v592c0 17.7 14.3 32 32 32h698c13 0 24.8-7.9 29.7-20l134-332c1.5-3.8 2.3-7.9 2.3-12 0-17.7-14.3-32-32-32zM136 256h188.5l119.6 114.4H748V444H238c-13 0-24.8 7.9-29.7 20L136 643.2V256zm635.3 512H159l103.3-256h612.4L771.3 768z"})],-1)])),_:1})]),_:1}),s(E,{type:"info",size:"small",onClick:Ie,class:"dir-button",circle:"",title:"复制路径"},{default:a(()=>[s(N,null,{default:a(()=>n[20]||(n[20]=[e("svg",{viewBox:"0 0 1024 1024",xmlns:"http://www.w3.org/2000/svg"},[e("path",{fill:"currentColor",d:"M768 832a128 128 0 0 1-128 128H192A128 128 0 0 1 64 832V384a128 128 0 0 1 128-128v64a64 64 0 0 0-64 64v448a64 64 0 0 0 64 64h448a64 64 0 0 0 64-64h64z"}),e("path",{fill:"currentColor",d:"M384 128a64 64 0 0 0-64 64v448a64 64 0 0 0 64 64h448a64 64 0 0 0 64-64V192a64 64 0 0 0-64-64H384zm0-64h448a128 128 0 0 1 128 128v448a128 128 0 0 1-128 128H384a128 128 0 0 1-128-128V192A128 128 0 0 1 384 64z"})],-1)])),_:1})]),_:1})])])])]),e("main",Fn,[L.value?(m(),$("div",Hn,[e("div",Xn,[s(Za,{ref_key:"gitStatusRef",ref:v,"initial-directory":F.value},null,8,["initial-directory"])]),e("div",{class:"vertical-resizer",id:"v-resizer",onMousedown:ie},null,32),l(g).isGitRepo?(m(),$("div",Jn,[!l(g).userName||!l(g).userEmail?(m(),$("div",Wn,[n[26]||(n[26]=e("h2",null,"Git用户未配置",-1)),n[27]||(n[27]=e("p",null,"请先配置Git用户信息才能进行提交操作。",-1)),e("div",qn,[n[24]||(n[24]=e("h3",null,"您可以通过以下方式配置:",-1)),n[25]||(n[25]=e("ol",null,[e("li",null,"点击右上角的设置按钮,配置用户名和邮箱"),e("li",null,"或者使用命令行配置:"),e("div",{class:"code-block"},[h(' git config --global user.name "您的用户名"'),e("br"),h(' git config --global user.email "您的邮箱" ')])],-1)),s(E,{type:"primary",onClick:ue},{default:a(()=>n[23]||(n[23]=[h(" 立即配置 ")])),_:1})])])):(m(),oe(jo,{key:1}))])):(m(),$("div",Yn,n[28]||(n[28]=[e("div",{class:"card",style:{padding:"20px"}},[e("h2",null,"Git仓库初始化"),e("p",null,"当前目录不是Git仓库,请先初始化Git仓库或切换到Git仓库目录。"),e("div",{class:"tips"},[e("h3",null,"可以使用以下命令初始化仓库:"),e("div",{class:"code-block"},"git init")])],-1)]))),e("div",{class:"horizontal-resizer",id:"h-resizer",onMousedown:Re},null,32),l(g).isGitRepo?(m(),$("div",Kn,[s(xn,{ref_key:"logListRef",ref:V},null,512)])):J("",!0),s(Se,{modelValue:U.value,"onUpdate:modelValue":n[3]||(n[3]=X=>U.value=X),title:"创建新分支",width:"30%","destroy-on-close":""},{footer:a(()=>[e("span",Zn,[s(E,{onClick:n[2]||(n[2]=X=>U.value=!1)},{default:a(()=>n[29]||(n[29]=[h("取消")])),_:1}),s(E,{type:"primary",onClick:T,loading:l(g).isCreatingBranch},{default:a(()=>n[30]||(n[30]=[h(" 创建 ")])),_:1},8,["loading"])])]),default:a(()=>[s(ke,{model:{newBranchName:ee.value,selectedBaseBranch:M.value}},{default:a(()=>[s(Ce,{label:"新分支名称"},{default:a(()=>[s($e,{modelValue:ee.value,"onUpdate:modelValue":n[0]||(n[0]=X=>ee.value=X),placeholder:"请输入新分支名称"},null,8,["modelValue"])]),_:1}),s(Ce,{label:"基于分支"},{default:a(()=>[s(Ae,{modelValue:M.value,"onUpdate:modelValue":n[1]||(n[1]=X=>M.value=X),placeholder:"选择基础分支",style:{width:"100%"}},{default:a(()=>[(m(!0),$(De,null,Ue(l(g).allBranches,X=>(m(),oe(xe,{key:X,label:X,value:X},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])]),_:1})]),_:1},8,["model"])]),_:1},8,["modelValue"])])):(m(),$("div",Nn,[s(Te,{class:"loading-card"},{default:a(()=>[e("div",In,[s(N,{class:"is-loading"},{default:a(()=>n[21]||(n[21]=[e("svg",{viewBox:"0 0 1024 1024",xmlns:"http://www.w3.org/2000/svg"},[e("path",{fill:"currentColor",d:"M512 64a32 32 0 0 1 32 32v192a32 32 0 0 1-64 0V96a32 32 0 0 1 32-32zm0 640a32 32 0 0 1 32 32v192a32 32 0 1 1-64 0V736a32 32 0 0 1 32-32zm448-192a32 32 0 0 1-32 32H736a32 32 0 1 1 0-64h192a32 32 0 0 1 32 32zm-640 0a32 32 0 0 1-32 32H96a32 32 0 0 1 0-64h192a32 32 0 0 1 32 32zM195.2 195.2a32 32 0 0 1 45.248 0L376.32 331.008a32 32 0 0 1-45.248 45.248L195.2 240.448a32 32 0 0 1 0-45.248zm452.544 452.544a32 32 0 0 1 45.248 0L828.8 783.552a32 32 0 0 1-45.248 45.248L647.744 692.992a32 32 0 0 1 0-45.248zM828.8 195.264a32 32 0 0 1 0 45.184L692.992 376.32a32 32 0 0 1-45.248-45.248l135.808-135.808a32 32 0 0 1 45.248 0zm-452.544 452.48a32 32 0 0 1 0 45.248L240.448 828.8a32 32 0 0 1-45.248-45.248l135.808-135.808a32 32 0 0 1 45.248 0z"})],-1)])),_:1})]),n[22]||(n[22]=e("div",{class:"loading-text"},"加载中...",-1))]),_:1})]))]),e("footer",Qn,[l(g).currentBranch?(m(),$("div",ei,[e("div",ti,[n[32]||(n[32]=e("span",{class:"branch-label"},"当前分支:",-1)),s(Ae,{modelValue:l(g).currentBranch,"onUpdate:modelValue":n[4]||(n[4]=X=>l(g).currentBranch=X),size:"small",onChange:q,loading:l(g).isChangingBranch,class:"branch-select"},{default:a(()=>[(m(!0),$(De,null,Ue(l(g).allBranches,X=>(m(),oe(xe,{key:X,label:X,value:X},null,8,["label","value"]))),128))]),_:1},8,["modelValue","loading"]),s(E,{type:"primary",size:"small",onClick:K,class:"create-branch-btn"},{default:a(()=>[s(N,null,{default:a(()=>[s(l(sa))]),_:1}),n[31]||(n[31]=h(" 新建分支 "))]),_:1})])])):J("",!0),l(g).remoteUrl?(m(),$("div",si,[n[34]||(n[34]=e("span",{class:"repo-url-label"},"远程仓库:",-1)),e("span",ai,D(l(g).remoteUrl),1),s(E,{type:"primary",circle:"",size:"small",onClick:n[5]||(n[5]=X=>l(g).copyRemoteUrl()),class:"copy-url-btn",title:"复制仓库地址"},{default:a(()=>[s(N,null,{default:a(()=>n[33]||(n[33]=[e("svg",{viewBox:"0 0 1024 1024",xmlns:"http://www.w3.org/2000/svg"},[e("path",{fill:"currentColor",d:"M768 832a128 128 0 0 1-128 128H192A128 128 0 0 1 64 832V384a128 128 0 0 1 128-128v64a64 64 0 0 0-64 64v448a64 64 0 0 0 64 64h448a64 64 0 0 0 64-64h64z"}),e("path",{fill:"currentColor",d:"M384 128a64 64 0 0 0-64 64v448a64 64 0 0 0 64 64h448a64 64 0 0 0 64-64V192a64 64 0 0 0-64-64H384zm0-64h448a128 128 0 0 1 128 128v448a128 128 0 0 1-128 128H384a128 128 0 0 1-128-128V192A128 128 0 0 1 384 64z"})],-1)])),_:1})]),_:1})])):J("",!0)]),s(Se,{modelValue:Z.value,"onUpdate:modelValue":n[9]||(n[9]=X=>Z.value=X),title:"Git用户设置",width:"30%","destroy-on-close":""},{footer:a(()=>[e("span",li,[s(E,{type:"danger",onClick:le},{default:a(()=>n[36]||(n[36]=[h(" 清除配置 ")])),_:1}),s(E,{onClick:n[8]||(n[8]=X=>Z.value=!1)},{default:a(()=>n[37]||(n[37]=[h("取消")])),_:1}),s(E,{type:"primary",onClick:j},{default:a(()=>n[38]||(n[38]=[h(" 保存 ")])),_:1})])]),default:a(()=>[s(ke,null,{default:a(()=>[s(Ce,{label:"用户名"},{default:a(()=>[s($e,{modelValue:H.value,"onUpdate:modelValue":n[6]||(n[6]=X=>H.value=X),placeholder:"请输入Git用户名"},null,8,["modelValue"])]),_:1}),s(Ce,{label:"邮箱"},{default:a(()=>[s($e,{modelValue:be.value,"onUpdate:modelValue":n[7]||(n[7]=X=>be.value=X),placeholder:"请输入Git邮箱"},null,8,["modelValue"])]),_:1}),s(Ce,null,{default:a(()=>[s(rt,{type:"info",closable:!1,"show-icon":""},{default:a(()=>n[35]||(n[35]=[h(" 这些设置将影响全局Git配置,对所有Git仓库生效。 ")])),_:1})]),_:1})]),_:1})]),_:1},8,["modelValue"]),s(Se,{modelValue:pe.value,"onUpdate:modelValue":n[13]||(n[13]=X=>pe.value=X),title:"切换工作目录",width:"50%","destroy-on-close":""},{footer:a(()=>[e("span",ii,[s(E,{onClick:n[11]||(n[11]=X=>pe.value=!1)},{default:a(()=>n[40]||(n[40]=[h("取消")])),_:1}),s(E,{type:"primary",onClick:n[12]||(n[12]=X=>Oe()),loading:Ye.value},{default:a(()=>n[41]||(n[41]=[h(" 切换 ")])),_:1},8,["loading"])])]),default:a(()=>[s(ke,null,{default:a(()=>[s(Ce,{label:"目录路径"},{default:a(()=>[e("div",oi,[s($e,{modelValue:he.value,"onUpdate:modelValue":n[10]||(n[10]=X=>he.value=X),placeholder:"请输入目录路径"},null,8,["modelValue"]),s(E,{type:"primary",onClick:Ee},{default:a(()=>[s(N,null,{default:a(()=>[s(l(ds))]),_:1}),n[39]||(n[39]=h(" 浏览 "))]),_:1})])]),_:1}),Ke.value.length>0?(m(),oe(Ce,{key:0,label:"常用目录"},{default:a(()=>[e("div",ni,[(m(!0),$(De,null,Ue(Ke.value,(X,ut)=>(m(),oe(pt,{key:ut,class:"recent-dir-tag",onClick:ct=>he.value=X,effect:"plain"},{default:a(()=>[h(D(X),1)]),_:2},1032,["onClick"]))),128))])]),_:1})):J("",!0)]),_:1})]),_:1},8,["modelValue"])],64)}}}),ui=Ft(ri,[["__scopeId","data-v-f48609ab"]]),Ts=aa(ui);Ts.use(la());Ts.mount("#app");
|