2 constructor(public open: string, public close?: string) {
8 public isManual() { return this.open === 'manual' || this.close === 'manual'; }
11 const DEFAULT_ALIASES = {
12 hover: ['mouseenter', 'mouseleave']
15 export function parseTriggers(triggers: string, aliases = DEFAULT_ALIASES): Trigger[] {
16 const trimmedTriggers = (triggers || '').trim();
18 if (trimmedTriggers.length === 0) {
22 const parsedTriggers = trimmedTriggers.split(/\s+/).map(trigger => trigger.split(':')).map((triggerPair) => {
23 let alias = aliases[triggerPair[0]] || triggerPair;
24 return new Trigger(alias[0], alias[1]);
27 const manualTriggers = parsedTriggers.filter(triggerPair => triggerPair.isManual());
29 if (manualTriggers.length > 1) {
30 throw 'Triggers parse error: only one manual trigger is allowed';
33 if (manualTriggers.length === 1 && parsedTriggers.length > 1) {
34 throw 'Triggers parse error: manual trigger can\'t be mixed with other triggers';
37 return parsedTriggers;
40 const noopFn = () => {
44 export function listenToTriggers(renderer: any, nativeElement: any, triggers: string, openFn, closeFn, toggleFn) {
45 const parsedTriggers = parseTriggers(triggers);
48 if (parsedTriggers.length === 1 && parsedTriggers[0].isManual()) {
52 parsedTriggers.forEach((trigger: Trigger) => {
53 if (trigger.open === trigger.close) {
54 listeners.push(renderer.listen(nativeElement, trigger.open, toggleFn));
57 renderer.listen(nativeElement, trigger.open, openFn), renderer.listen(nativeElement, trigger.close, closeFn));
61 return () => { listeners.forEach(unsubscribeFn => unsubscribeFn()); };