@spotify/backstage-plugin-soundcheck 0.22.3 → 0.22.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/dist/blueprints/IntegrationPageBlueprint.esm.js +1 -1
  3. package/dist/components/CampaignCreatePage/CampaignCreatePage.esm.js +1 -1
  4. package/dist/components/CampaignForm/hooks/useCampaignForm.esm.js +1 -1
  5. package/dist/components/CampaignPage/CampaignPageBUI.esm.js +1 -1
  6. package/dist/components/CampaignPage/CampaignTechInsightsExplorerPage.esm.js +1 -1
  7. package/dist/components/CampaignsPage/CampaignListPageBUI.esm.js +1 -1
  8. package/dist/components/CampaignsPage/EditCampaignView.esm.js +1 -1
  9. package/dist/components/CertificationAccordion/CertificationAccordion.esm.js +1 -1
  10. package/dist/components/CertificationSidebar/CertificationSidebar.esm.js +1 -1
  11. package/dist/components/CertificationSidebar/Check.esm.js +1 -1
  12. package/dist/components/CertificationSidebar/ExemptionJustificationDialog.esm.js +1 -1
  13. package/dist/components/CertificationsPage/CertificationTab.esm.js +1 -1
  14. package/dist/components/CertificationsPage/CertificationTabs.esm.js +1 -1
  15. package/dist/components/CertificationsPage/CertificationsPage.esm.js +1 -1
  16. package/dist/components/CertificationsPage/Playlist/PlaylistContext.esm.js +1 -1
  17. package/dist/components/CheckCreatePage/CheckCreatePage.esm.js +1 -1
  18. package/dist/components/CheckDetails/CheckDetails.esm.js +1 -1
  19. package/dist/components/CheckForm/CheckForm.esm.js +1 -1
  20. package/dist/components/CheckForm/FormFields/RuleInput/Conditions/useRuleOptions.esm.js +1 -1
  21. package/dist/components/CheckForm/FormFields/RuleInput/RuleInputBox.esm.js +1 -1
  22. package/dist/components/CheckForm/Steps/CheckApplicabilityStep.esm.js +1 -1
  23. package/dist/components/CheckForm/Steps/CheckDetailsStep.esm.js +1 -1
  24. package/dist/components/CheckForm/Steps/CheckRulesStep.esm.js +1 -1
  25. package/dist/components/CheckForm/useCheckForm.esm.js +1 -1
  26. package/dist/components/CheckPage/CheckEditPage.esm.js +1 -1
  27. package/dist/components/CheckPage/CheckEditView.esm.js +1 -1
  28. package/dist/components/CheckPage/CheckPageBUI.esm.js +1 -1
  29. package/dist/components/CheckPage/ExemptionsTableBUI.esm.js +1 -1
  30. package/dist/components/CheckSelection/CheckSelection.esm.js +1 -1
  31. package/dist/components/ChecksPage/ChecksListPageBUI.esm.js +1 -1
  32. package/dist/components/ChecksTable/ChecksTable.esm.js +1 -1
  33. package/dist/components/ChecksTable/FixMeCell.esm.js +1 -1
  34. package/dist/components/ChecksTable/PullRequestsTable.esm.js +1 -1
  35. package/dist/components/CollectorPage/CollectorDetailsPageBUI.esm.js +1 -1
  36. package/dist/components/CollectorPage/CollectorDetailsPageDeprecated.esm.js +1 -1
  37. package/dist/components/CollectorPage/Configurators/AzureDevOps/AzureDevOpsConfigurator.esm.js +1 -1
  38. package/dist/components/CollectorPage/Configurators/BigQuery/BigQueryConfigurator.esm.js +1 -1
  39. package/dist/components/CollectorPage/Configurators/Catalog/CatalogConfigurator.esm.js +1 -1
  40. package/dist/components/CollectorPage/Configurators/DataDog/DataDogConfigurator.esm.js +1 -1
  41. package/dist/components/CollectorPage/Configurators/DataRegistry/DataRegistryConfigurator.esm.js +1 -1
  42. package/dist/components/CollectorPage/Configurators/Github/GithubConfigurator.esm.js +1 -1
  43. package/dist/components/CollectorPage/Configurators/Gitlab/GitlabConfigurator.esm.js +1 -1
  44. package/dist/components/CollectorPage/Configurators/HTTP/HttpConfigurator.esm.js +1 -1
  45. package/dist/components/CollectorPage/Configurators/Jira/JiraConfigurator.esm.js +1 -1
  46. package/dist/components/CollectorPage/Configurators/Kubernetes/KubernetesConfigurator.esm.js +1 -1
  47. package/dist/components/CollectorPage/Configurators/NewRelic/NewRelicConfigurator.esm.js +1 -1
  48. package/dist/components/CollectorPage/Configurators/PagerDuty/PagerDutyConfigurator.esm.js +1 -1
  49. package/dist/components/CollectorPage/Configurators/SCM/ScmConfigurator.esm.js +1 -1
  50. package/dist/components/CollectorPage/Configurators/SonarQube/SonarQubeConfigurator.esm.js +1 -1
  51. package/dist/components/CollectorsPage/IntegrationsListPageBUI.esm.js +1 -1
  52. package/dist/components/EntitySoundcheckCard/Card.esm.js +1 -1
  53. package/dist/components/FactExplorer/useFactOptions.esm.js +1 -1
  54. package/dist/components/GroupSelectorBUI/GroupSelectList.esm.js +1 -1
  55. package/dist/components/LevelUpParty/LevelUpParty.esm.js +1 -1
  56. package/dist/components/Menus/useCampaignActions.esm.js +1 -1
  57. package/dist/components/Menus/useCheckActions.esm.js +1 -1
  58. package/dist/components/Menus/useTrackActions.esm.js +1 -1
  59. package/dist/components/OverviewTable/ResultsTable.esm.js +1 -1
  60. package/dist/components/RefetchingIndicator/RefetchingIndicator.esm.js +1 -1
  61. package/dist/components/Router.esm.js +1 -1
  62. package/dist/components/SendCampaignNotificationDialog/SendCampaignNotificationDialogBUI.esm.js +1 -1
  63. package/dist/components/TableRowWithOwner/TableRowWithOwner.esm.js +1 -1
  64. package/dist/components/TechInsights/TechInsightsPageBUI.esm.js +1 -1
  65. package/dist/components/TechInsightsExplorerTable/TechInsightsExplorerTable.esm.js +1 -1
  66. package/dist/components/TopFailingChecksTable/TopFailingChecksTableBUI.esm.js +1 -1
  67. package/dist/components/TrackCreatePage/TrackCreatePage.esm.js +1 -1
  68. package/dist/components/TrackEditPage/TrackEditPage.esm.js +1 -1
  69. package/dist/components/TrackEditPage/TrackEditView.esm.js +1 -1
  70. package/dist/components/TrackForm/utils/useTrackForm.esm.js +1 -1
  71. package/dist/components/TrackPage/TrackPageBUI.esm.js +1 -1
  72. package/dist/components/TrackPage/TrackTechInsightsExplorerPage.esm.js +1 -1
  73. package/dist/components/TracksPage/TracksListPageBUI.esm.js +1 -1
  74. package/dist/components/ViewPullRequests/ViewPullRequests.esm.js +1 -1
  75. package/dist/contexts/UserProvider.esm.js +1 -1
  76. package/dist/hooks/fixMe/useFixMe.esm.js +1 -1
  77. package/dist/hooks/fixWithAika/useFixWithAika.esm.js +1 -1
  78. package/dist/hooks/groups/useGroupOptions.esm.js +1 -1
  79. package/dist/hooks/polling/usePolling.esm.js +2 -0
  80. package/dist/hooks/remedy/useRemediesForCheck.esm.js +1 -1
  81. package/dist/hooks/remedy/useRemediesForEntity.esm.js +1 -1
  82. package/package.json +1 -1
@@ -1,2 +1,2 @@
1
- import{jsxs as n,Fragment as b,jsx as o}from"react/jsx-runtime";import{zodResolver as h}from"@hookform/resolvers/zod";import{makeStyles as v,Paper as S,Divider as F}from"@material-ui/core";import{useForm as R,FormProvider as K}from"react-hook-form";import"@backstage/catalog-model";import"@backstage/core-plugin-api";import"@tanstack/react-query";import"../../../../api.esm.js";import"../../../../hooks/graphqlKeys.esm.js";import"@backstage/plugin-catalog-react";import"@spotify/backstage-plugin-soundcheck-common";import"react";import"../../../../hooks/useSoundcheckAlert.esm.js";import{useConfirmationModal as w}from"../../../../hooks/useConfirmationModal.esm.js";import{useNavigateBack as x}from"../../../../hooks/useNavigateBack.esm.js";import"react-router-dom";import"react-use/lib/useLocalStorage";import"../../../../graphql/generated/index.esm.js";import"react-use/lib/useAsync";import{useUpdateCollectorConfig as y}from"../../../../hooks/collectors/useUpdateCollectorConfig.esm.js";import{integrationsPageRouteRef as B}from"../../../../routes.esm.js";import{FooterButtons as D}from"../../../FooterButtons/FooterButtons.esm.js";import"../../../SoundcheckHeader/SoundcheckHeader.esm.js";import"../../../SoundcheckHeader/SoundcheckHeaderContext.esm.js";import{useHeader as L}from"../../../SoundcheckHeader/useHeader.esm.js";import{FactCollectionConfig as c}from"../Common/FactCollectionConfig.esm.js";import"../Common/CollectorConfigAlert.esm.js";import{defaultCollectorOption as N}from"../Common/CollectorOption.esm.js";import{collectorHeaderContent as O,confirmationModalContent as T}from"../Common/utils.esm.js";import{KubernetesFactDetails as j}from"./KubernetesFactDetails.esm.js";import{mapConfigToKubernetesCollectorConfig as k,defaultKubernetesConfig as I,K8S_COLLECTOR_FIELDS as M,mapKubernetesCollectorConfigToConfig as P}from"./utils.esm.js";import{customResourceFormSchema as E}from"./validation.esm.js";const H=v(t=>({spacer:{height:t.spacing(8),width:"100%"},section:{marginBottom:t.spacing(2)}})),V=({disabled:t,selectedCollector:e})=>{const r=R({defaultValues:e?k(e.config):I(),mode:"onChange",resolver:h(E)}),a=H(),{mutateAsync:p}=y(),[d,f]=x(B),{isValid:u}=r.formState,{showModal:C}=w(),s=async m=>{if(!await C(T(e)))return;const i=P(m);await p({collectorId:e.id,config:i})&&f()};return L(O(e)),n(b,{children:[o(S,{className:a.section,children:o(K,{...r,children:n("form",{onSubmit:r.handleSubmit(s),children:[Object.entries(M).map(([m,i],l,g)=>n("div",{children:[o(c,{name:m,label:i.label,description:i.description,disabled:t}),l<g.length-1&&o(F,{})]},l)),o(c,{name:"customResources",label:"Custom Resources",description:"Collect facts from a kubernetes custom resource associated with an entity.",disabled:t,FactDetailsComponent:j,multipleCollectors:{enable:!0,defaultConfig:N(e.config)}})]})})}),o("div",{className:a.section,children:o(D,{onCancel:d,saveButtonText:"Save",isLoading:!1,onSave:r.handleSubmit(s),disableSave:!u})})]})};export{V as KubernetesConfigurator};
1
+ import{jsxs as n,Fragment as b,jsx as o}from"react/jsx-runtime";import{zodResolver as h}from"@hookform/resolvers/zod";import{makeStyles as v,Paper as S,Divider as F}from"@material-ui/core";import{useForm as R,FormProvider as K}from"react-hook-form";import"@backstage/catalog-model";import"@backstage/core-plugin-api";import"@tanstack/react-query";import"../../../../api.esm.js";import"../../../../hooks/graphqlKeys.esm.js";import"@backstage/plugin-catalog-react";import"@spotify/backstage-plugin-soundcheck-common";import"react";import"../../../../hooks/useSoundcheckAlert.esm.js";import{useConfirmationModal as w}from"../../../../hooks/useConfirmationModal.esm.js";import{useNavigateBack as x}from"../../../../hooks/useNavigateBack.esm.js";import"react-router-dom";import"react-use/lib/useLocalStorage";import"react-use/lib/useAsync";import"../../../../graphql/generated/index.esm.js";import"react-use/lib/useAsyncRetry";import{useUpdateCollectorConfig as y}from"../../../../hooks/collectors/useUpdateCollectorConfig.esm.js";import{integrationsPageRouteRef as B}from"../../../../routes.esm.js";import{FooterButtons as D}from"../../../FooterButtons/FooterButtons.esm.js";import"../../../SoundcheckHeader/SoundcheckHeader.esm.js";import"../../../SoundcheckHeader/SoundcheckHeaderContext.esm.js";import{useHeader as L}from"../../../SoundcheckHeader/useHeader.esm.js";import{FactCollectionConfig as c}from"../Common/FactCollectionConfig.esm.js";import"../Common/CollectorConfigAlert.esm.js";import{defaultCollectorOption as N}from"../Common/CollectorOption.esm.js";import{collectorHeaderContent as O,confirmationModalContent as T}from"../Common/utils.esm.js";import{KubernetesFactDetails as j}from"./KubernetesFactDetails.esm.js";import{mapConfigToKubernetesCollectorConfig as k,defaultKubernetesConfig as I,K8S_COLLECTOR_FIELDS as M,mapKubernetesCollectorConfigToConfig as P}from"./utils.esm.js";import{customResourceFormSchema as E}from"./validation.esm.js";const H=v(t=>({spacer:{height:t.spacing(8),width:"100%"},section:{marginBottom:t.spacing(2)}})),V=({disabled:t,selectedCollector:e})=>{const r=R({defaultValues:e?k(e.config):I(),mode:"onChange",resolver:h(E)}),a=H(),{mutateAsync:p}=y(),[d,f]=x(B),{isValid:u}=r.formState,{showModal:C}=w(),s=async m=>{if(!await C(T(e)))return;const i=P(m);await p({collectorId:e.id,config:i})&&f()};return L(O(e)),n(b,{children:[o(S,{className:a.section,children:o(K,{...r,children:n("form",{onSubmit:r.handleSubmit(s),children:[Object.entries(M).map(([m,i],l,g)=>n("div",{children:[o(c,{name:m,label:i.label,description:i.description,disabled:t}),l<g.length-1&&o(F,{})]},l)),o(c,{name:"customResources",label:"Custom Resources",description:"Collect facts from a kubernetes custom resource associated with an entity.",disabled:t,FactDetailsComponent:j,multipleCollectors:{enable:!0,defaultConfig:N(e.config)}})]})})}),o("div",{className:a.section,children:o(D,{onCancel:d,saveButtonText:"Save",isLoading:!1,onSave:r.handleSubmit(s),disableSave:!u})})]})};export{V as KubernetesConfigurator};
2
2
  //# sourceMappingURL=KubernetesConfigurator.esm.js.map
@@ -1,2 +1,2 @@
1
- import{jsxs as m,Fragment as w,jsx as o}from"react/jsx-runtime";import{makeStyles as b,Paper as S,Divider as s}from"@material-ui/core";import{useForm as y,FormProvider as R}from"react-hook-form";import"@backstage/catalog-model";import"@backstage/core-plugin-api";import"@tanstack/react-query";import"../../../../api.esm.js";import"../../../../hooks/graphqlKeys.esm.js";import"@backstage/plugin-catalog-react";import"@spotify/backstage-plugin-soundcheck-common";import"react";import"../../../../hooks/useSoundcheckAlert.esm.js";import{useConfirmationModal as v}from"../../../../hooks/useConfirmationModal.esm.js";import{useNavigateBack as B}from"../../../../hooks/useNavigateBack.esm.js";import"react-router-dom";import"react-use/lib/useLocalStorage";import"../../../../graphql/generated/index.esm.js";import"react-use/lib/useAsync";import{useUpdateCollectorConfig as F}from"../../../../hooks/collectors/useUpdateCollectorConfig.esm.js";import{integrationsPageRouteRef as x}from"../../../../routes.esm.js";import{FooterButtons as P}from"../../../FooterButtons/FooterButtons.esm.js";import"../../../SoundcheckHeader/SoundcheckHeader.esm.js";import"../../../SoundcheckHeader/SoundcheckHeaderContext.esm.js";import{useHeader as E}from"../../../SoundcheckHeader/useHeader.esm.js";import{FactCollectionConfig as r}from"../Common/FactCollectionConfig.esm.js";import{CollectorConfigAlert as I}from"../Common/CollectorConfigAlert.esm.js";import{collectorHeaderContent as M,confirmationModalContent as T}from"../Common/utils.esm.js";import{mapConfigToNewRelicCollectorConfig as j,defaultNewRelicConfig as k,mapNewRelicCollectorConfigToConfig as A}from"./utils.esm.js";const H=b(i=>({spacer:{height:i.spacing(8),width:"100%"},section:{marginBottom:i.spacing(2)},form:{marginBottom:i.spacing(2)}})),U=({disabled:i,selectedCollector:e})=>{const a=y({defaultValues:e?j(e.config):k(),mode:"onChange"}),{formState:{errors:t},handleSubmit:c}=a,n=H(),p=!!t.entity||!!t.entitySearch||!!t.policiesSearch,{mutateAsync:d}=F(),[f,g]=B(x),{showModal:C}=v(),l=async h=>{if(!await C(T(e)))return;const N=A(h);await d({collectorId:e.id,config:N})&&g()};E(M(e));const u=!e.config?.apiKey;return m(w,{children:[o(I,{collectorName:"NewRelic",collectorId:e.id,invalidConfig:u,hasNonUIOptions:!0}),o(S,{className:n.form,children:o(R,{...a,children:m("form",{onSubmit:c(l),children:[o(r,{name:"entity",label:"Entity",description:"Collects details about New Relic entity with a specific id.",disabled:i}),o(s,{}),o(r,{name:"entitySearch",label:"Entity Search",description:"Collects details about New Relic entities with a specific tag.",disabled:i}),o(s,{}),o(r,{name:"policiesSearch",label:"Policies Search",description:"Collects details about New Relic policies for a specific account.",disabled:i})]})})}),o("div",{className:n.section,children:o(P,{onCancel:f,saveButtonText:"Save",isLoading:!1,onSave:c(l),disableSave:p})})]})};export{U as NewRelicConfigurator};
1
+ import{jsxs as m,Fragment as w,jsx as o}from"react/jsx-runtime";import{makeStyles as b,Paper as S,Divider as s}from"@material-ui/core";import{useForm as y,FormProvider as R}from"react-hook-form";import"@backstage/catalog-model";import"@backstage/core-plugin-api";import"@tanstack/react-query";import"../../../../api.esm.js";import"../../../../hooks/graphqlKeys.esm.js";import"@backstage/plugin-catalog-react";import"@spotify/backstage-plugin-soundcheck-common";import"react";import"../../../../hooks/useSoundcheckAlert.esm.js";import{useConfirmationModal as v}from"../../../../hooks/useConfirmationModal.esm.js";import{useNavigateBack as B}from"../../../../hooks/useNavigateBack.esm.js";import"react-router-dom";import"react-use/lib/useLocalStorage";import"react-use/lib/useAsync";import"../../../../graphql/generated/index.esm.js";import"react-use/lib/useAsyncRetry";import{useUpdateCollectorConfig as F}from"../../../../hooks/collectors/useUpdateCollectorConfig.esm.js";import{integrationsPageRouteRef as x}from"../../../../routes.esm.js";import{FooterButtons as P}from"../../../FooterButtons/FooterButtons.esm.js";import"../../../SoundcheckHeader/SoundcheckHeader.esm.js";import"../../../SoundcheckHeader/SoundcheckHeaderContext.esm.js";import{useHeader as E}from"../../../SoundcheckHeader/useHeader.esm.js";import{FactCollectionConfig as r}from"../Common/FactCollectionConfig.esm.js";import{CollectorConfigAlert as I}from"../Common/CollectorConfigAlert.esm.js";import{collectorHeaderContent as M,confirmationModalContent as T}from"../Common/utils.esm.js";import{mapConfigToNewRelicCollectorConfig as j,defaultNewRelicConfig as k,mapNewRelicCollectorConfigToConfig as A}from"./utils.esm.js";const H=b(i=>({spacer:{height:i.spacing(8),width:"100%"},section:{marginBottom:i.spacing(2)},form:{marginBottom:i.spacing(2)}})),U=({disabled:i,selectedCollector:t})=>{const a=y({defaultValues:t?j(t.config):k(),mode:"onChange"}),{formState:{errors:e},handleSubmit:c}=a,n=H(),p=!!e.entity||!!e.entitySearch||!!e.policiesSearch,{mutateAsync:d}=F(),[f,g]=B(x),{showModal:C}=v(),l=async h=>{if(!await C(T(t)))return;const N=A(h);await d({collectorId:t.id,config:N})&&g()};E(M(t));const u=!t.config?.apiKey;return m(w,{children:[o(I,{collectorName:"NewRelic",collectorId:t.id,invalidConfig:u,hasNonUIOptions:!0}),o(S,{className:n.form,children:o(R,{...a,children:m("form",{onSubmit:c(l),children:[o(r,{name:"entity",label:"Entity",description:"Collects details about New Relic entity with a specific id.",disabled:i}),o(s,{}),o(r,{name:"entitySearch",label:"Entity Search",description:"Collects details about New Relic entities with a specific tag.",disabled:i}),o(s,{}),o(r,{name:"policiesSearch",label:"Policies Search",description:"Collects details about New Relic policies for a specific account.",disabled:i})]})})}),o("div",{className:n.section,children:o(P,{onCancel:f,saveButtonText:"Save",isLoading:!1,onSave:c(l),disableSave:p})})]})};export{U as NewRelicConfigurator};
2
2
  //# sourceMappingURL=NewRelicConfigurator.esm.js.map
@@ -1,2 +1,2 @@
1
- import{jsxs as m,Fragment as D,jsx as o}from"react/jsx-runtime";import{zodResolver as P}from"@hookform/resolvers/zod";import{makeStyles as b,Paper as h,Divider as c}from"@material-ui/core";import{useForm as S,FormProvider as T}from"react-hook-form";import"@backstage/catalog-model";import"@backstage/core-plugin-api";import"@tanstack/react-query";import"../../../../api.esm.js";import"../../../../hooks/graphqlKeys.esm.js";import"@backstage/plugin-catalog-react";import"@spotify/backstage-plugin-soundcheck-common";import"react";import"../../../../hooks/useSoundcheckAlert.esm.js";import{useConfirmationModal as L}from"../../../../hooks/useConfirmationModal.esm.js";import{useNavigateBack as E}from"../../../../hooks/useNavigateBack.esm.js";import"react-router-dom";import"react-use/lib/useLocalStorage";import"../../../../graphql/generated/index.esm.js";import"react-use/lib/useAsync";import{useUpdateCollectorConfig as N}from"../../../../hooks/collectors/useUpdateCollectorConfig.esm.js";import{integrationsPageRouteRef as w}from"../../../../routes.esm.js";import{FooterButtons as F}from"../../../FooterButtons/FooterButtons.esm.js";import"../../../SoundcheckHeader/SoundcheckHeader.esm.js";import"../../../SoundcheckHeader/SoundcheckHeaderContext.esm.js";import{useHeader as I}from"../../../SoundcheckHeader/useHeader.esm.js";import{FactCollectionConfig as r}from"../Common/FactCollectionConfig.esm.js";import{CollectorConfigAlert as R}from"../Common/CollectorConfigAlert.esm.js";import{collectorHeaderContent as O,confirmationModalContent as k}from"../Common/utils.esm.js";import{IncidentsFactDetailsComponent as _}from"./IncidentsFactDetailsComponent.esm.js";import{mapConfigToPagerDutyCollectorConfig as x,defaultPagerDutyConfig as A,SERVICE_COLLECTOR_TYPE as B,STANDARDS_COLLECTOR_TYPE as M,INCIDENTS_COLLECTOR_TYPE as Y,incidentsCollectorConfig as j,mapPagerDutyCollectorConfigToConfig as H}from"./utils.esm.js";import{pagerDutyCollectorFormSchema as U}from"./validation.esm.js";const V=b(t=>({spacer:{height:t.spacing(8),width:"100%"},section:{marginBottom:t.spacing(2)}})),z=({disabled:t,selectedCollector:e})=>{const a=S({defaultValues:e?x(e.config):A(),mode:"onChange",resolver:P(U)}),{formState:{errors:i},handleSubmit:n}=a,l=V(),d=!!i.service||!!i.standards||!!i.incidents,{mutateAsync:p}=N(),[f,C]=E(w),{showModal:g}=L(),s=async v=>{if(!await g(k(e)))return;const y=H(v);await p({collectorId:e.id,config:y})&&C()};I(O(e));const u=!e.config?.token||!e.config?.server;return m(D,{children:[o(R,{collectorName:"PagerDuty",collectorId:e.id,invalidConfig:u,hasNonUIOptions:!0}),o(h,{className:l.section,children:o(T,{...a,children:m("form",{onSubmit:n(s),children:[o(r,{name:B.toLowerCase(),label:"Service",description:"Collects details about PagerDuty service linked to an entity.",disabled:t}),o(c,{}),o(r,{name:M.toLowerCase(),label:"Standards",description:"Collects details about standards applied to a PagerDuty service linked to an entity.",disabled:t}),o(c,{}),o(r,{name:Y.toLowerCase(),label:"Incidents",description:"Collects details about incidents associated with a PagerDuty service linked to an entity.",disabled:t,FactDetailsComponent:_,multipleCollectors:{enable:!0,defaultConfig:j(e.config)}})]})})}),o("div",{className:l.section,children:o(F,{onCancel:f,saveButtonText:"Save",isLoading:!1,onSave:n(s),disableSave:d})})]})};export{z as PagerDutyConfigurator};
1
+ import{jsxs as m,Fragment as D,jsx as o}from"react/jsx-runtime";import{zodResolver as P}from"@hookform/resolvers/zod";import{makeStyles as b,Paper as h,Divider as c}from"@material-ui/core";import{useForm as S,FormProvider as T}from"react-hook-form";import"@backstage/catalog-model";import"@backstage/core-plugin-api";import"@tanstack/react-query";import"../../../../api.esm.js";import"../../../../hooks/graphqlKeys.esm.js";import"@backstage/plugin-catalog-react";import"@spotify/backstage-plugin-soundcheck-common";import"react";import"../../../../hooks/useSoundcheckAlert.esm.js";import{useConfirmationModal as L}from"../../../../hooks/useConfirmationModal.esm.js";import{useNavigateBack as E}from"../../../../hooks/useNavigateBack.esm.js";import"react-router-dom";import"react-use/lib/useLocalStorage";import"react-use/lib/useAsync";import"../../../../graphql/generated/index.esm.js";import"react-use/lib/useAsyncRetry";import{useUpdateCollectorConfig as N}from"../../../../hooks/collectors/useUpdateCollectorConfig.esm.js";import{integrationsPageRouteRef as w}from"../../../../routes.esm.js";import{FooterButtons as F}from"../../../FooterButtons/FooterButtons.esm.js";import"../../../SoundcheckHeader/SoundcheckHeader.esm.js";import"../../../SoundcheckHeader/SoundcheckHeaderContext.esm.js";import{useHeader as I}from"../../../SoundcheckHeader/useHeader.esm.js";import{FactCollectionConfig as r}from"../Common/FactCollectionConfig.esm.js";import{CollectorConfigAlert as R}from"../Common/CollectorConfigAlert.esm.js";import{collectorHeaderContent as O,confirmationModalContent as k}from"../Common/utils.esm.js";import{IncidentsFactDetailsComponent as _}from"./IncidentsFactDetailsComponent.esm.js";import{mapConfigToPagerDutyCollectorConfig as x,defaultPagerDutyConfig as A,SERVICE_COLLECTOR_TYPE as B,STANDARDS_COLLECTOR_TYPE as M,INCIDENTS_COLLECTOR_TYPE as Y,incidentsCollectorConfig as j,mapPagerDutyCollectorConfigToConfig as H}from"./utils.esm.js";import{pagerDutyCollectorFormSchema as U}from"./validation.esm.js";const V=b(t=>({spacer:{height:t.spacing(8),width:"100%"},section:{marginBottom:t.spacing(2)}})),z=({disabled:t,selectedCollector:e})=>{const a=S({defaultValues:e?x(e.config):A(),mode:"onChange",resolver:P(U)}),{formState:{errors:i},handleSubmit:n}=a,l=V(),d=!!i.service||!!i.standards||!!i.incidents,{mutateAsync:p}=N(),[f,C]=E(w),{showModal:g}=L(),s=async v=>{if(!await g(k(e)))return;const y=H(v);await p({collectorId:e.id,config:y})&&C()};I(O(e));const u=!e.config?.token||!e.config?.server;return m(D,{children:[o(R,{collectorName:"PagerDuty",collectorId:e.id,invalidConfig:u,hasNonUIOptions:!0}),o(h,{className:l.section,children:o(T,{...a,children:m("form",{onSubmit:n(s),children:[o(r,{name:B.toLowerCase(),label:"Service",description:"Collects details about PagerDuty service linked to an entity.",disabled:t}),o(c,{}),o(r,{name:M.toLowerCase(),label:"Standards",description:"Collects details about standards applied to a PagerDuty service linked to an entity.",disabled:t}),o(c,{}),o(r,{name:Y.toLowerCase(),label:"Incidents",description:"Collects details about incidents associated with a PagerDuty service linked to an entity.",disabled:t,FactDetailsComponent:_,multipleCollectors:{enable:!0,defaultConfig:j(e.config)}})]})})}),o("div",{className:l.section,children:o(F,{onCancel:f,saveButtonText:"Save",isLoading:!1,onSave:n(s),disableSave:d})})]})};export{z as PagerDutyConfigurator};
2
2
  //# sourceMappingURL=PagerDutyConfigurator.esm.js.map
@@ -1,2 +1,2 @@
1
- import{jsxs as C,Fragment as j,jsx as o}from"react/jsx-runtime";import{zodResolver as P}from"@hookform/resolvers/zod";import{makeStyles as w,Paper as _,Box as J,Button as Y,Divider as y}from"@material-ui/core";import k from"@material-ui/icons/UnfoldLess";import I from"@material-ui/icons/UnfoldMore";import{useCallback as z,useMemo as H,useState as l}from"react";import{useForm as V,FormProvider as X}from"react-hook-form";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 G}from"../../../../hooks/useConfirmationModal.esm.js";import{useNavigateBack as U}from"../../../../hooks/useNavigateBack.esm.js";import"react-router-dom";import"react-use/lib/useLocalStorage";import"../../../../graphql/generated/index.esm.js";import"react-use/lib/useAsync";import{useUpdateCollectorConfig as $}from"../../../../hooks/collectors/useUpdateCollectorConfig.esm.js";import{integrationsPageRouteRef as q}from"../../../../routes.esm.js";import{FooterButtons as K}from"../../../FooterButtons/FooterButtons.esm.js";import"../../../SoundcheckHeader/SoundcheckHeader.esm.js";import"../../../SoundcheckHeader/SoundcheckHeaderContext.esm.js";import{useHeader as Q}from"../../../SoundcheckHeader/useHeader.esm.js";import{FactCollectionConfig as g}from"../Common/FactCollectionConfig.esm.js";import"../Common/CollectorConfigAlert.esm.js";import{collectorHeaderContent as W,confirmationModalContent as Z}from"../Common/utils.esm.js";import{ExistsFactDetailsComponent as oo}from"./ExistsFactDetailsComponent.esm.js";import{JsonFactDetailsComponent as eo}from"./JsonFactDetailsComponent.esm.js";import{RegexFactDetailsComponent as to}from"./RegexFactDetailsComponent.esm.js";import{mapConfigToScmCollectorConfig as io,defaultScmCollectorConfig as v,EXISTS_COLLECTOR_TYPE as lo,REGEX_COLLECTOR_TYPE as ao,JSON_COLLECTOR_TYPE as ro,mapScmCollectorConfigToConfig as no}from"./utils.esm.js";import{scmCollectorFormSchema as so}from"./validation.esm.js";const mo=w(e=>({spacer:{height:e.spacing(8),width:"100%"},section:{marginBottom:e.spacing(2)},collapseAllContainer:{display:"flex",justifyContent:"flex-end",padding:e.spacing(1.5,6),borderBottom:`1px solid ${e.palette.divider}`}})),co=({disabled:e,selectedCollector:i})=>{const O=z(async(t,...d)=>{const f={enabled:!1,collectors:[]},M={exists:t.exists.enabled?t.exists:f,json:t.json.enabled?t.json:f,regex:t.regex.enabled?t.regex:f};return P(so)(M,...d)},[]),u=V({defaultValues:i?io(i.config):v(),mode:"onChange",resolver:O}),a=H(()=>v(i.config),[i]),{formState:{isValid:T},handleSubmit:x}=u,r=mo(),L=!T,{mutateAsync:N}=$(),[R,A]=U(q),{showModal:B}=G(),b=async t=>{if(!await B(Z(i)))return;const d=no(t);await N({collectorId:i.id,config:d})&&A()};Q(W(i));const[h,n]=l(!0),[S,s]=l(!0),[F,m]=l(!0),[c,E]=l(!0),p=h&&S&&F,D=()=>{p?(n(!1),s(!1),m(!1),E(!1)):(n(!0),s(!0),m(!0),E(!0))};return C(j,{children:[C(_,{className:r.section,children:[o(J,{className:r.collapseAllContainer,children:o(Y,{startIcon:p?o(I,{}):o(k,{}),onClick:D,variant:"outlined",size:"small",children:p?"Expand All":"Collapse All"})}),o(X,{...u,children:C("form",{onSubmit:x(b),children:[o(g,{name:lo,label:"Exists",description:"Collects information on the existence of files within an entity's repository.",disabled:e,multipleCollectors:{enable:!0,defaultConfig:a.exists.collectors[0]},FactDetailsComponent:oo,collapsed:h,onCollapsedChange:n,allFactsCollapsed:c}),o(y,{}),o(g,{name:ao,label:"Regex",description:"Executes regular expressions against a specified file in an entity's repository and collects its capture groups.",disabled:e,multipleCollectors:{enable:!0,defaultConfig:a.regex.collectors[0]},FactDetailsComponent:to,collapsed:S,onCollapsedChange:s,allFactsCollapsed:c}),o(y,{}),o(g,{name:ro,label:"JSON / YAML",description:"Collects data from a JSON/YAML file at specified JSON paths in an entity's repository.",disabled:e,multipleCollectors:{enable:!0,defaultConfig:a.json.collectors[0]},FactDetailsComponent:eo,collapsed:F,onCollapsedChange:m,allFactsCollapsed:c})]})})]}),o("div",{className:r.section,children:o(K,{onCancel:R,saveButtonText:"Save",isLoading:!1,onSave:x(b),disableSave:L,noMargin:!0})})]})};export{co as ScmConfigurator};
1
+ import{jsxs as C,Fragment as j,jsx as o}from"react/jsx-runtime";import{zodResolver as P}from"@hookform/resolvers/zod";import{makeStyles as w,Paper as _,Box as J,Button as Y,Divider as y}from"@material-ui/core";import k from"@material-ui/icons/UnfoldLess";import I from"@material-ui/icons/UnfoldMore";import{useCallback as z,useMemo as H,useState as l}from"react";import{useForm as V,FormProvider as X}from"react-hook-form";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 G}from"../../../../hooks/useConfirmationModal.esm.js";import{useNavigateBack as U}from"../../../../hooks/useNavigateBack.esm.js";import"react-router-dom";import"react-use/lib/useLocalStorage";import"react-use/lib/useAsync";import"../../../../graphql/generated/index.esm.js";import"react-use/lib/useAsyncRetry";import{useUpdateCollectorConfig as $}from"../../../../hooks/collectors/useUpdateCollectorConfig.esm.js";import{integrationsPageRouteRef as q}from"../../../../routes.esm.js";import{FooterButtons as K}from"../../../FooterButtons/FooterButtons.esm.js";import"../../../SoundcheckHeader/SoundcheckHeader.esm.js";import"../../../SoundcheckHeader/SoundcheckHeaderContext.esm.js";import{useHeader as Q}from"../../../SoundcheckHeader/useHeader.esm.js";import{FactCollectionConfig as g}from"../Common/FactCollectionConfig.esm.js";import"../Common/CollectorConfigAlert.esm.js";import{collectorHeaderContent as W,confirmationModalContent as Z}from"../Common/utils.esm.js";import{ExistsFactDetailsComponent as oo}from"./ExistsFactDetailsComponent.esm.js";import{JsonFactDetailsComponent as eo}from"./JsonFactDetailsComponent.esm.js";import{RegexFactDetailsComponent as to}from"./RegexFactDetailsComponent.esm.js";import{mapConfigToScmCollectorConfig as io,defaultScmCollectorConfig as v,EXISTS_COLLECTOR_TYPE as lo,REGEX_COLLECTOR_TYPE as ro,JSON_COLLECTOR_TYPE as ao,mapScmCollectorConfigToConfig as no}from"./utils.esm.js";import{scmCollectorFormSchema as so}from"./validation.esm.js";const mo=w(e=>({spacer:{height:e.spacing(8),width:"100%"},section:{marginBottom:e.spacing(2)},collapseAllContainer:{display:"flex",justifyContent:"flex-end",padding:e.spacing(1.5,6),borderBottom:`1px solid ${e.palette.divider}`}})),co=({disabled:e,selectedCollector:i})=>{const O=z(async(t,...d)=>{const f={enabled:!1,collectors:[]},M={exists:t.exists.enabled?t.exists:f,json:t.json.enabled?t.json:f,regex:t.regex.enabled?t.regex:f};return P(so)(M,...d)},[]),u=V({defaultValues:i?io(i.config):v(),mode:"onChange",resolver:O}),r=H(()=>v(i.config),[i]),{formState:{isValid:T},handleSubmit:x}=u,a=mo(),L=!T,{mutateAsync:N}=$(),[R,A]=U(q),{showModal:B}=G(),b=async t=>{if(!await B(Z(i)))return;const d=no(t);await N({collectorId:i.id,config:d})&&A()};Q(W(i));const[h,n]=l(!0),[S,s]=l(!0),[F,m]=l(!0),[c,E]=l(!0),p=h&&S&&F,D=()=>{p?(n(!1),s(!1),m(!1),E(!1)):(n(!0),s(!0),m(!0),E(!0))};return C(j,{children:[C(_,{className:a.section,children:[o(J,{className:a.collapseAllContainer,children:o(Y,{startIcon:p?o(I,{}):o(k,{}),onClick:D,variant:"outlined",size:"small",children:p?"Expand All":"Collapse All"})}),o(X,{...u,children:C("form",{onSubmit:x(b),children:[o(g,{name:lo,label:"Exists",description:"Collects information on the existence of files within an entity's repository.",disabled:e,multipleCollectors:{enable:!0,defaultConfig:r.exists.collectors[0]},FactDetailsComponent:oo,collapsed:h,onCollapsedChange:n,allFactsCollapsed:c}),o(y,{}),o(g,{name:ro,label:"Regex",description:"Executes regular expressions against a specified file in an entity's repository and collects its capture groups.",disabled:e,multipleCollectors:{enable:!0,defaultConfig:r.regex.collectors[0]},FactDetailsComponent:to,collapsed:S,onCollapsedChange:s,allFactsCollapsed:c}),o(y,{}),o(g,{name:ao,label:"JSON / YAML",description:"Collects data from a JSON/YAML file at specified JSON paths in an entity's repository.",disabled:e,multipleCollectors:{enable:!0,defaultConfig:r.json.collectors[0]},FactDetailsComponent:eo,collapsed:F,onCollapsedChange:m,allFactsCollapsed:c})]})})]}),o("div",{className:a.section,children:o(K,{onCancel:R,saveButtonText:"Save",isLoading:!1,onSave:x(b),disableSave:L,noMargin:!0})})]})};export{co as ScmConfigurator};
2
2
  //# sourceMappingURL=ScmConfigurator.esm.js.map
@@ -1,2 +1,2 @@
1
- import{jsxs as p,Fragment as Q,jsx as o}from"react/jsx-runtime";import{zodResolver as F}from"@hookform/resolvers/zod";import{makeStyles as y,Paper as k,Divider as s}from"@material-ui/core";import{asArray as w}from"@spotify/backstage-plugin-soundcheck-common";import{useForm as I,FormProvider as N}from"react-hook-form";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"react";import"../../../../hooks/useSoundcheckAlert.esm.js";import{useConfirmationModal as T}from"../../../../hooks/useConfirmationModal.esm.js";import{useNavigateBack as D}from"../../../../hooks/useNavigateBack.esm.js";import"react-router-dom";import"react-use/lib/useLocalStorage";import"../../../../graphql/generated/index.esm.js";import"react-use/lib/useAsync";import{useUpdateCollectorConfig as M}from"../../../../hooks/collectors/useUpdateCollectorConfig.esm.js";import{integrationsPageRouteRef as P}from"../../../../routes.esm.js";import{FooterButtons as x}from"../../../FooterButtons/FooterButtons.esm.js";import"../../../SoundcheckHeader/SoundcheckHeader.esm.js";import"../../../SoundcheckHeader/SoundcheckHeaderContext.esm.js";import{useHeader as B}from"../../../SoundcheckHeader/useHeader.esm.js";import{FactCollectionConfig as i}from"../Common/FactCollectionConfig.esm.js";import{CollectorConfigAlert as A}from"../Common/CollectorConfigAlert.esm.js";import{collectorHeaderContent as R,confirmationModalContent as H}from"../Common/utils.esm.js";import{IssuesFactDetailsInput as U}from"./IssuesFactDetailsInput.esm.js";import{MeasuresFactDetailsInput as z}from"./MeasuresFactDetailsInput.esm.js";import{mapConfigToSonarQubeCollectorConfig as E,defaultSonarQubeConfig as L,issuesCollectorConfig as O,measuresCollectorConfig as V,mapSonarQubeCollectorConfigToConfig as q}from"./utils.esm.js";import{sonarQubeCollectorFormSchema as G}from"./validation.esm.js";const J=y(t=>({spacer:{height:t.spacing(8),width:"100%"},section:{marginBottom:t.spacing(2)}})),K=({disabled:t,selectedCollector:e})=>{const n=I({defaultValues:e?E(e.config):L(),mode:"onChange",resolver:F(G)}),{formState:{errors:r},handleSubmit:l}=n,m=J(),d=!!r.projects||!!r.projectTags||!!r.issues||!!r.measures,{mutateAsync:u}=M(),[f,C]=D(P),{showModal:g}=T(),c=async j=>{if(!await g(H(e)))return;const v=q(j);await u({collectorId:e.id,config:v})&&C()};B(R(e));const a=w(e.config),b=a[0]?.token,S=a[0]?.username&&a[0]?.password,h=!b&&!S;return p(Q,{children:[o(A,{collectorName:"SonarQube",collectorId:e.id,invalidConfig:h,hasNonUIOptions:!0}),o(k,{className:m.section,children:o(N,{...n,children:p("form",{onSubmit:l(c),children:[o(i,{name:"projects",label:"Projects",description:"Collects details about SonarQube project linked to an entity.",disabled:t}),o(s,{}),o(i,{name:"projectTags",label:"Project Tags",description:"Collects details about tags set on a SonarQube project linked to an entity.",disabled:t}),o(s,{}),o(i,{name:"issues",label:"Issues",description:"Collects details about issues associated with a SonarQube project linked to an entity.",disabled:t,FactDetailsComponent:U,multipleCollectors:{enable:!0,defaultConfig:O(e.config)}}),o(s,{}),o(i,{name:"measures",label:"Measures",description:"Collects details about measures associated with a SonarQube project linked to an entity.",disabled:t,FactDetailsComponent:z,multipleCollectors:{enable:!0,defaultConfig:V(e.config)}})]})})}),o("div",{className:m.section,children:o(x,{onCancel:f,saveButtonText:"Save",isLoading:!1,onSave:l(c),disableSave:d})})]})};export{K as SonarQubeConfigurator};
1
+ import{jsxs as p,Fragment as Q,jsx as o}from"react/jsx-runtime";import{zodResolver as F}from"@hookform/resolvers/zod";import{makeStyles as y,Paper as k,Divider as s}from"@material-ui/core";import{asArray as w}from"@spotify/backstage-plugin-soundcheck-common";import{useForm as I,FormProvider as N}from"react-hook-form";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"react";import"../../../../hooks/useSoundcheckAlert.esm.js";import{useConfirmationModal as T}from"../../../../hooks/useConfirmationModal.esm.js";import{useNavigateBack as D}from"../../../../hooks/useNavigateBack.esm.js";import"react-router-dom";import"react-use/lib/useLocalStorage";import"react-use/lib/useAsync";import"../../../../graphql/generated/index.esm.js";import"react-use/lib/useAsyncRetry";import{useUpdateCollectorConfig as M}from"../../../../hooks/collectors/useUpdateCollectorConfig.esm.js";import{integrationsPageRouteRef as P}from"../../../../routes.esm.js";import{FooterButtons as x}from"../../../FooterButtons/FooterButtons.esm.js";import"../../../SoundcheckHeader/SoundcheckHeader.esm.js";import"../../../SoundcheckHeader/SoundcheckHeaderContext.esm.js";import{useHeader as B}from"../../../SoundcheckHeader/useHeader.esm.js";import{FactCollectionConfig as i}from"../Common/FactCollectionConfig.esm.js";import{CollectorConfigAlert as A}from"../Common/CollectorConfigAlert.esm.js";import{collectorHeaderContent as R,confirmationModalContent as H}from"../Common/utils.esm.js";import{IssuesFactDetailsInput as U}from"./IssuesFactDetailsInput.esm.js";import{MeasuresFactDetailsInput as z}from"./MeasuresFactDetailsInput.esm.js";import{mapConfigToSonarQubeCollectorConfig as E,defaultSonarQubeConfig as L,issuesCollectorConfig as O,measuresCollectorConfig as V,mapSonarQubeCollectorConfigToConfig as q}from"./utils.esm.js";import{sonarQubeCollectorFormSchema as G}from"./validation.esm.js";const J=y(t=>({spacer:{height:t.spacing(8),width:"100%"},section:{marginBottom:t.spacing(2)}})),K=({disabled:t,selectedCollector:e})=>{const n=I({defaultValues:e?E(e.config):L(),mode:"onChange",resolver:F(G)}),{formState:{errors:r},handleSubmit:l}=n,m=J(),d=!!r.projects||!!r.projectTags||!!r.issues||!!r.measures,{mutateAsync:u}=M(),[f,C]=D(P),{showModal:g}=T(),c=async j=>{if(!await g(H(e)))return;const v=q(j);await u({collectorId:e.id,config:v})&&C()};B(R(e));const a=w(e.config),b=a[0]?.token,S=a[0]?.username&&a[0]?.password,h=!b&&!S;return p(Q,{children:[o(A,{collectorName:"SonarQube",collectorId:e.id,invalidConfig:h,hasNonUIOptions:!0}),o(k,{className:m.section,children:o(N,{...n,children:p("form",{onSubmit:l(c),children:[o(i,{name:"projects",label:"Projects",description:"Collects details about SonarQube project linked to an entity.",disabled:t}),o(s,{}),o(i,{name:"projectTags",label:"Project Tags",description:"Collects details about tags set on a SonarQube project linked to an entity.",disabled:t}),o(s,{}),o(i,{name:"issues",label:"Issues",description:"Collects details about issues associated with a SonarQube project linked to an entity.",disabled:t,FactDetailsComponent:U,multipleCollectors:{enable:!0,defaultConfig:O(e.config)}}),o(s,{}),o(i,{name:"measures",label:"Measures",description:"Collects details about measures associated with a SonarQube project linked to an entity.",disabled:t,FactDetailsComponent:z,multipleCollectors:{enable:!0,defaultConfig:V(e.config)}})]})})}),o("div",{className:m.section,children:o(x,{onCancel:f,saveButtonText:"Save",isLoading:!1,onSave:l(c),disableSave:d})})]})};export{K as SonarQubeConfigurator};
2
2
  //# sourceMappingURL=SonarQubeConfigurator.esm.js.map
@@ -1,2 +1,2 @@
1
- import{jsx as e,jsxs as r,Fragment as M}from"react/jsx-runtime";import{useRouteRef as w}from"@backstage/core-plugin-api";import{usePermission as Y}from"@backstage/plugin-permission-react";import{HeaderPage as $,SearchField as O,Container as V,TableRoot as W,TableHeader as q,Column as g,TableBody as z,Row as J,Flex as K,Text as Q,TooltipTrigger as X,ButtonIcon as Z,Tooltip as _,Box as ee,CellText as y,Button as te}from"@backstage/ui";import{makeStyles as oe}from"@material-ui/core";import{RiInformationLine as ie}from"@remixicon/react";import{soundcheckCollectorUpdatePermission as re}from"@spotify/backstage-plugin-soundcheck-common";import{sortBy as ne,isEmpty as p}from"lodash";import{useState as f,useMemo as P,useEffect as ae,useCallback as se}from"react";import{useNavigate as ce}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"../../hooks/useConfirmationModal.esm.js";import{useSearchName as de}from"../../hooks/useSearchName.esm.js";import"react-use/lib/useLocalStorage";import{useSortSearchParams as me}from"../../hooks/useSortSearchParams.esm.js";import"../../graphql/generated/index.esm.js";import"react-use/lib/useAsync";import{useGetCollectors as le}from"../../hooks/collectors/useGetCollectors.esm.js";import{useLCPReporting as ge}from"../../hooks/useLCPReporting.esm.js";import{useLoadTimeReporting as pe}from"../../hooks/useLoadTimeReporting.esm.js";import{integrationDetailsRouteRef as he,integrationEditRouteRef as ue}from"../../routes.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{LoadingTableSkeleton as Ce}from"../LoadingTableSkeleton/LoadingTableSkeleton.esm.js";import{IntegrationLogoBUI as Se}from"./IntegrationLogoBUI.esm.js";const R=t=>{const s=t.hasUIConfig?"UI":"YAML";return p(t.config)&&p(t.collectionConfigs)?"None":s},B=oe(()=>({container:{marginBottom:"var(--bui-space-12)"},button:{boxShadow:"none !important",backgroundColor:"inherit !important"},tooltip:{maxWidth:"50rem",padding:0},scrollBox:{maxHeight:"30rem",overflow:"auto",padding:"0 var(--bui-space-3)"}})),N=({integration:t,hasConfigPage:s})=>{const n=B(),c=w(he),a=ce(),h=w(ue);return r(J,{onAction:()=>a(c({integrationId:t.id})),children:[e(x,{children:r(K,{gap:"2",align:"center",children:[e(Se,{integrationId:t.id}),e(Q,{children:t.name??t.id}),t.description&&r(X,{children:[e(Z,{className:n.button,variant:"secondary",icon:e(ie,{}),onClick:()=>a(c({integrationId:t.id}))}),e(_,{className:n.tooltip,children:e(ee,{className:n.scrollBox,children:e("p",{children:t.description})})})]})]})}),e(y,{title:`${String(t.dependentChecks?.length??0)} checks`}),e(y,{title:R(t)}),e(x,{onClick:d=>d.stopPropagation(),children:e(te,{onClick:()=>a(h({integrationId:t.id})),isDisabled:!s,variant:"tertiary","aria-label":`${t.id} configure`,children:"Configure"})})]})},be=["name","dependent-checks","config-source"],ke=({integrations:t})=>{const s=B(),{updateSortParams:n,searchParams:c}=me(),[a,h]=f(""),[d,T]=f(()=>c.get("sortDirection")==="descending"?"descending":"ascending"),[m,L]=f(()=>{const o=c.get("sort");return o&&be.includes(o)?o:""}),C=P(()=>({routeName:"soundcheck-integrations",additionalAttributes:{integrationsPerPage:t?.length}}),[t?.length]),{reportContentLoaded:S}=pe(C),{reporter:v}=ge(C),{loading:D,allowed:E}=Y({permission:re}),{data:U,isLoading:l}=le(),b=de({items:U??[],searchTerm:a}),u=P(()=>{const o=ne(b,i=>m==="name"?i.name??i.id:m==="dependent-checks"?i.dependentChecks?.length??0:m==="config-source"?R(i):i.isEditable?1:2);return d==="descending"&&o.reverse(),o},[b,m,d]),k=v?.getLCPValue();ae(()=>{l||S({lcp:k})},[l,S,k]);const H=se(({direction:o,column:i})=>{const I=String(i);L(I),T(o),n({sort:I,sortDirection:o})},[n]),A=!l&&!p(u),F=l,j=!l&&p(u),G=e(fe,{title:"No integrations found",body:"Your current search term did not return any integrations. Please try a different search term."});return r(M,{children:[e($,{customActions:e(O,{value:a,onChange:h,"aria-label":"Search Name"}),title:"Integrations"}),r(V,{className:s.container,children:[F&&e(Ce,{rowCount:10,rowHeight:36}),j&&G,A&&r(W,{onSortChange:H,sortDescriptor:{direction:d,column:m},children:[r(q,{children:[e(g,{id:"name",allowsSorting:!0,isRowHeader:!0,style:{width:"63%"},children:"Name"}),e(g,{id:"dependent-checks",allowsSorting:!0,style:{width:"15%"},children:"Dependent Checks"}),e(g,{id:"config-source",allowsSorting:!0,style:{width:"15%"},children:"Config Source"}),e(g,{style:{width:"7%"}})]}),e(z,{children:u.map(o=>e(N,{integration:o,hasConfigPage:!D&&E&&o.isEditable},o.id))})]})]})]})};export{N as IntegrationRow,ke as IntegrationsListPageBUI};
1
+ import{jsx as e,jsxs as r,Fragment as M}from"react/jsx-runtime";import{useRouteRef as w}from"@backstage/core-plugin-api";import{usePermission as Y}from"@backstage/plugin-permission-react";import{HeaderPage as $,SearchField as O,Container as V,TableRoot as W,TableHeader as q,Column as g,TableBody as z,Row as J,Flex as K,Text as Q,TooltipTrigger as X,ButtonIcon as Z,Tooltip as _,Box as ee,CellText as y,Button as te}from"@backstage/ui";import{makeStyles as oe}from"@material-ui/core";import{RiInformationLine as ie}from"@remixicon/react";import{soundcheckCollectorUpdatePermission as re}from"@spotify/backstage-plugin-soundcheck-common";import{sortBy as ne,isEmpty as p}from"lodash";import{useState as f,useMemo as P,useEffect as ae,useCallback as se}from"react";import{useNavigate as ce}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"../../hooks/useConfirmationModal.esm.js";import{useSearchName as de}from"../../hooks/useSearchName.esm.js";import"react-use/lib/useLocalStorage";import{useSortSearchParams as me}from"../../hooks/useSortSearchParams.esm.js";import"react-use/lib/useAsync";import"../../graphql/generated/index.esm.js";import"react-use/lib/useAsyncRetry";import{useGetCollectors as le}from"../../hooks/collectors/useGetCollectors.esm.js";import{useLCPReporting as ge}from"../../hooks/useLCPReporting.esm.js";import{useLoadTimeReporting as pe}from"../../hooks/useLoadTimeReporting.esm.js";import{integrationDetailsRouteRef as he,integrationEditRouteRef as ue}from"../../routes.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{LoadingTableSkeleton as Ce}from"../LoadingTableSkeleton/LoadingTableSkeleton.esm.js";import{IntegrationLogoBUI as Se}from"./IntegrationLogoBUI.esm.js";const R=t=>{const s=t.hasUIConfig?"UI":"YAML";return p(t.config)&&p(t.collectionConfigs)?"None":s},B=oe(()=>({container:{marginBottom:"var(--bui-space-12)"},button:{boxShadow:"none !important",backgroundColor:"inherit !important"},tooltip:{maxWidth:"50rem",padding:0},scrollBox:{maxHeight:"30rem",overflow:"auto",padding:"0 var(--bui-space-3)"}})),N=({integration:t,hasConfigPage:s})=>{const n=B(),c=w(he),a=ce(),h=w(ue);return r(J,{onAction:()=>a(c({integrationId:t.id})),children:[e(x,{children:r(K,{gap:"2",align:"center",children:[e(Se,{integrationId:t.id}),e(Q,{children:t.name??t.id}),t.description&&r(X,{children:[e(Z,{className:n.button,variant:"secondary",icon:e(ie,{}),onClick:()=>a(c({integrationId:t.id}))}),e(_,{className:n.tooltip,children:e(ee,{className:n.scrollBox,children:e("p",{children:t.description})})})]})]})}),e(y,{title:`${String(t.dependentChecks?.length??0)} checks`}),e(y,{title:R(t)}),e(x,{onClick:d=>d.stopPropagation(),children:e(te,{onClick:()=>a(h({integrationId:t.id})),isDisabled:!s,variant:"tertiary","aria-label":`${t.id} configure`,children:"Configure"})})]})},be=["name","dependent-checks","config-source"],ke=({integrations:t})=>{const s=B(),{updateSortParams:n,searchParams:c}=me(),[a,h]=f(""),[d,T]=f(()=>c.get("sortDirection")==="descending"?"descending":"ascending"),[m,L]=f(()=>{const o=c.get("sort");return o&&be.includes(o)?o:""}),C=P(()=>({routeName:"soundcheck-integrations",additionalAttributes:{integrationsPerPage:t?.length}}),[t?.length]),{reportContentLoaded:S}=pe(C),{reporter:v}=ge(C),{loading:D,allowed:E}=Y({permission:re}),{data:U,isLoading:l}=le(),b=de({items:U??[],searchTerm:a}),u=P(()=>{const o=ne(b,i=>m==="name"?i.name??i.id:m==="dependent-checks"?i.dependentChecks?.length??0:m==="config-source"?R(i):i.isEditable?1:2);return d==="descending"&&o.reverse(),o},[b,m,d]),k=v?.getLCPValue();ae(()=>{l||S({lcp:k})},[l,S,k]);const H=se(({direction:o,column:i})=>{const I=String(i);L(I),T(o),n({sort:I,sortDirection:o})},[n]),A=!l&&!p(u),F=l,j=!l&&p(u),G=e(fe,{title:"No integrations found",body:"Your current search term did not return any integrations. Please try a different search term."});return r(M,{children:[e($,{customActions:e(O,{value:a,onChange:h,"aria-label":"Search Name"}),title:"Integrations"}),r(V,{className:s.container,children:[F&&e(Ce,{rowCount:10,rowHeight:36}),j&&G,A&&r(W,{onSortChange:H,sortDescriptor:{direction:d,column:m},children:[r(q,{children:[e(g,{id:"name",allowsSorting:!0,isRowHeader:!0,style:{width:"63%"},children:"Name"}),e(g,{id:"dependent-checks",allowsSorting:!0,style:{width:"15%"},children:"Dependent Checks"}),e(g,{id:"config-source",allowsSorting:!0,style:{width:"15%"},children:"Config Source"}),e(g,{style:{width:"7%"}})]}),e(z,{children:u.map(o=>e(N,{integration:o,hasConfigPage:!D&&E&&o.isEditable},o.id))})]})]})]})};export{N as IntegrationRow,ke as IntegrationsListPageBUI};
2
2
  //# sourceMappingURL=IntegrationsListPageBUI.esm.js.map
@@ -1,2 +1,2 @@
1
- import{jsx as i,jsxs as m}from"react/jsx-runtime";import{Link as g,InfoCard as v}from"@backstage/core-components";import{useRouteRef as s}from"@backstage/core-plugin-api";import{useEntity as C}from"@backstage/plugin-catalog-react";import{Divider as R}from"@material-ui/core";import S from"@material-ui/core/styles/makeStyles";import{SpotifyLicenseBanner as I}from"@spotify/backstage-plugin-core";import{Fragment as L}from"react";import{useAllCertifications as w}from"../../hooks/certifications/useAllCertifications.esm.js";import"@tanstack/react-query";import"../../api.esm.js";import"../../hooks/graphqlKeys.esm.js";import"@backstage/catalog-model";import"@spotify/backstage-plugin-soundcheck-common";import"../../hooks/useSoundcheckAlert.esm.js";import"../../hooks/useConfirmationModal.esm.js";import"react-router-dom";import{usePlaylists as b}from"../../hooks/playlists/usePlaylists.esm.js";import"react-use/lib/useLocalStorage";import"../../graphql/generated/index.esm.js";import"react-use/lib/useAsync";import{certificationTrackRouteRef as x,certificationPlaylistTrackRouteRef as E}from"../../routes.esm.js";import{soundcheckBackend as N,invalidLicenseMessage as j}from"../../utils/license.esm.js";import{AlertPanel as A}from"../AlertPanel/AlertPanel.esm.js";import"../CertificationSidebar/CertificationSidebar.esm.js";import{CertificationSummary as P}from"../CertificationSidebar/CertificationSummary.esm.js";import"@material-ui/lab";import"../CertificationSidebar/Check.esm.js";import"../CertificationSidebar/LevelSummary.esm.js";import{NoCertifications as T}from"../EmptyState/EmptyState.esm.js";import"../EmptyState/EmptyStateBUI.esm.js";import"@backstage/plugin-permission-react";import"@remixicon/react";import{CardSkeleton as B}from"./skeletons/CardSkeleton.esm.js";const c=S(t=>({certificationWrapper:{display:"flex",justifyContent:"space-between",alignItems:"center"},infoCard:{display:"grid",gridRowGap:t.spacing(2)},emptyState:{overflow:"hidden"}})),n=({children:t,title:e})=>{const o=c();return i(v,{title:e,children:m("div",{className:o.infoCard,children:[i(I,{inline:!0,backend:N,invalidLicenseMessage:j}),t]})})},D=(t,e)=>t.find(o=>o.trackIds.some(a=>a===e))?.id??"",M=({title:t="Soundcheck"})=>{const{entity:e}=C(),o=c(),{data:a,isError:d,isLoading:l}=w(e),{data:p,isError:f,isLoading:k}=b(e),y=s(x),h=s(E);return d||f?i(n,{title:t,children:i(A,{severity:"error",title:"Error loading certifications"})}):l||k||!a||!p?i(n,{title:t,children:i(B,{})}):a.length?i(n,{title:t,children:a.map((r,u)=>m(L,{children:[m("div",{className:o.certificationWrapper,"data-testid":"soundcheck-track-row",children:[i(P,{name:r.track.name,badge:r.track.badge,trackType:r.track?.type},r.track.id),i(g,{to:r.track.type==="playlist"?h({playlistId:D(p,r.track.id),trackId:r.track.id}):y({trackId:r.track.id}),children:"View Details"})]}),u<a.length-1?i(R,{}):null]},r.track.name))}):i(n,{title:t,children:i("div",{className:o.emptyState,children:i(T,{})})})};export{M as Card,c as useStyles};
1
+ import{jsx as i,jsxs as n}from"react/jsx-runtime";import{Link as g,InfoCard as v}from"@backstage/core-components";import{useRouteRef as s}from"@backstage/core-plugin-api";import{useEntity as C}from"@backstage/plugin-catalog-react";import{Divider as R}from"@material-ui/core";import S from"@material-ui/core/styles/makeStyles";import{SpotifyLicenseBanner as I}from"@spotify/backstage-plugin-core";import{Fragment as L}from"react";import{useAllCertifications as w}from"../../hooks/certifications/useAllCertifications.esm.js";import"@tanstack/react-query";import"../../api.esm.js";import"../../hooks/graphqlKeys.esm.js";import"@backstage/catalog-model";import"@spotify/backstage-plugin-soundcheck-common";import"../../hooks/useSoundcheckAlert.esm.js";import"../../hooks/useConfirmationModal.esm.js";import"react-router-dom";import{usePlaylists as b}from"../../hooks/playlists/usePlaylists.esm.js";import"react-use/lib/useLocalStorage";import"react-use/lib/useAsync";import"../../graphql/generated/index.esm.js";import"react-use/lib/useAsyncRetry";import{certificationTrackRouteRef as x,certificationPlaylistTrackRouteRef as E}from"../../routes.esm.js";import{soundcheckBackend as N,invalidLicenseMessage as j}from"../../utils/license.esm.js";import{AlertPanel as A}from"../AlertPanel/AlertPanel.esm.js";import"../CertificationSidebar/CertificationSidebar.esm.js";import{CertificationSummary as P}from"../CertificationSidebar/CertificationSummary.esm.js";import"@material-ui/lab";import"../CertificationSidebar/Check.esm.js";import"../CertificationSidebar/LevelSummary.esm.js";import{NoCertifications as T}from"../EmptyState/EmptyState.esm.js";import"../EmptyState/EmptyStateBUI.esm.js";import"@backstage/plugin-permission-react";import"@remixicon/react";import{CardSkeleton as B}from"./skeletons/CardSkeleton.esm.js";const c=S(t=>({certificationWrapper:{display:"flex",justifyContent:"space-between",alignItems:"center"},infoCard:{display:"grid",gridRowGap:t.spacing(2)},emptyState:{overflow:"hidden"}})),m=({children:t,title:e})=>{const o=c();return i(v,{title:e,children:n("div",{className:o.infoCard,children:[i(I,{inline:!0,backend:N,invalidLicenseMessage:j}),t]})})},D=(t,e)=>t.find(o=>o.trackIds.some(a=>a===e))?.id??"",M=({title:t="Soundcheck"})=>{const{entity:e}=C(),o=c(),{data:a,isError:d,isLoading:l}=w(e),{data:p,isError:f,isLoading:k}=b(e),y=s(x),h=s(E);return d||f?i(m,{title:t,children:i(A,{severity:"error",title:"Error loading certifications"})}):l||k||!a||!p?i(m,{title:t,children:i(B,{})}):a.length?i(m,{title:t,children:a.map((r,u)=>n(L,{children:[n("div",{className:o.certificationWrapper,"data-testid":"soundcheck-track-row",children:[i(P,{name:r.track.name,badge:r.track.badge,trackType:r.track?.type},r.track.id),i(g,{to:r.track.type==="playlist"?h({playlistId:D(p,r.track.id),trackId:r.track.id}):y({trackId:r.track.id}),children:"View Details"})]}),u<a.length-1?i(R,{}):null]},r.track.name))}):i(m,{title:t,children:i("div",{className:o.emptyState,children:i(T,{})})})};export{M as Card,c as useStyles};
2
2
  //# sourceMappingURL=Card.esm.js.map
@@ -1,2 +1,2 @@
1
- import{parseFactRef as p,stringifyFactRef as c}from"@spotify/backstage-plugin-soundcheck-common";import{useMemo as n}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"../../hooks/useSoundcheckAlert.esm.js";import{useGetAllTracks as s}from"../../hooks/tracks/useGetAllTracks.esm.js";import"../../hooks/useConfirmationModal.esm.js";import"react-router-dom";import"react-use/lib/useLocalStorage";import"../../graphql/generated/index.esm.js";import"react-use/lib/useAsync";const l=({selectedCollector:e})=>{const{data:m}=s({});return{factOptions:n(()=>e?.factNames?.map(o=>{const t=e.id==="soundcheck"?{source:e.id,scope:"default",name:o}:p(o,{defaultSource:e.id,defaultScope:"default"});let a=t.name;if(e?.id==="soundcheck"){const r=m?.edges.find(i=>i.node.id===t.name.replace("track/",""))?.node;a=r?`${r.type==="campaign"?"Campaign: ":"Track: "}${r.name}`:t.name}return{label:a,value:c(t)}})?.sort((o,t)=>o.label.localeCompare(t.label))??[],[e?.factNames,e?.id,m])}};export{l as useFactOptions};
1
+ import{parseFactRef as p,stringifyFactRef as c}from"@spotify/backstage-plugin-soundcheck-common";import{useMemo as n}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"../../hooks/useSoundcheckAlert.esm.js";import{useGetAllTracks as s}from"../../hooks/tracks/useGetAllTracks.esm.js";import"../../hooks/useConfirmationModal.esm.js";import"react-router-dom";import"react-use/lib/useLocalStorage";import"react-use/lib/useAsync";import"../../graphql/generated/index.esm.js";import"react-use/lib/useAsyncRetry";const l=({selectedCollector:e})=>{const{data:m}=s({});return{factOptions:n(()=>e?.factNames?.map(o=>{const t=e.id==="soundcheck"?{source:e.id,scope:"default",name:o}:p(o,{defaultSource:e.id,defaultScope:"default"});let i=t.name;if(e?.id==="soundcheck"){const r=m?.edges.find(a=>a.node.id===t.name.replace("track/",""))?.node;i=r?`${r.type==="campaign"?"Campaign: ":"Track: "}${r.name}`:t.name}return{label:i,value:c(t)}})?.sort((o,t)=>o.label.localeCompare(t.label))??[],[e?.factNames,e?.id,m])}};export{l as useFactOptions};
2
2
  //# sourceMappingURL=useFactOptions.esm.js.map
@@ -1,2 +1,2 @@
1
- import{jsx as r,jsxs as u}from"react/jsx-runtime";import{Box as i,Flex as y}from"@backstage/ui";import{makeStyles as g}from"@material-ui/core";import{sortBy as b,uniqBy as x,isEmpty as v}from"lodash";import{useMemo as s,useCallback as B}from"react";import{Virtualizer as k,ListLayout as L,ListBox as G,ListBoxItem as S}from"react-aria-components";import"@backstage/catalog-model";import"@backstage/core-plugin-api";import"@tanstack/react-query";import"../../api.esm.js";import"../../hooks/graphqlKeys.esm.js";import"@backstage/plugin-catalog-react";import"@spotify/backstage-plugin-soundcheck-common";import"../../hooks/useSoundcheckAlert.esm.js";import"../../hooks/useConfirmationModal.esm.js";import"react-router-dom";import{useSearchName as w}from"../../hooks/useSearchName.esm.js";import"react-use/lib/useLocalStorage";import"../../graphql/generated/index.esm.js";import"react-use/lib/useAsync";import{useGroupOptions as N}from"../../hooks/groups/useGroupOptions.esm.js";import"../EmptyState/EmptyState.esm.js";import{EmptyStateBUI as $}from"../EmptyState/EmptyStateBUI.esm.js";import"@backstage/plugin-permission-react";import"@remixicon/react";import"../../routes.esm.js";import{LoadingTableSkeleton as C}from"../LoadingTableSkeleton/LoadingTableSkeleton.esm.js";const A=g(()=>({empty:{width:"36rem",margin:"var(--bui-space-4) 0"},listArea:{height:"16rem",width:"36rem",overflow:"auto",marginTop:"var(--bui-space-2)"},listBox:{padding:"var(--bui-space-2)","&:hover":{cursor:"pointer",backgroundColor:"var(--bui-bg-tint-hover)"}},listBoxSelected:{backgroundColor:"var(--bui-bg-tint)"}})),j=({searchTerm:d,selectRef:p,selectedRef:t})=>{const o=A(),{options:m,isLoading:l}=N(),a=s(()=>m.filter(e=>e.key==="My Groups").map(e=>({...e,key:`${e.ref}${e.ref===t?"-selectedGroup":""}`,id:e.ref})),[m,t]),n=s(()=>b(m.filter(e=>e.key==="All Groups").map(e=>({...e,key:`${e.ref}${e.ref===t?"-selectedGroup":""}`,id:e.ref})),e=>e.name.toLowerCase()),[m,t]),f=s(()=>x([...a,...n],"id"),[n,a]),c=w({items:f,searchTerm:d}),h=B(e=>{p(e.match(/-selectedGroup$/)?"":e)},[p]);return r(i,{children:r(i,{children:u(k,{layoutOptions:{padding:0,gap:2},layout:L,children:[l&&r(i,{className:o.listArea,children:r(C,{rowHeight:18,rowCount:8})}),v(c)&&!l?r(i,{className:o.empty,children:r($,{title:"No groups found.",body:"No groups found for the current selection."})}):r(G,{"aria-label":"Group List",items:c,className:o.listArea,selectionMode:"single",selectedKeys:t?[t]:void 0,onSelectionChange:e=>h(Object.values(e)[0]),children:e=>r(S,{textValue:e.name,className:`${o.listBox} ${e.ref===t?o.listBoxSelected:""}`,children:u(y,{justify:"between",children:[r(i,{children:e.name}),r(i,{children:e.type})]})})})]})})})};export{j as GroupSelectList};
1
+ import{jsx as r,jsxs as u}from"react/jsx-runtime";import{Box as i,Flex as y}from"@backstage/ui";import{makeStyles as g}from"@material-ui/core";import{sortBy as b,uniqBy as x,isEmpty as v}from"lodash";import{useMemo as s,useCallback as B}from"react";import{Virtualizer as k,ListLayout as L,ListBox as G,ListBoxItem as S}from"react-aria-components";import"@backstage/catalog-model";import"@backstage/core-plugin-api";import"@tanstack/react-query";import"../../api.esm.js";import"../../hooks/graphqlKeys.esm.js";import"@backstage/plugin-catalog-react";import"@spotify/backstage-plugin-soundcheck-common";import"../../hooks/useSoundcheckAlert.esm.js";import"../../hooks/useConfirmationModal.esm.js";import"react-router-dom";import{useSearchName as w}from"../../hooks/useSearchName.esm.js";import"react-use/lib/useLocalStorage";import"react-use/lib/useAsync";import"../../graphql/generated/index.esm.js";import"react-use/lib/useAsyncRetry";import{useGroupOptions as N}from"../../hooks/groups/useGroupOptions.esm.js";import"../EmptyState/EmptyState.esm.js";import{EmptyStateBUI as $}from"../EmptyState/EmptyStateBUI.esm.js";import"@backstage/plugin-permission-react";import"@remixicon/react";import"../../routes.esm.js";import{LoadingTableSkeleton as C}from"../LoadingTableSkeleton/LoadingTableSkeleton.esm.js";const A=g(()=>({empty:{width:"36rem",margin:"var(--bui-space-4) 0"},listArea:{height:"16rem",width:"36rem",overflow:"auto",marginTop:"var(--bui-space-2)"},listBox:{padding:"var(--bui-space-2)","&:hover":{cursor:"pointer",backgroundColor:"var(--bui-bg-tint-hover)"}},listBoxSelected:{backgroundColor:"var(--bui-bg-tint)"}})),j=({searchTerm:d,selectRef:p,selectedRef:t})=>{const o=A(),{options:m,isLoading:l}=N(),a=s(()=>m.filter(e=>e.key==="My Groups").map(e=>({...e,key:`${e.ref}${e.ref===t?"-selectedGroup":""}`,id:e.ref})),[m,t]),n=s(()=>b(m.filter(e=>e.key==="All Groups").map(e=>({...e,key:`${e.ref}${e.ref===t?"-selectedGroup":""}`,id:e.ref})),e=>e.name.toLowerCase()),[m,t]),f=s(()=>x([...a,...n],"id"),[n,a]),c=w({items:f,searchTerm:d}),h=B(e=>{p(e.match(/-selectedGroup$/)?"":e)},[p]);return r(i,{children:r(i,{children:u(k,{layoutOptions:{padding:0,gap:2},layout:L,children:[l&&r(i,{className:o.listArea,children:r(C,{rowHeight:18,rowCount:8})}),v(c)&&!l?r(i,{className:o.empty,children:r($,{title:"No groups found.",body:"No groups found for the current selection."})}):r(G,{"aria-label":"Group List",items:c,className:o.listArea,selectionMode:"single",selectedKeys:t?[t]:void 0,onSelectionChange:e=>h(Object.values(e)[0]),children:e=>r(S,{textValue:e.name,className:`${o.listBox} ${e.ref===t?o.listBoxSelected:""}`,children:u(y,{justify:"between",children:[r(i,{children:e.name}),r(i,{children:e.type})]})})})]})})})};export{j as GroupSelectList};
2
2
  //# sourceMappingURL=GroupSelectList.esm.js.map
@@ -1,2 +1,2 @@
1
- import{jsx as m}from"react/jsx-runtime";import{useEntity as d}from"@backstage/plugin-catalog-react";import{makeStyles as y}from"@material-ui/core";import{useState as g,useEffect as v}from"react";import C from"react-confetti";import L from"react-use/lib/useMeasure";import p from"react-use/lib/usePrevious";import"@backstage/catalog-model";import"@backstage/core-plugin-api";import"@tanstack/react-query";import"../../api.esm.js";import"../../hooks/graphqlKeys.esm.js";import{useCertificationDetailsForTrack as k}from"../../hooks/certifications/useCertificationDetailsForTrack.esm.js";import"@spotify/backstage-plugin-soundcheck-common";import"../../hooks/useSoundcheckAlert.esm.js";import"../../hooks/useConfirmationModal.esm.js";import"react-router-dom";import"react-use/lib/useLocalStorage";import"../../graphql/generated/index.esm.js";import"react-use/lib/useAsync";const w=y(()=>({root:{position:"absolute",width:"100%",height:"100%"}})),S=({trackId:t})=>{const s=w(),{entity:a}=d(),{data:f,isLoading:n}=k(a,t),[l,{width:c,height:h}]=L(),o=n?void 0:f?.highestLevel?.ordinal??-1,i=p(o),r=p(t),[u,e]=g(!1);return v(()=>{typeof i<"u"&&typeof o<"u"&&t===r&&o>i&&e(!0)},[o,i,t,r]),u?m("div",{ref:l,className:s.root,children:m(C,{width:c,height:h,numberOfPieces:1e3,gravity:1,initialVelocityY:20,recycle:!1,onConfettiComplete:()=>e(!1)})}):null};export{S as LevelUpParty};
1
+ import{jsx as m}from"react/jsx-runtime";import{useEntity as d}from"@backstage/plugin-catalog-react";import{makeStyles as y}from"@material-ui/core";import{useState as g,useEffect as v}from"react";import C from"react-confetti";import L from"react-use/lib/useMeasure";import p from"react-use/lib/usePrevious";import"@backstage/catalog-model";import"@backstage/core-plugin-api";import"@tanstack/react-query";import"../../api.esm.js";import"../../hooks/graphqlKeys.esm.js";import{useCertificationDetailsForTrack as k}from"../../hooks/certifications/useCertificationDetailsForTrack.esm.js";import"@spotify/backstage-plugin-soundcheck-common";import"../../hooks/useSoundcheckAlert.esm.js";import"../../hooks/useConfirmationModal.esm.js";import"react-router-dom";import"react-use/lib/useLocalStorage";import"react-use/lib/useAsync";import"../../graphql/generated/index.esm.js";import"react-use/lib/useAsyncRetry";const w=y(()=>({root:{position:"absolute",width:"100%",height:"100%"}})),S=({trackId:t})=>{const s=w(),{entity:a}=d(),{data:f,isLoading:n}=k(a,t),[l,{width:c,height:h}]=L(),o=n?void 0:f?.highestLevel?.ordinal??-1,i=p(o),r=p(t),[u,e]=g(!1);return v(()=>{typeof i<"u"&&typeof o<"u"&&t===r&&o>i&&e(!0)},[o,i,t,r]),u?m("div",{ref:l,className:s.root,children:m(C,{width:c,height:h,numberOfPieces:1e3,gravity:1,initialVelocityY:20,recycle:!1,onConfettiComplete:()=>e(!1)})}):null};export{S as LevelUpParty};
2
2
  //# sourceMappingURL=LevelUpParty.esm.js.map
@@ -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"../../graphql/generated/index.esm.js";import"react-use/lib/useAsync";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,l]=O(!1),{showArchiveModal:p}=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 p({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,p]);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:()=>l(!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:l}};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"../../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,l]=O(!1),{showArchiveModal:p}=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 p({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,p]);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:()=>l(!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:l}};export{X as useCampaignActions};
2
2
  //# sourceMappingURL=useCampaignActions.esm.js.map
@@ -1,2 +1,2 @@
1
- import{jsx as i}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"../../graphql/generated/index.esm.js";import"react-use/lib/useAsync";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=e=>{const t=b(),r=u(g),{loading:m,allowed:s}=d({permission:C,resourceRef:e?.id}),{loading:n,allowed:c}=d({permission:R,resourceRef:e?.id}),{showModal:a}=w(),{mutate:l}=D(),p=x(async()=>{e?.id&&await a({title:"Delete Check",message:`Are you sure you want to delete the check '${e.name??e.id}'?`})&&l(e.id)},[a,e?.name,l,e?.id]);return E(()=>{if(!e)return[];const o=[{label:"Export",id:"export",onClick:()=>y(e),iconStart:i(f,{})}];return e.isEditable&&!m&&s&&o.push({label:"Edit",id:"edit",onClick:()=>t(r({checkId:e.id})),iconStart:i(h,{})}),e.isEditable&&!n&&c&&o.push({label:"Delete",id:"delete",onClick:p,iconStart:i(k,{})}),o},[c,s,e,r,p,n,m,t])};export{L as useCheckActions};
1
+ import{jsx as i}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"../../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:c}=d({permission:R,resourceRef:o?.id}),{showModal:p}=w(),{mutate:a}=D(),l=x(async()=>{o?.id&&await p({title:"Delete Check",message:`Are you sure you want to delete the check '${o.name??o.id}'?`})&&a(o.id)},[p,o?.name,a,o?.id]);return E(()=>{if(!o)return[];const e=[{label:"Export",id:"export",onClick:()=>y(o),iconStart:i(f,{})}];return o.isEditable&&!m&&s&&e.push({label:"Edit",id:"edit",onClick:()=>t(r({checkId:o.id})),iconStart:i(h,{})}),o.isEditable&&!n&&c&&e.push({label:"Delete",id:"delete",onClick:l,iconStart:i(k,{})}),e},[c,s,o,r,l,n,m,t])};export{L as useCheckActions};
2
2
  //# sourceMappingURL=useCheckActions.esm.js.map
@@ -1,2 +1,2 @@
1
- import{jsx as r}from"react/jsx-runtime";import{useRouteRef as R,useApi as g,configApiRef as b}from"@backstage/core-plugin-api";import{usePermission as y}from"@backstage/plugin-permission-react";import{RiExportLine as w,RiEditBoxLine as T,RiDeleteBinLine as x,RiRefreshLine as C}from"@remixicon/react";import{soundcheckTrackDeletePermission as D,soundcheckTrackUpdatePermission as E}from"@spotify/backstage-plugin-soundcheck-common";import{useCallback as h,useMemo as A}from"react";import{useNavigate as I}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 L}from"../../hooks/useConfirmationModal.esm.js";import"react-use/lib/useLocalStorage";import"../../graphql/generated/index.esm.js";import"react-use/lib/useAsync";import{useDeleteTrack as M}from"../../hooks/tracks/useDeleteTrack.esm.js";import{useRecertifyTrack as N}from"../../hooks/tracks/useRecertifyTrack.esm.js";import{trackEditRouteRef as O}from"../../routes.esm.js";import{exportTrack as S}from"../../utils/export.esm.js";const B=i=>{const{loading:s,allowed:m}=y({permission:D,resourceRef:i?.id}),{loading:a,allowed:n}=y({permission:E,resourceRef:i?.id}),{showModal:t}=L(),{mutate:c}=N(),{mutate:l}=M(),d=I(),p=R(O),u=g(b).getOptionalConfig("soundcheck.certifications.history");let e=u?.getOptionalBoolean("enable")?u?.getOptionalNumber("retentionTimeInDays")??120:1;e=Math.min(e,365);const f=h(async()=>{i?.id&&await t({title:"Recertify Track",message:`Are you sure you want to recertify track ${i.name??i.id}? It will erase existing certification data, which cannot be undone. New data will be generated for the past ${e} day(s), reflecting the track's current configuration. This process may take some time, you will be notified upon completion.`})&&c({trackId:i.id,numberOfDays:e})},[t,i?.id,i?.name,c,e]),k=h(async()=>{i?.id&&await t({title:"Delete Track",message:`Are you sure you want to delete track ${i.name??i.id}?`})&&l(i.id)},[t,i?.id,i?.name,l]);return A(()=>{if(!i)return[];const o=[{label:"Export",id:"export",onClick:()=>S(i),iconStart:r(w,{})}];return i.isEditable&&!a&&n&&o.push({label:"Edit",id:"edit",onClick:()=>d(p({trackId:i.id})),iconStart:r(T,{})}),i.isEditable&&!s&&m&&o.push({label:"Delete",id:"delete",onClick:k,iconStart:r(x,{})}),!a&&n&&o.push({label:"Recertify",id:"recertify",onClick:f,iconStart:r(C,{})}),o},[m,n,k,f,s,a,d,i,p])};export{B as useTrackActions};
1
+ import{jsx as r}from"react/jsx-runtime";import{useRouteRef as R,useApi as g,configApiRef as b}from"@backstage/core-plugin-api";import{usePermission as y}from"@backstage/plugin-permission-react";import{RiExportLine as w,RiEditBoxLine as T,RiDeleteBinLine as x,RiRefreshLine as C}from"@remixicon/react";import{soundcheckTrackDeletePermission as D,soundcheckTrackUpdatePermission as E}from"@spotify/backstage-plugin-soundcheck-common";import{useCallback as h,useMemo as A}from"react";import{useNavigate as I}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 L}from"../../hooks/useConfirmationModal.esm.js";import"react-use/lib/useLocalStorage";import"react-use/lib/useAsync";import"../../graphql/generated/index.esm.js";import"react-use/lib/useAsyncRetry";import{useDeleteTrack as M}from"../../hooks/tracks/useDeleteTrack.esm.js";import{useRecertifyTrack as N}from"../../hooks/tracks/useRecertifyTrack.esm.js";import{trackEditRouteRef as O}from"../../routes.esm.js";import{exportTrack as S}from"../../utils/export.esm.js";const B=i=>{const{loading:s,allowed:m}=y({permission:D,resourceRef:i?.id}),{loading:a,allowed:n}=y({permission:E,resourceRef:i?.id}),{showModal:e}=L(),{mutate:c}=N(),{mutate:l}=M(),p=I(),d=R(O),u=g(b).getOptionalConfig("soundcheck.certifications.history");let t=u?.getOptionalBoolean("enable")?u?.getOptionalNumber("retentionTimeInDays")??120:1;t=Math.min(t,365);const f=h(async()=>{i?.id&&await e({title:"Recertify Track",message:`Are you sure you want to recertify track ${i.name??i.id}? It will erase existing certification data, which cannot be undone. New data will be generated for the past ${t} day(s), reflecting the track's current configuration. This process may take some time, you will be notified upon completion.`})&&c({trackId:i.id,numberOfDays:t})},[e,i?.id,i?.name,c,t]),k=h(async()=>{i?.id&&await e({title:"Delete Track",message:`Are you sure you want to delete track ${i.name??i.id}?`})&&l(i.id)},[e,i?.id,i?.name,l]);return A(()=>{if(!i)return[];const o=[{label:"Export",id:"export",onClick:()=>S(i),iconStart:r(w,{})}];return i.isEditable&&!a&&n&&o.push({label:"Edit",id:"edit",onClick:()=>p(d({trackId:i.id})),iconStart:r(T,{})}),i.isEditable&&!s&&m&&o.push({label:"Delete",id:"delete",onClick:k,iconStart:r(x,{})}),!a&&n&&o.push({label:"Recertify",id:"recertify",onClick:f,iconStart:r(C,{})}),o},[m,n,k,f,s,a,p,i,d])};export{B as useTrackActions};
2
2
  //# sourceMappingURL=useTrackActions.esm.js.map
@@ -1,2 +1,2 @@
1
- import{jsx as o,jsxs as P,Fragment as D}from"react/jsx-runtime";import{useRouteRef as M}from"@backstage/core-plugin-api";import{entityRouteRef as q}from"@backstage/plugin-catalog-react";import{makeStyles as B,Grid as I}from"@material-ui/core";import{useContext as J,useEffect as y,useState as K,useRef as Q,useLayoutEffect as U,useMemo as X}from"react";import{VariableSizeGrid as Y}from"react-window";import"@backstage/catalog-model";import"@tanstack/react-query";import"../../api.esm.js";import"../../hooks/graphqlKeys.esm.js";import{useTrackOverviewForOwner as Z}from"../../hooks/certifications/useTrackOverviewForOwner.esm.js";import"@spotify/backstage-plugin-soundcheck-common";import"../../hooks/useSoundcheckAlert.esm.js";import"../../hooks/useConfirmationModal.esm.js";import"react-router-dom";import"react-use/lib/useLocalStorage";import"../../graphql/generated/index.esm.js";import"react-use/lib/useAsync";import{EmptyState as _}from"../EmptyState/EmptyState.esm.js";import"../EmptyState/EmptyStateBUI.esm.js";import"@backstage/plugin-permission-react";import"@remixicon/react";import"../../routes.esm.js";import"../OverviewPage/OverviewPage.esm.js";import"@spotify/backstage-plugin-core";import"../SoundcheckQueryClientProvider/SoundcheckQueryClientProvider.esm.js";import{OverviewPageContext as ee}from"../OverviewPage/OverviewPageContent.esm.js";import"../Pagination/Pagination.esm.js";import{useCursorPagination as te,CursorPagination as re}from"../Pagination/CursorPagination.esm.js";import{cellRenderer as oe}from"./Cell/cellRenderer.esm.js";import{OverviewTableSkeleton as ie}from"./OverviewTableSkeleton.esm.js";import{ResultsTableHeader as ne}from"./ResultsTableHeader.esm.js";import{generateRowsPivoted as ae,generateRows as le,generateHeaderRowPivoted as me,generateHeaderRow as se}from"./ResultsTableRow.esm.js";import{RowHeights as E,CellWidths as S,calculateTableWidth as ue}from"./resultsTableUtils.esm.js";import pe from"./useWindowDimensions.esm.js";const W=25,ce=B(i=>({table:{backgroundColor:i.palette.background.paper,borderCollapse:"collapse",whiteSpace:"nowrap",textAlign:"left",overflow:"auto"},tableContainer:{backgroundColor:i.palette.background.paper}})),de=({setError:i,kind:p,type:l,ownerEntityRef:t})=>{const{cursor:x,pageSize:R,...c}=te({defaultPageSize:W,label:"entitiesPerPage"}),{debouncedSearchValue:m,pivot:s}=J(ee),{data:e,isLoading:d,isError:b}=Z(t,{kind:p,type:l==="all"?null:l},R,x,m);y(()=>{c.setCursor(""),c.setCurrentPage(0)},[m]);const k=ce(),g=M(q);y(()=>{i?.(b?new Error("Error loading track overview"):void 0)},[b,i]);const[H,z]=K(0),{height:T}=pe(),n=Q(null);U(()=>{e&&t&&n?.current&&z(n.current.clientWidth?n.current.clientWidth-16:100)},[n,e,t]);const{rows:h,headerRow:f,tableWidth:w,entityRefsWithPadding:N,getRowHeight:O,columnCount:V}=X(()=>{if(d||!e||!t)return{};const{tracks:a,entityRefs:r}=e;if(!r)return{};const u=r.length>=25?r:[...r,...Array.from({length:25-r.length},()=>{})],C=s?ae(a,r,g):le(a,u,g),v=C[0]?.cells?.length??u.length+1,G=s?me(a):se(u),L=ue(v-1)+60;return{rows:C,headerRow:G,tableWidth:L,entityRefsWithPadding:u,getRowHeight:j=>C[j]?.height??E.check,columnCount:v}},[e,g,d,t,s]);if(d)return o(ie,{});if(!e||!t)return null;const{totalCount:$,endCursor:A,prevCursor:F}=e;return!f||!w||!N||!h?.length?m?o(_,{title:"No Entities Found",description:`No entities found with name containing: '${m}'`}):null:P("div",{ref:n,children:[o(I,{"aria-label":`Check results for ${l??p}`,item:!0,xs:12,className:k.tableContainer,children:H>0&&P(D,{children:[o(ne,{headerRow:f,gridWidth:w}),o(Y,{className:k.table,columnCount:V,columnWidth:a=>a===0?S.trackTitle:S.checkResult,rowCount:h.length,rowHeight:O,height:T*.7-E.paginationControl-f.height,width:w,children:oe(h)},s?"entityView":"checkView")]})},`${p}|${l??""}`),o(re,{...c,totalCount:$,defaultPageSize:W,endCursor:A,prevCursor:F,pageSize:R,labelRowsPerPage:"Entities per page:"})]})};export{de as ResultsTable};
1
+ import{jsx as o,jsxs as P,Fragment as D}from"react/jsx-runtime";import{useRouteRef as M}from"@backstage/core-plugin-api";import{entityRouteRef as q}from"@backstage/plugin-catalog-react";import{makeStyles as B,Grid as I}from"@material-ui/core";import{useContext as J,useEffect as y,useState as K,useRef as Q,useLayoutEffect as U,useMemo as X}from"react";import{VariableSizeGrid as Y}from"react-window";import"@backstage/catalog-model";import"@tanstack/react-query";import"../../api.esm.js";import"../../hooks/graphqlKeys.esm.js";import{useTrackOverviewForOwner as Z}from"../../hooks/certifications/useTrackOverviewForOwner.esm.js";import"@spotify/backstage-plugin-soundcheck-common";import"../../hooks/useSoundcheckAlert.esm.js";import"../../hooks/useConfirmationModal.esm.js";import"react-router-dom";import"react-use/lib/useLocalStorage";import"react-use/lib/useAsync";import"../../graphql/generated/index.esm.js";import"react-use/lib/useAsyncRetry";import{EmptyState as _}from"../EmptyState/EmptyState.esm.js";import"../EmptyState/EmptyStateBUI.esm.js";import"@backstage/plugin-permission-react";import"@remixicon/react";import"../../routes.esm.js";import"../OverviewPage/OverviewPage.esm.js";import"@spotify/backstage-plugin-core";import"../SoundcheckQueryClientProvider/SoundcheckQueryClientProvider.esm.js";import{OverviewPageContext as ee}from"../OverviewPage/OverviewPageContent.esm.js";import"../Pagination/Pagination.esm.js";import{useCursorPagination as te,CursorPagination as re}from"../Pagination/CursorPagination.esm.js";import{cellRenderer as oe}from"./Cell/cellRenderer.esm.js";import{OverviewTableSkeleton as ie}from"./OverviewTableSkeleton.esm.js";import{ResultsTableHeader as ne}from"./ResultsTableHeader.esm.js";import{generateRowsPivoted as ae,generateRows as le,generateHeaderRowPivoted as me,generateHeaderRow as se}from"./ResultsTableRow.esm.js";import{RowHeights as E,CellWidths as S,calculateTableWidth as ue}from"./resultsTableUtils.esm.js";import pe from"./useWindowDimensions.esm.js";const W=25,ce=B(i=>({table:{backgroundColor:i.palette.background.paper,borderCollapse:"collapse",whiteSpace:"nowrap",textAlign:"left",overflow:"auto"},tableContainer:{backgroundColor:i.palette.background.paper}})),de=({setError:i,kind:p,type:l,ownerEntityRef:t})=>{const{cursor:x,pageSize:R,...c}=te({defaultPageSize:W,label:"entitiesPerPage"}),{debouncedSearchValue:m,pivot:s}=J(ee),{data:e,isLoading:d,isError:b}=Z(t,{kind:p,type:l==="all"?null:l},R,x,m);y(()=>{c.setCursor(""),c.setCurrentPage(0)},[m]);const k=ce(),g=M(q);y(()=>{i?.(b?new Error("Error loading track overview"):void 0)},[b,i]);const[H,z]=K(0),{height:T}=pe(),n=Q(null);U(()=>{e&&t&&n?.current&&z(n.current.clientWidth?n.current.clientWidth-16:100)},[n,e,t]);const{rows:h,headerRow:f,tableWidth:w,entityRefsWithPadding:N,getRowHeight:O,columnCount:V}=X(()=>{if(d||!e||!t)return{};const{tracks:a,entityRefs:r}=e;if(!r)return{};const u=r.length>=25?r:[...r,...Array.from({length:25-r.length},()=>{})],C=s?ae(a,r,g):le(a,u,g),v=C[0]?.cells?.length??u.length+1,G=s?me(a):se(u),L=ue(v-1)+60;return{rows:C,headerRow:G,tableWidth:L,entityRefsWithPadding:u,getRowHeight:j=>C[j]?.height??E.check,columnCount:v}},[e,g,d,t,s]);if(d)return o(ie,{});if(!e||!t)return null;const{totalCount:$,endCursor:A,prevCursor:F}=e;return!f||!w||!N||!h?.length?m?o(_,{title:"No Entities Found",description:`No entities found with name containing: '${m}'`}):null:P("div",{ref:n,children:[o(I,{"aria-label":`Check results for ${l??p}`,item:!0,xs:12,className:k.tableContainer,children:H>0&&P(D,{children:[o(ne,{headerRow:f,gridWidth:w}),o(Y,{className:k.table,columnCount:V,columnWidth:a=>a===0?S.trackTitle:S.checkResult,rowCount:h.length,rowHeight:O,height:T*.7-E.paginationControl-f.height,width:w,children:oe(h)},s?"entityView":"checkView")]})},`${p}|${l??""}`),o(re,{...c,totalCount:$,defaultPageSize:W,endCursor:A,prevCursor:F,pageSize:R,labelRowsPerPage:"Entities per page:"})]})};export{de as ResultsTable};
2
2
  //# sourceMappingURL=ResultsTable.esm.js.map
@@ -1,2 +1,2 @@
1
- import{jsx as i}from"react/jsx-runtime";import{makeStyles as n,LinearProgress as p}from"@material-ui/core";import{useState as a}from"react";import s from"react-use/lib/useDebounce";import d from"react-use/lib/useUnmount";import"@backstage/catalog-model";import"@backstage/core-plugin-api";import{useIsFetching as c}from"@tanstack/react-query";import"../../api.esm.js";import"../../hooks/graphqlKeys.esm.js";import"@backstage/plugin-catalog-react";import"@spotify/backstage-plugin-soundcheck-common";import"../../hooks/useSoundcheckAlert.esm.js";import"../../hooks/useConfirmationModal.esm.js";import"react-router-dom";import"react-use/lib/useLocalStorage";import"../../graphql/generated/index.esm.js";import"react-use/lib/useAsync";import{FadeIn as f}from"../FadeIn/FadeIn.esm.js";const l=n(t=>({indicator:{position:"absolute",width:"100%",zIndex:t.zIndex.speedDial}})),h=()=>{const t=c(),r=l(),[o,m]=a(!!t),[u,e]=s(()=>{m(!!t)},250,[t]);return d(e),o?i(f,{children:i("div",{className:r.indicator,children:i(p,{variant:"indeterminate","data-testid":"refetching-indicator"})})}):null};export{h as RefetchingIndicator};
1
+ import{jsx as i}from"react/jsx-runtime";import{makeStyles as p,LinearProgress as n}from"@material-ui/core";import{useState as a}from"react";import s from"react-use/lib/useDebounce";import d from"react-use/lib/useUnmount";import"@backstage/catalog-model";import"@backstage/core-plugin-api";import{useIsFetching as c}from"@tanstack/react-query";import"../../api.esm.js";import"../../hooks/graphqlKeys.esm.js";import"@backstage/plugin-catalog-react";import"@spotify/backstage-plugin-soundcheck-common";import"../../hooks/useSoundcheckAlert.esm.js";import"../../hooks/useConfirmationModal.esm.js";import"react-router-dom";import"react-use/lib/useLocalStorage";import"react-use/lib/useAsync";import"../../graphql/generated/index.esm.js";import"react-use/lib/useAsyncRetry";import{FadeIn as f}from"../FadeIn/FadeIn.esm.js";const l=p(t=>({indicator:{position:"absolute",width:"100%",zIndex:t.zIndex.speedDial}})),h=()=>{const t=c(),r=l(),[o,m]=a(!!t),[u,e]=s(()=>{m(!!t)},250,[t]);return d(e),o?i(f,{children:i("div",{className:r.indicator,children:i(n,{variant:"indeterminate","data-testid":"refetching-indicator"})})}):null};export{h as RefetchingIndicator};
2
2
  //# sourceMappingURL=RefetchingIndicator.esm.js.map
@@ -1,2 +1,2 @@
1
- import{jsx as t,jsxs as s,Fragment as m}from"react/jsx-runtime";import{useRouteRef as p,useRouteRefParams as h}from"@backstage/core-plugin-api";import{useEntity as d}from"@backstage/plugin-catalog-react";import{SecretsContextProvider as L}from"@backstage/plugin-scaffolder-react";import{Routes as N,Route as l,Navigate as f}from"react-router-dom";import{ResultState as T}from"../graphql/generated/index.esm.js";import{useAllCertifications as S}from"../hooks/certifications/useAllCertifications.esm.js";import"@tanstack/react-query";import"../api.esm.js";import"../hooks/graphqlKeys.esm.js";import{useCertificationDetailsForTrack as C}from"../hooks/certifications/useCertificationDetailsForTrack.esm.js";import"@backstage/catalog-model";import"@spotify/backstage-plugin-soundcheck-common";import"react";import"../hooks/useSoundcheckAlert.esm.js";import"../hooks/useConfirmationModal.esm.js";import{usePlaylists as P}from"../hooks/playlists/usePlaylists.esm.js";import"react-use/lib/useLocalStorage";import"react-use/lib/useAsync";import{certificationPlaylistTrackCheckRouteRef as x,certificationPlaylistTrackRouteRef as k,certificationPlaylistRouteRef as R,certificationTrackRouteRef as y,certificationRouteRef as g}from"../routes.esm.js";import{EntityContent as n}from"./EntityContent/EntityContent.esm.js";const b=()=>{const{entity:i}=d(),e=p(R),a=p(y),{isLoading:r,data:o}=P(i),{isLoading:c,data:A}=S(i);if(r||c)return null;const u=o?.[0]?.id,I=A?.[0]?.track.id;return!u&&!I?null:t(f,{to:u?e({playlistId:u}):a({trackId:I}),replace:!0})},v=()=>{const{entity:i}=d(),{playlistId:e}=h(R),a=p(k),{data:r}=P(i),o=r?.find(c=>c.id===e)?.trackIds[0];return o?t(f,{to:a({playlistId:e,trackId:o}),replace:!0}):null},F=i=>(i?.levels?.flatMap(e=>e.checks??[])??[]).filter(e=>e.result!==T.Exempt&&e.result!==T.NotApplicable)[0],E=()=>{const{entity:i}=d(),{playlistId:e,trackId:a}=h(k),{data:r}=C(i,a),o=p(x),c=F(r)?.id??r?.levels[0]?.checks[0]?.id;return c?t(f,{to:o({playlistId:e,trackId:a,checkId:c}),replace:!0}):null},j=()=>{const{entity:i}=d(),{trackId:e}=h(y),a=p(g),{data:r}=C(i,e),o=F(r)?.id??r?.levels?.find(c=>c.checks.length>0)?.checks[0].id;return o?t(f,{to:a({trackId:e,checkId:o}),replace:!0}):null},D=()=>t(L,{children:s(N,{children:[t(l,{path:x.path,element:t(n,{})}),t(l,{path:k.path,element:s(m,{children:[t(n,{}),t(E,{})]})}),t(l,{path:R.path,element:s(m,{children:[t(n,{}),t(v,{})]})}),t(l,{path:y.path,element:s(m,{children:[t(n,{}),t(j,{})]})}),t(l,{path:g.path,element:t(n,{})}),t(l,{path:"/",element:s(m,{children:[t(n,{}),t(b,{})]})})]})});export{j as RedirectToFirstCheck,v as RedirectToFirstPlaylistTrack,E as RedirectToFirstPlaylistTrackCheck,D as Router};
1
+ import{jsx as t,jsxs as s,Fragment as m}from"react/jsx-runtime";import{useRouteRef as p,useRouteRefParams as h}from"@backstage/core-plugin-api";import{useEntity as d}from"@backstage/plugin-catalog-react";import{SecretsContextProvider as L}from"@backstage/plugin-scaffolder-react";import{Routes as N,Route as l,Navigate as f}from"react-router-dom";import{ResultState as T}from"../graphql/generated/index.esm.js";import{useAllCertifications as S}from"../hooks/certifications/useAllCertifications.esm.js";import"@tanstack/react-query";import"../api.esm.js";import"../hooks/graphqlKeys.esm.js";import{useCertificationDetailsForTrack as C}from"../hooks/certifications/useCertificationDetailsForTrack.esm.js";import"@backstage/catalog-model";import"@spotify/backstage-plugin-soundcheck-common";import"react";import"../hooks/useSoundcheckAlert.esm.js";import"../hooks/useConfirmationModal.esm.js";import{usePlaylists as P}from"../hooks/playlists/usePlaylists.esm.js";import"react-use/lib/useLocalStorage";import"react-use/lib/useAsync";import"react-use/lib/useAsyncRetry";import{certificationPlaylistTrackCheckRouteRef as x,certificationPlaylistTrackRouteRef as k,certificationPlaylistRouteRef as R,certificationTrackRouteRef as y,certificationRouteRef as g}from"../routes.esm.js";import{EntityContent as n}from"./EntityContent/EntityContent.esm.js";const b=()=>{const{entity:i}=d(),e=p(R),a=p(y),{isLoading:r,data:o}=P(i),{isLoading:c,data:A}=S(i);if(r||c)return null;const u=o?.[0]?.id,I=A?.[0]?.track.id;return!u&&!I?null:t(f,{to:u?e({playlistId:u}):a({trackId:I}),replace:!0})},v=()=>{const{entity:i}=d(),{playlistId:e}=h(R),a=p(k),{data:r}=P(i),o=r?.find(c=>c.id===e)?.trackIds[0];return o?t(f,{to:a({playlistId:e,trackId:o}),replace:!0}):null},F=i=>(i?.levels?.flatMap(e=>e.checks??[])??[]).filter(e=>e.result!==T.Exempt&&e.result!==T.NotApplicable)[0],E=()=>{const{entity:i}=d(),{playlistId:e,trackId:a}=h(k),{data:r}=C(i,a),o=p(x),c=F(r)?.id??r?.levels[0]?.checks[0]?.id;return c?t(f,{to:o({playlistId:e,trackId:a,checkId:c}),replace:!0}):null},j=()=>{const{entity:i}=d(),{trackId:e}=h(y),a=p(g),{data:r}=C(i,e),o=F(r)?.id??r?.levels?.find(c=>c.checks.length>0)?.checks[0].id;return o?t(f,{to:a({trackId:e,checkId:o}),replace:!0}):null},D=()=>t(L,{children:s(N,{children:[t(l,{path:x.path,element:t(n,{})}),t(l,{path:k.path,element:s(m,{children:[t(n,{}),t(E,{})]})}),t(l,{path:R.path,element:s(m,{children:[t(n,{}),t(v,{})]})}),t(l,{path:y.path,element:s(m,{children:[t(n,{}),t(j,{})]})}),t(l,{path:g.path,element:t(n,{})}),t(l,{path:"/",element:s(m,{children:[t(n,{}),t(b,{})]})})]})});export{j as RedirectToFirstCheck,v as RedirectToFirstPlaylistTrack,E as RedirectToFirstPlaylistTrackCheck,D as Router};
2
2
  //# sourceMappingURL=Router.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 p,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"../../graphql/generated/index.esm.js";import"react-use/lib/useAsync";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:d})=>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}),d&&o<d&&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:d}),"."]}),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,d]=p(""),[f,x]=p(""),[h,S]=p("normal"),[a,w]=p(""),[N,y]=p(!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=>d(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 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 p,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"../../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:d})=>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}),d&&o<d&&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:d}),"."]}),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,d]=p(""),[f,x]=p(""),[h,S]=p("normal"),[a,w]=p(""),[N,y]=p(!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=>d(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};
2
2
  //# sourceMappingURL=SendCampaignNotificationDialogBUI.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"../../graphql/generated/index.esm.js";import"react-use/lib/useAsync";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:e,name:m,description:s,documentationURL:a})=>{const f=h(g),p=r?f.forEntity(r):void 0,n=A();return u(R,{onAction:()=>t&&n(t),children:[i(x,{title:m,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:p?.snapshot.primaryTitle,src:l??p?.snapshot.primaryTitle}),i(w,{onClick:o=>o.stopPropagation(),children:i(P,{label:`${m} actions`,disabled:!e?.length,placement:"left top",menuActions:e??[],documentationURL:a,isHeaderMenu:!1})})]})};export{T as TableRowWithOwner};
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"../../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:e,description:s,documentationURL:a})=>{const f=h(g),p=r?f.forEntity(r):void 0,n=A();return u(R,{onAction:()=>t&&n(t),children:[i(x,{title:e,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:p?.snapshot.primaryTitle,src:l??p?.snapshot.primaryTitle}),i(w,{onClick:o=>o.stopPropagation(),children:i(P,{label:`${e} actions`,disabled:!m?.length,placement:"left top",menuActions:m??[],documentationURL:a,isHeaderMenu:!1})})]})};export{T 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"../../graphql/generated/index.esm.js";import"react-use/lib/useAsync";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 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"../../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};
2
2
  //# sourceMappingURL=TechInsightsPageBUI.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"../../graphql/generated/index.esm.js";import"react-use/lib/useAsync";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 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"../../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};
2
2
  //# sourceMappingURL=TechInsightsExplorerTable.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"../../graphql/generated/index.esm.js";import"react-use/lib/useAsync";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 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"../../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};
2
2
  //# sourceMappingURL=TopFailingChecksTableBUI.esm.js.map
@@ -1,2 +1,2 @@
1
- import{jsxs as p,Fragment as n,jsx as r}from"react/jsx-runtime";import{useRouteRef as f}from"@backstage/core-plugin-api";import{HeaderPage as u}from"@backstage/ui";import{useEffect as k}from"react";import{TrackFormProvider as d,useTrackFormContext as l}from"../../contexts/TrackFormContext.esm.js";import"../../contexts/CheckFormContext.esm.js";import"../../contexts/CampaignFormContext.esm.js";import"../../contexts/UserProvider.esm.js";import"@backstage/catalog-model";import"@tanstack/react-query";import"../../api.esm.js";import"../../hooks/graphqlKeys.esm.js";import"@backstage/plugin-catalog-react";import"@spotify/backstage-plugin-soundcheck-common";import"../../hooks/useSoundcheckAlert.esm.js";import{useCreateTrack as g}from"../../hooks/tracks/useCreateTrack.esm.js";import"../../hooks/useConfirmationModal.esm.js";import{useNavigateBack as T}from"../../hooks/useNavigateBack.esm.js";import"react-router-dom";import"react-use/lib/useLocalStorage";import"../../graphql/generated/index.esm.js";import"react-use/lib/useAsync";import{tracksPageRouteRef as e}from"../../routes.esm.js";import{DocLinkButton as h}from"../DocLinkButton/DocLinkButton.esm.js";import{TrackForm as C}from"../TrackForm/TrackForm.esm.js";const m=()=>{const{setIsLoading:o}=l(),{mutateAsync:i,isLoading:t}=g();k(()=>{o(t)},[o,t]);const[a,c]=T(e);return r(C,{handleClose:a,onSave:async s=>{await i(s,{onSuccess:c})}})},b=()=>{const o=f(e);return p(n,{children:[r(u,{title:"Create Track",breadcrumbs:[{label:"All Tracks",href:o()}],customActions:r(h,{href:"https://backstage.spotify.com/docs/plugins/soundcheck/core-concepts/tracks/"})}),r(d,{children:r(m,{})})]})};export{b as TrackCreatePage,m as TrackCreateView};
1
+ import{jsxs as p,Fragment as n,jsx as r}from"react/jsx-runtime";import{useRouteRef as f}from"@backstage/core-plugin-api";import{HeaderPage as u}from"@backstage/ui";import{useEffect as k}from"react";import{TrackFormProvider as d,useTrackFormContext as l}from"../../contexts/TrackFormContext.esm.js";import"../../contexts/CheckFormContext.esm.js";import"../../contexts/CampaignFormContext.esm.js";import"../../contexts/UserProvider.esm.js";import"@backstage/catalog-model";import"@tanstack/react-query";import"../../api.esm.js";import"../../hooks/graphqlKeys.esm.js";import"@backstage/plugin-catalog-react";import"@spotify/backstage-plugin-soundcheck-common";import"../../hooks/useSoundcheckAlert.esm.js";import{useCreateTrack as g}from"../../hooks/tracks/useCreateTrack.esm.js";import"../../hooks/useConfirmationModal.esm.js";import{useNavigateBack as T}from"../../hooks/useNavigateBack.esm.js";import"react-router-dom";import"react-use/lib/useLocalStorage";import"react-use/lib/useAsync";import"../../graphql/generated/index.esm.js";import"react-use/lib/useAsyncRetry";import{tracksPageRouteRef as e}from"../../routes.esm.js";import{DocLinkButton as h}from"../DocLinkButton/DocLinkButton.esm.js";import{TrackForm as C}from"../TrackForm/TrackForm.esm.js";const m=()=>{const{setIsLoading:o}=l(),{mutateAsync:i,isLoading:t}=g();k(()=>{o(t)},[o,t]);const[a,c]=T(e);return r(C,{handleClose:a,onSave:async s=>{await i(s,{onSuccess:c})}})},b=()=>{const o=f(e);return p(n,{children:[r(u,{title:"Create Track",breadcrumbs:[{label:"All Tracks",href:o()}],customActions:r(h,{href:"https://backstage.spotify.com/docs/plugins/soundcheck/core-concepts/tracks/"})}),r(d,{children:r(m,{})})]})};export{b as TrackCreatePage,m as TrackCreateView};
2
2
  //# sourceMappingURL=TrackCreatePage.esm.js.map
@@ -1,2 +1,2 @@
1
- import{jsxs as n,Fragment as d,jsx as r}from"react/jsx-runtime";import{useRouteRef as s}from"@backstage/core-plugin-api";import{usePermission as f}from"@backstage/plugin-permission-react";import{HeaderPage as k}from"@backstage/ui";import{soundcheckTrackUpdatePermission as l}from"@spotify/backstage-plugin-soundcheck-common";import{useParams as u}from"react-router-dom";import{TrackFormProvider as g}from"../../contexts/TrackFormContext.esm.js";import"../../contexts/CheckFormContext.esm.js";import"../../contexts/CampaignFormContext.esm.js";import"react";import"../../contexts/UserProvider.esm.js";import"@backstage/catalog-model";import"@tanstack/react-query";import"../../api.esm.js";import"../../hooks/graphqlKeys.esm.js";import"@backstage/plugin-catalog-react";import"../../hooks/useSoundcheckAlert.esm.js";import{useTrack as h}from"../../hooks/tracks/useTrack.esm.js";import"../../hooks/useConfirmationModal.esm.js";import"react-use/lib/useLocalStorage";import"../../graphql/generated/index.esm.js";import"react-use/lib/useAsync";import{trackDetailsRouteRef as P,tracksPageRouteRef as R}from"../../routes.esm.js";import{DocLinkButton as T}from"../DocLinkButton/DocLinkButton.esm.js";import{LoadingIndicator as b}from"../LoadingIndicator/LoadingIndicator.esm.js";import{PageWarningMessage as E}from"../PageWarningMessage/PageWarningMessage.esm.js";import{TrackEditView as w}from"./TrackEditView.esm.js";const I=()=>{const{trackId:o}=u(),{data:t,isLoading:i}=h(o),{loading:e,allowed:m}=f({permission:l,resourceRef:o}),a=m&&t?.isEditable,c=s(P),p=s(R);return n(d,{children:[r(k,{title:`Edit ${t?.name??o??"Track"}`,breadcrumbs:[{label:"All Tracks",href:p()},{label:"Details",href:c({trackId:o??""})}],customActions:r(T,{href:"https://backstage.spotify.com/docs/plugins/soundcheck/core-concepts/tracks/"})}),r(E,{entityName:"track",entityId:o,showNotFound:!i&&!t,showCannotEdit:!e&&!a}),i||e?r(b,{}):t&&a&&r(g,{children:r(w,{track:t,canEdit:m})})]})};export{I as TrackEditPage};
1
+ import{jsxs as n,Fragment as d,jsx as r}from"react/jsx-runtime";import{useRouteRef as s}from"@backstage/core-plugin-api";import{usePermission as f}from"@backstage/plugin-permission-react";import{HeaderPage as k}from"@backstage/ui";import{soundcheckTrackUpdatePermission as l}from"@spotify/backstage-plugin-soundcheck-common";import{useParams as u}from"react-router-dom";import{TrackFormProvider as g}from"../../contexts/TrackFormContext.esm.js";import"../../contexts/CheckFormContext.esm.js";import"../../contexts/CampaignFormContext.esm.js";import"react";import"../../contexts/UserProvider.esm.js";import"@backstage/catalog-model";import"@tanstack/react-query";import"../../api.esm.js";import"../../hooks/graphqlKeys.esm.js";import"@backstage/plugin-catalog-react";import"../../hooks/useSoundcheckAlert.esm.js";import{useTrack as h}from"../../hooks/tracks/useTrack.esm.js";import"../../hooks/useConfirmationModal.esm.js";import"react-use/lib/useLocalStorage";import"react-use/lib/useAsync";import"../../graphql/generated/index.esm.js";import"react-use/lib/useAsyncRetry";import{trackDetailsRouteRef as P,tracksPageRouteRef as R}from"../../routes.esm.js";import{DocLinkButton as T}from"../DocLinkButton/DocLinkButton.esm.js";import{LoadingIndicator as b}from"../LoadingIndicator/LoadingIndicator.esm.js";import{PageWarningMessage as E}from"../PageWarningMessage/PageWarningMessage.esm.js";import{TrackEditView as w}from"./TrackEditView.esm.js";const I=()=>{const{trackId:o}=u(),{data:t,isLoading:i}=h(o),{loading:e,allowed:m}=f({permission:l,resourceRef:o}),a=m&&t?.isEditable,c=s(P),p=s(R);return n(d,{children:[r(k,{title:`Edit ${t?.name??o??"Track"}`,breadcrumbs:[{label:"All Tracks",href:p()},{label:"Details",href:c({trackId:o??""})}],customActions:r(T,{href:"https://backstage.spotify.com/docs/plugins/soundcheck/core-concepts/tracks/"})}),r(E,{entityName:"track",entityId:o,showNotFound:!i&&!t,showCannotEdit:!e&&!a}),i||e?r(b,{}):t&&a&&r(g,{children:r(w,{track:t,canEdit:m})})]})};export{I as TrackEditPage};
2
2
  //# sourceMappingURL=TrackEditPage.esm.js.map
@@ -1,2 +1,2 @@
1
- import{jsx as l}from"react/jsx-runtime";import{useEffect as i,useCallback as f}from"react";import{useTrackFormContext as g}from"../../contexts/TrackFormContext.esm.js";import"../../contexts/CheckFormContext.esm.js";import"../../contexts/CampaignFormContext.esm.js";import"../../contexts/UserProvider.esm.js";import"@backstage/catalog-model";import"@backstage/core-plugin-api";import"@tanstack/react-query";import"../../api.esm.js";import"../../hooks/graphqlKeys.esm.js";import"@backstage/plugin-catalog-react";import"@spotify/backstage-plugin-soundcheck-common";import"../../hooks/useSoundcheckAlert.esm.js";import"../../hooks/useConfirmationModal.esm.js";import{useNavigateBack as y}from"../../hooks/useNavigateBack.esm.js";import"react-router-dom";import"react-use/lib/useLocalStorage";import"../../graphql/generated/index.esm.js";import"react-use/lib/useAsync";import{useUpdateTrack as E}from"../../hooks/tracks/useUpdateTrack.esm.js";import{tracksPageRouteRef as h}from"../../routes.esm.js";import"../SoundcheckHeader/SoundcheckHeader.esm.js";import"../SoundcheckHeader/SoundcheckHeaderContext.esm.js";import{useHeader as T}from"../SoundcheckHeader/useHeader.esm.js";import{TrackForm as w}from"../TrackForm/TrackForm.esm.js";const b=({track:t,canEdit:a})=>{const{setSelectedItem:m,setIsLoading:e,selectedItem:n,showReadOnly:r}=g(),{mutateAsync:s,isLoading:c}=E();i(()=>e(c),[e,c]);const o=!a||!t.isEditable;i(()=>{o?r(t):m(t)},[t,m,o,r]);const[d,p]=y(h),k=f(async u=>{await s(u,{onSuccess:p})},[p,s]);return i(()=>{},[t,r,o]),T({title:`${o?"View":"Edit"} Track`,description:"Edit your track's details to match your needs.",docLink:"https://backstage.spotify.com/docs/plugins/soundcheck/core-concepts/tracks"}),n?l(w,{handleClose:d,onSave:k}):null};export{b as TrackEditView};
1
+ import{jsx as l}from"react/jsx-runtime";import{useEffect as i,useCallback as f}from"react";import{useTrackFormContext as g}from"../../contexts/TrackFormContext.esm.js";import"../../contexts/CheckFormContext.esm.js";import"../../contexts/CampaignFormContext.esm.js";import"../../contexts/UserProvider.esm.js";import"@backstage/catalog-model";import"@backstage/core-plugin-api";import"@tanstack/react-query";import"../../api.esm.js";import"../../hooks/graphqlKeys.esm.js";import"@backstage/plugin-catalog-react";import"@spotify/backstage-plugin-soundcheck-common";import"../../hooks/useSoundcheckAlert.esm.js";import"../../hooks/useConfirmationModal.esm.js";import{useNavigateBack as y}from"../../hooks/useNavigateBack.esm.js";import"react-router-dom";import"react-use/lib/useLocalStorage";import"react-use/lib/useAsync";import"../../graphql/generated/index.esm.js";import"react-use/lib/useAsyncRetry";import{useUpdateTrack as E}from"../../hooks/tracks/useUpdateTrack.esm.js";import{tracksPageRouteRef as h}from"../../routes.esm.js";import"../SoundcheckHeader/SoundcheckHeader.esm.js";import"../SoundcheckHeader/SoundcheckHeaderContext.esm.js";import{useHeader as T}from"../SoundcheckHeader/useHeader.esm.js";import{TrackForm as w}from"../TrackForm/TrackForm.esm.js";const b=({track:t,canEdit:a})=>{const{setSelectedItem:m,setIsLoading:e,selectedItem:n,showReadOnly:r}=g(),{mutateAsync:s,isLoading:c}=E();i(()=>e(c),[e,c]);const o=!a||!t.isEditable;i(()=>{o?r(t):m(t)},[t,m,o,r]);const[d,p]=y(h),k=f(async u=>{await s(u,{onSuccess:p})},[p,s]);return i(()=>{},[t,r,o]),T({title:`${o?"View":"Edit"} Track`,description:"Edit your track's details to match your needs.",docLink:"https://backstage.spotify.com/docs/plugins/soundcheck/core-concepts/tracks"}),n?l(w,{handleClose:d,onSave:k}):null};export{b as TrackEditView};
2
2
  //# sourceMappingURL=TrackEditView.esm.js.map
@@ -1,2 +1,2 @@
1
- import{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{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{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"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};
2
2
  //# sourceMappingURL=useTrackForm.esm.js.map