UNPKG

fastlion-amis

Version:

一种MIS页面生成工具

233 lines (232 loc) 10.2 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getStyleNumber = exports.calculatePosition = exports.ownerDocument = exports.getContainer = exports.props2BsPropsHoc = exports.props2BsProps = void 0; var tslib_1 = require("tslib"); var react_1 = (0, tslib_1.__importDefault)(require("react")); var react_dom_1 = (0, tslib_1.__importDefault)(require("react-dom")); var hoist_non_react_statics_1 = (0, tslib_1.__importDefault)(require("hoist-non-react-statics")); var offset_1 = (0, tslib_1.__importDefault)(require("./offset")); var position_1 = (0, tslib_1.__importDefault)(require("./position")); var bsMapping = { level: 'bsStyle', classPrefix: 'bsClass', size: 'bsSize' }; /** * 主要目的是希望在是用 bootstrap 组件的时候不需要带 bs 前缀。 * * @param {Object} rawProps 原始属性对象。 * @return {Object} */ var props2BsProps = function (rawProps) { var props = {}; Object.keys(rawProps).forEach(function (key) { return (props[bsMapping[key] || key] = rawProps[key]); }); return props; }; exports.props2BsProps = props2BsProps; /** * props2BsProps 的 hoc 版本 * * @param {*} ComposedComponent 组合组件 * @return {Component} */ var props2BsPropsHoc = function (ComposedComponent) { var BsComponent = /** @class */ (function (_super) { (0, tslib_1.__extends)(BsComponent, _super); function BsComponent() { return _super !== null && _super.apply(this, arguments) || this; } BsComponent.prototype.render = function () { return react_1.default.createElement(ComposedComponent, (0, tslib_1.__assign)({}, (0, exports.props2BsProps)(this.props))); }; return BsComponent; }(react_1.default.Component)); (0, hoist_non_react_statics_1.default)(BsComponent, ComposedComponent); return BsComponent; }; exports.props2BsPropsHoc = props2BsPropsHoc; function getContainer(container, defaultContainer) { container = typeof container === 'function' ? container() : container; return react_dom_1.default.findDOMNode(container) || defaultContainer; } exports.getContainer = getContainer; function ownerDocument(componentOrElement) { var _a; return (((_a = react_dom_1.default.findDOMNode(componentOrElement)) === null || _a === void 0 ? void 0 : _a.ownerDocument) || document); } exports.ownerDocument = ownerDocument; function getContainerDimensions(containerNode) { var _a; var width, height, scroll; if (containerNode.tagName === 'BODY') { width = window.innerWidth; height = window.innerHeight; scroll = ownerDocument(containerNode).documentElement.scrollTop || (containerNode === null || containerNode === void 0 ? void 0 : containerNode.scrollTop); } else { (_a = (0, offset_1.default)(containerNode), width = _a.width, height = _a.height); scroll = containerNode.scrollTop; } return { width: width, height: height, scroll: scroll }; } function getTopDelta(top, overlayHeight, container, padding) { var containerDimensions = getContainerDimensions(container); var containerScroll = containerDimensions.scroll; var containerHeight = containerDimensions.height; var topEdgeOffset = top - padding - containerScroll; var bottomEdgeOffset = top + padding - containerScroll + overlayHeight; if (topEdgeOffset < 0) { return -topEdgeOffset; } else if (bottomEdgeOffset > containerHeight) { return containerHeight - bottomEdgeOffset; } else { return 0; } } function getLeftDelta(left, overlayWidth, container, padding) { var containerDimensions = getContainerDimensions(container); var containerWidth = containerDimensions.width; var leftEdgeOffset = left - padding; var rightEdgeOffset = left + padding + overlayWidth; if (leftEdgeOffset < 0) { return -leftEdgeOffset; } else if (rightEdgeOffset > containerWidth) { return containerWidth - rightEdgeOffset; } return 0; } function calculatePosition(placement, overlayNode, target, container, padding, customOffset, toolScroll) { var _a, _b; if (padding === void 0) { padding = 0; } if (customOffset === void 0) { customOffset = [0, 0]; } if (toolScroll === void 0) { toolScroll = false; } if (((_b = (_a = container.id) === null || _a === void 0 ? void 0 : _a.startsWith) === null || _b === void 0 ? void 0 : _b.call(_a, 'amis-modal-container')) || container.id === 'Wizard-Panel') { container = document.body; } var childOffset = container.tagName === 'BODY' ? (0, offset_1.default)(target, toolScroll) : (0, position_1.default)(target, container, toolScroll); var _c = (0, offset_1.default)(overlayNode), overlayHeight = _c.height, overlayWidth = _c.width; var clip = container.getBoundingClientRect(); var clip2 = overlayNode.getBoundingClientRect(); var scaleX = overlayNode.offsetWidth ? clip2.width / overlayNode.offsetWidth : 1; var scaleY = overlayNode.offsetHeight ? clip2.height / overlayNode.offsetHeight : 1; // auto 尝试四个方向对齐。 placement = placement === 'auto' ? 'left-bottom-left-top right-bottom-right-top left-top-left-bottom right-top-right-bottom left-bottom-left-top' : placement; var positionLeft = 0, positionTop = 0, arrowOffsetLeft = '', arrowOffsetTop = '', activePlacement = placement; if (~placement.indexOf('-')) { var tests = placement.split(/\s+/); while (tests.length) { var current = (activePlacement = tests.shift()); var _d = current.split('-'), atX = _d[0], atY = _d[1], myX = _d[2], myY = _d[3]; myX = myX || atX; myY = myY || atY; positionLeft = atX === 'left' ? childOffset.left : atX === 'right' ? childOffset.left + childOffset.width : childOffset.left + childOffset.width / 2; positionTop = atY === 'top' ? childOffset.top : atY === 'bottom' ? childOffset.top + childOffset.height : childOffset.top + childOffset.height / 2; positionLeft -= myX === 'left' ? 0 : myX === 'right' ? overlayWidth : overlayWidth / 2; positionTop -= myY === 'top' ? 0 : myY === 'bottom' ? overlayHeight : overlayHeight / 2; // 如果还有其他可选项,则做位置判断,是否在可视区域,不完全在则继续看其他定位情况。 if (tests.length) { var transformed = { x: clip.x + positionLeft / scaleX, y: clip.y + positionTop / scaleY, width: overlayWidth, height: overlayHeight }; if (transformed.x > 0 && transformed.x + transformed.width < window.innerWidth && transformed.y > 0 && transformed.y + transformed.height < window.innerHeight) { break; } } } // todo arrow 位置支持 } else if (placement === 'left' || placement === 'right') { // atX = placement; // atY = myY = 'center'; // myX = placement === 'left' ? 'right' : 'left'; if (placement === 'left') { positionLeft = childOffset.left - overlayWidth; } else { positionLeft = childOffset.left + childOffset.width; } positionTop = childOffset.top + (childOffset.height - overlayHeight) / 2; var topDelta = getTopDelta(positionTop, overlayHeight, container, padding); positionTop += topDelta; arrowOffsetTop = 50 * (1 - (2 * topDelta) / overlayHeight) + '%'; } else if (placement === 'top' || placement === 'bottom') { // atY = placement; // atX = myX = 'center'; // myY = placement === 'top' ? 'bottom': 'top'; if (placement === 'top') { positionTop = childOffset.top - overlayHeight; } else { positionTop = childOffset.top + childOffset.height; } positionLeft = childOffset.left + (childOffset.width - overlayWidth) / 2; var leftDelta = getLeftDelta(positionLeft, overlayWidth, container, padding); positionLeft += leftDelta; arrowOffsetLeft = 50 * (1 - (2 * leftDelta) / overlayHeight) + '%'; } else if (placement === 'center') { // atX = atY = myX = myY = 'center'; positionLeft = childOffset.left + (childOffset.width - overlayWidth) / 2; positionTop = childOffset.top + (childOffset.height - overlayHeight) / 2; arrowOffsetLeft = arrowOffsetTop = void 0; } else { throw new Error("calcOverlayPosition(): No such placement of \"" + placement + "\" found."); } var _e = customOffset[0], offSetX = _e === void 0 ? 0 : _e, _f = customOffset[1], offSetY = _f === void 0 ? 0 : _f; return { positionLeft: (positionLeft + offSetX) / scaleX, positionTop: (positionTop + offSetY) / scaleY, arrowOffsetLeft: (arrowOffsetLeft + offSetX) / scaleX, arrowOffsetTop: (arrowOffsetTop + offSetY) / scaleY, activePlacement: activePlacement }; } exports.calculatePosition = calculatePosition; /** * 专门用来获取样式的像素值,默认返回 0 */ function getStyleNumber(element, styleName) { if (!element) { return 0; } return (parseInt(getComputedStyle(element).getPropertyValue(styleName), 10) || 0); } exports.getStyleNumber = getStyleNumber; //# sourceMappingURL=./utils/dom.js.map