summaryrefslogtreecommitdiff
path: root/source/helpers/click-all.ts
blob: a9fb4f64950b3e545071608ed4602ec1431384cd (plain) (blame)
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
import mem from 'mem';
import {$$} from 'select-dom';
import {DelegateEvent} from 'delegate-it';

import preserveScroll from './preserve-scroll.js';

type EventHandler = (event: DelegateEvent<MouseEvent, HTMLElement>) => void;
export default mem((selector: string | ((clickedItem: HTMLElement) => string)): EventHandler => event => {
	if (event.altKey && event.isTrusted) {
		const clickedItem = event.delegateTarget;

		// `parentElement` is the anchor because `clickedItem` might be hidden/replaced after the click
		const resetScroll = preserveScroll(clickedItem.parentElement!);
		clickAllExcept(typeof selector === 'string' ? selector : selector(clickedItem), clickedItem);
		resetScroll();
	}
});

function clickAllExcept(elementsToClick: string, except: HTMLElement): void {
	for (const item of $$(elementsToClick)) {
		if (item !== except) {
			item.click();
		}
	}
}