UNPKG

react-bootify

Version:
405 lines (339 loc) 12.7 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _react = _interopRequireDefault(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _propTypes = _interopRequireDefault(require("prop-types")); var _reactDom = _interopRequireDefault(require("react-dom")); var _popper = _interopRequireDefault(require("popper.js")); var _fade = _interopRequireDefault(require("../fade")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _extends() { _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; }; return _extends.apply(this, arguments); } function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a 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); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function debug() { console.log.apply(null, arguments); } var Popover = /*#__PURE__*/ function (_React$Component) { _inherits(Popover, _React$Component); function Popover(props) { var _this; _classCallCheck(this, Popover); _this = _possibleConstructorReturn(this, _getPrototypeOf(Popover).call(this, props)); if (_this.props.isOpen) { console.error('Property isOpen obsolete. Use show instead.'); } _this.state = {}; _this.state.popper = null; _this.state.show = false; _this.popper = null; _this.targetNode = null; _this.popupNode = null; _this.arrowNode = null; _this.onDocumentClick = _this.onDocumentClick.bind(_assertThisInitialized(_this)); return _this; } _createClass(Popover, [{ key: "isOpen", value: function isOpen() { if (this.props.toggle != undefined) return this.props.show || this.props.isOpen;else return this.state.show; } }, { key: "togglePopper", value: function togglePopper() { if (this.props.toggle) this.props.toggle();else { if (this.isOpen()) this.hidePopper();else this.showPopper(); } } }, { key: "showPopper", value: function showPopper() { this.createPopper(); this.setState({ show: true }); } }, { key: "hidePopper", value: function hidePopper() { this.destroyPopper(); this.setState({ show: false }); } }, { key: "componentDidUpdate", value: function componentDidUpdate(previousProps, previousState) { if (this.props.toggle) { if (previousProps.show != this.props.show) { if (this.isOpen()) this.showPopper();else this.hidePopper(); } // Be compatible with name change if (previousProps.isOpen != this.props.isOpen) { if (this.isOpen()) this.showPopper();else this.hidePopper(); } } } }, { key: "componentWillUnmount", value: function componentWillUnmount() { this.destroyPopper(); } }, { key: "createPopper", value: function createPopper() { var _this2 = this; if (!this.popper) { var modifiers = { arrow: { element: this.arrowNode } }; var options = { placement: this.props.placement, modifiers: modifiers, onCreate: function onCreate(state) { _this2.setState({ popper: state }); }, onUpdate: function onUpdate(state) { _this2.setState({ popper: state }); } }; document.addEventListener('click', this.onDocumentClick, true); this.popper = new _popper["default"](this.targetNode, this.popupNode, options); this.updatePopper(); } } }, { key: "destroyPopper", value: function destroyPopper() { if (this.popper) { document.removeEventListener('click', this.onDocumentClick, true); this.popper.destroy(); } this.popper = null; } }, { key: "updatePopper", value: function updatePopper() { var _this3 = this; requestAnimationFrame(function () { if (_this3.popper) { _this3.popper.update(); } }); } }, { key: "onDocumentClick", value: function onDocumentClick(event) { if (this.isOpen()) { if (!this.props.sticky) { if (!this.targetNode.contains(event.target) && !this.popupNode.contains(event.target)) { this.togglePopper(); } } } } }, { key: "getChildOfType", value: function getChildOfType(type) { return _react["default"].Children.toArray(this.props.children).find(function (child) { return child.type === type; }); } }, { key: "getTarget", value: function getTarget() { var target = null; if (this.props.target) target = this.props.target;else { var popoverTarget = this.getChildOfType(Popover.Target); if (popoverTarget) target = popoverTarget.props.children; } return target; } }, { key: "renderTarget", value: function renderTarget() { var _this4 = this; var target = this.getTarget(); // Add some styles var style = Object.assign({}, { cursor: 'pointer' }, target.props.style); var onClick = function onClick() { _this4.togglePopper(); if (!_this4.props.toggle && target.props.onClick) { target.props.onClick(); } }; return _react["default"].cloneElement(target, { style: style, onClick: onClick, ref: function ref(element) { _this4.targetNode = _reactDom["default"].findDOMNode(element); } }); } }, { key: "renderPopup", value: function renderPopup() { var _this5 = this; var popoverClassName = 'popover'; var show = this.state.popper && this.isOpen(); if (this.state.popper) { switch (this.state.popper.placement) { case 'left': case 'left-start': case 'left-end': { popoverClassName = (0, _classnames["default"])(popoverClassName, 'bs-popover-left'); break; } case 'right': case 'right-start': case 'right-end': { popoverClassName = (0, _classnames["default"])(popoverClassName, 'bs-popover-right'); break; } case 'top': case 'top-start': case 'top-end': { popoverClassName = (0, _classnames["default"])(popoverClassName, 'bs-popover-top'); break; } case 'bottom': case 'bottom-start': case 'bottom-end': { popoverClassName = (0, _classnames["default"])(popoverClassName, 'bs-popover-bottom'); break; } } } var arrow = null; if (this.props.arrow) { arrow = _react["default"].createElement("div", { className: "arrow", ref: function ref(element) { _this5.arrowNode = element; } }); } var children = this.props.children; if (this.getChildOfType(Popover.Target)) { children = []; children.push(this.getChildOfType(Popover.Header)); children.push(this.getChildOfType(Popover.Body)); } return _react["default"].createElement(_fade["default"], { show: show }, _react["default"].createElement("div", { className: popoverClassName, ref: function ref(element) { _this5.popupNode = element; } }, arrow, children)); } }, { key: "render", value: function render() { return _react["default"].createElement("div", null, this.renderTarget(), this.renderPopup()); } }]); return Popover; }(_react["default"].Component); exports["default"] = Popover; _defineProperty(Popover, "propTypes", { target: _propTypes["default"].element, toggle: _propTypes["default"].func, show: _propTypes["default"].bool, arrow: _propTypes["default"].bool, sticky: _propTypes["default"].bool, modifiers: _propTypes["default"].any, placement: _propTypes["default"].string }); _defineProperty(Popover, "defaultProps", { placement: 'bottom-start', show: false, arrow: true, sticky: false, modifiers: { preventOverflow: { boundariesElement: 'viewport' } } }); Popover.Body = /*#__PURE__*/ function (_React$Component2) { _inherits(_class, _React$Component2); function _class() { _classCallCheck(this, _class); return _possibleConstructorReturn(this, _getPrototypeOf(_class).apply(this, arguments)); } _createClass(_class, [{ key: "render", value: function render() { var _this$props = this.props, className = _this$props.className, props = _this$props.props; return _react["default"].createElement("div", _extends({ className: (0, _classnames["default"])(className, 'popover-body') }, props), this.props.children); } }]); return _class; }(_react["default"].Component); Popover.Header = /*#__PURE__*/ function (_React$Component3) { _inherits(_class2, _React$Component3); function _class2() { _classCallCheck(this, _class2); return _possibleConstructorReturn(this, _getPrototypeOf(_class2).apply(this, arguments)); } _createClass(_class2, [{ key: "render", value: function render() { var _this$props2 = this.props, className = _this$props2.className, props = _this$props2.props; return _react["default"].createElement("div", _extends({ className: (0, _classnames["default"])(className, 'popover-header') }, props), this.props.children); } }]); return _class2; }(_react["default"].Component); Popover.Target = /*#__PURE__*/ function (_React$Component4) { _inherits(_class3, _React$Component4); function _class3() { _classCallCheck(this, _class3); return _possibleConstructorReturn(this, _getPrototypeOf(_class3).apply(this, arguments)); } _createClass(_class3, [{ key: "render", value: function render() { return this.props.children; } }]); return _class3; }(_react["default"].Component);