Docker Build and Push / build-image (push) Successful in 4m13s
1. 任务 ⋯ 菜单 (列表行与看板卡片): 编辑 / 拷贝到其他项目 / 删除 (antd-mobile ActionSheet, 带任务名标题; 拷贝抽出为 CopyTaskPopup 复用) 2. 点击任务非按钮区域 = 打开编辑页 (原本即如此, ⋯ 不再误触为编辑) 3. 修复状态选择器堆成三行: 此前 .seg 只有 .pv-head 作用域样式, 详情弹层裸用导致纵向堆叠; 新增通用 .seg 分段样式, 当前项高亮点按即切 4. 移除任务的扩展信息 UI (T-TK-04~07 标注已取消, 决策 35): ExtrasCard 组件删除, DB extras 字段保留不再使用; 项目相关长文本由项目信息块 (T-PJ-13) 承载 5. 任务移动入口: 详情页新增「看板列」ActionSheet 换列(联动裁决不变) 与「层级」区(转为子任务=选父任务 / 转为顶层), 覆盖无法拖拽的场景 6. 列表页移除「+ 子任务」入口: 添加子任务只在详情页, 或经转子任务 已验证: 99 文件语法 0 错误、导入 0 缺失、文档 149 条/决策 35 连续
64 lines
2.0 KiB
React
64 lines
2.0 KiB
React
import StatusDot from './StatusDot.jsx'
|
|
|
|
// 看板卡片 (T-UI-02): 轻量化
|
|
// - 标题 + 状态点 (T-ST-09)
|
|
// - 负责人 12px/600 突出 (T-AS-01); 任务成员 10.5px 弱化置于下方 (T-AS-02)
|
|
// - 子任务内嵌简洁展示 + 可直接勾选 (T-ST-06/07)
|
|
const MAX_SUB = 3
|
|
|
|
export default function TaskCard({
|
|
task, bindDrag, onClick, onToggleSub, onToggle, onMore, dragging = false, highlight = false,
|
|
}) {
|
|
const children = task.children || []
|
|
const shown = children.slice(0, MAX_SUB)
|
|
const rest = children.length - shown.length
|
|
|
|
return (
|
|
<div
|
|
className={`bcard${dragging ? ' dragging' : ''}${highlight ? ' hl' : ''}`}
|
|
data-task-id={task.id}
|
|
onClick={onClick}
|
|
{...(bindDrag ? bindDrag(task) : {})}
|
|
>
|
|
<div className="brow1">
|
|
<span className="btitle">{task.title}</span>
|
|
<span
|
|
className="bstat"
|
|
onClick={(e) => { e.stopPropagation(); onToggle?.(task) }}
|
|
title="点按切换完成"
|
|
>
|
|
<StatusDot status={task.status} />
|
|
</span>
|
|
</div>
|
|
|
|
<div className="bmeta">
|
|
<span className={`bassignee${task.assignee ? '' : ' none'}`}>
|
|
{task.assignee?.name || '未指派'}
|
|
</span>
|
|
{task.members?.length > 0 && (
|
|
<span className="bmembers">+ {task.members.map((m) => m.name).join('、')}</span>
|
|
)}
|
|
{onMore && (
|
|
<span
|
|
className="bmore-btn"
|
|
onClick={(e) => { e.stopPropagation(); onMore(task) }}
|
|
>⋯</span>
|
|
)}
|
|
</div>
|
|
|
|
{shown.map((c) => (
|
|
<div
|
|
key={c.id}
|
|
className={`bsub${c.status === 'done' ? ' done' : ''}`}
|
|
onClick={(e) => { e.stopPropagation(); onToggleSub?.(c) }}
|
|
>
|
|
<span className="sbox" />
|
|
<span className="stitle">{c.title}</span>
|
|
<StatusDot status={c.status} />
|
|
</div>
|
|
))}
|
|
{rest > 0 && <div className="bmore">+{rest} 个子任务</div>}
|
|
</div>
|
|
)
|
|
}
|