forked from github/plane
13e6a67321
* Gantt Drag and drop migration and enable Dnd in Modules and Cycles Gantt * fix minor UI and code issues
43 lines
1.8 KiB
TypeScript
43 lines
1.8 KiB
TypeScript
import { IBlockUpdateData, IGanttBlock } from "../types";
|
|
|
|
export const handleOrderChange = (
|
|
draggingBlockId: string | undefined,
|
|
droppedBlockId: string | undefined,
|
|
dropAtEndOfList: boolean,
|
|
blocks: IGanttBlock[] | null,
|
|
blockUpdateHandler: (block: any, payload: IBlockUpdateData) => void
|
|
) => {
|
|
if (!blocks || !draggingBlockId || !droppedBlockId) return;
|
|
|
|
const sourceBlockIndex = blocks.findIndex((block) => block.id === draggingBlockId);
|
|
const destinationBlockIndex = dropAtEndOfList
|
|
? blocks.length
|
|
: blocks.findIndex((block) => block.id === droppedBlockId);
|
|
|
|
// return if dropped outside the list
|
|
if (sourceBlockIndex === -1 || destinationBlockIndex === -1 || sourceBlockIndex === destinationBlockIndex) return;
|
|
|
|
let updatedSortOrder = blocks[sourceBlockIndex].sort_order;
|
|
|
|
// update the sort order to the lowest if dropped at the top
|
|
if (destinationBlockIndex === 0) updatedSortOrder = blocks[0].sort_order - 1000;
|
|
// update the sort order to the highest if dropped at the bottom
|
|
else if (destinationBlockIndex === blocks.length) updatedSortOrder = blocks[blocks.length - 1].sort_order + 1000;
|
|
// update the sort order to the average of the two adjacent blocks if dropped in between
|
|
else {
|
|
const destinationSortingOrder = blocks[destinationBlockIndex].sort_order;
|
|
const relativeDestinationSortingOrder = blocks[destinationBlockIndex - 1].sort_order;
|
|
|
|
updatedSortOrder = (destinationSortingOrder + relativeDestinationSortingOrder) / 2;
|
|
}
|
|
|
|
// call the block update handler with the updated sort order, new and old index
|
|
blockUpdateHandler(blocks[sourceBlockIndex].data, {
|
|
sort_order: {
|
|
destinationIndex: destinationBlockIndex,
|
|
newSortOrder: updatedSortOrder,
|
|
sourceIndex: sourceBlockIndex,
|
|
},
|
|
});
|
|
};
|