diff --git a/src/components/task/TaskRow.jsx b/src/components/task/TaskRow.jsx index c115a83..236f7af 100644 --- a/src/components/task/TaskRow.jsx +++ b/src/components/task/TaskRow.jsx @@ -1,7 +1,10 @@ import StatusDot from './StatusDot.jsx' +const statusLabel = (s) => (s === 'done' ? '完成' : s === 'doing' ? '执行中' : '未开始') + // 列表视图的一行 (Todoist 风格, T-UI-01) // 点击行体 → 打开详情; 长按 400ms 后左右拖动换列 (bindDrag 来自 useRowDrag) +// 子任务与普通任务同构: 标题一行 + 状态元信息一行 (字体略小), 不显示分组标签 // 复选框 / ⋯ 是独立控件: pointerdown 不冒泡, 不发起拖动, // 避免长按行后抬手时合成的 click 落在控件上误触状态切换 export default function TaskRow({ @@ -27,18 +30,20 @@ export default function TaskRow({ {indent ? ( - <> +
{task.title} - - +
+ + {statusLabel(task.status)} +
+
) : ( <>
{task.title}
- {task.status === 'done' ? '完成' : task.status === 'doing' ? '执行中' : '未开始'} - {task.column?.name && {task.column.name}} + {statusLabel(task.status)} {task.assignee?.name || '未指派'} diff --git a/src/pages/task/TaskDetail.jsx b/src/pages/task/TaskDetail.jsx index 75ffe71..60abff7 100644 --- a/src/pages/task/TaskDetail.jsx +++ b/src/pages/task/TaskDetail.jsx @@ -1,10 +1,9 @@ import { useEffect, useState } from 'react' -import { ActionSheet, Dialog, Popup, Toast } from 'antd-mobile' +import { ActionSheet, Popup, Toast } from 'antd-mobile' import { taskApi } from '../../api/task.js' import { STATUS_OPTIONS, STATUS_LABEL } from './date.js' import UserPicker from '../../components/task/UserPicker.jsx' import StatusDot from '../../components/task/StatusDot.jsx' -import CopyTaskPopup from '../../components/task/CopyTaskPopup.jsx' import useKeyboardInset from '../../hooks/useKeyboardInset.js' import useOverlayBack from '../../hooks/useOverlayBack.js' @@ -25,7 +24,6 @@ export default function TaskDetail({ task, columns, members, tasks, onClose, onS const [newSub, setNewSub] = useState('') const [saving, setSaving] = useState(false) const [picker, setPicker] = useState(null) // 'assignee' | 'members' - const [copyOpen, setCopyOpen] = useState(false) const [parentPick, setParentPick] = useState(false) // 转为子任务: 选择父任务 // 键盘弹出插入量: 抬升弹层内容, 输入框不被遮挡 @@ -132,25 +130,7 @@ export default function TaskDetail({ task, columns, members, tasks, onClose, onS } } - async function removeTask() { - const ok = await Dialog.confirm({ - content: subs.length - ? `删除该任务?将一并删除 ${subs.length} 条子任务。` - : '删除该任务?', - confirmText: '删除', - }) - if (!ok) return - try { - await taskApi.remove(task.id) - Toast.show({ content: '已删除' }) - onSaved?.() - } catch (e) { - Toast.show({ content: e.message }) - } - } - - return ( -
{saving ? '保存中…' : '保存'}
-
setCopyOpen(true)}>拷贝到其他项目
-
- 删除任务{subs.length > 0 && (将一并删除 {subs.length} 条子任务)} -
setForm((p) => ({ ...p, memberIds: Array.isArray(ids) ? ids : [] }))} /> - setCopyOpen(false)} - onDone={onChanged} - /> - {/* 转为子任务: 从项目内顶层任务中选父任务 */}