@spotify/backstage-plugin-soundcheck 0.19.7 → 0.19.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (239) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/dist/alpha/entity-content.esm.js +1 -1
  3. package/dist/alpha.d.ts +3 -116
  4. package/dist/blueprints/IntegrationPageBlueprint.esm.js +1 -1
  5. package/dist/components/AreaChart/AreaChart.esm.js +1 -1
  6. package/dist/components/CampaignCreatePage/CampaignCreatePage.esm.js +1 -1
  7. package/dist/components/CampaignForm/CampaignForm.esm.js +1 -1
  8. package/dist/components/CampaignForm/Steps/CampaignMilestonesStep.esm.js +1 -1
  9. package/dist/components/CampaignForm/hooks/utils.esm.js +1 -1
  10. package/dist/components/CampaignForm/utils/campaignFormUtils.esm.js +2 -2
  11. package/dist/components/CampaignPage/CampaignPage.esm.js +1 -1
  12. package/dist/components/CampaignPage/CampaignPageBUI.esm.js +1 -1
  13. package/dist/components/CampaignPage/CampaignStatusBarBUI.esm.js +2 -0
  14. package/dist/components/CampaignPage/CampaignStatusCard.esm.js +2 -0
  15. package/dist/components/CampaignPage/CampaignStatusTableBUI.esm.js +2 -0
  16. package/dist/components/CampaignPage/CampaignTechInsightsExplorerPage.esm.js +1 -1
  17. package/dist/components/CampaignsPage/CampaignListPageBUI.esm.js +1 -1
  18. package/dist/components/CampaignsPage/CampaignsPage.esm.js +1 -1
  19. package/dist/components/CampaignsPage/EditCampaignView.esm.js +1 -1
  20. package/dist/components/Cards/HistoricalCheckStatusCard/HistoricalCheckStatusCard.esm.js +1 -1
  21. package/dist/components/Cards/TrackStatusCard/TrackStatusCard.esm.js +1 -1
  22. package/dist/components/CategoryBar/CategoryBar.esm.js +1 -1
  23. package/dist/components/Charts/chartUtils.esm.js +1 -1
  24. package/dist/components/CheckCreatePage/CheckCreatePage.esm.js +1 -1
  25. package/dist/components/CheckForm/CheckForm.esm.js +1 -1
  26. package/dist/components/CheckForm/FormFields/RuleInput/Conditions/RuleConditionInput.esm.js +1 -1
  27. package/dist/components/CheckForm/Steps/CheckApplicabilityStep.esm.js +1 -1
  28. package/dist/components/CheckForm/Steps/CheckReviewStep.esm.js +1 -1
  29. package/dist/components/CheckForm/utils/checkFormUtils.esm.js +2 -2
  30. package/dist/components/CheckForm/utils/validation.esm.js +1 -1
  31. package/dist/components/CheckPage/CheckEditPage.esm.js +1 -1
  32. package/dist/components/CheckPage/CheckEntitiesTable/CheckEntitiesTableBUI.esm.js +1 -1
  33. package/dist/components/CheckPage/CheckPage.esm.js +1 -1
  34. package/dist/components/CheckPage/CheckPageBUI.esm.js +1 -1
  35. package/dist/components/CheckPage/CheckStatusHistoryChartBUI.esm.js +1 -1
  36. package/dist/components/CheckPage/CheckStatusTableBUI.esm.js +1 -1
  37. package/dist/components/CheckPage/ExemptionsTableBUI.esm.js +1 -1
  38. package/dist/components/CheckPage/utils.esm.js +1 -1
  39. package/dist/components/CheckSelection/CheckSelection.esm.js +1 -1
  40. package/dist/components/CheckStatusBar/CheckStatusBar.esm.js +1 -1
  41. package/dist/components/CheckTemplatesPage/CheckTemplatesPage.esm.js +1 -1
  42. package/dist/components/CheckTemplatesPage/CheckTemplatesPageDeprecated.esm.js +1 -1
  43. package/dist/components/CheckTemplatesPage/TemplateCategory.esm.js +1 -1
  44. package/dist/components/ChecksPage/ChecksListPageBUI.esm.js +1 -1
  45. package/dist/components/ChecksPage/ChecksPage.esm.js +1 -1
  46. package/dist/components/ChecksTab/ChecksTab.esm.js +1 -1
  47. package/dist/components/ChecksTable/ChecksTable.esm.js +1 -1
  48. package/dist/components/CollectorPage/CollectorDetailsPage.esm.js +1 -1
  49. package/dist/components/CollectorPage/CollectorDetailsPageBUI.esm.js +1 -1
  50. package/dist/components/CollectorPage/CollectorDetailsPageDeprecated.esm.js +1 -1
  51. package/dist/components/CollectorPage/CollectorFactTable.esm.js +1 -1
  52. package/dist/components/CollectorPage/CollectorFactTableBUI.esm.js +1 -1
  53. package/dist/components/CollectorPage/CollectorPage.esm.js +1 -1
  54. package/dist/components/CollectorPage/Configurators/AzureDevOps/NumberOfWorkItemsComponent.esm.js +1 -1
  55. package/dist/components/CollectorPage/Configurators/BigQuery/QueryFactDetailsComponent.esm.js +1 -1
  56. package/dist/components/CollectorPage/Configurators/Common/CollectorOption.esm.js +1 -1
  57. package/dist/components/CollectorPage/Configurators/Common/FactCollectionConfig.esm.js +1 -1
  58. package/dist/components/CollectorPage/Configurators/Common/utils.esm.js +1 -1
  59. package/dist/components/CollectorPage/Configurators/HTTP/HttpRequestComponent.esm.js +1 -1
  60. package/dist/components/CollectorPage/Configurators/SCM/JsonFactDetailsComponent.esm.js +1 -1
  61. package/dist/components/CollectorPage/Configurators/SCM/RegexFactDetailsComponent.esm.js +1 -1
  62. package/dist/components/CollectorsPage/CollectorListPage/CollectorListPageDeprecated.esm.js +1 -1
  63. package/dist/components/CollectorsPage/CollectorListPage/CollectorSummaryCard.esm.js +1 -1
  64. package/dist/components/CollectorsPage/CollectorsPage.esm.js +1 -1
  65. package/dist/components/CollectorsPage/IntegrationsListPageBUI.esm.js +1 -1
  66. package/dist/components/FactExplorer/FactExplorer.esm.js +1 -1
  67. package/dist/components/FactExplorer/FactExplorerContext.esm.js +1 -1
  68. package/dist/components/FactExplorer/FactExplorerDialogBUI.esm.js +1 -1
  69. package/dist/components/Filter/FilterComponent.esm.js +1 -1
  70. package/dist/components/Filter/FilterPreviewTable/FilterPreviewTable.esm.js +1 -1
  71. package/dist/components/Filter/KeyValueInputDialog.esm.js +1 -1
  72. package/dist/components/Filter/types.esm.js +1 -1
  73. package/dist/components/Filter/utils.esm.js +1 -1
  74. package/dist/components/FilterSidebar/FilterSidebar.esm.js +1 -1
  75. package/dist/components/FilterSidebar/StateFilter.esm.js +1 -1
  76. package/dist/components/FormControlledAutocomplete/ControlledAutocomplete.esm.js +1 -1
  77. package/dist/components/FormFilterSection/FormFilterSection.esm.js +1 -1
  78. package/dist/components/FormStepper/FormStepper.esm.js +1 -1
  79. package/dist/components/HierarchicalTechInsightsPage/visualizations/LoadingOverlay.esm.js +1 -1
  80. package/dist/components/HierarchicalTechInsightsPage/visualizations/NivoCirclePacking.esm.js +1 -1
  81. package/dist/components/HierarchicalTechInsightsPage/visualizations/NivoIcicle.esm.js +1 -1
  82. package/dist/components/HierarchicalTechInsightsPage/visualizations/NivoSunburst.esm.js +1 -1
  83. package/dist/components/HierarchicalTechInsightsPage/visualizations/NivoTreemap.esm.js +1 -1
  84. package/dist/components/HierarchicalTechInsightsPage/visualizations/VisualizationBreadcrumb.esm.js +1 -1
  85. package/dist/components/ImportExportPanel/ImportExportPanelBUI.esm.js +1 -1
  86. package/dist/components/ImportExportPanel/ImportExportPanelDeprecated.esm.js +1 -1
  87. package/dist/components/OverviewPage/OverviewPageContent.esm.js +1 -1
  88. package/dist/components/OverviewPage/OverviewPageHeader.esm.js +1 -1
  89. package/dist/components/Pagination/Pagination.esm.js +1 -1
  90. package/dist/components/PassRateGrid/PassRateMetadata.esm.js +1 -1
  91. package/dist/components/RoutingPage/RoutingPage.esm.js +1 -1
  92. package/dist/components/RoutingPage/RoutingPageWrapper.esm.js +1 -1
  93. package/dist/components/SoundcheckHeader/Breadcrumbs.esm.js +1 -1
  94. package/dist/components/SoundcheckHeader/SoundcheckHeader.esm.js +1 -1
  95. package/dist/components/SoundcheckHeader/SoundcheckHeaderBUI.esm.js +1 -1
  96. package/dist/components/SoundcheckHeader/useHeader.esm.js +1 -1
  97. package/dist/components/SummaryCard/SummaryCardActionsMenu.esm.js +1 -1
  98. package/dist/components/TableRowWithOwner/TableRowWithOwner.esm.js +1 -1
  99. package/dist/components/TechHealth/TechHealth.esm.js +1 -1
  100. package/dist/components/TechHealthTabs/PassRateTabHeader.esm.js +1 -1
  101. package/dist/components/TechInsights/TechInsightsPage.esm.js +1 -1
  102. package/dist/components/TechInsights/TechInsightsPageBUI.esm.js +1 -1
  103. package/dist/components/TechInsights/TechInsightsTableBUI.esm.js +1 -1
  104. package/dist/components/TechInsightsExplorerTable/TechInsightsExplorerTable.esm.js +1 -1
  105. package/dist/components/TechInsightsGroupSelector/TechInsightsGroupSelector.esm.js +1 -1
  106. package/dist/components/TopFailingChecksTable/TopFailingChecksTableBUI.esm.js +1 -1
  107. package/dist/components/TrackCreatePage/TrackCreatePage.esm.js +1 -1
  108. package/dist/components/TrackEditPage/TrackEditPage.esm.js +1 -1
  109. package/dist/components/TrackForm/Steps/LevelsStep/LevelsStepNew.esm.js +1 -1
  110. package/dist/components/TrackForm/TrackForm.esm.js +1 -1
  111. package/dist/components/TrackForm/utils/useTrackForm.esm.js +1 -1
  112. package/dist/components/TrackPage/TrackEntitiesTable/TrackEntitiesTableBUI.esm.js +1 -1
  113. package/dist/components/TrackPage/TrackEntitiesTable/utils.esm.js +1 -1
  114. package/dist/components/TrackPage/TrackPage.esm.js +1 -1
  115. package/dist/components/TrackPage/TrackPageBUI.esm.js +1 -1
  116. package/dist/components/TrackPage/TrackStatusTableBUI.esm.js +1 -1
  117. package/dist/components/TrackPage/TrackTechInsightsExplorerPage.esm.js +1 -1
  118. package/dist/components/TracksPage/TracksListPageBUI.esm.js +1 -1
  119. package/dist/components/TracksPage/TracksPage.esm.js +1 -1
  120. package/dist/components/TracksTab/TracksTab.esm.js +1 -1
  121. package/dist/hooks/aggregations/useAggregatedCheckPassRateTrend.esm.js +1 -1
  122. package/dist/hooks/aggregations/useAggregatedEntityPassRateTrend.esm.js +1 -1
  123. package/dist/hooks/aggregations/useAggregatedGroupPassRateTrend.esm.js +1 -1
  124. package/dist/hooks/aggregations/useAggregatedTrackPassRateTrend.esm.js +1 -1
  125. package/dist/hooks/aggregations/useCertificationStatus.esm.js +1 -1
  126. package/dist/hooks/aggregations/useCertificationStatusHistory.esm.js +1 -1
  127. package/dist/hooks/aggregations/useCheckPassRateTrend.esm.js +1 -1
  128. package/dist/hooks/aggregations/useCheckStatus.esm.js +1 -1
  129. package/dist/hooks/aggregations/useCheckStatusHistory.esm.js +1 -1
  130. package/dist/hooks/aggregations/useCheckStatuses.esm.js +1 -1
  131. package/dist/hooks/aggregations/useEntityPassRateTrend.esm.js +1 -1
  132. package/dist/hooks/aggregations/useGroupPassRateTrend.esm.js +1 -1
  133. package/dist/hooks/aggregations/useTrackPassRateTrend.esm.js +1 -1
  134. package/dist/hooks/cache/useEntityCountCached.esm.js +1 -1
  135. package/dist/hooks/cache/useTrackCountCached.esm.js +1 -1
  136. package/dist/hooks/campaigns/useGetCampaign.esm.js +1 -1
  137. package/dist/hooks/catalog/useGetEntityCount.esm.js +1 -1
  138. package/dist/hooks/checks/useCheck.esm.js +1 -1
  139. package/dist/hooks/checks/useExecutableChecks.esm.js +1 -1
  140. package/dist/hooks/checks/useGetChecks.esm.js +1 -1
  141. package/dist/hooks/collectors/useGetCollectors.esm.js +1 -1
  142. package/dist/hooks/collectors/useGetFactSchema.esm.js +1 -1
  143. package/dist/hooks/collectors/useUpdateCollectorConfig.esm.js +1 -1
  144. package/dist/hooks/entities/useEntityRefsForUser.esm.js +1 -1
  145. package/dist/hooks/exemptions/useExemptions.esm.js +1 -1
  146. package/dist/hooks/facets/useFacetsForOwner.esm.js +1 -1
  147. package/dist/hooks/filters/useFilters.esm.js +1 -1
  148. package/dist/hooks/groups/useAllGroups.esm.js +1 -1
  149. package/dist/hooks/tracks/useGetTracksApplicableEntityCount.esm.js +1 -1
  150. package/dist/hooks/tracks/useTrack.esm.js +1 -1
  151. package/dist/hooks/useSortSearchParams.esm.js +2 -0
  152. package/dist/index.d.ts +11 -11
  153. package/dist/routes.esm.js +1 -1
  154. package/dist/utils/filters.esm.js +1 -1
  155. package/dist/utils/formStyles.esm.js +1 -1
  156. package/dist/utils/helpers.esm.js +1 -1
  157. package/dist/utils/json.esm.js +2 -0
  158. package/dist/utils/validation.esm.js +1 -1
  159. package/package.json +19 -19
  160. package/dist/components/CampaignPage/CampaignPageDeprecated.esm.js +0 -2
  161. package/dist/components/CampaignPage/CampaignStatusHistoryTile.esm.js +0 -2
  162. package/dist/components/CampaignPage/CampaignStatusTile.esm.js +0 -2
  163. package/dist/components/CampaignPage/DaysRemainingTile.esm.js +0 -2
  164. package/dist/components/CampaignsPage/CampaignListPage/CampaignListPageDeprecated.esm.js +0 -2
  165. package/dist/components/CampaignsPage/CampaignListPage/CampaignMetadata.esm.js +0 -2
  166. package/dist/components/CampaignsPage/CampaignListPage/CampaignSummaryCard.esm.js +0 -2
  167. package/dist/components/CampaignsPage/CampaignListPage/CampaignTypes.esm.js +0 -2
  168. package/dist/components/CampaignsPage/CampaignListPage/CampaignsOverviewSkeleton.esm.js +0 -2
  169. package/dist/components/Charts/LoadingChart.esm.js +0 -2
  170. package/dist/components/CheckPage/CheckEntitiesTable/CheckEntitiesTable.esm.js +0 -2
  171. package/dist/components/CheckPage/CheckEntitiesTable/columns.esm.js +0 -2
  172. package/dist/components/CheckPage/CheckPageDeprecated.esm.js +0 -2
  173. package/dist/components/CheckPage/CheckStatusHistoryChart.esm.js +0 -2
  174. package/dist/components/CheckPage/CheckStatusTable.esm.js +0 -2
  175. package/dist/components/CheckPage/ExemptionsTable.esm.js +0 -2
  176. package/dist/components/ChecksPage/CheckListPage/CheckListPageDeprecated.esm.js +0 -2
  177. package/dist/components/ChecksPage/CheckListPage/CheckMetadata.esm.js +0 -2
  178. package/dist/components/ChecksPage/CheckListPage/CheckSummaryCard.esm.js +0 -2
  179. package/dist/components/ChecksPage/skeletons/ChecksOverviewSkeleton.esm.js +0 -2
  180. package/dist/components/CollectorsPage/CollectorListPage/CollectorListSkeleton.esm.js +0 -2
  181. package/dist/components/ColorChip/ColorChip.esm.js +0 -2
  182. package/dist/components/GroupHierarchySelector/GroupHierarchyCategorySelection.esm.js +0 -2
  183. package/dist/components/GroupHierarchySelector/GroupHierarchyChip.esm.js +0 -2
  184. package/dist/components/GroupHierarchySelector/GroupHierarchyGroupInfo.esm.js +0 -2
  185. package/dist/components/GroupHierarchySelector/GroupHierarchySelector.esm.js +0 -2
  186. package/dist/components/GroupHierarchySelector/GroupHierarchySelectorDialog.esm.js +0 -2
  187. package/dist/components/HierarchicalTechInsightsPage/ColorLegend.esm.js +0 -2
  188. package/dist/components/HierarchicalTechInsightsPage/HierarchicalTechInsightsPage.esm.js +0 -2
  189. package/dist/components/HierarchicalTechInsightsPage/HierarchyTable.esm.js +0 -2
  190. package/dist/components/HierarchicalTechInsightsPage/LowestPerformingTeams.esm.js +0 -2
  191. package/dist/components/HierarchicalTechInsightsPage/SelectedNodeSidebar.esm.js +0 -2
  192. package/dist/components/HierarchicalTechInsightsPage/TeamPerformanceCard.esm.js +0 -2
  193. package/dist/components/HierarchicalTechInsightsPage/TeamPerformanceListCard.esm.js +0 -2
  194. package/dist/components/HierarchicalTechInsightsPage/TopPerformingTeams.esm.js +0 -2
  195. package/dist/components/HierarchicalTechInsightsPage/visualizations/findNodePath.esm.js +0 -2
  196. package/dist/components/LevelsTable/CheckRowContent.esm.js +0 -2
  197. package/dist/components/LevelsTable/LevelsTable.esm.js +0 -2
  198. package/dist/components/PassingPercentProgressbar/PassPercentageProgressbar.esm.js +0 -2
  199. package/dist/components/QuickstartPage/HowDoIListItem.esm.js +0 -2
  200. package/dist/components/QuickstartPage/QuickstartCardBase.esm.js +0 -2
  201. package/dist/components/QuickstartPage/QuickstartPage.esm.js +0 -3
  202. package/dist/components/QuickstartPage/WelcomeHelpSection.esm.js +0 -7
  203. package/dist/components/QuickstartPage/styles.esm.js +0 -2
  204. package/dist/components/RichTooltip/RichTooltip.esm.js +0 -2
  205. package/dist/components/RoutingPage/NewFeatureTab.esm.js +0 -2
  206. package/dist/components/RoutingPage/RoutingPageDeprecated.esm.js +0 -2
  207. package/dist/components/RoutingPage/RoutingPageWrapperDeprecated.esm.js +0 -2
  208. package/dist/components/SearchFilters/SearchFilters.esm.js +0 -2
  209. package/dist/components/SendCampaignNotificationDialog/SendCampaignNotificationDialog.esm.js +0 -2
  210. package/dist/components/SoundcheckEntityLink/SoundcheckEntityLink.esm.js +0 -2
  211. package/dist/components/SoundcheckHeader/headerUtil.esm.js +0 -2
  212. package/dist/components/TeamStatusBar/TeamStatusBar.esm.js +0 -2
  213. package/dist/components/TechInsights/FilterControls.esm.js +0 -2
  214. package/dist/components/TechInsights/SummaryTiles.esm.js +0 -2
  215. package/dist/components/TechInsights/TechInsightsPageDeprecated.esm.js +0 -2
  216. package/dist/components/TechInsights/TechInsightsTableView.esm.js +0 -2
  217. package/dist/components/TimePeriodBar/TimePeriodBar.esm.js +0 -2
  218. package/dist/components/TopFailingChecksTable/TopFailingChecksTable.esm.js +0 -2
  219. package/dist/components/TrackPage/TrackEntitiesTable/TrackEntitiesTable.esm.js +0 -2
  220. package/dist/components/TrackPage/TrackEntitiesTable/TrackStatusChip.esm.js +0 -2
  221. package/dist/components/TrackPage/TrackEntitiesTable/columns.esm.js +0 -2
  222. package/dist/components/TrackPage/TrackHistoryChart.esm.js +0 -2
  223. package/dist/components/TrackPage/TrackPageDeprecated.esm.js +0 -2
  224. package/dist/components/TrackPage/TrackProgressCard.esm.js +0 -2
  225. package/dist/components/TrackPage/TrackStatus.esm.js +0 -2
  226. package/dist/components/TrackPage/TrackStatusBar.esm.js +0 -2
  227. package/dist/components/TrackPage/TrackStatusTable.esm.js +0 -2
  228. package/dist/components/TrackPage/utils.esm.js +0 -2
  229. package/dist/components/TrackSelection/TrackSelection.esm.js +0 -2
  230. package/dist/components/TracksPage/TrackListPage/TrackEmptyState.esm.js +0 -2
  231. package/dist/components/TracksPage/TrackListPage/TrackListPageDeprecated.esm.js +0 -2
  232. package/dist/components/TracksPage/TrackListPage/TrackMetadata.esm.js +0 -2
  233. package/dist/components/TracksPage/TrackListPage/TrackSummaryCard.esm.js +0 -2
  234. package/dist/components/TracksPage/TrackListPage/TracksOverviewSkeleton.esm.js +0 -2
  235. package/dist/hooks/campaigns/useGetCampaignOwners.esm.js +0 -2
  236. package/dist/hooks/checks/useGetCheckOwners.esm.js +0 -2
  237. package/dist/hooks/heirarchy/useGroupTypeHierarchy.esm.js +0 -2
  238. package/dist/hooks/tracks/useGetTrackOwners.esm.js +0 -2
  239. package/dist/utils/colors.esm.js +0 -2
@@ -1,2 +0,0 @@
1
- import{jsxs as m,Fragment as d,jsx as t}from"react/jsx-runtime";import{Button as G}from"@backstage/ui";import{RiFilter3Line as f}from"@remixicon/react";import{useState as l,useCallback as s}from"react";import{usePreviousSelectedGroups as y}from"../GroupSelectorBUI/usePreviousSelectedGroups.esm.js";import{GroupHierarchySelectorDialog as S}from"./GroupHierarchySelectorDialog.esm.js";const h=({currentSelectedGroup:r,applyGroup:i})=>{const[n,e]=l(!1),[o,p]=l(""),{groupEntityRefs:u}=y(),c=s(()=>{r&&p(r),e(!0)},[r]),a=s(()=>{i(o),e(!1)},[i,o]);return m(d,{children:[t(G,{variant:"secondary",size:"small",iconStart:t(f,{}),onClick:c,children:"Group"}),t(S,{open:n,handleClose:()=>e(!1),handleApply:a,previousGroupEntityRefs:u,selectedGroup:o,setSelectedGroup:p})]})};export{h as GroupHierarchySelector};
2
- //# sourceMappingURL=GroupHierarchySelector.esm.js.map
@@ -1,2 +0,0 @@
1
- import{jsx as e,jsxs as i,Fragment as L}from"react/jsx-runtime";import{makeStyles as k,Slide as A,Dialog as E,DialogTitle as j,Box as o,IconButton as H,DialogContent as I,Typography as n,Switch as O,Divider as z,DialogActions as N,Button as b}from"@material-ui/core";import w from"@material-ui/icons/Close";import{uniq as M,isEmpty as f}from"lodash";import{forwardRef as W,useMemo as y}from"react";import P from"react-use/lib/useLocalStorage";import{useGroupOptions as q}from"../../hooks/groups/useGroupOptions.esm.js";import{useGroupTypeHierarchy as F}from"../../hooks/heirarchy/useGroupTypeHierarchy.esm.js";import"../FormControlledAutocomplete/FormControlledAutocomplete.esm.js";import"@material-ui/icons/CheckBox";import"@material-ui/icons/CheckBoxOutlineBlank";import"@material-ui/lab";import"react-hook-form";import"../ListboxVirtualized/ListboxVirtualized.esm.js";import{ControlledAutocomplete as K}from"../FormControlledAutocomplete/ControlledAutocomplete.esm.js";import{LoadingIndicator as Q}from"../LoadingIndicator/LoadingIndicator.esm.js";import{GroupHierarchyCategorySelection as U}from"./GroupHierarchyCategorySelection.esm.js";import{GroupHierarchyChip as G}from"./GroupHierarchyChip.esm.js";import{GroupHierarchyGroupInfo as $}from"./GroupHierarchyGroupInfo.esm.js";const J=k(l=>({dialogToolbar:{justifyContent:"flex-start"},dialogToolbarButton:{margin:l.spacing(.5,1,.5,0)},divider:{marginTop:l.spacing(2),marginBottom:l.spacing(2)}})),V=W((l,s)=>e(A,{direction:"up",ref:s,...l})),X=({open:l,handleClose:s,handleApply:C,previousGroupEntityRefs:m,selectedGroup:t,setSelectedGroup:c})=>{const u=J(),[p,x]=P("advanced-group-selector",!1),{isLoading:v,options:a}=q(),{isLoading:T,data:g}=F(),B=y(()=>{if(!g)return[];const r=[],d=h=>{r.push(h.type);for(const D of Object.values(h.children))d(D)};for(const h of Object.values(g))d(h);return M(r)},[g]),S=y(()=>a.filter(r=>r.key==="My Groups").map(r=>r.ref),[a]),R=y(()=>a.map(r=>r.ref),[a]);return i(E,{maxWidth:"md",open:l,onClose:(r,d)=>d==="escapeKeyDown"&&s(),TransitionComponent:V,children:[e(j,{children:i(o,{display:"flex",alignItems:"center",justifyContent:"space-between",children:[e(o,{display:"flex",alignItems:"center",children:e(o,{children:"Group Selection"})}),e(o,{children:e(H,{onClick:s,size:"small",children:e(w,{fontSize:"small"})})})]})}),e(I,{dividers:!0,children:i(o,{display:"flex",children:[i(o,{minWidth:320,maxWidth:480,flex:1,children:[i(o,{marginBottom:2,children:[e(n,{variant:"h6",children:"Search All Groups"}),e(n,{variant:"subtitle2",children:"Selected Group"}),e(K,{options:R,isLoading:v,value:t,autoSelect:!1,getOptionLabel:r=>a.find(d=>d.ref===r)?.name??r,onChange:c,placeholder:"No group selected"}),i(o,{marginTop:1,display:"flex",alignItems:"center",children:[e(n,{variant:"caption",component:"div",children:"Advanced Selector"}),e(O,{onClick:()=>x(!p),checked:p,size:"small","aria-label":"toggle advanced"})]})]}),e(z,{className:u.divider}),(!t||!p)&&!f(m)&&i(o,{marginBottom:2,children:[e(n,{variant:"subtitle2",children:"Previously Selected Groups"}),e(o,{marginTop:1,children:m.map(r=>e(G,{groupEntityRef:r,selectedGroupRef:t,setSelectedGroup:c},r))})]}),(!t||!p)&&!f(S)&&i(o,{marginBottom:2,children:[e(n,{variant:"subtitle2",children:"My Groups"}),e(o,{marginTop:1,children:S.map(r=>e(G,{groupEntityRef:r,selectedGroupRef:t,setSelectedGroup:c},r))})]}),p&&t&&e(o,{marginTop:2,children:e($,{groupEntityRef:t,selectedGroup:t,setSelectedGroup:c,groupOptions:a})})]}),p&&i(o,{marginLeft:3,flex:1,children:[t&&!f(m)&&e(L,{children:i(o,{marginBottom:2,children:[e(n,{variant:"subtitle2",children:"Previously Selected Groups"}),e(o,{marginTop:1,children:m.map(r=>e(G,{groupEntityRef:r,selectedGroupRef:t,setSelectedGroup:c},r))})]})}),T&&i(o,{marginTop:4,marginBottom:2,children:[e(Q,{}),e(o,{marginTop:2,marginBottom:2,textAlign:"center",children:e(n,{variant:"caption",children:"Loading Hierarchy Data"})})]}),!T&&i(o,{children:[e(n,{variant:"h6",children:"Search By Group Type"}),B.map(r=>e(U,{groupType:r,selectedGroupEntityRef:t,selectGroup:c,allOptions:a,isLoading:v},r))]})]})]})}),e(N,{className:u.dialogToolbar,children:i(o,{marginLeft:2,children:[e(b,{size:"small",onClick:C,variant:"contained",color:"primary",className:u.dialogToolbarButton,disabled:!t,children:"Apply"}),e(b,{className:u.dialogToolbarButton,size:"small",onClick:s,color:"primary",children:"Cancel"})]})})]})};export{X as GroupHierarchySelectorDialog};
2
- //# sourceMappingURL=GroupHierarchySelectorDialog.esm.js.map
@@ -1,2 +0,0 @@
1
- import{jsxs as l,jsx as e}from"react/jsx-runtime";import{makeStyles as u,useTheme as b,Box as n,Typography as s}from"@material-ui/core";const y=u({container:{display:"flex",flexDirection:"column",alignItems:"center",minHeight:0},gradientBox:{borderRadius:4,margin:0,minHeight:0,width:"100%",flex:1},captionTop:{marginBottom:4},captionBottom:{marginTop:4}}),v=({interpolator:h,minLabel:d="0%",maxLabel:c="100%",width:r="100%",height:p="100%",steps:m=40,orientation:t="vertical",markerValue:o})=>{const i=y(),a=b(),g=Array.from({length:m},(k,f)=>{const z=f/(m-1);return h(z)}),x=t==="horizontal"?`linear-gradient(to right, ${g.join(",")})`:`linear-gradient(to top, ${g.join(",")})`;return l(n,{className:i.container,height:t==="horizontal"?p:void 0,width:t==="horizontal"?r:void 0,style:{flexDirection:t==="horizontal"?"row":"column",width:r,alignItems:t==="horizontal"?"flex-end":"center",position:"relative"},children:[e(s,{variant:"caption",className:i.captionTop,style:{marginRight:t==="horizontal"?8:0,marginBottom:t==="horizontal"?0:4,alignSelf:t==="horizontal"?"flex-end":"center"},children:t==="horizontal"?d:c}),l(n,{style:{position:"relative",width:t==="horizontal"?r:void 0,height:t==="horizontal"?p:void 0,zIndex:1},children:[e(n,{className:i.gradientBox,style:{background:x,width:"100%",height:"100%"}}),t==="horizontal"&&typeof o=="number"&&l(n,{style:{position:"absolute",left:`calc(${o}% - 6px)`,top:0,height:"100%",width:"12px",zIndex:3,pointerEvents:"none",display:"block"},children:[e(n,{style:{position:"absolute",left:"5.5px",top:0,width:"1px",height:"100%",background:a.palette.background.default,margin:0,boxSizing:"border-box",zIndex:1}}),e("svg",{width:"12",height:"12",style:{position:"absolute",left:0,top:"50%",transform:"translateY(-50%)",background:"transparent",pointerEvents:"none",zIndex:2},children:e("circle",{cx:"6",cy:"6",r:"5",fill:h(o/100),stroke:a.palette.background.default,strokeWidth:"1"})}),typeof o=="number"&&e(s,{variant:"caption",style:{position:"absolute",left:"50%",top:"-16px",transform:"translateX(-50%)",color:a.palette.text.secondary,pointerEvents:"none",zIndex:3,fontSize:"0.7rem"},children:`${Math.round(o)}%`})]})]}),e(s,{variant:"caption",className:i.captionBottom,style:{marginLeft:t==="horizontal"?8:0,marginBottom:t==="horizontal"?0:4,alignSelf:t==="horizontal"?"flex-end":"center"},children:t==="horizontal"?c:d})]})};export{v as ColorLegend};
2
- //# sourceMappingURL=ColorLegend.esm.js.map
@@ -1,2 +0,0 @@
1
- import{jsx as t,jsxs as d,Fragment as se}from"react/jsx-runtime";import{useApi as q,useRouteRef as de,featureFlagsApiRef as Be,configApiRef as Pe}from"@backstage/core-plugin-api";import{entityPresentationApiRef as De}from"@backstage/plugin-catalog-react";import{useTheme as He,Button as We,Box as o,Select as me,MenuItem as S,CircularProgress as Ae,Typography as ue,Tabs as $e,Tab as pe}from"@material-ui/core";import{makeStyles as Ee}from"@material-ui/core/styles";import Ge from"@material-ui/icons/ViewList";import{useMemo as L,useState as I,useCallback as H,useEffect as N,useRef as he}from"react";import{useSearchParams as Ue,useNavigate as je}from"react-router-dom";import Oe from"react-use/lib/useLocalStorage";import"@backstage/catalog-model";import"@tanstack/react-query";import"../../api.esm.js";import"../../hooks/graphqlKeys.esm.js";import"@spotify/backstage-plugin-soundcheck-common";import"../../hooks/useSoundcheckAlert.esm.js";import{useGetAllTracks as Ve}from"../../hooks/tracks/useGetAllTracks.esm.js";import"../../hooks/useConfirmationModal.esm.js";import{useGroupOptions as Fe}from"../../hooks/groups/useGroupOptions.esm.js";import{useHierarchicalTrackStatus as Me}from"../../hooks/heirarchy/useHierarchicalTrackStatus.esm.js";import{useGroupHierarchy as Ze}from"../../hooks/heirarchy/useGroupHierarchy.esm.js";import{useLCPReporting as qe}from"../../hooks/useLCPReporting.esm.js";import{useLoadTimeReporting as Ke}from"../../hooks/useLoadTimeReporting.esm.js";import{trackDetailsRouteRef as Qe,techInsightsPageRouteRef as Xe}from"../../routes.esm.js";import{getColorInterpolators as Ye}from"../../utils/colors.esm.js";import{getAllOwnedEntityCount as _e}from"../../utils/getAllOwnedEntityCount.esm.js";import{getEntitiesBucket as Je,getTracksBucket as et}from"../../utils/helpers.esm.js";import{EmptyState as tt}from"../EmptyState/EmptyState.esm.js";import"../EmptyState/EmptyStateBUI.esm.js";import"@backstage/plugin-permission-react";import"@remixicon/react";import"../SoundcheckHeader/SoundcheckHeader.esm.js";import"../SoundcheckHeader/SoundcheckHeaderContext.esm.js";import{useHeader as it}from"../SoundcheckHeader/useHeader.esm.js";import{TechInsightsGroupSelector as rt}from"../TechInsightsGroupSelector/TechInsightsGroupSelector.esm.js";import{TrackEntitiesTable as nt}from"../TrackPage/TrackEntitiesTable/TrackEntitiesTable.esm.js";import{TrackSelection as at}from"../TrackSelection/TrackSelection.esm.js";import{ColorLegend as ot}from"./ColorLegend.esm.js";import{HierarchyTable as lt}from"./HierarchyTable.esm.js";import{LowestPerformingTeams as ct}from"./LowestPerformingTeams.esm.js";import{SelectedNodeSidebar as st}from"./SelectedNodeSidebar.esm.js";import dt from"./TopPerformingTeams.esm.js";import{NivoCirclePacking as ge}from"./visualizations/NivoCirclePacking.esm.js";import"./visualizations/NivoHeatmap.esm.js";import{NivoIcicle as mt}from"./visualizations/NivoIcicle.esm.js";import{NivoSunburst as ut}from"./visualizations/NivoSunburst.esm.js";import{NivoTreemap as pt}from"./visualizations/NivoTreemap.esm.js";import{VisualizationBreadcrumb as ht}from"./visualizations/VisualizationBreadcrumb.esm.js";import{hierarchyToNivo as fe}from"./visualizations/hierarchyToNivo.esm.js";const ye=Ee(n=>({root:{display:"flex",flexDirection:"column",height:"100%",padding:n.spacing(2,4)},mainContent:{flex:1,display:"flex",flexDirection:"column",minHeight:0},controlsContainer:{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:n.spacing(2)},leftControls:{display:"flex",gap:n.spacing(1.5),alignItems:"center"},rightControls:{display:"flex",gap:n.spacing(2),alignItems:"center"},trackSelect:{minWidth:200},visualizationSelect:{minWidth:120},colorSchemeSelect:{minWidth:80},visualizationContainer:{flex:1,display:"flex",flexDirection:"column",gap:n.spacing(.5),width:"100%"},visualizationHeader:{display:"flex",justifyContent:"flex-end",alignItems:"center",marginBottom:n.spacing(2)},visualizationBox:{flex:1,minHeight:500},visualizationWrapper:{display:"flex",flexDirection:"row",height:"calc(100% - 56px)"},colorLegendContainer:{marginLeft:n.spacing(2),display:"flex",alignItems:"center"},colorLegendWrapper:{width:300},visualizationContent:{flex:1},loadingContainer:{display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",height:"100%",minHeight:500,backgroundColor:n.palette.background.default,borderRadius:n.shape.borderRadius},loadingSpinner:{marginBottom:n.spacing(2)},loadingText:{color:n.palette.text.secondary,fontSize:"1.1rem",fontWeight:500,textAlign:"center"},loadingSubtext:{color:n.palette.text.secondary,fontSize:"0.875rem",opacity:.8,textAlign:"center",marginTop:n.spacing(1)},summaryContainer:{display:"flex",flexDirection:"row",width:"100%",minHeight:300,padding:24},summaryBox:{flex:1,minWidth:0,display:"flex",flexDirection:"column"},summaryBoxLeft:{marginRight:n.spacing(1)},summaryBoxRight:{marginLeft:n.spacing(1)},entitiesContainer:{padding:24},tabsContainer:{width:"100%",marginTop:8},layoutContainer:{display:"flex",height:"100%"},mainLayout:{flex:3,display:"flex",flexDirection:"column",minWidth:0},mainLayoutTable:{flex:1,display:"flex",flexDirection:"column",minWidth:0},sidebarCollapsed:{width:0},sidebarTransition:{transition:"width 0.25s",height:"100%"},sidebarContainer:{height:"100%",marginLeft:24,borderLeft:`1px solid ${n.palette.divider}`,paddingLeft:24},breadcrumbContainer:{flex:1,marginRight:16},input:{backgroundColor:n.palette.background.paper}}));function xe({interpolator:n,width:l=100,height:u=16,steps:r=40,style:C={}}){const k=`linear-gradient(to right, ${Array.from({length:r},(K,a)=>{const W=a/(r-1);return n(W)}).join(",")})`;return t(o,{style:{width:l,height:u,background:k,borderRadius:4,...C}})}function Ce(n){const{children:l,value:u,index:r,...C}=n,k=ye();return t("div",{role:"tabpanel",hidden:u!==r,id:`tabpanel-${r}`,"aria-labelledby":`tab-${r}`,className:k.mainContent,...C,children:u===r&&l})}const gt=()=>{const[n,l]=Ue(),u=n.get("track")||"",r=n.get("group"),C=L(()=>({routeName:"soundcheck-tech-insights-explorer",additionalAttributes:{trackId:u||"",group:r||""}}),[u,r]),{reportContentLoaded:k}=Ke(C),{reporter:K}=qe(C),a=ye(),W=He(),A=q(De),[c,Q]=I(u),$=n.get("node"),[X,E]=I(null),[G,ke]=I(0),U=je(),be=de(Qe),Y=de(Xe),[ve,b]=I(null),[p,T]=I(null),_=q(Be),J=q(Pe),Se=L(()=>t(We,{variant:"contained",color:"primary",startIcon:t(Ge,{}),onClick:()=>{U(Y())},children:"All Tracks"}),[Y,U]);it({title:"Tech Insights",docLink:"https://backstage.spotify.com/docs/plugins/soundcheck/core-concepts/tech-insights",sectionRight:Se});const{data:Ne}=Ve({}),s=Ne?.edges.find(e=>e.node.id===c)?.node,{data:f,isLoading:z}=Ze(r||void 0,{enabled:!!r&&!!c&&!!s,ownedEntitiesFilter:s?.filter??void 0}),{data:g,isLoading:ee}=Me({trackId:c,groupRef:r||"",skip:!c||!r}),Te=L(()=>s?.levels?s.levels.flatMap(e=>e.checks.map(i=>i.id)):[],[s]),v=n.get("visualization")||"table",te=n.get("colors")||"default",j=H((e,i)=>{if(e.entityRef===i)return e;if(e.children)for(const m of e.children){const ce=j(m,i);if(ce)return ce}return null},[]);N(()=>{if($&&f&&r&&g&&s){const e=f[r];if(e){const i=fe(e,g||null,()=>"#ccc",A,void 0);if(i){const m=j(i,$);m&&(T(m),b(m))}}}},[$,f,r,g,s,j,A]);const O=H(e=>{T(e),b(e);const i=new URLSearchParams(n.toString());e&&e.entityRef!==r?i.set("node",e.entityRef):i.delete("node"),l(i,{replace:!0})},[n,l,r]),{options:h,isLoading:y}=Fe(),[V,B]=Oe("soundcheck.overview.groupRef",null),R=r,F=J.getOptionalString("soundcheck.overview.defaultSelectedGroupType"),P=L(()=>{if(!y&&h.length){if(R||V){const e=R??V;return h.find(i=>i.ref===e)??h[0]}else if(F)return h.find(e=>e.type===F)??h[0];return h[0]}return null},[F,y,h,R,V]);N(()=>{if(!y&&h.length&&!R&&P){const e=new URLSearchParams(n.toString());e.set("group",P.ref),l(e,{replace:!0}),B(P.ref)}},[y,h,R,P,n,l,B]);const ie=H(e=>{Q(e);const i=new URLSearchParams(n.toString());i.set("track",e),r&&i.delete("group"),i.delete("node"),l(i),T(null),b(null)},[n,r,l]),re=he(null),w=H(()=>{T(null),b(null),E(null);const e=new URLSearchParams(n.toString());e.delete("node"),l(e,{replace:!0})},[n,l]),M=he(null);N(()=>{M.current&&M.current!==v&&w(),M.current=v},[v,w]),N(()=>{r&&r!==re.current&&w(),re.current=r},[r,w]),N(()=>{c!==u&&Q(u)},[u]);const Re=e=>{const i=e.target.value;if(i!==null){const m=new URLSearchParams(n.toString());m.set("visualization",i),l(m),E(null)}},we=e=>{const i=new URLSearchParams(n.toString());i.set("colors",e.target.value),l(i)},Le=(e,i)=>{ke(i)},D=e=>{if(!c)return;const i=be({trackId:c});U(`${i}?owners=${encodeURIComponent(e)}`)},Z=Ye(W),ne=Z.find(e=>e.value===te)?.interpolator??(e=>"#ccc"),x=e=>ne(e/100),Ie=()=>{if(!r||!c||!s)return null;const e={trackId:c,groupRef:r,track:s,hierarchyData:f,trackStatus:g,getColor:x,onZoomChange:E,onNodeHover:i=>b(i),hoveredNode:ve,selectedNode:p,onNodeSelect:O};switch(v){case"treemap":return t(pt,{...e});case"icicle":return t(mt,{...e});case"sunburst":return t(ut,{...e});case"circlepack":return t(ge,{...e});case"table":{const i=f?.[r];if(!i)return null;const m=fe(i,g||null,x,A,void 0);return t(lt,{hierarchyData:m??null,getColor:x,selectedNode:p,onNodeSelect:O,trackStatus:g,onTeamClick:D})}default:return t(ge,{...e})}},ae=(!_.getRegisteredFlags().find(e=>e.name==="soundcheck-enable-tech-insights-visualizations")||_.isActive("soundcheck-enable-tech-insights-visualizations"))&&J.getOptionalBoolean("soundcheck.techInsights.showExperimentalVisualizations"),oe=L(()=>d(se,{children:[t(rt,{onChange:e=>{T(null),b(null),B(e)}}),t(o,{minWidth:320,children:t(at,{selectedTrackId:c,selectTrack:ie,selectedGroupRef:r??""})})]}),[ie,r,c,B]),ze=y||z,le=K?.getLCPValue();return N(()=>{if(!y&&!z&&!ee){const e=r?_e(f?.[r]):0,i=c?1:0;k({lcp:le,numberOfEntities:e,entitiesBucket:Je(e),numberOfTracks:i,tracksBucket:et(i)})}},[y,z,ee,f,r,c,k,le]),!ze&&(!s||!r)?t(o,{className:a.root,children:t(tt,{title:"No Group or Track Selected",description:"Select a group and track in order to view insights.",action:t(o,{display:"flex",flexDirection:"column",gridGap:12,children:oe})})}):t(o,{className:a.root,children:d(o,{className:a.layoutContainer,children:[t(o,{className:a.mainLayout,children:d(o,{className:a.mainContent,children:[d(o,{className:a.controlsContainer,children:[t(o,{className:a.leftControls,children:oe}),ae&&d(o,{className:a.rightControls,children:[t(o,{className:a.visualizationSelect,children:d(me,{className:a.input,value:v,onChange:Re,displayEmpty:!0,fullWidth:!0,"aria-label":"visualization select",margin:"dense",placeholder:"Visualization",variant:"outlined",children:[t(S,{value:"circlepack",children:"Circle Pack"}),t(S,{value:"icicle",children:"Icicle"}),t(S,{value:"sunburst",children:"Sunburst"}),t(S,{value:"treemap",children:"Treemap"}),t(S,{value:"table",children:"Table"})]})}),t(o,{className:a.colorSchemeSelect,children:t(me,{className:a.input,value:te,fullWidth:!0,"aria-label":"color schema",onChange:we,margin:"dense",placeholder:"Color Scheme",variant:"outlined",renderValue:e=>{const i=Z.find(m=>m.value===e)?.interpolator;return t(o,{display:"flex",alignItems:"center",pr:3,children:typeof i=="function"&&t(xe,{interpolator:i,width:90,height:20})})},children:Z.map(e=>t(S,{value:e.value,children:t(o,{display:"flex",alignItems:"center",children:e.interpolator&&t(xe,{interpolator:e.interpolator,width:90,height:20})})},e.value))})})]})]}),c&&r&&d(se,{children:[d(o,{className:a.visualizationContainer,minHeight:v!=="table"?400:void 0,children:[d(o,{mb:.5,display:"flex",alignItems:"center",children:[t(o,{className:a.breadcrumbContainer,children:t(ht,{node:p,onNodeClick:e=>{O(e)}})}),ae&&t(o,{className:a.colorLegendWrapper,children:t(ot,{interpolator:ne,orientation:"horizontal",height:24,width:"100%",markerValue:p?p.passPercentage:void 0})})]}),t(o,{className:a.visualizationContent,children:z?d(o,{className:a.loadingContainer,children:[t(Ae,{className:a.loadingSpinner,size:48}),t(ue,{className:a.loadingText,children:"Loading organization hierarchy..."}),t(ue,{className:a.loadingSubtext,children:"This may take a few moments while we gather data about your organization."})]}):Ie()})]}),d(o,{className:a.tabsContainer,children:[d($e,{value:G,onChange:Le,indicatorColor:"primary",textColor:"primary",children:[t(pe,{label:"Summary"}),t(pe,{label:"Entities"})]}),t(Ce,{value:G,index:0,children:d(o,{className:a.summaryContainer,children:[t(o,{className:`${a.summaryBox} ${a.summaryBoxLeft}`,children:t(ct,{trackStatus:g||null,getColor:x,onTeamClick:D})}),t(o,{className:`${a.summaryBox} ${a.summaryBoxRight}`,children:t(dt,{trackStatus:g||null,getColor:x,onTeamClick:D})})]})}),t(Ce,{value:G,index:1,children:t(o,{className:a.entitiesContainer,children:s&&t(nt,{track:s,initialPageSize:10,owners:p&&p.entityRef!==r?[p.entityRef]:X?[X]:[r],getColor:x})})})]})]})]})}),t(o,{className:a.sidebarTransition,width:p?360:0,children:t(o,{className:a.sidebarContainer,children:p&&t(st,{node:p,clearSelectedNode:w,checkIds:Te,track:s,getColor:x,onTeamClick:D})})})]})})};export{gt as HierarchicalTechInsightsPage};
2
- //# sourceMappingURL=HierarchicalTechInsightsPage.esm.js.map
@@ -1,2 +0,0 @@
1
- import{jsxs as f,jsx as t}from"react/jsx-runtime";import{useApi as q}from"@backstage/core-plugin-api";import{entityPresentationApiRef as G}from"@backstage/plugin-catalog-react";import{makeStyles as J,Typography as R,TableContainer as K,Paper as Q,Table as X,TableHead as Y,TableRow as E,TableCell as m,TableSortLabel as w,TableBody as Z,Box as k,Link as ee,TablePagination as te}from"@material-ui/core";import ne from"@material-ui/icons/ArrowDownward";import ae from"@material-ui/icons/ArrowUpward";import{useState as C,useEffect as re,useMemo as I}from"react";import{useSearchParams as ie}from"react-router-dom";import{ColorChip as oe}from"../ColorChip/ColorChip.esm.js";import{TeamStatusBar as le}from"../TeamStatusBar/TeamStatusBar.esm.js";const se=J(n=>({tableContainer:{display:"flex",flexDirection:"column",height:"100%"},selectedRow:{backgroundColor:n.palette.action.hover},table:{"& tbody tr":{cursor:"pointer","&:hover":{backgroundColor:n.palette.action.hover}},"& tbody tr.selected":{backgroundColor:n.palette.action.selected,"&:hover":{backgroundColor:n.palette.action.selected}}},headerCell:{cursor:"pointer"},headerContent:{display:"flex",alignItems:"center"},sortIconContainer:{width:"24px",display:"flex",justifyContent:"center"},sortIcon:{fontSize:"20px"},tableContainerPaper:{boxShadow:"none"},title:{paddingBottom:"8px"},chevronIcon:{fontSize:"20px"},chevronCell:{verticalAlign:"middle",padding:"8px 4px",lineHeight:1},placeholderDiv:{width:"20px",height:"20px",display:"inline-block"},statusColumnHeader:{width:"300px"},statusColumnCell:{width:"100%"},groupDisplayName:{lineHeight:"24px",fontWeight:"bold"}})),ce=n=>{const p=[],c=o=>{!o.children||o.children.length===0?o.numberOfEntities>0&&p.push(o):o.children.forEach(y=>c(y))};return c(n),p},O=(n,p)=>{if(!n||typeof n!="object")return null;if(n.groupRef===p)return n.status;if(n.children&&Array.isArray(n.children))for(const c of n.children){const o=O(c,p);if(o)return o}return null},de=({hierarchyData:n,getColor:p,selectedNode:c,onNodeSelect:o,onTeamClick:y,trackStatus:z})=>{const i=se(),A=q(G),[u,N]=ie(),[b,S]=C(0),[g,B]=C(10),D=u.get("sortBy"),L=u.get("direction"),[l,H]=C(D||"passPercentage"),[s,j]=C(L||"asc");re(()=>{const e=new URLSearchParams(u.toString());e.set("sortBy",l),e.set("direction",s),N(e,{replace:!0})},[l,s,u,N]);const P=I(()=>n?ce(n):[],[n]),T=I(()=>P.map(e=>({id:e.entityRef,name:e.name,entityRef:e.entityRef,passPercentage:e.passPercentage,numberOfEntities:e.numberOfEntities})).sort((e,d)=>{let a,r;switch(l){case"name":a=e.name.toLowerCase(),r=d.name.toLowerCase();break;case"passPercentage":a=e.passPercentage,r=d.passPercentage;break;case"numberOfEntities":a=e.numberOfEntities,r=d.numberOfEntities;break;default:return 0}return typeof a=="number"&&typeof r=="number"?s==="asc"?a-r:r-a:typeof a=="string"&&typeof r=="string"?s==="asc"?a.localeCompare(r):r.localeCompare(a):s==="asc"?a<r?-1:a>r?1:0:a>r?-1:a<r?1:0}),[P,l,s]);if(!n)return null;const M=e=>{if(o)if(c&&e.entityRef===c.entityRef)o(null);else{const d=P.find(a=>a.entityRef===e.entityRef);o(d||null)}},$=(e,d)=>{S(d)},U=e=>{B(parseInt(e.target.value,10)),S(0)},v=e=>{j(l===e&&s==="asc"?"desc":"asc"),H(e)},x=e=>e.direction==="asc"?t(ae,{...e,fontSize:"small"}):t(ne,{...e,fontSize:"small"}),V=T.slice(b*g,b*g+g);return f("div",{className:i.tableContainer,children:[t(R,{variant:"h6",className:i.title,children:"Teams"}),t(K,{component:Q,className:i.tableContainerPaper,children:f(X,{size:"small",children:[t(Y,{children:f(E,{children:[t(m,{className:i.headerCell,width:"35%",children:t(w,{active:l==="name",direction:l==="name"?s:"desc",onClick:()=>v("name"),IconComponent:x,children:t("div",{className:i.headerContent,children:"Team"})})}),t(m,{className:i.headerCell,width:"15%",children:t(w,{active:l==="numberOfEntities",direction:l==="numberOfEntities"?s:"desc",onClick:()=>v("numberOfEntities"),IconComponent:x,children:t("div",{className:i.headerContent,children:"Entities"})})}),t(m,{className:i.headerCell,width:"25%",children:t(w,{active:l==="passPercentage",direction:l==="passPercentage"?s:"desc",onClick:()=>v("passPercentage"),IconComponent:x,children:t("div",{className:i.headerContent,children:"Compliance"})})}),t(m,{className:i.statusColumnHeader,width:"25%"})]})}),t(Z,{children:V.map(e=>{const d=c&&e.entityRef===c.entityRef,a=A.forEntity(e.entityRef),r=a.snapshot.Icon,W=a.snapshot.primaryTitle||e.entityRef,h=O(z||null,e.entityRef),F=(h?.passed??0)+(h?.failed??0)+(h?.warning??0)+(h?.error??0)+(h?.notReported??0);return f(E,{hover:!0,onClick:()=>M(e),className:d?i.selectedRow:"",style:{cursor:"pointer"},children:[t(m,{style:{verticalAlign:"middle"},children:f(k,{display:"flex",alignItems:"center",height:"100%",children:[r&&t(k,{marginRight:1,display:"flex",alignItems:"center",height:"24px",children:t(r,{fontSize:"small"})}),t(ee,{component:"button",onClick:_=>{_.stopPropagation(),y?.(e.entityRef)},children:t(R,{variant:"body2",className:i.groupDisplayName,children:W})})]})}),t(m,{children:t(R,{variant:"body2",children:e.numberOfEntities.toLocaleString()})}),t(m,{children:t(oe,{value:h&&F>0?`${Math.round(e.passPercentage)}%`:"N/A",getColor:p,numericValue:e.passPercentage,size:"medium"})}),t(m,{children:t(k,{className:i.statusColumnCell,children:t(le,{status:h})})})]},e.id)})})]})}),t(te,{rowsPerPageOptions:[10,25,50],component:"div",count:T.length,rowsPerPage:g,page:b,onPageChange:$,onRowsPerPageChange:U})]})};export{de as HierarchyTable};
2
- //# sourceMappingURL=HierarchyTable.esm.js.map
@@ -1,2 +0,0 @@
1
- import{jsx as o}from"react/jsx-runtime";import{useApi as f}from"@backstage/core-plugin-api";import{entityPresentationApiRef as u}from"@backstage/plugin-catalog-react";import{useTheme as c}from"@material-ui/core";import{useMemo as P}from"react";import{getLeafNodes as d}from"./getLeafNodes.esm.js";import{TeamPerformanceListCard as m}from"./TeamPerformanceListCard.esm.js";const C=({trackStatus:t,getColor:r,limit:i=3,onTeamClick:a})=>{const s=c(),n=f(u),l=P(()=>t?d(t):[],[t]);if(!t)return o(m,{title:"Teams Needing Attention",titleColor:s.palette.error.main,teams:[],getColor:r,onTeamClick:a,emptyMessage:"Loading team performance data..."});const p=l.filter(e=>e.status.passed+e.status.failed+e.status.warning+e.status.error+e.status.notReported>0&&(e.status.allPassPercentage??0)<50&&!e.children?.length).sort((e,g)=>(e.status.allPassPercentage??0)-(g.status.allPassPercentage??0)).slice(0,i).map(e=>({groupRef:e.groupRef,teamName:n.forEntity(e.groupRef).snapshot.primaryTitle,passPercentage:e.status.allPassPercentage??0}));return o(m,{title:"Teams Needing Attention",titleColor:s.palette.error.main,teams:p,getColor:r,onTeamClick:a,emptyMessage:"Every team is performing above 50%! \u{1F389}"})};export{C as LowestPerformingTeams};
2
- //# sourceMappingURL=LowestPerformingTeams.esm.js.map
@@ -1,2 +0,0 @@
1
- import{jsxs as r,jsx as t}from"react/jsx-runtime";import{Link as U}from"@backstage/core-components";import{useApi as F,useRouteRef as G}from"@backstage/core-plugin-api";import{entityPresentationApiRef as Y}from"@backstage/plugin-catalog-react";import{makeStyles as _,useTheme as q,Box as i,Link as J,Typography as l,Chip as K,IconButton as z,CircularProgress as T,Tooltip as Q}from"@material-ui/core";import X from"@material-ui/icons/Close";import Z from"@material-ui/icons/ExpandLess";import ee from"@material-ui/icons/ExpandMore";import{useState as te,useEffect as oe,useCallback as ae}from"react";import{useSearchParams as ie}from"react-router-dom";import{useCheckStatuses as ne}from"../../hooks/aggregations/useCheckStatuses.esm.js";import{trackCheckDetailsRouteRef as re}from"../../routes.esm.js";import{getContrastTextColor as R,getCheckStatusColor as le}from"../../utils/colors.esm.js";import{ColorChip as B}from"../ColorChip/ColorChip.esm.js";const se=_(e=>({checkLinkText:{color:"inherit",textDecoration:"none"},emptyStateIcon:{fontSize:e.typography.h3.fontSize,color:e.palette.text.secondary,opacity:.4,marginBottom:12},emptyStateText:{color:e.palette.text.secondary,textAlign:"center"},checksContainer:{flex:1,overflowY:"auto",minHeight:0},checksTitle:{fontWeight:"bold",marginBottom:4},levelHeader:{display:"flex",alignItems:"center",cursor:"pointer"},levelLabel:{fontWeight:"bold",letterSpacing:1,color:e.palette.text.secondary,marginBottom:2,flex:1},expandIcon:{fontSize:e.typography.body2.fontSize,color:e.palette.text.secondary},progressContainer:{display:"flex",alignItems:"center",justifyContent:"flex-start",marginBottom:16},progressWrapper:{position:"relative",display:"inline-flex"},progressBackground:{position:"absolute",color:e.palette.divider},progressText:{position:"absolute",top:0,left:0,bottom:0,right:0,display:"flex",alignItems:"center",justifyContent:"center",fontSize:e.typography.body1.fontSize,fontWeight:"bold"},checkName:{whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis","&:hover":{textDecoration:"underline"}},checkMessage:{whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis"},statusChip:{fontSize:e.typography.caption.fontSize,height:22,borderRadius:12,marginLeft:8,marginBottom:0},secondaryTitle:{display:"-webkit-box",WebkitLineClamp:5,WebkitBoxOrient:"vertical",overflow:"hidden",textOverflow:"ellipsis",maxWidth:"100%",marginBottom:8,marginTop:2,lineHeight:1.4,paddingBottom:4},entityCount:{fontSize:e.typography.caption.fontSize},entityLabel:{fontSize:e.typography.caption.fontSize},entityContainer:{display:"flex",alignItems:"center",marginBottom:16},titleContainer:{display:"flex",alignItems:"center",justifyContent:"space-between",marginBottom:.5},titleContent:{display:"flex",alignItems:"center",minWidth:0},titleStatus:{display:"flex",alignItems:"center"},titleIcon:{display:"flex",alignItems:"center",marginRight:8},titleText:{minWidth:0,fontWeight:"bold"},emptyStateContainer:{display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",marginTop:2,marginBottom:1},tooltip:{color:e.palette.text.primary,fontSize:e.typography.caption.fontSize,borderRadius:e.shape.borderRadius,padding:e.spacing(1)},tooltipItem:{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:e.spacing(.5)},tooltipCategory:{display:"flex",alignItems:"center",flex:1,fontSize:e.typography.body2.fontSize,marginRight:e.spacing(2)},tooltipValue:{fontSize:e.typography.body2.fontSize,color:e.palette.text.primary}})),L=e=>new Intl.NumberFormat("en-US",{notation:"compact",maximumFractionDigits:1}).format(e),ce=({node:e,clearSelectedNode:W,checkIds:h,track:c,getColor:k,onTeamClick:A})=>{const f=q(),o=se(),P=F(Y),S=G(re),[j]=ie(),[O,N]=te(()=>c?.levels?new Set(c.levels.map(a=>a.ordinal)):new Set),g=e?P.forEntity(e.entityRef):void 0;oe(()=>{if(c?.levels){const a=new Set(c.levels.map(m=>m.ordinal));N(a)}},[c?.levels]);const D=a=>{N(m=>{const n=new Set(m);return n.has(a)?n.delete(a):n.add(a),n})},E=a=>a<50?{label:"Needs Attention",color:f.palette.error.main,textColor:R(f.palette.error.main)}:a<80?null:{label:"Healthy",color:f.palette.success.main,textColor:R(f.palette.success.main)},H=ae(a=>{switch(a){case"not-applicable":case"notApplicable":return"Not Applicable";case"not-reported":case"notReported":return"Not Reported";default:return a.charAt(0).toUpperCase()+a.slice(1)}},[]),M=(a,m)=>{const n=a.numberOfEntities-a.notApplicable-a.exempt,y=a.passed,u=a.failed,C=a.warning,d=a.error,s=a.notReported,x=[{name:"passed",value:y},{name:"failed",value:u},{name:"warning",value:C},{name:"error",value:d},{name:"not-reported",value:s}].filter(p=>p.value>0);return r("div",{className:o.tooltip,children:[t(l,{variant:"caption",style:{fontWeight:"bold",marginBottom:8,display:"block"},children:m.name}),x.map((p,v)=>r("div",{className:o.tooltipItem,children:[r("div",{className:o.tooltipCategory,children:[t("span",{style:{width:12,height:4,borderRadius:2,backgroundColor:le(f,p.name),marginRight:8}}),t(l,{variant:"caption",children:H(p.name)})]}),t("div",{className:o.tooltipValue,children:r(l,{variant:"caption",children:[p.value," of ",L(n)," (",Math.round(p.value/n*100),"%)"]})})]},v))]})},I=ne(e&&h&&h.length?{checkIds:h,trackId:c?.id,filter:{"relations.ownedBy":[e.entityRef]}}:{checkIds:[]},!!(e&&h&&h.length)),b=E(e.passPercentage),V=()=>{if(!c?.levels||h.length===0)return t(i,{mt:2,children:t(l,{variant:"body2",color:"textSecondary",children:"No checks found for this entity."})});const a=c.levels,m=(I.data||[]).reduce((n,y)=>(n[y.id]=y,n),{});return r(i,{mt:2,className:o.checksContainer,children:[t(l,{variant:"subtitle2",className:o.checksTitle,children:"Checks"}),a.map(n=>{const y=n.name??`Level ${n.ordinal}`,u=n.ordinal,C=O.has(u);return r(i,{mb:1,children:[r(i,{className:o.levelHeader,onClick:()=>D(u),children:[t(l,{variant:"overline",className:o.levelLabel,children:y}),t(z,{size:"small",className:o.expandIcon,children:C?t(Z,{}):t(ee,{})})]}),C&&n.checks.map(d=>{const s=m[d.id],x=s?s.numberOfEntities-s.notApplicable-s.exempt:0,p=s&&x>0?Math.round(s.passed/x*100):0;let v;if(c&&S&&e){const $=S({trackId:c.id,checkId:d.id}),w=new URLSearchParams(j.toString());w.set("owners",e.entityRef),v=`${$}?${w.toString()}`}return r(i,{display:"flex",alignItems:"center",mb:.5,children:[t(i,{mr:1,display:"flex",children:I.isLoading?t(B,{value:"",getColor:()=>f.palette.divider,numericValue:0,size:"small"}):t(Q,{title:s?M(s,d):"",placement:"top",arrow:!0,classes:{tooltip:o.tooltip},children:t(i,{children:t(B,{value:s&&x>0?`${p}%`:"N/A",getColor:k,numericValue:p,size:"small"})})})}),t(i,{flex:1,minWidth:0,children:v?t(U,{to:v,style:{color:"inherit",textDecoration:"none"},className:o.checkLinkText,children:t(l,{variant:"body2",className:o.checkName,children:d.name})}):t(l,{variant:"body2",className:o.checkName,children:d.name})})]},d.id)})]},u)})]})};return r(i,{children:[r(i,{className:o.titleContainer,children:[r(i,{className:o.titleContent,children:[g?.snapshot.Icon&&t(i,{component:"span",className:o.titleIcon,children:t(g.snapshot.Icon,{fontSize:"small"})}),t(J,{component:"button",onClick:()=>A?.(e.entityRef),noWrap:!0,children:t(l,{variant:"h6",noWrap:!0,className:o.titleText,children:g?.snapshot.primaryTitle||e.name})})]}),r(i,{className:o.titleStatus,children:[b&&t(K,{label:b.label,style:{background:b.color,color:b.textColor},className:o.statusChip,size:"small"}),t(z,{onClick:W,size:"small",children:t(X,{})})]})]}),g?.snapshot.secondaryTitle&&t(l,{variant:"caption",color:"textSecondary",className:o.secondaryTitle,children:g.snapshot.secondaryTitle}),t(i,{className:o.entityContainer,children:r(l,{variant:"body2",color:"textSecondary",className:o.entityLabel,children:["Entities:"," ",t("span",{className:o.entityCount,children:L(e.numberOfEntities)})]})}),t(i,{className:o.progressContainer,children:r(i,{className:o.progressWrapper,children:[t(T,{variant:"determinate",value:100,size:80,thickness:6,className:o.progressBackground}),t(T,{variant:"determinate",value:e.passPercentage,size:80,thickness:6,style:{color:k(e.passPercentage)}}),r(l,{className:o.progressText,children:[Math.round(e.passPercentage),"%"]})]})}),t(V,{})]})};export{ce as SelectedNodeSidebar};
2
- //# sourceMappingURL=SelectedNodeSidebar.esm.js.map
@@ -1,2 +0,0 @@
1
- import{jsxs as s,jsx as o}from"react/jsx-runtime";import{useApi as g}from"@backstage/core-plugin-api";import{entityPresentationApiRef as y}from"@backstage/plugin-catalog-react";import{makeStyles as x,Box as n,Typography as p}from"@material-ui/core";import{useTheme as C}from"@material-ui/core/styles";import{getContrastTextColor as u}from"../../utils/colors.esm.js";import{ColorChip as b}from"../ColorChip/ColorChip.esm.js";const T=x(t=>({card:{display:"flex",alignItems:"center",justifyContent:"space-between",backgroundColor:t.palette.background.paper,borderRadius:8,padding:t.spacing(1,2),marginBottom:0,boxShadow:"none",width:"100%",cursor:"pointer"},cardContent:{flex:1,minWidth:0},titleRow:{display:"flex",alignItems:"center"},icon:{display:"flex",alignItems:"center",marginRight:t.spacing(1)},title:{fontWeight:"bold"},secondaryTitle:{display:"block",whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis",maxWidth:"100%"},chipContainer:{marginLeft:t.spacing(2),flexShrink:0}})),w=({teamName:t,passPercentage:i,getColor:l,entityRef:c,onClick:a})=>{const d=C(),e=T(),m=g(y),h=l(i),f=u(d.palette.background.paper),r=m.forEntity(c);return s(n,{className:e.card,style:{color:f,border:`1px solid ${h}`,cursor:a?"pointer":void 0},onClick:a?()=>a(c):void 0,tabIndex:a?0:-1,children:[s(n,{className:e.cardContent,children:[s(n,{className:e.titleRow,children:[r?.snapshot.Icon&&o(n,{component:"span",className:e.icon,children:o(r.snapshot.Icon,{})}),o(p,{variant:"subtitle1",className:e.title,children:r?.snapshot.primaryTitle||t})]}),r?.snapshot.secondaryTitle&&o(p,{variant:"caption",color:"textSecondary",className:e.secondaryTitle,children:r.snapshot.secondaryTitle})]}),o(n,{className:e.chipContainer,children:o(b,{value:`${i}%`,getColor:l,numericValue:i})})]})};export{w as TeamPerformanceCard};
2
- //# sourceMappingURL=TeamPerformanceCard.esm.js.map
@@ -1,2 +0,0 @@
1
- import{jsxs as m,jsx as a}from"react/jsx-runtime";import{makeStyles as p,Paper as g,Typography as d,Box as n}from"@material-ui/core";import{TeamPerformanceCard as f}from"./TeamPerformanceCard.esm.js";const y=p(e=>({root:{borderRadius:16,background:"inherit",padding:e.spacing(2.5),height:"100%",display:"flex",flexDirection:"column"},title:{fontWeight:600,marginBottom:e.spacing(1.5)},content:{display:"flex",flexDirection:"column",gap:e.spacing(1.5),flex:1},row:{display:"flex",alignItems:"center"}})),h=({title:e,titleColor:i,teams:r,getColor:l,onTeamClick:s,emptyMessage:c})=>{const o=y();return m(g,{elevation:3,className:o.root,children:[a(d,{variant:"h6",className:o.title,style:{color:i},children:e}),a(n,{className:o.content,children:r.length===0?a(n,{color:"text.secondary",display:"flex",alignItems:"center",justifyContent:"center",width:"100%",children:c}):r.map(t=>a(f,{teamName:t.teamName,passPercentage:t.passPercentage,getColor:l,entityRef:t.groupRef,onClick:s},t.groupRef))})]})};export{h as TeamPerformanceListCard};
2
- //# sourceMappingURL=TeamPerformanceListCard.esm.js.map
@@ -1,2 +0,0 @@
1
- import{jsx as o}from"react/jsx-runtime";import{useApi as u}from"@backstage/core-plugin-api";import{entityPresentationApiRef as f}from"@backstage/plugin-catalog-react";import{useTheme as g}from"@material-ui/core";import{useMemo as P}from"react";import{getLeafNodes as d}from"./getLeafNodes.esm.js";import{TeamPerformanceListCard as m}from"./TeamPerformanceListCard.esm.js";const T=({trackStatus:t,getColor:s,limit:i=3,onTeamClick:a})=>{const r=g(),l=u(f),n=P(()=>t?d(t):[],[t]);if(!t)return o(m,{title:"Top Performing Teams",titleColor:r.palette.success.main,teams:[],getColor:s,onTeamClick:a,emptyMessage:"Loading team performance data..."});const p=n.filter(e=>e.status.passed+e.status.failed+e.status.warning+e.status.error+e.status.notReported>0&&(e.status.allPassPercentage??0)>=80&&!e.children?.length).sort((e,c)=>(c.status.allPassPercentage??0)-(e.status.allPassPercentage??0)).slice(0,i).map(e=>({groupRef:e.groupRef,teamName:l.forEntity(e.groupRef).snapshot.primaryTitle,passPercentage:e.status.allPassPercentage??0}));return o(m,{title:"Top Performing Teams",titleColor:r.palette.success.main,teams:p,getColor:s,onTeamClick:a,emptyMessage:"No teams have reached the 80% mark yet, keep pushing!"})};export{T as default};
2
- //# sourceMappingURL=TopPerformingTeams.esm.js.map
@@ -1,2 +0,0 @@
1
- const r=(n,d,c)=>{const e=c??[];if(e.push(n),n.id===d)return e.map(t=>t.id);if(n.children)for(let t=n.children.length-1;t>=0;t--){const h=n.children[t],o=r(h,d,e);if(o)return o}e.pop()};export{r as findNodePath};
2
- //# sourceMappingURL=findNodePath.esm.js.map
@@ -1,2 +0,0 @@
1
- import{jsxs as n,Fragment as r,jsx as e}from"react/jsx-runtime";import{Link as y}from"@backstage/core-components";import{useRouteRef as u}from"@backstage/core-plugin-api";import{TableCell as s,Box as c,Typography as d}from"@material-ui/core";import{makeStyles as N}from"@material-ui/core/styles";import{Skeleton as o}from"@material-ui/lab";import"react-circular-progressbar/dist/styles.css";import{useSearchParams as w}from"react-router-dom";import{trackCheckDetailsRouteRef as S}from"../../routes.esm.js";import{compactNumberFormatter as m}from"../../utils/formatters.esm.js";import{CheckStatusBar as B}from"../CheckStatusBar/CheckStatusBar.esm.js";import"../CheckStatusBar/CheckStatusBarBUI.esm.js";import{PassPercentageProgressbar as C}from"../PassingPercentProgressbar/PassPercentageProgressbar.esm.js";const R=N(t=>({checkContent:{display:"flex",alignItems:"center",gap:t.spacing(2),width:"100%",paddingTop:t.spacing(1),paddingBottom:t.spacing(1)},checkStatus:{display:"flex",alignItems:"center",gap:t.spacing(1),minWidth:"fit-content"},checkName:{display:"flex",alignItems:"center"},checkNameLink:{color:"inherit",textDecoration:"none","&:hover":{textDecoration:"none"}},passingText:{color:t.palette.text.secondary,display:"flex",flexDirection:"column",alignItems:"flex-end",lineHeight:1.2,minWidth:"40px"},categoryBarSection:{display:"flex",flexDirection:"column",alignItems:"flex-end",width:"100%",justifyContent:"flex-end"},categoryBar:{"& .MuiBox-root > div":{height:"8px"},width:"100%"},skeleton:{backgroundColor:t.palette.action.hover},passingTextCell:{width:"100px",paddingRight:0,paddingTop:t.spacing(1),paddingBottom:t.spacing(1)}})),I=({check:t,status:a,theme:h,trackId:g})=>{const i=R(),x=u(S),[p]=w(),l=a?a.numberOfEntities-a.notApplicable-a.exempt:0,f=l>0?Math.round((a?.passed??0)/l*100):0,k=`${x({trackId:g,checkId:t.id})}${p.toString()?`?${p.toString()}`:""}`;return n(r,{children:[e(s,{style:{width:"120px",paddingRight:0},children:e(c,{className:i.checkStatus,children:a?e(C,{passPercentage:f}):n(r,{children:[e(o,{variant:"circle",width:24,height:24,className:i.skeleton}),e(o,{width:45,height:24,className:i.skeleton})]})})}),e(s,{style:{width:"300px",paddingRight:0},children:e(c,{className:i.checkName,children:e(y,{to:k,className:i.checkNameLink,children:e(d,{children:t.name})})})}),e(s,{style:{width:"250px",paddingRight:0},children:e(c,{className:i.categoryBarSection,children:a?e(c,{style:{width:"100%",display:"flex",justifyContent:"flex-end"},children:e(B,{status:a,className:i.categoryBar})}):e(o,{variant:"rect",width:250,height:8,className:i.skeleton})})}),e(s,{style:{width:"100px",paddingRight:0,paddingTop:h.spacing(1),paddingBottom:h.spacing(1)},children:e(c,{className:i.passingText,children:a?n(r,{children:[n(d,{variant:"caption",children:[m(a.passed)," of"," ",m(l)]}),e(d,{variant:"caption",children:"passing"})]}):n(r,{children:[e(o,{width:60,height:16,className:i.skeleton}),e(o,{width:40,height:16,className:i.skeleton})]})})})]})};export{I as CheckRowContent};
2
- //# sourceMappingURL=CheckRowContent.esm.js.map
@@ -1,2 +0,0 @@
1
- import{jsx as e,Fragment as d,jsxs as s}from"react/jsx-runtime";import{TableRow as o,useTheme as k,TableContainer as C,Table as h,TableBody as m,TableCell as p,Box as x,IconButton as y,Typography as T,Collapse as L}from"@material-ui/core";import{makeStyles as b}from"@material-ui/core/styles";import w from"@material-ui/icons/KeyboardArrowDown";import N from"@material-ui/icons/KeyboardArrowUp";import{memo as S,useState as I,useCallback as R}from"react";import{CheckRowContent as B}from"./CheckRowContent.esm.js";const g=b(l=>({root:{width:"100%"},levelCell:{display:"flex",alignItems:"flex-start",width:"100%",padding:l.spacing(1)},levelContent:{display:"flex",flexDirection:"column",gap:l.spacing(2),width:"100%"},levelHeader:{display:"flex",alignItems:"center"},levelName:{fontSize:"1rem",fontWeight:500,lineHeight:1,marginLeft:l.spacing(1)},headerCell:{fontWeight:500,color:l.palette.text.secondary,padding:l.spacing(2)}})),v=S(({checks:l,checkStatuses:a,theme:c,trackId:n})=>e(d,{children:l.map(t=>{const i=a?.find(r=>r.id===t.id);return e(o,{children:e(B,{check:t,status:i,theme:c,trackId:n})},t.id)})}));v.displayName="CheckRows";const f=({level:l,children:a,hideLevel:c})=>{const n=g(),[t,i]=I(!0),r=R(()=>{i(u=>!u)},[]);return s(d,{children:[!c&&e(o,{children:e(p,{colSpan:4,className:n.levelCell,children:s(x,{className:n.levelHeader,children:[e(y,{size:"small",onClick:r,children:t?e(N,{}):e(w,{})}),e(T,{className:n.levelName,children:l.name??`Level ${l.ordinal}`})]})})}),e(o,{children:e(p,{style:{paddingTop:0,paddingBottom:0},children:e(L,{in:t,timeout:"auto",unmountOnExit:!0,children:e(h,{size:"small",padding:"none",children:e(m,{children:a})})})})})]})},z=({track:l,checkStatuses:a,hideLevel:c})=>{const n=g(),t=k();return l.levels?.length?e(C,{component:"div",className:n.root,children:e(h,{children:e(m,{children:l.levels.map(i=>e(f,{level:i,hideLevel:c,children:e(v,{checks:i.checks,checkStatuses:a,theme:t,trackId:l.id})},i.ordinal))})})}):null};export{f as LevelRow,z as LevelsTable};
2
- //# sourceMappingURL=LevelsTable.esm.js.map
@@ -1,2 +0,0 @@
1
- import{jsxs as a,Fragment as n,jsx as t}from"react/jsx-runtime";import{makeStyles as c,useTheme as p,Box as m,Typography as g}from"@material-ui/core";import d from"@material-ui/icons/Check";import{CircularProgressbarWithChildren as h,buildStyles as f}from"react-circular-progressbar";import{getPercentageColor as u}from"../../utils/colors.esm.js";const C=c(e=>({progressCircle:{width:"24px !important",height:"24px !important"},passPercentage:{fontWeight:"bold",fontSize:"1.25em",minWidth:"50px"},icon:{color:e.palette.background.default,fontSize:15}})),P=({passPercentage:e,getColor:i})=>{const r=p(),o=C(r),s=i||(l=>u(r,l));return a(n,{children:[t(m,{className:o.progressCircle,children:t(h,{value:e,strokeWidth:e===100?50:15,styles:f({strokeLinecap:"round",pathColor:s(e),trailColor:r.palette.divider}),children:e===100&&t(d,{className:o.icon})})}),a(g,{className:o.passPercentage,style:{color:s(e)},children:[e,"%"]})]})};export{P as PassPercentageProgressbar};
2
- //# sourceMappingURL=PassPercentageProgressbar.esm.js.map
@@ -1,2 +0,0 @@
1
- import{jsxs as l,jsx as t}from"react/jsx-runtime";import{Grid as e,Typography as r,Button as a}from"@material-ui/core";import{getQuickstartStyles as m}from"./styles.esm.js";const d=({title:n,description:o,onClick:s,className:c})=>{const i=m();return l(e,{container:!0,direction:"row",alignItems:"center",className:c,children:[t(e,{item:!0,xs:3,children:t(r,{variant:"h6",children:n})}),t(e,{item:!0,xs:!0,className:i.flexGrowGrid,children:t(r,{variant:"body1",children:o})}),t(e,{item:!0,xs:1,container:!0,justifyContent:"flex-end",children:t(a,{onClick:s,className:i.dontYellAtMeButton,children:"Go"})})]})};export{d as HowDoIListItem};
2
- //# sourceMappingURL=HowDoIListItem.esm.js.map
@@ -1,2 +0,0 @@
1
- import{jsxs as s,jsx as a}from"react/jsx-runtime";import{Box as e,Typography as c,Divider as l}from"@material-ui/core";import{useNavigate as h}from"react-router-dom";import{Card as p}from"../SummaryCard/SummaryCard.esm.js";import{getQuickstartStyles as N}from"./styles.esm.js";const f=({header:o,routeRef:t,icon:i,description:d})=>{const r=N(),m=h(),n=()=>{m(t())};return s(p,{className:r.cardBase,onClick:n,children:[s(e,{className:r.cardHeader,children:[i&&a(e,{className:r.cardIcon,children:i}),a(c,{variant:"h5",className:r.headers,children:o})]}),a(l,{className:r.divider}),a(e,{children:a(c,{variant:"body1",component:"div",className:r.mainPoint,children:d})})]})};export{f as QuickstartCardBase};
2
- //# sourceMappingURL=QuickstartCardBase.esm.js.map
@@ -1,3 +0,0 @@
1
- import{jsxs as n,jsx as e}from"react/jsx-runtime";import{Content as T}from"@backstage/core-components";import{useApi as u,featureFlagsApiRef as v,configApiRef as S,useRouteRef as r}from"@backstage/core-plugin-api";import{usePermission as z}from"@backstage/plugin-permission-react";import{Typography as p,Grid as t,Accordion as H,AccordionSummary as I,AccordionDetails as L}from"@material-ui/core";import f from"@material-ui/icons/BarChart";import j from"@material-ui/icons/CheckCircle";import D from"@material-ui/icons/Computer";import Q from"@material-ui/icons/ExpandMore";import V from"@material-ui/icons/Flag";import W from"@material-ui/icons/Timeline";import{soundcheckCollectorReadPermission as q}from"@spotify/backstage-plugin-soundcheck-common";import{useMemo as E,useEffect as F}from"react";import{useLCPReporting as G}from"../../hooks/useLCPReporting.esm.js";import{useLoadTimeReporting as O}from"../../hooks/useLoadTimeReporting.esm.js";import{integrationsPageRouteRef as B,tracksPageRouteRef as M,checksPageRouteRef as J,campaignsPageRouteRef as K,techHealthRouteRef as U,techInsightsPageRouteRef as X}from"../../routes.esm.js";import"../SoundcheckHeader/SoundcheckHeader.esm.js";import"../SoundcheckHeader/SoundcheckHeaderContext.esm.js";import{useHeader as Y}from"../SoundcheckHeader/useHeader.esm.js";import{QuickstartCardBase as a}from"./QuickstartCardBase.esm.js";import{getQuickstartStyles as Z}from"./styles.esm.js";import{WelcomeHelpSection as _}from"./WelcomeHelpSection.esm.js";const $=()=>{const d=E(()=>({routeName:"soundcheck-quickstart"}),[]),{reportContentLoaded:m}=O(d),{reporter:g}=G(d),o=Z();Y({title:"Welcome to Soundcheck!",description:"Soundcheck lets you define and monitor the tech health of your organization. What insights do you need today?"});const i=u(v),R=u(S).getOptionalStringArray("soundcheck.flags"),l=i.getRegisteredFlags(),{loading:s,allowed:k}=z({permission:q}),y=(!l.find(c=>c.name==="soundcheck-enable-collectors")||i.isActive("soundcheck-enable-collectors"))&&!s&&k,x=(!l.find(c=>c.name==="soundcheck-enable-tech-health")||i.isActive("soundcheck-enable-tech-health"))&&!R?.includes("soundcheck-disable-tech-health"),N=r(B),b=r(M),C=r(J),P=r(K),A=r(U),w=r(X),h=g?.getLCPValue();return F(()=>{s||m({lcp:h})},[s,m,h]),n(T,{className:o.introTitle,children:[e(p,{className:o.welcomeSection,children:"This is your starting point for exploring and managing your tech health initiatives. Here are some key areas to get you started:"}),n(t,{container:!0,direction:"row",justifyContent:"flex-start","aria-label":"getting-started-items",className:o.grid,spacing:2,children:[e(t,{item:!0,xs:12,sm:12,md:6,lg:4,className:o.cards,children:e(a,{header:"Tech Insights",routeRef:w,icon:e(f,{}),description:`Visualize and analyze your technology landscape across teams and
2
- components.`})}),x&&e(t,{item:!0,xs:12,sm:12,md:6,lg:4,className:o.cards,children:e(a,{header:"Tech Health",routeRef:A,icon:e(f,{}),description:"Detailed query and analysis tool across teams, components, tracks, and checks."})}),e(t,{item:!0,xs:12,sm:12,md:6,lg:4,className:o.cards,children:e(a,{header:"Campaigns",routeRef:P,icon:e(V,{}),description:"Organize and manage coordinated initiatives across your organization."})}),e(t,{item:!0,xs:12,sm:12,md:6,lg:4,className:o.cards,children:e(a,{header:"Checks",routeRef:C,icon:e(j,{}),description:"Checks are comparisons between defined acceptable fact values and actual fact values."})}),e(t,{item:!0,xs:12,sm:12,md:6,lg:4,className:o.cards,children:e(a,{header:"Tracks",routeRef:b,icon:e(W,{}),description:"Tracks encourage alignment to architectural best practices and standards."})}),y&&e(t,{item:!0,xs:12,sm:12,md:6,lg:4,className:o.cards,children:e(a,{header:"Integrations",routeRef:N,icon:e(D,{}),description:"Integrations collect raw data about your components for use in checks and tracks."})})]}),n(H,{className:o.accordion,children:[e(I,{expandIcon:e(Q,{}),"aria-controls":"howdoi-content",id:"howdoi-header",children:e(p,{variant:"h5",children:"How Do I...?"})}),e(L,{children:e(_,{})})]})]})};export{$ as QuickstartPage};
3
- //# sourceMappingURL=QuickstartPage.esm.js.map
@@ -1,7 +0,0 @@
1
- import{jsx as e,jsxs as d}from"react/jsx-runtime";import{useRouteRef as i}from"@backstage/core-plugin-api";import{Grid as r}from"@material-ui/core";import{useNavigate as u}from"react-router-dom";import{checkCreateRouteRef as C,checkTemplatesRouteRef as f,trackCreateRouteRef as w,integrationsPageRouteRef as b,rootRouteRef as R,checksPageRouteRef as N,tracksPageRouteRef as G}from"../../routes.esm.js";import{HowDoIListItem as c}from"./HowDoIListItem.esm.js";import{getQuickstartStyles as y}from"./styles.esm.js";const T=()=>{const a=y(),t=u(),n=i(C),s=i(f),l=i(w),h=i(b),m=i(R),k=i(N),p=i(G),o=g=>g%2===0?a.bgColorEven:a.bgColorOdd;return e("div",{className:a.howDoIList,children:e(r,{container:!0,direction:"column","aria-label":"getting-started-items",className:a.grid,children:d(r,{item:!0,children:[e(c,{className:o(0),title:"Create a new check from scratch?",description:"Go to the Checks page and click the 'Create Check' button, then select 'Custom Check'.",onClick:()=>t(n())}),e(c,{className:o(1),title:"Add a new check from a template?",description:`Go to the Checks page and click the 'Create Check' button. There,
2
- you'll be presented with a list of templates from which to choose.`,onClick:()=>t(s())}),e(c,{className:o(0),title:"Add a new track?",description:"Go to the Tracks page and click the 'Create Track' button.",onClick:()=>t(l())}),e(c,{className:o(1),title:"Configure an Integration?",description:`Go to the Integrations page and click the 'Configure' button below
3
- the collector you wish to configure.`,onClick:()=>t(h())}),e(c,{className:o(0),title:"Check my team's components?",description:`Go to the Overview page and select your team from the drop-down in the top-right corner.
4
- Your team's components will appear in the table along with their check statuses.`,onClick:()=>t(m())}),e(c,{className:o(1),title:"See which components are passing a Check?",description:`Go to the insights page for the Check by clicking the 'View' button on the Checks page. Scroll
5
- down and look at the 'Entities' table.`,onClick:()=>t(k())}),e(c,{className:o(0),title:"See which components are passing a Track?",description:`Go to the insights page for the Track by clicking the 'View' button on the Tracks page. Select
6
- the 'Entities' tab.`,onClick:()=>t(p())})]})})})};export{T as WelcomeHelpSection};
7
- //# sourceMappingURL=WelcomeHelpSection.esm.js.map
@@ -1,2 +0,0 @@
1
- import{makeStyles as a}from"@material-ui/core";const t=a(n=>({grid:{padding:n.spacing(0),margin:n.spacing(0),width:"100%"},helpSection:{padding:n.spacing(1),margin:n.spacing(1)},howDoIList:{backgroundColor:n.palette.background.paper,width:"100%",padding:n.spacing(2),margin:n.spacing(1)},bgColorEven:{backgroundColor:n.palette.background.default,minHeight:"65px"},bgColorOdd:{backgroundColor:n.palette.background.paper,minHeight:"65px"},headers:{marginBottom:n.spacing(1),fontSize:"1.2rem",display:"flex",alignItems:"center"},divider:{marginTop:n.spacing(1),marginBottom:n.spacing(1)},cards:{width:"100%"},introTitle:{padding:n.spacing(1),paddingTop:n.spacing(2),paddingLeft:n.spacing(2),margin:"0, 3rem, 0, 0",display:"flex",flexDirection:"column",minHeight:"100vh"},page:{marginBottom:n.spacing(2)},link:{color:n.palette.link},list:{paddingLeft:n.spacing(0),padding:n.spacing(1)},mainPoint:{marginBottom:n.spacing(1),fontSize:"1.1rem",fontStyle:"italic"},card:{padding:n.spacing(1),margin:n.spacing(1),minHeight:"auto"},cardGrid:{padding:n.spacing(1),alignItems:"left",justifyContent:"left",width:"100%",textDecoration:"none",color:n.palette.text.primary},description:{margin:"0px",padding:"0px",textDecoration:"none"},buttonBox:{marginTop:"auto"},dontYellAtMeButton:{alignSelf:"flex-end",textTransform:"none",width:"100%",borderRadius:"30px",borderStyle:"solid",borderWidth:"1px",margin:n.spacing(.5)},headerButton:{fontSize:n.typography.body2.fontSize,textTransform:"none"},welcomeSection:{marginBottom:n.spacing(2),textAlign:"center"},cardBase:{minHeight:"75px",minWidth:"150px",cursor:"pointer","&:hover":{boxShadow:n.shadows[4]}},cardHeader:{display:"flex",alignItems:"center"},cardIcon:{marginRight:n.spacing(1),color:n.palette.primary.main},cardButtonBox:{marginTop:"auto"},accordion:{marginTop:n.spacing(3)},flexGrowGrid:{flexGrow:1}}));export{t as getQuickstartStyles};
2
- //# sourceMappingURL=styles.esm.js.map
@@ -1,2 +0,0 @@
1
- import{jsxs as a,jsx as e}from"react/jsx-runtime";import{makeStyles as w,Popper as b,Fade as u,Paper as i,ClickAwayListener as x,Box as k}from"@material-ui/core";import{useState as m,cloneElement as v}from"react";const C=w(r=>{const o=r.palette.background.paper;return{popoverRoot:{backgroundColor:o,maxWidth:1e3},content:{padding:r.spacing(2)},popper:{zIndex:2e3,'&[x-placement*="bottom"] $arrow':{top:0,left:0,marginTop:"-0.71em",marginLeft:4,marginRight:4,"&::before":{transformOrigin:"0 100%"}},'&[x-placement*="top"] $arrow':{bottom:0,left:0,marginBottom:"-0.71em",marginLeft:4,marginRight:4,"&::before":{transformOrigin:"100% 0"}},'&[x-placement*="right"] $arrow':{left:0,marginLeft:"-0.71em",height:"1em",width:"0.71em",marginTop:4,marginBottom:4,"&::before":{transformOrigin:"100% 100%"}},'&[x-placement*="left"] $arrow':{right:0,marginRight:"-0.71em",height:"1em",width:"0.71em",marginTop:4,marginBottom:4,"&::before":{transformOrigin:"0 0"}}},arrow:{overflow:"hidden",position:"absolute",width:"1em",height:"0.71em",boxSizing:"border-box",color:o,"&::before":{content:'""',margin:"auto",display:"block",width:"100%",height:"100%",boxShadow:r.shadows[1],backgroundColor:"currentColor",transform:"rotate(45deg)"}}}}),O=({placement:r="top",arrow:o=!0,open:l,onClose:p=()=>{},content:c,children:n})=>{const t=C(),[s,d]=m(null),[g,h]=m(null);return a("div",{"data-testid":"rich-tooltip",children:[v(n,{...n.props,ref:h}),e(b,{open:l,anchorEl:g,placement:r,transition:!0,className:t.popper,modifiers:{preventOverflow:{enabled:!0,boundariesElement:"window"},arrow:{enabled:o,element:s}},children:({TransitionProps:f})=>e(u,{...f,timeout:350,children:e(i,{elevation:3,children:e(x,{onClickAway:p,children:a(i,{className:t.popoverRoot,children:[o?e("span",{className:t.arrow,ref:d}):null,e(k,{className:t.content,children:c})]})})})})})]})};export{O as default};
2
- //# sourceMappingURL=RichTooltip.esm.js.map
@@ -1,2 +0,0 @@
1
- import{jsxs as t,jsx as s}from"react/jsx-runtime";import{makeStyles as o,Box as p}from"@material-ui/core";const n=o(()=>({superScript:{fontSize:"0.5rem"}})),c=({title:e})=>{const r=n();return t(p,{component:"span",children:[e," ",s("sup",{className:r.superScript,children:"New"})]})};export{c as NewFeatureTab};
2
- //# sourceMappingURL=NewFeatureTab.esm.js.map
@@ -1,2 +0,0 @@
1
- import{jsxs as o,Fragment as m,jsx as e}from"react/jsx-runtime";import{TabbedLayout as a}from"@backstage/core-components";import{useApi as d,featureFlagsApiRef as j,configApiRef as L}from"@backstage/core-plugin-api";import{usePermission as n}from"@backstage/plugin-permission-react";import{makeStyles as N}from"@material-ui/core";import{soundcheckCampaignCreatePermission as q,soundcheckCollectorReadPermission as G,soundcheckCheckCreatePermission as Q,soundcheckTrackCreatePermission as V}from"@spotify/backstage-plugin-soundcheck-common";import{Helmet as W}from"react-helmet";import{Routes as z,Route as t}from"react-router-dom";import{CampaignPage as B}from"../CampaignPage/CampaignPage.esm.js";import{CampaignsPage as J}from"../CampaignsPage/CampaignsPage.esm.js";import{CampaignCreatePage as K}from"../CampaignCreatePage/CampaignCreatePage.esm.js";import{EditCampaignView as M}from"../CampaignsPage/EditCampaignView.esm.js";import{CheckCreatePage as U}from"../CheckCreatePage/CheckCreatePage.esm.js";import{CheckEditPage as X}from"../CheckPage/CheckEditPage.esm.js";import{CheckPage as g}from"../CheckPage/CheckPage.esm.js";import{ChecksTab as Y}from"../ChecksTab/ChecksTab.esm.js";import"../CheckTemplatesPage/CheckTemplatesPageBUI.esm.js";import{CheckTemplatesPage as Z}from"../CheckTemplatesPage/CheckTemplatesPage.esm.js";import"../CheckTemplatesPage/CheckTemplatesPageDeprecated.esm.js";import{CollectorPage as _}from"../CollectorPage/CollectorPage.esm.js";import{CollectorDetailsPage as $}from"../CollectorPage/CollectorDetailsPage.esm.js";import"../CollectorPage/CollectorDetailsPageBUI.esm.js";import"../CollectorPage/CollectorDetailsPageDeprecated.esm.js";import{CollectorsPage as ee}from"../CollectorsPage/CollectorsPage.esm.js";import{HierarchicalTechInsightsPage as te}from"../HierarchicalTechInsightsPage/HierarchicalTechInsightsPage.esm.js";import{OverviewPageContent as ie}from"../OverviewPage/OverviewPageContent.esm.js";import{QuickstartPage as k}from"../QuickstartPage/QuickstartPage.esm.js";import{TechHealth as ae}from"../TechHealth/TechHealth.esm.js";import{TechInsightsPage as re}from"../TechInsights/TechInsightsPage.esm.js";import{TrackCreatePage as oe}from"../TrackCreatePage/TrackCreatePage.esm.js";import{TrackEditPage as ce}from"../TrackEditPage/TrackEditPage.esm.js";import{TrackPage as ne}from"../TrackPage/TrackPage.esm.js";import{TracksTab as me}from"../TracksTab/TracksTab.esm.js";import{NewFeatureTab as se}from"./NewFeatureTab.esm.js";import{RoutingPageWrapperDeprecated as he}from"./RoutingPageWrapperDeprecated.esm.js";const le=N(()=>({tabContent:{margin:0,padding:0},root:{"& > *":{display:"flex",flexDirection:"column",flexGrow:1}}})),pe=({title:f="Soundcheck",integrations:s})=>{const u=le(),r=d(j),h=d(L).getOptionalStringArray("soundcheck.flags"),c=r.getRegisteredFlags(),C=(!c.find(i=>i.name==="soundcheck-enable-tech-health")||r.isActive("soundcheck-enable-tech-health"))&&!h?.includes("soundcheck-disable-tech-health"),P=!c.find(i=>i.name==="soundcheck-enable-collectors")||r.isActive("soundcheck-enable-collectors"),l=!c.find(i=>i.name==="soundcheck-enable-campaigns")||r.isActive("soundcheck-enable-campaigns"),{loading:b,allowed:T}=n({permission:q}),I=!b&&T,{loading:R,allowed:v}=n({permission:G}),{loading:w,allowed:A}=n({permission:Q}),x=!c.find(i=>i.name==="soundcheck-enable-check-creation")||r.isActive("soundcheck-enable-check-creation"),y=!w&&A&&x,{loading:D,allowed:F}=n({permission:V}),H=!c.find(i=>i.name==="soundcheck-enable-track-creation")||r.isActive("soundcheck-enable-track-creation"),E=!D&&F&&H,S=P&&!R&&v,O=C,p=h?.includes("portal")??!1;return o(he,{title:f,children:[o(z,{children:[l&&o(m,{children:[e(t,{path:"/campaigns/:campaignId/edit",element:e(M,{})}),e(t,{path:"/campaigns/:campaignId",element:e(B,{})}),I&&e(t,{path:"/campaigns/create",element:e(K,{})})]}),e(t,{path:"/quickstart",element:e(k,{})}),e(t,{path:"/tech-insights/track",element:e(te,{})}),e(t,{path:"/tracks/:trackId/edit",element:e(ce,{})}),E&&e(t,{path:"/tracks/create",element:e(oe,{})}),e(t,{path:"/tracks/:trackId",element:e(ne,{})}),e(t,{path:"/tracks/:trackId/checks/:checkId",element:e(g,{})}),e(t,{path:"/checks/:checkId",element:e(g,{})}),e(t,{path:"/checks/:checkId/edit",element:e(X,{})}),y&&o(m,{children:[e(t,{path:"/checks/create",element:e(U,{})}),e(t,{path:"/checks/templates",element:e(Z,{})})]}),e(t,{path:"/integrations/:integrationId",element:e($,{integrations:s})}),e(t,{path:"/integrations/:integrationId/edit",element:e(_,{})}),p&&e(t,{path:"/",element:e(k,{})}),e(t,{path:"/*",element:o(a,{children:[e(a.Route,{title:"Overview",path:p?"/overview":"/",children:e("div",{className:u.tabContent,children:e(ie,{})})}),e(a.Route,{title:e(se,{title:"Tech Insights"}),path:"/tech-insights",children:o(m,{children:[e(W,{title:"Tech Insights"}),e(re,{})]})}),O&&e(a.Route,{title:"Tech Health",path:"/tech-health",children:e(ae,{})}),e(a.Route,{title:"Checks",path:"/checks",children:e(Y,{})}),e(a.Route,{title:"Tracks",path:"/tracks",children:e(me,{})}),l&&e(a.Route,{title:"Campaigns",path:"/campaigns",children:e(J,{})}),S&&e(a.Route,{title:"Integrations",path:"/integrations",children:e(ee,{integrations:s})})]})})]})," "]})};export{pe as RoutingPageDeprecated};
2
- //# sourceMappingURL=RoutingPageDeprecated.esm.js.map
@@ -1,2 +0,0 @@
1
- import{jsx as e,jsxs as l}from"react/jsx-runtime";import{Page as n}from"@backstage/core-components";import{makeStyles as c,Box as t}from"@material-ui/core";import{SpotifyLicenseBanner as a}from"@spotify/backstage-plugin-core";import"../../contexts/TrackFormContext.esm.js";import"../../contexts/CheckFormContext.esm.js";import"../../contexts/CampaignFormContext.esm.js";import"react";import{UserProvider as d}from"../../contexts/UserProvider.esm.js";import s from"../../hooks/useConfirmationModal.esm.js";import{AlertProvider as m}from"../../hooks/useSoundcheckAlert.esm.js";import{SoundcheckHeader as p}from"../SoundcheckHeader/SoundcheckHeader.esm.js";import{SoundcheckHeaderProvider as f}from"../SoundcheckHeader/SoundcheckHeaderContext.esm.js";import{SoundcheckQueryClientProvider as u}from"../SoundcheckQueryClientProvider/SoundcheckQueryClientProvider.esm.js";const h=c(i=>({tabContent:{margin:0,padding:0},root:{"& > *":{display:"flex",flexDirection:"column",flexGrow:1}},pageContent:{display:"flex",flexDirection:"row",flexGrow:1},pageLayout:{display:"flex",flexDirection:"column",flex:"1 1 0%",maxWidth:"100%","& > article":{display:"flex",flexDirection:"column",flex:"1 1 auto",padding:`${i.spacing(3)}px !important`}}})),x=({title:i="Soundcheck",children:o})=>{const r=h();return e(m,{children:e(d,{children:e(u,{children:e(f,{defaultTitle:i,children:e(s,{children:e(t,{className:r.root,children:l(n,{themeId:"website",children:[e(a,{backend:"soundcheck",invalidLicenseMessage:"Submitted facts and check results will still be stored, but it will not be possible to view certifications or individual results until a valid license is present."}),e(p,{documentTitle:i}),e(t,{className:r.pageContent,children:e(t,{className:r.pageLayout,children:o})})]})})})})})})})};export{x as RoutingPageWrapperDeprecated};
2
- //# sourceMappingURL=RoutingPageWrapperDeprecated.esm.js.map
@@ -1,2 +0,0 @@
1
- import{jsxs as i,jsx as a}from"react/jsx-runtime";import{parseEntityRef as F}from"@backstage/catalog-model";import{makeStyles as v,Grid as S,InputLabel as t,NativeSelect as s}from"@material-ui/core";import{Fragment as w}from"react";import"../CampaignsPage/CampaignListPage/CampaignListPageDeprecated.esm.js";import{CampaignStatus as d}from"../CampaignsPage/CampaignListPage/CampaignTypes.esm.js";import{SearchBar as y}from"../SearchBar/SearchBar.esm.js";const x=v(r=>({searchbar:{maxWidth:"275px","& input":{paddingTop:r.spacing(1),paddingBottom:r.spacing(1)}},filters:{display:"flex",alignItems:"center",padding:0},dropdownFilters:{margin:"0 15px",alignItems:"center"},selectHolder:{minWidth:105,"& select":{paddingTop:r.spacing(1),paddingBottom:r.spacing(1)}},label:{marginBottom:r.spacing(.5)}})),B=({searchPlaceholder:r,isLoading:o,searchTerm:m,setSearchTerm:h,filterAlpha:p,handleAlphabeticalFilterChange:g,filterOwner:u,handleOwnerFilterChange:f,filterStatus:n,handleStatusFilterChange:c,owners:N})=>{const e=x();return i(S,{item:!0,xs:8,className:e.filters,children:[i("div",{children:[a(t,{className:e.label,htmlFor:"search-bar",children:r||"Search"}),a(y,{searchTerm:m,disabled:o,setSearchTerm:h,placeholder:"Name",variant:"outlined",size:"small",className:e.searchbar,id:"search-bar"})]}),i("div",{className:e.dropdownFilters,children:[a(t,{className:e.label,htmlFor:"sort-by",children:"Sort By"}),i(s,{id:"sort-by",className:e.selectHolder,value:p,onChange:g,children:[a("option",{value:"ascending",children:"Name A-Z"}),a("option",{value:"descending",children:"Name Z-A"})]})]}),i("div",{className:e.dropdownFilters,children:[a(t,{className:e.label,htmlFor:"filter-owner",children:"Filter By Owner"}),i(s,{id:"filter-owner",className:e.selectHolder,value:u,onChange:f,children:[a("option",{value:"all",children:"All"},"all"),N?.map((l,b)=>a("option",{value:l,children:F(l).name},l+b))]})]}),n&&c&&i("div",{className:e.dropdownFilters,children:[a(t,{className:e.label,htmlFor:"filter-status",children:"Filter By Status"}),a(s,{id:"filter-status",className:e.selectHolder,value:n,onChange:c,children:Object.keys(d).map(l=>a(w,{children:a("option",{value:l,children:d[l]})},l))})]})]})};export{B as SearchFilters};
2
- //# sourceMappingURL=SearchFilters.esm.js.map
@@ -1,2 +0,0 @@
1
- import{jsxs as t,Fragment as S,jsx as i}from"react/jsx-runtime";import{Button as u,Typography as e,Box as n,TextField as y}from"@material-ui/core";import W from"@material-ui/icons/AddAlert";import{capitalize as B}from"lodash";import{useState as m,useCallback as I}from"react";import"@backstage/catalog-model";import"@backstage/core-plugin-api";import"@tanstack/react-query";import"../../api.esm.js";import"../../hooks/graphqlKeys.esm.js";import"@backstage/plugin-catalog-react";import"@spotify/backstage-plugin-soundcheck-common";import"../../hooks/useSoundcheckAlert.esm.js";import{useSendCampaignNotification as E}from"../../hooks/campaigns/useSendCampaignNotification.esm.js";import"../../hooks/useConfirmationModal.esm.js";import{useCertificationStatus as O}from"../../hooks/aggregations/useCertificationStatus.esm.js";import"react-router-dom";import"react-use/lib/useLocalStorage";import"../FormControlledAutocomplete/FormControlledAutocomplete.esm.js";import"@material-ui/icons/CheckBox";import"@material-ui/icons/CheckBoxOutlineBlank";import"@material-ui/lab";import"react-hook-form";import"../ListboxVirtualized/ListboxVirtualized.esm.js";import{ControlledAutocomplete as A}from"../FormControlledAutocomplete/ControlledAutocomplete.esm.js";import{FormFieldLabel as g}from"../FormFieldLabel/FormFieldLabel.esm.js";import{LoadingIndicator as $}from"../LoadingIndicator/LoadingIndicator.esm.js";import{SoundcheckDialog as j}from"../SoundcheckDialog/SoundcheckDialog.esm.js";const q=["critical","high","normal","low"],z=({loading:s,notificationCount:o,reset:p,error:d,failingCount:r})=>t(n,{children:[s&&t(n,{textAlign:"center",children:[i(e,{variant:"body1",children:"Sending Notifications..."}),i(e,{variant:"caption",children:"Do not refresh or leave the page."}),i(n,{marginTop:2,marginBottom:1,children:i($,{size:48})})]}),!s&&t(n,{children:[t(e,{variant:"body1",children:[t("strong",{children:[o," Notification",o===1?"":"s"," "]}),"sent to entity owners."]}),d&&i(e,{variant:"body2",color:"error",children:d.message}),r&&o<r&&t(e,{variant:"caption",children:["Notifications are grouped by owner, so this number might be less than the total failing entity count of"," ",i("strong",{children:r}),"."]}),i(n,{marginTop:2,children:i(u,{onClick:p,variant:"outlined",color:"primary",children:"Send Again"})})]})]}),G=({buttonClass:s,campaign:o})=>{const[p,d]=m(!1),[r,x]=m(""),[f,N]=m(""),[h,w]=m("normal"),[a,T]=m(""),[k,v]=m(!1),{data:L}=O({trackId:o.track.id},p),{mutate:C,isLoading:b,notificationCount:D,error:R}=E(),F=I(()=>{C({campaignId:o.id,entityRefs:a?[a]:void 0,title:r,description:f,severity:h.toLowerCase()}),v(!0)},[o.id,f,a,C,h,r]),c=L?.certificationStatus?.statusByLevel[0]?.failed??0;return t(S,{children:[i(u,{className:s,variant:"contained",onClick:()=>d(!0),startIcon:i(W,{}),children:"Send"}),i(j,{handleClose:()=>d(!1),title:"Send a Campaign Reminder Notification",open:p,fullScreen:!1,maxWidth:"sm",children:k?i(z,{loading:b,notificationCount:D,reset:()=>v(!1),error:R,failingCount:c}):t(S,{children:[i(e,{variant:"body1",children:"Send a notification for all entities that are currently failing checks in this campaign. Notifications will be grouped by the owner of these entities."}),t(n,{marginTop:1,children:[i(n,{display:"flex",children:i(g,{title:"Severity"})}),i(A,{value:h,onChange:w,options:q,fullWidth:!1,getOptionLabel:l=>B(l)})]}),t(n,{marginTop:1,children:[i(g,{title:"Custom Notification Title (Optional)"}),i(y,{value:r,onChange:l=>x(l.target.value),placeholder:`Default: Entities Failing Campaign - ${o.name}`,type:"text",variant:"outlined",margin:"dense",fullWidth:!0})]}),t(n,{marginTop:1,children:[i(g,{title:"Custom Notification Description (Optional)"}),i(e,{variant:"caption",component:"div",children:"Templating for custom notification messages is currently not supported."}),i(y,{value:f,onChange:l=>N(l.target.value),placeholder:`Default: Entities owned by [ownerGroup] are failing checks required in Campaign - ${o.name}.`,type:"text",variant:"outlined",margin:"dense",multiline:!0,minRows:4,maxRows:8,fullWidth:!0})]}),t(n,{marginTop:1,children:[i(g,{title:"Entity Ref For Testing (Optional)"}),i(e,{variant:"caption",component:"div",children:"Select a specific entityRef to send a notification to - used for testing. Will bypass checking if the campaign is actually failing for this entity."}),i(y,{value:a,onChange:l=>T(l.target.value),placeholder:"example: component:default/test-component",type:"text",variant:"outlined",margin:"dense",fullWidth:!0})]}),t(n,{marginTop:2,display:"flex",alignItems:"center",children:[i(u,{disabled:!a&&c===0||b,variant:"outlined",color:"primary",onClick:F,children:"Send"}),a&&t(e,{style:{marginLeft:6},variant:"caption",children:["Notification will be sent to ",a,"."]}),!a&&!!c&&t(e,{style:{marginLeft:6},variant:"caption",children:["Notifications will be sent for the",i("strong",{children:` ~${c} `}),c===1?"entity":"entities"," failing this campaign"]}),!a&&c===0&&i(e,{color:"error",style:{marginLeft:6},variant:"caption",children:"No entities failing campaign."})]})]})})]})};export{G as SendCampaignNotificationDialog};
2
- //# sourceMappingURL=SendCampaignNotificationDialog.esm.js.map
@@ -1,2 +0,0 @@
1
- import{jsx as i}from"react/jsx-runtime";import{parseEntityRef as m,stringifyEntityRef as s}from"@backstage/catalog-model";import{Link as f}from"@backstage/core-components";import{useRouteRef as k}from"@backstage/core-plugin-api";import{entityRouteRef as d}from"@backstage/plugin-catalog-react";const p=({entity:e,trackId:t,checkId:o,className:c})=>{const n=k(d),a=m(s(e));let r=`${n(a)}/soundcheck`;return t&&o?r+=`/tracks/${t}/checks/${o}`:t&&(r+=`/tracks/${t}`),i(f,{to:r,className:c,children:e.metadata.title||e.metadata.name})};export{p as SoundcheckEntityLink};
2
- //# sourceMappingURL=SoundcheckEntityLink.esm.js.map
@@ -1,2 +0,0 @@
1
- const a=e=>{const c={"^/soundcheck/campaigns$":"Campaigns","^/soundcheck/campaigns/create":"Create","^/soundcheck/campaigns/.*/edit":"Edit","^/soundcheck/campaigns/[^/]+$":"Campaign Insights","^/soundcheck/tracks$":"Tracks","^/soundcheck/tracks/create":"Create","^/soundcheck/tracks/.*/edit":"Edit","^/soundcheck/tracks/[^/]+$":"Track Insights","^/soundcheck/tracks/.*/checks/[^/]+$":"Check Insights","^/soundcheck/checks$":"Checks","^/soundcheck/checks/.*/edit":"Edit","^/soundcheck/checks/create":"Create","^/soundcheck/checks/templates$":"Templates","^/soundcheck/checks/[^/]+$":"Details","^/soundcheck/integrations/.*/edit":"Configure","^/soundcheck/integrations/[^/]+$":"Details","^/soundcheck/integrations$":"Integrations","^/soundcheck/tech-health$":"Tech Health","^/soundcheck/tech-health/campaigns":"Campaigns","^/soundcheck/tech-health/checks":"Checks","^/soundcheck/tech-health/tracks":"Tracks","^/soundcheck/tech-health/entities":"Entities","^/soundcheck/tech-health/teams":"Teams","^/soundcheck/tech-insights/track$":"Track","^/soundcheck/tech-insights$":"Tech Insights","^/soundcheck/quickstart":"Quick Start"};for(const[s,t]of Object.entries(c))if(new RegExp(s).test(e))return t;return null},i=e=>e.split("/").filter(c=>c).map((c,s,t)=>{const h=`/${t.slice(0,s+1).join("/")}`,n=a(h);if(n)return h===e?{title:n}:{path:h,title:n}}).filter(c=>!!c);export{i as generateBreadcrumbs};
2
- //# sourceMappingURL=headerUtil.esm.js.map
@@ -1,2 +0,0 @@
1
- import{jsx as m}from"react/jsx-runtime";import{useTheme as E,Box as d}from"@material-ui/core";import{makeStyles as g}from"@material-ui/core/styles";import{useMemo as i,useCallback as u}from"react";import{getCheckStatusColor as o}from"../../utils/colors.esm.js";import{CategoryBar as N}from"../CategoryBar/CategoryBar.esm.js";import{CheckStateCategories as t,CheckStateColors as a}from"../CheckPage/utils.esm.js";const C=g(e=>({categoryBar:{"& .MuiBox-root > div":{height:"8px"}}})),T=({status:e,className:p})=>{const c=C(),r=E(),l=i(()=>({passed:e?.passed??0,failed:e?.failed??0,warning:e?.warning??0,error:e?.error??0,exempt:e?.exempt??0,notReported:e?.notReported??0}),[e]),n=u(s=>{switch(s){case t.NOT_APPLICABLE:return"Not Applicable";case t.NOT_REPORTED:return"Not Reported";default:return s.charAt(0).toUpperCase()+s.slice(1)}},[]),R=i(()=>({passed:o(r,a.PASSED),failed:o(r,a.FAILED),warning:o(r,a.WARNING),error:o(r,a.ERROR),exempt:o(r,a.EXEMPT),notReported:o(r,a.NOT_REPORTED)}),[r]);return m(d,{className:p,style:{width:"100%"},children:m(N,{className:c.categoryBar,data:l,categories:[t.PASSED,t.FAILED,t.WARNING,t.ERROR,t.EXEMPT,t.NOT_REPORTED],categoryColors:R,showTooltip:!0,valueFormatter:s=>s.toString(),categoryFormatter:n})})};export{T as TeamStatusBar};
2
- //# sourceMappingURL=TeamStatusBar.esm.js.map
@@ -1,2 +0,0 @@
1
- import{jsxs as u,jsx as n}from"react/jsx-runtime";import{makeStyles as x,Box as c,TextField as m,InputAdornment as k,IconButton as y,Chip as C}from"@material-ui/core";import f from"@material-ui/icons/Clear";import{Autocomplete as I}from"@material-ui/lab";const T=x(l=>({input:{backgroundColor:l.palette.background.paper,minWidth:200}})),b=({searchText:l,onSearchTextChange:i,selectedTrackIds:r,onSelectedTrackIdsChange:h,trackOptions:s,applicableTracks:o,isLoading:d})=>{const p=T();return u(c,{display:"flex",maxWidth:720,alignItems:"center",style:{gap:"8px"},flex:1,children:[n(m,{placeholder:"Search tracks or campaigns...",variant:"outlined",size:"small",value:l,onChange:e=>i(e.target.value),style:{flex:1},disabled:d||o.length===0,InputProps:{className:p.input,endAdornment:l&&n(k,{position:"end",children:n(y,{size:"small",onClick:()=>i(""),edge:"end",children:n(f,{})})})}}),n(I,{multiple:!0,options:s,getOptionLabel:e=>e.name,value:s.filter(e=>r.includes(e.id)),onChange:(e,a)=>h(a.map(t=>t.id)),disabled:d||o.length===0,groupBy:e=>e.type,renderOption:e=>n(c,{display:"flex",alignItems:"center",style:{gap:8},children:n("span",{children:e.name})}),renderInput:e=>n(m,{...e,variant:"outlined",size:"small",placeholder:r.length===0?"All Tracks/Campaigns":"",className:p.input,style:{minWidth:300}}),renderTags:(e,a)=>e.length===0?null:e.map((t,g)=>n(C,{label:t.name,size:"small",...a({index:g})},t.id)),style:{minWidth:300}})]})};export{b as FilterControls};
2
- //# sourceMappingURL=FilterControls.esm.js.map
@@ -1,2 +0,0 @@
1
- import{jsxs as t,jsx as a,Fragment as d}from"react/jsx-runtime";import{makeStyles as p,Box as l,Card as c,Typography as e}from"@material-ui/core";import{Skeleton as g}from"@material-ui/lab";const s=p(i=>({summaryTilesContainer:{gap:24,display:"flex",marginBottom:32},summaryTile:{flex:1,padding:24,background:i.palette.background.paper},tile:{minHeight:90},container:{margin:"1.5rem 0 0"},box:{display:"flex",alignItems:"center",gap:"0.5rem"},avgCompliance:{fontSize:"2rem"}})),o=({title:i,content:r,isLoading:n})=>{const m=s();return t(l,{className:m.tile,children:[a(e,{children:i}),n?a(d,{children:a(g,{variant:"text",width:50,height:40})}):a(l,{children:r})]})},h=({summaryStats:i,isLoading:r=!1})=>{const n=s();return t(l,{className:n.summaryTilesContainer,children:[a(c,{className:n.summaryTile,children:a(o,{isLoading:r||i.numTeams===void 0||i.numEntities===void 0,title:"Group Information",content:t("div",{className:n.container,children:[t(l,{className:n.box,children:[a(e,{children:i.numTeams})," ",a(e,{color:"textSecondary",children:"Groups"})]}),t(l,{className:n.box,children:[a(e,{children:i.numEntities})," ",a(e,{color:"textSecondary",children:"Entities"})]})]})})}),a(c,{className:n.summaryTile,children:a(o,{isLoading:r||i.totalActiveTracksCampaigns===void 0||i.totalCampaigns===void 0||i.totalTracks===void 0,title:"Tracks & Campaigns",content:t("div",{className:n.container,children:[t(l,{className:n.box,children:[a(e,{children:i.totalActiveTracksCampaigns})," ",a(e,{color:"textSecondary",children:"Total Tracks & Campaigns"})]}),t(l,{className:n.box,children:[a(e,{children:(i.totalCampaigns??0)+(i.totalTracks??0)})," ",a(e,{color:"textSecondary",children:"Applicable Tracks & Campaigns"})]})]})})}),a(c,{className:n.summaryTile,children:a(o,{isLoading:r||i.avgCompliance===void 0||i.totalCampaigns===void 0||i.totalTracks===void 0,title:"Average Compliance",content:a("div",{className:n.container,children:a(l,{children:a(e,{className:n.avgCompliance,children:!i.totalTracks&&!i.totalCampaigns?"-":`${i.avgCompliance}%`})})})})})]})};export{h as SummaryTiles};
2
- //# sourceMappingURL=SummaryTiles.esm.js.map
@@ -1,2 +0,0 @@
1
- import{jsx as o,Fragment as ge,jsxs as Q}from"react/jsx-runtime";import{useApi as ue,useRouteRef as he}from"@backstage/core-plugin-api";import{entityPresentationApiRef as fe}from"@backstage/plugin-catalog-react";import{makeStyles as ke,Box as d,Typography as W,LinearProgress as ye}from"@material-ui/core";import{useTheme as Te}from"@material-ui/core/styles";import{useState as M,useMemo as s,useCallback as X,useEffect as Ce}from"react";import{useSearchParams as Se,useNavigate as we}from"react-router-dom";import Ee from"react-use/lib/useDebounce";import"@backstage/catalog-model";import"@tanstack/react-query";import"../../api.esm.js";import"../../hooks/graphqlKeys.esm.js";import"@spotify/backstage-plugin-soundcheck-common";import"../../hooks/useSoundcheckAlert.esm.js";import"../../hooks/useConfirmationModal.esm.js";import{useSortTableLocalStorage as Le}from"../../hooks/useSortTableLocalStorage.esm.js";import{useBatchedHierarchicalTrackStatuses as Re}from"../../hooks/heirarchy/useBatchedHierarchicalTrackStatuses.esm.js";import{useGroupHierarchy as ve}from"../../hooks/heirarchy/useGroupHierarchy.esm.js";import{useTracksApplicableToGroup as be}from"../../hooks/tracks/useTracksApplicableToGroup.esm.js";import{useLCPReporting as Pe}from"../../hooks/useLCPReporting.esm.js";import{useLoadTimeReporting as Ie}from"../../hooks/useLoadTimeReporting.esm.js";import{techInsightsTrackRouteRef as xe}from"../../routes.esm.js";import{getAllOwnedEntityCount as Ae}from"../../utils/getAllOwnedEntityCount.esm.js";import{getEntitiesBucket as Be,getTracksBucket as Me}from"../../utils/helpers.esm.js";import"../SoundcheckHeader/SoundcheckHeader.esm.js";import"../SoundcheckHeader/SoundcheckHeaderContext.esm.js";import{useSetHeaderDefault as Ne}from"../SoundcheckHeader/useHeader.esm.js";import{TechInsightsGroupSelector as je}from"../TechInsightsGroupSelector/TechInsightsGroupSelector.esm.js";import{FilterControls as Ge}from"./FilterControls.esm.js";import{SummaryTiles as De}from"./SummaryTiles.esm.js";import{TechInsightsTableView as Fe}from"./TechInsightsTableView.esm.js";const Oe=ke(a=>({container:{padding:a.spacing(3,2),paddingTop:0,position:"relative"},gridContainer:{marginTop:a.spacing(3)},gridItem:{cursor:"pointer","&:hover":{transform:"scale(1.02)",transition:"transform 0.2s ease-in-out"}},emptyState:{textAlign:"center",padding:a.spacing(4)},errorState:{textAlign:"center",padding:a.spacing(4)},headerControls:{display:"flex",alignItems:"center"},progressIndicator:{position:"absolute",top:0,left:0,right:0,zIndex:a.zIndex.speedDial},tableRow:{"&:hover":{backgroundColor:a.palette.action.hover}}})),ze=()=>{const[a,L]=Se(),r=a.get("group")||"",[g,Y]=M(a.get("search")||""),[S,Z]=M(""),[c,_]=M(a.get("tracks")?.split(",").filter(Boolean)||[]),N=s(()=>({routeName:"soundcheck-tech-insights",additionalAttributes:{group:r||"",tracksFilter:c.join(",")||"",tracksFilterCount:c.length,tracksSearch:S||""}}),[r,S,c]),{reportContentLoaded:j}=Ie({...N,enabled:!!r}),{reporter:q}=Pe(N),u=Oe(),J=Te(),G=we();Ne();const D=ue(fe),{order:K,orderBy:ee,handleSort:te}=Le({localStoragePrefix:"soundcheck-tech-insights",defaultSortBy:"entities",defaultDirection:"desc"});Ee(()=>{Z(g);const e=new URLSearchParams(a.toString());g?e.set("search",g):e.delete("search"),L(e,{replace:!0})},500,[g]);const re=X(e=>{_(e);const t=new URLSearchParams(a.toString());e.length>0?t.set("tracks",e.join(",")):t.delete("tracks"),L(t,{replace:!0})},[a,L]),{tracks:w,counts:R,isLoading:m,error:v,activeTrackCount:F}=be(r,{},{enabled:!!r}),h=w.filter(e=>e.type==="campaign"),f=w.filter(e=>e.type!=="campaign"),ae=s(()=>[...h,...f].map(e=>({id:e.id,name:e.name,type:e.type==="campaign"?"Campaign":"Track"})),[h,f]),k=h.filter(e=>{const t=S.toLowerCase(),l=(e.ownerEntityRef?D.forEntity(e.ownerEntityRef):void 0)?.snapshot.primaryTitle?.toLowerCase()||"",C=t===""||e.name.toLowerCase().includes(t)||e.ownerEntityRef?.toLowerCase().includes(t)||l.includes(t),i=c.length===0||c.includes(e.id);return C&&i}),y=f.filter(e=>{const t=S.toLowerCase(),l=(e.ownerEntityRef?D.forEntity(e.ownerEntityRef):void 0)?.snapshot.primaryTitle?.toLowerCase()||"",C=t===""||e.name.toLowerCase().includes(t)||e.ownerEntityRef?.toLowerCase().includes(t)||l.includes(t),i=c.length===0||c.includes(e.id);return C&&i}),p=s(()=>[...h.map(e=>e.id),...f.map(e=>e.id)],[h,f]),{data:b,isLoading:oe,error:ne,progress:n}=Re({trackIds:p,groupRef:r||"",skip:!r||p.length===0}),{data:O,isLoading:E}=ve(r,{includeParent:!0}),P=s(()=>{const e=new Map;return Array.isArray(b)&&b.forEach(t=>{t&&t.trackId&&e.set(t.trackId,t)}),e},[b]),ie=s(()=>{const e=new Map;return Array.isArray(R)&&R.forEach(t=>{t&&t.id&&e.set(t.id,t.applicableEntityCount)}),e},[R]),se=m&&!v&&!!r,z=v||ne,I=p.length>0&&oe&&!z&&!!r,H=s(()=>({totalCampaigns:k.length,totalTracks:y.length,totalActiveTracksCampaigns:F}),[F,k.length,y.length]),U=s(()=>{if(I)return{numTeams:void 0,avgCompliance:void 0};let e=0,t=0;const l=new Set;return[...k,...y].forEach(C=>{const i=P.get(C.id);if(i){i.status&&typeof i.status.allPassPercentage=="number"&&(e+=i.status.allPassPercentage,t++),i.groupRef&&l.add(i.groupRef);const A=[i];for(;A.length>0;){const de=A.pop();for(const B of de.children)l.has(B.groupRef)||(l.add(B.groupRef),A.push(B))}}}),{numTeams:l.size,avgCompliance:t>0?Math.round(e/t):0}},[k,y,P,I]),T=s(()=>{if(E)return{numEntities:void 0};const e=O?.[r];return{numEntities:Ae(e)}},[O,E,r]),ce=s(()=>({...H,...U,...T}),[H,U,T]),$=he(xe),le=X(e=>{if(!r)return;const t=new URLSearchParams;t.set("group",r),t.set("track",e),t.set("node",r),G(`${$()}?${t.toString()}`)},[r,G,$]),x=s(()=>!n||n.totalTracks===0?0:n.loadedTracks/n.totalTracks*100,[n]),pe=m&&r&&!v||I&&n&&n.totalTracks>0,V=q?.getLCPValue();Ce(()=>{if(!E&&!m&&(x===100||p.length===0)){const e=T.numEntities??0,t=p.length;j({lcp:V,numberOfEntities:T.numEntities,entitiesBucket:Be(e),numberOfTracks:p.length,tracksBucket:Me(t)})}},[E,m,x,p.length,T.numEntities,j,V]);const me=o(De,{summaryStats:ce,isLoading:m});return z?o(d,{className:u.container,children:o(W,{variant:"h4",className:u.errorState,children:"Error loading tech insights data"})}):o(ge,{children:Q(d,{className:u.container,children:[Q(d,{display:"flex",justifyContent:"space-between",alignItems:"center",gridGap:12,marginBottom:3,children:[o(je,{}),o(Ge,{searchText:g,onSearchTextChange:Y,selectedTrackIds:c,onSelectedTrackIdsChange:re,trackOptions:ae,applicableTracks:w,isLoading:se})]}),o(d,{style:{marginTop:0},children:me}),pe&&o(d,{style:{marginBottom:16},children:o(ye,{variant:n&&n.totalTracks>0?"determinate":"indeterminate",value:n&&n.totalTracks>0?x:void 0,"data-testid":"batch-loading-indicator"})}),w.length===0&&!m?o(d,{className:u.emptyState,children:o(W,{variant:"h6",children:r?"No applicable tracks found for the selected group":"Please select a group to view applicable tracks"})}):o(Fe,{tracks:[...k,...y],trackStatusMap:P,trackCountsMap:ie,orderBy:ee,order:K,handleSort:te,handleTrackClick:le,theme:J,classes:u})]})})};export{ze as TechInsightsPageDeprecated};
2
- //# sourceMappingURL=TechInsightsPageDeprecated.esm.js.map
@@ -1,2 +0,0 @@
1
- import{jsx as e,Fragment as N,jsxs as f}from"react/jsx-runtime";import{useApi as $}from"@backstage/core-plugin-api";import{entityPresentationApiRef as E}from"@backstage/plugin-catalog-react";import{TableContainer as H,Paper as L,Table as z,TableHead as A,TableRow as T,TableCell as c,TableSortLabel as y,TableBody as B,Typography as b,Box as w}from"@material-ui/core";import D from"@material-ui/icons/ArrowDownward";import F from"@material-ui/icons/ArrowUpward";import{useMemo as M}from"react";import{getColorInterpolator as j,getCheckStatusColor as x}from"../../utils/colors.esm.js";import{getTrackStatusTotal as V}from"../../utils/tracks.esm.js";import{CategoryBar as J}from"../CategoryBar/CategoryBar.esm.js";import{CheckStateColors as I}from"../CheckPage/utils.esm.js";import{ColorChip as O}from"../ColorChip/ColorChip.esm.js";const U=({tracks:v,trackStatusMap:m,trackCountsMap:u,orderBy:o,order:d,handleSort:h,handleTrackClick:P,theme:g,classes:n})=>{const S=$(E),R=M(()=>[...v].filter(l=>{const t=m.get(l.id)?.status;let s=0;return t&&(s=V(t)),!t||s>0}).sort((l,t)=>{const s=m.get(l.id),k=m.get(t.id);let a,r;switch(o){case"name":a=l.name?.toLowerCase()||"",r=t.name?.toLowerCase()||"";break;case"type":a=l.type||"",r=t.type||"";break;case"owner":a=l.ownerEntityRef?.toLowerCase()||"",r=t.ownerEntityRef?.toLowerCase()||"";break;case"compliance":a=s?.status?.allPassPercentage??null,r=k?.status?.allPassPercentage??null;break;case"checks":a=l.levels.reduce((i,C)=>i+C.checks.length,0),r=t.levels.reduce((i,C)=>i+C.checks.length,0);break;case"entities":a=u.get(l.id)??0,r=u.get(t.id)??0;break;default:return 0}return typeof a=="number"&&typeof r=="number"?d==="asc"?a-r:r-a:typeof a=="number"&&r===null?-1:a===null&&typeof r=="number"?1:typeof a=="string"&&typeof r=="string"?d==="asc"?a.localeCompare(r):r.localeCompare(a):0}),[d,o,m,u,v]),p=l=>l.direction==="asc"?e(F,{...l,fontSize:"small"}):e(D,{...l,fontSize:"small"});return e(N,{children:e(H,{component:L,children:f(z,{className:n.table,size:"small",children:[e(A,{children:f(T,{children:[e(c,{width:"30%",className:`${n.tableHeaderCell} ${n.headerCell}`,children:e(y,{active:o==="name",direction:o==="name"?d:"desc",onClick:()=>h("name"),IconComponent:p,children:e("div",{className:n.headerContent,children:"Name"})})}),e(c,{width:"10%",className:`${n.tableHeaderCell} ${n.headerCell}`,children:e(y,{active:o==="checks",direction:o==="checks"?d:"desc",onClick:()=>h("checks"),IconComponent:p,children:e("div",{className:n.headerContent,children:"Checks"})})}),e(c,{width:"10%",className:`${n.tableHeaderCell} ${n.headerCell}`,children:e(y,{active:o==="entities",direction:o==="entities"?d:"desc",onClick:()=>h("entities"),IconComponent:p,children:e("div",{className:n.headerContent,children:"Entities"})})}),e(c,{width:"30%",className:`${n.tableHeaderCell} ${n.headerCell}`,children:e(y,{active:o==="compliance",direction:o==="compliance"?d:"desc",onClick:()=>h("compliance"),IconComponent:p,children:e("div",{className:n.headerContent,children:"Compliance"})})}),e(c,{width:"20%",className:`${n.tableHeaderCell} ${n.headerCell}`,children:e(y,{active:o==="owner",direction:o==="owner"?d:"desc",onClick:()=>h("owner"),IconComponent:p,children:e("div",{className:n.headerContent,children:"Track Owner"})})})]})}),e(B,{children:R.map(l=>{const t=m.get(l.id)?.status;let s=0;if(t?.allPassPercentage!==null&&t?.allPassPercentage!==void 0)s=t.allPassPercentage;else if(t){const i=(t.passed??0)+(t.failed??0)+(t.warning??0)+(t.error??0)+(t.notReported??0)+(t.exempt??0);s=i>0?((t.passed??0)+(t.exempt??0))/i*100:0}const k=l.levels.reduce((i,C)=>i+C.checks.length,0),a=u.get(l.id)??0,r=Math.round(s);return f(T,{onClick:()=>P(l.id),className:n.tableRow,style:{cursor:"pointer"},children:[e(c,{className:n.tableCell,children:e(b,{variant:"body2",style:{fontWeight:500},children:l.name})}),e(c,{className:n.tableCell,children:e(b,{variant:"body2",children:k})}),e(c,{className:n.tableCell,children:e(b,{variant:"body2",children:new Intl.NumberFormat("en-US",{notation:"compact",maximumFractionDigits:1}).format(a)})}),e(c,{className:n.tableCell,children:f("div",{style:{display:"flex",alignItems:"center",gap:8},children:[t&&e(O,{value:`${r}%`,getColor:j(g,"default"),numericValue:s/100}),e(w,{flex:1}),e("div",{style:{width:"100%"},children:e(J,{data:{compliant:r,nonCompliant:100-r},categories:["compliant","nonCompliant"],categoryColors:{compliant:x(g,I.PASSED),nonCompliant:x(g,I.FAILED)},showTooltip:!1})})]})}),e(c,{className:n.tableCell,style:{verticalAlign:"middle"},children:l.ownerEntityRef&&e(w,{display:"flex",alignItems:"center",children:(()=>{const i=S.forEntity(l.ownerEntityRef);return f(N,{children:[i.snapshot.Icon&&e(w,{marginRight:1,display:"flex",alignItems:"center",height:"20px",children:e(i.snapshot.Icon,{fontSize:"small"})}),e(b,{variant:"body2",style:{lineHeight:"20px"},children:i.snapshot.primaryTitle||l.ownerEntityRef})]})})()})})]},l.id)})})]})})})};export{U as TechInsightsTableView};
2
- //# sourceMappingURL=TechInsightsTableView.esm.js.map
@@ -1,2 +0,0 @@
1
- import{jsxs as d,jsx as e}from"react/jsx-runtime";import{Grid as n,Button as f,Menu as M,Box as x,TextField as D}from"@material-ui/core";import{makeStyles as O}from"@material-ui/core/styles";import{useState as h}from"react";import{useSearchParams as B}from"react-router-dom";import"../TechHealth/Filters/types.esm.js";import"../TechHealth/Filters/FacetFilter.esm.js";import"../TechHealth/Filters/FilterProvider.esm.js";import"../TechHealth/Filters/Filters.esm.js";import"../TechHealth/Filters/FiltersHeader.esm.js";import"../TechHealth/Filters/FiltersSection.esm.js";import"@backstage/catalog-model";import"lodash";import"../../contexts/TrackFormContext.esm.js";import"../../contexts/CheckFormContext.esm.js";import"../../contexts/CampaignFormContext.esm.js";import"../../contexts/UserProvider.esm.js";import"@backstage/core-plugin-api";import"@tanstack/react-query";import"../../api.esm.js";import"../../hooks/graphqlKeys.esm.js";import"@backstage/plugin-catalog-react";import"@spotify/backstage-plugin-soundcheck-common";import"../../hooks/useSoundcheckAlert.esm.js";import"../../hooks/useConfirmationModal.esm.js";import"react-use/lib/useLocalStorage";import{MIN_NUMBER_OF_DAYS as m,MAX_NUMBER_OF_DAYS as E}from"../TechHealth/Filters/utils.esm.js";const S=[{label:"7D",value:7},{label:"1M",value:30},{label:"2M",value:60},{label:"3M",value:90}],w=O(o=>({root:{width:"100%",paddingLeft:"60px",paddingBottom:o.spacing(1)},buttons:{paddingTop:"0 !important",paddingBottom:"0 !important"},customNumberOfDaysMenu:{width:"180px",padding:o.spacing(0,1)}})),C=({maxNumberOfDays:o=E})=>{const i=w(),[g,b]=B(),[l,p]=h(null),[a,s]=h(""),v=t=>{p(t.currentTarget)},y=()=>{p(null)},u=t=>{let r;if(typeof t=="string"){if(!t.length)return!0;r=parseInt(t,10)}else r=t;return!isNaN(r)&&r>=m&&r<=o},c=t=>{u(t)&&b(r=>(g.set("numberOfDays",t.toString()),r))},N=t=>{if(t.key==="Enter"){const r=parseInt(a,10);c(r),s("")}};return d(n,{container:!0,spacing:1,direction:"row",wrap:"nowrap",className:i.root,children:[S.filter(({value:t})=>t<=o).map(t=>e(n,{item:!0,className:i.buttons,children:e(f,{size:"small",onClick:()=>c(t.value),children:t.label})},t.value)),d(n,{item:!0,className:i.buttons,children:[e(f,{size:"small","aria-controls":"days-menu","aria-haspopup":"true",onClick:v,children:"Custom"}),e(M,{id:"days-menu",anchorEl:l,getContentAnchorEl:null,anchorOrigin:{vertical:"bottom",horizontal:"left"},transformOrigin:{vertical:"top",horizontal:"left"},keepMounted:!0,open:!!l,onClose:y,children:e(x,{className:i.customNumberOfDaysMenu,children:e(D,{fullWidth:!0,variant:"outlined",size:"small",placeholder:"Number of days",helperText:`Enter value from ${m} to ${o}`,inputProps:{min:m,max:o},onKeyDown:N,value:a,type:"number",onChange:t=>s(t.target.value),error:!u(a)})})})]})]})};export{C as TimePeriodBar};
2
- //# sourceMappingURL=TimePeriodBar.esm.js.map
@@ -1,2 +0,0 @@
1
- import{jsx as e,jsxs as d}from"react/jsx-runtime";import{Link as x}from"@backstage/core-components";import{useRouteRef as v}from"@backstage/core-plugin-api";import{useTheme as N,TableContainer as T,Table as y,TableBody as w,TableRow as s,TableCell as r,Typography as h,Box as R}from"@material-ui/core";import{makeStyles as L}from"@material-ui/core/styles";import{Skeleton as m}from"@material-ui/lab";import{useMemo as $}from"react";import{trackCheckDetailsRouteRef as A}from"../../routes.esm.js";import{getCheckStatusColor as D}from"../../utils/colors.esm.js";import{LevelRow as F}from"../LevelsTable/LevelsTable.esm.js";const S=L(t=>({root:{width:"100%",height:"100%",display:"flex",flexDirection:"column"},checkNameLink:{color:"inherit",textDecoration:"none"},bar:{height:8,display:"block"},barContainer:{width:"100%",display:"block"},cell:{padding:t.spacing(1),width:"auto"},barCell:{width:150,padding:"4px 8px"},rightAlignedCell:{textAlign:"right",paddingRight:`${t.spacing(2)}px !important`},failingText:{color:t.palette.text.secondary,display:"flex",flexDirection:"column",alignItems:"flex-end",lineHeight:1.2,minWidth:"40px"},noFailingChecksText:{padding:t.spacing(2,1)}})),z=({track:t,checkStatuses:c,certificationStatus:o,hideLevel:p})=>{const i=S(),f=N(),g=v(A),k=$(()=>(t.levels??[]).map(n=>({...n,failingChecks:n.checks.map(l=>{const a=c?.find(b=>b.id===l.id),C=a?a.numberOfEntities-a.notApplicable-a.exempt:0,u=a?.failed??0;return{check:l,failedCount:u,applicableCount:C}}).filter(({failedCount:l})=>l>0).sort((l,a)=>(a.failedCount??0)-(l.failedCount??0))})),[t.levels,c]);return t.levels?.length?e(T,{component:"div",className:i.root,children:e(y,{children:e(w,{children:c===void 0||o===void 0?Array.from({length:10}).map((n,l)=>d(s,{children:[e(r,{className:i.barCell,children:e(m,{variant:"rect",width:30,height:8})}),e(r,{size:"medium",className:i.cell,children:e(m,{variant:"rect",width:140,height:8})}),e(r,{size:"small",className:i.cell,children:e(m,{variant:"rect",width:100,height:8})})]},`skeleton-${l}`)):k.map(n=>d(F,{level:n,hideLevel:p,children:[n.failingChecks.map(({check:l,failedCount:a})=>d(s,{children:[e(r,{className:i.barCell,children:e("div",{className:i.barContainer,children:e("span",{className:i.bar,style:{width:`${(a??0)/o.numberOfEntities*100}%`,backgroundColor:D(f,"failed")}})})}),e(r,{size:"medium",className:i.cell,children:e(x,{className:i.checkNameLink,to:g({trackId:t.id,checkId:l.id}),children:e(h,{children:l.name})})}),e(r,{size:"small",className:`${i.cell} ${i.rightAlignedCell}`,children:e(R,{className:i.failingText,children:e(h,{variant:"caption",children:`${new Intl.NumberFormat().format(a??0)} failing`})})})]},l.id)),c&&o&&n.failingChecks.length===0&&e(s,{children:e(r,{children:e(h,{variant:"body2",className:i.noFailingChecksText,children:"No Failing Checks"})})})]},n.ordinal))})})}):null};export{z as TopFailingChecksTable};
2
- //# sourceMappingURL=TopFailingChecksTable.esm.js.map
@@ -1,2 +0,0 @@
1
- import{jsx as C}from"react/jsx-runtime";import{stringifyEntityRef as L}from"@backstage/catalog-model";import{Table as P}from"@backstage/core-components";import{makeStyles as x}from"@material-ui/core";import O from"lodash";import{useState as D,useEffect as F,useCallback as k}from"react";import{TrackEntityField as a,Direction as w}from"../../../graphql/generated/index.esm.js";import{useEntitiesByRefs as N}from"../../../hooks/catalog/useEntitiesByRefs.esm.js";import{useTrackEntities as j}from"../../../hooks/entities/useTrackEntities.esm.js";import{columnFactories as r}from"./columns.esm.js";import{toTrackEntityRow as q}from"./utils.esm.js";const A=10,G=(i,n)=>[r.createBadgeColumn(),r.createNameColumn({trackId:n}),r.createStatusColumn(i),r.createSystemColumn(),r.createOwnerColumn(),r.createSpecTypeColumn(),r.createSpecLifecycleColumn()],U=[a.CertificationLevel,a.Name,a.CheckPassRate,a.System,a.Owner,a.Type,a.Lifecycle],I=i=>{const{lifecycles:n,owners:s,types:c,systems:l}=i,g=n?.length?{"spec.lifecycle":n}:void 0,d=s?.length?{"relations.ownedBy":s}:void 0,m=c?.length?{"spec.type":c}:void 0,u=l?.length?{"relations.partOf":l}:void 0;return{...g,...d,...m,...u}},W=x({tableContainer:{display:"flex",flexDirection:"column",height:"100%"}}),H=({track:i,initialPageSize:n,lifecycles:s,owners:c,types:l,systems:g,certificationStatus:d,getColor:m})=>{const u=W(),S=G(m,i.id),[e,y]=D({orderBy:void 0,filter:I({lifecycles:s,owners:c,types:l,systems:g}),pageInfo:{page:0,pageSize:n??A,direction:"forward",cursor:null}});F(()=>{y(t=>({...t,pageInfo:{...t.pageInfo,page:0,cursor:null},filter:I({lifecycles:s,owners:c,types:l,systems:g}),certificationStatus:d}))},[s,c,l,g,d]);const{data:f,isLoading:h}=j({trackId:i.id,orderBy:e.orderBy,filter:e.filter,[e.pageInfo.direction==="forward"?"first":"last"]:e.pageInfo.pageSize,[e.pageInfo.direction==="forward"?"after":"before"]:e.pageInfo.cursor,certificationStatus:d}),E=k((t,p)=>{let o;t===-1?o=void 0:o={field:U[t],direction:p==="asc"?w.Asc:w.Desc},y({...e,orderBy:o,pageInfo:{...e.pageInfo,page:0,cursor:null}})},[e]),b=k((t,p)=>{const o=t>e.pageInfo.page?"forward":"backward",z=o==="forward"?f?.trackEntities.pageInfo.endCursor??null:f?.trackEntities.pageInfo.startCursor??null;y({...e,pageInfo:{page:t,pageSize:p,direction:o,cursor:z}})},[f,e]),T=f?.trackEntities.edges.map(t=>t.node.entityRef)??[],{data:v,isLoading:B}=N({entityRefs:T}),R=O.compact(f?.trackEntities.edges.map(t=>{const p=v?.items.find(o=>!!o&&L(o)===t.node.entityRef);return p?q({trackDetails:t.node,track:i,entity:p}):void 0}))??[];return C("div",{className:u.tableContainer,children:C(P,{columns:S,data:R,options:{paging:!0,showFirstLastPageButtons:!1,paginationPosition:"both",emptyRowsWhenPaging:!1,pageSizeOptions:[10,25,50],pageSize:e.pageInfo.pageSize,search:!1,showTitle:!1,padding:"dense",draggable:!1},onOrderChange:E,onPageChange:b,page:e.pageInfo.page,totalCount:f?.trackEntities.totalCount??0,isLoading:h||B,components:{Toolbar:()=>null}})})};export{H as TrackEntitiesTable};
2
- //# sourceMappingURL=TrackEntitiesTable.esm.js.map
@@ -1,2 +0,0 @@
1
- import{jsx as l,jsxs as f}from"react/jsx-runtime";import{makeStyles as R,lighten as T,darken as $,Typography as i}from"@material-ui/core";import{useTheme as B}from"@material-ui/core/styles";import{useState as N,useRef as A}from"react";import{ColorChip as j}from"../../ColorChip/ColorChip.esm.js";import w from"../../RichTooltip/RichTooltip.esm.js";import{getProgressColor as r}from"../utils.esm.js";import{getApplicableCheckCount as m}from"./utils.esm.js";const C=t=>{const e=m(t);return e===0?-1:Math.round(t.passed/e*100)},z=(t,e)=>t.levels.find(o=>o.ordinal===e),M=R(t=>({cell:{backgroundColor:({passRate:e,getColor:o})=>o?o(e):r(t,e),color:({passRate:e,getColor:o})=>t.palette.getContrastText(o?o(e):r(t,e)),cursor:"default",borderRadius:"4px",textAlign:"center",fontSize:".9rem",width:"50px"},tooltip:{width:"225px"},topLevelStatus:{borderBottom:`1px solid ${t.palette.divider}`,paddingBottom:t.spacing(1)},levelStatus:{borderBottom:`1px solid ${t.palette.divider}`,paddingTop:t.spacing(1),paddingBottom:t.spacing(1)},bottomLevelStatus:{paddingTop:t.spacing(1)},levelPassRate:{backgroundColor:({passRate:e,getColor:o})=>T(o?o(e):r(t,e),.75),color:({passRate:e,getColor:o})=>$(o?o(e):r(t,e),.7),borderRadius:"4px",textAlign:"center",fontSize:".7rem",width:"32px",height:"15px"}})),P=({track:t,status:e,getColor:o})=>{const x=B(),u=C(e),s=M({passRate:u,getColor:o}),[y,p]=N(!1),g=A(null),b=()=>{g.current=setTimeout(()=>p(!0),500)},S=()=>{clearTimeout(g.current),p(!1)},k=m(e);return l(w,{content:l("div",{className:s.tooltip,children:e.statusByLevel?.map((a,d)=>{let n;d===0?n=s.topLevelStatus:e.statusByLevel?.length&&d===e.statusByLevel.length-1?n=s.bottomLevelStatus:n=s.levelStatus;const c=m(a),L=z(t,a.ordinal),h=C(a);return f("div",{className:n,style:{display:"flex",flexDirection:"column",justifyContent:"space-between"},children:[l("div",{children:l(i,{variant:"caption",style:{fontWeight:"bold"},children:L?.name??`Level ${a.ordinal}`})}),f("div",{style:{display:"flex",justifyContent:"space-between"},children:[l(i,{variant:"caption",children:c===0?"No Applicable Checks":`Passing ${a.passed} of ${c} checks`}),c===0?l(i,{className:s.levelPassRate,children:"N/A"}):l(j,{value:`${h}%`,getColor:v=>o?o(v):r(x,v),numericValue:h,size:"small"})]})]},d)})}),open:y,placement:"bottom",onClose:()=>p(!1),children:l("div",{style:{display:"flex",justifyContent:"center",alignItems:"center"},onMouseEnter:b,onMouseLeave:S,children:l(i,{className:s.cell,children:k===0?"N/A":`${u}%`})})})};export{P as TrackStatusChip};
2
- //# sourceMappingURL=TrackStatusChip.esm.js.map
@@ -1,2 +0,0 @@
1
- import{jsx as r,Fragment as l}from"react/jsx-runtime";import{OverflowTooltip as m}from"@backstage/core-components";import{EntityRefLink as c,EntityRefLinks as s}from"@backstage/plugin-catalog-react";import{makeStyles as u,withStyles as p,Chip as d}from"@material-ui/core";import f from"@material-ui/icons/RemoveCircleOutline";import{LevelBadge as y}from"../../Badges/LevelBadge.esm.js";import{NoLevelBadge as g}from"../../Badges/NoLevelBadge.esm.js";import{CampaignBadge as h}from"../../Badges/CampaignBadge.esm.js";import{SoundcheckEntityLink as S}from"../../SoundcheckEntityLink/SoundcheckEntityLink.esm.js";import{TrackStatusChip as C}from"./TrackStatusChip.esm.js";import{getApplicableCheckCount as k}from"./utils.esm.js";const o=u(()=>({linkHover:{"& span":{"&:hover":{textDecoration:"underline"}}}})),v=p(t=>({root:{color:t.palette.text.disabled}}))(f),b=Object.freeze({createBadgeColumn(){return{title:"",field:"badge",render:t=>k(t.status)===0?r(v,{}):t.track.type==="campaign"?r(h,{}):t.badge?r(y,{badge:t.badge}):r(g,{}),width:"auto",align:"center",sorting:!1}},createStatusColumn(t){return{title:"Checks",field:"status",render:e=>e.status&&r(C,{track:e.track,status:e.status,getColor:t}),width:"auto",align:"center",sorting:!1}},createNameColumn(t){return{title:"Name",field:"resolved.entityRef",highlight:!0,customSort(e,a){return 0},render:({entity:e})=>{const a=o();return t?.trackId?r(S,{entity:e,trackId:t.trackId,className:a.linkHover}):r(c,{entityRef:e,defaultKind:t?.defaultKind||"Component",className:a.linkHover})}}},createSystemColumn(){return{title:"System",field:"resolved.partOfSystemRelationTitle",customSort(t,e){return 0},render:({resolved:t})=>{const e=o();return r(s,{entityRefs:t.partOfSystemRelations,defaultKind:"system",className:e.linkHover})}}},createOwnerColumn(){return{title:"Owner",field:"resolved.ownedByRelationsTitle",customSort(t,e){return 0},render:({resolved:t})=>{const e=o();return r(s,{entityRefs:t.ownedByRelations,defaultKind:"group",className:e.linkHover})}}},createSpecTypeColumn(){return{title:"Type",field:"entity.spec.type",customSort(t,e){return 0}}},createSpecLifecycleColumn(){return{title:"Lifecycle",field:"entity.spec.lifecycle",customSort(t,e){return 0},width:"auto"}},createMetadataDescriptionColumn(){return{title:"Description",field:"entity.metadata.description",customSort(t,e){return 0},render:({entity:t})=>r(m,{text:t.metadata.description,placement:"bottom-start"}),width:"auto"}},createTagsColumn(){return{title:"Tags",field:"entity.metadata.tags",cellStyle:{padding:"0px 16px 0px 20px"},render:({entity:t})=>r(l,{children:t.metadata.tags&&t.metadata.tags.map(e=>r(d,{label:e,size:"small",variant:"outlined",style:{marginBottom:"0px"}},e))}),width:"auto",sorting:!1}},createTitleColumn(t){return{title:"Title",field:"entity.metadata.title",customSort(e,a){return 0},hidden:t?.hidden,searchable:!0}},createLabelColumn(t,e){return{title:e?.title||"Label",field:"entity.metadata.labels",customSort(a,n){return 0},cellStyle:{padding:"0px 16px 0px 20px"},render:({entity:a})=>{const n=a.metadata?.labels,i=n&&n[t]||e?.defaultValue;return r(l,{children:i&&r(d,{label:i,size:"small",variant:"outlined"},i)})},width:"auto",sorting:!1}},createNamespaceColumn(){return{title:"Namespace",field:"entity.metadata.namespace",customSort(t,e){return 0},width:"auto"}}});export{b as columnFactories};
2
- //# sourceMappingURL=columns.esm.js.map
@@ -1,2 +0,0 @@
1
- import{jsx as r,jsxs as l}from"react/jsx-runtime";import{useApi as v,configApiRef as g}from"@backstage/core-plugin-api";import{useTheme as x,Typography as b}from"@material-ui/core";import L from"lodash";import{DateTime as A}from"luxon";import{ResponsiveContainer as C,AreaChart as $,CartesianGrid as O,XAxis as N,YAxis as h,Tooltip as D,Area as u}from"recharts";import{compactNumberFormatter as m}from"../../utils/formatters.esm.js";import{getChartColors as I,formatDate as T}from"../Charts/chartUtils.esm.js";import{LoadingChart as W}from"../Charts/LoadingChart.esm.js";import{TimePeriodBar as E}from"../TimePeriodBar/TimePeriodBar.esm.js";const y=o=>{const a=o?.certificationStatusHistory.history??[],n=o?.certificationStatusHistory.numberOfEntities??0,e=A.utc();return L.map(a,(d,p)=>{let i={name:T(e,a.length-p-1)},t=0,f=0;d.statusByLevel.sort((s,c)=>c.ordinal-s.ordinal).forEach(s=>{const c=s.cumulativelyPassed-f;i={...i,[`Level ${s.ordinal}`]:c},t+=c,f=s.cumulativelyPassed}),d.statusByLevel.reverse();const k=Math.max(0,n-t);return i={...i,"No Level":k},i})},H=(o,a)=>{if(typeof o=="number"){const n=a.certificationStatusHistory.numberOfEntities??0,e=n>0?Math.round(o/n*100):0;return`${m(o)} of ${m(n)} (${e}%)`}return o},S=({track:o,data:a,isError:n})=>{const e=x(),d=v(g).getOptionalNumber("soundcheck.certifications.history.retentionTimeInDays");if(n)return r(b,{color:"error",children:"Failed to load track data."});if(!o||!a)return r(W,{type:"area",numLines:3});const p=y(a),i=I(e);return l("div",{style:{height:290,width:"100%",position:"relative",borderRadius:"4px"},children:[r(E,{maxNumberOfDays:d}),r(C,{height:250,debounce:1,children:l($,{data:p,margin:{top:0,right:0,bottom:0,left:0},children:[l("defs",{children:[o?.levels.map(t=>l("linearGradient",{id:`gradient-${t.ordinal}`,x1:"0",y1:"0",x2:"0",y2:"1",children:[r("stop",{offset:"5%",stopColor:i[t.ordinal%i.length],stopOpacity:.4}),r("stop",{offset:"95%",stopColor:i[t.ordinal%i.length],stopOpacity:0})]},`gradient-${t.ordinal}`)),l("linearGradient",{id:"gradient-no-level",x1:"0",y1:"0",x2:"0",y2:"1",children:[r("stop",{offset:"5%",stopColor:e.palette.action.disabled,stopOpacity:.4}),r("stop",{offset:"95%",stopColor:e.palette.action.disabled,stopOpacity:0})]})]}),r(O,{stroke:e.palette.divider,strokeWidth:1,horizontal:!0,vertical:!1}),r(N,{dataKey:"name",tickLine:!1,axisLine:!1}),r(h,{yAxisId:"left",domain:[0,100],axisLine:!1,tickLine:!1,tickFormatter:t=>`${t}%`,ticks:[0,25,50,75,100]}),r(h,{yAxisId:"right",orientation:"right",domain:[0,Math.max(a?.certificationStatusHistory.numberOfEntities,1)],axisLine:!1,tickLine:!1,tickFormatter:t=>m(t)}),r(D,{contentStyle:{backgroundColor:e.palette.background.paper,color:e.palette.text.primary,border:`1px solid ${e.palette.divider}`},cursor:{stroke:e.palette.divider,strokeWidth:1},formatter:t=>H(t,a)}),o?.levels?.map(t=>r(u,{type:"monotone",dataKey:`Level ${t.ordinal}`,name:t.name??`Level ${t.ordinal}`,stackId:"1",yAxisId:"right",stroke:i[t.ordinal%i.length],strokeWidth:2,fill:`url(#gradient-${t.ordinal})`,isAnimationActive:!1,activeDot:{fill:i[t.ordinal%i.length],stroke:e.palette.background.paper,strokeWidth:1,r:5}},`Level ${t.ordinal}`)),r(u,{type:"monotone",dataKey:"No Level",name:"No Level",stackId:"1",yAxisId:"right",stroke:e.palette.action.disabled,strokeWidth:2,fill:"url(#gradient-no-level)",isAnimationActive:!1,activeDot:{fill:e.palette.action.disabled,stroke:e.palette.background.paper,strokeWidth:1,r:5}},"No Level")]})})]})};export{S as TrackHistoryChart,y as formatLineChartData};
2
- //# sourceMappingURL=TrackHistoryChart.esm.js.map
@@ -1,2 +0,0 @@
1
- import{jsx as t,jsxs as d,Fragment as ie}from"react/jsx-runtime";import{useRouteRef as re}from"@backstage/core-plugin-api";import{EntityRefLink as oe}from"@backstage/plugin-catalog-react";import{usePermission as R}from"@backstage/plugin-permission-react";import{makeStyles as ae,Button as se,Box as ne,Tabs as ce,Tab as b}from"@material-ui/core";import{soundcheckTrackReadPermission as le,soundcheckTrackUpdatePermission as me,toEntityFilterQuery as pe}from"@spotify/backstage-plugin-soundcheck-common";import{useMemo as s,useState as de,useCallback as ge,useEffect as fe}from"react";import{useSearchParams as ue,useParams as he,useNavigate as ke}from"react-router-dom";import"@backstage/catalog-model";import"@tanstack/react-query";import"../../api.esm.js";import"../../hooks/graphqlKeys.esm.js";import"../../hooks/useSoundcheckAlert.esm.js";import{useTrack as ye}from"../../hooks/tracks/useTrack.esm.js";import"../../hooks/useConfirmationModal.esm.js";import{useCertificationStatus as Ce}from"../../hooks/aggregations/useCertificationStatus.esm.js";import{useCertificationStatusHistory as be}from"../../hooks/aggregations/useCertificationStatusHistory.esm.js";import"react-use/lib/useLocalStorage";import{useCheckStatuses as ve}from"../../hooks/aggregations/useCheckStatuses.esm.js";import{useLCPReporting as Se}from"../../hooks/useLCPReporting.esm.js";import{useLoadTimeReporting as Le}from"../../hooks/useLoadTimeReporting.esm.js";import{trackEditRouteRef as Te}from"../../routes.esm.js";import{getEntitiesBucket as Fe,getChecksBucket as we}from"../../utils/helpers.esm.js";import{FilterSidebar as Ee}from"../FilterSidebar/FilterSidebar.esm.js";import"../FilterSidebar/StateFilter.esm.js";import{useTrackFilterSidebar as Ne}from"../FilterSidebar/useTrackFilterSidebar.esm.js";import{toFilter as xe}from"../FilterSidebar/util.esm.js";import{LevelsTable as Re}from"../LevelsTable/LevelsTable.esm.js";import{LoadingIndicator as Be}from"../LoadingIndicator/LoadingIndicator.esm.js";import{PageWarningMessage as De}from"../PageWarningMessage/PageWarningMessage.esm.js";import"../SoundcheckHeader/SoundcheckHeader.esm.js";import"../SoundcheckHeader/SoundcheckHeaderContext.esm.js";import{useHeader as Pe}from"../SoundcheckHeader/useHeader.esm.js";import{SoundcheckMarkdownContentDeprecated as Oe}from"../SoundcheckMarkdownContent/SoundcheckMarkdownContentDeprecated.esm.js";import"@backstage/core-components";import"react-markdown";import"rehype-raw";import"remark-gfm";import"../SoundcheckMarkdownContent/SoundcheckMarkdownContentBUI.esm.js";import"../TechHealth/Filters/types.esm.js";import"../TechHealth/Filters/FacetFilter.esm.js";import"../TechHealth/Filters/FilterProvider.esm.js";import"../TechHealth/Filters/Filters.esm.js";import"../TechHealth/Filters/FiltersHeader.esm.js";import"../TechHealth/Filters/FiltersSection.esm.js";import"lodash";import"../../contexts/TrackFormContext.esm.js";import"../../contexts/CheckFormContext.esm.js";import"../../contexts/CampaignFormContext.esm.js";import"../../contexts/UserProvider.esm.js";import{parseNumberOfDays as Ie}from"../TechHealth/Filters/utils.esm.js";import{TopFailingChecksTable as Ae}from"../TopFailingChecksTable/TopFailingChecksTable.esm.js";import{TrackEntitiesTable as je}from"./TrackEntitiesTable/TrackEntitiesTable.esm.js";import{TrackProgressCard as He}from"./TrackProgressCard.esm.js";const Me=ae(r=>({root:{height:"100%",background:r.palette.background.default},pageContent:{display:"flex",minHeight:`calc(100vh - ${r.spacing(15)}px)`,borderTop:`1px solid ${r.palette.divider}`,height:"100%"},mainContentArea:{flex:1,display:"flex",flexDirection:"column",minWidth:0},trackProgressContainer:{padding:r.spacing(2,0,2,2),borderBottom:`1px solid ${r.palette.divider}`},levelCard:{margin:r.spacing(1,0,2)},editButton:{marginLeft:"auto"},contentArea:{flex:1,padding:r.spacing(0,2)},trackEntitiesContainer:{marginTop:r.spacing(1)},headerDescription:{fontSize:r.typography.body2.fontSize,margin:r.spacing(.5,0,0),"& p":{margin:0},"& a":{color:"inherit",textDecoration:"underline"}},ownerLink:{"& span":{color:"inherit","&:hover":{textDecoration:"underline"}}},tabs:{padding:r.spacing(2,2,0,2)}})),$e=()=>{const[r]=ue(),{trackId:o}=he(),k=s(()=>Ie(r.get("numberOfDays")),[r]),{owners:n,lifecycles:c,types:l,systems:m,stagedLifecycles:B,setStagedLifecycles:D,stagedOwners:P,setStagedOwners:O,stagedTypes:I,setStagedTypes:A,stagedSystems:j,setStagedSystems:H,hasFilterChanges:M,handleApplyFilters:$,handleClearFilters:z}=Ne(),v=s(()=>({routeName:"soundcheck-track-insights",additionalAttributes:{trackId:o||"",filtersApplied:n.length+c.length+l.length+m.length,ownersFilter:n.join(",")||"",lifecyclesFilter:c.join(",")||"",typesFilter:l.join(",")||"",systemsFilter:m.join(",")||"",numberOfDays:k}}),[o,n,c,l,m,k]),{reportContentLoaded:S}=Le(v),{reporter:V}=Se(v),i=Me(),[g,W]=de("checksByLevel"),L=ke(),T=re(Te),Q=ge((a,h)=>{W(h)},[]),y=s(()=>xe({lifecycles:c,owners:n,types:l,systems:m}),[c,n,l,m]),{data:e,isLoading:p,isError:U}=ye(o),{data:f,isLoading:C,isError:q}=Ce({trackId:o,filter:y},!!o),{data:G,isLoading:F,isError:J}=be({trackId:o,filter:y,numberOfDays:k},!!o),{loading:K,allowed:X}=R({permission:le,resourceRef:o}),{loading:w,allowed:E}=R({permission:me,resourceRef:o}),Y=s(()=>e?.ownerEntityRef?t(oe,{color:"inherit",entityRef:e.ownerEntityRef,className:i.ownerLink}):null,[e?.ownerEntityRef,i.ownerLink]),Z=s(()=>!w&&E&&e?.isEditable?t(se,{className:i.editButton,variant:"contained",color:"primary",onClick:()=>{L(T({trackId:e.id}))},children:"Edit Track"}):null,[E,i.editButton,T,w,L,e]),_=s(()=>e?.description?t(Oe,{className:i.headerDescription,content:e.description}):null,[i.headerDescription,e?.description]);Pe({title:e?.name,description:_,customSubtitle:Y,sectionRight:Z});const ee=e?.levels?.flatMap(a=>a.checks)??[],{data:u,isLoading:N}=ve({trackId:o,checkIds:ee.map(a=>a.id),filter:y},!!e),te=s(()=>pe(e?.filter),[e]),x=V?.getLCPValue();return fe(()=>{if(!p&&!N&&!C&&!F){const a=f?.certificationStatus?.numberOfEntities??0,h=u?.length??0;S({lcp:x,numberOfEntities:a,entitiesBucket:Fe(a),numberOfChecks:h,checksBucket:we(h)})}},[p,N,C,F,u,f,S,x]),d(ie,{children:[t(De,{entityName:"track",entityId:o,showNotFound:!p&&!e,showCannotView:!K&&!X}),p&&t(Be,{}),e&&t("div",{className:i.root,children:d("div",{className:i.pageContent,children:[t(Ee,{trackFilter:te,stagedTypes:I,stagedLifecycles:B,stagedOwners:P,stagedSystems:j,onTypesChange:A,onLifecyclesChange:D,onOwnersChange:O,onSystemsChange:H,onApplyFilters:$,onClearFilters:z,hasFilterChanges:M}),d("div",{className:i.mainContentArea,children:[t("div",{className:i.trackProgressContainer,children:t(He,{track:e,status:f,history:G,isError:U||q||J})}),t(ne,{className:i.tabs,children:d(ce,{value:g,onChange:Q,indicatorColor:"primary",textColor:"primary",children:[t(b,{label:"Checks By Level",value:"checksByLevel"}),t(b,{label:"Top Failing Checks",value:"topFailingChecks"}),t(b,{label:"Entities",value:"entities"})]})}),d("div",{className:i.contentArea,children:[g==="checksByLevel"&&t("div",{className:i.levelCard,children:t(Re,{track:e,checkStatuses:u,isLoading:p||C})}),g==="entities"&&t("div",{className:i.trackEntitiesContainer,children:t(je,{track:e,lifecycles:c,owners:n,types:l,systems:m})}),g==="topFailingChecks"&&t("div",{className:i.levelCard,children:t(Ae,{track:e,checkStatuses:u,certificationStatus:f?.certificationStatus})})]})]})]})})]})};export{$e as TrackPageDeprecated};
2
- //# sourceMappingURL=TrackPageDeprecated.esm.js.map
@@ -1,2 +0,0 @@
1
- import{jsx as i,jsxs as a}from"react/jsx-runtime";import{makeStyles as n,Box as r,Typography as c}from"@material-ui/core";import{TrackHistoryChart as h}from"./TrackHistoryChart.esm.js";import{TrackStatus as p}from"./TrackStatus.esm.js";const f=n(t=>({card:{display:"flex",flexDirection:"column",height:"100%"},title:{fontWeight:"bold",fontSize:"1.1rem",lineHeight:`${t.typography.h5.fontSize}px`,cursor:"default",marginBottom:t.spacing(2)},header:{display:"flex",flexDirection:"column",gap:t.spacing(.5)},content:{display:"flex",flex:1,margin:t.spacing(1),gap:t.spacing(2),height:"100%"},leftSection:{width:"325px",minWidth:"325px",flex:0,display:"flex",flexDirection:"column",paddingRight:t.spacing(2)},chartSection:{flex:1,flexShrink:1,flexGrow:1,flexBasis:"auto",minWidth:"150px",display:"flex",flexDirection:"column",height:"100%"}})),m=({track:t,status:l,history:s,isError:o})=>{const e=f();return i(r,{className:e.card,children:a(r,{className:e.content,children:[a(r,{className:e.leftSection,children:[i(c,{className:e.title,children:"Current Status"}),i(p,{track:t,status:l})]}),a(r,{className:e.chartSection,children:[i(c,{className:e.title,children:"Historical Status"}),i(h,{track:t,data:s,isError:o})]})]})})};export{m as TrackProgressCard};
2
- //# sourceMappingURL=TrackProgressCard.esm.js.map
@@ -1,2 +0,0 @@
1
- import{jsx as t,Fragment as s,jsxs as c}from"react/jsx-runtime";import{Box as i}from"@material-ui/core";import{TrackStatusBar as o}from"./TrackStatusBar.esm.js";import{TrackStatusTable as m}from"./TrackStatusTable.esm.js";const e=({track:r,status:a})=>t(s,{children:c("div",{children:[t(o,{track:r,status:a?.certificationStatus}),t(i,{mt:2,children:t(m,{track:r,status:a?.certificationStatus})})]})});export{e as TrackStatus};
2
- //# sourceMappingURL=TrackStatus.esm.js.map
@@ -1,2 +0,0 @@
1
- import{jsx as n}from"react/jsx-runtime";import{useTheme as B,Box as L}from"@material-ui/core";import{makeStyles as x}from"@material-ui/core/styles";import{Skeleton as k}from"@material-ui/lab";import{useMemo as f}from"react";import{CategoryBar as N}from"../CategoryBar/CategoryBar.esm.js";import{getChartColors as $}from"../Charts/chartUtils.esm.js";const C=x(t=>({categoryBar:{"& .MuiBox-root > div":{height:"8px"}},skeleton:{height:"8px",width:"100%",margin:0,padding:0,display:"block"}})),S=({track:t,status:r,className:m})=>{const c=C(),i=B(),p=f(()=>{if(!r||!t)return{};const e={};let a=0,o=0;return(r.statusByLevel||[]).sort((s,l)=>l.ordinal-s.ordinal).forEach(({ordinal:s,cumulativelyPassed:l})=>{const g=t.levels.find(y=>y.ordinal===s)?.name??`Level ${s}`,u=l-o;e[g]=u,a+=u,o=l}),(r.statusByLevel||[]).reverse(),e["No Level"]=Math.max(0,r.numberOfEntities-a),e},[r,t]),v=f(()=>{if(!r||!t)return{};const e=$(i),a={};return(r.statusByLevel||[]).forEach(({ordinal:o})=>{const s=t.levels.find(l=>l.ordinal===o)?.name??`Level ${o}`;a[s]=e[o%e.length]}),a["No Level"]=i.palette.action.disabled,a},[i,r,t]);if(!t||!r)return n(k,{className:`${c.skeleton} ${m}`});const h=e=>e,d=(r.statusByLevel||[]).map(({ordinal:e})=>t.levels.find(a=>a.ordinal===e)?.name??`Level ${e}`);return d.push("No Level"),n(L,{className:m,style:{width:"100%"},children:n(N,{className:c.categoryBar,data:p,categories:d,categoryColors:v,showTooltip:!1,valueFormatter:e=>e.toString(),categoryFormatter:h})})};export{S as TrackStatusBar};
2
- //# sourceMappingURL=TrackStatusBar.esm.js.map
@@ -1,2 +0,0 @@
1
- import{jsx as a,jsxs as m}from"react/jsx-runtime";import{useTheme as w,Typography as v}from"@material-ui/core";import{makeStyles as b,createStyles as C}from"@material-ui/core/styles";import{Skeleton as f}from"@material-ui/lab";import{memo as T,useMemo as z,Fragment as L}from"react";import{compactNumberFormatter as y}from"../../utils/formatters.esm.js";import{getChartColors as O}from"../Charts/chartUtils.esm.js";const W=b(e=>C({container:{display:"grid",gridTemplateColumns:"3fr 2fr",gap:e.spacing(1),minWidth:0},item:{display:"flex",alignItems:"center",fontSize:"0.875rem",minWidth:0},legendDash:{width:e.spacing(2),height:e.spacing(.75),borderRadius:e.spacing(.375),marginRight:e.spacing(1)},category:{display:"flex",alignItems:"center",fontSize:"0.875rem",minWidth:0,flex:1},categoryText:{whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis",fontSize:"0.875rem",minWidth:0,flex:1},value:{fontSize:"0.875rem",color:e.palette.text.primary},valueCell:{justifyContent:"flex-end",whiteSpace:"nowrap"},percentage:{color:e.palette.text.secondary,marginLeft:e.spacing(1)},skeleton:{backgroundColor:e.palette.action.hover}})),j=T(({track:e,status:l})=>{const r=w(),t=W(),k=z(()=>{if(!e)return[{name:"",key:1,color:r.palette.action.hover,value:0},{name:"",key:2,color:r.palette.action.hover,value:0},{name:"",key:3,color:r.palette.action.hover,value:0}];const i=O(r);let s=0,c=0;const n=e.levels.sort((h,o)=>o.ordinal-h.ordinal).map(({name:h,ordinal:o})=>{const g=l?.statusByLevel.find(S=>S.ordinal===o)?.cumulativelyPassed??0,u=g-c,N={name:h??`Level ${o}`,key:o,color:i[o%i.length],value:u};return s+=u,c=g,N}).reverse();e.levels.reverse();const p=l?.numberOfEntities??0,x=Math.max(0,p-s);return n.push({name:"No Level",key:-1,color:r.palette.action.disabled,value:x}),n},[r,e,l]),d=l?.numberOfEntities??0;return a("div",{className:t.container,children:k.map(({name:i,key:s,color:c,value:n})=>{const p=d>0?Math.round(n/d*100):0;return m(L,{children:[a("div",{className:t.item,children:m("div",{className:t.category,children:[a("span",{className:t.legendDash,style:{backgroundColor:c}}),e?a(v,{className:t.categoryText,children:i}):a(f,{width:80,height:20,className:t.skeleton})]})}),a("div",{className:`${t.item} ${t.valueCell}`,children:e&&l?m(v,{className:t.value,children:[y(n)," of"," ",y(d),m("span",{className:t.percentage,children:["(",p,"%)"]})]}):a(f,{width:120,height:20,className:t.skeleton})})]},s)})})});export{j as TrackStatusTable};
2
- //# sourceMappingURL=TrackStatusTable.esm.js.map
@@ -1,2 +0,0 @@
1
- import{getTrendLineColor as o,TrendLineColor as n}from"../Charts/chartUtils.esm.js";const s=(e,r)=>{if(isNaN(r))return"#ddd";if(r<0)return e.palette.status.aborted;const t=100;return r<t/3?o(e,n.RED):r<t*(2/3)?e.palette.status.warning:o(e,n.GREEN)};export{s as getProgressColor};
2
- //# sourceMappingURL=utils.esm.js.map
@@ -1,2 +0,0 @@
1
- import{jsx as y}from"react/jsx-runtime";import{makeStyles as A,TextField as G}from"@material-ui/core";import{Autocomplete as w}from"@material-ui/lab";import{sortBy as x,isEmpty as E}from"lodash";import{useState as I,useMemo as o}from"react";import"@backstage/catalog-model";import"@backstage/core-plugin-api";import"@tanstack/react-query";import"../../api.esm.js";import"../../hooks/graphqlKeys.esm.js";import"@backstage/plugin-catalog-react";import"@spotify/backstage-plugin-soundcheck-common";import"../../hooks/useSoundcheckAlert.esm.js";import{useGetCampaigns as $}from"../../hooks/campaigns/useGetCampaigns.esm.js";import{useGetAllTracks as B}from"../../hooks/tracks/useGetAllTracks.esm.js";import"../../hooks/useConfirmationModal.esm.js";import"react-router-dom";import"react-use/lib/useLocalStorage";import{useGetTracksApplicableEntityCount as F}from"../../hooks/tracks/useGetTracksApplicableEntityCount.esm.js";const j=A(a=>({input:{backgroundColor:a.palette.background.paper}})),D=({selectTrack:a,selectedTrackId:n,showArchived:d,showDraft:m,selectedGroupRef:h})=>{const T=j(),{data:s,isLoading:C}=B({}),{data:l,isLoading:v}=$({}),[S,b]=I(n??""),u=o(()=>new Set(l?.edges.filter(({node:t})=>t.archived).map(({node:t})=>t.track.id)??[]),[l?.edges]),r=o(()=>{let t=s?.edges?.map(({node:e})=>({id:e.id,name:e.name,type:e.type==="campaign"?"Campaign":"Track",draft:!!e.draft}))??[];return t=t?.filter(e=>(d||!u.has(e.id))&&(m||!e.draft)),x(t,"type")},[u,d,m,s?.edges]),{data:c,isLoading:f}=F(h??"",{ids:r.map(t=>t.id)}),p=o(()=>{if(f)return r;const t=c??[],e=r.map(i=>{const k=t.find(({id:L})=>L===i.id);return{...i,count:k?k.applicableEntityCount:void 0}}).filter(i=>i.count!==0);return E(e)?r:e},[c,f,r]),g=o(()=>p?.find(t=>t.id===n),[n,p]);return y(w,{loading:C||v,options:p,onChange:(t,e)=>a(e?.id??""),inputValue:S,value:g??null,getOptionLabel:t=>`${t.name}${t.count?` (${t.count})`:""}`,groupBy:t=>t.type,fullWidth:!0,onInputChange:(t,e)=>b(e),renderInput:t=>y(G,{...t,placeholder:"Select Track",className:T.input,style:{margin:0},margin:"dense",variant:"outlined"})},g?.id??"no-value")};export{D as TrackSelection};
2
- //# sourceMappingURL=TrackSelection.esm.js.map
@@ -1,2 +0,0 @@
1
- var a=(t=>(t.title="Create a track",t.description="A track is composed of levels and checks, and encourages alignment to architectural best practices and standards.",t.callToAction="Get started",t))(a||{}),e=(t=>(t.title="No tracks found",t.description="No tracks matched your search. Consider changing search term and filters.",t))(e||{});export{a as TrackEmptyState,e as TrackNoResults};
2
- //# sourceMappingURL=TrackEmptyState.esm.js.map
@@ -1,2 +0,0 @@
1
- import{jsx as r,jsxs as k}from"react/jsx-runtime";import{useRouteRef as _,useApi as S,featureFlagsApiRef as ee}from"@backstage/core-plugin-api";import{usePermission as re}from"@backstage/plugin-permission-react";import{makeStyles as te,Button as N,Grid as a}from"@material-ui/core";import{soundcheckTrackCreatePermission as ae}from"@spotify/backstage-plugin-soundcheck-common";import{useState as i,useMemo as oe,useEffect as B}from"react";import{useNavigate as ie}from"react-router-dom";import se from"react-use/lib/useDebounce";import{soundcheckApiRef as ne}from"../../../api.esm.js";import"@backstage/catalog-model";import"@tanstack/react-query";import"../../../hooks/graphqlKeys.esm.js";import"@backstage/plugin-catalog-react";import"../../../hooks/useSoundcheckAlert.esm.js";import{useGetAllTracks as ce}from"../../../hooks/tracks/useGetAllTracks.esm.js";import"../../../hooks/useConfirmationModal.esm.js";import"react-use/lib/useLocalStorage";import{useGetTrackOwners as me}from"../../../hooks/tracks/useGetTrackOwners.esm.js";import{useImportTracks as le}from"../../../hooks/tracks/useImportTracks.esm.js";import{useLCPReporting as pe}from"../../../hooks/useLCPReporting.esm.js";import{useLoadTimeReporting as de}from"../../../hooks/useLoadTimeReporting.esm.js";import ge from"../../../images/no-results.svg";import{trackCreateRouteRef as ue}from"../../../routes.esm.js";import{exportTracks as fe}from"../../../utils/export.esm.js";import{FilterDefault as L}from"../../../utils/filters.esm.js";import{EmptyState as F}from"../../EmptyState/EmptyState.esm.js";import"../../EmptyState/EmptyStateBUI.esm.js";import"@remixicon/react";import{ImportExportPanelDeprecated as he}from"../../ImportExportPanel/ImportExportPanelDeprecated.esm.js";import{Pagination as ke}from"../../Pagination/Pagination.esm.js";import{SearchFilters as Pe}from"../../SearchFilters/SearchFilters.esm.js";import{TrackEmptyState as P,TrackNoResults as I}from"./TrackEmptyState.esm.js";import{TracksOverviewSkeleton as Te}from"./TracksOverviewSkeleton.esm.js";import{TrackSummaryCard as ye}from"./TrackSummaryCard.esm.js";const Ce=te(t=>({headerButtons:{display:"flex",gap:t.spacing(1),flexWrap:"nowrap",justifyContent:"end",alignItems:"end"},header:{padding:t.spacing(0,0,1)},container:{padding:t.spacing(3),gap:t.spacing(3)},createButton:{lineHeight:"1.25rem",paddingTop:t.spacing(1.5),paddingBottom:t.spacing(1.5)}})),be=({tracksPerPage:t,currentCursor:O})=>{const[s,T]=i(O),[g,E]=i(""),[n,D]=i(L.Alpha),[c,j]=i(L.Owner),[m,G]=i(""),y=oe(()=>({routeName:"soundcheck-tracks",additionalAttributes:{tracksPerPage:t,pageCursor:s||"",sortOrder:n||"",ownerFilter:c||"",nameSearch:m||""}}),[t,s,n,c,m]),{reportContentLoaded:C}=de(y),{reporter:H}=pe(y),l=Ce(),{data:M,isLoading:u}=me();se(()=>{G(g)},500,[g]);const{loading:b,allowed:V}=re({permission:ae}),W=ie(),$=_(ue),x=()=>W($()),{data:f,isLoading:o}=ce({ids:void 0,types:["standard","playlist"],first:t,after:s,orderAlphabetical:n,searchByOwner:c,searchByName:m}),p=f?.edges?.map(e=>e.node),[A,v]=i([]);B(()=>{T(void 0),v([])},[m]);const w=S(ee),q=!w.getRegisteredFlags().find(e=>e.name==="soundcheck-enable-track-creation")||w.isActive("soundcheck-enable-track-creation"),h=!V||!q,z=e=>{D(e.target.value)},J=e=>{j(e.target.value)},K=S(ne),{mutateAsync:Q}=le(),U=async e=>Q(e),X=async()=>{const e=await K.getTracks({orderAlphabetical:"asc"});return fe(e.edges.map(Z=>Z.node))},R=H?.getLCPValue();if(B(()=>{!o&&!u&&C({lcp:R})},[o,u,C,R]),!o&&!p)return r(F,{title:P.title,description:P.description,imgSrc:ge,action:!b&&r(N,{disabled:h,variant:"contained",color:"primary",onClick:x,children:P.callToAction})});let d;o?d=r(Te,{}):p?.length?d=p?.map(e=>r(a,{xs:12,sm:12,md:6,lg:4,xl:3,item:!0,role:"listitem","aria-label":`track card ${e.id}`,children:r(ye,{summary:e})},e.id)):d=r(a,{xs:12,item:!0,role:"listitem","aria-label":"result",children:r(F,{title:I.title,description:I.description})});const Y=f?.pageInfo.hasNextPage||A?.length>0;return k(a,{container:!0,direction:"row",className:l.container,children:[k(a,{container:!0,className:l.header,children:[r(Pe,{searchPlaceholder:"Search Available Tracks",isLoading:o||u,searchTerm:g,setSearchTerm:E,filterAlpha:n,handleAlphabeticalFilterChange:z,filterOwner:c,handleOwnerFilterChange:J,owners:M}),k(a,{item:!0,xs:4,className:l.headerButtons,children:[r(he,{resourceType:"track",disableImport:h,disableExport:o||!p?.length,onImport:U,onExport:X}),!b&&r(N,{disabled:h,variant:"contained",color:"primary",onClick:x,className:l.createButton,children:"Create Track"})]})]}),r(a,{container:!0,spacing:4,role:"list","aria-label":"tracks",children:d}),Y&&r(a,{item:!0,xs:12,children:r(ke,{response:f,listingsPerPage:t,cursor:s,setCursor:T,prevCursors:A,setPrevCursors:v,labelPerPageDropdown:"Tracks Per Page:",urlRoute:"tracks?tracksPerPage="})})]})};export{be as TrackListPageDeprecated};
2
- //# sourceMappingURL=TrackListPageDeprecated.esm.js.map
@@ -1,2 +0,0 @@
1
- import{jsxs as r,jsx as e}from"react/jsx-runtime";import{Link as p}from"@backstage/core-components";import{EntityRefLink as g}from"@backstage/plugin-catalog-react";import{makeStyles as f,List as N,Typography as o,ListItem as n,Tooltip as a,ListItemIcon as l,ListItemText as s,Badge as k}from"@material-ui/core";import u from"@material-ui/icons/DoneAllRounded";import I from"@material-ui/icons/Group";import y from"@material-ui/icons/Menu";import b from"@material-ui/icons/OpenInNew";const L=f(i=>({root:{position:"relative",height:"100%"},cardSection:{marginBottom:i.spacing(2)},listItem:{padding:0},listItemText:{margin:0},iconContainer:{minWidth:"auto",paddingRight:i.spacing(1)},ownerLink:{"& span":{"&:hover":{textDecoration:"underline"}}},badge:{marginTop:i.spacing(1),"& span":{position:"relative",transform:"none",transformOrigin:"unset",backgroundColor:i.palette.action.disabledBackground}}})),v=({track:i})=>{const t=L(),c=i.levels?.length??0,m=i.levels?.reduce((d,h)=>d+h.checks.length,0);return r(N,{dense:!0,disablePadding:!0,className:t.cardSection,children:[e(o,{variant:"overline",color:"textSecondary",children:"Track Details"}),r(n,{disableGutters:!0,className:t.listItem,children:[e(a,{title:"Levels",children:e(l,{className:t.iconContainer,children:e(y,{color:"inherit",fontSize:"small"})})}),e(s,{className:t.listItemText,primary:e(o,{variant:"body2",color:"textPrimary",children:`${c} ${c===1?"Level":"Levels"}`})})]}),r(n,{disableGutters:!0,className:t.listItem,children:[e(a,{title:"Checks",children:e(l,{className:t.iconContainer,children:e(u,{color:"inherit",fontSize:"small"})})}),e(s,{className:t.listItemText,primary:e(o,{variant:"body2",color:"textPrimary",children:`${m} ${m===1?"Check":"Checks"}`})})]}),i.documentationURL&&r(n,{disableGutters:!0,className:t.listItem,children:[e(a,{title:"Documentation",children:e(l,{className:t.iconContainer,children:e(b,{color:"inherit",fontSize:"small"})})}),e(s,{className:t.listItemText,primary:e(p,{to:i.documentationURL,target:"_blank",rel:"noopener noreferrer",children:"Learn more"})})]}),r(n,{disableGutters:!0,className:t.listItem,children:[e(a,{title:"Owner",children:e(l,{className:t.iconContainer,children:e(I,{color:"inherit",fontSize:"small"})})}),e(s,{className:t.listItemText,primary:e(g,{entityRef:i.ownerEntityRef,hideIcon:!0,underline:"hover",className:t.ownerLink})})]}),i.draft&&e(n,{disableGutters:!0,className:t.listItem,children:e(k,{badgeContent:"Draft",className:t.badge})})]})};export{v as TrackMetadata};
2
- //# sourceMappingURL=TrackMetadata.esm.js.map
@@ -1,2 +0,0 @@
1
- import{jsx as l}from"react/jsx-runtime";import{useRouteRef as p,useApi as I,configApiRef as v}from"@backstage/core-plugin-api";import{usePermission as a}from"@backstage/plugin-permission-react";import{soundcheckTrackUpdatePermission as u,soundcheckTrackDeletePermission as x}from"@spotify/backstage-plugin-soundcheck-common";import{useCallback as i}from"react";import{useNavigate as A}from"react-router-dom";import"@backstage/catalog-model";import"@tanstack/react-query";import"../../../api.esm.js";import"../../../hooks/graphqlKeys.esm.js";import"@backstage/plugin-catalog-react";import"../../../hooks/useSoundcheckAlert.esm.js";import{useConfirmationModal as C}from"../../../hooks/useConfirmationModal.esm.js";import"react-use/lib/useLocalStorage";import{useDeleteTrack as P}from"../../../hooks/tracks/useDeleteTrack.esm.js";import{useRecertifyTrack as M}from"../../../hooks/tracks/useRecertifyTrack.esm.js";import{trackDetailsRouteRef as N,trackEditRouteRef as O}from"../../../routes.esm.js";import{exportTrack as $}from"../../../utils/export.esm.js";import{SummaryCard as S}from"../../SummaryCard/SummaryCard.esm.js";import{TrackMetadata as j}from"./TrackMetadata.esm.js";const B=({summary:e})=>{const{loading:f,allowed:k}=a({permission:u,resourceRef:e.id}),{loading:y,allowed:h}=a({permission:x,resourceRef:e.id}),{loading:g,allowed:w}=a({permission:u,resourceRef:e.id}),{showModal:r}=C(),{mutate:m}=M(),{mutate:n}=P(),o=A(),s=p(N),c=p(O),d=I(v).getOptionalConfig("soundcheck.certifications.history");let t=d?.getOptionalBoolean("enable")?d?.getOptionalNumber("retentionTimeInDays")??120:1;t=Math.min(t,365);const R=i(async()=>{await r({title:"Recertify Track",message:`Are you sure you want to recertify track ${e.name}? It will erase existing certification data, which cannot be undone. New data will be generated for the past ${t} day(s), reflecting the track's current configuration. This process may take some time, you will be notified upon completion.`})&&m({trackId:e.id,numberOfDays:t})},[r,e.id,e.name,m,t]),T=i(async()=>{await r({title:"Delete Track",message:`Are you sure you want to delete track ${e.name}?`})&&n(e.id)},[r,e.id,e.name,n]),b=i(()=>{o(s({trackId:e.id}))},[o,e.id,s]),D=i(()=>{o(c({trackId:e.id}))},[o,e.id,c]),E=i(()=>{$(e)},[e]);return l(S,{title:e.name,description:e.description,children:l(j,{track:e}),handleView:b,handleEdit:e.isEditable&&!g&&w?D:void 0,handleDelete:e.isEditable&&!y&&h?T:void 0,handleExport:E,handleRecertify:!f&&k?R:void 0,viewIsPrimaryAction:!0})};export{B as TrackSummaryCard};
2
- //# sourceMappingURL=TrackSummaryCard.esm.js.map