UNPKG

react-kanban-kit

Version:

A flexible and customizable Kanban board component for React applications, built with TypeScript and modern drag-and-drop functionality powered by Atlassian's pragmatic-drag-and-drop.

208 lines (207 loc) 8.11 kB
import { extractClosestEdge } from "../../node_modules/@atlaskit/pragmatic-drag-and-drop-hitbox/dist/esm/closest-edge.es.js"; import { reorderWithEdge } from "../../node_modules/@atlaskit/pragmatic-drag-and-drop-hitbox/dist/esm/reorder-with-edge.es.js"; const isCardData = (data) => (data == null ? void 0 : data.type) === "card"; const isColumnData = (data) => (data == null ? void 0 : data.type) === "column"; const getTasksByColumnId = (columnId, dataSource) => { const tasks = []; const column = dataSource[columnId]; if (!column) return tasks; const parentTasks = column.children; parentTasks == null ? void 0 : parentTasks.forEach((taskId) => { const task = dataSource[taskId]; if (task) tasks.push(task); }); return tasks; }; const handleCardDrop = ({ source, location, columns, dataSource, onCardMove, onColumnMove }) => { if (isColumnData(source.data)) { if (!onColumnMove) return; const sourceColumnId2 = source.data.columnId; const innerMost2 = location.current.dropTargets[0]; if (!innerMost2) return; const dropTargetData2 = innerMost2.data; if (isColumnData(dropTargetData2)) { const targetColumnId = dropTargetData2.columnId; const targetIndex = columns.findIndex((col) => col.id === targetColumnId); if (targetIndex === -1) return; if (sourceColumnId2 === targetColumnId) return; onColumnMove == null ? void 0 : onColumnMove({ columnId: sourceColumnId2, fromIndex: columns.findIndex((col) => col.id === sourceColumnId2), toIndex: targetIndex }); } return; } if (!isCardData(source.data)) { return; } const draggingCardId = source.data.itemId; const sourceColumnId = source.data.columnId; const innerMost = location.current.dropTargets[0]; if (!innerMost) return; const dropTargetData = innerMost.data; if (dropTargetData["card-drop-target"]) { const targetColumnId = dropTargetData.columnId; const targetCardId = dropTargetData.itemId; const closestEdge = extractClosestEdge(dropTargetData); const sourceColumn = dataSource[sourceColumnId]; const targetColumn = dataSource[targetColumnId]; if (!sourceColumn || !targetColumn) return; if (sourceColumnId === targetColumnId) { const allTasks = getTasksByColumnId(targetColumnId, dataSource); const sourceIndex = allTasks.findIndex((task) => task.id === draggingCardId); const targetIndex = allTasks.findIndex((task) => task.id === targetCardId); if (sourceIndex === -1 || targetIndex === -1) return; if (sourceIndex === targetIndex) return; const reordered = reorderWithEdge({ axis: "vertical", list: allTasks, startIndex: sourceIndex, indexOfTarget: targetIndex, closestEdgeOfTarget: closestEdge }); const newPosition = reordered.findIndex((task) => task.id === draggingCardId); const taskAbove = newPosition > 0 ? reordered[newPosition - 1] : null; const taskBelow = newPosition < reordered.length - 1 ? reordered[newPosition + 1] : null; if (onCardMove) { onCardMove({ cardId: draggingCardId, fromColumnId: sourceColumnId, toColumnId: targetColumnId, taskAbove: taskAbove == null ? void 0 : taskAbove.id, taskBelow: taskBelow == null ? void 0 : taskBelow.id, position: newPosition }); } } else { const allTargetTasks = getTasksByColumnId(targetColumnId, dataSource); const targetIndex = allTargetTasks.findIndex((task) => task.id === targetCardId); if (targetIndex === -1) return; const finalIndex = closestEdge === "bottom" ? targetIndex + 1 : targetIndex; const draggingTask = getTasksByColumnId(sourceColumnId, dataSource).find((task) => task.id === draggingCardId); if (!draggingTask) return; const tempArray = [...allTargetTasks]; tempArray.splice(finalIndex, 0, draggingTask); const reordered = reorderWithEdge({ axis: "vertical", list: tempArray, startIndex: finalIndex, indexOfTarget: finalIndex, closestEdgeOfTarget: closestEdge }); const newPosition = reordered.findIndex((task) => task.id === draggingCardId); const taskAbove = newPosition > 0 ? reordered[newPosition - 1] : null; const taskBelow = newPosition < reordered.length - 1 ? reordered[newPosition + 1] : null; if (onCardMove) { onCardMove({ cardId: draggingCardId, fromColumnId: sourceColumnId, toColumnId: targetColumnId, taskAbove: taskAbove == null ? void 0 : taskAbove.id, taskBelow: taskBelow == null ? void 0 : taskBelow.id, position: newPosition }); } } } else if (isColumnData(dropTargetData)) { const targetColumnId = dropTargetData.columnId; const targetTasks = getTasksByColumnId(targetColumnId, dataSource); const taskAbove = targetTasks.length > 0 ? targetTasks[targetTasks.length - 1] : null; if (onCardMove) { onCardMove({ cardId: draggingCardId, fromColumnId: sourceColumnId, toColumnId: targetColumnId, taskAbove: taskAbove == null ? void 0 : taskAbove.id, taskBelow: null, position: targetTasks.length }); } } }; const dropColumnHandler = (drop, dataSource) => { var _a; const { columnId, position } = drop; const newDataSource = { ...dataSource }; const rootChildren = [...((_a = newDataSource["root"]) == null ? void 0 : _a.children) || []]; const currentIndex = rootChildren.indexOf(columnId); if (currentIndex === -1) return newDataSource; rootChildren.splice(currentIndex, 1); rootChildren.splice(position, 0, columnId); if (newDataSource["root"]) { newDataSource["root"].children = rootChildren; } return newDataSource; }; const dropHandler = (drop, dataSource, updateDroppedItem, updateDestinationColumn, updateSourceColumn) => { var _a, _b, _c, _d, _e, _f, _g; const { cardId, fromColumnId, toColumnId, taskAbove, taskBelow } = drop; const newDataSource = { ...dataSource }; if ((_a = newDataSource[fromColumnId]) == null ? void 0 : _a.children) { newDataSource[fromColumnId].children = newDataSource[fromColumnId].children.filter((id) => id !== cardId); if (((_b = newDataSource[fromColumnId]) == null ? void 0 : _b.totalItems) !== void 0 && newDataSource[fromColumnId].totalItems > 0) newDataSource[fromColumnId].totalItems--; } if (updateSourceColumn && newDataSource[fromColumnId]) newDataSource[fromColumnId] = updateSourceColumn(newDataSource[fromColumnId]); const targetChildren = ((_c = newDataSource[toColumnId]) == null ? void 0 : _c.children) || []; let insertIndex = 0; if (taskAbove) insertIndex = targetChildren.indexOf(taskAbove) + 1; else if (taskBelow) insertIndex = targetChildren.indexOf(taskBelow); const alreadyExistInTarget = targetChildren.includes(cardId); if (((_d = newDataSource[toColumnId]) == null ? void 0 : _d.totalItems) !== void 0 && !alreadyExistInTarget) newDataSource[toColumnId].totalItems++; if (updateDroppedItem && newDataSource[cardId]) { const updatedItem = updateDroppedItem == null ? void 0 : updateDroppedItem(newDataSource[toColumnId], newDataSource[cardId]); newDataSource[cardId] = updatedItem || newDataSource[cardId]; } if ((_e = newDataSource[toColumnId]) == null ? void 0 : _e.children) { newDataSource[toColumnId].children = (_g = (_f = newDataSource[toColumnId]) == null ? void 0 : _f.children) == null ? void 0 : _g.filter((id) => id !== cardId); newDataSource[toColumnId].children.splice(insertIndex, 0, cardId); } if (updateDestinationColumn && newDataSource[toColumnId]) newDataSource[toColumnId] = updateDestinationColumn(newDataSource[toColumnId]); return newDataSource; }; export { dropColumnHandler, dropHandler, handleCardDrop }; //# sourceMappingURL=dropManager.es.js.map