'use client'; import { useState } from 'react'; import { Plus, X, Search } from 'lucide-react'; import type { Requirement } from '@/lib/requirement'; import { REQ_STATUS_LABEL, REQ_STATUS_COLOR } from '@/lib/requirement'; interface Props { versionId: string; projectId: string; requirements: Requirement[]; onLink: (reqIds: string[], addedBy: string) => void; onUnlink: (reqId: string) => void; currentUserName: string; } export function VersionRequirementsTab({ versionId, projectId, requirements, onLink, onUnlink, currentUserName }: Props) { const [showAddModal, setShowAddModal] = useState(false); const linkedReqs = requirements.filter((r) => r.versionId === versionId); const availableReqs = requirements.filter((r) => r.projectId === projectId && !r.versionId && r.status === 'adopted'); return (
{linkedReqs.length} 条关联需求
{linkedReqs.length === 0 ? (
暂无关联需求,从需求池中添加
) : (
{linkedReqs.map((req) => ( ))}
编号 需求概述 描述 状态 添加人 操作
{req.code} {req.title} {req.description || '-'} {REQ_STATUS_LABEL[req.status]} {req.addedToVersionBy || '-'}
)} {showAddModal && ( setShowAddModal(false)} onConfirm={(ids) => { onLink(ids, currentUserName); setShowAddModal(false); }} /> )}
); } function AddRequirementModal({ available, onClose, onConfirm }: { available: Requirement[]; onClose: () => void; onConfirm: (ids: string[]) => void; }) { const [selected, setSelected] = useState>(new Set()); const [search, setSearch] = useState(''); const filtered = available.filter((r) => r.title.includes(search) || r.code.includes(search) ); const toggle = (id: string) => { const next = new Set(selected); if (next.has(id)) next.delete(id); else next.add(id); setSelected(next); }; return (
e.stopPropagation()}>

从需求池添加

setSearch(e.target.value)} placeholder="搜索需求编号或标题" className="h-8 w-full rounded-lg border border-[var(--line)] bg-[var(--bg)] pl-9 pr-3 text-[12px] focus:border-[var(--accent)] focus:outline-none" />
{filtered.length === 0 ? (

没有可添加的需求

) : (
{filtered.map((req) => ( ))}
)}
已选 {selected.size} 条
); }