react-bootstrap
Version:
Bootstrap 3 components build with React
114 lines (82 loc) • 3.77 kB
JavaScript
;
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'];