@backstage-community/plugin-apiiro 0.1.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 (223) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +232 -0
  3. package/config.d.ts +30 -0
  4. package/dist/App.esm.js +12 -0
  5. package/dist/App.esm.js.map +1 -0
  6. package/dist/api/index.esm.js +71 -0
  7. package/dist/api/index.esm.js.map +1 -0
  8. package/dist/assets/BulleyeIcon.esm.js +454 -0
  9. package/dist/assets/BulleyeIcon.esm.js.map +1 -0
  10. package/dist/assets/NoResultIcon.esm.js +146 -0
  11. package/dist/assets/NoResultIcon.esm.js.map +1 -0
  12. package/dist/assets/RiskIcon.esm.js +27 -0
  13. package/dist/assets/RiskIcon.esm.js.map +1 -0
  14. package/dist/assets/SettingIcon.esm.js +49 -0
  15. package/dist/assets/SettingIcon.esm.js.map +1 -0
  16. package/dist/assets/apiiroLogo/apiiroLogo.esm.js +21 -0
  17. package/dist/assets/apiiroLogo/apiiroLogo.esm.js.map +1 -0
  18. package/dist/assets/apiiroLogo/apiiroSidebar.esm.js +23 -0
  19. package/dist/assets/apiiroLogo/apiiroSidebar.esm.js.map +1 -0
  20. package/dist/assets/apiiroLogo/apiiroSmall.esm.js +19 -0
  21. package/dist/assets/apiiroLogo/apiiroSmall.esm.js.map +1 -0
  22. package/dist/assets/languageIcons/C.esm.js +7 -0
  23. package/dist/assets/languageIcons/C.esm.js.map +1 -0
  24. package/dist/assets/languageIcons/Cicd.esm.js +7 -0
  25. package/dist/assets/languageIcons/Cicd.esm.js.map +1 -0
  26. package/dist/assets/languageIcons/Clojure.esm.js +7 -0
  27. package/dist/assets/languageIcons/Clojure.esm.js.map +1 -0
  28. package/dist/assets/languageIcons/Cpp.esm.js +7 -0
  29. package/dist/assets/languageIcons/Cpp.esm.js.map +1 -0
  30. package/dist/assets/languageIcons/Csharp.esm.js +7 -0
  31. package/dist/assets/languageIcons/Csharp.esm.js.map +1 -0
  32. package/dist/assets/languageIcons/Dart.esm.js +7 -0
  33. package/dist/assets/languageIcons/Dart.esm.js.map +1 -0
  34. package/dist/assets/languageIcons/Go.esm.js +7 -0
  35. package/dist/assets/languageIcons/Go.esm.js.map +1 -0
  36. package/dist/assets/languageIcons/Groovy.esm.js +7 -0
  37. package/dist/assets/languageIcons/Groovy.esm.js.map +1 -0
  38. package/dist/assets/languageIcons/HTML.esm.js +7 -0
  39. package/dist/assets/languageIcons/HTML.esm.js.map +1 -0
  40. package/dist/assets/languageIcons/HclLanguage.esm.js +7 -0
  41. package/dist/assets/languageIcons/HclLanguage.esm.js.map +1 -0
  42. package/dist/assets/languageIcons/Java.esm.js +7 -0
  43. package/dist/assets/languageIcons/Java.esm.js.map +1 -0
  44. package/dist/assets/languageIcons/Javascript.esm.js +7 -0
  45. package/dist/assets/languageIcons/Javascript.esm.js.map +1 -0
  46. package/dist/assets/languageIcons/Kotlin.esm.js +7 -0
  47. package/dist/assets/languageIcons/Kotlin.esm.js.map +1 -0
  48. package/dist/assets/languageIcons/ObjectiveC.esm.js +7 -0
  49. package/dist/assets/languageIcons/ObjectiveC.esm.js.map +1 -0
  50. package/dist/assets/languageIcons/PHP.esm.js +7 -0
  51. package/dist/assets/languageIcons/PHP.esm.js.map +1 -0
  52. package/dist/assets/languageIcons/Perl.esm.js +13 -0
  53. package/dist/assets/languageIcons/Perl.esm.js.map +1 -0
  54. package/dist/assets/languageIcons/Python.esm.js +7 -0
  55. package/dist/assets/languageIcons/Python.esm.js.map +1 -0
  56. package/dist/assets/languageIcons/Ruby.esm.js +7 -0
  57. package/dist/assets/languageIcons/Ruby.esm.js.map +1 -0
  58. package/dist/assets/languageIcons/Rust.esm.js +7 -0
  59. package/dist/assets/languageIcons/Rust.esm.js.map +1 -0
  60. package/dist/assets/languageIcons/Scala.esm.js +7 -0
  61. package/dist/assets/languageIcons/Scala.esm.js.map +1 -0
  62. package/dist/assets/languageIcons/Swift.esm.js +7 -0
  63. package/dist/assets/languageIcons/Swift.esm.js.map +1 -0
  64. package/dist/assets/languageIcons/Terraform.esm.js +7 -0
  65. package/dist/assets/languageIcons/Terraform.esm.js.map +1 -0
  66. package/dist/assets/languageIcons/Typescript.esm.js +7 -0
  67. package/dist/assets/languageIcons/Typescript.esm.js.map +1 -0
  68. package/dist/assets/languageIcons/Unknown.esm.js +7 -0
  69. package/dist/assets/languageIcons/Unknown.esm.js.map +1 -0
  70. package/dist/assets/languageIcons/VB.esm.js +10 -0
  71. package/dist/assets/languageIcons/VB.esm.js.map +1 -0
  72. package/dist/assets/languageIcons/YAML.esm.js +7 -0
  73. package/dist/assets/languageIcons/YAML.esm.js.map +1 -0
  74. package/dist/assets/providerIcons/Azure.esm.js +7 -0
  75. package/dist/assets/providerIcons/Azure.esm.js.map +1 -0
  76. package/dist/assets/providerIcons/Bitbucket.esm.js +7 -0
  77. package/dist/assets/providerIcons/Bitbucket.esm.js.map +1 -0
  78. package/dist/assets/providerIcons/Gitlab.esm.js +7 -0
  79. package/dist/assets/providerIcons/Gitlab.esm.js.map +1 -0
  80. package/dist/components/ApiiroSidebar.esm.js +10 -0
  81. package/dist/components/ApiiroSidebar.esm.js.map +1 -0
  82. package/dist/components/ApplicationsList/ApplicationsList.esm.js +196 -0
  83. package/dist/components/ApplicationsList/ApplicationsList.esm.js.map +1 -0
  84. package/dist/components/CalendarDatePicker.esm.js +154 -0
  85. package/dist/components/CalendarDatePicker.esm.js.map +1 -0
  86. package/dist/components/CalendarDatePicker.styles.esm.js +198 -0
  87. package/dist/components/CalendarDatePicker.styles.esm.js.map +1 -0
  88. package/dist/components/Chip.esm.js +60 -0
  89. package/dist/components/Chip.esm.js.map +1 -0
  90. package/dist/components/ChipsList.esm.js +207 -0
  91. package/dist/components/ChipsList.esm.js.map +1 -0
  92. package/dist/components/ComponentDisplay.esm.js +42 -0
  93. package/dist/components/ComponentDisplay.esm.js.map +1 -0
  94. package/dist/components/DataGrid/CustomColumnMenu.esm.js +29 -0
  95. package/dist/components/DataGrid/CustomColumnMenu.esm.js.map +1 -0
  96. package/dist/components/DataGrid/CustomPagination.esm.js +113 -0
  97. package/dist/components/DataGrid/CustomPagination.esm.js.map +1 -0
  98. package/dist/components/DataGrid/CustomSearchToolbar.esm.js +117 -0
  99. package/dist/components/DataGrid/CustomSearchToolbar.esm.js.map +1 -0
  100. package/dist/components/DataGrid/DataGrid.esm.js +336 -0
  101. package/dist/components/DataGrid/DataGrid.esm.js.map +1 -0
  102. package/dist/components/DataGrid/PinColumnMenuItem.esm.js +24 -0
  103. package/dist/components/DataGrid/PinColumnMenuItem.esm.js.map +1 -0
  104. package/dist/components/DueDate.esm.js +34 -0
  105. package/dist/components/DueDate.esm.js.map +1 -0
  106. package/dist/components/Header.esm.js +27 -0
  107. package/dist/components/Header.esm.js.map +1 -0
  108. package/dist/components/MainContributors/MainContributors.esm.js +62 -0
  109. package/dist/components/MainContributors/MainContributors.esm.js.map +1 -0
  110. package/dist/components/MetricsGroup/TabMetricsGroup.esm.js +37 -0
  111. package/dist/components/MetricsGroup/TabMetricsGroup.esm.js.map +1 -0
  112. package/dist/components/MetricsGroup/WidgetMetricsGroup.esm.js +36 -0
  113. package/dist/components/MetricsGroup/WidgetMetricsGroup.esm.js.map +1 -0
  114. package/dist/components/RepositoryDisplay/RepositoryDisplay.esm.js +121 -0
  115. package/dist/components/RepositoryDisplay/RepositoryDisplay.esm.js.map +1 -0
  116. package/dist/components/RiskLevel.esm.js +88 -0
  117. package/dist/components/RiskLevel.esm.js.map +1 -0
  118. package/dist/components/RiskStatus.esm.js +58 -0
  119. package/dist/components/RiskStatus.esm.js.map +1 -0
  120. package/dist/components/SimpleTooltip.esm.js +24 -0
  121. package/dist/components/SimpleTooltip.esm.js.map +1 -0
  122. package/dist/components/SourcesDisplay.esm.js +47 -0
  123. package/dist/components/SourcesDisplay.esm.js.map +1 -0
  124. package/dist/components/TagsList/TagsList.esm.js +38 -0
  125. package/dist/components/TagsList/TagsList.esm.js.map +1 -0
  126. package/dist/components/TeamsDisplay.esm.js +47 -0
  127. package/dist/components/TeamsDisplay.esm.js.map +1 -0
  128. package/dist/components/charts/ColumnChart.esm.js +402 -0
  129. package/dist/components/charts/ColumnChart.esm.js.map +1 -0
  130. package/dist/components/charts/GaugeChart.esm.js +249 -0
  131. package/dist/components/charts/GaugeChart.esm.js.map +1 -0
  132. package/dist/components/charts/LineChart.esm.js +328 -0
  133. package/dist/components/charts/LineChart.esm.js.map +1 -0
  134. package/dist/components/charts/PieChart.esm.js +233 -0
  135. package/dist/components/charts/PieChart.esm.js.map +1 -0
  136. package/dist/components/common/ChartBox.esm.js +88 -0
  137. package/dist/components/common/ChartBox.esm.js.map +1 -0
  138. package/dist/components/common/CustomTooltip.esm.js +255 -0
  139. package/dist/components/common/CustomTooltip.esm.js.map +1 -0
  140. package/dist/components/common/ErrorSnackbar.esm.js +39 -0
  141. package/dist/components/common/ErrorSnackbar.esm.js.map +1 -0
  142. package/dist/components/common/NotFound.esm.js +30 -0
  143. package/dist/components/common/NotFound.esm.js.map +1 -0
  144. package/dist/components/common/SomethingWentWrong.esm.js +35 -0
  145. package/dist/components/common/SomethingWentWrong.esm.js.map +1 -0
  146. package/dist/components/common/languageIcons.esm.js +61 -0
  147. package/dist/components/common/languageIcons.esm.js.map +1 -0
  148. package/dist/components/common/logoSpinner.esm.js +28 -0
  149. package/dist/components/common/logoSpinner.esm.js.map +1 -0
  150. package/dist/components/common/scmProviders.esm.js +41 -0
  151. package/dist/components/common/scmProviders.esm.js.map +1 -0
  152. package/dist/components/filters/DiscoveredOnFilter.esm.js +284 -0
  153. package/dist/components/filters/DiscoveredOnFilter.esm.js.map +1 -0
  154. package/dist/components/filters/FilterDropdown.esm.js +325 -0
  155. package/dist/components/filters/FilterDropdown.esm.js.map +1 -0
  156. package/dist/components/filters/FilterDropdownClear.esm.js +45 -0
  157. package/dist/components/filters/FilterDropdownClear.esm.js.map +1 -0
  158. package/dist/components/filters/FilterDropdownList.esm.js +102 -0
  159. package/dist/components/filters/FilterDropdownList.esm.js.map +1 -0
  160. package/dist/components/filters/FilterDropdownSearch.esm.js +65 -0
  161. package/dist/components/filters/FilterDropdownSearch.esm.js.map +1 -0
  162. package/dist/components/filters/RiskInsightFilter.esm.js +579 -0
  163. package/dist/components/filters/RiskInsightFilter.esm.js.map +1 -0
  164. package/dist/components/tiles/MttrVsSLATile.esm.js +170 -0
  165. package/dist/components/tiles/MttrVsSLATile.esm.js.map +1 -0
  166. package/dist/components/tiles/RiskOverTimeTile.esm.js +311 -0
  167. package/dist/components/tiles/RiskOverTimeTile.esm.js.map +1 -0
  168. package/dist/components/tiles/SLAAdherenceTile.esm.js +115 -0
  169. package/dist/components/tiles/SLAAdherenceTile.esm.js.map +1 -0
  170. package/dist/components/tiles/StatusTile.esm.js +235 -0
  171. package/dist/components/tiles/StatusTile.esm.js.map +1 -0
  172. package/dist/components/tiles/TopLanguagesTile.esm.js +234 -0
  173. package/dist/components/tiles/TopLanguagesTile.esm.js.map +1 -0
  174. package/dist/components/tiles/TopRiskTile.esm.js +208 -0
  175. package/dist/components/tiles/TopRiskTile.esm.js.map +1 -0
  176. package/dist/hooks/useUrlFilters.esm.js +102 -0
  177. package/dist/hooks/useUrlFilters.esm.js.map +1 -0
  178. package/dist/index.d.ts +28 -0
  179. package/dist/index.esm.js +42 -0
  180. package/dist/index.esm.js.map +1 -0
  181. package/dist/pages/Repositories/Repositories.esm.js +102 -0
  182. package/dist/pages/Repositories/Repositories.esm.js.map +1 -0
  183. package/dist/pages/Repositories/tableConfig.esm.js +294 -0
  184. package/dist/pages/Repositories/tableConfig.esm.js.map +1 -0
  185. package/dist/pages/Risks/Risks.esm.js +258 -0
  186. package/dist/pages/Risks/Risks.esm.js.map +1 -0
  187. package/dist/pages/Risks/tableConfig.esm.js +305 -0
  188. package/dist/pages/Risks/tableConfig.esm.js.map +1 -0
  189. package/dist/pages/tab/Tab.esm.js +147 -0
  190. package/dist/pages/tab/Tab.esm.js.map +1 -0
  191. package/dist/pages/tab/TabProvider.esm.js +11 -0
  192. package/dist/pages/tab/TabProvider.esm.js.map +1 -0
  193. package/dist/pages/widget/Widget.esm.js +161 -0
  194. package/dist/pages/widget/Widget.esm.js.map +1 -0
  195. package/dist/pages/widget/WidgetProvider.esm.js +12 -0
  196. package/dist/pages/widget/WidgetProvider.esm.js.map +1 -0
  197. package/dist/plugin.esm.js +30 -0
  198. package/dist/plugin.esm.js.map +1 -0
  199. package/dist/queries/filterOptions.queries.esm.js +46 -0
  200. package/dist/queries/filterOptions.queries.esm.js.map +1 -0
  201. package/dist/queries/mttr-statistics.queries.esm.js +61 -0
  202. package/dist/queries/mttr-statistics.queries.esm.js.map +1 -0
  203. package/dist/queries/repository.queries.esm.js +60 -0
  204. package/dist/queries/repository.queries.esm.js.map +1 -0
  205. package/dist/queries/risk-score-over-time.queries.esm.js +61 -0
  206. package/dist/queries/risk-score-over-time.queries.esm.js.map +1 -0
  207. package/dist/queries/risks.queries.esm.js +65 -0
  208. package/dist/queries/risks.queries.esm.js.map +1 -0
  209. package/dist/queries/sla-breach.queries.esm.js +57 -0
  210. package/dist/queries/sla-breach.queries.esm.js.map +1 -0
  211. package/dist/queries/top-risks.queries.esm.js +47 -0
  212. package/dist/queries/top-risks.queries.esm.js.map +1 -0
  213. package/dist/routes.esm.js +8 -0
  214. package/dist/routes.esm.js.map +1 -0
  215. package/dist/theme/themeUtils.esm.js +290 -0
  216. package/dist/theme/themeUtils.esm.js.map +1 -0
  217. package/dist/utils/dateFormatter.esm.js +67 -0
  218. package/dist/utils/dateFormatter.esm.js.map +1 -0
  219. package/dist/utils/numberFormatter.esm.js +21 -0
  220. package/dist/utils/numberFormatter.esm.js.map +1 -0
  221. package/dist/utils/utils.esm.js +27 -0
  222. package/dist/utils/utils.esm.js.map +1 -0
  223. package/package.json +90 -0
@@ -0,0 +1,62 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import Avatar from '@mui/material/Avatar';
3
+ import Box from '@mui/material/Box';
4
+ import { useTheme } from '@mui/material/styles';
5
+ import { SimpleTooltip } from '../SimpleTooltip.esm.js';
6
+ import { getAvatarColors } from '../../theme/themeUtils.esm.js';
7
+
8
+ const getInitials = (name) => {
9
+ return name.split(" ").map((word) => word.charAt(0)).join("").toUpperCase().slice(0, 2);
10
+ };
11
+ const getAvatarColorIndex = (name) => {
12
+ const hash = name.split("").reduce((acc, char) => {
13
+ return char.charCodeAt(0) + ((acc << 5) - acc);
14
+ }, 0);
15
+ return Math.abs(hash) % 8;
16
+ };
17
+ const MainContributors = ({ contributors }) => {
18
+ const theme = useTheme();
19
+ const avatarColors = getAvatarColors(theme);
20
+ const mainContributors = contributors.filter(
21
+ (contributor) => contributor.reason && contributor.reason.toLowerCase().includes("main contributor")
22
+ );
23
+ if (mainContributors.length === 0) {
24
+ return "";
25
+ }
26
+ return /* @__PURE__ */ jsx(
27
+ Box,
28
+ {
29
+ display: "flex",
30
+ alignItems: "center",
31
+ justifyContent: "center",
32
+ gap: 0.5,
33
+ height: "100%",
34
+ width: "100%",
35
+ children: mainContributors.map((contributor, index) => /* @__PURE__ */ jsx(
36
+ SimpleTooltip,
37
+ {
38
+ title: `${contributor.name} ${contributor?.email ? `(${contributor.email})` : ""}`,
39
+ centered: true,
40
+ children: /* @__PURE__ */ jsx(
41
+ Avatar,
42
+ {
43
+ style: {
44
+ backgroundColor: avatarColors[getAvatarColorIndex(contributor.name)],
45
+ color: "white",
46
+ width: 24,
47
+ height: 24,
48
+ fontSize: "0.75rem",
49
+ fontWeight: 500
50
+ },
51
+ children: getInitials(contributor.name)
52
+ }
53
+ )
54
+ },
55
+ index
56
+ ))
57
+ }
58
+ );
59
+ };
60
+
61
+ export { MainContributors };
62
+ //# sourceMappingURL=MainContributors.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MainContributors.esm.js","sources":["../../../src/components/MainContributors/MainContributors.tsx"],"sourcesContent":["/*\n * Copyright 2025 The Backstage Authors\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 */\nimport Avatar from '@mui/material/Avatar';\nimport Box from '@mui/material/Box';\nimport { useTheme } from '@mui/material/styles';\nimport { SimpleTooltip } from '../SimpleTooltip';\nimport { getAvatarColors } from '../../theme/themeUtils';\n\ninterface Contributor {\n email: string;\n name: string;\n reason: string;\n}\n\ninterface MainContributorsProps {\n contributors: Contributor[];\n}\n\nconst getInitials = (name: string): string => {\n return name\n .split(' ')\n .map(word => word.charAt(0))\n .join('')\n .toUpperCase()\n .slice(0, 2);\n};\n\nconst getAvatarColorIndex = (name: string): number => {\n // Generate a consistent color index based on the name\n const hash = name.split('').reduce((acc, char) => {\n return char.charCodeAt(0) + ((acc << 5) - acc);\n }, 0);\n\n return Math.abs(hash) % 8; // 8 colors available\n};\n\nexport const MainContributors = ({ contributors }: MainContributorsProps) => {\n const theme = useTheme();\n const avatarColors = getAvatarColors(theme);\n\n // Filter contributors to only show those with \"Main contributor\" in their reason\n const mainContributors = contributors.filter(\n contributor =>\n contributor.reason &&\n contributor.reason.toLowerCase().includes('main contributor'),\n );\n\n if (mainContributors.length === 0) {\n return '';\n }\n\n return (\n <Box\n display=\"flex\"\n alignItems=\"center\"\n justifyContent=\"center\"\n gap={0.5}\n height=\"100%\"\n width=\"100%\"\n >\n {mainContributors.map((contributor, index) => (\n <SimpleTooltip\n key={index}\n title={`${contributor.name} ${\n contributor?.email ? `(${contributor.email})` : ''\n }`}\n centered\n >\n <Avatar\n style={{\n backgroundColor:\n avatarColors[getAvatarColorIndex(contributor.name)],\n color: 'white',\n width: 24,\n height: 24,\n fontSize: '0.75rem',\n fontWeight: 500,\n }}\n >\n {getInitials(contributor.name)}\n </Avatar>\n </SimpleTooltip>\n ))}\n </Box>\n );\n};\n"],"names":[],"mappings":";;;;;;;AA+BA,MAAM,WAAA,GAAc,CAAC,IAAA,KAAyB;AAC5C,EAAA,OAAO,KACJ,KAAA,CAAM,GAAG,EACT,GAAA,CAAI,CAAA,IAAA,KAAQ,KAAK,MAAA,CAAO,CAAC,CAAC,CAAA,CAC1B,KAAK,EAAE,CAAA,CACP,aAAY,CACZ,KAAA,CAAM,GAAG,CAAC,CAAA;AACf,CAAA;AAEA,MAAM,mBAAA,GAAsB,CAAC,IAAA,KAAyB;AAEpD,EAAA,MAAM,IAAA,GAAO,KAAK,KAAA,CAAM,EAAE,EAAE,MAAA,CAAO,CAAC,KAAK,IAAA,KAAS;AAChD,IAAA,OAAO,IAAA,CAAK,UAAA,CAAW,CAAC,CAAA,IAAA,CAAM,OAAO,CAAA,IAAK,GAAA,CAAA;AAAA,EAC5C,GAAG,CAAC,CAAA;AAEJ,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA,GAAI,CAAA;AAC1B,CAAA;AAEO,MAAM,gBAAA,GAAmB,CAAC,EAAE,YAAA,EAAa,KAA6B;AAC3E,EAAA,MAAM,QAAQ,QAAA,EAAS;AACvB,EAAA,MAAM,YAAA,GAAe,gBAAgB,KAAK,CAAA;AAG1C,EAAA,MAAM,mBAAmB,YAAA,CAAa,MAAA;AAAA,IACpC,CAAA,WAAA,KACE,YAAY,MAAA,IACZ,WAAA,CAAY,OAAO,WAAA,EAAY,CAAE,SAAS,kBAAkB;AAAA,GAChE;AAEA,EAAA,IAAI,gBAAA,CAAiB,WAAW,CAAA,EAAG;AACjC,IAAA,OAAO,EAAA;AAAA,EACT;AAEA,EAAA,uBACE,GAAA;AAAA,IAAC,GAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAQ,MAAA;AAAA,MACR,UAAA,EAAW,QAAA;AAAA,MACX,cAAA,EAAe,QAAA;AAAA,MACf,GAAA,EAAK,GAAA;AAAA,MACL,MAAA,EAAO,MAAA;AAAA,MACP,KAAA,EAAM,MAAA;AAAA,MAEL,QAAA,EAAA,gBAAA,CAAiB,GAAA,CAAI,CAAC,WAAA,EAAa,KAAA,qBAClC,GAAA;AAAA,QAAC,aAAA;AAAA,QAAA;AAAA,UAEC,KAAA,EAAO,CAAA,EAAG,WAAA,CAAY,IAAI,CAAA,CAAA,EACxB,WAAA,EAAa,KAAA,GAAQ,CAAA,CAAA,EAAI,WAAA,CAAY,KAAK,CAAA,CAAA,CAAA,GAAM,EAClD,CAAA,CAAA;AAAA,UACA,QAAA,EAAQ,IAAA;AAAA,UAER,QAAA,kBAAA,GAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAO;AAAA,gBACL,eAAA,EACE,YAAA,CAAa,mBAAA,CAAoB,WAAA,CAAY,IAAI,CAAC,CAAA;AAAA,gBACpD,KAAA,EAAO,OAAA;AAAA,gBACP,KAAA,EAAO,EAAA;AAAA,gBACP,MAAA,EAAQ,EAAA;AAAA,gBACR,QAAA,EAAU,SAAA;AAAA,gBACV,UAAA,EAAY;AAAA,eACd;AAAA,cAEC,QAAA,EAAA,WAAA,CAAY,YAAY,IAAI;AAAA;AAAA;AAC/B,SAAA;AAAA,QAlBK;AAAA,OAoBR;AAAA;AAAA,GACH;AAEJ;;;;"}
@@ -0,0 +1,37 @@
1
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
2
+ import Grid from '@mui/material/Unstable_Grid2';
3
+ import { MttrVsSLATile } from '../tiles/MttrVsSLATile.esm.js';
4
+ import { SLAAdherenceTile } from '../tiles/SLAAdherenceTile.esm.js';
5
+ import { RiskOverTimeTile } from '../tiles/RiskOverTimeTile.esm.js';
6
+ import { StatusTile } from '../tiles/StatusTile.esm.js';
7
+ import { useApi } from '@backstage/core-plugin-api';
8
+ import { isApiiroMetricViewAvailable } from '../../utils/utils.esm.js';
9
+ import { apiiroApiRef } from '../../api/index.esm.js';
10
+
11
+ const TabMetricsGroup = ({
12
+ repositoryData,
13
+ entity,
14
+ repoId,
15
+ entityRef
16
+ }) => {
17
+ const apiiroApi = useApi(apiiroApiRef);
18
+ const defaultViewChart = apiiroApi.getDefaultAllowMetricsView();
19
+ const allowViewChart = isApiiroMetricViewAvailable(entity) ?? defaultViewChart;
20
+ return /* @__PURE__ */ jsx(Grid, { container: true, spacing: 3, direction: "column", children: /* @__PURE__ */ jsxs(Grid, { container: true, spacing: 3, children: [
21
+ /* @__PURE__ */ jsx(Grid, { xs: 12, sm: 12, children: /* @__PURE__ */ jsx(
22
+ StatusTile,
23
+ {
24
+ repository: repositoryData,
25
+ allowViewChart
26
+ }
27
+ ) }),
28
+ allowViewChart && /* @__PURE__ */ jsxs(Fragment, { children: [
29
+ /* @__PURE__ */ jsx(Grid, { xs: 12, sm: 6, lg: 4, children: /* @__PURE__ */ jsx(MttrVsSLATile, { repoId, entityRef }) }),
30
+ /* @__PURE__ */ jsx(Grid, { xs: 12, sm: 6, lg: 4, children: /* @__PURE__ */ jsx(RiskOverTimeTile, { repoId, entityRef }) }),
31
+ /* @__PURE__ */ jsx(Grid, { xs: 12, sm: 6, lg: 4, children: /* @__PURE__ */ jsx(SLAAdherenceTile, { repoId, entityRef }) })
32
+ ] })
33
+ ] }) });
34
+ };
35
+
36
+ export { TabMetricsGroup };
37
+ //# sourceMappingURL=TabMetricsGroup.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TabMetricsGroup.esm.js","sources":["../../../src/components/MetricsGroup/TabMetricsGroup.tsx"],"sourcesContent":["/*\n * Copyright 2025 The Backstage Authors\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 */\nimport Grid from '@mui/material/Unstable_Grid2';\nimport { MttrVsSLATile } from '../tiles/MttrVsSLATile';\nimport { SLAAdherenceTile } from '../tiles/SLAAdherenceTile';\nimport { RiskOverTimeTile } from '../tiles/RiskOverTimeTile';\nimport { RepositoryType } from '../../queries';\nimport StatusTile from '../tiles/StatusTile';\nimport type { Entity } from '@backstage/catalog-model';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { isApiiroMetricViewAvailable } from '../../utils';\nimport { apiiroApiRef } from '../../api';\n\nexport const TabMetricsGroup = ({\n repositoryData,\n entity,\n repoId,\n entityRef,\n}: {\n repositoryData: RepositoryType;\n entity: Entity;\n repoId: string;\n entityRef: string;\n}) => {\n const apiiroApi = useApi(apiiroApiRef);\n const defaultViewChart = apiiroApi.getDefaultAllowMetricsView();\n const allowViewChart =\n isApiiroMetricViewAvailable(entity) ?? defaultViewChart;\n return (\n <Grid container spacing={3} direction=\"column\">\n <Grid container spacing={3}>\n <Grid xs={12} sm={12}>\n <StatusTile\n repository={repositoryData}\n allowViewChart={allowViewChart}\n />\n </Grid>\n {allowViewChart && (\n <>\n <Grid xs={12} sm={6} lg={4}>\n <MttrVsSLATile repoId={repoId} entityRef={entityRef} />\n </Grid>\n <Grid xs={12} sm={6} lg={4}>\n <RiskOverTimeTile repoId={repoId} entityRef={entityRef} />\n </Grid>\n <Grid xs={12} sm={6} lg={4}>\n <SLAAdherenceTile repoId={repoId} entityRef={entityRef} />\n </Grid>\n </>\n )}\n </Grid>\n </Grid>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;AA0BO,MAAM,kBAAkB,CAAC;AAAA,EAC9B,cAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAA,KAKM;AACJ,EAAA,MAAM,SAAA,GAAY,OAAO,YAAY,CAAA;AACrC,EAAA,MAAM,gBAAA,GAAmB,UAAU,0BAAA,EAA2B;AAC9D,EAAA,MAAM,cAAA,GACJ,2BAAA,CAA4B,MAAM,CAAA,IAAK,gBAAA;AACzC,EAAA,uBACE,GAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAS,IAAA,EAAC,OAAA,EAAS,CAAA,EAAG,SAAA,EAAU,QAAA,EACpC,QAAA,kBAAA,IAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAS,IAAA,EAAC,SAAS,CAAA,EACvB,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,EAAA,EAChB,QAAA,kBAAA,GAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,UAAA,EAAY,cAAA;AAAA,QACZ;AAAA;AAAA,KACF,EACF,CAAA;AAAA,IACC,kCACC,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EACvB,QAAA,kBAAA,GAAA,CAAC,aAAA,EAAA,EAAc,MAAA,EAAgB,SAAA,EAAsB,CAAA,EACvD,CAAA;AAAA,sBACA,GAAA,CAAC,IAAA,EAAA,EAAK,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EACvB,QAAA,kBAAA,GAAA,CAAC,gBAAA,EAAA,EAAiB,MAAA,EAAgB,SAAA,EAAsB,CAAA,EAC1D,CAAA;AAAA,sBACA,GAAA,CAAC,IAAA,EAAA,EAAK,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EACvB,QAAA,kBAAA,GAAA,CAAC,gBAAA,EAAA,EAAiB,MAAA,EAAgB,SAAA,EAAsB,CAAA,EAC1D;AAAA,KAAA,EACF;AAAA,GAAA,EAEJ,CAAA,EACF,CAAA;AAEJ;;;;"}
@@ -0,0 +1,36 @@
1
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
2
+ import Grid from '@mui/material/Unstable_Grid2';
3
+ import { TopLanguagesTile } from '../tiles/TopLanguagesTile.esm.js';
4
+ import { TopRiskTile } from '../tiles/TopRiskTile.esm.js';
5
+ import { StatusTile } from '../tiles/StatusTile.esm.js';
6
+ import { useApi } from '@backstage/core-plugin-api';
7
+ import { isApiiroMetricViewAvailable } from '../../utils/utils.esm.js';
8
+ import { apiiroApiRef } from '../../api/index.esm.js';
9
+
10
+ const WidgetMetricsGroup = ({
11
+ repositoryData,
12
+ repoId,
13
+ entityRef,
14
+ entity
15
+ }) => {
16
+ const apiiroApi = useApi(apiiroApiRef);
17
+ const defaultViewChart = apiiroApi.getDefaultAllowMetricsView();
18
+ const allowViewChart = isApiiroMetricViewAvailable(entity) ?? defaultViewChart;
19
+ return /* @__PURE__ */ jsx(Grid, { container: true, spacing: 3, direction: "column", children: /* @__PURE__ */ jsxs(Grid, { container: true, spacing: 3, children: [
20
+ /* @__PURE__ */ jsx(Grid, { xs: 12, sm: 12, children: /* @__PURE__ */ jsx(
21
+ StatusTile,
22
+ {
23
+ repository: repositoryData,
24
+ detailViewLink: `${repositoryData.entityUrl}/apiiro`,
25
+ allowViewChart
26
+ }
27
+ ) }),
28
+ allowViewChart && /* @__PURE__ */ jsxs(Fragment, { children: [
29
+ /* @__PURE__ */ jsx(Grid, { xs: 12, sm: 6, lg: 6, children: /* @__PURE__ */ jsx(TopLanguagesTile, { data: repositoryData?.languagePercentages }) }),
30
+ /* @__PURE__ */ jsx(Grid, { xs: 12, sm: 6, lg: 6, children: /* @__PURE__ */ jsx(TopRiskTile, { repoId, entityRef }) })
31
+ ] })
32
+ ] }) });
33
+ };
34
+
35
+ export { WidgetMetricsGroup };
36
+ //# sourceMappingURL=WidgetMetricsGroup.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WidgetMetricsGroup.esm.js","sources":["../../../src/components/MetricsGroup/WidgetMetricsGroup.tsx"],"sourcesContent":["/*\n * Copyright 2025 The Backstage Authors\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 */\nimport Grid from '@mui/material/Unstable_Grid2';\nimport { TopLanguagesTile } from '../tiles/TopLanguagesTile';\nimport { TopRiskTile } from '../tiles/TopRiskTile';\nimport StatusTile from '../tiles/StatusTile';\nimport { RepositoryType } from '../../queries';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { isApiiroMetricViewAvailable } from '../../utils';\nimport type { Entity } from '@backstage/catalog-model';\nimport { apiiroApiRef } from '../../api';\n\nexport const WidgetMetricsGroup = ({\n repositoryData,\n repoId,\n entityRef,\n entity,\n}: {\n repositoryData: RepositoryType;\n repoId: string;\n entityRef: string;\n entity: Entity;\n}) => {\n const apiiroApi = useApi(apiiroApiRef);\n const defaultViewChart = apiiroApi.getDefaultAllowMetricsView();\n const allowViewChart =\n isApiiroMetricViewAvailable(entity) ?? defaultViewChart;\n return (\n <Grid container spacing={3} direction=\"column\">\n <Grid container spacing={3}>\n <Grid xs={12} sm={12}>\n <StatusTile\n repository={repositoryData}\n detailViewLink={`${repositoryData.entityUrl}/apiiro`}\n allowViewChart={allowViewChart}\n />\n </Grid>\n {allowViewChart && (\n <>\n <Grid xs={12} sm={6} lg={6}>\n <TopLanguagesTile data={repositoryData?.languagePercentages} />\n </Grid>\n <Grid xs={12} sm={6} lg={6}>\n <TopRiskTile repoId={repoId} entityRef={entityRef} />\n </Grid>\n </>\n )}\n </Grid>\n </Grid>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;AAyBO,MAAM,qBAAqB,CAAC;AAAA,EACjC,cAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,KAKM;AACJ,EAAA,MAAM,SAAA,GAAY,OAAO,YAAY,CAAA;AACrC,EAAA,MAAM,gBAAA,GAAmB,UAAU,0BAAA,EAA2B;AAC9D,EAAA,MAAM,cAAA,GACJ,2BAAA,CAA4B,MAAM,CAAA,IAAK,gBAAA;AACzC,EAAA,uBACE,GAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAS,IAAA,EAAC,OAAA,EAAS,CAAA,EAAG,SAAA,EAAU,QAAA,EACpC,QAAA,kBAAA,IAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAS,IAAA,EAAC,SAAS,CAAA,EACvB,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,EAAA,EAChB,QAAA,kBAAA,GAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,UAAA,EAAY,cAAA;AAAA,QACZ,cAAA,EAAgB,CAAA,EAAG,cAAA,CAAe,SAAS,CAAA,OAAA,CAAA;AAAA,QAC3C;AAAA;AAAA,KACF,EACF,CAAA;AAAA,IACC,kCACC,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EACvB,QAAA,kBAAA,GAAA,CAAC,gBAAA,EAAA,EAAiB,IAAA,EAAM,cAAA,EAAgB,mBAAA,EAAqB,CAAA,EAC/D,CAAA;AAAA,sBACA,GAAA,CAAC,IAAA,EAAA,EAAK,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EACvB,QAAA,kBAAA,GAAA,CAAC,WAAA,EAAA,EAAY,MAAA,EAAgB,SAAA,EAAsB,CAAA,EACrD;AAAA,KAAA,EACF;AAAA,GAAA,EAEJ,CAAA,EACF,CAAA;AAEJ;;;;"}
@@ -0,0 +1,121 @@
1
+ import { jsx, jsxs } from 'react/jsx-runtime';
2
+ import Box from '@mui/material/Box';
3
+ import Chip from '@mui/material/Chip';
4
+ import Link from '@mui/material/Link';
5
+ import { useTheme } from '@mui/material/styles';
6
+ import { SimpleTooltip } from '../SimpleTooltip.esm.js';
7
+ import { scmProviderIcons } from '../../utils/utils.esm.js';
8
+ import { getBusinessImpactColors } from '../../theme/themeUtils.esm.js';
9
+
10
+ const getBusinessImpactColor = (impact, theme) => {
11
+ const impactColors = getBusinessImpactColors(theme);
12
+ switch (impact.toLowerCase()) {
13
+ case "high":
14
+ return impactColors.high;
15
+ case "medium":
16
+ return impactColors.medium;
17
+ case "low":
18
+ return impactColors.low;
19
+ default:
20
+ return impactColors.default;
21
+ }
22
+ };
23
+ const getScmProvider = (serverUrl, provider) => {
24
+ if (provider) {
25
+ return provider;
26
+ }
27
+ const url = serverUrl.toLowerCase();
28
+ if (url.includes("github")) {
29
+ return "Github";
30
+ } else if (url.includes("gitlab")) {
31
+ return "Gitlab";
32
+ } else if (url.includes("bitbucket")) {
33
+ return "BitbucketCloud";
34
+ } else if (url.includes("azure") || url.includes("visualstudio")) {
35
+ return "AzureDevops";
36
+ }
37
+ return "Github";
38
+ };
39
+ const RepositoryDisplay = ({ entity }) => {
40
+ const theme = useTheme();
41
+ if (!entity || !entity.details) {
42
+ return "";
43
+ }
44
+ const { details } = entity;
45
+ const scmProvider = getScmProvider(details.serverUrl, details.provider);
46
+ const IconComponent = scmProviderIcons[scmProvider];
47
+ const getTooltipContent = () => /* @__PURE__ */ jsxs(Box, { children: [
48
+ /* @__PURE__ */ jsxs(Box, { mb: 1, children: [
49
+ /* @__PURE__ */ jsx("strong", { children: "Server URL:" }),
50
+ " ",
51
+ details.serverUrl
52
+ ] }),
53
+ /* @__PURE__ */ jsxs(Box, { mb: 1, children: [
54
+ /* @__PURE__ */ jsx("strong", { children: "Repository:" }),
55
+ " ",
56
+ details.name
57
+ ] }),
58
+ /* @__PURE__ */ jsxs(Box, { children: [
59
+ /* @__PURE__ */ jsx("strong", { children: "Branch:" }),
60
+ " ",
61
+ details.branchName
62
+ ] })
63
+ ] });
64
+ return /* @__PURE__ */ jsx(
65
+ Box,
66
+ {
67
+ display: "flex",
68
+ alignItems: "center",
69
+ justifyContent: "center",
70
+ gap: 0.5,
71
+ height: "100%",
72
+ width: "100%",
73
+ children: /* @__PURE__ */ jsx(SimpleTooltip, { title: getTooltipContent(), children: /* @__PURE__ */ jsxs(Box, { display: "flex", alignItems: "center", gap: 0.5, children: [
74
+ IconComponent && /* @__PURE__ */ jsx(
75
+ IconComponent,
76
+ {
77
+ style: { fontSize: "1rem", color: theme.palette.text.primary }
78
+ }
79
+ ),
80
+ /* @__PURE__ */ jsx(
81
+ Link,
82
+ {
83
+ href: details.profileUrl,
84
+ target: "_blank",
85
+ rel: "noopener noreferrer",
86
+ style: {
87
+ color: "inherit",
88
+ fontSize: "0.875rem",
89
+ fontWeight: 500,
90
+ cursor: "pointer",
91
+ textDecoration: "underline"
92
+ },
93
+ children: details.name
94
+ }
95
+ ),
96
+ /* @__PURE__ */ jsx(
97
+ Chip,
98
+ {
99
+ label: details.businessImpact,
100
+ size: "small",
101
+ variant: "outlined",
102
+ style: {
103
+ borderColor: getBusinessImpactColor(
104
+ details.businessImpact,
105
+ theme
106
+ ),
107
+ color: getBusinessImpactColor(details.businessImpact, theme),
108
+ backgroundColor: "transparent",
109
+ fontSize: "0.75rem",
110
+ height: 20,
111
+ fontWeight: 500
112
+ }
113
+ }
114
+ )
115
+ ] }) })
116
+ }
117
+ );
118
+ };
119
+
120
+ export { RepositoryDisplay };
121
+ //# sourceMappingURL=RepositoryDisplay.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RepositoryDisplay.esm.js","sources":["../../../src/components/RepositoryDisplay/RepositoryDisplay.tsx"],"sourcesContent":["/*\n * Copyright 2025 The Backstage Authors\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 */\nimport Box from '@mui/material/Box';\nimport Chip from '@mui/material/Chip';\nimport Link from '@mui/material/Link';\nimport { useTheme, Theme } from '@mui/material/styles';\nimport { SimpleTooltip } from '../SimpleTooltip';\nimport { scmProviderIcons } from '../../utils/utils';\nimport { getBusinessImpactColors } from '../../theme/themeUtils';\n\ninterface Repository {\n details: {\n branchName: string;\n businessImpact: string;\n isArchived: boolean;\n key: string;\n monitoringStatus: {\n ignoredBy: string | null;\n ignoredOn: string | null;\n ignoreReason: string | null;\n status: string;\n };\n name: string;\n privacySettings: string;\n profileUrl: string;\n repositoryGroup: string;\n repositoryOwners: any[];\n riskLevel: string;\n serverUrl: string;\n url: string;\n provider?: string; // SCM provider (Github, Gitlab, etc.)\n };\n type: string;\n}\n\ninterface RepositoryDisplayProps {\n entity: Repository;\n}\n\nconst getBusinessImpactColor = (impact: string, theme: Theme): string => {\n const impactColors = getBusinessImpactColors(theme);\n switch (impact.toLowerCase()) {\n case 'high':\n return impactColors.high;\n case 'medium':\n return impactColors.medium;\n case 'low':\n return impactColors.low;\n default:\n return impactColors.default;\n }\n};\n\nconst getScmProvider = (serverUrl: string, provider?: string): string => {\n // If provider is explicitly provided, use it\n if (provider) {\n return provider;\n }\n\n // Otherwise, determine from serverUrl\n const url = serverUrl.toLowerCase();\n if (url.includes('github')) {\n return 'Github';\n } else if (url.includes('gitlab')) {\n return 'Gitlab';\n } else if (url.includes('bitbucket')) {\n return 'BitbucketCloud';\n } else if (url.includes('azure') || url.includes('visualstudio')) {\n return 'AzureDevops';\n }\n\n // Default to Github if unable to determine\n return 'Github';\n};\n\nexport const RepositoryDisplay = ({ entity }: RepositoryDisplayProps) => {\n const theme = useTheme();\n\n if (!entity || !entity.details) {\n return '';\n }\n\n const { details } = entity;\n const scmProvider = getScmProvider(details.serverUrl, details.provider);\n const IconComponent = scmProviderIcons[scmProvider];\n\n const getTooltipContent = () => (\n <Box>\n <Box mb={1}>\n <strong>Server URL:</strong> {details.serverUrl}\n </Box>\n <Box mb={1}>\n <strong>Repository:</strong> {details.name}\n </Box>\n <Box>\n <strong>Branch:</strong> {details.branchName}\n </Box>\n </Box>\n );\n\n return (\n <Box\n display=\"flex\"\n alignItems=\"center\"\n justifyContent=\"center\"\n gap={0.5}\n height=\"100%\"\n width=\"100%\"\n >\n <SimpleTooltip title={getTooltipContent()}>\n <Box display=\"flex\" alignItems=\"center\" gap={0.5}>\n {IconComponent && (\n <IconComponent\n style={{ fontSize: '1rem', color: theme.palette.text.primary }}\n />\n )}\n <Link\n href={details.profileUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={{\n color: 'inherit',\n fontSize: '0.875rem',\n fontWeight: 500,\n cursor: 'pointer',\n textDecoration: 'underline',\n }}\n >\n {details.name}\n </Link>\n <Chip\n label={details.businessImpact}\n size=\"small\"\n variant=\"outlined\"\n style={{\n borderColor: getBusinessImpactColor(\n details.businessImpact,\n theme,\n ),\n color: getBusinessImpactColor(details.businessImpact, theme),\n backgroundColor: 'transparent',\n fontSize: '0.75rem',\n height: 20,\n fontWeight: 500,\n }}\n />\n </Box>\n </SimpleTooltip>\n </Box>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,88 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import { RiskLevel as RiskLevel$1 } from '../assets/RiskIcon.esm.js';
3
+ import Box from '@mui/material/Box';
4
+ import Typography from '@mui/material/Typography';
5
+ import VisibilityOffIcon from '@mui/icons-material/VisibilityOff';
6
+ import { useTheme } from '@mui/material/styles';
7
+ import { getRiskColors } from '../theme/themeUtils.esm.js';
8
+
9
+ const createRiskColorMappings = (theme) => {
10
+ const riskColors = getRiskColors(theme);
11
+ return {
12
+ Critical: riskColors.critical,
13
+ High: riskColors.high,
14
+ Medium: riskColors.medium,
15
+ Low: riskColors.low,
16
+ AutoIgnored: riskColors.autoIgnored
17
+ };
18
+ };
19
+ const RiskLevel = ({
20
+ level,
21
+ defaultColor,
22
+ iconSize = "medium",
23
+ showLabel = false,
24
+ sx,
25
+ iconSx,
26
+ textSx
27
+ }) => {
28
+ const theme = useTheme();
29
+ const themeDefaultColor = defaultColor ?? theme.palette.grey[500];
30
+ const colorMapping = createRiskColorMappings(theme);
31
+ const getRiskColor = () => {
32
+ if (!colorMapping) {
33
+ return themeDefaultColor;
34
+ }
35
+ const mappedColor = colorMapping[level];
36
+ return mappedColor || themeDefaultColor;
37
+ };
38
+ const riskColor = getRiskColor();
39
+ const iconSizeMap = {
40
+ small: { width: 16, height: 16 },
41
+ medium: { width: 20, height: 20 },
42
+ large: { width: 24, height: 24 }
43
+ };
44
+ return /* @__PURE__ */ jsxs(
45
+ Box,
46
+ {
47
+ sx: {
48
+ display: "flex",
49
+ alignItems: "center",
50
+ justifyContent: "center",
51
+ gap: showLabel ? 1 : 0,
52
+ ...sx
53
+ },
54
+ children: [
55
+ /* @__PURE__ */ jsx(
56
+ Box,
57
+ {
58
+ sx: {
59
+ color: riskColor,
60
+ borderRadius: "50%",
61
+ display: "flex",
62
+ alignItems: "center",
63
+ justifyContent: "center",
64
+ ...iconSizeMap[iconSize],
65
+ ...iconSx
66
+ },
67
+ children: level === "AutoIgnored" ? /* @__PURE__ */ jsx(VisibilityOffIcon, { sx: { fontSize: iconSizeMap[iconSize].width } }) : /* @__PURE__ */ jsx(RiskLevel$1, {})
68
+ }
69
+ ),
70
+ showLabel && /* @__PURE__ */ jsx(
71
+ Typography,
72
+ {
73
+ variant: "body2",
74
+ sx: {
75
+ color: riskColor,
76
+ fontWeight: 500,
77
+ ...textSx
78
+ },
79
+ children: level
80
+ }
81
+ )
82
+ ]
83
+ }
84
+ );
85
+ };
86
+
87
+ export { RiskLevel, createRiskColorMappings, RiskLevel as default };
88
+ //# sourceMappingURL=RiskLevel.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RiskLevel.esm.js","sources":["../../src/components/RiskLevel.tsx"],"sourcesContent":["/*\n * Copyright 2025 The Backstage Authors\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 */\nimport { RiskLevel as RiskIcon } from '../assets/RiskIcon';\nimport Box from '@mui/material/Box';\nimport Typography from '@mui/material/Typography';\nimport VisibilityOffIcon from '@mui/icons-material/VisibilityOff';\nimport { SxProps, Theme, useTheme } from '@mui/material/styles';\nimport { getRiskColors } from '../theme/themeUtils';\n\nexport type RiskLevelValue =\n | 'High'\n | 'Medium'\n | 'Low'\n | 'Critical'\n | 'AutoIgnored';\n\nexport interface ColorMapping {\n [key: string]: string;\n}\n\nexport interface RiskLevelProps {\n /**\n * The risk level value to display\n */\n level: string;\n\n /**\n * Default color to use if level is not found in colorMapping\n */\n defaultColor?: string;\n\n /**\n * Size of the icon\n */\n iconSize?: 'small' | 'medium' | 'large';\n\n /**\n * Whether to show the text label alongside the icon\n */\n showLabel?: boolean;\n\n /**\n * Custom styles for the container\n */\n sx?: SxProps<Theme>;\n\n /**\n * Custom styles for the icon\n */\n iconSx?: SxProps<Theme>;\n\n /**\n * Custom styles for the text\n */\n textSx?: SxProps<Theme>;\n}\n\n/**\n * RiskLevel component that displays a custom RiskIcon with customizable colors\n *\n * @example\n * // Basic usage with color mapping\n * <RiskLevel\n * level=\"High\"\n * />\n *\n * @example\n * // With label and custom styling\n * <RiskLevel\n * level=\"Critical\"\n * showLabel={true}\n * iconSize=\"large\"\n * />\n */\n\n/**\n * Creates theme-aware risk color mappings.\n * Use this function with useTheme() to get colors that work in both light and dark modes.\n */\nexport const createRiskColorMappings = (theme: Theme): ColorMapping => {\n const riskColors = getRiskColors(theme);\n\n return {\n Critical: riskColors.critical,\n High: riskColors.high,\n Medium: riskColors.medium,\n Low: riskColors.low,\n AutoIgnored: riskColors.autoIgnored,\n };\n};\n\nexport const RiskLevel = ({\n level,\n defaultColor,\n iconSize = 'medium',\n showLabel = false,\n sx,\n iconSx,\n textSx,\n}: RiskLevelProps) => {\n const theme = useTheme();\n const themeDefaultColor = defaultColor ?? theme.palette.grey[500];\n const colorMapping: ColorMapping = createRiskColorMappings(theme);\n // Determine the color based on mapping\n const getRiskColor = (): string => {\n if (!colorMapping) {\n return themeDefaultColor;\n }\n\n const mappedColor = colorMapping[level];\n return mappedColor || themeDefaultColor;\n };\n\n const riskColor = getRiskColor();\n\n // Icon size mapping for custom SVG\n const iconSizeMap = {\n small: { width: 16, height: 16 },\n medium: { width: 20, height: 20 },\n large: { width: 24, height: 24 },\n };\n\n return (\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: showLabel ? 1 : 0,\n ...sx,\n }}\n >\n <Box\n sx={{\n color: riskColor,\n borderRadius: '50%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n ...iconSizeMap[iconSize],\n ...iconSx,\n }}\n >\n {level === 'AutoIgnored' ? (\n <VisibilityOffIcon sx={{ fontSize: iconSizeMap[iconSize].width }} />\n ) : (\n <RiskIcon />\n )}\n </Box>\n {showLabel && (\n <Typography\n variant=\"body2\"\n sx={{\n color: riskColor,\n fontWeight: 500,\n ...textSx,\n }}\n >\n {level}\n </Typography>\n )}\n </Box>\n );\n};\n\nexport default RiskLevel;\n"],"names":["RiskIcon"],"mappings":";;;;;;;;AA4FO,MAAM,uBAAA,GAA0B,CAAC,KAAA,KAA+B;AACrE,EAAA,MAAM,UAAA,GAAa,cAAc,KAAK,CAAA;AAEtC,EAAA,OAAO;AAAA,IACL,UAAU,UAAA,CAAW,QAAA;AAAA,IACrB,MAAM,UAAA,CAAW,IAAA;AAAA,IACjB,QAAQ,UAAA,CAAW,MAAA;AAAA,IACnB,KAAK,UAAA,CAAW,GAAA;AAAA,IAChB,aAAa,UAAA,CAAW;AAAA,GAC1B;AACF;AAEO,MAAM,YAAY,CAAC;AAAA,EACxB,KAAA;AAAA,EACA,YAAA;AAAA,EACA,QAAA,GAAW,QAAA;AAAA,EACX,SAAA,GAAY,KAAA;AAAA,EACZ,EAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAA,KAAsB;AACpB,EAAA,MAAM,QAAQ,QAAA,EAAS;AACvB,EAAA,MAAM,iBAAA,GAAoB,YAAA,IAAgB,KAAA,CAAM,OAAA,CAAQ,KAAK,GAAG,CAAA;AAChE,EAAA,MAAM,YAAA,GAA6B,wBAAwB,KAAK,CAAA;AAEhE,EAAA,MAAM,eAAe,MAAc;AACjC,IAAA,IAAI,CAAC,YAAA,EAAc;AACjB,MAAA,OAAO,iBAAA;AAAA,IACT;AAEA,IAAA,MAAM,WAAA,GAAc,aAAa,KAAK,CAAA;AACtC,IAAA,OAAO,WAAA,IAAe,iBAAA;AAAA,EACxB,CAAA;AAEA,EAAA,MAAM,YAAY,YAAA,EAAa;AAG/B,EAAA,MAAM,WAAA,GAAc;AAAA,IAClB,KAAA,EAAO,EAAE,KAAA,EAAO,EAAA,EAAI,QAAQ,EAAA,EAAG;AAAA,IAC/B,MAAA,EAAQ,EAAE,KAAA,EAAO,EAAA,EAAI,QAAQ,EAAA,EAAG;AAAA,IAChC,KAAA,EAAO,EAAE,KAAA,EAAO,EAAA,EAAI,QAAQ,EAAA;AAAG,GACjC;AAEA,EAAA,uBACE,IAAA;AAAA,IAAC,GAAA;AAAA,IAAA;AAAA,MACC,EAAA,EAAI;AAAA,QACF,OAAA,EAAS,MAAA;AAAA,QACT,UAAA,EAAY,QAAA;AAAA,QACZ,cAAA,EAAgB,QAAA;AAAA,QAChB,GAAA,EAAK,YAAY,CAAA,GAAI,CAAA;AAAA,QACrB,GAAG;AAAA,OACL;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAA,GAAA;AAAA,UAAC,GAAA;AAAA,UAAA;AAAA,YACC,EAAA,EAAI;AAAA,cACF,KAAA,EAAO,SAAA;AAAA,cACP,YAAA,EAAc,KAAA;AAAA,cACd,OAAA,EAAS,MAAA;AAAA,cACT,UAAA,EAAY,QAAA;AAAA,cACZ,cAAA,EAAgB,QAAA;AAAA,cAChB,GAAG,YAAY,QAAQ,CAAA;AAAA,cACvB,GAAG;AAAA,aACL;AAAA,YAEC,QAAA,EAAA,KAAA,KAAU,aAAA,mBACT,GAAA,CAAC,iBAAA,EAAA,EAAkB,IAAI,EAAE,QAAA,EAAU,WAAA,CAAY,QAAQ,CAAA,CAAE,KAAA,EAAM,EAAG,CAAA,uBAEjEA,WAAA,EAAA,EAAS;AAAA;AAAA,SAEd;AAAA,QACC,SAAA,oBACC,GAAA;AAAA,UAAC,UAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAQ,OAAA;AAAA,YACR,EAAA,EAAI;AAAA,cACF,KAAA,EAAO,SAAA;AAAA,cACP,UAAA,EAAY,GAAA;AAAA,cACZ,GAAG;AAAA,aACL;AAAA,YAEC,QAAA,EAAA;AAAA;AAAA;AACH;AAAA;AAAA,GAEJ;AAEJ;;;;"}
@@ -0,0 +1,58 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import Box from '@mui/material/Box';
3
+ import Typography from '@mui/material/Typography';
4
+ import { useTheme } from '@mui/material/styles';
5
+ import { getRiskStatusColors } from '../theme/themeUtils.esm.js';
6
+
7
+ const createRiskStatusColorMapping = (theme) => {
8
+ const statusColors = getRiskStatusColors(theme);
9
+ return {
10
+ Open: statusColors.open,
11
+ Accepted: statusColors.accepted,
12
+ Ignored: statusColors.ignored
13
+ };
14
+ };
15
+ const RiskStatus = ({
16
+ status,
17
+ showLabel = true,
18
+ iconSize = "medium"
19
+ }) => {
20
+ const theme = useTheme();
21
+ const themeAwareColors = createRiskStatusColorMapping(theme);
22
+ const color = themeAwareColors[status] || theme.palette.grey[400];
23
+ const sizeMap = {
24
+ small: "8px",
25
+ medium: "10px",
26
+ large: "12px"
27
+ };
28
+ const iconDimensions = sizeMap[iconSize];
29
+ return /* @__PURE__ */ jsxs(Box, { sx: { display: "flex", alignItems: "center" }, children: [
30
+ /* @__PURE__ */ jsx(
31
+ Box,
32
+ {
33
+ sx: {
34
+ width: iconDimensions,
35
+ height: iconDimensions,
36
+ borderRadius: "50%",
37
+ backgroundColor: color,
38
+ marginRight: showLabel ? "8px" : "0"
39
+ }
40
+ }
41
+ ),
42
+ showLabel && /* @__PURE__ */ jsx(
43
+ Typography,
44
+ {
45
+ variant: "body2",
46
+ sx: {
47
+ fontSize: "inherit",
48
+ fontWeight: "inherit",
49
+ color: "inherit"
50
+ },
51
+ children: status
52
+ }
53
+ )
54
+ ] });
55
+ };
56
+
57
+ export { RiskStatus, createRiskStatusColorMapping };
58
+ //# sourceMappingURL=RiskStatus.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RiskStatus.esm.js","sources":["../../src/components/RiskStatus.tsx"],"sourcesContent":["/*\n * Copyright 2025 The Backstage Authors\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 */\nimport Box from '@mui/material/Box';\nimport Typography from '@mui/material/Typography';\nimport { useTheme, Theme } from '@mui/material/styles';\nimport { getRiskStatusColors } from '../theme/themeUtils';\n\n/**\n * Creates theme-aware risk status color mappings.\n * Use this function with useTheme() to get colors that work in both light and dark modes.\n */\nexport const createRiskStatusColorMapping = (theme: Theme) => {\n const statusColors = getRiskStatusColors(theme);\n return {\n Open: statusColors.open,\n Accepted: statusColors.accepted,\n Ignored: statusColors.ignored,\n };\n};\n\ninterface RiskStatusProps {\n /**\n * The status level to display\n */\n status: string;\n\n /**\n * Show the status label next to the icon\n */\n showLabel?: boolean;\n\n /**\n * The size of the icon\n */\n iconSize?: 'small' | 'medium' | 'large';\n}\n\n/**\n * A component to display a risk status with a colored dot.\n */\nexport const RiskStatus = ({\n status,\n showLabel = true,\n iconSize = 'medium',\n}: RiskStatusProps) => {\n const theme = useTheme();\n const themeAwareColors = createRiskStatusColorMapping(theme);\n const color =\n themeAwareColors[status as keyof typeof themeAwareColors] ||\n theme.palette.grey[400];\n\n const sizeMap = {\n small: '8px',\n medium: '10px',\n large: '12px',\n };\n const iconDimensions = sizeMap[iconSize];\n\n return (\n <Box sx={{ display: 'flex', alignItems: 'center' }}>\n <Box\n sx={{\n width: iconDimensions,\n height: iconDimensions,\n borderRadius: '50%',\n backgroundColor: color,\n marginRight: showLabel ? '8px' : '0',\n }}\n />\n {showLabel && (\n <Typography\n variant=\"body2\"\n sx={{\n fontSize: 'inherit',\n fontWeight: 'inherit',\n color: 'inherit',\n }}\n >\n {status}\n </Typography>\n )}\n </Box>\n );\n};\n"],"names":[],"mappings":";;;;;;AAwBO,MAAM,4BAAA,GAA+B,CAAC,KAAA,KAAiB;AAC5D,EAAA,MAAM,YAAA,GAAe,oBAAoB,KAAK,CAAA;AAC9C,EAAA,OAAO;AAAA,IACL,MAAM,YAAA,CAAa,IAAA;AAAA,IACnB,UAAU,YAAA,CAAa,QAAA;AAAA,IACvB,SAAS,YAAA,CAAa;AAAA,GACxB;AACF;AAsBO,MAAM,aAAa,CAAC;AAAA,EACzB,MAAA;AAAA,EACA,SAAA,GAAY,IAAA;AAAA,EACZ,QAAA,GAAW;AACb,CAAA,KAAuB;AACrB,EAAA,MAAM,QAAQ,QAAA,EAAS;AACvB,EAAA,MAAM,gBAAA,GAAmB,6BAA6B,KAAK,CAAA;AAC3D,EAAA,MAAM,QACJ,gBAAA,CAAiB,MAAuC,KACxD,KAAA,CAAM,OAAA,CAAQ,KAAK,GAAG,CAAA;AAExB,EAAA,MAAM,OAAA,GAAU;AAAA,IACd,KAAA,EAAO,KAAA;AAAA,IACP,MAAA,EAAQ,MAAA;AAAA,IACR,KAAA,EAAO;AAAA,GACT;AACA,EAAA,MAAM,cAAA,GAAiB,QAAQ,QAAQ,CAAA;AAEvC,EAAA,uBACE,IAAA,CAAC,OAAI,EAAA,EAAI,EAAE,SAAS,MAAA,EAAQ,UAAA,EAAY,UAAS,EAC/C,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,GAAA;AAAA,MAAA;AAAA,QACC,EAAA,EAAI;AAAA,UACF,KAAA,EAAO,cAAA;AAAA,UACP,MAAA,EAAQ,cAAA;AAAA,UACR,YAAA,EAAc,KAAA;AAAA,UACd,eAAA,EAAiB,KAAA;AAAA,UACjB,WAAA,EAAa,YAAY,KAAA,GAAQ;AAAA;AACnC;AAAA,KACF;AAAA,IACC,SAAA,oBACC,GAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAQ,OAAA;AAAA,QACR,EAAA,EAAI;AAAA,UACF,QAAA,EAAU,SAAA;AAAA,UACV,UAAA,EAAY,SAAA;AAAA,UACZ,KAAA,EAAO;AAAA,SACT;AAAA,QAEC,QAAA,EAAA;AAAA;AAAA;AACH,GAAA,EAEJ,CAAA;AAEJ;;;;"}
@@ -0,0 +1,24 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { CustomTooltip } from './common/CustomTooltip.esm.js';
3
+
4
+ const SimpleTooltip = ({
5
+ children,
6
+ title,
7
+ placement = "top",
8
+ tooltipProps,
9
+ centered = false
10
+ }) => {
11
+ return /* @__PURE__ */ jsx(
12
+ CustomTooltip,
13
+ {
14
+ title,
15
+ placement,
16
+ centered,
17
+ ...tooltipProps,
18
+ children
19
+ }
20
+ );
21
+ };
22
+
23
+ export { SimpleTooltip, SimpleTooltip as default };
24
+ //# sourceMappingURL=SimpleTooltip.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SimpleTooltip.esm.js","sources":["../../src/components/SimpleTooltip.tsx"],"sourcesContent":["/*\n * Copyright 2025 The Backstage Authors\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 */\nimport { CustomTooltip } from './common/CustomTooltip';\n\ninterface SimpleTooltipProps {\n /**\n * The content to display inside the tooltip trigger\n */\n children: JSX.Element | string | number;\n\n /**\n * The tooltip content to display - can be string or JSX\n */\n title: string | JSX.Element;\n\n /**\n * Tooltip placement\n */\n placement?: 'top' | 'bottom' | 'left' | 'right';\n\n /**\n * Custom tooltip props to override defaults\n */\n tooltipProps?: any;\n\n /**\n * If true, the content will be centered horizontally and vertically.\n */\n centered?: boolean;\n}\n\n/**\n * SimpleTooltip component - A reusable tooltip wrapper without centering\n *\n * @example\n * <SimpleTooltip title=\"Repository information\">\n * <span>My Repository</span>\n * </SimpleTooltip>\n *\n * @example\n * <SimpleTooltip title=\"Custom tooltip\">\n * <div>Custom content</div>\n * </SimpleTooltip>\n *\n * @example\n * <SimpleTooltip title={<div><a href=\"...\">Link</a><br/>More content</div>}>\n * <span>Hover me</span>\n * </SimpleTooltip>\n */\nexport const SimpleTooltip = ({\n children,\n title,\n placement = 'top',\n tooltipProps,\n centered = false,\n}: SimpleTooltipProps) => {\n // CustomTooltip doesn't support offset or PopperProps, but we keep the API for compatibility\n return (\n <CustomTooltip\n title={title}\n placement={placement}\n centered={centered}\n // Spread any additional props that CustomTooltip supports (enterDelay, leaveDelay, disableInteractive)\n {...tooltipProps}\n >\n {children}\n </CustomTooltip>\n );\n};\n\nexport default SimpleTooltip;\n"],"names":[],"mappings":";;;AA8DO,MAAM,gBAAgB,CAAC;AAAA,EAC5B,QAAA;AAAA,EACA,KAAA;AAAA,EACA,SAAA,GAAY,KAAA;AAAA,EACZ,YAAA;AAAA,EACA,QAAA,GAAW;AACb,CAAA,KAA0B;AAExB,EAAA,uBACE,GAAA;AAAA,IAAC,aAAA;AAAA,IAAA;AAAA,MACC,KAAA;AAAA,MACA,SAAA;AAAA,MACA,QAAA;AAAA,MAEC,GAAG,YAAA;AAAA,MAEH;AAAA;AAAA,GACH;AAEJ;;;;"}
@@ -0,0 +1,47 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import Box from '@mui/material/Box';
3
+ import { ChipsList } from './ChipsList.esm.js';
4
+
5
+ const SourcesDisplay = ({
6
+ sources,
7
+ maxVisible = 1,
8
+ size = "small",
9
+ variant = "outlined",
10
+ gap = 0.5
11
+ }) => {
12
+ if (!sources || sources.length === 0) {
13
+ return "";
14
+ }
15
+ const sourceItems = sources.map((source) => ({
16
+ id: source.name,
17
+ label: source.name,
18
+ href: source?.url,
19
+ target: source?.url ? "_blank" : void 0,
20
+ rel: source?.url ? "noopener noreferrer" : void 0
21
+ }));
22
+ return /* @__PURE__ */ jsx(
23
+ Box,
24
+ {
25
+ sx: {
26
+ display: "flex",
27
+ justifyContent: "center",
28
+ alignItems: "center",
29
+ width: "100%",
30
+ height: "100%"
31
+ },
32
+ children: /* @__PURE__ */ jsx(
33
+ ChipsList,
34
+ {
35
+ items: sourceItems,
36
+ maxVisible,
37
+ size,
38
+ variant,
39
+ gap
40
+ }
41
+ )
42
+ }
43
+ );
44
+ };
45
+
46
+ export { SourcesDisplay, SourcesDisplay as default };
47
+ //# sourceMappingURL=SourcesDisplay.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SourcesDisplay.esm.js","sources":["../../src/components/SourcesDisplay.tsx"],"sourcesContent":["/*\n * Copyright 2025 The Backstage Authors\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 */\nimport Box from '@mui/material/Box';\nimport { ChipsList } from './ChipsList';\n\ninterface Source {\n name: string;\n vendor?: string;\n type?: string;\n url?: string;\n}\n\ninterface SourcesDisplayProps {\n /**\n * Array of source objects\n */\n sources: Source[];\n\n /**\n * Maximum number of sources to show before displaying +N\n */\n maxVisible?: number;\n\n /**\n * Size of the source chips\n */\n size?: 'small' | 'medium';\n\n /**\n * Variant of the source chips\n */\n variant?: 'filled' | 'outlined';\n\n /**\n * Gap between chips\n */\n gap?: number;\n}\n\n/**\n * SourcesDisplay component that renders source names as clickable chips\n * Shows a limited number of sources with overflow handling (+N indicator)\n *\n * @example\n * <SourcesDisplay\n * sources={[\n * { name: 'GitLab Dependency Scanning', url: 'https://example.com' },\n * { name: 'Snyk Code Analysis' }\n * ]}\n * maxVisible={1}\n * />\n */\nexport const SourcesDisplay = ({\n sources,\n maxVisible = 1,\n size = 'small',\n variant = 'outlined',\n gap = 0.5,\n}: SourcesDisplayProps) => {\n if (!sources || sources.length === 0) {\n return '';\n }\n\n const sourceItems = sources.map(source => ({\n id: source.name,\n label: source.name,\n href: source?.url,\n target: source?.url ? '_blank' : undefined,\n rel: source?.url ? 'noopener noreferrer' : undefined,\n }));\n\n return (\n <Box\n sx={{\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n width: '100%',\n height: '100%',\n }}\n >\n <ChipsList\n items={sourceItems}\n maxVisible={maxVisible}\n size={size}\n variant={variant}\n gap={gap}\n />\n </Box>\n );\n};\n\nexport default SourcesDisplay;\n"],"names":[],"mappings":";;;;AAiEO,MAAM,iBAAiB,CAAC;AAAA,EAC7B,OAAA;AAAA,EACA,UAAA,GAAa,CAAA;AAAA,EACb,IAAA,GAAO,OAAA;AAAA,EACP,OAAA,GAAU,UAAA;AAAA,EACV,GAAA,GAAM;AACR,CAAA,KAA2B;AACzB,EAAA,IAAI,CAAC,OAAA,IAAW,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG;AACpC,IAAA,OAAO,EAAA;AAAA,EACT;AAEA,EAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,GAAA,CAAI,CAAA,MAAA,MAAW;AAAA,IACzC,IAAI,MAAA,CAAO,IAAA;AAAA,IACX,OAAO,MAAA,CAAO,IAAA;AAAA,IACd,MAAM,MAAA,EAAQ,GAAA;AAAA,IACd,MAAA,EAAQ,MAAA,EAAQ,GAAA,GAAM,QAAA,GAAW,MAAA;AAAA,IACjC,GAAA,EAAK,MAAA,EAAQ,GAAA,GAAM,qBAAA,GAAwB;AAAA,GAC7C,CAAE,CAAA;AAEF,EAAA,uBACE,GAAA;AAAA,IAAC,GAAA;AAAA,IAAA;AAAA,MACC,EAAA,EAAI;AAAA,QACF,OAAA,EAAS,MAAA;AAAA,QACT,cAAA,EAAgB,QAAA;AAAA,QAChB,UAAA,EAAY,QAAA;AAAA,QACZ,KAAA,EAAO,MAAA;AAAA,QACP,MAAA,EAAQ;AAAA,OACV;AAAA,MAEA,QAAA,kBAAA,GAAA;AAAA,QAAC,SAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO,WAAA;AAAA,UACP,UAAA;AAAA,UACA,IAAA;AAAA,UACA,OAAA;AAAA,UACA;AAAA;AAAA;AACF;AAAA,GACF;AAEJ;;;;"}
@@ -0,0 +1,38 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import Box from '@mui/material/Box';
3
+ import Typography from '@mui/material/Typography';
4
+ import { ChipsList } from '../ChipsList.esm.js';
5
+
6
+ const formatLabel = (tag) => `${tag.name} : ${tag.value}`;
7
+ const TagsList = ({ tags, maxVisible = 1 }) => {
8
+ if (!tags || tags.length === 0) {
9
+ return "";
10
+ }
11
+ const items = tags.map((tag, index) => ({
12
+ id: `${tag.name}-${tag.value}-${index}`,
13
+ label: formatLabel(tag),
14
+ tooltip: formatLabel(tag)
15
+ }));
16
+ return /* @__PURE__ */ jsx(
17
+ ChipsList,
18
+ {
19
+ items,
20
+ maxVisible,
21
+ gap: 0,
22
+ size: "small",
23
+ variant: "outlined",
24
+ chipSx: {
25
+ maxWidth: "200px",
26
+ "& .MuiChip-label": {
27
+ maxWidth: "180px",
28
+ overflow: "hidden",
29
+ textOverflow: "ellipsis"
30
+ }
31
+ },
32
+ renderOverflowContent: (hiddenItems) => /* @__PURE__ */ jsx(Box, { display: "flex", flexDirection: "column", gap: 0.5, children: hiddenItems.map((item) => /* @__PURE__ */ jsx(Typography, { variant: "body2", children: item.label }, item.id)) })
33
+ }
34
+ );
35
+ };
36
+
37
+ export { TagsList };
38
+ //# sourceMappingURL=TagsList.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TagsList.esm.js","sources":["../../../src/components/TagsList/TagsList.tsx"],"sourcesContent":["/*\n * Copyright 2025 The Backstage Authors\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 */\nimport Box from '@mui/material/Box';\nimport Typography from '@mui/material/Typography';\nimport { ChipsList } from '../ChipsList';\n\ninterface TagItem {\n name: string;\n value: string;\n tagSource?: string;\n}\n\ninterface TagsListProps {\n tags: TagItem[];\n maxVisible?: number;\n}\n\nconst formatLabel = (tag: TagItem) => `${tag.name} : ${tag.value}`;\n\nexport const TagsList = ({ tags, maxVisible = 1 }: TagsListProps) => {\n if (!tags || tags.length === 0) {\n return '';\n }\n\n const items = tags.map((tag, index) => ({\n id: `${tag.name}-${tag.value}-${index}`,\n label: formatLabel(tag),\n tooltip: formatLabel(tag),\n }));\n\n return (\n <ChipsList\n items={items}\n maxVisible={maxVisible}\n gap={0}\n size=\"small\"\n variant=\"outlined\"\n chipSx={{\n maxWidth: '200px',\n '& .MuiChip-label': {\n maxWidth: '180px',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n },\n }}\n renderOverflowContent={hiddenItems => (\n <Box display=\"flex\" flexDirection=\"column\" gap={0.5}>\n {hiddenItems.map(item => (\n <Typography key={item.id} variant=\"body2\">\n {item.label}\n </Typography>\n ))}\n </Box>\n )}\n />\n );\n};\n"],"names":[],"mappings":";;;;;AA8BA,MAAM,WAAA,GAAc,CAAC,GAAA,KAAiB,CAAA,EAAG,IAAI,IAAI,CAAA,GAAA,EAAM,IAAI,KAAK,CAAA,CAAA;AAEzD,MAAM,WAAW,CAAC,EAAE,IAAA,EAAM,UAAA,GAAa,GAAE,KAAqB;AACnE,EAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG;AAC9B,IAAA,OAAO,EAAA;AAAA,EACT;AAEA,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAC,KAAK,KAAA,MAAW;AAAA,IACtC,EAAA,EAAI,GAAG,GAAA,CAAI,IAAI,IAAI,GAAA,CAAI,KAAK,IAAI,KAAK,CAAA,CAAA;AAAA,IACrC,KAAA,EAAO,YAAY,GAAG,CAAA;AAAA,IACtB,OAAA,EAAS,YAAY,GAAG;AAAA,GAC1B,CAAE,CAAA;AAEF,EAAA,uBACE,GAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACC,KAAA;AAAA,MACA,UAAA;AAAA,MACA,GAAA,EAAK,CAAA;AAAA,MACL,IAAA,EAAK,OAAA;AAAA,MACL,OAAA,EAAQ,UAAA;AAAA,MACR,MAAA,EAAQ;AAAA,QACN,QAAA,EAAU,OAAA;AAAA,QACV,kBAAA,EAAoB;AAAA,UAClB,QAAA,EAAU,OAAA;AAAA,UACV,QAAA,EAAU,QAAA;AAAA,UACV,YAAA,EAAc;AAAA;AAChB,OACF;AAAA,MACA,qBAAA,EAAuB,iCACrB,GAAA,CAAC,GAAA,EAAA,EAAI,SAAQ,MAAA,EAAO,aAAA,EAAc,QAAA,EAAS,GAAA,EAAK,GAAA,EAC7C,QAAA,EAAA,WAAA,CAAY,IAAI,CAAA,IAAA,qBACf,GAAA,CAAC,cAAyB,OAAA,EAAQ,OAAA,EAC/B,eAAK,KAAA,EAAA,EADS,IAAA,CAAK,EAEtB,CACD,CAAA,EACH;AAAA;AAAA,GAEJ;AAEJ;;;;"}