需求验收体系: - 测试用例:五态状态机(待执行/执行中/通过/失败/阻塞) - Bug:六态状态机(待修复/修复中/已修复/验证中/已关闭/已拒绝) - Bug 通过测试用例间接关联需求(不冗余存版本) - Bug 默认修复人 = 关联需求的开发任务负责人 - 测试进度 = 已执行用例/总用例, 通过率 = 通过/已执行 UI: - 版本详情页新增"测试用例" Tab + "BUG" Tab - 测试用例:统计栏+筛选+按需求分组列表+详情抽屉+提BUG入口 - Bug:统计栏+筛选+列表+详情抽屉(链式跳转用例→需求) - 概览胶囊"测试"阶段进度联动 - "与我相关"新增测试用例/Bug分组 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
33 lines
1.3 KiB
TypeScript
33 lines
1.3 KiB
TypeScript
'use client';
|
|
|
|
import { BugStatusBadge } from './BugStatusBadge';
|
|
import { BUG_SEVERITY_LABEL, BUG_SEVERITY_COLOR } from '@/lib/bug';
|
|
import type { Bug } from '@/lib/bug';
|
|
|
|
interface Props {
|
|
bug: Bug;
|
|
testCaseNo?: string;
|
|
onClick?: () => void;
|
|
}
|
|
|
|
const PRIORITY_DOT: Record<string, string> = {
|
|
P0: 'bg-red-500',
|
|
P1: 'bg-orange-400',
|
|
P2: 'bg-blue-400',
|
|
P3: 'bg-zinc-300',
|
|
};
|
|
|
|
export function BugRow({ bug, testCaseNo, onClick }: Props) {
|
|
return (
|
|
<div onClick={onClick} className="flex items-center gap-3 px-4 py-2.5 border-b border-[var(--line)] hover:bg-[var(--bg-subtle)] cursor-pointer transition-colors last:border-b-0">
|
|
<span className={`h-2 w-2 rounded-full shrink-0 ${PRIORITY_DOT[bug.priority] || 'bg-zinc-300'}`} />
|
|
<span className="text-[11px] font-mono text-[var(--ink-muted)] w-16 shrink-0">{bug.bugNo}</span>
|
|
<span className="text-[13px] text-[var(--ink)] flex-1 truncate">{bug.title}</span>
|
|
<span className={`text-[10px] px-1.5 py-0.5 rounded ${BUG_SEVERITY_COLOR[bug.severity]}`}>{BUG_SEVERITY_LABEL[bug.severity]}</span>
|
|
<BugStatusBadge status={bug.status} />
|
|
{testCaseNo && <span className="text-[10px] font-mono text-[var(--ink-muted)] w-14 text-right">{testCaseNo}</span>}
|
|
<span className="text-[11px] text-[var(--ink-soft)] w-14 text-right truncate">{bug.assigneeId}</span>
|
|
</div>
|
|
);
|
|
}
|