ngx-bootstrap
Version:
Native Angular Bootstrap Components
87 lines • 3.52 kB
JavaScript
import { Trigger } from './trigger.class';
var DEFAULT_ALIASES = {
hover: ['mouseover', 'mouseout'],
focus: ['focusin', 'focusout']
};
export function parseTriggers(triggers, aliases) {
if (aliases === void 0) { aliases = DEFAULT_ALIASES; }
var trimmedTriggers = (triggers || '').trim();
if (trimmedTriggers.length === 0) {
return [];
}
var parsedTriggers = trimmedTriggers.split(/\s+/)
.map(function (trigger) { return trigger.split(':'); })
.map(function (triggerPair) {
var alias = aliases[triggerPair[0]] || triggerPair;
return new Trigger(alias[0], alias[1]);
});
var manualTriggers = parsedTriggers
.filter(function (triggerPair) { return 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 listenToTriggers(renderer, target, triggers, showFn, hideFn, toggleFn) {
var parsedTriggers = parseTriggers(triggers);
var listeners = [];
if (parsedTriggers.length === 1 && parsedTriggers[0].isManual()) {
return Function.prototype;
}
parsedTriggers.forEach(function (trigger) {
if (trigger.open === trigger.close) {
listeners.push(renderer.listen(target, trigger.open, toggleFn));
return;
}
listeners.push(renderer.listen(target, trigger.open, showFn), renderer.listen(target, trigger.close, hideFn));
});
return function () { listeners.forEach(function (unsubscribeFn) { return unsubscribeFn(); }); };
}
export function listenToTriggersV2(renderer, options) {
var parsedTriggers = parseTriggers(options.triggers);
var target = options.target;
// do nothing
if (parsedTriggers.length === 1 && parsedTriggers[0].isManual()) {
return Function.prototype;
}
// all listeners
var listeners = [];
// lazy listeners registration
var _registerHide = [];
var registerHide = function () {
// add hide listeners to unregister array
_registerHide.forEach(function (fn) { return listeners.push(fn()); });
// register hide events only once
_registerHide.length = 0;
};
// register open\close\toggle listeners
parsedTriggers.forEach(function (trigger) {
var useToggle = trigger.open === trigger.close;
var showFn = useToggle ? options.toggle : options.show;
if (!useToggle) {
_registerHide.push(function () { return renderer.listen(target, trigger.close, options.hide); });
}
listeners.push(renderer.listen(target, trigger.open, function () { return showFn(registerHide); }));
});
return function () {
listeners.forEach(function (unsubscribeFn) { return unsubscribeFn(); });
};
}
export function registerOutsideClick(renderer, options) {
if (!options.outsideClick) {
return Function.prototype;
}
return renderer.listenGlobal('document', 'click', function (event) {
if (options.target && options.target.contains(event.target)) {
return;
}
if (options.targets && options.targets.some(function (target) { return target.contains(event.target); })) {
return;
}
options.hide();
});
}
//# sourceMappingURL=triggers.js.map