@red-hat-developer-hub/backstage-plugin-scorecard 2.7.8 → 2.7.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,12 @@
1
1
  # @red-hat-developer-hub/backstage-plugin-scorecard
2
2
 
3
+ ## 2.7.9
4
+
5
+ ### Patch Changes
6
+
7
+ - d86f9c6: Replace Material UI v4 imports with MUI v5 and scope JSS class names to prevent style collisions.
8
+ - @red-hat-developer-hub/backstage-plugin-scorecard-common@2.7.9
9
+
3
10
  ## 2.7.8
4
11
 
5
12
  ### Patch Changes
@@ -9,10 +9,11 @@ import { getStatusConfig } from '../../utils/statusUtils.esm.js';
9
9
  import '@red-hat-developer-hub/backstage-plugin-scorecard-common';
10
10
  import { resolveMetricTranslation } from '../../utils/translationUtils.esm.js';
11
11
  import PermissionRequiredState from '../Common/PermissionRequiredState.esm.js';
12
+ import { ScorecardStylesProvider } from '../ScorecardStylesProvider.esm.js';
12
13
  import { useTranslation } from '../../hooks/useTranslation.esm.js';
13
14
  import { CardLoading } from '../Common/CardLoading.esm.js';
14
15
 
15
- const EntityScorecardContent = () => {
16
+ const EntityScorecardContentInner = () => {
16
17
  const { data: scorecards, isLoading, error } = useScorecards();
17
18
  const { t } = useTranslation();
18
19
  if (isLoading) {
@@ -76,6 +77,7 @@ const EntityScorecardContent = () => {
76
77
  }
77
78
  );
78
79
  };
80
+ const EntityScorecardContent = () => /* @__PURE__ */ jsx(ScorecardStylesProvider, { children: /* @__PURE__ */ jsx(EntityScorecardContentInner, {}) });
79
81
 
80
82
  export { EntityScorecardContent };
81
83
  //# sourceMappingURL=EntityScorecardContent.esm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"EntityScorecardContent.esm.js","sources":["../../../src/components/Scorecard/EntityScorecardContent.tsx"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { MetricResult } from '@red-hat-developer-hub/backstage-plugin-scorecard-common';\nimport { ResponseErrorPanel } from '@backstage/core-components';\n\nimport Box from '@mui/material/Box';\n\nimport NoScorecardsState from '../Common/NoScorecardsState';\nimport Scorecard from './Scorecard';\nimport { useScorecards } from '../../hooks/useScorecards';\nimport { getStatusConfig, resolveMetricTranslation } from '../../utils';\nimport PermissionRequiredState from '../Common/PermissionRequiredState';\nimport { useTranslation } from '../../hooks/useTranslation';\nimport { CardLoading } from '../Common/CardLoading';\n\nexport const EntityScorecardContent = () => {\n const { data: scorecards, isLoading, error } = useScorecards();\n const { t } = useTranslation();\n\n if (isLoading) {\n return <CardLoading />;\n }\n\n if (error) {\n if (error.message?.includes('NotAllowedError')) {\n return <PermissionRequiredState />;\n }\n return <ResponseErrorPanel error={error} />;\n }\n\n if (!isLoading && scorecards?.length === 0) {\n return <NoScorecardsState />;\n }\n\n return (\n <Box\n display=\"flex\"\n flexWrap=\"wrap\"\n gap={2}\n sx={{ alignItems: 'flex-start' }}\n >\n {scorecards?.map((metric: MetricResult) => {\n // Check if metric data unavailable\n const isMetricDataError =\n metric.status === 'error' || metric.result?.value === null;\n\n // Check if threshold has an error\n const isThresholdError =\n metric.result?.thresholdResult?.status === 'error';\n\n const statusConfig = getStatusConfig({\n evaluation: metric.result?.thresholdResult?.evaluation,\n thresholdStatus: metric.result?.thresholdResult?.status,\n metricStatus: metric.status,\n thresholdRules: metric.result.thresholdResult.definition?.rules,\n });\n\n const title = resolveMetricTranslation(\n t,\n metric.id,\n 'title',\n metric.metadata.title,\n );\n const description = resolveMetricTranslation(\n t,\n metric.id,\n 'description',\n metric.metadata.description,\n );\n\n return (\n <Scorecard\n key={metric.id}\n cardTitle={title}\n description={description}\n statusColor={statusConfig.color}\n statusIcon={statusConfig.icon ?? ''}\n value={metric.result?.value}\n metricType={metric.metadata.type}\n thresholds={metric.result?.thresholdResult}\n isMetricDataError={isMetricDataError}\n metricDataError={metric?.error}\n isThresholdError={isThresholdError}\n thresholdError={metric.result?.thresholdResult?.error}\n />\n );\n })}\n </Box>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;;AA6BO,MAAM,yBAAyB,MAAM;AAC1C,EAAA,MAAM,EAAE,IAAM,EAAA,UAAA,EAAY,SAAW,EAAA,KAAA,KAAU,aAAc,EAAA;AAC7D,EAAM,MAAA,EAAE,CAAE,EAAA,GAAI,cAAe,EAAA;AAE7B,EAAA,IAAI,SAAW,EAAA;AACb,IAAA,2BAAQ,WAAY,EAAA,EAAA,CAAA;AAAA;AAGtB,EAAA,IAAI,KAAO,EAAA;AACT,IAAA,IAAI,KAAM,CAAA,OAAA,EAAS,QAAS,CAAA,iBAAiB,CAAG,EAAA;AAC9C,MAAA,2BAAQ,uBAAwB,EAAA,EAAA,CAAA;AAAA;AAElC,IAAO,uBAAA,GAAA,CAAC,sBAAmB,KAAc,EAAA,CAAA;AAAA;AAG3C,EAAA,IAAI,CAAC,SAAA,IAAa,UAAY,EAAA,MAAA,KAAW,CAAG,EAAA;AAC1C,IAAA,2BAAQ,iBAAkB,EAAA,EAAA,CAAA;AAAA;AAG5B,EACE,uBAAA,GAAA;AAAA,IAAC,GAAA;AAAA,IAAA;AAAA,MACC,OAAQ,EAAA,MAAA;AAAA,MACR,QAAS,EAAA,MAAA;AAAA,MACT,GAAK,EAAA,CAAA;AAAA,MACL,EAAA,EAAI,EAAE,UAAA,EAAY,YAAa,EAAA;AAAA,MAE9B,QAAA,EAAA,UAAA,EAAY,GAAI,CAAA,CAAC,MAAyB,KAAA;AAEzC,QAAA,MAAM,oBACJ,MAAO,CAAA,MAAA,KAAW,OAAW,IAAA,MAAA,CAAO,QAAQ,KAAU,KAAA,IAAA;AAGxD,QAAA,MAAM,gBACJ,GAAA,MAAA,CAAO,MAAQ,EAAA,eAAA,EAAiB,MAAW,KAAA,OAAA;AAE7C,QAAA,MAAM,eAAe,eAAgB,CAAA;AAAA,UACnC,UAAA,EAAY,MAAO,CAAA,MAAA,EAAQ,eAAiB,EAAA,UAAA;AAAA,UAC5C,eAAA,EAAiB,MAAO,CAAA,MAAA,EAAQ,eAAiB,EAAA,MAAA;AAAA,UACjD,cAAc,MAAO,CAAA,MAAA;AAAA,UACrB,cAAgB,EAAA,MAAA,CAAO,MAAO,CAAA,eAAA,CAAgB,UAAY,EAAA;AAAA,SAC3D,CAAA;AAED,QAAA,MAAM,KAAQ,GAAA,wBAAA;AAAA,UACZ,CAAA;AAAA,UACA,MAAO,CAAA,EAAA;AAAA,UACP,OAAA;AAAA,UACA,OAAO,QAAS,CAAA;AAAA,SAClB;AACA,QAAA,MAAM,WAAc,GAAA,wBAAA;AAAA,UAClB,CAAA;AAAA,UACA,MAAO,CAAA,EAAA;AAAA,UACP,aAAA;AAAA,UACA,OAAO,QAAS,CAAA;AAAA,SAClB;AAEA,QACE,uBAAA,GAAA;AAAA,UAAC,SAAA;AAAA,UAAA;AAAA,YAEC,SAAW,EAAA,KAAA;AAAA,YACX,WAAA;AAAA,YACA,aAAa,YAAa,CAAA,KAAA;AAAA,YAC1B,UAAA,EAAY,aAAa,IAAQ,IAAA,EAAA;AAAA,YACjC,KAAA,EAAO,OAAO,MAAQ,EAAA,KAAA;AAAA,YACtB,UAAA,EAAY,OAAO,QAAS,CAAA,IAAA;AAAA,YAC5B,UAAA,EAAY,OAAO,MAAQ,EAAA,eAAA;AAAA,YAC3B,iBAAA;AAAA,YACA,iBAAiB,MAAQ,EAAA,KAAA;AAAA,YACzB,gBAAA;AAAA,YACA,cAAA,EAAgB,MAAO,CAAA,MAAA,EAAQ,eAAiB,EAAA;AAAA,WAAA;AAAA,UAX3C,MAAO,CAAA;AAAA,SAYd;AAAA,OAEH;AAAA;AAAA,GACH;AAEJ;;;;"}
1
+ {"version":3,"file":"EntityScorecardContent.esm.js","sources":["../../../src/components/Scorecard/EntityScorecardContent.tsx"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { MetricResult } from '@red-hat-developer-hub/backstage-plugin-scorecard-common';\nimport { ResponseErrorPanel } from '@backstage/core-components';\n\nimport Box from '@mui/material/Box';\n\nimport NoScorecardsState from '../Common/NoScorecardsState';\nimport Scorecard from './Scorecard';\nimport { useScorecards } from '../../hooks/useScorecards';\nimport { getStatusConfig, resolveMetricTranslation } from '../../utils';\nimport PermissionRequiredState from '../Common/PermissionRequiredState';\nimport { ScorecardStylesProvider } from '../ScorecardStylesProvider';\nimport { useTranslation } from '../../hooks/useTranslation';\nimport { CardLoading } from '../Common/CardLoading';\n\nconst EntityScorecardContentInner = () => {\n const { data: scorecards, isLoading, error } = useScorecards();\n const { t } = useTranslation();\n\n if (isLoading) {\n return <CardLoading />;\n }\n\n if (error) {\n if (error.message?.includes('NotAllowedError')) {\n return <PermissionRequiredState />;\n }\n return <ResponseErrorPanel error={error} />;\n }\n\n if (!isLoading && scorecards?.length === 0) {\n return <NoScorecardsState />;\n }\n\n return (\n <Box\n display=\"flex\"\n flexWrap=\"wrap\"\n gap={2}\n sx={{ alignItems: 'flex-start' }}\n >\n {scorecards?.map((metric: MetricResult) => {\n // Check if metric data unavailable\n const isMetricDataError =\n metric.status === 'error' || metric.result?.value === null;\n\n // Check if threshold has an error\n const isThresholdError =\n metric.result?.thresholdResult?.status === 'error';\n\n const statusConfig = getStatusConfig({\n evaluation: metric.result?.thresholdResult?.evaluation,\n thresholdStatus: metric.result?.thresholdResult?.status,\n metricStatus: metric.status,\n thresholdRules: metric.result.thresholdResult.definition?.rules,\n });\n\n const title = resolveMetricTranslation(\n t,\n metric.id,\n 'title',\n metric.metadata.title,\n );\n const description = resolveMetricTranslation(\n t,\n metric.id,\n 'description',\n metric.metadata.description,\n );\n\n return (\n <Scorecard\n key={metric.id}\n cardTitle={title}\n description={description}\n statusColor={statusConfig.color}\n statusIcon={statusConfig.icon ?? ''}\n value={metric.result?.value}\n metricType={metric.metadata.type}\n thresholds={metric.result?.thresholdResult}\n isMetricDataError={isMetricDataError}\n metricDataError={metric?.error}\n isThresholdError={isThresholdError}\n thresholdError={metric.result?.thresholdResult?.error}\n />\n );\n })}\n </Box>\n );\n};\n\nexport const EntityScorecardContent = () => (\n <ScorecardStylesProvider>\n <EntityScorecardContentInner />\n </ScorecardStylesProvider>\n);\n"],"names":[],"mappings":";;;;;;;;;;;;;;;AA8BA,MAAM,8BAA8B,MAAM;AACxC,EAAA,MAAM,EAAE,IAAM,EAAA,UAAA,EAAY,SAAW,EAAA,KAAA,KAAU,aAAc,EAAA;AAC7D,EAAM,MAAA,EAAE,CAAE,EAAA,GAAI,cAAe,EAAA;AAE7B,EAAA,IAAI,SAAW,EAAA;AACb,IAAA,2BAAQ,WAAY,EAAA,EAAA,CAAA;AAAA;AAGtB,EAAA,IAAI,KAAO,EAAA;AACT,IAAA,IAAI,KAAM,CAAA,OAAA,EAAS,QAAS,CAAA,iBAAiB,CAAG,EAAA;AAC9C,MAAA,2BAAQ,uBAAwB,EAAA,EAAA,CAAA;AAAA;AAElC,IAAO,uBAAA,GAAA,CAAC,sBAAmB,KAAc,EAAA,CAAA;AAAA;AAG3C,EAAA,IAAI,CAAC,SAAA,IAAa,UAAY,EAAA,MAAA,KAAW,CAAG,EAAA;AAC1C,IAAA,2BAAQ,iBAAkB,EAAA,EAAA,CAAA;AAAA;AAG5B,EACE,uBAAA,GAAA;AAAA,IAAC,GAAA;AAAA,IAAA;AAAA,MACC,OAAQ,EAAA,MAAA;AAAA,MACR,QAAS,EAAA,MAAA;AAAA,MACT,GAAK,EAAA,CAAA;AAAA,MACL,EAAA,EAAI,EAAE,UAAA,EAAY,YAAa,EAAA;AAAA,MAE9B,QAAA,EAAA,UAAA,EAAY,GAAI,CAAA,CAAC,MAAyB,KAAA;AAEzC,QAAA,MAAM,oBACJ,MAAO,CAAA,MAAA,KAAW,OAAW,IAAA,MAAA,CAAO,QAAQ,KAAU,KAAA,IAAA;AAGxD,QAAA,MAAM,gBACJ,GAAA,MAAA,CAAO,MAAQ,EAAA,eAAA,EAAiB,MAAW,KAAA,OAAA;AAE7C,QAAA,MAAM,eAAe,eAAgB,CAAA;AAAA,UACnC,UAAA,EAAY,MAAO,CAAA,MAAA,EAAQ,eAAiB,EAAA,UAAA;AAAA,UAC5C,eAAA,EAAiB,MAAO,CAAA,MAAA,EAAQ,eAAiB,EAAA,MAAA;AAAA,UACjD,cAAc,MAAO,CAAA,MAAA;AAAA,UACrB,cAAgB,EAAA,MAAA,CAAO,MAAO,CAAA,eAAA,CAAgB,UAAY,EAAA;AAAA,SAC3D,CAAA;AAED,QAAA,MAAM,KAAQ,GAAA,wBAAA;AAAA,UACZ,CAAA;AAAA,UACA,MAAO,CAAA,EAAA;AAAA,UACP,OAAA;AAAA,UACA,OAAO,QAAS,CAAA;AAAA,SAClB;AACA,QAAA,MAAM,WAAc,GAAA,wBAAA;AAAA,UAClB,CAAA;AAAA,UACA,MAAO,CAAA,EAAA;AAAA,UACP,aAAA;AAAA,UACA,OAAO,QAAS,CAAA;AAAA,SAClB;AAEA,QACE,uBAAA,GAAA;AAAA,UAAC,SAAA;AAAA,UAAA;AAAA,YAEC,SAAW,EAAA,KAAA;AAAA,YACX,WAAA;AAAA,YACA,aAAa,YAAa,CAAA,KAAA;AAAA,YAC1B,UAAA,EAAY,aAAa,IAAQ,IAAA,EAAA;AAAA,YACjC,KAAA,EAAO,OAAO,MAAQ,EAAA,KAAA;AAAA,YACtB,UAAA,EAAY,OAAO,QAAS,CAAA,IAAA;AAAA,YAC5B,UAAA,EAAY,OAAO,MAAQ,EAAA,eAAA;AAAA,YAC3B,iBAAA;AAAA,YACA,iBAAiB,MAAQ,EAAA,KAAA;AAAA,YACzB,gBAAA;AAAA,YACA,cAAA,EAAgB,MAAO,CAAA,MAAA,EAAQ,eAAiB,EAAA;AAAA,WAAA;AAAA,UAX3C,MAAO,CAAA;AAAA,SAYd;AAAA,OAEH;AAAA;AAAA,GACH;AAEJ,CAAA;AAEO,MAAM,yBAAyB,sBACpC,GAAA,CAAC,uBACC,EAAA,EAAA,QAAA,kBAAA,GAAA,CAAC,+BAA4B,CAC/B,EAAA;;;;"}
@@ -7,6 +7,7 @@ import { ErrorStatePanel } from './ErrorStatePanel.esm.js';
7
7
  import { EmptyStatePanel } from './EmptyStatePanel.esm.js';
8
8
  import { useMetricDisplayLabels } from '../../hooks/useMetricDisplayLabels.esm.js';
9
9
  import { CardLoading } from '../Common/CardLoading.esm.js';
10
+ import { ScorecardStylesProvider } from '../ScorecardStylesProvider.esm.js';
10
11
  import { ScorecardQueryProvider } from '../../api/ScorecardQueryProvider.esm.js';
11
12
 
12
13
  function toSafeFiniteNumber(value) {
@@ -84,7 +85,7 @@ const ScorecardHomepageCard = ({
84
85
  data.id
85
86
  );
86
87
  };
87
- const ScorecardHomepageCardWithProvider = (props) => /* @__PURE__ */ jsx(ScorecardQueryProvider, { children: /* @__PURE__ */ jsx(ScorecardHomepageCard, { ...props }) });
88
+ const ScorecardHomepageCardWithProvider = (props) => /* @__PURE__ */ jsx(ScorecardStylesProvider, { children: /* @__PURE__ */ jsx(ScorecardQueryProvider, { children: /* @__PURE__ */ jsx(ScorecardHomepageCard, { ...props }) }) });
88
89
 
89
90
  export { ScorecardHomepageCard, ScorecardHomepageCardWithProvider };
90
91
  //# sourceMappingURL=ScorecardHomepageCard.esm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ScorecardHomepageCard.esm.js","sources":["../../../src/components/ScorecardHomepageSection/ScorecardHomepageCard.tsx"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ScorecardQueryProvider } from '../../api';\nimport { AggregatedMetricCard } from '../AggregatedMetricCards/AggregatedMetricCard';\nimport { useAggregatedScorecard } from '../../hooks/useAggregatedScorecard';\nimport { useTranslation } from '../../hooks/useTranslation';\nimport { ErrorStatePanel } from './ErrorStatePanel';\nimport { EmptyStatePanel } from './EmptyStatePanel';\nimport { Metric } from '@red-hat-developer-hub/backstage-plugin-scorecard-common';\nimport { useMetricDisplayLabels } from '../../hooks/useMetricDisplayLabels';\nimport { CardLoading } from '../Common/CardLoading';\n\n/** Coerces unknown/missing values to a finite number for safe UI math (NaN → 0). */\nfunction toSafeFiniteNumber(value: unknown): number {\n const n = Number(value ?? 0);\n return Number.isFinite(n) ? n : 0;\n}\n\nexport const ScorecardHomepageCard = ({\n metricId,\n aggregationId,\n showSubheader = true,\n showInfo = true,\n}: {\n metricId?: string;\n aggregationId?: string;\n showSubheader?: boolean;\n showInfo?: boolean;\n}) => {\n const { t } = useTranslation();\n\n // Deprecated logic to support both metricId and aggregationId. Only aggregationId will be used in the future.\n const resolvedScorecardId = aggregationId || metricId || '';\n\n const { data, isLoading, error } = useAggregatedScorecard({\n aggregationId: resolvedScorecardId,\n });\n\n const aggregatedMetricDetails = data\n ? ({\n id: resolvedScorecardId,\n title: data.metadata.title,\n description: data.metadata.description,\n } as Pick<Metric, 'id' | 'title' | 'description'>)\n : undefined;\n\n const { title, description } = useMetricDisplayLabels(\n aggregatedMetricDetails,\n );\n\n const cardDataTestId = `scorecard-homepage-card-${resolvedScorecardId}`;\n\n if (isLoading) {\n return <CardLoading dataTestId={cardDataTestId} />;\n }\n\n if (error) {\n return (\n <ErrorStatePanel\n error={error}\n showSubheader={showSubheader}\n aggregationId={resolvedScorecardId}\n cardDataTestId={cardDataTestId}\n />\n );\n }\n\n if (!data) {\n return null;\n }\n\n const result = data.result;\n const total = toSafeFiniteNumber(result.total);\n const calculationErrorCount = toSafeFiniteNumber(\n result.calculationErrorCount,\n );\n const entitiesConsidered = toSafeFiniteNumber(result.entitiesConsidered);\n const hasNoRenderableAggregation =\n total === 0 && calculationErrorCount === 0 && entitiesConsidered === 0;\n\n if (hasNoRenderableAggregation) {\n return (\n <EmptyStatePanel\n showSubheader={showSubheader}\n cardTitle={title}\n cardDescription={description}\n label={t('errors.noDataFound')}\n tooltipContent={t('errors.noDataFoundMessage')}\n dataTestId={cardDataTestId}\n />\n );\n }\n\n return (\n <AggregatedMetricCard\n key={data.id}\n showSubheader={showSubheader}\n showInfo={showInfo}\n cardTitle={title}\n description={description}\n scorecard={data}\n aggregationId={resolvedScorecardId}\n dataTestId={cardDataTestId}\n />\n );\n};\n\n/**\n * ScorecardHomepageCard wrapped with QueryClientProvider so it works\n * when rendered outside a tree that already has a provider (e.g. on the homepage).\n */\nexport const ScorecardHomepageCardWithProvider = (props: {\n metricId?: string;\n aggregationId?: string;\n showSubheader?: boolean;\n showInfo?: boolean;\n}) => (\n <ScorecardQueryProvider>\n <ScorecardHomepageCard {...props} />\n </ScorecardQueryProvider>\n);\n"],"names":[],"mappings":";;;;;;;;;;;AA2BA,SAAS,mBAAmB,KAAwB,EAAA;AAClD,EAAM,MAAA,CAAA,GAAI,MAAO,CAAA,KAAA,IAAS,CAAC,CAAA;AAC3B,EAAA,OAAO,MAAO,CAAA,QAAA,CAAS,CAAC,CAAA,GAAI,CAAI,GAAA,CAAA;AAClC;AAEO,MAAM,wBAAwB,CAAC;AAAA,EACpC,QAAA;AAAA,EACA,aAAA;AAAA,EACA,aAAgB,GAAA,IAAA;AAAA,EAChB,QAAW,GAAA;AACb,CAKM,KAAA;AACJ,EAAM,MAAA,EAAE,CAAE,EAAA,GAAI,cAAe,EAAA;AAG7B,EAAM,MAAA,mBAAA,GAAsB,iBAAiB,QAAY,IAAA,EAAA;AAEzD,EAAA,MAAM,EAAE,IAAA,EAAM,SAAW,EAAA,KAAA,KAAU,sBAAuB,CAAA;AAAA,IACxD,aAAe,EAAA;AAAA,GAChB,CAAA;AAED,EAAA,MAAM,0BAA0B,IAC3B,GAAA;AAAA,IACC,EAAI,EAAA,mBAAA;AAAA,IACJ,KAAA,EAAO,KAAK,QAAS,CAAA,KAAA;AAAA,IACrB,WAAA,EAAa,KAAK,QAAS,CAAA;AAAA,GAE7B,GAAA,MAAA;AAEJ,EAAM,MAAA,EAAE,KAAO,EAAA,WAAA,EAAgB,GAAA,sBAAA;AAAA,IAC7B;AAAA,GACF;AAEA,EAAM,MAAA,cAAA,GAAiB,2BAA2B,mBAAmB,CAAA,CAAA;AAErE,EAAA,IAAI,SAAW,EAAA;AACb,IAAO,uBAAA,GAAA,CAAC,WAAY,EAAA,EAAA,UAAA,EAAY,cAAgB,EAAA,CAAA;AAAA;AAGlD,EAAA,IAAI,KAAO,EAAA;AACT,IACE,uBAAA,GAAA;AAAA,MAAC,eAAA;AAAA,MAAA;AAAA,QACC,KAAA;AAAA,QACA,aAAA;AAAA,QACA,aAAe,EAAA,mBAAA;AAAA,QACf;AAAA;AAAA,KACF;AAAA;AAIJ,EAAA,IAAI,CAAC,IAAM,EAAA;AACT,IAAO,OAAA,IAAA;AAAA;AAGT,EAAA,MAAM,SAAS,IAAK,CAAA,MAAA;AACpB,EAAM,MAAA,KAAA,GAAQ,kBAAmB,CAAA,MAAA,CAAO,KAAK,CAAA;AAC7C,EAAA,MAAM,qBAAwB,GAAA,kBAAA;AAAA,IAC5B,MAAO,CAAA;AAAA,GACT;AACA,EAAM,MAAA,kBAAA,GAAqB,kBAAmB,CAAA,MAAA,CAAO,kBAAkB,CAAA;AACvE,EAAA,MAAM,0BACJ,GAAA,KAAA,KAAU,CAAK,IAAA,qBAAA,KAA0B,KAAK,kBAAuB,KAAA,CAAA;AAEvE,EAAA,IAAI,0BAA4B,EAAA;AAC9B,IACE,uBAAA,GAAA;AAAA,MAAC,eAAA;AAAA,MAAA;AAAA,QACC,aAAA;AAAA,QACA,SAAW,EAAA,KAAA;AAAA,QACX,eAAiB,EAAA,WAAA;AAAA,QACjB,KAAA,EAAO,EAAE,oBAAoB,CAAA;AAAA,QAC7B,cAAA,EAAgB,EAAE,2BAA2B,CAAA;AAAA,QAC7C,UAAY,EAAA;AAAA;AAAA,KACd;AAAA;AAIJ,EACE,uBAAA,GAAA;AAAA,IAAC,oBAAA;AAAA,IAAA;AAAA,MAEC,aAAA;AAAA,MACA,QAAA;AAAA,MACA,SAAW,EAAA,KAAA;AAAA,MACX,WAAA;AAAA,MACA,SAAW,EAAA,IAAA;AAAA,MACX,aAAe,EAAA,mBAAA;AAAA,MACf,UAAY,EAAA;AAAA,KAAA;AAAA,IAPP,IAAK,CAAA;AAAA,GAQZ;AAEJ;AAMa,MAAA,iCAAA,GAAoC,CAAC,KAMhD,qBAAA,GAAA,CAAC,0BACC,QAAC,kBAAA,GAAA,CAAA,qBAAA,EAAA,EAAuB,GAAG,KAAA,EAAO,CACpC,EAAA;;;;"}
1
+ {"version":3,"file":"ScorecardHomepageCard.esm.js","sources":["../../../src/components/ScorecardHomepageSection/ScorecardHomepageCard.tsx"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ScorecardQueryProvider } from '../../api';\nimport { AggregatedMetricCard } from '../AggregatedMetricCards/AggregatedMetricCard';\nimport { useAggregatedScorecard } from '../../hooks/useAggregatedScorecard';\nimport { useTranslation } from '../../hooks/useTranslation';\nimport { ErrorStatePanel } from './ErrorStatePanel';\nimport { EmptyStatePanel } from './EmptyStatePanel';\nimport { Metric } from '@red-hat-developer-hub/backstage-plugin-scorecard-common';\nimport { useMetricDisplayLabels } from '../../hooks/useMetricDisplayLabels';\nimport { CardLoading } from '../Common/CardLoading';\nimport { ScorecardStylesProvider } from '../ScorecardStylesProvider';\n\n/** Coerces unknown/missing values to a finite number for safe UI math (NaN → 0). */\nfunction toSafeFiniteNumber(value: unknown): number {\n const n = Number(value ?? 0);\n return Number.isFinite(n) ? n : 0;\n}\n\nexport const ScorecardHomepageCard = ({\n metricId,\n aggregationId,\n showSubheader = true,\n showInfo = true,\n}: {\n metricId?: string;\n aggregationId?: string;\n showSubheader?: boolean;\n showInfo?: boolean;\n}) => {\n const { t } = useTranslation();\n\n // Deprecated logic to support both metricId and aggregationId. Only aggregationId will be used in the future.\n const resolvedScorecardId = aggregationId || metricId || '';\n\n const { data, isLoading, error } = useAggregatedScorecard({\n aggregationId: resolvedScorecardId,\n });\n\n const aggregatedMetricDetails = data\n ? ({\n id: resolvedScorecardId,\n title: data.metadata.title,\n description: data.metadata.description,\n } as Pick<Metric, 'id' | 'title' | 'description'>)\n : undefined;\n\n const { title, description } = useMetricDisplayLabels(\n aggregatedMetricDetails,\n );\n\n const cardDataTestId = `scorecard-homepage-card-${resolvedScorecardId}`;\n\n if (isLoading) {\n return <CardLoading dataTestId={cardDataTestId} />;\n }\n\n if (error) {\n return (\n <ErrorStatePanel\n error={error}\n showSubheader={showSubheader}\n aggregationId={resolvedScorecardId}\n cardDataTestId={cardDataTestId}\n />\n );\n }\n\n if (!data) {\n return null;\n }\n\n const result = data.result;\n const total = toSafeFiniteNumber(result.total);\n const calculationErrorCount = toSafeFiniteNumber(\n result.calculationErrorCount,\n );\n const entitiesConsidered = toSafeFiniteNumber(result.entitiesConsidered);\n const hasNoRenderableAggregation =\n total === 0 && calculationErrorCount === 0 && entitiesConsidered === 0;\n\n if (hasNoRenderableAggregation) {\n return (\n <EmptyStatePanel\n showSubheader={showSubheader}\n cardTitle={title}\n cardDescription={description}\n label={t('errors.noDataFound')}\n tooltipContent={t('errors.noDataFoundMessage')}\n dataTestId={cardDataTestId}\n />\n );\n }\n\n return (\n <AggregatedMetricCard\n key={data.id}\n showSubheader={showSubheader}\n showInfo={showInfo}\n cardTitle={title}\n description={description}\n scorecard={data}\n aggregationId={resolvedScorecardId}\n dataTestId={cardDataTestId}\n />\n );\n};\n\n/**\n * ScorecardHomepageCard wrapped with QueryClientProvider so it works\n * when rendered outside a tree that already has a provider (e.g. on the homepage).\n */\nexport const ScorecardHomepageCardWithProvider = (props: {\n metricId?: string;\n aggregationId?: string;\n showSubheader?: boolean;\n showInfo?: boolean;\n}) => (\n <ScorecardStylesProvider>\n <ScorecardQueryProvider>\n <ScorecardHomepageCard {...props} />\n </ScorecardQueryProvider>\n </ScorecardStylesProvider>\n);\n"],"names":[],"mappings":"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"}
@@ -7,6 +7,7 @@ import Divider from '@mui/material/Divider';
7
7
  import '../../api/index.esm.js';
8
8
  import { ScorecardHomepageCard } from '../ScorecardHomepageSection/ScorecardHomepageCard.esm.js';
9
9
  import NotFoundState from '../Common/NotFoundState.esm.js';
10
+ import { ScorecardStylesProvider } from '../ScorecardStylesProvider.esm.js';
10
11
  import { useTranslation } from '../../hooks/useTranslation.esm.js';
11
12
  import { resolveMetricTranslation } from '../../utils/translationUtils.esm.js';
12
13
  import { ScorecardPageHeader } from './ScorecardPageHeader.esm.js';
@@ -87,7 +88,7 @@ const ScorecardPage = () => {
87
88
  ) })
88
89
  ] });
89
90
  };
90
- const ScorecardPageWithProvider = () => /* @__PURE__ */ jsx(ScorecardQueryProvider, { children: /* @__PURE__ */ jsx(ScorecardPage, {}) });
91
+ const ScorecardPageWithProvider = () => /* @__PURE__ */ jsx(ScorecardStylesProvider, { children: /* @__PURE__ */ jsx(ScorecardQueryProvider, { children: /* @__PURE__ */ jsx(ScorecardPage, {}) }) });
91
92
 
92
93
  export { ScorecardPage, ScorecardPageWithProvider };
93
94
  //# sourceMappingURL=ScorecardPage.esm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ScorecardPage.esm.js","sources":["../../../src/components/ScorecardPage/ScorecardPage.tsx"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { useState } from 'react';\nimport { useParams } from 'react-router-dom';\n\nimport { Content, Page } from '@backstage/core-components';\n\nimport Box from '@mui/material/Box';\nimport Divider from '@mui/material/Divider';\n\nimport { ScorecardQueryProvider } from '../../api';\nimport { ScorecardHomepageCard } from '../ScorecardHomepageSection/ScorecardHomepageCard';\nimport NotFoundState from '../Common/NotFoundState';\nimport { useTranslation } from '../../hooks/useTranslation';\nimport { resolveMetricTranslation } from '../../utils/translationUtils';\n\nimport { ScorecardPageHeader } from './ScorecardPageHeader';\nimport { EntitiesTable } from './EntitiesTable/EntitiesTable';\n\nexport const ScorecardPage = () => {\n const { aggregationId = '', metricId = '' } = useParams<{\n aggregationId: string;\n metricId: string;\n }>();\n\n // TODO: Remove metricId once we deprecate it. We need to keep it for backward compatibility.\n const resolvedMetricId = aggregationId || metricId || '';\n\n const [metricTitle, setMetricTitle] = useState<string>('');\n const [metricNotFound, setMetricNotFound] = useState<boolean>(false);\n\n const { t } = useTranslation();\n\n const finalTitle =\n resolveMetricTranslation(t, resolvedMetricId, 'title', metricTitle) ||\n metricTitle;\n\n if (metricNotFound) {\n return (\n <Page themeId=\"home\">\n <Content>\n <NotFoundState />\n </Content>\n </Page>\n );\n }\n\n return (\n <Page themeId=\"home\">\n <ScorecardPageHeader\n title={\n finalTitle ||\n metricId ||\n aggregationId ||\n t('entitiesPage.unknownMetric')\n }\n />\n <Divider />\n <Content>\n <Box\n sx={{\n display: 'flex',\n alignItems: 'flex-start',\n flexWrap: 'wrap',\n gap: 3,\n py: 2,\n }}\n >\n <Box sx={{ flex: { xs: '1 1 100%', lg: '1 1 0%' }, minWidth: 0 }}>\n <EntitiesTable\n metricId={metricId}\n aggregationId={aggregationId}\n setMetricTitle={setMetricTitle}\n setMetricNotFound={setMetricNotFound}\n />\n </Box>\n <Box\n sx={{\n flex: { xs: '1 1 100%', lg: '0 0 33%' },\n minWidth: 0,\n alignSelf: 'flex-start',\n height: { xs: 320, sm: 380 },\n '& > *': { height: '100%' },\n '& > div[class*=\"MuiCard-root\"]': {\n height: '100%',\n overflow: 'hidden',\n display: 'flex',\n flexDirection: 'column',\n },\n '& div[class*=\"MuiCardContent-root\"]': {\n flex: 1,\n minHeight: 0,\n },\n }}\n >\n <ScorecardHomepageCard\n aggregationId={aggregationId}\n metricId={metricId}\n showSubheader={false}\n showInfo={false}\n />\n </Box>\n </Box>\n </Content>\n </Page>\n );\n};\n\n/**\n * ScorecardPage wrapped with QueryClientProvider so it works\n * when rendered outside a tree that already has a provider (e.g. on the homepage).\n */\nexport const ScorecardPageWithProvider = () => (\n <ScorecardQueryProvider>\n <ScorecardPage />\n </ScorecardQueryProvider>\n);\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ScorecardPage.esm.js","sources":["../../../src/components/ScorecardPage/ScorecardPage.tsx"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { useState } from 'react';\nimport { useParams } from 'react-router-dom';\n\nimport { Content, Page } from '@backstage/core-components';\n\nimport Box from '@mui/material/Box';\nimport Divider from '@mui/material/Divider';\n\nimport { ScorecardQueryProvider } from '../../api';\nimport { ScorecardHomepageCard } from '../ScorecardHomepageSection/ScorecardHomepageCard';\nimport NotFoundState from '../Common/NotFoundState';\nimport { ScorecardStylesProvider } from '../ScorecardStylesProvider';\nimport { useTranslation } from '../../hooks/useTranslation';\nimport { resolveMetricTranslation } from '../../utils/translationUtils';\n\nimport { ScorecardPageHeader } from './ScorecardPageHeader';\nimport { EntitiesTable } from './EntitiesTable/EntitiesTable';\n\nexport const ScorecardPage = () => {\n const { aggregationId = '', metricId = '' } = useParams<{\n aggregationId: string;\n metricId: string;\n }>();\n\n // TODO: Remove metricId once we deprecate it. We need to keep it for backward compatibility.\n const resolvedMetricId = aggregationId || metricId || '';\n\n const [metricTitle, setMetricTitle] = useState<string>('');\n const [metricNotFound, setMetricNotFound] = useState<boolean>(false);\n\n const { t } = useTranslation();\n\n const finalTitle =\n resolveMetricTranslation(t, resolvedMetricId, 'title', metricTitle) ||\n metricTitle;\n\n if (metricNotFound) {\n return (\n <Page themeId=\"home\">\n <Content>\n <NotFoundState />\n </Content>\n </Page>\n );\n }\n\n return (\n <Page themeId=\"home\">\n <ScorecardPageHeader\n title={\n finalTitle ||\n metricId ||\n aggregationId ||\n t('entitiesPage.unknownMetric')\n }\n />\n <Divider />\n <Content>\n <Box\n sx={{\n display: 'flex',\n alignItems: 'flex-start',\n flexWrap: 'wrap',\n gap: 3,\n py: 2,\n }}\n >\n <Box sx={{ flex: { xs: '1 1 100%', lg: '1 1 0%' }, minWidth: 0 }}>\n <EntitiesTable\n metricId={metricId}\n aggregationId={aggregationId}\n setMetricTitle={setMetricTitle}\n setMetricNotFound={setMetricNotFound}\n />\n </Box>\n <Box\n sx={{\n flex: { xs: '1 1 100%', lg: '0 0 33%' },\n minWidth: 0,\n alignSelf: 'flex-start',\n height: { xs: 320, sm: 380 },\n '& > *': { height: '100%' },\n '& > div[class*=\"MuiCard-root\"]': {\n height: '100%',\n overflow: 'hidden',\n display: 'flex',\n flexDirection: 'column',\n },\n '& div[class*=\"MuiCardContent-root\"]': {\n flex: 1,\n minHeight: 0,\n },\n }}\n >\n <ScorecardHomepageCard\n aggregationId={aggregationId}\n metricId={metricId}\n showSubheader={false}\n showInfo={false}\n />\n </Box>\n </Box>\n </Content>\n </Page>\n );\n};\n\n/**\n * ScorecardPage wrapped with QueryClientProvider so it works\n * when rendered outside a tree that already has a provider (e.g. on the homepage).\n */\nexport const ScorecardPageWithProvider = () => (\n <ScorecardStylesProvider>\n <ScorecardQueryProvider>\n <ScorecardPage />\n </ScorecardQueryProvider>\n </ScorecardStylesProvider>\n);\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { StylesProvider, createGenerateClassName } from '@mui/styles';
3
+
4
+ const generateClassName = createGenerateClassName({
5
+ seed: "scorecard"
6
+ });
7
+ const ScorecardStylesProvider = ({
8
+ children
9
+ }) => /* @__PURE__ */ jsx(StylesProvider, { generateClassName, children });
10
+
11
+ export { ScorecardStylesProvider };
12
+ //# sourceMappingURL=ScorecardStylesProvider.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ScorecardStylesProvider.esm.js","sources":["../../src/components/ScorecardStylesProvider.tsx"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { ReactNode } from 'react';\n\nimport { createGenerateClassName, StylesProvider } from '@mui/styles';\n\nconst generateClassName = createGenerateClassName({\n seed: 'scorecard',\n});\n\nexport const ScorecardStylesProvider = ({\n children,\n}: {\n readonly children: ReactNode;\n}) => (\n <StylesProvider generateClassName={generateClassName}>\n {children}\n </StylesProvider>\n);\n"],"names":[],"mappings":";;;AAoBA,MAAM,oBAAoB,uBAAwB,CAAA;AAAA,EAChD,IAAM,EAAA;AACR,CAAC,CAAA;AAEM,MAAM,0BAA0B,CAAC;AAAA,EACtC;AACF,CAGE,qBAAA,GAAA,CAAC,cAAe,EAAA,EAAA,iBAAA,EACb,QACH,EAAA;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@red-hat-developer-hub/backstage-plugin-scorecard",
3
- "version": "2.7.8",
3
+ "version": "2.7.9",
4
4
  "license": "Apache-2.0",
5
5
  "main": "./dist/index.esm.js",
6
6
  "types": "./dist/index.d.ts",
@@ -75,7 +75,8 @@
75
75
  "@backstage/theme": "^0.7.2",
76
76
  "@mui/icons-material": "5.18.0",
77
77
  "@mui/material": "5.18.0",
78
- "@red-hat-developer-hub/backstage-plugin-scorecard-common": "^2.7.8",
78
+ "@mui/styles": "5.18.0",
79
+ "@red-hat-developer-hub/backstage-plugin-scorecard-common": "^2.7.9",
79
80
  "@tanstack/react-query": "^5.95.2",
80
81
  "date-fns": "^4.1.0",
81
82
  "react-use": "^17.2.4",