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