优化: 前端批(审批体系一致 + 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
+34 -6
View File
@@ -41,7 +41,7 @@
</template>
<script setup lang="ts">
import { computed, ref, watch } from 'vue'
import { computed, onUnmounted, ref, watch } from 'vue'
import { useAiStore } from '@/stores/ai'
const store = useAiStore()
@@ -57,18 +57,46 @@ const count = computed(() => store.state.pendingApprovals.length)
const dismissedAt = ref<number>(0)
const DISMISS_COOLDOWN_MS = 60_000
// 显隐:有 pending + 未在冷却期
// L26: 响应式时钟。原 visible 直接读 Date.now()(非响应式),computed 仅在 dismissedAt/count 变化时
// 重算 → dismiss 满 60s 时无触发源,浮层不会自动重现。now 每秒翻一次驱动重算(60s 冷却期颗粒度足够,
// 浮层非精确计时器)。仅在 dismissed 时跑定时器节省空转。
const now = ref(Date.now())
let _tickTimer: ReturnType<typeof setInterval> | null = null
function startTick() {
if (_tickTimer) return
_tickTimer = setInterval(() => { now.value = Date.now() }, 1000)
}
function stopTick() {
if (_tickTimer) {
clearInterval(_tickTimer)
_tickTimer = null
}
}
// 显隐:有 pending + 未在冷却期(用响应式 now 替代裸 Date.now())
const visible = computed(() => {
if (count.value === 0) return false
if (dismissedAt.value && Date.now() - dismissedAt.value < DISMISS_COOLDOWN_MS) return false
if (dismissedAt.value && now.value - dismissedAt.value < DISMISS_COOLDOWN_MS) return false
return true
})
// 审批清空时复位 dismiss(下次有新审批会重新弹)
watch(count, (c) => {
if (c === 0) dismissedAt.value = 0
// dismiss 启动时钟;冷却期到或审批清空时停时钟(避免无意义空转)
watch(dismissedAt, (d) => {
if (d > 0) startTick()
else stopTick()
})
// 审批清空时复位 dismiss(下次有新审批会重新弹)+ 停时钟
watch(count, (c) => {
if (c === 0) {
dismissedAt.value = 0
stopTick()
}
})
onUnmounted(() => stopTick())
function onActivate() {
emit('activate')
}