UNPKG

fastlion-amis

Version:

一种MIS页面生成工具

205 lines (204 loc) 18.8 kB
"use strict"; /** * @file PopOver * @description * @author fex */ Object.defineProperty(exports, "__esModule", { value: true }); exports.PopOver = void 0; var tslib_1 = require("tslib"); var react_1 = (0, tslib_1.__importDefault)(require("react")); var react_dom_1 = require("react-dom"); var theme_1 = require("../theme"); var helper_1 = require("../utils/helper"); var shell_1 = require("../utils/shell"); var PopOver = /** @class */ (function (_super) { (0, tslib_1.__extends)(PopOver, _super); function PopOver() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.state = { xOffset: 0, yOffset: 0 }; _this.wrapperRef = react_1.default.createRef(); return _this; } PopOver.prototype.componentDidMount = function () { this.mayUpdateOffset(); var dom = (0, react_dom_1.findDOMNode)(this); this.parent = dom.parentNode; this.parent.classList.add('has-popover'); if (this.wrapperRef && this.wrapperRef.current) { // https://developer.mozilla.org/zh-CN/docs/Web/API/EventTarget/addEventListener#使用_passive_改善的滚屏性能 this.wrapperRef.current.addEventListener('touchmove', helper_1.preventDefault, { passive: false, capture: false }); } }; PopOver.prototype.componentDidUpdate = function () { this.mayUpdateOffset(); }; PopOver.prototype.componentWillUnmount = function () { this.parent && this.parent.classList.remove('has-popover'); if (this.wrapperRef && this.wrapperRef.current) { this.wrapperRef.current.removeEventListener('touchmove', helper_1.preventDefault); } }; PopOver.prototype.mayUpdateOffset = function () { var _a, _b, _c, _d; var offset; var getOffset = this.props.offset; // 屏幕的宽度 var bodyClient = document.documentElement.clientWidth; // 子元素的宽度 var childWidth = (_a = this.wrapperRef.current) === null || _a === void 0 ? void 0 : _a.offsetWidth; // 元素左边到浏览器左边的间距 var parentLeft = (_b = this.parent) === null || _b === void 0 ? void 0 : _b.getBoundingClientRect().left; // 元素右边到浏览器左边的间距 var parentRight = (_c = this.parent) === null || _c === void 0 ? void 0 : _c.getBoundingClientRect().right; // 判断是否超出屏幕宽度 var whether = (childWidth + parentLeft) > bodyClient; var moveleft = parentRight - parentLeft - childWidth; if ((_d = this.parent) === null || _d === void 0 ? void 0 : _d.className.includes("Modal-content")) { if (this.props.positionLeft > 0) { whether = (childWidth + this.props.positionLeft + parentLeft) > parentRight; moveleft = parentRight - childWidth - this.props.positionLeft - parentLeft; } } if (getOffset && typeof getOffset === 'function') { var _e = this.props, placement = _e.placement, y = _e.positionTop, x = _e.positionLeft; offset = getOffset((0, react_dom_1.findDOMNode)(this).getBoundingClientRect(), { x: x, y: y, placement: placement }); } else { offset = getOffset; } this.setState({ xOffset: whether ? moveleft : offset && offset.x ? offset.x : 0, yOffset: offset && offset.y ? offset.y : 0 }); }; PopOver.prototype.render = function () { var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t; var _u = this.props, placement = _u.placement, activePlacement = _u.activePlacement, positionTop = _u.positionTop, positionLeft = _u.positionLeft, arrowOffsetLeft = _u.arrowOffsetLeft, arrowOffsetTop = _u.arrowOffsetTop, style = _u.style, children = _u.children, offset = _u.offset, overlay = _u.overlay, onHide = _u.onHide, ns = _u.classPrefix, cx = _u.classnames, className = _u.className, multiple = _u.multiple, rest = (0, tslib_1.__rest)(_u, ["placement", "activePlacement", "positionTop", "positionLeft", "arrowOffsetLeft", "arrowOffsetTop", "style", "children", "offset", "overlay", "onHide", "classPrefix", "classnames", "className", "multiple"]); var _v = this.state, xOffset = _v.xOffset, yOffset = _v.yOffset; var outerStyle = (0, tslib_1.__assign)({ display: 'block' }, style); var overlayStyle = {}; if (this.wrapperRef.current) { // 屏幕的宽度 var bodyClient = document.documentElement.clientWidth; var clientData = this.wrapperRef.current.getBoundingClientRect(); var formControlData = (_a = this.wrapperRef.current.closest("." + ns + "Form-control")) === null || _a === void 0 ? void 0 : _a.getBoundingClientRect(); var isOverSize = document.documentElement.clientHeight - (formControlData === null || formControlData === void 0 ? void 0 : formControlData.bottom) <= clientData.height + 5; var wrapperRect = (_d = (_c = (_b = this.wrapperRef) === null || _b === void 0 ? void 0 : _b.current) === null || _c === void 0 ? void 0 : _c.closest('[class*="Field--quickEditable"]')) === null || _d === void 0 ? void 0 : _d.getBoundingClientRect(); var isCoverScreen = (formControlData === null || formControlData === void 0 ? void 0 : formControlData.left) + clientData.width > bodyClient; var tableActions = this.wrapperRef.current.closest("." + ns + "Table-actions") || this.wrapperRef.current.closest("." + ns + "Crud-toolbar-item"); if (tableActions && this.wrapperRef.current.closest('.has-popover')) { var _w = this.wrapperRef.current.closest('.has-popover').getBoundingClientRect(), top = _w.top, height = _w.height, left = _w.left; outerStyle = (0, tslib_1.__assign)((0, tslib_1.__assign)({ display: 'block' }, style), { position: 'fixed', top: top + height, left: this.wrapperRef.current.closest("." + ns + "Crud-toolbar-item") ? left - 140 : left }); } else { // 旧壳逻辑 - 估计是因为内核版本问题导致的这个差异 if (shell_1.Shell.hasShell() && !window['AppShell'].openNewWin) { if (this.wrapperRef.current.closest(".ant-modal-body") || this.wrapperRef.current.closest("." + ns + "Modal-body")) { if ((_e = this.props.className) === null || _e === void 0 ? void 0 : _e.includes('batchEidtPopOver')) { outerStyle = (0, tslib_1.__assign)((0, tslib_1.__assign)({ display: 'block' }, style), { position: 'absolute', top: positionTop + yOffset + (positionTop ? positionTop >= 0 ? 5 : -5 : 0), left: (positionLeft < 0 ? xOffset : positionLeft + xOffset) }); } else { outerStyle = (0, tslib_1.__assign)((0, tslib_1.__assign)({}, outerStyle), { position: 'fixed', width: 'unset', top: isOverSize ? (formControlData === null || formControlData === void 0 ? void 0 : formControlData.top) - clientData.height : (formControlData === null || formControlData === void 0 ? void 0 : formControlData.top) + (formControlData === null || formControlData === void 0 ? void 0 : formControlData.height), left: (formControlData === null || formControlData === void 0 ? void 0 : formControlData.left) + (isCoverScreen ? (bodyClient - (formControlData === null || formControlData === void 0 ? void 0 : formControlData.left) - clientData.width - 32) : 0) }); } } else { outerStyle = (0, tslib_1.__assign)((0, tslib_1.__assign)({}, outerStyle), { position: 'fixed', width: 'unset', top: isOverSize ? (formControlData === null || formControlData === void 0 ? void 0 : formControlData.top) - clientData.height : (formControlData === null || formControlData === void 0 ? void 0 : formControlData.top) + (formControlData === null || formControlData === void 0 ? void 0 : formControlData.height), left: (formControlData === null || formControlData === void 0 ? void 0 : formControlData.left) + (isCoverScreen ? (bodyClient - (formControlData === null || formControlData === void 0 ? void 0 : formControlData.left) - clientData.width - 32) : 0) }); } } else { if (this.wrapperRef.current.closest(".ant-modal-body")) { if (this.wrapperRef.current.closest(".row-edit-form")) { outerStyle = (0, tslib_1.__assign)((0, tslib_1.__assign)({}, outerStyle), { width: 'unset', position: 'fixed', top: isOverSize ? (formControlData === null || formControlData === void 0 ? void 0 : formControlData.top) - clientData.height - 55 : (formControlData === null || formControlData === void 0 ? void 0 : formControlData.top) + (formControlData === null || formControlData === void 0 ? void 0 : formControlData.height) - 45, left: this.wrapperRef.current.closest(".ant-drawer-body") ? formControlData === null || formControlData === void 0 ? void 0 : formControlData.left : (formControlData === null || formControlData === void 0 ? void 0 : formControlData.left) - ((_f = this.wrapperRef.current.closest("." + ns + "Modal-body")) === null || _f === void 0 ? void 0 : _f.getBoundingClientRect().left) }); } else { outerStyle = (0, tslib_1.__assign)((0, tslib_1.__assign)({}, outerStyle), { width: 'unset', position: 'fixed', top: isOverSize ? (formControlData === null || formControlData === void 0 ? void 0 : formControlData.top) - clientData.height : (formControlData === null || formControlData === void 0 ? void 0 : formControlData.top) + (formControlData === null || formControlData === void 0 ? void 0 : formControlData.height), left: (formControlData === null || formControlData === void 0 ? void 0 : formControlData.left) + (isCoverScreen ? (bodyClient - (formControlData === null || formControlData === void 0 ? void 0 : formControlData.left) - clientData.width - 32) : 0) }); } } else if (this.wrapperRef.current.closest("." + ns + "Modal-body")) { var batchEditBtnDom = (_g = this.wrapperRef.current.closest("." + ns + "TableCell-batchEditBtn")) === null || _g === void 0 ? void 0 : _g.getBoundingClientRect(); // 又快速编辑 快速编辑优先 if ((_j = (_h = this.wrapperRef) === null || _h === void 0 ? void 0 : _h.current) === null || _j === void 0 ? void 0 : _j.closest('[class*="Field--quickEditable"]')) { outerStyle = (0, tslib_1.__assign)((0, tslib_1.__assign)({}, outerStyle), { width: 'unset', position: 'fixed', top: 'unset', left: 'unset' }); } else if ((_k = this.props.className) === null || _k === void 0 ? void 0 : _k.includes('batchEidtPopOver')) { outerStyle = (0, tslib_1.__assign)((0, tslib_1.__assign)({ display: 'block' }, style), { width: 'unset', position: 'fixed', top: isOverSize ? (batchEditBtnDom === null || batchEditBtnDom === void 0 ? void 0 : batchEditBtnDom.top) - clientData.height : batchEditBtnDom.top + (batchEditBtnDom === null || batchEditBtnDom === void 0 ? void 0 : batchEditBtnDom.height), left: (batchEditBtnDom === null || batchEditBtnDom === void 0 ? void 0 : batchEditBtnDom.left) - ((_l = this.wrapperRef.current.closest("." + ns + "Modal-body")) === null || _l === void 0 ? void 0 : _l.getBoundingClientRect().left) }); } else { var modalData = (_m = this.wrapperRef.current.closest("." + ns + "Modal")) === null || _m === void 0 ? void 0 : _m.getBoundingClientRect(); outerStyle = (0, tslib_1.__assign)((0, tslib_1.__assign)({ display: 'block' }, style), { width: 'unset', position: 'fixed', top: multiple ? (formControlData === null || formControlData === void 0 ? void 0 : formControlData.top) - clientData.height - (modalData === null || modalData === void 0 ? void 0 : modalData.top) - 1 : isOverSize ? (formControlData === null || formControlData === void 0 ? void 0 : formControlData.top) - clientData.height - (modalData === null || modalData === void 0 ? void 0 : modalData.top) - 1 : (formControlData === null || formControlData === void 0 ? void 0 : formControlData.top) + (formControlData === null || formControlData === void 0 ? void 0 : formControlData.height) - (modalData === null || modalData === void 0 ? void 0 : modalData.top), left: (formControlData === null || formControlData === void 0 ? void 0 : formControlData.left) - ((_o = this.wrapperRef.current.closest("." + ns + "Modal-body")) === null || _o === void 0 ? void 0 : _o.getBoundingClientRect().left) + (isCoverScreen ? (bodyClient - (formControlData === null || formControlData === void 0 ? void 0 : formControlData.left) - clientData.width - 32) : 0) }); } } else { // 又快速编辑 快速编辑优先 if ((_q = (_p = this.wrapperRef) === null || _p === void 0 ? void 0 : _p.current) === null || _q === void 0 ? void 0 : _q.closest('[class*="Field--quickEditable"]')) { outerStyle = (0, tslib_1.__assign)((0, tslib_1.__assign)({}, outerStyle), { position: 'fixed', width: 'unset', top: ((wrapperRect === null || wrapperRect === void 0 ? void 0 : wrapperRect.top) || 0) + ((wrapperRect === null || wrapperRect === void 0 ? void 0 : wrapperRect.height) || 0), left: (wrapperRect === null || wrapperRect === void 0 ? void 0 : wrapperRect.left) + (isCoverScreen ? (bodyClient - (formControlData === null || formControlData === void 0 ? void 0 : formControlData.left) - clientData.width - 16) : 0) }); } else outerStyle = (0, tslib_1.__assign)((0, tslib_1.__assign)({}, outerStyle), { position: 'fixed', width: 'unset', top: isOverSize ? (formControlData === null || formControlData === void 0 ? void 0 : formControlData.top) - clientData.height : (formControlData === null || formControlData === void 0 ? void 0 : formControlData.top) + (formControlData === null || formControlData === void 0 ? void 0 : formControlData.height), left: (formControlData === null || formControlData === void 0 ? void 0 : formControlData.left) + (isCoverScreen ? (bodyClient - (formControlData === null || formControlData === void 0 ? void 0 : formControlData.left) - clientData.width - 16) : 0) }); } } } // 查看是否在拖拽弹窗中,如果在拖拽弹窗中,需要在popover显示的时候,取拖拽弹窗的translate的负值 var dragModal = (_r = this.wrapperRef.current) === null || _r === void 0 ? void 0 : _r.closest('.fl-modal.pc-dialog'); var resizeContainer = dragModal === null || dragModal === void 0 ? void 0 : dragModal.querySelector('.resize-container.react-draggable'); var resizeTranslate = resizeContainer === null || resizeContainer === void 0 ? void 0 : resizeContainer.style.transform; var translateValues = resizeTranslate === null || resizeTranslate === void 0 ? void 0 : resizeTranslate.match(/translate\(([^)]+)\)/); var translateX = '0'; var translateY = '0'; if (translateValues && translateValues.length > 1) { var _x = translateValues[1].split(','), x = _x[0], y = _x[1]; translateX = "-" + ((_s = x === null || x === void 0 ? void 0 : x.trim()) !== null && _s !== void 0 ? _s : 0); translateY = "-" + ((_t = y === null || y === void 0 ? void 0 : y.trim()) !== null && _t !== void 0 ? _t : 0); outerStyle = (0, tslib_1.__assign)((0, tslib_1.__assign)({}, outerStyle), { transform: "translate(" + translateX + ", " + translateY + ")" }); var left = outerStyle.left, top = outerStyle.top; var overlayWidth = resizeContainer === null || resizeContainer === void 0 ? void 0 : resizeContainer.offsetWidth; var overlayHeight = resizeContainer === null || resizeContainer === void 0 ? void 0 : resizeContainer.offsetHeight; var finalX = Number(((x === null || x === void 0 ? void 0 : x.trim().split('px')[0]) - left)) + 'px'; var finalY = top * -1 + 'px'; overlayStyle = { width: (overlayWidth !== null && overlayWidth !== void 0 ? overlayWidth : 0) + "px", height: (overlayHeight !== null && overlayHeight !== void 0 ? overlayHeight : 0) + "px", transform: "translate(" + finalX + ", " + finalY + ")" }; } } else { outerStyle = (0, tslib_1.__assign)((0, tslib_1.__assign)({ display: 'block' }, style), { // Jay 增加间隙,优化样式 // top: (positionTop as number) + yOffset, // left: (positionLeft as number) + xOffset, top: positionTop + yOffset + (positionTop ? positionTop >= 0 ? 5 : -5 : 0), left: (positionLeft < 0 ? xOffset : positionLeft + xOffset) }); } if (outerStyle.position === 'fixed' && outerStyle.top < 0) { outerStyle = (0, tslib_1.__assign)((0, tslib_1.__assign)({}, outerStyle), { top: 10 }); } return (react_1.default.createElement("div", (0, tslib_1.__assign)({ ref: this.wrapperRef, className: cx(ns + "PopOver", className, ns + "PopOver--" + (0, helper_1.camel)(activePlacement)), style: outerStyle }, rest), overlay ? (react_1.default.createElement("div", { className: ns + "PopOver-overlay", style: overlayStyle, onClick: onHide })) : null, children)); }; PopOver.defaultProps = { className: '', offset: { x: 0, y: 0 }, overlay: false, placement: 'auto' }; return PopOver; }(react_1.default.PureComponent)); exports.PopOver = PopOver; exports.default = (0, theme_1.themeable)(PopOver); //# sourceMappingURL=./components/PopOver.js.map