let scrollbarVerticalSize; let scrollbarHorizontalSize; // Measure scrollbar width for padding body during modal show/hide const scrollbarMeasure = { position: 'absolute', top: '-9999px', width: '50px', height: '50px', }; export const INTERNAL_COL_DEFINE = 'RC_TABLE_INTERNAL_COL_DEFINE'; export function measureScrollbar({ direction = 'vertical', prefixCls }) { if (typeof document === 'undefined' || typeof window === 'undefined') { return 0; } const isVertical = direction === 'vertical'; if (isVertical && scrollbarVerticalSize) { return scrollbarVerticalSize; } if (!isVertical && scrollbarHorizontalSize) { return scrollbarHorizontalSize; } const scrollDiv = document.createElement('div'); Object.keys(scrollbarMeasure).forEach(scrollProp => { scrollDiv.style[scrollProp] = scrollbarMeasure[scrollProp]; }); // apply hide scrollbar className ahead scrollDiv.className = `${prefixCls}-hide-scrollbar scroll-div-append-to-body`; // Append related overflow style if (isVertical) { scrollDiv.style.overflowY = 'scroll'; } else { scrollDiv.style.overflowX = 'scroll'; } document.body.appendChild(scrollDiv); let size = 0; if (isVertical) { size = scrollDiv.offsetWidth - scrollDiv.clientWidth; scrollbarVerticalSize = size; } else { size = scrollDiv.offsetHeight - scrollDiv.clientHeight; scrollbarHorizontalSize = size; } document.body.removeChild(scrollDiv); return size; } export function debounce(func, wait, immediate) { let timeout; function debounceFunc(...args) { const context = this; // https://fb.me/react-event-pooling if (args[0] && args[0].persist) { args[0].persist(); } const later = () => { timeout = null; if (!immediate) { func.apply(context, args); } }; const callNow = immediate && !timeout; clearTimeout(timeout); timeout = setTimeout(later, wait); if (callNow) { func.apply(context, args); } } debounceFunc.cancel = function cancel() { if (timeout) { clearTimeout(timeout); timeout = null; } }; return debounceFunc; } export function remove(array, item) { const index = array.indexOf(item); const front = array.slice(0, index); const last = array.slice(index + 1, array.length); return front.concat(last); } /** * Returns only data- and aria- key/value pairs * @param {object} props */ export function getDataAndAriaProps(props) { return Object.keys(props).reduce((memo, key) => { if (key.substr(0, 5) === 'data-' || key.substr(0, 5) === 'aria-') { memo[key] = props[key]; } return memo; }, {}); }