// ==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(); })();
Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.
Alternative Proxies: