(null)
const [reordering, setReordering] = useState(false)
useEffect(() => {
@@ -1420,25 +1422,12 @@ function CardsPanel({
onReload()
}
- const reorder = async (targetId: number) => {
- const from = dragId
- setDragId(null)
- setOverId(null)
- if (from === null || from === targetId) return
-
- const original = cards.map((card) => card.id)
- const fromIndex = original.indexOf(from)
- const targetIndex = original.indexOf(targetId)
- if (fromIndex < 0 || targetIndex < 0) return
-
- const ids = original.filter((id) => id !== from)
- const targetAfter = ids.indexOf(targetId)
- // 向下拖时插到目标之后,保证能拖到列表最后一项;向上拖时插到目标之前
- const insertAt = fromIndex < targetIndex ? targetAfter + 1 : targetAfter
- ids.splice(insertAt, 0, from)
-
+ /** 排序:组件给回完整的 key 顺序,逐个写 sort 字段 */
+ const reorder = async (keys: string[]) => {
setReordering(true)
- const results = await Promise.all(ids.map((id, index) => updateCard(id, { sort: index })))
+ const results = await Promise.all(
+ keys.map((key, index) => updateCard(Number(key), { sort: index })),
+ )
setReordering(false)
if (results.some((result) => !result.ok)) {
toast.error('排序保存失败')
@@ -1474,54 +1463,18 @@ function CardsPanel({
)}
-
- {cards.map((card) => (
-
- ))}
- {cards.length === 0 && (
-
- 还没有卡片,先新建一张。
-
- )}
-
+ ({
+ key: String(card.id),
+ label: card.title,
+ meta: card.key === 'local-service' ? projects.length : card.groups.length,
+ }))}
+ activeKey={active === undefined ? undefined : String(active.id)}
+ onSelect={(key) => setActiveId(Number(key))}
+ onReorder={(keys) => void reorder(keys)}
+ disabled={reordering}
+ emptyText="还没有卡片,先新建一张。"
+ />