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