diff --git a/apps/web/app/versions/[id]/page.tsx b/apps/web/app/versions/[id]/page.tsx index 5223b83..fb97101 100644 --- a/apps/web/app/versions/[id]/page.tsx +++ b/apps/web/app/versions/[id]/page.tsx @@ -208,7 +208,7 @@ export default function VersionDetailPage() { // DevTask 真实统计 const versionDevTasks = devTasks.filter((t) => versionReqs.some((r) => r.id === t.requirementId)); const devTaskTodo = versionDevTasks.filter((t) => t.status === 'todo').length; - const devTaskInProgress = versionDevTasks.filter((t) => t.status === 'in_progress').length; + const devTaskInProgress = versionDevTasks.filter((t) => t.status === 'in_progress' || t.status === 'testing').length; const devTaskBlocked = versionDevTasks.filter((t) => t.isBlocked).length; const versionBugs = bugs.filter((b) => b.versionId === version.id); const bugOpenCount = versionBugs.filter((b) => b.status === 'open' || b.status === 'fixing').length; diff --git a/apps/web/components/bug/BugCreateModal.tsx b/apps/web/components/bug/BugCreateModal.tsx index a56f88d..327eeaa 100644 --- a/apps/web/components/bug/BugCreateModal.tsx +++ b/apps/web/components/bug/BugCreateModal.tsx @@ -1,7 +1,7 @@ 'use client'; -import { useState, useMemo } from 'react'; -import { X } from 'lucide-react'; +import { useState, useMemo, useRef } from 'react'; +import { X, ImagePlus, Trash2 } from 'lucide-react'; import { useBugStore } from '@/stores/useBugStore'; import { useTestCaseStore } from '@/stores/useTestCaseStore'; import { useDevTaskStore } from '@/stores/useDevTaskStore'; @@ -27,7 +27,6 @@ export function BugCreateModal({ testCaseId, onClose }: Props) { const tc = testCases.find((c) => c.id === testCaseId); const requirement = requirements.find((r) => r.id === tc?.requirementId); - // 推导默认负责人 const defaultAssignee = useMemo(() => { if (!tc) return ''; const reqTasks = devTasks.filter((t) => t.requirementId === tc.requirementId); @@ -42,9 +41,23 @@ export function BugCreateModal({ testCaseId, onClose }: Props) { const [severity, setSeverity] = useState('major'); const [priority, setPriority] = useState(tc?.priority || 'P1'); const [assigneeId, setAssigneeId] = useState(defaultAssignee); + const [images, setImages] = useState([]); + const fileRef = useRef(null); const canSubmit = title.trim() && description.trim() && assigneeId; + const handleFiles = (files: FileList | null) => { + if (!files) return; + Array.from(files).forEach((file) => { + if (!file.type.startsWith('image/')) return; + const reader = new FileReader(); + reader.onload = () => { + setImages((prev) => [...prev, reader.result as string]); + }; + reader.readAsDataURL(file); + }); + }; + const handleSubmit = () => { if (!canSubmit) return; createBug({ @@ -57,19 +70,19 @@ export function BugCreateModal({ testCaseId, onClose }: Props) { priority, reportedBy: user?.name || '系统', assigneeId, - }); + images: images.length > 0 ? images : undefined, + }, user?.name || '系统'); onClose(); }; return (
-
e.stopPropagation()}> +
e.stopPropagation()}>

提交 Bug

- {/* 只读关联信息 */}
关联用例:{tc?.caseNo} {tc?.title}
{requirement &&
关联需求:{requirement.code} {requirement.title}
} @@ -82,8 +95,39 @@ export function BugCreateModal({ testCaseId, onClose }: Props) {
-