@spotify/backstage-plugin-soundcheck 0.18.0 → 0.19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (243) hide show
  1. package/CHANGELOG.md +69 -0
  2. package/config.d.ts +21 -0
  3. package/dist/alpha/apis.esm.js +1 -1
  4. package/dist/alpha/entity-content.esm.js +1 -1
  5. package/dist/alpha/pages.esm.js +1 -1
  6. package/dist/alpha/plugin.esm.js +1 -1
  7. package/dist/alpha.d.ts +83 -77
  8. package/dist/api.esm.js +1 -1
  9. package/dist/blueprints/IntegrationPageBlueprint.esm.js +1 -1
  10. package/dist/components/Badges/CampaignBadge.esm.js +1 -1
  11. package/dist/components/Badges/StatusBadge.esm.js +1 -1
  12. package/dist/components/CacheConfig/CacheConfigComponent.esm.js +1 -1
  13. package/dist/components/CampaignForm/CampaignForm.esm.js +1 -1
  14. package/dist/components/CampaignForm/Steps/CampaignDetailsStep/CampaignOwnerField.esm.js +1 -1
  15. package/dist/components/CampaignForm/Steps/CampaignTrackStepNew.esm.js +1 -1
  16. package/dist/components/CampaignForm/hooks/utils.esm.js +1 -1
  17. package/dist/components/CampaignForm/utils/campaignFormUtils.esm.js +2 -2
  18. package/dist/components/CampaignForm/utils/validation.esm.js +1 -1
  19. package/dist/components/CampaignInsightsPage/CampaignInsightsPage.esm.js +1 -1
  20. package/dist/components/CampaignInsightsPage/CampaignStatusHistoryTile.esm.js +1 -1
  21. package/dist/components/CampaignInsightsPage/CampaignStatusTile.esm.js +1 -1
  22. package/dist/components/CampaignInsightsPage/DaysRemainingTile.esm.js +1 -1
  23. package/dist/components/CampaignsPage/CampaignListPage/CampaignListPage.esm.js +1 -1
  24. package/dist/components/CampaignsPage/CampaignsPage.esm.js +1 -1
  25. package/dist/components/CategoryBar/CategoryBar.esm.js +1 -1
  26. package/dist/components/CertificationSidebar/Check.esm.js +1 -1
  27. package/dist/components/CertificationsPage/CertificationTabs.esm.js +1 -1
  28. package/dist/components/CheckDetails/FixMeDialog.esm.js +1 -1
  29. package/dist/components/CheckForm/CheckForm.esm.js +1 -1
  30. package/dist/components/CheckForm/FormFields/CheckPathResolverInput.esm.js +1 -1
  31. package/dist/components/CheckForm/FormFields/CheckScheduleSection/ScheduleSection.esm.js +1 -1
  32. package/dist/components/CheckForm/FormFields/RuleInput/AddMenuButton.esm.js +1 -1
  33. package/dist/components/CheckForm/FormFields/RuleInput/Conditions/RuleConditionInput.esm.js +1 -1
  34. package/dist/components/CheckForm/FormFields/RuleInput/Conditions/useRuleOptions.esm.js +1 -1
  35. package/dist/components/CheckForm/FormFields/TeamDetailsInput/TeamDetailsInput.esm.js +1 -1
  36. package/dist/components/CheckForm/utils/checkFormUtils.esm.js +2 -2
  37. package/dist/components/CheckIcon/CheckIcon.esm.js +1 -1
  38. package/dist/components/CheckPage/CheckEntitiesTable/CheckEntitiesTable.esm.js +1 -1
  39. package/dist/components/CheckPage/CheckEntitiesTable/columns.esm.js +1 -1
  40. package/dist/components/CheckPage/CheckInsightsPage.esm.js +1 -1
  41. package/dist/components/CheckPage/CheckStatusTable.esm.js +1 -1
  42. package/dist/components/CheckTemplatesPage/CheckTemplatesPage.esm.js +1 -1
  43. package/dist/components/ChecksPage/CheckListPage/CheckListPage.esm.js +1 -1
  44. package/dist/components/ChecksPage/ChecksPage.esm.js +1 -1
  45. package/dist/components/CollapsablePanel/CollapsablePanel.esm.js +1 -1
  46. package/dist/components/CollectorPage/CollectorDetailsPage.esm.js +2 -0
  47. package/dist/components/CollectorPage/CollectorFactTable.esm.js +2 -0
  48. package/dist/components/CollectorPage/CollectorPage.esm.js +1 -1
  49. package/dist/components/CollectorPage/Configurators/AzureDevOps/AzureDevOpsConfigurator.esm.js +1 -1
  50. package/dist/components/CollectorPage/Configurators/AzureDevOps/NumberOfWorkItemsComponent.esm.js +1 -1
  51. package/dist/components/CollectorPage/Configurators/BigQuery/BigQueryConfigurator.esm.js +1 -1
  52. package/dist/components/CollectorPage/Configurators/BigQuery/QueryFactDetailsComponent.esm.js +1 -1
  53. package/dist/components/CollectorPage/Configurators/Catalog/CatalogConfigurator.esm.js +1 -1
  54. package/dist/components/CollectorPage/Configurators/Common/CollectorConfigAlert.esm.js +2 -0
  55. package/dist/components/CollectorPage/Configurators/Common/PortalConfigAlert.esm.js +2 -0
  56. package/dist/components/CollectorPage/Configurators/Common/utils.esm.js +1 -1
  57. package/dist/components/CollectorPage/Configurators/DataDog/DataDogConfigurator.esm.js +1 -1
  58. package/dist/components/CollectorPage/Configurators/DataRegistry/DataRegistryConfigurator.esm.js +1 -1
  59. package/dist/components/CollectorPage/Configurators/Github/CodeScanningAlertsFactDetails.esm.js +1 -1
  60. package/dist/components/CollectorPage/Configurators/Github/DependabotAlertsFactDetails.esm.js +1 -1
  61. package/dist/components/CollectorPage/Configurators/Github/GithubConfigurator.esm.js +1 -1
  62. package/dist/components/CollectorPage/Configurators/Github/SecretScanningAlertsFactDetails.esm.js +1 -1
  63. package/dist/components/CollectorPage/Configurators/Github/SecurityAdvisoriesFactDetails.esm.js +1 -1
  64. package/dist/components/CollectorPage/Configurators/Gitlab/GitlabConfigurator.esm.js +1 -1
  65. package/dist/components/CollectorPage/Configurators/HTTP/HttpConfigurator.esm.js +1 -1
  66. package/dist/components/CollectorPage/Configurators/HTTP/HttpRequestComponent.esm.js +1 -1
  67. package/dist/components/CollectorPage/Configurators/HTTP/HttpStatusesInput.esm.js +1 -1
  68. package/dist/components/CollectorPage/Configurators/Jira/JiraConfigurator.esm.js +1 -1
  69. package/dist/components/CollectorPage/Configurators/Kubernetes/KubernetesConfigurator.esm.js +1 -1
  70. package/dist/components/CollectorPage/Configurators/NewRelic/NewRelicConfigurator.esm.js +1 -1
  71. package/dist/components/CollectorPage/Configurators/PagerDuty/PagerDutyConfigurator.esm.js +1 -1
  72. package/dist/components/CollectorPage/Configurators/SCM/ScmConfigurator.esm.js +1 -1
  73. package/dist/components/CollectorPage/Configurators/SonarQube/IssuesFactDetailsInput.esm.js +1 -1
  74. package/dist/components/CollectorPage/Configurators/SonarQube/SonarQubeConfigurator.esm.js +1 -1
  75. package/dist/components/CollectorsPage/CollectorListPage/CollectorSummaryCard.esm.js +1 -1
  76. package/dist/components/CollectorsPage/CollectorsPage.esm.js +1 -1
  77. package/dist/components/ColorChip/ColorChip.esm.js +2 -0
  78. package/dist/components/EmptyState/EmptyState.esm.js +1 -1
  79. package/dist/components/EntitiesAutocompletePicker/EntitiesAutocompletePicker.esm.js +1 -1
  80. package/dist/components/Expand/Expand.esm.js +1 -1
  81. package/dist/components/ExpandableSection/ExpandableSection.esm.js +1 -1
  82. package/dist/components/FactExplorer/FactExplorer.esm.js +1 -1
  83. package/dist/components/FactExplorer/FactExplorerContext.esm.js +1 -1
  84. package/dist/components/FactExplorer/FactExplorerDialog.esm.js +1 -1
  85. package/dist/components/FactExplorer/useFactOptions.esm.js +1 -1
  86. package/dist/components/Filter/EntityAutocompletePicker.esm.js +1 -1
  87. package/dist/components/FilterSidebar/StateFilter.esm.js +1 -1
  88. package/dist/components/FilterSidebar/useTrackFilterSidebar.esm.js +2 -0
  89. package/dist/components/FormControlledAutocomplete/ControlledAutocomplete.esm.js +1 -1
  90. package/dist/components/Frequency/FrequencyComponent.esm.js +1 -1
  91. package/dist/components/Frequency/util.esm.js +1 -1
  92. package/dist/components/GroupHierarchySelector/GroupHierarchyCategorySelection.esm.js +2 -0
  93. package/dist/components/GroupHierarchySelector/GroupHierarchyChip.esm.js +2 -0
  94. package/dist/components/GroupHierarchySelector/GroupHierarchyGroupInfo.esm.js +2 -0
  95. package/dist/components/GroupHierarchySelector/GroupHierarchySelector.esm.js +2 -0
  96. package/dist/components/GroupHierarchySelector/GroupHierarchySelectorDialog.esm.js +2 -0
  97. package/dist/components/GroupHierarchySelector/getAllOwnedEntityCount.esm.js +2 -0
  98. package/dist/components/GroupHierarchySelector/usePreviousSelectedGroups.esm.js +2 -0
  99. package/dist/components/HierarchicalTechInsightsPage/ColorLegend.esm.js +2 -0
  100. package/dist/components/HierarchicalTechInsightsPage/HierarchicalTechInsightsPage.esm.js +2 -0
  101. package/dist/components/HierarchicalTechInsightsPage/HierarchyTable.esm.js +2 -0
  102. package/dist/components/HierarchicalTechInsightsPage/LowestPerformingTeams.esm.js +2 -0
  103. package/dist/components/HierarchicalTechInsightsPage/SelectedNodeSidebar.esm.js +2 -0
  104. package/dist/components/HierarchicalTechInsightsPage/TeamPerformanceCard.esm.js +2 -0
  105. package/dist/components/HierarchicalTechInsightsPage/TopPerformingTeams.esm.js +2 -0
  106. package/dist/components/HierarchicalTechInsightsPage/getLeafNodes.esm.js +2 -0
  107. package/dist/components/HierarchicalTechInsightsPage/visualizations/LoadingOverlay.esm.js +2 -0
  108. package/dist/components/HierarchicalTechInsightsPage/visualizations/NivoCirclePacking.esm.js +2 -0
  109. package/dist/components/HierarchicalTechInsightsPage/visualizations/NivoHeatmap.esm.js +2 -0
  110. package/dist/components/HierarchicalTechInsightsPage/visualizations/NivoIcicle.esm.js +2 -0
  111. package/dist/components/HierarchicalTechInsightsPage/visualizations/NivoSunburst.esm.js +2 -0
  112. package/dist/components/HierarchicalTechInsightsPage/visualizations/NivoTreemap.esm.js +2 -0
  113. package/dist/components/HierarchicalTechInsightsPage/visualizations/VisualizationBreadcrumb.esm.js +2 -0
  114. package/dist/components/HierarchicalTechInsightsPage/visualizations/findNodePath.esm.js +2 -0
  115. package/dist/components/HierarchicalTechInsightsPage/visualizations/hierarchyToNivo.esm.js +2 -0
  116. package/dist/components/ImportExportPanel/ImportExportPanel.esm.js +1 -1
  117. package/dist/components/LevelsTable/LevelsTable.esm.js +1 -1
  118. package/dist/components/OverviewPage/OverviewPage.esm.js +1 -1
  119. package/dist/components/OverviewPage/OverviewPageContent.esm.js +1 -1
  120. package/dist/components/PassRateGrid/PassRateMetadata.esm.js +1 -1
  121. package/dist/components/QuickstartPage/HowDoIListItem.esm.js +1 -1
  122. package/dist/components/QuickstartPage/QuickstartCardBase.esm.js +1 -1
  123. package/dist/components/QuickstartPage/QuickstartPage.esm.js +2 -1
  124. package/dist/components/QuickstartPage/WelcomeHelpSection.esm.js +5 -5
  125. package/dist/components/QuickstartPage/styles.esm.js +1 -1
  126. package/dist/components/RoutingPage/NewFeatureTab.esm.js +2 -0
  127. package/dist/components/RoutingPage/RoutingPage.esm.js +1 -1
  128. package/dist/components/SearchBar/SearchBar.esm.js +1 -1
  129. package/dist/components/SoundcheckEntityLink/SoundcheckEntityLink.esm.js +2 -0
  130. package/dist/components/SoundcheckHeader/SoundcheckHeader.esm.js +1 -1
  131. package/dist/components/SoundcheckHeader/headerUtil.esm.js +1 -1
  132. package/dist/components/TeamStatusBar/TeamStatusBar.esm.js +2 -0
  133. package/dist/components/TechHealth/Filters/FacetFilter.esm.js +1 -1
  134. package/dist/components/TechHealth/Filters/FilterProvider.esm.js +1 -1
  135. package/dist/components/TechHealth/Loading/Loading.esm.js +1 -1
  136. package/dist/components/TechHealth/Loading/TechHealthLoading.esm.js +1 -1
  137. package/dist/components/TechHealth/TechHealth.esm.js +1 -1
  138. package/dist/components/TechHealthTabs/PassRateTabHeader.esm.js +1 -1
  139. package/dist/components/TechInsights/FilterControls.esm.js +2 -0
  140. package/dist/components/TechInsights/SummaryTiles.esm.js +2 -0
  141. package/dist/components/TechInsights/TechInsightsCardsView.esm.js +2 -0
  142. package/dist/components/TechInsights/TechInsightsPage.esm.js +1 -1
  143. package/dist/components/TechInsights/TechInsightsTableView.esm.js +2 -0
  144. package/dist/components/TechInsights/TrackStatusCard.esm.js +2 -0
  145. package/dist/components/TechInsights/ViewModeControls.esm.js +2 -0
  146. package/dist/components/TechInsights/convertToCommonTrackStatus.esm.js +2 -0
  147. package/dist/components/TechInsightsGroupSelector/TechInsightsGroupSelector.esm.js +2 -0
  148. package/dist/components/TopFailingChecksTable/TopFailingChecksTable.esm.js +1 -1
  149. package/dist/components/TrackForm/Steps/TrackDetailsStep/TrackBadgeTypeSelect/TrackBadgeTypeSelect.esm.js +1 -1
  150. package/dist/components/TrackForm/Steps/TrackDetailsStep/TrackOwnerSelect/TrackOwnerSelect.esm.js +1 -1
  151. package/dist/components/TrackPage/TrackEntitiesTable/TrackEntitiesTable.esm.js +1 -1
  152. package/dist/components/TrackPage/TrackEntitiesTable/TrackStatusChip.esm.js +1 -1
  153. package/dist/components/TrackPage/TrackEntitiesTable/columns.esm.js +1 -1
  154. package/dist/components/TrackPage/TrackHistoryChart.esm.js +1 -1
  155. package/dist/components/TrackPage/TrackPage.esm.js +1 -1
  156. package/dist/components/TrackPage/TrackStatusBar.esm.js +1 -1
  157. package/dist/components/TrackPage/TrackStatusTable.esm.js +1 -1
  158. package/dist/components/TrackSelection/TrackSelection.esm.js +2 -0
  159. package/dist/components/TracksPage/TrackListPage/TrackListPage.esm.js +1 -1
  160. package/dist/components/TracksPage/TracksPage.esm.js +1 -1
  161. package/dist/graphql/generated/index.esm.js +202 -149
  162. package/dist/hooks/cache/useEntityCountCached.esm.js +2 -0
  163. package/dist/hooks/cache/useTrackCountCached.esm.js +2 -0
  164. package/dist/hooks/campaigns/useCreateCampaign.esm.js +1 -1
  165. package/dist/hooks/campaigns/useGetCampaigns.esm.js +1 -1
  166. package/dist/hooks/catalog/useGetEntityCount.esm.js +2 -0
  167. package/dist/hooks/catalog/useGetLimitedEntityRefs.esm.js +2 -0
  168. package/dist/hooks/checks/useUpdateCheck.esm.js +1 -1
  169. package/dist/hooks/collectors/useDeleteCollectorConfig.esm.js +2 -0
  170. package/dist/hooks/graphqlKeys.esm.js +1 -1
  171. package/dist/hooks/groups/useAllGroups.esm.js +1 -1
  172. package/dist/hooks/groups/useGroupOptions.esm.js +1 -1
  173. package/dist/hooks/heirarchy/useBatchedHierarchicalTrackStatuses.esm.js +2 -0
  174. package/dist/hooks/heirarchy/useGroupHierarchy.esm.js +1 -1
  175. package/dist/hooks/heirarchy/useGroupTypeHierarchy.esm.js +2 -0
  176. package/dist/hooks/heirarchy/useHierarchicalTrackStatus.esm.js +1 -1
  177. package/dist/hooks/tracks/useCreateTrack.esm.js +1 -1
  178. package/dist/hooks/tracks/useGetAllTracks.esm.js +1 -1
  179. package/dist/hooks/tracks/useGetTracksApplicableEntityCount.esm.js +2 -0
  180. package/dist/hooks/tracks/useTracksApplicableToGroup.esm.js +2 -0
  181. package/dist/hooks/useFeatureFlag.esm.js +1 -1
  182. package/dist/hooks/useLCPReporting.esm.js +2 -0
  183. package/dist/index.d.ts +5 -3
  184. package/dist/index.esm.js +1 -1
  185. package/dist/routes.esm.js +1 -1
  186. package/dist/utils/colors.esm.js +1 -1
  187. package/dist/utils/lcpReporting.esm.js +2 -0
  188. package/package.json +27 -24
  189. package/dist/components/CheckCard/CheckCard.esm.js +0 -2
  190. package/dist/components/CheckCard/CheckHistoryChart.esm.js +0 -2
  191. package/dist/components/CheckCard/utils.esm.js +0 -2
  192. package/dist/components/MultiSelectFilter/MultiSelectFilter.esm.js +0 -2
  193. package/dist/components/QuickstartPage/QuickStartChecksCard.esm.js +0 -2
  194. package/dist/components/QuickstartPage/QuickstartCollectorConfigurationsCard.esm.js +0 -2
  195. package/dist/components/QuickstartPage/QuickstartTracksCard.esm.js +0 -2
  196. package/dist/components/QuickstartPage/WelcomeModal.esm.js +0 -2
  197. package/dist/components/TechHealth/Loading/Emoji.esm.js +0 -2
  198. package/dist/components/TechHealth/Loading/EmojiFountain.esm.js +0 -2
  199. package/dist/components/TechInsights/ColorLegend.esm.js +0 -2
  200. package/dist/components/TechInsights/LoadingOverlay.esm.js +0 -2
  201. package/dist/components/TechInsights/LowestPerformingTeams.esm.js +0 -2
  202. package/dist/components/TechInsights/NivoCirclePacking.esm.js +0 -2
  203. package/dist/components/TechInsights/NivoIcicle.esm.js +0 -2
  204. package/dist/components/TechInsights/NivoSunburst.esm.js +0 -2
  205. package/dist/components/TechInsights/NivoTreemap.esm.js +0 -2
  206. package/dist/components/TechInsights/TeamComparison/CheckComparison.esm.js +0 -2
  207. package/dist/components/TechInsights/TeamComparison/FailingComponentsTable.esm.js +0 -2
  208. package/dist/components/TechInsights/TeamComparison/LineChartContainer.esm.js +0 -2
  209. package/dist/components/TechInsights/TeamComparison/MultiCheckStatusHistoryChart.esm.js +0 -2
  210. package/dist/components/TechInsights/TeamComparison/MultiTrackHistoryChart.esm.js +0 -2
  211. package/dist/components/TechInsights/TeamComparison/TeamComparison.esm.js +0 -2
  212. package/dist/components/TechInsights/TeamComparison/TrackComparison.esm.js +0 -2
  213. package/dist/components/TechInsights/TeamPerformanceCard.esm.js +0 -2
  214. package/dist/components/TechInsights/TechInsightsGroupSelector.esm.js +0 -2
  215. package/dist/components/TechInsights/TechInsightsPage2.esm.js +0 -2
  216. package/dist/components/TechInsights/TechInsightsSidebar.esm.js +0 -2
  217. package/dist/components/TechInsights/TechInsightsViewSelector.esm.js +0 -2
  218. package/dist/components/TechInsights/Tiles/CheckStatusTile.esm.js +0 -2
  219. package/dist/components/TechInsights/Tiles/TileUtils.esm.js +0 -2
  220. package/dist/components/TechInsights/Tiles/TrackStatusTile.esm.js +0 -2
  221. package/dist/components/TechInsights/TopPerformingTeams.esm.js +0 -2
  222. package/dist/components/TechInsights/TrackCardGrid.esm.js +0 -2
  223. package/dist/components/TechInsights/TrackCardGridBox.esm.js +0 -2
  224. package/dist/components/TechInsights/colorContrast.esm.js +0 -2
  225. package/dist/components/TechInsights/hierarchy/GroupNode.esm.js +0 -2
  226. package/dist/components/TechInsights/hierarchy/Hierarchy.esm.js +0 -2
  227. package/dist/components/TechInsights/hierarchy/VirtualRow.esm.js +0 -2
  228. package/dist/components/TechInsights/hierarchyToNivo.esm.js +0 -2
  229. package/dist/components/TechInsights/persistence/FavoriteViews.esm.js +0 -2
  230. package/dist/components/TechInsights/styles.esm.js +0 -2
  231. package/dist/components/TrackPage/FilterBar/FilterBar.esm.js +0 -2
  232. package/dist/hooks/aggregations/useCertificationStatusHistories.esm.js +0 -2
  233. package/dist/hooks/aggregations/useCertificationStatuses.esm.js +0 -2
  234. package/dist/hooks/aggregations/useCheckStatusByGroups.esm.js +0 -2
  235. package/dist/hooks/aggregations/useCheckStatusHistories.esm.js +0 -2
  236. package/dist/hooks/aggregations/useCheckStatusHistoriesMultiFilter.esm.js +0 -2
  237. package/dist/hooks/heirarchy/useGetDescendentsOfGroups.esm.js +0 -2
  238. package/dist/hooks/heirarchy/useRootGroups.esm.js +0 -2
  239. package/dist/hooks/savedViews/useDeleteView.esm.js +0 -2
  240. package/dist/hooks/savedViews/useSaveView.esm.js +0 -2
  241. package/dist/hooks/savedViews/useSavedViews.esm.js +0 -2
  242. /package/dist/components/{TrackPage/FilterBar → FilterSidebar}/util.esm.js +0 -0
  243. /package/dist/components/{TechInsights → HierarchicalTechInsightsPage}/TeamPerformanceListCard.esm.js +0 -0
@@ -0,0 +1,2 @@
1
+ import{useState as a,useEffect as r}from"react";import{useGetEntityCount as s}from"../catalog/useGetEntityCount.esm.js";let t=null,o=null;const d=15*60*1e3;function c(){const[i,l]=a(t===null),e=t===null||(o?Date.now()-o>d:!0),{data:n,isLoading:u}=s(e);return r(()=>{!u&&n!==void 0&&(t=n,o=Date.now()),l(!1)},[n,u,e]),{entityCount:t,loading:i}}export{c as useEntityCountCached};
2
+ //# sourceMappingURL=useEntityCountCached.esm.js.map
@@ -0,0 +1,2 @@
1
+ import{useState as r,useEffect as s}from"react";import{useGetAllTracks as c}from"../tracks/useGetAllTracks.esm.js";let t=null,o=null;const i=15*60*1e3;function d(){const[a,u]=r(t===null),e=t===null||(o?Date.now()-o>i:!0),{data:n,isLoading:l}=c({},{enabled:e});return s(()=>{!l&&n!==void 0&&(t=n.totalCount,o=Date.now()),u(!1)},[n,l,e]),{trackCount:t,loading:a}}export{d as useTrackCountCached};
2
+ //# sourceMappingURL=useTrackCountCached.esm.js.map
@@ -1,2 +1,2 @@
1
- import{useApi as u,useAnalytics as m}from"@backstage/core-plugin-api";import{useQueryClient as p,useMutation as g}from"@tanstack/react-query";import{soundcheckApiRef as C}from"../../api.esm.js";import{MutationKeys as y,QueryKeys as i}from"../graphqlKeys.esm.js";import{useSoundcheckAlert as l}from"../useSoundcheckAlert.esm.js";const f="Error Creating Campaign",s="Failed to create campaign.";function d(){const o=u(C),a=p(),{showAlert:n}=l(),t=m(),c=async e=>{const r=await o.createCampaign(e);if(!r)throw new Error(s);return r};return g([y.CreateCampaign],c,{onSuccess:e=>(t.captureEvent("resource_action","Create Campaign",{attributes:{resourceType:"campaign",resourceAction:"create",resourceId:e.id,success:"true"}}),Promise.all([a.invalidateQueries({queryKey:[i.GetCampaigns]}),a.invalidateQueries({queryKey:[i.GetCampaignOwners]})])),onError:e=>{let r=s;e instanceof Error&&(r=e.message),n({severity:"error",title:f,message:r}),t.captureEvent("resource_action","Create Campaign",{attributes:{resourceType:"campaign",resourceAction:"create",success:"false"}}),t.captureEvent("error","Create Campaign",{attributes:{errorMessage:r}})}})}export{d as useCreateCampaign};
1
+ import{useApi as u,useAnalytics as m}from"@backstage/core-plugin-api";import{useQueryClient as p,useMutation as g}from"@tanstack/react-query";import{soundcheckApiRef as C}from"../../api.esm.js";import{MutationKeys as y,QueryKeys as i}from"../graphqlKeys.esm.js";import{useSoundcheckAlert as l}from"../useSoundcheckAlert.esm.js";const f="Error Creating Campaign",s="Failed to create campaign.";function d(){const o=u(C),a=p(),{showAlert:n}=l(),t=m(),c=async e=>{const r=await o.createCampaign(e);if(!r)throw new Error(s);return r};return g([y.CreateCampaign],c,{onSuccess:e=>(t.captureEvent("resource_action","Create Campaign",{attributes:{resourceType:"campaign",resourceAction:"create",resourceId:e.id,success:"true"}}),Promise.all([a.invalidateQueries({queryKey:[i.GetCampaigns],exact:!1}),a.invalidateQueries({queryKey:[i.GetCampaignOwners],exact:!1})])),onError:e=>{let r=s;e instanceof Error&&(r=e.message),n({severity:"error",title:f,message:r}),t.captureEvent("resource_action","Create Campaign",{attributes:{resourceType:"campaign",resourceAction:"create",success:"false"}}),t.captureEvent("error","Create Campaign",{attributes:{errorMessage:r}})}})}export{d as useCreateCampaign};
2
2
  //# sourceMappingURL=useCreateCampaign.esm.js.map
@@ -1,2 +1,2 @@
1
- import{useApi as i}from"@backstage/core-plugin-api";import{useQuery as n}from"@tanstack/react-query";import{soundcheckApiRef as s}from"../../api.esm.js";import{QueryKeys as m}from"../graphqlKeys.esm.js";function a(e,r,t){const o=i(s);return n([m.GetCampaigns,JSON.stringify(e)],async()=>o.getCampaigns(e,t),{staleTime:5*60*1e3,refetchInterval:!1,refetchOnWindowFocus:!1,enabled:r})}export{a as useGetCampaigns};
1
+ import{useApi as o}from"@backstage/core-plugin-api";import{useQuery as c}from"@tanstack/react-query";import{soundcheckApiRef as i}from"../../api.esm.js";import{QueryKeys as m}from"../graphqlKeys.esm.js";function s(e,n,t){const r=o(i);return c([m.GetCampaigns,e],async()=>r.getCampaigns(e,t),{staleTime:1e3*60*15,cacheTime:1e3*60*60,refetchOnWindowFocus:!1,refetchOnMount:!0,refetchOnReconnect:!1,refetchInterval:!1,enabled:n})}export{s as useGetCampaigns};
2
2
  //# sourceMappingURL=useGetCampaigns.esm.js.map
@@ -0,0 +1,2 @@
1
+ import{useApi as i}from"@backstage/core-plugin-api";import{catalogApiRef as s}from"@backstage/plugin-catalog-react";import{useQuery as m}from"@tanstack/react-query";import{useState as u}from"react";const a=(t=!1)=>{const r=i(s),[o,n]=u(0);return m(["GetEntityCount"],async()=>{if(!t)return o;const e=await r.queryEntities({limit:0});return n(e.totalItems),e.totalItems},{enabled:t,refetchOnWindowFocus:!1,refetchInterval:!1,staleTime:15*60*1e3})};export{a as useGetEntityCount};
2
+ //# sourceMappingURL=useGetEntityCount.esm.js.map
@@ -0,0 +1,2 @@
1
+ import{uniq as y}from"lodash";import{useMemo as L}from"react";import{useGetEntityRefs as t}from"./useGetEntityRefs.esm.js";const g=(i=500,e=!0,n=[])=>{const{data:s,isLoading:d}=t({kind:["Component"]},i,e&&!n.includes("Component")),{data:o,isLoading:a}=t({kind:["System"]},i,e&&!n.includes("System")),{data:m,isLoading:r}=t({kind:["Resource"]},i,e&&!n.includes("Resource")),{data:u,isLoading:c}=t({kind:["API"]},i,e&&!n.includes("API")),f=L(()=>y([...s??[],...o??[],...m??[],...u??[]]),[u,s,m,o]);return{allLoading:d&&a&&r&&c,anyLoading:d||a||r||c,entityRefs:f}};export{g as useGetLimitedEntityRefs};
2
+ //# sourceMappingURL=useGetLimitedEntityRefs.esm.js.map
@@ -1,2 +1,2 @@
1
- import{useApi as n,useAnalytics as p}from"@backstage/core-plugin-api";import{useQueryClient as d,useMutation as h}from"@tanstack/react-query";import{soundcheckApiRef as k}from"../../api.esm.js";import{MutationKeys as m,QueryKeys as t}from"../graphqlKeys.esm.js";import{useSoundcheckAlert as C}from"../useSoundcheckAlert.esm.js";const l="Error Creating Check";function y(){const u=n(k),o=d(),{showAlert:a}=C(),s=p(),i=async e=>{const r=await u.updateCheck(e);if(!r)throw new Error("Failed to update check.");return r};return h([m.UpdateCheck],i,{onSuccess:e=>{const r=[t.GetChecks,t.GetCheckOwners,t.ExecutableChecks,t.GetFacetsForOwner,t.GetTrackOverviewForOwner];return o.setQueryData([t.Check,e.id],e),s.captureEvent("resource_action","Update Check",{attributes:{resourceType:"check",resourceAction:"update",resourceId:e.id,success:"true"}}),Promise.all(r.map(c=>o.invalidateQueries({queryKey:[c]})))},onError:(e,r)=>{let c="Failed to update check.";e instanceof Error&&(c=e.message),a({severity:"error",title:l,message:c}),s.captureEvent("resource_action","Update Check",{attributes:{resourceType:"check",resourceAction:"update",resourceId:r.id,success:"false"}}),s.captureEvent("error","Update Check",{attributes:{errorMessage:c}})}})}export{y as useUpdateCheck};
1
+ import{useApi as n,useAnalytics as p}from"@backstage/core-plugin-api";import{useQueryClient as d,useMutation as h}from"@tanstack/react-query";import{soundcheckApiRef as k}from"../../api.esm.js";import{MutationKeys as l,QueryKeys as r}from"../graphqlKeys.esm.js";import{useSoundcheckAlert as C}from"../useSoundcheckAlert.esm.js";const m="Error Creating Check";function y(){const u=n(k),o=d(),{showAlert:a}=C(),s=p(),i=async e=>{const t=await u.updateCheck(e);if(!t)throw new Error("Failed to update check.");return t};return h([l.UpdateCheck],i,{onSuccess:e=>{const t=[r.GetChecks,r.GetCheckOwners,r.ExecutableChecks,r.GetFacetsForOwner,r.GetTrackOverviewForOwner,r.GetCollectors];return o.setQueryData([r.Check,e.id],e),s.captureEvent("resource_action","Update Check",{attributes:{resourceType:"check",resourceAction:"update",resourceId:e.id,success:"true"}}),Promise.all(t.map(c=>o.invalidateQueries({queryKey:[c]})))},onError:(e,t)=>{let c="Failed to update check.";e instanceof Error&&(c=e.message),a({severity:"error",title:m,message:c}),s.captureEvent("resource_action","Update Check",{attributes:{resourceType:"check",resourceAction:"update",resourceId:t.id,success:"false"}}),s.captureEvent("error","Update Check",{attributes:{errorMessage:c}})}})}export{y as useUpdateCheck};
2
2
  //# sourceMappingURL=useUpdateCheck.esm.js.map
@@ -0,0 +1,2 @@
1
+ import{useApi as l}from"@backstage/core-plugin-api";import{useQueryClient as c,useMutation as u}from"@tanstack/react-query";import{soundcheckApiRef as a}from"../../api.esm.js";import{MutationKeys as f,QueryKeys as m}from"../graphqlKeys.esm.js";import{useSoundcheckAlert as g}from"../useSoundcheckAlert.esm.js";const C=o=>{const t=l(a),i=c(),{showAlert:n}=g(),s=async()=>{const e=o?await t.deleteCollectorConfig(o):!1;if(!e)throw new Error("Failed to delete integration configuration.");return e};return u([f.DeleteCollectorConfig],s,{onSuccess:()=>i.invalidateQueries({queryKey:[m.GetCollectors]}),onError:e=>{let r=`Failed to delete config for integration: ${o}`;e instanceof Error&&(r=e.message),n({severity:"error",title:"Error Deleting Config",message:r})}})};export{C as useDeleteCollectorConfig};
2
+ //# sourceMappingURL=useDeleteCollectorConfig.esm.js.map
@@ -1,2 +1,2 @@
1
- var t=(e=>(e.GetTrack="soundcheck/track",e.GetAllTracks="soundcheck/tracks",e.GetChecks="soundcheck/checks",e.GetCollectors="soundcheck/collectors",e.GetFactSchema="soundcheck/collectors/schema",e.GetEntityFacets="soundcheck/catalog/facets",e.GetSoftwareEntityRefsForUser="soundcheck/entities/softwareEntityRefsForUser",e.GetEntityRefs="soundcheck/catalog/entityRefs",e.ExecutableChecks="soundcheck/executableChecks",e.GetCampaigns="soundcheck/campaigns",e.GetOverallCheckPassRateTrends="soundcheck/charts/overallCheckPassRateTrends",e.GetIndividualCheckPassRateTrends="soundcheck/charts/getIndividualCheckPassRateTrends",e.GetOverallTrackPassRateTrends="soundcheck/charts/overallTrackPassRateTrends",e.GetIndividualTrackPassRateTrends="soundcheck/charts/individualTrackPassRateTrends",e.GetOverallEntityPassRateTrends="soundcheck/charts/overallEntityPassRateTrends",e.GetIndividualEntityPassRateTrends="soundcheck/charts/individualEntityPassRateTrends",e.GetOverallGroupPassRateTrends="soundcheck/charts/overallGroupPassRateTrends",e.GetIndividualGroupPassRateTrends="soundcheck/charts/individualGroupPassRateTrends",e.EntityByRef="soundcheck/catalog/entityByRef",e.EntitiesByRefs="soundcheck/catalog/entitiesByRef",e.TrackEntities="soundcheck/track/entities",e.CheckEntities="soundcheck/check/entities",e.CertificationStatus="soundcheck/certificationStatus",e.CertificationStatuses="soundcheck/certificationStatuses",e.CertificationStatusHistory="soundcheck/certificationStatusHistory",e.CertificationStatusHistories="soundcheck/certificationStatusHistories",e.CheckStatus="soundcheck/checkStatus",e.CheckStatuses="soundcheck/checkStatuses",e.SavedViews="soundcheck/savedViews",e.CheckStatusHistory="soundcheck/checkStatusHistory",e.CheckStatusHistories="soundcheck/checkStatusHistories",e.CheckStatusHistoriesMultiFilter="soundcheck/checkStatusHistoriesMultiFilter",e.Check="soundcheck/check",e.CheckDetails="soundcheck/checkDetails",e.Certifications="soundcheck/certifications",e.CertificationDetails="soundcheck/certificationDetails",e.GetCheckOwners="soundcheck/checks/getOwners",e.GetTrackOwners="soundcheck/tracks/getOwners",e.GetCampaignOwners="soundcheck/campaigns/getOwners",e.GetTrackRelatedGroups="soundcheck/track/getTrackRelatedGroups",e.CheckTemplates="soundcheck/checkTemplates",e.GetFacetsForOwner="soundcheck/facets-for-owner",e.GetTrackOverviewForOwner="soundcheck/track-overview-for-owner",e.GetExemption="soundcheck/getExemption",e.GetExemptions="soundcheck/getExemptions",e.GetExemptCheckIds="soundcheck/getExemptCheckIds",e))(t||{}),s=(e=>(e.DeleteCheck="soundcheck/deleteCheck",e.CreateCheck="soundcheck/createCheck",e.UpdateCheck="soundcheck/updateCheck",e.ExecuteCheck="soundcheck/executeCheck",e.ImportChecks="soundcheck/importChecks",e.SetResult="soundcheck/setResult",e.CreateExemption="soundcheck/createExemption",e.UpdateExemption="soundcheck/updateExemption",e.DeleteExemption="soundcheck/deleteExemption",e.SaveView="soundcheck/saveView",e.DeleteTrack="soundcheck/deleteTrack",e.CreateTrack="soundcheck/createTrack",e.UpdateTrack="soundcheck/updateTrack",e.ImportTracks="soundcheck/importTracks",e.UpdateCollectorConfig="soundcheck/updateCollectorConfig",e.CreateCampaign="soundcheck/createCampaign",e.UpdateCampaign="soundcheck/updateCampaign",e.DeleteCampaign="soundcheck/deleteCampaign",e.ArchiveCampaign="soundcheck/archiveCampaign",e.SendCampaignNotification="soundcheck/sendCampaignNotification",e))(s||{});export{s as MutationKeys,t as QueryKeys};
1
+ var t=(e=>(e.GetTrack="soundcheck/track",e.GetAllTracks="soundcheck/tracks",e.GetTracksApplicableEntityCount="soundcheck/tracks/applicableEntities",e.GetChecks="soundcheck/checks",e.GetCollectors="soundcheck/collectors",e.GetFactSchema="soundcheck/collectors/schema",e.GetEntityFacets="soundcheck/catalog/facets",e.GetSoftwareEntityRefsForUser="soundcheck/entities/softwareEntityRefsForUser",e.GetEntityRefs="soundcheck/catalog/entityRefs",e.ExecutableChecks="soundcheck/executableChecks",e.GetCampaigns="soundcheck/campaigns",e.GetOverallCheckPassRateTrends="soundcheck/charts/overallCheckPassRateTrends",e.GetIndividualCheckPassRateTrends="soundcheck/charts/getIndividualCheckPassRateTrends",e.GetOverallTrackPassRateTrends="soundcheck/charts/overallTrackPassRateTrends",e.GetIndividualTrackPassRateTrends="soundcheck/charts/individualTrackPassRateTrends",e.GetOverallEntityPassRateTrends="soundcheck/charts/overallEntityPassRateTrends",e.GetIndividualEntityPassRateTrends="soundcheck/charts/individualEntityPassRateTrends",e.GetOverallGroupPassRateTrends="soundcheck/charts/overallGroupPassRateTrends",e.GetIndividualGroupPassRateTrends="soundcheck/charts/individualGroupPassRateTrends",e.EntityByRef="soundcheck/catalog/entityByRef",e.EntitiesByRefs="soundcheck/catalog/entitiesByRef",e.TrackEntities="soundcheck/track/entities",e.CheckEntities="soundcheck/check/entities",e.CertificationStatus="soundcheck/certificationStatus",e.CertificationStatuses="soundcheck/certificationStatuses",e.MultipleTrackStatuses="soundcheck/multipleTrackStatuses",e.CertificationStatusHistory="soundcheck/certificationStatusHistory",e.CertificationStatusHistories="soundcheck/certificationStatusHistories",e.CheckStatus="soundcheck/checkStatus",e.CheckStatuses="soundcheck/checkStatuses",e.SavedViews="soundcheck/savedViews",e.CheckStatusHistory="soundcheck/checkStatusHistory",e.CheckStatusHistories="soundcheck/checkStatusHistories",e.CheckStatusHistoriesMultiFilter="soundcheck/checkStatusHistoriesMultiFilter",e.TrackStatusHistory="soundcheck/trackStatusHistory",e.TrackStatusHistories="soundcheck/trackStatusHistories",e.Check="soundcheck/check",e.CheckDetails="soundcheck/checkDetails",e.Certifications="soundcheck/certifications",e.CertificationDetails="soundcheck/certificationDetails",e.GetCheckOwners="soundcheck/checks/getOwners",e.GetTrackOwners="soundcheck/tracks/getOwners",e.GetCampaignOwners="soundcheck/campaigns/getOwners",e.GetTrackRelatedGroups="soundcheck/track/getTrackRelatedGroups",e.CheckTemplates="soundcheck/checkTemplates",e.GetFacetsForOwner="soundcheck/facets-for-owner",e.GetTrackOverviewForOwner="soundcheck/track-overview-for-owner",e.GetExemption="soundcheck/getExemption",e.GetExemptions="soundcheck/getExemptions",e.GetExemptCheckIds="soundcheck/getExemptCheckIds",e))(t||{}),s=(e=>(e.DeleteCheck="soundcheck/deleteCheck",e.CreateCheck="soundcheck/createCheck",e.UpdateCheck="soundcheck/updateCheck",e.ExecuteCheck="soundcheck/executeCheck",e.ImportChecks="soundcheck/importChecks",e.SetResult="soundcheck/setResult",e.CreateExemption="soundcheck/createExemption",e.UpdateExemption="soundcheck/updateExemption",e.DeleteExemption="soundcheck/deleteExemption",e.SaveView="soundcheck/saveView",e.DeleteTrack="soundcheck/deleteTrack",e.CreateTrack="soundcheck/createTrack",e.UpdateTrack="soundcheck/updateTrack",e.ImportTracks="soundcheck/importTracks",e.UpdateCollectorConfig="soundcheck/updateCollectorConfig",e.DeleteCollectorConfig="soundcheck/deleteCollectorConfig",e.CreateCampaign="soundcheck/createCampaign",e.UpdateCampaign="soundcheck/updateCampaign",e.DeleteCampaign="soundcheck/deleteCampaign",e.ArchiveCampaign="soundcheck/archiveCampaign",e.SendCampaignNotification="soundcheck/sendCampaignNotification",e))(s||{});export{s as MutationKeys,t as QueryKeys};
2
2
  //# sourceMappingURL=graphqlKeys.esm.js.map
@@ -1,2 +1,2 @@
1
- import{stringifyEntityRef as n}from"@backstage/catalog-model";import{useApi as t,configApiRef as p}from"@backstage/core-plugin-api";import{catalogApiRef as s}from"@backstage/plugin-catalog-react";import{getGroupFilterFromConfig as f,combineEntityFilterQueries as l}from"@spotify/backstage-plugin-soundcheck-common";import{useQuery as c}from"@tanstack/react-query";function u(){const i=t(s),r=t(p);return c(["soundcheck/all-groups"],async()=>{const a=f(r),o=l({kind:"Group"},a),{items:m}=await i.getEntities({filter:o,fields:["spec.profile.displayName","metadata.title","metadata.name","metadata.namespace","kind"]});return m.filter(e=>e?.kind==="Group").map(e=>({name:e.spec?.profile?.displayName??e.metadata.title??e.metadata.name,ref:n(e)}))},{staleTime:5*60*1e3,refetchInterval:!1,refetchOnWindowFocus:!1})}export{u as useAllGroups};
1
+ import{stringifyEntityRef as m}from"@backstage/catalog-model";import{useApi as t,configApiRef as n}from"@backstage/core-plugin-api";import{catalogApiRef as s}from"@backstage/plugin-catalog-react";import{getGroupFilterFromConfig as f,combineEntityFilterQueries as l}from"@spotify/backstage-plugin-soundcheck-common";import{useQuery as c}from"@tanstack/react-query";function u(){const i=t(s),r=t(n);return c(["soundcheck/all-groups"],async()=>{const a=f(r),o=l({kind:"Group"},a),{items:p}=await i.getEntities({filter:o,fields:["spec.profile.displayName","metadata.title","metadata.name","metadata.namespace","kind","spec.type"]});return p.filter(e=>e?.kind==="Group").map(e=>({name:e.spec?.profile?.displayName??e.metadata.title??e.metadata.name,ref:m(e),type:e.spec?.type}))},{staleTime:5*60*1e3,refetchInterval:!1,refetchOnWindowFocus:!1})}export{u as useAllGroups};
2
2
  //# sourceMappingURL=useAllGroups.esm.js.map
@@ -1,2 +1,2 @@
1
- import{useMemo as u}from"react";import"@backstage/catalog-model";import"@backstage/core-plugin-api";import"@tanstack/react-query";import"../../api.esm.js";import"../graphqlKeys.esm.js";import{useAllGroups as f}from"./useAllGroups.esm.js";import{useUsersGroupClaims as l}from"./useUsersGroupClaims.esm.js";import"../useSoundcheckAlert.esm.js";import"../useConfirmationModal.esm.js";import"react-router-dom";const c=()=>{const{data:s,isLoading:i,isError:p}=l(),{data:t,isLoading:m,isError:a}=f();return{options:u(()=>{const o=new Map;return s&&s.forEach(({name:e,ref:r,type:n})=>{o.set(`${r}`,{name:e,ref:r,type:n,key:"My Groups"})}),t&&t.forEach(({name:e,ref:r})=>{o.has(`${r}`)||o.set(`${r}`,{name:e,ref:r,key:"All Groups"})}),[...o.values()]},[s,t]),isLoading:i||m,isError:p||a}};export{c as useGroupOptions};
1
+ import{useMemo as u}from"react";import"@backstage/catalog-model";import"@backstage/core-plugin-api";import"@tanstack/react-query";import"../../api.esm.js";import"../graphqlKeys.esm.js";import{useAllGroups as f}from"./useAllGroups.esm.js";import{useUsersGroupClaims as y}from"./useUsersGroupClaims.esm.js";import"../useSoundcheckAlert.esm.js";import"../useConfirmationModal.esm.js";import"react-router-dom";const l=()=>{const{data:e,isLoading:i,isError:m}=y(),{data:t,isLoading:a,isError:n}=f();return{options:u(()=>{const o=new Map;return e&&e.forEach(({name:s,ref:r,type:p})=>{o.set(`${r}`,{name:s,ref:r,type:p,key:"My Groups"})}),t&&t.forEach(({name:s,ref:r,type:p})=>{o.has(`${r}`)||o.set(`${r}`,{name:s,ref:r,type:p,key:"All Groups"})}),[...o.values()]},[e,t]),isLoading:i||a,isError:m||n}};export{l as useGroupOptions};
2
2
  //# sourceMappingURL=useGroupOptions.esm.js.map
@@ -0,0 +1,2 @@
1
+ import{useApi as T}from"@backstage/core-plugin-api";import{useQueryClient as A,useQueries as L}from"@tanstack/react-query";import{useMemo as c,useState as S,useEffect as k}from"react";import{soundcheckApiRef as q}from"../../api.esm.js";const I=({trackIds:d,groupRef:o,batchSize:n=4,skip:u})=>{const h=T(q),f=A(),s=c(()=>[...d].sort(),[d]),g=c(()=>{const r=[];for(let a=0;a<s.length;a+=n)r.push(s.slice(a,a+n));return r},[s,n]),y=c(()=>g.map((r,a)=>({queryKey:["hierarchicalTrackStatuses",r,o,a],queryFn:async()=>await h.getHierarchicalTrackStatuses(r,o),enabled:!u&&r.length>0,staleTime:1e3*60*60,cacheTime:1e3*60*60*4,refetchOnWindowFocus:!1,refetchOnMount:!1,refetchOnReconnect:!1,refetchInterval:0})),[g,o,u,h]),t=L({queries:y}),[i,p]=S({loadedTracks:0,totalTracks:s.length,isLoading:!1,error:null}),m=c(()=>t.map(r=>[r.isLoading,r.error,Array.isArray(r.data)?r.data.length:0].join(":")).join("|"),[t]);return k(()=>{let r=0,a=!1,l=null;for(const e of t)e.isLoading&&(a=!0),e.error&&(l=e.error),e.data&&Array.isArray(e.data)&&(r+=e.data.length);p(e=>e.loadedTracks===r&&e.totalTracks===s.length&&e.isLoading===a&&e.error===l?e:{loadedTracks:r,totalTracks:s.length,isLoading:a,error:l})},[t,m,s.length]),k(()=>{for(const r of t)if(r.data&&Array.isArray(r.data))for(const a of r.data)f.setQueryData(["hierarchicalTrackStatus",a.trackId,o],a)},[t,f,o]),{data:c(()=>{if(t.length===0)return[];const r=[];for(const a of t)a.data&&Array.isArray(a.data)&&r.push(...a.data);return r},[t]),isLoading:i.isLoading,progress:i,error:i.error}};export{I as useBatchedHierarchicalTrackStatuses};
2
+ //# sourceMappingURL=useBatchedHierarchicalTrackStatuses.esm.js.map
@@ -1,2 +1,2 @@
1
- import{useApi as i}from"@backstage/core-plugin-api";import{useQuery as u}from"@tanstack/react-query";import{soundcheckApiRef as c}from"../../api.esm.js";const t=(e,r)=>{const o=i(c);return u({queryKey:["groupHierarchy",e],queryFn:async()=>(await o.getGroupHierarchy(e)).hierarchy,staleTime:60*60*1e3,refetchOnWindowFocus:!1,enabled:r?.enabled??!0})};export{t as useGroupHierarchy};
1
+ import{useApi as n}from"@backstage/core-plugin-api";import{useQuery as i}from"@tanstack/react-query";import{soundcheckApiRef as c}from"../../api.esm.js";const o=(r,e)=>{const t=n(c);return i({queryKey:["groupHierarchy",r,e?.ownedEntitiesFilter,!!e?.includeParent],queryFn:async()=>(await t.getGroupHierarchy(r,e?.ownedEntitiesFilter,e?.includeParent)).hierarchy,staleTime:1e3*60*60,cacheTime:1e3*60*60*4,refetchOnWindowFocus:!1,refetchOnMount:!1,refetchOnReconnect:!1,refetchInterval:!1})};export{o as useGroupHierarchy};
2
2
  //# sourceMappingURL=useGroupHierarchy.esm.js.map
@@ -0,0 +1,2 @@
1
+ import{useApi as r}from"@backstage/core-plugin-api";import{useQuery as c}from"@tanstack/react-query";import{soundcheckApiRef as o}from"../../api.esm.js";const t=()=>{const e=r(o);return c({queryKey:["groupTypeHierarchy"],queryFn:async()=>(await e.getGroupTypeHierarchy()).hierarchy,staleTime:1e3*60*60,cacheTime:1e3*60*60*4,refetchOnWindowFocus:!1,refetchOnMount:!1,refetchOnReconnect:!1,refetchInterval:!1})};export{t as useGroupTypeHierarchy};
2
+ //# sourceMappingURL=useGroupTypeHierarchy.esm.js.map
@@ -1,2 +1,2 @@
1
- import{useApi as a}from"@backstage/core-plugin-api";import{useQuery as i}from"@tanstack/react-query";import{soundcheckApiRef as o}from"../../api.esm.js";const n=({trackId:e,groupRef:r,skip:c})=>{const t=a(o);return i({queryKey:["hierarchicalTrackStatus",e,r],queryFn:async()=>await t.getHierarchicalTrackStatus(e,r),enabled:!c,staleTime:1e3*60*15,cacheTime:1e3*60*60,refetchOnWindowFocus:!1,refetchOnMount:!1,refetchOnReconnect:!1})};export{n as useHierarchicalTrackStatus};
1
+ import{useApi as a}from"@backstage/core-plugin-api";import{useQuery as i}from"@tanstack/react-query";import{soundcheckApiRef as n}from"../../api.esm.js";const o=({trackId:e,groupRef:r,skip:t})=>{const c=a(n);return i({queryKey:["hierarchicalTrackStatus",e,r],queryFn:async()=>!e||!r?null:await c.getHierarchicalTrackStatus(e,r),enabled:!t,staleTime:1e3*60*60,cacheTime:1e3*60*60*4,refetchOnWindowFocus:!1,refetchOnMount:!1,refetchOnReconnect:!1,refetchInterval:!1})};export{o as useHierarchicalTrackStatus};
2
2
  //# sourceMappingURL=useHierarchicalTrackStatus.esm.js.map
@@ -1,2 +1,2 @@
1
- import{useApi as i,useAnalytics as k}from"@backstage/core-plugin-api";import{useQueryClient as l,useMutation as T}from"@tanstack/react-query";import{soundcheckApiRef as m}from"../../api.esm.js";import{MutationKeys as p,QueryKeys as t}from"../graphqlKeys.esm.js";import{useSoundcheckAlert as d}from"../useSoundcheckAlert.esm.js";const y="Error Creating Track";function f(){const c=i(m),s=l(),{showAlert:o}=d(),a=k(),n=async r=>{const e=await c.createTrack(r);if(!e)throw new Error("Failed to create track.");return e};return T([p.CreateTrack],n,{onSuccess:r=>{a.captureEvent("resource_action","Create Track",{attributes:{resourceType:"track",resourceAction:"create",resourceId:r.id,success:"true"}});const e=[t.GetAllTracks,t.GetOverallTrackPassRateTrends,t.GetIndividualTrackPassRateTrends,t.GetTrackOwners,t.GetFacetsForOwner,t.GetTrackOverviewForOwner];return Promise.all(e.map(u=>s.invalidateQueries({queryKey:[u]})))},onError:r=>{let e="Failed to create track.";r instanceof Error&&(e=r.message),o({severity:"error",title:y,message:e}),a.captureEvent("resource_action","Create Track",{attributes:{resourceType:"track",resourceAction:"create",success:"false"}}),a.captureEvent("error","Create Track",{attributes:{errorMessage:e}})}})}export{f as useCreateTrack};
1
+ import{useApi as i,useAnalytics as k}from"@backstage/core-plugin-api";import{useQueryClient as l,useMutation as T}from"@tanstack/react-query";import{soundcheckApiRef as m}from"../../api.esm.js";import{MutationKeys as p,QueryKeys as t}from"../graphqlKeys.esm.js";import{useSoundcheckAlert as d}from"../useSoundcheckAlert.esm.js";const y="Error Creating Track";function f(){const c=i(m),s=l(),{showAlert:o}=d(),a=k(),n=async r=>{const e=await c.createTrack(r);if(!e)throw new Error("Failed to create track.");return e};return T([p.CreateTrack],n,{onSuccess:r=>{a.captureEvent("resource_action","Create Track",{attributes:{resourceType:"track",resourceAction:"create",resourceId:r.id,success:"true"}});const e=[t.GetAllTracks,t.GetOverallTrackPassRateTrends,t.GetIndividualTrackPassRateTrends,t.GetTrackOwners,t.GetFacetsForOwner,t.GetTrackOverviewForOwner];return Promise.all(e.map(u=>s.invalidateQueries({queryKey:[u],exact:!1})))},onError:r=>{let e="Failed to create track.";r instanceof Error&&(e=r.message),o({severity:"error",title:y,message:e}),a.captureEvent("resource_action","Create Track",{attributes:{resourceType:"track",resourceAction:"create",success:"false"}}),a.captureEvent("error","Create Track",{attributes:{errorMessage:e}})}})}export{f as useCreateTrack};
2
2
  //# sourceMappingURL=useCreateTrack.esm.js.map
@@ -1,2 +1,2 @@
1
- import{useApi as n}from"@backstage/core-plugin-api";import{useQueryClient as c,useQuery as f}from"@tanstack/react-query";import{useEffect as i}from"react";import{soundcheckApiRef as u}from"../../api.esm.js";import{QueryKeys as a}from"../graphqlKeys.esm.js";function m(r,d){const s=n(u),t=c(),e=f([a.GetAllTracks,r],async()=>s.getTracks(r),{staleTime:5*60*1e3,refetchInterval:!1,refetchOnWindowFocus:!1,enabled:!0});return i(()=>{if(e.data)for(const o of e.data.edges)t.setQueryData([a.GetTrack,o.node.id],o.node)},[e.data,t]),e}export{m as useGetAllTracks};
1
+ import{useApi as s}from"@backstage/core-plugin-api";import{useQueryClient as f,useQuery as i}from"@tanstack/react-query";import{useEffect as u}from"react";import{soundcheckApiRef as m}from"../../api.esm.js";import{QueryKeys as c}from"../graphqlKeys.esm.js";function d(r,n){const a=s(m),t=f(),e=i([c.GetAllTracks,r],async()=>a.getTracks(r),{staleTime:1e3*60*15,cacheTime:1e3*60*60,refetchOnWindowFocus:!1,refetchOnMount:!0,refetchOnReconnect:!1,refetchInterval:!1,enabled:n?.enabled??!0});return u(()=>{if(e.data)for(const o of e.data.edges)t.setQueryData([c.GetTrack,o.node.id],o.node)},[e.data,t]),e}export{d as useGetAllTracks};
2
2
  //# sourceMappingURL=useGetAllTracks.esm.js.map
@@ -0,0 +1,2 @@
1
+ import{useApi as o}from"@backstage/core-plugin-api";import{useQuery as i}from"@tanstack/react-query";import{soundcheckApiRef as c}from"../../api.esm.js";import{QueryKeys as u}from"../graphqlKeys.esm.js";function p(e,t={},r){const n=o(c);return i({queryKey:[u.GetTracksApplicableEntityCount,t,e],queryFn:async()=>n.getTracksApplicableEntityCount(t,e??""),staleTime:5*60*1e3,refetchInterval:!1,refetchOnWindowFocus:!1,enabled:!!e&&(r?.enabled??!0)})}export{p as useGetTracksApplicableEntityCount};
2
+ //# sourceMappingURL=useGetTracksApplicableEntityCount.esm.js.map
@@ -0,0 +1,2 @@
1
+ import{parseEntityRef as G}from"@backstage/catalog-model";import{useMemo as o}from"react";import{useGetCampaigns as L}from"../campaigns/useGetCampaigns.esm.js";import{useGetAllTracks as E}from"./useGetAllTracks.esm.js";import{useGetTracksApplicableEntityCount as T}from"./useGetTracksApplicableEntityCount.esm.js";function A(r){if(!r||r.trim()==="")return!1;try{return G(r).kind.toLowerCase()==="group"}catch{return!1}}function M(r,h={},k){const n=A(r)&&(k?.enabled??!0),{data:d,isLoading:s,error:m}=E(h,{enabled:n}),{data:p,isLoading:l,error:c}=L({},n),u=o(()=>p?.edges?new Set(p.edges.filter(({node:e})=>e.archived).map(({node:e})=>e.track.id)):new Set,[p]),i=o(()=>d?.edges?d.edges.map(({node:e})=>e).filter(e=>!u.has(e.id)).filter(e=>!e.draft).sort((e,a)=>e.id.localeCompare(a.id)):[],[d,u]),{data:t,isLoading:f,error:g}=T(r,{ids:i.map(e=>e.id)},{enabled:n&&i.length>0&&!s&&!l}),b=o(()=>t?new Map(t.map(e=>[e.id,e.applicableEntityCount])):new Map,[t]),w=o(()=>t?i.filter(e=>{const a=b.get(e.id);return a!==void 0&&a>0}):[],[i,b,t]),y=o(()=>s||l||f||!!r&&!t&&i.length>0,[s,l,f,r,t,i.length]),C=o(()=>m||c||g,[m,c,g]);return{tracks:w,counts:t,isLoading:y,error:C}}export{M as useTracksApplicableToGroup};
2
+ //# sourceMappingURL=useTracksApplicableToGroup.esm.js.map
@@ -1,2 +1,2 @@
1
- import{useApi as e,configApiRef as n}from"@backstage/core-plugin-api";function r(i){return(e(n).getOptionalStringArray("soundcheck.flags")||[]).includes(i)}export{r as default};
1
+ import{useApi as i,configApiRef as o}from"@backstage/core-plugin-api";const r=e=>(i(o).getOptionalStringArray("soundcheck.flags")||[]).includes(e);export{r as useFeatureFlag};
2
2
  //# sourceMappingURL=useFeatureFlag.esm.js.map
@@ -0,0 +1,2 @@
1
+ import{useAnalytics as s,useApi as p}from"@backstage/core-plugin-api";import{useRef as m,useEffect as f}from"react";import{useLocation as l}from"react-router-dom";import{soundcheckApiRef as h}from"../api.esm.js";import{createLCPReporter as d}from"../utils/lcpReporting.esm.js";function A(c={}){const{enabled:n=!0,routeName:u,additionalAttributes:o}=c,t=s(),e=l(),r=m(null),a=p(h);return f(()=>{if(!n||!t)return;const i=u||e.pathname;return r.current&&(r.current.stopMeasuring(),r.current=null),performance.clearResourceTimings(),r.current=d({analytics:t,routeName:i,additionalAttributes:{pathname:e.pathname,search:e.search,...o},soundcheckApi:a}),r.current.startMeasuring(),()=>{r.current&&(r.current.stopMeasuring(),r.current=null)}},[n,t,e.pathname,e.search,u,o,a]),{reporter:r.current}}export{A as useLCPReporting};
2
+ //# sourceMappingURL=useLCPReporting.esm.js.map
package/dist/index.d.ts CHANGED
@@ -79,16 +79,15 @@ declare const SoundcheckRoutingPage: (props: OverviewPageProps) => JSX.Element;
79
79
  */
80
80
  declare const IntegrationPageBlueprint: _backstage_frontend_plugin_api.ExtensionBlueprint<{
81
81
  kind: "integration";
82
- name: undefined;
83
82
  params: {
84
83
  integrationId: string;
85
84
  loader: () => Promise<JSX.Element>;
86
85
  path?: string;
87
86
  routeRef?: RouteRef;
88
87
  };
89
- output: _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<react.JSX.Element, "core.reactElement", {}> | _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<string, "core.routing.path", {}> | _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<string, "soundcheck.integrationId", {}> | _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<RouteRef<_backstage_frontend_plugin_api.AnyRouteRefParams>, "core.routing.ref", {
88
+ output: _backstage_frontend_plugin_api.ExtensionDataRef<string, "core.routing.path", {}> | _backstage_frontend_plugin_api.ExtensionDataRef<react.JSX.Element, "core.reactElement", {}> | _backstage_frontend_plugin_api.ExtensionDataRef<RouteRef<_backstage_frontend_plugin_api.AnyRouteRefParams>, "core.routing.ref", {
90
89
  optional: true;
91
- }>;
90
+ }> | _backstage_frontend_plugin_api.ExtensionDataRef<string, "soundcheck.integrationId", {}>;
92
91
  inputs: {};
93
92
  config: {};
94
93
  configInput: {};
@@ -125,6 +124,9 @@ declare function useGetCollectors(collectorIds?: string[]): _tanstack_react_quer
125
124
  __typename?: "Checker";
126
125
  id: string;
127
126
  name?: string | null;
127
+ description?: string | null;
128
+ rule?: any | null;
129
+ schedule?: any | null;
128
130
  }> | null;
129
131
  }[], unknown>;
130
132
 
package/dist/index.esm.js CHANGED
@@ -1,2 +1,2 @@
1
- import{EntitySoundcheckCard as m,EntitySoundcheckContent as d,GroupSoundcheckContent as g,SoundcheckOverviewPage as a,SoundcheckRoutingPage as h,soundcheckPlugin as k}from"./plugin.esm.js";import"react/jsx-runtime";import"./components/SoundcheckQueryClientProvider/SoundcheckQueryClientProvider.esm.js";import"./components/EntitySoundcheckCard/Card.esm.js";import{IntegrationPageBlueprint as C}from"./blueprints/IntegrationPageBlueprint.esm.js";import{useGetCollectors as S}from"./hooks/collectors/useGetCollectors.esm.js";import{useUpdateCollectorConfig as x}from"./hooks/collectors/useUpdateCollectorConfig.esm.js";import"@backstage/core-plugin-api";import"@tanstack/react-query";import"./api.esm.js";import"./hooks/graphqlKeys.esm.js";export{m as EntitySoundcheckCard,d as EntitySoundcheckContent,g as GroupSoundcheckContent,C as IntegrationPageBlueprint,a as SoundcheckOverviewPage,h as SoundcheckRoutingPage,k as soundcheckPlugin,S as useGetCollectors,x as useUpdateCollectorConfig};
1
+ import{EntitySoundcheckCard as d,EntitySoundcheckContent as g,GroupSoundcheckContent as a,SoundcheckOverviewPage as h,SoundcheckRoutingPage as k,soundcheckPlugin as l}from"./plugin.esm.js";import"react/jsx-runtime";import"./components/SoundcheckQueryClientProvider/SoundcheckQueryClientProvider.esm.js";import"./components/EntitySoundcheckCard/Card.esm.js";import{IntegrationPageBlueprint as f}from"./blueprints/IntegrationPageBlueprint.esm.js";import{useGetCollectors as s}from"./hooks/collectors/useGetCollectors.esm.js";import{useUpdateCollectorConfig as P}from"./hooks/collectors/useUpdateCollectorConfig.esm.js";import"@backstage/core-plugin-api";import"@tanstack/react-query";import"./api.esm.js";import"./hooks/graphqlKeys.esm.js";import"./hooks/useSoundcheckAlert.esm.js";export{d as EntitySoundcheckCard,g as EntitySoundcheckContent,a as GroupSoundcheckContent,f as IntegrationPageBlueprint,h as SoundcheckOverviewPage,k as SoundcheckRoutingPage,l as soundcheckPlugin,s as useGetCollectors,P as useUpdateCollectorConfig};
2
2
  //# sourceMappingURL=index.esm.js.map
@@ -1,2 +1,2 @@
1
- import{createRouteRef as a,createSubRouteRef as e}from"@backstage/core-plugin-api";const c=a({id:"soundcheck-entity"}),i=a({id:"soundcheck-group"}),r=e({id:"soundcheck-entity-certification-track-redirect",parent:c,path:"/tracks/:trackId"}),n=e({id:"soundcheck-entity-certification",parent:c,path:"/tracks/:trackId/checks/:checkId"}),s=e({id:"soundcheck-entity-playlist-redirect",parent:c,path:"/playlists/:playlistId"}),d=e({id:"soundcheck-entity-playlist-track-redirect",parent:c,path:"/playlists/:playlistId/tracks/:trackId"}),k=e({id:"soundcheck-entity-playlist-track-redirect",parent:c,path:"/playlists/:playlistId/tracks/:trackId/checks/:checkId"}),t=a({id:"soundcheck"}),h=e({id:"soundcheck-quickstart",parent:t,path:"/quickstart"}),o=e({id:"soundcheck-checks",parent:t,path:"/checks"}),p=e({id:"soundcheck-check-details",parent:t,path:"/checks/:checkId"}),u=e({id:"soundcheck-check-edit",parent:t,path:"/checks/:checkId/edit"}),R=e({id:"soundcheck-check-create",parent:t,path:"/checks/create"}),l=e({id:"soundcheck-check-templates",parent:t,path:"/checks/templates"}),f=e({id:"soundcheck-tracks",parent:t,path:"/tracks"}),g=e({id:"soundcheck-track-details",parent:t,path:"/tracks/:trackId"}),m=e({id:"soundcheck-track-edit",parent:t,path:"/tracks/:trackId/edit"}),y=e({id:"soundcheck-track-create",parent:t,path:"/tracks/create"}),I=e({id:"soundcheck-track-check-details",parent:t,path:"/tracks/:trackId/checks/:checkId"}),P=e({id:"soundcheck-campaigns",parent:t,path:"/campaigns"}),C=e({id:"soundcheck-campaign-details",parent:t,path:"/campaigns/:campaignId"}),D=e({id:"soundcheck-campaign-edit",parent:t,path:"/campaigns/:campaignId/edit"}),T=e({id:"soundcheck-campaign-create",parent:t,path:"/campaigns/create"});e({id:"soundcheck-tech-health",parent:t,path:"/tech-health"});const q=e({id:"soundcheck-integrations-page",parent:t,path:"/integrations"}),E=e({id:"soundcheck-integration-details",parent:t,path:"/integrations/:integrationId"});export{T as campaignCreateRouteRef,C as campaignDetailsRouteRef,D as campaignEditRouteRef,P as campaignsPageRouteRef,s as certificationPlaylistRouteRef,k as certificationPlaylistTrackCheckRouteRef,d as certificationPlaylistTrackRouteRef,n as certificationRouteRef,r as certificationTrackRouteRef,R as checkCreateRouteRef,p as checkDetailsRouteRef,u as checkEditRouteRef,l as checkTemplatesRouteRef,o as checksPageRouteRef,c as entityRootRouteRef,i as groupRootRouteRef,E as integrationDetailsRouteRef,q as integrationsPageRouteRef,h as quickstartRouteRef,t as rootRouteRef,I as trackCheckDetailsRouteRef,y as trackCreateRouteRef,g as trackDetailsRouteRef,m as trackEditRouteRef,f as tracksPageRouteRef};
1
+ import{createRouteRef as a,createSubRouteRef as t}from"@backstage/core-plugin-api";const c=a({id:"soundcheck-entity"}),i=a({id:"soundcheck-group"}),n=t({id:"soundcheck-entity-certification-track-redirect",parent:c,path:"/tracks/:trackId"}),s=t({id:"soundcheck-entity-certification",parent:c,path:"/tracks/:trackId/checks/:checkId"}),r=t({id:"soundcheck-entity-playlist-redirect",parent:c,path:"/playlists/:playlistId"}),h=t({id:"soundcheck-entity-playlist-track-redirect",parent:c,path:"/playlists/:playlistId/tracks/:trackId"}),d=t({id:"soundcheck-entity-playlist-track-redirect",parent:c,path:"/playlists/:playlistId/tracks/:trackId/checks/:checkId"}),e=a({id:"soundcheck"}),k=t({id:"soundcheck-quickstart",parent:e,path:"/quickstart"}),o=t({id:"soundcheck-checks",parent:e,path:"/checks"}),p=t({id:"soundcheck-check-details",parent:e,path:"/checks/:checkId"}),u=t({id:"soundcheck-check-edit",parent:e,path:"/checks/:checkId/edit"}),R=t({id:"soundcheck-check-create",parent:e,path:"/checks/create"}),g=t({id:"soundcheck-check-templates",parent:e,path:"/checks/templates"}),l=t({id:"soundcheck-tracks",parent:e,path:"/tracks"}),f=t({id:"soundcheck-track-details",parent:e,path:"/tracks/:trackId"}),I=t({id:"soundcheck-track-edit",parent:e,path:"/tracks/:trackId/edit"}),m=t({id:"soundcheck-track-create",parent:e,path:"/tracks/create"}),y=t({id:"soundcheck-track-check-details",parent:e,path:"/tracks/:trackId/checks/:checkId"}),P=t({id:"soundcheck-campaigns",parent:e,path:"/campaigns"}),C=t({id:"soundcheck-campaign-details",parent:e,path:"/campaigns/:campaignId"}),D=t({id:"soundcheck-campaign-edit",parent:e,path:"/campaigns/:campaignId/edit"}),T=t({id:"soundcheck-campaign-create",parent:e,path:"/campaigns/create"}),E=t({id:"soundcheck-tech-health",parent:e,path:"/tech-health"}),q=t({id:"soundcheck-tech-insights",parent:e,path:"/tech-insights"}),b=t({id:"soundcheck-integrations-page",parent:e,path:"/integrations"}),x=t({id:"soundcheck-integration-details",parent:e,path:"/integrations/:integrationId"}),H=t({id:"soundcheck-integration-edit",parent:e,path:"/integrations/:integrationId/edit"});t({id:"soundcheck-tech-insights-tracks",parent:e,path:"/tech-insights/tracks"});const S=t({id:"soundcheck-tech-insights-track",parent:e,path:"/tech-insights/track"});export{T as campaignCreateRouteRef,C as campaignDetailsRouteRef,D as campaignEditRouteRef,P as campaignsPageRouteRef,r as certificationPlaylistRouteRef,d as certificationPlaylistTrackCheckRouteRef,h as certificationPlaylistTrackRouteRef,s as certificationRouteRef,n as certificationTrackRouteRef,R as checkCreateRouteRef,p as checkDetailsRouteRef,u as checkEditRouteRef,g as checkTemplatesRouteRef,o as checksPageRouteRef,c as entityRootRouteRef,i as groupRootRouteRef,x as integrationDetailsRouteRef,H as integrationEditRouteRef,b as integrationsPageRouteRef,k as quickstartRouteRef,e as rootRouteRef,E as techHealthRouteRef,q as techInsightsPageRouteRef,S as techInsightsTrackRouteRef,y as trackCheckDetailsRouteRef,m as trackCreateRouteRef,f as trackDetailsRouteRef,I as trackEditRouteRef,l as tracksPageRouteRef};
2
2
  //# sourceMappingURL=routes.esm.js.map
@@ -1,2 +1,2 @@
1
- import{lighten as t}from"@material-ui/core";import{interpolateRgb as a}from"d3-interpolate";import{scaleLinear as n}from"d3-scale";const i=(e,r)=>n().domain([0,50,100]).range([e.palette.error.main,e.palette.warning.main,e.palette.success.main]).interpolate(a.gamma(2.2))(r),o=(e,r)=>{switch(r){case"passed":return e.palette.success.main;case"failed":return e.palette.error.main;case"warning":return e.palette.warning.main;case"error":return t(e.palette.error.main,.2);case"exempt":return e.palette.info.main;case"not-applicable":return e.palette.grey[500];case"not-reported":return e.palette.grey[700];default:return"inherit"}};export{o as getCheckStatusColor,i as getPercentageColor};
1
+ import{lighten as x}from"@material-ui/core";import{sequentialColorInterpolators as n}from"@nivo/colors";import{rgb as p}from"d3-color";import{interpolateRgb as b}from"d3-interpolate";import{scaleLinear as w}from"d3-scale";const h=(e,t)=>w().domain([0,50,100]).range([e.palette.error.main,e.palette.warning.main,e.palette.success.main]).interpolate(b.gamma(2.2))(t),k=(e,t)=>{switch(t){case"passed":return e.palette.success.main;case"failed":return e.palette.error.main;case"warning":return e.palette.warning.main;case"error":return x(e.palette.error.main,.2);case"exempt":return e.palette.info.main;case"not-applicable":return e.palette.grey[500];case"not-reported":return e.palette.grey[700];default:return"inherit"}},v=e=>{const t=p(e.formatHex());if(!t)return 0;const r=i=>{const l=i/255;return l<=.03928?l/12.92:Math.pow((l+.055)/1.055,2.4)},a=r(t.r),o=r(t.g),c=r(t.b);return .2126*a+.7152*o+.0722*c},d=(e,t)=>{const r=v(p(e))+.05,a=v(p(t))+.05;return r>a?r/a:a/r},D=(e,t=4.5,r=10,a=.5)=>{const o=p(e);if(!o)return"#222";const c=v(o)>.5;let i=o,l={color:o.formatHex(),ratio:0};for(let s=1;s<=r;s++){i=c?o.darker(s*a):o.brighter(s*a);const f=i.formatHex(),g=d(e,f);if(g>l.ratio&&(l={color:f,ratio:g}),g>=t)return f}const u=d(e,"#000"),m=d(e,"#fff");return u>=t&&u>m?"#000":m>=t&&m>u?"#fff":l.color},C=e=>[{label:"Default",value:"default",interpolator:t=>b(e.palette.error.main,e.palette.success.main)(t)},{label:"Black Green",value:"black_green",interpolator:t=>b("#000000","#1DB954")(t)},{label:"Stoplight",value:"stoplight",interpolator:t=>h(e,t*100)},{label:"Viridis",value:"viridis",interpolator:n.viridis},{label:"Inferno",value:"inferno",interpolator:n.inferno},{label:"Plasma",value:"plasma",interpolator:n.plasma},{label:"Cividis",value:"cividis",interpolator:n.cividis},{label:"Warm",value:"warm",interpolator:n.warm},{label:"Cool",value:"cool",interpolator:n.cool},{label:"Cubehelix Default",value:"cubehelix_default",interpolator:n.cubehelixDefault}],I=(e,t)=>C(e).find(r=>r.value===t)?.interpolator??(r=>"#ccc");export{k as getCheckStatusColor,I as getColorInterpolator,C as getColorInterpolators,D as getContrastTextColor,h as getPercentageColor};
2
2
  //# sourceMappingURL=colors.esm.js.map
@@ -0,0 +1,2 @@
1
+ class r{#n;#e;#i;#r;#t=null;constructor(t){this.#n=t.analytics,this.#e=t.routeName,this.#i=t.additionalAttributes||{},this.#r=t.soundcheckApi}startMeasuring(){if("PerformanceObserver"in window){try{this.#t=new PerformanceObserver(t=>{const n=t.getEntries(),e=n[n.length-1];e&&e.renderTime!==void 0&&this.#s({value:e.renderTime,id:e.name||"unknown",delta:e.renderTime,entries:[e]})}),this.#t.observe({type:"largest-contentful-paint"})}catch{}document.addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"&&this.stopMeasuring()})}}#s(t){const n=t.value/1e3,e=this.#a(n);console.log(`[LCPReporter] LCP: ${n}s, Rating: ${e}, Route: ${this.#e||"unknown"}`),this.#r.recordLoadTime({routeName:this.#e||"unknown",loadTimeMs:t.value}).then(o=>{}),this.#o(n,e)}#o(t,n){this.#n.captureEvent("performance_metric","LCP Measurement",{attributes:{metricType:"lcp",value:t.toString(),rating:n,route:this.#e||"unknown",timestamp:Date.now().toString(),...this.#i}})}#a(t){return t<=2.5?"good":t<=4?"needs-improvement":"poor"}stopMeasuring(){this.#t&&(this.#t.disconnect(),this.#t=null)}}function s(i){return new r(i)}export{r as LCPReporter,s as createLCPReporter};
2
+ //# sourceMappingURL=lcpReporting.esm.js.map
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@spotify/backstage-plugin-soundcheck",
3
3
  "description": "Ensure quality, reliability and alignment of software development with codified checks and guidance.",
4
- "version": "0.18.0",
4
+ "version": "0.19.0",
5
5
  "license": "SEE LICENSE IN LICENSE.md",
6
6
  "homepage": "https://backstage.spotify.com",
7
7
  "main": "./dist/index.esm.js",
@@ -58,16 +58,16 @@
58
58
  "prepare": "yarn generate"
59
59
  },
60
60
  "dependencies": {
61
- "@backstage/catalog-client": "^1.10.1",
62
- "@backstage/catalog-model": "^1.7.4",
63
- "@backstage/config": "^1.3.2",
64
- "@backstage/core-compat-api": "^0.4.3",
65
- "@backstage/core-components": "^0.17.3",
66
- "@backstage/core-plugin-api": "^1.10.8",
67
- "@backstage/frontend-plugin-api": "^0.10.3",
68
- "@backstage/plugin-catalog-react": "^1.19.0",
69
- "@backstage/plugin-permission-react": "^0.4.35",
70
- "@backstage/plugin-scaffolder-react": "^1.17.0",
61
+ "@backstage/catalog-client": "^1.11.0",
62
+ "@backstage/catalog-model": "^1.7.5",
63
+ "@backstage/config": "^1.3.3",
64
+ "@backstage/core-compat-api": "^0.5.0",
65
+ "@backstage/core-components": "^0.17.5",
66
+ "@backstage/core-plugin-api": "^1.10.9",
67
+ "@backstage/frontend-plugin-api": "^0.11.0",
68
+ "@backstage/plugin-catalog-react": "^1.20.0",
69
+ "@backstage/plugin-permission-react": "^0.4.36",
70
+ "@backstage/plugin-scaffolder-react": "^1.19.0",
71
71
  "@backstage/types": "^1.2.1",
72
72
  "@date-io/luxon": "^1.0.0",
73
73
  "@hookform/resolvers": "^4.0.0",
@@ -75,17 +75,17 @@
75
75
  "@material-ui/icons": "^4.9.1",
76
76
  "@material-ui/lab": "4.0.0-alpha.61",
77
77
  "@material-ui/pickers": "3.3.11",
78
- "@mui/icons-material": "^5.11.16",
79
- "@mui/material": "^5.12.2",
80
78
  "@mui/styles": "^5.14.7",
81
79
  "@nivo/circle-packing": "^0.99.0",
82
80
  "@nivo/colors": "^0.99.0",
83
81
  "@nivo/core": "^0.99.0",
82
+ "@nivo/heatmap": "^0.99.0",
84
83
  "@nivo/icicle": "^0.99.0",
85
84
  "@nivo/sunburst": "^0.99.0",
86
85
  "@nivo/treemap": "^0.99.0",
87
- "@spotify/backstage-plugin-core": "^0.8.8",
88
- "@spotify/backstage-plugin-soundcheck-common": "^0.18.0",
86
+ "@remixicon/react": "^4.6.0",
87
+ "@spotify/backstage-plugin-core": "^0.8.10",
88
+ "@spotify/backstage-plugin-soundcheck-common": "^0.19.0",
89
89
  "@tanstack/react-query": "^4.6.1",
90
90
  "@tanstack/react-virtual": "^3.13.9",
91
91
  "@types/react-csv": "^1.1.6",
@@ -112,6 +112,7 @@
112
112
  "react-circular-progressbar": "^2.1.0",
113
113
  "react-confetti": "^6.1.0",
114
114
  "react-csv": "^2.2.2",
115
+ "react-helmet": "^6.1.0",
115
116
  "react-hook-form": "^7.51.5",
116
117
  "react-markdown": "^10.1.0",
117
118
  "react-simple-code-editor": "^0.14.1",
@@ -121,6 +122,7 @@
121
122
  "recharts": "^2.8.0",
122
123
  "rehype-raw": "^7.0.0",
123
124
  "remark-gfm": "^4.0.0",
125
+ "slate": "^0.117.0",
124
126
  "use-immer": "^0.11.0",
125
127
  "use-resize-observer": "^9.1.0",
126
128
  "uuid": "^11.0.0",
@@ -132,20 +134,21 @@
132
134
  "react-router-dom": "6.0.0-beta.0 || ^6.3.0"
133
135
  },
134
136
  "devDependencies": {
135
- "@backstage/cli": "^0.33.0",
136
- "@backstage/core-app-api": "^1.17.1",
137
- "@backstage/dev-utils": "^1.1.11",
137
+ "@backstage/cli": "^0.34.0",
138
+ "@backstage/core-app-api": "^1.18.0",
139
+ "@backstage/dev-utils": "^1.1.13",
138
140
  "@backstage/e2e-test-utils": "^0.1.1",
139
- "@backstage/frontend-test-utils": "^0.3.3",
140
- "@backstage/test-utils": "^1.7.9",
141
+ "@backstage/frontend-test-utils": "^0.3.5",
142
+ "@backstage/plugin-permission-common": "^0.9.1",
143
+ "@backstage/test-utils": "^1.7.11",
141
144
  "@graphql-codegen/cli": "^5.0.0",
142
145
  "@graphql-codegen/typescript": "^4.0.0",
143
146
  "@graphql-codegen/typescript-graphql-request": "^6.0.0",
144
147
  "@graphql-codegen/typescript-operations": "^4.0.0",
145
148
  "@playwright/test": "^1.32.3",
146
149
  "@sp4b-dev/test-utils": "^0.0.13",
147
- "@spotify/backstage-plugin-core-common": "^0.6.7",
148
- "@spotify/backstage-plugin-soundcheck-node": "^0.9.10",
150
+ "@spotify/backstage-plugin-core-common": "^0.6.9",
151
+ "@spotify/backstage-plugin-soundcheck-node": "^0.10.0",
149
152
  "@testing-library/jest-dom": "^6.0.0",
150
153
  "@testing-library/react": "^14.0.0",
151
154
  "@testing-library/user-event": "^14.0.0",
@@ -155,8 +158,8 @@
155
158
  "@types/d3-scale": "^4",
156
159
  "@types/d3-scale-chromatic": "^3.0.0",
157
160
  "@types/d3-shape": "^3",
158
- "@types/git-url-parse": "^9.0.0",
159
- "@types/jest": "^29.4.0",
161
+ "@types/git-url-parse": "^16.0.0",
162
+ "@types/jest": "^30.0.0",
160
163
  "@types/luxon": "^3.0.1",
161
164
  "@types/node": "^22.0.0",
162
165
  "@types/react-window": "^1.8.5",
@@ -1,2 +0,0 @@
1
- import{jsx as t,jsxs as p}from"react/jsx-runtime";import{makeStyles as b,useTheme as v,Box as a,Paper as k,Typography as D,Tooltip as R}from"@material-ui/core";import u from"@material-ui/lab/Skeleton";import{DateTime as A}from"luxon";import{CircularProgressbar as $,buildStyles as B}from"react-circular-progressbar";import{getChartFontColor as x,formatDate as O}from"../Charts/chartUtils.esm.js";import{getApplicableCheckCount as P}from"../TrackPage/TrackEntitiesTable/utils.esm.js";import{getProgressColor as g}from"../TrackPage/utils.esm.js";import{CheckHistoryChart as T}from"./CheckHistoryChart.esm.js";import{getCheckName as W}from"./utils.esm.js";const y=b(e=>({card:{display:"flex",flexDirection:"column",border:`1px solid ${e.palette.divider}`,width:"99%"},title:{fontWeight:"bold",fontSize:"0.9rem",cursor:"default",whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis"},headerRow:{display:"flex",padding:e.spacing(1.5,2),borderBottom:`1px solid ${e.palette.divider}`,width:"100%"},headerSection:{display:"flex",flexDirection:"column",gap:e.spacing(.5),flexGrow:1,width:"100%"},contentRow:{padding:e.spacing(1.5,2,.5),display:"flex"},leftSection:{width:"75px",minWidth:"75px"},summaryCard:{height:"100%",display:"flex",flexDirection:"column",justifyContent:"space-between"},chartSection:{flex:1,width:"100%",minWidth:"150px"},chartSkeletonSection:{flex:1,width:"100%",minWidth:"150px",padding:e.spacing(0,0,1,1)},overallSummaryBox:{display:"flex",flexDirection:"column",height:"100%",color:x(e),textAlign:"center",gap:e.spacing(2)}})),j=()=>{const e=y();return p(a,{className:e.contentRow,children:[t(a,{className:e.leftSection,children:t(a,{className:e.summaryCard,children:t(u,{variant:"circle",height:75})})}),t(a,{className:e.chartSkeletonSection,children:t(u,{variant:"rect",height:92})})]})};function z(e){if(!e)return[];const{history:n}=e,r=A.utc();return n.map((i,o)=>{const l=P(i);return{name:O(r,n.length-o-1),passRate:l?Math.round(i.passed/l*100):0}})}function E(e){if(!e)return 0;const{passed:n,exempt:r}=e,i=e.numberOfEntities-e.notApplicable-e.exempt;return i?Math.round((n+r)/i*100):0}function H(e){if(!e)return{numerator:0,denominator:0};const{passed:n,exempt:r}=e,i=e.numberOfEntities-e.notApplicable-e.exempt;return{numerator:n+r,denominator:i}}const M=({check:e,track:n,status:r,history:i})=>{const o=y(),l=v(),C={dataKey:"passRate",name:"Pass rate"},S=i?.history?.length??0,N=z(i),s=E(r);let m;r?m=`${s}%`:m="No Data";let d=!1,c;if(!r)c="No Data";else{const{numerator:w,denominator:f}=H(r);f>0?(d=!0,c=`${w} of ${f} entities passing`):c="No Applicable Entities"}const h=d?t(a,{className:o.overallSummaryBox,children:t($,{value:s,text:m,styles:B({textColor:x(l),pathColor:g(l,s),trailColor:l.palette.divider,textSize:S?void 0:10})})}):null;return p(k,{className:o.card,elevation:0,children:[t(a,{className:o.headerRow,children:t(a,{className:o.headerSection,children:t(D,{className:o.title,children:W(n,e)})})}),!r||!i?t(j,{}):t(R,{title:c,children:p(a,{className:o.contentRow,children:[h&&t(a,{className:o.leftSection,children:t(a,{className:o.summaryCard,children:h})}),t(a,{className:o.chartSection,children:t(T,{data:d?N:[],lineConfig:C,color:g(l,s)})})]})})]})};export{M as CheckCard};
2
- //# sourceMappingURL=CheckCard.esm.js.map
@@ -1,2 +0,0 @@
1
- import{jsx as t,jsxs as m}from"react/jsx-runtime";import{useTheme as n}from"@material-ui/core";import{ResponsiveContainer as s,AreaChart as d,CartesianGrid as h,XAxis as p,YAxis as A,Area as l}from"recharts";import{CARTESIAN_GRID_OPACITY as C,CHART_DATA_KEY as c,HORIZONTAL_Y_AXIS_WIDTH as f,AXIS_DOMAIN as y}from"../Charts/ChartTypes.esm.js";import"../Charts/LineChart/LineChart.esm.js";import{getChartFontColor as I}from"../Charts/chartUtils.esm.js";import"luxon";import"../TechHealthSummary/SummaryAggregationsProvider.esm.js";import"@backstage/catalog-model";import"../Charts/BarChart/BarChart.esm.js";import{LineChartPlaceholder as _}from"../Charts/LineChart/LineChartPlaceholder.esm.js";const T=({data:o,lineConfig:e,color:r})=>{const a=n(),i=I(a);return o.length?t(s,{minHeight:100,debounce:1,children:m(d,{data:o,children:[t(h,{vertical:!1,opacity:C}),t(p,{dataKey:c,stroke:i,style:{fontSize:"0.7rem"}}),t(A,{width:f,domain:y,stroke:i,style:{fontSize:"0.7rem"}}),t(l,{dataKey:e.dataKey,name:e.name,stackId:"1",type:"monotone",stroke:r,strokeWidth:1.2,fill:r},e.dataKey)]})}):t(_,{height:100})};export{T as CheckHistoryChart};
2
- //# sourceMappingURL=CheckHistoryChart.esm.js.map
@@ -1,2 +0,0 @@
1
- const c=(n,e)=>{for(const t of n.levels)for(const o of t.checks)if(o.id===e.id)return o.name;return e.name?e.name:e.id};export{c as getCheckName};
2
- //# sourceMappingURL=utils.esm.js.map
@@ -1,2 +0,0 @@
1
- import{jsxs as p,Fragment as s,jsx as r}from"react/jsx-runtime";import{withStyles as w,Button as C,makeStyles as S,Popover as P,TextField as I,Checkbox as O}from"@material-ui/core";import T from"@material-ui/icons/ArrowDropDown";import{Autocomplete as z}from"@material-ui/lab";import{useState as F}from"react";import{ListboxVirtualized as L}from"../ListboxVirtualized/ListboxVirtualized.esm.js";const d=w(o=>({root:{color:o.palette.text.primary,paddingLeft:o.spacing(1),paddingRight:o.spacing(1),textTransform:"initial",fontSize:o.typography.body1.fontSize}}))(C),$=S(o=>({root:{borderBottom:`1px solid ${o.palette.grey.A100}`,padding:o.spacing(1.5),backgroundColor:o.palette.background.paper},popper:{width:300,height:400,overflow:"hidden"},paper:{boxShadow:"none",margin:0},popperDisablePortal:{width:"100% !important"},listbox:{border:"none",height:400},option:{padding:`${o.spacing(.5)}px !important`,'&[data-selected="true"]':{background:"inherit"}},chips:{display:"flex",flexWrap:"wrap"},chip:{margin:1}})),B=({name:o,options:c,label:l,icon:m,filters:h,setFilters:u,disabled:g,customRenderOption:f})=>{const t=$(),[n,a]=F(null),b=e=>{a(e.currentTarget)},x=()=>{a(null)},v=(e,i)=>{u(i)},y=e=>r(I,{...e,name:"filter",variant:"outlined",placeholder:"Filter",fullWidth:!0}),k=(e,{selected:i})=>p(s,{children:[r(O,{value:e,checked:i,color:"primary"}),e]});return p(s,{children:[r(d,{startIcon:m,endIcon:r(T,{}),onClick:b,disabled:g,children:l}),r(P,{id:`${l}-filter-popover`,open:!!n,anchorEl:n,onClose:x,anchorOrigin:{vertical:"bottom",horizontal:"left"},transformOrigin:{vertical:"top",horizontal:"left"},PaperProps:{elevation:4,className:t.popper},children:r(z,{multiple:!0,disablePortal:!0,classes:{root:t.root,paper:t.paper,popperDisablePortal:t.popperDisablePortal,listbox:t.listbox,option:t.option},ListboxComponent:L,renderOption:f??k,id:`multi-select-filter-${o}--select`,value:h,options:c,limitTags:3,onChange:v,getOptionSelected:(e,i)=>e.toLowerCase()===i.toLowerCase(),renderInput:y,renderTags:()=>null,closeIcon:null,popupIcon:null,handleHomeEndKeys:!0,clearOnEscape:!0,open:!0})})]})};export{d as QuickFilterButton,B as default};
2
- //# sourceMappingURL=MultiSelectFilter.esm.js.map
@@ -1,2 +0,0 @@
1
- import{jsxs as r,jsx as e}from"react/jsx-runtime";import{useRouteRef as a}from"@backstage/core-plugin-api";import{Typography as t,Link as s}from"@material-ui/core";import{checksPageRouteRef as n}from"../../routes.esm.js";import{QuickstartCardBase as i}from"./QuickstartCardBase.esm.js";import{useQuickstartStyles as p}from"./styles.esm.js";const d=()=>{const o=p(),c=a(n);return r(i,{header:"Checks",routeRef:c,children:[e(t,{variant:"body1",component:"div",className:o.mainPoint,children:"Checks are comparisons between defined acceptable fact values and the actual fact values of given collected facts."}),e(t,{variant:"body1",component:"div",paragraph:!0,children:"We've pre-populated your instance with two sets of checks which are used in the provided tracks."}),r(t,{children:["Need Help? Check out the"," ",e(s,{href:"https://backstage.spotify.com/docs/plugins/soundcheck/core-concepts/checks",className:o.link,target:"_blank",rel:"noopener noreferrer",children:"documentation"}),"."]})]})};export{d as QuickstartChecksCard};
2
- //# sourceMappingURL=QuickStartChecksCard.esm.js.map
@@ -1,2 +0,0 @@
1
- import{jsxs as n,jsx as e}from"react/jsx-runtime";import{useRouteRef as c}from"@backstage/core-plugin-api";import{Typography as r,Link as i,Grid as o}from"@material-ui/core";import{integrationsPageRouteRef as h,integrationDetailsRouteRef as m}from"../../routes.esm.js";import{QuickstartCardBase as f}from"./QuickstartCardBase.esm.js";import{useQuickstartStyles as u}from"./styles.esm.js";const p=()=>{const t=u(),s=c(h),a=c(m),l=a({integrationId:"scm"}),d=a({integrationId:"github"});return n(f,{header:"Integrations",routeRef:s,children:[n(r,{variant:"body1",component:"div",className:t.mainPoint,children:["One of the foundational elements of Soundcheck,"," ",e(i,{href:"https://backstage.spotify.com/docs/plugins/soundcheck/core-concepts/fact-collectors",className:t.link,target:"_blank",rel:"noopener noreferrer",children:"Integrations"})," ","collect raw data about your components. These facts are then used by checks to determine the health of your components."]}),e(r,{variant:"body1",component:"div",children:"Soundcheck comes with a variety of integrations, two of which we've enabled and configured for your starting instance:"}),n(o,{container:!0,direction:"row",className:t.grid,children:[e(o,{item:!0,xs:4,children:e(r,{variant:"body1",children:e(i,{href:l,className:t.link,target:"_blank",rel:"noopener noreferrer",children:"SCM Integration"})})}),e(o,{item:!0,xs:8,children:e(r,{variant:"body1",children:"Checks for recommended settings in your GitHub repositories."})}),e(o,{item:!0,xs:4,children:e(r,{variant:"body1",children:e(i,{href:d,className:t.link,target:"_blank",rel:"noopener noreferrer",children:"GitHub Integration"})})}),e(o,{item:!0,xs:8,children:e(r,{variant:"body1",children:"Pulls information from Github."})})]}),n(r,{children:["Need Help? Check out the"," ",e(i,{href:"https://backstage.spotify.com/docs/plugins/soundcheck/core-concepts/fact-collectors",className:t.link,target:"_blank",rel:"noopener noreferrer",children:"documentation"}),"."]})]})};export{p as QuickstartCollectorConfigurationsCard};
2
- //# sourceMappingURL=QuickstartCollectorConfigurationsCard.esm.js.map
@@ -1,2 +0,0 @@
1
- import{jsxs as n,jsx as e}from"react/jsx-runtime";import{useRouteRef as c}from"@backstage/core-plugin-api";import{Typography as r,Grid as a,Link as o}from"@material-ui/core";import{tracksPageRouteRef as m,trackDetailsRouteRef as h}from"../../routes.esm.js";import{QuickstartCardBase as u}from"./QuickstartCardBase.esm.js";import{useQuickstartStyles as p}from"./styles.esm.js";const k=()=>{const t=p(),s=c(m),i=c(h),d=i({trackId:"993a9b69-3445-4d42-a950-2a847d618825"}),l=i({trackId:"140ea084-d918-4d41-9035-95d72516ec4b"});return n(u,{header:"Tracks",routeRef:s,children:[e(r,{variant:"body1",component:"div",className:t.mainPoint,children:"Tracks encourage alignment to architectural best practices and standards and are analogous to an organization\u2019s long-term tech health initiatives."}),e(r,{variant:"body1",component:"div",children:"We have provided two tracks to start you off:"}),n(a,{container:!0,direction:"row",className:t.grid,children:[e(a,{item:!0,xs:5,children:e(r,{variant:"body1",children:e(o,{href:d,className:t.link,target:"_blank",rel:"noopener noreferrer",children:"Basic SCM Compliance"})})}),e(a,{item:!0,xs:6,children:e(r,{variant:"body1",children:"Ensures your source control management is configured correctly."})}),e(a,{item:!0,xs:5,children:e(r,{variant:"body1",children:e(o,{href:l,className:t.link,target:"_blank",rel:"noopener noreferrer",children:"Recommended GitHub Settings"})})}),e(a,{item:!0,xs:6,children:e(r,{variant:"body1",children:"Checks for recommended settings in your GitHub repositories."})})]}),n(r,{children:["Need Help? Check out the"," ",e(o,{href:"https://backstage.spotify.com/docs/plugins/soundcheck/core-concepts/tracks",className:t.link,target:"_blank",rel:"noopener noreferrer",children:"documentation"}),"."]})]})};export{k as QuickstartTracksCard};
2
- //# sourceMappingURL=QuickstartTracksCard.esm.js.map
@@ -1,2 +0,0 @@
1
- import{jsx as o,jsxs as a}from"react/jsx-runtime";import{Dialog as s,Box as i,Typography as r,Link as n,Button as d}from"@material-ui/core";import{useState as h,useEffect as m}from"react";import{useQuickstartStyles as u}from"./styles.esm.js";const k=()=>{const e=u(),[c,t]=h(!1),l=()=>{t(!1)};return m(()=>{localStorage.getItem("hasSeenSoundcheckWelcomeModal")||(t(!0),localStorage.setItem("hasSeenSoundcheckWelcomeModal","true"))},[]),o(s,{open:c,onClose:l,"aria-labelledby":"modal-title","aria-describedby":"modal-description",children:a(i,{className:e.modal,children:[o(r,{id:"modal-title",variant:"h4",component:"div",className:e.headers,children:"Welcome to Soundcheck"}),a(r,{variant:"body1",component:"div",className:e.page,children:["You\u2019ll find default"," ",o(n,{href:"/soundcheck/tracks",className:e.link,target:"_blank",rel:"noopener noreferrer",children:"tracks"}),", ",o(n,{href:"/soundcheck/checks",className:e.link,target:"_blank",rel:"noopener noreferrer",children:"checks"}),", ","and"," ",o(n,{href:"/soundcheck/integrations",className:e.link,target:"_blank",rel:"noopener noreferrer",children:"integrations"})," ","to get you started. If you want, you can change and delete these at any time."]}),a(r,{variant:"body1",component:"div",className:e.page,children:["Check out our"," ",o(n,{href:"https://backstage.spotify.com/docs/plugins/soundcheck/",className:e.link,target:"_blank",rel:"noopener noreferrer",children:"documentation"})," ","to learn more about Soundcheck."]}),o("div",{style:{width:"100%",display:"flex",justifyContent:"flex-end"},children:o(d,{onClick:l,variant:"contained",children:"Got it"})})]})})};export{k as WelcomeModal};
2
- //# sourceMappingURL=WelcomeModal.esm.js.map
@@ -1,2 +0,0 @@
1
- import{jsx as d}from"react/jsx-runtime";import{motion as l}from"framer-motion";function m({angle:o,arc:i,direction:t,dist:e,emoji:n,delay:r,fontSize:a,speed:p}){return d(l.div,{style:{position:"absolute",fontSize:a},initial:{top:0,left:"50%",x:"-50%",y:"-100%",rotate:0,originX:`${i*t}px`,originY:`${i}px`},animate:{opacity:[0,1,0,0,0,0],y:`${-e}px`,rotate:o*t},transition:{delay:r,duration:p,ease:[.2,.83,.46,.63],repeat:1/0},children:n})}export{m as Emoji};
2
- //# sourceMappingURL=Emoji.esm.js.map
@@ -1,2 +0,0 @@
1
- import{jsxs as l,jsx as d}from"react/jsx-runtime";import{makeStyles as p,Typography as c}from"@material-ui/core";import{useMemo as f}from"react";import{Emoji as M}from"./Emoji.esm.js";const F=["\u{1F4C8}","\u{1F4CA}","\u{1F4C9}","\u{1F680}","\u2B50\uFE0F"],j=p(()=>({container:{position:"relative"}}));function y({angle:r=125,density:m=20,emojis:o=F,fontSizeMin:e=6,fontSizeMax:s=24,size:a=300,speed:n=4}){const h=j(),u=f(()=>Array.from({length:m*o.length}).map((t,i)=>({emoji:o[Math.floor(Math.random()*o.length)],arc:Math.random()*a*.5,delay:Math.random()*n,dist:Math.random()*a,direction:i%2?1:-1,fontSize:Math.random()*(s-e)+e,angle:r,speed:n})),[m,o,n,a,r,s,e]);return l("div",{className:h.container,children:[d(c,{variant:"h1",children:"\u{1F469}\u200D\u{1F4BB}"}),u.map((t,i)=>d(M,{...t},`${t.emoji}-${i}`))]})}export{y as EmojiFountain};
2
- //# sourceMappingURL=EmojiFountain.esm.js.map
@@ -1,2 +0,0 @@
1
- import{jsxs as h,jsx as i}from"react/jsx-runtime";import{makeStyles as g,Box as e,Typography as n}from"@material-ui/core";const x=g({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}}),f=({interpolator:r,minLabel:m="0%",maxLabel:s="100%",width:a=24,height:c="100%",steps:o=40})=>{const t=x(),l=`linear-gradient(to top, ${Array.from({length:o},(y,p)=>{const d=p/(o-1);return r(d)}).join(",")})`;return h(e,{className:t.container,height:c,style:{width:a},children:[i(n,{variant:"caption",className:t.captionTop,children:s}),i(e,{className:t.gradientBox,style:{background:l,width:a}}),i(n,{variant:"caption",className:t.captionBottom,children:m})]})};export{f as default};
2
- //# sourceMappingURL=ColorLegend.esm.js.map
@@ -1,2 +0,0 @@
1
- import{jsx as l,jsxs as m}from"react/jsx-runtime";import{makeStyles as u,Box as g,Typography as h}from"@material-ui/core";const d=u(e=>({overlay:{position:"absolute",top:0,left:0,right:0,bottom:0,backgroundColor:"rgba(0, 0, 0, 0.7)",display:"flex",alignItems:"center",justifyContent:"center",zIndex:1e3},messageContainer:{textAlign:"center",padding:e.spacing(2)},mainMessage:{color:e.palette.common.white,fontSize:"1.5rem",marginBottom:e.spacing(2)},statsMessage:{color:e.palette.common.white,fontSize:"0.875rem",opacity:.8}}));function f(e,i){if(!e)return{teams:0,entities:0,checks:0};let s=0,t=0;const a=o=>{s+=1,t+=o.ownedEntityRefs?.length||0,Object.values(o.children||{}).forEach(c=>{a(c)})},n=Object.values(e)[0];n&&a(n);const r=i?.levels?.reduce((o,c)=>o+(c.checks?.length||0),0)||0;return{teams:s,entities:t,results:r*t}}const p=({isLoading:e,hierarchyData:i,track:s})=>{const t=d();if(!e)return null;const{teams:a,entities:n,results:r}=f(i,s);return l(g,{className:t.overlay,children:m(g,{className:t.messageContainer,children:[l(h,{className:t.mainMessage,children:"Calculating..."}),m(h,{className:t.statsMessage,children:["Aggregating the statuses for ",a," teams owning ",n," entities across ",r," check results"]})]})})};export{p as default};
2
- //# sourceMappingURL=LoadingOverlay.esm.js.map
@@ -1,2 +0,0 @@
1
- import{jsx as l}from"react/jsx-runtime";import{useApi as p}from"@backstage/core-plugin-api";import{entityPresentationApiRef as u}from"@backstage/plugin-catalog-react";import{useTheme as f}from"@material-ui/core";import{TeamPerformanceListCard as g}from"./TeamPerformanceListCard.esm.js";const c=({trackStatus:e,getColor:a,limit:s=3,onTeamClick:r})=>{const o=f(),i=p(u),m=(e.children||[]).filter(t=>t.status.passed+t.status.failed+t.status.warning+t.status.error+t.status.notReported>0&&(t.status.allPassPercentage??0)<50).sort((t,n)=>(t.status.allPassPercentage??0)-(n.status.allPassPercentage??0)).slice(0,s).map(t=>({groupRef:t.groupRef,teamName:i.forEntity(t.groupRef).snapshot.primaryTitle,passPercentage:t.status.allPassPercentage??0}));return l(g,{title:"Teams Needing Attention",titleColor:o.palette.error.main,teams:m,getColor:a,onTeamClick:r,emptyMessage:"Every team is performing above 50%! \u{1F389}"})};export{c as default};
2
- //# sourceMappingURL=LowestPerformingTeams.esm.js.map
@@ -1,2 +0,0 @@
1
- import{jsxs as w,jsx as s,Fragment as I}from"react/jsx-runtime";import{useApi as S}from"@backstage/core-plugin-api";import{entityPresentationApiRef as T}from"@backstage/plugin-catalog-react";import{useTheme as N}from"@material-ui/core";import{makeStyles as j}from"@material-ui/core/styles";import{ResponsiveCirclePacking as z}from"@nivo/circle-packing";import{useState as A,useMemo as D}from"react";import{getContrastTextColor as b}from"./colorContrast.esm.js";import{hierarchyToNivo as E}from"./hierarchyToNivo.esm.js";import L from"./LoadingOverlay.esm.js";const P=j(t=>({root:{position:"relative",width:"100%",height:"100%"},nivoContainer:{width:"100%",height:"100%"},tooltip:{position:"absolute",pointerEvents:"none",zIndex:1e3},tooltipContent:{backgroundColor:t.palette.background.paper,padding:t.spacing(1),borderRadius:t.shape.borderRadius,boxShadow:t.shadows[1]},loadingOverlay:{position:"absolute",top:0,left:0,right:0,bottom:0,display:"flex",alignItems:"center",justifyContent:"center",backgroundColor:"rgba(0, 0, 0, 0.7)",zIndex:1e3,"& > *":{color:t.palette.common.white}}})),Z=({groupRef:t,hierarchyData:a,trackStatus:l,getColor:m,onZoomChange:C,track:k})=>{const[n,v]=A(null),p=P(),x=N(),u=S(T),d=D(()=>{if(!a||!t)return null;const o={};if(l){const r=i=>{i.groupRef&&i.groupRef!==t&&(o[i.groupRef]=i),i.children&&i.children.forEach(r)};r(l)}const e=a[t];return e?E(e,o,m,u):null},[a,l,t,m,u]),c=(o,e,r=[])=>{if(o.id===e)return[...r,o.id];if(o.children)for(const i of o.children){const g=c(i,e,[...r,o.id]);if(g)return g}return null},y=o=>{if(n===o.data.id)return;const e=n===o.data.id?null:o.data.id;v(e),C?.(o.data.entityRef)};if(!d)return null;const f=!l,h=x.palette.text.disabled,R=b(h);return w("div",{className:p.root,children:[s("div",{className:p.nivoContainer,children:s(z,{data:d,margin:{top:20,right:20,bottom:20,left:20},borderWidth:1,borderColor:{from:"color",modifiers:[["darker",1.25]]},colors:o=>f?h:o.data.color,childColor:{from:"color"},enableLabels:!0,label:o=>{if(n){const e=c(d,o.data.id),r=c(d,n);if(!e||!r||e.length<r.length)return""}return o.data.name},labelsSkipRadius:14,labelTextColor:o=>f?R:b(o.data.color||"#fff"),zoomedId:n,motionConfig:"default",isInteractive:!0,tooltip:()=>s(I,{}),onClick:y})}),s(L,{isLoading:f,hierarchyData:a,track:k})]})};export{Z as default};
2
- //# sourceMappingURL=NivoCirclePacking.esm.js.map
@@ -1,2 +0,0 @@
1
- import{jsxs as y,jsx as n,Fragment as R}from"react/jsx-runtime";import{useApi as I}from"@backstage/core-plugin-api";import{entityPresentationApiRef as w}from"@backstage/plugin-catalog-react";import{useTheme as S}from"@material-ui/core";import{makeStyles as T}from"@material-ui/core/styles";import{ResponsiveIcicle as j}from"@nivo/icicle";import{useState as A,useMemo as N}from"react";import{getContrastTextColor as u}from"./colorContrast.esm.js";import{hierarchyToNivo as z}from"./hierarchyToNivo.esm.js";import D from"./LoadingOverlay.esm.js";const E=T(t=>({root:{position:"relative",width:"100%",height:"100%"},nivoContainer:{width:"100%",height:"100%"},tooltip:{position:"absolute",pointerEvents:"none",zIndex:1e3},tooltipContent:{backgroundColor:t.palette.background.paper,padding:t.spacing(1),borderRadius:t.shape.borderRadius,boxShadow:t.shadows[1]},loadingOverlay:{position:"absolute",top:0,left:0,right:0,bottom:0,display:"flex",alignItems:"center",justifyContent:"center",backgroundColor:"rgba(0, 0, 0, 0.7)",zIndex:1e3,"& > *":{color:t.palette.common.white}}})),L=({groupRef:t,hierarchyData:r,trackStatus:i,getColor:s,onZoomChange:h,track:g})=>{const[b,C]=A(null),d=E(),v=S(),m=I(w),p=N(()=>{if(!r||!t)return null;const o={};if(i){const f=e=>{e.groupRef&&e.groupRef!==t&&(o[e.groupRef]=e),e.children&&e.children.forEach(f)};f(i)}const a=r[t];return a?z(a,o,s,m):null},[r,i,t,s,m]),k=o=>{const a=b===o.data.id?null:o.data.id;C(a),h?.(o.data.entityRef)};if(!p)return null;const l=!i,c=v.palette.text.disabled,x=u(c);return y("div",{className:d.root,children:[n("div",{className:d.nivoContainer,children:n(j,{data:p,margin:{top:20,right:20,bottom:20,left:20},borderWidth:1,borderColor:{from:"color",modifiers:[["darker",1.25]]},colors:o=>l?c:o.data.color,enableLabels:!0,label:o=>o.data.name,labelTextColor:o=>l?x:u(o.data.color||"#fff"),motionConfig:"gentle",isInteractive:!0,tooltip:()=>n(R,{}),onClick:k})}),n(D,{isLoading:l,hierarchyData:r,track:g})]})};export{L as default};
2
- //# sourceMappingURL=NivoIcicle.esm.js.map
@@ -1,2 +0,0 @@
1
- import{jsxs as C,jsx as i,Fragment as v}from"react/jsx-runtime";import{useApi as x}from"@backstage/core-plugin-api";import{entityPresentationApiRef as k}from"@backstage/plugin-catalog-react";import{useTheme as R}from"@material-ui/core";import{makeStyles as y}from"@material-ui/core/styles";import{ResponsiveSunburst as L}from"@nivo/sunburst";import{useMemo as w}from"react";import{getContrastTextColor as h}from"./colorContrast.esm.js";import{hierarchyToNivo as S}from"./hierarchyToNivo.esm.js";import A from"./LoadingOverlay.esm.js";const I=y(o=>({root:{position:"relative",width:"100%",height:"100%"},nivoContainer:{width:"100%",height:"100%"},tooltip:{position:"absolute",pointerEvents:"none",zIndex:1e3},tooltipContent:{backgroundColor:o.palette.background.paper,padding:o.spacing(1),borderRadius:o.shape.borderRadius,boxShadow:o.shadows[1]},loadingOverlay:{position:"absolute",top:0,left:0,right:0,bottom:0,display:"flex",alignItems:"center",justifyContent:"center",backgroundColor:"rgba(0, 0, 0, 0.7)",zIndex:1e3,"& > *":{color:o.palette.common.white}}})),T=({groupRef:o,hierarchyData:e,trackStatus:a,getColor:l,track:u})=>{const s=I(),g=R(),c=x(k),d=w(()=>{if(!e||!o)return null;const r={};if(a){const f=t=>{t.groupRef&&t.groupRef!==o&&(r[t.groupRef]=t),t.children&&t.children.forEach(f)};f(a)}const p=e[o];return p?S(p,r,l,c):null},[e,a,o,l,c]);if(!d)return null;const n=!a,m=g.palette.text.disabled,b=h(m);return C("div",{className:s.root,children:[i("div",{className:s.nivoContainer,children:i(L,{data:d,margin:{top:20,right:20,bottom:20,left:20},borderWidth:1,borderColor:{from:"color",modifiers:[["darker",1.25]]},colors:r=>n?m:r.data.color,childColor:{from:"color"},enableArcLabels:!0,arcLabel:r=>r.data.name,arcLabelsTextColor:r=>n?b:h(r.data.color||"#fff"),motionConfig:"default",isInteractive:!0,tooltip:()=>i(v,{}),arcLabelsSkipAngle:20})}),i(A,{isLoading:n,hierarchyData:e,track:u})]})};export{T as default};
2
- //# sourceMappingURL=NivoSunburst.esm.js.map
@@ -1,2 +0,0 @@
1
- import{jsxs as v,jsx as l,Fragment as R}from"react/jsx-runtime";import{useApi as S}from"@backstage/core-plugin-api";import{entityPresentationApiRef as T}from"@backstage/plugin-catalog-react";import{useTheme as w}from"@material-ui/core";import{makeStyles as I}from"@material-ui/core/styles";import{ResponsiveTreeMap as L}from"@nivo/treemap";import{useState as N,useMemo as j}from"react";import{getContrastTextColor as s}from"./colorContrast.esm.js";import{hierarchyToNivo as z}from"./hierarchyToNivo.esm.js";import P from"./LoadingOverlay.esm.js";const A=I(t=>({root:{position:"relative",width:"100%",height:"100%"},nivoContainer:{width:"100%",height:"100%"},tooltip:{position:"absolute",pointerEvents:"none",zIndex:1e3},tooltipContent:{backgroundColor:t.palette.background.paper,padding:t.spacing(1),borderRadius:t.shape.borderRadius,boxShadow:t.shadows[1]},loadingOverlay:{position:"absolute",top:0,left:0,right:0,bottom:0,display:"flex",alignItems:"center",justifyContent:"center",backgroundColor:"rgba(0, 0, 0, 0.7)",zIndex:1e3,"& > *":{color:t.palette.common.white}}})),D=({groupRef:t,hierarchyData:r,trackStatus:a,getColor:p,onZoomChange:g,track:b})=>{const[C,k]=N(null),d=A(),x=w(),m=S(T),c=j(()=>{if(!r||!t)return null;const o={};if(a){const h=e=>{e.groupRef&&e.groupRef!==t&&(o[e.groupRef]=e),e.children&&e.children.forEach(h)};h(a)}const n=r[t];return n?z(n,o,p,m):null},[r,a,t,p,m]),y=o=>{const n=C===o.data.id?null:o.data.id;k(n),g?.(o.data.entityRef)};if(!c)return null;const i=!a,f=x.palette.text.disabled,u=s(f);return v("div",{className:d.root,children:[l("div",{className:d.nivoContainer,children:l(L,{data:c,label:o=>o.data.name,margin:{top:20,right:20,bottom:20,left:20},labelSkipSize:24,labelTextColor:o=>i?u:s(o.data.color||"#fff"),nodeOpacity:1,parentLabel:o=>o.data.name,parentLabelPosition:"top",parentLabelTextColor:o=>i?u:s(o.data.color||"#fff"),colors:o=>i?f:o.data.color,borderColor:{from:"color",modifiers:[["darker",1.25]]},isInteractive:!0,animate:!1,tooltip:()=>l(R,{}),onClick:y})}),l(P,{isLoading:i,hierarchyData:r,track:b})]})};export{D as default};
2
- //# sourceMappingURL=NivoTreemap.esm.js.map
@@ -1,2 +0,0 @@
1
- import{jsx as r,jsxs as f}from"react/jsx-runtime";import{useTheme as G,Grid as i,Typography as h}from"@material-ui/core";import{useState as u,useEffect as k}from"react";import{useSearchParams as b}from"react-router-dom";import{useGroupOptions as M}from"../../../hooks/groups/useGroupOptions.esm.js";import{toFilter as O}from"../../../utils/helpers.esm.js";import{getChartColors as j}from"../../Charts/chartUtils.esm.js";import"../../TechHealth/Filters/types.esm.js";import"../../TechHealth/Filters/FacetFilter.esm.js";import{useFilterContext as L}from"../../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{getTechInsightsStyles as $}from"../styles.esm.js";import{parseTogglesString as B}from"../TechInsightsPage.esm.js";import{CheckStatusTile as H}from"../Tiles/CheckStatusTile.esm.js";import{FailingComponentsTable as P}from"./FailingComponentsTable.esm.js";import{MultiCheckStatusHistoryChart as V}from"./MultiCheckStatusHistoryChart.esm.js";import{getGroupName as W}from"./TeamComparison.esm.js";const q=({checksConnection:C})=>{const w=G(),s=$(),{options:S,isLoading:v,isError:x}=M(),[y]=b(),c=B(y.get("toggles")),{getSelectedFacetValues:d,facetFilters:m}=L(),[T,I]=u([]);k(()=>{I(m.Check)},[d,m]);const[l,N]=u([]);return k(()=>{N(m["Entity Owner"])},[d,m]),v?r(i,{item:!0,children:r(h,{variant:"h1",children:"Loading..."})},"checks"):x?r(i,{item:!0,children:r(h,{variant:"h3",children:"Error loading groups."})},"checks"):r(i,{item:!0,children:T?.map(t=>{const o=C?.edges.find(({node:e})=>e.id===t)?.node,g={id:o?.id??t,name:o?.name??t,description:o?.description??"None"},n=j(w),a=l??[],p=new Map;return a.forEach((e,E)=>{const F=n[E%n.length];p.set(e,F)}),f(i,{container:!0,spacing:2,direction:"row",children:[r(i,{item:!0,className:s.header,xs:12,children:f(h,{variant:"h4",children:["Check: ",o?.name??t]})}),c?.showGraphs&&r(i,{item:!0,className:`check-history-chart-${t}`,xs:12,children:r(V,{checkId:t,trackId:void 0,filters:l?.map(e=>O({owners:[e]})),states:void 0,colorMap:p})}),c?.showCards&&a.map(e=>r(i,{item:!0,className:s.gridItem,children:r(H,{existsWithinSoundcheck:!!o,titleOverride:`${W(e,S)}`,check:g,filter:e?{"relations.ownedBy":e}:void 0,color:p.get(e)??n[0]})},e)),c?.showTables&&r(i,{item:!0,className:s.gridItem,xs:12,children:r(P,{checkId:g.id,groupIds:a})},"failing-components-table")]})})},"checks")};export{q as CheckComparison};
2
- //# sourceMappingURL=CheckComparison.esm.js.map
@@ -1,2 +0,0 @@
1
- import{jsx as n,jsxs as h}from"react/jsx-runtime";import{makeStyles as E,useTheme as O,Table as b,TableRow as g,Typography as L,TableContainer as w,Paper as x,TableHead as N,TableCell as l,TableSortLabel as B,TableBody as I,Box as R}from"@material-ui/core";import{useState as f}from"react";import{useCertificationStatuses as W}from"../../../hooks/aggregations/useCertificationStatuses.esm.js";import{useCheckStatusByGroups as F}from"../../../hooks/aggregations/useCheckStatusByGroups.esm.js";import{PassPercentageProgressbar as M}from"../../PassingPercentProgressbar/PassPercentageProgressbar.esm.js";const j=E(e=>({tableContainer:{width:"100%",minWidth:300,margin:"auto",marginTop:e.spacing(2),marginBottom:e.spacing(2),borderRadius:e.shape.borderRadius},headerCell:{color:e.palette.common.white,fontWeight:"bold",borderBottom:`2px solid ${e.palette.primary.dark}`},sortLabel:{color:e.palette.common.white,"&.MuiTableSortLabel-active":{color:e.palette.secondary.light},"& .MuiTableSortLabel-icon":{color:e.palette.common.white}},tableRow:{cursor:"default","&:hover":{backgroundColor:e.palette.action.hover,cursor:"default"}},progressCircle:{display:"flex",alignItems:"center",gap:e.spacing(1),minWidth:"fit-content"}})),z=[{id:"passingPercent",label:"Passing Percent"},{id:"group",label:"Group Name"},{id:"cumulativelyPassed",label:"Passing Entities"},{id:"numberOfEntities",label:"Owned Entities"}],P=(e,t,r)=>t[r]<e[r]?-1:t[r]>e[r]?1:0;function G(e,t){return e==="desc"?(r,a)=>P(r,a,t):(r,a)=>-P(r,a,t)}function H(e,t){const r=(e??[]).map((a,s)=>[a,s]);return r.sort((a,s)=>{const o=t(a[0],s[0]);return o!==0?o:a[1]-s[1]}),r.map(a=>a[0])}function A(e){return(e||[]).map(t=>{const r=t.group,a=t.certificationStatus,s=a.statusByLevel[a.statusByLevel.length-1];if(!s)return{group:r,numberOfEntities:a.numberOfEntities,cumulativelyPassed:0,passingPercent:0};const o=s.cumulativelyPassed,d=a.numberOfEntities,c=d?o/d*100:0;return{group:r,numberOfEntities:d,cumulativelyPassed:o,passingPercent:Number(c.toFixed(2))}})}function D(e){return(e||[]).map(t=>({group:t.group,numberOfEntities:t.checkStatus.numberOfEntities,cumulativelyPassed:t.checkStatus.passed,passingPercent:Number((t.checkStatus.numberOfEntities?t.checkStatus.passed/t.checkStatus.numberOfEntities*100:0).toFixed(2))}))}const K=({trackId:e,checkId:t,groupIds:r})=>{const a=O(),s=j(a),[o,d]=f("asc"),[c,y]=f("group"),k=i=>{d(c===i&&o==="asc"?"desc":"asc"),y(i)},{data:u,isLoading:v}=W({trackId:e??"-",groups:e?r:[]}),{data:m,isLoading:C}=F({checkId:t??"-",groupIds:t?r:[]});if(v||C)return n(b,{children:n(g,{children:n(L,{children:"Loading..."})})});let p=[];u&&u.length>0&&(p=A(u)),m&&m.length>0&&(p=D(m));const S=({passingPercent:i})=>n(l,{padding:"none",children:n(R,{className:s.progressCircle,children:n(M,{passPercentage:i})})});return n(w,{component:x,className:s.tableContainer,children:h(b,{size:"small",children:[n(N,{children:n(g,{children:z.map(i=>{const T=o==="desc"?"desc":"asc";return n(l,{className:s.headerCell,sortDirection:c===i.id?o:void 0,padding:"normal",children:n(B,{active:c===i.id,direction:c===i.id?T:"asc",onClick:Q=>k(i.id),className:s.sortLabel,children:i.label})},i.id)})})}),n(I,{children:H(p,G(o,c)).map(i=>h(g,{hover:!0,className:s.tableRow,children:[n(l,{children:n(S,{passingPercent:i.passingPercent})}),n(l,{children:i.group}),n(l,{children:i.cumulativelyPassed}),n(l,{children:i.numberOfEntities})]},i.group))})]})})};export{K as FailingComponentsTable};
2
- //# sourceMappingURL=FailingComponentsTable.esm.js.map
@@ -1,2 +0,0 @@
1
- import{jsx as e,jsxs as p}from"react/jsx-runtime";import{useTheme as c,Typography as l}from"@material-ui/core";import{DateTime as k}from"luxon";import{ResponsiveContainer as h,LineChart as x,CartesianGrid as y,XAxis as u,YAxis as a,Tooltip as g,Line as f}from"recharts";import{compactNumberFormatter as b}from"../../../utils/formatters.esm.js";const L=({mergedHistory:n,colorMap:o,checkStatusHistories:s,max:d})=>{const t=c(),m={stroke:t.palette.background.paper,strokeWidth:1,r:5};return e(h,{height:250,debounce:1,children:p(x,{data:n??[],margin:{top:0,right:0,bottom:0,left:0},children:[e(y,{stroke:t.palette.divider,strokeWidth:1,horizontal:!0,vertical:!1}),e(u,{dataKey:"date",tickFormatter:r=>k.fromISO(r).toFormat("MMM d"),tickLine:!1,axisLine:!1}),e(a,{yAxisId:"percentage",domain:[0,100],axisLine:!1,tickLine:!1,tickFormatter:r=>`${r}%`,ticks:[0,25,50,75,100]}),e(a,{yAxisId:"count",orientation:"right",domain:[0,d],axisLine:!1,tickLine:!1,tickFormatter:r=>b(r)}),e(g,{contentStyle:{backgroundColor:t.palette.background.paper,color:t.palette.text.primary,border:`1px solid ${t.palette.divider}`},cursor:{stroke:t.palette.divider,strokeWidth:1}}),s?.map(r=>{if(r.filter){const i=r.filter["relations.ownedBy"][0];return e(f,{type:"monotone",dataKey:i,stroke:o?.get(i)??t.palette.primary.main,yAxisId:"count",strokeWidth:2,dot:!1,isAnimationActive:!1,activeDot:{fill:o?.get(i)??t.palette.primary.main,...m}})}return e(l,{children:e("span",{style:{color:t.palette.text.disabled},children:"No data available."})})})]})})};export{L as LineChartContainer};
2
- //# sourceMappingURL=LineChartContainer.esm.js.map
@@ -1,2 +0,0 @@
1
- import{jsx as t}from"react/jsx-runtime";import{makeStyles as M,useTheme as b,Typography as l}from"@material-ui/core";import{useCheckStatusHistoriesMultiFilter as I}from"../../../hooks/aggregations/useCheckStatusHistoriesMultiFilter.esm.js";import{LoadingChart as L}from"../../Charts/LoadingChart.esm.js";import{LineChartContainer as S}from"./LineChartContainer.esm.js";const v=M({root:{height:250,width:"100%",position:"relative",borderRadius:"4px"}}),w=f=>{const c=b(),m=v(),{checkId:d,trackId:p,filters:u,states:y,colorMap:k}=f,g=u?.map(r=>({checkId:d,trackId:p,filter:r,states:y,numberOfDays:30}))??[],{data:o,isLoading:C,error:x}=I(g,!!d);if(C)return t(L,{type:"line",numLines:3});if(x)return t(l,{color:"error",children:t("span",{style:{color:c.palette.error.main},children:"Error loading check status history."})});if(!o||o.length===0)return t(l,{style:{color:c.palette.text.disabled},children:t("span",{children:"No data available for the selected filters."})});const i="passed",a=[];let s=0;for(const r of o)if(r)for(const e of r.history){const h=a.find(H=>H.date===e.date),n=r.filter?.["relations.ownedBy"]??"Unknown";n.concat(`.${i}`),s=Math.max(s,e[i]),h?h[n]=e[i]:a.push({date:e.date,[n]:e[i]})}return t("div",{className:m.root,children:t(l,{children:t(S,{checkStatusHistories:o,mergedHistory:a,colorMap:k,max:s})})})};export{w as MultiCheckStatusHistoryChart};
2
- //# sourceMappingURL=MultiCheckStatusHistoryChart.esm.js.map
@@ -1,2 +0,0 @@
1
- import{jsx as r,jsxs as y}from"react/jsx-runtime";import{useTheme as x,Typography as L}from"@material-ui/core";import{ResponsiveContainer as C,LineChart as b,CartesianGrid as v,XAxis as A,YAxis as h,Tooltip as I,Line as H}from"recharts";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"react";import"../../../hooks/useSoundcheckAlert.esm.js";import{useTrack as T}from"../../../hooks/tracks/useTrack.esm.js";import"../../../hooks/useConfirmationModal.esm.js";import"react-router-dom";import{useCertificationStatusHistories as $}from"../../../hooks/aggregations/useCertificationStatusHistories.esm.js";import{compactNumberFormatter as E}from"../../../utils/formatters.esm.js";import{getChartColors as F}from"../../Charts/chartUtils.esm.js";import{LoadingChart as S}from"../../Charts/LoadingChart.esm.js";function W(a){const e=[];for(const[p,i]of a.entries()){const m=i.certificationStatusHistory.history,l=p.filter["relations.ownedBy"][0];for(const n of m){let s=e.find(d=>d.name===n.date);s||(e.push({name:n.date}),s=e[e.length-1]),s[`${l}`]=(n.statusByLevel[0].passed/i.certificationStatusHistory.numberOfEntities*100).toFixed(2)}}return e}const w=({trackId:a,filters:e,colorMap:p})=>{const i=x(),m=e?.map(t=>({trackId:a,filter:t,numberOfDays:30}))??[],{data:l,isLoading:n,error:s}=$(m,!!a),d=m.map(t=>t.filter["relations.ownedBy"][0]),{data:f,isLoading:u,isError:g}=T(a);if(n||u)return r(S,{type:"line",numLines:3});if(s||g||!l||!f)return r(L,{children:r("span",{style:{color:i.palette.error.main},children:"Error loading track status histories."})});const o=F(i),k=W(l);return r(C,{width:"100%",height:"100%",minHeight:250,children:y(b,{data:k,height:250,margin:{top:0,right:0,bottom:0,left:0},children:[r(v,{stroke:i.palette.divider,strokeWidth:1,horizontal:!0,vertical:!1}),r(A,{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",dataKey:"totalEntities",axisLine:!1,tickLine:!1,tickFormatter:t=>E(t)}),r(I,{contentStyle:{backgroundColor:i.palette.background.paper,color:i.palette.text.primary,border:`1px solid ${i.palette.divider}`},cursor:{stroke:i.palette.divider,strokeWidth:1}}),d.map((t,c)=>r(H,{type:"monotone",dataKey:t,name:`Group: ${t.replace("group:default/","")} - Checks Passing %`,yAxisId:"left",stroke:p?.get(t)??o[c%o.length],strokeWidth:2,dot:!1,fill:p?.get(t)??o[c%o.length],isAnimationActive:!1,activeDot:{fill:o[c%o.length],stroke:i.palette.background.paper,strokeWidth:1,r:5}},`Group:${t} - Checks Passing %`))]})})};export{w as MultiTrackHistoryChart};
2
- //# sourceMappingURL=MultiTrackHistoryChart.esm.js.map
@@ -1,2 +0,0 @@
1
- import{jsx as r,jsxs as d}from"react/jsx-runtime";import{Box as n,Typography as l,Grid as u}from"@material-ui/core";import{useMemo as h}from"react";import{useSearchParams as k}from"react-router-dom";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{useGetChecks as C}from"../../../hooks/checks/useGetChecks.esm.js";import"../../../hooks/useSoundcheckAlert.esm.js";import{useGetAllTracks as N}from"../../../hooks/tracks/useGetAllTracks.esm.js";import"../../../hooks/useConfirmationModal.esm.js";import{Facet as f}from"../../TechHealth/Filters/types.esm.js";import"../../TechHealth/Filters/FacetFilter.esm.js";import{useFilterContext as T}from"../../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{getTechInsightsStyles as w}from"../styles.esm.js";import{parseTogglesString as x}from"../TechInsightsPage.esm.js";import{CheckComparison as y}from"./CheckComparison.esm.js";import{TrackComparison as G}from"./TrackComparison.esm.js";const S=(o,a)=>{const e=a.find(c=>c.ref===o);return e?e.name:o},b=()=>{const o=w(),[a]=k(),{data:e,isLoading:c}=N({}),{data:g}=C({}),{getSelectedFacetValues:t}=T(),i=h(()=>t(f.Track),[t]),s=h(()=>t(f.Check),[t]),m=h(()=>t(f.EntityOwner),[t]);if(c)return r(n,{className:o.content,children:r(l,{variant:"h1",children:"Loading..."})});if(!m||m.length===0||(!s||s.length===0)&&(!i||i.length===0))return r(n,{className:o.info,children:r(l,{className:o.info,children:"Select both a set of groups and some checks/tracks to see comparisons."})});const p=x(a.get("toggles"));return!p.showGraphs&&!p.showCards&&!p.showTables?r(n,{className:o.info,children:r(l,{className:o.info,children:"No graphs, cards or tables selected. Please select at least one from the 'Display' selection on the left."})}):r(n,{className:o.content,children:d(u,{container:!0,direction:"row",spacing:2,children:[s&&s.length>0&&g&&m&&r(y,{checksConnection:g}),i&&i.length>0&&e&&m&&r(G,{tracksConnection:e})]})})};export{b as TeamComparison,S as getGroupName};
2
- //# sourceMappingURL=TeamComparison.esm.js.map