UNPKG

@dnb/eufemia

Version:

DNB Eufemia Design System UI Library

198 lines (197 loc) 7.86 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.checkIfHasScrollbar = exports.DetectOutsideClickClass = void 0; exports.defineNavigator = defineNavigator; exports.detectOutsideClick = void 0; exports.isTouchDevice = isTouchDevice; exports.processChildren = void 0; var _push = _interopRequireDefault(require("core-js-pure/stable/instance/push.js")); var _react = _interopRequireDefault(require("react")); var _keycode = _interopRequireDefault(require("../keycode.js")); var _helpers = require("../helpers.js"); function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } function isTouchDevice() { if (typeof document !== 'undefined') { let intent = false; try { intent = document.documentElement.getAttribute('data-whatintent'); } catch (e) {} return intent === 'touch'; } return false; } function defineNavigator() { const handleNavigator = () => { if (typeof document === 'undefined' || typeof window === 'undefined' || typeof navigator === 'undefined') { return; } try { if (!(typeof window !== 'undefined' && window.IS_TEST)) { if (navigator.platform.match(new RegExp(_helpers.PLATFORM_MAC)) !== null) { document.documentElement.setAttribute('data-os', 'mac'); } else if (navigator.platform.match(new RegExp(_helpers.PLATFORM_WIN)) !== null) { document.documentElement.setAttribute('data-os', 'win'); } else if (navigator.platform.match(new RegExp(_helpers.PLATFORM_LINUX)) !== null) { document.documentElement.setAttribute('data-os', 'linux'); } } else { document.documentElement.setAttribute('data-os', 'other'); } } catch (e) { (0, _helpers.warn)(e); } document.removeEventListener('DOMContentLoaded', handleNavigator); }; if (typeof document !== 'undefined' && document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', handleNavigator); } else { handleNavigator(); } } const processChildren = props => { if (!props) { return null; } if (typeof global !== 'undefined' && Array.isArray(global.registeredElements) && global.registeredElements.length > 0) { let cache = null; Object.entries(props).reverse().map(([key, cb]) => { if (key.includes('render_') && /^render_/.test(key)) { if (typeof cb === 'function') { if (cache) { if (Object.isFrozen(props)) { props = { ...props }; } props.children = cache; } return cache = _react.default.createElement(_react.default.Fragment, { key: key }, cb(props)); } } return null; }).filter(Boolean); if (cache) { return cache; } } const res = typeof props.children === 'function' ? props.children(props) : props.children; if (Array.isArray(res)) { const onlyTexts = res.reduce((pV, cV) => { if (typeof cV === 'string' || typeof cV === 'number') { (0, _push.default)(pV).call(pV, cV); } return pV; }, []); if (onlyTexts.length === res.length && onlyTexts.length > 0) { return onlyTexts.join(''); } } return res; }; exports.processChildren = processChildren; const detectOutsideClick = (ignoreElements, onSuccess, options) => new DetectOutsideClickClass(ignoreElements, onSuccess, options); exports.detectOutsideClick = detectOutsideClick; class DetectOutsideClickClass { constructor(_ignoreElements, _onSuccess, options = {}) { _defineProperty(this, "checkOutsideClick", ({ event, ignoreElements }, onSuccess = null) => { try { const currentElement = event.target; if ((currentElement === null || currentElement === void 0 ? void 0 : currentElement.tagName) === 'HTML' && (event.pageX > document.documentElement.clientWidth - 40 || event.pageY > document.documentElement.clientHeight - 40)) { return; } if (checkIfHasScrollbar(currentElement)) { return; } for (let i = 0, elem, l = ignoreElements.length; i < l; ++i) { const ignoreElement = ignoreElements[i] && 'current' in ignoreElements[i] ? ignoreElements[i].current : ignoreElements[i]; elem = currentElement; if (!ignoreElements[i]) { continue; } do { if (elem === ignoreElement) { return; } elem = elem && elem.parentNode; } while (elem); } if (typeof onSuccess === 'function') { onSuccess(); } } catch (e) { (0, _helpers.warn)(e); } }); if (!this.handleClickOutside && typeof document !== 'undefined' && typeof window !== 'undefined') { if (!Array.isArray(_ignoreElements)) { _ignoreElements = [_ignoreElements]; } this.handleClickOutside = event => { this.checkOutsideClick({ event, ignoreElements: _ignoreElements }, () => typeof _onSuccess === 'function' && _onSuccess({ event })); }; document.addEventListener('mousedown', this.handleClickOutside); this.keydownCallback = event => { const keyCode = (0, _keycode.default)(event); if (keyCode === 'esc') { window.removeEventListener('keydown', this.keydownCallback); if (typeof _onSuccess === 'function') { _onSuccess({ event }); } } }; window.addEventListener('keydown', this.keydownCallback); if (options.includedKeys) { this.keyupCallback = event => { const keyCode = (0, _keycode.default)(event); if (options.includedKeys.includes(keyCode) && typeof this.handleClickOutside === 'function') { this.handleClickOutside(event, () => { if (this.keyupCallback) window.removeEventListener('keyup', this.keyupCallback); }); } }; window.addEventListener('keyup', this.keyupCallback); } } } remove() { if (this.handleClickOutside && typeof document !== 'undefined') { document.removeEventListener('mousedown', this.handleClickOutside); this.handleClickOutside = null; } if (this.keydownCallback && typeof window !== 'undefined') { window.removeEventListener('keydown', this.keydownCallback); this.keydownCallback = null; } if (this.keyupCallback && typeof window !== 'undefined') { window.removeEventListener('keyup', this.keyupCallback); this.keyupCallback = null; } } } exports.DetectOutsideClickClass = DetectOutsideClickClass; const checkIfHasScrollbar = elem => { return elem && (elem.scrollHeight > elem.offsetHeight || elem.scrollWidth > elem.offsetWidth) && overflowIsScrollable(elem); }; exports.checkIfHasScrollbar = checkIfHasScrollbar; const overflowIsScrollable = elem => { const style = typeof window !== 'undefined' ? window.getComputedStyle(elem) : {}; return /scroll|auto/i.test((style.overflow || '') + (style.overflowX || '') + (style.overflowY || '')); }; //# sourceMappingURL=component-helper-legacy.js.map