feat(V0.2): 克隆卡片跟手浮层 + 列表组内排序 + 把手统一移到最左
Docker Build and Push / build-image (push) Successful in 1m1s

- 浮层改为激活时克隆原卡片 (DOM clone, 淡化+投影) 挂 body 顶层,
  移动直接改 transform —— 替代蓝色信息条, 所见即所拖
- 任务列表支持组内排序: 拖到本组某行上/下半显示插入指示, 松手提交
  POST /projects/:id/tasks/reorder (顶层任务按展平顺序重写 sortOrder);
  拖到其他分组仍为换列
- ⠿ 把手统一移到卡片最左: 打卡 / 列表任务行 / 看板卡片 (看板新增把手
  即按即拖路径, 与列表同款 touchstart preventDefault 双保险)
- useColumnDrag onDrop 经 ref 桥接防陈旧闭包
This commit is contained in:
jif2.zhang
2026-10-25 02:07:58 +08:00
parent 9a8313173d
commit 5066007d9d
12 changed files with 300 additions and 158 deletions
+23
View File
@@ -102,6 +102,28 @@ export default function ProjectView({ projectId, onProjectChanged, onProjectExit
} catch { /* 已回滚并提示 */ }
}
/** 组内拖动排序: 按分组顺序展平重写 sortOrder (只动顶层任务) */
const reorderTask = async (task, targetId, after) => {
const snapshot = tasks
const orderedCols = [...(columns || [])].sort((a, b) => a.sortOrder - b.sortOrder)
const groups = orderedCols.map((c) => (tasks || []).filter((t) => t.columnId === c.id)).filter((l) => l.length)
const g = groups.find((l) => l.some((t) => t.id === task.id))
if (!g) return
const rest = g.filter((t) => t.id !== task.id)
const ti = rest.findIndex((t) => t.id === targetId)
if (ti < 0) return
rest.splice(after ? ti + 1 : ti, 0, task)
const flat = groups.map((l) => (l === g ? rest : l)).flat()
const orderOf = new Map(flat.map((t, i) => [t.id, i]))
setTasks((prev) => (prev || []).map((t) => (orderOf.has(t.id) ? { ...t, sortOrder: orderOf.get(t.id) } : t)))
try {
await taskApi.reorder(projectId, flat.map((t) => t.id))
} catch (e) {
setTasks(snapshot)
Toast.show({ content: e.message || '排序保存失败' })
}
}
/** 改状态 (T-BD-14~16) */
const changeStatus = async (task, status) => {
try {
@@ -222,6 +244,7 @@ export default function ProjectView({ projectId, onProjectChanged, onProjectExit
onOpen={(t) => setOpenTask(t)}
onMore={openTaskMenu}
onMoveColumn={moveToColumn}
onReorder={reorderTask}
/>
) : (
<BoardView