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
});