From addd5ab1bce675fbebfbd373569eb2333b49b95e Mon Sep 17 00:00:00 2001 From: yakov116 <16872793+yakov116@users.noreply.github.com> Date: Tue, 1 Jun 2021 14:40:34 -0400 Subject: [PATCH] Drop support for the old GitHub layout (#3951) --- source/features/bugs-tab.tsx | 28 ++--- source/features/ci-link.tsx | 1 - source/features/clone-branch.tsx | 6 +- .../features/comments-time-machine-links.tsx | 5 +- source/features/default-branch-button.tsx | 6 -- source/features/download-folder-button.tsx | 21 +--- source/features/follow-file-renames.tsx | 7 +- .../features/mark-merge-commits-in-list.tsx | 13 +-- source/features/more-dropdown.tsx | 84 ++------------- source/features/pull-request-hotkey.tsx | 10 +- source/features/releases-tab.tsx | 102 ++++++------------ source/features/repo-age.tsx | 33 ++---- ...t-default-repositories-type-to-sources.tsx | 4 - source/features/show-open-prs-of-forks.tsx | 5 +- .../split-issue-pr-search-results.tsx | 5 +- source/features/tags-on-commits-list.tsx | 10 +- source/features/toggle-files-button.css | 1 - source/features/toggle-files-button.tsx | 6 +- 18 files changed, 75 insertions(+), 272 deletions(-) diff --git a/source/features/bugs-tab.tsx b/source/features/bugs-tab.tsx index e271728a032..1e8164cbc33 100644 --- a/source/features/bugs-tab.tsx +++ b/source/features/bugs-tab.tsx @@ -74,25 +74,15 @@ async function init(): Promise { issuesTab.removeAttribute('data-selected-links'); // Update its appearance - const bugsTabTitle = select('[data-content]', bugsTab); - if (bugsTabTitle) { - bugsTabTitle.dataset.content = 'Bugs'; - bugsTabTitle.textContent = 'Bugs'; - select('.octicon', bugsTab)!.replaceWith(); - - // Un-select one of the tabs if necessary - const selectedTab = !isBugsPage || pageDetect.isPRList() ? bugsTab : issuesTab; - selectedTab.classList.remove('selected'); - selectedTab.removeAttribute('aria-current'); - } else { - // Pre "Repository refresh" layout - select('[itemprop="name"]', bugsTab)!.textContent = 'Bugs'; - select('.octicon', bugsTab)!.replaceWith(); - - // Change the Selected tab if necessary - bugsTab.classList.toggle('selected', isBugsPage && !pageDetect.isPRList()); - select('.selected', issuesTab)?.classList.toggle('selected', !isBugsPage); - } + const bugsTabTitle = select('[data-content]', bugsTab)!; + bugsTabTitle.dataset.content = 'Bugs'; + bugsTabTitle.textContent = 'Bugs'; + select('.octicon', bugsTab)!.replaceWith(); + + // Un-select one of the tabs if necessary + const selectedTab = !isBugsPage || pageDetect.isPRList() ? bugsTab : issuesTab; + selectedTab.classList.remove('selected'); + selectedTab.removeAttribute('aria-current'); // Set temporary counter const bugsCounter = select('.Counter', bugsTab)!; diff --git a/source/features/ci-link.tsx b/source/features/ci-link.tsx index e6a2245a7de..08bff8c32e1 100644 --- a/source/features/ci-link.tsx +++ b/source/features/ci-link.tsx @@ -10,7 +10,6 @@ import {buildRepoURL} from '../github-helpers'; // Look for the CI icon in the latest 2 days of commits #2990 const getIcon = onetime(async () => fetchDom( buildRepoURL('commits'), [ - '.commit-group:nth-of-type(-n+2) .commit-build-statuses', // Pre "Repository refresh" layout '.TimelineItem--condensed:nth-of-type(-n+2) .commit-build-statuses', // TODO[2022-04-29]: GHE '.TimelineItem--condensed:nth-of-type(-n+2) batch-deferred-content[data-url$="checks-statuses-rollups"]' ].join() diff --git a/source/features/clone-branch.tsx b/source/features/clone-branch.tsx index 0ae953f4d1e..1a28d649c66 100644 --- a/source/features/clone-branch.tsx +++ b/source/features/clone-branch.tsx @@ -71,12 +71,8 @@ async function cloneBranch({delegateTarget: cloneButton}: delegate.Event): Promi async function init(): Promise { await api.expectToken(); - const deleteIconClass = [ - 'branch-filter-item-controller .octicon-trashcan', // Pre "Repository refresh" layout - 'branch-filter-item .octicon-trash' - ].join(); - observe(deleteIconClass, { + observe('branch-filter-item .octicon-trash', { add(deleteIcon) { // Branches with open PRs use `span`, the others use `form` deleteIcon.closest('form, span')!.before( diff --git a/source/features/comments-time-machine-links.tsx b/source/features/comments-time-machine-links.tsx index 7cf09d53bb0..04556178f1f 100644 --- a/source/features/comments-time-machine-links.tsx +++ b/source/features/comments-time-machine-links.tsx @@ -91,10 +91,7 @@ async function showTimemachineBar(): Promise { return false; } - const lastCommitDate = await elementReady([ - '.repository-content .Box.Box--condensed relative-time', - '[itemprop="dateModified"] relative-time' // "Repository refresh" layout - ].join(), {waitForChildren: false}); + const lastCommitDate = await elementReady('[itemprop="dateModified"] relative-time', {waitForChildren: false}); if (lastCommitDate && date > lastCommitDate.getAttribute('datetime')!) { return false; } diff --git a/source/features/default-branch-button.tsx b/source/features/default-branch-button.tsx index f1347db99bc..c81ac7e966d 100644 --- a/source/features/default-branch-button.tsx +++ b/source/features/default-branch-button.tsx @@ -43,15 +43,9 @@ async function init(): Promise { ); - if (branchSelector.classList.contains('btn-sm')) { - // Pre "Repository refresh" layout - defaultLink.classList.add('btn-sm'); - } - branchSelector.parentElement!.before(defaultLink); branchSelector.parentElement!.style.zIndex = 'auto'; // For #4240 groupButtons([defaultLink, branchSelector.parentElement!]).classList.add('d-flex'); - branchSelector.style.float = 'none'; // Pre "Repository refresh" layout } void features.add(__filebasename, { diff --git a/source/features/download-folder-button.tsx b/source/features/download-folder-button.tsx index ead9d52691f..9eaf692cd10 100644 --- a/source/features/download-folder-button.tsx +++ b/source/features/download-folder-button.tsx @@ -9,25 +9,12 @@ function init(): void { const downloadUrl = new URL('https://download-directory.github.io/'); downloadUrl.searchParams.set('url', location.href); - const folderButtonGroup = select('.file-navigation .BtnGroup.float-right'); - if (folderButtonGroup) { - folderButtonGroup.prepend( - - Download + for (const deleteButton of select.all(`form[action^="/${getRepo()!.nameWithOwner}/tree/delete"]`)) { + deleteButton.before( + + Download directory ); - } else { - // "Repository refresh" layout - for (const deleteButton of select.all(`form[action^="/${getRepo()!.nameWithOwner}/tree/delete"]`)) { - deleteButton.before( - - Download directory - - ); - } } } diff --git a/source/features/follow-file-renames.tsx b/source/features/follow-file-renames.tsx index 80f7b10fa13..833c26bb009 100644 --- a/source/features/follow-file-renames.tsx +++ b/source/features/follow-file-renames.tsx @@ -23,12 +23,9 @@ async function linkify(button: HTMLButtonElement, url: GitHubURL): Promise => { // eslint-disable-next-line import/prefer-default-export export function getCommitHash(commit: HTMLElement): string { - return commit.dataset.channel!.split(':')[3] ?? // Pre "Repository refresh" layout - commit.querySelector('a[href]')!.pathname.split('/').pop()!; + return commit.querySelector('a[href]')!.pathname.split('/').pop()!; } async function init(): Promise { - const pageCommits = select.all([ - 'li.commit', // Pre "Repository refresh" layout - 'li.js-commits-list-item' - ]); + const pageCommits = select.all('li.js-commits-list-item'); const mergeCommits = await filterMergeCommits(pageCommits.map(getCommitHash)); for (const commit of pageCommits) { if (mergeCommits.includes(getCommitHash(commit))) { commit.classList.add('rgh-merge-commit'); - select([ - '.commit-title', // Pre "Repository refresh" layout - 'div > p' - ], commit)!.prepend(); + select('div > p', commit)!.prepend(); } } } diff --git a/source/features/more-dropdown.tsx b/source/features/more-dropdown.tsx index c42aa7bb393..7d0951e66b1 100644 --- a/source/features/more-dropdown.tsx +++ b/source/features/more-dropdown.tsx @@ -3,29 +3,11 @@ import React from 'dom-chef'; import select from 'select-dom'; import elementReady from 'element-ready'; import * as pageDetect from 'github-url-detection'; -import {DiffIcon, GitBranchIcon, HistoryIcon, PackageIcon} from '@primer/octicons-react'; import features from '.'; -import {appendBefore} from '../helpers/dom-utils'; import getDefaultBranch from '../github-helpers/get-default-branch'; import {buildRepoURL, getCurrentCommittish} from '../github-helpers'; -function createDropdown(): void { - // Markup copied from native GHE dropdown - appendBefore( - // GHE doesn't have `reponav > ul` - select('.reponav > ul') ?? select('.reponav')!, - '[data-selected-links^="repo_settings"]', -
- - {'More '} - - - -
- ); -} - /* eslint-disable-next-line import/prefer-default-export */ export function createDropdownItem(label: string, url: string, attributes?: Record): Element { return ( @@ -54,10 +36,7 @@ function onlyShowInDropdown(id: string): void { async function init(): Promise { // Wait for the tab bar to be loaded - await elementReady([ - '.pagehead', // Pre "Repository refresh" layout - '.UnderlineNav-body' - ].join()); + const repoNavigationBar = (await elementReady('.UnderlineNav-body'))!; const reference = getCurrentCommittish() ?? await getDefaultBranch(); const compareUrl = buildRepoURL('compare', reference); @@ -65,61 +44,18 @@ async function init(): Promise { const branchesUrl = buildRepoURL('branches'); const dependenciesUrl = buildRepoURL('network/dependencies'); - const nav = select('.js-responsive-underlinenav .UnderlineNav-body'); - if (nav) { - // "Repository refresh" layout - nav.parentElement!.classList.add('rgh-has-more-dropdown'); - select('.js-responsive-underlinenav-overflow ul')!.append( -
  • , - createDropdownItem('Compare', compareUrl), - pageDetect.isEnterprise() ? '' : createDropdownItem('Dependencies', dependenciesUrl), - createDropdownItem('Commits', commitsUrl), - createDropdownItem('Branches', branchesUrl) - ); - - onlyShowInDropdown('security-tab'); - onlyShowInDropdown('insights-tab'); - return; - } - - // Pre "Repository refresh" layout - if (!select.exists('.reponav-dropdown')) { - createDropdown(); - } - - const menu = select('.reponav-dropdown .dropdown-menu')!; - menu.append( - - Compare - , - - pageDetect.isEnterprise() ? '' : ( - - Dependencies - - ), + repoNavigationBar.parentElement!.classList.add('rgh-has-more-dropdown'); - - Commits - , - - - Branches - + select('.js-responsive-underlinenav-overflow ul')!.append( +
  • , + createDropdownItem('Compare', compareUrl), + pageDetect.isEnterprise() ? '' : createDropdownItem('Dependencies', dependenciesUrl), + createDropdownItem('Commits', commitsUrl), + createDropdownItem('Branches', branchesUrl) ); - // Selector only affects desktop navigation - for (const tab of select.all(` - .hx_reponav a[data-selected-links~="pulse"], - .hx_reponav a[data-selected-links~="security"] - `)) { - tab.remove(); - menu.append( - - {[...tab.childNodes]} - - ); - } + onlyShowInDropdown('security-tab'); + onlyShowInDropdown('insights-tab'); } void features.add(__filebasename, { diff --git a/source/features/pull-request-hotkey.tsx b/source/features/pull-request-hotkey.tsx index 816b5809eb3..d77de439e8c 100644 --- a/source/features/pull-request-hotkey.tsx +++ b/source/features/pull-request-hotkey.tsx @@ -4,14 +4,8 @@ import * as pageDetect from 'github-url-detection'; import features from '.'; function init(): void { - const tabs = select.all([ - '.tabnav-pr .tabnav-tab', // Pre "Repository refresh" layout - '.tabnav-tabs .tabnav-tab' - ]); - const selectedIndex = tabs.indexOf(select([ - '.tabnav-pr .selected', // Pre "Repository refresh" layout - '.tabnav-tabs .selected' - ])!); + const tabs = select.all('.tabnav-tabs .tabnav-tab'); + const selectedIndex = tabs.indexOf(select('.tabnav-tabs .selected')!); const lastTab = tabs.length - 1; for (const [index, tab] of tabs.entries()) { diff --git a/source/features/releases-tab.tsx b/source/features/releases-tab.tsx index 353d52279a3..7f323d314d9 100644 --- a/source/features/releases-tab.tsx +++ b/source/features/releases-tab.tsx @@ -16,12 +16,6 @@ import {buildRepoURL, getRepo} from '../github-helpers'; const getCacheKey = (): string => `releases-count:${getRepo()!.nameWithOwner}`; async function parseCountFromDom(): Promise { - const releasesCountElement = select('.numbers-summary a[href$="/releases"] .num'); - if (releasesCountElement) { - return looseParseInt(releasesCountElement); - } - - // In "Repository refresh" layout, look for the tags link in the header const moreReleasesCountElement = await elementReady('.repository-content .file-navigation [href$="/tags"] strong'); if (moreReleasesCountElement) { return looseParseInt(moreReleasesCountElement); @@ -60,78 +54,46 @@ async function init(): Promise { } // Wait for the tab bar to be loaded - await elementReady([ - '.pagehead', // Pre "Repository refresh" layout - '.UnderlineNav-body' - ].join()); - - const repoNavigationBar = select('.js-responsive-underlinenav .UnderlineNav-body'); - if (repoNavigationBar) { - // "Repository refresh" layout - const releasesTab = ( -
  • - - - Releases - {count && 999 ? String(count) : ''}>{abbreviateNumber(count)}} - -
  • - ); - repoNavigationBar.append(releasesTab); - - // This re-triggers the overflow listener forcing it to also hide this tab if necessary #3347 - repoNavigationBar.replaceWith(repoNavigationBar); + const repoNavigationBar = (await elementReady('.UnderlineNav-body'))!; + const releasesTab = ( +
  • + + + Releases + {count && 999 ? String(count) : ''}>{abbreviateNumber(count)}} + +
  • + ); + repoNavigationBar.append(releasesTab); - // Update "selected" tab mark - if (pageDetect.isReleasesOrTags()) { - const selected = select('.UnderlineNav-item.selected'); - if (selected) { - selected.classList.remove('selected'); - selected.removeAttribute('aria-current'); - } + // This re-triggers the overflow listener forcing it to also hide this tab if necessary #3347 + repoNavigationBar.replaceWith(repoNavigationBar); - releasesTab.firstElementChild!.classList.add('selected'); - releasesTab.firstElementChild!.setAttribute('aria-current', 'page'); + // Update "selected" tab mark + if (pageDetect.isReleasesOrTags()) { + const selected = select('.UnderlineNav-item.selected'); + if (selected) { + selected.classList.remove('selected'); + selected.removeAttribute('aria-current'); } - appendBefore( - select('.js-responsive-underlinenav .dropdown-menu ul')!, - '.dropdown-divider', // Won't exist if `more-dropdown` is disabled - createDropdownItem('Releases', buildRepoURL('releases'), { - 'data-menu-item': 'rgh-releases-item' - }) - ); - - return; + releasesTab.firstElementChild!.classList.add('selected'); + releasesTab.firstElementChild!.setAttribute('aria-current', 'page'); } - const releasesTab = ( - - - Releases - {count && 999 ? String(count) : ''}>{abbreviateNumber(count)}} - - ); - appendBefore( - // GHE doesn't have `.reponav > ul` - select('.reponav > ul') ?? select('.reponav')!, - '.reponav-dropdown, [data-selected-links^="repo_settings"]', - releasesTab + select('.js-responsive-underlinenav .dropdown-menu ul')!, + '.dropdown-divider', // Won't exist if `more-dropdown` is disabled + createDropdownItem('Releases', buildRepoURL('releases'), { + 'data-menu-item': 'rgh-releases-item' + }) ); - - // Update "selected" tab mark - if (pageDetect.isReleasesOrTags()) { - select('.reponav-item.selected')?.classList.remove('js-selected-navigation-item', 'selected'); - releasesTab.classList.add('js-selected-navigation-item', 'selected'); - releasesTab.dataset.selectedLinks = 'repo_releases'; // Required for ajaxLoad - } } void features.add(__filebasename, { diff --git a/source/features/repo-age.tsx b/source/features/repo-age.tsx index 340a11299a5..1db66842950 100644 --- a/source/features/repo-age.tsx +++ b/source/features/repo-age.tsx @@ -1,7 +1,6 @@ import twas from 'twas'; import cache from 'webext-storage-cache'; import React from 'dom-chef'; -import select from 'select-dom'; import {RepoIcon} from '@primer/octicons-react'; import elementReady from 'element-ready'; import * as pageDetect from 'github-url-detection'; @@ -109,34 +108,14 @@ async function init(): Promise { `${value} ${unit} old`; const sidebarAboutSection = await elementReady('.repository-content .BorderGrid-cell'); - if (sidebarAboutSection) { - sidebarAboutSection.append( -

    Repository age

    , - - ); - - return; - } - - // Pre "Repository refresh" layout - const element = ( -
  • - - {value} {unit} old + sidebarAboutSection!.append( +

    Repository age

    , +
  • + ); - - const license = select('.numbers-summary .octicon-law'); - if (license) { - license.closest('li')!.before(element); - } else { - select('.numbers-summary')!.append(element); - } } void features.add(__filebasename, { diff --git a/source/features/set-default-repositories-type-to-sources.tsx b/source/features/set-default-repositories-type-to-sources.tsx index dd9dc20f2b2..4fc1685586a 100644 --- a/source/features/set-default-repositories-type-to-sources.tsx +++ b/source/features/set-default-repositories-type-to-sources.tsx @@ -18,10 +18,6 @@ async function profileDropdown(): Promise { async function init(): Promise { const links = select.all([ - // Pre "Repository refresh" layout - '#user-links a[href$="tab=repositories"]', // "Repositories" tab on user profile - '.orgnav > a.pagehead-tabs-item:first-child', // "Repositories" tab on organization profile - // "Repository refresh" layout '[aria-label="User profile"] a[href$="tab=repositories"]', // "Repositories" tab on user profile '[aria-label="Organization"] a.UnderlineNav-item:first-child', // "Repositories" tab on organization profile 'a[data-hovercard-type="organization"]' // Organization name on repo header + organization list on user profile diff --git a/source/features/show-open-prs-of-forks.tsx b/source/features/show-open-prs-of-forks.tsx index 320fb350b76..9c87b93bf37 100644 --- a/source/features/show-open-prs-of-forks.tsx +++ b/source/features/show-open-prs-of-forks.tsx @@ -49,10 +49,7 @@ const countPRs = cache.function(async (forkedRepo: string): Promise<[prCount: nu // eslint-disable-next-line @typescript-eslint/ban-types async function getPRs(): Promise<[prCount: number, url: string] | []> { // Wait for the tab bar to be loaded - await elementReady([ - '.pagehead', // Pre "Repository refresh" layout - '.UnderlineNav-body' - ].join()); + await elementReady('.UnderlineNav-body'); if (!pageDetect.canUserEditRepo()) { return []; } diff --git a/source/features/split-issue-pr-search-results.tsx b/source/features/split-issue-pr-search-results.tsx index b543307d37c..4dc897d6aee 100644 --- a/source/features/split-issue-pr-search-results.tsx +++ b/source/features/split-issue-pr-search-results.tsx @@ -28,10 +28,7 @@ function updateLinkElement(link: HTMLAnchorElement, type: GitHubConversationType function init(): void { cleanLinks(); - const issueLink = select([ - 'nav.menu a[href*="&type=Issues"]', // Only for GHE - 'a.menu-item[href*="&type=issues"]' - ])!; + const issueLink = select('a.menu-item[href*="&type=issues"]')!; updateLinkElement(issueLink, 'issue'); // We don't need to clone the child nodes because they get replaced anyways diff --git a/source/features/tags-on-commits-list.tsx b/source/features/tags-on-commits-list.tsx index 0cb941af533..9f36276e42d 100644 --- a/source/features/tags-on-commits-list.tsx +++ b/source/features/tags-on-commits-list.tsx @@ -119,10 +119,7 @@ async function getTags(lastCommit: string, after?: string): Promise async function init(): Promise { const cacheKey = `tags:${getRepo()!.nameWithOwner}`; - const commitsOnPage = select.all([ - 'li.commit', // Pre "Repository refresh" layout - 'li.js-commits-list-item' - ]); + const commitsOnPage = select.all('li.js-commits-list-item'); const lastCommitOnPage = getCommitHash(commitsOnPage[commitsOnPage.length - 1]); let cached = await cache.get>(cacheKey) ?? {}; const commitsWithNoTags = []; @@ -139,10 +136,7 @@ async function init(): Promise { // There was no tags for this commit, save that info to the cache commitsWithNoTags.push(targetCommit); } else if (targetTags.length > 0) { - select([ - '.commit-meta', // Pre "Repository refresh" layout - '.flex-auto .d-flex.mt-1' - ], commit)!.append( + select('.flex-auto .d-flex.mt-1', commit)!.append(
    {targetTags.map((tags, i) => ( diff --git a/source/features/toggle-files-button.css b/source/features/toggle-files-button.css index 432f87d2392..a4590046b86 100644 --- a/source/features/toggle-files-button.css +++ b/source/features/toggle-files-button.css @@ -9,7 +9,6 @@ display: none !important; } -.rgh-files-hidden .files, /* Pre "Repository refresh" layout */ .rgh-files-hidden #files ~ .Details { display: none; } diff --git a/source/features/toggle-files-button.tsx b/source/features/toggle-files-button.tsx index bfc5a279178..ab66ee1206b 100644 --- a/source/features/toggle-files-button.tsx +++ b/source/features/toggle-files-button.tsx @@ -13,11 +13,7 @@ import observeElement from '../helpers/simplified-element-observer'; const cacheKey = 'files-hidden'; function addButton(): void { - // `div` excludes `include-fragment`, which means the list is still loading. #2160 - const filesHeader = select([ - 'div.commit-tease', - '.Box-header--blue .Details > :last-child > ul' // "Repository refresh" layout - ]); + const filesHeader = select('.Box-header--blue .Details > :last-child > ul'); if (!filesHeader || select.exists('.rgh-toggle-files')) { return; }