优化: 前端批(审批体系一致 + GitChanges UI + token/控件统一 + 死代码)

审批体系一致:ApprovalPopup 浮窗加挂起时长提示(H1)+session 按钮+path deny 二次确认(M4/M5);ToolCard/useToolApproval 加 session+onDeny 确认(对齐 DirAuthDialog 四按钮)+ToolCardList decision 类型加 session;ApprovalDialog 失败显 toast(治 store 吞错 M31);ApprovalOverlay dismiss 改响应式(L26)

GitChanges UI(问题12 前端 12b-12h):showCommitFileDiff 精确匹配(12b)+去重 git log(12c)+详情滑出不挤压(12d)+双行提交行(12f)+搜索过滤(12g)+历史 Tab 显分支(12h)+diff 侧边栏内更宽可折叠面板(12e:FilePreview 不支持任意提交 diff,折中)

token+控件:global.css 定义 --df-primary(治幽灵变量 M26)+settings.css 加 .setting-number/.setting-input/.setting-textarea+4 Section 套用(问题8)

死代码:删 PlanProgress.vue(零引用)+PlanLayerInfo 类型+i18n 孤儿 key(L1)
This commit is contained in:
lxy
2026-08-02 12:42:52 +08:00
parent ffb202e2e9
commit caaabf0c15
19 changed files with 654 additions and 335 deletions
+3 -20
View File
@@ -42,7 +42,7 @@
<SettingRow ref="rowCustomPrompt" :label="$t('settings.labelCustomPrompt')" :desc="$t('settings.descCustomPrompt')">
<textarea
v-model="customPrompt"
class="custom-prompt-input"
class="setting-textarea"
:placeholder="$t('settings.placeholderCustomPrompt')"
rows="4"
@change="onCustomPromptChange"
@@ -177,8 +177,8 @@ function onApprovalTimeoutChange() {
<style scoped>
/* 阶段5 UX 重构:复用 settings.css 全局 .panel/.panel-header/.general-settings/
.setting-select + SettingRow(封装 .setting-row/.setting-info/.setting-label/
.setting-desc/.setting-control)。本 Section 无特有 scoped 样式。
.setting-select/.setting-textarea + SettingRow(封装 .setting-row/.setting-info/.setting-label/
.setting-desc/.setting-control)。本 Section 仅保留 all 二次确认弹层特有 scoped 样式。
F-#97 all 二次确认弹层:复用 Settings.vue 壳层 confirm 弹层同款样式(mask/box/msg/
actions/transition),此处独立持有 useConfirm 状态(不与壳层共用,壳层按钮写死「删除」)。 */
@@ -209,23 +209,6 @@ function onApprovalTimeoutChange() {
.confirm-actions { display: flex; justify-content: flex-end; gap: 8px; }
.btn-danger { background: var(--df-danger); color: #fff; }
.btn-danger:hover { filter: brightness(1.1); }
.custom-prompt-input {
width: 100%;
padding: 8px;
font-size: 13px;
font-family: inherit;
border: 0.5px solid var(--df-border);
border-radius: var(--df-radius-sm);
background: var(--df-bg);
color: var(--df-text);
resize: vertical;
min-height: 80px;
line-height: 1.5;
}
.custom-prompt-input:focus {
outline: none;
border-color: var(--df-primary);
}
.confirm-enter-active, .confirm-leave-active { transition: opacity 0.15s; }
.confirm-enter-from, .confirm-leave-to { opacity: 0; }
</style>
+3 -3
View File
@@ -24,7 +24,7 @@
<div class="add-row">
<input
v-model="newDir"
class="setting-select dir-input"
class="setting-input dir-input"
:placeholder="$t('settings.allowedDirsInputPlaceholder')"
@keyup.enter="onAddClick"
/>
@@ -53,7 +53,7 @@
<SettingRow :label="$t('settings.labelScriptWhitelist')" :desc="$t('settings.descScriptWhitelist')">
<input
v-model="scriptWhitelist"
class="setting-select script-safety-input"
class="setting-input script-safety-input"
:placeholder="$t('settings.placeholderScriptWhitelist')"
@blur="onScriptWhitelistCommit"
@keyup.enter="onScriptWhitelistCommit"
@@ -63,7 +63,7 @@
<SettingRow :label="$t('settings.labelScriptBlacklist')" :desc="$t('settings.descScriptBlacklist')">
<input
v-model="scriptBlacklist"
class="setting-select script-safety-input"
class="setting-input script-safety-input"
:placeholder="$t('settings.placeholderScriptBlacklist')"
@blur="onScriptBlacklistCommit"
@keyup.enter="onScriptBlacklistCommit"
+2 -2
View File
@@ -17,7 +17,7 @@
</select>
</SettingRow>
<SettingRow ref="rowMinMessages" :label="$t('settings.labelMinMessages')" :desc="$t('settings.descMinMessages')">
<input type="number" min="2" max="50" v-model.number="knowledgeConfig.min_messages" class="setting-select" style="width:80px" @change="markSaved('minMessages')" />
<input type="number" min="2" max="50" v-model.number="knowledgeConfig.min_messages" class="setting-number" style="width:80px" @change="markSaved('minMessages')" />
</SettingRow>
<SettingRow ref="rowAutoInject" :label="$t('settings.labelAutoInject')" :desc="$t('settings.descAutoInject')">
<label class="toggle">
@@ -38,7 +38,7 @@
</select>
</SettingRow>
<SettingRow v-if="knowledgeConfig.vector_enabled" ref="rowEmbeddingModel" :label="$t('settings.labelEmbeddingModel')" :desc="$t('settings.descEmbeddingModel')">
<input type="text" :value="knowledgeConfig.embedding_model ?? ''" @input="knowledgeConfig.embedding_model = ($event.target as HTMLInputElement).value || null" @change="markSaved('embeddingModel')" class="setting-select" :placeholder="$t('settings.phEmbeddingModel')" style="width:220px" />
<input type="text" :value="knowledgeConfig.embedding_model ?? ''" @input="knowledgeConfig.embedding_model = ($event.target as HTMLInputElement).value || null" @change="markSaved('embeddingModel')" class="setting-input" :placeholder="$t('settings.phEmbeddingModel')" style="width:220px" />
</SettingRow>
</div>
</section>
@@ -10,7 +10,7 @@
next-round
:label="$t('settings.labelGlobalConcurrency')"
:desc="$t('settings.descGlobalConcurrency')">
<input type="number" class="setting-select" min="1" style="width:80px"
<input type="number" class="setting-number" min="1" style="width:80px"
v-model.number="settings.llmGlobalConcurrency"
@change="onConcurrencyChange" />
</SettingRow>
@@ -19,7 +19,7 @@
next-round
:label="$t('settings.labelPerConvConcurrency')"
:desc="$t('settings.descPerConvConcurrency')">
<input type="number" class="setting-select" min="1" style="width:80px"
<input type="number" class="setting-number" min="1" style="width:80px"
v-model.number="settings.llmPerConvConcurrency"
@change="onConcurrencyChange" />
</SettingRow>
@@ -32,7 +32,7 @@
<input type="checkbox" v-model="unlimited" @change="markSaved('iter')" />
<span>{{ $t('settings.labelUnlimited') }}</span>
</label>
<input type="number" class="setting-select" min="1" max="50" style="width:80px"
<input type="number" class="setting-number" min="1" max="50" style="width:80px"
v-model.number="settings.agentMaxIterations"
:disabled="unlimited"
@change="onIterChange" />
@@ -42,7 +42,7 @@
next-round
:label="$t('settings.labelAgentMaxRetries')"
:desc="$t('settings.descAgentMaxRetries')">
<input type="number" class="setting-select" min="0" max="10" style="width:80px"
<input type="number" class="setting-number" min="0" max="10" style="width:80px"
v-model.number="settings.agentMaxRetries"
@change="onRetryChange" />
</SettingRow>
@@ -225,7 +225,7 @@ onUnmounted(() => {
<style scoped>
/* 阶段5 UX 重构:复用 settings.css 全局 .panel/.panel-header/.general-settings/
.setting-select + SettingRow(封装 .setting-row/.setting-info/.setting-label/
.setting-number + SettingRow(封装 .setting-row/.setting-info/.setting-label/
.setting-desc/.setting-control + nextRound badge)。本 Section 无特有 scoped 样式
(.unlimited-toggle 沿用默认 label)。 */
</style>
+50
View File
@@ -34,6 +34,7 @@
.setting-control { display: flex; align-items: center; }
/* ===== 控件(5/5 Panel 重复) ===== */
/* 控件统一基准(padding/border/radius/font 对齐),各 type 仅差异化必要属性 */
.setting-select {
padding: 6px 12px;
background: var(--df-bg);
@@ -47,6 +48,55 @@
}
.setting-select:focus { border-color: var(--df-accent); }
/* number input:窄,无 spinner 累赘外观,继承基准样式 */
.setting-number {
padding: 6px 12px;
background: var(--df-bg);
border: 0.5px solid var(--df-border);
border-radius: var(--df-radius-sm);
color: var(--df-text);
font-size: 13px;
font-family: inherit;
outline: none;
cursor: pointer;
min-width: 80px;
}
.setting-number:focus { border-color: var(--df-accent); }
/* text input:通用单行文本(目录/模型名/脚本名单) */
.setting-input {
padding: 6px 12px;
background: var(--df-bg);
border: 0.5px solid var(--df-border);
border-radius: var(--df-radius-sm);
color: var(--df-text);
font-size: 13px;
font-family: inherit;
outline: none;
min-width: 160px;
}
.setting-input:focus { border-color: var(--df-accent); }
.setting-input::placeholder { color: var(--df-text-dim); }
/* textarea:多行(自定义提示词等),垂直拉伸 */
.setting-textarea {
width: 100%;
padding: 8px 12px;
background: var(--df-bg);
border: 0.5px solid var(--df-border);
border-radius: var(--df-radius-sm);
color: var(--df-text);
font-size: 13px;
font-family: inherit;
line-height: 1.5;
outline: none;
resize: vertical;
min-height: 80px;
box-sizing: border-box;
}
.setting-textarea:focus { border-color: var(--df-accent); }
.setting-textarea::placeholder { color: var(--df-text-dim); }
/* Toggle(3/5 Panel 重复) */
.toggle { position: relative; display: inline-block; width: 40px; height: 22px; cursor: pointer; }
.toggle input { opacity: 0; width: 0; height: 0; }