diff --git a/src/components/task/Avatar.jsx b/src/components/task/Avatar.jsx new file mode 100644 index 0000000..8575fcd --- /dev/null +++ b/src/components/task/Avatar.jsx @@ -0,0 +1,22 @@ +// 负责人头像: 姓氏首字 + 按名字稳定的底色; 未指派灰色圆点 +const COLORS = ['#1677ff', '#00b578', '#ff8f1f', '#a855f7', '#14b8a6', '#f43f9e', '#5a6a80'] + +export default function Avatar({ name, size = 18 }) { + const seed = [...(name || '')].reduce((a, ch) => a + ch.charCodeAt(0), 0) + const color = COLORS[seed % COLORS.length] + return ( + + {name ? name.slice(0, 1) : '·'} + + ) +} diff --git a/src/components/task/TaskCard.jsx b/src/components/task/TaskCard.jsx index 37f1a9c..e2aff52 100644 --- a/src/components/task/TaskCard.jsx +++ b/src/components/task/TaskCard.jsx @@ -1,4 +1,5 @@ import StatusDot from './StatusDot.jsx' +import Avatar from './Avatar.jsx' import { kindColor } from '../../pages/task/kind.js' // 看板卡片 (T-UI-02): 轻量化 @@ -50,9 +51,7 @@ export default function TaskCard({ {task.kind} )} - - {task.assignee?.name || '未指派'} - + {task.members?.length > 0 && ( + {task.members.map((m) => m.name).join('、')} )} diff --git a/src/components/task/TaskRow.jsx b/src/components/task/TaskRow.jsx index 8fcd006..2d4c0d8 100644 --- a/src/components/task/TaskRow.jsx +++ b/src/components/task/TaskRow.jsx @@ -1,4 +1,5 @@ import StatusDot from './StatusDot.jsx' +import Avatar from './Avatar.jsx' import { kindColor } from '../../pages/task/kind.js' const statusLabel = (s) => (s === 'done' ? '完成' : s === 'doing' ? '执行中' : '未开始') @@ -65,9 +66,7 @@ export default function TaskRow({ onClick={(e) => { e.stopPropagation(); onMore?.(task) }} onPointerDown={(e) => e.stopPropagation()} >⋯ - - {task.assignee?.name || '未指派'} - + )}