@spotify/backstage-plugin-soundcheck 0.22.5 → 0.23.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (186) hide show
  1. package/CHANGELOG.md +40 -0
  2. package/dist/alpha/CampaignsRouterPage.esm.js +2 -0
  3. package/dist/alpha/ChecksRouterPage.esm.js +2 -0
  4. package/dist/alpha/IntegrationsRouterPage.esm.js +2 -0
  5. package/dist/alpha/OverviewPageWrapper.esm.js +2 -0
  6. package/dist/alpha/TracksRouterPage.esm.js +2 -0
  7. package/dist/alpha/plugin.esm.js +1 -1
  8. package/dist/alpha.d.ts +155 -59
  9. package/dist/blueprints/IntegrationPageBlueprint.esm.js +1 -1
  10. package/dist/components/Badge/Badge.esm.js +2 -0
  11. package/dist/components/Badges/LevelBadge.esm.js +1 -1
  12. package/dist/components/Badges/StatusBadge.esm.js +1 -1
  13. package/dist/components/CampaignForm/hooks/useCampaignForm.esm.js +1 -1
  14. package/dist/components/CampaignForm/utils/validation.esm.js +1 -1
  15. package/dist/components/CampaignPage/CampaignPageBUI.esm.js +1 -1
  16. package/dist/components/CampaignPage/CampaignStatusBarBUI.esm.js +1 -1
  17. package/dist/components/CampaignPage/CampaignTechInsightsExplorerPage.esm.js +1 -1
  18. package/dist/components/CampaignsPage/CampaignListPageBUI.esm.js +1 -1
  19. package/dist/components/CampaignsPage/CampaignsPage.esm.js +1 -1
  20. package/dist/components/Cards/CheckStatusCard/CheckStatusCard.esm.js +1 -1
  21. package/dist/components/CheckDetails/CheckDetails.esm.js +1 -1
  22. package/dist/components/CheckDetails/CheckPullRequest.esm.js +1 -1
  23. package/dist/components/CheckDetails/FixMeDialog.esm.js +1 -1
  24. package/dist/components/CheckForm/FormFields/RuleInput/Conditions/RuleConditionInput.esm.js +1 -1
  25. package/dist/components/CheckForm/useCheckForm.esm.js +1 -1
  26. package/dist/components/CheckForm/utils/validation.esm.js +1 -1
  27. package/dist/components/CheckIcon/CheckIcon.esm.js +1 -1
  28. package/dist/components/CheckPage/CheckEntitiesTable/CheckEntitiesTableBUI.esm.js +1 -1
  29. package/dist/components/CheckPage/CheckPageBUI.esm.js +1 -1
  30. package/dist/components/CheckPage/ExemptionsTableBUI.esm.js +1 -1
  31. package/dist/components/CheckPage/utils.esm.js +1 -1
  32. package/dist/components/CheckSelection/CheckSelection.esm.js +1 -1
  33. package/dist/components/CheckStatusBar/CheckStatusBarBUI.esm.js +1 -1
  34. package/dist/components/CheckTemplatesPage/CheckTemplatesPageBUI.esm.js +1 -1
  35. package/dist/components/ChecksPage/ChecksListPageBUI.esm.js +1 -1
  36. package/dist/components/ChecksTable/ChecksTable.esm.js +1 -1
  37. package/dist/components/ChecksTable/FixMeCell.esm.js +1 -1
  38. package/dist/components/CollectorPage/CollectorDetailsPageBUI.esm.js +1 -1
  39. package/dist/components/CollectorPage/CollectorPage.esm.js +1 -1
  40. package/dist/components/CollectorPage/CollectorStatus.esm.js +2 -0
  41. package/dist/components/CollectorPage/Configurators/AzureDevOps/AzureDevOpsConfigurator.esm.js +1 -1
  42. package/dist/components/CollectorPage/Configurators/AzureDevOps/validation.esm.js +1 -1
  43. package/dist/components/CollectorPage/Configurators/BigQuery/BigQueryConfigurator.esm.js +1 -1
  44. package/dist/components/CollectorPage/Configurators/BigQuery/validation.esm.js +1 -1
  45. package/dist/components/CollectorPage/Configurators/Common/CollectorOption.esm.js +1 -1
  46. package/dist/components/CollectorPage/Configurators/Common/utils.esm.js +1 -1
  47. package/dist/components/CollectorPage/Configurators/Configurator.esm.js +1 -1
  48. package/dist/components/CollectorPage/Configurators/Github/GithubConfigurator.esm.js +1 -1
  49. package/dist/components/CollectorPage/Configurators/Github/validation.esm.js +1 -1
  50. package/dist/components/CollectorPage/Configurators/HTTP/HttpConfigurator.esm.js +1 -1
  51. package/dist/components/CollectorPage/Configurators/HTTP/validation.esm.js +1 -1
  52. package/dist/components/CollectorPage/Configurators/Jira/JiraConfigurator.esm.js +1 -1
  53. package/dist/components/CollectorPage/Configurators/Jira/validation.esm.js +1 -1
  54. package/dist/components/CollectorPage/Configurators/Kubernetes/KubernetesConfigurator.esm.js +1 -1
  55. package/dist/components/CollectorPage/Configurators/Kubernetes/validation.esm.js +1 -1
  56. package/dist/components/CollectorPage/Configurators/PagerDuty/PagerDutyConfigurator.esm.js +1 -1
  57. package/dist/components/CollectorPage/Configurators/PagerDuty/validation.esm.js +1 -1
  58. package/dist/components/CollectorPage/Configurators/SCM/RegexFactDetailsComponent.esm.js +1 -1
  59. package/dist/components/CollectorPage/Configurators/SCM/ScmConfigurator.esm.js +1 -1
  60. package/dist/components/CollectorPage/Configurators/SCM/utils.esm.js +1 -1
  61. package/dist/components/CollectorPage/Configurators/SCM/validation.esm.js +1 -1
  62. package/dist/components/CollectorPage/Configurators/SchemaBased/SchemaBasedConfigurator.esm.js +2 -0
  63. package/dist/components/CollectorPage/Configurators/SchemaBased/SchemaField.esm.js +2 -0
  64. package/dist/components/CollectorPage/Configurators/SchemaBased/utils.esm.js +2 -0
  65. package/dist/components/CollectorPage/Configurators/SonarQube/SonarQubeConfigurator.esm.js +1 -1
  66. package/dist/components/CollectorPage/Configurators/SonarQube/validation.esm.js +1 -1
  67. package/dist/components/CollectorPage/utils.esm.js +2 -0
  68. package/dist/components/CollectorsPage/CollectorsPage.esm.js +1 -1
  69. package/dist/components/CollectorsPage/IntegrationLogoBUI.esm.js +1 -1
  70. package/dist/components/CollectorsPage/IntegrationsListPageBUI.esm.js +1 -1
  71. package/dist/components/CreateNewTrackPage/CreateNewTrackPage.esm.js +1 -1
  72. package/dist/components/DescriptionCell/DescriptionCell.esm.js +1 -1
  73. package/dist/components/EntityChip/EntityChip.esm.js +1 -1
  74. package/dist/components/FactExplorer/FactExplorer.esm.js +1 -1
  75. package/dist/components/Filter/FilterComponent.esm.js +1 -1
  76. package/dist/components/Filter/FilterPreviewDisplay.esm.js +2 -0
  77. package/dist/components/FilterSidebar/useTrackFilterSidebar.esm.js +1 -1
  78. package/dist/components/FilterSidebar/util.esm.js +1 -1
  79. package/dist/components/FixMeBetaBadge/FixMeBetaBadge.esm.js +2 -0
  80. package/dist/components/FixMeButton/FixMeButton.esm.js +1 -1
  81. package/dist/components/FormControlledAutocomplete/ControlledAutocomplete.esm.js +1 -1
  82. package/dist/components/FormattedPreview/FormattedPreview.esm.js +3 -3
  83. package/dist/components/GroupSelectorBUI/GroupSelectionHistory.esm.js +1 -1
  84. package/dist/components/GroupSelectorBUI/GroupSelectorBUI.esm.js +1 -1
  85. package/dist/components/GroupSelectorBUI/GroupTagsDisplay.esm.js +2 -0
  86. package/dist/components/GroupSelectorBUI/ListViewMode.esm.js +2 -0
  87. package/dist/components/ListPageCustomActions/ListPageCustomActions.esm.js +1 -1
  88. package/dist/components/Menus/useCampaignActions.esm.js +1 -1
  89. package/dist/components/Menus/useCheckActions.esm.js +1 -1
  90. package/dist/components/RoutingPage/RoutingPageBUI.esm.js +1 -1
  91. package/dist/components/RoutingPage/RoutingPageWrapperBUI.esm.js +1 -1
  92. package/dist/components/SendCampaignNotificationDialog/SendCampaignNotificationDialogBUI.esm.js +1 -1
  93. package/dist/components/StatusBar/StatusBar.esm.js +1 -1
  94. package/dist/components/Stepper/Stepper.esm.js +1 -1
  95. package/dist/components/TableRowWithOwner/TableRowWithOwner.esm.js +1 -1
  96. package/dist/components/TechInsights/TechInsightsPageBUI.esm.js +1 -1
  97. package/dist/components/TechInsights/TechInsightsTableBUI.esm.js +1 -1
  98. package/dist/components/TechInsights/hierarchyToNivo.esm.js +2 -0
  99. package/dist/components/TechInsightsExplorerTable/TechInsightsExplorerTable.esm.js +1 -1
  100. package/dist/components/TechInsightsGroupSelector/TechInsightsGroupSelector.esm.js +1 -1
  101. package/dist/components/TimePeriodBar/TimePeriodBarBUI.esm.js +1 -1
  102. package/dist/components/TopAndBottomPerformingTeams/TopAndBottomPerformingTeams.esm.js +1 -1
  103. package/dist/components/TopFailingChecksTable/TopFailingChecksTableBUI.esm.js +1 -1
  104. package/dist/components/TrackBuilderPage/components/SelectProviderStep/SelectProviderStep.esm.js +1 -1
  105. package/dist/components/TrackForm/utils/useTrackForm.esm.js +1 -1
  106. package/dist/components/TrackForm/utils/validation.esm.js +1 -1
  107. package/dist/components/TrackPage/TrackEntitiesTable/TrackEntitiesTableBUI.esm.js +1 -1
  108. package/dist/components/TrackPage/TrackPageBUI.esm.js +1 -1
  109. package/dist/components/TrackPage/TrackStatusBarBUI.esm.js +1 -1
  110. package/dist/components/TrackPage/TrackStatusTableBUI.esm.js +1 -1
  111. package/dist/components/TrackPage/TrackTechInsightsExplorerPage.esm.js +1 -1
  112. package/dist/components/TracksPage/TracksListPageBUI.esm.js +1 -1
  113. package/dist/graphql/generated/index.esm.js +22 -13
  114. package/dist/hooks/catalog/useEntityPresentation.esm.js +2 -0
  115. package/dist/hooks/catalog/useEntityPrimaryTitle.esm.js +2 -0
  116. package/dist/hooks/catalog/useGetEntityRefs.esm.js +1 -1
  117. package/dist/hooks/checks/useDeleteCheck.esm.js +1 -1
  118. package/dist/hooks/collectors/useGetCollectors.esm.js +1 -1
  119. package/dist/hooks/filters/useFilters.esm.js +1 -1
  120. package/dist/hooks/filters/useListPageFilters.esm.js +2 -0
  121. package/dist/hooks/fixMe/useFixMe.esm.js +1 -1
  122. package/dist/hooks/useChipScopedUrlState.esm.js +2 -0
  123. package/dist/hooks/usePagination.esm.js +1 -1
  124. package/dist/index.d.ts +130 -4
  125. package/dist/index.esm.js +1 -1
  126. package/dist/plugins/soundcheck/package.json.esm.js +2 -0
  127. package/dist/utils/charts.esm.js +1 -1
  128. package/dist/utils/facetFilters/utils.esm.js +1 -1
  129. package/dist/utils/filters.esm.js +1 -1
  130. package/dist/utils/validation.esm.js +1 -1
  131. package/package.json +24 -22
  132. package/dist/alpha/pages.esm.js +0 -2
  133. package/dist/components/CategoryBar/CategoryBar.esm.js +0 -2
  134. package/dist/components/CheckStatusBar/CheckStatusBar.esm.js +0 -2
  135. package/dist/components/CheckTemplatesPage/CheckTemplatesPageDeprecated.esm.js +0 -2
  136. package/dist/components/CheckTemplatesPage/TemplateCategory.esm.js +0 -2
  137. package/dist/components/CollectorPage/CollectorDetailsPageDeprecated.esm.js +0 -2
  138. package/dist/components/CollectorPage/CollectorFactTable.esm.js +0 -2
  139. package/dist/components/CollectorsPage/CollectorListPage/CollectorListPageDeprecated.esm.js +0 -2
  140. package/dist/components/CollectorsPage/CollectorListPage/CollectorLogo.esm.js +0 -2
  141. package/dist/components/CollectorsPage/CollectorListPage/CollectorSummaryCard.esm.js +0 -2
  142. package/dist/components/HierarchicalTechInsightsPage/getLeafNodes.esm.js +0 -2
  143. package/dist/components/HierarchicalTechInsightsPage/visualizations/LoadingOverlay.esm.js +0 -2
  144. package/dist/components/HierarchicalTechInsightsPage/visualizations/NivoCirclePacking.esm.js +0 -2
  145. package/dist/components/HierarchicalTechInsightsPage/visualizations/NivoHeatmap.esm.js +0 -2
  146. package/dist/components/HierarchicalTechInsightsPage/visualizations/NivoIcicle.esm.js +0 -2
  147. package/dist/components/HierarchicalTechInsightsPage/visualizations/NivoSunburst.esm.js +0 -2
  148. package/dist/components/HierarchicalTechInsightsPage/visualizations/NivoTreemap.esm.js +0 -2
  149. package/dist/components/HierarchicalTechInsightsPage/visualizations/VisualizationBreadcrumb.esm.js +0 -2
  150. package/dist/components/HierarchicalTechInsightsPage/visualizations/hierarchyToNivo.esm.js +0 -2
  151. package/dist/components/ImportExportPanel/ImportExportPanelDeprecated.esm.js +0 -2
  152. package/dist/components/SummaryCard/SummaryCard.esm.js +0 -2
  153. package/dist/components/SummaryCard/SummaryCardActionsMenu.esm.js +0 -2
  154. package/dist/images/GitHub_Logo.svg +0 -9
  155. package/dist/images/GitHub_Logo_White.svg +0 -9
  156. package/dist/images/SCM_DARK.svg +0 -10
  157. package/dist/images/SCM_LIGHT.svg +0 -10
  158. package/dist/images/azure-devops-rgb.svg +0 -13
  159. package/dist/images/azure-devops-white.svg +0 -13
  160. package/dist/images/bigquery-rgb.svg +0 -15
  161. package/dist/images/bigquery-white.svg +0 -15
  162. package/dist/images/cat-blk.svg +0 -12
  163. package/dist/images/cat-wht.svg +0 -12
  164. package/dist/images/data-registry-blk.svg +0 -36
  165. package/dist/images/data-registry-wht.svg +0 -36
  166. package/dist/images/dd_logo_h_rgb.svg +0 -17
  167. package/dist/images/dd_logo_h_white.svg +0 -17
  168. package/dist/images/gitlab-rgb.svg +0 -1
  169. package/dist/images/gitlab-white.svg +0 -1
  170. package/dist/images/http-rgb.svg +0 -11
  171. package/dist/images/http-white.svg +0 -11
  172. package/dist/images/jira-rgb.svg +0 -25
  173. package/dist/images/jira-white.svg +0 -25
  174. package/dist/images/k8s_blue.svg +0 -108
  175. package/dist/images/k8s_white.svg +0 -108
  176. package/dist/images/new-relic-rgb.svg +0 -1
  177. package/dist/images/new-relic-white.svg +0 -1
  178. package/dist/images/pd-black.svg +0 -9
  179. package/dist/images/pd-white.svg +0 -9
  180. package/dist/images/sonarqube-rgb.svg +0 -14
  181. package/dist/images/sonarqube-white.svg +0 -14
  182. package/dist/images/soundcheck-black.svg +0 -13
  183. package/dist/images/soundcheck-white.svg +0 -13
  184. package/dist/images/tech-black.svg +0 -11
  185. package/dist/images/tech-white.svg +0 -11
  186. /package/dist/components/CampaignsPage/{CampaignListPage/useArchiveConfirmationModal.esm.js → useArchiveConfirmationModal.esm.js} +0 -0
@@ -1,2 +1,2 @@
1
- import{jsx as t}from"react/jsx-runtime";import{useRouteRef as E,useApi as x,configApiRef as N}from"@backstage/core-plugin-api";import{usePermission as n}from"@backstage/plugin-permission-react";import{RiEditBoxLine as M,RiArchiveLine as P,RiDeleteBinLine as B,RiNotificationLine as T,RiExternalLinkLine as U}from"@remixicon/react";import{soundcheckCampaignUpdatePermission as $,soundcheckCampaignDeletePermission as j,soundcheckCampaignNotificationsCreatePermission as I}from"@spotify/backstage-plugin-soundcheck-common";import{useState as O,useCallback as m,useMemo as q}from"react";import{useNavigate as z}from"react-router-dom";import{v4 as F}from"uuid";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{useArchiveCampaign as G}from"../../hooks/campaigns/useArchiveCampaign.esm.js";import{useDeleteCampaign as H}from"../../hooks/campaigns/useDeleteCampaign.esm.js";import{useCreateTrack as J}from"../../hooks/tracks/useCreateTrack.esm.js";import{useConfirmationModal as K}from"../../hooks/useConfirmationModal.esm.js";import"react-use/lib/useLocalStorage";import"react-use/lib/useAsync";import"../ChecksTable/utils.esm.js";import"../../graphql/generated/index.esm.js";import"react-use/lib/useAsyncRetry";import{campaignEditRouteRef as Q}from"../../routes.esm.js";import{useExternalCampaignActions as V}from"../CampaignPage/CampaignActionsContext.esm.js";import{useArchiveConfirmationModal as W}from"../CampaignsPage/CampaignListPage/useArchiveConfirmationModal.esm.js";const X=i=>{const s=E(Q),r=z(),c=i?.archived,{showModal:d}=K(),[D,p]=O(!1),{showArchiveModal:l}=W(),{mutate:u}=J(),{mutate:f}=H(),{mutate:h}=G(),g=V(),C=x(N).getOptionalBoolean("soundcheck.notifications.enabled"),{loading:R,allowed:k}=n({permission:$,resourceRef:i?.id}),{loading:v,allowed:w}=n({permission:j,resourceRef:i?.id}),{loading:A,allowed:y}=n({permission:I}),b=m(async()=>{i?.id&&await d({title:"Delete Campaign",message:`Are you sure you want to delete campaign ${i.name??i.id}?`})&&f(i.id)},[d,f,i?.id,i?.name]),L=m(()=>{if(!i)return;const{track:o}=i,e={id:F(),ownerEntityRef:o.ownerEntityRef,description:o.description??"",name:o.name,documentationURL:o.documentationURL,type:"standard",levels:o.levels.map(a=>({checks:a.checks,description:a.description,name:a.name,ordinal:a.ordinal})),filter:o.filter??void 0,exclude:o.exclude??void 0,badgeType:"status",draft:o.draft??!1};u(e)},[i,u]),S=m(async()=>{if(!i?.id)return;const{saveTrack:o,confirmed:e}=await l({title:"Archive Campaign",message:`Are you sure you want to archive campaign ${i.name??i.id}?`});e&&(o&&L(),h(i.id))},[h,i?.id,i?.name,L,l]);return{actions:q(()=>{if(!i?.id)return[];const o=[];!R&&k&&o.push({label:"Edit",id:"edit",onClick:()=>r(s({campaignId:i.id})),iconStart:t(M,{})}),!v&&w&&(c||o.push({label:"Archive",id:"archive",onClick:S,iconStart:t(P,{})}),o.push({label:"Delete",id:"delete",onClick:b,iconStart:t(B,{})})),!A&&C&&y&&i&&o.push({label:"Send Reminder",id:"send",onClick:()=>p(!0),iconStart:t(T,{})});for(const e of g)o.push({label:e.label,id:e.id,onClick:()=>r(e.href(i.id)),iconStart:t(U,{})});return o},[i,s,w,k,y,g,S,b,c,C,v,R,A,r]),showNotificationDialog:D,setShowNotificationDialog:p}};export{X as useCampaignActions};
1
+ import{jsx as t}from"react/jsx-runtime";import{useRouteRef as E,useApi as x,configApiRef as N}from"@backstage/core-plugin-api";import{usePermission as n}from"@backstage/plugin-permission-react";import{RiEditBoxLine as M,RiArchiveLine as P,RiDeleteBinLine as B,RiNotificationLine as T,RiExternalLinkLine as U}from"@remixicon/react";import{soundcheckCampaignUpdatePermission as $,soundcheckCampaignDeletePermission as j,soundcheckCampaignNotificationsCreatePermission as I}from"@spotify/backstage-plugin-soundcheck-common";import{useState as O,useCallback as m,useMemo as q}from"react";import{useNavigate as z}from"react-router-dom";import{v4 as F}from"uuid";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{useArchiveCampaign as G}from"../../hooks/campaigns/useArchiveCampaign.esm.js";import{useDeleteCampaign as H}from"../../hooks/campaigns/useDeleteCampaign.esm.js";import{useCreateTrack as J}from"../../hooks/tracks/useCreateTrack.esm.js";import{useConfirmationModal as K}from"../../hooks/useConfirmationModal.esm.js";import"react-use/lib/useLocalStorage";import"react-use/lib/useAsync";import"../ChecksTable/utils.esm.js";import"../../graphql/generated/index.esm.js";import"react-use/lib/useAsyncRetry";import{campaignEditRouteRef as Q}from"../../routes.esm.js";import{useExternalCampaignActions as V}from"../CampaignPage/CampaignActionsContext.esm.js";import{useArchiveConfirmationModal as W}from"../CampaignsPage/useArchiveConfirmationModal.esm.js";const X=i=>{const s=E(Q),r=z(),c=i?.archived,{showModal:d}=K(),[D,p]=O(!1),{showArchiveModal:l}=W(),{mutate:u}=J(),{mutate:f}=H(),{mutate:h}=G(),g=V(),C=x(N).getOptionalBoolean("soundcheck.notifications.enabled"),{loading:R,allowed:k}=n({permission:$,resourceRef:i?.id}),{loading:v,allowed:w}=n({permission:j,resourceRef:i?.id}),{loading:A,allowed:y}=n({permission:I}),b=m(async()=>{i?.id&&await d({title:"Delete Campaign",message:`Are you sure you want to delete campaign ${i.name??i.id}?`})&&f(i.id)},[d,f,i?.id,i?.name]),L=m(()=>{if(!i)return;const{track:o}=i,e={id:F(),ownerEntityRef:o.ownerEntityRef,description:o.description??"",name:o.name,documentationURL:o.documentationURL,type:"standard",levels:o.levels.map(a=>({checks:a.checks,description:a.description,name:a.name,ordinal:a.ordinal})),filter:o.filter??void 0,exclude:o.exclude??void 0,badgeType:"status",draft:o.draft??!1};u(e)},[i,u]),S=m(async()=>{if(!i?.id)return;const{saveTrack:o,confirmed:e}=await l({title:"Archive Campaign",message:`Are you sure you want to archive campaign ${i.name??i.id}?`});e&&(o&&L(),h(i.id))},[h,i?.id,i?.name,L,l]);return{actions:q(()=>{if(!i?.id)return[];const o=[];!R&&k&&o.push({label:"Edit",id:"edit",onClick:()=>r(s({campaignId:i.id})),iconStart:t(M,{})}),!v&&w&&(c||o.push({label:"Archive",id:"archive",onClick:S,iconStart:t(P,{})}),o.push({label:"Delete",id:"delete",onClick:b,iconStart:t(B,{})})),!A&&C&&y&&i&&o.push({label:"Send Reminder",id:"send",onClick:()=>p(!0),iconStart:t(T,{})});for(const e of g)o.push({label:e.label,id:e.id,onClick:()=>r(e.href(i.id)),iconStart:t(U,{})});return o},[i,s,w,k,y,g,S,b,c,C,v,R,A,r]),showNotificationDialog:D,setShowNotificationDialog:p}};export{X as useCampaignActions};
2
2
  //# sourceMappingURL=useCampaignActions.esm.js.map
@@ -1,2 +1,2 @@
1
- import{jsx as e}from"react/jsx-runtime";import{useRouteRef as u}from"@backstage/core-plugin-api";import{usePermission as d}from"@backstage/plugin-permission-react";import{RiExportLine as f,RiEditBoxLine as h,RiDeleteBinLine as k}from"@remixicon/react";import{soundcheckCheckUpdatePermission as C,soundcheckCheckDeletePermission as R}from"@spotify/backstage-plugin-soundcheck-common";import{useCallback as x,useMemo as E}from"react";import{useNavigate as b}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 w}from"../../hooks/useConfirmationModal.esm.js";import"react-use/lib/useLocalStorage";import"react-use/lib/useAsync";import"../ChecksTable/utils.esm.js";import"../../graphql/generated/index.esm.js";import"react-use/lib/useAsyncRetry";import{useDeleteCheck as D}from"../../hooks/checks/useDeleteCheck.esm.js";import{checkEditRouteRef as g}from"../../routes.esm.js";import{exportCheck as y}from"../../utils/export.esm.js";const L=o=>{const t=b(),r=u(g),{loading:m,allowed:s}=d({permission:C,resourceRef:o?.id}),{loading:n,allowed:p}=d({permission:R,resourceRef:o?.id}),{showModal:c}=w(),{mutate:a}=D(),l=x(async()=>{o?.id&&await c({title:"Delete Check",message:`Are you sure you want to delete the check '${o.name??o.id}'?`})&&a(o.id)},[c,o?.name,a,o?.id]);return E(()=>{if(!o)return[];const i=[{label:"Export",id:"export",onClick:()=>y(o),iconStart:e(f,{})}];return o.isEditable&&!m&&s&&i.push({label:"Edit",id:"edit",onClick:()=>t(r({checkId:o.id})),iconStart:e(h,{})}),o.isEditable&&!n&&p&&i.push({label:"Delete",id:"delete",onClick:l,iconStart:e(k,{})}),i},[p,s,o,r,l,n,m,t])};export{L as useCheckActions};
1
+ import{jsx as r}from"react/jsx-runtime";import{useRouteRef as k}from"@backstage/core-plugin-api";import{usePermission as u}from"@backstage/plugin-permission-react";import{RiExportLine as C,RiEditBoxLine as b,RiDeleteBinLine as f}from"@remixicon/react";import{soundcheckCheckUpdatePermission as w,soundcheckCheckDeletePermission as R}from"@spotify/backstage-plugin-soundcheck-common";import{useCallback as h,useMemo as D}from"react";import{useNavigate as x}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 E}from"../../hooks/useConfirmationModal.esm.js";import"react-use/lib/useLocalStorage";import"react-use/lib/useAsync";import"../ChecksTable/utils.esm.js";import"../../graphql/generated/index.esm.js";import"react-use/lib/useAsyncRetry";import{useDeleteCheck as g}from"../../hooks/checks/useDeleteCheck.esm.js";import{checkEditRouteRef as y}from"../../routes.esm.js";import{exportCheck as N}from"../../utils/export.esm.js";const A=e=>{const s=x(),d=k(y),{loading:l,allowed:a}=u({permission:w,resourceRef:e?.id}),{loading:m,allowed:n}=u({permission:R,resourceRef:e?.id}),{showModal:i}=E(),{mutate:o}=g(),c=h(async()=>{e?.id&&await i({title:"Delete Check",message:`Are you sure you want to delete the check '${e.name??e.id}'?`})&&o(e.id)},[i,e?.name,o,e?.id]),p=h(async()=>{e?.id&&await i({title:"Delete No-Code UI Version",message:`Are you sure you want to delete the No-Code UI version of '${e.name??e.id}'? This will delete it from the database, and the YAML definition will become the single source of the check.`})&&o(e.id)},[i,e?.name,o,e?.id]);return D(()=>{if(!e)return[];const t=[{label:"Export",id:"export",onClick:()=>N(e),iconStart:r(C,{})}];return e.isEditable&&!l&&a&&t.push({label:"Edit",id:"edit",onClick:()=>s(d({checkId:e.id})),iconStart:r(b,{})}),e.isEditable&&!m&&n&&t.push({label:"Delete",id:"delete",onClick:c,iconStart:r(f,{})}),e.isDefinedInYamlAndNcui&&!m&&n&&t.push({label:"Delete No-Code UI Version",id:"delete-ncui-override",onClick:p,iconStart:r(f,{})}),t},[n,a,e,d,c,p,m,l,s])};export{A as useCheckActions};
2
2
  //# sourceMappingURL=useCheckActions.esm.js.map
@@ -1,2 +1,2 @@
1
- import{jsx as e,jsxs as p,Fragment as d}from"react/jsx-runtime";import{useApi as A,featureFlagsApiRef as O,useRouteRef as m}from"@backstage/core-plugin-api";import{usePermission as k}from"@backstage/plugin-permission-react";import{Box as E}from"@backstage/ui";import{soundcheckCampaignCreatePermission as y,soundcheckCheckCreatePermission as N,soundcheckTrackCreatePermission as F}from"@spotify/backstage-plugin-soundcheck-common";import{Helmet as j}from"react-helmet";import{Routes as U,Route as t,Outlet as W,useParams as P,useLocation as D,Navigate as l}from"react-router-dom";import{campaignOverviewRouteRef as H,techInsightsPageRouteRef as L,trackOverviewRouteRef as S,tracksPageRouteRef as V,trackCreateRouteRef as q,newTrackRouteRef as z,trackBuilderRouteRef as G}from"../../routes.esm.js";import{CampaignPage as J}from"../CampaignPage/CampaignPage.esm.js";import{CampaignActionsProvider as K}from"../CampaignPage/CampaignActionsContext.esm.js";import{CampaignTechInsightsExplorerPage as M}from"../CampaignPage/CampaignTechInsightsExplorerPage.esm.js";import{CampaignsPage as Q}from"../CampaignsPage/CampaignsPage.esm.js";import{CampaignCreatePage as X}from"../CampaignCreatePage/CampaignCreatePage.esm.js";import{EditCampaignView as Y}from"../CampaignsPage/EditCampaignView.esm.js";import{CheckCreatePage as Z}from"../CheckCreatePage/CheckCreatePage.esm.js";import{CheckEditPage as _}from"../CheckPage/CheckEditPage.esm.js";import{CheckPage as C}from"../CheckPage/CheckPage.esm.js";import{ChecksTab as $}from"../ChecksTab/ChecksTab.esm.js";import"../CheckTemplatesPage/CheckTemplatesPageBUI.esm.js";import{CheckTemplatesPage as ee}from"../CheckTemplatesPage/CheckTemplatesPage.esm.js";import"../CheckTemplatesPage/CheckTemplatesPageDeprecated.esm.js";import{CollectorPage as te}from"../CollectorPage/CollectorPage.esm.js";import{CollectorDetailsPage as re}from"../CollectorPage/CollectorDetailsPage.esm.js";import"../CollectorPage/CollectorDetailsPageBUI.esm.js";import"../CollectorPage/CollectorDetailsPageDeprecated.esm.js";import{CollectorsPage as ae}from"../CollectorsPage/CollectorsPage.esm.js";import{CreateNewTrackPage as ie}from"../CreateNewTrackPage/CreateNewTrackPage.esm.js";import{OverviewPageContent as ne}from"../OverviewPage/OverviewPageContent.esm.js";import{TechInsightsPage as oe}from"../TechInsights/TechInsightsPage.esm.js";import{TrackBuilderPage as ce}from"../TrackBuilderPage/TrackBuilderPage.esm.js";import{TrackCreatePage as me}from"../TrackCreatePage/TrackCreatePage.esm.js";import{TrackEditPage as pe}from"../TrackEditPage/TrackEditPage.esm.js";import{TrackPage as se}from"../TrackPage/TrackPage.esm.js";import{TrackTechInsightsExplorerPage as le}from"../TrackPage/TrackTechInsightsExplorerPage.esm.js";import{TracksTab as he}from"../TracksTab/TracksTab.esm.js";import{RoutingPageWrapperBUI as de}from"./RoutingPageWrapperBUI.esm.js";const ge=()=>{const r=m(S),i=m(V),n=m(q),a=m(z),o=m(G);return{buildOverview:r,buildTracks:i,buildCreate:n,buildNew:a,buildBuilder:o}},f=r=>{try{return r?.()??null}catch{return null}},v=()=>{const{trackId:r}=P(),i=D(),{buildOverview:n,buildTracks:a,buildCreate:o,buildNew:g,buildBuilder:u}=ge();if(!r)return null;const h=[f(o),f(g),f(u)].filter(Boolean).find(c=>i.pathname.endsWith(c));if(h)return e(l,{to:h,replace:!0});try{const c=n({trackId:r});return e(l,{to:c,replace:!0})}catch{const c=typeof a=="function"?a():"/tracks";return e(l,{to:c,replace:!0})}},ue=()=>{const{campaignId:r}=P(),i=m(H);if(!r)return null;const n=i({campaignId:r});return e(l,{to:n,replace:!0})},ke=()=>{const r=m(L)();return e(l,{to:r,replace:!0})},fe=({title:r="Soundcheck",integrations:i,campaignActions:n=[]})=>{const a=A(O),o=a.getRegisteredFlags(),g=!o.find(s=>s.name==="soundcheck-enable-campaigns")||a.isActive("soundcheck-enable-campaigns"),{loading:u,allowed:h}=k({permission:y}),c=!u&&h,{loading:I,allowed:R}=k({permission:N}),b=!o.find(s=>s.name==="soundcheck-enable-check-creation")||a.isActive("soundcheck-enable-check-creation"),T=!I&&R&&b,{loading:w,allowed:x}=k({permission:F}),B=!o.find(s=>s.name==="soundcheck-enable-track-creation")||a.isActive("soundcheck-enable-track-creation");return e(K,{actions:n,children:e(de,{title:r,children:p(U,{children:[g&&p(d,{children:[e(t,{path:"/campaigns",element:e(Q,{})}),e(t,{path:"/campaigns/:campaignId/edit",element:e(Y,{})}),e(t,{path:"/campaigns/:campaignId",element:e(ue,{})}),e(t,{path:"/campaigns/:campaignId/overview",element:e(J,{})}),e(t,{path:"/campaigns/:campaignId/explorer",element:e(M,{})}),c&&e(t,{path:"/campaigns/create",element:e(X,{})})]}),p(t,{path:"/tracks",element:e(W,{}),children:[e(t,{index:!0,element:e(he,{})}),e(t,{path:"builder",element:e(ce,{})}),!w&&x&&B&&p(d,{children:[e(t,{path:"create",element:e(me,{})}),e(t,{path:"new",element:e(ie,{})})]}),e(t,{path:":trackId/edit",element:e(pe,{})}),e(t,{path:":trackId",element:e(v,{})}),e(t,{path:":trackId/overview",element:e(se,{})}),e(t,{path:":trackId/explorer",element:e(le,{})}),e(t,{path:":trackId/checks/:checkId",element:e(C,{})})]}),e(t,{path:"/checks",element:e($,{})}),e(t,{path:"/checks/:checkId",element:e(C,{})}),e(t,{path:"/checks/:checkId/edit",element:e(_,{})}),T&&p(d,{children:[e(t,{path:"/checks/create",element:e(Z,{})}),e(t,{path:"/checks/templates",element:e(ee,{})})]}),e(t,{path:"/integrations",element:e(ae,{integrations:i})}),e(t,{path:"/integrations/:integrationId",element:e(re,{integrations:i})}),e(t,{path:"/integrations/:integrationId/edit",element:e(te,{})}),e(t,{path:"/tech-insights",element:p(d,{children:[e(j,{title:"Tech Insights"}),e(oe,{})]})}),e(t,{path:"/overview",element:e(E,{style:{margin:"var(--bui-space-6) var(--bui-space-6)"},children:e(ne,{})})}),e(t,{path:"/",element:e(ke,{})})]})})})};export{fe as RoutingPageBUI,v as TrackOverviewRedirect};
1
+ import{jsx as e,jsxs as p,Fragment as g}from"react/jsx-runtime";import{useApi as O,featureFlagsApiRef as E,useRouteRef as c}from"@backstage/core-plugin-api";import{usePermission as k}from"@backstage/plugin-permission-react";import{Box as y}from"@backstage/ui";import{soundcheckCampaignCreatePermission as N,soundcheckCheckCreatePermission as F,soundcheckTrackCreatePermission as H}from"@spotify/backstage-plugin-soundcheck-common";import{Helmet as j}from"react-helmet";import{Routes as U,Route as t,Outlet as W,useParams as P,useLocation as D,Navigate as h}from"react-router-dom";import{campaignOverviewRouteRef as L,techInsightsPageRouteRef as S,trackOverviewRouteRef as V,tracksPageRouteRef as q,trackCreateRouteRef as z,newTrackRouteRef as G,trackBuilderRouteRef as J}from"../../routes.esm.js";import{CampaignPage as K}from"../CampaignPage/CampaignPage.esm.js";import{CampaignActionsProvider as M}from"../CampaignPage/CampaignActionsContext.esm.js";import{CampaignTechInsightsExplorerPage as Q}from"../CampaignPage/CampaignTechInsightsExplorerPage.esm.js";import{CampaignsPage as X}from"../CampaignsPage/CampaignsPage.esm.js";import{CampaignCreatePage as Y}from"../CampaignCreatePage/CampaignCreatePage.esm.js";import{EditCampaignView as Z}from"../CampaignsPage/EditCampaignView.esm.js";import{CheckCreatePage as _}from"../CheckCreatePage/CheckCreatePage.esm.js";import{CheckEditPage as $}from"../CheckPage/CheckEditPage.esm.js";import{CheckPage as C}from"../CheckPage/CheckPage.esm.js";import{ChecksTab as ee}from"../ChecksTab/ChecksTab.esm.js";import"../CheckTemplatesPage/CheckTemplatesPageBUI.esm.js";import{CheckTemplatesPage as te}from"../CheckTemplatesPage/CheckTemplatesPage.esm.js";import{CollectorPage as re}from"../CollectorPage/CollectorPage.esm.js";import{CollectorDetailsPage as ae}from"../CollectorPage/CollectorDetailsPage.esm.js";import"../CollectorPage/CollectorDetailsPageBUI.esm.js";import{CollectorsPage as ie}from"../CollectorsPage/CollectorsPage.esm.js";import{CreateNewTrackPage as ne}from"../CreateNewTrackPage/CreateNewTrackPage.esm.js";import{OverviewPageContent as oe}from"../OverviewPage/OverviewPageContent.esm.js";import{TechInsightsPage as ce}from"../TechInsights/TechInsightsPage.esm.js";import{TrackBuilderPage as me}from"../TrackBuilderPage/TrackBuilderPage.esm.js";import{TrackCreatePage as pe}from"../TrackCreatePage/TrackCreatePage.esm.js";import{TrackEditPage as se}from"../TrackEditPage/TrackEditPage.esm.js";import{TrackPage as le}from"../TrackPage/TrackPage.esm.js";import{TrackTechInsightsExplorerPage as he}from"../TrackPage/TrackTechInsightsExplorerPage.esm.js";import{TracksTab as de}from"../TracksTab/TracksTab.esm.js";import{RoutingPageWrapperBUI as ge}from"./RoutingPageWrapperBUI.esm.js";const ue=()=>{const r=c(V),a=c(q),n=c(z),m=c(G),i=c(J);return{buildOverview:r,buildTracks:a,buildCreate:n,buildNew:m,buildBuilder:i}},f=r=>{try{return r?.()??null}catch{return null}},v=()=>{const{trackId:r}=P(),a=D(),{buildOverview:n,buildTracks:m,buildCreate:i,buildNew:s,buildBuilder:u}=ue();if(!r)return null;const d=[f(i),f(s),f(u)].filter(Boolean).find(o=>a.pathname.endsWith(o));if(d)return e(h,{to:d,replace:!0});try{const o=n({trackId:r});return e(h,{to:o,replace:!0})}catch{const o=typeof m=="function"?m():"/tracks";return e(h,{to:o,replace:!0})}},ke=()=>{const{campaignId:r}=P(),a=c(L);if(!r)return null;const n=a({campaignId:r});return e(h,{to:n,replace:!0})},fe=()=>{const r=c(S)();return e(h,{to:r,replace:!0})},Pe=({title:r="Soundcheck",integrations:a,hideHeader:n,campaignActions:m=[]})=>{const i=O(E),s=i.getRegisteredFlags(),u=!s.find(l=>l.name==="soundcheck-enable-campaigns")||i.isActive("soundcheck-enable-campaigns"),{loading:d,allowed:o}=k({permission:N}),I=!d&&o,{loading:R,allowed:b}=k({permission:F}),T=!s.find(l=>l.name==="soundcheck-enable-check-creation")||i.isActive("soundcheck-enable-check-creation"),w=!R&&b&&T,{loading:x,allowed:A}=k({permission:H}),B=!s.find(l=>l.name==="soundcheck-enable-track-creation")||i.isActive("soundcheck-enable-track-creation");return e(M,{actions:m,children:e(ge,{title:r,hideHeader:n,children:p(U,{children:[u&&p(g,{children:[e(t,{path:"/campaigns",element:e(X,{})}),e(t,{path:"/campaigns/:campaignId/edit",element:e(Z,{})}),e(t,{path:"/campaigns/:campaignId",element:e(ke,{})}),e(t,{path:"/campaigns/:campaignId/overview",element:e(K,{})}),e(t,{path:"/campaigns/:campaignId/explorer",element:e(Q,{})}),I&&e(t,{path:"/campaigns/create",element:e(Y,{})})]}),p(t,{path:"/tracks",element:e(W,{}),children:[e(t,{index:!0,element:e(de,{})}),e(t,{path:"builder",element:e(me,{})}),!x&&A&&B&&p(g,{children:[e(t,{path:"create",element:e(pe,{})}),e(t,{path:"new",element:e(ne,{})})]}),e(t,{path:":trackId/edit",element:e(se,{})}),e(t,{path:":trackId",element:e(v,{})}),e(t,{path:":trackId/overview",element:e(le,{})}),e(t,{path:":trackId/explorer",element:e(he,{})}),e(t,{path:":trackId/checks/:checkId",element:e(C,{})})]}),e(t,{path:"/checks",element:e(ee,{})}),e(t,{path:"/checks/:checkId",element:e(C,{})}),e(t,{path:"/checks/:checkId/edit",element:e($,{})}),w&&p(g,{children:[e(t,{path:"/checks/create",element:e(_,{})}),e(t,{path:"/checks/templates",element:e(te,{})})]}),e(t,{path:"/integrations",element:e(ie,{integrations:a})}),e(t,{path:"/integrations/:integrationId",element:e(ae,{integrations:a})}),e(t,{path:"/integrations/:integrationId/edit",element:e(re,{})}),e(t,{path:"/tech-insights",element:p(g,{children:[e(j,{title:"Tech Insights"}),e(ce,{})]})}),e(t,{path:"/overview",element:e(y,{style:{margin:"var(--bui-space-6) var(--bui-space-6)"},children:e(oe,{})})}),e(t,{path:"/",element:e(fe,{})})]})})})};export{Pe as RoutingPageBUI,v as TrackOverviewRedirect};
2
2
  //# sourceMappingURL=RoutingPageBUI.esm.js.map
@@ -1,2 +1,2 @@
1
- import{jsx as r,jsxs as o}from"react/jsx-runtime";import{Box as t}from"@backstage/ui";import{SpotifyLicenseBanner as n}from"@spotify/backstage-plugin-core";import"../../contexts/TrackFormContext.esm.js";import"../../contexts/CheckFormContext.esm.js";import"../../contexts/CampaignFormContext.esm.js";import"react";import{UserProvider as c}from"../../contexts/UserProvider.esm.js";import d from"../../hooks/useConfirmationModal.esm.js";import{AlertProvider as l}from"../../hooks/useSoundcheckAlert.esm.js";import"../SoundcheckHeader/SoundcheckHeader.esm.js";import{SoundcheckHeaderProvider as m}from"../SoundcheckHeader/SoundcheckHeaderContext.esm.js";import{SoundcheckHeaderBUI as s}from"../SoundcheckHeader/SoundcheckHeaderBUI.esm.js";import{SoundcheckQueryClientProvider as p}from"../SoundcheckQueryClientProvider/SoundcheckQueryClientProvider.esm.js";const a=({title:e="Soundcheck",children:i})=>r(l,{children:r(c,{children:r(p,{children:r(m,{defaultTitle:e,children:o(d,{children:[r(n,{backend:"soundcheck",invalidLicenseMessage:"Submitted facts and check results will still be stored, but it will not be possible to view certifications or individual results until a valid license is present."}),r(s,{}),r(t,{children:i})]})})})})});export{a as RoutingPageWrapperBUI};
1
+ import{jsx as e,jsxs as t}from"react/jsx-runtime";import{Box as d}from"@backstage/ui";import{SpotifyLicenseBanner as n}from"@spotify/backstage-plugin-core";import"../../contexts/TrackFormContext.esm.js";import"../../contexts/CheckFormContext.esm.js";import"../../contexts/CampaignFormContext.esm.js";import"react";import{UserProvider as c}from"../../contexts/UserProvider.esm.js";import l from"../../hooks/useConfirmationModal.esm.js";import{AlertProvider as m}from"../../hooks/useSoundcheckAlert.esm.js";import"../SoundcheckHeader/SoundcheckHeader.esm.js";import{SoundcheckHeaderProvider as s}from"../SoundcheckHeader/SoundcheckHeaderContext.esm.js";import{SoundcheckHeaderBUI as p}from"../SoundcheckHeader/SoundcheckHeaderBUI.esm.js";import{SoundcheckQueryClientProvider as a}from"../SoundcheckQueryClientProvider/SoundcheckQueryClientProvider.esm.js";const h=({title:r="Soundcheck",hideHeader:i,children:o})=>e(m,{children:e(c,{children:e(a,{children:e(s,{defaultTitle:r,children:t(l,{children:[e(n,{backend:"soundcheck",invalidLicenseMessage:"Submitted facts and check results will still be stored, but it will not be possible to view certifications or individual results until a valid license is present."}),!i&&e(p,{}),e(d,{children:o})]})})})})});export{h as RoutingPageWrapperBUI};
2
2
  //# sourceMappingURL=RoutingPageWrapperBUI.esm.js.map
@@ -1,2 +1,2 @@
1
- import{jsx as i,jsxs as t,Fragment as B}from"react/jsx-runtime";import{Typography as e,Box as n,TextField as u,Button as b}from"@material-ui/core";import{capitalize as F}from"lodash";import{useState as d,useCallback 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{useSendCampaignNotification as R}from"../../hooks/campaigns/useSendCampaignNotification.esm.js";import"../../hooks/useConfirmationModal.esm.js";import{useCertificationStatus as W}from"../../hooks/aggregations/useCertificationStatus.esm.js";import"react-router-dom";import"react-use/lib/useLocalStorage";import"react-use/lib/useAsync";import"../ChecksTable/utils.esm.js";import"../../graphql/generated/index.esm.js";import"react-use/lib/useAsyncRetry";import"../FormControlledAutocomplete/FormControlledAutocomplete.esm.js";import"@material-ui/icons/CheckBox";import"@material-ui/icons/CheckBoxOutlineBlank";import"@material-ui/lab";import"react-hook-form";import"../ListboxVirtualized/ListboxVirtualized.esm.js";import{ControlledAutocomplete as I}from"../FormControlledAutocomplete/ControlledAutocomplete.esm.js";import{FormFieldLabel as s}from"../FormFieldLabel/FormFieldLabel.esm.js";import{LoadingIndicator as A}from"../LoadingIndicator/LoadingIndicator.esm.js";import{SoundcheckDialog as E}from"../SoundcheckDialog/SoundcheckDialog.esm.js";const $=["critical","high","normal","low"],j=({loading:m,notificationCount:o,reset:g,error:l,failingCount:p})=>t(n,{children:[m&&t(n,{textAlign:"center",children:[i(e,{variant:"body1",children:"Sending Notifications..."}),i(e,{variant:"caption",children:"Do not refresh or leave the page."}),i(n,{marginTop:2,marginBottom:1,children:i(A,{size:48})})]}),!m&&t(n,{children:[t(e,{variant:"body1",children:[t("strong",{children:[o," Notification",o===1?"":"s"," "]}),"sent to entity owners."]}),l&&i(e,{variant:"body2",color:"error",children:l.message}),p&&o<p&&t(e,{variant:"caption",children:["Notifications are grouped by owner, so this number might be less than the total failing entity count of"," ",i("strong",{children:p}),"."]}),i(n,{marginTop:2,children:i(b,{onClick:g,variant:"outlined",color:"primary",children:"Send Again"})})]})]}),z=({isOpen:m,campaign:o,handleClose:g})=>{const[l,p]=d(""),[f,x]=d(""),[h,S]=d("normal"),[a,w]=d(""),[N,y]=d(!1),{data:T}=W({trackId:o.track.id},m),{mutate:v,isLoading:C,notificationCount:k,error:L}=R(),D=O(()=>{v({campaignId:o.id,entityRefs:a?[a]:void 0,title:l,description:f,severity:h.toLowerCase()}),y(!0)},[o.id,f,a,v,h,l]),c=T?.certificationStatus?.statusByLevel[0]?.failed??0;return i(E,{handleClose:g,title:"Send a Campaign Reminder Notification",open:m,fullScreen:!1,maxWidth:"sm",children:N?i(j,{loading:C,notificationCount:k,reset:()=>y(!1),error:L,failingCount:c}):t(B,{children:[i(e,{variant:"body1",children:"Send a notification for all entities that are currently failing checks in this campaign. Notifications will be grouped by the owner of these entities."}),t(n,{marginTop:1,children:[i(n,{display:"flex",children:i(s,{title:"Severity"})}),i(I,{value:h,onChange:S,options:$,fullWidth:!1,getOptionLabel:r=>F(r)})]}),t(n,{marginTop:1,children:[i(s,{title:"Custom Notification Title (Optional)"}),i(u,{value:l,onChange:r=>p(r.target.value),placeholder:`Default: Entities Failing Campaign - ${o.name}`,type:"text",variant:"outlined",margin:"dense",fullWidth:!0})]}),t(n,{marginTop:1,children:[i(s,{title:"Custom Notification Description (Optional)"}),i(e,{variant:"caption",component:"div",children:"Templating for custom notification messages is currently not supported."}),i(u,{value:f,onChange:r=>x(r.target.value),placeholder:`Default: Entities owned by [ownerGroup] are failing checks required in Campaign - ${o.name}.`,type:"text",variant:"outlined",margin:"dense",multiline:!0,minRows:4,maxRows:8,fullWidth:!0})]}),t(n,{marginTop:1,children:[i(s,{title:"Entity Ref For Testing (Optional)"}),i(e,{variant:"caption",component:"div",children:"Select a specific entityRef to send a notification to - used for testing. Will bypass checking if the campaign is actually failing for this entity."}),i(u,{value:a,onChange:r=>w(r.target.value),placeholder:"example: component:default/test-component",type:"text",variant:"outlined",margin:"dense",fullWidth:!0})]}),t(n,{marginTop:2,display:"flex",alignItems:"center",children:[i(b,{disabled:!a&&c===0||C,variant:"outlined",color:"primary",onClick:D,children:"Send"}),a&&t(e,{style:{marginLeft:6},variant:"caption",children:["Notification will be sent to ",a,"."]}),!a&&!!c&&t(e,{style:{marginLeft:6},variant:"caption",children:["Notifications will be sent for the",i("strong",{children:` ~${c} `}),c===1?"entity":"entities"," failing this campaign"]}),!a&&c===0&&i(e,{color:"error",style:{marginLeft:6},variant:"caption",children:"No entities failing campaign."})]})]})})};export{z as SendCampaignNotificationDialogBUI};
1
+ import{jsx as i,jsxs as e,Fragment as Z}from"react/jsx-runtime";import{Text as n,Box as l,Flex as h}from"@backstage/ui";import{Chip as E,TextField as v,Button as L}from"@material-ui/core";import{makeStyles as J}from"@material-ui/core/styles";import{capitalize as K}from"lodash";import{useState as u,useRef as T,useCallback as $}from"react";import"@backstage/catalog-model";import"@backstage/core-plugin-api";import"@tanstack/react-query";import"../../api.esm.js";import"../../hooks/graphqlKeys.esm.js";import"@backstage/plugin-catalog-react";import"@spotify/backstage-plugin-soundcheck-common";import"../../hooks/useSoundcheckAlert.esm.js";import{useSendCampaignNotification as Q}from"../../hooks/campaigns/useSendCampaignNotification.esm.js";import"../../hooks/useConfirmationModal.esm.js";import{useCertificationStatus as V}from"../../hooks/aggregations/useCertificationStatus.esm.js";import"react-router-dom";import"react-use/lib/useLocalStorage";import"react-use/lib/useAsync";import"../ChecksTable/utils.esm.js";import"../../graphql/generated/index.esm.js";import"react-use/lib/useAsyncRetry";import"../FormControlledAutocomplete/FormControlledAutocomplete.esm.js";import"@material-ui/icons/CheckBox";import"@material-ui/icons/CheckBoxOutlineBlank";import"@material-ui/lab";import"react-hook-form";import"../ListboxVirtualized/ListboxVirtualized.esm.js";import{ControlledAutocomplete as X}from"../FormControlledAutocomplete/ControlledAutocomplete.esm.js";import{FormFieldLabel as f}from"../FormFieldLabel/FormFieldLabel.esm.js";import{LoadingIndicator as Y}from"../LoadingIndicator/LoadingIndicator.esm.js";import{SoundcheckDialog as _}from"../SoundcheckDialog/SoundcheckDialog.esm.js";const ii=["critical","high","normal","low"],ti=J({wrap:{flexWrap:"wrap"}}),z=[{label:"Campaign Name",value:"{{ campaign.name }}"},{label:"Owner",value:"{{ ownerEntityRef }}"},{label:"Campaign ID",value:"{{ campaign.id }}"},{label:"Start Date",value:"{{ campaign.startDate }}"},{label:"Target Date",value:"{{ campaign.targetCompletionDate }}"},{label:"Support Channel",value:"{{ campaign.supportChannel }}"}],ei=({loading:m,notificationCount:a,reset:y,error:s,failingCount:r})=>e(l,{children:[m&&e(l,{style:{textAlign:"center"},children:[i(n,{variant:"body-medium",children:"Sending Notifications..."}),i(n,{variant:"body-small",color:"secondary",children:"Do not refresh or leave the page."}),i(l,{mt:"2",mb:"1",children:i(Y,{size:48})})]}),!m&&e(l,{children:[e(n,{variant:"body-medium",children:[e("strong",{children:[a," Notification",a===1?"":"s"," "]}),"sent to entity owners."]}),s&&i(n,{variant:"body-small",color:"warning",children:s.message}),!!r&&a<r&&e(n,{variant:"body-small",color:"secondary",children:["Notifications are grouped by owner, so this number might be less than the total failing entity count of"," ",i("strong",{children:r}),"."]}),i(l,{mt:"3",children:i(L,{variant:"outlined",color:"primary",onClick:y,children:"Send Again"})})]})]}),ni=({isOpen:m,campaign:a,handleClose:y})=>{const s=ti(),[r,C]=u(""),[g,w]=u(""),[b,B]=u("normal"),[o,I]=u(""),[A,S]=u(!1),k=T(null),x=T(null),N=$((t,H,d,F)=>{const p=H.current;if(p){const W=p.selectionStart??d.length,M=p.selectionEnd??d.length,P=d.substring(0,W)+t+d.substring(M);F(P),requestAnimationFrame(()=>{p.focus();const O=W+t.length;p.setSelectionRange(O,O)})}else F(d+t)},[]),{data:q}=V({trackId:a.track.id},m),{mutate:D,isLoading:R,notificationCount:j,error:G}=Q(),U=$(()=>{D({campaignId:a.id,entityRefs:o?[o]:void 0,title:r,description:g,severity:b.toLowerCase()}),S(!0)},[a.id,g,o,D,b,r]),c=q?.certificationStatus?.statusByLevel[0]?.failed??0;return i(_,{handleClose:y,title:"Send a Campaign Reminder Notification",open:m,fullScreen:!1,maxWidth:"sm",children:A?i(ei,{loading:R,notificationCount:j,reset:()=>S(!1),error:G,failingCount:c}):e(Z,{children:[i(n,{variant:"body-medium",children:"Send a notification for all entities that are currently failing checks in this campaign. Notifications will be grouped by the owner of these entities."}),e(l,{mt:"3",children:[i(h,{children:i(f,{title:"Severity"})}),i(X,{value:b,onChange:B,options:ii,fullWidth:!1,getOptionLabel:t=>K(t)})]}),e(l,{mt:"3",children:[i(f,{title:"Custom Notification Title (Optional)"}),i(h,{gap:"1",mb:"1.5",className:s.wrap,children:z.map(t=>i(E,{label:t.label,size:"small",variant:"outlined",clickable:!0,style:{margin:0},onClick:()=>N(t.value,k,r,C)},`title-${t.value}`))}),i(v,{value:r,onChange:t=>C(t.target.value),inputRef:k,placeholder:`Default: Entities Failing Campaign - ${a.name}`,type:"text",variant:"outlined",fullWidth:!0})]}),e(l,{mt:"3",children:[i(f,{title:"Custom Notification Description (Optional)"}),i(h,{gap:"1",mb:"1.5",className:s.wrap,children:z.map(t=>i(E,{label:t.label,size:"small",variant:"outlined",clickable:!0,style:{margin:0},onClick:()=>N(t.value,x,g,w)},`desc-${t.value}`))}),i(v,{value:g,onChange:t=>w(t.target.value),inputRef:x,placeholder:`Default: Entities owned by [ownerGroup] are failing checks required in Campaign - ${a.name}.`,type:"text",variant:"outlined",multiline:!0,minRows:4,maxRows:8,fullWidth:!0})]}),e(l,{mt:"3",children:[i(f,{title:"Entity Ref For Testing (Optional)"}),i(n,{variant:"body-small",color:"secondary",children:"Select a specific entityRef to send a notification to - used for testing. Will bypass checking if the campaign is actually failing for this entity."}),i(v,{value:o,onChange:t=>I(t.target.value),placeholder:"example: component:default/test-component",type:"text",variant:"outlined",fullWidth:!0})]}),e(h,{align:"center",gap:"2",mt:"3",children:[i(L,{disabled:!o&&c===0||R,variant:"outlined",color:"primary",onClick:U,children:"Send"}),o&&e(n,{variant:"body-small",color:"secondary",children:["Notification will be sent to ",o,"."]}),!o&&!!c&&e(n,{variant:"body-small",color:"secondary",children:["Notifications will be sent for the",i("strong",{children:` ~${c} `}),c===1?"entity":"entities"," failing this campaign"]}),!o&&c===0&&i(n,{variant:"body-small",color:"warning",children:"No entities failing campaign."})]})]})})};export{ni as SendCampaignNotificationDialogBUI};
2
2
  //# sourceMappingURL=SendCampaignNotificationDialogBUI.esm.js.map
@@ -1,2 +1,2 @@
1
- import{jsx as a,jsxs as n}from"react/jsx-runtime";import{Box as e,Flex as l}from"@backstage/ui";import{makeStyles as v}from"@material-ui/core";const g=v(()=>({container:{gap:"var(--bui-space-1)",width:"100%"},passedBar:{height:"var(--bui-space-1_5)",background:"var(--bui-fg-success)",border:"var(--bui-space-0_5) solid var(--bui-fg-success)",borderRadius:"var(--bui-space-1)"},failedBar:{height:"var(--bui-space-1_5)",background:"var(--bui-fg-danger)",border:"var(--bui-space-0_5) solid var(--bui-fg-danger)",borderRadius:"var(--bui-space-1)"},warningBar:{height:"var(--bui-space-1_5)",background:"var(--bui-fg-warning)",border:"var(--bui-space-0_5) solid var(--bui-fg-warning)",borderRadius:"var(--bui-space-1)"},noneBar:{height:"var(--bui-space-1_5)",background:"var(--bui-fg-disabled)",border:"var(--bui-space-0_5) solid var(--bui-fg-disabled)",borderRadius:"var(--bui-space-1)"},notReportedBar:{height:"var(--bui-space-1_5)",background:"var(--bui-fg-disabled)",border:"var(--bui-space-0_5) solid var(--bui-fg-disabled)",borderRadius:"var(--bui-space-1)"},errorBar:{height:"var(--bui-space-1_5)",background:"rgb(246, 104, 94)",border:"var(--bui-space-0_5) solid rgb(246, 104, 94)",borderRadius:"var(--bui-space-1)"}})),p=({passedPercent:s,failedPercent:d,warningPercent:o,errorPercent:b,notReportedPercent:c})=>{const r=g(),u=[s,d,o,b,c].filter(t=>!!t),i=u.length===1;return u.every(t=>t===0)?a(e,{width:"100%",className:r.noneBar}):n(l,{className:r.container,children:[!!s&&a(e,{className:r.passedBar,style:{flexGrow:s,width:i?"100%":void 0}}),!!d&&a(e,{className:r.failedBar,style:{flexGrow:d,width:i?"100%":void 0}}),!!o&&a(e,{className:r.warningBar,style:{flexGrow:o,width:i?"100%":void 0}}),!!c&&a(e,{className:r.notReportedBar,style:{flexGrow:c,width:i?"100%":void 0}}),!!b&&a(e,{className:r.errorBar,style:{flexGrow:b,width:i?"100%":void 0}})]})};export{p as StatusBar};
1
+ import{jsx as a,jsxs as u}from"react/jsx-runtime";import{Flex as v}from"@backstage/ui";import{makeStyles as n}from"@material-ui/core";const l=n(()=>({container:{gap:"var(--bui-space-1)",width:"100%"},passedBar:{height:"var(--bui-space-1_5)",background:"var(--bui-fg-success)",border:"var(--bui-space-0_5) solid var(--bui-fg-success)",borderRadius:"var(--bui-space-1)"},failedBar:{height:"var(--bui-space-1_5)",background:"var(--bui-fg-danger)",border:"var(--bui-space-0_5) solid var(--bui-fg-danger)",borderRadius:"var(--bui-space-1)"},warningBar:{height:"var(--bui-space-1_5)",background:"var(--bui-fg-warning)",border:"var(--bui-space-0_5) solid var(--bui-fg-warning)",borderRadius:"var(--bui-space-1)"},noneBar:{height:"var(--bui-space-1_5)",background:"var(--bui-fg-disabled)",border:"var(--bui-space-0_5) solid var(--bui-fg-disabled)",borderRadius:"var(--bui-space-1)"},notReportedBar:{height:"var(--bui-space-1_5)",background:"var(--bui-fg-disabled)",border:"var(--bui-space-0_5) solid var(--bui-fg-disabled)",borderRadius:"var(--bui-space-1)"},errorBar:{height:"var(--bui-space-1_5)",background:"rgb(246, 104, 94)",border:"var(--bui-space-0_5) solid rgb(246, 104, 94)",borderRadius:"var(--bui-space-1)"}})),g=({passedPercent:i,failedPercent:s,warningPercent:d,errorPercent:o,notReportedPercent:b})=>{const r=l(),t=[i,s,d,o,b].filter(c=>!!c),e=t.length===1;return t.every(c=>c===0)?a("div",{style:{width:"100%"},className:r.noneBar}):u(v,{className:r.container,children:[!!i&&a("div",{className:r.passedBar,style:{flexGrow:i,width:e?"100%":void 0}}),!!s&&a("div",{className:r.failedBar,style:{flexGrow:s,width:e?"100%":void 0}}),!!d&&a("div",{className:r.warningBar,style:{flexGrow:d,width:e?"100%":void 0}}),!!b&&a("div",{className:r.notReportedBar,style:{flexGrow:b,width:e?"100%":void 0}}),!!o&&a("div",{className:r.errorBar,style:{flexGrow:o,width:e?"100%":void 0}})]})};export{g as StatusBar};
2
2
  //# sourceMappingURL=StatusBar.esm.js.map
@@ -1,2 +1,2 @@
1
- import{jsx as t,jsxs as g}from"react/jsx-runtime";import{Box as p}from"@backstage/ui";import{makeStyles as f}from"@material-ui/core";const m=f(()=>({stepperHeader:{display:"flex",alignItems:"center",justifyContent:"center",margin:"0 auto"},stepperStep:{display:"flex",alignItems:"center",flex:1},stepperStepGrow:{flex:1},stepperStepFixed:{flex:0,whiteSpace:"nowrap"},stepperCircle:{width:32,height:32,borderRadius:"var(--bui-radius-full)",border:"2px solid var(--bui-fg-secondary)",background:"transparent",display:"flex",justifyContent:"center",alignItems:"center",fontSize:"0.9rem",fontWeight:500,color:"var(--bui-fg-secondary)",zIndex:2},stepperCircleActive:{borderColor:"var(--bui-border-success)",background:"var(--bui-bg-success)",color:"var(--bui-fg-success)",fontWeight:"bold"},stepperCircleCompleted:{borderColor:"var(--bui-border-success)",background:"var(--bui-bg-success)",color:"var(--bui-fg-success)",fontWeight:600},stepperLabel:{marginLeft:"var(--bui-space-2)",fontSize:14,whiteSpace:"nowrap",color:"var(--bui-fg-secondary)",fontWeight:500},stepperLabelHighlighted:{color:"var(--bui-fg-success)"},stepperLine:{flexGrow:1,height:2,background:"var(--bui-fg-secondary)",margin:"0 var(--bui-space-2)",zIndex:1},stepperLineCompleted:{background:"var(--bui-border-success)"},stepperLabelButton:{background:"transparent",border:0,padding:0,textAlign:"left"},stepperLabelClickable:{cursor:"pointer"},stepperLabelDisabled:{cursor:"default"}})),h=3,C="50%",v="100%",x=({stepTitles:i,currentStep:a,onStepClick:d})=>{const e=m(),b=i.length<h?C:v;return t(p,{className:e.stepperHeader,style:{width:b},children:i.map((l,r)=>{const n=r===a,s=r<a,c=r===i.length-1,o=r<a,u=n||s?`${e.stepperLabel} ${e.stepperLabelHighlighted}`:e.stepperLabel;return g(p,{className:[e.stepperStep,c?e.stepperStepFixed:e.stepperStepGrow].join(" "),children:[t(p,{className:[e.stepperCircle,n?e.stepperCircleActive:"",s?e.stepperCircleCompleted:""].filter(Boolean).join(" "),children:s?t("span",{"aria-label":"Completed",role:"img",children:"\u2713"}):r+1}),t("button",{type:"button",onClick:()=>o&&d(r),disabled:!o,className:[u,e.stepperLabelButton,o?e.stepperLabelClickable:e.stepperLabelDisabled].join(" "),children:l}),!c&&t(p,{className:[e.stepperLine,s&&e.stepperLineCompleted].filter(Boolean).join(" ")})]},l)})})};export{x as Stepper};
1
+ import{jsx as t,jsxs as g}from"react/jsx-runtime";import{Box as l}from"@backstage/ui";import{makeStyles as f}from"@material-ui/core";const m=f(()=>({stepperHeader:{display:"flex",alignItems:"center",justifyContent:"center",margin:"0 auto"},stepperStep:{display:"flex",alignItems:"center",flex:1},stepperStepGrow:{flex:1},stepperStepFixed:{flex:0,whiteSpace:"nowrap"},stepperCircle:{width:32,height:32,borderRadius:"var(--bui-radius-full)",border:"2px solid var(--bui-fg-secondary)",background:"transparent",display:"flex",justifyContent:"center",alignItems:"center",fontSize:"0.9rem",fontWeight:500,color:"var(--bui-fg-secondary)",zIndex:2},stepperCircleActive:{borderColor:"var(--bui-border-success)",background:"var(--bui-bg-success)",color:"var(--bui-fg-success)",fontWeight:"bold"},stepperCircleCompleted:{borderColor:"var(--bui-border-success)",background:"var(--bui-bg-success)",color:"var(--bui-fg-success)",fontWeight:600},stepperLabel:{marginLeft:"var(--bui-space-2)",fontSize:14,whiteSpace:"nowrap",color:"var(--bui-fg-secondary)",fontWeight:500},stepperLabelHighlighted:{color:"var(--bui-fg-success)"},stepperLine:{flexGrow:1,height:2,background:"var(--bui-fg-secondary)",margin:"0 var(--bui-space-2)",zIndex:1},stepperLineCompleted:{background:"var(--bui-border-success)"},stepperLabelButton:{background:"transparent",border:0,padding:0,textAlign:"left"},stepperLabelClickable:{cursor:"pointer"},stepperLabelDisabled:{cursor:"default"}})),h=3,C="50%",v="100%",x=({stepTitles:p,currentStep:i,onStepClick:d})=>{const e=m(),b=p.length<h?C:v;return t(l,{className:e.stepperHeader,style:{width:b},children:p.map((o,r)=>{const n=r===i,s=r<i,c=r===p.length-1,a=r<i,u=n||s?`${e.stepperLabel} ${e.stepperLabelHighlighted}`:e.stepperLabel;return g(l,{className:[e.stepperStep,c?e.stepperStepFixed:e.stepperStepGrow].join(" "),children:[t(l,{className:[e.stepperCircle,n?e.stepperCircleActive:"",s?e.stepperCircleCompleted:""].filter(Boolean).join(" "),children:s?t("span",{"aria-label":"Completed",role:"img",children:"\u2713"}):r+1}),t("button",{type:"button",onClick:()=>a&&d(r),disabled:!a,className:[u,e.stepperLabelButton,a?e.stepperLabelClickable:e.stepperLabelDisabled].join(" "),children:o}),!c&&t("div",{className:[e.stepperLine,s&&e.stepperLineCompleted].filter(Boolean).join(" ")})]},o)})})};export{x as Stepper};
2
2
  //# sourceMappingURL=Stepper.esm.js.map
@@ -1,2 +1,2 @@
1
- import{jsxs as u,jsx as i}from"react/jsx-runtime";import{useApi as h}from"@backstage/core-plugin-api";import{entityPresentationApiRef as g}from"@backstage/plugin-catalog-react";import{Row as R,CellText as k,CellProfile as y}from"@backstage/ui";import{useNavigate as A}from"react-router-dom";import{CustomCell as w}from"../CustomCell/CustomCell.esm.js";import{DescriptionCell as x}from"../DescriptionCell/DescriptionCell.esm.js";import{SimpleMenu as P}from"../Menus/SimpleMenu.esm.js";import"@backstage/plugin-permission-react";import"@remixicon/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"../../hooks/useSoundcheckAlert.esm.js";import"../../hooks/useConfirmationModal.esm.js";import"react-use/lib/useLocalStorage";import"react-use/lib/useAsync";import"../ChecksTable/utils.esm.js";import"../../graphql/generated/index.esm.js";import"react-use/lib/useAsyncRetry";import"../../routes.esm.js";import"js-yaml";import"lodash";import"../../contexts/TrackFormContext.esm.js";import"../../contexts/CheckFormContext.esm.js";import"../../contexts/CampaignFormContext.esm.js";import"../../contexts/UserProvider.esm.js";import"uuid";import"../CampaignPage/CampaignActionsContext.esm.js";import"../CampaignsPage/CampaignListPage/useArchiveConfirmationModal.esm.js";const T=({ownerEntityRef:r,href:t,profileImageSrc:l,cells:c,menuActions:m,name:p,description:s,documentationURL:a})=>{const f=h(g),e=r?f.forEntity(r):void 0,n=A();return u(R,{onAction:()=>t&&n(t),children:[i(x,{title:p,description:s,onClick:()=>t&&n(t)}),c.map((o,d)=>i(k,{title:o.title,leadingIcon:o.icon,onClick:C=>{o.onClick&&(C.stopPropagation(),o.onClick())}},`cell-${d}`)),i(y,{name:e?.snapshot.primaryTitle,src:l??e?.snapshot.primaryTitle}),i(w,{onClick:o=>o.stopPropagation(),children:i(P,{label:`${p} actions`,disabled:!m?.length,placement:"left top",menuActions:m??[],documentationURL:a,isHeaderMenu:!1})})]})};export{T as TableRowWithOwner};
1
+ import{jsxs as C,jsx as i}from"react/jsx-runtime";import{Row as h,CellText as g,CellProfile as k}from"@backstage/ui";import{useNavigate as R}from"react-router-dom";import{useEntityPrimaryTitle as w}from"../../hooks/catalog/useEntityPrimaryTitle.esm.js";import{CustomCell as x}from"../CustomCell/CustomCell.esm.js";import{DescriptionCell as P}from"../DescriptionCell/DescriptionCell.esm.js";import{SimpleMenu as S}from"../Menus/SimpleMenu.esm.js";import"@backstage/core-plugin-api";import"@backstage/plugin-permission-react";import"@remixicon/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"react-use/lib/useAsync";import"../ChecksTable/utils.esm.js";import"../../graphql/generated/index.esm.js";import"react-use/lib/useAsyncRetry";import"../../routes.esm.js";import"js-yaml";import"lodash";import"../../contexts/TrackFormContext.esm.js";import"../../contexts/CheckFormContext.esm.js";import"../../contexts/CampaignFormContext.esm.js";import"../../contexts/UserProvider.esm.js";import"uuid";import"../CampaignPage/CampaignActionsContext.esm.js";import"../CampaignsPage/useArchiveConfirmationModal.esm.js";const b=({ownerEntityRef:n,href:t,profileImageSrc:l,cells:c,menuActions:r,name:m,description:a,documentationURL:s,hasShift:f=!1})=>{const e=w(n),p=R();return C(h,{onAction:()=>t&&p(t),children:[i(P,{title:m,description:a,onClick:()=>t&&p(t),hasShift:f}),c.map((o,d)=>i(g,{title:o.title,leadingIcon:o.icon,onClick:u=>{o.onClick&&(u.stopPropagation(),o.onClick())}},`cell-${d}`)),i(k,{name:e,src:l??e}),i(x,{onClick:o=>o.stopPropagation(),children:i(S,{label:`${m} actions`,disabled:!r?.length,placement:"left top",menuActions:r??[],documentationURL:s,isHeaderMenu:!1})})]})};export{b as TableRowWithOwner};
2
2
  //# sourceMappingURL=TableRowWithOwner.esm.js.map
@@ -1,2 +1,2 @@
1
- import{jsx as a,jsxs as g,Fragment as Te}from"react/jsx-runtime";import{useRouteRef as R,useApi as ye}from"@backstage/core-plugin-api";import{entityPresentationApiRef as Ce}from"@backstage/plugin-catalog-react";import{Box as S,HeaderPage as Re,Flex as N,SearchField as Se,Container as Ee,Text as we,Button as Z}from"@backstage/ui";import{makeStyles as Le,LinearProgress as ve}from"@material-ui/core";import{RiAddLine as _}from"@remixicon/react";import{isEmpty as be}from"lodash";import{useState as ee,useMemo as i,useCallback as Be,useEffect as Ie}from"react";import{useSearchParams as Pe,useNavigate as Ae}from"react-router-dom";import xe from"react-use/lib/useDebounce";import"@backstage/catalog-model";import"@tanstack/react-query";import"../../api.esm.js";import"../../hooks/graphqlKeys.esm.js";import"@spotify/backstage-plugin-soundcheck-common";import"../../hooks/useSoundcheckAlert.esm.js";import"../../hooks/useConfirmationModal.esm.js";import{useSortTableLocalStorage as Me}from"../../hooks/useSortTableLocalStorage.esm.js";import"react-use/lib/useAsync";import"../ChecksTable/utils.esm.js";import"../../graphql/generated/index.esm.js";import"react-use/lib/useAsyncRetry";import{useBatchedHierarchicalTrackStatuses as Ue}from"../../hooks/heirarchy/useBatchedHierarchicalTrackStatuses.esm.js";import{useGroupHierarchy as $e}from"../../hooks/heirarchy/useGroupHierarchy.esm.js";import{useTracksApplicableToGroup as Ne}from"../../hooks/tracks/useTracksApplicableToGroup.esm.js";import{useLCPReporting as je}from"../../hooks/useLCPReporting.esm.js";import{useLoadTimeReporting as De}from"../../hooks/useLoadTimeReporting.esm.js";import{newTrackRouteRef as Fe,campaignCreateRouteRef as Ge,trackExplorerRouteRef as He,campaignExplorerRouteRef as Oe}from"../../routes.esm.js";import{getAllOwnedEntityCount as ze}from"../../utils/getAllOwnedEntityCount.esm.js";import{getEntitiesBucket as Ve,getTracksBucket as We}from"../../utils/helpers.esm.js";import{showTrack as Xe}from"../../utils/tracks.esm.js";import"../EmptyState/EmptyState.esm.js";import{EmptyStateBUI as qe}from"../EmptyState/EmptyStateBUI.esm.js";import"@backstage/plugin-permission-react";import{TechInsightsGroupSelector as Je}from"../TechInsightsGroupSelector/TechInsightsGroupSelector.esm.js";import{SummaryTilesBUI as Ke}from"./SummaryTilesBUI.esm.js";import{TechInsightsTableBUI as Qe}from"./TechInsightsTableBUI.esm.js";const Ye=Le(()=>({container:{marginBottom:"var(--bui-space-12)"}})),Ze=()=>{const te=Ye(),[E,re]=Pe(),r=E.get("group")||"",[l,ae]=ee(E.get("search")||""),[h,oe]=ee(""),j=i(()=>({routeName:"soundcheck-tech-insights",additionalAttributes:{group:r||"",tracksSearch:h||""}}),[r,h]),{reportContentLoaded:D}=De({...j,enabled:!!r}),{reporter:ie}=je(j),f=Ae(),ne=R(Fe),se=R(Ge),w=ye(Ce),{order:ce,orderBy:me,handleSort:le}=Me({localStoragePrefix:"soundcheck-tech-insights",defaultSortBy:"entities",defaultDirection:"desc"});xe(()=>{oe(l);const e=new URLSearchParams(E.toString());l?e.set("search",l):e.delete("search"),re(e,{replace:!0})},500,[l]);const{tracks:L,campaigns:F,counts:v,isLoading:k,error:b,activeTrackCount:B}=Ne(r,{},{enabled:!!r}),p=L.filter(e=>e.type==="campaign"),I=L.filter(e=>e.type!=="campaign"),G=p.filter(e=>{const t=h.toLowerCase(),s=(e.ownerEntityRef?w.forEntity(e.ownerEntityRef):void 0)?.snapshot.primaryTitle?.toLowerCase()||"";return t===""||e.name.toLowerCase().includes(t)||e.ownerEntityRef?.toLowerCase().includes(t)||s.includes(t)}),H=I.filter(e=>{const t=h.toLowerCase(),s=(e.ownerEntityRef?w.forEntity(e.ownerEntityRef):void 0)?.snapshot.primaryTitle?.toLowerCase()||"";return t===""||e.name.toLowerCase().includes(t)||e.ownerEntityRef?.toLowerCase().includes(t)||s.includes(t)}),T=i(()=>[...G,...H],[G,H]),m=i(()=>[...p.map(e=>e.id),...I.map(e=>e.id)],[p,I]),{data:P,isLoading:pe,error:de,progress:o}=Ue({trackIds:m,groupRef:r||"",skip:!r||m.length===0}),{data:O,isLoading:y}=$e(r,{includeParent:!0}),A=i(()=>{const e=new Map;return Array.isArray(P)&&P.forEach(t=>{t&&t.trackId&&e.set(t.trackId,t)}),e},[P]),ue=i(()=>{const e=new Map;return Array.isArray(v)&&v.forEach(t=>{t&&t.id&&e.set(t.id,t.applicableEntityCount)}),e},[v]),z=k&&!b&&!!r,V=b||de,x=m.length>0&&pe&&!V&&!!r,W=i(()=>({totalActiveTracksCampaigns:B}),[B]),X=i(()=>{if(x)return{numTeams:void 0,avgCompliance:void 0,totalCampaigns:void 0,totalTracks:void 0};let e=0,t=0,s=0,u=0;const n=new Set;return T.forEach(C=>{const c=A.get(C.id);if(c){c.status&&typeof c.status.allPassPercentage=="number"&&(e+=c.status.allPassPercentage,t++),c.groupRef&&n.add(c.groupRef);const U=[c];for(;U.length>0;){const ke=U.pop();for(const $ of ke.children)n.has($.groupRef)||(n.add($.groupRef),U.push($))}}Xe(c?.status)&&(C.type==="campaign"?s++:u++)}),{numTeams:n.size,avgCompliance:t>0?Math.round(e/t):0,totalCampaigns:s,totalTracks:u}},[T,A,x]),d=i(()=>{if(y)return{numEntities:void 0};const e=O?.[r];return{numEntities:ze(e)}},[O,y,r]),ge=i(()=>({...W,...X,...d}),[W,X,d]),q=R(He),J=R(Oe),he=Be(e=>{if(!r)return;const t=new URLSearchParams;t.set("group",r),t.set("node",r);const s=p.find(({id:n})=>n===e);let u=q({trackId:e});if(s){const n=F?.edges.find(({node:C})=>C.track.id===e)?.node.id;n&&(u=J({campaignId:n}))}f(`${u}?${t.toString()}`)},[r,f,p,F,J,q]),K=r?w.forEntity(r).snapshot.primaryTitle:void 0,M=i(()=>!o||o.totalTracks===0?0:o.loadedTracks/o.totalTracks*100,[o]),Q=k&&r&&!b||x&&o&&o.totalTracks>0,Y=ie?.getLCPValue();Ie(()=>{if(!y&&!k&&(M===100||m.length===0)){const e=d.numEntities??0,t=m.length;D({lcp:Y,numberOfEntities:d.numEntities,entitiesBucket:Ve(e),numberOfTracks:m.length,tracksBucket:We(t)})}},[y,k,M,m.length,d.numEntities,D,Y]);const fe=a(Ke,{summaryStats:ge,isLoading:z});return V?a(S,{mt:"6",children:a(qe,{title:"No Tech Insights Data",body:"There was an error loading Tech Insights data."})}):g(Te,{children:[a(Re,{title:`${K?`${K}'s `:""}Tech Insights`,customActions:g(N,{align:"center",gap:"3",children:[a(Je,{hideSelected:!0}),a(Se,{isDisabled:be(L),value:l,onChange:ae,placeholder:"Search tracks or campaigns",style:{minWidth:250},"aria-label":"Search"})]})}),g(Ee,{className:te.container,children:[a(S,{style:{marginTop:0},children:fe}),Q&&a(S,{style:{marginBottom:16},children:a(ve,{variant:o&&o.totalTracks>0?"determinate":"indeterminate",value:o&&o.totalTracks>0?M:void 0,"data-testid":"batch-loading-indicator"})}),g(N,{align:"center",justify:"between",mb:"6",mt:"6",children:[a(S,{children:a(we,{variant:"title-x-small",weight:"bold",children:"Tracks & Campaigns"})}),T.length>0&&g(N,{align:"center",gap:"1",children:[a(Z,{iconStart:a(_,{}),onClick:()=>f(ne()),children:"Create Track"}),a(Z,{iconStart:a(_,{}),onClick:()=>f(se()),children:"Create Campaign"})]})]}),a(Qe,{tracks:T,trackStatusMap:A,trackCountsMap:ue,sortColumn:me,order:ce,handleSort:le,handleTrackClick:he,isLoading:z||!!Q,isSearch:!!l,activeTrackCount:B,hasGroupSelected:!!r})]})]})};export{Ze as TechInsightsPageBUI};
1
+ import{jsx as a,jsxs as g,Fragment as Te}from"react/jsx-runtime";import{useRouteRef as R,useApi as ye}from"@backstage/core-plugin-api";import{entityPresentationApiRef as Ce}from"@backstage/plugin-catalog-react";import{Box as S,HeaderPage as Re,Flex as G,SearchField as Se,Container as Ee,Text as we,Button as Z}from"@backstage/ui";import{makeStyles as Le,LinearProgress as ve}from"@material-ui/core";import{RiAddLine as _}from"@remixicon/react";import{isEmpty as be}from"lodash";import{useState as ee,useMemo as i,useCallback as Pe,useEffect as Be}from"react";import{useSearchParams as Ie,useNavigate as Ae}from"react-router-dom";import xe from"react-use/lib/useDebounce";import"@backstage/catalog-model";import"@tanstack/react-query";import"../../api.esm.js";import"../../hooks/graphqlKeys.esm.js";import"@spotify/backstage-plugin-soundcheck-common";import"../../hooks/useSoundcheckAlert.esm.js";import"../../hooks/useConfirmationModal.esm.js";import{useSortTableLocalStorage as Me}from"../../hooks/useSortTableLocalStorage.esm.js";import"react-use/lib/useAsync";import"../ChecksTable/utils.esm.js";import"../../graphql/generated/index.esm.js";import"react-use/lib/useAsyncRetry";import{useEntityPrimaryTitle as Ue}from"../../hooks/catalog/useEntityPrimaryTitle.esm.js";import{useBatchedHierarchicalTrackStatuses as Ge}from"../../hooks/heirarchy/useBatchedHierarchicalTrackStatuses.esm.js";import{useGroupHierarchy as Ne}from"../../hooks/heirarchy/useGroupHierarchy.esm.js";import{useTracksApplicableToGroup as $e}from"../../hooks/tracks/useTracksApplicableToGroup.esm.js";import{useLCPReporting as je}from"../../hooks/useLCPReporting.esm.js";import{useLoadTimeReporting as Fe}from"../../hooks/useLoadTimeReporting.esm.js";import{newTrackRouteRef as He,campaignCreateRouteRef as Oe,trackExplorerRouteRef as De,campaignExplorerRouteRef as ze}from"../../routes.esm.js";import{getAllOwnedEntityCount as Ve}from"../../utils/getAllOwnedEntityCount.esm.js";import{getEntitiesBucket as We,getTracksBucket as Ye}from"../../utils/helpers.esm.js";import{showTrack as qe}from"../../utils/tracks.esm.js";import"../EmptyState/EmptyState.esm.js";import{EmptyStateBUI as Je}from"../EmptyState/EmptyStateBUI.esm.js";import"@backstage/plugin-permission-react";import{TechInsightsGroupSelector as Ke}from"../TechInsightsGroupSelector/TechInsightsGroupSelector.esm.js";import{SummaryTilesBUI as Qe}from"./SummaryTilesBUI.esm.js";import{TechInsightsTableBUI as Xe}from"./TechInsightsTableBUI.esm.js";const Ze=Le(()=>({container:{marginBottom:"var(--bui-space-12)"}})),_e=()=>{const te=Ze(),[E,re]=Ie(),r=E.get("group")||"",[l,ae]=ee(E.get("search")||""),[h,oe]=ee(""),N=i(()=>({routeName:"soundcheck-tech-insights",additionalAttributes:{group:r||"",tracksSearch:h||""}}),[r,h]),{reportContentLoaded:$}=Fe({...N,enabled:!!r}),{reporter:ie}=je(N),f=Ae(),ne=R(He),se=R(Oe),j=ye(Ce),{order:ce,orderBy:me,handleSort:le}=Me({localStoragePrefix:"soundcheck-tech-insights",defaultSortBy:"entities",defaultDirection:"desc"});xe(()=>{oe(l);const e=new URLSearchParams(E.toString());l?e.set("search",l):e.delete("search"),re(e,{replace:!0})},500,[l]);const{tracks:w,campaigns:F,counts:L,isLoading:k,error:v,activeTrackCount:b}=$e(r,{},{enabled:!!r}),p=w.filter(e=>e.type==="campaign"),P=w.filter(e=>e.type!=="campaign"),H=p.filter(e=>{const t=h.toLowerCase(),s=(e.ownerEntityRef?j.forEntity(e.ownerEntityRef):void 0)?.snapshot.primaryTitle?.toLowerCase()||"";return t===""||e.name.toLowerCase().includes(t)||e.ownerEntityRef?.toLowerCase().includes(t)||s.includes(t)}),O=P.filter(e=>{const t=h.toLowerCase(),s=(e.ownerEntityRef?j.forEntity(e.ownerEntityRef):void 0)?.snapshot.primaryTitle?.toLowerCase()||"";return t===""||e.name.toLowerCase().includes(t)||e.ownerEntityRef?.toLowerCase().includes(t)||s.includes(t)}),T=i(()=>[...H,...O],[H,O]),m=i(()=>[...p.map(e=>e.id),...P.map(e=>e.id)],[p,P]),{data:B,isLoading:pe,error:de,progress:o}=Ge({trackIds:m,groupRef:r||"",skip:!r||m.length===0}),{data:D,isLoading:y}=Ne(r,{includeParent:!0}),I=i(()=>{const e=new Map;return Array.isArray(B)&&B.forEach(t=>{t&&t.trackId&&e.set(t.trackId,t)}),e},[B]),ue=i(()=>{const e=new Map;return Array.isArray(L)&&L.forEach(t=>{t&&t.id&&e.set(t.id,t.applicableEntityCount)}),e},[L]),z=k&&!v&&!!r,V=v||de,A=m.length>0&&pe&&!V&&!!r,W=i(()=>({totalActiveTracksCampaigns:b}),[b]),Y=i(()=>{if(A)return{numTeams:void 0,avgCompliance:void 0,totalCampaigns:void 0,totalTracks:void 0};let e=0,t=0,s=0,u=0;const n=new Set;return T.forEach(C=>{const c=I.get(C.id);if(c){c.status&&typeof c.status.allPassPercentage=="number"&&(e+=c.status.allPassPercentage,t++),c.groupRef&&n.add(c.groupRef);const M=[c];for(;M.length>0;){const ke=M.pop();for(const U of ke.children)n.has(U.groupRef)||(n.add(U.groupRef),M.push(U))}}qe(c?.status)&&(C.type==="campaign"?s++:u++)}),{numTeams:n.size,avgCompliance:t>0?Math.round(e/t):0,totalCampaigns:s,totalTracks:u}},[T,I,A]),d=i(()=>{if(y)return{numEntities:void 0};const e=D?.[r];return{numEntities:Ve(e)}},[D,y,r]),ge=i(()=>({...W,...Y,...d}),[W,Y,d]),q=R(De),J=R(ze),he=Pe(e=>{if(!r)return;const t=new URLSearchParams;t.set("group",r),t.set("node",r);const s=p.find(({id:n})=>n===e);let u=q({trackId:e});if(s){const n=F?.edges.find(({node:C})=>C.track.id===e)?.node.id;n&&(u=J({campaignId:n}))}f(`${u}?${t.toString()}`)},[r,f,p,F,J,q]),K=Ue(r||void 0),x=i(()=>!o||o.totalTracks===0?0:o.loadedTracks/o.totalTracks*100,[o]),Q=k&&r&&!v||A&&o&&o.totalTracks>0,X=ie?.getLCPValue();Be(()=>{if(!y&&!k&&(x===100||m.length===0)){const e=d.numEntities??0,t=m.length;$({lcp:X,numberOfEntities:d.numEntities,entitiesBucket:We(e),numberOfTracks:m.length,tracksBucket:Ye(t)})}},[y,k,x,m.length,d.numEntities,$,X]);const fe=a(Qe,{summaryStats:ge,isLoading:z});return V?a(S,{mt:"6",children:a(Je,{title:"No Tech Insights Data",body:"There was an error loading Tech Insights data."})}):g(Te,{children:[a(Re,{title:`${K?`${K}'s `:""}Tech Insights`,customActions:g(G,{align:"center",gap:"3",children:[a(Ke,{hideSelected:!0}),a(Se,{isDisabled:be(w),value:l,onChange:ae,placeholder:"Search tracks or campaigns",style:{minWidth:250},"aria-label":"Search"})]})}),g(Ee,{className:te.container,children:[a(S,{style:{marginTop:0},children:fe}),Q&&a(S,{style:{marginBottom:16},children:a(ve,{variant:o&&o.totalTracks>0?"determinate":"indeterminate",value:o&&o.totalTracks>0?x:void 0,"data-testid":"batch-loading-indicator"})}),g(G,{align:"center",justify:"between",mb:"6",mt:"6",children:[a(S,{children:a(we,{variant:"title-x-small",weight:"bold",children:"Tracks & Campaigns"})}),T.length>0&&g(G,{align:"center",gap:"1",children:[a(Z,{iconStart:a(_,{}),onClick:()=>f(ne()),children:"Create Track"}),a(Z,{iconStart:a(_,{}),onClick:()=>f(se()),children:"Create Campaign"})]})]}),a(Xe,{tracks:T,trackStatusMap:I,trackCountsMap:ue,sortColumn:me,order:ce,handleSort:le,handleTrackClick:he,isLoading:z||!!Q,isSearch:!!l,activeTrackCount:b,hasGroupSelected:!!r})]})]})};export{_e as TechInsightsPageBUI};
2
2
  //# sourceMappingURL=TechInsightsPageBUI.esm.js.map
@@ -1,2 +1,2 @@
1
- import{jsx as r,jsxs as p,Fragment as A}from"react/jsx-runtime";import{useApi as $}from"@backstage/core-plugin-api";import{entityPresentationApiRef as j}from"@backstage/plugin-catalog-react";import{TableRoot as D,TableHeader as F,Column as u,TableBody as H,Row as U,Flex as q,Box as N,Text as G,CellText as x,CellProfile as O}from"@backstage/ui";import{makeStyles as Y}from"@material-ui/core";import{uniq as z,isEmpty as I,isNumber as v}from"lodash";import{useMemo as m}from"react";import{useProfileImages as J}from"../../hooks/catalog/useProfileImages.esm.js";import{getPercentage as y}from"../../utils/formatters.esm.js";import{showTrack as K}from"../../utils/tracks.esm.js";import{CustomCell as Q}from"../CustomCell/CustomCell.esm.js";import{DescriptionCell as V}from"../DescriptionCell/DescriptionCell.esm.js";import"../EmptyState/EmptyState.esm.js";import{EmptyStateBUI as W}from"../EmptyState/EmptyStateBUI.esm.js";import{EmptyStateNoTracks as B}from"../EmptyState/EmptyStateNoTracks.esm.js";import"@backstage/plugin-permission-react";import"@remixicon/react";import"@spotify/backstage-plugin-soundcheck-common";import"react-router-dom";import"../../routes.esm.js";import{LoadingTableSkeleton as L}from"../LoadingTableSkeleton/LoadingTableSkeleton.esm.js";import{StatusBar as X}from"../StatusBar/StatusBar.esm.js";const Z=Y(()=>({statusPercent:{width:"var(--bui-space-12)"},statusBar:{width:"100%"}})),_=({track:a,trackStatus:e,entitiesCount:h,handleTrackClick:w,profileImageMap:g})=>{const l=Z(),c=$(j).forEntity(a.ownerEntityRef),f=m(()=>a.levels.reduce((t,s)=>t+s.checks.length,0),[a.levels]),i=m(()=>(e?.passed??0)+(e?.failed??0)+(e?.warning??0)+(e?.error??0)+(e?.notReported??0)+(e?.exempt??0),[e]),k=m(()=>{let t;return e?.allPassPercentage!==null&&e?.allPassPercentage!==void 0?t=e.allPassPercentage:e&&(t=y(e.passed+e.exempt,i)),t},[e,i]),P=m(()=>y(e?.failed,i),[e,i]),C=m(()=>y(e?.warning,i),[e,i]),d=m(()=>y(e?.notReported,i),[e,i]),S=m(()=>y(e?.error,i),[e,i]),T=g[c.snapshot.entityRef];return p(U,{onAction:()=>{w(a.id)},children:[r(V,{title:a.name??a.id,description:a.description??"",onClick:()=>w(a.id)}),r(Q,{children:p(q,{align:"center",gap:"2",children:[r(N,{className:l.statusPercent,children:p(G,{children:[k,"%"]})}),r(N,{className:l.statusBar,children:r(X,{passedPercent:k,failedPercent:P,warningPercent:C,notReportedPercent:d,errorPercent:S})})]})}),r(x,{title:a.type==="campaign"?"Campaign":"Track"}),r(x,{title:v(f)?`${f} Check${f===1?"":"s"}`:"N/A"}),r(x,{title:v(h)?`${h} ${h===1?"Entity":"Entities"}`:"N/A"}),r(O,{name:c.snapshot.primaryTitle,src:T??c.snapshot.primaryTitle})]})},ee=({order:a,sortColumn:e,handleSort:h,handleTrackClick:w,tracks:g,trackStatusMap:l,trackCountsMap:c,isSearch:f,isLoading:i,activeTrackCount:k,hasGroupSelected:P})=>{const C=m(()=>[...g].filter(t=>K(l.get(t.id)?.status)).sort((t,s)=>{const b=l.get(t.id),M=l.get(s.id);let o,n;switch(e){case"name":o=t.name?.toLowerCase()||"",n=s.name?.toLowerCase()||"";break;case"type":o=t.type||"",n=s.type||"";break;case"owner":o=t.ownerEntityRef?.toLowerCase()||"",n=s.ownerEntityRef?.toLowerCase()||"";break;case"compliance":o=b?.status?.allPassPercentage??null,n=M?.status?.allPassPercentage??null;break;case"checks":o=t.levels.reduce((R,E)=>R+E.checks.length,0),n=s.levels.reduce((R,E)=>R+E.checks.length,0);break;case"entities":o=c.get(t.id)??0,n=c.get(s.id)??0;break;default:return 0}return typeof o=="number"&&typeof n=="number"?a==="asc"?o-n:n-o:typeof o=="number"&&n===null?-1:o===null&&typeof n=="number"?1:typeof o=="string"&&typeof n=="string"?a==="asc"?o.localeCompare(n):n.localeCompare(o):0}),[g,l,e,c,a]),d=m(()=>C.map(t=>{const s=l.get(t.id)?.status,b=c.get(t.id)??0;return{track:t,trackStatus:s,entitiesCount:b}}),[C,c,l]),S=z(d.map(t=>t.track.ownerEntityRef)),{profileImageMap:T}=J(S);return!i&&I(g)?P?f&&k>0?r(W,{title:"No tracks or campaigns found.",body:"Your current search term did not return any tracks or campaigns. Please try a different search term. "}):r(B,{title:k>0?"No applicable tracks found for the selected group":void 0}):r(B,{title:"Select a group or create a new track"}):p(A,{children:[p(D,{sortDescriptor:{column:e,direction:a==="asc"?"ascending":"descending"},onSortChange:t=>h(t.column),children:[p(F,{children:[r(u,{id:"name",allowsSorting:!0,isRowHeader:!0,style:{width:"43%"},children:"Name"}),r(u,{id:"compliance",allowsSorting:!0,style:{width:"12%"},children:"Compliance"}),r(u,{id:"type",allowsSorting:!0,style:{width:"10%"},children:"Type"}),r(u,{id:"checks",allowsSorting:!0,style:{width:"10%"},children:"Checks"}),r(u,{id:"entities",allowsSorting:!0,style:{width:"10%"},children:"Entities"}),r(u,{id:"owner",allowsSorting:!0,style:{width:"15%"},children:"Track Owner"})]}),r(H,{children:d.map(t=>r(_,{handleTrackClick:w,profileImageMap:T??{},...t},t.track.id))})]}),I(d)&&i&&r(L,{rowCount:10}),!I(d)&&i&&r(L,{rowCount:4})]})};export{ee as TechInsightsTableBUI};
1
+ import{jsx as r,jsxs as p,Fragment as $}from"react/jsx-runtime";import{TableRoot as j,TableHeader as A,Column as u,TableBody as D,Row as F,Flex as H,Box as I,Text as U,CellText as v,CellProfile as q}from"@backstage/ui";import{makeStyles as G}from"@material-ui/core";import{uniq as O,isEmpty as x,isNumber as N}from"lodash";import{useMemo as c}from"react";import{useEntityPrimaryTitle as Y}from"../../hooks/catalog/useEntityPrimaryTitle.esm.js";import{useProfileImages as _}from"../../hooks/catalog/useProfileImages.esm.js";import{getPercentage as w}from"../../utils/formatters.esm.js";import{showTrack as z}from"../../utils/tracks.esm.js";import{CustomCell as J}from"../CustomCell/CustomCell.esm.js";import{DescriptionCell as K}from"../DescriptionCell/DescriptionCell.esm.js";import"../EmptyState/EmptyState.esm.js";import{EmptyStateBUI as Q}from"../EmptyState/EmptyStateBUI.esm.js";import{EmptyStateNoTracks as B}from"../EmptyState/EmptyStateNoTracks.esm.js";import"@backstage/core-plugin-api";import"@backstage/plugin-permission-react";import"@remixicon/react";import"@spotify/backstage-plugin-soundcheck-common";import"react-router-dom";import"../../routes.esm.js";import{LoadingTableSkeleton as L}from"../LoadingTableSkeleton/LoadingTableSkeleton.esm.js";import{StatusBar as V}from"../StatusBar/StatusBar.esm.js";const W=G(()=>({statusPercent:{width:"var(--bui-space-12)"},statusBar:{width:"100%"}})),X=({track:a,trackStatus:e,entitiesCount:h,handleTrackClick:y,profileImageMap:g})=>{const l=W(),d=Y(a.ownerEntityRef),f=c(()=>a.levels.reduce((t,s)=>t+s.checks.length,0),[a.levels]),i=c(()=>(e?.passed??0)+(e?.failed??0)+(e?.warning??0)+(e?.error??0)+(e?.notReported??0)+(e?.exempt??0),[e]),k=c(()=>{let t;return e?.allPassPercentage!==null&&e?.allPassPercentage!==void 0?t=e.allPassPercentage:e&&(t=w(e.passed+e.exempt,i)),t},[e,i]),P=c(()=>w(e?.failed,i),[e,i]),C=c(()=>w(e?.warning,i),[e,i]),m=c(()=>w(e?.notReported,i),[e,i]),b=c(()=>w(e?.error,i),[e,i]),S=a.ownerEntityRef?g[a.ownerEntityRef]:void 0;return p(F,{onAction:()=>{y(a.id)},children:[r(K,{title:a.name??a.id,description:a.description??"",onClick:()=>y(a.id)}),r(J,{children:p(H,{align:"center",gap:"2",children:[r(I,{className:l.statusPercent,children:p(U,{children:[k,"%"]})}),r(I,{className:l.statusBar,children:r(V,{passedPercent:k,failedPercent:P,warningPercent:C,notReportedPercent:m,errorPercent:b})})]})}),r(v,{title:a.type==="campaign"?"Campaign":"Track"}),r(v,{title:N(f)?`${f} Check${f===1?"":"s"}`:"N/A"}),r(v,{title:N(h)?`${h} ${h===1?"Entity":"Entities"}`:"N/A"}),r(q,{name:d,src:S??d})]})},Z=({order:a,sortColumn:e,handleSort:h,handleTrackClick:y,tracks:g,trackStatusMap:l,trackCountsMap:d,isSearch:f,isLoading:i,activeTrackCount:k,hasGroupSelected:P})=>{const C=c(()=>[...g].filter(t=>z(l.get(t.id)?.status)).sort((t,s)=>{const T=l.get(t.id),M=l.get(s.id);let o,n;switch(e){case"name":o=t.name?.toLowerCase()||"",n=s.name?.toLowerCase()||"";break;case"type":o=t.type||"",n=s.type||"";break;case"owner":o=t.ownerEntityRef?.toLowerCase()||"",n=s.ownerEntityRef?.toLowerCase()||"";break;case"compliance":o=T?.status?.allPassPercentage??null,n=M?.status?.allPassPercentage??null;break;case"checks":o=t.levels.reduce((R,E)=>R+E.checks.length,0),n=s.levels.reduce((R,E)=>R+E.checks.length,0);break;case"entities":o=d.get(t.id)??0,n=d.get(s.id)??0;break;default:return 0}return typeof o=="number"&&typeof n=="number"?a==="asc"?o-n:n-o:typeof o=="number"&&n===null?-1:o===null&&typeof n=="number"?1:typeof o=="string"&&typeof n=="string"?a==="asc"?o.localeCompare(n):n.localeCompare(o):0}),[g,l,e,d,a]),m=c(()=>C.map(t=>{const s=l.get(t.id)?.status,T=d.get(t.id)??0;return{track:t,trackStatus:s,entitiesCount:T}}),[C,d,l]),b=O(m.map(t=>t.track.ownerEntityRef)),{profileImageMap:S}=_(b);return!i&&x(g)?P?f&&k>0?r(Q,{title:"No tracks or campaigns found.",body:"Your current search term did not return any tracks or campaigns. Please try a different search term. "}):r(B,{title:k>0?"No applicable tracks found for the selected group":void 0}):r(B,{title:"Select a group or create a new track"}):p($,{children:[p(j,{sortDescriptor:{column:e,direction:a==="asc"?"ascending":"descending"},onSortChange:t=>h(t.column),children:[p(A,{children:[r(u,{id:"name",allowsSorting:!0,isRowHeader:!0,style:{width:"43%"},children:"Name"}),r(u,{id:"compliance",allowsSorting:!0,style:{width:"12%"},children:"Compliance"}),r(u,{id:"type",allowsSorting:!0,style:{width:"10%"},children:"Type"}),r(u,{id:"checks",allowsSorting:!0,style:{width:"10%"},children:"Checks"}),r(u,{id:"entities",allowsSorting:!0,style:{width:"10%"},children:"Entities"}),r(u,{id:"owner",allowsSorting:!0,style:{width:"15%"},children:"Track Owner"})]}),r(D,{children:m.map(t=>r(X,{handleTrackClick:y,profileImageMap:S??{},...t},t.track.id))})]}),x(m)&&i&&r(L,{rowCount:10}),!x(m)&&i&&r(L,{rowCount:4})]})};export{Z as TechInsightsTableBUI};
2
2
  //# sourceMappingURL=TechInsightsTableBUI.esm.js.map
@@ -0,0 +1,2 @@
1
+ import{getPercentage as n}from"../../utils/formatters.esm.js";import{getTrackStatusTotal as R}from"../../utils/tracks.esm.js";const u=(e,a)=>{if(!e||typeof e!="object")return null;if(e.groupRef===a)return e.status;if(e.children&&Array.isArray(e.children))for(const c of e.children){const s=u(c,a);if(s)return s}return null},p=(e,a,c,s,f)=>{const g=e.entityRef,d=e.entityRef,r=a?u(a,d):null,h=c(r?.allPassPercentage||0),P=e.ownedEntityRefs?.length||0,t=r?R(r):0;if(!e.children||Object.keys(e.children).length===0){if(P===0)return;const i=Math.log(P+1);if(i===0)return;const l={id:g,name:g,entityRef:d,value:i,numberOfEntities:P,color:h,passPercentage:r?.allPassPercentage||0,failPercentage:n(r?.failed,t),warningPercentage:n(r?.warning,t),notReportedPercentage:n(r?.notReported,t),errorPercentage:n(r?.error,t),children:[]};return f&&(l.parent=f),l}const m=Object.values(e.children),o={id:g,name:g,entityRef:d,numberOfEntities:0,color:"",passPercentage:r?.allPassPercentage||0,failPercentage:n(r?.failed,t),warningPercentage:n(r?.warning,t),notReportedPercentage:n(r?.notReported,t),errorPercentage:n(r?.error,t),children:[]};f&&(o.parent=f);const y=m.map(i=>{const l=p(i,a,c,s,o);return o.numberOfEntities+=l?.numberOfEntities??0,l}).filter(i=>i!==void 0);return o.children=y,o.color=c(r?.allPassPercentage||0),o};export{p as hierarchyToNivo};
2
+ //# sourceMappingURL=hierarchyToNivo.esm.js.map
@@ -1,2 +1,2 @@
1
- import{jsx as t,jsxs as c,Fragment as v}from"react/jsx-runtime";import{useRouteRef as y}from"@backstage/core-plugin-api";import{useEntityPresentation as C}from"@backstage/plugin-catalog-react";import{TableRoot as N,TableHeader as E,Column as h,TableBody as B,TablePagination as k,Row as O,CellProfile as z,CellText as M,Flex as D,Box as w,Text as L}from"@backstage/ui";import{makeStyles as $}from"@material-ui/core";import{sortBy as j}from"lodash";import{useMemo as P}from"react";import{useNavigate as F,createSearchParams as H}from"react-router-dom";import"@backstage/catalog-model";import"@tanstack/react-query";import"../../api.esm.js";import"../../hooks/graphqlKeys.esm.js";import"@spotify/backstage-plugin-soundcheck-common";import"../../hooks/useSoundcheckAlert.esm.js";import"../../hooks/useConfirmationModal.esm.js";import{useSearchName as A}from"../../hooks/useSearchName.esm.js";import{usePagination as G}from"../../hooks/usePagination.esm.js";import{useSortTableLocalStorage as U}from"../../hooks/useSortTableLocalStorage.esm.js";import"react-use/lib/useAsync";import"../ChecksTable/utils.esm.js";import"../../graphql/generated/index.esm.js";import"react-use/lib/useAsyncRetry";import{useProfileImages as V}from"../../hooks/catalog/useProfileImages.esm.js";import{trackOverviewRouteRef as W,campaignOverviewRouteRef as X}from"../../routes.esm.js";import{CustomCell as Y}from"../CustomCell/CustomCell.esm.js";import"../EmptyState/EmptyState.esm.js";import{EmptyStateBUI as q}from"../EmptyState/EmptyStateBUI.esm.js";import"@backstage/plugin-permission-react";import"@remixicon/react";import{LoadingTableSkeleton as J}from"../LoadingTableSkeleton/LoadingTableSkeleton.esm.js";import{StatusBar as K}from"../StatusBar/StatusBar.esm.js";const R=10,Q=(e,m=[])=>{const o=[],i=r=>{!r.children||r.children.length===0?r.numberOfEntities>0&&o.push(r):(m.includes(r.entityRef)&&r.numberOfEntities>0&&o.push(r),r.children.forEach(l=>i(l)))};return i(e),o},Z=$(()=>({statusPercent:{width:"var(--bui-space-12)"},statusBar:{width:"100%"}})),_=({row:e,profileImageMap:m,trackId:o,campaignId:i})=>{const r=Z(),l=y(W),p=y(X),s=F(),{primaryTitle:d}=C(e.entityRef);return c(O,{onAction:()=>{o&&s({pathname:i?p({campaignId:i}):l({trackId:o}),search:`?${H({owners:[e.entityRef]})}`})},children:[t(z,{name:d,src:m[e.entityRef]??d}),t(M,{title:`${e.numberOfEntities} ${e.numberOfEntities===1?"entity":"entities"}`}),t(Y,{children:c(D,{align:"center",gap:"2",children:[t(w,{className:r.statusPercent,children:c(L,{children:[e.passPercentage,"%"]})}),t(w,{className:r.statusBar,children:t(K,{passedPercent:e.passPercentage,failedPercent:e.failPercentage,warningPercent:e.warningPercentage,notReportedPercent:e.notReportedPercentage,errorPercent:e.errorPercentage})})]})})]})},ee=({tableData:e,isLoading:m,trackId:o,selectedGroup:i,searchValue:r,campaignId:l})=>{const{order:p,orderBy:s,handleSort:d}=U({localStoragePrefix:"soundcheck-tech-insights-explorer",defaultSortBy:"entities",defaultDirection:"desc"}),f=P(()=>e?Q(e,i?[i]:[]):[],[i,e]),S=A({items:f,searchTerm:r}),g=P(()=>{const a=j(S??[],u=>s==="name"?u.name:s==="passPercentage"?u.passPercentage:s==="entities"?u.numberOfEntities:0);return p==="desc"&&a.reverse(),a},[S,p,s]),b=P(()=>f.map(a=>a.entityRef),[f]),{paginatedItems:I,paginationProps:n}=G({pageParam:"perPage",defaultPageSize:R,items:g}),x=g.length>R,{profileImageMap:T}=V(b);return m?t(J,{rowCount:10}):!m&&!g.length?t(q,{title:"No groups found",body:"No groups found for the current selection."}):c(v,{children:[c(N,{sortDescriptor:{column:s,direction:p==="asc"?"ascending":"descending"},onSortChange:a=>d(a.column),children:[c(E,{children:[t(h,{allowsSorting:!0,id:"name",isRowHeader:!0,style:{width:"75%"},children:"Name"}),t(h,{allowsSorting:!0,id:"entities",style:{width:"10%"},children:"Entities"}),t(h,{allowsSorting:!0,id:"passPercentage",style:{width:"15%"},children:"Compliance"})]}),t(B,{children:I.map(a=>t(_,{profileImageMap:T??{},row:a,trackId:o,campaignId:l},a.entityRef))})]}),x&&t(k,{totalCount:g.length,offset:n.offset,hasNextPage:n.offset+n.pageSize<(g.length??0),hasPreviousPage:n.offset>0,onNextPage:n.onNextPage,onPreviousPage:n.onPreviousPage,onPageSizeChange:n.onPageSizeChange,pageSize:n.pageSize})]})};export{ee as TechInsightsExplorerTable};
1
+ import{jsx as r,jsxs as g,Fragment as C}from"react/jsx-runtime";import{useRouteRef as y}from"@backstage/core-plugin-api";import{useEntityPresentation as E}from"@backstage/plugin-catalog-react";import{TableRoot as v,TableHeader as N,Column as P,TableBody as B,TablePagination as k,Row as z,CellProfile as O,CellText as D,Flex as L,Box as w,Text as M}from"@backstage/ui";import{makeStyles as A}from"@material-ui/core";import{sortBy as F}from"lodash";import{useMemo as S}from"react";import{useNavigate as $,createSearchParams as j}from"react-router-dom";import"@backstage/catalog-model";import"@tanstack/react-query";import"../../api.esm.js";import"../../hooks/graphqlKeys.esm.js";import"@spotify/backstage-plugin-soundcheck-common";import"../../hooks/useSoundcheckAlert.esm.js";import"../../hooks/useConfirmationModal.esm.js";import{useSearchName as G}from"../../hooks/useSearchName.esm.js";import{usePagination as H,DEFAULT_PAGE_SIZE as R}from"../../hooks/usePagination.esm.js";import{useSortTableLocalStorage as U}from"../../hooks/useSortTableLocalStorage.esm.js";import"react-use/lib/useAsync";import"../ChecksTable/utils.esm.js";import"../../graphql/generated/index.esm.js";import"react-use/lib/useAsyncRetry";import{useProfileImages as _}from"../../hooks/catalog/useProfileImages.esm.js";import{trackOverviewRouteRef as V,campaignOverviewRouteRef as W}from"../../routes.esm.js";import{CustomCell as X}from"../CustomCell/CustomCell.esm.js";import"../EmptyState/EmptyState.esm.js";import{EmptyStateBUI as Y}from"../EmptyState/EmptyStateBUI.esm.js";import"@backstage/plugin-permission-react";import"@remixicon/react";import{LoadingTableSkeleton as Z}from"../LoadingTableSkeleton/LoadingTableSkeleton.esm.js";import{StatusBar as q}from"../StatusBar/StatusBar.esm.js";const J=(e,l=[])=>{const s=[],i=new Set,m=t=>{t.numberOfEntities<=0||i.has(t.entityRef)||(i.add(t.entityRef),s.push(t))},p=(t,o)=>{if(o.has(t.entityRef))return;const c=new Set(o);c.add(t.entityRef);const d=t.children??[];d.length>0?(l.includes(t.entityRef)&&m(t),d.forEach(u=>p(u,c))):m(t)};return p(e,new Set),s},K=A(()=>({statusPercent:{width:"var(--bui-space-12)"},statusBar:{width:"100%"}})),Q=({row:e,profileImageMap:l,trackId:s,campaignId:i})=>{const m=K(),p=y(V),t=y(W),o=$(),{primaryTitle:c}=E(e.entityRef);return g(z,{onAction:()=>{s&&o({pathname:i?t({campaignId:i}):p({trackId:s}),search:`?${j({owners:[e.entityRef]})}`})},children:[r(O,{name:c,src:l[e.entityRef]??c}),r(D,{title:`${e.numberOfEntities} ${e.numberOfEntities===1?"entity":"entities"}`}),r(X,{children:g(L,{align:"center",gap:"2",children:[r(w,{className:m.statusPercent,children:g(M,{children:[e.passPercentage,"%"]})}),r(w,{className:m.statusBar,children:r(q,{passedPercent:e.passPercentage,failedPercent:e.failPercentage,warningPercent:e.warningPercentage,notReportedPercent:e.notReportedPercentage,errorPercent:e.errorPercentage})})]})})]})},ee=({tableData:e,isLoading:l,trackId:s,selectedGroup:i,searchValue:m,campaignId:p})=>{const{order:t,orderBy:o,handleSort:c}=U({localStoragePrefix:"soundcheck-tech-insights-explorer",defaultSortBy:"entities",defaultDirection:"desc"}),d=S(()=>e?J(e,i?[i]:[]):[],[i,e]),u=G({items:d,searchTerm:m}),f=S(()=>{const a=F(u??[],h=>o==="name"?h.name:o==="passPercentage"?h.passPercentage:o==="entities"?h.numberOfEntities:0);return t==="desc"&&a.reverse(),a},[u,t,o]),I=S(()=>d.map(a=>a.entityRef),[d]),{paginatedItems:b,paginationProps:n}=H({pageParam:"perPage",defaultPageSize:R,items:f}),T=f.length>R,{profileImageMap:x}=_(I);return l?r(Z,{rowCount:10}):!l&&!f.length?r(Y,{title:"No groups found",body:"No groups found for the current selection."}):g(C,{children:[g(v,{sortDescriptor:{column:o,direction:t==="asc"?"ascending":"descending"},onSortChange:a=>c(a.column),children:[g(N,{children:[r(P,{allowsSorting:!0,id:"name",isRowHeader:!0,style:{width:"75%"},children:"Name"}),r(P,{allowsSorting:!0,id:"entities",style:{width:"10%"},children:"Entities"}),r(P,{allowsSorting:!0,id:"passPercentage",style:{width:"15%"},children:"Compliance"})]}),r(B,{children:b.map(a=>r(Q,{profileImageMap:x??{},row:a,trackId:s,campaignId:p},a.entityRef))})]}),T&&r(k,{totalCount:f.length,offset:n.offset,hasNextPage:n.offset+n.pageSize<(f.length??0),hasPreviousPage:n.offset>0,onNextPage:n.onNextPage,onPreviousPage:n.onPreviousPage,onPageSizeChange:n.onPageSizeChange,pageSize:n.pageSize})]})};export{ee as TechInsightsExplorerTable};
2
2
  //# sourceMappingURL=TechInsightsExplorerTable.esm.js.map
@@ -1,2 +1,2 @@
1
- import{jsx as g}from"react/jsx-runtime";import{useApi as d,configApiRef as h}from"@backstage/core-plugin-api";import{useMemo as S,useEffect as G,useCallback as R}from"react";import{useSearchParams as v}from"react-router-dom";import w from"react-use/lib/useLocalStorage";import{useGroupOptions as P}from"../../hooks/groups/useGroupOptions.esm.js";import{GroupSelectorBUI as k}from"../GroupSelectorBUI/GroupSelectorBUI.esm.js";import{usePreviousSelectedGroups as L}from"../GroupSelectorBUI/usePreviousSelectedGroups.esm.js";const U=({onChange:i})=>{const{options:r,isLoading:u}=P(),[t,p]=v(),[c,s]=w("soundcheck.overview.groupRef",null),n=t.get("group"),m=d(h).getOptionalString("soundcheck.overview.defaultSelectedGroupType"),{addGroup:a}=L(),o=S(()=>{if(!u&&r.length){if(n||c){const e=n??c;return r.find(f=>f.ref===e)??r[0]}else if(m)return r.find(e=>e.type===m)??r[0];return r[0]}return null},[m,u,r,n,c]);G(()=>{if(!u&&r.length&&!n&&o){const e=new URLSearchParams(t.toString());e.set("group",o.ref),p(e,{replace:!0}),s(o.ref),i?.(o.ref),a(o.ref)}},[u,r,n,o,t,p,s]);const l=R(e=>{const f=new URLSearchParams(t.toString());f.set("group",e),p(f),s(e),i?.(e),a(e)},[a,i,t,s,p]);return g(k,{selectedGroupRef:o?.ref,updateGroupRef:l})};export{U as TechInsightsGroupSelector};
1
+ import{jsx as g}from"react/jsx-runtime";import{useApi as d,configApiRef as h}from"@backstage/core-plugin-api";import{useMemo as S,useEffect as G,useCallback as R}from"react";import{useSearchParams as v}from"react-router-dom";import w from"react-use/lib/useLocalStorage";import{useGroupOptions as P}from"../../hooks/groups/useGroupOptions.esm.js";import{GroupSelectorBUI as k}from"../GroupSelectorBUI/GroupSelectorBUI.esm.js";import"@backstage/ui";import"lodash";import"@backstage/plugin-catalog-react";import"@remixicon/react";import"../GroupSelectorBUI/ListViewMode.esm.js";import{usePreviousSelectedGroups as L}from"../GroupSelectorBUI/usePreviousSelectedGroups.esm.js";const U=({onChange:f})=>{const{options:e,isLoading:n}=P(),[t,i]=v(),[m,u]=w("soundcheck.overview.groupRef",null),p=t.get("group"),c=d(h).getOptionalString("soundcheck.overview.defaultSelectedGroupType"),{addGroup:a}=L(),o=S(()=>{if(!n&&e.length){if(p||m){const r=p??m;return e.find(s=>s.ref===r)??e[0]}else if(c)return e.find(r=>r.type===c)??e[0];return e[0]}return null},[c,n,e,p,m]);G(()=>{if(!n&&e.length&&!p&&o){const r=new URLSearchParams(t.toString());r.set("group",o.ref),i(r,{replace:!0}),u(o.ref),f?.(o.ref),a(o.ref)}},[n,e,p,o,t,i,u]);const l=R(r=>{const s=new URLSearchParams(t.toString());s.set("group",r),i(s),u(r),f?.(r),a(r)},[a,f,t,u,i]);return g(k,{selectedGroupRef:o?.ref,updateGroupRef:l})};export{U as TechInsightsGroupSelector};
2
2
  //# sourceMappingURL=TechInsightsGroupSelector.esm.js.map
@@ -1,2 +1,2 @@
1
- import{jsx as r,Fragment as y,jsxs as i}from"react/jsx-runtime";import{Flex as f,Text as h,Button as s,Box as g}from"@backstage/ui";import{makeStyles as z}from"@material-ui/core/styles";import{RiSubtractLine as O,RiAddLine as _}from"@remixicon/react";import{useState as v,useContext as M}from"react";import{DialogTrigger as P,Popover as F,Dialog as R,OverlayTriggerStateContext as C,NumberField as E,Label as U,Group as L,Input as j}from"react-aria-components";import{useSearchParams as k}from"react-router-dom";import"../../utils/facetFilters/types.esm.js";import{MAX_NUMBER_OF_DAYS as N,DEFAULT_NUMBER_OF_DAYS as x,MIN_NUMBER_OF_DAYS as p}from"../../utils/facetFilters/utils.esm.js";const V=[{label:"7D",value:7},{label:"1M",value:x},{label:"2M",value:60},{label:"3M",value:N}],Y=z(()=>({centerText:{textAlign:"center"},group:{display:"flex",alignItems:"center",justifyContent:"center"},inputButton:{display:"flex",alignItems:"center"},dialog:{background:"var(--bui-bg-popover)",padding:"var(--bui-space-3)",borderRadius:"var(--bui-radius-3)",border:"1px solid var(--bui-border)"},pointer:{cursor:"pointer"},dialogTriggerButton:{padding:"0 !important",fontWeight:"normal",height:"0 !important",color:"var(--bui-fg-secondary) !important",fontSize:"var(--bui-font-size-2) !important"}})),w=({maxNumberOfDays:o=N})=>{const a=Y(),[c,S]=k(),m=c.get("numberOfDays"),T=m!==null&&!isNaN(Number(m))?Number(m):x,[B,D]=v(T),u=t=>{if(D(t),c.get("numberOfDays")!==String(t)){const l=new URLSearchParams(c);l.set("numberOfDays",String(t)),S(l,{replace:!0})}},I=()=>{const t=M(C),[l,d]=v(String(B)),b=e=>{let n;if(typeof e=="string"){if(!e.length)return!0;n=parseInt(e,10)}else n=e;return!isNaN(n)&&n>=p&&n<=o},A=e=>{if(e.key==="Enter"){const n=parseInt(e.currentTarget.value,10);b(n)&&(u(n),t?.close())}};return i(y,{children:[i(E,{minValue:p,maxValue:o,value:parseInt(l,10),children:[i(g,{mb:"2",children:[r(g,{style:{textAlign:"center"},children:r(U,{className:a.centerText,id:"number-days",children:"Number of days"})}),r(g,{style:{textAlign:"center"},children:i(h,{variant:"body-small",color:"secondary","aria-labelledby":"number-days",children:["Enter a value from ",p," to ",o]})})]}),i(L,{className:a.group,children:[r(s,{slot:"decrement",variant:"tertiary",size:"small",className:a.inputButton,onPress:()=>{d(e=>String(parseInt(e,10)-1))},children:r(O,{size:8})}),r(j,{onKeyDown:A,size:5,className:a.centerText,onChange:e=>d(e.currentTarget.value)}),r(s,{slot:"increment",variant:"tertiary",size:"small",className:a.inputButton,onPress:()=>{d(e=>String(parseInt(e,10)+1))},children:r(_,{size:8})})]})]}),r(f,{align:"center",justify:"center",mt:"2",children:r(s,{style:{height:"auto"},variant:"tertiary",size:"small",onPress:()=>{const e=parseInt(l,10);b(e)&&(u(e),t?.close())},children:"Apply"})})]})};return r(y,{children:i(f,{align:"center",children:[V.filter(({value:t})=>t<=o).map(t=>r(h,{variant:"body-small",color:"secondary",className:a.pointer,onClick:()=>u(t.value),children:t.label},t.value)),i(P,{children:[r(s,{variant:"tertiary",size:"small",className:a.dialogTriggerButton,children:"Custom"}),r(F,{children:r(R,{className:a.dialog,children:r(I,{})})})]})]})})};export{w as TimePeriodBarBUI};
1
+ import{jsx as r,Fragment as y,jsxs as i}from"react/jsx-runtime";import{Flex as p,Text as v,Button as s,Box as b}from"@backstage/ui";import{makeStyles as z}from"@material-ui/core/styles";import{RiSubtractLine as _,RiAddLine as E}from"@remixicon/react";import{useState as f,useContext as O}from"react";import{DialogTrigger as P,Popover as R,Dialog as M,OverlayTriggerStateContext as F,NumberField as U,Label as C,Input as L}from"react-aria-components";import{useSearchParams as j}from"react-router-dom";import"../../utils/facetFilters/types.esm.js";import{RETENTION_TIME_IN_DAYS as x,DEFAULT_NUMBER_OF_DAYS as N,MIN_NUMBER_OF_DAYS as g}from"../../utils/facetFilters/utils.esm.js";const k=[{label:"7D",value:7},{label:"1M",value:N},{label:"2M",value:60},{label:"3M",value:x}],w=z(()=>({centerText:{textAlign:"center"},inputButton:{display:"flex",alignItems:"center"},dialog:{background:"var(--bui-bg-popover)",padding:"var(--bui-space-3)",borderRadius:"var(--bui-radius-3)",border:"1px solid var(--bui-border-1)",boxShadow:"1px 1px 0 0 var(--bui-border-1)"},pointer:{cursor:"pointer"},dialogTriggerButton:{padding:"0 !important",fontWeight:"normal",height:"0 !important",color:"var(--bui-fg-secondary) !important",fontSize:"var(--bui-font-size-2) !important"},numberInput:{textAlign:"center",width:"30%",padding:"var(--bui-space-2)",borderRadius:"var(--bui-space-1)",border:"1px solid var(--bui-border-1)"}})),Y=({maxNumberOfDays:o=x})=>{const n=w(),[u,S]=j(),c=u.get("numberOfDays"),I=c!==null&&!isNaN(Number(c))?Number(c):N,[T,D]=f(I),m=t=>{if(D(t),u.get("numberOfDays")!==String(t)){const l=new URLSearchParams(u);l.set("numberOfDays",String(t)),S(l,{replace:!0})}},B=()=>{const t=O(F),[l,d]=f(String(T)),h=e=>{let a;if(typeof e=="string"){if(!e.length)return!0;a=parseInt(e,10)}else a=e;return!isNaN(a)&&a>=g&&a<=o},A=e=>{if(e.key==="Enter"){const a=parseInt(e.currentTarget.value,10);h(a)&&(m(a),t?.close())}};return i(y,{children:[i(U,{minValue:g,maxValue:o,value:parseInt(l,10),children:[i(b,{mb:"4",children:[r(b,{style:{textAlign:"center"},children:r(C,{className:n.centerText,id:"number-days",children:"Number of days"})}),r(b,{style:{textAlign:"center"},children:i(v,{variant:"body-small",color:"secondary","aria-labelledby":"number-days",children:["Enter a value from ",g," to ",o]})})]}),i(p,{align:"center",justify:"center",gap:"1",children:[r(s,{slot:"decrement",variant:"tertiary",size:"small",className:n.inputButton,onPress:()=>{d(e=>String(parseInt(e,10)-1))},children:r(_,{size:8})}),r(L,{type:"number",onKeyDown:A,size:5,className:n.numberInput,onChange:e=>d(e.currentTarget.value)}),r(s,{slot:"increment",variant:"tertiary",size:"small",className:n.inputButton,onPress:()=>{d(e=>String(parseInt(e,10)+1))},children:r(E,{size:8})})]})]}),r(p,{align:"center",justify:"center",mt:"2",children:r(s,{style:{height:"auto"},variant:"tertiary",size:"small",onPress:()=>{const e=parseInt(l,10);h(e)&&(m(e),t?.close())},children:"Apply"})})]})};return r(y,{children:i(p,{align:"center",children:[k.filter(({value:t})=>t<=o).map(t=>r(v,{variant:"body-small",color:"secondary",className:n.pointer,onClick:()=>m(t.value),children:t.label},t.value)),i(P,{children:[r(s,{variant:"tertiary",size:"small",className:n.dialogTriggerButton,children:"Custom"}),r(R,{children:r(M,{className:n.dialog,children:r(B,{})})})]})]})})};export{Y as TimePeriodBarBUI};
2
2
  //# sourceMappingURL=TimePeriodBarBUI.esm.js.map
@@ -1,2 +1,2 @@
1
- import{jsxs as o,jsx as t}from"react/jsx-runtime";import{useMemo as g,useCallback as B,createElement as S}from"react";import{useRouteRef as $,useApi as G}from"@backstage/core-plugin-api";import{entityPresentationApiRef as W}from"@backstage/plugin-catalog-react";import{Flex as b,Card as k,Text as N,Box as v,Avatar as D}from"@backstage/ui";import{makeStyles as U}from"@material-ui/core";import{isEmpty as C}from"lodash";import{useNavigate as q,createSearchParams as J}from"react-router-dom";import{useProfileImages as K}from"../../hooks/catalog/useProfileImages.esm.js";import{trackOverviewRouteRef as Q,campaignOverviewRouteRef as V}from"../../routes.esm.js";import{getPercentage as T}from"../../utils/formatters.esm.js";import"../EmptyState/EmptyState.esm.js";import{EmptyStateBUI as A}from"../EmptyState/EmptyStateBUI.esm.js";import"@backstage/plugin-permission-react";import"@remixicon/react";import"@spotify/backstage-plugin-soundcheck-common";import{getLeafNodes as X}from"../HierarchicalTechInsightsPage/getLeafNodes.esm.js";import{LoadingTableSkeleton as E}from"../LoadingTableSkeleton/LoadingTableSkeleton.esm.js";import{StatusBar as Y}from"../StatusBar/StatusBar.esm.js";const M=U(()=>({topTeamCard:{padding:"var(--bui-space-3) var(--bui-space-5)",minWidth:400},topTeamCardRows:{minHeight:"calc(var(--bui-space-6) * 6.5)",cursor:"pointer"},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-neutral-2)",border:"1px solid var(--bui-bg-neutral-2)",borderRadius:"var(--bui-radius-2)"},infoButton:{"&:hover":{backgroundColor:"inherit !important"}},teamName:{width:"75%"},percentBar:{width:"25%"},statusPercent:{width:"var(--bui-space-12)"},statusBar:{width:"100%"}})),H=({groupRef:a,teamName:i,passPercentage:m,failPercentage:l,warningPercentage:u,notReportedPercentage:f,errorPercentage:P,profileImageMap:p,onClick:h})=>{const n=M();return t(k,{className:`${n.topTeamCardRow}`,onClick:h,children:o(b,{align:"center",gap:"1",style:{flex:1},children:[o(b,{align:"center",gap:"2",className:n.teamName,children:[t(D,{name:i,size:"small",src:p[a]?p[a]:i}),t(N,{children:i})]}),o(b,{align:"center",gap:"1",className:n.percentBar,children:[t(v,{className:n.statusPercent,children:o(N,{color:"secondary",children:[m,"%"]})}),t(v,{className:n.statusBar,children:t(Y,{passedPercent:m,failedPercent:l,warningPercent:u,notReportedPercent:f,errorPercent:P})})]})]})})},Z=({trackStatus:a,isLoading:i,campaignId:m})=>{const l=M(),u=$(Q),f=$(V),P=q(),p=80,h=50,n=G(W),y=g(()=>a?X(a):[],[a]),R=g(()=>y.filter(e=>{const{passed:r,failed:s,warning:O,error:j,notReported:z,exempt:F}=e.status;return r+s+O+j+z+F>0&&!e.children?.length}).sort((e,r)=>(e.status.allPassPercentage??0)-(r.status.allPassPercentage??0)),[y]),w=B(e=>{const r=n.forEntity(e.groupRef).snapshot,s=e.status.failed+e.status.passed+e.status.error+e.status.exempt+e.status.warning+e.status.notReported;return{groupRef:e.groupRef,teamName:r.primaryTitle,passPercentage:e.status.allPassPercentage??0,failPercentage:T(e.status.failed,s),warningPercentage:T(e.status.warning,s),notReportedPercentage:T(e.status.notReported,s),errorPercentage:T(e.status.warning,s),teamInfo:r.secondaryTitle}},[n]),c=g(()=>R.filter(e=>(e.status.allPassPercentage??0)<h).slice(0,3).map(w),[R,w]),d=g(()=>{const e=R.filter(r=>(r.status.allPassPercentage??0)>=p);return e.reverse(),e.slice(0,3).map(w)},[R,w]),L=g(()=>[...d.map(e=>e.groupRef),...c.map(e=>e.groupRef)],[c,d]),{profileImageMap:x}=K(L),I=B(e=>{let r;if(m?r=f({campaignId:m}):a?.trackId&&(r=u({trackId:a.trackId})),r){const s=`${r}?${J({owners:[e]})}`;P(s)}},[f,u,P,m,a?.trackId]);return o(b,{children:[o(k,{className:l.topTeamCard,children:[t(N,{variant:"title-x-small",weight:"bold",children:"Teams Needing Attention"}),i&&t(E,{rowCount:3,rowHeight:40}),!i&&o(v,{className:l.topTeamCardRows,children:[!C(c)&&c.map(e=>S(H,{profileImageMap:x??{},...e,key:e.groupRef,onClick:()=>I(e.groupRef)})),C(c)&&t(A,{title:"No teams eligible",body:`None of your teams are performing below ${h}% compliance.`})]})]}),o(k,{className:l.topTeamCard,children:[t(N,{variant:"title-x-small",weight:"bold",children:"Top Performing Teams"}),i&&t(E,{rowCount:3,rowHeight:40}),!i&&o(v,{className:l.topTeamCardRows,children:[!C(d)&&d.map(e=>S(H,{profileImageMap:x??{},...e,key:e.groupRef,onClick:()=>I(e.groupRef)})),C(d)&&t(A,{title:"No teams eligible",body:`None of your teams are performing above ${p}% compliance.`})]})]})]})};export{Z as TopAndBottomPerformingTeams};
1
+ import{jsxs as i,jsx as r}from"react/jsx-runtime";import{useMemo as u,useCallback as I,createElement as B}from"react";import{parseEntityRef as L}from"@backstage/catalog-model";import{useRouteRef as M}from"@backstage/core-plugin-api";import{useEntityPresentation as W}from"@backstage/plugin-catalog-react";import{Flex as w,Card as k,Text as b,Box as v,Avatar as D}from"@backstage/ui";import{makeStyles as U}from"@material-ui/core";import{isEmpty as N}from"lodash";import{useNavigate as q,createSearchParams as J}from"react-router-dom";import{useProfileImages as K}from"../../hooks/catalog/useProfileImages.esm.js";import{trackOverviewRouteRef as Q,campaignOverviewRouteRef as V}from"../../routes.esm.js";import{getPercentage as C}from"../../utils/formatters.esm.js";import"../EmptyState/EmptyState.esm.js";import{EmptyStateBUI as E}from"../EmptyState/EmptyStateBUI.esm.js";import"@backstage/plugin-permission-react";import"@remixicon/react";import"@spotify/backstage-plugin-soundcheck-common";import{LoadingTableSkeleton as S}from"../LoadingTableSkeleton/LoadingTableSkeleton.esm.js";import{StatusBar as X}from"../StatusBar/StatusBar.esm.js";const $=a=>!a.children||a.children.length===0?[a]:a.children.flatMap(s=>$(s)),A=U(()=>({topTeamCard:{padding:"var(--bui-space-3) var(--bui-space-5)",minWidth:400},topTeamCardRows:{minHeight:"calc(var(--bui-space-6) * 6.5)",cursor:"pointer"},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-neutral-2)",border:"1px solid var(--bui-bg-neutral-2)",borderRadius:"var(--bui-radius-2)"},infoButton:{"&:hover":{backgroundColor:"inherit !important"}},teamName:{width:"75%"},percentBar:{width:"25%"},statusPercent:{width:"var(--bui-space-12)"},statusBar:{width:"100%"}})),H=({groupRef:a,teamName:s,passPercentage:m,failPercentage:l,warningPercentage:f,notReportedPercentage:h,errorPercentage:P,profileImageMap:p,onClick:R})=>{const n=A(),{primaryTitle:c}=W(a),o=c??s;return r(k,{className:`${n.topTeamCardRow}`,onPress:R,label:o,children:i(w,{align:"center",gap:"1",style:{flex:1},children:[i(w,{align:"center",gap:"2",className:n.teamName,children:[r(D,{name:o,size:"small",src:p[a]?p[a]:o}),r(b,{children:o})]}),i(w,{align:"center",gap:"1",className:n.percentBar,children:[r(v,{className:n.statusPercent,children:i(b,{color:"secondary",children:[m,"%"]})}),r(v,{className:n.statusBar,children:r(X,{passedPercent:m,failedPercent:l,warningPercent:f,notReportedPercent:h,errorPercent:P})})]})]})})},Y=({trackStatus:a,isLoading:s,campaignId:m})=>{const l=A(),f=M(Q),h=M(V),P=q(),p=80,R=50,n=u(()=>a?$(a):[],[a]),c=u(()=>n.filter(e=>{const{passed:t,failed:T,warning:j,error:z,notReported:F,exempt:G}=e.status;return t+T+j+z+F+G>0&&!e.children?.length}).sort((e,t)=>(e.status.allPassPercentage??0)-(t.status.allPassPercentage??0)),[n]),o=I(e=>{const t=e.status.failed+e.status.passed+e.status.error+e.status.exempt+e.status.warning+e.status.notReported;return{groupRef:e.groupRef,teamName:L(e.groupRef).name,passPercentage:e.status.allPassPercentage??0,failPercentage:C(e.status.failed,t),warningPercentage:C(e.status.warning,t),notReportedPercentage:C(e.status.notReported,t),errorPercentage:C(e.status.warning,t)}},[]),d=u(()=>c.filter(e=>(e.status.allPassPercentage??0)<R).slice(0,3).map(o),[c,o]),g=u(()=>{const e=c.filter(t=>(t.status.allPassPercentage??0)>=p);return e.reverse(),e.slice(0,3).map(o)},[c,o]),O=u(()=>[...g.map(e=>e.groupRef),...d.map(e=>e.groupRef)],[d,g]),{profileImageMap:x}=K(O),y=I(e=>{let t;if(m?t=h({campaignId:m}):a?.trackId&&(t=f({trackId:a.trackId})),t){const T=`${t}?${J({owners:[e]})}`;P(T)}},[h,f,P,m,a?.trackId]);return i(w,{children:[i(k,{className:l.topTeamCard,children:[r(b,{variant:"title-x-small",weight:"bold",children:"Teams Needing Attention"}),s&&r(S,{rowCount:3,rowHeight:40}),!s&&i(v,{className:l.topTeamCardRows,children:[!N(d)&&d.map(e=>B(H,{profileImageMap:x??{},...e,key:e.groupRef,onClick:()=>y(e.groupRef)})),N(d)&&r(E,{title:"No teams eligible",body:`None of your teams are performing below ${R}% compliance.`})]})]}),i(k,{className:l.topTeamCard,children:[r(b,{variant:"title-x-small",weight:"bold",children:"Top Performing Teams"}),s&&r(S,{rowCount:3,rowHeight:40}),!s&&i(v,{className:l.topTeamCardRows,children:[!N(g)&&g.map(e=>B(H,{profileImageMap:x??{},...e,key:e.groupRef,onClick:()=>y(e.groupRef)})),N(g)&&r(E,{title:"No teams eligible",body:`None of your teams are performing above ${p}% compliance.`})]})]})]})};export{Y as TopAndBottomPerformingTeams};
2
2
  //# sourceMappingURL=TopAndBottomPerformingTeams.esm.js.map
@@ -1,2 +1,2 @@
1
- import{jsx as o,jsxs as g,Fragment as L}from"react/jsx-runtime";import{useRouteRef as O}from"@backstage/core-plugin-api";import{TableRoot as j,TableHeader as $,Column as P,TableBody as A,Row as H,CellText as b,TablePagination as M}from"@backstage/ui";import{makeStyles as U}from"@material-ui/core";import{sortBy as V}from"lodash";import{useState as w,useEffect as W,useCallback as q,useMemo as C}from"react";import{CircularProgressbar as G}from"react-circular-progressbar";import{useNavigate as J}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"@spotify/backstage-plugin-soundcheck-common";import"../../hooks/useSoundcheckAlert.esm.js";import"../../hooks/useConfirmationModal.esm.js";import{usePagination as K}from"../../hooks/usePagination.esm.js";import"react-use/lib/useLocalStorage";import{useSortSearchParams as Q}from"../../hooks/useSortSearchParams.esm.js";import"react-use/lib/useAsync";import"../ChecksTable/utils.esm.js";import"../../graphql/generated/index.esm.js";import"react-use/lib/useAsyncRetry";import{trackCheckDetailsRouteRef as X}from"../../routes.esm.js";import{getPercentage as y}from"../../utils/formatters.esm.js";import"../EmptyState/EmptyState.esm.js";import{EmptyStateBUI as Y}from"../EmptyState/EmptyStateBUI.esm.js";import"@backstage/plugin-permission-react";import"@remixicon/react";import{LoadingTableSkeleton as Z}from"../LoadingTableSkeleton/LoadingTableSkeleton.esm.js";const _=U(()=>({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:"var(--bui-space-7)"}})),T=10,ee=["compliance","name","failures"],d=a=>ee.includes(a),te=({track:a,checkStatuses:s,certificationStatus:c,searchValue:p})=>{const N=_(),{updateSortParams:v,searchParams:n}=Q(),[u,k]=w(()=>{const e=n.get("sortDirection");return e==="ascending"||e==="descending"?e:"descending"}),[l,S]=w(()=>{const e=n.get("sort");return e&&d(e)?e:"compliance"}),x=O(X),I=J();W(()=>{const e=n.get("sortDirection");(e==="ascending"||e==="descending")&&k(e);const t=n.get("sort");t&&d(t)&&S(t)},[n]);const R=q(({direction:e,column:t})=>{const r=String(t);d(r)&&S(r),k(e),v({sort:d(r)?r:"compliance",sortDirection:e})},[v]),m=C(()=>!a.levels||!s?[]:a.levels.flatMap(e=>e.checks.map(t=>{const r=s.find(({id:F})=>F===t.id),D=r?r.numberOfEntities-r.notApplicable-r.exempt:0,E=r?.failed??0;return{check:t,failedCount:E,applicableCount:D}}).filter(({failedCount:t})=>t>0)),[a.levels,s]),f=C(()=>{if(!p?.length)return m;const e=p.toLowerCase();return m.filter(({check:t})=>t.name.toLowerCase().includes(e))},[m,p]),h=C(()=>{const e=V([...f],t=>l==="compliance"?y(t.failedCount,c?.numberOfEntities??0):l==="failures"?t.failedCount:t.check.name.toLowerCase());return u==="descending"&&e.reverse(),e},[f,u,l,c]),{paginatedItems:z,paginationProps:i}=K({pageParam:"perPage",defaultPageSize:T,items:h}),B=a.levels.length>T;return s===void 0||c===void 0?o(Z,{}):!m.length||!f.length?o(Y,{title:"No failing checks",body:"There are no failing checks found."}):g(L,{children:[g(j,{onSortChange:R,sortDescriptor:{direction:u,column:l},children:[g($,{children:[o(P,{id:"compliance",allowsSorting:!0,style:{width:"8%"},children:"Compliance"}),o(P,{id:"name",allowsSorting:!0,isRowHeader:!0,style:{width:"72%"},children:"Name"}),o(P,{id:"failures",allowsSorting:!0,style:{width:"20%"},children:"Failures"})]}),o(A,{children:z.map(({check:e,failedCount:t})=>{const r=y(t,c.numberOfEntities);return g(H,{onAction:()=>I(x({trackId:a.id,checkId:e.id})),children:[o(b,{leadingIcon:o("div",{className:N.circularProgressbar,title:`${r}%`,children:o(G,{value:r,strokeWidth:12,styles:{path:{stroke:"var(--bui-fg-danger)"},trail:{stroke:'rgba(var("--bui-fg-secondary"), 0.25)'}}})}),title:`${r}%`}),o(b,{title:e.name}),o(b,{title:`${new Intl.NumberFormat().format(t??0)} failing`})]},e.id)})})]}),B&&o(M,{totalCount:h.length,offset:i.offset,hasNextPage:i.offset+i.pageSize<(h.length??0),hasPreviousPage:i.offset>0,onNextPage:i.onNextPage,onPreviousPage:i.onPreviousPage,onPageSizeChange:i.onPageSizeChange,pageSize:i.pageSize})]})};export{te as TopFailingChecksTableBUI};
1
+ import{jsx as o,jsxs as g,Fragment as L}from"react/jsx-runtime";import{useRouteRef as A}from"@backstage/core-plugin-api";import{TableRoot as O,TableHeader as j,Column as P,TableBody as U,Row as $,CellText as b,TablePagination as H}from"@backstage/ui";import{makeStyles as M}from"@material-ui/core";import{sortBy as V}from"lodash";import{useState as w,useEffect as _,useCallback as G,useMemo as C}from"react";import{CircularProgressbar as W}from"react-circular-progressbar";import{useNavigate as Z}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"@spotify/backstage-plugin-soundcheck-common";import"../../hooks/useSoundcheckAlert.esm.js";import"../../hooks/useConfirmationModal.esm.js";import{usePagination as q,DEFAULT_PAGE_SIZE as y}from"../../hooks/usePagination.esm.js";import"react-use/lib/useLocalStorage";import{useSortSearchParams as J}from"../../hooks/useSortSearchParams.esm.js";import"react-use/lib/useAsync";import"../ChecksTable/utils.esm.js";import"../../graphql/generated/index.esm.js";import"react-use/lib/useAsyncRetry";import{trackCheckDetailsRouteRef as K}from"../../routes.esm.js";import{getPercentage as T}from"../../utils/formatters.esm.js";import"../EmptyState/EmptyState.esm.js";import{EmptyStateBUI as Q}from"../EmptyState/EmptyStateBUI.esm.js";import"@backstage/plugin-permission-react";import"@remixicon/react";import{LoadingTableSkeleton as X}from"../LoadingTableSkeleton/LoadingTableSkeleton.esm.js";const Y=M(()=>({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:"var(--bui-space-7)"}})),ee=["compliance","name","failures"],d=a=>ee.includes(a),te=({track:a,checkStatuses:s,certificationStatus:c,searchValue:p})=>{const E=Y(),{updateSortParams:v,searchParams:n}=J(),[u,S]=w(()=>{const e=n.get("sortDirection");return e==="ascending"||e==="descending"?e:"descending"}),[l,k]=w(()=>{const e=n.get("sort");return e&&d(e)?e:"compliance"}),I=A(K),N=Z();_(()=>{const e=n.get("sortDirection");(e==="ascending"||e==="descending")&&S(e);const t=n.get("sort");t&&d(t)&&k(t)},[n]);const x=G(({direction:e,column:t})=>{const r=String(t);d(r)&&k(r),S(e),v({sort:d(r)?r:"compliance",sortDirection:e})},[v]),m=C(()=>!a.levels||!s?[]:a.levels.flatMap(e=>e.checks.map(t=>{const r=s.find(({id:F})=>F===t.id),z=r?r.numberOfEntities-r.notApplicable-r.exempt:0,B=r?.failed??0;return{check:t,failedCount:B,applicableCount:z}}).filter(({failedCount:t})=>t>0)),[a.levels,s]),f=C(()=>{if(!p?.length)return m;const e=p.toLowerCase();return m.filter(({check:t})=>t.name.toLowerCase().includes(e))},[m,p]),h=C(()=>{const e=V([...f],t=>l==="compliance"?T(t.failedCount,c?.numberOfEntities??0):l==="failures"?t.failedCount:t.check.name.toLowerCase());return u==="descending"&&e.reverse(),e},[f,u,l,c]),{paginatedItems:R,paginationProps:i}=q({pageParam:"perPage",defaultPageSize:y,items:h}),D=a.levels.length>y;return s===void 0||c===void 0?o(X,{}):!m.length||!f.length?o(Q,{title:"No failing checks",body:"There are no failing checks found."}):g(L,{children:[g(O,{onSortChange:x,sortDescriptor:{direction:u,column:l},children:[g(j,{children:[o(P,{id:"compliance",allowsSorting:!0,style:{width:"8%"},children:"Compliance"}),o(P,{id:"name",allowsSorting:!0,isRowHeader:!0,style:{width:"72%"},children:"Name"}),o(P,{id:"failures",allowsSorting:!0,style:{width:"20%"},children:"Failures"})]}),o(U,{children:R.map(({check:e,failedCount:t})=>{const r=T(t,c.numberOfEntities);return g($,{onAction:()=>N(I({trackId:a.id,checkId:e.id})),children:[o(b,{leadingIcon:o("div",{className:E.circularProgressbar,title:`${r}%`,children:o(W,{value:r,strokeWidth:12,styles:{path:{stroke:"var(--bui-fg-danger)"},trail:{stroke:'rgba(var("--bui-fg-secondary"), 0.25)'}}})}),title:`${r}%`}),o(b,{title:e.name}),o(b,{title:`${new Intl.NumberFormat().format(t??0)} failing`})]},e.id)})})]}),D&&o(H,{totalCount:h.length,offset:i.offset,hasNextPage:i.offset+i.pageSize<(h.length??0),hasPreviousPage:i.offset>0,onNextPage:i.onNextPage,onPreviousPage:i.onPreviousPage,onPageSizeChange:i.onPageSizeChange,pageSize:i.pageSize})]})};export{te as TopFailingChecksTableBUI};
2
2
  //# sourceMappingURL=TopFailingChecksTableBUI.esm.js.map
@@ -1,2 +1,2 @@
1
- import{jsxs as c,jsx as r}from"react/jsx-runtime";import{Box as s,Flex as i,Text as t,Card as u,CardBody as m}from"@backstage/ui";import{makeStyles as p}from"@material-ui/core";import{RiCheckLine as h}from"@remixicon/react";import{Alert as v}from"../../../Alert/Alert.esm.js";import{IntegrationLogoBUI as b}from"../../../CollectorsPage/IntegrationLogoBUI.esm.js";import{PROVIDERS as g,INTEGRATION_ALIASES as a}from"../../utils.esm.js";const f=p(()=>({container:{margin:"var(--bui-space-8) 0"},card:{cursor:"pointer",border:"1px solid transparent",transition:"border-color 150ms ease","&:hover":{borderColor:"var(--bui-fg-primary)"}},cardSelected:{borderColor:"var(--bui-fg-success)",boxShadow:"0 0 0 1px var(--bui-color-success)",backgroundColor:"var(--bui-bg-success)"},cardDisabled:{cursor:"default",pointerEvents:"none"},providers:{width:"100%"},provider:{width:"100%"},providerIcon:{width:"7%",height:"100%",padding:"var(--bui-space-2)",backgroundColor:"var(--bui-bg-neutral-1)",borderRadius:"var(--bui-radius-3)"},providerIconSelected:{backgroundColor:"var(--bui-fg-success)"},providerContent:{width:"93%",marginLeft:"var(--bui-space-4)"},checkmarkIcon:{color:"var(--bui-fg-success)",width:"18px",height:"18px"}})),S=({selectedProvider:d,onSelect:l})=>{const e=f();return c(s,{className:e.container,children:[c(i,{direction:"column",align:"center",justify:"center",mb:"8",children:[r(t,{variant:"title-small",weight:"bold",children:"Select Source Control Provider"}),r(t,{color:"secondary",children:"Select the source control provider used by your organization."})]}),r(v,{title:"Source control provider",variant:"info",children:"Your source control provider determines which integration the checks will depend on. You can update this later."}),r(i,{align:"center",justify:"center",direction:"column",className:e.providers,children:g.map(o=>{const n=a[o.name]===d;return r(u,{onClick:()=>!n&&l(o.name),className:[e.card,n&&e.cardSelected,n&&e.cardDisabled].filter(Boolean).join(" "),children:r(m,{children:c(i,{align:"center",justify:"between",className:e.provider,children:[r(i,{align:"center",justify:"center",className:[e.providerIcon,n&&e.providerIconSelected].filter(Boolean).join(" "),children:r(b,{integrationId:a[o.name]??"",size:"medium"})}),c(i,{direction:"column",gap:"1",className:e.providerContent,children:[c(i,{gap:"1",align:"center",children:[r(t,{variant:"body-large",weight:"bold",children:o.name}),n&&r(h,{className:e.checkmarkIcon})]}),r(t,{variant:"body-small",color:"secondary",children:o.description})]})]})})},o.name)})})]})};export{S as SelectProviderStep};
1
+ import{jsxs as c,jsx as e}from"react/jsx-runtime";import{Box as s,Flex as i,Text as a,Card as m,CardBody as u}from"@backstage/ui";import{makeStyles as p}from"@material-ui/core";import{RiCheckLine as h}from"@remixicon/react";import{Alert as v}from"../../../Alert/Alert.esm.js";import{IntegrationLogoBUI as b}from"../../../CollectorsPage/IntegrationLogoBUI.esm.js";import{PROVIDERS as g,INTEGRATION_ALIASES as t}from"../../utils.esm.js";const f=p(()=>({container:{margin:"var(--bui-space-8) 0"},card:{cursor:"pointer",border:"1px solid transparent",transition:"border-color 150ms ease","&:hover":{borderColor:"var(--bui-fg-primary)"}},cardSelected:{borderColor:"var(--bui-fg-success)",boxShadow:"0 0 0 1px var(--bui-color-success)",backgroundColor:"var(--bui-bg-success)"},cardDisabled:{cursor:"default",pointerEvents:"none"},providers:{width:"100%"},provider:{width:"100%"},providerIcon:{width:"7%",height:"100%",padding:"var(--bui-space-2)",backgroundColor:"var(--bui-bg-neutral-1)",borderRadius:"var(--bui-radius-3)"},providerIconSelected:{backgroundColor:"var(--bui-fg-success)"},providerContent:{width:"93%",marginLeft:"var(--bui-space-4)"},checkmarkIcon:{color:"var(--bui-fg-success)",width:"18px",height:"18px"}})),S=({selectedProvider:d,onSelect:l})=>{const r=f();return c(s,{className:r.container,children:[c(i,{direction:"column",align:"center",justify:"center",mb:"8",children:[e(a,{variant:"title-small",weight:"bold",children:"Select Source Control Provider"}),e(a,{color:"secondary",children:"Select the source control provider used by your organization."})]}),e(v,{title:"Source control provider",variant:"info",children:"Your source control provider determines which integration the checks will depend on. You can update this later."}),e(i,{align:"center",justify:"center",direction:"column",className:r.providers,children:g.map(o=>{const n=t[o.name]===d;return e(m,{onPress:()=>{n||l(o.name)},label:o.name,className:[r.card,n&&r.cardSelected,n&&r.cardDisabled].filter(Boolean).join(" "),children:e(u,{children:c(i,{align:"center",justify:"between",className:r.provider,children:[e(i,{align:"center",justify:"center",className:[r.providerIcon,n&&r.providerIconSelected].filter(Boolean).join(" "),children:e(b,{integrationId:t[o.name]??"",size:"medium"})}),c(i,{direction:"column",gap:"1",className:r.providerContent,children:[c(i,{gap:"1",align:"center",children:[e(a,{variant:"body-large",weight:"bold",children:o.name}),n&&e(h,{className:r.checkmarkIcon})]}),e(a,{variant:"body-small",color:"secondary",children:o.description})]})]})})},o.name)})})]})};export{S as SelectProviderStep};
2
2
  //# sourceMappingURL=SelectProviderStep.esm.js.map
@@ -1,2 +1,2 @@
1
- import{zodResolver as y}from"@hookform/resolvers/zod";import{useMemo as k,useEffect as R}from"react";import{useForm as T}from"react-hook-form";import{v4 as F}from"uuid";import{useTrackFormContext as g}from"../../../contexts/TrackFormContext.esm.js";import"../../../contexts/CheckFormContext.esm.js";import"../../../contexts/CampaignFormContext.esm.js";import"react/jsx-runtime";import{useLoggedInUser as h}from"../../../contexts/UserProvider.esm.js";import{BadgeVariant as E}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 w}from"../../../hooks/useConfirmationModal.esm.js";import"react-router-dom";import"react-use/lib/useLocalStorage";import"react-use/lib/useAsync";import"../../ChecksTable/utils.esm.js";import"react-use/lib/useAsyncRetry";import{useGetChecksMap as L}from"../../../hooks/tracks/useGetChecksMap.esm.js";import{mapInputFilterToFormFilters as l,mapFiltersToCatalogFilter as c}from"../../Filter/utils.esm.js";import"../../Filter/FilterComponent.esm.js";import{emptyFilters as f}from"../../Filter/types.esm.js";import{trackFormSchema as M}from"./validation.esm.js";const u={detailsStep:{name:"",description:"",ownerEntityRef:"",badgeType:"status",draft:!1},levelsStep:{levels:[{name:"Level 1",description:"",checks:[]}]},filtersStep:{include:[f()],exclude:[f()]}},S=({name:e,description:i,ownerEntityRef:a,filter:r,levels:n,documentationURL:t,badge:p,exclude:o,draft:s})=>({detailsStep:{name:e,ownerEntityRef:a,description:i??"",documentationURL:t??void 0,badgeType:p?.variant===E.Status?"status":"medal",draft:s??!1},levelsStep:{levels:n?.map(m=>({name:m.name??(m.ordinal?`Level ${m.ordinal}`:"Level 1"),description:m.description??"",checks:m.checks.map(d=>({id:d.id,name:d.name??d.id,description:d.description??""}))}))||[]},filtersStep:{include:l(r),exclude:l(o)}}),v=(e,i,a)=>({id:a?.id??F(),ownerEntityRef:e.detailsStep.ownerEntityRef,description:e.detailsStep.description,name:e.detailsStep.name,documentationURL:e.detailsStep.documentationURL??"",badgeType:e.detailsStep.badgeType,type:a?.type??"standard",levels:e.levelsStep.levels?.map((r,n)=>({ordinal:n+1,name:r.name??"",description:r.description??"",checks:r.checks.map(t=>{const p=i[t.id];if(p)return p;const o=a?.levels.flatMap(s=>s.checks).find(s=>s.id===t.id);return o?{id:o.id,name:o.name??t.name,description:o.description??t.description}:{id:t.id,name:t.name,description:t.description}})})),filter:c(e.filtersStep.include),exclude:c(e.filtersStep.exclude),draft:e.detailsStep.draft??!1}),x=e=>{const{selectedItem:i}=g(),a=k(()=>i?S(i):u,[i]),r=T({defaultValues:a,mode:"onChange",resolver:y(M)}),{userEntityRef:n}=h();R(()=>{!i&&n&&!r.getValues("detailsStep.ownerEntityRef")&&r.setValue("detailsStep.ownerEntityRef",n)},[i,n,r]);const{checksMap:t}=L(),{showModal:p}=w();return{formMethods:r,onSubmit:async o=>{if(!await p({title:"Save Track",message:`Are you sure you want to save track: ${o.detailsStep.name}?`,error:!1}))return;const s=v(o,t??{},i);e(s)}}};export{u as DEFAULT_TRACK_FORM_VALUES,v as mapTrackFormToInput,S as mapTrackToFormValues,x as useTrackForm};
1
+ import{standardSchemaResolver as y}from"@hookform/resolvers/standard-schema";import{useMemo as k,useEffect as R}from"react";import{useForm as T}from"react-hook-form";import{v4 as F}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 g}from"../../../contexts/UserProvider.esm.js";import{BadgeVariant as E}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 w}from"../../../hooks/useConfirmationModal.esm.js";import"react-router-dom";import"react-use/lib/useLocalStorage";import"react-use/lib/useAsync";import"../../ChecksTable/utils.esm.js";import"react-use/lib/useAsyncRetry";import{useGetChecksMap as L}from"../../../hooks/tracks/useGetChecksMap.esm.js";import{mapInputFilterToFormFilters as l,mapFiltersToCatalogFilter as c}from"../../Filter/utils.esm.js";import"../../Filter/FilterComponent.esm.js";import{emptyFilters as f}from"../../Filter/types.esm.js";import{trackFormSchema as M}from"./validation.esm.js";const u={detailsStep:{name:"",description:"",ownerEntityRef:"",badgeType:"status",draft:!1},levelsStep:{levels:[{name:"Level 1",description:"",checks:[]}]},filtersStep:{include:[f()],exclude:[f()]}},S=({name:e,description:i,ownerEntityRef:a,filter:r,levels:n,documentationURL:t,badge:m,exclude:o,draft:s})=>({detailsStep:{name:e,ownerEntityRef:a,description:i??"",documentationURL:t??void 0,badgeType:m?.variant===E.Status?"status":"medal",draft:s??!1},levelsStep:{levels:n?.map(p=>({name:p.name??(p.ordinal?`Level ${p.ordinal}`:"Level 1"),description:p.description??"",checks:p.checks.map(d=>({id:d.id,name:d.name??d.id,description:d.description??""}))}))||[]},filtersStep:{include:l(r),exclude:l(o)}}),v=(e,i,a)=>({id:a?.id??F(),ownerEntityRef:e.detailsStep.ownerEntityRef,description:e.detailsStep.description,name:e.detailsStep.name,documentationURL:e.detailsStep.documentationURL??"",badgeType:e.detailsStep.badgeType,type:a?.type??"standard",levels:e.levelsStep.levels?.map((r,n)=>({ordinal:n+1,name:r.name??"",description:r.description??"",checks:r.checks.map(t=>{const m=i[t.id];if(m)return m;const o=a?.levels.flatMap(s=>s.checks).find(s=>s.id===t.id);return o?{id:o.id,name:o.name??t.name,description:o.description??t.description}:{id:t.id,name:t.name,description:t.description}})})),filter:c(e.filtersStep.include),exclude:c(e.filtersStep.exclude),draft:e.detailsStep.draft??!1}),x=e=>{const{selectedItem:i}=h(),a=k(()=>i?S(i):u,[i]),r=T({defaultValues:a,mode:"onChange",resolver:y(M)}),{userEntityRef:n}=g();R(()=>{!i&&n&&!r.getValues("detailsStep.ownerEntityRef")&&r.setValue("detailsStep.ownerEntityRef",n)},[i,n,r]);const{checksMap:t}=L(),{showModal:m}=w();return{formMethods:r,onSubmit:async o=>{if(!await m({title:"Save Track",message:`Are you sure you want to save track: ${o.detailsStep.name}?`,error:!1}))return;const s=v(o,t??{},i);e(s)}}};export{u as DEFAULT_TRACK_FORM_VALUES,v as mapTrackFormToInput,S as mapTrackToFormValues,x as useTrackForm};
2
2
  //# sourceMappingURL=useTrackForm.esm.js.map
@@ -1,2 +1,2 @@
1
- import{LevelDetailsSchema as t,TrackDetailsSchema as r}from"@spotify/backstage-plugin-soundcheck-common";import{z as e}from"zod";import{CHECK_IS_REQUIRED_MSG as m,formFiltersSchema as a}from"../../../utils/validation.esm.js";const c=e.strictObject({levels:e.array(t).min(1,m)}),i=e.strictObject({detailsStep:r,levelsStep:c,filtersStep:a});export{i as trackFormSchema};
1
+ import{LevelDetailsSchema as t,TrackDetailsSchema as r}from"@spotify/backstage-plugin-soundcheck-common";import{z as e}from"zod/v3";import{CHECK_IS_REQUIRED_MSG as m,formFiltersSchema as a}from"../../../utils/validation.esm.js";const c=e.strictObject({levels:e.array(t).min(1,m)}),i=e.strictObject({detailsStep:r,levelsStep:c,filtersStep:a});export{i as trackFormSchema};
2
2
  //# sourceMappingURL=validation.esm.js.map
@@ -1,2 +1,2 @@
1
- import{jsx as t,jsxs as h,Fragment as fe}from"react/jsx-runtime";import{stringifyEntityRef as z,parseEntityRef as ge,RELATION_OWNED_BY as me,RELATION_PART_OF as ue}from"@backstage/catalog-model";import{useRouteRef as ye}from"@backstage/core-plugin-api";import{entityRouteRef as he,useEntityPresentation as we,getEntityRelations as U,humanizeEntityRef as Q}from"@backstage/plugin-catalog-react";import{TableRoot as Pe,TableHeader as Se,Column as p,TableBody as ke,TablePagination as Re,Row as Ie,Flex as $,CellText as C,Box as q,Text as Ee,CellProfile as Te}from"@backstage/ui";import{makeStyles as Ce}from"@material-ui/core";import{compact as Be,uniq as be}from"lodash";import{useState as N,useMemo as c,useEffect as J,useCallback as A}from"react";import{useNavigate as ve}from"react-router-dom";import{TrackEntityField as l,Direction as d}from"../../../graphql/generated/index.esm.js";import{useEntitiesByRefs as xe}from"../../../hooks/catalog/useEntitiesByRefs.esm.js";import{useProfileImages as De}from"../../../hooks/catalog/useProfileImages.esm.js";import{useTrackEntities as ze}from"../../../hooks/entities/useTrackEntities.esm.js";import{useSortSearchParams as Ne}from"../../../hooks/useSortSearchParams.esm.js";import{getPercentage as k}from"../../../utils/formatters.esm.js";import{getTrackStatusTotal as Ae}from"../../../utils/tracks.esm.js";import{CertificationBadge as Le}from"../../Badges/CertificationBadge.esm.js";import{CustomCell as W}from"../../CustomCell/CustomCell.esm.js";import"../../EmptyState/EmptyState.esm.js";import{EmptyStateBUI as Oe}from"../../EmptyState/EmptyStateBUI.esm.js";import"@backstage/plugin-permission-react";import"@remixicon/react";import"@spotify/backstage-plugin-soundcheck-common";import"../../../routes.esm.js";import{LoadingTableSkeleton as Fe}from"../../LoadingTableSkeleton/LoadingTableSkeleton.esm.js";import{StatusBar as _e}from"../../StatusBar/StatusBar.esm.js";import{toTrackEntityRow as je}from"./utils.esm.js";const X=10,Y=f=>{const{lifecycles:g,owners:m,types:u,systems:y}=f,w=g?.length?{"spec.lifecycle":g}:void 0,B=m?.length?{"relations.ownedBy":m}:void 0,R=u?.length?{"spec.type":u}:void 0,I=y?.length?{"relations.partOf":y}:void 0;return{...w,...B,...R,...I}},Me=Ce(()=>({tableContainer:{display:"flex",flexDirection:"column",height:"100%"},statusPercent:{width:"var(--bui-space-12)"},statusBar:{width:"100%"}})),L={name:l.Name,owner:l.Owner,certificationLevel:l.CertificationLevel,checkPassRate:l.CheckPassRate,system:l.System,type:l.Type,lifecycle:l.Lifecycle},He=({track:f,lifecycles:g,owners:m,types:u,systems:y,certificationStatus:w,isCampaign:B})=>{const R=Me(),I=ve(),{updateSortParams:O,searchParams:P}=Ne(),F=ye(he),[b,_]=N(()=>{const e=P.get("sortDirection");return e==="ascending"?d.Asc:e==="descending"?d.Desc:d.Asc}),[E,j]=N(()=>{const e=P.get("sort");return e&&L[e]?e:"name"}),Z=b===d.Asc?"ascending":"descending",[r,v]=N({orderBy:{field:l.CheckPassRate,direction:d.Desc},filter:Y({lifecycles:g,owners:m,types:u,systems:y}),pageInfo:{page:0,pageSize:X,direction:"forward",cursor:null}}),{data:s,isLoading:G}=ze({trackId:f?.id??"",orderBy:r.orderBy,filter:r.filter,[r.pageInfo.direction==="forward"?"first":"last"]:r.pageInfo.pageSize,[r.pageInfo.direction==="forward"?"after":"before"]:r.pageInfo.cursor,certificationStatus:w}),S=c(()=>s?.trackEntities.edges??[],[s]),V=c(()=>s?.trackEntities.totalCount??0,[s])>X,ee=S.map(e=>e.node.entityRef)??[],{data:x,isLoading:te}=xe({entityRefs:ee}),M=c(()=>!f||!S?.length||!x?.items?.length?[]:Be(S.map(e=>{const i=x.items.find(a=>!!a&&z(a)===e.node.entityRef);return i?je({trackDetails:e.node,track:f,entity:i}):void 0})),[S,x?.items,f]),ie=be(M.flatMap(e=>e.entity.relations?.filter(({type:i,targetRef:a})=>i==="ownedBy"&&a).map(i=>i.targetRef)||[])),{profileImageMap:re}=De(ie);J(()=>{const e=P.get("sortDirection");(e==="ascending"||e==="descending")&&_(e==="ascending"?d.Asc:d.Desc);const i=P.get("sort");i&&L[i]&&j(i)},[P]),J(()=>{let e;E?e={field:L[E]??l.Name,direction:b}:e=void 0,v(i=>({...i,pageInfo:{...i.pageInfo,page:0,cursor:null},orderBy:e,filter:Y({lifecycles:g,owners:m,types:u,systems:y}),certificationStatus:w}))},[v,E,b,w,g,m,y,u]);const ae=A(e=>{const i=ge(z(e)),a=F(i);I(`${a}/soundcheck`)},[I,F]),D=A((e,i)=>{const a=e>r.pageInfo.page?"forward":"backward",T=a==="forward"?s?.trackEntities.pageInfo.endCursor??null:s?.trackEntities.pageInfo.startCursor??null;v({...r,pageInfo:{page:e,pageSize:i,direction:a,cursor:T}})},[s,r]),ne=A(({direction:e,column:i})=>{j(String(i)),_(e==="ascending"?d.Desc:d.Asc),O({sort:String(i),sortDirection:e})},[O]),oe=({row:e})=>{const{primaryTitle:i}=we(z(e.entity)),a=U(e.entity,me).map(o=>Q(o,{defaultKind:o.kind})).join(", "),T=e.entity.relations?.find(({type:o})=>o==="ownedBy")?.targetRef,se=U(e.entity,ue,{kind:"system"}).map(o=>Q(o,{defaultKind:"system"})).join(", ");let H;T&&(H=re?.[T]);const n=c(()=>Ae(e.status),[e.status]),K=c(()=>{let o;return e.status?.allPassPercentage!==null&&e.status?.allPassPercentage!==void 0?o=e.status.allPassPercentage:e.status&&(o=k(e.status.passed+e.status.exempt,n)),o},[e.status,n]),ce=c(()=>k(e.status?.failed,n),[e.status,n]),le=c(()=>k(e.status?.warning,n),[e.status,n]),de=c(()=>k(e.status?.notReported,n),[e.status,n]),pe=c(()=>k(e.status?.error,n),[e.status,n]);return h(Ie,{onAction:()=>ae(e.entity),children:[t(W,{children:t($,{children:t(Le,{badge:e.badge,trackType:B?"campaign":void 0})})}),t(C,{title:i}),t(W,{children:h($,{align:"center",gap:"2",children:[t(q,{className:R.statusPercent,children:h(Ee,{children:[K,"%"]})}),t(q,{className:R.statusBar,children:t(_e,{passedPercent:K,failedPercent:ce,warningPercent:le,notReportedPercent:de,errorPercent:pe})})]})}),t(C,{title:se}),t(C,{title:e.entity.spec?.type}),t(C,{title:e.entity.spec?.lifecycle}),t(Te,{name:a,src:H??i})]},e.id)};return G||te?t(Fe,{}):S.length?h(fe,{children:[h(Pe,{onSortChange:ne,sortDescriptor:{direction:Z,column:E},children:[h(Se,{children:[t(p,{id:"state",style:{width:"5%"}}),t(p,{id:"name",allowsSorting:!0,isRowHeader:!0,style:{width:"25%"},children:"Name"}),t(p,{id:"checkPassRate",style:{width:"15%"},children:"Checks"}),t(p,{id:"system",allowsSorting:!0,style:{width:"20%"},children:"System"}),t(p,{id:"type",allowsSorting:!0,style:{width:"10%"},children:"Type"}),t(p,{id:"lifecycle",allowsSorting:!0,style:{width:"10%"},children:"Lifecycle"}),t(p,{id:"owner",allowsSorting:!0,style:{width:"15%"},children:"Owner"})]}),t(ke,{children:M.map(e=>t(oe,{row:e},e.id))})]}),V&&t(Re,{showPageSizeOptions:!0,totalCount:s?.trackEntities.totalCount,pageSize:r.pageInfo.pageSize,offset:r.pageInfo.page*r.pageInfo.pageSize,onPreviousPage:()=>{const e=r.pageInfo.page-1;D(e,r.pageInfo.pageSize)},onNextPage:()=>{const e=r.pageInfo.page+1;D(e,r.pageInfo.pageSize)},onPageSizeChange:e=>{D(r.pageInfo.page,e)},hasNextPage:(r.pageInfo.page+1)*r.pageInfo.pageSize<(s?.trackEntities.totalCount??0),hasPreviousPage:r.pageInfo.page>0})]}):t(Oe,{title:"No track entities found",body:"There are no track entities found."})};export{He as TrackEntitiesTableBUI};
1
+ import{jsx as t,jsxs as g,Fragment as fe}from"react/jsx-runtime";import{stringifyEntityRef as N,parseEntityRef as ge,RELATION_OWNED_BY as ue,RELATION_PART_OF as ye}from"@backstage/catalog-model";import{useRouteRef as he}from"@backstage/core-plugin-api";import{entityRouteRef as we,useEntityPresentation as Pe,getEntityRelations as H,humanizeEntityRef as $}from"@backstage/plugin-catalog-react";import{TableRoot as Se,TableHeader as ke,Column as d,TableBody as Ie,TablePagination as Re,Row as Ce,Flex as Q,CellText as h,Box as q,Text as Ee,CellProfile as Te}from"@backstage/ui";import{makeStyles as Be}from"@material-ui/core";import{compact as be,uniq as De}from"lodash";import{useState as x,useMemo as c,useEffect as G,useCallback as z}from"react";import{useNavigate as Ne}from"react-router-dom";import{TrackEntityField as l,Direction as p}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{DEFAULT_PAGE_SIZE as W}from"../../../hooks/usePagination.esm.js";import"react-use/lib/useLocalStorage";import{useSortSearchParams as xe}from"../../../hooks/useSortSearchParams.esm.js";import"react-use/lib/useAsync";import"../../ChecksTable/utils.esm.js";import"react-use/lib/useAsyncRetry";import{useEntitiesByRefs as ze}from"../../../hooks/catalog/useEntitiesByRefs.esm.js";import{useProfileImages as Ae}from"../../../hooks/catalog/useProfileImages.esm.js";import{useTrackEntities as ve}from"../../../hooks/entities/useTrackEntities.esm.js";import{getPercentage as w}from"../../../utils/formatters.esm.js";import{getTrackStatusTotal as Le}from"../../../utils/tracks.esm.js";import{CertificationBadge as Oe}from"../../Badges/CertificationBadge.esm.js";import{CustomCell as X}from"../../CustomCell/CustomCell.esm.js";import"../../EmptyState/EmptyState.esm.js";import{EmptyStateBUI as Fe}from"../../EmptyState/EmptyStateBUI.esm.js";import"@backstage/plugin-permission-react";import"@remixicon/react";import"../../../routes.esm.js";import"../../FilterSidebar/FilterSidebar.esm.js";import"../../FilterSidebar/StateFilter.esm.js";import{toFilter as Y}from"../../FilterSidebar/util.esm.js";import{LoadingTableSkeleton as _e}from"../../LoadingTableSkeleton/LoadingTableSkeleton.esm.js";import{StatusBar as je}from"../../StatusBar/StatusBar.esm.js";import{toTrackEntityRow as Ke}from"./utils.esm.js";const Me=Be(()=>({tableContainer:{display:"flex",flexDirection:"column",height:"100%"},statusPercent:{width:"var(--bui-space-12)"},statusBar:{width:"100%"}})),A={name:l.Name,owner:l.Owner,certificationLevel:l.CertificationLevel,checkPassRate:l.CheckPassRate,system:l.System,type:l.Type,lifecycle:l.Lifecycle},Ue=({track:m,lifecycles:S,owners:k,types:I,systems:R,kinds:C,certificationStatus:E,isCampaign:Z})=>{const v=Me(),L=Ne(),{updateSortParams:O,searchParams:u}=xe(),F=he(we),[T,_]=x(()=>{const e=u.get("sortDirection");return e==="ascending"?p.Asc:e==="descending"?p.Desc:p.Asc}),[P,j]=x(()=>{const e=u.get("sort");return e&&A[e]?e:"name"}),J=T===p.Asc?"ascending":"descending",[r,B]=x({orderBy:{field:l.CheckPassRate,direction:p.Desc},filter:Y({lifecycles:S,owners:k,types:I,systems:R,kinds:C}),pageInfo:{page:0,pageSize:W,direction:"forward",cursor:null}}),{data:s,isLoading:V}=ve({trackId:m?.id??"",orderBy:r.orderBy,filter:r.filter,[r.pageInfo.direction==="forward"?"first":"last"]:r.pageInfo.pageSize,[r.pageInfo.direction==="forward"?"after":"before"]:r.pageInfo.cursor,certificationStatus:E}),y=c(()=>s?.trackEntities.edges??[],[s]),ee=c(()=>s?.trackEntities.totalCount??0,[s])>W,te=y.map(e=>e.node.entityRef)??[],{data:b,isLoading:ie}=ze({entityRefs:te}),K=c(()=>!m||!y?.length||!b?.items?.length?[]:be(y.map(e=>{const i=b.items.find(o=>!!o&&N(o)===e.node.entityRef);return i?Ke({trackDetails:e.node,track:m,entity:i}):void 0})),[y,b?.items,m]),re=De(K.flatMap(e=>e.entity.relations?.filter(({type:i,targetRef:o})=>i==="ownedBy"&&o).map(i=>i.targetRef)||[])),{profileImageMap:oe}=Ae(re);G(()=>{const e=u.get("sortDirection");(e==="ascending"||e==="descending")&&_(e==="ascending"?p.Asc:p.Desc);const i=u.get("sort");i&&A[i]&&j(i)},[u]),G(()=>{let e;P?e={field:A[P]??l.Name,direction:T}:e=void 0,B(i=>({...i,pageInfo:{...i.pageInfo,page:0,cursor:null},orderBy:e,filter:Y({lifecycles:S,owners:k,types:I,systems:R,kinds:C}),certificationStatus:E}))},[B,P,T,E,S,k,R,C,I]);const ae=z(e=>{const i=ge(N(e)),o=F(i),f=m?.id?`/tracks/${m.id}`:"";L(`${o}/soundcheck${f}`)},[L,F,m?.id]),D=z((e,i)=>{const o=e>r.pageInfo.page?"forward":"backward",f=o==="forward"?s?.trackEntities.pageInfo.endCursor??null:s?.trackEntities.pageInfo.startCursor??null;B({...r,pageInfo:{page:e,pageSize:i,direction:o,cursor:f}})},[s,r]),ne=z(({direction:e,column:i})=>{j(String(i)),_(e==="ascending"?p.Desc:p.Asc),O({sort:String(i),sortDirection:e})},[O]),se=({row:e})=>{const{primaryTitle:i}=Pe(N(e.entity)),o=H(e.entity,ue).map(n=>$(n,{defaultKind:n.kind})).join(", "),f=e.entity.relations?.find(({type:n})=>n==="ownedBy")?.targetRef,ce=H(e.entity,ye,{kind:"system"}).map(n=>$(n,{defaultKind:"system"})).join(", ");let M;f&&(M=oe?.[f]);const a=c(()=>Le(e.status),[e.status]),U=c(()=>{let n;return e.status?.allPassPercentage!==null&&e.status?.allPassPercentage!==void 0?n=e.status.allPassPercentage:e.status&&(n=w(e.status.passed+e.status.exempt,a)),n},[e.status,a]),le=c(()=>w(e.status?.failed,a),[e.status,a]),pe=c(()=>w(e.status?.warning,a),[e.status,a]),de=c(()=>w(e.status?.notReported,a),[e.status,a]),me=c(()=>w(e.status?.error,a),[e.status,a]);return g(Ce,{onAction:()=>ae(e.entity),children:[t(X,{children:t(Q,{children:t(Oe,{badge:e.badge,trackType:Z?"campaign":void 0})})}),t(h,{title:i}),t(X,{children:g(Q,{align:"center",gap:"2",children:[t(q,{className:v.statusPercent,children:g(Ee,{children:[U,"%"]})}),t(q,{className:v.statusBar,children:t(je,{passedPercent:U,failedPercent:le,warningPercent:pe,notReportedPercent:de,errorPercent:me})})]})}),t(h,{title:ce}),t(h,{title:e.entity.spec?.type}),t(h,{title:e.entity.spec?.lifecycle}),t(h,{title:e.entity.kind.toLowerCase()}),t(Te,{name:o,src:M??i})]},e.id)};return V||ie?t(_e,{}):y.length?g(fe,{children:[g(Se,{onSortChange:ne,sortDescriptor:{direction:J,column:P},children:[g(ke,{children:[t(d,{id:"state",style:{width:"5%"}}),t(d,{id:"name",allowsSorting:!0,isRowHeader:!0,style:{width:"20%"},children:"Name"}),t(d,{id:"checkPassRate",style:{width:"15%"},children:"Checks"}),t(d,{id:"system",allowsSorting:!0,style:{width:"18%"},children:"System"}),t(d,{id:"type",allowsSorting:!0,style:{width:"9%"},children:"Type"}),t(d,{id:"lifecycle",allowsSorting:!0,style:{width:"9%"},children:"Lifecycle"}),t(d,{id:"kind",allowsSorting:!0,style:{width:"9%"},children:"Kind"}),t(d,{id:"owner",allowsSorting:!0,style:{width:"15%"},children:"Owner"})]}),t(Ie,{children:K.map(e=>t(se,{row:e},e.id))})]}),ee&&t(Re,{showPageSizeOptions:!0,totalCount:s?.trackEntities.totalCount,pageSize:r.pageInfo.pageSize,offset:r.pageInfo.page*r.pageInfo.pageSize,onPreviousPage:()=>{const e=r.pageInfo.page-1;D(e,r.pageInfo.pageSize)},onNextPage:()=>{const e=r.pageInfo.page+1;D(e,r.pageInfo.pageSize)},onPageSizeChange:e=>{D(r.pageInfo.page,e)},hasNextPage:(r.pageInfo.page+1)*r.pageInfo.pageSize<(s?.trackEntities.totalCount??0),hasPreviousPage:r.pageInfo.page>0})]}):t(Fe,{title:"No track entities found",body:"There are no track entities found."})};export{Ue as TrackEntitiesTableBUI};
2
2
  //# sourceMappingURL=TrackEntitiesTableBUI.esm.js.map