UNPKG

react-bootstrap

Version:

Bootstrap 3 components build with React

114 lines (82 loc) 3.77 kB
'use strict'; var _inherits = require('babel-runtime/helpers/inherits')['default']; var _classCallCheck = require('babel-runtime/helpers/class-call-check')['default']; var _interopRequireDefault = require('babel-runtime/helpers/interop-require-default')['default']; exports.__esModule = true; var _react = require('react'); var _react2 = _interopRequireDefault(_react); var _utilsDomUtils = require('./utils/domUtils'); var _utilsDomUtils2 = _interopRequireDefault(_utilsDomUtils); var _utilsEventListener = require('./utils/EventListener'); // TODO: Merge this logic with dropdown logic once #526 is done. // TODO: Consider using an ES6 symbol here, once we use babel-runtime. var _utilsEventListener2 = _interopRequireDefault(_utilsEventListener); var CLICK_WAS_INSIDE = '__click_was_inside'; function suppressRootClose(event) { // Tag the native event to prevent the root close logic on document click. // This seems safer than using event.nativeEvent.stopImmediatePropagation(), // which is only supported in IE >= 9. event.nativeEvent[CLICK_WAS_INSIDE] = true; } var RootCloseWrapper = (function (_React$Component) { _inherits(RootCloseWrapper, _React$Component); function RootCloseWrapper(props) { _classCallCheck(this, RootCloseWrapper); _React$Component.call(this, props); this.handleDocumentClick = this.handleDocumentClick.bind(this); this.handleDocumentKeyUp = this.handleDocumentKeyUp.bind(this); } RootCloseWrapper.prototype.bindRootCloseHandlers = 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); }; RootCloseWrapper.prototype.handleDocumentClick = function handleDocumentClick(e) { // This is now the native event. if (e[CLICK_WAS_INSIDE]) { return; } this.props.onRootClose(); }; RootCloseWrapper.prototype.handleDocumentKeyUp = function handleDocumentKeyUp(e) { if (e.keyCode === 27) { this.props.onRootClose(); } }; RootCloseWrapper.prototype.unbindRootCloseHandlers = function unbindRootCloseHandlers() { if (this._onDocumentClickListener) { this._onDocumentClickListener.remove(); } if (this._onDocumentKeyupListener) { this._onDocumentKeyupListener.remove(); } }; RootCloseWrapper.prototype.componentDidMount = function componentDidMount() { this.bindRootCloseHandlers(); }; RootCloseWrapper.prototype.render = function render() { // Wrap the child in a new element, so the child won't have to handle // potentially combining multiple onClick listeners. return _react2['default'].createElement( 'div', { onClick: suppressRootClose }, _react2['default'].Children.only(this.props.children) ); }; RootCloseWrapper.prototype.getWrappedDOMNode = function getWrappedDOMNode() { // We can't use a ref to identify the wrapped child, since we might be // stealing the ref from the owner, but we know exactly the DOM structure // that will be rendered, so we can just do this to get the child's DOM // node for doing size calculations in OverlayMixin. return _react2['default'].findDOMNode(this).children[0]; }; RootCloseWrapper.prototype.componentWillUnmount = function componentWillUnmount() { this.unbindRootCloseHandlers(); }; return RootCloseWrapper; })(_react2['default'].Component); exports['default'] = RootCloseWrapper; RootCloseWrapper.propTypes = { onRootClose: _react2['default'].PropTypes.func.isRequired }; module.exports = exports['default'];