}
.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 {
overflow: hidden;
}
+.issue-message .button-link {
+ height: 16px;
+}
+
.issue-rule {
vertical-align: top;
margin-top: 2px;
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
.vertical-top {
- vertical-align: top;
+ vertical-align: top !important;
}
.vertical-bottom {
- vertical-align: bottom;
+ vertical-align: bottom !important;
}
.vertical-middle {
- vertical-align: middle;
+ vertical-align: middle !important;
}
.vertical-text-top {
- vertical-align: text-top;
+ vertical-align: text-top !important;
}
.nowrap {
componentUuid: string;
creationDate: string;
effort?: string;
+ fromExternalRule?: boolean;
key: string;
flows: FlowLocation[][];
line?: number;
htmlDesc?: string;
htmlNote?: string;
internalKey?: string;
+ isExternal?: boolean;
mdDesc?: string;
mdNote?: string;
remFnBaseEffort?: string;
import { RuleDetails } from '../../../app/types';
import MarkdownTips from '../../../components/common/MarkdownTips';
import { Button, ResetButtonLink } from '../../../components/ui/buttons';
-import { translate } from '../../../helpers/l10n';
+import { translate, translateWithParameters } from '../../../helpers/l10n';
interface Props {
canWrite: boolean | undefined;
return (
<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 && (
<div className="coding-rules-detail-description coding-rules-detail-description-extra">
<header className="page-header">
<div className="pull-right">
<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 && (
<SimilarRulesFilter onFilterChange={this.props.onFilterChange} rule={ruleDetails} />
)}
// @flow
import React from 'react';
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 {
/*:: props: {
+ engine?: string;
message: string,
- rule: string,
- organization: string
+ organization: string,
+ rule: string
};
*/
aria-label={translate('issue.rule_details')}
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>
);
}
return (
<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">
<ul className="list-inline issue-meta-list">
creationDate={issue.creationDate}
isOpen={props.currentPopup === 'changelog'}
issue={issue}
- togglePopup={props.togglePopup}
onFail={props.onFail}
+ togglePopup={props.togglePopup}
/>
</li>
{issue.textRange != null && (
<SimilarIssuesFilter
isOpen={props.currentPopup === 'similarIssues'}
issue={issue}
- togglePopup={props.togglePopup}
onFail={props.onFail}
onFilter={props.onFilter}
+ togglePopup={props.togglePopup}
/>
</li>
)}
componentUuid: string,
creationDate: string,
effort?: string,
+ externalRuleEngine?: string,
key: string,
flows: Array<Array<FlowLocation>>,
line?: number,
issue.x_effort={0} effort
issue.filter_similar_issues=Filter Similar Issues
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.bulk_change=All Issues ({0})
issues.bulk_change_selected=Selected Issues ({0})