diff options
author | Mathieu Suen <mathieu.suen@sonarsource.com> | 2021-10-06 11:33:14 +0200 |
---|---|---|
committer | sonartech <sonartech@sonarsource.com> | 2021-10-13 20:03:34 +0000 |
commit | ae8cda9b5442652dfff87819ac45fc3dd03eb36d (patch) | |
tree | 27a2dc853d5b0d482fe6ff738dd76f1c9babe45d /server/sonar-web | |
parent | 0449514911251f3c841b60924522c92ca4b7aea7 (diff) | |
download | sonarqube-ae8cda9b5442652dfff87819ac45fc3dd03eb36d.tar.gz sonarqube-ae8cda9b5442652dfff87819ac45fc3dd03eb36d.zip |
SONAR-15473 Add SonarLint promotion for quick fix on issue
Diffstat (limited to 'server/sonar-web')
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; |