UNPKG

react-bootstrap

Version:

Bootstrap 3 components build with React

164 lines (123 loc) 4.66 kB
'use strict'; var _inherits = require('babel-runtime/helpers/inherits')['default']; var _classCallCheck = require('babel-runtime/helpers/class-call-check')['default']; var _extends = require('babel-runtime/helpers/extends')['default']; var _objectWithoutProperties = require('babel-runtime/helpers/object-without-properties')['default']; var _interopRequireDefault = require('babel-runtime/helpers/interop-require-default')['default']; exports.__esModule = true; var _react = require('react'); var _react2 = _interopRequireDefault(_react); var _classnames = require('classnames'); var _classnames2 = _interopRequireDefault(_classnames); var _utilsDomUtils = require('./utils/domUtils'); var _utilsDomUtils2 = _interopRequireDefault(_utilsDomUtils); var _utilsOverlayPositionUtils = require('./utils/overlayPositionUtils'); var _utilsCustomPropTypes = require('./utils/CustomPropTypes'); var _utilsCustomPropTypes2 = _interopRequireDefault(_utilsCustomPropTypes); var Position = (function (_React$Component) { _inherits(Position, _React$Component); function Position(props, context) { _classCallCheck(this, Position); _React$Component.call(this, props, context); this.state = { positionLeft: null, positionTop: null, arrowOffsetLeft: null, arrowOffsetTop: null }; this._needsFlush = false; this._lastTarget = null; } Position.prototype.componentDidMount = function componentDidMount() { this.updatePosition(); }; Position.prototype.componentWillReceiveProps = function componentWillReceiveProps() { this._needsFlush = true; }; Position.prototype.componentDidUpdate = function componentDidUpdate() { if (this._needsFlush) { this._needsFlush = false; this.updatePosition(); } }; Position.prototype.componentWillUnmount = function componentWillUnmount() { // Probably not necessary, but just in case holding a reference to the // target causes problems somewhere. this._lastTarget = null; }; Position.prototype.render = function render() { var _props = this.props; var children = _props.children; var className = _props.className; var props = _objectWithoutProperties(_props, ['children', 'className']); var _state = this.state; var positionLeft = _state.positionLeft; var positionTop = _state.positionTop; var arrowPosition = _objectWithoutProperties(_state, ['positionLeft', 'positionTop']); var child = _react2['default'].Children.only(children); return _react.cloneElement(child, _extends({}, props, arrowPosition, { positionTop: positionTop, positionLeft: positionLeft, className: _classnames2['default'](className, child.props.className), style: _extends({}, child.props.style, { left: positionLeft, top: positionTop }) })); }; Position.prototype.getTargetSafe = function getTargetSafe() { if (!this.props.target) { return null; } var target = this.props.target(this.props); if (!target) { // This is so we can just use === check below on all falsy targets. return null; } return target; }; Position.prototype.updatePosition = function updatePosition() { var target = this.getTargetSafe(); if (target === this._lastTarget) { return; } this._lastTarget = target; if (!target) { this.setState({ positionLeft: null, positionTop: null, arrowOffsetLeft: null, arrowOffsetTop: null }); return; } var overlay = _react2['default'].findDOMNode(this); var container = _react2['default'].findDOMNode(this.props.container) || _utilsDomUtils2['default'].ownerDocument(this).body; this.setState(_utilsOverlayPositionUtils.calcOverlayPosition(this.props.placement, overlay, target, container, this.props.containerPadding)); }; return Position; })(_react2['default'].Component); Position.propTypes = { /** * Function mapping props to DOM node the component is positioned next to */ target: _react2['default'].PropTypes.func, /** * "offsetParent" of the component */ container: _utilsCustomPropTypes2['default'].mountable, /** * Minimum spacing in pixels between container border and component border */ containerPadding: _react2['default'].PropTypes.number, /** * How to position the component relative to the target */ placement: _react2['default'].PropTypes.oneOf(['top', 'right', 'bottom', 'left']) }; Position.defaultProps = { containerPadding: 0, placement: 'right' }; exports['default'] = Position; module.exports = exports['default'];