aboutsummaryrefslogtreecommitdiffstats
path: root/server/sonar-web
diff options
context:
space:
mode:
authorMathieu Suen <mathieu.suen@sonarsource.com>2021-10-06 11:33:14 +0200
committersonartech <sonartech@sonarsource.com>2021-10-13 20:03:34 +0000
commitae8cda9b5442652dfff87819ac45fc3dd03eb36d (patch)
tree27a2dc853d5b0d482fe6ff738dd76f1c9babe45d /server/sonar-web
parent0449514911251f3c841b60924522c92ca4b7aea7 (diff)
downloadsonarqube-ae8cda9b5442652dfff87819ac45fc3dd03eb36d.tar.gz
sonarqube-ae8cda9b5442652dfff87819ac45fc3dd03eb36d.zip
SONAR-15473 Add SonarLint promotion for quick fix on issue
Diffstat (limited to 'server/sonar-web')
-rw-r--r--server/sonar-web/src/main/js/components/issue/components/IssueMessage.tsx39
-rw-r--r--server/sonar-web/src/main/js/components/issue/components/IssueTitleBar.tsx1
-rw-r--r--server/sonar-web/src/main/js/components/issue/components/__tests__/IssueMessage-test.tsx1
-rw-r--r--server/sonar-web/src/main/js/components/issue/components/__tests__/__snapshots__/IssueMessage-test.tsx.snap56
-rw-r--r--server/sonar-web/src/main/js/types/types.d.ts1
5 files changed, 88 insertions, 10 deletions
diff --git a/server/sonar-web/src/main/js/components/issue/components/IssueMessage.tsx b/server/sonar-web/src/main/js/components/issue/components/IssueMessage.tsx
index 3662530064e..bd59dbebd82 100644
--- a/server/sonar-web/src/main/js/components/issue/components/IssueMessage.tsx
+++ b/server/sonar-web/src/main/js/components/issue/components/IssueMessage.tsx
@@ -18,16 +18,19 @@
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
import * as React from 'react';
+import { FormattedMessage } from 'react-intl';
import { ButtonLink } from '../../../components/controls/buttons';
import Tooltip from '../../../components/controls/Tooltip';
import { translate, translateWithParameters } from '../../../helpers/l10n';
import { RuleStatus } from '../../../types/rules';
import DocumentationTooltip from '../../common/DocumentationTooltip';
+import SonarLintIcon from '../../icons/SonarLintIcon';
import { WorkspaceContextShape } from '../../workspace/context';
export interface IssueMessageProps {
engine?: string;
engineName?: string;
+ quickFixAvailable?: boolean;
manualVulnerability: boolean;
message: string;
onOpenRule: WorkspaceContextShape['openRule'];
@@ -36,12 +39,42 @@ export interface IssueMessageProps {
}
export default function IssueMessage(props: IssueMessageProps) {
- const { engine, engineName, manualVulnerability, message, ruleKey, ruleStatus } = props;
+ const {
+ engine,
+ engineName,
+ quickFixAvailable,
+ manualVulnerability,
+ message,
+ ruleKey,
+ ruleStatus
+ } = props;
const ruleEngine = engineName ? engineName : engine;
return (
- <div className="issue-message break-word">
+ <div className="display-inline-flex-center issue-message break-word">
<span className="spacer-right">{message}</span>
+ {quickFixAvailable && (
+ <Tooltip
+ overlay={
+ <FormattedMessage
+ id="issue.quick_fix_available_with_sonarlint"
+ defaultMessage={translate('issue.quick_fix_available_with_sonarlint')}
+ values={{
+ link: (
+ <a
+ href="https://www.sonarqube.org/sonarlint/?referrer=sonarqube-quick-fix"
+ rel="noopener noreferrer"
+ target="_blank">
+ SonarLint
+ </a>
+ )
+ }}
+ />
+ }
+ mouseLeaveDelay={0.5}>
+ <SonarLintIcon className="spacer-right" size={15} />
+ </Tooltip>
+ )}
<ButtonLink
aria-label={translate('issue.why_this_issue.long')}
className="issue-see-rule spacer-right text-baseline"
@@ -52,7 +85,6 @@ export default function IssueMessage(props: IssueMessageProps) {
}>
{translate('issue.why_this_issue')}
</ButtonLink>
-
{ruleStatus && (ruleStatus === RuleStatus.Deprecated || ruleStatus === RuleStatus.Removed) && (
<DocumentationTooltip
className="spacer-left"
@@ -68,7 +100,6 @@ export default function IssueMessage(props: IssueMessageProps) {
</span>
</DocumentationTooltip>
)}
-
{ruleEngine && (
<Tooltip overlay={translateWithParameters('issue.from_external_rule_engine', ruleEngine)}>
<div className="badge spacer-right text-baseline">{ruleEngine}</div>
diff --git a/server/sonar-web/src/main/js/components/issue/components/IssueTitleBar.tsx b/server/sonar-web/src/main/js/components/issue/components/IssueTitleBar.tsx
index e4af5329dee..2b3bb81a35b 100644
--- a/server/sonar-web/src/main/js/components/issue/components/IssueTitleBar.tsx
+++ b/server/sonar-web/src/main/js/components/issue/components/IssueTitleBar.tsx
@@ -81,6 +81,7 @@ export default function IssueTitleBar(props: IssueTitleBarProps) {
externalRulesRepoNames &&
externalRulesRepoNames[issue.externalRuleEngine]
}
+ quickFixAvailable={issue.quickFixAvailable}
manualVulnerability={issue.fromHotspot && issue.type === 'VULNERABILITY'}
message={issue.message}
onOpenRule={openRule}
diff --git a/server/sonar-web/src/main/js/components/issue/components/__tests__/IssueMessage-test.tsx b/server/sonar-web/src/main/js/components/issue/components/__tests__/IssueMessage-test.tsx
index 3e1d43c3c7e..a47a0d59f03 100644
--- a/server/sonar-web/src/main/js/components/issue/components/__tests__/IssueMessage-test.tsx
+++ b/server/sonar-web/src/main/js/components/issue/components/__tests__/IssueMessage-test.tsx
@@ -27,6 +27,7 @@ import IssueMessage, { IssueMessageProps } from '../IssueMessage';
it('should render correctly', () => {
expect(shallowRender()).toMatchSnapshot('default');
expect(shallowRender({ engine: 'js' })).toMatchSnapshot('with engine info');
+ expect(shallowRender({ quickFixAvailable: true })).toMatchSnapshot('with quick fix');
expect(shallowRender({ engineName: 'JS' })).toMatchSnapshot('with engine name');
expect(shallowRender({ manualVulnerability: true })).toMatchSnapshot('is manual vulnerability');
expect(shallowRender({ ruleStatus: RuleStatus.Deprecated })).toMatchSnapshot(
diff --git a/server/sonar-web/src/main/js/components/issue/components/__tests__/__snapshots__/IssueMessage-test.tsx.snap b/server/sonar-web/src/main/js/components/issue/components/__tests__/__snapshots__/IssueMessage-test.tsx.snap
index 05ac47ff7ea..94baa6b09fd 100644
--- a/server/sonar-web/src/main/js/components/issue/components/__tests__/__snapshots__/IssueMessage-test.tsx.snap
+++ b/server/sonar-web/src/main/js/components/issue/components/__tests__/__snapshots__/IssueMessage-test.tsx.snap
@@ -2,7 +2,7 @@
exports[`should render correctly: default 1`] = `
<div
- className="issue-message break-word"
+ className="display-inline-flex-center issue-message break-word"
>
<span
className="spacer-right"
@@ -21,7 +21,7 @@ exports[`should render correctly: default 1`] = `
exports[`should render correctly: is deprecated rule 1`] = `
<div
- className="issue-message break-word"
+ className="display-inline-flex-center issue-message break-word"
>
<span
className="spacer-right"
@@ -58,7 +58,7 @@ exports[`should render correctly: is deprecated rule 1`] = `
exports[`should render correctly: is manual vulnerability 1`] = `
<div
- className="issue-message break-word"
+ className="display-inline-flex-center issue-message break-word"
>
<span
className="spacer-right"
@@ -86,7 +86,7 @@ exports[`should render correctly: is manual vulnerability 1`] = `
exports[`should render correctly: is removed rule 1`] = `
<div
- className="issue-message break-word"
+ className="display-inline-flex-center issue-message break-word"
>
<span
className="spacer-right"
@@ -123,7 +123,7 @@ exports[`should render correctly: is removed rule 1`] = `
exports[`should render correctly: with engine info 1`] = `
<div
- className="issue-message break-word"
+ className="display-inline-flex-center issue-message break-word"
>
<span
className="spacer-right"
@@ -151,7 +151,7 @@ exports[`should render correctly: with engine info 1`] = `
exports[`should render correctly: with engine name 1`] = `
<div
- className="issue-message break-word"
+ className="display-inline-flex-center issue-message break-word"
>
<span
className="spacer-right"
@@ -176,3 +176,47 @@ exports[`should render correctly: with engine name 1`] = `
</Tooltip>
</div>
`;
+
+exports[`should render correctly: with quick fix 1`] = `
+<div
+ className="display-inline-flex-center issue-message break-word"
+>
+ <span
+ className="spacer-right"
+ >
+ Reduce the number of conditional operators (4) used in the expression
+ </span>
+ <Tooltip
+ mouseLeaveDelay={0.5}
+ overlay={
+ <FormattedMessage
+ defaultMessage="issue.quick_fix_available_with_sonarlint"
+ id="issue.quick_fix_available_with_sonarlint"
+ values={
+ Object {
+ "link": <a
+ href="https://www.sonarqube.org/sonarlint/?referrer=sonarqube-quick-fix"
+ rel="noopener noreferrer"
+ target="_blank"
+ >
+ SonarLint
+ </a>,
+ }
+ }
+ />
+ }
+ >
+ <SonarLintIcon
+ className="spacer-right"
+ size={15}
+ />
+ </Tooltip>
+ <ButtonLink
+ aria-label="issue.why_this_issue.long"
+ className="issue-see-rule spacer-right text-baseline"
+ onClick={[Function]}
+ >
+ issue.why_this_issue
+ </ButtonLink>
+</div>
+`;
diff --git a/server/sonar-web/src/main/js/types/types.d.ts b/server/sonar-web/src/main/js/types/types.d.ts
index 8173bca1ff1..74ccbfd754b 100644
--- a/server/sonar-web/src/main/js/types/types.d.ts
+++ b/server/sonar-web/src/main/js/types/types.d.ts
@@ -343,6 +343,7 @@ declare namespace T {
effort?: string;
externalRuleEngine?: string;
fromExternalRule?: boolean;
+ quickFixAvailable?: boolean;
key: string;
flows: FlowLocation[][];
fromHotspot: boolean;