Skip to content

Commit 67f7e29

Browse files
authored
Rounded labels in hovers and bring status back into PR hover (#6776)
1 parent 5e7587f commit 67f7e29

10 files changed

+81
-67
lines changed

src/common/markdownUtils.ts renamed to src/github/markdownUtils.ts

Lines changed: 59 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,14 @@
66
import * as marked from 'marked';
77
import 'url-search-params-polyfill';
88
import * as vscode from 'vscode';
9-
import { PullRequestDefaults } from '../github/folderRepositoryManager';
10-
import { GithubItemStateEnum, User } from '../github/interface';
11-
import { IssueModel } from '../github/issueModel';
12-
import { PullRequestModel } from '../github/pullRequestModel';
13-
import { RepositoriesManager } from '../github/repositoriesManager';
14-
import { getIssueNumberLabelFromParsed, ISSUE_OR_URL_EXPRESSION, makeLabel, parseIssueExpressionOutput } from '../github/utils';
9+
import Logger from '../common/logger';
1510
import { CODE_PERMALINK, findCodeLinkLocally } from '../issues/issueLinkLookup';
16-
import Logger from './logger';
11+
import { PullRequestDefaults } from './folderRepositoryManager';
12+
import { GithubItemStateEnum, User } from './interface';
13+
import { IssueModel } from './issueModel';
14+
import { PullRequestModel } from './pullRequestModel';
15+
import { RepositoriesManager } from './repositoriesManager';
16+
import { getIssueNumberLabelFromParsed, ISSUE_OR_URL_EXPRESSION, makeLabel, parseIssueExpressionOutput, UnsatisfiedChecks } from './utils';
1717

1818
function getIconString(issue: IssueModel) {
1919
switch (issue.state) {
@@ -155,6 +155,7 @@ export async function issueMarkdown(
155155
context: vscode.ExtensionContext,
156156
repositoriesManager: RepositoriesManager,
157157
commentNumber?: number,
158+
prChecks?: UnsatisfiedChecks
158159
): Promise<vscode.MarkdownString> {
159160
const markdown: vscode.MarkdownString = new vscode.MarkdownString(undefined, true);
160161
markdown.supportHtml = true;
@@ -184,9 +185,9 @@ export async function issueMarkdown(
184185
body = await findCodeLinksInIssue(body, repositoriesManager);
185186

186187
markdown.appendMarkdown(body + ' \n');
187-
markdown.appendMarkdown('&nbsp; \n');
188188

189189
if (issue.item.labels.length > 0) {
190+
markdown.appendMarkdown('&nbsp; \n');
190191
issue.item.labels.forEach(label => {
191192
markdown.appendMarkdown(
192193
`[${makeLabel(label)}](https://github.com/${ownerName}/labels/${encodeURIComponent(
@@ -216,6 +217,15 @@ export async function issueMarkdown(
216217
}
217218
}
218219
}
220+
221+
if (prChecks) {
222+
const statusMessage = getStatusDecoration(prChecks)?.tooltip;
223+
if (statusMessage) {
224+
markdown.appendMarkdown(' \r\n\r\n');
225+
markdown.appendMarkdown(`_${statusMessage}_`);
226+
}
227+
}
228+
219229
return markdown;
220230
}
221231

@@ -286,4 +296,45 @@ export class PlainTextRenderer extends marked.Renderer {
286296
override link(href: string, title: string, text: string): string {
287297
return text + ' ';
288298
}
299+
}
300+
301+
export function getStatusDecoration(status: UnsatisfiedChecks): vscode.FileDecoration2 | undefined {
302+
if ((status & UnsatisfiedChecks.CIFailed) && (status & UnsatisfiedChecks.ReviewRequired)) {
303+
return {
304+
propagate: false,
305+
badge: new vscode.ThemeIcon('close', new vscode.ThemeColor('list.errorForeground')),
306+
tooltip: 'Review required and some checks have failed'
307+
};
308+
} else if (status & UnsatisfiedChecks.CIFailed) {
309+
return {
310+
propagate: false,
311+
badge: new vscode.ThemeIcon('close', new vscode.ThemeColor('list.errorForeground')),
312+
tooltip: 'Some checks have failed'
313+
};
314+
} else if (status & UnsatisfiedChecks.ChangesRequested) {
315+
return {
316+
propagate: false,
317+
badge: new vscode.ThemeIcon('request-changes', new vscode.ThemeColor('list.errorForeground')),
318+
tooltip: 'Changes requested'
319+
};
320+
} else if (status & UnsatisfiedChecks.CIPending) {
321+
return {
322+
propagate: false,
323+
badge: new vscode.ThemeIcon('sync', new vscode.ThemeColor('list.warningForeground')),
324+
tooltip: 'Checks pending'
325+
};
326+
} else if (status & UnsatisfiedChecks.ReviewRequired) {
327+
return {
328+
propagate: false,
329+
badge: new vscode.ThemeIcon('circle-filled', new vscode.ThemeColor('list.warningForeground')),
330+
tooltip: 'Review required'
331+
};
332+
} else if (status === UnsatisfiedChecks.None) {
333+
return {
334+
propagate: false,
335+
badge: new vscode.ThemeIcon('check-all', new vscode.ThemeColor('issues.open')),
336+
tooltip: 'All checks passed'
337+
};
338+
}
339+
289340
}

src/github/utils.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1528,5 +1528,14 @@ export function vscodeDevPrLink(pullRequest: IssueModel) {
15281528
export function makeLabel(label: ILabel): string {
15291529
const isDarkTheme = vscode.window.activeColorTheme.kind === vscode.ColorThemeKind.Dark;
15301530
const labelColor = gitHubLabelColor(label.color, isDarkTheme, true);
1531-
return `<span style="color:${labelColor.textColor};background-color:${labelColor.backgroundColor};">&nbsp;&nbsp;${label.name.trim()}&nbsp;&nbsp;</span>`;
1531+
return `<span style="color:${labelColor.textColor};background-color:${labelColor.backgroundColor};border-radius:10px;">&nbsp;&nbsp;${label.name.trim()}&nbsp;&nbsp;</span>`;
15321532
}
1533+
1534+
1535+
export enum UnsatisfiedChecks {
1536+
None = 0,
1537+
ReviewRequired = 1 << 0,
1538+
ChangesRequested = 1 << 1,
1539+
CIFailed = 1 << 2,
1540+
CIPending = 1 << 3
1541+
}

src/issues/issueCompletionProvider.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
*--------------------------------------------------------------------------------------------*/
55

66
import * as vscode from 'vscode';
7-
import { issueMarkdown } from '../common/markdownUtils';
87
import {
98
IGNORE_COMPLETION_TRIGGER,
109
ISSUE_COMPLETION_FORMAT_SCM,
@@ -14,6 +13,7 @@ import { fromNewIssueUri, Schemes } from '../common/uri';
1413
import { FolderRepositoryManager, PullRequestDefaults } from '../github/folderRepositoryManager';
1514
import { IMilestone } from '../github/interface';
1615
import { IssueModel } from '../github/issueModel';
16+
import { issueMarkdown } from '../github/markdownUtils';
1717
import { RepositoriesManager } from '../github/repositoriesManager';
1818
import { getIssueNumberLabel, variableSubstitution } from '../github/utils';
1919
import { IssueQueryResult, StateManager } from './stateManager';

src/issues/issueHoverProvider.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@
44
*--------------------------------------------------------------------------------------------*/
55

66
import * as vscode from 'vscode';
7-
import { issueMarkdown } from '../common/markdownUtils';
87
import { ITelemetry } from '../common/telemetry';
98
import { FolderRepositoryManager } from '../github/folderRepositoryManager';
9+
import { issueMarkdown } from '../github/markdownUtils';
1010
import { RepositoriesManager } from '../github/repositoriesManager';
1111
import { ISSUE_OR_URL_EXPRESSION, ParsedIssue, parseIssueExpressionOutput } from '../github/utils';
1212
import { StateManager } from './stateManager';

src/issues/issuesView.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,11 @@
66
import * as path from 'path';
77
import * as vscode from 'vscode';
88
import { commands, contexts } from '../common/executeCommands';
9-
import { issueMarkdown } from '../common/markdownUtils';
109
import { DataUri } from '../common/uri';
1110
import { groupBy } from '../common/utils';
1211
import { FolderRepositoryManager, ReposManagerState } from '../github/folderRepositoryManager';
1312
import { IssueModel } from '../github/issueModel';
13+
import { issueMarkdown } from '../github/markdownUtils';
1414
import { RepositoriesManager } from '../github/repositoriesManager';
1515
import { issueBodyHasLink } from './issueLinkLookup';
1616
import { IssueItem, QueryGroup, StateManager } from './stateManager';

src/issues/userCompletionProvider.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,14 @@
66
import * as path from 'path';
77
import * as vscode from 'vscode';
88
import Logger from '../common/logger';
9-
import { userMarkdown } from '../common/markdownUtils';
109
import { IGNORE_USER_COMPLETION_TRIGGER, ISSUES_SETTINGS_NAMESPACE } from '../common/settingKeys';
1110
import { TimelineEvent } from '../common/timelineEvent';
1211
import { fromNewIssueUri, fromPRUri, Schemes } from '../common/uri';
1312
import { compareIgnoreCase, isDescendant } from '../common/utils';
1413
import { EXTENSION_ID } from '../constants';
1514
import { FolderRepositoryManager } from '../github/folderRepositoryManager';
1615
import { IAccount, User } from '../github/interface';
16+
import { userMarkdown } from '../github/markdownUtils';
1717
import { RepositoriesManager } from '../github/repositoriesManager';
1818
import { getRelatedUsersFromTimelineEvents } from '../github/utils';
1919
import { ASSIGNEES } from './issueFile';

src/issues/userHoverProvider.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@
44
*--------------------------------------------------------------------------------------------*/
55

66
import * as vscode from 'vscode';
7-
import { userMarkdown } from '../common/markdownUtils';
87
import { ITelemetry } from '../common/telemetry';
98
import { DOXYGEN_NON_USERS, JSDOC_NON_USERS, PHPDOC_NON_USERS } from '../common/user';
9+
import { userMarkdown } from '../github/markdownUtils';
1010
import { RepositoriesManager } from '../github/repositoriesManager';
1111
import { shouldShowHover, USER_EXPRESSION } from './util';
1212

src/view/prStatusDecorationProvider.ts

Lines changed: 3 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@
66
import * as vscode from 'vscode';
77
import { Disposable } from '../common/lifecycle';
88
import { createPRNodeUri, fromPRNodeUri, Schemes } from '../common/uri';
9-
import { PrsTreeModel, UnsatisfiedChecks } from './prsTreeModel';
9+
import { getStatusDecoration } from '../github/markdownUtils';
10+
import { PrsTreeModel } from './prsTreeModel';
1011

1112
export class PRStatusDecorationProvider extends Disposable implements vscode.FileDecorationProvider {
1213

@@ -41,47 +42,6 @@ export class PRStatusDecorationProvider extends Disposable implements vscode.Fil
4142
return;
4243
}
4344

44-
return this._getDecoration(status.status) as vscode.FileDecoration;
45-
}
46-
47-
private _getDecoration(status: UnsatisfiedChecks): vscode.FileDecoration2 | undefined {
48-
if ((status & UnsatisfiedChecks.CIFailed) && (status & UnsatisfiedChecks.ReviewRequired)) {
49-
return {
50-
propagate: false,
51-
badge: new vscode.ThemeIcon('close', new vscode.ThemeColor('list.errorForeground')),
52-
tooltip: 'Review required and some checks have failed'
53-
};
54-
} else if (status & UnsatisfiedChecks.CIFailed) {
55-
return {
56-
propagate: false,
57-
badge: new vscode.ThemeIcon('close', new vscode.ThemeColor('list.errorForeground')),
58-
tooltip: 'Some checks have failed'
59-
};
60-
} else if (status & UnsatisfiedChecks.ChangesRequested) {
61-
return {
62-
propagate: false,
63-
badge: new vscode.ThemeIcon('request-changes', new vscode.ThemeColor('list.errorForeground')),
64-
tooltip: 'Changes requested'
65-
};
66-
} else if (status & UnsatisfiedChecks.CIPending) {
67-
return {
68-
propagate: false,
69-
badge: new vscode.ThemeIcon('sync', new vscode.ThemeColor('list.warningForeground')),
70-
tooltip: 'Checks pending'
71-
};
72-
} else if (status & UnsatisfiedChecks.ReviewRequired) {
73-
return {
74-
propagate: false,
75-
badge: new vscode.ThemeIcon('circle-filled', new vscode.ThemeColor('list.warningForeground')),
76-
tooltip: 'Review required'
77-
};
78-
} else if (status === UnsatisfiedChecks.None) {
79-
return {
80-
propagate: false,
81-
badge: new vscode.ThemeIcon('check-all', new vscode.ThemeColor('issues.open')),
82-
tooltip: 'All checks passed'
83-
};
84-
}
85-
45+
return getStatusDecoration(status.status) as vscode.FileDecoration;
8646
}
8747
}

src/view/prsTreeDataProvider.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,14 @@ import * as vscode from 'vscode';
77
import { AuthProvider } from '../common/authentication';
88
import { commands, contexts } from '../common/executeCommands';
99
import { Disposable } from '../common/lifecycle';
10-
import { issueMarkdown } from '../common/markdownUtils';
1110
import { FILE_LIST_LAYOUT, PR_SETTINGS_NAMESPACE, QUERIES, REMOTES } from '../common/settingKeys';
1211
import { ITelemetry } from '../common/telemetry';
12+
import { createPRNodeIdentifier } from '../common/uri';
1313
import { EXTENSION_ID } from '../constants';
1414
import { CredentialStore } from '../github/credentials';
1515
import { FolderRepositoryManager, ReposManagerState } from '../github/folderRepositoryManager';
1616
import { PRType } from '../github/interface';
17+
import { issueMarkdown } from '../github/markdownUtils';
1718
import { NotificationProvider } from '../github/notifications';
1819
import { PullRequestModel } from '../github/pullRequestModel';
1920
import { RepositoriesManager } from '../github/repositoriesManager';
@@ -188,7 +189,7 @@ export class PullRequestsTreeDataProvider extends Disposable implements vscode.T
188189
await element.resolve();
189190
item = element.getTreeItem();
190191
} else if (element instanceof PRNode) {
191-
item.tooltip = await issueMarkdown(element.pullRequestModel, this._context, this._reposManager);
192+
item.tooltip = await issueMarkdown(element.pullRequestModel, this._context, this._reposManager, undefined, this.prsTreeModel.cachedPRStatus(createPRNodeIdentifier(element.pullRequestModel))?.status);
192193
}
193194
return item;
194195
}

src/view/prsTreeModel.ts

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,19 +12,12 @@ import { FolderRepositoryManager, ItemsResponseResult } from '../github/folderRe
1212
import { CheckState, PRType, PullRequestChecks, PullRequestReviewRequirement } from '../github/interface';
1313
import { PullRequestModel } from '../github/pullRequestModel';
1414
import { RepositoriesManager } from '../github/repositoriesManager';
15+
import { UnsatisfiedChecks } from '../github/utils';
1516
import { CategoryTreeNode } from './treeNodes/categoryNode';
1617
import { TreeNode } from './treeNodes/treeNode';
1718

1819
export const EXPANDED_QUERIES_STATE = 'expandedQueries';
1920

20-
export enum UnsatisfiedChecks {
21-
None = 0,
22-
ReviewRequired = 1 << 0,
23-
ChangesRequested = 1 << 1,
24-
CIFailed = 1 << 2,
25-
CIPending = 1 << 3
26-
}
27-
2821
interface PRStatusChange {
2922
pullRequest: PullRequestModel;
3023
status: UnsatisfiedChecks;

0 commit comments

Comments
 (0)