choerodon-ui
Version:
An enterprise-class UI design language and React-based implementation
265 lines (219 loc) • 7.93 kB
JavaScript
;
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