@backstage-community/plugin-sonarqube
Version:
211 lines (208 loc) • 7.4 kB
JavaScript
import { jsx, jsxs } from 'react/jsx-runtime';
import { useMemo } from 'react';
import Chip from '@material-ui/core/Chip';
import { makeStyles } from '@material-ui/core/styles';
import { defaultDuplicationRatings } from '../SonarQubeTable/types.esm.js';
import BugReport from '@material-ui/icons/BugReport';
import Lock from '@material-ui/icons/Lock';
import Typography from '@material-ui/core/Typography';
import LockOpen from '@material-ui/icons/LockOpen';
import SentimentVeryDissatisfied from '@material-ui/icons/SentimentVeryDissatisfied';
import SentimentVerySatisfied from '@material-ui/icons/SentimentVerySatisfied';
import Security from '@material-ui/icons/Security';
import { DateTime } from 'luxon';
import { Percentage } from './Percentage.esm.js';
import { Rating } from './Rating.esm.js';
import { RatingCard } from './RatingCard.esm.js';
import { Value } from './Value.esm.js';
import { useTranslationRef } from '@backstage/frontend-plugin-api';
import { sonarqubeTranslationRef } from '../../translation.esm.js';
import Tooltip from '@material-ui/core/Tooltip';
import LinkIcon from '@material-ui/icons/Link';
const useStyles = makeStyles((theme) => ({
badgeLabel: {
color: theme.palette.common.white
},
badgeCompact: {
margin: 0,
height: 28
},
badgeError: {
backgroundColor: theme.palette.error.main
},
badgeSuccess: {
backgroundColor: theme.palette.success.main
},
badgeUnknown: {
backgroundColor: theme.palette.grey[500]
}
}));
const QualityBadge = (props) => {
const classes = useStyles();
const { t } = useTranslationRef(sonarqubeTranslationRef);
const { value } = props;
let gateLabel = t("sonarQubeCard.qualityBadgeLabel.notComputed");
let gateColor = classes.badgeUnknown;
let gateLinkToolTip = "";
if (value?.metrics.alert_status) {
const gatePassed = value?.metrics.alert_status === "OK";
gateLabel = gatePassed ? t("sonarQubeCard.qualityBadgeLabel.gatePassed") : t("sonarQubeCard.qualityBadgeLabel.gateFailed");
gateColor = gatePassed ? classes.badgeSuccess : classes.badgeError;
}
let clickableAttrs = {};
if (value.projectUrl) {
gateLinkToolTip = t("sonarQubeCard.qualityBadgeTooltip");
clickableAttrs = {
component: "a",
href: value.projectUrl,
clickable: true
};
}
const qualityBadge = /* @__PURE__ */ jsx(Tooltip, { title: gateLinkToolTip, children: /* @__PURE__ */ jsx(
Chip,
{
label: gateLabel,
...clickableAttrs,
className: props.compact ? classes.badgeCompact : "",
classes: { root: gateColor, label: classes.badgeLabel },
icon: value.projectUrl ? /* @__PURE__ */ jsx(LinkIcon, {}) : void 0
}
) });
return qualityBadge;
};
const BugReportRatingCard = (props) => {
const { value, title } = props;
return /* @__PURE__ */ jsx(
RatingCard,
{
compact: props.compact,
titleIcon: /* @__PURE__ */ jsx(BugReport, {}),
title,
link: value.getIssuesUrl("BUG"),
leftSlot: /* @__PURE__ */ jsx(Value, { value: value.metrics.bugs, compact: props.compact }),
rightSlot: /* @__PURE__ */ jsx(Rating, { rating: value.metrics.reliability_rating })
}
);
};
const VulnerabilitiesRatingCard = (props) => {
const { value, title } = props;
return /* @__PURE__ */ jsx(
RatingCard,
{
compact: props.compact,
titleIcon: value.metrics.vulnerabilities === "0" ? /* @__PURE__ */ jsx(Lock, {}) : /* @__PURE__ */ jsx(LockOpen, {}),
title,
link: value.getIssuesUrl("VULNERABILITY"),
leftSlot: /* @__PURE__ */ jsx(Value, { value: value.metrics.vulnerabilities, compact: props.compact }),
rightSlot: /* @__PURE__ */ jsx(Rating, { rating: value.metrics.security_rating })
}
);
};
const CodeSmellsRatingCard = (props) => {
const { value, title } = props;
return /* @__PURE__ */ jsx(
RatingCard,
{
compact: props.compact,
titleIcon: value.metrics.code_smells === "0" ? /* @__PURE__ */ jsx(SentimentVerySatisfied, {}) : /* @__PURE__ */ jsx(SentimentVeryDissatisfied, {}),
title,
link: value.getIssuesUrl("CODE_SMELL"),
leftSlot: /* @__PURE__ */ jsx(Value, { value: value.metrics.code_smells, compact: props.compact }),
rightSlot: /* @__PURE__ */ jsx(Rating, { rating: value.metrics.sqale_rating })
}
);
};
const HotspotsReviewed = (props) => {
const { value, title } = props;
return value.metrics.security_review_rating && /* @__PURE__ */ jsx(
RatingCard,
{
compact: props.compact,
titleIcon: /* @__PURE__ */ jsx(Security, {}),
title,
link: value.getSecurityHotspotsUrl(),
leftSlot: /* @__PURE__ */ jsx(
Value,
{
value: value.metrics.security_hotspots_reviewed ? `${value.metrics.security_hotspots_reviewed}%` : "\u2014",
compact: props.compact
}
),
rightSlot: /* @__PURE__ */ jsx(Rating, { rating: value.metrics.security_review_rating })
}
);
};
const CoverageRatingCard = (props) => {
const { value, title } = props;
return /* @__PURE__ */ jsx(
RatingCard,
{
compact: props.compact,
link: value.getComponentMeasuresUrl("COVERAGE"),
title,
leftSlot: /* @__PURE__ */ jsx(Percentage, { value: value.metrics.coverage }),
rightSlot: /* @__PURE__ */ jsx(
Value,
{
value: value.metrics.coverage ? `${value.metrics.coverage}%` : "\u2014",
compact: props.compact
}
)
}
);
};
const DuplicationsRatingCard = (props) => {
const { value, title } = props;
const duplicationRating = useMemo(() => {
if (!value || !value.metrics.duplicated_lines_density) {
return "";
}
let rating = "";
for (const r of defaultDuplicationRatings) {
if (+value.metrics.duplicated_lines_density >= r.greaterThan) {
rating = r.rating;
}
}
return rating;
}, [value]);
return /* @__PURE__ */ jsx(
RatingCard,
{
compact: props.compact,
title,
link: value.getComponentMeasuresUrl("DUPLICATED_LINES_DENSITY"),
leftSlot: /* @__PURE__ */ jsx(Rating, { rating: duplicationRating, hideValue: true }),
rightSlot: /* @__PURE__ */ jsx(
Value,
{
value: `${value.metrics.duplicated_lines_density}%`,
compact: props.compact
}
)
}
);
};
const LastAnalyzedRatingCard = (props) => {
const { value } = props;
return /* @__PURE__ */ jsx(
"div",
{
title: DateTime.fromISO(value.lastAnalysis).toLocaleString(
DateTime.DATETIME_MED
),
children: DateTime.fromISO(value.lastAnalysis).toRelative()
}
);
};
const NoSonarQubeCard = (props) => {
const { value, sonarQubeComponentKey } = props;
const { t } = useTranslationRef(sonarqubeTranslationRef);
return /* @__PURE__ */ jsxs(Typography, { color: "textSecondary", variant: "subtitle2", children: [
value?.isSonarQubeAnnotationEnabled && t("sonarQubeCard.noSonarQubeError.hasAnnotation", {
project: sonarQubeComponentKey || ""
}),
!value?.isSonarQubeAnnotationEnabled && t("sonarQubeCard.noSonarQubeError.noAnnotation")
] });
};
export { BugReportRatingCard, CodeSmellsRatingCard, CoverageRatingCard, DuplicationsRatingCard, HotspotsReviewed, LastAnalyzedRatingCard, NoSonarQubeCard, QualityBadge, VulnerabilitiesRatingCard };
//# sourceMappingURL=MetricInsights.esm.js.map