react-bootify
Version:
react-bootify
405 lines (339 loc) • 12.7 kB
JavaScript
"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);