Pail/repo-search-sorter.js

110 lines
3.8 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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)