Fix unstable node sorting order

This commit is contained in:
ppanel-web 2026-02-20 05:11:10 +00:00 committed by shanshanzhong
parent 98da7b1476
commit bbea15dea4
2 changed files with 22 additions and 5 deletions

View File

@ -278,7 +278,18 @@ export default function Nodes() {
size: pagination.size,
search: filter?.search || undefined,
});
const list = (data?.data?.list || []) as API.Node[];
const rawList = (data?.data?.list || []) as API.Node[];
// Backend should ideally return nodes already sorted, but we also sort on the
// frontend to keep the UI stable (and avoid "random" order after refresh).
const list = rawList.slice().sort((a, b) => {
const as = a.sort;
const bs = b.sort;
const an = typeof as === "number" ? as : Number.POSITIVE_INFINITY;
const bn = typeof bs === "number" ? bs : Number.POSITIVE_INFINITY;
if (an !== bn) return an - bn;
// Tie-breaker to keep a stable order.
return Number(a.id) - Number(b.id);
});
const total = Number(data?.data?.total || list.length);
return { list, total };
}}

View File

@ -35,10 +35,16 @@ export function ProTableWrapper<TData extends { id?: string | number }>({
const handleDragEnd = async (event: DragEndEvent) => {
const { active, over } = event;
if (onSort) {
const updatedData = await onSort(active.id, over?.id || null, data);
// If the pointer is released outside of any droppable row, `over` can be null.
// In that case we should keep the current order (and avoid firing a sort API call).
if (!(onSort && over)) return;
// No-op when dropping onto itself.
if (String(active.id) === String(over.id)) return;
const updatedData = await onSort(active.id, over.id, data);
setData(updatedData);
}
};
if (!onSort) return children;
return (