diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index f961a25d2294..779bf90f5d44 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -2,7 +2,6 @@ name: Bug report about: Create a report to help us improve labels: bug - --- diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index 6fea592066be..9b7c7fbf5e26 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -2,7 +2,6 @@ name: Feature request about: Suggest an idea for Refined GitHub labels: enhancement, under discussion - --- diff --git a/source/features/clean-conversation-filters.tsx b/source/features/clean-conversation-filters.tsx index 9134390a6931..b7e4e0d79b50 100644 --- a/source/features/clean-conversation-filters.tsx +++ b/source/features/clean-conversation-filters.tsx @@ -5,11 +5,11 @@ import * as pageDetect from 'github-url-detection'; import features from '.'; import * as api from '../github-helpers/api'; -import {getRepo, getRepoGQL} from '../github-helpers'; +import {getRepo} from '../github-helpers'; const hasAnyProjects = cache.function(async (): Promise => { const {repository, organization} = await api.v4(` - repository(${getRepoGQL()}) { + repository() { projects { totalCount } } organization(login: "${getRepo()!.owner}") { diff --git a/source/features/clone-branch.tsx b/source/features/clone-branch.tsx index 8e15d99db4a7..2373ff86e2ba 100644 --- a/source/features/clone-branch.tsx +++ b/source/features/clone-branch.tsx @@ -10,11 +10,10 @@ import * as textFieldEdit from 'text-field-edit'; import features from '.'; import * as api from '../github-helpers/api'; import LoadingIcon from '../github-helpers/icon-loading'; -import {getRepoGQL} from '../github-helpers'; const getBranchBaseSha = async (branchName: string): Promise => { const {repository} = await api.v4(` - repository(${getRepoGQL()}) { + repository() { ref(qualifiedName: "${branchName}") { target { oid diff --git a/source/features/comments-time-machine-links.tsx b/source/features/comments-time-machine-links.tsx index 9a8727aaa9af..3b16758f4588 100644 --- a/source/features/comments-time-machine-links.tsx +++ b/source/features/comments-time-machine-links.tsx @@ -8,11 +8,11 @@ import features from '.'; import * as api from '../github-helpers/api'; import GitHubURL from '../github-helpers/github-url'; import {appendBefore} from '../helpers/dom-utils'; -import {buildRepoURL, isPermalink, getRepoGQL} from '../github-helpers'; +import {buildRepoURL, isPermalink} from '../github-helpers'; async function updateURLtoDatedSha(url: GitHubURL, date: string): Promise { const {repository} = await api.v4(` - repository(${getRepoGQL()}) { + repository() { ref(qualifiedName: "${url.branch}") { target { ... on Commit { diff --git a/source/features/deep-reblame.tsx b/source/features/deep-reblame.tsx index 637ab008fde8..08f960121748 100644 --- a/source/features/deep-reblame.tsx +++ b/source/features/deep-reblame.tsx @@ -10,12 +10,11 @@ import features from '.'; import * as api from '../github-helpers/api'; import GitHubURL from '../github-helpers/github-url'; import LoadingIcon from '../github-helpers/icon-loading'; -import {getRepoGQL} from '../github-helpers'; import looseParseInt from '../helpers/loose-parse-int'; const getPullRequestBlameCommit = mem(async (commit: string, prNumber: number, currentFilename: string): Promise => { const {repository} = await api.v4(` - repository(${getRepoGQL()}) { + repository() { file: object(expression: "${commit}:${currentFilename}") { id } @@ -64,7 +63,7 @@ async function redirectToBlameCommit(event: delegate.Event('a.message', blameHunk)!.pathname.split('/').pop()!; const blameUrl = new GitHubURL(location.href); diff --git a/source/features/deprioritize-marketplace-link.tsx b/source/features/deprioritize-marketplace-link.tsx index e10472ebf47e..3f5dafb5ef21 100644 --- a/source/features/deprioritize-marketplace-link.tsx +++ b/source/features/deprioritize-marketplace-link.tsx @@ -1,27 +1,30 @@ import React from 'dom-chef'; import select from 'select-dom'; import onetime from 'onetime'; -import domLoaded from 'dom-loaded'; import elementReady from 'element-ready'; import * as pageDetect from 'github-url-detection'; import features from '.'; -async function init(): Promise { - const marketPlaceLink = (await elementReady('.Header-link[href="/marketplace"]')); - if (marketPlaceLink) { - // The Marketplace link seems to have an additional wrapper that other links don't have https://i.imgur.com/KV9rtSq.png - marketPlaceLink.closest('.border-top, .mr-3')!.remove(); - } - - await domLoaded; - +function handleMenuOpening(): void { select.last('.header-nav-current-user ~ .dropdown-divider')!.before(
, Marketplace ); } +async function init(): Promise { + const marketplaceLink = await elementReady('.Header-link[href="/marketplace"]'); + if (marketplaceLink) { // On GHE it can be disabled + // The link seems to have an additional wrapper that other links don't have https://i.imgur.com/KV9rtSq.png + marketplaceLink.closest('.border-top, .mr-3')!.remove(); + + (await elementReady('[aria-label="View profile and more"]'))! + .closest('details')! + .addEventListener('toggle', handleMenuOpening, {once: true}); + } +} + void features.add(__filebasename, { exclude: [ pageDetect.isGist diff --git a/source/features/esc-to-cancel.tsx b/source/features/esc-to-cancel.tsx new file mode 100644 index 000000000000..41ea2ba15406 --- /dev/null +++ b/source/features/esc-to-cancel.tsx @@ -0,0 +1,25 @@ +import select from 'select-dom'; +import delegate from 'delegate-it'; + +import features from '.'; + +function handleEscPress(event: delegate.Event): void { + if (event.key === 'Escape') { + select('.js-cancel-issue-edit')!.click(); + + event.stopImmediatePropagation(); + event.preventDefault(); + } +} + +function init(): void { + delegate(document, '#issue_title', 'keydown', handleEscPress); +} + +void features.add(__filebasename, { + shortcuts: { + esc: 'Cancel editing a conversation title' + }, + awaitDomReady: false, + init +}); diff --git a/source/features/expand-all-hidden-comments.tsx b/source/features/expand-all-hidden-comments.tsx index d15c440b67bb..9d3797111210 100644 --- a/source/features/expand-all-hidden-comments.tsx +++ b/source/features/expand-all-hidden-comments.tsx @@ -17,7 +17,7 @@ function handleAltClick(event: delegate.Event): v const form = event.delegateTarget.form!; const hiddenItemsCount = Math.min( 200, // https://github.com/sindresorhus/refined-github/issues/2931 - looseParseInt(form.textContent!) + looseParseInt(form) ); const url = new URL(form.action); diff --git a/source/features/highlight-non-default-base-branch.tsx b/source/features/highlight-non-default-base-branch.tsx index fb4dee821b69..40626e994869 100644 --- a/source/features/highlight-non-default-base-branch.tsx +++ b/source/features/highlight-non-default-base-branch.tsx @@ -5,8 +5,8 @@ import PullRequestIcon from 'octicon/git-pull-request.svg'; import features from '.'; import * as api from '../github-helpers/api'; +import {buildRepoURL} from '../github-helpers'; import getDefaultBranch from '../github-helpers/get-default-branch'; -import {getRepoGQL, buildRepoURL} from '../github-helpers'; interface BranchInfo { baseRef: string; @@ -15,7 +15,7 @@ interface BranchInfo { function buildQuery(issueIds: string[]): string { return ` - repository(${getRepoGQL()}) { + repository() { ${issueIds.map(id => ` ${id}: pullRequest(number: ${id.replace(/\D/g, '')}) { baseRef {id} diff --git a/source/features/latest-tag-button.tsx b/source/features/latest-tag-button.tsx index a48937d47b1b..3ddc6e8fa425 100644 --- a/source/features/latest-tag-button.tsx +++ b/source/features/latest-tag-button.tsx @@ -12,7 +12,7 @@ import pluralize from '../helpers/pluralize'; import GitHubURL from '../github-helpers/github-url'; import {groupButtons} from '../github-helpers/group-buttons'; import getDefaultBranch from '../github-helpers/get-default-branch'; -import {buildRepoURL, getCurrentBranch, getRepoGQL, getLatestVersionTag, getRepo} from '../github-helpers'; +import {buildRepoURL, getCurrentBranch, getLatestVersionTag, getRepo} from '../github-helpers'; interface RepoPublishState { latestTag: string | false; @@ -21,7 +21,7 @@ interface RepoPublishState { const getRepoPublishState = cache.function(async (): Promise => { const {repository} = await api.v4(` - repository(${getRepoGQL()}) { + repository() { refs(first: 20, refPrefix: "refs/tags/", orderBy: { field: TAG_COMMIT_DATE, direction: DESC diff --git a/source/features/list-prs-for-file.tsx b/source/features/list-prs-for-file.tsx index cc459cc1d06a..24bcd8e7a471 100644 --- a/source/features/list-prs-for-file.tsx +++ b/source/features/list-prs-for-file.tsx @@ -7,7 +7,7 @@ import PullRequestIcon from 'octicon/git-pull-request.svg'; import features from '.'; import * as api from '../github-helpers/api'; import getDefaultBranch from '../github-helpers/get-default-branch'; -import {buildRepoURL, getRepoGQL, getRepo} from '../github-helpers'; +import {buildRepoURL, getRepo} from '../github-helpers'; function getPRUrl(prNumber: number): string { return buildRepoURL('pull', prNumber, 'files'); @@ -53,7 +53,7 @@ function getSingleButton(prNumber: number, _?: number, prs?: number[]): HTMLElem */ const getPrsByFile = cache.function(async (): Promise> => { const {repository} = await api.v4(` - repository(${getRepoGQL()}) { + repository() { pullRequests( first: 25, states: OPEN, diff --git a/source/features/mark-merge-commits-in-list.tsx b/source/features/mark-merge-commits-in-list.tsx index d0d9ec8a4f3c..e6cbea7104b8 100644 --- a/source/features/mark-merge-commits-in-list.tsx +++ b/source/features/mark-merge-commits-in-list.tsx @@ -6,11 +6,10 @@ import PullRequestIcon from 'octicon/git-pull-request.svg'; import features from '.'; import * as api from '../github-helpers/api'; -import {getRepoGQL} from '../github-helpers'; const filterMergeCommits = async (commits: string[]): Promise => { const {repository} = await api.v4(` - repository(${getRepoGQL()}) { + repository() { ${commits.map((commit: string) => ` ${api.escapeKey(commit)}: object(expression: "${commit}") { ... on Commit { diff --git a/source/features/minimize-upload-bar.css b/source/features/minimize-upload-bar.css index d320347a8d31..e046dbbd34e4 100644 --- a/source/features/minimize-upload-bar.css +++ b/source/features/minimize-upload-bar.css @@ -7,3 +7,11 @@ border-bottom-style: solid; border-radius: 6px; } + +/* Show upload image button in PR minimized upload bar for desktop */ +@media (min-width: 768px) { + .rgh-minimize-upload-bar .js-previewable-comment-form label[aria-label='Attach an image'] { + display: block !important; + padding: 4px !important; + } +} diff --git a/source/features/minimize-upload-bar.tsx b/source/features/minimize-upload-bar.tsx index a8d51bd36327..73dc8cd901f8 100644 --- a/source/features/minimize-upload-bar.tsx +++ b/source/features/minimize-upload-bar.tsx @@ -1,33 +1,10 @@ import './minimize-upload-bar.css'; -import React from 'dom-chef'; -import select from 'select-dom'; -import delegate from 'delegate-it'; -import UploadIcon from 'octicon/upload.svg'; import * as pageDetect from 'github-url-detection'; import features from '.'; -function addButton(): void { - for (const toolbarButton of select.all('md-ref')) { - toolbarButton.after( - - ); - toolbarButton.closest('form')!.classList.add('rgh-minimize-upload-bar'); - } -} - -function triggerUpload(event: delegate.Event): void { - event.delegateTarget - .form! - .querySelector('[type="file"]')! - .click(); // Open UI -} - function init(): void { - addButton(); - delegate(document, '.rgh-upload-btn', 'click', triggerUpload); + document.body.classList.add('rgh-minimize-upload-bar'); } void features.add(__filebasename, { diff --git a/source/features/next-scheduled-github-action.tsx b/source/features/next-scheduled-github-action.tsx index 30dbbb206a5d..c7f50bce3ee4 100644 --- a/source/features/next-scheduled-github-action.tsx +++ b/source/features/next-scheduled-github-action.tsx @@ -7,11 +7,11 @@ import * as pageDetect from 'github-url-detection'; import features from '.'; import * as api from '../github-helpers/api'; -import {getRepoGQL, getRepo} from '../github-helpers'; +import {getRepo} from '../github-helpers'; const getScheduledWorkflows = cache.function(async (): Promise | false> => { const {repository: {object: {entries: workflows}}} = await api.v4(` - repository(${getRepoGQL()}) { + repository() { object(expression: "HEAD:.github/workflows") { ... on Tree { entries { diff --git a/source/features/pinned-issues-update-time.tsx b/source/features/pinned-issues-update-time.tsx index 0cc428e9dddc..5bcd68449e6f 100644 --- a/source/features/pinned-issues-update-time.tsx +++ b/source/features/pinned-issues-update-time.tsx @@ -5,8 +5,8 @@ import * as pageDetect from 'github-url-detection'; import features from '.'; import * as api from '../github-helpers/api'; +import {getRepo} from '../github-helpers'; import looseParseInt from '../helpers/loose-parse-int'; -import {getRepoGQL, getRepo} from '../github-helpers'; interface IssueInfo { updatedAt: string; @@ -14,7 +14,7 @@ interface IssueInfo { const getLastUpdated = cache.function(async (issueNumbers: number[]): Promise> => { const {repository} = await api.v4(` - repository(${getRepoGQL()}) { + repository() { ${issueNumbers.map(number => ` ${api.escapeKey(number)}: issue(number: ${number}) { updatedAt @@ -30,7 +30,7 @@ const getLastUpdated = cache.function(async (issueNumbers: number[]): Promise { diff --git a/source/features/pr-commit-lines-changed.tsx b/source/features/pr-commit-lines-changed.tsx index 9bd9379a2738..c5d7ac1077c9 100644 --- a/source/features/pr-commit-lines-changed.tsx +++ b/source/features/pr-commit-lines-changed.tsx @@ -6,11 +6,10 @@ import * as pageDetect from 'github-url-detection'; import features from '.'; import * as api from '../github-helpers/api'; import pluralize from '../helpers/pluralize'; -import {getRepoGQL} from '../github-helpers'; const getCommitChanges = cache.function(async (commit: string): Promise<[additions: number, deletions: number]> => { const {repository} = await api.v4(` - repository(${getRepoGQL()}) { + repository() { object(expression: "${commit}") { ... on Commit { additions diff --git a/source/features/pr-filters.tsx b/source/features/pr-filters.tsx index 9c88f9a29a4a..9fbfd10a5953 100644 --- a/source/features/pr-filters.tsx +++ b/source/features/pr-filters.tsx @@ -8,7 +8,7 @@ import * as pageDetect from 'github-url-detection'; import features from '.'; import * as api from '../github-helpers/api'; -import {getRepoGQL, getRepo} from '../github-helpers'; +import {getRepo} from '../github-helpers'; const reviewsFilterSelector = '#reviews-select-menu'; @@ -64,7 +64,7 @@ function addDraftFilter({delegateTarget: reviewsFilter}: delegate.Event): void { const hasChecks = cache.function(async (): Promise => { const {repository} = await api.v4(` - repository(${getRepoGQL()}) { + repository() { head: object(expression: "HEAD") { ... on Commit { history(first: 10) { diff --git a/source/features/profile-hotkey.tsx b/source/features/profile-hotkey.tsx index 08e8ddad30a8..8abc9a6455dd 100644 --- a/source/features/profile-hotkey.tsx +++ b/source/features/profile-hotkey.tsx @@ -1,15 +1,19 @@ -import select from 'select-dom'; +import React from 'dom-chef'; import onetime from 'onetime'; +import {isEnterprise} from 'github-url-detection'; import features from '.'; +import {getUsername} from '../github-helpers'; function init(): void { - select('a[data-ga-click$="text:your profile"]')!.dataset.hotkey = 'g m'; + const profileLink = (isEnterprise() ? location.origin : 'https://github.com') + '/' + getUsername(); + document.body.append(