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

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.
Files changed (102) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/dist/alpha/blueprints/ScorecardLayoutBlueprint.esm.js +40 -0
  3. package/dist/alpha/blueprints/ScorecardLayoutBlueprint.esm.js.map +1 -0
  4. package/dist/alpha/extensions/api.esm.js.map +1 -1
  5. package/dist/alpha/extensions/entityTab.esm.js +18 -1
  6. package/dist/alpha/extensions/entityTab.esm.js.map +1 -1
  7. package/dist/alpha/extensions/homePageCards.esm.js.map +1 -1
  8. package/dist/alpha/extensions/scorecardLayoutExtensions.esm.js +21 -0
  9. package/dist/alpha/extensions/scorecardLayoutExtensions.esm.js.map +1 -0
  10. package/dist/alpha/extensions/scorecardPage.esm.js.map +1 -1
  11. package/dist/alpha.d.ts +8 -4
  12. package/dist/alpha.esm.js +6 -1
  13. package/dist/alpha.esm.js.map +1 -1
  14. package/dist/api/ScorecardQueryProvider.esm.js.map +1 -1
  15. package/dist/api/index.esm.js.map +1 -1
  16. package/dist/components/AggregatedMetricCards/AggregatedMetricCard.esm.js.map +1 -1
  17. package/dist/components/AggregatedMetricCards/AverageCard/AverageCardComponent.esm.js.map +1 -1
  18. package/dist/components/AggregatedMetricCards/AverageCard/AverageCardPieCenterLabel.esm.js.map +1 -1
  19. package/dist/components/AggregatedMetricCards/AverageCard/DonutChartTooltipContent.esm.js.map +1 -1
  20. package/dist/components/AggregatedMetricCards/AverageCard/TooltipContent.esm.js.map +1 -1
  21. package/dist/components/AggregatedMetricCards/StatusGroupedCard/StatusGroupedCardComponent.esm.js.map +1 -1
  22. package/dist/components/AggregatedMetricCards/UnsupportedAggregationType.esm.js.map +1 -1
  23. package/dist/components/AggregatedMetricCards/components/CardChartContainer.esm.js.map +1 -1
  24. package/dist/components/AggregatedMetricCards/components/CardInfoButton.esm.js.map +1 -1
  25. package/dist/components/AggregatedMetricCards/components/CardLegendContent.esm.js.map +1 -1
  26. package/dist/components/AggregatedMetricCards/components/CardPieTooltipContent.esm.js.map +1 -1
  27. package/dist/components/AggregatedMetricCards/components/CardSubheader.esm.js.map +1 -1
  28. package/dist/components/AggregatedMetricCards/components/CardTooltip.esm.js.map +1 -1
  29. package/dist/components/Common/CardLoading.esm.js.map +1 -1
  30. package/dist/components/Common/CardWrapper.esm.js.map +1 -1
  31. package/dist/components/Common/ErrorTooltip.esm.js.map +1 -1
  32. package/dist/components/Common/NoScorecardsState.esm.js.map +1 -1
  33. package/dist/components/Common/NotFoundState.esm.js.map +1 -1
  34. package/dist/components/Common/PermissionRequiredState.esm.js.map +1 -1
  35. package/dist/components/Scorecard/CustomLegend.esm.js.map +1 -1
  36. package/dist/components/Scorecard/EntityScorecardContent.esm.js +6 -4
  37. package/dist/components/Scorecard/EntityScorecardContent.esm.js.map +1 -1
  38. package/dist/components/Scorecard/Scorecard.esm.js.map +1 -1
  39. package/dist/components/Scorecard/ScorecardEntityContentGridView.esm.js +190 -0
  40. package/dist/components/Scorecard/ScorecardEntityContentGridView.esm.js.map +1 -0
  41. package/dist/components/Scorecard/ScorecardLayoutSwitcher.esm.js +46 -0
  42. package/dist/components/Scorecard/ScorecardLayoutSwitcher.esm.js.map +1 -0
  43. package/dist/components/Scorecard/index.esm.js +7 -1
  44. package/dist/components/Scorecard/index.esm.js.map +1 -1
  45. package/dist/components/ScorecardHomepageSection/CustomLegend.esm.js.map +1 -1
  46. package/dist/components/ScorecardHomepageSection/CustomTooltip.esm.js.map +1 -1
  47. package/dist/components/ScorecardHomepageSection/EmptyStatePanel.esm.js.map +1 -1
  48. package/dist/components/ScorecardHomepageSection/ErrorStatePanel.esm.js.map +1 -1
  49. package/dist/components/ScorecardHomepageSection/ResponsivePieChart.esm.js.map +1 -1
  50. package/dist/components/ScorecardHomepageSection/ScorecardHomepageCard.esm.js +2 -1
  51. package/dist/components/ScorecardHomepageSection/ScorecardHomepageCard.esm.js.map +1 -1
  52. package/dist/components/ScorecardHomepageSection/index.esm.js +6 -1
  53. package/dist/components/ScorecardHomepageSection/index.esm.js.map +1 -1
  54. package/dist/components/ScorecardIcon/ScorecardIcon.esm.js.map +1 -1
  55. package/dist/components/ScorecardPage/EntitiesTable/EntitiesRow.esm.js.map +1 -1
  56. package/dist/components/ScorecardPage/EntitiesTable/EntitiesTable.esm.js.map +1 -1
  57. package/dist/components/ScorecardPage/EntitiesTable/EntitiesTableFooter.esm.js.map +1 -1
  58. package/dist/components/ScorecardPage/EntitiesTable/EntitiesTableHeader.esm.js.map +1 -1
  59. package/dist/components/ScorecardPage/EntitiesTable/EntitiesTablePagination.esm.js.map +1 -1
  60. package/dist/components/ScorecardPage/EntitiesTable/EntitiesTableStateRow.esm.js.map +1 -1
  61. package/dist/components/ScorecardPage/EntitiesTable/EntitiesTableWrapper.esm.js.map +1 -1
  62. package/dist/components/ScorecardPage/EntitiesTable/cells/EntityNameCell.esm.js.map +1 -1
  63. package/dist/components/ScorecardPage/EntitiesTable/cells/MetricStatusCell.esm.js.map +1 -1
  64. package/dist/components/ScorecardPage/EntitiesTable/cells/OwnerCell.esm.js.map +1 -1
  65. package/dist/components/ScorecardPage/ScorecardPage.esm.js +2 -1
  66. package/dist/components/ScorecardPage/ScorecardPage.esm.js.map +1 -1
  67. package/dist/components/ScorecardPage/ScorecardPageHeader.esm.js.map +1 -1
  68. package/dist/components/ScorecardStylesProvider.esm.js +12 -0
  69. package/dist/components/ScorecardStylesProvider.esm.js.map +1 -0
  70. package/dist/hooks/useAggregatedScorecard.esm.js.map +1 -1
  71. package/dist/hooks/useAggregatedScorecardEntities.esm.js.map +1 -1
  72. package/dist/hooks/useAggregationMetadata.esm.js.map +1 -1
  73. package/dist/hooks/useEntityMetadataMap.esm.js.map +1 -1
  74. package/dist/hooks/useLanguage.esm.js.map +1 -1
  75. package/dist/hooks/useMetric.esm.js.map +1 -1
  76. package/dist/hooks/useMetricDisplayLabels.esm.js.map +1 -1
  77. package/dist/hooks/useOwnershipEntityRefs.esm.js.map +1 -1
  78. package/dist/hooks/useScorecards.esm.js.map +1 -1
  79. package/dist/hooks/useTranslation.esm.js.map +1 -1
  80. package/dist/index.d.ts +1 -1
  81. package/dist/index.esm.js.map +1 -1
  82. package/dist/pages/ScorecardPage.esm.js +6 -1
  83. package/dist/pages/ScorecardPage.esm.js.map +1 -1
  84. package/dist/plugin.esm.js.map +1 -1
  85. package/dist/routes.esm.js.map +1 -1
  86. package/dist/translations/de.esm.js.map +1 -1
  87. package/dist/translations/es.esm.js.map +1 -1
  88. package/dist/translations/fr.esm.js.map +1 -1
  89. package/dist/translations/index.esm.js.map +1 -1
  90. package/dist/translations/it.esm.js.map +1 -1
  91. package/dist/translations/ja.esm.js.map +1 -1
  92. package/dist/translations/ref.esm.js.map +1 -1
  93. package/dist/types/{index.d-LfNMVZwd.d.ts → index.d-DLQMegMp.d.ts} +1 -1
  94. package/dist/utils/chartLabelUtils.esm.js.map +1 -1
  95. package/dist/utils/constants.esm.js.map +1 -1
  96. package/dist/utils/entityTableUtils.esm.js.map +1 -1
  97. package/dist/utils/formatPercentage.esm.js.map +1 -1
  98. package/dist/utils/statusUtils.esm.js +3 -1
  99. package/dist/utils/statusUtils.esm.js.map +1 -1
  100. package/dist/utils/thresholdUtils.esm.js.map +1 -1
  101. package/dist/utils/translationUtils.esm.js.map +1 -1
  102. package/package.json +25 -23
package/CHANGELOG.md CHANGED
@@ -1,5 +1,27 @@
1
1
  # @red-hat-developer-hub/backstage-plugin-scorecard
2
2
 
3
+ ## 2.8.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 71cfae4: Add blueprint architecture for grouped scorecard layouts
8
+
9
+ Implement blueprint pattern enabling platform engineers to configure grouped scorecard metrics via app-config.yaml. Layout extensions are auto-discovered through Backstage's New Frontend System (NFS).
10
+
11
+ - 8c85bd4: Backstage version bump to v1.51.1
12
+
13
+ ### Patch Changes
14
+
15
+ - Updated dependencies [8c85bd4]
16
+ - @red-hat-developer-hub/backstage-plugin-scorecard-common@2.8.0
17
+
18
+ ## 2.7.9
19
+
20
+ ### Patch Changes
21
+
22
+ - d86f9c6: Replace Material UI v4 imports with MUI v5 and scope JSS class names to prevent style collisions.
23
+ - @red-hat-developer-hub/backstage-plugin-scorecard-common@2.7.9
24
+
3
25
  ## 2.7.8
4
26
 
5
27
  ### Patch Changes
@@ -0,0 +1,40 @@
1
+ import { createElement } from 'react';
2
+ import { createExtensionDataRef, createExtensionBlueprint, coreExtensionData, ExtensionBoundary } from '@backstage/frontend-plugin-api';
3
+
4
+ const scorecardLayoutTitleDataRef = createExtensionDataRef().with({ id: "scorecard.layout-title" });
5
+ const ScorecardEntityContentLayoutBlueprint = createExtensionBlueprint({
6
+ kind: "scorecard-layout",
7
+ attachTo: {
8
+ id: "entity-content:catalog/entity-content-scorecard",
9
+ input: "layouts"
10
+ },
11
+ output: [coreExtensionData.reactElement, scorecardLayoutTitleDataRef],
12
+ dataRefs: {
13
+ title: scorecardLayoutTitleDataRef
14
+ },
15
+ config: {
16
+ schema: {
17
+ groups: (schema) => schema.record(
18
+ schema.object({
19
+ title: schema.string(),
20
+ description: schema.string().optional(),
21
+ metrics: schema.array(schema.string())
22
+ })
23
+ ).optional().default({})
24
+ }
25
+ },
26
+ *factory(params, { config, node }) {
27
+ yield scorecardLayoutTitleDataRef(params.title);
28
+ yield coreExtensionData.reactElement(
29
+ ExtensionBoundary.lazy(node, async () => {
30
+ const Component = await params.loader();
31
+ return createElement(Component, {
32
+ groups: config.groups
33
+ });
34
+ })
35
+ );
36
+ }
37
+ });
38
+
39
+ export { ScorecardEntityContentLayoutBlueprint, scorecardLayoutTitleDataRef };
40
+ //# sourceMappingURL=ScorecardLayoutBlueprint.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ScorecardLayoutBlueprint.esm.js","sources":["../../../src/alpha/blueprints/ScorecardLayoutBlueprint.ts"],"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 { ComponentType, createElement } from 'react';\nimport {\n coreExtensionData,\n createExtensionBlueprint,\n createExtensionDataRef,\n ExtensionBoundary,\n} from '@backstage/frontend-plugin-api';\n\n/** @alpha */\nexport interface ScorecardLayoutProps {\n groups: Record<\n string,\n { title: string; description?: string; metrics: string[] }\n >;\n}\n\n/**\n * Extension data ref carrying the human-readable layout title\n * (e.g. \"Grid\", \"List\") so the entity tab can build a toggle.\n *\n * @alpha\n */\nexport const scorecardLayoutTitleDataRef =\n createExtensionDataRef<string>().with({ id: 'scorecard.layout-title' });\n\n/**\n * Blueprint for creating scorecard layout extensions.\n *\n * Each layout is a separate extension that attaches to the Scorecard entity tab.\n * Platform engineers enable/disable individual layouts via app-config.yaml;\n * when multiple layouts are enabled the tab renders a toggle to switch between them.\n *\n * @alpha\n */\nexport const ScorecardEntityContentLayoutBlueprint = createExtensionBlueprint({\n kind: 'scorecard-layout',\n attachTo: {\n id: 'entity-content:catalog/entity-content-scorecard',\n input: 'layouts',\n },\n output: [coreExtensionData.reactElement, scorecardLayoutTitleDataRef],\n dataRefs: {\n title: scorecardLayoutTitleDataRef,\n },\n config: {\n schema: {\n groups: schema =>\n schema\n .record(\n schema.object({\n title: schema.string(),\n description: schema.string().optional(),\n metrics: schema.array(schema.string()),\n }),\n )\n .optional()\n .default({}),\n },\n },\n *factory(\n params: {\n title: string;\n loader: () => Promise<ComponentType<ScorecardLayoutProps>>;\n },\n { config, node },\n ) {\n yield scorecardLayoutTitleDataRef(params.title);\n yield coreExtensionData.reactElement(\n ExtensionBoundary.lazy(node, async () => {\n const Component = await params.loader();\n return createElement(Component, {\n groups: config.groups,\n });\n }),\n );\n },\n});\n"],"names":[],"mappings":";;;AAsCO,MAAM,8BACX,sBAAA,EAA+B,CAAE,KAAK,EAAE,EAAA,EAAI,0BAA0B;AAWjE,MAAM,wCAAwC,wBAAA,CAAyB;AAAA,EAC5E,IAAA,EAAM,kBAAA;AAAA,EACN,QAAA,EAAU;AAAA,IACR,EAAA,EAAI,iDAAA;AAAA,IACJ,KAAA,EAAO;AAAA,GACT;AAAA,EACA,MAAA,EAAQ,CAAC,iBAAA,CAAkB,YAAA,EAAc,2BAA2B,CAAA;AAAA,EACpE,QAAA,EAAU;AAAA,IACR,KAAA,EAAO;AAAA,GACT;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,MAAA,EAAQ;AAAA,MACN,MAAA,EAAQ,YACN,MAAA,CACG,MAAA;AAAA,QACC,OAAO,MAAA,CAAO;AAAA,UACZ,KAAA,EAAO,OAAO,MAAA,EAAO;AAAA,UACrB,WAAA,EAAa,MAAA,CAAO,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,UACtC,OAAA,EAAS,MAAA,CAAO,KAAA,CAAM,MAAA,CAAO,QAAQ;AAAA,SACtC;AAAA,OACH,CACC,QAAA,EAAS,CACT,OAAA,CAAQ,EAAE;AAAA;AACjB,GACF;AAAA,EACA,CAAC,OAAA,CACC,MAAA,EAIA,EAAE,MAAA,EAAQ,MAAK,EACf;AACA,IAAA,MAAM,2BAAA,CAA4B,OAAO,KAAK,CAAA;AAC9C,IAAA,MAAM,iBAAA,CAAkB,YAAA;AAAA,MACtB,iBAAA,CAAkB,IAAA,CAAK,IAAA,EAAM,YAAY;AACvC,QAAA,MAAM,SAAA,GAAY,MAAM,MAAA,CAAO,MAAA,EAAO;AACtC,QAAA,OAAO,cAAc,SAAA,EAAW;AAAA,UAC9B,QAAQ,MAAA,CAAO;AAAA,SAChB,CAAA;AAAA,MACH,CAAC;AAAA,KACH;AAAA,EACF;AACF,CAAC;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"api.esm.js","sources":["../../../src/alpha/extensions/api.ts"],"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 {\n ApiBlueprint,\n createApiFactory,\n discoveryApiRef,\n fetchApiRef,\n} from '@backstage/frontend-plugin-api';\nimport { ScorecardApiClient, scorecardApiRef } from '../../api';\n\n/** Scorecard API extension. */\nexport const scorecardApi = ApiBlueprint.make({\n params: defineParams =>\n defineParams(\n createApiFactory({\n api: scorecardApiRef,\n deps: { fetchApi: fetchApiRef, discoveryApi: discoveryApiRef },\n factory: ({ fetchApi, discoveryApi }) =>\n new ScorecardApiClient({ fetchApi, discoveryApi }),\n }),\n ),\n});\n"],"names":[],"mappings":";;;AAyBa,MAAA,YAAA,GAAe,aAAa,IAAK,CAAA;AAAA,EAC5C,QAAQ,CACN,YAAA,KAAA,YAAA;AAAA,IACE,gBAAiB,CAAA;AAAA,MACf,GAAK,EAAA,eAAA;AAAA,MACL,IAAM,EAAA,EAAE,QAAU,EAAA,WAAA,EAAa,cAAc,eAAgB,EAAA;AAAA,MAC7D,OAAA,EAAS,CAAC,EAAE,QAAU,EAAA,YAAA,EACpB,KAAA,IAAI,kBAAmB,CAAA,EAAE,QAAU,EAAA,YAAA,EAAc;AAAA,KACpD;AAAA;AAEP,CAAC;;;;"}
1
+ {"version":3,"file":"api.esm.js","sources":["../../../src/alpha/extensions/api.ts"],"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 {\n ApiBlueprint,\n createApiFactory,\n discoveryApiRef,\n fetchApiRef,\n} from '@backstage/frontend-plugin-api';\nimport { ScorecardApiClient, scorecardApiRef } from '../../api';\n\n/** Scorecard API extension. */\nexport const scorecardApi = ApiBlueprint.make({\n params: defineParams =>\n defineParams(\n createApiFactory({\n api: scorecardApiRef,\n deps: { fetchApi: fetchApiRef, discoveryApi: discoveryApiRef },\n factory: ({ fetchApi, discoveryApi }) =>\n new ScorecardApiClient({ fetchApi, discoveryApi }),\n }),\n ),\n});\n"],"names":[],"mappings":";;;AAyBO,MAAM,YAAA,GAAe,aAAa,IAAA,CAAK;AAAA,EAC5C,QAAQ,CAAA,YAAA,KACN,YAAA;AAAA,IACE,gBAAA,CAAiB;AAAA,MACf,GAAA,EAAK,eAAA;AAAA,MACL,IAAA,EAAM,EAAE,QAAA,EAAU,WAAA,EAAa,cAAc,eAAA,EAAgB;AAAA,MAC7D,OAAA,EAAS,CAAC,EAAE,QAAA,EAAU,YAAA,EAAa,KACjC,IAAI,kBAAA,CAAmB,EAAE,QAAA,EAAU,YAAA,EAAc;AAAA,KACpD;AAAA;AAEP,CAAC;;;;"}
@@ -1,6 +1,8 @@
1
1
  import { jsx } from 'react/jsx-runtime';
2
2
  import { EntityContentBlueprint } from '@backstage/plugin-catalog-react/alpha';
3
+ import { coreExtensionData, createExtensionInput } from '@backstage/frontend-plugin-api';
3
4
  import { rootRouteRef } from '../../routes.esm.js';
5
+ import { scorecardLayoutTitleDataRef } from '../blueprints/ScorecardLayoutBlueprint.esm.js';
4
6
 
5
7
  const scorecardEntityContent = EntityContentBlueprint.makeWithOverrides({
6
8
  name: "entity-content-scorecard",
@@ -16,7 +18,14 @@ const scorecardEntityContent = EntityContentBlueprint.makeWithOverrides({
16
18
  ).optional()
17
19
  }
18
20
  },
19
- factory(original, { config }) {
21
+ inputs: {
22
+ layouts: createExtensionInput(
23
+ [coreExtensionData.reactElement, scorecardLayoutTitleDataRef],
24
+ { optional: true }
25
+ )
26
+ },
27
+ factory(original, { config, inputs }) {
28
+ const layouts = inputs.layouts ?? [];
20
29
  return original({
21
30
  path: "/scorecard",
22
31
  title: "Scorecard",
@@ -31,6 +40,14 @@ const scorecardEntityContent = EntityContentBlueprint.makeWithOverrides({
31
40
  });
32
41
  },
33
42
  loader: async () => {
43
+ if (layouts.length > 0) {
44
+ const layoutItems = layouts.map((l) => ({
45
+ title: l.get(scorecardLayoutTitleDataRef),
46
+ element: l.get(coreExtensionData.reactElement)
47
+ }));
48
+ const { ScorecardLayoutSwitcher } = await import('../../components/Scorecard/ScorecardLayoutSwitcher.esm.js');
49
+ return /* @__PURE__ */ jsx(ScorecardLayoutSwitcher, { layouts: layoutItems });
50
+ }
34
51
  const { EntityScorecardContent } = await import('../../components/Scorecard/index.esm.js');
35
52
  return /* @__PURE__ */ jsx(EntityScorecardContent, {});
36
53
  }
@@ -1 +1 @@
1
- {"version":3,"file":"entityTab.esm.js","sources":["../../../src/alpha/extensions/entityTab.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 { Entity } from '@backstage/catalog-model';\nimport { EntityContentBlueprint } from '@backstage/plugin-catalog-react/alpha';\nimport { rootRouteRef } from '../../routes';\n\n/**\n * Extension for the Scorecard tab on Entity pages.\n * @alpha\n */\nexport const scorecardEntityContent = EntityContentBlueprint.makeWithOverrides({\n name: 'entity-content-scorecard',\n config: {\n schema: {\n // Allows flexible filtering: { kind: 'Component', type: 'service' }\n // or just { type: 'service' } for all services.\n allowedFilters: schema =>\n schema\n .array(\n schema.object({\n kind: schema.string().optional(),\n type: schema.string().optional(),\n }),\n )\n .optional(),\n },\n },\n factory(original, { config }) {\n return original({\n path: '/scorecard',\n title: 'Scorecard',\n routeRef: rootRouteRef,\n filter: (entity: Entity): boolean => {\n const filters = config.allowedFilters;\n\n if (!filters || filters.length === 0) return true;\n\n return filters.some(f => {\n const kindMatch =\n !f.kind || f.kind.toLowerCase() === entity.kind.toLowerCase();\n const typeMatch =\n !f.type ||\n f.type.toLowerCase() ===\n (entity.spec?.type as string)?.toLowerCase();\n\n return kindMatch && typeMatch;\n });\n },\n loader: async () => {\n const { EntityScorecardContent } = await import(\n '../../components/Scorecard'\n );\n return <EntityScorecardContent />;\n },\n });\n },\n});\n"],"names":[],"mappings":";;;;AAwBa,MAAA,sBAAA,GAAyB,uBAAuB,iBAAkB,CAAA;AAAA,EAC7E,IAAM,EAAA,0BAAA;AAAA,EACN,MAAQ,EAAA;AAAA,IACN,MAAQ,EAAA;AAAA;AAAA;AAAA,MAGN,cAAA,EAAgB,YACd,MACG,CAAA,KAAA;AAAA,QACC,OAAO,MAAO,CAAA;AAAA,UACZ,IAAM,EAAA,MAAA,CAAO,MAAO,EAAA,CAAE,QAAS,EAAA;AAAA,UAC/B,IAAM,EAAA,MAAA,CAAO,MAAO,EAAA,CAAE,QAAS;AAAA,SAChC;AAAA,QAEF,QAAS;AAAA;AAChB,GACF;AAAA,EACA,OAAQ,CAAA,QAAA,EAAU,EAAE,MAAA,EAAU,EAAA;AAC5B,IAAA,OAAO,QAAS,CAAA;AAAA,MACd,IAAM,EAAA,YAAA;AAAA,MACN,KAAO,EAAA,WAAA;AAAA,MACP,QAAU,EAAA,YAAA;AAAA,MACV,MAAA,EAAQ,CAAC,MAA4B,KAAA;AACnC,QAAA,MAAM,UAAU,MAAO,CAAA,cAAA;AAEvB,QAAA,IAAI,CAAC,OAAA,IAAW,OAAQ,CAAA,MAAA,KAAW,GAAU,OAAA,IAAA;AAE7C,QAAO,OAAA,OAAA,CAAQ,KAAK,CAAK,CAAA,KAAA;AACvB,UAAM,MAAA,SAAA,GACJ,CAAC,CAAA,CAAE,IAAQ,IAAA,CAAA,CAAE,KAAK,WAAY,EAAA,KAAM,MAAO,CAAA,IAAA,CAAK,WAAY,EAAA;AAC9D,UAAM,MAAA,SAAA,GACJ,CAAC,CAAA,CAAE,IACH,IAAA,CAAA,CAAE,IAAK,CAAA,WAAA,EACJ,KAAA,MAAA,CAAO,IAAM,EAAA,IAAA,EAAiB,WAAY,EAAA;AAE/C,UAAA,OAAO,SAAa,IAAA,SAAA;AAAA,SACrB,CAAA;AAAA,OACH;AAAA,MACA,QAAQ,YAAY;AAClB,QAAA,MAAM,EAAE,sBAAA,EAA2B,GAAA,MAAM,OACvC,yCACF,CAAA;AACA,QAAA,2BAAQ,sBAAuB,EAAA,EAAA,CAAA;AAAA;AACjC,KACD,CAAA;AAAA;AAEL,CAAC;;;;"}
1
+ {"version":3,"file":"entityTab.esm.js","sources":["../../../src/alpha/extensions/entityTab.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 { Entity } from '@backstage/catalog-model';\nimport { EntityContentBlueprint } from '@backstage/plugin-catalog-react/alpha';\nimport {\n createExtensionInput,\n coreExtensionData,\n} from '@backstage/frontend-plugin-api';\n\nimport { rootRouteRef } from '../../routes';\nimport { scorecardLayoutTitleDataRef } from '../blueprints/ScorecardLayoutBlueprint';\n\n/**\n * Extension for the Scorecard tab on Entity pages.\n *\n * When one or more layout blueprint extensions are attached, renders\n * a {@link ScorecardLayoutSwitcher} with a toggle (when 2+).\n * Otherwise falls back to the legacy flat {@link EntityScorecardContent}.\n *\n * @alpha\n */\nexport const scorecardEntityContent = EntityContentBlueprint.makeWithOverrides({\n name: 'entity-content-scorecard',\n config: {\n schema: {\n // Allows flexible filtering: { kind: 'Component', type: 'service' }\n // or just { type: 'service' } for all services.\n allowedFilters: schema =>\n schema\n .array(\n schema.object({\n kind: schema.string().optional(),\n type: schema.string().optional(),\n }),\n )\n .optional(),\n },\n },\n inputs: {\n layouts: createExtensionInput(\n [coreExtensionData.reactElement, scorecardLayoutTitleDataRef],\n { optional: true },\n ),\n },\n factory(original, { config, inputs }) {\n const layouts = inputs.layouts ?? [];\n return original({\n path: '/scorecard',\n title: 'Scorecard',\n routeRef: rootRouteRef,\n filter: (entity: Entity): boolean => {\n const filters = config.allowedFilters;\n\n if (!filters || filters.length === 0) return true;\n\n return filters.some(f => {\n const kindMatch =\n !f.kind || f.kind.toLowerCase() === entity.kind.toLowerCase();\n const typeMatch =\n !f.type ||\n f.type.toLowerCase() ===\n (entity.spec?.type as string)?.toLowerCase();\n\n return kindMatch && typeMatch;\n });\n },\n loader: async () => {\n if (layouts.length > 0) {\n const layoutItems = layouts.map(l => ({\n title: l.get(scorecardLayoutTitleDataRef),\n element: l.get(coreExtensionData.reactElement),\n }));\n\n const { ScorecardLayoutSwitcher } = await import(\n '../../components/Scorecard/ScorecardLayoutSwitcher'\n );\n return <ScorecardLayoutSwitcher layouts={layoutItems} />;\n }\n const { EntityScorecardContent } = await import(\n '../../components/Scorecard'\n );\n return <EntityScorecardContent />;\n },\n });\n },\n});\n"],"names":[],"mappings":";;;;;;AAmCO,MAAM,sBAAA,GAAyB,uBAAuB,iBAAA,CAAkB;AAAA,EAC7E,IAAA,EAAM,0BAAA;AAAA,EACN,MAAA,EAAQ;AAAA,IACN,MAAA,EAAQ;AAAA;AAAA;AAAA,MAGN,cAAA,EAAgB,YACd,MAAA,CACG,KAAA;AAAA,QACC,OAAO,MAAA,CAAO;AAAA,UACZ,IAAA,EAAM,MAAA,CAAO,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,UAC/B,IAAA,EAAM,MAAA,CAAO,MAAA,EAAO,CAAE,QAAA;AAAS,SAChC;AAAA,QAEF,QAAA;AAAS;AAChB,GACF;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,OAAA,EAAS,oBAAA;AAAA,MACP,CAAC,iBAAA,CAAkB,YAAA,EAAc,2BAA2B,CAAA;AAAA,MAC5D,EAAE,UAAU,IAAA;AAAK;AACnB,GACF;AAAA,EACA,OAAA,CAAQ,QAAA,EAAU,EAAE,MAAA,EAAQ,QAAO,EAAG;AACpC,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,OAAA,IAAW,EAAC;AACnC,IAAA,OAAO,QAAA,CAAS;AAAA,MACd,IAAA,EAAM,YAAA;AAAA,MACN,KAAA,EAAO,WAAA;AAAA,MACP,QAAA,EAAU,YAAA;AAAA,MACV,MAAA,EAAQ,CAAC,MAAA,KAA4B;AACnC,QAAA,MAAM,UAAU,MAAA,CAAO,cAAA;AAEvB,QAAA,IAAI,CAAC,OAAA,IAAW,OAAA,CAAQ,MAAA,KAAW,GAAG,OAAO,IAAA;AAE7C,QAAA,OAAO,OAAA,CAAQ,KAAK,CAAA,CAAA,KAAK;AACvB,UAAA,MAAM,SAAA,GACJ,CAAC,CAAA,CAAE,IAAA,IAAQ,CAAA,CAAE,KAAK,WAAA,EAAY,KAAM,MAAA,CAAO,IAAA,CAAK,WAAA,EAAY;AAC9D,UAAA,MAAM,SAAA,GACJ,CAAC,CAAA,CAAE,IAAA,IACH,CAAA,CAAE,IAAA,CAAK,WAAA,EAAY,KAChB,MAAA,CAAO,IAAA,EAAM,IAAA,EAAiB,WAAA,EAAY;AAE/C,UAAA,OAAO,SAAA,IAAa,SAAA;AAAA,QACtB,CAAC,CAAA;AAAA,MACH,CAAA;AAAA,MACA,QAAQ,YAAY;AAClB,QAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,UAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAA,MAAM;AAAA,YACpC,KAAA,EAAO,CAAA,CAAE,GAAA,CAAI,2BAA2B,CAAA;AAAA,YACxC,OAAA,EAAS,CAAA,CAAE,GAAA,CAAI,iBAAA,CAAkB,YAAY;AAAA,WAC/C,CAAE,CAAA;AAEF,UAAA,MAAM,EAAE,uBAAA,EAAwB,GAAI,MAAM,OACxC,2DACF,CAAA;AACA,UAAA,uBAAO,GAAA,CAAC,uBAAA,EAAA,EAAwB,OAAA,EAAS,WAAA,EAAa,CAAA;AAAA,QACxD;AACA,QAAA,MAAM,EAAE,sBAAA,EAAuB,GAAI,MAAM,OACvC,yCACF,CAAA;AACA,QAAA,2BAAQ,sBAAA,EAAA,EAAuB,CAAA;AAAA,MACjC;AAAA,KACD,CAAA;AAAA,EACH;AACF,CAAC;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"homePageCards.esm.js","sources":["../../../src/alpha/extensions/homePageCards.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 { HomePageWidgetBlueprint } from '@backstage/plugin-home-react/alpha';\nimport type { RendererProps } from '@backstage/plugin-home-react';\nimport { ScorecardHomepageCardWithProvider } from '../../components/ScorecardHomepageSection';\n\nconst defaultCardLayout = {\n width: {\n minColumns: 3,\n maxColumns: 12,\n defaultColumns: 4,\n },\n height: {\n minRows: 5,\n maxRows: 12,\n defaultRows: 6,\n },\n} as const;\n\nfunction AggregatedCardWithDeprecatedMetricIdContent() {\n return <ScorecardHomepageCardWithProvider metricId=\"jira.open_issues\" />;\n}\n\nfunction AggregatedCardWithDefaultAggregationContent() {\n return <ScorecardHomepageCardWithProvider aggregationId=\"github.open_prs\" />;\n}\n\nfunction AggregatedCardWithJiraOpenIssuesContent() {\n return <ScorecardHomepageCardWithProvider aggregationId=\"openIssuesKpi\" />;\n}\n\nfunction AggregatedCardWithGithubOpenPrsContent() {\n return <ScorecardHomepageCardWithProvider aggregationId=\"openPrsKpi\" />;\n}\n\nfunction AggregatedCardWithGithubFilecheckLicenseContent() {\n return (\n <ScorecardHomepageCardWithProvider aggregationId=\"licenseFileExistsKpi\" />\n );\n}\n\nfunction AggregatedCardWithGithubFilecheckCodeownersContent() {\n return (\n <ScorecardHomepageCardWithProvider aggregationId=\"filecheck.codeowners\" />\n );\n}\n\nfunction AggregatedCardWithGithubOpenPrsWeightedContent() {\n return (\n <ScorecardHomepageCardWithProvider aggregationId=\"openPrsWeightedKpi\" />\n );\n}\n\nfunction BorderlessHomeWidgetRenderer({ Content }: RendererProps) {\n return <Content />;\n}\n\n/**\n * NFS widget: AggregatedCardWithDeprecatedMetricId.\n * @alpha\n */\nexport const aggregatedCardWithDeprecatedMetricIdWidget =\n HomePageWidgetBlueprint.make({\n name: 'scorecard-deprecated-metric-id',\n params: {\n name: 'AggregatedCardWithDeprecatedMetricId',\n title: 'Scorecard: With deprecated metricId property (Jira)',\n layout: defaultCardLayout,\n componentProps: {\n Renderer: BorderlessHomeWidgetRenderer,\n },\n components: () =>\n Promise.resolve({\n Content: AggregatedCardWithDeprecatedMetricIdContent,\n }),\n },\n });\n\n/**\n * NFS widget: AggregatedCardWithDefaultAggregation.\n * @alpha\n */\nexport const aggregatedCardWithDefaultAggregationWidget =\n HomePageWidgetBlueprint.make({\n name: 'scorecard-default-aggregation',\n params: {\n name: 'AggregatedCardWithDefaultAggregation',\n title: 'Scorecard: With default aggregation config (GitHub)',\n layout: defaultCardLayout,\n componentProps: {\n Renderer: BorderlessHomeWidgetRenderer,\n },\n components: () =>\n Promise.resolve({\n Content: AggregatedCardWithDefaultAggregationContent,\n }),\n },\n });\n\n/**\n * NFS widget: AggregatedCardWithJiraOpenIssues.\n * @alpha\n */\nexport const aggregatedCardWithJiraOpenIssuesWidget =\n HomePageWidgetBlueprint.make({\n name: 'scorecard-jira-open-issues',\n params: {\n name: 'AggregatedCardWithJiraOpenIssues',\n title: 'Scorecard: Jira open blocking tickets',\n layout: defaultCardLayout,\n componentProps: {\n Renderer: BorderlessHomeWidgetRenderer,\n },\n components: () =>\n Promise.resolve({\n Content: AggregatedCardWithJiraOpenIssuesContent,\n }),\n },\n });\n\n/**\n * NFS widget: AggregatedCardWithGithubOpenPrs.\n * @alpha\n */\nexport const aggregatedCardWithGithubOpenPrsWidget =\n HomePageWidgetBlueprint.make({\n name: 'scorecard-github-open-prs',\n params: {\n name: 'AggregatedCardWithGithubOpenPrs',\n title: 'Scorecard: GitHub open PRs',\n layout: defaultCardLayout,\n componentProps: {\n Renderer: BorderlessHomeWidgetRenderer,\n },\n components: () =>\n Promise.resolve({\n Content: AggregatedCardWithGithubOpenPrsContent,\n }),\n },\n });\n\n/**\n * NFS widget: AggregatedCardWithGithubFilecheckLicense.\n * @alpha\n */\nexport const aggregatedCardWithGithubFilecheckLicenseWidget =\n HomePageWidgetBlueprint.make({\n name: 'scorecard-github-filecheck-license',\n params: {\n name: 'AggregatedCardWithGithubFilecheckLicense',\n title: 'Scorecard: LICENSE file exists',\n layout: defaultCardLayout,\n componentProps: {\n Renderer: BorderlessHomeWidgetRenderer,\n },\n components: () =>\n Promise.resolve({\n Content: AggregatedCardWithGithubFilecheckLicenseContent,\n }),\n },\n });\n\n/**\n * NFS widget: AggregatedCardWithGithubFilecheckCodeowners.\n * @alpha\n */\nexport const aggregatedCardWithGithubFilecheckCodeownersWidget =\n HomePageWidgetBlueprint.make({\n name: 'scorecard-github-filecheck-codeowners',\n params: {\n name: 'AggregatedCardWithGithubFilecheckCodeowners',\n title: 'Scorecard: CODEOWNERS file exists',\n layout: defaultCardLayout,\n componentProps: {\n Renderer: BorderlessHomeWidgetRenderer,\n },\n components: () =>\n Promise.resolve({\n Content: AggregatedCardWithGithubFilecheckCodeownersContent,\n }),\n },\n });\n\n/**\n * NFS widget: AggregatedCardWithGithubOpenPrsWeighted.\n * @alpha\n */\nexport const aggregatedCardWithGithubOpenPrsWeightedWidget =\n HomePageWidgetBlueprint.make({\n name: 'scorecard-github-open-prs-weighted',\n params: {\n name: 'AggregatedCardWithGithubOpenPrsWeighted',\n title: 'Scorecard: GitHub open PRs (weighted health)',\n layout: defaultCardLayout,\n componentProps: {\n Renderer: BorderlessHomeWidgetRenderer,\n },\n components: () =>\n Promise.resolve({\n Content: AggregatedCardWithGithubOpenPrsWeightedContent,\n }),\n },\n });\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"homePageCards.esm.js","sources":["../../../src/alpha/extensions/homePageCards.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 { HomePageWidgetBlueprint } from '@backstage/plugin-home-react/alpha';\nimport type { RendererProps } from '@backstage/plugin-home-react';\nimport { ScorecardHomepageCardWithProvider } from '../../components/ScorecardHomepageSection';\n\nconst defaultCardLayout = {\n width: {\n minColumns: 3,\n maxColumns: 12,\n defaultColumns: 4,\n },\n height: {\n minRows: 5,\n maxRows: 12,\n defaultRows: 6,\n },\n} as const;\n\nfunction AggregatedCardWithDeprecatedMetricIdContent() {\n return <ScorecardHomepageCardWithProvider metricId=\"jira.open_issues\" />;\n}\n\nfunction AggregatedCardWithDefaultAggregationContent() {\n return <ScorecardHomepageCardWithProvider aggregationId=\"github.open_prs\" />;\n}\n\nfunction AggregatedCardWithJiraOpenIssuesContent() {\n return <ScorecardHomepageCardWithProvider aggregationId=\"openIssuesKpi\" />;\n}\n\nfunction AggregatedCardWithGithubOpenPrsContent() {\n return <ScorecardHomepageCardWithProvider aggregationId=\"openPrsKpi\" />;\n}\n\nfunction AggregatedCardWithGithubFilecheckLicenseContent() {\n return (\n <ScorecardHomepageCardWithProvider aggregationId=\"licenseFileExistsKpi\" />\n );\n}\n\nfunction AggregatedCardWithGithubFilecheckCodeownersContent() {\n return (\n <ScorecardHomepageCardWithProvider aggregationId=\"filecheck.codeowners\" />\n );\n}\n\nfunction AggregatedCardWithGithubOpenPrsWeightedContent() {\n return (\n <ScorecardHomepageCardWithProvider aggregationId=\"openPrsWeightedKpi\" />\n );\n}\n\nfunction BorderlessHomeWidgetRenderer({ Content }: RendererProps) {\n return <Content />;\n}\n\n/**\n * NFS widget: AggregatedCardWithDeprecatedMetricId.\n * @alpha\n */\nexport const aggregatedCardWithDeprecatedMetricIdWidget =\n HomePageWidgetBlueprint.make({\n name: 'scorecard-deprecated-metric-id',\n params: {\n name: 'AggregatedCardWithDeprecatedMetricId',\n title: 'Scorecard: With deprecated metricId property (Jira)',\n layout: defaultCardLayout,\n componentProps: {\n Renderer: BorderlessHomeWidgetRenderer,\n },\n components: () =>\n Promise.resolve({\n Content: AggregatedCardWithDeprecatedMetricIdContent,\n }),\n },\n });\n\n/**\n * NFS widget: AggregatedCardWithDefaultAggregation.\n * @alpha\n */\nexport const aggregatedCardWithDefaultAggregationWidget =\n HomePageWidgetBlueprint.make({\n name: 'scorecard-default-aggregation',\n params: {\n name: 'AggregatedCardWithDefaultAggregation',\n title: 'Scorecard: With default aggregation config (GitHub)',\n layout: defaultCardLayout,\n componentProps: {\n Renderer: BorderlessHomeWidgetRenderer,\n },\n components: () =>\n Promise.resolve({\n Content: AggregatedCardWithDefaultAggregationContent,\n }),\n },\n });\n\n/**\n * NFS widget: AggregatedCardWithJiraOpenIssues.\n * @alpha\n */\nexport const aggregatedCardWithJiraOpenIssuesWidget =\n HomePageWidgetBlueprint.make({\n name: 'scorecard-jira-open-issues',\n params: {\n name: 'AggregatedCardWithJiraOpenIssues',\n title: 'Scorecard: Jira open blocking tickets',\n layout: defaultCardLayout,\n componentProps: {\n Renderer: BorderlessHomeWidgetRenderer,\n },\n components: () =>\n Promise.resolve({\n Content: AggregatedCardWithJiraOpenIssuesContent,\n }),\n },\n });\n\n/**\n * NFS widget: AggregatedCardWithGithubOpenPrs.\n * @alpha\n */\nexport const aggregatedCardWithGithubOpenPrsWidget =\n HomePageWidgetBlueprint.make({\n name: 'scorecard-github-open-prs',\n params: {\n name: 'AggregatedCardWithGithubOpenPrs',\n title: 'Scorecard: GitHub open PRs',\n layout: defaultCardLayout,\n componentProps: {\n Renderer: BorderlessHomeWidgetRenderer,\n },\n components: () =>\n Promise.resolve({\n Content: AggregatedCardWithGithubOpenPrsContent,\n }),\n },\n });\n\n/**\n * NFS widget: AggregatedCardWithGithubFilecheckLicense.\n * @alpha\n */\nexport const aggregatedCardWithGithubFilecheckLicenseWidget =\n HomePageWidgetBlueprint.make({\n name: 'scorecard-github-filecheck-license',\n params: {\n name: 'AggregatedCardWithGithubFilecheckLicense',\n title: 'Scorecard: LICENSE file exists',\n layout: defaultCardLayout,\n componentProps: {\n Renderer: BorderlessHomeWidgetRenderer,\n },\n components: () =>\n Promise.resolve({\n Content: AggregatedCardWithGithubFilecheckLicenseContent,\n }),\n },\n });\n\n/**\n * NFS widget: AggregatedCardWithGithubFilecheckCodeowners.\n * @alpha\n */\nexport const aggregatedCardWithGithubFilecheckCodeownersWidget =\n HomePageWidgetBlueprint.make({\n name: 'scorecard-github-filecheck-codeowners',\n params: {\n name: 'AggregatedCardWithGithubFilecheckCodeowners',\n title: 'Scorecard: CODEOWNERS file exists',\n layout: defaultCardLayout,\n componentProps: {\n Renderer: BorderlessHomeWidgetRenderer,\n },\n components: () =>\n Promise.resolve({\n Content: AggregatedCardWithGithubFilecheckCodeownersContent,\n }),\n },\n });\n\n/**\n * NFS widget: AggregatedCardWithGithubOpenPrsWeighted.\n * @alpha\n */\nexport const aggregatedCardWithGithubOpenPrsWeightedWidget =\n HomePageWidgetBlueprint.make({\n name: 'scorecard-github-open-prs-weighted',\n params: {\n name: 'AggregatedCardWithGithubOpenPrsWeighted',\n title: 'Scorecard: GitHub open PRs (weighted health)',\n layout: defaultCardLayout,\n componentProps: {\n Renderer: BorderlessHomeWidgetRenderer,\n },\n components: () =>\n Promise.resolve({\n Content: AggregatedCardWithGithubOpenPrsWeightedContent,\n }),\n },\n });\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { ScorecardEntityContentLayoutBlueprint } from '../blueprints/ScorecardLayoutBlueprint.esm.js';
2
+
3
+ const scorecardEntityLayoutGrid = ScorecardEntityContentLayoutBlueprint.make({
4
+ name: "scorecard-entity-layout-grid",
5
+ disabled: true,
6
+ params: {
7
+ title: "Grid",
8
+ loader: () => import('../../components/Scorecard/ScorecardEntityContentGridView.esm.js').then((m) => m.ScorecardEntityContentGridView)
9
+ }
10
+ });
11
+ const scorecardEntityLayoutList = ScorecardEntityContentLayoutBlueprint.make({
12
+ name: "scorecard-entity-layout-list",
13
+ disabled: true,
14
+ params: {
15
+ title: "List",
16
+ loader: () => import('../../components/Scorecard/ScorecardEntityContentGridView.esm.js').then((m) => m.ScorecardEntityContentGridView)
17
+ }
18
+ });
19
+
20
+ export { scorecardEntityLayoutGrid, scorecardEntityLayoutList };
21
+ //# sourceMappingURL=scorecardLayoutExtensions.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scorecardLayoutExtensions.esm.js","sources":["../../../src/alpha/extensions/scorecardLayoutExtensions.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 { ScorecardEntityContentLayoutBlueprint } from '../blueprints';\n\n/**\n * Grid view layout extension for the Scorecard entity tab.\n *\n * Extension ID: scorecard-layout:catalog/scorecard-entity-layout-grid\n * @alpha\n */\nexport const scorecardEntityLayoutGrid =\n ScorecardEntityContentLayoutBlueprint.make({\n name: 'scorecard-entity-layout-grid',\n disabled: true,\n params: {\n title: 'Grid',\n loader: () =>\n import(\n '../../components/Scorecard/ScorecardEntityContentGridView'\n ).then(m => m.ScorecardEntityContentGridView),\n },\n });\n\n/**\n * List view layout extension for the Scorecard entity tab.\n *\n * Extension ID: scorecard-layout:catalog/scorecard-entity-layout-list\n * In UI Epic RHIDP-13950, this will be replaced with ScorecardEntityListView\n * @alpha\n */\nexport const scorecardEntityLayoutList =\n ScorecardEntityContentLayoutBlueprint.make({\n name: 'scorecard-entity-layout-list',\n disabled: true,\n params: {\n title: 'List',\n loader: () =>\n import(\n '../../components/Scorecard/ScorecardEntityContentGridView'\n ).then(m => m.ScorecardEntityContentGridView),\n },\n });\n"],"names":[],"mappings":";;AAwBO,MAAM,yBAAA,GACX,sCAAsC,IAAA,CAAK;AAAA,EACzC,IAAA,EAAM,8BAAA;AAAA,EACN,QAAA,EAAU,IAAA;AAAA,EACV,MAAA,EAAQ;AAAA,IACN,KAAA,EAAO,MAAA;AAAA,IACP,MAAA,EAAQ,MACN,OACE,kEACF,EAAE,IAAA,CAAK,CAAA,CAAA,KAAK,EAAE,8BAA8B;AAAA;AAElD,CAAC;AASI,MAAM,yBAAA,GACX,sCAAsC,IAAA,CAAK;AAAA,EACzC,IAAA,EAAM,8BAAA;AAAA,EACN,QAAA,EAAU,IAAA;AAAA,EACV,MAAA,EAAQ;AAAA,IACN,KAAA,EAAO,MAAA;AAAA,IACP,MAAA,EAAQ,MACN,OACE,kEACF,EAAE,IAAA,CAAK,CAAA,CAAA,KAAK,EAAE,8BAA8B;AAAA;AAElD,CAAC;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"scorecardPage.esm.js","sources":["../../../src/alpha/extensions/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 { PageBlueprint } from '@backstage/frontend-plugin-api';\nimport { scorecardDrillDownRouteRef } from '../../routes';\n\n/**\n * NFS page extension for the Scorecard drill-down page.\n * @alpha\n */\nexport const scorecardPage = PageBlueprint.make({\n params: {\n path: '/scorecard/aggregations/:aggregationId/metrics/:metricId',\n routeRef: scorecardDrillDownRouteRef,\n loader: () =>\n import('../../pages/ScorecardPage').then(m => (\n <m.ScorecardPageWithProvider />\n )),\n },\n});\n"],"names":[],"mappings":";;;;AAuBa,MAAA,aAAA,GAAgB,cAAc,IAAK,CAAA;AAAA,EAC9C,MAAQ,EAAA;AAAA,IACN,IAAM,EAAA,0DAAA;AAAA,IACN,QAAU,EAAA,0BAAA;AAAA,IACV,MAAA,EAAQ,MACN,OAAO,kCAA2B,CAAA,CAAE,IAAK,CAAA,CAAA,CAAA,qBACtC,GAAA,CAAA,CAAA,CAAE,yBAAF,EAAA,EAA4B,CAC9B;AAAA;AAEP,CAAC;;;;"}
1
+ {"version":3,"file":"scorecardPage.esm.js","sources":["../../../src/alpha/extensions/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 { PageBlueprint } from '@backstage/frontend-plugin-api';\nimport { scorecardDrillDownRouteRef } from '../../routes';\n\n/**\n * NFS page extension for the Scorecard drill-down page.\n * @alpha\n */\nexport const scorecardPage = PageBlueprint.make({\n params: {\n path: '/scorecard/aggregations/:aggregationId/metrics/:metricId',\n routeRef: scorecardDrillDownRouteRef,\n loader: () =>\n import('../../pages/ScorecardPage').then(m => (\n <m.ScorecardPageWithProvider />\n )),\n },\n});\n"],"names":[],"mappings":";;;;AAuBO,MAAM,aAAA,GAAgB,cAAc,IAAA,CAAK;AAAA,EAC9C,MAAA,EAAQ;AAAA,IACN,IAAA,EAAM,0DAAA;AAAA,IACN,QAAA,EAAU,0BAAA;AAAA,IACV,MAAA,EAAQ,MACN,OAAO,kCAA2B,CAAA,CAAE,IAAA,CAAK,CAAA,CAAA,qBACvC,GAAA,CAAC,CAAA,CAAE,yBAAA,EAAF,EAA4B,CAC9B;AAAA;AAEP,CAAC;;;;"}
package/dist/alpha.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import * as react from 'react';
2
2
  import * as _backstage_frontend_plugin_api from '@backstage/frontend-plugin-api';
3
3
  import * as _backstage_core_plugin_api from '@backstage/core-plugin-api';
4
- export { a as scorecardTranslationRef, s as scorecardTranslations } from './types/index.d-LfNMVZwd.js';
4
+ export { s as scorecardTranslationRef, a as scorecardTranslations } from './types/index.d-DLQMegMp.js';
5
5
 
6
6
  /**
7
7
  * The primary Scorecard frontend plugin.
@@ -31,10 +31,10 @@ declare const _default: _backstage_frontend_plugin_api.OverridableFrontendPlugin
31
31
  title: string | undefined;
32
32
  };
33
33
  configInput: {
34
- title?: string | undefined;
35
34
  path?: string | undefined;
35
+ title?: string | undefined;
36
36
  };
37
- output: _backstage_frontend_plugin_api.ExtensionDataRef<string, "core.routing.path", {}> | _backstage_frontend_plugin_api.ExtensionDataRef<react.JSX.Element, "core.reactElement", {}> | _backstage_frontend_plugin_api.ExtensionDataRef<_backstage_frontend_plugin_api.RouteRef<_backstage_frontend_plugin_api.AnyRouteRefParams>, "core.routing.ref", {
37
+ output: _backstage_frontend_plugin_api.ExtensionDataRef<react.JSX.Element, "core.reactElement", {}> | _backstage_frontend_plugin_api.ExtensionDataRef<string, "core.routing.path", {}> | _backstage_frontend_plugin_api.ExtensionDataRef<_backstage_frontend_plugin_api.RouteRef<_backstage_frontend_plugin_api.AnyRouteRefParams>, "core.routing.ref", {
38
38
  optional: true;
39
39
  }> | _backstage_frontend_plugin_api.ExtensionDataRef<string, "core.title", {
40
40
  optional: true;
@@ -66,7 +66,11 @@ declare const _default: _backstage_frontend_plugin_api.OverridableFrontendPlugin
66
66
  }>;
67
67
 
68
68
  /**
69
- * Catalog module that automatically injects the Scorecard tab into the Catalog.
69
+ * Catalog module that injects the Scorecard tab and into Catalog entity pages.
70
+ *
71
+ * Also ships grid and list layout extensions (disabled by default).
72
+ * Enable them in app-config.yaml to get a layout toggle in the entity tab.
73
+ *
70
74
  * @alpha
71
75
  */
72
76
  declare const scorecardCatalogModule: _backstage_frontend_plugin_api.FrontendModule;
package/dist/alpha.esm.js CHANGED
@@ -6,6 +6,7 @@ import { scorecardApi } from './alpha/extensions/api.esm.js';
6
6
  import { scorecardEntityContent } from './alpha/extensions/entityTab.esm.js';
7
7
  import { aggregatedCardWithDeprecatedMetricIdWidget, aggregatedCardWithDefaultAggregationWidget, aggregatedCardWithJiraOpenIssuesWidget, aggregatedCardWithGithubOpenPrsWidget, aggregatedCardWithGithubFilecheckLicenseWidget, aggregatedCardWithGithubFilecheckCodeownersWidget, aggregatedCardWithGithubOpenPrsWeightedWidget } from './alpha/extensions/homePageCards.esm.js';
8
8
  import { scorecardPage } from './alpha/extensions/scorecardPage.esm.js';
9
+ import { scorecardEntityLayoutGrid, scorecardEntityLayoutList } from './alpha/extensions/scorecardLayoutExtensions.esm.js';
9
10
  export { scorecardTranslationRef } from './translations/ref.esm.js';
10
11
 
11
12
  const scorecardTranslation = TranslationBlueprint.make({
@@ -23,7 +24,11 @@ var index = createFrontendPlugin({
23
24
  });
24
25
  const scorecardCatalogModule = createFrontendModule({
25
26
  pluginId: "catalog",
26
- extensions: [scorecardEntityContent]
27
+ extensions: [
28
+ scorecardEntityContent,
29
+ scorecardEntityLayoutGrid,
30
+ scorecardEntityLayoutList
31
+ ]
27
32
  });
28
33
  const scorecardTranslationsModule = createFrontendModule({
29
34
  pluginId: "app",
@@ -1 +1 @@
1
- {"version":3,"file":"alpha.esm.js","sources":["../src/alpha/index.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 {\n createFrontendModule,\n createFrontendPlugin,\n} from '@backstage/frontend-plugin-api';\nimport { TranslationBlueprint } from '@backstage/plugin-app-react';\nimport { rootRouteRef, scorecardDrillDownRouteRef } from '../routes';\nimport { scorecardTranslations } from '../translations';\nimport { scorecardApi } from './extensions/api';\nimport { scorecardEntityContent } from './extensions/entityTab';\nimport {\n aggregatedCardWithDeprecatedMetricIdWidget,\n aggregatedCardWithDefaultAggregationWidget,\n aggregatedCardWithGithubOpenPrsWidget,\n aggregatedCardWithJiraOpenIssuesWidget,\n aggregatedCardWithGithubFilecheckLicenseWidget,\n aggregatedCardWithGithubFilecheckCodeownersWidget,\n aggregatedCardWithGithubOpenPrsWeightedWidget,\n} from './extensions/homePageCards';\nimport { scorecardPage } from './extensions/scorecardPage';\n\n/**\n * Extension for Scorecard translations.\n */\nconst scorecardTranslation = TranslationBlueprint.make({\n params: {\n resource: scorecardTranslations,\n },\n});\n\n/**\n * The primary Scorecard frontend plugin.\n * @alpha\n */\nexport default createFrontendPlugin({\n pluginId: 'scorecard',\n extensions: [scorecardApi, scorecardPage],\n routes: {\n root: rootRouteRef,\n drillDown: scorecardDrillDownRouteRef,\n },\n});\n\n/**\n * Catalog module that automatically injects the Scorecard tab into the Catalog.\n * @alpha\n */\nexport const scorecardCatalogModule = createFrontendModule({\n pluginId: 'catalog',\n extensions: [scorecardEntityContent],\n});\n\n/**\n * App module that automatically registers Scorecard translations.\n * @alpha\n */\nexport const scorecardTranslationsModule = createFrontendModule({\n pluginId: 'app',\n extensions: [scorecardTranslation],\n});\n\n/**\n * Home module that contributes scorecard homepage widget and layout.\n * @alpha\n */\nexport const scorecardHomeModule = createFrontendModule({\n pluginId: 'home',\n extensions: [\n aggregatedCardWithDeprecatedMetricIdWidget,\n aggregatedCardWithDefaultAggregationWidget,\n aggregatedCardWithJiraOpenIssuesWidget,\n aggregatedCardWithGithubOpenPrsWidget,\n aggregatedCardWithGithubFilecheckLicenseWidget,\n aggregatedCardWithGithubFilecheckCodeownersWidget,\n aggregatedCardWithGithubOpenPrsWeightedWidget,\n ],\n});\n\n/**\n * Re-exporting translations for external usage.\n * @alpha\n */\nexport * from '../translations';\n"],"names":[],"mappings":";;;;;;;;;;AAuCA,MAAM,oBAAA,GAAuB,qBAAqB,IAAK,CAAA;AAAA,EACrD,MAAQ,EAAA;AAAA,IACN,QAAU,EAAA;AAAA;AAEd,CAAC,CAAA;AAMD,YAAe,oBAAqB,CAAA;AAAA,EAClC,QAAU,EAAA,WAAA;AAAA,EACV,UAAA,EAAY,CAAC,YAAA,EAAc,aAAa,CAAA;AAAA,EACxC,MAAQ,EAAA;AAAA,IACN,IAAM,EAAA,YAAA;AAAA,IACN,SAAW,EAAA;AAAA;AAEf,CAAC,CAAA;AAMM,MAAM,yBAAyB,oBAAqB,CAAA;AAAA,EACzD,QAAU,EAAA,SAAA;AAAA,EACV,UAAA,EAAY,CAAC,sBAAsB;AACrC,CAAC;AAMM,MAAM,8BAA8B,oBAAqB,CAAA;AAAA,EAC9D,QAAU,EAAA,KAAA;AAAA,EACV,UAAA,EAAY,CAAC,oBAAoB;AACnC,CAAC;AAMM,MAAM,sBAAsB,oBAAqB,CAAA;AAAA,EACtD,QAAU,EAAA,MAAA;AAAA,EACV,UAAY,EAAA;AAAA,IACV,0CAAA;AAAA,IACA,0CAAA;AAAA,IACA,sCAAA;AAAA,IACA,qCAAA;AAAA,IACA,8CAAA;AAAA,IACA,iDAAA;AAAA,IACA;AAAA;AAEJ,CAAC;;;;"}
1
+ {"version":3,"file":"alpha.esm.js","sources":["../src/alpha/index.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 {\n createFrontendModule,\n createFrontendPlugin,\n} from '@backstage/frontend-plugin-api';\nimport { TranslationBlueprint } from '@backstage/plugin-app-react';\nimport { rootRouteRef, scorecardDrillDownRouteRef } from '../routes';\nimport { scorecardTranslations } from '../translations';\nimport { scorecardApi } from './extensions/api';\nimport { scorecardEntityContent } from './extensions/entityTab';\nimport {\n aggregatedCardWithDeprecatedMetricIdWidget,\n aggregatedCardWithDefaultAggregationWidget,\n aggregatedCardWithGithubOpenPrsWidget,\n aggregatedCardWithJiraOpenIssuesWidget,\n aggregatedCardWithGithubFilecheckLicenseWidget,\n aggregatedCardWithGithubFilecheckCodeownersWidget,\n aggregatedCardWithGithubOpenPrsWeightedWidget,\n} from './extensions/homePageCards';\nimport { scorecardPage } from './extensions/scorecardPage';\nimport {\n scorecardEntityLayoutGrid,\n scorecardEntityLayoutList,\n} from './extensions/scorecardLayoutExtensions';\n\n/**\n * Extension for Scorecard translations.\n */\nconst scorecardTranslation = TranslationBlueprint.make({\n params: {\n resource: scorecardTranslations,\n },\n});\n\n/**\n * The primary Scorecard frontend plugin.\n * @alpha\n */\nexport default createFrontendPlugin({\n pluginId: 'scorecard',\n extensions: [scorecardApi, scorecardPage],\n routes: {\n root: rootRouteRef,\n drillDown: scorecardDrillDownRouteRef,\n },\n});\n\n/**\n * Catalog module that injects the Scorecard tab and into Catalog entity pages.\n *\n * Also ships grid and list layout extensions (disabled by default).\n * Enable them in app-config.yaml to get a layout toggle in the entity tab.\n *\n * @alpha\n */\nexport const scorecardCatalogModule = createFrontendModule({\n pluginId: 'catalog',\n extensions: [\n scorecardEntityContent,\n scorecardEntityLayoutGrid,\n scorecardEntityLayoutList,\n ],\n});\n\n/**\n * App module that automatically registers Scorecard translations.\n * @alpha\n */\nexport const scorecardTranslationsModule = createFrontendModule({\n pluginId: 'app',\n extensions: [scorecardTranslation],\n});\n\n/**\n * Home module that contributes scorecard homepage widget and layout.\n * @alpha\n */\nexport const scorecardHomeModule = createFrontendModule({\n pluginId: 'home',\n extensions: [\n aggregatedCardWithDeprecatedMetricIdWidget,\n aggregatedCardWithDefaultAggregationWidget,\n aggregatedCardWithJiraOpenIssuesWidget,\n aggregatedCardWithGithubOpenPrsWidget,\n aggregatedCardWithGithubFilecheckLicenseWidget,\n aggregatedCardWithGithubFilecheckCodeownersWidget,\n aggregatedCardWithGithubOpenPrsWeightedWidget,\n ],\n});\n\n/**\n * Re-exporting translations for external usage.\n * @alpha\n */\nexport * from '../translations';\n"],"names":[],"mappings":";;;;;;;;;;;AA2CA,MAAM,oBAAA,GAAuB,qBAAqB,IAAA,CAAK;AAAA,EACrD,MAAA,EAAQ;AAAA,IACN,QAAA,EAAU;AAAA;AAEd,CAAC,CAAA;AAMD,YAAe,oBAAA,CAAqB;AAAA,EAClC,QAAA,EAAU,WAAA;AAAA,EACV,UAAA,EAAY,CAAC,YAAA,EAAc,aAAa,CAAA;AAAA,EACxC,MAAA,EAAQ;AAAA,IACN,IAAA,EAAM,YAAA;AAAA,IACN,SAAA,EAAW;AAAA;AAEf,CAAC,CAAA;AAUM,MAAM,yBAAyB,oBAAA,CAAqB;AAAA,EACzD,QAAA,EAAU,SAAA;AAAA,EACV,UAAA,EAAY;AAAA,IACV,sBAAA;AAAA,IACA,yBAAA;AAAA,IACA;AAAA;AAEJ,CAAC;AAMM,MAAM,8BAA8B,oBAAA,CAAqB;AAAA,EAC9D,QAAA,EAAU,KAAA;AAAA,EACV,UAAA,EAAY,CAAC,oBAAoB;AACnC,CAAC;AAMM,MAAM,sBAAsB,oBAAA,CAAqB;AAAA,EACtD,QAAA,EAAU,MAAA;AAAA,EACV,UAAA,EAAY;AAAA,IACV,0CAAA;AAAA,IACA,0CAAA;AAAA,IACA,sCAAA;AAAA,IACA,qCAAA;AAAA,IACA,8CAAA;AAAA,IACA,iDAAA;AAAA,IACA;AAAA;AAEJ,CAAC;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"ScorecardQueryProvider.esm.js","sources":["../../src/api/ScorecardQueryProvider.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 { useMemo } from 'react';\nimport type { ReactNode } from 'react';\n\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query';\n\nlet queryClient: QueryClient | undefined;\n\nfunction getQueryClient() {\n if (!queryClient) {\n queryClient = new QueryClient({\n defaultOptions: {\n queries: {\n staleTime: 5 * 60 * 1000, // 5 minutes\n gcTime: 5 * 60 * 1000, // 5 minutes\n retry: 1,\n refetchOnWindowFocus: false, // do not refetch when window regains focus\n },\n },\n });\n }\n return queryClient;\n}\n\n/**\n * uses a singleton QueryClient to ensure cache is shared across all scorecard components.\n * @public\n */\nexport const ScorecardQueryProvider = ({\n children,\n}: {\n readonly children: ReactNode;\n}) => {\n const client = useMemo(() => getQueryClient(), []);\n\n return <QueryClientProvider client={client}>{children}</QueryClientProvider>;\n};\n"],"names":[],"mappings":";;;;AAqBA,IAAI,WAAA;AAEJ,SAAS,cAAiB,GAAA;AACxB,EAAA,IAAI,CAAC,WAAa,EAAA;AAChB,IAAA,WAAA,GAAc,IAAI,WAAY,CAAA;AAAA,MAC5B,cAAgB,EAAA;AAAA,QACd,OAAS,EAAA;AAAA,UACP,SAAA,EAAW,IAAI,EAAK,GAAA,GAAA;AAAA;AAAA,UACpB,MAAA,EAAQ,IAAI,EAAK,GAAA,GAAA;AAAA;AAAA,UACjB,KAAO,EAAA,CAAA;AAAA,UACP,oBAAsB,EAAA;AAAA;AAAA;AACxB;AACF,KACD,CAAA;AAAA;AAEH,EAAO,OAAA,WAAA;AACT;AAMO,MAAM,yBAAyB,CAAC;AAAA,EACrC;AACF,CAEM,KAAA;AACJ,EAAA,MAAM,SAAS,OAAQ,CAAA,MAAM,cAAe,EAAA,EAAG,EAAE,CAAA;AAEjD,EAAO,uBAAA,GAAA,CAAC,mBAAoB,EAAA,EAAA,MAAA,EAAiB,QAAS,EAAA,CAAA;AACxD;;;;"}
1
+ {"version":3,"file":"ScorecardQueryProvider.esm.js","sources":["../../src/api/ScorecardQueryProvider.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 { useMemo } from 'react';\nimport type { ReactNode } from 'react';\n\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query';\n\nlet queryClient: QueryClient | undefined;\n\nfunction getQueryClient() {\n if (!queryClient) {\n queryClient = new QueryClient({\n defaultOptions: {\n queries: {\n staleTime: 5 * 60 * 1000, // 5 minutes\n gcTime: 5 * 60 * 1000, // 5 minutes\n retry: 1,\n refetchOnWindowFocus: false, // do not refetch when window regains focus\n },\n },\n });\n }\n return queryClient;\n}\n\n/**\n * uses a singleton QueryClient to ensure cache is shared across all scorecard components.\n * @public\n */\nexport const ScorecardQueryProvider = ({\n children,\n}: {\n readonly children: ReactNode;\n}) => {\n const client = useMemo(() => getQueryClient(), []);\n\n return <QueryClientProvider client={client}>{children}</QueryClientProvider>;\n};\n"],"names":[],"mappings":";;;;AAqBA,IAAI,WAAA;AAEJ,SAAS,cAAA,GAAiB;AACxB,EAAA,IAAI,CAAC,WAAA,EAAa;AAChB,IAAA,WAAA,GAAc,IAAI,WAAA,CAAY;AAAA,MAC5B,cAAA,EAAgB;AAAA,QACd,OAAA,EAAS;AAAA,UACP,SAAA,EAAW,IAAI,EAAA,GAAK,GAAA;AAAA;AAAA,UACpB,MAAA,EAAQ,IAAI,EAAA,GAAK,GAAA;AAAA;AAAA,UACjB,KAAA,EAAO,CAAA;AAAA,UACP,oBAAA,EAAsB;AAAA;AAAA;AACxB;AACF,KACD,CAAA;AAAA,EACH;AACA,EAAA,OAAO,WAAA;AACT;AAMO,MAAM,yBAAyB,CAAC;AAAA,EACrC;AACF,CAAA,KAEM;AACJ,EAAA,MAAM,SAAS,OAAA,CAAQ,MAAM,cAAA,EAAe,EAAG,EAAE,CAAA;AAEjD,EAAA,uBAAO,GAAA,CAAC,mBAAA,EAAA,EAAoB,MAAA,EAAiB,QAAA,EAAS,CAAA;AACxD;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.esm.js","sources":["../../src/api/index.ts"],"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 {\n createApiRef,\n FetchApi,\n DiscoveryApi,\n} from '@backstage/core-plugin-api';\nimport type {\n MetricResult,\n AggregatedMetricResult,\n AggregationMetadata,\n Metric,\n EntityMetricDetailResponse,\n} from '@red-hat-developer-hub/backstage-plugin-scorecard-common';\n\nimport type { GetAggregatedScorecardEntitiesOptions } from '../components/types';\n\nexport { ScorecardQueryProvider } from './ScorecardQueryProvider';\n\nimport type {\n ScorecardApi,\n ScorecardApiClientOptions,\n ScorecardOptions,\n} from './types';\n\nexport const scorecardApiRef = createApiRef<ScorecardApi>({\n id: 'plugin.scorecard.service',\n});\n\n/**\n * Client implementation for the Scorecard API.\n * @public\n */\nexport class ScorecardApiClient implements ScorecardApi {\n private readonly fetchApi: FetchApi;\n private readonly discoveryApi: DiscoveryApi;\n\n constructor(options: ScorecardApiClientOptions) {\n this.fetchApi = options.fetchApi;\n this.discoveryApi = options.discoveryApi;\n }\n\n async getBaseUrl(): Promise<string> {\n return await this.discoveryApi.getBaseUrl('scorecard');\n }\n\n async getScorecards({\n entity,\n metricIds,\n }: ScorecardOptions): Promise<MetricResult[]> {\n if (\n !entity?.kind ||\n !entity?.metadata?.namespace ||\n !entity?.metadata?.name\n ) {\n throw new Error(\n 'Entity missing required properties for scorecard lookup',\n );\n }\n\n const baseUrl = await this.getBaseUrl();\n const url = new URL(\n `${baseUrl}/metrics/catalog/${entity.kind}/${entity.metadata.namespace}/${entity.metadata.name}`,\n );\n\n if (metricIds) {\n url.searchParams.set('metricIds', metricIds.join(','));\n }\n\n try {\n const response = await this.fetchApi.fetch(url.toString());\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `Failed to fetch scorecards: ${response.status} ${response.statusText}. ${errorText}`,\n );\n }\n\n const data = await response.json();\n\n if (!Array.isArray(data)) {\n throw new Error('Invalid response format from scorecard API');\n }\n\n return data;\n } catch (error) {\n if (error instanceof Error) {\n throw error;\n }\n throw new Error(`Unexpected error fetching scorecards: ${String(error)}`);\n }\n }\n\n async getAggregatedScorecard(\n aggregationId: string,\n ): Promise<AggregatedMetricResult> {\n if (!aggregationId || aggregationId.trim() === '') {\n throw new Error('Aggregation ID is required for aggregated scorecards');\n }\n\n const baseUrl = await this.getBaseUrl();\n const url = new URL(`${baseUrl}/aggregations/${aggregationId}`);\n\n try {\n const response = await this.fetchApi.fetch(url.toString());\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `Failed to fetch aggregated scorecards: ${response.status} ${response.statusText}. ${errorText}`,\n );\n }\n\n const data = await response.json();\n\n if (\n !data ||\n Array.isArray(data) ||\n typeof data !== 'object' ||\n !('result' in data) ||\n !('metadata' in data) ||\n !('id' in data) ||\n !('status' in data)\n ) {\n throw new TypeError(\n 'Invalid response format from aggregated scorecard API',\n );\n }\n\n const resultRaw = data.result;\n if (\n resultRaw === null ||\n typeof resultRaw !== 'object' ||\n Array.isArray(resultRaw)\n ) {\n throw new TypeError(\n 'Invalid response format from aggregated scorecard API: result must be a non-null object',\n );\n }\n\n const requireFiniteNumber = (value: unknown, fieldName: string) => {\n const n = Number(value ?? 0);\n if (!Number.isFinite(n)) {\n throw new TypeError(\n `Invalid aggregated scorecard API response: ${fieldName} must be a finite number`,\n );\n }\n return n;\n };\n\n const resultRecord = resultRaw as Record<string, unknown>;\n const timestampValue = resultRecord.timestamp;\n let timestamp: string;\n if (typeof timestampValue === 'string') {\n timestamp = timestampValue;\n } else if (\n typeof timestampValue === 'number' &&\n Number.isFinite(timestampValue)\n ) {\n timestamp = String(timestampValue);\n } else if (typeof timestampValue === 'bigint') {\n timestamp = timestampValue.toString();\n } else if (timestampValue instanceof Date) {\n timestamp = timestampValue.toISOString();\n } else {\n timestamp = '';\n }\n\n return {\n ...data,\n result: {\n ...resultRecord,\n total: requireFiniteNumber(resultRecord.total, 'total'),\n entitiesConsidered: requireFiniteNumber(\n resultRecord.entitiesConsidered,\n 'entitiesConsidered',\n ),\n calculationErrorCount: requireFiniteNumber(\n resultRecord.calculationErrorCount,\n 'calculationErrorCount',\n ),\n timestamp,\n },\n } as AggregatedMetricResult;\n } catch (error) {\n if (error instanceof Error) {\n throw error;\n }\n throw new Error(\n `Unexpected error fetching aggregated scorecards: ${String(error)}`,\n );\n }\n }\n\n async getMetrics(options?: {\n metricIds?: string[];\n }): Promise<{ metrics: Metric[] }> {\n const { metricIds } = options || {};\n\n const isMetricIds =\n metricIds && Array.isArray(metricIds) && metricIds.length > 0;\n\n const baseUrl = await this.getBaseUrl();\n const url = new URL(`${baseUrl}/metrics`);\n\n if (isMetricIds) {\n url.searchParams.set('metricIds', metricIds.join(','));\n }\n\n try {\n const response = await this.fetchApi.fetch(url.toString());\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `Failed to fetch metric: ${response.status} ${response.statusText}. ${errorText}`,\n );\n }\n\n const data = await response.json();\n\n if (\n !data ||\n Array.isArray(data) ||\n typeof data !== 'object' ||\n !('metrics' in data) ||\n !Array.isArray(data.metrics)\n ) {\n throw new TypeError('Invalid response format from metrics API');\n }\n\n return data;\n } catch (error) {\n if (error instanceof Error) {\n throw error;\n }\n throw new Error(`Unexpected error fetching metric: ${String(error)}`);\n }\n }\n\n async getAggregatedScorecardEntities(\n options: GetAggregatedScorecardEntitiesOptions,\n ): Promise<EntityMetricDetailResponse> {\n const {\n metricId,\n page,\n pageSize,\n ownershipEntityRefs = [],\n orderBy = null,\n order = 'asc',\n } = options;\n\n if (!metricId) {\n throw new Error('Metric ID is required for aggregated scorecards');\n }\n\n const baseUrl = await this.getBaseUrl();\n const url = new URL(\n `${baseUrl}/metrics/${metricId}/catalog/aggregations/entities`,\n );\n if (page) {\n url.searchParams.append('page', page.toString());\n }\n if (pageSize) {\n url.searchParams.append('pageSize', pageSize.toString());\n }\n if (ownershipEntityRefs.length > 0) {\n for (const ownershipEntityRef of ownershipEntityRefs) {\n url.searchParams.append('owner', ownershipEntityRef);\n }\n }\n if (orderBy) {\n url.searchParams.append('sortBy', orderBy);\n url.searchParams.append('sortOrder', order);\n }\n\n try {\n const response = await this.fetchApi.fetch(url.toString());\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `Failed to fetch aggregated scorecards: ${response.status} ${response.statusText}. ${errorText}`,\n );\n }\n\n const data = await response.json();\n\n if (!data || Array.isArray(data) || typeof data !== 'object') {\n throw new TypeError(\n 'Invalid response format from aggregated scorecard API',\n );\n }\n\n return data;\n } catch (error) {\n if (error instanceof Error) {\n throw error;\n }\n throw new Error(\n `Unexpected error fetching aggregated scorecards: ${String(error)}`,\n );\n }\n }\n\n async getAggregationMetadata(\n aggregationId: string,\n ): Promise<AggregationMetadata> {\n if (!aggregationId || aggregationId.trim() === '') {\n throw new Error('Aggregation ID is required for aggregation metadata');\n }\n\n const baseUrl = await this.getBaseUrl();\n const url = new URL(`${baseUrl}/aggregations/${aggregationId}/metadata`);\n\n try {\n const response = await this.fetchApi.fetch(url.toString());\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `Failed to fetch aggregation metadata: ${response.status} ${response.statusText}. ${errorText}`,\n );\n }\n\n const data = await response.json();\n\n if (\n !data ||\n Array.isArray(data) ||\n typeof data !== 'object' ||\n !('title' in data) ||\n !('description' in data) ||\n !('type' in data) ||\n !('aggregationType' in data)\n ) {\n throw new TypeError(\n 'Invalid response format from aggregation metadata API',\n );\n }\n\n return data as AggregationMetadata;\n } catch (error) {\n if (error instanceof Error) {\n throw error;\n }\n throw new Error(\n `Unexpected error fetching aggregation metadata: ${String(error)}`,\n );\n }\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.esm.js","sources":["../../src/api/index.ts"],"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 {\n createApiRef,\n FetchApi,\n DiscoveryApi,\n} from '@backstage/core-plugin-api';\nimport type {\n MetricResult,\n AggregatedMetricResult,\n AggregationMetadata,\n Metric,\n EntityMetricDetailResponse,\n} from '@red-hat-developer-hub/backstage-plugin-scorecard-common';\n\nimport type { GetAggregatedScorecardEntitiesOptions } from '../components/types';\n\nexport { ScorecardQueryProvider } from './ScorecardQueryProvider';\n\nimport type {\n ScorecardApi,\n ScorecardApiClientOptions,\n ScorecardOptions,\n} from './types';\n\nexport const scorecardApiRef = createApiRef<ScorecardApi>({\n id: 'plugin.scorecard.service',\n});\n\n/**\n * Client implementation for the Scorecard API.\n * @public\n */\nexport class ScorecardApiClient implements ScorecardApi {\n private readonly fetchApi: FetchApi;\n private readonly discoveryApi: DiscoveryApi;\n\n constructor(options: ScorecardApiClientOptions) {\n this.fetchApi = options.fetchApi;\n this.discoveryApi = options.discoveryApi;\n }\n\n async getBaseUrl(): Promise<string> {\n return await this.discoveryApi.getBaseUrl('scorecard');\n }\n\n async getScorecards({\n entity,\n metricIds,\n }: ScorecardOptions): Promise<MetricResult[]> {\n if (\n !entity?.kind ||\n !entity?.metadata?.namespace ||\n !entity?.metadata?.name\n ) {\n throw new Error(\n 'Entity missing required properties for scorecard lookup',\n );\n }\n\n const baseUrl = await this.getBaseUrl();\n const url = new URL(\n `${baseUrl}/metrics/catalog/${entity.kind}/${entity.metadata.namespace}/${entity.metadata.name}`,\n );\n\n if (metricIds) {\n url.searchParams.set('metricIds', metricIds.join(','));\n }\n\n try {\n const response = await this.fetchApi.fetch(url.toString());\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `Failed to fetch scorecards: ${response.status} ${response.statusText}. ${errorText}`,\n );\n }\n\n const data = await response.json();\n\n if (!Array.isArray(data)) {\n throw new Error('Invalid response format from scorecard API');\n }\n\n return data;\n } catch (error) {\n if (error instanceof Error) {\n throw error;\n }\n throw new Error(`Unexpected error fetching scorecards: ${String(error)}`);\n }\n }\n\n async getAggregatedScorecard(\n aggregationId: string,\n ): Promise<AggregatedMetricResult> {\n if (!aggregationId || aggregationId.trim() === '') {\n throw new Error('Aggregation ID is required for aggregated scorecards');\n }\n\n const baseUrl = await this.getBaseUrl();\n const url = new URL(`${baseUrl}/aggregations/${aggregationId}`);\n\n try {\n const response = await this.fetchApi.fetch(url.toString());\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `Failed to fetch aggregated scorecards: ${response.status} ${response.statusText}. ${errorText}`,\n );\n }\n\n const data = await response.json();\n\n if (\n !data ||\n Array.isArray(data) ||\n typeof data !== 'object' ||\n !('result' in data) ||\n !('metadata' in data) ||\n !('id' in data) ||\n !('status' in data)\n ) {\n throw new TypeError(\n 'Invalid response format from aggregated scorecard API',\n );\n }\n\n const resultRaw = data.result;\n if (\n resultRaw === null ||\n typeof resultRaw !== 'object' ||\n Array.isArray(resultRaw)\n ) {\n throw new TypeError(\n 'Invalid response format from aggregated scorecard API: result must be a non-null object',\n );\n }\n\n const requireFiniteNumber = (value: unknown, fieldName: string) => {\n const n = Number(value ?? 0);\n if (!Number.isFinite(n)) {\n throw new TypeError(\n `Invalid aggregated scorecard API response: ${fieldName} must be a finite number`,\n );\n }\n return n;\n };\n\n const resultRecord = resultRaw as Record<string, unknown>;\n const timestampValue = resultRecord.timestamp;\n let timestamp: string;\n if (typeof timestampValue === 'string') {\n timestamp = timestampValue;\n } else if (\n typeof timestampValue === 'number' &&\n Number.isFinite(timestampValue)\n ) {\n timestamp = String(timestampValue);\n } else if (typeof timestampValue === 'bigint') {\n timestamp = timestampValue.toString();\n } else if (timestampValue instanceof Date) {\n timestamp = timestampValue.toISOString();\n } else {\n timestamp = '';\n }\n\n return {\n ...data,\n result: {\n ...resultRecord,\n total: requireFiniteNumber(resultRecord.total, 'total'),\n entitiesConsidered: requireFiniteNumber(\n resultRecord.entitiesConsidered,\n 'entitiesConsidered',\n ),\n calculationErrorCount: requireFiniteNumber(\n resultRecord.calculationErrorCount,\n 'calculationErrorCount',\n ),\n timestamp,\n },\n } as AggregatedMetricResult;\n } catch (error) {\n if (error instanceof Error) {\n throw error;\n }\n throw new Error(\n `Unexpected error fetching aggregated scorecards: ${String(error)}`,\n );\n }\n }\n\n async getMetrics(options?: {\n metricIds?: string[];\n }): Promise<{ metrics: Metric[] }> {\n const { metricIds } = options || {};\n\n const isMetricIds =\n metricIds && Array.isArray(metricIds) && metricIds.length > 0;\n\n const baseUrl = await this.getBaseUrl();\n const url = new URL(`${baseUrl}/metrics`);\n\n if (isMetricIds) {\n url.searchParams.set('metricIds', metricIds.join(','));\n }\n\n try {\n const response = await this.fetchApi.fetch(url.toString());\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `Failed to fetch metric: ${response.status} ${response.statusText}. ${errorText}`,\n );\n }\n\n const data = await response.json();\n\n if (\n !data ||\n Array.isArray(data) ||\n typeof data !== 'object' ||\n !('metrics' in data) ||\n !Array.isArray(data.metrics)\n ) {\n throw new TypeError('Invalid response format from metrics API');\n }\n\n return data;\n } catch (error) {\n if (error instanceof Error) {\n throw error;\n }\n throw new Error(`Unexpected error fetching metric: ${String(error)}`);\n }\n }\n\n async getAggregatedScorecardEntities(\n options: GetAggregatedScorecardEntitiesOptions,\n ): Promise<EntityMetricDetailResponse> {\n const {\n metricId,\n page,\n pageSize,\n ownershipEntityRefs = [],\n orderBy = null,\n order = 'asc',\n } = options;\n\n if (!metricId) {\n throw new Error('Metric ID is required for aggregated scorecards');\n }\n\n const baseUrl = await this.getBaseUrl();\n const url = new URL(\n `${baseUrl}/metrics/${metricId}/catalog/aggregations/entities`,\n );\n if (page) {\n url.searchParams.append('page', page.toString());\n }\n if (pageSize) {\n url.searchParams.append('pageSize', pageSize.toString());\n }\n if (ownershipEntityRefs.length > 0) {\n for (const ownershipEntityRef of ownershipEntityRefs) {\n url.searchParams.append('owner', ownershipEntityRef);\n }\n }\n if (orderBy) {\n url.searchParams.append('sortBy', orderBy);\n url.searchParams.append('sortOrder', order);\n }\n\n try {\n const response = await this.fetchApi.fetch(url.toString());\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `Failed to fetch aggregated scorecards: ${response.status} ${response.statusText}. ${errorText}`,\n );\n }\n\n const data = await response.json();\n\n if (!data || Array.isArray(data) || typeof data !== 'object') {\n throw new TypeError(\n 'Invalid response format from aggregated scorecard API',\n );\n }\n\n return data;\n } catch (error) {\n if (error instanceof Error) {\n throw error;\n }\n throw new Error(\n `Unexpected error fetching aggregated scorecards: ${String(error)}`,\n );\n }\n }\n\n async getAggregationMetadata(\n aggregationId: string,\n ): Promise<AggregationMetadata> {\n if (!aggregationId || aggregationId.trim() === '') {\n throw new Error('Aggregation ID is required for aggregation metadata');\n }\n\n const baseUrl = await this.getBaseUrl();\n const url = new URL(`${baseUrl}/aggregations/${aggregationId}/metadata`);\n\n try {\n const response = await this.fetchApi.fetch(url.toString());\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `Failed to fetch aggregation metadata: ${response.status} ${response.statusText}. ${errorText}`,\n );\n }\n\n const data = await response.json();\n\n if (\n !data ||\n Array.isArray(data) ||\n typeof data !== 'object' ||\n !('title' in data) ||\n !('description' in data) ||\n !('type' in data) ||\n !('aggregationType' in data)\n ) {\n throw new TypeError(\n 'Invalid response format from aggregation metadata API',\n );\n }\n\n return data as AggregationMetadata;\n } catch (error) {\n if (error instanceof Error) {\n throw error;\n }\n throw new Error(\n `Unexpected error fetching aggregation metadata: ${String(error)}`,\n );\n }\n }\n}\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"AggregatedMetricCard.esm.js","sources":["../../../src/components/AggregatedMetricCards/AggregatedMetricCard.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 { aggregationTypes } from '@red-hat-developer-hub/backstage-plugin-scorecard-common';\nimport { StatusGroupedCardComponent } from './StatusGroupedCard/StatusGroupedCardComponent';\nimport { AverageCardComponent } from './AverageCard/AverageCardComponent';\nimport type { AverageCardComponentProps } from './AverageCard/types';\nimport type { StatusGroupedCardComponentProps } from './StatusGroupedCard/types';\nimport { UnsupportedAggregationType } from './UnsupportedAggregationType';\n\nexport type AggregatedMetricCardProps =\n | StatusGroupedCardComponentProps\n | AverageCardComponentProps;\n\nexport const AggregatedMetricCard = (props: AggregatedMetricCardProps) => {\n switch (props.scorecard.metadata.aggregationType) {\n case aggregationTypes.statusGrouped:\n return (\n <StatusGroupedCardComponent\n {...(props as StatusGroupedCardComponentProps)}\n />\n );\n case aggregationTypes.average:\n return <AverageCardComponent {...(props as AverageCardComponentProps)} />;\n default:\n return (\n <UnsupportedAggregationType\n cardTitle={props.cardTitle}\n description={props.description}\n dataTestId={props.dataTestId}\n aggregationType={String(props.scorecard.metadata.aggregationType)}\n />\n );\n }\n};\n"],"names":[],"mappings":";;;;;;AA2Ba,MAAA,oBAAA,GAAuB,CAAC,KAAqC,KAAA;AACxE,EAAQ,QAAA,KAAA,CAAM,SAAU,CAAA,QAAA,CAAS,eAAiB;AAAA,IAChD,KAAK,gBAAiB,CAAA,aAAA;AACpB,MACE,uBAAA,GAAA;AAAA,QAAC,0BAAA;AAAA,QAAA;AAAA,UACE,GAAI;AAAA;AAAA,OACP;AAAA,IAEJ,KAAK,gBAAiB,CAAA,OAAA;AACpB,MAAO,uBAAA,GAAA,CAAC,oBAAsB,EAAA,EAAA,GAAI,KAAqC,EAAA,CAAA;AAAA,IACzE;AACE,MACE,uBAAA,GAAA;AAAA,QAAC,0BAAA;AAAA,QAAA;AAAA,UACC,WAAW,KAAM,CAAA,SAAA;AAAA,UACjB,aAAa,KAAM,CAAA,WAAA;AAAA,UACnB,YAAY,KAAM,CAAA,UAAA;AAAA,UAClB,eAAiB,EAAA,MAAA,CAAO,KAAM,CAAA,SAAA,CAAU,SAAS,eAAe;AAAA;AAAA,OAClE;AAAA;AAGR;;;;"}
1
+ {"version":3,"file":"AggregatedMetricCard.esm.js","sources":["../../../src/components/AggregatedMetricCards/AggregatedMetricCard.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 { aggregationTypes } from '@red-hat-developer-hub/backstage-plugin-scorecard-common';\nimport { StatusGroupedCardComponent } from './StatusGroupedCard/StatusGroupedCardComponent';\nimport { AverageCardComponent } from './AverageCard/AverageCardComponent';\nimport type { AverageCardComponentProps } from './AverageCard/types';\nimport type { StatusGroupedCardComponentProps } from './StatusGroupedCard/types';\nimport { UnsupportedAggregationType } from './UnsupportedAggregationType';\n\nexport type AggregatedMetricCardProps =\n | StatusGroupedCardComponentProps\n | AverageCardComponentProps;\n\nexport const AggregatedMetricCard = (props: AggregatedMetricCardProps) => {\n switch (props.scorecard.metadata.aggregationType) {\n case aggregationTypes.statusGrouped:\n return (\n <StatusGroupedCardComponent\n {...(props as StatusGroupedCardComponentProps)}\n />\n );\n case aggregationTypes.average:\n return <AverageCardComponent {...(props as AverageCardComponentProps)} />;\n default:\n return (\n <UnsupportedAggregationType\n cardTitle={props.cardTitle}\n description={props.description}\n dataTestId={props.dataTestId}\n aggregationType={String(props.scorecard.metadata.aggregationType)}\n />\n );\n }\n};\n"],"names":[],"mappings":";;;;;;AA2BO,MAAM,oBAAA,GAAuB,CAAC,KAAA,KAAqC;AACxE,EAAA,QAAQ,KAAA,CAAM,SAAA,CAAU,QAAA,CAAS,eAAA;AAAiB,IAChD,KAAK,gBAAA,CAAiB,aAAA;AACpB,MAAA,uBACE,GAAA;AAAA,QAAC,0BAAA;AAAA,QAAA;AAAA,UACE,GAAI;AAAA;AAAA,OACP;AAAA,IAEJ,KAAK,gBAAA,CAAiB,OAAA;AACpB,MAAA,uBAAO,GAAA,CAAC,oBAAA,EAAA,EAAsB,GAAI,KAAA,EAAqC,CAAA;AAAA,IACzE;AACE,MAAA,uBACE,GAAA;AAAA,QAAC,0BAAA;AAAA,QAAA;AAAA,UACC,WAAW,KAAA,CAAM,SAAA;AAAA,UACjB,aAAa,KAAA,CAAM,WAAA;AAAA,UACnB,YAAY,KAAA,CAAM,UAAA;AAAA,UAClB,eAAA,EAAiB,MAAA,CAAO,KAAA,CAAM,SAAA,CAAU,SAAS,eAAe;AAAA;AAAA,OAClE;AAAA;AAGR;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"AverageCardComponent.esm.js","sources":["../../../../src/components/AggregatedMetricCards/AverageCard/AverageCardComponent.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 type { MouseEvent } from 'react';\n\nimport { useTheme } from '@mui/material/styles';\n\nimport { CardWrapper } from '../../Common/CardWrapper';\nimport type { PieData } from '../../types';\nimport { resolveStatusColor } from '../../../utils';\nimport { ResponsivePieChart } from '../../ScorecardHomepageSection/ResponsivePieChart';\nimport { CardInfoButton } from '../components/CardInfoButton';\nimport { CardSubheader } from '../components/CardSubheader';\nimport { CardChartContainer } from '../components/CardChartContainer';\nimport { CardTooltip } from '../components/CardTooltip';\nimport { DonutChartTooltipContent } from './DonutChartTooltipContent';\nimport type { AverageCardComponentProps, TooltipPosition } from './types';\nimport { AverageCardPieCenterLabel } from './AverageCardPieCenterLabel';\nimport { formatPercentage } from '../../../utils/formatPercentage';\n\nconst AVERAGE_SCORE_SLICE = 'averageScoreFill';\nconst AVERAGE_REMAINDER_SLICE = 'averageScoreRemainder';\n\nfunction clampPercentForDonut(rawPercent: number): {\n fill: number;\n remainder: number;\n} {\n const fill = Math.min(100, Math.max(0, rawPercent));\n return { fill, remainder: 100 - fill };\n}\n\nexport const AverageCardComponent = ({\n scorecard,\n cardTitle,\n description,\n aggregationId,\n showSubheader = true,\n showInfo = true,\n dataTestId,\n}: AverageCardComponentProps) => {\n const theme = useTheme();\n\n const [centerTooltipPosition, setCenterTooltipPosition] =\n useState<TooltipPosition | null>(null);\n\n const updateCenterTooltipPosition = (e: MouseEvent<SVGCircleElement>) => {\n const rect = e.currentTarget.getBoundingClientRect();\n setCenterTooltipPosition({\n left: rect.left + rect.width / 2,\n top: rect.top,\n });\n };\n\n const averageScorePercent = scorecard.result.averageScore;\n\n const { fill: chartFillPercent, remainder: chartRemainderPercent } =\n clampPercentForDonut(averageScorePercent);\n\n const centerPercentLabel = `${formatPercentage(averageScorePercent)}%`;\n\n const arcResolvedColor = resolveStatusColor(\n theme,\n scorecard.result.aggregationChartDisplayColor,\n );\n\n const averagePieData: PieData[] = [\n {\n name: AVERAGE_SCORE_SLICE,\n value: chartFillPercent,\n color: arcResolvedColor,\n },\n {\n name: AVERAGE_REMAINDER_SLICE,\n value: chartRemainderPercent,\n color: theme.palette.grey[300],\n },\n ];\n\n const subheader = showSubheader ? (\n <CardSubheader\n aggregationId={aggregationId}\n scorecardId={scorecard.id}\n entitiesCount={scorecard.result.total}\n entitiesConsidered={scorecard.result.entitiesConsidered}\n calculationErrorCount={scorecard.result.calculationErrorCount}\n />\n ) : null;\n\n const info = showInfo ? (\n <CardInfoButton timestamp={scorecard.result.timestamp} />\n ) : null;\n\n return (\n <CardWrapper\n title={cardTitle}\n dataTestId={dataTestId}\n subheader={subheader}\n description={description}\n info={info}\n >\n <CardChartContainer>\n <ResponsivePieChart\n pieData={averagePieData}\n LabelContent={props => (\n <AverageCardPieCenterLabel\n {...props}\n centerPercentLabel={centerPercentLabel}\n arcResolvedColor={arcResolvedColor}\n updateCenterTooltipPosition={updateCenterTooltipPosition}\n setCenterTooltipPosition={setCenterTooltipPosition}\n />\n )}\n />\n\n {centerTooltipPosition && (\n <CardTooltip\n tooltipPosition={centerTooltipPosition}\n pieData={averagePieData}\n payload={[\n {\n name: AVERAGE_SCORE_SLICE,\n value: 1,\n payload: averagePieData[0],\n },\n ]}\n customContent={\n <DonutChartTooltipContent\n weightedSum={scorecard.result.averageWeightedSum}\n maxPossible={scorecard.result.averageMaxPossible}\n statusValues={scorecard.result.values}\n />\n }\n />\n )}\n </CardChartContainer>\n </CardWrapper>\n );\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AverageCardComponent.esm.js","sources":["../../../../src/components/AggregatedMetricCards/AverageCard/AverageCardComponent.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 type { MouseEvent } from 'react';\n\nimport { useTheme } from '@mui/material/styles';\n\nimport { CardWrapper } from '../../Common/CardWrapper';\nimport type { PieData } from '../../types';\nimport { resolveStatusColor } from '../../../utils';\nimport { ResponsivePieChart } from '../../ScorecardHomepageSection/ResponsivePieChart';\nimport { CardInfoButton } from '../components/CardInfoButton';\nimport { CardSubheader } from '../components/CardSubheader';\nimport { CardChartContainer } from '../components/CardChartContainer';\nimport { CardTooltip } from '../components/CardTooltip';\nimport { DonutChartTooltipContent } from './DonutChartTooltipContent';\nimport type { AverageCardComponentProps, TooltipPosition } from './types';\nimport { AverageCardPieCenterLabel } from './AverageCardPieCenterLabel';\nimport { formatPercentage } from '../../../utils/formatPercentage';\n\nconst AVERAGE_SCORE_SLICE = 'averageScoreFill';\nconst AVERAGE_REMAINDER_SLICE = 'averageScoreRemainder';\n\nfunction clampPercentForDonut(rawPercent: number): {\n fill: number;\n remainder: number;\n} {\n const fill = Math.min(100, Math.max(0, rawPercent));\n return { fill, remainder: 100 - fill };\n}\n\nexport const AverageCardComponent = ({\n scorecard,\n cardTitle,\n description,\n aggregationId,\n showSubheader = true,\n showInfo = true,\n dataTestId,\n}: AverageCardComponentProps) => {\n const theme = useTheme();\n\n const [centerTooltipPosition, setCenterTooltipPosition] =\n useState<TooltipPosition | null>(null);\n\n const updateCenterTooltipPosition = (e: MouseEvent<SVGCircleElement>) => {\n const rect = e.currentTarget.getBoundingClientRect();\n setCenterTooltipPosition({\n left: rect.left + rect.width / 2,\n top: rect.top,\n });\n };\n\n const averageScorePercent = scorecard.result.averageScore;\n\n const { fill: chartFillPercent, remainder: chartRemainderPercent } =\n clampPercentForDonut(averageScorePercent);\n\n const centerPercentLabel = `${formatPercentage(averageScorePercent)}%`;\n\n const arcResolvedColor = resolveStatusColor(\n theme,\n scorecard.result.aggregationChartDisplayColor,\n );\n\n const averagePieData: PieData[] = [\n {\n name: AVERAGE_SCORE_SLICE,\n value: chartFillPercent,\n color: arcResolvedColor,\n },\n {\n name: AVERAGE_REMAINDER_SLICE,\n value: chartRemainderPercent,\n color: theme.palette.grey[300],\n },\n ];\n\n const subheader = showSubheader ? (\n <CardSubheader\n aggregationId={aggregationId}\n scorecardId={scorecard.id}\n entitiesCount={scorecard.result.total}\n entitiesConsidered={scorecard.result.entitiesConsidered}\n calculationErrorCount={scorecard.result.calculationErrorCount}\n />\n ) : null;\n\n const info = showInfo ? (\n <CardInfoButton timestamp={scorecard.result.timestamp} />\n ) : null;\n\n return (\n <CardWrapper\n title={cardTitle}\n dataTestId={dataTestId}\n subheader={subheader}\n description={description}\n info={info}\n >\n <CardChartContainer>\n <ResponsivePieChart\n pieData={averagePieData}\n LabelContent={props => (\n <AverageCardPieCenterLabel\n {...props}\n centerPercentLabel={centerPercentLabel}\n arcResolvedColor={arcResolvedColor}\n updateCenterTooltipPosition={updateCenterTooltipPosition}\n setCenterTooltipPosition={setCenterTooltipPosition}\n />\n )}\n />\n\n {centerTooltipPosition && (\n <CardTooltip\n tooltipPosition={centerTooltipPosition}\n pieData={averagePieData}\n payload={[\n {\n name: AVERAGE_SCORE_SLICE,\n value: 1,\n payload: averagePieData[0],\n },\n ]}\n customContent={\n <DonutChartTooltipContent\n weightedSum={scorecard.result.averageWeightedSum}\n maxPossible={scorecard.result.averageMaxPossible}\n statusValues={scorecard.result.values}\n />\n }\n />\n )}\n </CardChartContainer>\n </CardWrapper>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"AverageCardPieCenterLabel.esm.js","sources":["../../../../src/components/AggregatedMetricCards/AverageCard/AverageCardPieCenterLabel.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 { PieLabelRenderProps } from 'recharts';\n\nimport { TooltipPosition } from './types';\n\ntype AverageCardPieCenterLabelProps = PieLabelRenderProps & {\n centerPercentLabel: string;\n arcResolvedColor: string;\n updateCenterTooltipPosition: (e: React.MouseEvent<SVGCircleElement>) => void;\n setCenterTooltipPosition: (position: TooltipPosition | null) => void;\n};\n\nexport function AverageCardPieCenterLabel({\n cx,\n cy,\n index,\n centerPercentLabel,\n arcResolvedColor,\n updateCenterTooltipPosition,\n setCenterTooltipPosition,\n}: AverageCardPieCenterLabelProps) {\n if (\n cx === undefined ||\n cx === null ||\n cy === undefined ||\n cy === null ||\n index === undefined ||\n index !== 0\n ) {\n return null;\n }\n const cxNum = Number(cx);\n const cyNum = Number(cy);\n return (\n <g style={{ cursor: 'pointer' }}>\n <circle\n cx={cxNum}\n cy={cyNum}\n r={52}\n fill=\"transparent\"\n stroke=\"none\"\n pointerEvents=\"all\"\n data-testid=\"average-card-center-percent-hit-area\"\n onMouseEnter={e => {\n updateCenterTooltipPosition(e);\n }}\n onMouseMove={updateCenterTooltipPosition}\n onMouseLeave={() => setCenterTooltipPosition(null)}\n />\n <text\n x={cxNum}\n y={cyNum}\n textAnchor=\"middle\"\n dominantBaseline=\"middle\"\n fill={arcResolvedColor}\n fontSize={24}\n fontWeight={500}\n pointerEvents=\"none\"\n data-testid=\"average-card-center-percent\"\n >\n {centerPercentLabel}\n </text>\n </g>\n );\n}\n"],"names":[],"mappings":";;AA2BO,SAAS,yBAA0B,CAAA;AAAA,EACxC,EAAA;AAAA,EACA,EAAA;AAAA,EACA,KAAA;AAAA,EACA,kBAAA;AAAA,EACA,gBAAA;AAAA,EACA,2BAAA;AAAA,EACA;AACF,CAAmC,EAAA;AACjC,EACE,IAAA,EAAA,KAAO,MACP,IAAA,EAAA,KAAO,IACP,IAAA,EAAA,KAAO,MACP,IAAA,EAAA,KAAO,IACP,IAAA,KAAA,KAAU,MACV,IAAA,KAAA,KAAU,CACV,EAAA;AACA,IAAO,OAAA,IAAA;AAAA;AAET,EAAM,MAAA,KAAA,GAAQ,OAAO,EAAE,CAAA;AACvB,EAAM,MAAA,KAAA,GAAQ,OAAO,EAAE,CAAA;AACvB,EAAA,4BACG,GAAE,EAAA,EAAA,KAAA,EAAO,EAAE,MAAA,EAAQ,WAClB,EAAA,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,EAAI,EAAA,KAAA;AAAA,QACJ,EAAI,EAAA,KAAA;AAAA,QACJ,CAAG,EAAA,EAAA;AAAA,QACH,IAAK,EAAA,aAAA;AAAA,QACL,MAAO,EAAA,MAAA;AAAA,QACP,aAAc,EAAA,KAAA;AAAA,QACd,aAAY,EAAA,sCAAA;AAAA,QACZ,cAAc,CAAK,CAAA,KAAA;AACjB,UAAA,2BAAA,CAA4B,CAAC,CAAA;AAAA,SAC/B;AAAA,QACA,WAAa,EAAA,2BAAA;AAAA,QACb,YAAA,EAAc,MAAM,wBAAA,CAAyB,IAAI;AAAA;AAAA,KACnD;AAAA,oBACA,GAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,CAAG,EAAA,KAAA;AAAA,QACH,CAAG,EAAA,KAAA;AAAA,QACH,UAAW,EAAA,QAAA;AAAA,QACX,gBAAiB,EAAA,QAAA;AAAA,QACjB,IAAM,EAAA,gBAAA;AAAA,QACN,QAAU,EAAA,EAAA;AAAA,QACV,UAAY,EAAA,GAAA;AAAA,QACZ,aAAc,EAAA,MAAA;AAAA,QACd,aAAY,EAAA,6BAAA;AAAA,QAEX,QAAA,EAAA;AAAA;AAAA;AACH,GACF,EAAA,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"AverageCardPieCenterLabel.esm.js","sources":["../../../../src/components/AggregatedMetricCards/AverageCard/AverageCardPieCenterLabel.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 { PieLabelRenderProps } from 'recharts';\n\nimport { TooltipPosition } from './types';\n\ntype AverageCardPieCenterLabelProps = PieLabelRenderProps & {\n centerPercentLabel: string;\n arcResolvedColor: string;\n updateCenterTooltipPosition: (e: React.MouseEvent<SVGCircleElement>) => void;\n setCenterTooltipPosition: (position: TooltipPosition | null) => void;\n};\n\nexport function AverageCardPieCenterLabel({\n cx,\n cy,\n index,\n centerPercentLabel,\n arcResolvedColor,\n updateCenterTooltipPosition,\n setCenterTooltipPosition,\n}: AverageCardPieCenterLabelProps) {\n if (\n cx === undefined ||\n cx === null ||\n cy === undefined ||\n cy === null ||\n index === undefined ||\n index !== 0\n ) {\n return null;\n }\n const cxNum = Number(cx);\n const cyNum = Number(cy);\n return (\n <g style={{ cursor: 'pointer' }}>\n <circle\n cx={cxNum}\n cy={cyNum}\n r={52}\n fill=\"transparent\"\n stroke=\"none\"\n pointerEvents=\"all\"\n data-testid=\"average-card-center-percent-hit-area\"\n onMouseEnter={e => {\n updateCenterTooltipPosition(e);\n }}\n onMouseMove={updateCenterTooltipPosition}\n onMouseLeave={() => setCenterTooltipPosition(null)}\n />\n <text\n x={cxNum}\n y={cyNum}\n textAnchor=\"middle\"\n dominantBaseline=\"middle\"\n fill={arcResolvedColor}\n fontSize={24}\n fontWeight={500}\n pointerEvents=\"none\"\n data-testid=\"average-card-center-percent\"\n >\n {centerPercentLabel}\n </text>\n </g>\n );\n}\n"],"names":[],"mappings":";;AA2BO,SAAS,yBAAA,CAA0B;AAAA,EACxC,EAAA;AAAA,EACA,EAAA;AAAA,EACA,KAAA;AAAA,EACA,kBAAA;AAAA,EACA,gBAAA;AAAA,EACA,2BAAA;AAAA,EACA;AACF,CAAA,EAAmC;AACjC,EAAA,IACE,EAAA,KAAO,MAAA,IACP,EAAA,KAAO,IAAA,IACP,EAAA,KAAO,MAAA,IACP,EAAA,KAAO,IAAA,IACP,KAAA,KAAU,MAAA,IACV,KAAA,KAAU,CAAA,EACV;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,KAAA,GAAQ,OAAO,EAAE,CAAA;AACvB,EAAA,MAAM,KAAA,GAAQ,OAAO,EAAE,CAAA;AACvB,EAAA,4BACG,GAAA,EAAA,EAAE,KAAA,EAAO,EAAE,MAAA,EAAQ,WAAU,EAC5B,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,EAAA,EAAI,KAAA;AAAA,QACJ,EAAA,EAAI,KAAA;AAAA,QACJ,CAAA,EAAG,EAAA;AAAA,QACH,IAAA,EAAK,aAAA;AAAA,QACL,MAAA,EAAO,MAAA;AAAA,QACP,aAAA,EAAc,KAAA;AAAA,QACd,aAAA,EAAY,sCAAA;AAAA,QACZ,cAAc,CAAA,CAAA,KAAK;AACjB,UAAA,2BAAA,CAA4B,CAAC,CAAA;AAAA,QAC/B,CAAA;AAAA,QACA,WAAA,EAAa,2BAAA;AAAA,QACb,YAAA,EAAc,MAAM,wBAAA,CAAyB,IAAI;AAAA;AAAA,KACnD;AAAA,oBACA,GAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,CAAA,EAAG,KAAA;AAAA,QACH,CAAA,EAAG,KAAA;AAAA,QACH,UAAA,EAAW,QAAA;AAAA,QACX,gBAAA,EAAiB,QAAA;AAAA,QACjB,IAAA,EAAM,gBAAA;AAAA,QACN,QAAA,EAAU,EAAA;AAAA,QACV,UAAA,EAAY,GAAA;AAAA,QACZ,aAAA,EAAc,MAAA;AAAA,QACd,aAAA,EAAY,6BAAA;AAAA,QAEX,QAAA,EAAA;AAAA;AAAA;AACH,GAAA,EACF,CAAA;AAEJ;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"DonutChartTooltipContent.esm.js","sources":["../../../../src/components/AggregatedMetricCards/AverageCard/DonutChartTooltipContent.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 { AggregatedMetricValue } from '@red-hat-developer-hub/backstage-plugin-scorecard-common';\nimport Box from '@mui/material/Box';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\n\nimport { TooltipContent, formatAggregationScoreDetail } from './TooltipContent';\nimport { useTranslation } from '../../../hooks/useTranslation';\nimport { getTranslatedStatus } from '../../../utils';\n\nexport const DonutChartTooltipContent = ({\n weightedSum,\n maxPossible,\n statusValues = [],\n}: {\n weightedSum: number | undefined;\n maxPossible: number | undefined;\n statusValues?: AggregatedMetricValue[];\n}) => {\n const { t } = useTranslation();\n\n return (\n <Stack spacing={0.5} sx={{ minWidth: 220 }}>\n <Stack direction=\"row\" spacing={3}>\n <TooltipContent\n label={t('metric.averageCenterTooltipTotalLabel')}\n value={weightedSum}\n />\n <TooltipContent\n label={t('metric.averageCenterTooltipMaxLabel')}\n value={maxPossible}\n />\n </Stack>\n {statusValues.length > 0 ? (\n <Box\n sx={{\n borderTop: 1,\n borderColor: 'divider',\n pt: 1.5,\n }}\n >\n <Stack spacing={0.75}>\n {statusValues.map(row => (\n <Typography\n key={row.name}\n variant=\"body2\"\n sx={{ color: 'text.primary', fontWeight: 500 }}\n >\n {t('metric.averageCenterTooltipBreakdownRow', {\n count: row.count,\n status: getTranslatedStatus(row.name, t),\n score: formatAggregationScoreDetail(row.score ?? 0),\n } as any)}\n </Typography>\n ))}\n </Stack>\n </Box>\n ) : null}\n </Stack>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;AAyBO,MAAM,2BAA2B,CAAC;AAAA,EACvC,WAAA;AAAA,EACA,WAAA;AAAA,EACA,eAAe;AACjB,CAIM,KAAA;AACJ,EAAM,MAAA,EAAE,CAAE,EAAA,GAAI,cAAe,EAAA;AAE7B,EACE,uBAAA,IAAA,CAAC,SAAM,OAAS,EAAA,GAAA,EAAK,IAAI,EAAE,QAAA,EAAU,KACnC,EAAA,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAC,KAAM,EAAA,EAAA,SAAA,EAAU,KAAM,EAAA,OAAA,EAAS,CAC9B,EAAA,QAAA,EAAA;AAAA,sBAAA,GAAA;AAAA,QAAC,cAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO,EAAE,uCAAuC,CAAA;AAAA,UAChD,KAAO,EAAA;AAAA;AAAA,OACT;AAAA,sBACA,GAAA;AAAA,QAAC,cAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO,EAAE,qCAAqC,CAAA;AAAA,UAC9C,KAAO,EAAA;AAAA;AAAA;AACT,KACF,EAAA,CAAA;AAAA,IACC,YAAA,CAAa,SAAS,CACrB,mBAAA,GAAA;AAAA,MAAC,GAAA;AAAA,MAAA;AAAA,QACC,EAAI,EAAA;AAAA,UACF,SAAW,EAAA,CAAA;AAAA,UACX,WAAa,EAAA,SAAA;AAAA,UACb,EAAI,EAAA;AAAA,SACN;AAAA,QAEA,8BAAC,KAAM,EAAA,EAAA,OAAA,EAAS,IACb,EAAA,QAAA,EAAA,YAAA,CAAa,IAAI,CAChB,GAAA,qBAAA,GAAA;AAAA,UAAC,UAAA;AAAA,UAAA;AAAA,YAEC,OAAQ,EAAA,OAAA;AAAA,YACR,EAAI,EAAA,EAAE,KAAO,EAAA,cAAA,EAAgB,YAAY,GAAI,EAAA;AAAA,YAE5C,YAAE,yCAA2C,EAAA;AAAA,cAC5C,OAAO,GAAI,CAAA,KAAA;AAAA,cACX,MAAQ,EAAA,mBAAA,CAAoB,GAAI,CAAA,IAAA,EAAM,CAAC,CAAA;AAAA,cACvC,KAAO,EAAA,4BAAA,CAA6B,GAAI,CAAA,KAAA,IAAS,CAAC;AAAA,aAC5C;AAAA,WAAA;AAAA,UARH,GAAI,CAAA;AAAA,SAUZ,CACH,EAAA;AAAA;AAAA,KAEA,GAAA;AAAA,GACN,EAAA,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"DonutChartTooltipContent.esm.js","sources":["../../../../src/components/AggregatedMetricCards/AverageCard/DonutChartTooltipContent.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 { AggregatedMetricValue } from '@red-hat-developer-hub/backstage-plugin-scorecard-common';\nimport Box from '@mui/material/Box';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\n\nimport { TooltipContent, formatAggregationScoreDetail } from './TooltipContent';\nimport { useTranslation } from '../../../hooks/useTranslation';\nimport { getTranslatedStatus } from '../../../utils';\n\nexport const DonutChartTooltipContent = ({\n weightedSum,\n maxPossible,\n statusValues = [],\n}: {\n weightedSum: number | undefined;\n maxPossible: number | undefined;\n statusValues?: AggregatedMetricValue[];\n}) => {\n const { t } = useTranslation();\n\n return (\n <Stack spacing={0.5} sx={{ minWidth: 220 }}>\n <Stack direction=\"row\" spacing={3}>\n <TooltipContent\n label={t('metric.averageCenterTooltipTotalLabel')}\n value={weightedSum}\n />\n <TooltipContent\n label={t('metric.averageCenterTooltipMaxLabel')}\n value={maxPossible}\n />\n </Stack>\n {statusValues.length > 0 ? (\n <Box\n sx={{\n borderTop: 1,\n borderColor: 'divider',\n pt: 1.5,\n }}\n >\n <Stack spacing={0.75}>\n {statusValues.map(row => (\n <Typography\n key={row.name}\n variant=\"body2\"\n sx={{ color: 'text.primary', fontWeight: 500 }}\n >\n {t('metric.averageCenterTooltipBreakdownRow', {\n count: row.count,\n status: getTranslatedStatus(row.name, t),\n score: formatAggregationScoreDetail(row.score ?? 0),\n } as any)}\n </Typography>\n ))}\n </Stack>\n </Box>\n ) : null}\n </Stack>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;AAyBO,MAAM,2BAA2B,CAAC;AAAA,EACvC,WAAA;AAAA,EACA,WAAA;AAAA,EACA,eAAe;AACjB,CAAA,KAIM;AACJ,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,cAAA,EAAe;AAE7B,EAAA,uBACE,IAAA,CAAC,SAAM,OAAA,EAAS,GAAA,EAAK,IAAI,EAAE,QAAA,EAAU,KAAI,EACvC,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAC,KAAA,EAAA,EAAM,SAAA,EAAU,KAAA,EAAM,OAAA,EAAS,CAAA,EAC9B,QAAA,EAAA;AAAA,sBAAA,GAAA;AAAA,QAAC,cAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO,EAAE,uCAAuC,CAAA;AAAA,UAChD,KAAA,EAAO;AAAA;AAAA,OACT;AAAA,sBACA,GAAA;AAAA,QAAC,cAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO,EAAE,qCAAqC,CAAA;AAAA,UAC9C,KAAA,EAAO;AAAA;AAAA;AACT,KAAA,EACF,CAAA;AAAA,IACC,YAAA,CAAa,SAAS,CAAA,mBACrB,GAAA;AAAA,MAAC,GAAA;AAAA,MAAA;AAAA,QACC,EAAA,EAAI;AAAA,UACF,SAAA,EAAW,CAAA;AAAA,UACX,WAAA,EAAa,SAAA;AAAA,UACb,EAAA,EAAI;AAAA,SACN;AAAA,QAEA,8BAAC,KAAA,EAAA,EAAM,OAAA,EAAS,IAAA,EACb,QAAA,EAAA,YAAA,CAAa,IAAI,CAAA,GAAA,qBAChB,GAAA;AAAA,UAAC,UAAA;AAAA,UAAA;AAAA,YAEC,OAAA,EAAQ,OAAA;AAAA,YACR,EAAA,EAAI,EAAE,KAAA,EAAO,cAAA,EAAgB,YAAY,GAAA,EAAI;AAAA,YAE5C,YAAE,yCAAA,EAA2C;AAAA,cAC5C,OAAO,GAAA,CAAI,KAAA;AAAA,cACX,MAAA,EAAQ,mBAAA,CAAoB,GAAA,CAAI,IAAA,EAAM,CAAC,CAAA;AAAA,cACvC,KAAA,EAAO,4BAAA,CAA6B,GAAA,CAAI,KAAA,IAAS,CAAC;AAAA,aAC5C;AAAA,WAAA;AAAA,UARH,GAAA,CAAI;AAAA,SAUZ,CAAA,EACH;AAAA;AAAA,KACF,GACE;AAAA,GAAA,EACN,CAAA;AAEJ;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"TooltipContent.esm.js","sources":["../../../../src/components/AggregatedMetricCards/AverageCard/TooltipContent.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 Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\n\nexport const formatAggregationScoreDetail = (\n value?: number | string,\n): string => {\n if (typeof value === 'string') {\n return value;\n }\n\n if (value === undefined || !Number.isFinite(value)) {\n return '—';\n }\n\n return Number.isInteger(value)\n ? String(value)\n : value.toLocaleString(undefined, { maximumFractionDigits: 2 });\n};\n\nexport const TooltipContent = ({\n label,\n value,\n}: {\n label: string;\n value?: number | string;\n}) => {\n return (\n <Stack>\n <Typography sx={{ fontSize: '0.875rem', margin: 0, fontWeight: 500 }}>\n {label}\n </Typography>\n {value !== undefined && value !== null && (\n <Typography\n sx={{\n fontSize: '2.5rem',\n margin: 0,\n color: '#37a3a3',\n fontWeight: 500,\n }}\n >\n {formatAggregationScoreDetail(value)}\n </Typography>\n )}\n </Stack>\n );\n};\n"],"names":[],"mappings":";;;;AAmBa,MAAA,4BAAA,GAA+B,CAC1C,KACW,KAAA;AACX,EAAI,IAAA,OAAO,UAAU,QAAU,EAAA;AAC7B,IAAO,OAAA,KAAA;AAAA;AAGT,EAAA,IAAI,UAAU,MAAa,IAAA,CAAC,MAAO,CAAA,QAAA,CAAS,KAAK,CAAG,EAAA;AAClD,IAAO,OAAA,QAAA;AAAA;AAGT,EAAA,OAAO,MAAO,CAAA,SAAA,CAAU,KAAK,CAAA,GACzB,MAAO,CAAA,KAAK,CACZ,GAAA,KAAA,CAAM,cAAe,CAAA,MAAA,EAAW,EAAE,qBAAA,EAAuB,GAAG,CAAA;AAClE;AAEO,MAAM,iBAAiB,CAAC;AAAA,EAC7B,KAAA;AAAA,EACA;AACF,CAGM,KAAA;AACJ,EAAA,4BACG,KACC,EAAA,EAAA,QAAA,EAAA;AAAA,oBAAC,GAAA,CAAA,UAAA,EAAA,EAAW,EAAI,EAAA,EAAE,QAAU,EAAA,UAAA,EAAY,QAAQ,CAAG,EAAA,UAAA,EAAY,GAAI,EAAA,EAChE,QACH,EAAA,KAAA,EAAA,CAAA;AAAA,IACC,KAAA,KAAU,MAAa,IAAA,KAAA,KAAU,IAChC,oBAAA,GAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,EAAI,EAAA;AAAA,UACF,QAAU,EAAA,QAAA;AAAA,UACV,MAAQ,EAAA,CAAA;AAAA,UACR,KAAO,EAAA,SAAA;AAAA,UACP,UAAY,EAAA;AAAA,SACd;AAAA,QAEC,uCAA6B,KAAK;AAAA;AAAA;AACrC,GAEJ,EAAA,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"TooltipContent.esm.js","sources":["../../../../src/components/AggregatedMetricCards/AverageCard/TooltipContent.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 Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\n\nexport const formatAggregationScoreDetail = (\n value?: number | string,\n): string => {\n if (typeof value === 'string') {\n return value;\n }\n\n if (value === undefined || !Number.isFinite(value)) {\n return '—';\n }\n\n return Number.isInteger(value)\n ? String(value)\n : value.toLocaleString(undefined, { maximumFractionDigits: 2 });\n};\n\nexport const TooltipContent = ({\n label,\n value,\n}: {\n label: string;\n value?: number | string;\n}) => {\n return (\n <Stack>\n <Typography sx={{ fontSize: '0.875rem', margin: 0, fontWeight: 500 }}>\n {label}\n </Typography>\n {value !== undefined && value !== null && (\n <Typography\n sx={{\n fontSize: '2.5rem',\n margin: 0,\n color: '#37a3a3',\n fontWeight: 500,\n }}\n >\n {formatAggregationScoreDetail(value)}\n </Typography>\n )}\n </Stack>\n );\n};\n"],"names":[],"mappings":";;;;AAmBO,MAAM,4BAAA,GAA+B,CAC1C,KAAA,KACW;AACX,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI,UAAU,MAAA,IAAa,CAAC,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,EAAG;AAClD,IAAA,OAAO,QAAA;AAAA,EACT;AAEA,EAAA,OAAO,MAAA,CAAO,SAAA,CAAU,KAAK,CAAA,GACzB,MAAA,CAAO,KAAK,CAAA,GACZ,KAAA,CAAM,cAAA,CAAe,MAAA,EAAW,EAAE,qBAAA,EAAuB,GAAG,CAAA;AAClE;AAEO,MAAM,iBAAiB,CAAC;AAAA,EAC7B,KAAA;AAAA,EACA;AACF,CAAA,KAGM;AACJ,EAAA,4BACG,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,UAAA,EAAA,EAAW,EAAA,EAAI,EAAE,QAAA,EAAU,UAAA,EAAY,QAAQ,CAAA,EAAG,UAAA,EAAY,GAAA,EAAI,EAChE,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,IACC,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,oBAChC,GAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,EAAA,EAAI;AAAA,UACF,QAAA,EAAU,QAAA;AAAA,UACV,MAAA,EAAQ,CAAA;AAAA,UACR,KAAA,EAAO,SAAA;AAAA,UACP,UAAA,EAAY;AAAA,SACd;AAAA,QAEC,uCAA6B,KAAK;AAAA;AAAA;AACrC,GAAA,EAEJ,CAAA;AAEJ;;;;"}