react-ant-dragger
Version:
Component-based drag and drop for React.js
404 lines (352 loc) • 14.8 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _react = require('react');
var _react2 = _interopRequireDefault(_react);
var _propTypes = require('prop-types');
var _propTypes2 = _interopRequireDefault(_propTypes);
var _reactDnd = require('react-dnd');
var _shallowEqual = require('react-dnd/lib/utils/shallowEqual');
var _shallowEqual2 = _interopRequireDefault(_shallowEqual);
var _EventType = require('./EventType');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var Draggable = function (_React$Component) {
_inherits(Draggable, _React$Component);
function Draggable() {
_classCallCheck(this, Draggable);
return _possibleConstructorReturn(this, (Draggable.__proto__ || Object.getPrototypeOf(Draggable)).apply(this, arguments));
}
_createClass(Draggable, [{
key: 'getChildContext',
value: function getChildContext() {
return {
dragSourceCreator: this.props.connectDragSource,
dragCursor: this.props.dragCursor,
dragHandlerType: this.props.dragHandlerType
};
}
}, {
key: 'componentDidMount',
value: function componentDidMount() {
var _props = this.props,
children = _props.children,
dragToken = _props.dragToken,
draggerPreview = _props.draggerPreview,
connectDragPreview = _props.connectDragPreview;
if (draggerPreview && typeof draggerPreview === 'function') {
var node = draggerPreview(dragToken(), children.props);
if (typeof node === 'function') {
node(connectDragPreview);
} else if (typeof node.then === 'function') {
node.then(connectDragPreview);
} else {
connectDragPreview(node);
}
}
}
}, {
key: 'componentDidUpdate',
value: function componentDidUpdate(prevProps, prevState) {
var _props2 = this.props,
dragToken = _props2.dragToken,
dispatcher = _props2.dispatcher,
currIsOver = _props2.isOver,
item = _props2.item;
var prevIsOver = prevProps.isOver;
if (!prevIsOver && currIsOver) {
// enter
dispatcher(_EventType.ENTER, {
source: item && item.$source,
target: dragToken(),
props: this.props,
component: this
});
} else if (!currIsOver && prevIsOver) {
// leave
dispatcher(_EventType.LEAVE, {
source: item && item.$source,
target: dragToken(),
props: this.props,
component: this
});
}
}
}, {
key: 'render',
value: function render() {
var _props3 = this.props,
children = _props3.children,
dispatcher = _props3.dispatcher,
dragToken = _props3.dragToken,
dragCursor = _props3.dragCursor,
draggingHint = _props3.draggingHint,
dragHandlerType = _props3.dragHandlerType,
Tag = _props3.wrapTag,
wrapStyle = _props3.wrapStyle,
wrapClassName = _props3.wrapClassName,
draggerPreview = _props3.draggerPreview,
connectDragSource = _props3.connectDragSource,
connectDropTarget = _props3.connectDropTarget,
connectDragPreview = _props3.connectDragPreview,
isDragging = _props3.isDragging,
isOver = _props3.isOver,
item = _props3.item,
itemType = _props3.itemType,
differenceFromInitialOffset = _props3.differenceFromInitialOffset,
initialClientOffset = _props3.initialClientOffset,
initialSourceClientOffset = _props3.initialSourceClientOffset,
clientOffset = _props3.clientOffset,
sourceClientOffset = _props3.sourceClientOffset,
otherProps = _objectWithoutProperties(_props3, ['children', 'dispatcher', 'dragToken', 'dragCursor', 'draggingHint', 'dragHandlerType', 'wrapTag', 'wrapStyle', 'wrapClassName', 'draggerPreview', 'connectDragSource', 'connectDropTarget', 'connectDragPreview', 'isDragging', 'isOver', 'item', 'itemType', 'differenceFromInitialOffset', 'initialClientOffset', 'initialSourceClientOffset', 'clientOffset', 'sourceClientOffset']);
var className = wrapClassName;
if (typeof className !== 'string' && typeof className.join === 'function') {
className = className.join(' ');
}
var style = _extends({
cursor: dragHandlerType !== 'default' ? 'auto' : dragCursor
}, wrapStyle);
var props = _extends({
className: className,
style: style
}, otherProps);
var child = children;
if (typeof child !== 'string') {
child = _react2.default.Children.only(child);
}
if (isDragging && typeof draggingHint === 'function' && differenceFromInitialOffset !== null) {
var newProps = draggingHint(props, child);
if (newProps) {
props = newProps;
}
}
if (typeof child.type !== 'string') {
child = _react2.default.createElement(
Tag,
props,
child
);
} else {
child = _react2.default.cloneElement(child, _extends({}, child.props, props, {
style: _extends({}, child.props.style, props.style)
}));
}
if (!draggerPreview) {
child = connectDragPreview(child);
}
if (dragHandlerType === 'default') {
child = connectDragSource(child);
}
return connectDropTarget(child);
}
}]);
return Draggable;
}(_react2.default.Component);
Draggable.childContextTypes = {
dragSourceCreator: _propTypes2.default.func,
dragCursor: _propTypes2.default.string,
dragHandlerType: _propTypes2.default.string
};
var DraggableWrapper = function (_React$Component2) {
_inherits(DraggableWrapper, _React$Component2);
function DraggableWrapper(props, context) {
_classCallCheck(this, DraggableWrapper);
var _this2 = _possibleConstructorReturn(this, (DraggableWrapper.__proto__ || Object.getPrototypeOf(DraggableWrapper)).call(this, props, context));
_this2.dragSource = {
beginDrag: _this2.dispatchBeginDragEvent.bind(_this2),
endDrag: _this2.dispatchEndDragEvent.bind(_this2),
canDrag: _this2.dispatchCanDragEvent.bind(_this2)
};
_this2.dropTarget = {
hover: _this2.dispatchHoverEvent.bind(_this2),
drop: _this2.dispatchDropEvent.bind(_this2),
canDrop: _this2.dispatchCanDropEvent.bind(_this2)
};
_this2.cachedWrapped = undefined;
return _this2;
}
_createClass(DraggableWrapper, [{
key: 'componentWillUnmount',
value: function componentWillUnmount() {
this.cachedWrapped = undefined;
}
}, {
key: 'dispatchBeginDragEvent',
value: function dispatchBeginDragEvent(props, monitor, component) {
var source = this.props.dragToken();
var result = this.context.dispatcher(_EventType.BEGIN_DRAG, {
source: source,
props: props,
component: component
});
if (result === undefined) {
result = {};
}
if (result.dragToken === undefined) {
result.dragToken = source;
}
result.$target = result.$source = result.dragToken;
return result;
}
}, {
key: 'dispatchEndDragEvent',
value: function dispatchEndDragEvent(props, monitor, component) {
var _monitor$getItem = monitor.getItem(),
target = _monitor$getItem.$target,
source = _monitor$getItem.$source;
this.context.dispatcher(_EventType.END_DRAG, {
target: target,
source: source,
props: props,
component: component
});
}
}, {
key: 'dispatchCanDragEvent',
value: function dispatchCanDragEvent(props, monitor) {
var source = this.props.dragToken();
var result = this.context.dispatcher(_EventType.CAN_DRAG, {
source: source,
props: props
});
if (result === undefined) {
result = true;
}
return result;
}
}, {
key: 'dispatchHoverEvent',
value: function dispatchHoverEvent(props, monitor, component) {
var current = component.props.dragToken();
var source = monitor.getItem().$source;
if ((0, _shallowEqual2.default)(current, source) && current === source) {
return;
}
monitor.getItem().$target = current;
var handled = this.context.dispatcher(_EventType.HOVER, {
target: current,
source: source,
props: props,
component: component
});
if (handled && handled.constructor === current.constructor) {
monitor.getItem().$target = handled;
}
return handled;
}
}, {
key: 'dispatchDropEvent',
value: function dispatchDropEvent(props, monitor, component) {
var _monitor$getItem2 = monitor.getItem(),
target = _monitor$getItem2.$target,
source = _monitor$getItem2.$source;
var handled = this.context.dispatcher(_EventType.DROP, {
target: target,
source: source,
props: props,
component: component
});
return handled;
}
}, {
key: 'dispatchCanDropEvent',
value: function dispatchCanDropEvent(props, monitor) {
var _monitor$getItem3 = monitor.getItem(),
target = _monitor$getItem3.$target,
source = _monitor$getItem3.$source;
var result = this.context.dispatcher(_EventType.CAN_DROP, {
target: target,
source: source,
props: props
});
if (result === undefined) {
result = true;
}
return result;
}
}, {
key: 'render',
value: function render() {
var _props4 = this.props,
children = _props4.children,
dragToken = _props4.dragToken,
dragCursor = _props4.dragCursor,
draggingHint = _props4.draggingHint,
wrapTag = _props4.wrapTag,
wrapStyle = _props4.wrapStyle,
wrapClassName = _props4.wrapClassName,
otherProps = _objectWithoutProperties(_props4, ['children', 'dragToken', 'dragCursor', 'draggingHint', 'wrapTag', 'wrapStyle', 'wrapClassName']);
var _context = this.context,
dispatcher = _context.dispatcher,
draggerType = _context.draggerType,
draggerPreview = _context.draggerPreview;
if (!this.cachedWrapped) {
this.cachedWrapped = (0, _reactDnd.DragSource)(draggerType, this.dragSource, function (connect, monitor) {
return {
connectDragSource: connect.dragSource(),
connectDragPreview: connect.dragPreview(),
isDragging: monitor.isDragging(),
initialClientOffset: monitor.getInitialClientOffset(),
initialSourceClientOffset: monitor.getInitialSourceClientOffset()
};
})((0, _reactDnd.DropTarget)(draggerType, this.dropTarget, function (connect, monitor) {
return {
connectDropTarget: connect.dropTarget(),
isOver: monitor.isOver({ shallow: true }),
item: monitor.getItem(),
itemType: monitor.getItemType(),
differenceFromInitialOffset: monitor.getDifferenceFromInitialOffset(),
clientOffset: monitor.getClientOffset(),
sourceClientOffset: monitor.getSourceClientOffset()
};
})(Draggable));
}
var Wrapped = this.cachedWrapped;
var wrappedProps = {
dragCursor: dragCursor,
draggingHint: draggingHint,
wrapTag: wrapTag,
wrapStyle: wrapStyle,
wrapClassName: wrapClassName,
draggerPreview: draggerPreview,
dragToken: dragToken,
dispatcher: dispatcher
};
return _react2.default.createElement(
Wrapped,
_extends({}, wrappedProps, otherProps),
children
);
}
}]);
return DraggableWrapper;
}(_react2.default.Component);
DraggableWrapper.contextTypes = {
dispatcher: _propTypes2.default.func,
draggerType: _propTypes2.default.string,
dragDropManager: _propTypes2.default.object,
draggerPreview: _propTypes2.default.func
};
DraggableWrapper.propTypes = {
dragToken: _propTypes2.default.func.isRequired,
draggingHint: _propTypes2.default.func,
dragHandlerType: _propTypes2.default.oneOf(['default', 'handler']),
dragCursor: _propTypes2.default.oneOf(['default', 'move', 'pointer']),
wrapTag: _propTypes2.default.string,
wrapStyle: _propTypes2.default.object,
wrapClassName: _propTypes2.default.oneOfType([_propTypes2.default.arrayOf(_propTypes2.default.string), _propTypes2.default.string])
};
DraggableWrapper.defaultProps = {
wrapTag: 'div',
dragCursor: 'default',
dragHandlerType: 'default',
wrapStyle: {},
wrapClassName: ''
};
exports.default = DraggableWrapper;