mirror of
https://github.com/cpvalente/ontime.git
synced 2026-09-01 12:29:10 +00:00
72 lines
1.7 KiB
TypeScript
72 lines
1.7 KiB
TypeScript
import {
|
|
DndContext,
|
|
DragEndEvent,
|
|
PointerSensor,
|
|
TouchSensor,
|
|
closestCorners,
|
|
useSensor,
|
|
useSensors,
|
|
} from '@dnd-kit/core';
|
|
import { PropsWithChildren } from 'react';
|
|
|
|
import type { CuesheetColumnDef } from '../cuesheet-table/cuesheetTable.features';
|
|
import { useColumnOrder } from '../cuesheet-table/useColumnManager';
|
|
|
|
interface CuesheetDndProps {
|
|
columns: CuesheetColumnDef[];
|
|
tableRoot?: 'editor' | 'cuesheet';
|
|
}
|
|
|
|
export default function CuesheetDnd({
|
|
columns,
|
|
tableRoot = 'cuesheet',
|
|
children,
|
|
}: PropsWithChildren<CuesheetDndProps>) {
|
|
const { columnOrder, saveColumnOrder } = useColumnOrder(columns, tableRoot);
|
|
|
|
const sensors = useSensors(
|
|
useSensor(PointerSensor, {
|
|
activationConstraint: {
|
|
delay: 100,
|
|
tolerance: 50,
|
|
},
|
|
}),
|
|
useSensor(TouchSensor, {
|
|
activationConstraint: {
|
|
delay: 100,
|
|
tolerance: 50,
|
|
},
|
|
}),
|
|
);
|
|
|
|
const handleOnDragEnd = (event: DragEndEvent) => {
|
|
const { delta, active, over } = event;
|
|
|
|
// cancel if delta y is greater than 200
|
|
if (delta.y > 200) return;
|
|
// cancel if we do not have an over id
|
|
if (over?.id == null) return;
|
|
|
|
// get index of from
|
|
const fromIndex = columnOrder.indexOf(active.id as string);
|
|
|
|
// get index of to
|
|
const toIndex = columnOrder.indexOf(over.id as string);
|
|
|
|
if (toIndex === -1) {
|
|
return;
|
|
}
|
|
|
|
const reorderedCols = [...columnOrder];
|
|
const reorderedItem = reorderedCols.splice(fromIndex, 1);
|
|
reorderedCols.splice(toIndex, 0, reorderedItem[0]);
|
|
saveColumnOrder(reorderedCols);
|
|
};
|
|
|
|
return (
|
|
<DndContext sensors={sensors} collisionDetection={closestCorners} onDragEnd={handleOnDragEnd}>
|
|
{children}
|
|
</DndContext>
|
|
);
|
|
}
|