react-beautiful-dnd
Version:
Beautiful, accessible drag and drop for lists with React.js
152 lines (109 loc) • 4.21 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _toConsumableArray2 = require('babel-runtime/helpers/toConsumableArray');
var _toConsumableArray3 = _interopRequireDefault(_toConsumableArray2);
var _memoizeOne = require('memoize-one');
var _memoizeOne2 = _interopRequireDefault(_memoizeOne);
var _getDraggablesInsideDroppable = require('../get-draggables-inside-droppable');
var _getDraggablesInsideDroppable2 = _interopRequireDefault(_getDraggablesInsideDroppable);
var _position = require('../position');
var _isVisibleInNewLocation = require('./is-visible-in-new-location');
var _isVisibleInNewLocation2 = _interopRequireDefault(_isVisibleInNewLocation);
var _getViewport = require('../visibility/get-viewport');
var _getViewport2 = _interopRequireDefault(_getViewport);
var _moveToEdge = require('../move-to-edge');
var _moveToEdge2 = _interopRequireDefault(_moveToEdge);
var _getDisplacement = require('../get-displacement');
var _getDisplacement2 = _interopRequireDefault(_getDisplacement);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var getIndex = (0, _memoizeOne2.default)(function (draggables, target) {
return draggables.indexOf(target);
});
exports.default = function (_ref) {
var isMovingForward = _ref.isMovingForward,
draggableId = _ref.draggableId,
previousImpact = _ref.previousImpact,
droppable = _ref.droppable,
draggables = _ref.draggables;
var location = previousImpact.destination;
if (!location) {
console.error('cannot move to next index when there is not previous destination');
return null;
}
var draggable = draggables[draggableId];
var axis = droppable.axis;
var insideDroppable = (0, _getDraggablesInsideDroppable2.default)(droppable, draggables);
var startIndex = getIndex(insideDroppable, draggable);
var currentIndex = location.index;
var proposedIndex = isMovingForward ? currentIndex + 1 : currentIndex - 1;
if (startIndex === -1) {
console.error('could not find draggable inside current droppable');
return null;
}
if (proposedIndex > insideDroppable.length - 1) {
return null;
}
if (proposedIndex < 0) {
return null;
}
var destination = insideDroppable[proposedIndex];
var isMovingTowardStart = isMovingForward && proposedIndex <= startIndex || !isMovingForward && proposedIndex >= startIndex;
var edge = function () {
if (!isMovingTowardStart) {
return isMovingForward ? 'end' : 'start';
}
return isMovingForward ? 'start' : 'end';
}();
var newCenter = (0, _moveToEdge2.default)({
source: draggable.page.withoutMargin,
sourceEdge: edge,
destination: destination.page.withoutMargin,
destinationEdge: edge,
destinationAxis: droppable.axis
});
var viewport = (0, _getViewport2.default)();
var isVisible = (0, _isVisibleInNewLocation2.default)({
draggable: draggable,
destination: droppable,
newCenter: newCenter,
viewport: viewport
});
if (!isVisible) {
return null;
}
var destinationDisplacement = {
draggableId: destination.descriptor.id,
isVisible: true,
shouldAnimate: true
};
var modified = isMovingTowardStart ? previousImpact.movement.displaced.slice(1, previousImpact.movement.displaced.length) : [destinationDisplacement].concat((0, _toConsumableArray3.default)(previousImpact.movement.displaced));
var displaced = modified.map(function (displacement) {
var target = draggables[displacement.draggableId];
var updated = (0, _getDisplacement2.default)({
draggable: target,
destination: droppable,
previousImpact: previousImpact,
viewport: viewport
});
return updated;
});
var newImpact = {
movement: {
displaced: displaced,
amount: (0, _position.patch)(axis.line, draggable.page.withMargin[axis.size]),
isBeyondStartPosition: proposedIndex > startIndex
},
destination: {
droppableId: droppable.descriptor.id,
index: proposedIndex
},
direction: droppable.axis.direction
};
var result = {
pageCenter: newCenter,
impact: newImpact
};
return result;
};