@spotify/backstage-plugin-soundcheck 0.19.3 → 0.19.4

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 (224) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/dist/alpha/integrations.esm.js +1 -1
  3. package/dist/alpha/pages.esm.js +1 -1
  4. package/dist/alpha.d.ts +2 -2
  5. package/dist/api.esm.js +1 -1
  6. package/dist/blueprints/IntegrationPageBlueprint.esm.js +1 -1
  7. package/dist/components/Badges/NoLevelBadge.esm.js +2 -2
  8. package/dist/components/CampaignCreatePage/CampaignCreatePage.esm.js +1 -1
  9. package/dist/components/CampaignForm/CampaignForm.esm.js +1 -1
  10. package/dist/components/CampaignForm/hooks/useCampaignForm.esm.js +1 -1
  11. package/dist/components/CampaignPage/CampaignPageBUI.esm.js +1 -1
  12. package/dist/components/CampaignPage/CampaignPageDeprecated.esm.js +1 -1
  13. package/dist/components/CampaignPage/CampaignStatusHistoryChart.esm.js +2 -0
  14. package/dist/components/CampaignPage/CampaignStatusHistoryTile.esm.js +1 -1
  15. package/dist/components/CampaignPage/CampaignStatusTile.esm.js +1 -1
  16. package/dist/components/CampaignPage/CampaignTechInsightsExplorerPage.esm.js +2 -0
  17. package/dist/components/CampaignsPage/CampaignListPage/CampaignListPageDeprecated.esm.js +1 -1
  18. package/dist/components/CampaignsPage/CampaignListPage/CampaignSummaryCard.esm.js +1 -1
  19. package/dist/components/CampaignsPage/CampaignListPageBUI.esm.js +1 -1
  20. package/dist/components/CampaignsPage/CampaignsPage.esm.js +1 -1
  21. package/dist/components/CampaignsPage/EditCampaignView.esm.js +1 -1
  22. package/dist/components/Cards/CheckStatusCard/CheckStatusCard.esm.js +2 -0
  23. package/dist/components/Cards/DescriptionCard/DescriptionCard.esm.js +1 -1
  24. package/dist/components/Cards/HistoricalCheckStatusCard/HistoricalCheckStatusCard.esm.js +2 -0
  25. package/dist/components/Cards/HistoricalTrackStatusCard/HistoricalTrackStatusCard.esm.js +2 -0
  26. package/dist/components/Cards/TrackStatusCard/TrackStatusCard.esm.js +2 -0
  27. package/dist/components/CertificationAccordion/CertificationAccordion.esm.js +1 -1
  28. package/dist/components/CertificationSidebar/CertificationSidebar.esm.js +1 -1
  29. package/dist/components/CertificationSidebar/CertificationSummary.esm.js +1 -1
  30. package/dist/components/CertificationSidebar/Check.esm.js +1 -1
  31. package/dist/components/CertificationSidebar/ExemptionJustificationDialog.esm.js +1 -1
  32. package/dist/components/CertificationSidebar/LevelSummary.esm.js +1 -1
  33. package/dist/components/CertificationsPage/CertificationTab.esm.js +1 -1
  34. package/dist/components/CertificationsPage/CertificationsPage.esm.js +1 -1
  35. package/dist/components/CertificationsPage/Playlist/PlaylistContext.esm.js +1 -1
  36. package/dist/components/CertificationsPage/Playlist/PlaylistSummary.esm.js +1 -1
  37. package/dist/components/Charts/chartUtils.esm.js +1 -1
  38. package/dist/components/CheckCreatePage/CheckCreatePage.esm.js +1 -1
  39. package/dist/components/CheckDetails/CheckDetails.esm.js +1 -1
  40. package/dist/components/CheckDetails/JustificationDetails.esm.js +1 -1
  41. package/dist/components/CheckDetails/ResultStateBox.esm.js +1 -1
  42. package/dist/components/CheckForm/CheckForm.esm.js +1 -1
  43. package/dist/components/CheckForm/FormFields/RuleInput/AddMenuButton.esm.js +1 -1
  44. package/dist/components/CheckForm/FormFields/RuleInput/Conditions/useRuleOptions.esm.js +1 -1
  45. package/dist/components/CheckForm/FormFields/RuleInput/RuleInputBox.esm.js +1 -1
  46. package/dist/components/CheckForm/Steps/CheckApplicabilityStep.esm.js +1 -1
  47. package/dist/components/CheckForm/Steps/CheckDetailsStep.esm.js +1 -1
  48. package/dist/components/CheckForm/Steps/CheckRulesStep.esm.js +1 -1
  49. package/dist/components/CheckForm/useCheckForm.esm.js +1 -1
  50. package/dist/components/CheckPage/CheckEditPage.esm.js +1 -1
  51. package/dist/components/CheckPage/CheckEditView.esm.js +1 -1
  52. package/dist/components/CheckPage/CheckEntitiesTable/CheckEntitiesTableBUI.esm.js +2 -0
  53. package/dist/components/CheckPage/CheckPage.esm.js +2 -0
  54. package/dist/components/CheckPage/CheckPageBUI.esm.js +2 -0
  55. package/dist/components/CheckPage/CheckPageDeprecated.esm.js +2 -0
  56. package/dist/components/CheckPage/CheckStatusHistoryChartBUI.esm.js +2 -0
  57. package/dist/components/CheckPage/CheckStatusTableBUI.esm.js +2 -0
  58. package/dist/components/CheckPage/ExemptionsTableBUI.esm.js +2 -0
  59. package/dist/components/CheckSelection/CheckPreview.esm.js +1 -1
  60. package/dist/components/CheckSelection/CheckSelection.esm.js +1 -1
  61. package/dist/components/CheckStatusBar/CheckStatusBarBUI.esm.js +1 -1
  62. package/dist/components/CheckTemplatesPage/CheckTemplatesPage.esm.js +1 -1
  63. package/dist/components/CheckTemplatesPage/CheckTemplatesPageBUI.esm.js +2 -0
  64. package/dist/components/CheckTemplatesPage/CheckTemplatesPageDeprecated.esm.js +2 -0
  65. package/dist/components/CheckTemplatesPage/TemplateCategoryBUI.esm.js +2 -0
  66. package/dist/components/ChecksPage/CheckListPage/CheckListPageDeprecated.esm.js +1 -1
  67. package/dist/components/ChecksPage/CheckListPage/CheckSummaryCard.esm.js +1 -1
  68. package/dist/components/ChecksPage/ChecksListPageBUI.esm.js +1 -1
  69. package/dist/components/ChecksTable/ChecksTable.esm.js +1 -1
  70. package/dist/components/CollapsablePanel/CollapsablePanel.esm.js +1 -1
  71. package/dist/components/CollectorPage/CollectorDetailsPage.esm.js +1 -1
  72. package/dist/components/CollectorPage/CollectorDetailsPageBUI.esm.js +2 -0
  73. package/dist/components/CollectorPage/CollectorDetailsPageDeprecated.esm.js +2 -0
  74. package/dist/components/CollectorPage/CollectorFactTableBUI.esm.js +2 -0
  75. package/dist/components/CollectorPage/CollectorPage.esm.js +1 -1
  76. package/dist/components/CollectorPage/Configurators/AzureDevOps/AzureDevOpsConfigurator.esm.js +1 -1
  77. package/dist/components/CollectorPage/Configurators/BigQuery/BigQueryConfigurator.esm.js +1 -1
  78. package/dist/components/CollectorPage/Configurators/Catalog/CatalogConfigurator.esm.js +1 -1
  79. package/dist/components/CollectorPage/Configurators/DataDog/DataDogConfigurator.esm.js +1 -1
  80. package/dist/components/CollectorPage/Configurators/DataRegistry/DataRegistryConfigurator.esm.js +1 -1
  81. package/dist/components/CollectorPage/Configurators/Github/GithubConfigurator.esm.js +1 -1
  82. package/dist/components/CollectorPage/Configurators/Gitlab/GitlabConfigurator.esm.js +1 -1
  83. package/dist/components/CollectorPage/Configurators/HTTP/HttpConfigurator.esm.js +1 -1
  84. package/dist/components/CollectorPage/Configurators/HTTP/HttpStatusesInput.esm.js +1 -1
  85. package/dist/components/CollectorPage/Configurators/Jira/JiraConfigurator.esm.js +1 -1
  86. package/dist/components/CollectorPage/Configurators/Kubernetes/KubernetesConfigurator.esm.js +1 -1
  87. package/dist/components/CollectorPage/Configurators/NewRelic/NewRelicConfigurator.esm.js +1 -1
  88. package/dist/components/CollectorPage/Configurators/PagerDuty/PagerDutyConfigurator.esm.js +1 -1
  89. package/dist/components/CollectorPage/Configurators/SCM/ScmConfigurator.esm.js +1 -1
  90. package/dist/components/CollectorPage/Configurators/SonarQube/SonarQubeConfigurator.esm.js +1 -1
  91. package/dist/components/CollectorPage/DependantCheckCard.esm.js +2 -0
  92. package/dist/components/CollectorsPage/CollectorListPage/{CollectorListPage.esm.js → CollectorListPageDeprecated.esm.js} +2 -2
  93. package/dist/components/CollectorsPage/CollectorListPage/CollectorSummaryCard.esm.js +1 -1
  94. package/dist/components/CollectorsPage/CollectorsPage.esm.js +1 -1
  95. package/dist/components/CollectorsPage/IntegrationLogoBUI.esm.js +2 -0
  96. package/dist/components/CollectorsPage/IntegrationsListPageBUI.esm.js +2 -0
  97. package/dist/components/CustomCell/CustomCell.esm.js +1 -1
  98. package/dist/components/DescriptionCell/DescriptionCell.esm.js +2 -0
  99. package/dist/components/DocLinkButton/DocLinkButton.esm.js +2 -0
  100. package/dist/components/EmptyState/EmptyStateBUI.esm.js +1 -1
  101. package/dist/components/EmptyState/EmptyStateNoCampaigns.esm.js +1 -1
  102. package/dist/components/EmptyState/EmptyStateNoChecks.esm.js +1 -1
  103. package/dist/components/EmptyState/EmptyStateNoTracks.esm.js +1 -1
  104. package/dist/components/EntitiesAutocompletePicker/EntitiesAutocompletePicker.esm.js +1 -1
  105. package/dist/components/EntitySoundcheckCard/Card.esm.js +1 -1
  106. package/dist/components/ExpandableSection/ExpandableSection.esm.js +1 -1
  107. package/dist/components/FactExplorer/FactExplorerDialogBUI.esm.js +2 -0
  108. package/dist/components/FactExplorer/useFactOptions.esm.js +1 -1
  109. package/dist/components/Filter/EntityAutocompletePicker.esm.js +1 -1
  110. package/dist/components/Filter/FilterComponent.esm.js +1 -1
  111. package/dist/components/FilterMenu/FilterMenu.esm.js +2 -0
  112. package/dist/components/FilterSidebar/StateFilter.esm.js +1 -1
  113. package/dist/components/FormControlledAutocomplete/FormControlledAutocomplete.esm.js +1 -1
  114. package/dist/components/FormControlledAutocomplete/FormControlledMultipleAutocomplete.esm.js +1 -1
  115. package/dist/components/FormMarkdownInput/FormMarkdownInput.esm.js +1 -1
  116. package/dist/components/FormattedPreview/FormattedPreview.esm.js +1 -1
  117. package/dist/components/GroupHierarchySelector/GroupHierarchyGroupInfo.esm.js +1 -1
  118. package/dist/components/GroupHierarchySelector/GroupHierarchySelector.esm.js +1 -1
  119. package/dist/components/GroupSelectorBUI/GroupSelectList.esm.js +2 -0
  120. package/dist/components/GroupSelectorBUI/GroupSelectionHistory.esm.js +2 -0
  121. package/dist/components/GroupSelectorBUI/GroupSelectorBUI.esm.js +2 -0
  122. package/dist/components/GroupSelectorBUI/GroupTag.esm.js +2 -0
  123. package/dist/components/GroupSelectorBUI/useGroupHistory.esm.js +2 -0
  124. package/dist/components/GroupSelectorBUI/usePreviousSelectedGroups.esm.js +2 -0
  125. package/dist/components/HierarchicalTechInsightsPage/HierarchicalTechInsightsPage.esm.js +1 -1
  126. package/dist/components/HierarchicalTechInsightsPage/HierarchyTable.esm.js +1 -1
  127. package/dist/components/HierarchicalTechInsightsPage/SelectedNodeSidebar.esm.js +1 -1
  128. package/dist/components/HierarchicalTechInsightsPage/visualizations/hierarchyToNivo.esm.js +1 -1
  129. package/dist/components/ImportExportPanel/ImportExportPanelBUI.esm.js +2 -0
  130. package/dist/components/ImportExportPanel/{ImportExportPanel.esm.js → ImportExportPanelDeprecated.esm.js} +2 -2
  131. package/dist/components/LevelUpParty/LevelUpParty.esm.js +1 -1
  132. package/dist/components/LevelsTable/CheckRowContent.esm.js +1 -1
  133. package/dist/components/ListPageCustomActions/ListPageCustomActions.esm.js +1 -1
  134. package/dist/components/Menus/SimpleMenu.esm.js +2 -0
  135. package/dist/components/Menus/useCampaignActions.esm.js +2 -0
  136. package/dist/components/Menus/useCheckActions.esm.js +2 -0
  137. package/dist/components/Menus/useTrackActions.esm.js +2 -0
  138. package/dist/components/OverviewTable/Cell/CheckCellTooltip.esm.js +1 -1
  139. package/dist/components/OverviewTable/Cell/CheckLabelCell.esm.js +1 -1
  140. package/dist/components/OverviewTable/OverviewTable.esm.js +1 -1
  141. package/dist/components/OverviewTable/ResultsTable.esm.js +1 -1
  142. package/dist/components/PageCustomActions/PageCustomActions.esm.js +1 -1
  143. package/dist/components/PassRateTable/PassRateTable.esm.js +1 -1
  144. package/dist/components/QuickstartPage/QuickstartPage.esm.js +2 -2
  145. package/dist/components/RefetchingIndicator/RefetchingIndicator.esm.js +1 -1
  146. package/dist/components/Router.esm.js +1 -1
  147. package/dist/components/RoutingPage/RoutingMainMenu.esm.js +2 -0
  148. package/dist/components/RoutingPage/RoutingPage.esm.js +1 -1
  149. package/dist/components/RoutingPage/RoutingPageBUI.esm.js +2 -0
  150. package/dist/components/RoutingPage/RoutingPageDeprecated.esm.js +2 -0
  151. package/dist/components/RoutingPage/RoutingPageWrapper.esm.js +2 -0
  152. package/dist/components/RoutingPage/RoutingPageWrapperBUI.esm.js +2 -0
  153. package/dist/components/RoutingPage/RoutingPageWrapperDeprecated.esm.js +2 -0
  154. package/dist/components/RoutingPage/index.esm.js +1 -1
  155. package/dist/components/SendCampaignNotificationDialog/SendCampaignNotificationDialog.esm.js +1 -1
  156. package/dist/components/SoundcheckHeader/SoundcheckHeaderBUI.esm.js +2 -0
  157. package/dist/components/SoundcheckMarkdownContent/ComponentRenders.esm.js +1 -1
  158. package/dist/components/SoundcheckMarkdownContent/SoundcheckMarkdownContentBUI.esm.js +2 -0
  159. package/dist/components/SoundcheckMarkdownContent/SoundcheckMarkdownContentDeprecated.esm.js +2 -0
  160. package/dist/components/StatusBar/StatusBar.esm.js +2 -0
  161. package/dist/components/SummaryCard/SummaryCard.esm.js +1 -1
  162. package/dist/components/TableRowWithOwner/TableRowWithOwner.esm.js +1 -1
  163. package/dist/components/TechHealth/Filters/FacetFilter.esm.js +1 -1
  164. package/dist/components/TechHealth/Filters/useFacetOptions.esm.js +1 -1
  165. package/dist/components/TechHealth/Loading/TechHealthLoading.esm.js +1 -1
  166. package/dist/components/TechHealth/TechHealth.esm.js +1 -1
  167. package/dist/components/TechHealthSummary/SummaryAggregationsProvider.esm.js +1 -1
  168. package/dist/components/TechHealthTabs/CampaignResultsTab/CampaignResultsTab.esm.js +1 -1
  169. package/dist/components/TechHealthTabs/CheckResultsTab/CheckResultsTab.esm.js +1 -1
  170. package/dist/components/TechHealthTabs/EntityResultsTab/EntityResultsTab.esm.js +1 -1
  171. package/dist/components/TechHealthTabs/GroupResultsTab/GroupResultsTab.esm.js +1 -1
  172. package/dist/components/TechHealthTabs/NameColumn.esm.js +1 -1
  173. package/dist/components/TechHealthTabs/TrackResultsTab/TrackResultsTab.esm.js +1 -1
  174. package/dist/components/TechInsights/SummaryTiles.esm.js +1 -1
  175. package/dist/components/TechInsights/SummaryTilesBUI.esm.js +2 -0
  176. package/dist/components/TechInsights/TechInsightsPage.esm.js +1 -1
  177. package/dist/components/TechInsights/TechInsightsPageBUI.esm.js +2 -0
  178. package/dist/components/TechInsights/TechInsightsPageDeprecated.esm.js +2 -0
  179. package/dist/components/TechInsights/TechInsightsTableBUI.esm.js +1 -1
  180. package/dist/components/TechInsights/TechInsightsTableView.esm.js +1 -1
  181. package/dist/components/TechInsightsExplorerTable/TechInsightsExplorerTable.esm.js +2 -0
  182. package/dist/components/TechInsightsGroupSelector/TechInsightsGroupSelector.esm.js +1 -1
  183. package/dist/components/TimePeriodBar/TimePeriodBar.esm.js +1 -1
  184. package/dist/components/TimePeriodBar/TimePeriodBarBUI.esm.js +2 -0
  185. package/dist/components/TopAndBottomPerformingTeams/TopAndBottomPerformingTeams.esm.js +2 -0
  186. package/dist/components/TopFailingChecksTable/TopFailingChecksTableBUI.esm.js +1 -1
  187. package/dist/components/TrackCreatePage/TrackCreatePage.esm.js +1 -1
  188. package/dist/components/TrackEditPage/TrackEditPage.esm.js +1 -1
  189. package/dist/components/TrackEditPage/TrackEditView.esm.js +1 -1
  190. package/dist/components/TrackForm/TrackForm.esm.js +1 -1
  191. package/dist/components/TrackForm/utils/useTrackForm.esm.js +1 -1
  192. package/dist/components/TrackPage/TrackEntitiesTable/TrackEntitiesTableBUI.esm.js +1 -1
  193. package/dist/components/TrackPage/TrackHistoryChartBUI.esm.js +2 -0
  194. package/dist/components/TrackPage/TrackPageBUI.esm.js +1 -1
  195. package/dist/components/TrackPage/TrackPageDeprecated.esm.js +1 -1
  196. package/dist/components/TrackPage/TrackStatusBarBUI.esm.js +2 -0
  197. package/dist/components/TrackPage/TrackStatusTableBUI.esm.js +2 -0
  198. package/dist/components/TrackPage/TrackTechInsightsExplorerPage.esm.js +2 -0
  199. package/dist/components/TrackSelection/TrackSelection.esm.js +1 -1
  200. package/dist/components/TracksPage/TrackListPage/TrackListPageDeprecated.esm.js +1 -1
  201. package/dist/components/TracksPage/TrackListPage/TrackSummaryCard.esm.js +1 -1
  202. package/dist/components/TracksPage/TracksListPageBUI.esm.js +1 -1
  203. package/dist/components/TracksPage/TracksPage.esm.js +1 -1
  204. package/dist/graphql/generated/index.esm.js +1 -0
  205. package/dist/hooks/filters/useFilters.esm.js +2 -0
  206. package/dist/hooks/groups/useGroupOptions.esm.js +1 -1
  207. package/dist/hooks/heirarchy/useGroupHierarchy.esm.js +1 -1
  208. package/dist/hooks/tracks/useTracksApplicableToGroup.esm.js +1 -1
  209. package/dist/hooks/usePagination.esm.js +1 -1
  210. package/dist/hooks/useSortTableLocalStorage.esm.js +2 -0
  211. package/dist/routes.esm.js +1 -1
  212. package/dist/utils/charts.esm.js +1 -1
  213. package/dist/utils/formStyles.esm.js +1 -1
  214. package/dist/utils/time.esm.js +1 -1
  215. package/package.json +21 -20
  216. package/dist/components/Cards/CurrentStatusCard/CurrentStatusCard.esm.js +0 -2
  217. package/dist/components/Cards/CurrentStatusCard/CurrentStatusCardRow.esm.js +0 -2
  218. package/dist/components/CheckPage/CheckInsightsPage.esm.js +0 -2
  219. package/dist/components/CheckStatusBar/CheckStatusBarCell.esm.js +0 -2
  220. package/dist/components/GroupHierarchySelector/usePreviousSelectedGroups.esm.js +0 -2
  221. package/dist/components/SoundcheckMarkdownContent/SoundcheckMarkdownContent.esm.js +0 -2
  222. package/dist/hooks/checks/useCheckStatusTotals.esm.js +0 -2
  223. package/dist/utils/checks.esm.js +0 -2
  224. /package/dist/{components/GroupHierarchySelector → utils}/getAllOwnedEntityCount.esm.js +0 -0
@@ -0,0 +1,2 @@
1
+ import{jsxs as r,jsx as a}from"react/jsx-runtime";import{useMemo as f,useCallback as H,createElement as y}from"react";import{useApi as j,useRouteRef as N}from"@backstage/core-plugin-api";import{entityPresentationApiRef as D}from"@backstage/plugin-catalog-react";import{Flex as b,Card as k,Text as w,Box as x,Avatar as F,TooltipTrigger as O,ButtonLink as z,Tooltip as G}from"@backstage/ui";import{makeStyles as U}from"@material-ui/core";import{RiInformationLine as W}from"@remixicon/react";import{isEmpty as T}from"lodash";import{createSearchParams as q}from"react-router-dom";import{useProfileImages as J}from"../../hooks/catalog/useProfileImages.esm.js";import{trackOverviewRouteRef as K,campaignOverviewRouteRef as Q}from"../../routes.esm.js";import{getPercentage as v}from"../../utils/formatters.esm.js";import"../EmptyState/EmptyState.esm.js";import{EmptyStateBUI as C}from"../EmptyState/EmptyStateBUI.esm.js";import"@backstage/plugin-permission-react";import"@spotify/backstage-plugin-soundcheck-common";import{getLeafNodes as V}from"../HierarchicalTechInsightsPage/getLeafNodes.esm.js";import{LoadingTableSkeleton as B}from"../LoadingTableSkeleton/LoadingTableSkeleton.esm.js";import{StatusBar as X}from"../StatusBar/StatusBar.esm.js";const S=U(()=>({topTeamCard:{padding:"var(--bui-space-3) var(--bui-space-5)",minWidth:400},topTeamCardRows:{minHeight:"calc(var(--bui-space-6) * 6.5)"},topTeamCardRow:{display:"flex",flexDirection:"row",gridGap:1,alignItems:"center",width:"100%",padding:"var(--bui-space-2)",marginBottom:"var(--bui-space-2)",backgroundColor:"var(--bui-bg-surface-2)",border:"1px solid var(--bui-bg-surface-2)",borderRadius:"var(--bui-radius-2)"},infoButton:{"&:hover":{backgroundColor:"inherit !important"}},teamName:{width:"75%"},percentBar:{width:"25%"}})),A=({groupRef:o,teamName:i,passPercentage:u,failPercentage:c,warningPercentage:h,notReportedPercentage:P,errorPercentage:R,profileImageMap:g,trackId:n,campaignId:m})=>{const t=S(),l=N(K),I=N(Q);let p;return m?p=I({campaignId:m}):n&&(p=l({trackId:n})),r(k,{className:`${t.topTeamCardRow}`,children:[r(b,{align:"center",gap:"1",style:{flex:1},children:[r(b,{align:"center",gap:"2",className:t.teamName,children:[a(F,{name:i,size:"small",src:g[o]?g[o]:i}),a(w,{children:i})]}),r(b,{align:"center",gap:"1",className:t.percentBar,children:[r(w,{color:"secondary",children:[u,"%"]}),a(X,{passedPercent:u,failedPercent:c,warningPercent:h,notReportedPercent:P,errorPercent:R})]})]}),r(O,{delay:0,children:[a(z,{className:t.infoButton,variant:"tertiary",iconStart:a(W,{}),isDisabled:!n,href:p?`${p}?${q({owners:[o]})}`:void 0}),r(G,{children:["See insights for ",i]})]})]})},Y=({trackStatus:o,isLoading:i,campaignId:u})=>{const c=S(),h=80,P=50,R=j(D),g=f(()=>o?V(o):[],[o]),n=f(()=>g.filter(e=>{const{passed:s,failed:d,warning:M,error:$,notReported:L,exempt:E}=e.status;return s+d+M+$+L+E>0&&!e.children?.length}).sort((e,s)=>(e.status.allPassPercentage??0)-(s.status.allPassPercentage??0)),[g]),m=H(e=>{const s=R.forEntity(e.groupRef).snapshot,d=e.status.failed+e.status.passed+e.status.error+e.status.exempt+e.status.warning+e.status.notReported;return{groupRef:e.groupRef,teamName:s.primaryTitle,passPercentage:e.status.allPassPercentage??0,failPercentage:v(e.status.failed,d),warningPercentage:v(e.status.warning,d),notReportedPercentage:v(e.status.notReported,d),errorPercentage:v(e.status.warning,d),teamInfo:s.secondaryTitle}},[R]),t=f(()=>n.filter(e=>(e.status.allPassPercentage??0)<P).slice(0,3).map(m),[n,m]),l=f(()=>{const e=n.filter(s=>(s.status.allPassPercentage??0)>=h);return e.reverse(),e.slice(0,3).map(m)},[n,m]),I=f(()=>[...l.map(e=>e.groupRef),...t.map(e=>e.groupRef)],[t,l]),{profileImageMap:p}=J(I);return r(b,{children:[r(k,{className:c.topTeamCard,children:[a(w,{variant:"title-x-small",weight:"bold",children:"Teams Needing Attention"}),i&&a(B,{rowCount:3,rowHeight:40}),!i&&r(x,{className:c.topTeamCardRows,children:[!T(t)&&t.map(e=>y(A,{profileImageMap:p??{},...e,key:e.groupRef,trackId:o?.trackId,campaignId:u})),T(t)&&a(C,{title:"No teams eligible",body:`None of your teams are performing below ${P}% compliance.`})]})]}),r(k,{className:c.topTeamCard,children:[a(w,{variant:"title-x-small",weight:"bold",children:"Top Performing Teams"}),i&&a(B,{rowCount:3,rowHeight:40}),!i&&r(x,{className:c.topTeamCardRows,children:[!T(l)&&l.map(e=>y(A,{profileImageMap:p??{},...e,key:e.groupRef,trackId:o?.trackId})),T(l)&&a(C,{title:"No teams eligible",body:`None of your teams are performing above ${h}% compliance.`})]})]})]})};export{Y as TopAndBottomPerformingTeams};
2
+ //# sourceMappingURL=TopAndBottomPerformingTeams.esm.js.map
@@ -1,2 +1,2 @@
1
- import{jsx as r,jsxs as s}from"react/jsx-runtime";import{useRouteRef as T}from"@backstage/core-plugin-api";import{Box as N,Table as R,TableHeader as x,Column as m,TableBody as F,Row as P,Cell as d}from"@backstage/ui";import{makeStyles as B}from"@material-ui/core";import{useState as h,useMemo as g}from"react";import{CircularProgressbar as I}from"react-circular-progressbar";import{useNavigate as E}from"react-router-dom";import{TrackEntityField as H}from"../../graphql/generated/index.esm.js";import{checkDetailsRouteRef as L}from"../../routes.esm.js";import{LoadingTableSkeleton as O}from"../LoadingTableSkeleton/LoadingTableSkeleton.esm.js";const j=B(()=>({customCell:{padding:"0 var(--bui-space-3)"},circularProgressBg:{color:"var(--bui-fg-secondary)",opacity:.25},circularProgressOverlay:{position:"absolute",left:0,color:"var(--bui-fg-danger)"},circularProgressbar:{width:"60%"}}));H.Name;const A=({track:o,checkStatuses:a,certificationStatus:u})=>{const b=j(),[c,k]=h("ascending"),[v,C]=h("name"),y=T(L),w=E(),f=g(()=>!o.levels||!a?[]:o.levels.flatMap(t=>t.checks.map(e=>{const i=a.find(({id:S})=>S===e.id),n=i?i.numberOfEntities-i.notApplicable-i.exempt:0,l=i?.failed??0;return{check:e,failedCount:l,applicableCount:n}}).filter(({failedCount:e})=>e>0)),[o.levels,a]),p=g(()=>[...f].sort((t,e)=>{const i=t.check.name.toLowerCase().trim(),n=e.check.name.toLowerCase().trim(),l=i.localeCompare(n,void 0,{sensitivity:"base"});return c==="ascending"?l:-l}),[f,c]);return a===void 0||u===void 0?r(O,{}):!o.levels?.length||!p.length?r(N,{children:"No Failing Checks"}):s(R,{onSortChange:({direction:t,column:e})=>{C(String(e)),k(t)},sortDescriptor:{direction:c,column:v},children:[s(x,{children:[r(m,{id:"compliance",style:{width:"5%"},children:"Compliance"}),r(m,{id:"name",allowsSorting:!0,isRowHeader:!0,style:{width:"75%"},children:"Name"}),r(m,{id:"failures",style:{width:"20%"},children:"Failures"})]}),r(F,{children:p.map(({check:t,failedCount:e})=>{const i=(e??0)/u.numberOfEntities*100;return s(P,{onAction:()=>w(y({checkId:t.id})),children:[r(d,{leadingIcon:r("div",{className:b.circularProgressbar,children:r(I,{value:i,strokeWidth:12,styles:{path:{stroke:"var(--bui-fg-danger)"},trail:{stroke:'rgba(var("--bui-fg-secondary"), 0.25)'}}})}),title:`${i}%`}),r(d,{title:t.name}),r(d,{title:`${new Intl.NumberFormat().format(e??0)} failing`})]},t.id)})})]})};export{A as TopFailingChecksTableBUI};
1
+ import{jsx as r,jsxs as s,Fragment as E}from"react/jsx-runtime";import{useRouteRef as L}from"@backstage/core-plugin-api";import{Table as x,TableHeader as B,Column as u,TableBody as O,Row as j,Cell as g,TablePagination as A}from"@backstage/ui";import{makeStyles as D}from"@material-ui/core";import{useState as b,useMemo as f}from"react";import{CircularProgressbar as H}from"react-circular-progressbar";import{useNavigate as M}from"react-router-dom";import{TrackEntityField as U}from"../../graphql/generated/index.esm.js";import"@backstage/catalog-model";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{usePagination as $}from"../../hooks/usePagination.esm.js";import"react-use/lib/useLocalStorage";import{trackCheckDetailsRouteRef as z}from"../../routes.esm.js";import{getPercentage as V}from"../../utils/formatters.esm.js";import"../EmptyState/EmptyState.esm.js";import{EmptyStateBUI as W}from"../EmptyState/EmptyStateBUI.esm.js";import"@backstage/plugin-permission-react";import"@remixicon/react";import{LoadingTableSkeleton as Z}from"../LoadingTableSkeleton/LoadingTableSkeleton.esm.js";const q=D(()=>({customCell:{padding:"0 var(--bui-space-3)"},circularProgressBg:{color:"var(--bui-fg-secondary)",opacity:.25},circularProgressOverlay:{position:"absolute",left:0,color:"var(--bui-fg-danger)"},circularProgressbar:{width:"60%"}})),k=10;U.Name;const G=({track:o,checkStatuses:a,certificationStatus:h,searchValue:c})=>{const v=q(),[m,C]=b("ascending"),[y,w]=b("name"),P=L(z),S=M(),n=f(()=>!o.levels||!a?[]:o.levels.flatMap(t=>t.checks.map(e=>{const i=a.find(({id:N})=>N===e.id),p=i?i.numberOfEntities-i.notApplicable-i.exempt:0,l=i?.failed??0;return{check:e,failedCount:l,applicableCount:p}}).filter(({failedCount:e})=>e>0)),[o.levels,a]),d=f(()=>{if(!c?.length)return n;const t=c.toLowerCase();return n.filter(({check:e})=>e.name.toLowerCase().includes(t))},[n,c]),T=f(()=>[...d].sort((t,e)=>{const i=t.check.name.toLowerCase().trim(),p=e.check.name.toLowerCase().trim(),l=i.localeCompare(p,void 0,{sensitivity:"base"});return m==="ascending"?l:-l}),[d,m]),{paginatedItems:I,paginationProps:R}=$({pageParam:"perPage",defaultPageSize:k,items:T}),F=o.levels.length>k;return a===void 0||h===void 0?r(Z,{}):!n.length||!d.length?r(W,{title:"No failing checks",body:"There are no failing checks found."}):s(E,{children:[s(x,{onSortChange:({direction:t,column:e})=>{w(String(e)),C(t)},sortDescriptor:{direction:m,column:y},children:[s(B,{children:[r(u,{id:"compliance",style:{width:"5%"},children:"Compliance"}),r(u,{id:"name",allowsSorting:!0,isRowHeader:!0,style:{width:"75%"},children:"Name"}),r(u,{id:"failures",style:{width:"20%"},children:"Failures"})]}),r(O,{children:I.map(({check:t,failedCount:e})=>{const i=V(e,h.numberOfEntities);return s(j,{onAction:()=>S(P({trackId:o.id,checkId:t.id})),children:[r(g,{leadingIcon:r("div",{className:v.circularProgressbar,children:r(H,{value:i,strokeWidth:12,styles:{path:{stroke:"var(--bui-fg-danger)"},trail:{stroke:'rgba(var("--bui-fg-secondary"), 0.25)'}}})}),title:`${i}%`}),r(g,{title:t.name}),r(g,{title:`${new Intl.NumberFormat().format(e??0)} failing`})]},t.id)})})]}),F&&r(A,{...R})]})};export{G as TopFailingChecksTableBUI};
2
2
  //# sourceMappingURL=TopFailingChecksTableBUI.esm.js.map
@@ -1,2 +1,2 @@
1
- import{jsx as t}from"react/jsx-runtime";import{useEffect as p}from"react";import{TrackFormProvider as n,useTrackFormContext as k}from"../../contexts/TrackFormContext.esm.js";import"../../contexts/CheckFormContext.esm.js";import"../../contexts/CampaignFormContext.esm.js";import"../../contexts/UserProvider.esm.js";import"@backstage/catalog-model";import"@backstage/core-plugin-api";import"@tanstack/react-query";import"../../api.esm.js";import"../../hooks/graphqlKeys.esm.js";import"@backstage/plugin-catalog-react";import"@spotify/backstage-plugin-soundcheck-common";import"../../hooks/useSoundcheckAlert.esm.js";import{useCreateTrack as f}from"../../hooks/tracks/useCreateTrack.esm.js";import"../../hooks/useConfirmationModal.esm.js";import{useNavigateBack as u}from"../../hooks/useNavigateBack.esm.js";import"react-router-dom";import{tracksPageRouteRef as d}from"../../routes.esm.js";import"../SoundcheckHeader/SoundcheckHeader.esm.js";import"../SoundcheckHeader/SoundcheckHeaderContext.esm.js";import{useHeader as g}from"../SoundcheckHeader/useHeader.esm.js";import{TrackForm as h}from"../TrackForm/TrackForm.esm.js";const e=()=>{const{setIsLoading:r}=k(),{mutateAsync:i,isLoading:o}=f();p(()=>{r(o)},[r,o]);const[a,m]=u(d),c=async s=>{await i(s,{onSuccess:m})};return g({title:"Create Track",description:"Create a new track that aligns with your organization's long-term tech health initiatives by entering the details below.",docLink:"https://backstage.spotify.com/docs/plugins/soundcheck/core-concepts/tracks"}),t(h,{handleClose:a,onSave:c})},l=()=>t(n,{children:t(e,{})});export{l as TrackCreatePage,e as TrackCreateView};
1
+ import{jsxs as p,Fragment as u,jsx as r}from"react/jsx-runtime";import{useRouteRef as k}from"@backstage/core-plugin-api";import{Box as f,HeaderPage as l}from"@backstage/ui";import{useEffect as d}from"react";import{TrackFormProvider as g,useTrackFormContext as h}from"../../contexts/TrackFormContext.esm.js";import"../../contexts/CheckFormContext.esm.js";import"../../contexts/CampaignFormContext.esm.js";import"../../contexts/UserProvider.esm.js";import"@backstage/catalog-model";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{useCreateTrack as T}from"../../hooks/tracks/useCreateTrack.esm.js";import"../../hooks/useConfirmationModal.esm.js";import{useNavigateBack as b}from"../../hooks/useNavigateBack.esm.js";import"react-router-dom";import"react-use/lib/useLocalStorage";import{useFeatureFlag as C}from"../../hooks/useFeatureFlag.esm.js";import{tracksPageRouteRef as i}from"../../routes.esm.js";import{DocLinkButton as y}from"../DocLinkButton/DocLinkButton.esm.js";import"../SoundcheckHeader/SoundcheckHeader.esm.js";import"../SoundcheckHeader/SoundcheckHeaderContext.esm.js";import{useHeader as F}from"../SoundcheckHeader/useHeader.esm.js";import{TrackForm as w}from"../TrackForm/TrackForm.esm.js";const a=()=>{const{setIsLoading:t}=h(),{mutateAsync:o,isLoading:e}=T();d(()=>{t(e)},[t,e]);const[c,s]=b(i),m=async n=>{await o(n,{onSuccess:s})};return F({title:"Create Track",description:"Create a new track that aligns with your organization's long-term tech health initiatives by entering the details below.",docLink:"https://backstage.spotify.com/docs/plugins/soundcheck/core-concepts/tracks"}),r(w,{handleClose:c,onSave:m})},x=()=>{const t=C("backstage-ui"),o=k(i);return p(u,{children:[t&&r(f,{children:r(l,{title:"Create Track",breadcrumbs:[{label:"All Tracks",href:o()}],customActions:r(y,{href:"https://backstage.spotify.com/docs/plugins/soundcheck/core-concepts/tracks/"})})}),r(g,{children:r(a,{})})]})};export{x as TrackCreatePage,a as TrackCreateView};
2
2
  //# sourceMappingURL=TrackCreatePage.esm.js.map
@@ -1,2 +1,2 @@
1
- import{jsxs as p,Fragment as s,jsx as o}from"react/jsx-runtime";import{usePermission as n}from"@backstage/plugin-permission-react";import{soundcheckTrackUpdatePermission as d}from"@spotify/backstage-plugin-soundcheck-common";import{useParams as c}from"react-router-dom";import{TrackFormProvider as f}from"../../contexts/TrackFormContext.esm.js";import"../../contexts/CheckFormContext.esm.js";import"../../contexts/CampaignFormContext.esm.js";import"react";import"../../contexts/UserProvider.esm.js";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"../../hooks/useSoundcheckAlert.esm.js";import{useTrack as k}from"../../hooks/tracks/useTrack.esm.js";import"../../hooks/useConfirmationModal.esm.js";import{LoadingIndicator as g}from"../LoadingIndicator/LoadingIndicator.esm.js";import{PageWarningMessage as u}from"../PageWarningMessage/PageWarningMessage.esm.js";import{TrackEditView as l}from"./TrackEditView.esm.js";const P=()=>{const{trackId:i}=c(),{data:r,isLoading:t}=k(i),{loading:m,allowed:a}=n({permission:d,resourceRef:i}),e=a&&r?.isEditable;return p(s,{children:[o(u,{entityName:"track",entityId:i,showNotFound:!t&&!r,showCannotEdit:!m&&!e}),t||m?o(g,{}):r&&e&&o(f,{children:o(l,{track:r,canEdit:a})})]})};export{P as TrackEditPage};
1
+ import{jsxs as d,Fragment as f,jsx as r}from"react/jsx-runtime";import{useRouteRef as s}from"@backstage/core-plugin-api";import{usePermission as k}from"@backstage/plugin-permission-react";import{Box as u,HeaderPage as l}from"@backstage/ui";import{soundcheckTrackUpdatePermission as g}from"@spotify/backstage-plugin-soundcheck-common";import{useParams as h}from"react-router-dom";import{TrackFormProvider as P}from"../../contexts/TrackFormContext.esm.js";import"../../contexts/CheckFormContext.esm.js";import"../../contexts/CampaignFormContext.esm.js";import"react";import"../../contexts/UserProvider.esm.js";import"@backstage/catalog-model";import"@tanstack/react-query";import"../../api.esm.js";import"../../hooks/graphqlKeys.esm.js";import"@backstage/plugin-catalog-react";import"../../hooks/useSoundcheckAlert.esm.js";import{useTrack as b}from"../../hooks/tracks/useTrack.esm.js";import"../../hooks/useConfirmationModal.esm.js";import"react-use/lib/useLocalStorage";import{useFeatureFlag as R}from"../../hooks/useFeatureFlag.esm.js";import{trackDetailsRouteRef as T,tracksPageRouteRef as E}from"../../routes.esm.js";import{DocLinkButton as F}from"../DocLinkButton/DocLinkButton.esm.js";import{LoadingIndicator as w}from"../LoadingIndicator/LoadingIndicator.esm.js";import{PageWarningMessage as x}from"../PageWarningMessage/PageWarningMessage.esm.js";import{TrackEditView as I}from"./TrackEditView.esm.js";const y=()=>{const{trackId:o}=h(),{data:t,isLoading:i}=b(o),{loading:e,allowed:m}=k({permission:g,resourceRef:o}),a=m&&t?.isEditable,c=R("backstage-ui"),p=s(T),n=s(E);return d(f,{children:[c&&r(u,{children:r(l,{title:`Edit ${t?.name??o??"Track"}`,breadcrumbs:[{label:"All Tracks",href:n()},{label:"Details",href:p({trackId:o??""})}],customActions:r(F,{href:"https://backstage.spotify.com/docs/plugins/soundcheck/core-concepts/tracks/"})})}),r(x,{entityName:"track",entityId:o,showNotFound:!i&&!t,showCannotEdit:!e&&!a}),i||e?r(w,{}):t&&a&&r(P,{children:r(I,{track:t,canEdit:m})})]})};export{y as TrackEditPage};
2
2
  //# sourceMappingURL=TrackEditPage.esm.js.map
@@ -1,2 +1,2 @@
1
- import{jsx as l}from"react/jsx-runtime";import{useEffect as i,useCallback as f}from"react";import{useTrackFormContext as g}from"../../contexts/TrackFormContext.esm.js";import"../../contexts/CheckFormContext.esm.js";import"../../contexts/CampaignFormContext.esm.js";import"../../contexts/UserProvider.esm.js";import"@backstage/catalog-model";import"@backstage/core-plugin-api";import"@tanstack/react-query";import"../../api.esm.js";import"../../hooks/graphqlKeys.esm.js";import"@backstage/plugin-catalog-react";import"@spotify/backstage-plugin-soundcheck-common";import"../../hooks/useSoundcheckAlert.esm.js";import"../../hooks/useConfirmationModal.esm.js";import{useNavigateBack as y}from"../../hooks/useNavigateBack.esm.js";import"react-router-dom";import{useUpdateTrack as E}from"../../hooks/tracks/useUpdateTrack.esm.js";import{tracksPageRouteRef as h}from"../../routes.esm.js";import"../SoundcheckHeader/SoundcheckHeader.esm.js";import"../SoundcheckHeader/SoundcheckHeaderContext.esm.js";import{useHeader as T}from"../SoundcheckHeader/useHeader.esm.js";import{TrackForm as w}from"../TrackForm/TrackForm.esm.js";const b=({track:t,canEdit:p})=>{const{setSelectedItem:e,setIsLoading:m,selectedItem:n,showReadOnly:r}=g(),{mutateAsync:s,isLoading:c}=E();i(()=>m(c),[m,c]);const o=!p||!t.isEditable;i(()=>{o?r(t):e(t)},[t,e,o,r]);const[d,a]=y(h),k=f(async u=>{await s(u,{onSuccess:a})},[a,s]);return i(()=>{},[t,r,o]),T({title:`${o?"View":"Edit"} Track`,description:"Edit your track's details to match your needs.",docLink:"https://backstage.spotify.com/docs/plugins/soundcheck/core-concepts/tracks"}),n?l(w,{handleClose:d,onSave:k}):null};export{b as TrackEditView};
1
+ import{jsx as l}from"react/jsx-runtime";import{useEffect as i,useCallback as f}from"react";import{useTrackFormContext as g}from"../../contexts/TrackFormContext.esm.js";import"../../contexts/CheckFormContext.esm.js";import"../../contexts/CampaignFormContext.esm.js";import"../../contexts/UserProvider.esm.js";import"@backstage/catalog-model";import"@backstage/core-plugin-api";import"@tanstack/react-query";import"../../api.esm.js";import"../../hooks/graphqlKeys.esm.js";import"@backstage/plugin-catalog-react";import"@spotify/backstage-plugin-soundcheck-common";import"../../hooks/useSoundcheckAlert.esm.js";import"../../hooks/useConfirmationModal.esm.js";import{useNavigateBack as y}from"../../hooks/useNavigateBack.esm.js";import"react-router-dom";import"react-use/lib/useLocalStorage";import{useUpdateTrack as E}from"../../hooks/tracks/useUpdateTrack.esm.js";import{tracksPageRouteRef as h}from"../../routes.esm.js";import"../SoundcheckHeader/SoundcheckHeader.esm.js";import"../SoundcheckHeader/SoundcheckHeaderContext.esm.js";import{useHeader as T}from"../SoundcheckHeader/useHeader.esm.js";import{TrackForm as w}from"../TrackForm/TrackForm.esm.js";const b=({track:t,canEdit:p})=>{const{setSelectedItem:e,setIsLoading:m,selectedItem:n,showReadOnly:r}=g(),{mutateAsync:s,isLoading:c}=E();i(()=>m(c),[m,c]);const o=!p||!t.isEditable;i(()=>{o?r(t):e(t)},[t,e,o,r]);const[d,a]=y(h),k=f(async u=>{await s(u,{onSuccess:a})},[a,s]);return i(()=>{},[t,r,o]),T({title:`${o?"View":"Edit"} Track`,description:"Edit your track's details to match your needs.",docLink:"https://backstage.spotify.com/docs/plugins/soundcheck/core-concepts/tracks"}),n?l(w,{handleClose:d,onSave:k}):null};export{b as TrackEditView};
2
2
  //# sourceMappingURL=TrackEditView.esm.js.map
@@ -1,2 +1,2 @@
1
- import{jsx as e}from"react/jsx-runtime";import{Content as d}from"@backstage/core-components";import{FormProvider as c}from"react-hook-form";import{useTrackFormContext as f}from"../../contexts/TrackFormContext.esm.js";import"../../contexts/CheckFormContext.esm.js";import"../../contexts/CampaignFormContext.esm.js";import"react";import"../../contexts/UserProvider.esm.js";import{formStyles as S}from"../../utils/formStyles.esm.js";import{FormFilterSection as u}from"../FormFilterSection/FormFilterSection.esm.js";import{FormStepper as F}from"../FormStepper/FormStepper.esm.js";import{LevelsStepNew as h}from"./Steps/LevelsStep/LevelsStepNew.esm.js";import{TrackDetailsStep as b}from"./Steps/TrackDetailsStep/TrackDetailsStep.esm.js";import{TrackStepNameMapping as k}from"./utils/types.esm.js";import"./utils/validation.esm.js";import{TRACK_FIELDS as y}from"./utils/trackFormUtils.esm.js";import{useTrackForm as g}from"./utils/useTrackForm.esm.js";const x=({onSave:m,handleClose:l})=>{const{selectedItem:a,isLoading:n,isReadOnly:r}=f(),p=S(),{formMethods:t,onSubmit:i}=g(m),o=[{label:"Enter track details",content:()=>e(b,{})},{label:"Add levels",content:()=>e(h,{})},{label:"Choose the affected entities (Optional)",content:()=>e(u,{name:"filtersStep.filter",keyValueFilterName:"filtersStep.keyValueFilter",disabled:r,description:y.filter.description,excludeFilterName:"filtersStep.excludeFilter",excludeKeyValueFilterName:"filtersStep.excludeKeyValueFilter"})}],s=a?[...Array(o.length).keys()]:[0];return e(d,{className:p.formWrapper,children:e(c,{...t,children:e("form",{onSubmit:t.handleSubmit(i),children:e(F,{onClose:l,handleSubmit:t.handleSubmit,trigger:t.trigger,onSubmit:i,initialVisited:s,stepNameMap:k,steps:o,isLoading:n,isReadOnly:r,saveButtonText:"Save Track"})})})})};export{x as TrackForm};
1
+ import{jsx as e}from"react/jsx-runtime";import{Content as d}from"@backstage/core-components";import{FormProvider as f}from"react-hook-form";import{useTrackFormContext as u}from"../../contexts/TrackFormContext.esm.js";import"../../contexts/CheckFormContext.esm.js";import"../../contexts/CampaignFormContext.esm.js";import"react";import"../../contexts/UserProvider.esm.js";import{useFeatureFlag as S}from"../../hooks/useFeatureFlag.esm.js";import{formStyles as F}from"../../utils/formStyles.esm.js";import{FormFilterSection as b}from"../FormFilterSection/FormFilterSection.esm.js";import{FormStepper as h}from"../FormStepper/FormStepper.esm.js";import{LevelsStepNew as k}from"./Steps/LevelsStep/LevelsStepNew.esm.js";import{TrackDetailsStep as g}from"./Steps/TrackDetailsStep/TrackDetailsStep.esm.js";import{TrackStepNameMapping as y}from"./utils/types.esm.js";import"./utils/validation.esm.js";import{TRACK_FIELDS as x}from"./utils/trackFormUtils.esm.js";import{useTrackForm as T}from"./utils/useTrackForm.esm.js";const N=({onSave:l,handleClose:a})=>{const{selectedItem:p,isLoading:n,isReadOnly:r}=u(),o=F(),s=S("backstage-ui"),{formMethods:t,onSubmit:i}=T(l),m=[{label:"Enter track details",content:()=>e(g,{})},{label:"Add levels",content:()=>e(k,{})},{label:"Choose the affected entities (Optional)",content:()=>e(b,{name:"filtersStep.filter",keyValueFilterName:"filtersStep.keyValueFilter",disabled:r,description:x.filter.description,excludeFilterName:"filtersStep.excludeFilter",excludeKeyValueFilterName:"filtersStep.excludeKeyValueFilter"})}],c=p?[...Array(m.length).keys()]:[0];return e(d,{className:s?o.formWrapperBUI:o.formWrapper,children:e(f,{...t,children:e("form",{onSubmit:t.handleSubmit(i),children:e(h,{onClose:a,handleSubmit:t.handleSubmit,trigger:t.trigger,onSubmit:i,initialVisited:c,stepNameMap:y,steps:m,isLoading:n,isReadOnly:r,saveButtonText:"Save Track"})})})})};export{N as TrackForm};
2
2
  //# sourceMappingURL=TrackForm.esm.js.map
@@ -1,2 +1,2 @@
1
- import{zodResolver as k}from"@hookform/resolvers/zod";import{useMemo as T,useEffect as R}from"react";import{useForm as V}from"react-hook-form";import{v4 as g}from"uuid";import{useTrackFormContext as h}from"../../../contexts/TrackFormContext.esm.js";import"../../../contexts/CheckFormContext.esm.js";import"../../../contexts/CampaignFormContext.esm.js";import"react/jsx-runtime";import{useLoggedInUser as E}from"../../../contexts/UserProvider.esm.js";import{BadgeVariant as w}from"../../../graphql/generated/index.esm.js";import"@backstage/catalog-model";import"@backstage/core-plugin-api";import"@tanstack/react-query";import"../../../api.esm.js";import"../../../hooks/graphqlKeys.esm.js";import"@backstage/plugin-catalog-react";import"@spotify/backstage-plugin-soundcheck-common";import"../../../hooks/useSoundcheckAlert.esm.js";import{useConfirmationModal as x}from"../../../hooks/useConfirmationModal.esm.js";import"react-router-dom";import{useGetChecksMap as L}from"../../../hooks/tracks/useGetChecksMap.esm.js";import{mapInputFilterToFormFilters as d,mapCatalogFilterToFormKeyValueFilters as c,mapFiltersToCatalogFilter as u}from"../../Filter/utils.esm.js";import"../../Filter/FilterComponent.esm.js";import{emptyFilters as f,emptyKeyValueFilters as y}from"../../Filter/types.esm.js";import{trackFormSchema as C}from"./validation.esm.js";const F={detailsStep:{name:"",description:"",ownerEntityRef:"",badgeType:"status",draft:!1},levelsStep:{levels:[{name:"Level 1",description:"",checks:[]}]},filtersStep:{filter:f(),keyValueFilter:y(),excludeFilter:f(),excludeKeyValueFilter:y()}},S=({name:e,description:r,ownerEntityRef:o,filter:t,levels:i,documentationURL:a,badge:p,exclude:l,draft:n})=>({detailsStep:{name:e,ownerEntityRef:o,description:r??"",documentationURL:a??void 0,badgeType:p?.variant===w.Status?"status":"medal",draft:n??!1},levelsStep:{levels:i?.map(m=>({name:m.name??`Level ${m.ordinal}`??"Level 1",description:m.description??"",checks:m.checks.map(s=>({id:s.id,name:s.name??s.id,description:s.description??""}))}))||[]},filtersStep:{filter:d(t),keyValueFilter:c(t),excludeFilter:d(l),excludeKeyValueFilter:c(l)}}),v=(e,r,o)=>({id:o?.id??g(),ownerEntityRef:e.detailsStep.ownerEntityRef,description:e.detailsStep.description,name:e.detailsStep.name,documentationURL:e.detailsStep.documentationURL??"",badgeType:e.detailsStep.badgeType,type:o?.type??"standard",levels:e.levelsStep.levels?.map((t,i)=>({ordinal:i+1,name:t.name??"",description:t.description??"",checks:t.checks.map(a=>r[a.id])})),filter:u(e.filtersStep.filter,e.filtersStep.keyValueFilter),exclude:u(e.filtersStep.excludeFilter,e.filtersStep.excludeKeyValueFilter),draft:e.detailsStep.draft??!1}),M=e=>{const{selectedItem:r}=h(),o=T(()=>r?S(r):F,[r]),t=V({defaultValues:o,mode:"onChange",resolver:k(C)}),{userEntityRef:i}=E();R(()=>{!r&&i&&!t.getValues("detailsStep.ownerEntityRef")&&t.setValue("detailsStep.ownerEntityRef",i)},[r,i,t]);const{checksMap:a}=L(),{showModal:p}=x();return{formMethods:t,onSubmit:async l=>{if(!await p({title:"Save Track",message:`Are you sure you want to save track: ${l.detailsStep.name}?`,error:!1}))return;const n=v(l,a??{},r);e(n)}}};export{F as DEFAULT_TRACK_FORM_VALUES,v as mapTrackFormToInput,S as mapTrackToFormValues,M as useTrackForm};
1
+ import{zodResolver as k}from"@hookform/resolvers/zod";import{useMemo as T,useEffect as R}from"react";import{useForm as V}from"react-hook-form";import{v4 as g}from"uuid";import{useTrackFormContext as h}from"../../../contexts/TrackFormContext.esm.js";import"../../../contexts/CheckFormContext.esm.js";import"../../../contexts/CampaignFormContext.esm.js";import"react/jsx-runtime";import{useLoggedInUser as E}from"../../../contexts/UserProvider.esm.js";import{BadgeVariant as w}from"../../../graphql/generated/index.esm.js";import"@backstage/catalog-model";import"@backstage/core-plugin-api";import"@tanstack/react-query";import"../../../api.esm.js";import"../../../hooks/graphqlKeys.esm.js";import"@backstage/plugin-catalog-react";import"@spotify/backstage-plugin-soundcheck-common";import"../../../hooks/useSoundcheckAlert.esm.js";import{useConfirmationModal as x}from"../../../hooks/useConfirmationModal.esm.js";import"react-router-dom";import"react-use/lib/useLocalStorage";import{useGetChecksMap as L}from"../../../hooks/tracks/useGetChecksMap.esm.js";import{mapInputFilterToFormFilters as d,mapCatalogFilterToFormKeyValueFilters as c,mapFiltersToCatalogFilter as u}from"../../Filter/utils.esm.js";import"../../Filter/FilterComponent.esm.js";import{emptyFilters as f,emptyKeyValueFilters as y}from"../../Filter/types.esm.js";import{trackFormSchema as C}from"./validation.esm.js";const F={detailsStep:{name:"",description:"",ownerEntityRef:"",badgeType:"status",draft:!1},levelsStep:{levels:[{name:"Level 1",description:"",checks:[]}]},filtersStep:{filter:f(),keyValueFilter:y(),excludeFilter:f(),excludeKeyValueFilter:y()}},S=({name:e,description:r,ownerEntityRef:o,filter:t,levels:i,documentationURL:a,badge:p,exclude:l,draft:n})=>({detailsStep:{name:e,ownerEntityRef:o,description:r??"",documentationURL:a??void 0,badgeType:p?.variant===w.Status?"status":"medal",draft:n??!1},levelsStep:{levels:i?.map(m=>({name:m.name??`Level ${m.ordinal}`??"Level 1",description:m.description??"",checks:m.checks.map(s=>({id:s.id,name:s.name??s.id,description:s.description??""}))}))||[]},filtersStep:{filter:d(t),keyValueFilter:c(t),excludeFilter:d(l),excludeKeyValueFilter:c(l)}}),v=(e,r,o)=>({id:o?.id??g(),ownerEntityRef:e.detailsStep.ownerEntityRef,description:e.detailsStep.description,name:e.detailsStep.name,documentationURL:e.detailsStep.documentationURL??"",badgeType:e.detailsStep.badgeType,type:o?.type??"standard",levels:e.levelsStep.levels?.map((t,i)=>({ordinal:i+1,name:t.name??"",description:t.description??"",checks:t.checks.map(a=>r[a.id])})),filter:u(e.filtersStep.filter,e.filtersStep.keyValueFilter),exclude:u(e.filtersStep.excludeFilter,e.filtersStep.excludeKeyValueFilter),draft:e.detailsStep.draft??!1}),M=e=>{const{selectedItem:r}=h(),o=T(()=>r?S(r):F,[r]),t=V({defaultValues:o,mode:"onChange",resolver:k(C)}),{userEntityRef:i}=E();R(()=>{!r&&i&&!t.getValues("detailsStep.ownerEntityRef")&&t.setValue("detailsStep.ownerEntityRef",i)},[r,i,t]);const{checksMap:a}=L(),{showModal:p}=x();return{formMethods:t,onSubmit:async l=>{if(!await p({title:"Save Track",message:`Are you sure you want to save track: ${l.detailsStep.name}?`,error:!1}))return;const n=v(l,a??{},r);e(n)}}};export{F as DEFAULT_TRACK_FORM_VALUES,v as mapTrackFormToInput,S as mapTrackToFormValues,M as useTrackForm};
2
2
  //# sourceMappingURL=useTrackForm.esm.js.map
@@ -1,2 +1,2 @@
1
- import{jsx as t,jsxs as d,Fragment as ee}from"react/jsx-runtime";import{stringifyEntityRef as x,parseEntityRef as te,RELATION_OWNED_BY as ie,RELATION_PART_OF as ne}from"@backstage/catalog-model";import{useRouteRef as re}from"@backstage/core-plugin-api";import{entityRouteRef as ae,getEntityRelations as L,humanizeEntityRef as B}from"@backstage/plugin-catalog-react";import{Table as oe,TableHeader as se,Column as g,TableBody as le,TablePagination as ce,Row as pe,Cell as u,Flex as fe,Box as N,Text as de,CellProfile as ge}from"@backstage/ui";import{makeStyles as me}from"@material-ui/core";import{compact as ye,uniq as ue}from"lodash";import{useState as T,useEffect as O,useCallback as D,useMemo as we}from"react";import{useNavigate as he}from"react-router-dom";import{TrackEntityField as a,Direction as F}from"../../../graphql/generated/index.esm.js";import{useEntitiesByRefs as Ie}from"../../../hooks/catalog/useEntitiesByRefs.esm.js";import{useProfileImages as Se}from"../../../hooks/catalog/useProfileImages.esm.js";import{useTrackEntities as ke}from"../../../hooks/entities/useTrackEntities.esm.js";import{getCheckStatusPercentages as Pe}from"../../../utils/checks.esm.js";import"../../CheckStatusBar/CheckStatusBar.esm.js";import{CheckStatusBarBUI as Re}from"../../CheckStatusBar/CheckStatusBarBUI.esm.js";import{CustomCell as Ce}from"../../CustomCell/CustomCell.esm.js";import{LoadingTableSkeleton as Ee}from"../../LoadingTableSkeleton/LoadingTableSkeleton.esm.js";import{toTrackEntityRow as Be}from"./utils.esm.js";const Te=10,j=o=>{const{lifecycles:w,owners:l,types:c,systems:p}=o,m=w?.length?{"spec.lifecycle":w}:void 0,y=l?.length?{"relations.ownedBy":l}:void 0,k=c?.length?{"spec.type":c}:void 0,h=p?.length?{"relations.partOf":p}:void 0;return{...m,...y,...k,...h}},be=me(o=>({tableContainer:{display:"flex",flexDirection:"column",height:"100%"},passed:{color:`${o.palette.success.main} !important`},failed:{color:`${o.palette.error.main} !important`},statusBar:{width:"30%"}})),ve={name:a.Name,owner:a.Owner,certificationLevel:a.CertificationLevel,checkPassRate:a.CheckPassRate,system:a.System,type:a.Type,lifecycle:a.Lifecycle},ze=({track:o,initialPageSize:w,lifecycles:l,owners:c,types:p,systems:m,certificationStatus:y})=>{const k=be(),h=he(),b=re(ae),[P,A]=T("ascending"),[I,_]=T("name"),[i,S]=T({orderBy:void 0,filter:j({lifecycles:l,owners:c,types:p,systems:m}),pageInfo:{page:0,pageSize:w??Te,direction:"forward",cursor:null}});O(()=>{S(e=>({...e,pageInfo:{...e.pageInfo,page:0,cursor:null},filter:j({lifecycles:l,owners:c,types:p,systems:m}),certificationStatus:y}))},[l,c,p,m,y]);const{data:f,isLoading:K}=ke({trackId:o.id,orderBy:i.orderBy,filter:i.filter,[i.pageInfo.direction==="forward"?"first":"last"]:i.pageInfo.pageSize,[i.pageInfo.direction==="forward"?"after":"before"]:i.pageInfo.cursor,certificationStatus:y}),M=f?.trackEntities.edges.map(e=>e.node.entityRef)??[],{data:$,isLoading:H}=Ie({entityRefs:M}),v=ye(f?.trackEntities.edges.map(e=>{const n=$?.items.find(r=>!!r&&x(r)===e.node.entityRef);return n?Be({trackDetails:e.node,track:o,entity:n}):void 0}))??[],U=ue(v.flatMap(e=>e.entity.relations?.filter(({type:n,targetRef:r})=>n==="ownedBy"&&r).map(n=>n.targetRef)||[])),{profileImageMap:q}=Se(U);O(()=>{let e;I?e={field:ve[I]??a.Name,direction:P==="ascending"?F.Asc:F.Desc}:e=void 0,S(n=>({...n,orderBy:e,pageInfo:{...n.pageInfo,page:0,cursor:null}}))},[S,I,P]);const R=D((e,n)=>{const r=e>i.pageInfo.page?"forward":"backward",C=r==="forward"?f?.trackEntities.pageInfo.endCursor??null:f?.trackEntities.pageInfo.startCursor??null;S({...i,pageInfo:{page:e,pageSize:n,direction:r,cursor:C}})},[f,i]),W=D(e=>{const n=te(x(e)),r=b(n);h(`${r}/soundcheck`)},[h,b]),Y=({row:e})=>{const n=L(e.entity,ie).map(s=>B(s,{defaultKind:"group"})).join(", "),r=e.entity.relations?.find(({type:s})=>s==="ownedBy")?.targetRef,C=L(e.entity,ne,{kind:"system"}).map(s=>B(s,{defaultKind:"system"})).join(", ");let E;r&&(E=q?.[r]);const G=B(e.entity,{defaultKind:"Component"}),{passPercent:z,failPercent:J,warningPercent:Q}=we(()=>{const s=e.status.passed+e.status.failed+e.status.warning+e.status.error+e.status.notReported,{passPercentage:V,failPercentage:X,warningPercentage:Z}=Pe(e.status.passed,e.status.failed,e.status.warning,s);return{passPercent:V,failPercent:X,warningPercent:Z}},[e.status]);return d(pe,{onAction:()=>W(e.entity),children:[t(u,{title:G}),t(Ce,{children:d(fe,{align:"center",gap:"2",children:[t(N,{children:d(de,{children:[z,"%"]})}),t(N,{className:k.statusBar,children:t(Re,{passedPercent:z,failedPercent:J,warningPercent:Q})})]})}),t(u,{title:C}),t(u,{title:e.entity.spec?.type}),t(u,{title:e.entity.spec?.lifecycle}),E?t(ge,{name:n,src:E}):t(u,{title:n})]},e.id)};return K||H?t(Ee,{}):d(ee,{children:[d(oe,{onSortChange:({direction:e,column:n})=>{_(String(n)),A(e)},sortDescriptor:{direction:P,column:I},children:[d(se,{children:[t(g,{id:"name",allowsSorting:!0,isRowHeader:!0,style:{width:"35%"},children:"Name"}),t(g,{id:"checks",style:{width:"15%"},children:"Checks"}),t(g,{id:"system",allowsSorting:!0,style:{width:"15%"},children:"System"}),t(g,{id:"type",allowsSorting:!0,style:{width:"10%"},children:"Type"}),t(g,{id:"lifecycle",allowsSorting:!0,style:{width:"10%"},children:"Lifecycle"}),t(g,{id:"owner",allowsSorting:!0,style:{width:"15%"},children:"Owner"})]}),t(le,{children:v.map(e=>t(Y,{row:e},e.id))})]}),t(ce,{offset:i.pageInfo.page*i.pageInfo.pageSize,tabIndex:i.pageInfo.page,showPageSizeOptions:!0,pageSize:i.pageInfo.pageSize,rowCount:f?.trackEntities.totalCount??0,onPreviousPage:()=>R(i.pageInfo.page-1,i.pageInfo.pageSize),onNextPage:()=>R(i.pageInfo.page+1,i.pageInfo.pageSize),onPageSizeChange:e=>R(i.pageInfo.page,e)})]})};export{ze as TrackEntitiesTableBUI};
1
+ import{jsx as t,jsxs as y,Fragment as le}from"react/jsx-runtime";import{stringifyEntityRef as F,parseEntityRef as ce,RELATION_OWNED_BY as me,RELATION_PART_OF as de}from"@backstage/catalog-model";import{useRouteRef as pe}from"@backstage/core-plugin-api";import{entityRouteRef as fe,getEntityRelations as M,humanizeEntityRef as b}from"@backstage/plugin-catalog-react";import{Table as ye,TableHeader as ue,Column as c,TableBody as ge,TablePagination as he,Row as we,Flex as K,Cell as P,Box as $,Text as Re,CellProfile as ke}from"@backstage/ui";import{makeStyles as Pe}from"@material-ui/core";import{compact as Se,uniq as Be}from"lodash";import{useState as v,useMemo as n,useEffect as Te,useCallback as Ee}from"react";import{useNavigate as Ce}from"react-router-dom";import{TrackEntityField as l,Direction as q}from"../../../graphql/generated/index.esm.js";import"@tanstack/react-query";import"../../../api.esm.js";import"../../../hooks/graphqlKeys.esm.js";import"@spotify/backstage-plugin-soundcheck-common";import"../../../hooks/useSoundcheckAlert.esm.js";import"../../../hooks/useConfirmationModal.esm.js";import{usePagination as be}from"../../../hooks/usePagination.esm.js";import"react-use/lib/useLocalStorage";import{useEntitiesByRefs as ve}from"../../../hooks/catalog/useEntitiesByRefs.esm.js";import{useProfileImages as Le}from"../../../hooks/catalog/useProfileImages.esm.js";import{useTrackEntities as xe}from"../../../hooks/entities/useTrackEntities.esm.js";import{getPercentage as w}from"../../../utils/formatters.esm.js";import{CertificationBadge as Ne}from"../../Badges/CertificationBadge.esm.js";import{CustomCell as z}from"../../CustomCell/CustomCell.esm.js";import"../../EmptyState/EmptyState.esm.js";import{EmptyStateBUI as Ie}from"../../EmptyState/EmptyStateBUI.esm.js";import"@backstage/plugin-permission-react";import"@remixicon/react";import"../../../routes.esm.js";import{LoadingTableSkeleton as Oe}from"../../LoadingTableSkeleton/LoadingTableSkeleton.esm.js";import{StatusBar as De}from"../../StatusBar/StatusBar.esm.js";import{toTrackEntityRow as Ae}from"./utils.esm.js";const H=10,Q=a=>{const{lifecycles:m,owners:d,types:p,systems:f}=a,u=m?.length?{"spec.lifecycle":m}:void 0,g=d?.length?{"relations.ownedBy":d}:void 0,S=p?.length?{"spec.type":p}:void 0,B=f?.length?{"relations.partOf":f}:void 0;return{...u,...g,...S,...B}},_e=Pe(a=>({tableContainer:{display:"flex",flexDirection:"column",height:"100%"},passed:{color:`${a.palette.success.main} !important`},failed:{color:`${a.palette.error.main} !important`},statusBar:{width:"30%"}})),je={name:l.Name,owner:l.Owner,certificationLevel:l.CertificationLevel,checkPassRate:l.CheckPassRate,system:l.System,type:l.Type,lifecycle:l.Lifecycle},Fe=({track:a,lifecycles:m,owners:d,types:p,systems:f,certificationStatus:u,searchValue:g,isCampaign:S})=>{const B=_e(),L=Ce(),x=pe(fe),[T,U]=v("ascending"),[R,V]=v("name"),[N,I]=v({orderBy:void 0,filter:Q({lifecycles:m,owners:d,types:p,systems:f})}),{data:k,isLoading:W}=xe({trackId:a?.id??"",orderBy:N.orderBy,filter:N.filter,certificationStatus:u}),h=n(()=>k?.trackEntities.edges??[],[k]),Y=n(()=>k?.trackEntities.totalCount??0,[k])>H,G=h.map(e=>e.node.entityRef)??[],{data:E,isLoading:J}=ve({entityRefs:G}),C=n(()=>!a||!h?.length||!E?.items?.length?[]:Se(h.map(e=>{const i=E.items.find(o=>!!o&&F(o)===e.node.entityRef);return i?Ae({trackDetails:e.node,track:a,entity:i}):void 0})),[h,E?.items,a]),O=n(()=>{if(!g?.length)return C;const e=g.toLowerCase().trim();return C.filter(({entity:i})=>i.metadata.name.toLowerCase().includes(e))},[C,g]),{paginatedItems:D,paginationProps:X}=be({pageParam:"perPage",defaultPageSize:H,items:O}),Z=Be(D.flatMap(e=>e.entity.relations?.filter(({type:i,targetRef:o})=>i==="ownedBy"&&o).map(i=>i.targetRef)||[])),{profileImageMap:ee}=Le(Z);Te(()=>{let e;R?e={field:je[R]??l.Name,direction:T==="ascending"?q.Asc:q.Desc}:e=void 0,I(i=>({...i,orderBy:e,filter:Q({lifecycles:m,owners:d,types:p,systems:f}),certificationStatus:u}))},[I,R,T,u,m,d,f,p]);const te=Ee(e=>{const i=ce(F(e)),o=x(i);L(`${o}/soundcheck`)},[L,x]),ie=({row:e})=>{const i=M(e.entity,me).map(s=>b(s,{defaultKind:s.kind})).join(", "),o=e.entity.relations?.find(({type:s})=>s==="ownedBy")?.targetRef,re=M(e.entity,de,{kind:"system"}).map(s=>b(s,{defaultKind:"system"})).join(", ");let A;o&&(A=ee?.[o]);const _=b(e.entity,{defaultKind:e.entity.kind}),r=n(()=>(e.status?.passed??0)+(e.status?.failed??0)+(e.status?.warning??0)+(e.status?.error??0)+(e.status?.notReported??0)+(e.status?.exempt??0),[e.status]),j=n(()=>{let s;return e.status?.allPassPercentage!==null&&e.status?.allPassPercentage!==void 0?s=e.status.allPassPercentage:e.status&&(s=w(e.status.passed+e.status.exempt,r)),s},[e.status,r]),se=n(()=>w(e.status?.failed,r),[e.status,r]),ne=n(()=>w(e.status?.warning,r),[e.status,r]),ae=n(()=>w(e.status?.notReported,r),[e.status,r]),oe=n(()=>w(e.status?.error,r),[e.status,r]);return y(we,{onAction:()=>te(e.entity),children:[t(z,{children:t(K,{children:t(Ne,{badge:e.badge,trackType:S?"campaign":void 0})})}),t(P,{title:_}),t(z,{children:y(K,{align:"center",gap:"2",children:[t($,{children:y(Re,{children:[j,"%"]})}),t($,{className:B.statusBar,children:t(De,{passedPercent:j,failedPercent:se,warningPercent:ne,notReportedPercent:ae,errorPercent:oe})})]})}),t(P,{title:re}),t(P,{title:e.entity.spec?.type}),t(P,{title:e.entity.spec?.lifecycle}),t(ke,{name:i,src:A??_})]},e.id)};return W||J?t(Oe,{}):!h.length||!O.length?t(Ie,{title:"No track entities found",body:"There are no track entities found."}):y(le,{children:[y(ye,{onSortChange:({direction:e,column:i})=>{V(String(i)),U(e)},sortDescriptor:{direction:T,column:R},children:[y(ue,{children:[t(c,{id:"state",style:{width:"5%"}}),t(c,{id:"name",allowsSorting:!0,isRowHeader:!0,style:{width:"30%"},children:"Name"}),t(c,{id:"checks",style:{width:"15%"},children:"Checks"}),t(c,{id:"system",allowsSorting:!0,style:{width:"15%"},children:"System"}),t(c,{id:"type",allowsSorting:!0,style:{width:"10%"},children:"Type"}),t(c,{id:"lifecycle",allowsSorting:!0,style:{width:"10%"},children:"Lifecycle"}),t(c,{id:"owner",allowsSorting:!0,style:{width:"15%"},children:"Owner"})]}),t(ge,{children:D.map(e=>t(ie,{row:e},e.id))})]}),Y&&t(he,{...X})]})};export{Fe as TrackEntitiesTableBUI};
2
2
  //# sourceMappingURL=TrackEntitiesTableBUI.esm.js.map
@@ -0,0 +1,2 @@
1
+ import{jsx as i,jsxs as e}from"react/jsx-runtime";import{Box as m}from"@backstage/ui";import{makeStyles as f,useTheme as p}from"@material-ui/core";import{ResponsiveContainer as g,AreaChart as h,CartesianGrid as b,XAxis as v,YAxis as n,Tooltip as y,Area as s}from"recharts";import{compactNumberFormatter as u}from"../../utils/formatters.esm.js";import{getTrackHistoryLineChartData as k,getChartColors as x,formatTrackHistoryChartTooltip as L}from"../Charts/chartUtils.esm.js";import{LoadingTableSkeleton as A}from"../LoadingTableSkeleton/LoadingTableSkeleton.esm.js";const C=f(()=>({container:{height:180,overflow:"hidden"},"@global":{".recharts-default-tooltip li":{margin:"0 !important",padding:"0 !important"}}})),I=({track:a,history:o})=>{const l=C(),d=k(o),c=p(),t=x(c);return!a||!o?i(A,{}):i(m,{className:l.container,children:i(g,{debounce:1,children:e(h,{data:d,margin:{top:0,right:0,bottom:0,left:0},children:[e("defs",{children:[a?.levels.map(r=>e("linearGradient",{id:`gradient-${r.ordinal}`,x1:"0",y1:"0",x2:"0",y2:"1",children:[i("stop",{offset:"5%",stopColor:t[r.ordinal%t.length],stopOpacity:.4}),i("stop",{offset:"95%",stopColor:t[r.ordinal%t.length],stopOpacity:0})]},`gradient-${r.ordinal}`)),e("linearGradient",{id:"gradient-no-level",x1:"0",y1:"0",x2:"0",y2:"1",children:[i("stop",{offset:"5%",stopColor:"var(--bui-fg-disabled)",stopOpacity:.4}),i("stop",{offset:"95%",stopColor:"var(--bui-fg-disabled)",stopOpacity:0})]})]}),i(b,{stroke:"var(--bui-border)",strokeWidth:1,horizontal:!0,vertical:!1}),i(v,{dataKey:"name",tickLine:!1,axisLine:!1}),i(n,{yAxisId:"left",domain:[0,100],axisLine:!1,tickLine:!1,tickFormatter:r=>`${r}%`,ticks:[0,25,50,75,100]}),i(n,{yAxisId:"right",orientation:"right",domain:[0,Math.max(o?.certificationStatusHistory.numberOfEntities,1)],axisLine:!1,tickLine:!1,tickFormatter:r=>u(r)}),i(y,{contentStyle:{backgroundColor:"var(--bui-bg-surface-1)",color:"var(--bui-fg-secondary)",border:"1px solid var(--bui-border)",borderRadius:"var(--bui-radius-3)"},cursor:{stroke:"var(--bui-fg-secondary)",strokeWidth:1},formatter:r=>L(r,o)}),a?.levels?.map(r=>i(s,{type:"monotone",dataKey:`Level ${r.ordinal}`,name:r.name??`Level ${r.ordinal}`,stackId:"1",yAxisId:"right",stroke:t[r.ordinal%t.length]||"var(--bui-fg-disabled)",strokeWidth:2,fill:`url(#gradient-${r.ordinal})`,isAnimationActive:!1,activeDot:{fill:t[r.ordinal%t.length]||"var(--bui-fg-disabled)",stroke:"var(--bui-fg-secondary)",strokeWidth:1,r:5}},`Level ${r.ordinal}`)),i(s,{type:"monotone",dataKey:"No Level",name:"No Level",stackId:"1",yAxisId:"right",stroke:"var(--bui-fg-secondary)",strokeWidth:2,fill:"url(#gradient-no-level)",isAnimationActive:!1,activeDot:{fill:"var(--bui-fg-disabled)",stroke:"var(--bui-fg-secondary)",strokeWidth:1,r:5}},"No Level")]})})})};export{I as TrackHistoryChartBUI};
2
+ //# sourceMappingURL=TrackHistoryChartBUI.esm.js.map
@@ -1,2 +1,2 @@
1
- import{jsx as e,jsxs as o,Fragment as H}from"react/jsx-runtime";import{useApi as W,useRouteRef as X}from"@backstage/core-plugin-api";import{entityPresentationApiRef as Z,EntityRefLink as ee}from"@backstage/plugin-catalog-react";import{usePermission as F}from"@backstage/plugin-permission-react";import{Box as n,HeaderPage as te,Tabs as ie,TabList as re,Tab as _,TabPanel as O,Flex as b,Card as oe,CardHeader as ae,Text as C}from"@backstage/ui";import{makeStyles as ne,Button as se}from"@material-ui/core";import{soundcheckTrackReadPermission as ce,soundcheckTrackUpdatePermission as me}from"@spotify/backstage-plugin-soundcheck-common";import{useState as j,useMemo as h,useEffect as le}from"react";import{useSearchParams as pe,useNavigate as de,useParams as ue}from"react-router-dom";import"@backstage/catalog-model";import"@tanstack/react-query";import"../../api.esm.js";import"../../hooks/graphqlKeys.esm.js";import"../../hooks/useSoundcheckAlert.esm.js";import{useTrack as he}from"../../hooks/tracks/useTrack.esm.js";import"../../hooks/useConfirmationModal.esm.js";import{useCertificationStatus as fe}from"../../hooks/aggregations/useCertificationStatus.esm.js";import{useCheckStatuses as ge}from"../../hooks/aggregations/useCheckStatuses.esm.js";import{useCheckStatusTotals as ke}from"../../hooks/checks/useCheckStatusTotals.esm.js";import{useLCPReporting as be}from"../../hooks/useLCPReporting.esm.js";import{useLoadTimeReporting as Ce}from"../../hooks/useLoadTimeReporting.esm.js";import{trackEditRouteRef as ye}from"../../routes.esm.js";import{getEntitiesBucket as Ee,getChecksBucket as Se}from"../../utils/helpers.esm.js";import{DescriptionCard as ve}from"../Cards/DescriptionCard/DescriptionCard.esm.js";import{CurrentStatusCard as Te}from"../Cards/CurrentStatusCard/CurrentStatusCard.esm.js";import{ChecksTable as Le}from"../ChecksTable/ChecksTable.esm.js";import{ChipSelector as we}from"../ChipSelector/ChipSelector.esm.js";import"../EmptyState/EmptyState.esm.js";import{EmptyStateBUI as A}from"../EmptyState/EmptyStateBUI.esm.js";import"../FilterSidebar/FilterSidebar.esm.js";import"../FilterSidebar/StateFilter.esm.js";import{useTrackFilterSidebar as Ie}from"../FilterSidebar/useTrackFilterSidebar.esm.js";import{toFilter as Ne}from"../FilterSidebar/util.esm.js";import{LoadingTableSkeleton as Be}from"../LoadingTableSkeleton/LoadingTableSkeleton.esm.js";import{PageCustomActions as Pe}from"../PageCustomActions/PageCustomActions.esm.js";import"../SoundcheckHeader/SoundcheckHeader.esm.js";import"../SoundcheckHeader/SoundcheckHeaderContext.esm.js";import{useHeader as Re}from"../SoundcheckHeader/useHeader.esm.js";import"../TechHealth/Filters/types.esm.js";import"../TechHealth/Filters/FacetFilter.esm.js";import"../TechHealth/Filters/FilterProvider.esm.js";import"../TechHealth/Filters/Filters.esm.js";import"../TechHealth/Filters/FiltersHeader.esm.js";import"../TechHealth/Filters/FiltersSection.esm.js";import"lodash";import"../../contexts/TrackFormContext.esm.js";import"../../contexts/CheckFormContext.esm.js";import"../../contexts/CampaignFormContext.esm.js";import"../../contexts/UserProvider.esm.js";import{parseNumberOfDays as xe}from"../TechHealth/Filters/utils.esm.js";import{TopFailingChecksTableBUI as He}from"../TopFailingChecksTable/TopFailingChecksTableBUI.esm.js";import{TrackEntitiesTableBUI as Fe}from"./TrackEntitiesTable/TrackEntitiesTableBUI.esm.js";const _e=ne(()=>({emptyContainer:{padding:"var(--bui-space-1)"},container:{padding:"0 var(--bui-space-3)"},tabPanel:{padding:"var(--bui-space-6) 0 0"},ownerLink:{"& span":{color:"inherit","&:hover":{textDecoration:"underline"}}},editButton:{marginLeft:"auto"},tables:{margin:"0 var(--bui-space-2)"},tabs:{marginBottom:"var(--bui-space-6)"},tableContent:{margin:"var(--bui-space-3) 0 var(--bui-space-6)"},levelSection:{margin:"0 0 var(--bui-space-6)"},levelHeading:{padding:"var(--bui-space-3)",background:"var(--bui-fg-solid)"}})),p={CHECKS_BY_LEVELS:"Checks By Levels",TOP_FAILING_CHECKS:"Top Failing Checks",ENTITIES:"Entities"},Oe=()=>{const i=_e(),[y]=pe(),[E,K]=j(new Set([p.CHECKS_BY_LEVELS])),f=E.values().next().value??p.CHECKS_BY_LEVELS,[V,D]=j(""),S=de(),U=W(Z),{trackId:a}=ue(),{data:t,isLoading:d}=he(a),Y=t?U.forEntity(t.ownerEntityRef):void 0,q=Array.from(new Set(t?.levels.flatMap(r=>r.checks).map(r=>r.id)??[])),{owners:s,lifecycles:c,types:m,systems:l}=Ie(),v=X(ye),T=h(()=>Ne({lifecycles:c,owners:s,types:m,systems:l}),[c,s,m,l]),L=h(()=>xe(y.get("numberOfDays")),[y]),w=h(()=>({routeName:"soundcheck-track-insights",additionalAttributes:{trackId:a||"",filtersApplied:s.length+c.length+m.length+l.length,ownersFilter:s.join(",")||"",lifecyclesFilter:c.join(",")||"",typesFilter:m.join(",")||"",systemsFilter:l.join(",")||"",numberOfDays:L}}),[a,s,c,m,l,L]),{reportContentLoaded:I}=Ce(w),{reporter:G}=be(w),{data:g,isLoading:N}=fe({trackId:a,filter:T},!!a),{data:u,isLoading:k}=ge({trackId:t?.id,checkIds:q,filter:T},!!t),M=ke(u),{loading:$,allowed:z}=F({permission:ce,resourceRef:a}),{loading:B,allowed:P}=F({permission:me,resourceRef:a}),J=h(()=>t?.ownerEntityRef?e(ee,{color:"inherit",entityRef:t.ownerEntityRef,className:i.ownerLink}):null,[t?.ownerEntityRef,i.ownerLink]),Q=h(()=>!B&&P&&t?.isEditable?e(se,{className:i.editButton,variant:"contained",color:"primary",onClick:()=>{S(v({trackId:t.id}))},children:"Edit Track"}):null,[P,i.editButton,v,B,S,t]);Re({title:t?.name,description:t?.description,customSubtitle:J,sectionRight:Q});const R=G?.getLCPValue();return le(()=>{if(!d&&!k&&!N){const r=g?.certificationStatus?.numberOfEntities??0,x=u?.length??0;I({lcp:R,numberOfEntities:r,entitiesBucket:Ee(r),numberOfChecks:x,checksBucket:Se(x)})}},[d,k,N,u,g,I,R]),d?e(Be,{}):!d&&!t?e(n,{className:i.emptyContainer,children:e(A,{title:"Track not found",body:`There is no track with the requested id: ${a}.`})}):!$&&!z?e(n,{className:i.emptyContainer,children:e(A,{title:"Cannot view track",body:`No permission to view track with the requested id: ${a}.`})}):o(H,{children:[e(n,{children:e(te,{title:t?.name})}),o(n,{className:i.container,children:[o(ie,{className:i.tabs,children:[o(re,{children:[e(_,{id:"campaign-overview",children:"Campaign Overview"}),e(_,{id:"tech-insights-explorer",children:"Tech Insights Explorer"})]}),e(O,{id:"campaign-overview",children:o(b,{className:i.tabPanel,children:[e(ve,{description:t?.description??void 0,owner:Y?.snapshot.primaryTitle??void 0}),e(Te,{totals:M}),e(oe,{children:e(ae,{children:e(C,{color:"secondary",children:"Historical Status"})})})]})}),e(O,{id:"tech-insights-explorer",children:e(n,{className:i.tabPanel,children:"Tech Insights Explorer"})})]}),t&&o(n,{className:i.tables,children:[o(b,{justify:"between",children:[e(we,{options:Object.values(p),selected:E,ariaLabel:"Sections",onSelectionChange:K}),e(Pe,{searchValue:V,setSearchValue:r=>D(r)})]}),o(n,{className:i.tableContent,children:[f===p.CHECKS_BY_LEVELS&&e(H,{children:t.levels.map(r=>o(n,{className:i.levelSection,children:[o(b,{align:"center",gap:"4",className:i.levelHeading,children:[o(C,{color:"secondary",children:["Level ",r.ordinal]})," ",e(C,{children:r.name})]}),e(Le,{checks:r.checks,checkStatuses:u,isLoading:d||k})]},r.ordinal))}),f===p.TOP_FAILING_CHECKS&&e(He,{track:t,checkStatuses:u,certificationStatus:g?.certificationStatus}),f===p.ENTITIES&&e(Fe,{track:t,lifecycles:c,owners:s,types:m,systems:l})]})]})]})]})};export{Oe as TrackPageBUI};
1
+ import{jsx as t,jsxs as s,Fragment as ue}from"react/jsx-runtime";import{parseEntityRef as fe}from"@backstage/catalog-model";import{useRouteRef as R}from"@backstage/core-plugin-api";import{usePermission as he}from"@backstage/plugin-permission-react";import{Box as o,HeaderPage as ke,Flex as j,Text as K}from"@backstage/ui";import{makeStyles as ge}from"@material-ui/core";import{toEntityFilterQuery as Se,soundcheckTrackReadPermission as be}from"@spotify/backstage-plugin-soundcheck-common";import{useState as v,useMemo as C,useEffect as U}from"react";import{useSearchParams as ve,useParams as Ce}from"react-router-dom";import ye from"react-use/lib/useDebounce";import Ee from"react-use/lib/useLocalStorage";import"@tanstack/react-query";import"../../api.esm.js";import"../../hooks/graphqlKeys.esm.js";import"@backstage/plugin-catalog-react";import"../../hooks/useSoundcheckAlert.esm.js";import{useTrack as Te}from"../../hooks/tracks/useTrack.esm.js";import"../../hooks/useConfirmationModal.esm.js";import{useCertificationStatus as Le}from"../../hooks/aggregations/useCertificationStatus.esm.js";import{useCertificationStatusHistory as we}from"../../hooks/aggregations/useCertificationStatusHistory.esm.js";import{useCheckStatuses as Ie}from"../../hooks/aggregations/useCheckStatuses.esm.js";import{useFilters as Re}from"../../hooks/filters/useFilters.esm.js";import{useLCPReporting as Fe}from"../../hooks/useLCPReporting.esm.js";import{useLoadTimeReporting as Ne}from"../../hooks/useLoadTimeReporting.esm.js";import{tracksPageRouteRef as Pe,trackOverviewRouteRef as Be,trackExplorerRouteRef as Oe}from"../../routes.esm.js";import{getEntitiesBucket as _e,getChecksBucket as xe}from"../../utils/helpers.esm.js";import{DescriptionCard as He}from"../Cards/DescriptionCard/DescriptionCard.esm.js";import{HistoricalTrackStatusCard as Ae}from"../Cards/HistoricalTrackStatusCard/HistoricalTrackStatusCard.esm.js";import{TrackStatusCard as Ve}from"../Cards/TrackStatusCard/TrackStatusCard.esm.js";import{ChecksTable as je}from"../ChecksTable/ChecksTable.esm.js";import{ChipSelector as Ke}from"../ChipSelector/ChipSelector.esm.js";import"../EmptyState/EmptyState.esm.js";import{EmptyStateBUI as D}from"../EmptyState/EmptyStateBUI.esm.js";import"@remixicon/react";import"../FilterSidebar/FilterSidebar.esm.js";import"../FilterSidebar/StateFilter.esm.js";import{useTrackFilterSidebar as Ue}from"../FilterSidebar/useTrackFilterSidebar.esm.js";import{toFilter as De}from"../FilterSidebar/util.esm.js";import{LoadingTableSkeleton as Me}from"../LoadingTableSkeleton/LoadingTableSkeleton.esm.js";import{SimpleMenu as Ye}from"../Menus/SimpleMenu.esm.js";import"js-yaml";import"lodash";import{useTrackActions as $e}from"../Menus/useTrackActions.esm.js";import"uuid";import"../CampaignsPage/CampaignListPage/useArchiveConfirmationModal.esm.js";import{PageCustomActions as Ge}from"../PageCustomActions/PageCustomActions.esm.js";import"../TechHealth/Filters/types.esm.js";import"../TechHealth/Filters/FacetFilter.esm.js";import"../TechHealth/Filters/FilterProvider.esm.js";import"../TechHealth/Filters/Filters.esm.js";import"../TechHealth/Filters/FiltersHeader.esm.js";import"../TechHealth/Filters/FiltersSection.esm.js";import"../../contexts/TrackFormContext.esm.js";import"../../contexts/CheckFormContext.esm.js";import"../../contexts/CampaignFormContext.esm.js";import"../../contexts/UserProvider.esm.js";import{parseNumberOfDays as qe}from"../TechHealth/Filters/utils.esm.js";import{TopFailingChecksTableBUI as Qe}from"../TopFailingChecksTable/TopFailingChecksTableBUI.esm.js";import{TrackEntitiesTableBUI as We}from"./TrackEntitiesTable/TrackEntitiesTableBUI.esm.js";const ze=ge(()=>({emptyContainer:{padding:"var(--bui-space-1)"},container:{padding:"0 var(--bui-space-1) var(--bui-space-6)"},tables:{margin:"0 var(--bui-space-2)"},cards:{margin:"0 var(--bui-space-2) var(--bui-space-12)",display:"flex",gridGap:"var(--bui-space-4)"},tableContent:{margin:"var(--bui-space-3) 0 0"},levelSection:{margin:"0 0 var(--bui-space-6)"},levelHeading:{padding:"var(--bui-space-3)",background:"var(--bui-bg-surface-2)"}})),u={CHECKS_BY_LEVELS:"Checks By Levels",TOP_FAILING_CHECKS:"Top Failing Checks",ENTITIES:"Entities"},Je=()=>{const c=ze(),[a,y]=ve(),[F,M]=v(new Set([u.CHECKS_BY_LEVELS])),E=F.values().next().value??u.CHECKS_BY_LEVELS,[n,Y]=v(a.get("search")||""),[N,$]=v(""),{trackId:i}=Ce(),{data:r,isLoading:f,isError:G}=Te(i),q=R(Pe),P=$e(r??void 0),B=r?.ownerEntityRef,Q=B?fe(B).name:void 0,W=Array.from(new Set(r?.levels.flatMap(e=>e.checks).map(e=>e.id)??[])),{owners:m,lifecycles:l,types:p,systems:d}=Ue(),T=C(()=>De({lifecycles:l,owners:m,types:p,systems:d}),[l,m,p,d]),L=C(()=>qe(a.get("numberOfDays")),[a]),[g,O]=v(!1),[h,w]=Ee("track-overview-search-params","");U(()=>{!g&&a?.toString()?(h!==a.toString()&&w(a.toString()),O(!0)):!g&&h?(y(new URLSearchParams(h)),O(!0)):g&&h!==a.toString()&&w(a.toString())},[a,y,w,h,g]),ye(()=>{$(n);const e=new URLSearchParams(a.toString());n?e.set("search",n):e.delete("search"),y(e,{replace:!0})},300,[n]);const _=C(()=>({routeName:"soundcheck-track-insights",additionalAttributes:{trackId:i||"",filtersApplied:m.length+l.length+p.length+d.length,ownersFilter:m.join(",")||"",lifecyclesFilter:l.join(",")||"",typesFilter:p.join(",")||"",systemsFilter:d.join(",")||"",numberOfDays:L,tracksSearch:N||""}}),[i,m,l,p,d,L,N]),{reportContentLoaded:x}=Ne(_),{reporter:z}=Fe(_),{data:S,isLoading:H,isError:J}=Le({trackId:i,filter:T},!!i),{data:X,isLoading:A,isError:Z}=we({trackId:i,filter:T,numberOfDays:L},!!i),{data:b,isLoading:I}=Ie({trackId:i,checkIds:W,filter:T},!!r),ee=C(()=>Se(r?.filter),[r]),te=G||J||Z,{loading:re,allowed:ie}=he({permission:be,resourceRef:i}),{filters:ae,selected:oe,setSelected:se,onRemoveTag:ce,selectedTags:ne}=Re({entityFilterQuery:ee}),me=r?.levels.flatMap(e=>{const k=n?.trim().toLowerCase();return{...e,checks:k?e.checks.filter(({name:de})=>de.toLowerCase().includes(k)):e.checks}})??[],V=z?.getLCPValue();U(()=>{if(!f&&!I&&!H&&!A){const e=S?.certificationStatus?.numberOfEntities??0,k=b?.length??0;x({lcp:V,numberOfEntities:e,entitiesBucket:_e(e),numberOfChecks:k,checksBucket:xe(k)})}},[f,I,H,A,b,S,x,V]);const le=R(Be),pe=R(Oe);return f?t(Me,{}):!f&&!r?t(o,{className:c.emptyContainer,children:t(D,{title:"Track not found",body:`There is no track with the requested id: ${i}.`})}):!re&&!ie?t(o,{className:c.emptyContainer,children:t(D,{title:"Cannot view track",body:`No permission to view track with the requested id: ${i}.`})}):s(ue,{children:[t(o,{children:t(ke,{title:r?.name,customActions:t(Ye,{label:"Track Actions",disabled:!P.length,placement:"left top",menuActions:P}),breadcrumbs:[{label:"Tracks",href:q()}],tabs:[{id:"overview",label:"Track Overview",href:i?le({trackId:i}):""},{id:"explorer",label:"Tech Insights Explorer",href:i?pe({trackId:i}):""}]})}),s(o,{className:c.container,children:[s(o,{className:c.cards,children:[t(He,{description:r?.description??void 0,owner:Q}),t(Ve,{track:r??void 0,status:S}),t(Ae,{track:r??void 0,history:X,isError:te})]}),r&&s(o,{className:c.tables,children:[s(j,{justify:"between",children:[t(o,{minWidth:"18rem",children:t(Ke,{options:Object.values(u),selected:F,ariaLabel:"Sections",onSelectionChange:M})}),t(Ge,{searchValue:n,setSearchValue:e=>Y(e),filters:ae,selected:oe,setSelected:se,onRemoveTag:ce,selectedTags:ne})]}),s(o,{className:c.tableContent,children:[E===u.CHECKS_BY_LEVELS&&t(o,{mt:"3",children:me.map(e=>s(o,{className:c.levelSection,children:[s(j,{align:"center",gap:"4",className:c.levelHeading,children:[s(K,{color:"secondary",children:["Level ",e.ordinal]})," ",t(K,{children:e.name})]}),t(je,{trackId:r.id,checks:e.checks,checkStatuses:b,isLoading:f||I})]},e.ordinal))}),E===u.TOP_FAILING_CHECKS&&t(Qe,{track:r,checkStatuses:b,certificationStatus:S?.certificationStatus,searchValue:n}),E===u.ENTITIES&&t(We,{track:r,lifecycles:l,owners:m,types:p,systems:d,searchValue:n})]})]})]})]})};export{Je as TrackPageBUI};
2
2
  //# sourceMappingURL=TrackPageBUI.esm.js.map
@@ -1,2 +1,2 @@
1
- import{jsx as t,jsxs as p,Fragment as ie}from"react/jsx-runtime";import{useRouteRef as re}from"@backstage/core-plugin-api";import{EntityRefLink as oe}from"@backstage/plugin-catalog-react";import{usePermission as R}from"@backstage/plugin-permission-react";import{makeStyles as ae,Button as se,Box as ne,Tabs as ce,Tab as b}from"@material-ui/core";import{soundcheckTrackReadPermission as le,soundcheckTrackUpdatePermission as me,toEntityFilterQuery as de}from"@spotify/backstage-plugin-soundcheck-common";import{useMemo as s,useState as pe,useCallback as ge,useEffect as fe}from"react";import{useSearchParams as ue,useParams as he,useNavigate as ke}from"react-router-dom";import"@backstage/catalog-model";import"@tanstack/react-query";import"../../api.esm.js";import"../../hooks/graphqlKeys.esm.js";import"../../hooks/useSoundcheckAlert.esm.js";import{useTrack as ye}from"../../hooks/tracks/useTrack.esm.js";import"../../hooks/useConfirmationModal.esm.js";import{useCertificationStatus as Ce}from"../../hooks/aggregations/useCertificationStatus.esm.js";import{useCertificationStatusHistory as be}from"../../hooks/aggregations/useCertificationStatusHistory.esm.js";import{useCheckStatuses as ve}from"../../hooks/aggregations/useCheckStatuses.esm.js";import{useLCPReporting as Se}from"../../hooks/useLCPReporting.esm.js";import{useLoadTimeReporting as Le}from"../../hooks/useLoadTimeReporting.esm.js";import{trackEditRouteRef as Te}from"../../routes.esm.js";import{getEntitiesBucket as Fe,getChecksBucket as we}from"../../utils/helpers.esm.js";import{FilterSidebar as Ee}from"../FilterSidebar/FilterSidebar.esm.js";import"../FilterSidebar/StateFilter.esm.js";import{useTrackFilterSidebar as Ne}from"../FilterSidebar/useTrackFilterSidebar.esm.js";import{toFilter as xe}from"../FilterSidebar/util.esm.js";import{LevelsTable as Re}from"../LevelsTable/LevelsTable.esm.js";import{LoadingIndicator as Be}from"../LoadingIndicator/LoadingIndicator.esm.js";import{PageWarningMessage as Pe}from"../PageWarningMessage/PageWarningMessage.esm.js";import"../SoundcheckHeader/SoundcheckHeader.esm.js";import"../SoundcheckHeader/SoundcheckHeaderContext.esm.js";import{useHeader as De}from"../SoundcheckHeader/useHeader.esm.js";import{SoundcheckMarkdownContent as Oe}from"../SoundcheckMarkdownContent/SoundcheckMarkdownContent.esm.js";import"@backstage/core-components";import"react-markdown";import"rehype-raw";import"remark-gfm";import"../TechHealth/Filters/types.esm.js";import"../TechHealth/Filters/FacetFilter.esm.js";import"../TechHealth/Filters/FilterProvider.esm.js";import"../TechHealth/Filters/Filters.esm.js";import"../TechHealth/Filters/FiltersHeader.esm.js";import"../TechHealth/Filters/FiltersSection.esm.js";import"lodash";import"../../contexts/TrackFormContext.esm.js";import"../../contexts/CheckFormContext.esm.js";import"../../contexts/CampaignFormContext.esm.js";import"../../contexts/UserProvider.esm.js";import{parseNumberOfDays as Ie}from"../TechHealth/Filters/utils.esm.js";import{TopFailingChecksTable as Ae}from"../TopFailingChecksTable/TopFailingChecksTable.esm.js";import{TrackEntitiesTable as je}from"./TrackEntitiesTable/TrackEntitiesTable.esm.js";import{TrackProgressCard as He}from"./TrackProgressCard.esm.js";const Me=ae(r=>({root:{height:"100%",background:r.palette.background.default},pageContent:{display:"flex",minHeight:`calc(100vh - ${r.spacing(15)}px)`,borderTop:`1px solid ${r.palette.divider}`,height:"100%"},mainContentArea:{flex:1,display:"flex",flexDirection:"column",minWidth:0},trackProgressContainer:{padding:r.spacing(2,0,2,2),borderBottom:`1px solid ${r.palette.divider}`},levelCard:{margin:r.spacing(1,0,2)},editButton:{marginLeft:"auto"},contentArea:{flex:1,padding:r.spacing(0,2)},trackEntitiesContainer:{marginTop:r.spacing(1)},headerDescription:{fontSize:r.typography.body2.fontSize,margin:r.spacing(.5,0,0),"& p":{margin:0},"& a":{color:"inherit",textDecoration:"underline"}},ownerLink:{"& span":{color:"inherit","&:hover":{textDecoration:"underline"}}},tabs:{padding:r.spacing(2,2,0,2)}})),$e=()=>{const[r]=ue(),{trackId:o}=he(),k=s(()=>Ie(r.get("numberOfDays")),[r]),{owners:n,lifecycles:c,types:l,systems:m,stagedLifecycles:B,setStagedLifecycles:P,stagedOwners:D,setStagedOwners:O,stagedTypes:I,setStagedTypes:A,stagedSystems:j,setStagedSystems:H,hasFilterChanges:M,handleApplyFilters:$,handleClearFilters:z}=Ne(),v=s(()=>({routeName:"soundcheck-track-insights",additionalAttributes:{trackId:o||"",filtersApplied:n.length+c.length+l.length+m.length,ownersFilter:n.join(",")||"",lifecyclesFilter:c.join(",")||"",typesFilter:l.join(",")||"",systemsFilter:m.join(",")||"",numberOfDays:k}}),[o,n,c,l,m,k]),{reportContentLoaded:S}=Le(v),{reporter:V}=Se(v),i=Me(),[g,W]=pe("checksByLevel"),L=ke(),T=re(Te),Q=ge((a,h)=>{W(h)},[]),y=s(()=>xe({lifecycles:c,owners:n,types:l,systems:m}),[c,n,l,m]),{data:e,isLoading:d,isError:U}=ye(o),{data:f,isLoading:C,isError:q}=Ce({trackId:o,filter:y},!!o),{data:G,isLoading:F,isError:J}=be({trackId:o,filter:y,numberOfDays:k},!!o),{loading:K,allowed:X}=R({permission:le,resourceRef:o}),{loading:w,allowed:E}=R({permission:me,resourceRef:o}),Y=s(()=>e?.ownerEntityRef?t(oe,{color:"inherit",entityRef:e.ownerEntityRef,className:i.ownerLink}):null,[e?.ownerEntityRef,i.ownerLink]),Z=s(()=>!w&&E&&e?.isEditable?t(se,{className:i.editButton,variant:"contained",color:"primary",onClick:()=>{L(T({trackId:e.id}))},children:"Edit Track"}):null,[E,i.editButton,T,w,L,e]),_=s(()=>e?.description?t(Oe,{className:i.headerDescription,content:e.description}):null,[i.headerDescription,e?.description]);De({title:e?.name,description:_,customSubtitle:Y,sectionRight:Z});const ee=e?.levels?.flatMap(a=>a.checks)??[],{data:u,isLoading:N}=ve({trackId:o,checkIds:ee.map(a=>a.id),filter:y},!!e),te=s(()=>de(e?.filter),[e]),x=V?.getLCPValue();return fe(()=>{if(!d&&!N&&!C&&!F){const a=f?.certificationStatus?.numberOfEntities??0,h=u?.length??0;S({lcp:x,numberOfEntities:a,entitiesBucket:Fe(a),numberOfChecks:h,checksBucket:we(h)})}},[d,N,C,F,u,f,S,x]),p(ie,{children:[t(Pe,{entityName:"track",entityId:o,showNotFound:!d&&!e,showCannotView:!K&&!X}),d&&t(Be,{}),e&&t("div",{className:i.root,children:p("div",{className:i.pageContent,children:[t(Ee,{trackFilter:te,stagedTypes:I,stagedLifecycles:B,stagedOwners:D,stagedSystems:j,onTypesChange:A,onLifecyclesChange:P,onOwnersChange:O,onSystemsChange:H,onApplyFilters:$,onClearFilters:z,hasFilterChanges:M}),p("div",{className:i.mainContentArea,children:[t("div",{className:i.trackProgressContainer,children:t(He,{track:e,status:f,history:G,isError:U||q||J})}),t(ne,{className:i.tabs,children:p(ce,{value:g,onChange:Q,indicatorColor:"primary",textColor:"primary",children:[t(b,{label:"Checks By Level",value:"checksByLevel"}),t(b,{label:"Top Failing Checks",value:"topFailingChecks"}),t(b,{label:"Entities",value:"entities"})]})}),p("div",{className:i.contentArea,children:[g==="checksByLevel"&&t("div",{className:i.levelCard,children:t(Re,{track:e,checkStatuses:u,isLoading:d||C})}),g==="entities"&&t("div",{className:i.trackEntitiesContainer,children:t(je,{track:e,lifecycles:c,owners:n,types:l,systems:m})}),g==="topFailingChecks"&&t("div",{className:i.levelCard,children:t(Ae,{track:e,checkStatuses:u,certificationStatus:f?.certificationStatus})})]})]})]})})]})};export{$e as TrackPageDeprecated};
1
+ import{jsx as t,jsxs as d,Fragment as ie}from"react/jsx-runtime";import{useRouteRef as re}from"@backstage/core-plugin-api";import{EntityRefLink as oe}from"@backstage/plugin-catalog-react";import{usePermission as R}from"@backstage/plugin-permission-react";import{makeStyles as ae,Button as se,Box as ne,Tabs as ce,Tab as b}from"@material-ui/core";import{soundcheckTrackReadPermission as le,soundcheckTrackUpdatePermission as me,toEntityFilterQuery as pe}from"@spotify/backstage-plugin-soundcheck-common";import{useMemo as s,useState as de,useCallback as ge,useEffect as fe}from"react";import{useSearchParams as ue,useParams as he,useNavigate as ke}from"react-router-dom";import"@backstage/catalog-model";import"@tanstack/react-query";import"../../api.esm.js";import"../../hooks/graphqlKeys.esm.js";import"../../hooks/useSoundcheckAlert.esm.js";import{useTrack as ye}from"../../hooks/tracks/useTrack.esm.js";import"../../hooks/useConfirmationModal.esm.js";import{useCertificationStatus as Ce}from"../../hooks/aggregations/useCertificationStatus.esm.js";import{useCertificationStatusHistory as be}from"../../hooks/aggregations/useCertificationStatusHistory.esm.js";import"react-use/lib/useLocalStorage";import{useCheckStatuses as ve}from"../../hooks/aggregations/useCheckStatuses.esm.js";import{useLCPReporting as Se}from"../../hooks/useLCPReporting.esm.js";import{useLoadTimeReporting as Le}from"../../hooks/useLoadTimeReporting.esm.js";import{trackEditRouteRef as Te}from"../../routes.esm.js";import{getEntitiesBucket as Fe,getChecksBucket as we}from"../../utils/helpers.esm.js";import{FilterSidebar as Ee}from"../FilterSidebar/FilterSidebar.esm.js";import"../FilterSidebar/StateFilter.esm.js";import{useTrackFilterSidebar as Ne}from"../FilterSidebar/useTrackFilterSidebar.esm.js";import{toFilter as xe}from"../FilterSidebar/util.esm.js";import{LevelsTable as Re}from"../LevelsTable/LevelsTable.esm.js";import{LoadingIndicator as Be}from"../LoadingIndicator/LoadingIndicator.esm.js";import{PageWarningMessage as De}from"../PageWarningMessage/PageWarningMessage.esm.js";import"../SoundcheckHeader/SoundcheckHeader.esm.js";import"../SoundcheckHeader/SoundcheckHeaderContext.esm.js";import{useHeader as Pe}from"../SoundcheckHeader/useHeader.esm.js";import{SoundcheckMarkdownContentDeprecated as Oe}from"../SoundcheckMarkdownContent/SoundcheckMarkdownContentDeprecated.esm.js";import"@backstage/core-components";import"react-markdown";import"rehype-raw";import"remark-gfm";import"../SoundcheckMarkdownContent/SoundcheckMarkdownContentBUI.esm.js";import"../TechHealth/Filters/types.esm.js";import"../TechHealth/Filters/FacetFilter.esm.js";import"../TechHealth/Filters/FilterProvider.esm.js";import"../TechHealth/Filters/Filters.esm.js";import"../TechHealth/Filters/FiltersHeader.esm.js";import"../TechHealth/Filters/FiltersSection.esm.js";import"lodash";import"../../contexts/TrackFormContext.esm.js";import"../../contexts/CheckFormContext.esm.js";import"../../contexts/CampaignFormContext.esm.js";import"../../contexts/UserProvider.esm.js";import{parseNumberOfDays as Ie}from"../TechHealth/Filters/utils.esm.js";import{TopFailingChecksTable as Ae}from"../TopFailingChecksTable/TopFailingChecksTable.esm.js";import{TrackEntitiesTable as je}from"./TrackEntitiesTable/TrackEntitiesTable.esm.js";import{TrackProgressCard as He}from"./TrackProgressCard.esm.js";const Me=ae(r=>({root:{height:"100%",background:r.palette.background.default},pageContent:{display:"flex",minHeight:`calc(100vh - ${r.spacing(15)}px)`,borderTop:`1px solid ${r.palette.divider}`,height:"100%"},mainContentArea:{flex:1,display:"flex",flexDirection:"column",minWidth:0},trackProgressContainer:{padding:r.spacing(2,0,2,2),borderBottom:`1px solid ${r.palette.divider}`},levelCard:{margin:r.spacing(1,0,2)},editButton:{marginLeft:"auto"},contentArea:{flex:1,padding:r.spacing(0,2)},trackEntitiesContainer:{marginTop:r.spacing(1)},headerDescription:{fontSize:r.typography.body2.fontSize,margin:r.spacing(.5,0,0),"& p":{margin:0},"& a":{color:"inherit",textDecoration:"underline"}},ownerLink:{"& span":{color:"inherit","&:hover":{textDecoration:"underline"}}},tabs:{padding:r.spacing(2,2,0,2)}})),$e=()=>{const[r]=ue(),{trackId:o}=he(),k=s(()=>Ie(r.get("numberOfDays")),[r]),{owners:n,lifecycles:c,types:l,systems:m,stagedLifecycles:B,setStagedLifecycles:D,stagedOwners:P,setStagedOwners:O,stagedTypes:I,setStagedTypes:A,stagedSystems:j,setStagedSystems:H,hasFilterChanges:M,handleApplyFilters:$,handleClearFilters:z}=Ne(),v=s(()=>({routeName:"soundcheck-track-insights",additionalAttributes:{trackId:o||"",filtersApplied:n.length+c.length+l.length+m.length,ownersFilter:n.join(",")||"",lifecyclesFilter:c.join(",")||"",typesFilter:l.join(",")||"",systemsFilter:m.join(",")||"",numberOfDays:k}}),[o,n,c,l,m,k]),{reportContentLoaded:S}=Le(v),{reporter:V}=Se(v),i=Me(),[g,W]=de("checksByLevel"),L=ke(),T=re(Te),Q=ge((a,h)=>{W(h)},[]),y=s(()=>xe({lifecycles:c,owners:n,types:l,systems:m}),[c,n,l,m]),{data:e,isLoading:p,isError:U}=ye(o),{data:f,isLoading:C,isError:q}=Ce({trackId:o,filter:y},!!o),{data:G,isLoading:F,isError:J}=be({trackId:o,filter:y,numberOfDays:k},!!o),{loading:K,allowed:X}=R({permission:le,resourceRef:o}),{loading:w,allowed:E}=R({permission:me,resourceRef:o}),Y=s(()=>e?.ownerEntityRef?t(oe,{color:"inherit",entityRef:e.ownerEntityRef,className:i.ownerLink}):null,[e?.ownerEntityRef,i.ownerLink]),Z=s(()=>!w&&E&&e?.isEditable?t(se,{className:i.editButton,variant:"contained",color:"primary",onClick:()=>{L(T({trackId:e.id}))},children:"Edit Track"}):null,[E,i.editButton,T,w,L,e]),_=s(()=>e?.description?t(Oe,{className:i.headerDescription,content:e.description}):null,[i.headerDescription,e?.description]);Pe({title:e?.name,description:_,customSubtitle:Y,sectionRight:Z});const ee=e?.levels?.flatMap(a=>a.checks)??[],{data:u,isLoading:N}=ve({trackId:o,checkIds:ee.map(a=>a.id),filter:y},!!e),te=s(()=>pe(e?.filter),[e]),x=V?.getLCPValue();return fe(()=>{if(!p&&!N&&!C&&!F){const a=f?.certificationStatus?.numberOfEntities??0,h=u?.length??0;S({lcp:x,numberOfEntities:a,entitiesBucket:Fe(a),numberOfChecks:h,checksBucket:we(h)})}},[p,N,C,F,u,f,S,x]),d(ie,{children:[t(De,{entityName:"track",entityId:o,showNotFound:!p&&!e,showCannotView:!K&&!X}),p&&t(Be,{}),e&&t("div",{className:i.root,children:d("div",{className:i.pageContent,children:[t(Ee,{trackFilter:te,stagedTypes:I,stagedLifecycles:B,stagedOwners:P,stagedSystems:j,onTypesChange:A,onLifecyclesChange:D,onOwnersChange:O,onSystemsChange:H,onApplyFilters:$,onClearFilters:z,hasFilterChanges:M}),d("div",{className:i.mainContentArea,children:[t("div",{className:i.trackProgressContainer,children:t(He,{track:e,status:f,history:G,isError:U||q||J})}),t(ne,{className:i.tabs,children:d(ce,{value:g,onChange:Q,indicatorColor:"primary",textColor:"primary",children:[t(b,{label:"Checks By Level",value:"checksByLevel"}),t(b,{label:"Top Failing Checks",value:"topFailingChecks"}),t(b,{label:"Entities",value:"entities"})]})}),d("div",{className:i.contentArea,children:[g==="checksByLevel"&&t("div",{className:i.levelCard,children:t(Re,{track:e,checkStatuses:u,isLoading:p||C})}),g==="entities"&&t("div",{className:i.trackEntitiesContainer,children:t(je,{track:e,lifecycles:c,owners:n,types:l,systems:m})}),g==="topFailingChecks"&&t("div",{className:i.levelCard,children:t(Ae,{track:e,checkStatuses:u,certificationStatus:f?.certificationStatus})})]})]})]})})]})};export{$e as TrackPageDeprecated};
2
2
  //# sourceMappingURL=TrackPageDeprecated.esm.js.map
@@ -0,0 +1,2 @@
1
+ import{jsx as u}from"react/jsx-runtime";import{Skeleton as $,Box as h,Flex as x}from"@backstage/ui";import{makeStyles as N,useTheme as S}from"@material-ui/core";import{useMemo as p}from"react";import{calculateAdjustedBarWidths as w}from"../../utils/charts.esm.js";import{getChartColors as C}from"../Charts/chartUtils.esm.js";const E=N(()=>({container:{gap:"var(--bui-space-1)",width:"100%"},barSegment:{height:"var(--bui-space-1_5)",borderRadius:"var(--bui-space-1)"},emptyBar:{width:"100%",background:"var(--bui-fg-disabled)"}})),j=({track:a,status:r})=>{const d=S(),l=E(),c=p(()=>{if(!r||!a)return{};const e={};let t=0,s=0;(r.statusByLevel||[]).sort((n,m)=>m.ordinal-n.ordinal).forEach(({ordinal:n,cumulativelyPassed:m})=>{const L=a.levels.find(k=>k.ordinal===n)?.name??`Level ${n}`,b=m-s;e[L]=b,t+=b,s=m}),(r.statusByLevel||[]).reverse();const o=Math.max(0,r.numberOfEntities-t);return e["No Level"]=o,e},[r,a]),g=p(()=>{if(!r||!a)return{};const e=C(d),t={};return(r.statusByLevel||[]).forEach(({ordinal:s})=>{const o=a.levels.find(n=>n.ordinal===s)?.name??`Level ${s}`;t[o]=e[s%e.length]}),t["No Level"]=d.palette.action.disabled,t},[d,r,a]),i=(r?.statusByLevel||[]).map(({ordinal:e})=>a?.levels.find(t=>t.ordinal===e)?.name??`Level ${e}`);i.push("No Level");const f=i.map(e=>c[e]).filter(e=>typeof e=="number"),y=i.every(e=>(c[e]||0)===0),B=p(()=>w(f),[f]);if(!a||!r)return u($,{width:"100%"});let v;return y?v=u(h,{className:`${l.barSegment} ${l.emptyBar}`}):v=i.map((e,t)=>{const s=c[e],o=g[e]||"var(--bui-fg-disabled)",n=B[t]||0;return s<=0?null:u(h,{className:l.barSegment,style:{backgroundColor:o,width:`${n}%`}},`track-status-bar-segment-${t}`)}),u(x,{className:l.container,children:v})};export{j as TrackStatusBarBUI};
2
+ //# sourceMappingURL=TrackStatusBarBUI.esm.js.map
@@ -0,0 +1,2 @@
1
+ import{jsx as a,jsxs as v}from"react/jsx-runtime";import{Text as g,Skeleton as b}from"@backstage/ui";import{makeStyles as N,createStyles as T,useTheme as S}from"@material-ui/core/styles";import{memo as L,useMemo as O,Fragment as W}from"react";import{compactNumberFormatter as y}from"../../utils/formatters.esm.js";import{getChartColors as j}from"../Charts/chartUtils.esm.js";const F=N(()=>T({container:{display:"grid",gridTemplateColumns:"3fr 2fr",gap:"var(--bui-space-1)",minWidth:0},item:{display:"flex",alignItems:"center",minWidth:0},legendDash:{width:"var(--bui-space-3)",height:"var(--bui-space-1_5)",borderRadius:"var(--bui-space-1)",marginRight:"var(--bui-space-2)"},category:{display:"flex",alignItems:"center",minWidth:0,flex:1},categoryText:{whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis",minWidth:0,flex:1},valueCell:{justifyContent:"flex-end",whiteSpace:"nowrap"},percentage:{marginLeft:"var(--bui-space-1)"}})),I=L(({track:r,status:i,isCampaign:d})=>{const h=S(),e=F(),x=O(()=>{if(!r)return[{name:"",key:1,color:"var(--bui-fg-disabled)",value:0},{name:"",key:2,color:"var(--bui-fg-disabled)",value:0},{name:"",key:3,color:"var(--bui-fg-disabled)",value:0}];const n=j(h);let s=0,o=0;const l=r.levels.sort((u,t)=>t.ordinal-u.ordinal).map(({name:u,ordinal:t})=>{const p=i?.statusByLevel.find(C=>C.ordinal===t)?.cumulativelyPassed??0,f=p-o,w={name:d?"Passed":u??`Level ${t}`,key:t,color:n[t%n.length]||"var(--bui-fg-disabled)",value:f};return s+=f,o=p,w}).reverse();r.levels.reverse();const c=i?.numberOfEntities??0,k=Math.max(0,c-s);return l.push({name:d?"Failed":"No Level",key:-1,color:"var(--bui-fg-disabled)",value:k}),l},[h,r,i,d]),m=i?.numberOfEntities??0;return a("div",{className:e.container,children:x.map(({name:n,key:s,color:o,value:l})=>{const c=m>0?Math.round(l/m*100):0;return v(W,{children:[a("div",{className:e.item,children:v("div",{className:e.category,children:[a("span",{className:e.legendDash,style:{backgroundColor:o}}),r?a(g,{className:e.categoryText,variant:"body-small",children:n}):a(b,{width:80,height:20})]})}),a("div",{className:`${e.item} ${e.valueCell}`,children:r&&i?v(g,{variant:"body-small",children:[y(l)," of"," ",y(m)," (",c,"%)"]}):a(b,{width:120,height:20})})]},s)})})});export{I as TrackStatusTableBUI};
2
+ //# sourceMappingURL=TrackStatusTableBUI.esm.js.map
@@ -0,0 +1,2 @@
1
+ import{jsx as r,jsxs as d,Fragment as V}from"react/jsx-runtime";import{useRouteRef as y,useApi as $}from"@backstage/core-plugin-api";import{entityPresentationApiRef as z}from"@backstage/plugin-catalog-react";import{usePermission as J}from"@backstage/plugin-permission-react";import{Box as a,HeaderPage as K,Flex as Q,SearchField as W}from"@backstage/ui";import{makeStyles as X}from"@material-ui/core";import{soundcheckTrackReadPermission as Y}from"@spotify/backstage-plugin-soundcheck-common";import{useState as A,useMemo as u,useEffect as Z}from"react";import{useSearchParams as _,useParams as ee}from"react-router-dom";import re from"react-use/lib/useDebounce";import"@backstage/catalog-model";import"@tanstack/react-query";import"../../api.esm.js";import"../../hooks/graphqlKeys.esm.js";import"../../hooks/useSoundcheckAlert.esm.js";import{useGetAllTracks as te}from"../../hooks/tracks/useGetAllTracks.esm.js";import{useTrack as ie}from"../../hooks/tracks/useTrack.esm.js";import"../../hooks/useConfirmationModal.esm.js";import"react-use/lib/useLocalStorage";import{useHierarchicalTrackStatus as oe}from"../../hooks/heirarchy/useHierarchicalTrackStatus.esm.js";import{useGroupHierarchy as ae}from"../../hooks/heirarchy/useGroupHierarchy.esm.js";import{useLCPReporting as me}from"../../hooks/useLCPReporting.esm.js";import{useLoadTimeReporting as se}from"../../hooks/useLoadTimeReporting.esm.js";import{tracksPageRouteRef as ne,trackOverviewRouteRef as pe,trackExplorerRouteRef as ce}from"../../routes.esm.js";import{getAllOwnedEntityCount as le}from"../../utils/getAllOwnedEntityCount.esm.js";import{getEntitiesBucket as de,getTracksBucket as ue}from"../../utils/helpers.esm.js";import"../EmptyState/EmptyState.esm.js";import{EmptyStateBUI as E}from"../EmptyState/EmptyStateBUI.esm.js";import"@remixicon/react";import"../FilterSidebar/FilterSidebar.esm.js";import"../FilterSidebar/StateFilter.esm.js";import{useTrackFilterSidebar as fe}from"../FilterSidebar/useTrackFilterSidebar.esm.js";import"../FilterSidebar/util.esm.js";import"../HierarchicalTechInsightsPage/visualizations/NivoCirclePacking.esm.js";import"../HierarchicalTechInsightsPage/visualizations/NivoHeatmap.esm.js";import"../HierarchicalTechInsightsPage/visualizations/NivoIcicle.esm.js";import"../HierarchicalTechInsightsPage/visualizations/NivoSunburst.esm.js";import"../HierarchicalTechInsightsPage/visualizations/NivoTreemap.esm.js";import"../HierarchicalTechInsightsPage/visualizations/VisualizationBreadcrumb.esm.js";import{hierarchyToNivo as he}from"../HierarchicalTechInsightsPage/visualizations/hierarchyToNivo.esm.js";import{LoadingTableSkeleton as ge}from"../LoadingTableSkeleton/LoadingTableSkeleton.esm.js";import{SimpleMenu as ke}from"../Menus/SimpleMenu.esm.js";import"js-yaml";import"lodash";import{useTrackActions as be}from"../Menus/useTrackActions.esm.js";import"uuid";import"../CampaignsPage/CampaignListPage/useArchiveConfirmationModal.esm.js";import"../TechHealth/Filters/types.esm.js";import"../TechHealth/Filters/FacetFilter.esm.js";import"../TechHealth/Filters/FilterProvider.esm.js";import"../TechHealth/Filters/Filters.esm.js";import"../TechHealth/Filters/FiltersHeader.esm.js";import"../TechHealth/Filters/FiltersSection.esm.js";import"../../contexts/TrackFormContext.esm.js";import"../../contexts/CheckFormContext.esm.js";import"../../contexts/CampaignFormContext.esm.js";import"../../contexts/UserProvider.esm.js";import{parseNumberOfDays as ve}from"../TechHealth/Filters/utils.esm.js";import{TechInsightsExplorerTable as Te}from"../TechInsightsExplorerTable/TechInsightsExplorerTable.esm.js";import{TechInsightsGroupSelector as ye}from"../TechInsightsGroupSelector/TechInsightsGroupSelector.esm.js";import{TopAndBottomPerformingTeams as Se}from"../TopAndBottomPerformingTeams/TopAndBottomPerformingTeams.esm.js";const Re=X(()=>({emptyContainer:{padding:"var(--bui-space-1)"},container:{padding:"0 var(--bui-space-1) var(--bui-space-6)"},teams:{margin:"0 var(--bui-space-2) var(--bui-space-12)"},tables:{margin:"0 var(--bui-space-2)"},tableContent:{margin:"var(--bui-space-3) 0 0"},filters:{width:"25rem",marginLeft:"auto"}})),we=()=>{const o=Re(),[m,F]=_(),[s,B]=A(m.get("search")||""),i=m.get("group"),[S,O]=A(""),{trackId:e}=ee(),{data:f,isLoading:p}=ie(e),R=be(f??void 0),{owners:h,lifecycles:g,types:k,systems:b}=fe(),j=y(ne),w=u(()=>ve(m.get("numberOfDays")),[m]);re(()=>{O(s);const t=new URLSearchParams(m.toString());s?t.set("search",s):t.delete("search"),F(t,{replace:!0})},300,[s]);const L=u(()=>({routeName:"soundcheck-track-insights",additionalAttributes:{trackId:e||"",filtersApplied:h.length+g.length+k.length+b.length,ownersFilter:h.join(",")||"",lifecyclesFilter:g.join(",")||"",typesFilter:k.join(",")||"",systemsFilter:b.join(",")||"",numberOfDays:w,tracksSearch:S||""}}),[e,h,g,k,b,w,S]),{reportContentLoaded:P}=se(L),{reporter:D}=me(L),{loading:G,allowed:H}=J({permission:Y,resourceRef:e}),{data:v,isLoading:c}=oe({trackId:e??"",groupRef:i??"",skip:!e}),{data:C}=te({}),n=u(()=>C?.edges.find(t=>t.node.id===e)?.node,[C?.edges,e]),{data:l,isLoading:T}=ae(i||void 0,{enabled:!!i&&!!e&&!!n,ownedEntitiesFilter:n?.filter??void 0}),I=$(z),q=u(()=>{if(!i)return;const t=l?.[i];return t?he(t,v||null,()=>"var(--bui-fg-primary)",I,void 0):void 0},[l,I,i,v]),N=D?.getLCPValue();Z(()=>{if(!p&&!T&&!c){const t=i?le(l?.[i]):0,x=n?1:0;P({lcp:N,numberOfEntities:t,entitiesBucket:de(t),numberOfTracks:x,tracksBucket:ue(x)})}},[p,P,T,c,l,i,n,N]);const M=y(pe),U=y(ce);return p?r(ge,{}):!p&&!f?r(a,{className:o.emptyContainer,children:r(E,{title:"Track not found",body:`There is no track with the requested id: ${e}.`})}):!G&&!H?r(a,{className:o.emptyContainer,children:r(E,{title:"Cannot view track",body:`No permission to view track with the requested id: ${e}.`})}):d(V,{children:[r(a,{children:r(K,{title:f?.name,customActions:r(ke,{label:"Track Actions",disabled:!R.length,placement:"left top",menuActions:R}),breadcrumbs:[{label:"Tracks",href:j()}],tabs:[{id:"overview",label:"Track Overview",href:e?M({trackId:e}):""},{id:"explorer",label:"Tech Insights Explorer",href:e?U({trackId:e}):""}]})}),d(a,{className:o.container,children:[r(a,{className:o.teams,children:r(Se,{trackStatus:v??void 0,isLoading:c})}),d(a,{className:o.tables,children:[d(Q,{align:"center",gap:"3",className:o.filters,children:[r(ye,{}),r(W,{value:s,onChange:B,"aria-label":"Search",placeholder:"Search"})]}),r(a,{className:o.tableContent,children:r(Te,{tableData:q,isLoading:T||c,trackId:n?.id})})]})]})]})};export{we as TrackTechInsightsExplorerPage};
2
+ //# sourceMappingURL=TrackTechInsightsExplorerPage.esm.js.map
@@ -1,2 +1,2 @@
1
- import{jsx as y}from"react/jsx-runtime";import{makeStyles as A,TextField as G}from"@material-ui/core";import{Autocomplete as w}from"@material-ui/lab";import{sortBy as x,isEmpty as E}from"lodash";import{useState as I,useMemo as o}from"react";import"@backstage/catalog-model";import"@backstage/core-plugin-api";import"@tanstack/react-query";import"../../api.esm.js";import"../../hooks/graphqlKeys.esm.js";import"@backstage/plugin-catalog-react";import"@spotify/backstage-plugin-soundcheck-common";import"../../hooks/useSoundcheckAlert.esm.js";import{useGetCampaigns as $}from"../../hooks/campaigns/useGetCampaigns.esm.js";import{useGetAllTracks as B}from"../../hooks/tracks/useGetAllTracks.esm.js";import"../../hooks/useConfirmationModal.esm.js";import"react-router-dom";import{useGetTracksApplicableEntityCount as F}from"../../hooks/tracks/useGetTracksApplicableEntityCount.esm.js";const j=A(a=>({input:{backgroundColor:a.palette.background.paper}})),D=({selectTrack:a,selectedTrackId:n,showArchived:d,showDraft:m,selectedGroupRef:h})=>{const T=j(),{data:s,isLoading:C}=B({}),{data:l,isLoading:v}=$({}),[S,b]=I(n??""),u=o(()=>new Set(l?.edges.filter(({node:t})=>t.archived).map(({node:t})=>t.track.id)??[]),[l?.edges]),r=o(()=>{let t=s?.edges?.map(({node:e})=>({id:e.id,name:e.name,type:e.type==="campaign"?"Campaign":"Track",draft:!!e.draft}))??[];return t=t?.filter(e=>(d||!u.has(e.id))&&(m||!e.draft)),x(t,"type")},[u,d,m,s?.edges]),{data:c,isLoading:f}=F(h??"",{ids:r.map(t=>t.id)}),p=o(()=>{if(f)return r;const t=c??[],e=r.map(i=>{const k=t.find(({id:L})=>L===i.id);return{...i,count:k?k.applicableEntityCount:void 0}}).filter(i=>i.count!==0);return E(e)?r:e},[c,f,r]),g=o(()=>p?.find(t=>t.id===n),[n,p]);return y(w,{loading:C||v,options:p,onChange:(t,e)=>a(e?.id??""),inputValue:S,value:g??null,getOptionLabel:t=>`${t.name}${t.count?` (${t.count})`:""}`,groupBy:t=>t.type,fullWidth:!0,onInputChange:(t,e)=>b(e),renderInput:t=>y(G,{...t,placeholder:"Select Track",className:T.input,style:{margin:0},margin:"dense",variant:"outlined"})},g?.id??"no-value")};export{D as TrackSelection};
1
+ import{jsx as y}from"react/jsx-runtime";import{makeStyles as A,TextField as G}from"@material-ui/core";import{Autocomplete as w}from"@material-ui/lab";import{sortBy as x,isEmpty as E}from"lodash";import{useState as I,useMemo as o}from"react";import"@backstage/catalog-model";import"@backstage/core-plugin-api";import"@tanstack/react-query";import"../../api.esm.js";import"../../hooks/graphqlKeys.esm.js";import"@backstage/plugin-catalog-react";import"@spotify/backstage-plugin-soundcheck-common";import"../../hooks/useSoundcheckAlert.esm.js";import{useGetCampaigns as $}from"../../hooks/campaigns/useGetCampaigns.esm.js";import{useGetAllTracks as B}from"../../hooks/tracks/useGetAllTracks.esm.js";import"../../hooks/useConfirmationModal.esm.js";import"react-router-dom";import"react-use/lib/useLocalStorage";import{useGetTracksApplicableEntityCount as F}from"../../hooks/tracks/useGetTracksApplicableEntityCount.esm.js";const j=A(a=>({input:{backgroundColor:a.palette.background.paper}})),D=({selectTrack:a,selectedTrackId:n,showArchived:d,showDraft:m,selectedGroupRef:h})=>{const T=j(),{data:s,isLoading:C}=B({}),{data:l,isLoading:v}=$({}),[S,b]=I(n??""),u=o(()=>new Set(l?.edges.filter(({node:t})=>t.archived).map(({node:t})=>t.track.id)??[]),[l?.edges]),r=o(()=>{let t=s?.edges?.map(({node:e})=>({id:e.id,name:e.name,type:e.type==="campaign"?"Campaign":"Track",draft:!!e.draft}))??[];return t=t?.filter(e=>(d||!u.has(e.id))&&(m||!e.draft)),x(t,"type")},[u,d,m,s?.edges]),{data:c,isLoading:f}=F(h??"",{ids:r.map(t=>t.id)}),p=o(()=>{if(f)return r;const t=c??[],e=r.map(i=>{const k=t.find(({id:L})=>L===i.id);return{...i,count:k?k.applicableEntityCount:void 0}}).filter(i=>i.count!==0);return E(e)?r:e},[c,f,r]),g=o(()=>p?.find(t=>t.id===n),[n,p]);return y(w,{loading:C||v,options:p,onChange:(t,e)=>a(e?.id??""),inputValue:S,value:g??null,getOptionLabel:t=>`${t.name}${t.count?` (${t.count})`:""}`,groupBy:t=>t.type,fullWidth:!0,onInputChange:(t,e)=>b(e),renderInput:t=>y(G,{...t,placeholder:"Select Track",className:T.input,style:{margin:0},margin:"dense",variant:"outlined"})},g?.id??"no-value")};export{D as TrackSelection};
2
2
  //# sourceMappingURL=TrackSelection.esm.js.map
@@ -1,2 +1,2 @@
1
- import{jsx as r,jsxs as k}from"react/jsx-runtime";import{useRouteRef as _,useApi as S,featureFlagsApiRef as ee}from"@backstage/core-plugin-api";import{usePermission as re}from"@backstage/plugin-permission-react";import{makeStyles as te,Button as N,Grid as a}from"@material-ui/core";import{soundcheckTrackCreatePermission as ae}from"@spotify/backstage-plugin-soundcheck-common";import{useState as i,useMemo as oe,useEffect as B}from"react";import{useNavigate as ie}from"react-router-dom";import se from"react-use/lib/useDebounce";import{soundcheckApiRef as ne}from"../../../api.esm.js";import"@backstage/catalog-model";import"@tanstack/react-query";import"../../../hooks/graphqlKeys.esm.js";import"@backstage/plugin-catalog-react";import"../../../hooks/useSoundcheckAlert.esm.js";import{useGetAllTracks as ce}from"../../../hooks/tracks/useGetAllTracks.esm.js";import"../../../hooks/useConfirmationModal.esm.js";import{useGetTrackOwners as me}from"../../../hooks/tracks/useGetTrackOwners.esm.js";import{useImportTracks as le}from"../../../hooks/tracks/useImportTracks.esm.js";import{useLCPReporting as pe}from"../../../hooks/useLCPReporting.esm.js";import{useLoadTimeReporting as de}from"../../../hooks/useLoadTimeReporting.esm.js";import ge from"../../../images/no-results.svg";import{trackCreateRouteRef as ue}from"../../../routes.esm.js";import{exportTracks as fe}from"../../../utils/export.esm.js";import{FilterDefault as L}from"../../../utils/filters.esm.js";import{EmptyState as F}from"../../EmptyState/EmptyState.esm.js";import"../../EmptyState/EmptyStateBUI.esm.js";import"@backstage/ui";import{ImportExportPanel as he}from"../../ImportExportPanel/ImportExportPanel.esm.js";import{Pagination as ke}from"../../Pagination/Pagination.esm.js";import{SearchFilters as Pe}from"../../SearchFilters/SearchFilters.esm.js";import{TrackEmptyState as P,TrackNoResults as I}from"./TrackEmptyState.esm.js";import{TracksOverviewSkeleton as Te}from"./TracksOverviewSkeleton.esm.js";import{TrackSummaryCard as ye}from"./TrackSummaryCard.esm.js";const Ce=te(t=>({headerButtons:{display:"flex",gap:t.spacing(1),flexWrap:"nowrap",justifyContent:"end",alignItems:"end"},header:{padding:t.spacing(0,0,1)},container:{padding:t.spacing(3),gap:t.spacing(3)},createButton:{lineHeight:"1.25rem",paddingTop:t.spacing(1.5),paddingBottom:t.spacing(1.5)}})),be=({tracksPerPage:t,currentCursor:O})=>{const[s,T]=i(O),[g,E]=i(""),[n,j]=i(L.Alpha),[c,D]=i(L.Owner),[m,G]=i(""),y=oe(()=>({routeName:"soundcheck-tracks",additionalAttributes:{tracksPerPage:t,pageCursor:s||"",sortOrder:n||"",ownerFilter:c||"",nameSearch:m||""}}),[t,s,n,c,m]),{reportContentLoaded:C}=de(y),{reporter:H}=pe(y),l=Ce(),{data:M,isLoading:u}=me();se(()=>{G(g)},500,[g]);const{loading:b,allowed:V}=re({permission:ae}),W=ie(),$=_(ue),x=()=>W($()),{data:f,isLoading:o}=ce({ids:void 0,types:["standard","playlist"],first:t,after:s,orderAlphabetical:n,searchByOwner:c,searchByName:m}),p=f?.edges?.map(e=>e.node),[A,v]=i([]);B(()=>{T(void 0),v([])},[m]);const w=S(ee),q=!w.getRegisteredFlags().find(e=>e.name==="soundcheck-enable-track-creation")||w.isActive("soundcheck-enable-track-creation"),h=!V||!q,z=e=>{j(e.target.value)},J=e=>{D(e.target.value)},K=S(ne),{mutateAsync:Q}=le(),U=async e=>Q(e),X=async()=>{const e=await K.getTracks({orderAlphabetical:"asc"});return fe(e.edges.map(Z=>Z.node))},R=H?.getLCPValue();if(B(()=>{!o&&!u&&C({lcp:R})},[o,u,C,R]),!o&&!p)return r(F,{title:P.title,description:P.description,imgSrc:ge,action:!b&&r(N,{disabled:h,variant:"contained",color:"primary",onClick:x,children:P.callToAction})});let d;o?d=r(Te,{}):p?.length?d=p?.map(e=>r(a,{xs:12,sm:12,md:6,lg:4,xl:3,item:!0,role:"listitem","aria-label":`track card ${e.id}`,children:r(ye,{summary:e})},e.id)):d=r(a,{xs:12,item:!0,role:"listitem","aria-label":"result",children:r(F,{title:I.title,description:I.description})});const Y=f?.pageInfo.hasNextPage||A?.length>0;return k(a,{container:!0,direction:"row",className:l.container,children:[k(a,{container:!0,className:l.header,children:[r(Pe,{searchPlaceholder:"Search Available Tracks",isLoading:o||u,searchTerm:g,setSearchTerm:E,filterAlpha:n,handleAlphabeticalFilterChange:z,filterOwner:c,handleOwnerFilterChange:J,owners:M}),k(a,{item:!0,xs:4,className:l.headerButtons,children:[r(he,{resourceType:"track",disableImport:h,disableExport:o||!p?.length,onImport:U,onExport:X}),!b&&r(N,{disabled:h,variant:"contained",color:"primary",onClick:x,className:l.createButton,children:"Create Track"})]})]}),r(a,{container:!0,spacing:4,role:"list","aria-label":"tracks",children:d}),Y&&r(a,{item:!0,xs:12,children:r(ke,{response:f,listingsPerPage:t,cursor:s,setCursor:T,prevCursors:A,setPrevCursors:v,labelPerPageDropdown:"Tracks Per Page:",urlRoute:"tracks?tracksPerPage="})})]})};export{be as TrackListPageDeprecated};
1
+ import{jsx as r,jsxs as k}from"react/jsx-runtime";import{useRouteRef as _,useApi as S,featureFlagsApiRef as ee}from"@backstage/core-plugin-api";import{usePermission as re}from"@backstage/plugin-permission-react";import{makeStyles as te,Button as N,Grid as a}from"@material-ui/core";import{soundcheckTrackCreatePermission as ae}from"@spotify/backstage-plugin-soundcheck-common";import{useState as i,useMemo as oe,useEffect as B}from"react";import{useNavigate as ie}from"react-router-dom";import se from"react-use/lib/useDebounce";import{soundcheckApiRef as ne}from"../../../api.esm.js";import"@backstage/catalog-model";import"@tanstack/react-query";import"../../../hooks/graphqlKeys.esm.js";import"@backstage/plugin-catalog-react";import"../../../hooks/useSoundcheckAlert.esm.js";import{useGetAllTracks as ce}from"../../../hooks/tracks/useGetAllTracks.esm.js";import"../../../hooks/useConfirmationModal.esm.js";import"react-use/lib/useLocalStorage";import{useGetTrackOwners as me}from"../../../hooks/tracks/useGetTrackOwners.esm.js";import{useImportTracks as le}from"../../../hooks/tracks/useImportTracks.esm.js";import{useLCPReporting as pe}from"../../../hooks/useLCPReporting.esm.js";import{useLoadTimeReporting as de}from"../../../hooks/useLoadTimeReporting.esm.js";import ge from"../../../images/no-results.svg";import{trackCreateRouteRef as ue}from"../../../routes.esm.js";import{exportTracks as fe}from"../../../utils/export.esm.js";import{FilterDefault as L}from"../../../utils/filters.esm.js";import{EmptyState as F}from"../../EmptyState/EmptyState.esm.js";import"../../EmptyState/EmptyStateBUI.esm.js";import"@remixicon/react";import{ImportExportPanelDeprecated as he}from"../../ImportExportPanel/ImportExportPanelDeprecated.esm.js";import{Pagination as ke}from"../../Pagination/Pagination.esm.js";import{SearchFilters as Pe}from"../../SearchFilters/SearchFilters.esm.js";import{TrackEmptyState as P,TrackNoResults as I}from"./TrackEmptyState.esm.js";import{TracksOverviewSkeleton as Te}from"./TracksOverviewSkeleton.esm.js";import{TrackSummaryCard as ye}from"./TrackSummaryCard.esm.js";const Ce=te(t=>({headerButtons:{display:"flex",gap:t.spacing(1),flexWrap:"nowrap",justifyContent:"end",alignItems:"end"},header:{padding:t.spacing(0,0,1)},container:{padding:t.spacing(3),gap:t.spacing(3)},createButton:{lineHeight:"1.25rem",paddingTop:t.spacing(1.5),paddingBottom:t.spacing(1.5)}})),be=({tracksPerPage:t,currentCursor:O})=>{const[s,T]=i(O),[g,E]=i(""),[n,D]=i(L.Alpha),[c,j]=i(L.Owner),[m,G]=i(""),y=oe(()=>({routeName:"soundcheck-tracks",additionalAttributes:{tracksPerPage:t,pageCursor:s||"",sortOrder:n||"",ownerFilter:c||"",nameSearch:m||""}}),[t,s,n,c,m]),{reportContentLoaded:C}=de(y),{reporter:H}=pe(y),l=Ce(),{data:M,isLoading:u}=me();se(()=>{G(g)},500,[g]);const{loading:b,allowed:V}=re({permission:ae}),W=ie(),$=_(ue),x=()=>W($()),{data:f,isLoading:o}=ce({ids:void 0,types:["standard","playlist"],first:t,after:s,orderAlphabetical:n,searchByOwner:c,searchByName:m}),p=f?.edges?.map(e=>e.node),[A,v]=i([]);B(()=>{T(void 0),v([])},[m]);const w=S(ee),q=!w.getRegisteredFlags().find(e=>e.name==="soundcheck-enable-track-creation")||w.isActive("soundcheck-enable-track-creation"),h=!V||!q,z=e=>{D(e.target.value)},J=e=>{j(e.target.value)},K=S(ne),{mutateAsync:Q}=le(),U=async e=>Q(e),X=async()=>{const e=await K.getTracks({orderAlphabetical:"asc"});return fe(e.edges.map(Z=>Z.node))},R=H?.getLCPValue();if(B(()=>{!o&&!u&&C({lcp:R})},[o,u,C,R]),!o&&!p)return r(F,{title:P.title,description:P.description,imgSrc:ge,action:!b&&r(N,{disabled:h,variant:"contained",color:"primary",onClick:x,children:P.callToAction})});let d;o?d=r(Te,{}):p?.length?d=p?.map(e=>r(a,{xs:12,sm:12,md:6,lg:4,xl:3,item:!0,role:"listitem","aria-label":`track card ${e.id}`,children:r(ye,{summary:e})},e.id)):d=r(a,{xs:12,item:!0,role:"listitem","aria-label":"result",children:r(F,{title:I.title,description:I.description})});const Y=f?.pageInfo.hasNextPage||A?.length>0;return k(a,{container:!0,direction:"row",className:l.container,children:[k(a,{container:!0,className:l.header,children:[r(Pe,{searchPlaceholder:"Search Available Tracks",isLoading:o||u,searchTerm:g,setSearchTerm:E,filterAlpha:n,handleAlphabeticalFilterChange:z,filterOwner:c,handleOwnerFilterChange:J,owners:M}),k(a,{item:!0,xs:4,className:l.headerButtons,children:[r(he,{resourceType:"track",disableImport:h,disableExport:o||!p?.length,onImport:U,onExport:X}),!b&&r(N,{disabled:h,variant:"contained",color:"primary",onClick:x,className:l.createButton,children:"Create Track"})]})]}),r(a,{container:!0,spacing:4,role:"list","aria-label":"tracks",children:d}),Y&&r(a,{item:!0,xs:12,children:r(ke,{response:f,listingsPerPage:t,cursor:s,setCursor:T,prevCursors:A,setPrevCursors:v,labelPerPageDropdown:"Tracks Per Page:",urlRoute:"tracks?tracksPerPage="})})]})};export{be as TrackListPageDeprecated};
2
2
  //# sourceMappingURL=TrackListPageDeprecated.esm.js.map
@@ -1,2 +1,2 @@
1
- import{jsx as l}from"react/jsx-runtime";import{useRouteRef as p,useApi as I,configApiRef as v}from"@backstage/core-plugin-api";import{usePermission as a}from"@backstage/plugin-permission-react";import{soundcheckTrackUpdatePermission as u,soundcheckTrackDeletePermission as x}from"@spotify/backstage-plugin-soundcheck-common";import{useCallback as i}from"react";import{useNavigate as A}from"react-router-dom";import"@backstage/catalog-model";import"@tanstack/react-query";import"../../../api.esm.js";import"../../../hooks/graphqlKeys.esm.js";import"@backstage/plugin-catalog-react";import"../../../hooks/useSoundcheckAlert.esm.js";import{useConfirmationModal as C}from"../../../hooks/useConfirmationModal.esm.js";import{useDeleteTrack as P}from"../../../hooks/tracks/useDeleteTrack.esm.js";import{useRecertifyTrack as M}from"../../../hooks/tracks/useRecertifyTrack.esm.js";import{trackDetailsRouteRef as N,trackEditRouteRef as O}from"../../../routes.esm.js";import{exportTrack as $}from"../../../utils/export.esm.js";import{SummaryCard as S}from"../../SummaryCard/SummaryCard.esm.js";import{TrackMetadata as j}from"./TrackMetadata.esm.js";const B=({summary:e})=>{const{loading:f,allowed:k}=a({permission:u,resourceRef:e.id}),{loading:y,allowed:h}=a({permission:x,resourceRef:e.id}),{loading:g,allowed:w}=a({permission:u,resourceRef:e.id}),{showModal:r}=C(),{mutate:m}=M(),{mutate:n}=P(),o=A(),s=p(N),c=p(O),d=I(v).getOptionalConfig("soundcheck.certifications.history");let t=d?.getOptionalBoolean("enable")?d?.getOptionalNumber("retentionTimeInDays")??120:1;t=Math.min(t,365);const R=i(async()=>{await r({title:"Recertify Track",message:`Are you sure you want to recertify track ${e.name}? It will erase existing certification data, which cannot be undone. New data will be generated for the past ${t} day(s), reflecting the track's current configuration. This process may take some time, you will be notified upon completion.`})&&m({trackId:e.id,numberOfDays:t})},[r,e.id,e.name,m,t]),T=i(async()=>{await r({title:"Delete Track",message:`Are you sure you want to delete track ${e.name}?`})&&n(e.id)},[r,e.id,e.name,n]),b=i(()=>{o(s({trackId:e.id}))},[o,e.id,s]),D=i(()=>{o(c({trackId:e.id}))},[o,e.id,c]),E=i(()=>{$(e)},[e]);return l(S,{title:e.name,description:e.description,children:l(j,{track:e}),handleView:b,handleEdit:e.isEditable&&!g&&w?D:void 0,handleDelete:e.isEditable&&!y&&h?T:void 0,handleExport:E,handleRecertify:!f&&k?R:void 0,viewIsPrimaryAction:!0})};export{B as TrackSummaryCard};
1
+ import{jsx as l}from"react/jsx-runtime";import{useRouteRef as p,useApi as I,configApiRef as v}from"@backstage/core-plugin-api";import{usePermission as a}from"@backstage/plugin-permission-react";import{soundcheckTrackUpdatePermission as u,soundcheckTrackDeletePermission as x}from"@spotify/backstage-plugin-soundcheck-common";import{useCallback as i}from"react";import{useNavigate as A}from"react-router-dom";import"@backstage/catalog-model";import"@tanstack/react-query";import"../../../api.esm.js";import"../../../hooks/graphqlKeys.esm.js";import"@backstage/plugin-catalog-react";import"../../../hooks/useSoundcheckAlert.esm.js";import{useConfirmationModal as C}from"../../../hooks/useConfirmationModal.esm.js";import"react-use/lib/useLocalStorage";import{useDeleteTrack as P}from"../../../hooks/tracks/useDeleteTrack.esm.js";import{useRecertifyTrack as M}from"../../../hooks/tracks/useRecertifyTrack.esm.js";import{trackDetailsRouteRef as N,trackEditRouteRef as O}from"../../../routes.esm.js";import{exportTrack as $}from"../../../utils/export.esm.js";import{SummaryCard as S}from"../../SummaryCard/SummaryCard.esm.js";import{TrackMetadata as j}from"./TrackMetadata.esm.js";const B=({summary:e})=>{const{loading:f,allowed:k}=a({permission:u,resourceRef:e.id}),{loading:y,allowed:h}=a({permission:x,resourceRef:e.id}),{loading:g,allowed:w}=a({permission:u,resourceRef:e.id}),{showModal:r}=C(),{mutate:m}=M(),{mutate:n}=P(),o=A(),s=p(N),c=p(O),d=I(v).getOptionalConfig("soundcheck.certifications.history");let t=d?.getOptionalBoolean("enable")?d?.getOptionalNumber("retentionTimeInDays")??120:1;t=Math.min(t,365);const R=i(async()=>{await r({title:"Recertify Track",message:`Are you sure you want to recertify track ${e.name}? It will erase existing certification data, which cannot be undone. New data will be generated for the past ${t} day(s), reflecting the track's current configuration. This process may take some time, you will be notified upon completion.`})&&m({trackId:e.id,numberOfDays:t})},[r,e.id,e.name,m,t]),T=i(async()=>{await r({title:"Delete Track",message:`Are you sure you want to delete track ${e.name}?`})&&n(e.id)},[r,e.id,e.name,n]),b=i(()=>{o(s({trackId:e.id}))},[o,e.id,s]),D=i(()=>{o(c({trackId:e.id}))},[o,e.id,c]),E=i(()=>{$(e)},[e]);return l(S,{title:e.name,description:e.description,children:l(j,{track:e}),handleView:b,handleEdit:e.isEditable&&!g&&w?D:void 0,handleDelete:e.isEditable&&!y&&h?T:void 0,handleExport:E,handleRecertify:!f&&k?R:void 0,viewIsPrimaryAction:!0})};export{B as TrackSummaryCard};
2
2
  //# sourceMappingURL=TrackSummaryCard.esm.js.map
@@ -1,2 +1,2 @@
1
- import{jsxs as l,Fragment as U,jsx as e}from"react/jsx-runtime";import{useApi as $,useRouteRef as S}from"@backstage/core-plugin-api";import{entityPresentationApiRef as H}from"@backstage/plugin-catalog-react";import{usePermission as M}from"@backstage/plugin-permission-react";import{Box as T,HeaderPage as D,Table as V,TableHeader as j,Column as i,TableBody as O,TablePagination as z,Icon as F}from"@backstage/ui";import{makeStyles as G}from"@material-ui/core";import{soundcheckTrackCreatePermission as W}from"@spotify/backstage-plugin-soundcheck-common";import{sortBy as Y,isEmpty as _}from"lodash";import{useState as u,useMemo as p,useEffect as q}from"react";import"@backstage/catalog-model";import"@tanstack/react-query";import"../../api.esm.js";import"../../hooks/graphqlKeys.esm.js";import"../../hooks/useSoundcheckAlert.esm.js";import{useGetAllTracks as J}from"../../hooks/tracks/useGetAllTracks.esm.js";import"../../hooks/useConfirmationModal.esm.js";import"react-router-dom";import{useSearchName as K}from"../../hooks/useSearchName.esm.js";import{usePagination as Q}from"../../hooks/usePagination.esm.js";import{useProfileImages as X}from"../../hooks/catalog/useProfileImages.esm.js";import{useLCPReporting as Z}from"../../hooks/useLCPReporting.esm.js";import{useLoadTimeReporting as ee}from"../../hooks/useLoadTimeReporting.esm.js";import{trackCreateRouteRef as te,trackDetailsRouteRef as re}from"../../routes.esm.js";import"../EmptyState/EmptyState.esm.js";import{EmptyStateBUI as oe}from"../EmptyState/EmptyStateBUI.esm.js";import{EmptyStateNoTracks as ie}from"../EmptyState/EmptyStateNoTracks.esm.js";import{ListPageCustomActions as ae}from"../ListPageCustomActions/ListPageCustomActions.esm.js";import{LoadingTableSkeleton as ne}from"../LoadingTableSkeleton/LoadingTableSkeleton.esm.js";import{TableRowWithOwner as se}from"../TableRowWithOwner/TableRowWithOwner.esm.js";const C=10,me=G(()=>({container:{padding:"0 var(--bui-space-3)"},emptySpacing:{margin:"var(--bui-space-3) 0"}})),ce=({track:t,profileImageMap:a})=>{const c=p(()=>t.levels.reduce((d,n)=>d+(n.checks?.length??0),0),[t.levels]),o=S(re);return e(se,{ownerEntityRef:t.ownerEntityRef,href:o({trackId:t.id}),actions:["export","edit","delete"],profileImageSrc:a[t.ownerEntityRef],cells:[{title:t.name??t.id},{title:"",onClick:()=>{},icon:t.documentationURL?e("a",{href:/^https?:\/\//i.test(t.documentationURL)?t.documentationURL:`http://${t.documentationURL}`,target:"_blank",rel:"noreferrer noopener",children:e(F,{name:"external-link"})}):void 0},{title:t.draft?"Draft":"Active"},{title:`${t.levels.length} Level${t.levels.length===1?"":"s"}`},{title:`${c} Check${c===1?"":"s"}`}]})},le=()=>{const t=me(),[a,c]=u("ascending"),[o,d]=u(""),[n,v]=u(""),g=p(()=>({routeName:"soundcheck-tracks"}),[]),{reportContentLoaded:h}=ee(g),{reporter:b}=Z(g),{data:k,isLoading:s}=J({types:["standard","playlist"]}),y=p(()=>k?.edges?.map(r=>r.node)??[],[k?.edges]),{profileImageMap:E}=X(y.map(r=>r.ownerEntityRef)),w=$(H),f=K({items:y,searchTerm:n}),R=p(()=>{if(!o)return f;const r=Y(f,m=>o==="owner"?w.forEntity(m.ownerEntityRef).snapshot.primaryTitle.toLowerCase():o==="status"?m.draft?"draft":"active":m.name.toLowerCase());return a==="descending"&&r.reverse(),r},[w,o,a,f]),{paginatedItems:L,reset:I,paginationProps:x}=Q({pageParam:"tracksPerPage",defaultPageSize:C,items:R}),P=b?.getLCPValue();q(()=>{s||h({lcp:P})},[s,h,P]);const N=S(te),{loading:A,allowed:B}=M({permission:W});return l(U,{children:[e(T,{children:e(D,{title:"Tracks",customActions:e(ae,{searchValue:n,setSearchValue:r=>{I(),v(r)},canCreate:!A&&B,createHref:N()})})}),l(T,{className:t.container,children:[l(V,{onSortChange:({direction:r,column:m})=>{d(String(m)),c(r)},sortDescriptor:{direction:a,column:o},children:[l(j,{children:[e(i,{id:"name",allowsSorting:!0,isRowHeader:!0,children:"Track Name"}),e(i,{style:{width:"30px"},id:"documentation"}),e(i,{allowsSorting:!0,id:"status",children:"Status"}),e(i,{id:"levels",children:"Levels"}),e(i,{id:"checks",children:"Checks"}),e(i,{id:"owner",allowsSorting:!0,children:"Track Owner"}),e(i,{style:{width:"30px"}})]}),e(O,{children:!s&&L.map(r=>e(ce,{track:r,profileImageMap:E??{}},r.id))})]}),R.length>C&&e(z,{...x}),!s&&_(L)&&e("div",{className:t.emptySpacing,children:n?e(oe,{title:"No tracks found",body:"Your current search term did not return any tracks. Please try a different search term."}):e(ie,{})}),s&&e(ne,{rowCount:10})]})]})};export{le as TracksListPageBUI};
1
+ import{jsx as e,jsxs as c,Fragment as J}from"react/jsx-runtime";import{useApi as L,useRouteRef as A}from"@backstage/core-plugin-api";import{entityPresentationApiRef as Q}from"@backstage/plugin-catalog-react";import{usePermission as W}from"@backstage/plugin-permission-react";import{Box as x,HeaderPage as Y,Flex as q,Table as K,TableHeader as X,Column as s,TableBody as Z,TablePagination as _}from"@backstage/ui";import{makeStyles as ee}from"@material-ui/core";import{soundcheckTrackCreatePermission as te}from"@spotify/backstage-plugin-soundcheck-common";import{sortBy as re,isEmpty as y}from"lodash";import{useState as k,useMemo as l,useEffect as oe}from"react";import{soundcheckApiRef as ie}from"../../api.esm.js";import"@backstage/catalog-model";import"@tanstack/react-query";import"../../hooks/graphqlKeys.esm.js";import"../../hooks/useSoundcheckAlert.esm.js";import{useGetAllTracks as ae}from"../../hooks/tracks/useGetAllTracks.esm.js";import"../../hooks/useConfirmationModal.esm.js";import"react-router-dom";import{useSearchName as se}from"../../hooks/useSearchName.esm.js";import{usePagination as ne}from"../../hooks/usePagination.esm.js";import"react-use/lib/useLocalStorage";import{useProfileImages as me}from"../../hooks/catalog/useProfileImages.esm.js";import{useImportTracks as ce}from"../../hooks/tracks/useImportTracks.esm.js";import{useLCPReporting as pe}from"../../hooks/useLCPReporting.esm.js";import{useLoadTimeReporting as le}from"../../hooks/useLoadTimeReporting.esm.js";import{trackCreateRouteRef as de,trackDetailsRouteRef as fe}from"../../routes.esm.js";import{exportTracks as ue}from"../../utils/export.esm.js";import"../EmptyState/EmptyState.esm.js";import{EmptyStateBUI as ge}from"../EmptyState/EmptyStateBUI.esm.js";import{EmptyStateNoTracks as he}from"../EmptyState/EmptyStateNoTracks.esm.js";import"@remixicon/react";import{ImportExportPanelBUI as ye}from"../ImportExportPanel/ImportExportPanelBUI.esm.js";import"../ImportExportPanel/ImportExportPanelDeprecated.esm.js";import{ListPageCustomActions as ke}from"../ListPageCustomActions/ListPageCustomActions.esm.js";import{LoadingTableSkeleton as we}from"../LoadingTableSkeleton/LoadingTableSkeleton.esm.js";import"../Menus/SimpleMenu.esm.js";import{useTrackActions as Re}from"../Menus/useTrackActions.esm.js";import"uuid";import"../CampaignsPage/CampaignListPage/useArchiveConfirmationModal.esm.js";import{TableRowWithOwner as Te}from"../TableRowWithOwner/TableRowWithOwner.esm.js";const N=10,Pe=ee(()=>({container:{padding:"0 var(--bui-space-3) var(--bui-space-6)"},emptySpacing:{margin:"var(--bui-space-3) 0"}})),Se=({track:r,profileImageMap:n})=>{const p=l(()=>r.levels.reduce((m,f)=>m+(f.checks?.length??0),0),[r.levels]),o=A(fe),d=Re(r);return e(Te,{ownerEntityRef:r.ownerEntityRef,href:o({trackId:r.id}),menuActions:d,profileImageSrc:n[r.ownerEntityRef],name:r.name??r.id,description:r.description??"",documentationURL:r.documentationURL??void 0,cells:[{title:r.draft?"Draft":"Active"},{title:`${r.levels.length} Level${r.levels.length===1?"":"s"}`},{title:`${p} Check${p===1?"":"s"}`}]})},ve=()=>{const r=Pe(),[n,p]=k("ascending"),[o,d]=k(""),[m,f]=k(""),w=l(()=>({routeName:"soundcheck-tracks"}),[]),{reportContentLoaded:R}=le(w),{reporter:B}=pe(w),{data:T,isLoading:i}=ae({types:["standard","playlist"]}),u=l(()=>T?.edges?.map(t=>t.node)??[],[T?.edges]),{profileImageMap:U}=me(u.map(t=>t.ownerEntityRef)),P=L(Q),g=se({items:u,searchTerm:m}),S=l(()=>{if(!o)return g;const t=re(g,a=>o==="owner"?P.forEntity(a.ownerEntityRef).snapshot.primaryTitle.toLowerCase():o==="status"?a.draft?"draft":"active":a.name.toLowerCase());return n==="descending"&&t.reverse(),t},[P,o,n,g]),{paginatedItems:h,reset:H,paginationProps:M}=ne({pageParam:"perPage",defaultPageSize:N,items:S}),v=B?.getLCPValue();oe(()=>{i||R({lcp:v})},[i,R,v]);const $=A(de),{loading:C,allowed:I}=W({permission:te}),D=L(ie),{mutateAsync:V}=ce(),F=async t=>V(t),O=async()=>{const t=await D.getTracks({orderAlphabetical:"asc"});return ue(t.edges.map(a=>a.node))},j=!i&&!y(h),G=S.length>N,b=!i&&y(h),z=i;let E=null;return b&&(E=m?e(ge,{title:"No tracks found",body:"Your current search term did not return any tracks. Please try a different search term."}):e(he,{})),c(J,{children:[e(x,{children:e(Y,{title:"Tracks",customActions:c(q,{gap:"2",align:"center",children:[e(ye,{resourceType:"track",disableImport:!C&&!I,disableExport:i||y(u),onImport:F,onExport:O}),e(ke,{searchValue:m,setSearchValue:t=>{H(),f(t)},canCreate:!C&&I,createHref:$()})]})})}),c(x,{className:r.container,children:[z&&e(we,{rowCount:10}),b&&e("div",{className:r.emptySpacing,children:E}),j&&c(K,{onSortChange:({direction:t,column:a})=>{d(String(a)),p(t)},sortDescriptor:{direction:n,column:o},children:[c(X,{children:[e(s,{id:"name",allowsSorting:!0,isRowHeader:!0,style:{width:"51%"},children:"Track Name"}),e(s,{allowsSorting:!0,id:"status",style:{width:"10%"},children:"Status"}),e(s,{id:"levels",style:{width:"10%"},children:"Levels"}),e(s,{id:"checks",style:{width:"10%"},children:"Checks"}),e(s,{id:"owner",allowsSorting:!0,style:{width:"15%"},children:"Track Owner"}),e(s,{id:"actions",style:{width:"2%"}})]}),e(Z,{children:!i&&h.map(t=>e(Se,{track:t,profileImageMap:U??{}},t.id))})]}),G&&e(_,{...M})]})]})};export{ve as TracksListPageBUI};
2
2
  //# sourceMappingURL=TracksListPageBUI.esm.js.map
@@ -1,2 +1,2 @@
1
- import{jsx as t}from"react/jsx-runtime";import{useSearchParams as i}from"react-router-dom";import{useFeatureFlag as p}from"../../hooks/useFeatureFlag.esm.js";import{RESULTS_PER_PAGE as e}from"../../utils/filters.esm.js";import{TrackListPageDeprecated as a}from"./TrackListPage/TrackListPageDeprecated.esm.js";import"@backstage/core-plugin-api";import"@backstage/plugin-permission-react";import"@spotify/backstage-plugin-soundcheck-common";import"react";import"@backstage/catalog-model";import"@tanstack/react-query";import"../../api.esm.js";import"../../hooks/graphqlKeys.esm.js";import"@backstage/plugin-catalog-react";import"../../hooks/useSoundcheckAlert.esm.js";import"../../hooks/useConfirmationModal.esm.js";import"../../contexts/TrackFormContext.esm.js";import"../../contexts/CheckFormContext.esm.js";import"../../contexts/CampaignFormContext.esm.js";import"../../contexts/UserProvider.esm.js";import"../../routes.esm.js";import"js-yaml";import"lodash";import"../SummaryCard/SummaryCard.esm.js";import"./TrackListPage/TrackMetadata.esm.js";import{TracksListPageBUI as s}from"./TracksListPageBUI.esm.js";const c=()=>{const[o]=i(),r=o.get("tracksPerPage"),m=r?parseInt(r,10):e;return p("backstage-ui")?t(s,{}):t(a,{tracksPerPage:m})};export{c as TracksPage};
1
+ import{jsx as t}from"react/jsx-runtime";import{useSearchParams as i}from"react-router-dom";import{useFeatureFlag as p}from"../../hooks/useFeatureFlag.esm.js";import{RESULTS_PER_PAGE as e}from"../../utils/filters.esm.js";import{TrackListPageDeprecated as a}from"./TrackListPage/TrackListPageDeprecated.esm.js";import"@backstage/core-plugin-api";import"@backstage/plugin-permission-react";import"@spotify/backstage-plugin-soundcheck-common";import"react";import"@backstage/catalog-model";import"@tanstack/react-query";import"../../api.esm.js";import"../../hooks/graphqlKeys.esm.js";import"@backstage/plugin-catalog-react";import"../../hooks/useSoundcheckAlert.esm.js";import"../../hooks/useConfirmationModal.esm.js";import"react-use/lib/useLocalStorage";import"../../contexts/TrackFormContext.esm.js";import"../../contexts/CheckFormContext.esm.js";import"../../contexts/CampaignFormContext.esm.js";import"../../contexts/UserProvider.esm.js";import"../../routes.esm.js";import"js-yaml";import"lodash";import"../SummaryCard/SummaryCard.esm.js";import"./TrackListPage/TrackMetadata.esm.js";import{TracksListPageBUI as s}from"./TracksListPageBUI.esm.js";const c=()=>{const[o]=i(),r=o.get("tracksPerPage"),m=r?parseInt(r,10):e;return p("backstage-ui")?t(s,{}):t(a,{tracksPerPage:m})};export{c as TracksPage};
2
2
  //# sourceMappingURL=TracksPage.esm.js.map
@@ -313,6 +313,7 @@ ${q}`,R=s`
313
313
  filter
314
314
  name
315
315
  description
316
+ isEditable
316
317
  }
317
318
  }
318
319
  `,U=s`
@@ -0,0 +1,2 @@
1
+ import{stringifyEntityRef as I,parseEntityRef as b}from"@backstage/catalog-model";import{useApi as G,configApiRef as M}from"@backstage/core-plugin-api";import{combineEntityFilterQueries as N,getGroupFilterFromConfig as j}from"@spotify/backstage-plugin-soundcheck-common";import l from"lodash/startCase";import{useMemo as w,useCallback as B}from"react";import{useSearchParams as Q}from"react-router-dom";import{CheckState as r}from"../../components/CheckPage/utils.esm.js";import{useGetEntityFacets as f}from"../catalog/useGetEntityFacets.esm.js";import{useGetEntityRefs as _}from"../catalog/useGetEntityRefs.esm.js";function x({entityFilterQuery:m,hasStatusFilters:E=!1,hasCertificationStatusFilters:d=!1}){const R=G(M),[o,u]=Q(),A=N({kind:["group"]},j(R)),{data:y}=_(A),h=w(()=>y?.items.map(e=>({label:e.metadata.title??e.metadata.name,value:I(e)}))??[],[y]),{data:F}=f("spec.lifecycle",m),L=F?.map(e=>({label:e,value:e}))??[],{data:$}=f("spec.type",m),k=$?.map(e=>({label:e,value:e}))??[],{data:C}=f("relations.partOf",m),g=C?.map(e=>({label:b(e).name,value:e}))??[],O=[r.PASSED,r.FAILED,r.WARNING,r.EXEMPT,r.NOT_APPLICABLE,r.ERROR].map(e=>({label:l(e.toLowerCase()),value:e})),P=[r.PASSED,r.FAILED,r.NOT_REPORTED].map(e=>{const t=l(e.toLowerCase());return{label:t,value:t}}),v=(e,t)=>{const s=["owners","systems"];if(e==="certificationStatuses")return`statuses: ${l(t.toLowerCase())}`;const a=e.replace(/s$/,"");return s.includes(e)?`${a}: ${b(t).name}`:e==="states"?`${a}: ${l(t.toLowerCase())}`:`${a}: ${t}`},c=w(()=>{const e=["numberOfDays","search"],t={owners:new Set,lifecycles:new Set,types:new Set,systems:new Set,states:new Set,certificationStatuses:new Set};for(const[s,a]of o.entries())if(!e.includes(s)){const i=a.split(",").map(n=>n.trim()).filter(Boolean);t[s]=new Set(i)}return t},[o]),S=B((e,t)=>{const s=new URLSearchParams(o),a=Array.from(t);a.length>0?s.set(e,a.join(",")):s.delete(e),u(s,{replace:!0})},[o,u]),T=Object.entries(c).flatMap(([e,t])=>Array.from(t).map(s=>({label:v(e,s),value:`${e}:${s}`}))),D=e=>{e.forEach(t=>{if(typeof t!="string")return;const[s,a]=t.split(/:(.+)/),i=c[s];if(!i)return;const n=new Set(i);n.delete(a),S(s,n)})},p=[{key:"owners",label:"Owner",options:h},{key:"lifecycles",label:"Lifecycle",options:L},{key:"types",label:"Type",options:k},{key:"systems",label:"System",options:g}];return E&&p.push({key:"states",label:"States",options:O}),d&&p.push({key:"certificationStatuses",label:"Status",options:P}),{filters:p,selected:c,setSelected:S,selectedTags:T,onRemoveTag:D}}export{x as useFilters};
2
+ //# sourceMappingURL=useFilters.esm.js.map
@@ -1,2 +1,2 @@
1
- import{useMemo as c}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 d}from"./useAllGroups.esm.js";import{useUsersGroupClaims as f}from"./useUsersGroupClaims.esm.js";import"../useSoundcheckAlert.esm.js";import"../useConfirmationModal.esm.js";import"react-router-dom";const y=()=>{const{data:e,isLoading:m,isError:n}=f(),{data:i,isLoading:a,isError:u}=d();return{options:c(()=>{const o=new Map;return e&&e.forEach(({name:t,description:s,ref:r,type:p})=>{o.set(`${r}`,{name:t,description:s,ref:r,type:p,key:"My Groups"})}),i&&i.forEach(({name:t,description:s,ref:r,type:p})=>{o.has(`${r}`)||o.set(`${r}`,{name:t,description:s,ref:r,type:p,key:"All Groups"})}),[...o.values()]},[e,i]),isLoading:m||a,isError:n||u}};export{y as useGroupOptions};
1
+ import{useMemo as c}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 d}from"./useAllGroups.esm.js";import{useUsersGroupClaims as f}from"./useUsersGroupClaims.esm.js";import"../useSoundcheckAlert.esm.js";import"../useConfirmationModal.esm.js";import"react-router-dom";import"react-use/lib/useLocalStorage";const y=()=>{const{data:i,isLoading:m,isError:n}=f(),{data:e,isLoading:a,isError:u}=d();return{options:c(()=>{const o=new Map;return i&&i.forEach(({name:t,description:s,ref:r,type:p})=>{o.set(`${r}`,{name:t,description:s,ref:r,type:p,key:"My Groups"})}),e&&e.forEach(({name:t,description:s,ref:r,type:p})=>{o.has(`${r}`)||o.set(`${r}`,{name:t,description:s,ref:r,type:p,key:"All Groups"})}),[...o.values()]},[i,e]),isLoading:m||a,isError:n||u}};export{y as useGroupOptions};
2
2
  //# sourceMappingURL=useGroupOptions.esm.js.map
@@ -1,2 +1,2 @@
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};
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,enabled:!!r&&r.trim()!==""&&e?.enabled!==!1})};export{o as useGroupHierarchy};
2
2
  //# sourceMappingURL=useGroupHierarchy.esm.js.map
@@ -1,2 +1,2 @@
1
- import{parseEntityRef as G}from"@backstage/catalog-model";import{useMemo as o}from"react";import{useGetCampaigns as T}from"../campaigns/useGetCampaigns.esm.js";import{useGetAllTracks as y}from"./useGetAllTracks.esm.js";import{useGetTracksApplicableEntityCount as E}from"./useGetTracksApplicableEntityCount.esm.js";function v(r){if(!r||r.trim()==="")return!1;try{return G(r).kind.toLowerCase()==="group"}catch{return!1}}function A(r,b={},h){const n=v(r)&&(h?.enabled??!0),{data:d,isLoading:s,error:c}=y(b,{enabled:n}),{data:p,isLoading:l,error:m}=T({},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:g,error:f}=E(r,{ids:i.map(e=>e.id)},{enabled:n&&i.length>0&&!s&&!l}),k=o(()=>t?new Map(t.map(e=>[e.id,e.applicableEntityCount])):new Map,[t]),C=o(()=>t?i.filter(e=>{const a=k.get(e.id);return a!==void 0&&a>0}):[],[i,k,t]),L=o(()=>s||l||g||!!r&&!t&&i.length>0,[s,l,g,r,t,i.length]),w=o(()=>c||m||f,[c,m,f]);return{tracks:C??[],counts:t,isLoading:L,error:w,activeTrackCount:i?.length}}export{A as useTracksApplicableToGroup};
1
+ import{parseEntityRef as G}from"@backstage/catalog-model";import{useMemo as i}from"react";import{useGetCampaigns as T}from"../campaigns/useGetCampaigns.esm.js";import{useGetAllTracks as y}from"./useGetAllTracks.esm.js";import{useGetTracksApplicableEntityCount as E}from"./useGetTracksApplicableEntityCount.esm.js";function v(r){if(!r||r.trim()==="")return!1;try{return G(r).kind.toLowerCase()==="group"}catch{return!1}}function A(r,b={},h){const d=v(r)&&(h?.enabled??!0),{data:s,isLoading:p,error:c}=y(b,{enabled:d}),{data:o,isLoading:l,error:m}=T({},d),u=i(()=>o?.edges?new Set(o.edges.filter(({node:e})=>e.archived).map(({node:e})=>e.track.id)):new Set,[o]),a=i(()=>s?.edges?s.edges.map(({node:e})=>e).filter(e=>!u.has(e.id)).filter(e=>!e.draft).sort((e,n)=>e.id.localeCompare(n.id)):[],[s,u]),{data:t,isLoading:g,error:f}=E(r,{ids:a.map(e=>e.id)},{enabled:d&&a.length>0&&!p&&!l}),k=i(()=>t?new Map(t.map(e=>[e.id,e.applicableEntityCount])):new Map,[t]),C=i(()=>t?a.filter(e=>{const n=k.get(e.id);return n!==void 0&&n>0}):[],[a,k,t]),L=i(()=>p||l||g||!!r&&!t&&a.length>0,[p,l,g,r,t,a.length]),w=i(()=>c||m||f,[c,m,f]);return{tracks:C??[],campaigns:o,counts:t,isLoading:L,error:w,activeTrackCount:a?.length}}export{A as useTracksApplicableToGroup};
2
2
  //# sourceMappingURL=useTracksApplicableToGroup.esm.js.map
@@ -1,2 +1,2 @@
1
- import{useState as S,useCallback as s,useMemo as h}from"react";import{useSearchParams as z}from"react-router-dom";const C=({pageParam:g,defaultPageSize:n=10,items:t})=>{const[m,i]=z(),r=m.get(g),a=r?parseInt(r,10):n,[e,o]=S(0),p=s(()=>{e!==0&&o(0)},[e]),u=h(()=>t.length>a?t.slice(e,e+a):t,[t,e,a]),P=s(()=>{o(e+a)},[a,e]),c=s(()=>{o(e-a)},[a,e]),f=s(l=>{o(0),i(`${g}=${l}`)},[g,i]);return{paginationProps:{pageSize:a,rowCount:t.length,offset:e,onNextPage:P,onPreviousPage:c,onPageSizeChange:f},paginatedItems:u,reset:p}};export{C as usePagination};
1
+ import{useCallback as g,useMemo as x}from"react";import{useSearchParams as M}from"react-router-dom";const z=({pageParam:p,defaultPageSize:l=10,items:r})=>{const[a,n]=M(),m=a.get(p),h=a.get("page"),s=m?parseInt(m,10):l,o=h?parseInt(h,10):1,c=(o-1)*s,i=g(e=>{const t=new URLSearchParams(a.toString());t.set("page",String(e)),n(t,{replace:!0})},[a,n]),P=g(e=>{const t=new URLSearchParams(a.toString());t.set(p,String(e)),t.set("page","1"),n(t,{replace:!0})},[p,a,n]),S=x(()=>r.length>s?r.slice(c,c+s):r,[r,c,s]),u=g(()=>{const e=Math.ceil(r.length/s),t=Math.min(o+1,e);i(t)},[o,r.length,s,i]),f=g(()=>{const e=Math.max(o-1,1);i(e)},[o,i]),w=g(()=>{const e=new URLSearchParams(a.toString());e.set("page","1"),n(e,{replace:!0})},[a,n]);return{paginationProps:{pageSize:s,rowCount:r.length,offset:c,onNextPage:u,onPreviousPage:f,onPageSizeChange:P},paginatedItems:S,reset:w}};export{z as usePagination};
2
2
  //# sourceMappingURL=usePagination.esm.js.map
@@ -0,0 +1,2 @@
1
+ import{useEffect as B,useCallback as P}from"react";import{useSearchParams as h}from"react-router-dom";import u from"react-use/lib/useLocalStorage";const b=({localStoragePrefix:f,defaultSortBy:g,defaultDirection:p})=>{const[t,s]=h(),[a,n]=u(`${f}-sort-column`),[i,l]=u(`${f}-direction`),r=t.get("sortBy"),o=t.get("direction"),d=r||g,m=o||p||"desc";B(()=>{r&&r!==a&&n(r),o&&o!==i&&l(o);const e=new URLSearchParams(t.toString());let c=!1;!r&&a&&(e.set("sortBy",a),c=!0),!o&&i&&(e.set("direction",i),c=!0),c&&s(e,{replace:!0})},[a,i,t,n,l,s,o,r]);const y=P(e=>{const c=d===e&&m==="asc"?"desc":"asc",S=new URLSearchParams(t.toString());S.set("sortBy",e),S.set("direction",c),s(S,{replace:!0}),n(e),l(c)},[m,d,t,n,l,s]);return{orderBy:d,order:m,handleSort:y}};export{b as useSortTableLocalStorage};
2
+ //# sourceMappingURL=useSortTableLocalStorage.esm.js.map
@@ -1,2 +1,2 @@
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};
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"}),h=e({id:"soundcheck-entity-playlist-track-redirect",parent:c,path:"/playlists/:playlistId/tracks/:trackId/checks/:checkId"}),t=a({id:"soundcheck"}),o=e({id:"soundcheck-quickstart",parent:t,path:"/quickstart"}),k=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"}),g=e({id:"soundcheck-check-templates",parent:t,path:"/checks/templates"}),l=e({id:"soundcheck-tracks",parent:t,path:"/tracks"}),f=e({id:"soundcheck-track-details",parent:t,path:"/tracks/:trackId"}),m=e({id:"soundcheck-track-edit",parent:t,path:"/tracks/:trackId/edit"}),I=e({id:"soundcheck-track-create",parent:t,path:"/tracks/create"}),y=e({id:"soundcheck-track-check-details",parent:t,path:"/tracks/:trackId/checks/:checkId"}),v=e({id:"soundcheck-campaigns",parent:t,path:"/campaigns"}),P=e({id:"soundcheck-campaign-details",parent:t,path:"/campaigns/:campaignId"}),x=e({id:"soundcheck-campaign-edit",parent:t,path:"/campaigns/:campaignId/edit"}),w=e({id:"soundcheck-campaign-create",parent:t,path:"/campaigns/create"}),E=e({id:"soundcheck-tech-health",parent:t,path:"/tech-health"}),C=e({id:"soundcheck-tech-insights",parent:t,path:"/tech-insights"}),D=e({id:"soundcheck-integrations-page",parent:t,path:"/integrations"}),T=e({id:"soundcheck-integration-details",parent:t,path:"/integrations/:integrationId"}),q=e({id:"soundcheck-integration-edit",parent:t,path:"/integrations/:integrationId/edit"}),O=e({id:"soundcheck-tech-insights-track",parent:t,path:"/tech-insights/track"}),b=e({id:"soundcheck-track-overview",parent:t,path:"/tracks/:trackId/overview"}),H=e({id:"soundcheck-track-explorer",parent:t,path:"/tracks/:trackId/explorer"}),S=e({id:"soundcheck-campaign-overview",parent:t,path:"/campaigns/:campaignId/overview"}),j=e({id:"soundcheck-campaign-explorer",parent:t,path:"/campaigns/:campaignId/explorer"});export{w as campaignCreateRouteRef,P as campaignDetailsRouteRef,x as campaignEditRouteRef,j as campaignExplorerRouteRef,S as campaignOverviewRouteRef,v as campaignsPageRouteRef,s as certificationPlaylistRouteRef,h as certificationPlaylistTrackCheckRouteRef,d as certificationPlaylistTrackRouteRef,n as certificationRouteRef,r as certificationTrackRouteRef,R as checkCreateRouteRef,p as checkDetailsRouteRef,u as checkEditRouteRef,g as checkTemplatesRouteRef,k as checksPageRouteRef,c as entityRootRouteRef,i as groupRootRouteRef,T as integrationDetailsRouteRef,q as integrationEditRouteRef,D as integrationsPageRouteRef,o as quickstartRouteRef,t as rootRouteRef,E as techHealthRouteRef,C as techInsightsPageRouteRef,O as techInsightsTrackRouteRef,y as trackCheckDetailsRouteRef,I as trackCreateRouteRef,f as trackDetailsRouteRef,m as trackEditRouteRef,H as trackExplorerRouteRef,b as trackOverviewRouteRef,l as tracksPageRouteRef};
2
2
  //# sourceMappingURL=routes.esm.js.map