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