tplus-pos
Version:
pos module
281 lines (235 loc) • 9.47 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.placements = undefined;
var _objectWithoutProperties2 = require('babel-runtime/helpers/objectWithoutProperties');
var _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2);
var _extends2 = require('babel-runtime/helpers/extends');
var _extends3 = _interopRequireDefault(_extends2);
var _stringify = require('babel-runtime/core-js/json/stringify');
var _stringify2 = _interopRequireDefault(_stringify);
var _keys = require('babel-runtime/core-js/object/keys');
var _keys2 = _interopRequireDefault(_keys);
var _getPrototypeOf = require('babel-runtime/core-js/object/get-prototype-of');
var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf);
var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
var _createClass2 = require('babel-runtime/helpers/createClass');
var _createClass3 = _interopRequireDefault(_createClass2);
var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn');
var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
var _inherits2 = require('babel-runtime/helpers/inherits');
var _inherits3 = _interopRequireDefault(_inherits2);
var _class, _temp2;
var _react = require('react');
var _propTypes = require('prop-types');
var _propTypes2 = _interopRequireDefault(_propTypes);
var _popper = require('popper.js');
var _popper2 = _interopRequireDefault(_popper);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var placements = exports.placements = _popper2.default.placements;
var Popper = (_temp2 = _class = function (_Component) {
(0, _inherits3.default)(Popper, _Component);
function Popper() {
var _ref;
var _temp, _this, _ret;
(0, _classCallCheck3.default)(this, Popper);
for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
return _ret = (_temp = (_this = (0, _possibleConstructorReturn3.default)(this, (_ref = Popper.__proto__ || (0, _getPrototypeOf2.default)(Popper)).call.apply(_ref, [this].concat(args))), _this), _this.state = {}, _this._setArrowNode = function (node) {
_this._arrowNode = node;
}, _this._getTargetNode = function () {
if (_this.props.target) {
return _this.props.target;
} else if (!_this.context.popperManager || !_this.context.popperManager.getTargetNode()) {
throw new Error('Target missing. Popper must be given a target from the Popper Manager, or as a prop.');
}
return _this.context.popperManager.getTargetNode();
}, _this._getOffsets = function (data) {
return (0, _keys2.default)(data.offsets).map(function (key) {
return data.offsets[key];
});
}, _this._isDataDirty = function (data) {
if (_this.state.data) {
return (0, _stringify2.default)(_this._getOffsets(_this.state.data)) !== (0, _stringify2.default)(_this._getOffsets(data));
} else {
return true;
}
}, _this._updateStateModifier = {
enabled: true,
order: 900,
fn: function fn(data) {
if (_this._isDataDirty(data)) {
_this.setState({ data: data });
}
return data;
}
}, _this._getPopperStyle = function () {
var data = _this.state.data;
if (!_this._popper || !data) {
return {
position: 'absolute',
pointerEvents: 'none',
opacity: 0
};
}
return (0, _extends3.default)({
position: data.offsets.popper.position
}, data.styles);
}, _this._getPopperPlacement = function () {
return _this.state.data ? _this.state.data.placement : undefined;
}, _this._getPopperHide = function () {
return !!_this.state.data && _this.state.data.hide ? '' : undefined;
}, _this._getArrowStyle = function () {
// if (!this.state.data || !this.state.data.offsets.arrow) {
// return {}
// } else {
// const { top, left } = this.state.data.offsets.arrow
// return { top, left }
// }
return {};
}, _this._handlePopperRef = function (node) {
_this._popperNode = node;
if (node) {
_this._createPopper();
} else {
_this._destroyPopper();
}
if (_this.props.innerRef) {
_this.props.innerRef(node);
}
}, _this._scheduleUpdate = function () {
_this._popper && _this._popper.scheduleUpdate();
}, _temp), (0, _possibleConstructorReturn3.default)(_this, _ret);
}
(0, _createClass3.default)(Popper, [{
key: 'getChildContext',
value: function getChildContext() {
return {
popper: {
setArrowNode: this._setArrowNode,
getArrowStyle: this._getArrowStyle
}
};
}
}, {
key: 'componentDidUpdate',
value: function componentDidUpdate(lastProps) {
if (lastProps.placement !== this.props.placement || lastProps.eventsEnabled !== this.props.eventsEnabled || lastProps.target !== this.props.target) {
this._destroyPopper();
this._createPopper();
}
if (lastProps.children !== this.props.children) {
this._scheduleUpdate();
}
}
}, {
key: 'componentWillUnmount',
value: function componentWillUnmount() {
this._destroyPopper();
}
}, {
key: '_createPopper',
value: function _createPopper() {
var _this2 = this;
var _props = this.props,
placement = _props.placement,
eventsEnabled = _props.eventsEnabled,
positionFixed = _props.positionFixed;
var modifiers = (0, _extends3.default)({}, this.props.modifiers, {
applyStyle: { enabled: false },
updateState: this._updateStateModifier
});
if (this._arrowNode) {
modifiers.arrow = (0, _extends3.default)({}, this.props.modifiers.arrow || {}, {
element: this._arrowNode
});
}
this._popper = new _popper2.default(this._getTargetNode(), this._popperNode, {
placement: placement,
positionFixed: positionFixed,
eventsEnabled: eventsEnabled,
modifiers: modifiers
});
// TODO: look into setTimeout scheduleUpdate call, without it, the popper will not position properly on creation
setTimeout(function () {
return _this2._scheduleUpdate();
});
}
}, {
key: '_destroyPopper',
value: function _destroyPopper() {
if (this._popper) {
this._popper.destroy();
}
}
}, {
key: 'render',
value: function render() {
var _props2 = this.props,
component = _props2.component,
innerRef = _props2.innerRef,
placement = _props2.placement,
eventsEnabled = _props2.eventsEnabled,
positionFixed = _props2.positionFixed,
modifiers = _props2.modifiers,
children = _props2.children,
restProps = (0, _objectWithoutProperties3.default)(_props2, ['component', 'innerRef', 'placement', 'eventsEnabled', 'positionFixed', 'modifiers', 'children']);
var popperStyle = this._getPopperStyle();
var popperPlacement = this._getPopperPlacement();
var popperHide = this._getPopperHide();
if (typeof children === 'function') {
var popperProps = {
ref: this._handlePopperRef,
style: popperStyle,
'data-placement': popperPlacement,
'data-x-out-of-boundaries': popperHide
};
return children({
popperProps: popperProps,
restProps: restProps,
scheduleUpdate: this._scheduleUpdate
});
}
var componentProps = (0, _extends3.default)({}, restProps, {
style: (0, _extends3.default)({}, restProps.style, popperStyle),
'data-placement': popperPlacement,
'data-x-out-of-boundaries': popperHide
});
if (typeof component === 'string') {
componentProps.ref = this._handlePopperRef;
} else {
componentProps.innerRef = this._handlePopperRef;
}
return (0, _react.createElement)(component, componentProps, children);
}
}]);
return Popper;
}(_react.Component), _class.contextTypes = {
popperManager: _propTypes2.default.object
}, _class.childContextTypes = {
popper: _propTypes2.default.object.isRequired
}, _class.propTypes = {
component: _propTypes2.default.oneOfType([_propTypes2.default.node, _propTypes2.default.func]),
innerRef: _propTypes2.default.func,
placement: _propTypes2.default.oneOf(placements),
eventsEnabled: _propTypes2.default.bool,
positionFixed: _propTypes2.default.bool,
modifiers: _propTypes2.default.object,
children: _propTypes2.default.oneOfType([_propTypes2.default.node, _propTypes2.default.func]),
target: _propTypes2.default.oneOfType([_propTypes2.default.instanceOf(typeof Element !== 'undefined' ? Element : Object), _propTypes2.default.shape({
getBoundingClientRect: _propTypes2.default.func.isRequired,
clientWidth: _propTypes2.default.number.isRequired,
clientHeight: _propTypes2.default.number.isRequired
})])
}, _class.defaultProps = {
component: 'div',
placement: 'bottom',
eventsEnabled: true,
positionFixed: false,
modifiers: {}
}, _temp2);
exports.default = Popper;
//# sourceMappingURL=Popper.js.map