UNPKG

choerodon-ui

Version:

An enterprise-class UI design language and React-based implementation

265 lines (219 loc) 7.93 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn")); var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf")); var _react = require("react"); var _reactDom = require("react-dom"); var _propTypes = _interopRequireDefault(require("prop-types")); var _noop = _interopRequireDefault(require("lodash/noop")); var _DocumentUtils = require("../../pro/lib/_util/DocumentUtils"); var _domAlign = _interopRequireDefault(require("./domAlign")); var _EventManager = _interopRequireDefault(require("../_util/EventManager")); var _TaskRunner = _interopRequireDefault(require("../_util/TaskRunner")); function _createSuper(Derived) { function isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } return function () { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (isNativeReflectConstruct()) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; } function isWindow(obj) { return obj != null && obj === obj.window; } function isChildrenFunction(fn) { return typeof fn === 'function'; } var Align = /*#__PURE__*/ function (_Component) { (0, _inherits2["default"])(Align, _Component); var _super = _createSuper(Align); function Align() { var _this; (0, _classCallCheck2["default"])(this, Align); _this = _super.apply(this, arguments); _this.saveSourceRef = function (node) { _this.source = node; var childrenRef = _this.props.childrenRef; if (childrenRef) { childrenRef(node); } }; return _this; } (0, _createClass2["default"])(Align, [{ key: "forceAlign", value: function forceAlign() { var _this$props = this.props, hidden = _this$props.hidden, _this$props$onAlign = _this$props.onAlign, onAlign = _this$props$onAlign === void 0 ? _noop["default"] : _this$props$onAlign, _this$props$target = _this$props.target, target = _this$props$target === void 0 ? function () { return (0, _DocumentUtils.getDocument)(window).body; } : _this$props$target, align = _this$props.align; if (!hidden) { var _this$source = this.source, source = _this$source === void 0 ? (0, _reactDom.findDOMNode)(this) : _this$source; var ref = target(); var result = (0, _domAlign["default"])(source, ref, align); var translate = { x: 0, y: 0 }; var points = result.points, _result$overflow = result.overflow, adjustX = _result$overflow.adjustX, adjustY = _result$overflow.adjustY; if (source && ref && (adjustX || adjustY) && (points.includes('bc') || points.includes('tc'))) { var r1 = source.getBoundingClientRect(); var r2 = ref.getBoundingClientRect(); if (adjustX) { translate.x = r1.left + r1.width / 2 - r2.left - r2.width / 2; } if (adjustY) { translate.y = r1.top + r1.height / 2 - r2.top - r2.height / 2; } } onAlign(source, result, ref, translate); } } }, { key: "componentDidMount", value: function componentDidMount() { var _this$props2 = this.props, hidden = _this$props2.hidden, monitorWindowResize = _this$props2.monitorWindowResize; this.forceAlign(); if (!hidden && monitorWindowResize) { this.startMonitorWindowResize(); } } }, { key: "componentDidUpdate", value: function componentDidUpdate(prevProps) { var _this$props3 = this.props, hidden = _this$props3.hidden, align = _this$props3.align, _this$props3$target = _this$props3.target, target = _this$props3$target === void 0 ? function () { return window; } : _this$props3$target, monitorWindowResize = _this$props3.monitorWindowResize; var preHidden = prevProps.hidden, preAlign = prevProps.align, preTarget = prevProps.target; var reAlign = false; if (!hidden) { if (preHidden || preAlign !== align) { reAlign = true; } else { var lastTarget = preTarget(); var currentTarget = target(); if (isWindow(lastTarget) && isWindow(currentTarget)) { reAlign = false; } else if (lastTarget !== currentTarget) { reAlign = true; } } } if (reAlign) { this.forceAlign(); } if (monitorWindowResize && !hidden) { this.startMonitorWindowResize(); } else { this.stopMonitorWindowResize(); } } }, { key: "componentWillUnmount", value: function componentWillUnmount() { this.stopMonitorWindowResize(); } }, { key: "startMonitorWindowResize", value: function startMonitorWindowResize() { var monitorBufferTime = this.props.monitorBufferTime; if (!this.resizeHandler) { this.resizeHandler = new _EventManager["default"](window); this.bufferMonitor = new _TaskRunner["default"](); this.resizeHandler.addEventListener('resize', this.bufferMonitor.delay.bind(this.bufferMonitor, monitorBufferTime, this.forceAlign.bind(this))); } } }, { key: "stopMonitorWindowResize", value: function stopMonitorWindowResize() { if (this.resizeHandler) { if (this.bufferMonitor) { this.bufferMonitor.cancel(); } this.resizeHandler.clear(); this.resizeHandler = null; } } }, { key: "render", value: function render() { var props = this.props; var childrenProps = props.childrenProps, children = props.children; var node = isChildrenFunction(children) ? children(this.saveSourceRef) : children; if (childrenProps && (0, _react.isValidElement)(node)) { var newProps = {}; Object.keys(childrenProps).forEach(function (prop) { if ({}.hasOwnProperty.call(childrenProps, prop)) { newProps[prop] = props[childrenProps[prop]]; } }); return (0, _react.cloneElement)(node, newProps); } return node; } }]); return Align; }(_react.Component); exports["default"] = Align; Align.displayName = 'Align'; Align.propTypes = { childrenProps: _propTypes["default"].object, childrenRef: _propTypes["default"].func, align: _propTypes["default"].object.isRequired, target: _propTypes["default"].func, onAlign: _propTypes["default"].func, monitorBufferTime: _propTypes["default"].number, monitorWindowResize: _propTypes["default"].bool, hidden: _propTypes["default"].bool, children: _propTypes["default"].any }; Align.defaultProps = { monitorBufferTime: 50, monitorWindowResize: false, hidden: true }; //# sourceMappingURL=Align.js.map