UNPKG

@ng-bootstrap/ng-bootstrap

Version:
95 lines 15.2 kB
import { Observable, merge } from 'rxjs'; import { share, filter, delay, map } from 'rxjs/operators'; export class Trigger { constructor(open, close) { this.open = open; this.close = close; if (!close) { this.close = open; } } isManual() { return this.open === 'manual' || this.close === 'manual'; } } const DEFAULT_ALIASES = { hover: ['mouseenter', 'mouseleave'], focus: ['focusin', 'focusout'], }; export function parseTriggers(triggers, aliases = DEFAULT_ALIASES) { const trimmedTriggers = (triggers || '').trim(); if (trimmedTriggers.length === 0) { return []; } const parsedTriggers = trimmedTriggers .split(/\s+/) .map((trigger) => trigger.split(':')) .map((triggerPair) => { let alias = aliases[triggerPair[0]] || triggerPair; return new Trigger(alias[0], alias[1]); }); const manualTriggers = parsedTriggers.filter((triggerPair) => triggerPair.isManual()); 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 parsedTriggers; } export function observeTriggers(renderer, nativeElement, triggers, isOpenedFn) { return new Observable((subscriber) => { const listeners = []; const openFn = () => subscriber.next(true); const closeFn = () => subscriber.next(false); const toggleFn = () => subscriber.next(!isOpenedFn()); triggers.forEach((trigger) => { if (trigger.open === trigger.close) { listeners.push(renderer.listen(nativeElement, trigger.open, toggleFn)); } else { listeners.push(renderer.listen(nativeElement, trigger.open, openFn), renderer.listen(nativeElement, trigger.close, closeFn)); } }); return () => { listeners.forEach((unsubscribeFn) => unsubscribeFn()); }; }); } const delayOrNoop = (time) => (time > 0 ? delay(time) : (a) => a); export function triggerDelay(openDelay, closeDelay, isOpenedFn) { return (input$) => { let pending = null; const filteredInput$ = input$.pipe(map((open) => ({ open })), filter((event) => { const currentlyOpen = isOpenedFn(); if (currentlyOpen !== event.open && (!pending || pending.open === currentlyOpen)) { pending = event; return true; } if (pending && pending.open !== event.open) { pending = null; } return false; }), share()); const delayedOpen$ = filteredInput$.pipe(filter((event) => event.open), delayOrNoop(openDelay)); const delayedClose$ = filteredInput$.pipe(filter((event) => !event.open), delayOrNoop(closeDelay)); return merge(delayedOpen$, delayedClose$).pipe(filter((event) => { if (event === pending) { pending = null; return event.open !== isOpenedFn(); } return false; }), map((event) => event.open)); }; } export function listenToTriggers(renderer, nativeElement, triggers, isOpenedFn, openFn, closeFn, openDelay = 0, closeDelay = 0) { const parsedTriggers = parseTriggers(triggers); if (parsedTriggers.length === 1 && parsedTriggers[0].isManual()) { return () => { }; } const subscription = observeTriggers(renderer, nativeElement, parsedTriggers, isOpenedFn) .pipe(triggerDelay(openDelay, closeDelay, isOpenedFn)) .subscribe((open) => (open ? openFn() : closeFn())); return () => subscription.unsubscribe(); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJpZ2dlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdXRpbC90cmlnZ2Vycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN6QyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHM0QsTUFBTSxPQUFPLE9BQU87SUFDbkIsWUFBbUIsSUFBWSxFQUFTLEtBQWM7UUFBbkMsU0FBSSxHQUFKLElBQUksQ0FBUTtRQUFTLFVBQUssR0FBTCxLQUFLLENBQVM7UUFDckQsSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNYLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO1NBQ2xCO0lBQ0YsQ0FBQztJQUVELFFBQVE7UUFDUCxPQUFPLElBQUksQ0FBQyxJQUFJLEtBQUssUUFBUSxJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssUUFBUSxDQUFDO0lBQzFELENBQUM7Q0FDRDtBQUVELE1BQU0sZUFBZSxHQUFHO0lBQ3ZCLEtBQUssRUFBRSxDQUFDLFlBQVksRUFBRSxZQUFZLENBQUM7SUFDbkMsS0FBSyxFQUFFLENBQUMsU0FBUyxFQUFFLFVBQVUsQ0FBQztDQUM5QixDQUFDO0FBRUYsTUFBTSxVQUFVLGFBQWEsQ0FBQyxRQUFnQixFQUFFLE9BQU8sR0FBRyxlQUFlO0lBQ3hFLE1BQU0sZUFBZSxHQUFHLENBQUMsUUFBUSxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO0lBRWhELElBQUksZUFBZSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDakMsT0FBTyxFQUFFLENBQUM7S0FDVjtJQUVELE1BQU0sY0FBYyxHQUFHLGVBQWU7U0FDcEMsS0FBSyxDQUFDLEtBQUssQ0FBQztTQUNaLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENB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QUNGLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUMxQixDQUFDO0lBQ0gsQ0FBQyxDQUFDO0FBQ0gsQ0FBQztBQUVELE1BQU0sVUFBVSxnQkFBZ0IsQ0FDL0IsUUFBbUIsRUFDbkIsYUFBMEIsRUFDMUIsUUFBZ0IsRUFDaEIsVUFBeUIsRUFDekIsTUFBa0IsRUFDbEIsT0FBbUIsRUFDbkIsU0FBUyxHQUFHLENBQUMsRUFDYixVQUFVLEdBQUcsQ0FBQztJQUVkLE1BQU0sY0FBYyxHQUFHLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUUvQyxJQUFJLGNBQWMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRTtRQUNoRSxPQUFPLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQztLQUNoQjtJQUVELE1BQU0sWUFBWSxHQUFHLGVBQWUsQ0FBQyxRQUFRLEVBQUUsYUFBYSxFQUFFLGNBQWMsRUFBRSxVQUFVLENBQUM7U0FDdkYsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLEVBQUUsVUFBVSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1NBQ3JELFNBQVMsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFFckQsT0FBTyxHQUFHLEVBQUUsQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLENBQUM7QUFDekMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9ic2VydmFibGUsIG1lcmdlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBzaGFyZSwgZmlsdGVyLCBkZWxheSwgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgUmVuZGVyZXIyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmV4cG9ydCBjbGFzcyBUcmlnZ2VyIHtcblx0Y29uc3RydWN0b3IocHVibGljIG9wZW46IHN0cmluZywgcHVibGljIGNsb3NlPzogc3RyaW5nKSB7XG5cdFx0aWYgKCFjbG9zZSkge1xuXHRcdFx0dGhpcy5jbG9zZSA9IG9wZW47XG5cdFx0fVxuXHR9XG5cblx0aXNNYW51YWwoKSB7XG5cdFx0cmV0dXJuIHRoaXMub3BlbiA9PT0gJ21hbnVhbCcgfHwgdGhpcy5jbG9zZSA9PT0gJ21hbnVhbCc7XG5cdH1cbn1cblxuY29uc3QgREVGQVVMVF9BTElBU0VTID0ge1xuXHRob3ZlcjogWydtb3VzZWVudGVyJywgJ21vdXNlbGVhdmUnXSxcblx0Zm9jdXM6IFsnZm9jdXNpbicsICdmb2N1c291dCddLFxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlVHJpZ2dlcnModHJpZ2dlcnM6IHN0cmluZywgYWxpYXNlcyA9IERFRkFVTFRfQUxJQVNFUyk6IFRyaWdnZXJbXSB7XG5cdGNvbnN0IHRyaW1tZWRUcmlnZ2VycyA9ICh0cmlnZ2VycyB8fCAnJykudHJpbSgpO1xuXG5cdGlmICh0cmltbWVkVHJpZ2dlcnMubGVuZ3RoID09PSAwKSB7XG5cdFx0cmV0dXJuIFtdO1xuXHR9XG5cblx0Y29uc3QgcGFyc2VkVHJpZ2dlcnMgPSB0cmltbWVkVHJpZ2dlcnNcblx0XHQuc3BsaXQoL1xccysvKVxuXHRcdC5tYXAoKHRyaWdnZXIpID0+IHRyaWdnZXIuc3BsaXQoJzonKSlcblx0XHQubWFwKCh0cmlnZ2VyUGFpcikgPT4ge1xuXHRcdFx0bGV0IGFsaWFzID0gYWxpYXNlc1t0cmlnZ2VyUGFpclswXV0gfHwgdHJpZ2dlclBhaXI7XG5cdFx0XHRyZXR1cm4gbmV3IFRyaWdnZXIoYWxpYXNbMF0sIGFsaWFzWzFdKTtcblx0XHR9KTtcblxuXHRjb25zdCBtYW51YWxUcmlnZ2VycyA9IHBhcnNlZFRyaWdnZXJzLmZpbHRlcigodHJpZ2dlclBhaXIpID0+IHRyaWdnZXJQYWlyLmlzTWFudWFsKCkpO1xuXG5cdGlmIChtYW51YWxUcmlnZ2Vycy5sZW5ndGggPiAxKSB7XG5cdFx0dGhyb3cgJ1RyaWdnZXJzIHBhcnNlIGVycm9yOiBvbmx5IG9uZSBtYW51YWwgdHJpZ2dlciBpcyBhbGxvd2VkJztcblx0fVxuXG5cdGlmIChtYW51YWxUcmlnZ2Vycy5sZW5ndGggPT09IDEgJiYgcGFyc2VkVHJpZ2dlcnMubGVuZ3RoID4gMSkge1xuXHRcdHRocm93IFwiVHJpZ2dlcnMgcGFyc2UgZXJyb3I6IG1hbnVhbCB0cmlnZ2VyIGNhbid0IGJlIG1peGVkIHdpdGggb3RoZXIgdHJpZ2dlcnNcIjtcblx0fVxuXG5cdHJldHVybiBwYXJzZWRUcmlnZ2Vycztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG9ic2VydmVUcmlnZ2Vycyhcblx0cmVuZGVyZXI6IFJlbmRlcmVyMixcblx0bmF0aXZlRWxlbWVudDogSFRNTEVsZW1lbnQsXG5cdHRyaWdnZXJzOiBUcmlnZ2VyW10sXG5cdGlzT3BlbmVkRm46ICgpID0+IGJvb2xlYW4sXG4pIHtcblx0cmV0dXJuIG5ldyBPYnNlcnZhYmxlPGJvb2xlYW4+KChzdWJzY3JpYmVyKSA9PiB7XG5cdFx0Y29uc3QgbGlzdGVuZXJzOiAoKCkgPT4gdm9pZClbXSA9IFtdO1xuXHRcdGNvbnN0IG9wZW5GbiA9ICgpID0+IHN1YnNjcmliZXIubmV4dCh0cnVlKTtcblx0XHRjb25zdCBjbG9zZUZuID0gKCkgPT4gc3Vic2NyaWJlci5uZXh0KGZhbHNlKTtcblx0XHRjb25zdCB0b2dnbGVGbiA9ICgpID0+IHN1YnNjcmliZXIubmV4dCghaXNPcGVuZWRGbigpKTtcblxuXHRcdHRyaWdnZXJzLmZvckVhY2goKHRyaWdnZXI6IFRyaWdnZXIpID0+IHtcblx0XHRcdGlmICh0cmlnZ2VyLm9wZW4gPT09IHRyaWdnZXIuY2xvc2UpIHtcblx0XHRcdFx0bGlzdGVuZXJzLnB1c2gocmVuZGVyZXIubGlzdGVuKG5hdGl2ZUVsZW1lbnQsIHRyaWdnZXIub3BlbiwgdG9nZ2xlRm4pKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGxpc3RlbmVycy5wdXNoKFxuXHRcdFx0XHRcdHJlbmRlcmVyLmxpc3RlbihuYXRpdmVFbGVtZW50LCB0cmlnZ2VyLm9wZW4sIG9wZW5GbiksXG5cdFx0XHRcdFx0cmVuZGVyZXIubGlzdGVuKG5hdGl2ZUVsZW1lbnQsIHRyaWdnZXIuY2xvc2UhLCBjbG9zZUZuKSxcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdHJldHVybiAoKSA9PiB7XG5cdFx0XHRsaXN0ZW5lcnMuZm9yRWFjaCgodW5zdWJzY3JpYmVGbikgPT4gdW5zdWJzY3JpYmVGbigpKTtcblx0XHR9O1xuXHR9KTtcbn1cblxuY29uc3QgZGVsYXlPck5vb3AgPSA8VD4odGltZTogbnVtYmVyKSA9PiAodGltZSA+IDAgPyBkZWxheTxUPih0aW1lKSA6IChhOiBPYnNlcnZhYmxlPFQ+KSA9PiBhKTtcblxuZXhwb3J0IGZ1bmN0aW9uIHRyaWdnZXJEZWxheShvcGVuRGVsYXk6IG51bWJlciwgY2xvc2VEZWxheTogbnVtYmVyLCBpc09wZW5lZEZuOiAoKSA9PiBib29sZWFuKSB7XG5cdHJldHVybiAoaW5wdXQkOiBPYnNlcnZhYmxlPGJvb2xlYW4+KSA9PiB7XG5cdFx0bGV0IHBlbmRpbmc6IHsgb3BlbjogYm9vbGVhbiB9IHwgbnVsbCA9IG51bGw7XG5cdFx0Y29uc3QgZmlsdGVyZWRJbnB1dCQgPSBpbnB1dCQucGlwZShcblx0XHRcdG1hcCgob3BlbikgPT4gKHsgb3BlbiB9KSksXG5cdFx0XHRmaWx0ZXIoKGV2ZW50KSA9PiB7XG5cdFx0XHRcdGNvbnN0IGN1cnJlbnRseU9wZW4gPSBpc09wZW5lZEZuKCk7XG5cdFx0XHRcdGlmIChjdXJyZW50bHlPcGVuICE9PSBldmVudC5vcGVuICYmICghcGVuZGluZyB8fCBwZW5kaW5nLm9wZW4gPT09IGN1cnJlbnRseU9wZW4pKSB7XG5cdFx0XHRcdFx0cGVuZGluZyA9IGV2ZW50O1xuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChwZW5kaW5nICYmIHBlbmRpbmcub3BlbiAhPT0gZXZlbnQub3Blbikge1xuXHRcdFx0XHRcdHBlbmRpbmcgPSBudWxsO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH0pLFxuXHRcdFx0c2hhcmUoKSxcblx0XHQpO1xuXHRcdGNvbnN0IGRlbGF5ZWRPcGVuJCA9IGZpbHRlcmVkSW5wdXQkLnBpcGUoXG5cdFx0XHRmaWx0ZXIoKGV2ZW50KSA9PiBldmVudC5vcGVuKSxcblx0XHRcdGRlbGF5T3JOb29wKG9wZW5EZWxheSksXG5cdFx0KTtcblx0XHRjb25zdCBkZWxheWVkQ2xvc2UkID0gZmlsdGVyZWRJbnB1dCQucGlwZShcblx0XHRcdGZpbHRlcigoZXZlbnQpID0+ICFldmVudC5vcGVuKSxcblx0XHRcdGRlbGF5T3JOb29wKGNsb3NlRGVsYXkpLFxuXHRcdCk7XG5cdFx0cmV0dXJuIG1lcmdlKGRlbGF5ZWRPcGVuJCwgZGVsYXllZENsb3NlJCkucGlwZShcblx0XHRcdGZpbHRlcigoZXZlbnQpID0+IHtcblx0XHRcdFx0aWYgKGV2ZW50ID09PSBwZW5kaW5nKSB7XG5cdFx0XHRcdFx0cGVuZGluZyA9IG51bGw7XG5cdFx0XHRcdFx0cmV0dXJuIGV2ZW50Lm9wZW4gIT09IGlzT3BlbmVkRm4oKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9KSxcblx0XHRcdG1hcCgoZXZlbnQpID0+IGV2ZW50Lm9wZW4pLFxuXHRcdCk7XG5cdH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBsaXN0ZW5Ub1RyaWdnZXJzKFxuXHRyZW5kZXJlcjogUmVuZGVyZXIyLFxuXHRuYXRpdmVFbGVtZW50OiBIVE1MRWxlbWVudCxcblx0dHJpZ2dlcnM6IHN0cmluZyxcblx0aXNPcGVuZWRGbjogKCkgPT4gYm9vbGVhbixcblx0b3BlbkZuOiAoKSA9PiB2b2lkLFxuXHRjbG9zZUZuOiAoKSA9PiB2b2lkLFxuXHRvcGVuRGVsYXkgPSAwLFxuXHRjbG9zZURlbGF5ID0gMCxcbikge1xuXHRjb25zdCBwYXJzZWRUcmlnZ2VycyA9IHBhcnNlVHJpZ2dlcnModHJpZ2dlcnMpO1xuXG5cdGlmIChwYXJzZWRUcmlnZ2Vycy5sZW5ndGggPT09IDEgJiYgcGFyc2VkVHJpZ2dlcnNbMF0uaXNNYW51YWwoKSkge1xuXHRcdHJldHVybiAoKSA9PiB7fTtcblx0fVxuXG5cdGNvbnN0IHN1YnNjcmlwdGlvbiA9IG9ic2VydmVUcmlnZ2VycyhyZW5kZXJlciwgbmF0aXZlRWxlbWVudCwgcGFyc2VkVHJpZ2dlcnMsIGlzT3BlbmVkRm4pXG5cdFx0LnBpcGUodHJpZ2dlckRlbGF5KG9wZW5EZWxheSwgY2xvc2VEZWxheSwgaXNPcGVuZWRGbikpXG5cdFx0LnN1YnNjcmliZSgob3BlbikgPT4gKG9wZW4gPyBvcGVuRm4oKSA6IGNsb3NlRm4oKSkpO1xuXG5cdHJldHVybiAoKSA9PiBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbn1cbiJdfQ==