@dnb/eufemia
Version:
DNB Eufemia Design System UI Library
198 lines (197 loc) • 7.86 kB
JavaScript
;
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