UNPKG

tplus-pos

Version:

pos module

281 lines (235 loc) • 9.47 kB
'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