summaryrefslogtreecommitdiff
path: root/source/features/toggle-everything-with-alt.tsx
blob: 487014da061585fe741a92f9f19b241e1c3d9a56 (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
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
import delegate from 'delegate-it';
import * as pageDetect from 'github-url-detection';

import features from '../feature-manager.js';
import clickAll from '../helpers/click-all.js';

function minimizedCommentsSelector(clickedItem: HTMLElement): string {
	const open = (clickedItem.parentElement as HTMLDetailsElement).open ? '[open]' : ':not([open])';
	return `.minimized-comment > details${open} > summary`;
}

const diffsSelector = '.js-file .js-diff-load';

function resolvedCommentsSelector(clickedItem: HTMLElement): string {
	return `.js-resolvable-thread-toggler[aria-expanded="${clickedItem.getAttribute('aria-expanded')!}"]:not(.d-none)`;
}

const expandSelector = '.js-file .js-expand-full';

const collapseSelector = '.js-file .js-collapse-diff';

const commitMessageSelector = '.TimelineItem .ellipsis-expander';

function markdownCommentSelector(clickedItem: HTMLElement): string {
	const {id} = clickedItem.closest('.TimelineItem-body[id]')!;
	return `#${id} .markdown-body details > summary`;
}

function init(signal: AbortSignal): void {
	// Collapsed comments in PR conversations and files
	delegate('.minimized-comment details summary', 'click', clickAll(minimizedCommentsSelector), {signal});

	// "Load diff" buttons in PR files
	delegate(diffsSelector, 'click', clickAll(diffsSelector), {signal});

	// Review comments in PR
	delegate('.js-file .js-resolvable-thread-toggler', 'click', clickAll(resolvedCommentsSelector), {signal});

	// "Expand all" and "Collapse expanded lines" buttons in commit files
	delegate(expandSelector, 'click', clickAll(expandSelector), {signal});
	delegate(collapseSelector, 'click', clickAll(collapseSelector), {signal});

	// Commit message buttons in commit lists and PR conversations
	delegate(commitMessageSelector, 'click', clickAll(commitMessageSelector), {signal});

	// <details> elements in issue/PR comment Markdown content
	delegate('.TimelineItem-body[id] .markdown-body details > summary', 'click', clickAll(markdownCommentSelector), {signal});
}

void features.add(import.meta.url, {
	include: [
		pageDetect.isConversation,
		pageDetect.hasFiles,
		pageDetect.isCommitList,
	],
	init,
});