优化: 前端批(审批体系一致 + 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:
@@ -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>
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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; }
|
||||
|
||||
Reference in New Issue
Block a user