UNPKG

@backstage-community/plugin-sonarqube

Version:
211 lines (208 loc) 7.4 kB
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