diff --git a/src/components/project/ApprovalDialog.vue b/src/components/project/ApprovalDialog.vue
new file mode 100644
index 0000000..5b9b979
--- /dev/null
+++ b/src/components/project/ApprovalDialog.vue
@@ -0,0 +1,110 @@
+
+
+
+
+
{{ $t('projectDetail.approvalTitle') }}
+
+
{{ pendingApproval.title }}
+
{{ pendingApproval.description }}
+
+
{{ $t('projectDetail.approvalHint') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/ProjectDetail.vue b/src/views/ProjectDetail.vue
index bf113c6..7ec758c 100644
--- a/src/views/ProjectDetail.vue
+++ b/src/views/ProjectDetail.vue
@@ -172,57 +172,13 @@
-
-
-
-
{{ $t('projectDetail.approvalTitle') }}
-
-
{{ store.pendingApproval.title }}
-
{{ store.pendingApproval.description }}
-
-
{{ $t('projectDetail.approvalHint') }}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
@@ -241,6 +197,7 @@ import { formatDate } from '@/utils/time'
import { parseStack } from '@/utils/project'
import { projectStatusLabel, projectStageInfo, taskStatusLabel, taskStatusClass } from '../constants/project'
import ConfirmDialog from '@/components/ConfirmDialog.vue'
+import ApprovalDialog from '@/components/project/ApprovalDialog.vue'
import { useConfirm } from '@/composables/useConfirm'
import { useRendered } from '@/composables/useMarkdown'
@@ -414,32 +371,9 @@ async function handleImportDir() {
}
// ── 审批处理 ──
-async function handleApproval(decision: string) {
- submitting.value = true
- try {
- await store.approveHumanApproval([decision])
- showApprovalDialog.value = false
- } finally {
- submitting.value = false
- }
-}
-
-// F-260615-01: 多选审批
-const isMultipleSelect = computed(() => store.pendingApproval?.select_type === 'multiple')
-const multiDecisions = ref([])
-
-async function handleApprovalMulti() {
- if (multiDecisions.value.length === 0) return
- submitting.value = true
- try {
- // 统一传 decisions 数组,store 按 select_type 分派单/多选
- await store.approveHumanApproval([...multiDecisions.value])
- multiDecisions.value = []
- showApprovalDialog.value = false
- } finally {
- submitting.value = false
- }
-}
+// 审批对话框 UI + 单/多选决策逻辑抽离至 components/project/ApprovalDialog.vue
+// handleApproval/handleApprovalMulti/isMultipleSelect/multiDecisions 已迁移;
+// submitting(UX-260618-17)在子组件自治,父级 submitting 仅用于 submitNewTask
// ── 取消审批(调 cancel_workflow_node IPC 置节点 Cancelled)──
async function handleCancelApproval() {
@@ -461,11 +395,9 @@ watch(formattedEvents, () => {
if (logListRef.value) logListRef.value.scrollTop = logListRef.value.scrollHeight
})
-// 监听审批请求
+// 监听审批请求(pendingApproval → 开弹窗;多选清空已在 ApprovalDialog 内 watch)
watch(() => store.pendingApproval, (newApproval) => {
if (newApproval) {
- // F-260615-01: 每次新审批清空多选状态(避免上轮残留)
- multiDecisions.value = []
showApprovalDialog.value = true
}
}, { immediate: true })