Hide and mark files as viewed using regex pattern.
// ==UserScript==
// @name GitHub PR File Filter
// @namespace btilford
// @author btilford
// @version 0.1
// @license MIT
// @description Hide and mark files as viewed using regex pattern.
// @match https://github.com/*/*/pull/*/files*
// @grant unsafeWindow
// ==/UserScript==
(function githubPrFilter() {
'use strict';
console.debug('Loading PR file filter');
function selectFiles(pattern) {
const regex = new RegExp(pattern);
const files = [...window.document.querySelectorAll('.file')];
console.debug('Filtering %d files in PR with pattern %s', files.length, regex);
return files.filter(_ => {
const link = _.querySelector('.link-gray-dark');
return regex.test(link.title) || regex.test(link.innerText);
});
}
const container = unsafeWindow.document.createElement('div');
container.className = 'select-menu-list';
container.style = 'width: 280px; margin-bottom: 8px;';
const pattern = unsafeWindow.document.createElement('input');
pattern.name = 'filter-pattern';
pattern.placeholder = 'regex';
pattern.title = 'File matching regex';
pattern.className = 'form-control form-control subnav-search-input input-contrast';
pattern.style = 'margin: 8px 4px; width: 270px;';
container.appendChild(pattern);
const btnClasses = 'js-reviewed-toggle ml-2 mr-1 px-2 py-1 rounded-1 f6 text-normal border js-reviewed-file bg-blue-2 border-blue-light';
const hide = unsafeWindow.document.createElement('button');
hide.style = 'color: rgb(201, 209, 217);';
hide.innerHTML = '<label>hide</label>';
hide.className = btnClasses;
hide.onclick = () => {
const ptn = pattern.value;
const files = selectFiles(ptn);
console.debug('hiding %d files matching pattern %s', files.length, ptn);
files.forEach(_ => {
const open = _.querySelector('.open .file-info button.btn-octicon');
if(open) {
open.click();
}
});
}
container.appendChild(hide);
const viewed = unsafeWindow.document.createElement('button');
viewed.style = 'color: rgb(201, 209, 217);';
viewed.innerHTML = '<label>viewed</label>';
viewed.className = btnClasses;
viewed.onclick = () => {
const ptn = pattern.value;
const files = selectFiles(ptn);
console.debug('hiding %d files matching pattern %s', files.length, ptn);
files.forEach(_ => {
const unchecked = _.querySelector('.file-actions input.js-reviewed-checkbox:not(:checked)[type=checkbox]');
if(unchecked) {
//unchecked.checked = true;
unchecked.click();
}
});
}
container.appendChild(viewed);
const parent = unsafeWindow.document.querySelector('.diffbar-item.details-overlay.select-menu.js-file-filter .select-menu-modal .select-menu-header');
console.log('Inserting regex filter on %o', parent);
parent.insertAdjacentElement('afterend', container);
// Your code here...
})();