@ng-bootstrap/ng-bootstrap
Version:
Angular powered Bootstrap
61 lines • 8.97 kB
JavaScript
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