} | } | ||||
.badge-tiny-height { | .badge-tiny-height { | ||||
height: var(--tinyControlHeight); | |||||
line-height: calc(var(--tinyControlHeight) - 1px); | |||||
height: var(--tinyControlHeight) !important; | |||||
line-height: calc(var(--tinyControlHeight) - 1px) !important; | |||||
} | } | ||||
.badge-muted { | .badge-muted { |
overflow: hidden; | overflow: hidden; | ||||
} | } | ||||
.issue-message .button-link { | |||||
height: 16px; | |||||
} | |||||
.issue-rule { | .issue-rule { | ||||
vertical-align: top; | vertical-align: top; | ||||
margin-top: 2px; | margin-top: 2px; |
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | ||||
*/ | */ | ||||
.vertical-top { | .vertical-top { | ||||
vertical-align: top; | |||||
vertical-align: top !important; | |||||
} | } | ||||
.vertical-bottom { | .vertical-bottom { | ||||
vertical-align: bottom; | |||||
vertical-align: bottom !important; | |||||
} | } | ||||
.vertical-middle { | .vertical-middle { | ||||
vertical-align: middle; | |||||
vertical-align: middle !important; | |||||
} | } | ||||
.vertical-text-top { | .vertical-text-top { | ||||
vertical-align: text-top; | |||||
vertical-align: text-top !important; | |||||
} | } | ||||
.nowrap { | .nowrap { |
componentUuid: string; | componentUuid: string; | ||||
creationDate: string; | creationDate: string; | ||||
effort?: string; | effort?: string; | ||||
fromExternalRule?: boolean; | |||||
key: string; | key: string; | ||||
flows: FlowLocation[][]; | flows: FlowLocation[][]; | ||||
line?: number; | line?: number; | ||||
htmlDesc?: string; | htmlDesc?: string; | ||||
htmlNote?: string; | htmlNote?: string; | ||||
internalKey?: string; | internalKey?: string; | ||||
isExternal?: boolean; | |||||
mdDesc?: string; | mdDesc?: string; | ||||
mdNote?: string; | mdNote?: string; | ||||
remFnBaseEffort?: string; | remFnBaseEffort?: string; |
import { RuleDetails } from '../../../app/types'; | import { RuleDetails } from '../../../app/types'; | ||||
import MarkdownTips from '../../../components/common/MarkdownTips'; | import MarkdownTips from '../../../components/common/MarkdownTips'; | ||||
import { Button, ResetButtonLink } from '../../../components/ui/buttons'; | import { Button, ResetButtonLink } from '../../../components/ui/buttons'; | ||||
import { translate } from '../../../helpers/l10n'; | |||||
import { translate, translateWithParameters } from '../../../helpers/l10n'; | |||||
interface Props { | interface Props { | ||||
canWrite: boolean | undefined; | canWrite: boolean | undefined; | ||||
return ( | return ( | ||||
<div className="js-rule-description"> | <div className="js-rule-description"> | ||||
<div | |||||
className="coding-rules-detail-description rule-desc markdown" | |||||
dangerouslySetInnerHTML={{ __html: ruleDetails.htmlDesc || '' }} | |||||
/> | |||||
{ruleDetails.isExternal ? ( | |||||
<div className="coding-rules-detail-description rule-desc markdown"> | |||||
{translateWithParameters('issue.external_issue_description', ruleDetails.name)} | |||||
</div> | |||||
) : ( | |||||
<div | |||||
className="coding-rules-detail-description rule-desc markdown" | |||||
dangerouslySetInnerHTML={{ __html: ruleDetails.htmlDesc || '' }} | |||||
/> | |||||
)} | |||||
{!ruleDetails.templateKey && ( | {!ruleDetails.templateKey && ( | ||||
<div className="coding-rules-detail-description coding-rules-detail-description-extra"> | <div className="coding-rules-detail-description coding-rules-detail-description-extra"> |
<header className="page-header"> | <header className="page-header"> | ||||
<div className="pull-right"> | <div className="pull-right"> | ||||
<span className="note text-middle">{ruleDetails.key}</span> | <span className="note text-middle">{ruleDetails.key}</span> | ||||
<Link | |||||
className="coding-rules-detail-permalink link-no-underline spacer-left text-middle" | |||||
to={getRuleUrl(ruleDetails.key, this.props.organization)}> | |||||
<LinkIcon /> | |||||
</Link> | |||||
{!ruleDetails.isExternal && ( | |||||
<Link | |||||
className="coding-rules-detail-permalink link-no-underline spacer-left text-middle" | |||||
to={getRuleUrl(ruleDetails.key, this.props.organization)}> | |||||
<LinkIcon /> | |||||
</Link> | |||||
)} | |||||
{!this.props.hideSimilarRulesFilter && ( | {!this.props.hideSimilarRulesFilter && ( | ||||
<SimilarRulesFilter onFilterChange={this.props.onFilterChange} rule={ruleDetails} /> | <SimilarRulesFilter onFilterChange={this.props.onFilterChange} rule={ruleDetails} /> | ||||
)} | )} |
// @flow | // @flow | ||||
import React from 'react'; | import React from 'react'; | ||||
import PropTypes from 'prop-types'; | import PropTypes from 'prop-types'; | ||||
import { translate } from '../../../helpers/l10n'; | |||||
import Tooltip from '../../controls/Tooltip'; | |||||
import { translate, translateWithParameters } from '../../../helpers/l10n'; | |||||
export default class IssueMessage extends React.PureComponent { | export default class IssueMessage extends React.PureComponent { | ||||
/*:: props: { | /*:: props: { | ||||
engine?: string; | |||||
message: string, | message: string, | ||||
rule: string, | |||||
organization: string | |||||
organization: string, | |||||
rule: string | |||||
}; | }; | ||||
*/ | */ | ||||
aria-label={translate('issue.rule_details')} | aria-label={translate('issue.rule_details')} | ||||
onClick={this.handleClick} | onClick={this.handleClick} | ||||
/> | /> | ||||
{this.props.engine && ( | |||||
<Tooltip | |||||
overlay={translateWithParameters('issue.from_external_rule_engine', this.props.engine)}> | |||||
<div className="outline-badge badge-tiny-height spacer-left vertical-text-top"> | |||||
{this.props.engine} | |||||
</div> | |||||
</Tooltip> | |||||
)} | |||||
</div> | </div> | ||||
); | ); | ||||
} | } |
return ( | return ( | ||||
<div className="issue-row"> | <div className="issue-row"> | ||||
<IssueMessage message={issue.message} rule={issue.rule} organization={issue.organization} /> | |||||
<IssueMessage | |||||
engine={issue.externalRuleEngine} | |||||
message={issue.message} | |||||
organization={issue.organization} | |||||
rule={issue.rule} | |||||
/> | |||||
<div className="issue-row-meta"> | <div className="issue-row-meta"> | ||||
<ul className="list-inline issue-meta-list"> | <ul className="list-inline issue-meta-list"> | ||||
creationDate={issue.creationDate} | creationDate={issue.creationDate} | ||||
isOpen={props.currentPopup === 'changelog'} | isOpen={props.currentPopup === 'changelog'} | ||||
issue={issue} | issue={issue} | ||||
togglePopup={props.togglePopup} | |||||
onFail={props.onFail} | onFail={props.onFail} | ||||
togglePopup={props.togglePopup} | |||||
/> | /> | ||||
</li> | </li> | ||||
{issue.textRange != null && ( | {issue.textRange != null && ( | ||||
<SimilarIssuesFilter | <SimilarIssuesFilter | ||||
isOpen={props.currentPopup === 'similarIssues'} | isOpen={props.currentPopup === 'similarIssues'} | ||||
issue={issue} | issue={issue} | ||||
togglePopup={props.togglePopup} | |||||
onFail={props.onFail} | onFail={props.onFail} | ||||
onFilter={props.onFilter} | onFilter={props.onFilter} | ||||
togglePopup={props.togglePopup} | |||||
/> | /> | ||||
</li> | </li> | ||||
)} | )} |
componentUuid: string, | componentUuid: string, | ||||
creationDate: string, | creationDate: string, | ||||
effort?: string, | effort?: string, | ||||
externalRuleEngine?: string, | |||||
key: string, | key: string, | ||||
flows: Array<Array<FlowLocation>>, | flows: Array<Array<FlowLocation>>, | ||||
line?: number, | line?: number, |
issue.x_effort={0} effort | issue.x_effort={0} effort | ||||
issue.filter_similar_issues=Filter Similar Issues | issue.filter_similar_issues=Filter Similar Issues | ||||
issue.this_issue_involves_x_code_locations=This issue involves {0} code location(s) | issue.this_issue_involves_x_code_locations=This issue involves {0} code location(s) | ||||
issue.from_external_rule_engine=Issue detected by an external rule engine: {0} | |||||
issue.external_issue_description=This is external rule {0}. No details are available. | |||||
issues.return_to_list=Return to List | issues.return_to_list=Return to List | ||||
issues.bulk_change=All Issues ({0}) | issues.bulk_change=All Issues ({0}) | ||||
issues.bulk_change_selected=Selected Issues ({0}) | issues.bulk_change_selected=Selected Issues ({0}) |