UNPKG

@atlaskit/pragmatic-drag-and-drop-react-beautiful-dnd-migration

Version:

An optional Pragmatic drag and drop package that enables rapid migration from react-beautiful-dnd to Pragmatic drag and drop

72 lines (70 loc) 2.4 kB
// eslint-disable-next-line import/no-extraneous-dependencies import { rbdInvariant } from '../../drag-drop-context/rbd-invariant'; import { customAttributes, getAttribute } from '../../utils/attributes'; import { getElementByDraggableLocation } from '../../utils/get-element-by-draggable-location'; import { getDistance } from './get-distance'; function getDroppableId(element) { return getAttribute(element, customAttributes.draggable.droppableId); } function getIndex(element) { var value = getAttribute(element, customAttributes.draggable.index); var index = parseInt(value); rbdInvariant(Number.isInteger(index), "invalid index: '".concat(index, "' is not an integer")); return index; } /** * ASSUMPTIONS: * - Adjacent `<Draggable>` items are visually adjacent. * - If there is an adjacent element, it is rendered. */ export function calculateGap(_ref) { var element = _ref.element, where = _ref.where, direction = _ref.direction, contextId = _ref.contextId; var droppableId = getDroppableId(element); var index = getIndex(element); var indexBefore = index - 1; var indexAfter = index + 1; var isBefore = where === 'before'; var adjacentElement = getElementByDraggableLocation(contextId, { droppableId: droppableId, index: isBefore ? indexBefore : indexAfter }); if (adjacentElement === null) { /** * If there is no adjacent element, we can guess based on margins. */ var _getComputedStyle = getComputedStyle(element), marginTop = _getComputedStyle.marginTop, marginRight = _getComputedStyle.marginRight, marginBottom = _getComputedStyle.marginBottom, marginLeft = _getComputedStyle.marginLeft; if (direction === 'horizontal') { return parseFloat(marginLeft) + parseFloat(marginRight); } return parseFloat(marginTop) + parseFloat(marginBottom); } var distance = getDistance({ direction: direction, a: element.getBoundingClientRect(), b: adjacentElement.getBoundingClientRect() }); return distance; } export function getGapOffset(_ref2) { var element = _ref2.element, where = _ref2.where, direction = _ref2.direction, contextId = _ref2.contextId; var gap = calculateGap({ element: element, where: where, direction: direction, contextId: contextId }); if (where === 'before') { return -gap / 2; } return gap / 2; }