react-beautiful-dnd
Version:
Beautiful, accessible drag and drop for lists with React.js
121 lines (84 loc) • 3.64 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _keys = require('babel-runtime/core-js/object/keys');
var _keys2 = _interopRequireDefault(_keys);
var _memoizeOne = require('memoize-one');
var _memoizeOne2 = _interopRequireDefault(_memoizeOne);
var _getArea = require('./get-area');
var _getArea2 = _interopRequireDefault(_getArea);
var _getDraggablesInsideDroppable = require('./get-draggables-inside-droppable');
var _getDraggablesInsideDroppable2 = _interopRequireDefault(_getDraggablesInsideDroppable);
var _isPositionInFrame = require('./visibility/is-position-in-frame');
var _isPositionInFrame2 = _interopRequireDefault(_isPositionInFrame);
var _position = require('./position');
var _spacing = require('./spacing');
var _dimension = require('./dimension');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var getRequiredGrowth = (0, _memoizeOne2.default)(function (draggable, draggables, droppable) {
var dimensions = (0, _getDraggablesInsideDroppable2.default)(droppable, draggables);
if (!dimensions.length) {
return null;
}
var endOfDraggables = dimensions[dimensions.length - 1].page.withMargin[droppable.axis.end];
var endOfDroppable = droppable.page.withMargin[droppable.axis.end];
var existingSpace = endOfDroppable - endOfDraggables;
var requiredSpace = draggable.page.withMargin[droppable.axis.size];
if (requiredSpace <= existingSpace) {
return null;
}
var requiredGrowth = (0, _position.patch)(droppable.axis.line, requiredSpace - existingSpace);
return requiredGrowth;
});
var getWithGrowth = (0, _memoizeOne2.default)(function (area, growth) {
return (0, _getArea2.default)((0, _spacing.addPosition)(area, growth));
});
var getClippedAreaWithPlaceholder = function getClippedAreaWithPlaceholder(_ref) {
var draggable = _ref.draggable,
draggables = _ref.draggables,
droppable = _ref.droppable,
previousDroppableOverId = _ref.previousDroppableOverId;
var isHome = draggable.descriptor.droppableId === droppable.descriptor.id;
var isOver = Boolean(previousDroppableOverId && previousDroppableOverId === droppable.descriptor.id);
var subject = droppable.viewport.subject;
var frame = droppable.viewport.frame;
var clipped = droppable.viewport.clipped;
if (!clipped) {
return clipped;
}
if (isHome || !isOver) {
return clipped;
}
var requiredGrowth = getRequiredGrowth(draggable, draggables, droppable);
if (!requiredGrowth) {
return clipped;
}
var isClippedByFrame = subject[droppable.axis.size] !== frame[droppable.axis.size];
var subjectWithGrowth = getWithGrowth(subject, requiredGrowth);
if (!isClippedByFrame) {
return subjectWithGrowth;
}
return (0, _dimension.clip)(frame, subjectWithGrowth);
};
exports.default = function (_ref2) {
var target = _ref2.target,
draggable = _ref2.draggable,
draggables = _ref2.draggables,
droppables = _ref2.droppables,
previousDroppableOverId = _ref2.previousDroppableOverId;
var maybe = (0, _keys2.default)(droppables).map(function (id) {
return droppables[id];
}).filter(function (droppable) {
return droppable.isEnabled;
}).find(function (droppable) {
var withPlaceholder = getClippedAreaWithPlaceholder({
draggable: draggable, draggables: draggables, droppable: droppable, previousDroppableOverId: previousDroppableOverId
});
if (!withPlaceholder) {
return false;
}
return (0, _isPositionInFrame2.default)(withPlaceholder)(target);
});
return maybe ? maybe.descriptor.id : null;
};