You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

пре 3 година
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. 'use strict';
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
  6. var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
  7. var _createClass2 = require('babel-runtime/helpers/createClass');
  8. var _createClass3 = _interopRequireDefault(_createClass2);
  9. var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn');
  10. var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
  11. var _inherits2 = require('babel-runtime/helpers/inherits');
  12. var _inherits3 = _interopRequireDefault(_inherits2);
  13. var _react = require('react');
  14. var _react2 = _interopRequireDefault(_react);
  15. var _propTypes = require('prop-types');
  16. var _propTypes2 = _interopRequireDefault(_propTypes);
  17. var _reactDom = require('react-dom');
  18. var _reactDom2 = _interopRequireDefault(_reactDom);
  19. var _domAlign = require('dom-align');
  20. var _addEventListener = require('rc-util/lib/Dom/addEventListener');
  21. var _addEventListener2 = _interopRequireDefault(_addEventListener);
  22. var _util = require('./util');
  23. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
  24. function getElement(func) {
  25. if (typeof func !== 'function' || !func) return null;
  26. return func();
  27. }
  28. function getPoint(point) {
  29. if (typeof point !== 'object' || !point) return null;
  30. return point;
  31. }
  32. var Align = function (_Component) {
  33. (0, _inherits3['default'])(Align, _Component);
  34. function Align() {
  35. var _ref;
  36. var _temp, _this, _ret;
  37. (0, _classCallCheck3['default'])(this, Align);
  38. for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
  39. args[_key] = arguments[_key];
  40. }
  41. return _ret = (_temp = (_this = (0, _possibleConstructorReturn3['default'])(this, (_ref = Align.__proto__ || Object.getPrototypeOf(Align)).call.apply(_ref, [this].concat(args))), _this), _this.forceAlign = function () {
  42. var _this$props = _this.props,
  43. disabled = _this$props.disabled,
  44. target = _this$props.target,
  45. align = _this$props.align,
  46. onAlign = _this$props.onAlign;
  47. if (!disabled && target) {
  48. var source = _reactDom2['default'].findDOMNode(_this);
  49. var result = void 0;
  50. var element = getElement(target);
  51. var point = getPoint(target);
  52. // IE lose focus after element realign
  53. // We should record activeElement and restore later
  54. var activeElement = document.activeElement;
  55. if (element) {
  56. result = (0, _domAlign.alignElement)(source, element, align);
  57. } else if (point) {
  58. result = (0, _domAlign.alignPoint)(source, point, align);
  59. }
  60. (0, _util.restoreFocus)(activeElement, source);
  61. if (onAlign) {
  62. onAlign(source, result);
  63. }
  64. }
  65. }, _temp), (0, _possibleConstructorReturn3['default'])(_this, _ret);
  66. }
  67. (0, _createClass3['default'])(Align, [{
  68. key: 'componentDidMount',
  69. value: function componentDidMount() {
  70. var props = this.props;
  71. // if parent ref not attached .... use document.getElementById
  72. this.forceAlign();
  73. if (!props.disabled && props.monitorWindowResize) {
  74. this.startMonitorWindowResize();
  75. }
  76. }
  77. }, {
  78. key: 'componentDidUpdate',
  79. value: function componentDidUpdate(prevProps) {
  80. var reAlign = false;
  81. var props = this.props;
  82. if (!props.disabled) {
  83. var source = _reactDom2['default'].findDOMNode(this);
  84. var sourceRect = source ? source.getBoundingClientRect() : null;
  85. if (prevProps.disabled) {
  86. reAlign = true;
  87. } else {
  88. var lastElement = getElement(prevProps.target);
  89. var currentElement = getElement(props.target);
  90. var lastPoint = getPoint(prevProps.target);
  91. var currentPoint = getPoint(props.target);
  92. if ((0, _util.isWindow)(lastElement) && (0, _util.isWindow)(currentElement)) {
  93. // Skip if is window
  94. reAlign = false;
  95. } else if (lastElement !== currentElement || // Element change
  96. lastElement && !currentElement && currentPoint || // Change from element to point
  97. lastPoint && currentPoint && currentElement || // Change from point to element
  98. currentPoint && !(0, _util.isSamePoint)(lastPoint, currentPoint)) {
  99. reAlign = true;
  100. }
  101. // If source element size changed
  102. var preRect = this.sourceRect || {};
  103. if (!reAlign && source && (!(0, _util.isSimilarValue)(preRect.width, sourceRect.width) || !(0, _util.isSimilarValue)(preRect.height, sourceRect.height))) {
  104. reAlign = true;
  105. }
  106. }
  107. this.sourceRect = sourceRect;
  108. }
  109. if (reAlign) {
  110. this.forceAlign();
  111. }
  112. if (props.monitorWindowResize && !props.disabled) {
  113. this.startMonitorWindowResize();
  114. } else {
  115. this.stopMonitorWindowResize();
  116. }
  117. }
  118. }, {
  119. key: 'componentWillUnmount',
  120. value: function componentWillUnmount() {
  121. this.stopMonitorWindowResize();
  122. }
  123. }, {
  124. key: 'startMonitorWindowResize',
  125. value: function startMonitorWindowResize() {
  126. if (!this.resizeHandler) {
  127. this.bufferMonitor = (0, _util.buffer)(this.forceAlign, this.props.monitorBufferTime);
  128. this.resizeHandler = (0, _addEventListener2['default'])(window, 'resize', this.bufferMonitor);
  129. }
  130. }
  131. }, {
  132. key: 'stopMonitorWindowResize',
  133. value: function stopMonitorWindowResize() {
  134. if (this.resizeHandler) {
  135. this.bufferMonitor.clear();
  136. this.resizeHandler.remove();
  137. this.resizeHandler = null;
  138. }
  139. }
  140. }, {
  141. key: 'render',
  142. value: function render() {
  143. var _this2 = this;
  144. var _props = this.props,
  145. childrenProps = _props.childrenProps,
  146. children = _props.children;
  147. var child = _react2['default'].Children.only(children);
  148. if (childrenProps) {
  149. var newProps = {};
  150. var propList = Object.keys(childrenProps);
  151. propList.forEach(function (prop) {
  152. newProps[prop] = _this2.props[childrenProps[prop]];
  153. });
  154. return _react2['default'].cloneElement(child, newProps);
  155. }
  156. return child;
  157. }
  158. }]);
  159. return Align;
  160. }(_react.Component);
  161. Align.propTypes = {
  162. childrenProps: _propTypes2['default'].object,
  163. align: _propTypes2['default'].object.isRequired,
  164. target: _propTypes2['default'].oneOfType([_propTypes2['default'].func, _propTypes2['default'].shape({
  165. clientX: _propTypes2['default'].number,
  166. clientY: _propTypes2['default'].number,
  167. pageX: _propTypes2['default'].number,
  168. pageY: _propTypes2['default'].number
  169. })]),
  170. onAlign: _propTypes2['default'].func,
  171. monitorBufferTime: _propTypes2['default'].number,
  172. monitorWindowResize: _propTypes2['default'].bool,
  173. disabled: _propTypes2['default'].bool,
  174. children: _propTypes2['default'].any
  175. };
  176. Align.defaultProps = {
  177. target: function target() {
  178. return window;
  179. },
  180. monitorBufferTime: 50,
  181. monitorWindowResize: false,
  182. disabled: false
  183. };
  184. exports['default'] = Align;
  185. module.exports = exports['default'];