aboutsummaryrefslogtreecommitdiffstats
path: root/deprecated-workflow-designer/sdc-workflow-designer-ui/src/app/paletx/util/triggers.ts
blob: 708790a4d99aa1212c1660d582f94a5f6872a8d5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
export class Trigger {
	constructor(public open: string, public close?: string) {
		if (!close) {
			this.close = open;
		}
	}

	public isManual() {
		return this.open === 'manual' || this.close === 'manual';
	}
}

const DEFAULT_ALIASES = {
	hover: ['mouseenter', 'mouseleave']
};

export function parseTriggers(triggers: string, aliases = DEFAULT_ALIASES): Trigger[] {
	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;
}

const noopFn = () => {
    // TO DO
};

export function listenToTriggers(renderer: any, nativeElement: any, triggers: string, openFn, closeFn, toggleFn) {
	const parsedTriggers = parseTriggers(triggers);
	const listeners = [];

	if (parsedTriggers.length === 1 && parsedTriggers[0].isManual()) {
		return noopFn;
	}

	parsedTriggers.forEach((trigger: 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());
	};
}