优化: 审批弹窗全局化与体验打磨

This commit is contained in:
lxy
2026-08-10 08:04:30 +08:00
parent dedb9a8862
commit 6141a67b0e
10 changed files with 159 additions and 47 deletions
+27
View File
@@ -38,6 +38,15 @@
仅在主窗口与 ai-detached 窗口挂载(file-explorer / approval-popup 自身不挂)
应用失焦/最小化时的系统级提示由 useApprovalPopup 启动的独立浮窗(approval-popup)负责 -->
<ApprovalOverlay v-if="showApprovalOverlay" @activate="activateAiPanel" />
<!-- 人工审批对话框(全局,任意路由响应 store.pendingApproval)
ProjectDetail.vue 提至 App.vue,TaskDetail 等无 ApprovalDialog 的页面自动受益 -->
<ApprovalDialog
:visible="showApprovalDialog"
:store="projectStore"
@cancel="handleCancelApproval"
@later="showApprovalDialog = false"
/>
</template>
<script setup lang="ts">
@@ -50,6 +59,7 @@ import { useAppSettingsStore } from './stores/appSettings'
import i18n from './i18n'
import AiChat from './components/AiChat.vue'
import ApprovalOverlay from './components/ai/ApprovalOverlay.vue'
import ApprovalDialog from './components/project/ApprovalDialog.vue'
import ErrorBoundary from './components/ErrorBoundary.vue'
import AppLayout from './components/layout/AppLayout.vue'
import { startApprovalPopup } from '@/composables/ai/useApprovalPopup'
@@ -91,6 +101,23 @@ watch(() => projectStore.error, (err) => {
errorTimer = setTimeout(() => { errorMsg.value = '' }, 3500)
})
// ── 人工审批对话框(全局,P0-C:工作流推进到 HumanNode 审批时,任意页面都应能响应)──
// 原 ProjectDetail 局部渲染 → TaskDetail 无 ApprovalDialog 致 store.pendingApproval 被设但
// 用户在 TaskDetail 页无法操作 → HumanNode 超时失败。提到 App.vue 全局化:任何路由响应审批。
// (系统级浮窗 useApprovalPopup 是窗口失焦时的提示;此处是聚焦时弹的对话框,二者职责互补)
const showApprovalDialog = ref(false)
watch(() => projectStore.pendingApproval, (newApproval) => {
if (newApproval) {
showApprovalDialog.value = true
}
}, { immediate: true })
// 取消审批(调 cancel_workflow_node IPC 置节点 Cancelled),与原 ProjectDetail.handleCancelApproval 对齐
async function handleCancelApproval() {
await projectStore.cancelHumanApproval()
showApprovalDialog.value = false
}
// 点击菜单自动退出最大化 → 切为分栏模式
watch(() => route.path, (path) => {
if (!['/', '/ai-home', '/ai-detached'].includes(path) && aiStore.state.maximized) {