'use client'; import { useState } from 'react'; import { X, AlertTriangle, Link2, ChevronRight, Bug as BugIcon } from 'lucide-react'; import { TestCaseStatusBadge } from './TestCaseStatusBadge'; import { BugStatusBadge } from '@/components/bug/BugStatusBadge'; import { useTestCaseStore } from '@/stores/useTestCaseStore'; import { useBugStore } from '@/stores/useBugStore'; import { useRequirementStore } from '@/stores/useRequirementStore'; import { TC_ALLOWED_TRANSITIONS, TEST_CASE_STATUS_LABEL } from '@/lib/test-case'; import { BUG_SEVERITY_LABEL, BUG_SEVERITY_COLOR } from '@/lib/bug'; import type { TestCaseStatus } from '@/lib/test-case'; interface Props { testCaseId: string; onClose: () => void; onCreateBug?: (testCaseId: string) => void; } export function TestCaseDetailDrawer({ testCaseId, onClose, onCreateBug }: Props) { const { testCases, changeStatus } = useTestCaseStore(); const { bugs } = useBugStore(); const { requirements } = useRequirementStore(); const tc = testCases.find((c) => c.id === testCaseId); if (!tc) return null; const requirement = requirements.find((r) => r.id === tc.requirementId); const relatedBugs = bugs.filter((b) => b.testCaseId === tc.id); const nextStatuses = TC_ALLOWED_TRANSITIONS[tc.status]; const [failReason, setFailReason] = useState(''); const [blockReason, setBlockReason] = useState(''); const [showFailInput, setShowFailInput] = useState(false); const [showBlockInput, setShowBlockInput] = useState(false); const handleTransition = (to: TestCaseStatus) => { if (to === 'failed') { setShowFailInput(true); return; } if (to === 'blocked') { setShowBlockInput(true); return; } changeStatus(tc.id, to); }; const confirmFail = () => { changeStatus(tc.id, 'failed', { failReason: failReason.trim() || undefined }); setShowFailInput(false); setFailReason(''); }; const confirmBlock = () => { changeStatus(tc.id, 'blocked', { blockReason: blockReason.trim() || undefined }); setShowBlockInput(false); setBlockReason(''); }; return (
{tc.description}
暂无关联 Bug
) : (