From 20a5105c2388d2edf7e944c838f7ec09304b4e34 Mon Sep 17 00:00:00 2001 From: "jif2.zhang" Date: Sun, 25 Oct 2026 00:23:01 +0800 Subject: [PATCH] =?UTF-8?q?refactor(V0.2):=20=E8=AF=A6=E6=83=85=E9=A1=B5?= =?UTF-8?q?=E7=B2=BE=E7=AE=80=20+=20=E5=88=97=E8=A1=A8=E8=A1=8C=E6=A0=B7?= =?UTF-8?q?=E5=BC=8F=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 任务详情: 移除底部「拷贝到其他项目 / 删除任务」按钮 (⋯ 菜单仍保留入口), 清理相关死代码 - 列表子任务: 改为与普通任务同构的两行布局 (标题 + 左侧状态点/状态文字, 字体略小) - 列表任务卡片第二行不再显示看板分组标签 --- src/components/task/TaskRow.jsx | 15 +++++++++----- src/pages/task/TaskDetail.jsx | 35 ++------------------------------- src/styles/globals.css | 9 +++++---- 3 files changed, 17 insertions(+), 42 deletions(-) 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} - /> - {/* 转为子任务: 从项目内顶层任务中选父任务 */}