es-grid-template
Version:
es-grid-template
170 lines (164 loc) • 6.14 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.STYLED_VERSION = exports.STYLED_REF_PROP = exports.OVERSCAN_SIZE = exports.AUTO_VIRTUAL_THRESHOLD = void 0;
exports.getParentElement = getParentElement;
exports.getScrollbarSize = getScrollbarSize;
exports.shallowEqual = shallowEqual;
exports.sum = sum;
exports.syncScrollLeft = syncScrollLeft;
exports.throttledWindowResize$ = void 0;
var _rxjs = require("rxjs");
var _operators = require("rxjs/operators");
var styledComponents = _interopRequireWildcard(require("styled-components"));
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
/** Version of the `styled-components` library. ali-react-table supports both v3 and v5. */
const STYLED_VERSION = exports.STYLED_VERSION = styledComponents.createGlobalStyle != null ? 'v5' : 'v3';
const STYLED_REF_PROP = exports.STYLED_REF_PROP = STYLED_VERSION === 'v3' ? 'innerRef' : 'ref';
const OVERSCAN_SIZE = exports.OVERSCAN_SIZE = 300;
const AUTO_VIRTUAL_THRESHOLD = exports.AUTO_VIRTUAL_THRESHOLD = 300;
function sum(arr) {
let result = 0;
arr.forEach(x => {
result += x;
});
return result;
}
// Use defer to avoid referencing window too early, which can cause errors in SSR
const throttledWindowResize$ = exports.throttledWindowResize$ = (0, _rxjs.defer)(() => (0, _rxjs.fromEvent)(window, 'resize', {
passive: true
}).pipe((0, _operators.throttleTime)(150, _rxjs.asyncScheduler, {
leading: true,
trailing: true
})));
/** Get the default scrollbar size */
function getScrollbarSizeImpl() {
const scrollDiv = document.createElement('div');
scrollDiv.style.position = 'absolute';
scrollDiv.style.width = '100px';
scrollDiv.style.height = '100px';
scrollDiv.style.overflow = 'scroll';
scrollDiv.style.top = '-9999px';
document.body.appendChild(scrollDiv);
const scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth;
const scrollbarHeight = scrollDiv.offsetHeight - scrollDiv.clientHeight;
document.body.removeChild(scrollDiv);
return {
width: scrollbarWidth,
height: scrollbarHeight
};
}
let scrollBarSize$;
function getScrollbarSize() {
if (scrollBarSize$ == null) {
scrollBarSize$ = new _rxjs.BehaviorSubject(getScrollbarSizeImpl());
throttledWindowResize$.pipe((0, _operators.map)(() => getScrollbarSizeImpl())).subscribe(scrollBarSize$);
}
return scrollBarSize$.value;
}
/**
* Synchronize the `scrollLeft` value among multiple elements.
* The callback will be invoked whenever `scrollLeft` changes.
*/
function syncScrollLeft(elements, callback) {
const bypassSet = new Set();
function publishScrollLeft(origin, scrollLeft) {
bypassSet.clear();
for (const elem of elements) {
if (elem === origin) {
continue;
}
elem.scrollLeft = scrollLeft;
bypassSet.add(elem);
}
}
const subscription = new _rxjs.Subscription();
for (const ele of elements) {
const listener = () => {
if (bypassSet.has(ele)) {
bypassSet.delete(ele);
return;
}
const scrollLeft = ele.scrollLeft;
publishScrollLeft(ele, scrollLeft);
callback(scrollLeft);
};
ele.addEventListener('scroll', listener, {
passive: true
});
subscription.add(() => ele.removeEventListener('scroll', listener));
}
return subscription;
}
/**
* Performs equality by iterating through keys on an object and returning false
* when any key has values which are not strictly equal between the arguments.
* Returns true when the values of all keys are strictly equal.
*/
function shallowEqual(objA, objB) {
const hasOwnProperty = Object.prototype.hasOwnProperty;
if (Object.is(objA, objB)) {
return true;
}
if (typeof objA !== 'object' || objA === null || typeof objB !== 'object' || objB === null) {
return false;
}
const keysA = Object.keys(objA);
const keysB = Object.keys(objB);
if (keysA.length !== keysB.length) {
return false;
}
// Test for A's keys different from B.
for (let i = 0; i < keysA.length; i++) {
if (!hasOwnProperty.call(objB, keysA[i]) || !Object.is(objA[keysA[i]], objB[keysA[i]])) {
return false;
}
}
return true;
}
function getParentElement(element, selector) {
function isMatched(el, str = "") {
// eslint-disable-next-line no-param-reassign
str = str.toLowerCase();
let matched = false;
const firstChar = str.split("")[0];
if (firstChar === ".") {
const selectorClass = str.split(".")[1] || "";
const elCls = el.className || "";
if (typeof elCls === "string") {
const cls = elCls.toLowerCase().split(" ");
matched = cls.indexOf(selectorClass) > -1;
}
} else if (firstChar === "#") {
const selectorID = str.split("#")[1] || "";
const elID = el.id || "";
if (typeof elID === "string") {
matched = elID.toLowerCase() === selectorID;
}
} else {
matched = el.tagName.toLowerCase() === str;
}
return matched;
}
function getParent(el, tagName) {
if (!el) {
return null;
}
if (isMatched(el, tagName)) {
// return el;
}
const p = el.parentElement || el.parentNode;
if (p) {
if (isMatched(p, tagName)) {
return p;
} else {
return getParent(p, tagName);
}
} else {
return null;
}
}
return getParent(element, selector);
}