import './more-dropdown.css'; import React from 'dom-chef'; import select from 'select-dom'; import elementReady from 'element-ready'; import * as pageDetect from 'github-url-detection'; import DiffIcon from 'octicon/diff.svg'; import BranchIcon from 'octicon/git-branch.svg'; import HistoryIcon from 'octicon/history.svg'; import PackageIcon from 'octicon/package.svg'; import features from '.'; import {appendBefore} from '../helpers/dom-utils'; import getDefaultBranch from '../github-helpers/get-default-branch'; import {buildRepoURL, getCurrentBranch} 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 (
  • {label}
  • ); } function onlyShowInDropdown(id: string): void { select(`[data-tab-item="${id}"]`)!.parentElement!.remove(); const menuItem = select(`[data-menu-item="${id}"]`)!; menuItem.removeAttribute('data-menu-item'); menuItem.hidden = false; // The item has to be moved somewhere else because the overflow nav is order-dependent select('.js-responsive-underlinenav-overflow ul')!.append(menuItem); } async function init(): Promise { // Wait for the tab bar to be loaded await elementReady([ '.pagehead + *', // Pre "Repository refresh" layout '.UnderlineNav-body + *' ].join()); const reference = getCurrentBranch() ?? await getDefaultBranch(); const compareUrl = buildRepoURL('compare', reference); const commitsUrl = buildRepoURL('commits', reference); 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 ), Commits , Branches ); // Selector only affects desktop navigation for (const tab of select.all(` .hx_reponav [data-selected-links~="pulse"], .hx_reponav [data-selected-links~="security"] `)) { tab.remove(); menu.append( {[...tab.childNodes]} ); } } void features.add(__filebasename, { include: [ pageDetect.isRepo ], awaitDomReady: false, init });