You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

MeasuresCardNumber.tsx 2.5KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. /*
  2. * SonarQube
  3. * Copyright (C) 2009-2024 SonarSource SA
  4. * mailto:info AT sonarsource DOT com
  5. *
  6. * This program is free software; you can redistribute it and/or
  7. * modify it under the terms of the GNU Lesser General Public
  8. * License as published by the Free Software Foundation; either
  9. * version 3 of the License, or (at your option) any later version.
  10. *
  11. * This program is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  14. * Lesser General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU Lesser General Public License
  17. * along with this program; if not, write to the Free Software Foundation,
  18. * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  19. */
  20. import { LightLabel, TextError } from 'design-system';
  21. import * as React from 'react';
  22. import { useIntl } from 'react-intl';
  23. import { To } from 'react-router-dom';
  24. import { formatMeasure } from '../../../helpers/measures';
  25. import { MetricKey, MetricType } from '../../../types/metrics';
  26. import { QualityGateStatusConditionEnhanced } from '../../../types/quality-gates';
  27. import { Status, getConditionRequiredLabel } from '../utils';
  28. import MeasuresCard, { MeasuresCardProps } from './MeasuresCard';
  29. interface Props extends MeasuresCardProps {
  30. conditions: QualityGateStatusConditionEnhanced[];
  31. label: string;
  32. url: To;
  33. value?: string;
  34. conditionMetric: MetricKey;
  35. showRequired?: boolean;
  36. }
  37. export default function MeasuresCardNumber(
  38. props: React.PropsWithChildren<Props & React.HTMLAttributes<HTMLDivElement>>,
  39. ) {
  40. const { label, value, conditions, url, conditionMetric, showRequired = false, ...rest } = props;
  41. const intl = useIntl();
  42. const condition = conditions.find((condition) => condition.metric === conditionMetric);
  43. const conditionFailed = condition?.level === Status.ERROR;
  44. return (
  45. <MeasuresCard
  46. url={url}
  47. value={formatMeasure(value, MetricType.ShortInteger)}
  48. label={label}
  49. failed={conditionFailed}
  50. {...rest}
  51. >
  52. <span className="sw-body-xs sw-mt-3">
  53. {showRequired &&
  54. condition &&
  55. (conditionFailed ? (
  56. <TextError
  57. className="sw-font-regular sw-inline"
  58. text={getConditionRequiredLabel(condition, intl, true)}
  59. />
  60. ) : (
  61. <LightLabel>{getConditionRequiredLabel(condition, intl)}</LightLabel>
  62. ))}
  63. </span>
  64. </MeasuresCard>
  65. );
  66. }