const compareResults = currentUser => (a, b) => { return ['/projects/', currentUser] .some(href => a.children[0].href.includes(href)) ? -1 : 1 } const sortChildren = ol => { const children = Array.from(ol.children) children.forEach(child => ol.removeChild(child)) children .sort(compareResults(getCurrentUser())) .forEach(child => ol.appendChild(child)) } /// Re-order the search results to list projects and the current user first let claim = 0 const sortSearchResult = () => { const searchBox = Array.from(document.getElementsByTagName('input')) .filter(input => input.name === 'repository-search')[0] if (!searchBox) { return } searchBox.onkeyup = e => { claim++ const myClaim = claim setTimeout(() => { if (claim !== myClaim) { return } const ol = getClassNameElementsArray('search-results')[0]?.firstChild sortChildren(ol) claim = 0 }, 1000) } } ///////////////////////////// // PR Reviewer Suggestions // ///////////////////////////// if (location.toString().includes('/pull-requests?create')) { const names = [ "Tam Nguyen", "David Daniel", "Nikalas Culvey", "Michael Mezzina", "Sage Vaillancourt", "John Cyr", "Adam Weizman", "Caleb Soper", "Rockey Liles", "Fernando Batista" ] const urlPrefix = 'https://git.add123.com/rest/api/latest' fetch(`${urlPrefix}/projects/ADD/repos?limit=999`) .then(resp => resp.json()) .then(async ({values: allRepos}) => { const prListUrls = allRepos.map(repo => `${urlPrefix}/projects/ADD/repos/${repo.slug}/pull-requests`) const allPullRequests = (await Promise.all( prListUrls.map(async prListUrl => await fetch(prListUrl).then(resp => resp.json()))) ).flatMap(({values}) => values) const reviewerCounts = Object.fromEntries(names.map(name => [name, 0])) allPullRequests.forEach(({reviewers}) => { reviewers?.map(r => r.user.displayName) .filter(displayName => !["Chris Gamache", "Tom Keels"].includes(displayName)) .forEach(displayName => { reviewerCounts[displayName] ??= 0 reviewerCounts[displayName] += 1 }) }) const sortedCounts = Object.entries(reviewerCounts) .map(([name, count]) => ({ name, count })) .toSorted((a, b) => a.count - b.count) const tryDisplay = () => setTimeout(() => { if (document.getElementById('reviewer-counts')) { return } const formBodyMain = document.querySelector('.create-pull-request-form .form-body .form-body-main') if (formBodyMain) { const countsParent = formBodyMain.lastChild.cloneNode(true) const reviewerCountsNode = document.createElement('ol') reviewerCountsNode.id = 'reviewer-counts' reviewerCountsNode.style.columns = '3' reviewerCountsNode.style.listStyle = 'none' reviewerCountsNode.style.paddingLeft = '2px' reviewerCountsNode.style.marginTop = 'auto' // reviewerCountsNode.style.lineHeight = '95%' reviewerCountsNode.style.fontSize = '0.9em' sortedCounts.slice(0, 6).forEach(({ name, count }) => { const listItem = document.createElement('li') listItem.innerText = `${count} PR${count !== 1 ? 's' : 's'} – ${name}` reviewerCountsNode.appendChild(listItem) }) const label = countsParent.querySelector('.form-label') label.innerText = 'Now reviewing' const message = countsParent.querySelector('.form-field-content') message.replaceChildren(reviewerCountsNode) formBodyMain.appendChild(countsParent) } else { tryDisplay() } }, 300) tryDisplay() }) } addFix(sortSearchResult)