Skip to content

Instantly share code, notes, and snippets.

@martinlindenberg
Last active October 13, 2023 14:24
Show Gist options
  • Save martinlindenberg/aeaed5909a771a45b06a071b2bc4787c to your computer and use it in GitHub Desktop.
Save martinlindenberg/aeaed5909a771a45b06a071b2bc4787c to your computer and use it in GitHub Desktop.
introduces buttons for toggling and search to github pr page
// ==UserScript==
// @name github pr helper - home24.de
// @namespace Violentmonkey Scripts
// @description adds button to github pr file view to speed up reviews
// @include https://github.com/*/*/pull/*
// @version 1.3
// @author martinlindenberg
// @updateURL https://gist.githubusercontent.com/martinlindenberg/aeaed5909a771a45b06a071b2bc4787c/raw/github_pr_filetoggle.js
// @downloadURL https://gist.githubusercontent.com/martinlindenberg/aeaed5909a771a45b06a071b2bc4787c/raw/github_pr_filetoggle.js
// @grant none
// ==/UserScript==
console.log("github pr helper version 1.3")
setInterval(function(){
if (needsHelperButtons()) {
collapseFiles();
addToggleButton();
markHelperButtons();
}
}, 1000);
function needsHelperButtons(){
var previewTools = document.getElementsByClassName("pr-review-tools")[0];
if (typeof(previewTools) == "undefined") {
return false;
}
if (previewTools.hasAttribute("helperButtonsVisible")) {
return false;
}
return true
}
function markHelperButtons(){
var previewTools = document.getElementsByClassName("pr-review-tools")[0];
previewTools.setAttribute("helperButtonsVisible", "1");
}
function addToggleButton(){
var previewTools = document.getElementsByClassName("pr-review-tools")[0];
// hide reviewed btn
// toggleReviewedFiles
togglebar = document.createElement("div");
togglebar.className = 'diffbar-item refined-github-toggle-files';
button = document.createElement("a");
button.className = "btn btn-sm btn-outline BtnGroup-item tooltipped tooltipped-s rgh-tooltipped"
button.setAttribute("aria-label", "toggle reviewed files");
button.onclick = function () {
toggleReviewedFiles(this);
};
button.innerHTML = 'Hide Reviewed';
button.setAttribute("style", "margin-right: 5px;");
togglebar.appendChild(button);
previewTools.insertBefore(togglebar, previewTools.children[1]);
// mark reviewed button
togglebar = document.createElement("div");
togglebar.className = 'diffbar-item refined-github-toggle-files';
button = document.createElement("a");
button.className = "btn btn-sm btn-outline BtnGroup-item tooltipped tooltipped-s rgh-tooltipped"
button.setAttribute("aria-label", "set marked lines reviewed");
button.onclick = function () {
markReviewed();
};
button.innerHTML = 'Mark Reviewed';
button.setAttribute("style", "margin-right: 5px;");
togglebar.appendChild(button);
previewTools.insertBefore(togglebar, previewTools.children[1]);
// collapse button
collapsebar = document.createElement("div");
collapsebar.className = 'diffbar-item refined-github-collapse-files';
button = document.createElement("a");
button.className = "btn btn-sm btn-outline BtnGroup-item tooltipped tooltipped-s rgh-tooltipped"
button.setAttribute("aria-label", "collapse all files");
button.onclick = function () {
collapseFiles();
};
button.innerHTML = 'Collapse Files';
button.setAttribute("style", "margin-right: 5px;");
collapsebar.appendChild(button);
previewTools.insertBefore(collapsebar, previewTools.children[1]);
// filter textfield
filterbar = document.createElement("div");
filterbar.className = 'diffbar-item refined-github-collapse-files';
search = document.createElement("input");
search.setAttribute("class", "form-control js-filterable-field");
search.setAttribute("type", "text");
search.setAttribute("placeholder", "filter...");
search.setAttribute("style", "min-height: 28px; height: 28px; margin-right: 5px;");
search.onkeyup = function () {
filterFiles(this);
};
filterbar.appendChild(search);
previewTools.insertBefore(filterbar, previewTools.children[1]);
// remove codespace advertisement btn
var codespacebtn = document.getElementsByClassName("js-reviews-container")[0];
codespacebtn.setAttribute("style", "display: none;");
}
function insertAfter(newNode, referenceNode) {
referenceNode.parentNode.insertBefore(newNode, referenceNode.nextSibling);
}
function toggleReviewedFiles(btn){
files = document.getElementsByClassName("file-header")
for (var i in files) {
if (typeof(files[i].setAttribute) != "function") {
continue;
}
var reviewCheckbox = files[i].querySelector('.js-reviewed-checkbox');
if (reviewCheckbox.checked) {
if(files[i].getAttribute("is-reviewed-hidden") == "true") {
files[i].setAttribute("is-reviewed-hidden", "false");
files[i].parentNode.setAttribute("style", "display: block !important;");
btn.setAttribute("style", "background-color: none;");
} else {
files[i].setAttribute("is-reviewed-hidden", "true");
files[i].parentNode.setAttribute("style", "display: none !important;");
btn.setAttribute("style", "background-color: beige;");
}
}
}
}
function filterFiles(textfield){
showAll();
if (textfield.value == "") {
return
}
collapseFiles();
files = document.getElementsByClassName("file-header")
for (var i in files) {
if (typeof(files[i].setAttribute) != "function") {
continue;
}
if (files[i].dataset.path.includes(textfield.value)) {
files[i].setAttribute("style", "background-color: antiquewhite");
files[i].setAttribute("data-file-matched", "true");
}
}
}
function showAll(){
files = document.getElementsByClassName("file-header")
for (var i in files) {
if (typeof(files[i].setAttribute) == "function") {
files[i].setAttribute("style", "background-color: white;");
files[i].setAttribute("data-file-matched", "false");
}
}
}
function collapseFiles(){
var buttons = document.getElementsByClassName("btn-octicon");
for (var i in buttons) {
if(typeof(buttons[i]) == 'object' && buttons[i].getAttribute("type") == "button" && buttons[i].getAttribute("aria-expanded") == "true") {
buttons[i].click();
}
}
}
function markReviewed(){
files = document.getElementsByClassName("file-header")
for (var i in files) {
if (files[i].getAttribute("data-file-matched") == "true") {
var reviewCheckbox = files[i].querySelector('.js-reviewed-checkbox');
if (reviewCheckbox.checked) {
continue;
}
var reviewLabel = files[i].querySelector('.js-reviewed-toggle');
reviewCheckbox.checked = true;
reviewLabel.click();
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment