UNPKG

@aplus-frontend/antdv

Version:

Vue basic component library maintained based on ant-design-vue

135 lines (134 loc) 4.58 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _getScrollBarSize = _interopRequireDefault(require("../../_util/getScrollBarSize")); var _setStyle = _interopRequireDefault(require("../../_util/setStyle")); let locks = []; const scrollingEffectClassName = 'ant-scrolling-effect'; const scrollingEffectClassNameReg = new RegExp(`${scrollingEffectClassName}`, 'g'); let uuid = 0; // https://github.com/ant-design/ant-design/issues/19340 // https://github.com/ant-design/ant-design/issues/19332 const cacheStyle = new Map(); class ScrollLocker { constructor(options) { this.getContainer = () => { var _a; return (_a = this.options) === null || _a === void 0 ? void 0 : _a.container; }; // if options change... this.reLock = options => { const findLock = locks.find(_ref => { let { target } = _ref; return target === this.lockTarget; }); if (findLock) { this.unLock(); } this.options = options; if (findLock) { findLock.options = options; this.lock(); } }; this.lock = () => { var _a; // If lockTarget exist return if (locks.some(_ref2 => { let { target } = _ref2; return target === this.lockTarget; })) { return; } // If same container effect, return if (locks.some(_ref3 => { let { options } = _ref3; var _a; return (options === null || options === void 0 ? void 0 : options.container) === ((_a = this.options) === null || _a === void 0 ? void 0 : _a.container); })) { locks = [...locks, { target: this.lockTarget, options: this.options }]; return; } let scrollBarSize = 0; const container = ((_a = this.options) === null || _a === void 0 ? void 0 : _a.container) || document.body; if (container === document.body && window.innerWidth - document.documentElement.clientWidth > 0 || container.scrollHeight > container.clientHeight) { scrollBarSize = (0, _getScrollBarSize.default)(); } const containerClassName = container.className; if (locks.filter(_ref4 => { let { options } = _ref4; var _a; return (options === null || options === void 0 ? void 0 : options.container) === ((_a = this.options) === null || _a === void 0 ? void 0 : _a.container); }).length === 0) { cacheStyle.set(container, (0, _setStyle.default)({ width: scrollBarSize !== 0 ? `calc(100% - ${scrollBarSize}px)` : undefined, overflow: 'hidden', overflowX: 'hidden', overflowY: 'hidden' }, { element: container })); } // https://github.com/ant-design/ant-design/issues/19729 if (!scrollingEffectClassNameReg.test(containerClassName)) { const addClassName = `${containerClassName} ${scrollingEffectClassName}`; container.className = addClassName.trim(); } locks = [...locks, { target: this.lockTarget, options: this.options }]; }; this.unLock = () => { var _a; const findLock = locks.find(_ref5 => { let { target } = _ref5; return target === this.lockTarget; }); locks = locks.filter(_ref6 => { let { target } = _ref6; return target !== this.lockTarget; }); if (!findLock || locks.some(_ref7 => { let { options } = _ref7; var _a; return (options === null || options === void 0 ? void 0 : options.container) === ((_a = findLock.options) === null || _a === void 0 ? void 0 : _a.container); })) { return; } // Remove Effect const container = ((_a = this.options) === null || _a === void 0 ? void 0 : _a.container) || document.body; const containerClassName = container.className; if (!scrollingEffectClassNameReg.test(containerClassName)) return; (0, _setStyle.default)(cacheStyle.get(container), { element: container }); cacheStyle.delete(container); container.className = container.className.replace(scrollingEffectClassNameReg, '').trim(); }; // eslint-disable-next-line no-plusplus this.lockTarget = uuid++; this.options = options; } } exports.default = ScrollLocker;