react-beautiful-dnd
Version:
Beautiful, accessible drag and drop for lists with React.js
108 lines (79 loc) • 2.98 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _toConsumableArray2 = require('babel-runtime/helpers/toConsumableArray');
var _toConsumableArray3 = _interopRequireDefault(_toConsumableArray2);
var _getDraggablesInsideDroppable = require('../get-draggables-inside-droppable');
var _getDraggablesInsideDroppable2 = _interopRequireDefault(_getDraggablesInsideDroppable);
var _isWithinVisibleBoundsOfDroppable = require('../is-within-visible-bounds-of-droppable');
var _position = require('../position');
var _moveToEdge = require('../move-to-edge');
var _moveToEdge2 = _interopRequireDefault(_moveToEdge);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
exports.default = function (_ref) {
var isMovingForward = _ref.isMovingForward,
draggableId = _ref.draggableId,
impact = _ref.impact,
droppable = _ref.droppable,
draggables = _ref.draggables;
if (!impact.destination) {
console.error('cannot move to next index when there is not previous destination');
return null;
}
var location = impact.destination;
var draggable = draggables[draggableId];
var axis = droppable.axis;
var insideForeignDroppable = (0, _getDraggablesInsideDroppable2.default)(droppable, draggables);
var currentIndex = location.index;
var proposedIndex = isMovingForward ? currentIndex + 1 : currentIndex - 1;
var lastIndex = insideForeignDroppable.length - 1;
if (proposedIndex > insideForeignDroppable.length) {
return null;
}
if (proposedIndex < 0) {
return null;
}
var movingRelativeTo = insideForeignDroppable[Math.min(proposedIndex, lastIndex)];
var isMovingPastLastIndex = proposedIndex > lastIndex;
var sourceEdge = 'start';
var destinationEdge = function () {
if (isMovingPastLastIndex) {
return 'end';
}
return 'start';
}();
var newCenter = (0, _moveToEdge2.default)({
source: draggable.page.withoutMargin,
sourceEdge: sourceEdge,
destination: movingRelativeTo.page.withMargin,
destinationEdge: destinationEdge,
destinationAxis: droppable.axis
});
var isVisible = function () {
if (isMovingPastLastIndex) {
return true;
}
return (0, _isWithinVisibleBoundsOfDroppable.isPointWithinDroppable)(droppable)(newCenter);
}();
if (!isVisible) {
return null;
}
var moved = isMovingForward ? impact.movement.draggables.slice(1, impact.movement.draggables.length) : [movingRelativeTo.id].concat((0, _toConsumableArray3.default)(impact.movement.draggables));
var newImpact = {
movement: {
draggables: moved,
amount: (0, _position.patch)(axis.line, draggable.page.withMargin[axis.size]),
isBeyondStartPosition: false
},
destination: {
droppableId: droppable.id,
index: proposedIndex
},
direction: droppable.axis.direction
};
return {
pageCenter: newCenter,
impact: newImpact
};
};