fix: 关联需求添加人显示"系统添加" + 开发状态列 + 开发中不可移除
1. 添加人字段:无值时显示"系统添加"而非"-" 2. 新增"开发状态"列:从 linkage-engine 推导 3. 开发中的需求:移除按钮替换为"开发中"文字提示 4. 去掉"描述"列(表格更紧凑) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -727,6 +727,7 @@ export default function VersionDetailPage() {
|
||||
versionId={version.id}
|
||||
projectId={version.projectId}
|
||||
requirements={requirements}
|
||||
devTasks={devTasks}
|
||||
currentUserName={user?.name ?? ''}
|
||||
onLink={(ids, addedBy) => {
|
||||
ids.forEach((id) => updateRequirement(id, { versionId: version.id, addedToVersionBy: addedBy }));
|
||||
|
||||
@@ -3,18 +3,21 @@
|
||||
import { useState } from 'react';
|
||||
import { Plus, X, Search } from 'lucide-react';
|
||||
import type { Requirement } from '@/lib/requirement';
|
||||
import type { DevTask } from '@/lib/dev-task';
|
||||
import { REQ_STATUS_LABEL, REQ_STATUS_COLOR } from '@/lib/requirement';
|
||||
import { deriveReqDevStatus, canEditRequirement, REQ_DEV_STATUS_LABEL, REQ_DEV_STATUS_COLOR } from '@/lib/linkage-engine';
|
||||
|
||||
interface Props {
|
||||
versionId: string;
|
||||
projectId: string;
|
||||
requirements: Requirement[];
|
||||
devTasks: DevTask[];
|
||||
onLink: (reqIds: string[], addedBy: string) => void;
|
||||
onUnlink: (reqId: string) => void;
|
||||
currentUserName: string;
|
||||
}
|
||||
|
||||
export function VersionRequirementsTab({ versionId, projectId, requirements, onLink, onUnlink, currentUserName }: Props) {
|
||||
export function VersionRequirementsTab({ versionId, projectId, requirements, devTasks, 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');
|
||||
@@ -40,29 +43,41 @@ export function VersionRequirementsTab({ versionId, projectId, requirements, onL
|
||||
<tr className="border-b border-[var(--line)]">
|
||||
<th className="px-4 py-2.5 text-[11px] font-medium uppercase tracking-wide text-[var(--ink-muted)]">编号</th>
|
||||
<th className="px-4 py-2.5 text-[11px] font-medium uppercase tracking-wide text-[var(--ink-muted)]">需求概述</th>
|
||||
<th className="px-4 py-2.5 text-[11px] font-medium uppercase tracking-wide text-[var(--ink-muted)]">描述</th>
|
||||
<th className="px-4 py-2.5 text-[11px] font-medium uppercase tracking-wide text-[var(--ink-muted)]">状态</th>
|
||||
<th className="px-4 py-2.5 text-[11px] font-medium uppercase tracking-wide text-[var(--ink-muted)]">开发状态</th>
|
||||
<th className="px-4 py-2.5 text-[11px] font-medium uppercase tracking-wide text-[var(--ink-muted)]">添加人</th>
|
||||
<th className="px-4 py-2.5 text-[11px] font-medium uppercase tracking-wide text-[var(--ink-muted)] text-right">操作</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{linkedReqs.map((req) => (
|
||||
<tr key={req.id} className="border-b border-[var(--line-soft)] last:border-0 hover:bg-[var(--bg-subtle)] transition-colors">
|
||||
<td className="px-4 py-3 font-mono text-[12px] text-[var(--ink-muted)]">{req.code}</td>
|
||||
<td className="px-4 py-3 font-medium text-[var(--ink)]">{req.title}</td>
|
||||
<td className="px-4 py-3 text-[12px] text-[var(--ink-soft)] max-w-[200px] truncate">{req.description || '-'}</td>
|
||||
<td className="px-4 py-3">
|
||||
<span className={`inline-flex items-center rounded-md px-2 py-0.5 text-[10px] font-medium border ${REQ_STATUS_COLOR[req.status]}`}>
|
||||
{REQ_STATUS_LABEL[req.status]}
|
||||
</span>
|
||||
</td>
|
||||
<td className="px-4 py-3 text-[12px] text-[var(--ink-soft)]">{req.addedToVersionBy || '-'}</td>
|
||||
<td className="px-4 py-3 text-right">
|
||||
<button onClick={() => onUnlink(req.id)} className="h-6 px-2 rounded text-[11px] font-medium text-red-500 hover:bg-red-50 transition-colors">移除</button>
|
||||
</td>
|
||||
</tr>
|
||||
))}
|
||||
{linkedReqs.map((req) => {
|
||||
const devStatus = deriveReqDevStatus(req.id, devTasks);
|
||||
const isDeveloping = !canEditRequirement(req.id, devTasks);
|
||||
return (
|
||||
<tr key={req.id} className="border-b border-[var(--line-soft)] last:border-0 hover:bg-[var(--bg-subtle)] transition-colors">
|
||||
<td className="px-4 py-3 font-mono text-[12px] text-[var(--ink-muted)]">{req.code}</td>
|
||||
<td className="px-4 py-3 font-medium text-[var(--ink)]">{req.title}</td>
|
||||
<td className="px-4 py-3">
|
||||
<span className={`inline-flex items-center rounded-md px-2 py-0.5 text-[10px] font-medium border ${REQ_STATUS_COLOR[req.status]}`}>
|
||||
{REQ_STATUS_LABEL[req.status]}
|
||||
</span>
|
||||
</td>
|
||||
<td className="px-4 py-3">
|
||||
<span className={`inline-flex items-center rounded-md px-2 py-0.5 text-[10px] font-medium ${REQ_DEV_STATUS_COLOR[devStatus]}`}>
|
||||
{REQ_DEV_STATUS_LABEL[devStatus]}
|
||||
</span>
|
||||
</td>
|
||||
<td className="px-4 py-3 text-[12px] text-[var(--ink-soft)]">{req.addedToVersionBy || '系统添加'}</td>
|
||||
<td className="px-4 py-3 text-right">
|
||||
{isDeveloping ? (
|
||||
<span className="text-[11px] text-[var(--ink-muted)]">开发中</span>
|
||||
) : (
|
||||
<button onClick={() => onUnlink(req.id)} className="h-6 px-2 rounded text-[11px] font-medium text-red-500 hover:bg-red-50 transition-colors">移除</button>
|
||||
)}
|
||||
</td>
|
||||
</tr>
|
||||
);
|
||||
})}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user