forked from Mottie/GitHub-userscripts
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgithub-diff-file-toggle.user.js
91 lines (82 loc) · 2.62 KB
/
github-diff-file-toggle.user.js
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
// ==UserScript==
// @name GitHub Diff File Toggle
// @version 0.1.3
// @description A userscript that adds global diff file toggles
// @license MIT
// @author Rob Garrison
// @namespace https://github.com/Mottie
// @match https://github.com/*
// @run-at document-idle
// @grant none
// @require https://greasyfork.org/scripts/28721-mutations/code/mutations.js?version=1108163
// @require https://greasyfork.org/scripts/398877-utils-js/code/utilsjs.js?version=1079637
// @icon https://github.githubassets.com/pinned-octocat.svg
// @updateURL https://raw.githubusercontent.com/Mottie/Github-userscripts/master/github-diff-file-toggle.user.js
// @downloadURL https://raw.githubusercontent.com/Mottie/Github-userscripts/master/github-diff-file-toggle.user.js
// @supportURL https://github.com/Mottie/GitHub-userscripts/issues
// ==/UserScript==
/* global $ $$ on debounce make */
(() => {
"use strict";
let timer;
let busy = false;
const setToggleStyle = state => {
const mainToggle = $(".ghdt-toggle");
mainToggle.classList.toggle("ghdt-selected", state);
mainToggle.style = state
? "background-color: var(--color-btn-selected-bg);"
: "";
};
const buildButton = () => {
if (!$(".ghdt-toggle")) {
const button = make({
el: "button",
className: "btn btn-sm ghdt-toggle tooltipped tooltipped-s float-right",
text: "Toggle viewed",
attrs: {
"aria-label": "Toggle all viewed files"
}
});
on(button, "click", event => {
toggle(document, !event.target.classList.contains("ghdt-selected"));
});
$("#files.diff-view")?.prepend(button);
}
// Update toggle button state after initialized; timer for progressive
// loading
clearTimeout(timer);
timer = setTimeout(() => {
if ($$(".js-reviewed-checkbox").every(el => el.checked)) {
setToggleStyle(true);
}
}, 1000);
};
const toggle = (target, state) => {
$$(".js-reviewed-checkbox").forEach(checkbox => {
if (target !== checkbox && checkbox.checked !== state) {
checkbox.click();
}
});
setToggleStyle(state);
};
const handleChange = event => {
const { target, altKey, shiftKey } = event;
const anyModifier = altKey || shiftKey;
if (!busy && anyModifier && target.matches(".js-reviewed-checkbox")) {
busy = true;
toggle(target, target.checked);
setTimeout(() => {
busy = false;
});
}
};
const init = () => {
if ($("#files.diff-view") || $(".pr-toolbar")) {
buildButton();
}
};
on(document, "ghmo:container ghmo:diff", init);
on(document, "click", debounce(handleChange));
on(document, "keydown", debounce(handleChange));
init();
})();