UNPKG

@ng-bootstrap/ng-bootstrap

Version:
61 lines 8.97 kB
const ALIASES = { hover: ['mouseenter', 'mouseleave'], focus: ['focusin', 'focusout'], }; export function parseTriggers(triggers) { const trimmedTriggers = (triggers || '').trim(); if (trimmedTriggers.length === 0) { return []; } const parsedTriggers = trimmedTriggers .split(/\s+/) .map((trigger) => trigger.split(':')) .map((triggerPair) => (ALIASES[triggerPair[0]] || triggerPair)); const manualTriggers = parsedTriggers.filter((triggerPair) => triggerPair.includes('manual')); if (manualTriggers.length > 1) { throw `Triggers parse error: only one manual trigger is allowed`; } if (manualTriggers.length === 1 && parsedTriggers.length > 1) { throw `Triggers parse error: manual trigger can't be mixed with other triggers`; } return manualTriggers.length ? [] : parsedTriggers; } export function listenToTriggers(element, triggers, isOpenedFn, openFn, closeFn, openDelayMs = 0, closeDelayMs = 0) { const parsedTriggers = parseTriggers(triggers); if (parsedTriggers.length === 0) { return () => { }; } const activeOpenTriggers = new Set(); const cleanupFns = []; let timeout; function addEventListener(name, listener) { element.addEventListener(name, listener); cleanupFns.push(() => element.removeEventListener(name, listener)); } function withDelay(fn, delayMs) { clearTimeout(timeout); if (delayMs > 0) { timeout = setTimeout(fn, delayMs); } else { fn(); } } for (const [openTrigger, closeTrigger] of parsedTriggers) { if (!closeTrigger) { addEventListener(openTrigger, () => isOpenedFn() ? withDelay(closeFn, closeDelayMs) : withDelay(openFn, openDelayMs)); } else { addEventListener(openTrigger, () => { activeOpenTriggers.add(openTrigger); withDelay(() => activeOpenTriggers.size > 0 && openFn(), openDelayMs); }); addEventListener(closeTrigger, () => { activeOpenTriggers.delete(openTrigger); withDelay(() => activeOpenTriggers.size === 0 && closeFn(), closeDelayMs); }); } } return () => cleanupFns.forEach((cleanupFn) => cleanupFn()); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJpZ2dlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdXRpbC90cmlnZ2Vycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLE9BQU8sR0FBRztJQUNmLEtBQUssRUFBRSxDQUFDLFlBQVksRUFBRSxZQUFZLENBQUM7SUFDbkMsS0FBSyxFQUFFLENBQUMsU0FBUyxFQUFFLFVBQVUsQ0FBQztDQUM5QixDQUFDO0FBRUYsTUFBTSxVQUFVLGFBQWEsQ0FBQyxRQUFnQjtJQUM3QyxNQUFNLGVBQWUsR0FBRyxDQUFDLFFBQVEsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUVoRCxJQUFJLGVBQWUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1FBQ2pDLE9BQU8sRUFBRSxDQUFDO0tBQ1Y7SUFFRCxNQUFNLGNBQWMsR0FBRyxlQUFlO1NBQ3BDLEtBQUssQ0FBQyxLQUFLLENBQUM7U0FDWixHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDcEMsR0FBRyxDQUFDLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxXQUFXLENBQXNCLENBQUMsQ0FBQztJQUV0RixNQUFNLGNBQWMsR0FBRyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFFOUYsSUFBSSxjQUFjLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtRQUM5QixNQUFNLDBEQUEwRCxDQUFDO0tBQ2pFO0lBRUQsSUFBSSxjQUFjLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxjQUFjLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtRQUM3RCxNQUFNLHlFQUF5RSxDQUFDO0tBQ2hGO0lBRUQsT0FBTyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQztBQUNwRCxDQUFDO0FBRUQsTUFBTSxVQUFVLGdCQUFnQixDQUMvQixPQUFvQixFQUNwQixRQUFnQixFQUNoQixVQUF5QixFQUN6QixNQUFrQixFQUNsQixPQUFtQixFQUNuQixXQUFXLEdBQUcsQ0FBQyxFQUNmLFlBQVksR0FBRyxDQUFDO0lBRWhCLE1BQU0sY0FBYyxHQUFHLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUUvQyxJQUFJLGNBQWMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1FBQ2hDLE9BQU8sR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFDO0tBQ2hCO0lBRUQsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0lBQzdDLE1BQU0sVUFBVSxHQUFtQixFQUFFLENBQUM7SUFDdEMsSUFBSSxPQUFZLENBQUM7SUFFakIsU0FBUyxnQkFBZ0IsQ0FBQyxJQUFZLEVBQUUsUUFBb0I7UUFDM0QsT0FBTyxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQztRQUN6QyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUNwRSxDQUFDO0lBRUQsU0FBUyxTQUFTLENBQUMsRUFBYyxFQUFFLE9BQWU7UUFDakQsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3RCLElBQUksT0FBTyxHQUFHLENBQUMsRUFBRTtZQUNoQixPQUFPLEdBQUcsVUFBVSxDQUFDLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQztTQUNsQzthQUFNO1lBQ04sRUFBRSxFQUFFLENBQUM7U0FDTDtJQUNGLENBQUM7SUFFRCxLQUFLLE1BQU0sQ0FBQyxXQUFXLEVBQUUsWUFBWSxDQUFDLElBQUksY0FBYyxFQUFFO1FBQ3pELElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDbEIsZ0JBQWdCLENBQUMsV0FBVyxFQUFFLEdBQUcsRUFBRSxDQUNsQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxXQUFXLENBQUMsQ0FDaEYsQ0FBQztTQUNGO2FBQU07WUFDTixnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsR0FBRyxFQUFFO2dCQUNsQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQ3BDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxJQUFJLE1BQU0sRUFBRSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1lBQ3ZFLENBQUMsQ0FBQyxDQUFDO1lBQ0gsZ0JBQWdCLENBQUMsWUFBWSxFQUFFLEdBQUcsRUFBRTtnQkFDbkMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUN2QyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsa0JBQWtCLENBQUMsSUFBSSxLQUFLLENBQUMsSUFBSSxPQUFPLEVBQUUsRUFBRSxZQUFZLENBQUMsQ0FBQztZQUMzRSxDQUFDLENBQUMsQ0FBQztTQUNIO0tBQ0Q7SUFFRCxPQUFPLEdBQUcsRUFBRSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7QUFDN0QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImNvbnN0IEFMSUFTRVMgPSB7XG5cdGhvdmVyOiBbJ21vdXNlZW50ZXInLCAnbW91c2VsZWF2ZSddLFxuXHRmb2N1czogWydmb2N1c2luJywgJ2ZvY3Vzb3V0J10sXG59O1xuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VUcmlnZ2Vycyh0cmlnZ2Vyczogc3RyaW5nKTogW3N0cmluZywgc3RyaW5nP11bXSB7XG5cdGNvbnN0IHRyaW1tZWRUcmlnZ2VycyA9ICh0cmlnZ2VycyB8fCAnJykudHJpbSgpO1xuXG5cdGlmICh0cmltbWVkVHJpZ2dlcnMubGVuZ3RoID09PSAwKSB7XG5cdFx0cmV0dXJuIFtdO1xuXHR9XG5cblx0Y29uc3QgcGFyc2VkVHJpZ2dlcnMgPSB0cmltbWVkVHJpZ2dlcnNcblx0XHQuc3BsaXQoL1xccysvKVxuXHRcdC5tYXAoKHRyaWdnZXIpID0+IHRyaWdnZXIuc3BsaXQoJzonKSlcblx0XHQubWFwKCh0cmlnZ2VyUGFpcikgPT4gKEFMSUFTRVNbdHJpZ2dlclBhaXJbMF1dIHx8IHRyaWdnZXJQYWlyKSBhcyBbc3RyaW5nLCBzdHJpbmc/XSk7XG5cblx0Y29uc3QgbWFudWFsVHJpZ2dlcnMgPSBwYXJzZWRUcmlnZ2Vycy5maWx0ZXIoKHRyaWdnZXJQYWlyKSA9PiB0cmlnZ2VyUGFpci5pbmNsdWRlcygnbWFudWFsJykpO1xuXG5cdGlmIChtYW51YWxUcmlnZ2Vycy5sZW5ndGggPiAxKSB7XG5cdFx0dGhyb3cgYFRyaWdnZXJzIHBhcnNlIGVycm9yOiBvbmx5IG9uZSBtYW51YWwgdHJpZ2dlciBpcyBhbGxvd2VkYDtcblx0fVxuXG5cdGlmIChtYW51YWxUcmlnZ2Vycy5sZW5ndGggPT09IDEgJiYgcGFyc2VkVHJpZ2dlcnMubGVuZ3RoID4gMSkge1xuXHRcdHRocm93IGBUcmlnZ2VycyBwYXJzZSBlcnJvcjogbWFudWFsIHRyaWdnZXIgY2FuJ3QgYmUgbWl4ZWQgd2l0aCBvdGhlciB0cmlnZ2Vyc2A7XG5cdH1cblxuXHRyZXR1cm4gbWFudWFsVHJpZ2dlcnMubGVuZ3RoID8gW10gOiBwYXJzZWRUcmlnZ2Vycztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxpc3RlblRvVHJpZ2dlcnMoXG5cdGVsZW1lbnQ6IEhUTUxFbGVtZW50LFxuXHR0cmlnZ2Vyczogc3RyaW5nLFxuXHRpc09wZW5lZEZuOiAoKSA9PiBib29sZWFuLFxuXHRvcGVuRm46ICgpID0+IHZvaWQsXG5cdGNsb3NlRm46ICgpID0+IHZvaWQsXG5cdG9wZW5EZWxheU1zID0gMCxcblx0Y2xvc2VEZWxheU1zID0gMCxcbikge1xuXHRjb25zdCBwYXJzZWRUcmlnZ2VycyA9IHBhcnNlVHJpZ2dlcnModHJpZ2dlcnMpO1xuXG5cdGlmIChwYXJzZWRUcmlnZ2Vycy5sZW5ndGggPT09IDApIHtcblx0XHRyZXR1cm4gKCkgPT4ge307XG5cdH1cblxuXHRjb25zdCBhY3RpdmVPcGVuVHJpZ2dlcnMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblx0Y29uc3QgY2xlYW51cEZuczogKCgpID0+IHZvaWQpW10gPSBbXTtcblx0bGV0IHRpbWVvdXQ6IGFueTtcblxuXHRmdW5jdGlvbiBhZGRFdmVudExpc3RlbmVyKG5hbWU6IHN0cmluZywgbGlzdGVuZXI6ICgpID0+IHZvaWQpIHtcblx0XHRlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIobmFtZSwgbGlzdGVuZXIpO1xuXHRcdGNsZWFudXBGbnMucHVzaCgoKSA9PiBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIobmFtZSwgbGlzdGVuZXIpKTtcblx0fVxuXG5cdGZ1bmN0aW9uIHdpdGhEZWxheShmbjogKCkgPT4gdm9pZCwgZGVsYXlNczogbnVtYmVyKSB7XG5cdFx0Y2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuXHRcdGlmIChkZWxheU1zID4gMCkge1xuXHRcdFx0dGltZW91dCA9IHNldFRpbWVvdXQoZm4sIGRlbGF5TXMpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRmbigpO1xuXHRcdH1cblx0fVxuXG5cdGZvciAoY29uc3QgW29wZW5UcmlnZ2VyLCBjbG9zZVRyaWdnZXJdIG9mIHBhcnNlZFRyaWdnZXJzKSB7XG5cdFx0aWYgKCFjbG9zZVRyaWdnZXIpIHtcblx0XHRcdGFkZEV2ZW50TGlzdGVuZXIob3BlblRyaWdnZXIsICgpID0+XG5cdFx0XHRcdGlzT3BlbmVkRm4oKSA/IHdpdGhEZWxheShjbG9zZUZuLCBjbG9zZURlbGF5TXMpIDogd2l0aERlbGF5KG9wZW5Gbiwgb3BlbkRlbGF5TXMpLFxuXHRcdFx0KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0YWRkRXZlbnRMaXN0ZW5lcihvcGVuVHJpZ2dlciwgKCkgPT4ge1xuXHRcdFx0XHRhY3RpdmVPcGVuVHJpZ2dlcnMuYWRkKG9wZW5UcmlnZ2VyKTtcblx0XHRcdFx0d2l0aERlbGF5KCgpID0+IGFjdGl2ZU9wZW5UcmlnZ2Vycy5zaXplID4gMCAmJiBvcGVuRm4oKSwgb3BlbkRlbGF5TXMpO1xuXHRcdFx0fSk7XG5cdFx0XHRhZGRFdmVudExpc3RlbmVyKGNsb3NlVHJpZ2dlciwgKCkgPT4ge1xuXHRcdFx0XHRhY3RpdmVPcGVuVHJpZ2dlcnMuZGVsZXRlKG9wZW5UcmlnZ2VyKTtcblx0XHRcdFx0d2l0aERlbGF5KCgpID0+IGFjdGl2ZU9wZW5UcmlnZ2Vycy5zaXplID09PSAwICYmIGNsb3NlRm4oKSwgY2xvc2VEZWxheU1zKTtcblx0XHRcdH0pO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiAoKSA9PiBjbGVhbnVwRm5zLmZvckVhY2goKGNsZWFudXBGbikgPT4gY2xlYW51cEZuKCkpO1xufVxuIl19