UNPKG

react-bootstrap

Version:

Bootstrap 3 components build with React

123 lines (97 loc) 4.87 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); 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 _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; desc = parent = getter = undefined; _again = false; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } 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) subClass.__proto__ = superClass; } var _react = require('react'); var _react2 = _interopRequireDefault(_react); var _utilsDomUtils = require('./utils/domUtils'); var _utilsDomUtils2 = _interopRequireDefault(_utilsDomUtils); var _utilsEventListener = require('./utils/EventListener'); var _utilsEventListener2 = _interopRequireDefault(_utilsEventListener); // TODO: Merge this logic with dropdown logic once #526 is done. /** * Checks whether a node is within * a root nodes tree * * @param {DOMElement} node * @param {DOMElement} root * @returns {boolean} */ function isNodeInRoot(node, root) { while (node) { if (node === root) { return true; } node = node.parentNode; } return false; } var RootCloseWrapper = (function (_React$Component) { function RootCloseWrapper(props) { _classCallCheck(this, RootCloseWrapper); _get(Object.getPrototypeOf(RootCloseWrapper.prototype), 'constructor', this).call(this, props); this.handleDocumentClick = this.handleDocumentClick.bind(this); this.handleDocumentKeyUp = this.handleDocumentKeyUp.bind(this); } _inherits(RootCloseWrapper, _React$Component); _createClass(RootCloseWrapper, [{ key: 'bindRootCloseHandlers', value: function bindRootCloseHandlers() { var doc = _utilsDomUtils2['default'].ownerDocument(this); this._onDocumentClickListener = _utilsEventListener2['default'].listen(doc, 'click', this.handleDocumentClick); this._onDocumentKeyupListener = _utilsEventListener2['default'].listen(doc, 'keyup', this.handleDocumentKeyUp); } }, { key: 'handleDocumentClick', value: function handleDocumentClick(e) { // If the click originated from within this component, don't do anything. if (isNodeInRoot(e.target, _react2['default'].findDOMNode(this))) { return; } this.props.onRootClose(); } }, { key: 'handleDocumentKeyUp', value: function handleDocumentKeyUp(e) { if (e.keyCode === 27) { this.props.onRootClose(); } } }, { key: 'unbindRootCloseHandlers', value: function unbindRootCloseHandlers() { if (this._onDocumentClickListener) { this._onDocumentClickListener.remove(); } if (this._onDocumentKeyupListener) { this._onDocumentKeyupListener.remove(); } } }, { key: 'componentDidMount', value: function componentDidMount() { this.bindRootCloseHandlers(); } }, { key: 'render', value: function render() { return _react2['default'].Children.only(this.props.children); } }, { key: 'componentWillUnmount', value: function componentWillUnmount() { this.unbindRootCloseHandlers(); } }]); return RootCloseWrapper; })(_react2['default'].Component); exports['default'] = RootCloseWrapper; RootCloseWrapper.propTypes = { onRootClose: _react2['default'].PropTypes.func.isRequired }; module.exports = exports['default'];