Skip to content

Commit a9d529c

Browse files
alexr00Copilot
andcommitted
Address PR feedback
Co-authored-by: Copilot <copilot@github.com>
1 parent 827c847 commit a9d529c

6 files changed

Lines changed: 64 additions & 24 deletions

File tree

src/github/pullRequestOverview.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ import { IssueOverviewPanel, panelKey } from './issueOverview';
2727
import { isCopilotOnMyBehalf, PullRequestModel } from './pullRequestModel';
2828
import { PullRequestReviewCommon, ReviewContext } from './pullRequestReviewCommon';
2929
import { branchPicks, pickEmail, reviewersQuickPick } from './quickPicks';
30-
import { parseReviewers, processDiffLinks, processPermalinks } from './utils';
30+
import { ISSUE_OR_URL_EXPRESSION, parseIssueExpressionOutput, parseReviewers, processDiffLinks, processPermalinks } from './utils';
3131
import { CancelCodingAgentReply, ChangeBaseReply, ChangeReviewersReply, DeleteReviewResult, MergeArguments, MergeResult, PullRequest, ReadyForReviewAndMergeContext, ReadyForReviewContext, ReviewCommentContext, ReviewType, UnresolvedIdentity } from './views';
3232
import { debounce } from '../common/async';
3333
import { COPILOT_ACCOUNTS, IComment } from '../common/comment';
@@ -38,6 +38,7 @@ import Logger from '../common/logger';
3838
import { CHECKOUT_DEFAULT_BRANCH, CHECKOUT_PULL_REQUEST_BASE_BRANCH, DEFAULT_MERGE_METHOD, DELETE_BRANCH_AFTER_MERGE, POST_DONE, PR_SETTINGS_NAMESPACE } from '../common/settingKeys';
3939
import { ITelemetry } from '../common/telemetry';
4040
import { EventType, ReviewEvent, SessionLinkInfo, TimelineEvent } from '../common/timelineEvent';
41+
import { toOpenIssueWebviewUri } from '../common/uri';
4142
import { asPromise, formatError } from '../common/utils';
4243
import { IRequestMessage, PULL_REQUEST_OVERVIEW_VIEW_TYPE } from '../common/webview';
4344
import { toCheckRunLogUri } from '../view/checkRunLogContentProvider';
@@ -459,7 +460,13 @@ export class PullRequestOverviewPanel extends IssueOverviewPanel<PullRequestMode
459460
revertable: pullRequest.state === GithubItemStateEnum.Merged,
460461
isCopilotOnMyBehalf: await isCopilotOnMyBehalf(pullRequest, currentUser, coAuthors),
461462
generateDescriptionTitle: this.getGenerateDescriptionTitle(),
462-
closingIssues: pullRequest.closingIssues,
463+
closingIssues: await Promise.all((pullRequest.closingIssues ?? []).map(async issue => {
464+
const parsed = parseIssueExpressionOutput(issue.url.match(ISSUE_OR_URL_EXPRESSION));
465+
const owner = parsed?.owner ?? pullRequest.remote.owner;
466+
const repo = parsed?.name ?? pullRequest.remote.repositoryName;
467+
const webviewUri = await toOpenIssueWebviewUri({ owner, repo, issueNumber: issue.number });
468+
return { ...issue, url: webviewUri.toString() };
469+
})),
463470
};
464471
this._postMessage({
465472
command: 'pr.initialize',

src/github/queriesExtra.gql

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,15 @@ fragment PullRequestFragment on PullRequest {
237237
mergeCommitMessage
238238
mergeCommitTitle
239239
}
240+
closingIssuesReferences(first: 50) {
241+
nodes {
242+
id
243+
number
244+
title
245+
state
246+
url
247+
}
248+
}
240249
merged
241250
mergeable
242251
mergeQueueEntry {

src/github/queriesLimited.gql

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,15 @@ fragment PullRequestFragment on PullRequest {
206206
}
207207
url
208208
}
209+
closingIssuesReferences(first: 50) {
210+
nodes {
211+
id
212+
number
213+
title
214+
state
215+
url
216+
}
217+
}
209218
merged
210219
mergeable
211220
mergeStateStatus

webviews/common/common.css

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -294,6 +294,27 @@ body img.avatar {
294294
fill: var(--vscode-issues-closed);
295295
}
296296

297+
.issue-item {
298+
display: flex;
299+
align-items: center;
300+
gap: 6px;
301+
color: var(--vscode-foreground);
302+
text-decoration: none;
303+
overflow: hidden;
304+
}
305+
306+
.issue-item:hover {
307+
text-decoration: underline;
308+
color: var(--vscode-foreground);
309+
}
310+
311+
.issue-item-text {
312+
white-space: nowrap;
313+
overflow: hidden;
314+
text-overflow: ellipsis;
315+
flex: 1;
316+
min-width: 0;
317+
}
297318
.reviewer-icons {
298319
display: flex;
299320
gap: 4px;

webviews/components/icon.tsx

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,6 @@ export const outputIcon = <Icon src={require('../../resources/icons/codicons/out
5353
export const skipIcon = <Icon src={require('../../resources/icons/codicons/skip.svg')} className='skip' />;
5454

5555
// Other icons
56-
export const issueIcon = <Icon src={require('../../resources/icons/issue_webview.svg')} />;
57-
export const issueClosedIcon = <Icon src={require('../../resources/icons/codicons/pass.svg')} />;
5856
export const copilotErrorIcon = <Icon className='copilot-icon' src={require('../../resources/icons/copilot-error.svg')} />;
5957
export const copilotInProgressIcon = <Icon className='copilot-icon' src={require('../../resources/icons/copilot-in-progress.svg')} />;
6058
export const copilotSuccessIcon = <Icon className='copilot-icon' src={require('../../resources/icons/copilot-success.svg')} />;

webviews/components/sidebar.tsx

Lines changed: 16 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
*--------------------------------------------------------------------------------------------*/
55

66
import React, { useContext, useEffect, useRef, useState } from 'react';
7-
import { closeIcon, copilotIcon, issueClosedIcon, issueIcon, settingsIcon } from './icon';
7+
import { closeIcon, copilotIcon, issuescon, passIcon, settingsIcon } from './icon';
88
import { Reviewer } from './reviewer';
99
import { COPILOT_LOGINS } from '../../src/common/copilot';
1010
import { gitHubLabelColor } from '../../src/common/utils';
@@ -269,21 +269,17 @@ export default function Sidebar({ reviewers, labels, closingIssues, hasWritePerm
269269
)}
270270
</Section>
271271

272-
<Section
273-
id="closingIssues"
274-
title="Linked Issues"
275-
hasWritePermission={false}
276-
>
277-
{closingIssues.length ? (
278-
closingIssues.map(issue => (
279-
<div key={issue.number} className="section-item">
280-
<IssueItem issue={issue} />
281-
</div>
282-
))
283-
) : (
284-
<div className="section-placeholder">None yet</div>
285-
)}
286-
</Section>
272+
{closingIssues.length > 0 && (
273+
<Section
274+
id="closingIssues"
275+
title="Linked Issues"
276+
hasWritePermission={false}
277+
>
278+
{closingIssues.map(issue => (
279+
<IssueItem key={issue.number} issue={issue} />
280+
))}
281+
</Section>
282+
)}
287283
</div>
288284
);
289285
}
@@ -597,12 +593,12 @@ function ConvertToDraft() {
597593
function IssueItem({ issue }: { issue: IssueReference }) {
598594
const isOpen = issue.state === GithubItemStateEnum.Open;
599595
return (
600-
<div className="avatar-with-author">
596+
<a className="issue-item" href={issue.url} title={`#${issue.number} ${issue.title}`}>
601597
<span className={`section-icon ${isOpen ? 'issue-open' : 'issue-closed'}`}>
602-
{isOpen ? issueIcon : issueClosedIcon}
598+
{isOpen ? issuescon : passIcon}
603599
</span>
604-
<a href={issue.url} title={issue.url}>#{issue.number} {issue.title}</a>
605-
</div>
600+
<span className="issue-item-text">#{issue.number} {issue.title}</span>
601+
</a>
606602
);
607603
}
608604

0 commit comments

Comments
 (0)