@spotify/backstage-plugin-soundcheck 0.14.3 → 0.14.5

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 (93) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/config.d.ts +14 -0
  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/CampaignInsightsPage/CampaignInsightsPage.esm.js +1 -1
  6. package/dist/components/CampaignInsightsPage/CampaignStatusHistoryTile.esm.js +1 -1
  7. package/dist/components/CampaignInsightsPage/CampaignStatusTile.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/CertificationsPage/CertificationTab.esm.js +1 -1
  13. package/dist/components/CertificationsPage/CertificationTabs.esm.js +1 -1
  14. package/dist/components/CertificationsPage/CertificationsPage.esm.js +1 -1
  15. package/dist/components/CertificationsPage/Playlist/PlaylistContext.esm.js +1 -1
  16. package/dist/components/CheckCard/CheckCard.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/FormFields/RuleInput/Expressions/ExpressionTypeToggle.esm.js +1 -1
  20. package/dist/components/CheckForm/useCheckForm.esm.js +1 -1
  21. package/dist/components/CheckForm/utils/checkFormUtils.esm.js +1 -1
  22. package/dist/components/CheckPage/CheckDetailsView.esm.js +1 -1
  23. package/dist/components/CheckPage/CheckEditView.esm.js +1 -1
  24. package/dist/components/CheckPage/CheckEntitiesTable/CheckEntitiesTable.esm.js +1 -1
  25. package/dist/components/CheckPage/CheckInsightsPage.esm.js +1 -1
  26. package/dist/components/CollectorPage/Configurators/Common/CollectorOption.esm.js +1 -1
  27. package/dist/components/CollectorPage/Configurators/Common/CollectorSchedulingOptions.esm.js +2 -0
  28. package/dist/components/CollectorPage/Configurators/Common/FactCollectionConfig.esm.js +1 -1
  29. package/dist/components/CollectorPage/Configurators/Common/utils.esm.js +1 -1
  30. package/dist/components/CollectorPage/Configurators/DataDog/DataDogConfigurator.esm.js +1 -1
  31. package/dist/components/CollectorPage/Configurators/DataDog/utils.esm.js +1 -1
  32. package/dist/components/CollectorPage/Configurators/Github/GithubConfigurator.esm.js +1 -1
  33. package/dist/components/CollectorPage/Configurators/Github/utils.esm.js +1 -1
  34. package/dist/components/CollectorPage/Configurators/Gitlab/GitlabConfigurator.esm.js +1 -1
  35. package/dist/components/CollectorPage/Configurators/Gitlab/utils.esm.js +1 -1
  36. package/dist/components/CollectorPage/Configurators/Jira/JiraConfigurator.esm.js +1 -1
  37. package/dist/components/CollectorPage/Configurators/Jira/utils.esm.js +1 -1
  38. package/dist/components/CollectorPage/Configurators/Kubernetes/KubernetesConfigurator.esm.js +1 -1
  39. package/dist/components/CollectorPage/Configurators/Kubernetes/utils.esm.js +1 -1
  40. package/dist/components/CollectorPage/Configurators/NewRelic/NewRelicConfigurator.esm.js +1 -1
  41. package/dist/components/CollectorPage/Configurators/NewRelic/utils.esm.js +1 -1
  42. package/dist/components/CollectorPage/Configurators/PagerDuty/PagerDutyConfigurator.esm.js +1 -1
  43. package/dist/components/CollectorPage/Configurators/PagerDuty/utils.esm.js +1 -1
  44. package/dist/components/CollectorPage/Configurators/SCM/FactCollectionConfig.esm.js +1 -1
  45. package/dist/components/CollectorPage/Configurators/SCM/ScmConfigurator.esm.js +1 -1
  46. package/dist/components/CollectorPage/Configurators/SCM/utils.esm.js +1 -1
  47. package/dist/components/CollectorPage/Configurators/SCM/validation.esm.js +1 -1
  48. package/dist/components/CollectorPage/Configurators/SonarQube/SonarQubeConfigurator.esm.js +1 -1
  49. package/dist/components/CollectorPage/Configurators/SonarQube/utils.esm.js +1 -1
  50. package/dist/components/EntitySoundcheckCard/Card.esm.js +1 -1
  51. package/dist/components/LevelCard/LevelCard.esm.js +1 -1
  52. package/dist/components/LevelUpParty/LevelUpParty.esm.js +1 -1
  53. package/dist/components/OverviewPage/OverviewPageContent.esm.js +1 -1
  54. package/dist/components/OverviewPage/OverviewPageHeader.esm.js +1 -1
  55. package/dist/components/OverviewTable/ResultsTable.esm.js +1 -1
  56. package/dist/components/PassRateTable/PassRateTable.esm.js +2 -2
  57. package/dist/components/RefetchingIndicator/RefetchingIndicator.esm.js +1 -1
  58. package/dist/components/Router.esm.js +1 -1
  59. package/dist/components/RoutingPage/RoutingPage.esm.js +1 -1
  60. package/dist/components/TechHealth/Filters/FacetFilter.esm.js +1 -1
  61. package/dist/components/TechHealth/Filters/useFacetOptions.esm.js +1 -1
  62. package/dist/components/TechHealth/TechHealth.esm.js +1 -1
  63. package/dist/components/TechHealthSummary/SummaryAggregationsProvider.esm.js +1 -1
  64. package/dist/components/TechHealthTabs/CampaignResultsTab/CampaignResultsTab.esm.js +1 -1
  65. package/dist/components/TechHealthTabs/CheckResultsTab/CheckResultsTab.esm.js +1 -1
  66. package/dist/components/TechHealthTabs/EntityResultsTab/EntityResultsTab.esm.js +1 -1
  67. package/dist/components/TechHealthTabs/GroupResultsTab/GroupResultsTab.esm.js +1 -1
  68. package/dist/components/TechHealthTabs/TrackResultsTab/TrackResultsTab.esm.js +1 -1
  69. package/dist/components/TrackCreatePage/TrackCreatePage.esm.js +1 -1
  70. package/dist/components/TrackEditPage/TrackEditView.esm.js +1 -1
  71. package/dist/components/TrackForm/utils/useTrackForm.esm.js +1 -1
  72. package/dist/components/TrackPage/FilterBar/util.esm.js +2 -0
  73. package/dist/components/TrackPage/TrackEntitiesTable/TrackEntitiesTable.esm.js +1 -1
  74. package/dist/components/TrackPage/TrackPage.esm.js +1 -1
  75. package/dist/hooks/certifications/useProgramOverviewForOwner.esm.js +1 -1
  76. package/dist/hooks/checks/useUpdateCheck.esm.js +1 -1
  77. package/dist/hooks/facets/useFacetFilters.esm.js +1 -1
  78. package/dist/hooks/facets/useFacetsForOwner.esm.js +1 -1
  79. package/dist/hooks/graphqlKeys.esm.js +1 -1
  80. package/dist/hooks/groups/useAllGroups.esm.js +1 -1
  81. package/dist/hooks/groups/useUsersGroupClaims.esm.js +1 -1
  82. package/dist/hooks/tracks/useCreateTrack.esm.js +1 -1
  83. package/dist/hooks/tracks/useDeleteTrack.esm.js +1 -1
  84. package/dist/hooks/tracks/useUpdateTrack.esm.js +1 -1
  85. package/dist/utils/export.esm.js +3 -3
  86. package/dist/utils/getGroupFilterFromConfig.esm.js +2 -0
  87. package/package.json +21 -20
  88. package/dist/components/CampaignDetailsPage/CampaignDetailRow.esm.js +0 -2
  89. package/dist/components/CampaignDetailsPage/CampaignDetails.esm.js +0 -2
  90. package/dist/components/OverviewPage/CampaignBanner/CampaignArea.esm.js +0 -2
  91. package/dist/components/OverviewPage/CampaignBanner/CampaignBanner.esm.js +0 -2
  92. package/dist/components/OverviewPage/CampaignBanner/useCampaignBannerStyles.esm.js +0 -2
  93. package/dist/components/OverviewPage/CampaignBanner/utils.esm.js +0 -2
package/CHANGELOG.md CHANGED
@@ -1,5 +1,31 @@
1
1
  # @spotify/backstage-plugin-soundcheck
2
2
 
3
+ ## 0.14.5
4
+
5
+ ### Patch Changes
6
+
7
+ - Update to Backstage `v1.34.0`
8
+ - Remove campaign card from Soundcheck overview page. This campagin card has been superceded by the campagin insights page.
9
+ - Add batch size configuration to UI for integrations.
10
+ - Added GitHub `BranchRules` fact type (returns all active rules that apply to the specified branch).
11
+ - Overview pivot view toggle setting is now saved in local storage.
12
+ - Added support for specifying a filter Soundcheck will use when querying the catalog for groups.
13
+ - Small fix to include the path resolver in exported checks.
14
+ - Overview page now fetches items from cache and database. This should improve load times for users with large amounts of entities and/or checks.
15
+ - Resolves an issue with initial page size on the insight pages.
16
+ - Updated dependencies
17
+ - @spotify/backstage-plugin-core@0.8.4
18
+ - @spotify/backstage-plugin-soundcheck-common@0.14.5
19
+
20
+ ## 0.14.4
21
+
22
+ ### Patch Changes
23
+
24
+ - Resolved issue with combining multiple catalog filters.
25
+ - Campaign Insight tiles now respect the user's filters.
26
+ - Updated dependencies
27
+ - @spotify/backstage-plugin-soundcheck-common@0.14.4
28
+
3
29
  ## 0.14.3
4
30
 
5
31
  ### Patch Changes
package/config.d.ts CHANGED
@@ -17,5 +17,19 @@ export interface Config {
17
17
  * @visibility frontend
18
18
  */
19
19
  flags?: string[];
20
+ /**
21
+ * Provide additional filters when loading entities from the catalog.
22
+ *
23
+ * @deepVisibility frontend
24
+ */
25
+ entityFilters?: {
26
+ /**
27
+ * The filter to use when Soundcheck is looking for groups in the catalog. This should restrict groups to only
28
+ * those types who can own entities, and their ancestors.
29
+ *
30
+ * @deepVisibility frontend
31
+ */
32
+ group?: EntityFilter;
33
+ };
20
34
  };
21
35
  }
@@ -1,2 +1,2 @@
1
- import t,{useEffect as s}from"react";import"../../contexts/TrackFormContext.esm.js";import"../../contexts/CheckFormContext.esm.js";import{CampaignFormProvider as r,useCampaignFormContext as c}from"../../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{useCreateCampaign as g}from"../../hooks/campaigns/useCreateCampaign.esm.js";import"../../hooks/useSoundcheckAlert.esm.js";import"../../hooks/useConfirmationModal.esm.js";import{useNavigateBack as u}from"../../hooks/useNavigateBack.esm.js";import{campaignsPageRouteRef as l}from"../../routes.esm.js";import{CampaignForm as f}from"../CampaignForm/CampaignForm.esm.js";import"../SoundcheckHeader/SoundcheckHeader.esm.js";import"../SoundcheckHeader/SoundcheckHeaderContext.esm.js";import{useHeader as C}from"../SoundcheckHeader/useHeader.esm.js";const d=()=>{const{setIsLoading:e}=c(),{mutateAsync:m,isLoading:o}=g();s(()=>{e(o)},[e,o]);const[a,i]=u(l),n=async p=>{await m(p,{onSuccess:i})};return C({title:"Create a Campaign",description:"Create, monitor, and manage software updates or system transitions.",docLink:"https://backstage.spotify.com/docs/plugins/soundcheck/core-concepts/campaigns"}),t.createElement(r,null,t.createElement(f,{onSave:n,onCancel:a}))},E=()=>t.createElement(r,null,t.createElement(d,null));export{E as CampaignCreatePage};
1
+ import t,{useEffect as s}from"react";import"../../contexts/TrackFormContext.esm.js";import"../../contexts/CheckFormContext.esm.js";import{CampaignFormProvider as r,useCampaignFormContext as c}from"../../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{useCreateCampaign as g}from"../../hooks/campaigns/useCreateCampaign.esm.js";import"../../hooks/useSoundcheckAlert.esm.js";import"../../hooks/useConfirmationModal.esm.js";import{useNavigateBack as u}from"../../hooks/useNavigateBack.esm.js";import{campaignsPageRouteRef as l}from"../../routes.esm.js";import{CampaignForm as f}from"../CampaignForm/CampaignForm.esm.js";import"../SoundcheckHeader/SoundcheckHeader.esm.js";import"../SoundcheckHeader/SoundcheckHeaderContext.esm.js";import{useHeader as C}from"../SoundcheckHeader/useHeader.esm.js";const d=()=>{const{setIsLoading:e}=c(),{mutateAsync:m,isLoading:o}=g();s(()=>{e(o)},[e,o]);const[a,i]=u(l),n=async p=>{await m(p,{onSuccess:i})};return C({title:"Create a Campaign",description:"Create, monitor, and manage software updates or system transitions.",docLink:"https://backstage.spotify.com/docs/plugins/soundcheck/core-concepts/campaigns"}),t.createElement(r,null,t.createElement(f,{onSave:n,onCancel:a}))},E=()=>t.createElement(r,null,t.createElement(d,null));export{E as CampaignCreatePage};
2
2
  //# sourceMappingURL=CampaignCreatePage.esm.js.map
@@ -1,2 +1,2 @@
1
- import{zodResolver as h}from"@hookform/resolvers/zod";import{useMemo as d}from"react";import{useForm as C}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"../../../hooks/useSoundcheckAlert.esm.js";import{useConfirmationModal as S}from"../../../hooks/useConfirmationModal.esm.js";import"react-router-dom";import{useGetChecksMap as F}from"../../../hooks/tracks/useGetChecksMap.esm.js";import{DEFAULT_FORM_VALUES as V}from"../utils/campaignFormUtils.esm.js";import{campaignFormSchema as k}from"../utils/validation.esm.js";import{mapCampaignToFormValues as M,mapCampaignFormDataToCampaignInput as v}from"./utils.esm.js";const L=(e,o)=>{const a=d(()=>o?M(o):V,[o]),{control:m,handleSubmit:t,getValues:i,setValue:p,trigger:s,formState:{errors:n}}=C({defaultValues:a,mode:"onChange",resolver:h(k)}),{showModal:u}=S(),{checksMap:c,checkChips:g,checksLoading:l}=F();return{control:m,handleSubmit:t,getValues:i,setValue:p,trigger:s,errors:n,onSubmit:async r=>{if(!await u({title:"Save Campaign",message:`Are you sure you want to save campaign: ${r.detailsStep.name}?`,error:!1}))return;const f=v(r,o,c);e(f)},checkChips:g,checksLoading:l}};export{L as useCampaignForm};
1
+ import{zodResolver as h}from"@hookform/resolvers/zod";import{useMemo as d}from"react";import{useForm as C}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 S}from"../../../hooks/useConfirmationModal.esm.js";import"react-router-dom";import{useGetChecksMap as F}from"../../../hooks/tracks/useGetChecksMap.esm.js";import{DEFAULT_FORM_VALUES as V}from"../utils/campaignFormUtils.esm.js";import{campaignFormSchema as k}from"../utils/validation.esm.js";import{mapCampaignToFormValues as M,mapCampaignFormDataToCampaignInput as v}from"./utils.esm.js";const L=(e,o)=>{const m=d(()=>o?M(o):V,[o]),{control:t,handleSubmit:a,getValues:i,setValue:p,trigger:s,formState:{errors:n}}=C({defaultValues:m,mode:"onChange",resolver:h(k)}),{showModal:u}=S(),{checksMap:c,checkChips:g,checksLoading:l}=F();return{control:t,handleSubmit:a,getValues:i,setValue:p,trigger:s,errors:n,onSubmit:async r=>{if(!await u({title:"Save Campaign",message:`Are you sure you want to save campaign: ${r.detailsStep.name}?`,error:!1}))return;const f=v(r,o,c);e(f)},checkChips:g,checksLoading:l}};export{L as useCampaignForm};
2
2
  //# sourceMappingURL=useCampaignForm.esm.js.map
@@ -1,2 +1,2 @@
1
- import{MarkdownContent as M,Content as z}from"@backstage/core-components";import{useRouteRef as G}from"@backstage/core-plugin-api";import{EntityRefLink as O}from"@backstage/plugin-catalog-react";import{usePermission as C}from"@backstage/plugin-permission-react";import{makeStyles as F,Button as H,Paper as U,Grid as i,Typography as w,Box as V}from"@material-ui/core";import{soundcheckCampaignReadPermission as W,soundcheckCampaignUpdatePermission as $}from"@spotify/backstage-plugin-soundcheck-common";import{DateTime as N}from"luxon";import t,{useMemo as p}from"react";import{useParams as j,useNavigate as q}from"react-router-dom";import"@backstage/catalog-model";import"@tanstack/react-query";import"../../api.esm.js";import"../../hooks/graphqlKeys.esm.js";import"../../hooks/useSoundcheckAlert.esm.js";import{useGetCampaigns as A}from"../../hooks/campaigns/useGetCampaigns.esm.js";import"../../hooks/useConfirmationModal.esm.js";import{useSearchParam as o}from"../../hooks/useSearchParam.esm.js";import{campaignEditRouteRef as J}from"../../routes.esm.js";import{CheckCard as K}from"../CheckCard/CheckCard.esm.js";import{LoadingIndicator as Q}from"../LoadingIndicator/LoadingIndicator.esm.js";import{PageWarningMessage as X}from"../PageWarningMessage/PageWarningMessage.esm.js";import"../SoundcheckHeader/SoundcheckHeader.esm.js";import"../SoundcheckHeader/SoundcheckHeaderContext.esm.js";import{useHeader as Y}from"../SoundcheckHeader/useHeader.esm.js";import{FilterBar as Z}from"../TrackPage/FilterBar/FilterBar.esm.js";import{TrackEntitiesTable as _}from"../TrackPage/TrackEntitiesTable/TrackEntitiesTable.esm.js";import{CampaignStatusHistoryTile as ee}from"./CampaignStatusHistoryTile.esm.js";import{CampaignStatusTile as te}from"./CampaignStatusTile.esm.js";import{DaysRemainingTile as ae}from"./DaysRemainingTile.esm.js";const ne=F(e=>({root:{height:"100%",background:e.palette.background.default},header:{backgroundColor:e.palette.background.paper,borderRadius:0,marginBottom:e.spacing(2),paddingLeft:e.spacing(1),borderLeft:"none",borderRight:"none"},progressContainer:{display:"flex",marginBottom:e.spacing(3)},trackContainerContent:{paddingTop:e.spacing(1),paddingBottom:e.spacing(1),backgroundColor:e.palette.background.paper},editButton:{marginLeft:"auto"},checksContainer:{},entitiesContainer:{marginTop:e.spacing(3)},headerDescription:{fontSize:e.typography.body2.fontSize,margin:e.spacing(.5,0,0),"& p":{margin:0},"& a":{color:"inherit",textDecoration:"underline"}},content:{paddingTop:0},ownerLink:{"& span":{color:"inherit","&:hover":{textDecoration:"underline"}}},sectionTitle:{paddingBottom:e.spacing(1)}})),re=()=>{const e=ne(),[s,R]=o("owners"),[m,b]=o("lifecycles"),[c,v]=o("types"),[l,T]=o("systems"),{campaignId:r}=j(),{data:x,isLoading:d}=A({ids:[r],first:1}),n=x?.edges?.[0]?.node,a=n?.track,g=a?.levels?.[0],{loading:B,allowed:L}=C({permission:W,resourceRef:r}),{loading:f,allowed:u}=C({permission:$,resourceRef:r}),y=n?N.fromISO(n.startDate):void 0,S=y?Math.max(Math.ceil(N.now().diff(y,"days").days),1):void 0,E=q(),h=G(J),D=p(()=>a?.ownerEntityRef?t.createElement(O,{color:"inherit",entityRef:a.ownerEntityRef,className:e.ownerLink}):null,[a?.ownerEntityRef,e.ownerLink]),P=p(()=>!f&&u&&a?.isEditable?t.createElement(H,{className:e.editButton,variant:"contained",color:"primary",onClick:()=>{E(h({campaignId:r}))}},"Edit Campaign"):null,[u,e.editButton,h,f,E,a,r]),I=p(()=>a?.description?t.createElement(M,{className:e.headerDescription,content:a.description}):null,[e.headerDescription,a?.description]);return Y({title:a?.name,description:I,customSubtitle:D,sectionRight:P}),t.createElement("div",null,t.createElement(X,{entityName:"track",entityId:r,showNotFound:!d&&!n,showCannotView:!B&&!L}),d&&t.createElement(Q,null),a&&t.createElement("div",{className:e.root},t.createElement(U,{elevation:1,className:e.header},t.createElement(Z,{track:a,owners:s,setOwners:R,lifecycles:m,setLifecycles:b,types:c,setTypes:v,systems:l,setSystems:T})),t.createElement(z,{className:e.content},t.createElement("div",{className:e.progressContainer},t.createElement(i,{container:!0,spacing:2},t.createElement(i,{item:!0,xs:2},t.createElement(ae,{campaign:n})),t.createElement(i,{item:!0,xs:4},t.createElement(te,{campaign:n})),t.createElement(i,{item:!0,xs:6},t.createElement(ee,{campaign:n})))),t.createElement("div",{className:e.checksContainer},t.createElement(w,{variant:"h3",className:e.sectionTitle},"Checks"),g&&t.createElement(V,{className:e.content},t.createElement(i,{container:!0,spacing:1},g.checks.map(k=>t.createElement(i,{item:!0,xs:12,sm:6,md:4,key:k.id},t.createElement(K,{track:a,check:k,lifecycles:m,owners:s,types:c,systems:l,numberOfDays:S}))))),a&&t.createElement("div",{className:e.entitiesContainer},t.createElement(w,{variant:"h3",className:e.sectionTitle},"Entities"),t.createElement(_,{track:a,initialPageSize:10,lifecycles:m,owners:s,types:c,systems:l}))))))};export{re as CampaignInsightsPage};
1
+ import{MarkdownContent as z,Content as F}from"@backstage/core-components";import{useRouteRef as G}from"@backstage/core-plugin-api";import{EntityRefLink as O}from"@backstage/plugin-catalog-react";import{usePermission as w}from"@backstage/plugin-permission-react";import{makeStyles as H,Button as U,Paper as V,Grid as i,Typography as N,Box as W}from"@material-ui/core";import{soundcheckCampaignReadPermission as $,soundcheckCampaignUpdatePermission as j}from"@spotify/backstage-plugin-soundcheck-common";import{DateTime as R}from"luxon";import t,{useMemo as l}from"react";import{useParams as q,useNavigate as A}from"react-router-dom";import"@backstage/catalog-model";import"@tanstack/react-query";import"../../api.esm.js";import"../../hooks/graphqlKeys.esm.js";import"../../hooks/useSoundcheckAlert.esm.js";import{useGetCampaigns as J}from"../../hooks/campaigns/useGetCampaigns.esm.js";import"../../hooks/useConfirmationModal.esm.js";import{useSearchParam as p}from"../../hooks/useSearchParam.esm.js";import{campaignEditRouteRef as K}from"../../routes.esm.js";import{CheckCard as Q}from"../CheckCard/CheckCard.esm.js";import{LoadingIndicator as X}from"../LoadingIndicator/LoadingIndicator.esm.js";import{PageWarningMessage as Y}from"../PageWarningMessage/PageWarningMessage.esm.js";import"../SoundcheckHeader/SoundcheckHeader.esm.js";import"../SoundcheckHeader/SoundcheckHeaderContext.esm.js";import{useHeader as Z}from"../SoundcheckHeader/useHeader.esm.js";import{FilterBar as _}from"../TrackPage/FilterBar/FilterBar.esm.js";import{toFilter as ee}from"../TrackPage/FilterBar/util.esm.js";import{TrackEntitiesTable as te}from"../TrackPage/TrackEntitiesTable/TrackEntitiesTable.esm.js";import{CampaignStatusHistoryTile as ae}from"./CampaignStatusHistoryTile.esm.js";import{CampaignStatusTile as re}from"./CampaignStatusTile.esm.js";import{DaysRemainingTile as ne}from"./DaysRemainingTile.esm.js";const ie=H(e=>({root:{height:"100%",background:e.palette.background.default},header:{backgroundColor:e.palette.background.paper,borderRadius:0,marginBottom:e.spacing(2),paddingLeft:e.spacing(1),borderLeft:"none",borderRight:"none"},progressContainer:{display:"flex",marginBottom:e.spacing(3)},trackContainerContent:{paddingTop:e.spacing(1),paddingBottom:e.spacing(1),backgroundColor:e.palette.background.paper},editButton:{marginLeft:"auto"},checksContainer:{},entitiesContainer:{marginTop:e.spacing(3)},headerDescription:{fontSize:e.typography.body2.fontSize,margin:e.spacing(.5,0,0),"& p":{margin:0},"& a":{color:"inherit",textDecoration:"underline"}},content:{paddingTop:0},ownerLink:{"& span":{color:"inherit","&:hover":{textDecoration:"underline"}}},sectionTitle:{paddingBottom:e.spacing(1)}})),oe=()=>{const e=ie(),[o,b]=p("owners"),[s,T]=p("lifecycles"),[m,v]=p("types"),[c,x]=p("systems"),d=l(()=>ee({lifecycles:s,owners:o,types:m,systems:c}),[s,o,m,c]),{campaignId:n}=q(),{data:B,isLoading:g}=J({ids:[n],first:1}),r=B?.edges?.[0]?.node,a=r?.track,f=a?.levels?.[0],{loading:L,allowed:S}=w({permission:$,resourceRef:n}),{loading:u,allowed:y}=w({permission:j,resourceRef:n}),E=r?R.fromISO(r.startDate):void 0,D=E?Math.max(Math.ceil(R.now().diff(E,"days").days),1):void 0,h=A(),k=G(K),P=l(()=>a?.ownerEntityRef?t.createElement(O,{color:"inherit",entityRef:a.ownerEntityRef,className:e.ownerLink}):null,[a?.ownerEntityRef,e.ownerLink]),I=l(()=>!u&&y&&a?.isEditable?t.createElement(U,{className:e.editButton,variant:"contained",color:"primary",onClick:()=>{h(k({campaignId:n}))}},"Edit Campaign"):null,[y,e.editButton,k,u,h,a,n]),M=l(()=>a?.description?t.createElement(z,{className:e.headerDescription,content:a.description}):null,[e.headerDescription,a?.description]);return Z({title:a?.name,description:M,customSubtitle:P,sectionRight:I}),t.createElement("div",null,t.createElement(Y,{entityName:"track",entityId:n,showNotFound:!g&&!r,showCannotView:!L&&!S}),g&&t.createElement(X,null),a&&t.createElement("div",{className:e.root},t.createElement(V,{elevation:1,className:e.header},t.createElement(_,{track:a,owners:o,setOwners:b,lifecycles:s,setLifecycles:T,types:m,setTypes:v,systems:c,setSystems:x})),t.createElement(F,{className:e.content},t.createElement("div",{className:e.progressContainer},t.createElement(i,{container:!0,spacing:2},t.createElement(i,{item:!0,xs:2},t.createElement(ne,{campaign:r})),t.createElement(i,{item:!0,xs:4},t.createElement(re,{campaign:r,filter:d})),t.createElement(i,{item:!0,xs:6},t.createElement(ae,{campaign:r,filter:d})))),t.createElement("div",{className:e.checksContainer},t.createElement(N,{variant:"h3",className:e.sectionTitle},"Checks"),f&&t.createElement(W,{className:e.content},t.createElement(i,{container:!0,spacing:1},f.checks.map(C=>t.createElement(i,{item:!0,xs:12,sm:6,md:4,key:C.id},t.createElement(Q,{track:a,check:C,filter:d,numberOfDays:D}))))),a&&t.createElement("div",{className:e.entitiesContainer},t.createElement(N,{variant:"h3",className:e.sectionTitle},"Entities"),t.createElement(te,{track:a,initialPageSize:10,lifecycles:s,owners:o,types:m,systems:c}))))))};export{oe as CampaignInsightsPage};
2
2
  //# sourceMappingURL=CampaignInsightsPage.esm.js.map
@@ -1,2 +1,2 @@
1
- import{useTheme as p,Paper as l,Box as f}from"@material-ui/core";import{makeStyles as u}from"@material-ui/core/styles";import{DateTime as m}from"luxon";import i,{useMemo as h}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"../../hooks/useConfirmationModal.esm.js";import{useCertificationStatusHistory as y}from"../../hooks/aggregations/useCertificationStatusHistory.esm.js";import"react-router-dom";import{AreaChart as g}from"../AreaChart/AreaChart.esm.js";const x=u(t=>({card:{display:"flex",flexDirection:"column",border:`1px solid ${t.palette.divider}`,height:"100%",width:"100%"},title:{fontWeight:"bold",fontSize:"1.1rem",lineHeight:`${t.typography.h5.fontSize}px`,cursor:"default"},content:{padding:t.spacing(1,2,1,0),width:"100%",height:"100%"}}));function S({campaign:t}){const n=p(),a=x(),c=m.fromISO(t.startDate),d=Math.max(Math.ceil(m.now().diff(c,"days").days),1),{data:e}=y({trackId:t.track.id,numberOfDays:d},!!t),r=e?.certificationStatusHistory.numberOfEntities,o=h(()=>e?.certificationStatusHistory.history.map(s=>({date:s.date,Passed:s.statusByLevel[0].passed/r*100})),[r,e]);return i.createElement(l,{className:a.card},i.createElement(f,{className:a.content},o&&i.createElement(g,{data:o,categories:["Passed"],categoryColors:{Passed:n.palette.success.main},index:"date",minValue:0,maxValue:100,showLegend:!1})))}export{S as CampaignStatusHistoryTile};
1
+ import{useTheme as l,Paper as f,Box as u}from"@material-ui/core";import{makeStyles as h}from"@material-ui/core/styles";import{DateTime as m}from"luxon";import i,{useMemo as y}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"../../hooks/useConfirmationModal.esm.js";import{useCertificationStatusHistory as g}from"../../hooks/aggregations/useCertificationStatusHistory.esm.js";import"react-router-dom";import{AreaChart as x}from"../AreaChart/AreaChart.esm.js";const S=h(t=>({card:{display:"flex",flexDirection:"column",border:`1px solid ${t.palette.divider}`,height:"100%",width:"100%"},title:{fontWeight:"bold",fontSize:"1.1rem",lineHeight:`${t.typography.h5.fontSize}px`,cursor:"default"},content:{padding:t.spacing(1,2,1,0),width:"100%",height:"100%"}}));function H({campaign:t,filter:n}){const p=l(),a=S(),c=m.fromISO(t.startDate),d=Math.max(Math.ceil(m.now().diff(c,"days").days),1),{data:e}=g({trackId:t.track.id,filter:n,numberOfDays:d},!!t),r=e?.certificationStatusHistory.numberOfEntities,o=y(()=>e?.certificationStatusHistory.history.map(s=>({date:s.date,Passed:s.statusByLevel[0].passed/r*100})),[r,e]);return i.createElement(f,{className:a.card},i.createElement(u,{className:a.content},o&&i.createElement(x,{data:o,categories:["Passed"],categoryColors:{Passed:p.palette.success.main},index:"date",minValue:0,maxValue:100,showLegend:!1})))}export{H as CampaignStatusHistoryTile};
2
2
  //# sourceMappingURL=CampaignStatusHistoryTile.esm.js.map
@@ -1,2 +1,2 @@
1
- import{useTheme as b,Paper as F,Box as c,Grid as x,Typography as f}from"@material-ui/core";import{makeStyles as S}from"@material-ui/core/styles";import C from"@material-ui/icons/TrendingDown";import k from"@material-ui/icons/TrendingFlat";import B from"@material-ui/icons/TrendingUp";import{DateTime as E}from"luxon";import t,{useMemo as D}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"../../hooks/useConfirmationModal.esm.js";import{useCertificationStatus as I}from"../../hooks/aggregations/useCertificationStatus.esm.js";import{useCertificationStatusHistory as N}from"../../hooks/aggregations/useCertificationStatusHistory.esm.js";import"react-router-dom";import{CategoryBar as R}from"../CategoryBar/CategoryBar.esm.js";const v=S(e=>({card:{display:"flex",flexDirection:"column",border:`1px solid ${e.palette.divider}`},content:{padding:e.spacing(1),display:"flex",margin:e.spacing(1),gap:e.spacing(1)},item:{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:e.spacing(.5)},legendDash:{width:e.spacing(2),height:e.spacing(1),borderRadius:e.spacing(.375),marginRight:e.spacing(1)},category:{display:"flex",alignItems:"center",flex:1,marginRight:e.spacing(2)}}));function y({label:e,value:r,total:l,color:p,valueFormatter:a}){const s=v();return t.createElement(x,{item:!0,xs:12,className:s.item},t.createElement(c,{className:s.category},t.createElement("span",{className:s.legendDash,style:{backgroundColor:p}}),t.createElement(f,null,e)),l&&t.createElement(f,null,a(r)," of ",a(l)," (",Math.round(r/l*100),"%)"))}function T({campaign:e}){const r=b(),l=v(),{data:p}=I({trackId:e.track.id},!0),a=p?.certificationStatus.statusByLevel[0],s=Math.max(Math.ceil(E.now().diff(E.fromISO(e.startDate),"days").days),1),{data:g}=N({trackId:e.track.id,numberOfDays:s},!!e),o=p?.certificationStatus.numberOfEntities??0,m=D(()=>{if(o===void 0||g===void 0||a===void 0)return;const i=g.certificationStatusHistory.history[0].statusByLevel[0].passed/o*100;return a.passed/o*100-i},[g,a,o]),d=i=>i>=1e6?`${(i/1e6).toFixed(1)}M`:i>=1e3?`${(i/1e3).toFixed(1)}K`:i.toString();let u=k,n;return m!==void 0&&(n=`${m.toFixed(0)}% since campaign start`,m<=-1?(u=C,n=`-${n}`):m>=1&&(u=B,n=`+${n}`)),t.createElement(F,{className:l.card},t.createElement(c,{className:l.content},a&&t.createElement(c,{width:"100%"},t.createElement(R,{data:a,valueFormatter:d,categories:["passed","failed","notReported"],categoryFormatter:i=>i.replace(/\b\w/g,h=>h.toUpperCase()),colors:[r.palette.success.main,r.palette.error.main,r.palette.text.disabled]}),t.createElement(c,{paddingTop:"12px"},t.createElement(x,{spacing:2},t.createElement(y,{label:"Passing",value:a.passed,total:o,color:r.palette.success.main,valueFormatter:d}),t.createElement(y,{label:"Failing",value:a.failed,total:o,color:r.palette.error.main,valueFormatter:d}),t.createElement(y,{label:"Not Reported",value:a.notReported,total:o,color:r.palette.text.disabled,valueFormatter:d}),m!==void 0&&t.createElement(c,{display:"flex",alignItems:"center",paddingTop:"12px"},t.createElement(u,null),t.createElement(f,{style:{marginLeft:r.spacing(1)}},n)))))))}export{T as CampaignStatusTile};
1
+ import{useTheme as F,Paper as S,Box as c,Grid as x,Typography as f}from"@material-ui/core";import{makeStyles as C}from"@material-ui/core/styles";import T from"@material-ui/icons/TrendingDown";import k from"@material-ui/icons/TrendingFlat";import B from"@material-ui/icons/TrendingUp";import{DateTime as v}from"luxon";import t,{useMemo as D}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"../../hooks/useConfirmationModal.esm.js";import{useCertificationStatus as I}from"../../hooks/aggregations/useCertificationStatus.esm.js";import{useCertificationStatusHistory as N}from"../../hooks/aggregations/useCertificationStatusHistory.esm.js";import"react-router-dom";import{CategoryBar as R}from"../CategoryBar/CategoryBar.esm.js";const E=C(e=>({card:{display:"flex",flexDirection:"column",border:`1px solid ${e.palette.divider}`},content:{padding:e.spacing(1),display:"flex",margin:e.spacing(1),gap:e.spacing(1)},item:{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:e.spacing(.5)},legendDash:{width:e.spacing(2),height:e.spacing(1),borderRadius:e.spacing(.375),marginRight:e.spacing(1)},category:{display:"flex",alignItems:"center",flex:1,marginRight:e.spacing(2)}}));function y({label:e,value:n,total:r,color:p,valueFormatter:s}){const a=E();return t.createElement(x,{item:!0,xs:12,className:a.item},t.createElement(c,{className:a.category},t.createElement("span",{className:a.legendDash,style:{backgroundColor:p}}),t.createElement(f,null,e)),r&&t.createElement(f,null,s(n)," of ",s(r)," (",Math.round(n/r*100),"%)"))}function $({campaign:e,filter:n}){const r=F(),p=E(),{data:s}=I({trackId:e.track.id,filter:n},!0),a=s?.certificationStatus.statusByLevel[0],h=Math.max(Math.ceil(v.now().diff(v.fromISO(e.startDate),"days").days),1),{data:g}=N({trackId:e.track.id,filter:n,numberOfDays:h},!!e),o=s?.certificationStatus.numberOfEntities??0,m=D(()=>{if(o===void 0||g===void 0||a===void 0)return;const i=g.certificationStatusHistory.history[0].statusByLevel[0].passed/o*100;return a.passed/o*100-i},[g,a,o]),d=i=>i>=1e6?`${(i/1e6).toFixed(1)}M`:i>=1e3?`${(i/1e3).toFixed(1)}K`:i.toString();let u=k,l;return m!==void 0&&(l=`${m.toFixed(0)}% since campaign start`,m<=-1?(u=T,l=`-${l}`):m>=1&&(u=B,l=`+${l}`)),t.createElement(S,{className:p.card},t.createElement(c,{className:p.content},a&&t.createElement(c,{width:"100%"},t.createElement(R,{data:a,valueFormatter:d,categories:["passed","failed","notReported"],categoryFormatter:i=>i.replace(/\b\w/g,b=>b.toUpperCase()),colors:[r.palette.success.main,r.palette.error.main,r.palette.text.disabled]}),t.createElement(c,{paddingTop:"12px"},t.createElement(x,{spacing:2},t.createElement(y,{label:"Passing",value:a.passed,total:o,color:r.palette.success.main,valueFormatter:d}),t.createElement(y,{label:"Failing",value:a.failed,total:o,color:r.palette.error.main,valueFormatter:d}),t.createElement(y,{label:"Not Reported",value:a.notReported,total:o,color:r.palette.text.disabled,valueFormatter:d}),m!==void 0&&t.createElement(c,{display:"flex",alignItems:"center",paddingTop:"12px"},t.createElement(u,null),t.createElement(f,{style:{marginLeft:r.spacing(1)}},l)))))))}export{$ as CampaignStatusTile};
2
2
  //# sourceMappingURL=CampaignStatusTile.esm.js.map
@@ -1,2 +1,2 @@
1
- import t,{useEffect as d}from"react";import{useParams as g}from"react-router-dom";import"../../contexts/TrackFormContext.esm.js";import"../../contexts/CheckFormContext.esm.js";import{useCampaignFormContext as u}from"../../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"../../hooks/useSoundcheckAlert.esm.js";import{useUpdateCampaign as l}from"../../hooks/campaigns/useUpdateCampaign.esm.js";import"../../hooks/useConfirmationModal.esm.js";import{useNavigateBack as f}from"../../hooks/useNavigateBack.esm.js";import{useGetCampaign as C}from"../../hooks/campaigns/useGetCampaign.esm.js";import{campaignsPageRouteRef as E}from"../../routes.esm.js";import{CampaignForm as y}from"../CampaignForm/CampaignForm.esm.js";import"../SoundcheckHeader/SoundcheckHeader.esm.js";import"../SoundcheckHeader/SoundcheckHeaderContext.esm.js";import{useHeader as L}from"../SoundcheckHeader/useHeader.esm.js";import{Loading as h}from"../TechHealth/Loading/Loading.esm.js";import{EmptyCampaignState as k}from"./CampaignEmptyState.esm.js";const F=()=>{L({title:"Update Campaign",description:"Update your campaign, including schedule, milestones, and other associated details.",docLink:"https://backstage.spotify.com/docs/plugins/soundcheck/core-concepts/campaigns"});const[i,r]=f(E),{campaignId:p}=g(),{setIsLoading:e}=u(),{mutateAsync:n,isLoading:o}=l(),{data:s,isLoading:m}=C(p??""),a=s?.edges?.[0]?.node;return d(()=>e(o),[e,o]),!m&&!a?t.createElement(k,null):t.createElement(t.Fragment,null,m?t.createElement(h,null):t.createElement(y,{onSave:async c=>{await n(c,{onSuccess:r})},onCancel:i,selectedCampaign:a}))};export{F as EditCampaignView};
1
+ import t,{useEffect as d}from"react";import{useParams as g}from"react-router-dom";import"../../contexts/TrackFormContext.esm.js";import"../../contexts/CheckFormContext.esm.js";import{useCampaignFormContext as u}from"../../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{useUpdateCampaign as l}from"../../hooks/campaigns/useUpdateCampaign.esm.js";import"../../hooks/useConfirmationModal.esm.js";import{useNavigateBack as f}from"../../hooks/useNavigateBack.esm.js";import{useGetCampaign as C}from"../../hooks/campaigns/useGetCampaign.esm.js";import{campaignsPageRouteRef as E}from"../../routes.esm.js";import{CampaignForm as y}from"../CampaignForm/CampaignForm.esm.js";import"../SoundcheckHeader/SoundcheckHeader.esm.js";import"../SoundcheckHeader/SoundcheckHeaderContext.esm.js";import{useHeader as L}from"../SoundcheckHeader/useHeader.esm.js";import{Loading as h}from"../TechHealth/Loading/Loading.esm.js";import{EmptyCampaignState as k}from"./CampaignEmptyState.esm.js";const F=()=>{L({title:"Update Campaign",description:"Update your campaign, including schedule, milestones, and other associated details.",docLink:"https://backstage.spotify.com/docs/plugins/soundcheck/core-concepts/campaigns"});const[a,r]=f(E),{campaignId:p}=g(),{setIsLoading:e}=u(),{mutateAsync:n,isLoading:o}=l(),{data:s,isLoading:m}=C(p??""),i=s?.edges?.[0]?.node;return d(()=>e(o),[e,o]),!m&&!i?t.createElement(k,null):t.createElement(t.Fragment,null,m?t.createElement(h,null):t.createElement(y,{onSave:async c=>{await n(c,{onSuccess:r})},onCancel:a,selectedCampaign:i}))};export{F as EditCampaignView};
2
2
  //# sourceMappingURL=EditCampaignView.esm.js.map
@@ -1,2 +1,2 @@
1
- import{useEntity as u}from"@backstage/plugin-catalog-react";import{styled as o,Accordion as f,AccordionSummary as E,AccordionDetails as b,makeStyles as y,Box as h}from"@material-ui/core";import R from"@material-ui/icons/ExpandMore";import e,{useRef as v}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{useCertificationDetailsForTrack as x}from"../../hooks/certifications/useCertificationDetailsForTrack.esm.js";import"../../hooks/useSoundcheckAlert.esm.js";import"../../hooks/useConfirmationModal.esm.js";import"react-router-dom";import{AlertPanel as k}from"../AlertPanel/AlertPanel.esm.js";import"../CertificationSidebar/CertificationSidebar.esm.js";import{CertificationSummary as T}from"../CertificationSidebar/CertificationSummary.esm.js";import{CertificationSidebarSkeleton as I}from"../CertificationSidebar/skeletons/CertificationSidebarSkeleton.esm.js";import"@material-ui/lab";import{CertificationLevel as L}from"../CertificationSidebar/CertificationLevel.esm.js";const C=o(f)(({theme:t})=>({margin:"0",border:`1px solid ${t.palette.divider}`,borderRadius:0,"&.Mui-expanded":{borderRadius:0},"&:first-child":{borderTopLeftRadius:0,borderTopRightRadius:0},"&:last-child":{borderBottomLeftRadius:0,borderBottomRightRadius:0},"&:not(:first-child)":{borderTop:`1px solid ${t.palette.divider}`},"&:not(:last-child)":{marginBottom:t.spacing(1)}})),S=o(({...t})=>e.createElement(E,{classes:{content:"content",expanded:"expanded"},...t}))(({theme:t})=>({borderRadius:0,paddingTop:0,paddingLeft:0,paddingRight:t.spacing(1),"& > .content":{margin:"0 !important",padding:"0 !important"},"& > .content.expanded":{margin:"0 !important",padding:"0 !important"}})),A=o(b)(()=>({margin:"0 !important",borderRadius:0,padding:0})),n=y(()=>({sidebar:{width:"100%"}})),B=({playlistId:t,trackId:i,checkId:d})=>{const m=n(),{entity:c}=u(),p=v(null),{data:r,isLoading:l,isError:s}=x(c,i);if(s)return e.createElement("div",null,e.createElement(h,{padding:2},e.createElement(k,{severity:"error",title:"Error loading certification"})));if(l||!i)return e.createElement(I,null);if(!r)return null;const g=r.program.type==="campaign";return e.createElement(C,{ref:p,defaultExpanded:!0,elevation:0},e.createElement(S,{expandIcon:e.createElement(R,null),"aria-controls":"certification-content",id:"certification-summary"},e.createElement(T,{name:r.program.name,badge:r.highestLevel?.badge,description:r.program.description,documentationUrl:r.program.documentationURL,trackType:r.program.type})),e.createElement(A,null,e.createElement("div",{className:m.sidebar},r?.levels.map(a=>e.createElement(L,{key:a.ordinal,level:a,checkId:d,trackId:i,playlistId:t,isCampaign:g})))))};export{B as CertificationAccordion,n as useStyles};
1
+ import{useEntity as u}from"@backstage/plugin-catalog-react";import{styled as o,Accordion as f,AccordionSummary as E,AccordionDetails as b,makeStyles as y,Box as h}from"@material-ui/core";import R from"@material-ui/icons/ExpandMore";import e,{useRef as v}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{useCertificationDetailsForTrack as x}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{AlertPanel as k}from"../AlertPanel/AlertPanel.esm.js";import"../CertificationSidebar/CertificationSidebar.esm.js";import{CertificationSummary as T}from"../CertificationSidebar/CertificationSummary.esm.js";import{CertificationSidebarSkeleton as I}from"../CertificationSidebar/skeletons/CertificationSidebarSkeleton.esm.js";import"@material-ui/lab";import{CertificationLevel as L}from"../CertificationSidebar/CertificationLevel.esm.js";const C=o(f)(({theme:t})=>({margin:"0",border:`1px solid ${t.palette.divider}`,borderRadius:0,"&.Mui-expanded":{borderRadius:0},"&:first-child":{borderTopLeftRadius:0,borderTopRightRadius:0},"&:last-child":{borderBottomLeftRadius:0,borderBottomRightRadius:0},"&:not(:first-child)":{borderTop:`1px solid ${t.palette.divider}`},"&:not(:last-child)":{marginBottom:t.spacing(1)}})),S=o(({...t})=>e.createElement(E,{classes:{content:"content",expanded:"expanded"},...t}))(({theme:t})=>({borderRadius:0,paddingTop:0,paddingLeft:0,paddingRight:t.spacing(1),"& > .content":{margin:"0 !important",padding:"0 !important"},"& > .content.expanded":{margin:"0 !important",padding:"0 !important"}})),A=o(b)(()=>({margin:"0 !important",borderRadius:0,padding:0})),n=y(()=>({sidebar:{width:"100%"}})),B=({playlistId:t,trackId:i,checkId:d})=>{const m=n(),{entity:p}=u(),c=v(null),{data:r,isLoading:l,isError:s}=x(p,i);if(s)return e.createElement("div",null,e.createElement(h,{padding:2},e.createElement(k,{severity:"error",title:"Error loading certification"})));if(l||!i)return e.createElement(I,null);if(!r)return null;const g=r.program.type==="campaign";return e.createElement(C,{ref:c,defaultExpanded:!0,elevation:0},e.createElement(S,{expandIcon:e.createElement(R,null),"aria-controls":"certification-content",id:"certification-summary"},e.createElement(T,{name:r.program.name,badge:r.highestLevel?.badge,description:r.program.description,documentationUrl:r.program.documentationURL,trackType:r.program.type})),e.createElement(A,null,e.createElement("div",{className:m.sidebar},r?.levels.map(a=>e.createElement(L,{key:a.ordinal,level:a,checkId:d,trackId:i,playlistId:t,isCampaign:g})))))};export{B as CertificationAccordion,n as useStyles};
2
2
  //# sourceMappingURL=CertificationAccordion.esm.js.map
@@ -1,2 +1,2 @@
1
- import{useEntity as c}from"@backstage/plugin-catalog-react";import{makeStyles as d,Box as s}from"@material-ui/core";import r 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{useCertificationDetailsForTrack as f}from"../../hooks/certifications/useCertificationDetailsForTrack.esm.js";import"../../hooks/useSoundcheckAlert.esm.js";import"../../hooks/useConfirmationModal.esm.js";import"react-router-dom";import{AlertPanel as g}from"../AlertPanel/AlertPanel.esm.js";import{CertificationLevel as u}from"./CertificationLevel.esm.js";import{CertificationSummary as y}from"./CertificationSummary.esm.js";import{CertificationSidebarSkeleton as k}from"./skeletons/CertificationSidebarSkeleton.esm.js";import"@material-ui/lab";const E=d(()=>({checks:{padding:0,margin:0,flex:1,listStyle:"none"}})),v=({playlistId:o,trackId:t,checkId:a})=>{const{entity:m}=c(),{data:e,isLoading:n,isError:l}=f(m,t);if(l)return r.createElement("div",null,r.createElement(s,{padding:2},r.createElement(g,{severity:"error",title:"Error loading certification"})));if(n||!t)return r.createElement(k,null);if(!e)return null;const p=e.program.type==="campaign";return r.createElement("div",null,r.createElement(y,{name:e.program.name,badge:e.highestLevel?.badge,description:e.program.description,documentationUrl:e.program.documentationURL,trackType:e.program.type}),e?.levels.map(i=>r.createElement(u,{key:i.ordinal,level:i,checkId:a,trackId:t,playlistId:o,isCampaign:p})))};export{v as CertificationSidebar,E as useStyles};
1
+ import{useEntity as c}from"@backstage/plugin-catalog-react";import{makeStyles as d,Box as s}from"@material-ui/core";import r 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{useCertificationDetailsForTrack as f}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{AlertPanel as g}from"../AlertPanel/AlertPanel.esm.js";import{CertificationLevel as u}from"./CertificationLevel.esm.js";import{CertificationSummary as y}from"./CertificationSummary.esm.js";import{CertificationSidebarSkeleton as k}from"./skeletons/CertificationSidebarSkeleton.esm.js";import"@material-ui/lab";const E=d(()=>({checks:{padding:0,margin:0,flex:1,listStyle:"none"}})),v=({playlistId:o,trackId:t,checkId:a})=>{const{entity:m}=c(),{data:e,isLoading:n,isError:l}=f(m,t);if(l)return r.createElement("div",null,r.createElement(s,{padding:2},r.createElement(g,{severity:"error",title:"Error loading certification"})));if(n||!t)return r.createElement(k,null);if(!e)return null;const p=e.program.type==="campaign";return r.createElement("div",null,r.createElement(y,{name:e.program.name,badge:e.highestLevel?.badge,description:e.program.description,documentationUrl:e.program.documentationURL,trackType:e.program.type}),e?.levels.map(i=>r.createElement(u,{key:i.ordinal,level:i,checkId:a,trackId:t,playlistId:o,isCampaign:p})))};export{v as CertificationSidebar,E as useStyles};
2
2
  //# sourceMappingURL=CertificationSidebar.esm.js.map
@@ -1,2 +1,2 @@
1
- import{stringifyEntityRef as p}from"@backstage/catalog-model";import{useEntity as b}from"@backstage/plugin-catalog-react";import{makeStyles as v,Typography as x,Tooltip as z,IconButton as I,CircularProgress as T}from"@material-ui/core";import N from"@material-ui/icons/Refresh";import S from"classnames";import e,{useState as F,useMemo as L}from"react";import{Link as w}from"react-router-dom";import"@backstage/core-plugin-api";import"@tanstack/react-query";import"../../api.esm.js";import"../../hooks/graphqlKeys.esm.js";import{useGetChecks as A}from"../../hooks/checks/useGetChecks.esm.js";import"../../hooks/useSoundcheckAlert.esm.js";import"../../hooks/useConfirmationModal.esm.js";import{useExecuteCheck as B}from"../../hooks/checks/useExecuteCheck.esm.js";import"../CheckDryRun/CheckDryRun.esm.js";import"../SoundcheckDialog/SoundcheckDialog.esm.js";import{CheckDryRunDialogButton as D}from"../CheckDryRun/CheckDryRunDialogButton.esm.js";import"../CheckDryRun/CheckDryRunDetails.esm.js";import"../CheckDryRun/CheckDryRunContext.esm.js";import{mapCheckToCheckInput as G}from"../CheckDryRun/checkDryRunUtils.esm.js";import{CheckIcon as $}from"../CheckIcon/CheckIcon.esm.js";import{RelativeTime as H}from"../RelativeTime/RelativeTime.esm.js";const d=v(t=>({root:{display:"grid",width:"100%",gridTemplateColumns:"auto 1fr auto auto auto",gridColumnGap:t.spacing(.5),padding:t.spacing(1),alignItems:"center","&.selected":{backgroundColor:t.palette.action.hover},"&:hover, &:active, &:focus":{backgroundColor:t.palette.action.hover}}})),M=({className:t,href:a,name:r,children:m})=>a?e.createElement(w,{"aria-label":`select check ${r}`,to:a,className:t},m):e.createElement("div",{className:t},m),P=({result:t,name:a,id:r,timestamp:m,isExecutable:h=!1,selected:f=!1,href:g})=>{const k=d(),E=S(k.root,{selected:f}),{entity:i}=b(),{mutateAsync:y,isLoading:l}=B(),[o,C]=F(),{data:n}=A({ids:r?[r]:[]},!!o),s=L(()=>{const c=n?.edges?.[0]?.node;return c?G(c):null},[n?.edges]),R=async()=>{if(!i||!r)return;const c=await y({checkerId:r,entityRef:p(i),shouldRefreshFacts:!0}).catch(j=>{});c&&C(c)},u=!i||!r||!h;return e.createElement(M,{href:g,className:E,name:a},e.createElement($,{result:t}),e.createElement(x,{variant:"body2"},a),m&&!l?e.createElement(H,{timestamp:m}):null,!l&&e.createElement(e.Fragment,null,e.createElement(z,{title:"Execute Check",disableHoverListener:u},e.createElement("span",null,e.createElement(I,{size:"small",color:"inherit",onClick:R,disabled:u,"aria-label":"Execute Check"},e.createElement(N,{fontSize:"small"})))),!!o&&!!s&&e.createElement(D,{entityRef:p(i),check:s,checkResult:{checkResult:o.result,notes:o.details?.notes?.data??""},facts:o.facts,ruleResults:o.ruleResults,size:"small"})),l&&e.createElement(T,{color:"inherit",size:"1em"}))};export{P as Check,d as useStyles};
1
+ import{stringifyEntityRef as p}from"@backstage/catalog-model";import{useEntity as b}from"@backstage/plugin-catalog-react";import{makeStyles as v,Typography as x,Tooltip as z,IconButton as I,CircularProgress as T}from"@material-ui/core";import N from"@material-ui/icons/Refresh";import S from"classnames";import e,{useState as F,useMemo as L}from"react";import{Link as w}from"react-router-dom";import"@backstage/core-plugin-api";import"@tanstack/react-query";import"../../api.esm.js";import"../../hooks/graphqlKeys.esm.js";import"@spotify/backstage-plugin-soundcheck-common";import{useGetChecks as A}from"../../hooks/checks/useGetChecks.esm.js";import"../../hooks/useSoundcheckAlert.esm.js";import"../../hooks/useConfirmationModal.esm.js";import{useExecuteCheck as B}from"../../hooks/checks/useExecuteCheck.esm.js";import"../CheckDryRun/CheckDryRun.esm.js";import"../SoundcheckDialog/SoundcheckDialog.esm.js";import{CheckDryRunDialogButton as D}from"../CheckDryRun/CheckDryRunDialogButton.esm.js";import"../CheckDryRun/CheckDryRunDetails.esm.js";import"../CheckDryRun/CheckDryRunContext.esm.js";import{mapCheckToCheckInput as G}from"../CheckDryRun/checkDryRunUtils.esm.js";import{CheckIcon as $}from"../CheckIcon/CheckIcon.esm.js";import{RelativeTime as H}from"../RelativeTime/RelativeTime.esm.js";const d=v(t=>({root:{display:"grid",width:"100%",gridTemplateColumns:"auto 1fr auto auto auto",gridColumnGap:t.spacing(.5),padding:t.spacing(1),alignItems:"center","&.selected":{backgroundColor:t.palette.action.hover},"&:hover, &:active, &:focus":{backgroundColor:t.palette.action.hover}}})),M=({className:t,href:a,name:r,children:m})=>a?e.createElement(w,{"aria-label":`select check ${r}`,to:a,className:t},m):e.createElement("div",{className:t},m),P=({result:t,name:a,id:r,timestamp:m,isExecutable:h=!1,selected:f=!1,href:g})=>{const k=d(),E=S(k.root,{selected:f}),{entity:c}=b(),{mutateAsync:y,isLoading:l}=B(),[o,C]=F(),{data:n}=A({ids:r?[r]:[]},!!o),s=L(()=>{const i=n?.edges?.[0]?.node;return i?G(i):null},[n?.edges]),R=async()=>{if(!c||!r)return;const i=await y({checkerId:r,entityRef:p(c),shouldRefreshFacts:!0}).catch(j=>{});i&&C(i)},u=!c||!r||!h;return e.createElement(M,{href:g,className:E,name:a},e.createElement($,{result:t}),e.createElement(x,{variant:"body2"},a),m&&!l?e.createElement(H,{timestamp:m}):null,!l&&e.createElement(e.Fragment,null,e.createElement(z,{title:"Execute Check",disableHoverListener:u},e.createElement("span",null,e.createElement(I,{size:"small",color:"inherit",onClick:R,disabled:u,"aria-label":"Execute Check"},e.createElement(N,{fontSize:"small"})))),!!o&&!!s&&e.createElement(D,{entityRef:p(c),check:s,checkResult:{checkResult:o.result,notes:o.details?.notes?.data??""},facts:o.facts,ruleResults:o.ruleResults,size:"small"})),l&&e.createElement(T,{color:"inherit",size:"1em"}))};export{P as Check,d as useStyles};
2
2
  //# sourceMappingURL=Check.esm.js.map
@@ -1,2 +1,2 @@
1
- import{useEntity as c}from"@backstage/plugin-catalog-react";import{makeStyles as l,Tab as d}from"@material-ui/core";import t from"react";import{Link as g}from"react-router-dom";import"@backstage/catalog-model";import"@backstage/core-plugin-api";import"@tanstack/react-query";import"../../api.esm.js";import"../../hooks/graphqlKeys.esm.js";import{useCertificationDetailsForTrack as f}from"../../hooks/certifications/useCertificationDetailsForTrack.esm.js";import"../../hooks/useSoundcheckAlert.esm.js";import"../../hooks/useConfirmationModal.esm.js";import{CertificationBadge as b}from"../Badges/CertificationBadge.esm.js";const a=l(e=>({root:{maxWidth:"80ch",textTransform:"uppercase",paddingTop:e.spacing(2),paddingBottom:e.spacing(2)},wrapper:{display:"inline-block",textOverflow:"ellipsis",whiteSpace:"nowrap",overflow:"hidden"},badge:{marginRight:e.spacing(1)}})),u=({id:e,name:o,badge:i,href:p,selected:m=!1})=>{const r=a(),{entity:n}=c(),{data:s}=f(n,e);return t.createElement(d,{className:r.root,classes:{wrapper:r.wrapper},value:e,label:t.createElement(t.Fragment,null,t.createElement(b,{badge:i,trackType:s?.program.type,className:r.badge}),o),component:g,to:p,selected:m})};export{u as CertificationTab,a as useStyles};
1
+ import{useEntity as c}from"@backstage/plugin-catalog-react";import{makeStyles as l,Tab as d}from"@material-ui/core";import t from"react";import{Link as g}from"react-router-dom";import"@backstage/catalog-model";import"@backstage/core-plugin-api";import"@tanstack/react-query";import"../../api.esm.js";import"../../hooks/graphqlKeys.esm.js";import{useCertificationDetailsForTrack as f}from"../../hooks/certifications/useCertificationDetailsForTrack.esm.js";import"@spotify/backstage-plugin-soundcheck-common";import"../../hooks/useSoundcheckAlert.esm.js";import"../../hooks/useConfirmationModal.esm.js";import{CertificationBadge as b}from"../Badges/CertificationBadge.esm.js";const o=l(e=>({root:{maxWidth:"80ch",textTransform:"uppercase",paddingTop:e.spacing(2),paddingBottom:e.spacing(2)},wrapper:{display:"inline-block",textOverflow:"ellipsis",whiteSpace:"nowrap",overflow:"hidden"},badge:{marginRight:e.spacing(1)}})),u=({id:e,name:a,badge:i,href:p,selected:m=!1})=>{const r=o(),{entity:n}=c(),{data:s}=f(n,e);return t.createElement(d,{className:r.root,classes:{wrapper:r.wrapper},value:e,label:t.createElement(t.Fragment,null,t.createElement(b,{badge:i,trackType:s?.program.type,className:r.badge}),a),component:g,to:p,selected:m})};export{u as CertificationTab,o as useStyles};
2
2
  //# sourceMappingURL=CertificationTab.esm.js.map
@@ -1,2 +1,2 @@
1
- import{useRouteRef as p}from"@backstage/core-plugin-api";import{useEntity as y}from"@backstage/plugin-catalog-react";import{Tabs as g}from"@material-ui/core";import n from"react";import{useAllCertifications as b}from"../../hooks/certifications/useAllCertifications.esm.js";import"@tanstack/react-query";import"../../api.esm.js";import"../../hooks/graphqlKeys.esm.js";import"@backstage/catalog-model";import"../../hooks/useSoundcheckAlert.esm.js";import"../../hooks/useConfirmationModal.esm.js";import"react-router-dom";import{usePlaylists as h}from"../../hooks/playlists/usePlaylists.esm.js";import{certificationPlaylistRouteRef as C,certificationTrackRouteRef as k}from"../../routes.esm.js";import{CertificationTab as I}from"./CertificationTab.esm.js";import{PlaylistCertificationTab as R}from"./PlaylistCertificationTab.esm.js";import{CertificationTabsSkeleton as T}from"./skeletons/CertificationTabsSkeleton.esm.js";function E(m=[],t=[],o,l){if(o){const i=m.findIndex(a=>a.id===o);return i<0?!1:i}const r=t.findIndex(i=>i.program.id===l);return r<0?!1:r+m.length}const v=({playlistId:m,trackId:t})=>{const{entity:o}=y(),{isLoading:l,data:r}=b(o),{isLoading:i,data:a}=h(o),c=p(C),s=p(k);if(i||l||!t)return n.createElement(T,null);const d=E(a,r,m,t);return n.createElement(g,{value:d,indicatorColor:"primary","aria-label":"Certifications",variant:"scrollable"},a?.length&&a.map(({id:e,name:f})=>n.createElement(R,{key:e,id:e,name:f,selected:e===t,href:c({playlistId:e})})),r&&r.filter(({program:{type:e}})=>e!=="playlist").map(({program:{id:e,name:f},highestLevel:u})=>n.createElement(I,{key:e,id:e,name:f,badge:u?.badge,selected:e===t,href:s({trackId:e})})))};export{v as CertificationTabs};
1
+ import{useRouteRef as p}from"@backstage/core-plugin-api";import{useEntity as y}from"@backstage/plugin-catalog-react";import{Tabs as g}from"@material-ui/core";import n from"react";import{useAllCertifications as b}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 h}from"../../hooks/playlists/usePlaylists.esm.js";import{certificationPlaylistRouteRef as C,certificationTrackRouteRef as k}from"../../routes.esm.js";import{CertificationTab as I}from"./CertificationTab.esm.js";import{PlaylistCertificationTab as R}from"./PlaylistCertificationTab.esm.js";import{CertificationTabsSkeleton as T}from"./skeletons/CertificationTabsSkeleton.esm.js";function E(m=[],e=[],o,l){if(o){const i=m.findIndex(a=>a.id===o);return i<0?!1:i}const r=e.findIndex(i=>i.program.id===l);return r<0?!1:r+m.length}const v=({playlistId:m,trackId:e})=>{const{entity:o}=y(),{isLoading:l,data:r}=b(o),{isLoading:i,data:a}=h(o),c=p(C),s=p(k);if(i||l||!e)return n.createElement(T,null);const d=E(a,r,m,e);return n.createElement(g,{value:d,indicatorColor:"primary","aria-label":"Certifications",variant:"scrollable"},a?.length&&a.map(({id:t,name:f})=>n.createElement(R,{key:t,id:t,name:f,selected:t===e,href:c({playlistId:t})})),r&&r.filter(({program:{type:t}})=>t!=="playlist").map(({program:{id:t,name:f},highestLevel:u})=>n.createElement(I,{key:t,id:t,name:f,badge:u?.badge,selected:t===e,href:s({trackId:t})})))};export{v as CertificationTabs};
2
2
  //# sourceMappingURL=CertificationTabs.esm.js.map
@@ -1,2 +1,2 @@
1
- import{stringifyEntityRef as u}from"@backstage/catalog-model";import{useEntity as v}from"@backstage/plugin-catalog-react";import{makeStyles as h,Paper as I,Divider as k}from"@material-ui/core";import e from"react";import{useParams as g}from"react-router-dom";import{useAllCertifications as C}from"../../hooks/certifications/useAllCertifications.esm.js";import"@backstage/core-plugin-api";import"@tanstack/react-query";import"../../api.esm.js";import"../../hooks/graphqlKeys.esm.js";import"../../hooks/useSoundcheckAlert.esm.js";import"../../hooks/useConfirmationModal.esm.js";import{usePlaylists as P}from"../../hooks/playlists/usePlaylists.esm.js";import{AlertPanel as l}from"../AlertPanel/AlertPanel.esm.js";import{CertificationSidebar as b}from"../CertificationSidebar/CertificationSidebar.esm.js";import"../CertificationSidebar/CertificationSummary.esm.js";import"@material-ui/lab";import"../CertificationSidebar/Check.esm.js";import"../CertificationSidebar/LevelSummary.esm.js";import{isDarkTheme as R}from"../Charts/chartUtils.esm.js";import{CheckDetails as w}from"../CheckDetails/CheckDetails.esm.js";import"../CheckDryRun/CheckDryRun.esm.js";import"../SoundcheckDialog/SoundcheckDialog.esm.js";import"../CheckDryRun/CheckDryRunDetails.esm.js";import{CheckDryRunProvider as D}from"../CheckDryRun/CheckDryRunContext.esm.js";import"../CheckForm/utils/checkFormUtils.esm.js";import{NoCertifications as N}from"../EmptyState/EmptyState.esm.js";import{LevelUpParty as $}from"../LevelUpParty/LevelUpParty.esm.js";import{RefetchingIndicator as x}from"../RefetchingIndicator/RefetchingIndicator.esm.js";import{CertificationTabs as S}from"./CertificationTabs.esm.js";import{PlaylistComponent as T}from"./Playlist/PlaylistComponent.esm.js";const n=h(t=>({paper:{overflow:"hidden",position:"relative",border:R(t)?`1px solid ${t.palette.divider}`:void 0},view:{display:"grid",gridTemplateColumns:"1fr 2fr"},sidebar:{borderRight:`1px solid ${t.palette.divider}`}})),A=()=>{const{playlistId:t,trackId:r,checkId:a}=g(),m=n(),{entity:i}=v(),{isError:p,isFetched:s,data:c}=C(i),{isError:d,data:f}=P(i);if(p||d)return e.createElement(l,{severity:"error",title:"Error loading certifications"});const o=t&&f?.find(E=>E.id===t);if(t&&!o)return e.createElement(l,{severity:"error",title:"Playlist ${playlistId} not found."});if(s&&!c?.length)return e.createElement(N,null);const y=i?u(i):void 0;return e.createElement(D,null,e.createElement(I,{className:m.paper},e.createElement(x,null),e.createElement(S,{playlistId:t,trackId:r}),e.createElement(k,null),o&&e.createElement(T,{playlist:o,entityRef:y}),!o&&r&&e.createElement("div",{"data-testid":"soundcheck-certification-view",className:m.view},e.createElement("div",{className:m.sidebar},e.createElement(b,{trackId:r,checkId:a})),e.createElement(w,{programId:r,checkId:a}),e.createElement($,{programId:r}))))};export{A as CertificationsPage,n as useStyles};
1
+ import{stringifyEntityRef as u}from"@backstage/catalog-model";import{useEntity as v}from"@backstage/plugin-catalog-react";import{makeStyles as h,Paper as I,Divider as k}from"@material-ui/core";import e from"react";import{useParams as g}from"react-router-dom";import{useAllCertifications as C}from"../../hooks/certifications/useAllCertifications.esm.js";import"@backstage/core-plugin-api";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{usePlaylists as P}from"../../hooks/playlists/usePlaylists.esm.js";import{AlertPanel as l}from"../AlertPanel/AlertPanel.esm.js";import{CertificationSidebar as b}from"../CertificationSidebar/CertificationSidebar.esm.js";import"../CertificationSidebar/CertificationSummary.esm.js";import"@material-ui/lab";import"../CertificationSidebar/Check.esm.js";import"../CertificationSidebar/LevelSummary.esm.js";import{isDarkTheme as R}from"../Charts/chartUtils.esm.js";import{CheckDetails as w}from"../CheckDetails/CheckDetails.esm.js";import"../CheckDryRun/CheckDryRun.esm.js";import"../SoundcheckDialog/SoundcheckDialog.esm.js";import"../CheckDryRun/CheckDryRunDetails.esm.js";import{CheckDryRunProvider as D}from"../CheckDryRun/CheckDryRunContext.esm.js";import"../CheckForm/utils/checkFormUtils.esm.js";import{NoCertifications as N}from"../EmptyState/EmptyState.esm.js";import{LevelUpParty as $}from"../LevelUpParty/LevelUpParty.esm.js";import{RefetchingIndicator as x}from"../RefetchingIndicator/RefetchingIndicator.esm.js";import{CertificationTabs as S}from"./CertificationTabs.esm.js";import{PlaylistComponent as T}from"./Playlist/PlaylistComponent.esm.js";const n=h(t=>({paper:{overflow:"hidden",position:"relative",border:R(t)?`1px solid ${t.palette.divider}`:void 0},view:{display:"grid",gridTemplateColumns:"1fr 2fr"},sidebar:{borderRight:`1px solid ${t.palette.divider}`}})),A=()=>{const{playlistId:t,trackId:r,checkId:a}=g(),m=n(),{entity:i}=v(),{isError:p,isFetched:s,data:c}=C(i),{isError:d,data:f}=P(i);if(p||d)return e.createElement(l,{severity:"error",title:"Error loading certifications"});const o=t&&f?.find(E=>E.id===t);if(t&&!o)return e.createElement(l,{severity:"error",title:"Playlist ${playlistId} not found."});if(s&&!c?.length)return e.createElement(N,null);const y=i?u(i):void 0;return e.createElement(D,null,e.createElement(I,{className:m.paper},e.createElement(x,null),e.createElement(S,{playlistId:t,trackId:r}),e.createElement(k,null),o&&e.createElement(T,{playlist:o,entityRef:y}),!o&&r&&e.createElement("div",{"data-testid":"soundcheck-certification-view",className:m.view},e.createElement("div",{className:m.sidebar},e.createElement(b,{trackId:r,checkId:a})),e.createElement(w,{programId:r,checkId:a}),e.createElement($,{programId:r}))))};export{A as CertificationsPage,n as useStyles};
2
2
  //# sourceMappingURL=CertificationsPage.esm.js.map
@@ -1,2 +1,2 @@
1
- import n,{createContext as m,useContext as s}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{useCertificationDetails as a}from"../../../hooks/certifications/useCertificationDetails.esm.js";import"@backstage/plugin-catalog-react";import"../../../hooks/useSoundcheckAlert.esm.js";import"../../../hooks/useConfirmationModal.esm.js";import"react-router-dom";const i=m(void 0),c=()=>{const t=s(i);if(!t)throw new Error("useAPlaylistCertificationContext must be used within an PlaylistCertificationProvider");return t},l=t=>{const{children:r,entityRef:e}=t,o=a(e);return n.createElement(i.Provider,{value:o},r)};export{l as PlaylistCertificationProvider,c as usePlaylistCertificationContext};
1
+ import n,{createContext as m,useContext as s}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{useCertificationDetails as a}from"../../../hooks/certifications/useCertificationDetails.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";const i=m(void 0),p=()=>{const t=s(i);if(!t)throw new Error("useAPlaylistCertificationContext must be used within an PlaylistCertificationProvider");return t},c=t=>{const{children:r,entityRef:e}=t,o=a(e);return n.createElement(i.Provider,{value:o},r)};export{c as PlaylistCertificationProvider,p as usePlaylistCertificationContext};
2
2
  //# sourceMappingURL=PlaylistContext.esm.js.map
@@ -1,2 +1,2 @@
1
- import{makeStyles as $,useTheme as O,Box as a,Paper as P,Typography as T,Tooltip as I}from"@material-ui/core";import S from"@material-ui/lab/Skeleton";import{DateTime as W}from"luxon";import t from"react";import{CircularProgressbar as j,buildStyles as z}from"react-circular-progressbar";import{useCheckStatus as A}from"../../hooks/aggregations/useCheckStatus.esm.js";import{useCheckStatusHistory as G}from"../../hooks/aggregations/useCheckStatusHistory.esm.js";import{getChartFontColor as w,formatDate as H}from"../Charts/chartUtils.esm.js";import{getApplicableCheckCount as u}from"../TrackPage/TrackEntitiesTable/utils.esm.js";import{getProgressColor as E}from"../TrackPage/utils.esm.js";import{CheckHistoryChart as K}from"./CheckHistoryChart.esm.js";import{getCheckName as L}from"./utils.esm.js";const N=$(e=>({card:{display:"flex",flexDirection:"column",border:`1px solid ${e.palette.divider}`,width:"99%"},title:{fontWeight:"bold",fontSize:"0.9rem",cursor:"default",whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis"},headerRow:{display:"flex",padding:e.spacing(1,1),borderBottom:`1px solid ${e.palette.divider}`,width:"100%"},headerSection:{display:"flex",flexDirection:"column",gap:e.spacing(.5),flexGrow:1,width:"100%"},contentRow:{padding:e.spacing(1,1,0),display:"flex"},leftSection:{width:"75px",minWidth:"75px"},summaryCard:{height:"100%",display:"flex",flexDirection:"column",justifyContent:"space-between"},chartSection:{flex:1,width:"100%",minWidth:"150px"},chartSkeletonSection:{flex:1,width:"100%",minWidth:"150px",padding:e.spacing(0,0,1,1)},overallSummaryBox:{display:"flex",flexDirection:"column",height:"100%",color:w(e),textAlign:"center",gap:e.spacing(2)}})),M=()=>{const e=N();return t.createElement(a,{className:e.contentRow},t.createElement(a,{className:e.leftSection},t.createElement(a,{className:e.summaryCard},t.createElement(S,{variant:"circle",height:75}))),t.createElement(a,{className:e.chartSkeletonSection},t.createElement(S,{variant:"rect",height:92})))};function q(e){if(!e)return[];const{history:r}=e,o=W.utc();return r.map((l,s)=>{const c=u(l);return{name:H(o,r.length-s-1),passRate:c?Math.round(l.passed/c*100):100}})}function F(e){if(!e)return 0;const{passed:r}=e,o=u(e);return o?Math.round(r/o*100):100}function J(e){if(!e)return{numerator:0,denominator:0};const{passed:r}=e,o=u(e);return{numerator:r,denominator:o}}const Q=({check:e,track:r,lifecycles:o,owners:l,types:s,systems:c,numberOfDays:k=30})=>{const n=N(),m=O();let i={};o?.length&&(i["spec.lifecycle"]=o),l?.length&&(i["relations.ownedBy"]=l),s?.length&&(i["spec.type"]=s),c?.length&&(i["relations.partOf"]=c),Object.keys(i).length===0&&(i=void 0);const{data:d,isLoading:v}=A({checkId:e.id,trackId:r.id,filter:i}),{data:g,isLoading:D}=G({checkId:e.id,trackId:r.id,numberOfDays:k,filter:i}),b={dataKey:"passRate",name:"Pass rate"},R=g?.history?.length??0,B=q(g),p=F(d);let f;d?f=`${p}%`:f="No Data";let h;if(!d)h="No Data";else{const{numerator:x,denominator:C}=J(d);C>0?h=`${x} of ${C} entities passing`:h=`${x} entities passing`}const y=t.createElement(a,{className:n.overallSummaryBox},t.createElement(j,{value:p,text:f,styles:z({textColor:w(m),pathColor:E(m,p),trailColor:m.palette.divider,textSize:R?void 0:10})}));return t.createElement(P,{className:n.card,elevation:0},t.createElement(a,{className:n.headerRow},t.createElement(a,{className:n.headerSection},t.createElement(T,{className:n.title},L(r,e)))),D||v?t.createElement(M,null):t.createElement(I,{title:h},t.createElement(a,{className:n.contentRow},y&&t.createElement(a,{className:n.leftSection},t.createElement(a,{className:n.summaryCard},y)),t.createElement(a,{className:n.chartSection},t.createElement(K,{data:B,lineConfig:b,color:E(m,p)})))))};export{Q as CheckCard};
1
+ import{makeStyles as b,useTheme as D,Box as r,Paper as R,Typography as $,Tooltip as B}from"@material-ui/core";import x from"@material-ui/lab/Skeleton";import{DateTime as I}from"luxon";import t from"react";import{CircularProgressbar as O,buildStyles as P}from"react-circular-progressbar";import{useCheckStatus as T}from"../../hooks/aggregations/useCheckStatus.esm.js";import{useCheckStatusHistory as W}from"../../hooks/aggregations/useCheckStatusHistory.esm.js";import{getChartFontColor as y,formatDate as M}from"../Charts/chartUtils.esm.js";import{getApplicableCheckCount as p}from"../TrackPage/TrackEntitiesTable/utils.esm.js";import{getProgressColor as C}from"../TrackPage/utils.esm.js";import{CheckHistoryChart as j}from"./CheckHistoryChart.esm.js";import{getCheckName as z}from"./utils.esm.js";const S=b(e=>({card:{display:"flex",flexDirection:"column",border:`1px solid ${e.palette.divider}`,width:"99%"},title:{fontWeight:"bold",fontSize:"0.9rem",cursor:"default",whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis"},headerRow:{display:"flex",padding:e.spacing(1,1),borderBottom:`1px solid ${e.palette.divider}`,width:"100%"},headerSection:{display:"flex",flexDirection:"column",gap:e.spacing(.5),flexGrow:1,width:"100%"},contentRow:{padding:e.spacing(1,1,0),display:"flex"},leftSection:{width:"75px",minWidth:"75px"},summaryCard:{height:"100%",display:"flex",flexDirection:"column",justifyContent:"space-between"},chartSection:{flex:1,width:"100%",minWidth:"150px"},chartSkeletonSection:{flex:1,width:"100%",minWidth:"150px",padding:e.spacing(0,0,1,1)},overallSummaryBox:{display:"flex",flexDirection:"column",height:"100%",color:y(e),textAlign:"center",gap:e.spacing(2)}})),A=()=>{const e=S();return t.createElement(r,{className:e.contentRow},t.createElement(r,{className:e.leftSection},t.createElement(r,{className:e.summaryCard},t.createElement(x,{variant:"circle",height:75}))),t.createElement(r,{className:e.chartSkeletonSection},t.createElement(x,{variant:"rect",height:92})))};function H(e){if(!e)return[];const{history:o}=e,i=I.utc();return o.map((l,a)=>{const n=p(l);return{name:M(i,o.length-a-1),passRate:n?Math.round(l.passed/n*100):100}})}function L(e){if(!e)return 0;const{passed:o}=e,i=p(e);return i?Math.round(o/i*100):100}function F(e){if(!e)return{numerator:0,denominator:0};const{passed:o}=e,i=p(e);return{numerator:o,denominator:i}}const G=({check:e,track:o,filter:i,numberOfDays:l=30})=>{const a=S(),n=D(),{data:c,isLoading:E}=T({checkId:e.id,trackId:o.id,filter:i}),{data:f,isLoading:w}=W({checkId:e.id,trackId:o.id,numberOfDays:l,filter:i}),N={dataKey:"passRate",name:"Pass rate"},k=f?.history?.length??0,v=H(f),s=L(c);let d;c?d=`${s}%`:d="No Data";let m;if(!c)m="No Data";else{const{numerator:u,denominator:g}=F(c);g>0?m=`${u} of ${g} entities passing`:m=`${u} entities passing`}const h=t.createElement(r,{className:a.overallSummaryBox},t.createElement(O,{value:s,text:d,styles:P({textColor:y(n),pathColor:C(n,s),trailColor:n.palette.divider,textSize:k?void 0:10})}));return t.createElement(R,{className:a.card,elevation:0},t.createElement(r,{className:a.headerRow},t.createElement(r,{className:a.headerSection},t.createElement($,{className:a.title},z(o,e)))),w||E?t.createElement(A,null):t.createElement(B,{title:m},t.createElement(r,{className:a.contentRow},h&&t.createElement(r,{className:a.leftSection},t.createElement(r,{className:a.summaryCard},h)),t.createElement(r,{className:a.chartSection},t.createElement(j,{data:v,lineConfig:N,color:C(n,s)})))))};export{G as CheckCard};
2
2
  //# sourceMappingURL=CheckCard.esm.js.map
@@ -1,2 +1,2 @@
1
- import t,{useEffect as n}from"react";import{v4 as u}from"uuid";import"../../contexts/TrackFormContext.esm.js";import{CheckFormProvider as d,useCheckFormContext as f}from"../../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"../../hooks/useSoundcheckAlert.esm.js";import"../../hooks/useConfirmationModal.esm.js";import{useNavigateBack as g}from"../../hooks/useNavigateBack.esm.js";import{useCheckTemplates as h}from"../../hooks/checks/useCheckTemplates.esm.js";import{useCreateCheck as k}from"../../hooks/checks/useCreateCheck.esm.js";import{useSearchParam as C}from"../../hooks/useSearchParam.esm.js";import{checksPageRouteRef as y}from"../../routes.esm.js";import{CheckForm as E}from"../CheckForm/CheckForm.esm.js";import"../CheckForm/Steps/CheckDetailsStep.esm.js";import"../CheckForm/Steps/CheckRulesStep.esm.js";import{LoadingIndicator as I}from"../LoadingIndicator/LoadingIndicator.esm.js";import{PageWarningMessage as L}from"../PageWarningMessage/PageWarningMessage.esm.js";import"../SoundcheckHeader/SoundcheckHeader.esm.js";import"../SoundcheckHeader/SoundcheckHeaderContext.esm.js";import{useHeader as F}from"../SoundcheckHeader/useHeader.esm.js";const P=({template:e})=>{const{setIsLoading:o,selectedItem:m,setSelectedItem:r}=f(),{mutateAsync:i,isLoading:a}=k();n(()=>{r(e?{...e,id:u()}:null)},[e,r]),n(()=>{o(a)},[o,a]);const[c,s]=g(y),p=async l=>{await i(l,{onSuccess:s})};return F({title:"Create a Check",description:"Identify if your software meets organizational standards by setting up a check.",docLink:"https://backstage.spotify.com/docs/plugins/soundcheck/core-concepts/checks"}),e&&!m?null:t.createElement(E,{onSave:p,onClose:c})},v=()=>{const[[e]]=C("template"),{isLoading:o,data:m}=h(),r=e&&m?m.find(i=>i.id===e)??null:null;return t.createElement(t.Fragment,null,t.createElement(L,{entityName:"check template",entityId:e,showNotFound:!!e&&!o&&!r}),o&&t.createElement(I,null),t.createElement(d,null,!o&&(!e||r)&&t.createElement(P,{template:r})))};export{v as CheckCreatePage};
1
+ import t,{useEffect as n}from"react";import{v4 as u}from"uuid";import"../../contexts/TrackFormContext.esm.js";import{CheckFormProvider as d,useCheckFormContext as f}from"../../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 g}from"../../hooks/useNavigateBack.esm.js";import{useCheckTemplates as h}from"../../hooks/checks/useCheckTemplates.esm.js";import{useCreateCheck as k}from"../../hooks/checks/useCreateCheck.esm.js";import{useSearchParam as C}from"../../hooks/useSearchParam.esm.js";import{checksPageRouteRef as y}from"../../routes.esm.js";import{CheckForm as E}from"../CheckForm/CheckForm.esm.js";import"../CheckForm/Steps/CheckDetailsStep.esm.js";import"../CheckForm/Steps/CheckRulesStep.esm.js";import{LoadingIndicator as I}from"../LoadingIndicator/LoadingIndicator.esm.js";import{PageWarningMessage as L}from"../PageWarningMessage/PageWarningMessage.esm.js";import"../SoundcheckHeader/SoundcheckHeader.esm.js";import"../SoundcheckHeader/SoundcheckHeaderContext.esm.js";import{useHeader as F}from"../SoundcheckHeader/useHeader.esm.js";const P=({template:e})=>{const{setIsLoading:o,selectedItem:m,setSelectedItem:r}=f(),{mutateAsync:i,isLoading:a}=k();n(()=>{r(e?{...e,id:u()}:null)},[e,r]),n(()=>{o(a)},[o,a]);const[c,s]=g(y),p=async l=>{await i(l,{onSuccess:s})};return F({title:"Create a Check",description:"Identify if your software meets organizational standards by setting up a check.",docLink:"https://backstage.spotify.com/docs/plugins/soundcheck/core-concepts/checks"}),e&&!m?null:t.createElement(E,{onSave:p,onClose:c})},v=()=>{const[[e]]=C("template"),{isLoading:o,data:m}=h(),r=e&&m?m.find(i=>i.id===e)??null:null;return t.createElement(t.Fragment,null,t.createElement(L,{entityName:"check template",entityId:e,showNotFound:!!e&&!o&&!r}),o&&t.createElement(I,null),t.createElement(d,null,!o&&(!e||r)&&t.createElement(P,{template:r})))};export{v as CheckCreatePage};
2
2
  //# sourceMappingURL=CheckCreatePage.esm.js.map
@@ -1,2 +1,2 @@
1
- import{MarkdownContent as E}from"@backstage/core-components";import{useEntity as y}from"@backstage/plugin-catalog-react";import{makeStyles as k,Box as v,Typography as m}from"@material-ui/core";import t 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{useCheckDetails as S}from"../../hooks/checks/useCheckDetails.esm.js";import{useGetChecks as x}from"../../hooks/checks/useGetChecks.esm.js";import"../../hooks/useSoundcheckAlert.esm.js";import"../../hooks/useConfirmationModal.esm.js";import"react-router-dom";import{AlertPanel as C}from"../AlertPanel/AlertPanel.esm.js";import{RelativeTime as B}from"../RelativeTime/RelativeTime.esm.js";import{ResultStateBox as N}from"./ResultStateBox.esm.js";import{CheckDetailsSkeleton as z}from"./skeletons/CheckDetailsSkeleton.esm.js";const s=k(e=>({root:{padding:`${e.spacing(3)}px ${e.spacing(5)}px`},title:{fontWeight:"normal",fontSize:e.typography.h5.fontSize},description:{padding:`${e.spacing(3)}px 0`},subtitle:{fontWeight:"normal",fontSize:e.typography.h6.fontSize},topBar:{display:"flex",justifyContent:"space-between",marginBottom:e.spacing(2)}})),D=({programId:e,checkId:r})=>{const i=s(),{entity:p}=y(),{data:a,isLoading:l,isError:c}=S(p,e,r),{data:d}=x({ids:[r??""],first:1}),f=d?.edges?.[0]?.node;if(c)return t.createElement(v,{padding:2},t.createElement(C,{severity:"error",title:"Error loading check details"}));if(l||!e||!r)return t.createElement(z,null);if(!a)return null;const{name:o,description:u,result:g,timestamp:n,notes:h}=a;return t.createElement("div",{className:i.root,"data-testid":"check-details-view"},t.createElement("div",{className:i.topBar},t.createElement(m,{variant:"h2",className:i.title},o),n?t.createElement(B,{timestamp:n,description:"Last updated"}):null),t.createElement(N,{name:o,state:g,notes:h,templateRef:f?.templateRef??void 0}),t.createElement("div",{className:i.description,"data-testid":"soundcheck-check-details-description"},t.createElement(m,{variant:"h3",className:i.subtitle},"Description"),t.createElement(E,{content:u})))};export{D as CheckDetails,s as useStyles};
1
+ import{MarkdownContent as E}from"@backstage/core-components";import{useEntity as y}from"@backstage/plugin-catalog-react";import{makeStyles as k,Box as v,Typography as m}from"@material-ui/core";import t 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"@spotify/backstage-plugin-soundcheck-common";import{useCheckDetails as S}from"../../hooks/checks/useCheckDetails.esm.js";import{useGetChecks as x}from"../../hooks/checks/useGetChecks.esm.js";import"../../hooks/useSoundcheckAlert.esm.js";import"../../hooks/useConfirmationModal.esm.js";import"react-router-dom";import{AlertPanel as C}from"../AlertPanel/AlertPanel.esm.js";import{RelativeTime as B}from"../RelativeTime/RelativeTime.esm.js";import{ResultStateBox as N}from"./ResultStateBox.esm.js";import{CheckDetailsSkeleton as z}from"./skeletons/CheckDetailsSkeleton.esm.js";const s=k(e=>({root:{padding:`${e.spacing(3)}px ${e.spacing(5)}px`},title:{fontWeight:"normal",fontSize:e.typography.h5.fontSize},description:{padding:`${e.spacing(3)}px 0`},subtitle:{fontWeight:"normal",fontSize:e.typography.h6.fontSize},topBar:{display:"flex",justifyContent:"space-between",marginBottom:e.spacing(2)}})),D=({programId:e,checkId:r})=>{const i=s(),{entity:p}=y(),{data:o,isLoading:l,isError:c}=S(p,e,r),{data:d}=x({ids:[r??""],first:1}),f=d?.edges?.[0]?.node;if(c)return t.createElement(v,{padding:2},t.createElement(C,{severity:"error",title:"Error loading check details"}));if(l||!e||!r)return t.createElement(z,null);if(!o)return null;const{name:a,description:u,result:g,timestamp:n,notes:h}=o;return t.createElement("div",{className:i.root,"data-testid":"check-details-view"},t.createElement("div",{className:i.topBar},t.createElement(m,{variant:"h2",className:i.title},a),n?t.createElement(B,{timestamp:n,description:"Last updated"}):null),t.createElement(N,{name:a,state:g,notes:h,templateRef:f?.templateRef??void 0}),t.createElement("div",{className:i.description,"data-testid":"soundcheck-check-details-description"},t.createElement(m,{variant:"h3",className:i.subtitle},"Description"),t.createElement(E,{content:u})))};export{D as CheckDetails,s as useStyles};
2
2
  //# sourceMappingURL=CheckDetails.esm.js.map
@@ -1,2 +1,2 @@
1
- import{makeStyles as b,ButtonGroup as g,Button as k}from"@material-ui/core";import n,{useState as E}from"react";import{useFormContext as f,Controller as y}from"react-hook-form";import{ExpressionType as a,ExpressionTypeReadableMap as C}from"../../../types/ExpressionType.esm.js";import"../../../../Frequency/types.esm.js";import"../../../../Frequency/util.esm.js";import"../../../../Frequency/FrequencyComponent.esm.js";import"../../../types/Path.esm.js";const x=b(e=>({button:{backgroundColor:e.palette.background.paper,padding:e.spacing(.5,1.5)},selectedButton:{backgroundColor:e.palette.action.selected}})),B=({name:e,disabled:l})=>{const o=x(),{control:p,getValues:s}=f(),m=`${e}`,c=s(m),[i,u]=E(c||a.AllOf),d=r=>{u(r)};return n.createElement(y,{control:p,name:e,render:({field:{onChange:r}})=>n.createElement(g,{color:"primary"},Object.values(a).map(t=>n.createElement(k,{key:t,className:i===t?`${o.selectedButton} ${o.button}`:`${o.button}`,onClick:()=>{d(t),r(t)},disabled:l},C[t])))})};export{B as ExpressionTypeToggle};
1
+ import{makeStyles as b,ButtonGroup as g,Button as k}from"@material-ui/core";import n,{useState as E}from"react";import{useFormContext as f,Controller as y}from"react-hook-form";import{ExpressionType as a,ExpressionTypeReadableMap as C}from"../../../types/ExpressionType.esm.js";import"../../../../Frequency/types.esm.js";import"../../../../Frequency/util.esm.js";import"../../../../Frequency/FrequencyComponent.esm.js";import"../../../types/Path.esm.js";const x=b(e=>({button:{backgroundColor:e.palette.background.paper,padding:e.spacing(.5,1.5)},selectedButton:{backgroundColor:e.palette.action.hover}})),B=({name:e,disabled:l})=>{const o=x(),{control:p,getValues:m}=f(),s=`${e}`,c=m(s),[i,u]=E(c||a.AllOf),d=r=>{u(r)};return n.createElement(y,{control:p,name:e,render:({field:{onChange:r}})=>n.createElement(g,{color:"primary"},Object.values(a).map(t=>n.createElement(k,{key:t,className:i===t?`${o.selectedButton} ${o.button}`:`${o.button}`,onClick:()=>{d(t),r(t)},disabled:l},C[t])))})};export{B as ExpressionTypeToggle};
2
2
  //# sourceMappingURL=ExpressionTypeToggle.esm.js.map
@@ -1,2 +1,2 @@
1
- import{zodResolver as n}from"@hookform/resolvers/zod";import{useForm as a}from"react-hook-form";import"../../contexts/TrackFormContext.esm.js";import{useCheckFormContext as c}from"../../contexts/CheckFormContext.esm.js";import"../../contexts/CampaignFormContext.esm.js";import"react";import{useLoggedInUser as u}from"../../contexts/UserProvider.esm.js";import"@backstage/catalog-model";import"@backstage/core-plugin-api";import"@tanstack/react-query";import"../../api.esm.js";import"../../hooks/graphqlKeys.esm.js";import"@backstage/plugin-catalog-react";import"../../hooks/useSoundcheckAlert.esm.js";import{useConfirmationModal as f}from"../../hooks/useConfirmationModal.esm.js";import"react-router-dom";import{mapCheckerToFormValues as l,mapToCheckerInput as d,DEFAULT_FORM_VALUES as h}from"./utils/checkFormUtils.esm.js";import{checkFormSchema as C}from"./utils/validation.esm.js";const S=m=>{const{selectedItem:e}=c(),{userEntityRef:t}=u();let o=h;e&&(o=l(e)),t&&!o.detailsStep.ownerEntityRef&&(o.detailsStep.ownerEntityRef=t);const i=a({defaultValues:o,mode:"onChange",resolver:n(C)}),{showModal:s}=f();return{formMethods:i,onSubmit:async r=>{if(!await s({title:"Save Check",message:`Are you sure you want to save check: ${r.detailsStep.name}?`,error:!1}))return;const p=d(r,e);m(p)}}};export{S as useCheckForm};
1
+ import{zodResolver as n}from"@hookform/resolvers/zod";import{useForm as a}from"react-hook-form";import"../../contexts/TrackFormContext.esm.js";import{useCheckFormContext as c}from"../../contexts/CheckFormContext.esm.js";import"../../contexts/CampaignFormContext.esm.js";import"react";import{useLoggedInUser as u}from"../../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{useConfirmationModal as f}from"../../hooks/useConfirmationModal.esm.js";import"react-router-dom";import{mapCheckerToFormValues as l,mapToCheckerInput as d,DEFAULT_FORM_VALUES as h}from"./utils/checkFormUtils.esm.js";import{checkFormSchema as C}from"./utils/validation.esm.js";const S=m=>{const{selectedItem:e}=c(),{userEntityRef:t}=u();let o=h;e&&(o=l(e)),t&&!o.detailsStep.ownerEntityRef&&(o.detailsStep.ownerEntityRef=t);const i=a({defaultValues:o,mode:"onChange",resolver:n(C)}),{showModal:s}=f();return{formMethods:i,onSubmit:async r=>{if(!await s({title:"Save Check",message:`Are you sure you want to save check: ${r.detailsStep.name}?`,error:!1}))return;const p=d(r,e);m(p)}}};export{S as useCheckForm};
2
2
  //# sourceMappingURL=useCheckForm.esm.js.map
@@ -1,2 +1,2 @@
1
- import{FrequencySchema as b}from"@spotify/backstage-plugin-soundcheck-common";import{isObject as T}from"lodash";import{v4 as k}from"uuid";import{mapInputFilterToFormFilters as S,mapFiltersToInputFilter as R,mapFiltersToCatalogFilter as C}from"../../Filter/utils.esm.js";import"../../Filter/FilterComponent.esm.js";import{emptyFilters as P}from"../../Filter/types.esm.js";import{TimeUnit as y}from"../../Frequency/types.esm.js";import{isTimeUnit as A}from"../../Frequency/util.esm.js";import"../../Frequency/FrequencyComponent.esm.js";import{ExpressionType as p}from"../types/ExpressionType.esm.js";import{defaultSchedule as M}from"../types/Schedule.esm.js";import"../types/Path.esm.js";import{CHECK_NAME_MAX_LENGTH as F}from"./validation.esm.js";const g=e=>{if(T(e)&&"frequency"in e){const r=b.safeParse(e.frequency);if(r.success){const t=r.data;if("cron"in t)return{enabled:!0,frequency:{type:"cron",unit:y.Hours,value:1,cron:t.cron}};const s=Object.keys(t);if(s.length){const o=s[0];if(A(o))return{enabled:!0,frequency:{type:"HumanDuration",unit:o,value:t[o]??1,cron:""}}}}}return{enabled:!1,frequency:{type:"HumanDuration",unit:y.Hours,value:1,cron:""}}},x=(e,r)=>{const{enabled:t,frequency:s}=e;if(t){const{cron:o,type:n,unit:a,value:c}=s;return n==="HumanDuration"?{frequency:{[a]:c},filter:C(r)}:{frequency:{cron:o}}}},d=e=>{if(Array.isArray(e))return e.map(r=>d(r));if(typeof e=="string"){if(e==="true")return!0;if(e==="false")return!1;const r=Number(e);if(!isNaN(r))return r}return e},l=e=>{if(!e)return{};if(e.expressionType){const r={[e.expressionType]:e.conditions?.map(t=>({factRef:t.factRef,path:t.path,operator:t.operatorPrefix?`${t.operatorPrefix}:${t.operator}`:t.operator,value:d(t.value)}))};return e.expressions&&e.expressions.forEach(t=>{r[e.expressionType]?.push(l(t))}),r}if(e.expressions)return e.expressions.map(l);if(e.conditions&&e.conditions.length===1){const r=e.conditions[0];return{factRef:r.factRef,path:r.path,operator:r.operatorPrefix?`${r.operatorPrefix}:${r.operator}`:r.operator,value:d(r.value)}}return{}},v=e=>{if(e?.match(/.:./)){const r=e.split(":");if(["all","any","none"].includes(r[0]))return{operator:r[1],operatorPrefix:r[0]}}return{}},h=(e,r=!0)=>{if(!e)return{conditions:[]};const t=Object.keys(e);let s=t.includes("all")||r&&!t.includes("any")?p.AllOf:p.AnyOf;if(t.includes("not")&&(s=p.Not),t.includes(s)||r){const a=e[s]||[e],c=[],u=[];return a.forEach(i=>{const f=Object.keys(i);if(f.includes("all")||f.includes("any")||f.includes("not"))u.push(h(i,!1));else{const{operator:w,operatorPrefix:E}=v(i.operator);c.push({factRef:i.factRef,path:i.path,operator:w??i.operator,value:i.value,operatorPrefix:E})}}),{expressions:u.length>0?u:void 0,conditions:c,expressionType:s}}const{operator:o,operatorPrefix:n}=v(e.operator);return{expressionType:p.AllOf,conditions:[{factRef:e.factRef,path:e.path,operator:o??e.operator,value:e.value,operatorPrefix:n}]}},O=e=>({detailsStep:{name:e.name??"",description:e.description??"",ownerEntityRef:e.ownerEntityRef??""},rulesStep:{pathResolver:e.pathResolver??"jsonpath",expressions:h(e.rule),passedMessage:e.passedMessage??void 0,failedMessage:e.failedMessage??void 0,warning:e.warning??!1},filtersStep:{filter:S(e.filter)},scheduleStep:{schedule:g(e.schedule)}}),q=(e,r)=>{const{detailsStep:t,rulesStep:s,filtersStep:o,scheduleStep:n}=e;return{id:r?r.id:k(),ownerEntityRef:t.ownerEntityRef??void 0,name:t.name,description:t.description,pathResolver:s.pathResolver,passedMessage:s.passedMessage??void 0,failedMessage:s.failedMessage??void 0,rule:l(s.expressions),warning:s.warning??!1,filter:o.filter?R(o.filter):void 0,schedule:x(n.schedule,o.filter)}},m=(e,r="$")=>{const t=[];if(e.type==="object"&&e.properties){const s=e.properties;for(const o in s)if(s.hasOwnProperty(o)){const n=`${r}.${o}`;t.push(n);const a=s[o];t.push(...m(a,n))}}if(e.type==="array"&&e.items){const s=`${r}[*]`;t.push(s);const o=Array.isArray(e.items)?e.items:[e.items];for(const n of o)t.push(...m(n,s))}return t},N={detailsStep:{name:"",description:"",ownerEntityRef:""},rulesStep:{pathResolver:"jsonpath",expressions:{expressionType:p.AllOf,expressions:void 0,conditions:[{factRef:"",path:"",operator:"",operatorPrefix:"",value:"",conditions:[]}]},warning:!1},filtersStep:{filter:P()},scheduleStep:{schedule:M()}},$={details:{name:{name:"Check name",helperText:`Max ${F} characters`,placeholder:"Name your check (e.g., 'Code Coverage\u2019)"},description:{name:"Check description",placeholder:"Describe your check clearly so others understand its purpose. e.g., 'Ensure code coverage meets the minimum threshold.'"},owner:{name:"Check owner",selectLabel:"Assign an owner"}},rulesStep:{rules:{name:"Check rules",description:"Define the rules the check will verify."},messages:{name:"Pass/Fail messages (Optional)",description:"Add the messages for check success and failure.",passMessagePlaceholder:"Enter pass message...",failMessagePlaceholder:"Enter fail message...",passedTabName:"Passed Message",failedTabName:"Failed Message"},warnings:{name:"Enable warnings",description:"Enable to classify failures as warnings, so they don\u2019t impact certification.",label:"Warning"}},filter:{description:'Setting the filters below will limit the scope of the Check so that only those Entities that match the filter will be monitored by the Check. As an example, choosing a "Kind" of "Component" will make this Check only apply to Entities whose Kind is indeed set to "Component". This would exclude Entities like Groups, Users, APIs, etc. from being impacted by the Check.'},schedule:{description:"Checks are automatically triggered whenever a dependent fact is updated. When collectors are scheduled, there is generally no need to schedule checks.",checkboxLabel:"Schedule check"}};export{$ as CHECK_FIELDS,N as DEFAULT_FORM_VALUES,m as generateJsonPaths,O as mapCheckerToFormValues,l as mapExpressionToRule,g as mapInputScheduleToSchedule,h as mapRuleToExpression,x as mapScheduleToInputSchedule,q as mapToCheckerInput};
1
+ import{FrequencySchema as b}from"@spotify/backstage-plugin-soundcheck-common";import{isObject as S}from"lodash";import{v4 as T}from"uuid";import{mapInputFilterToFormFilters as k,mapFiltersToInputFilter as R,mapFiltersToCatalogFilter as A}from"../../Filter/utils.esm.js";import"../../Filter/FilterComponent.esm.js";import{emptyFilters as C}from"../../Filter/types.esm.js";import{TimeUnit as y}from"../../Frequency/types.esm.js";import{isTimeUnit as O}from"../../Frequency/util.esm.js";import"../../Frequency/FrequencyComponent.esm.js";import{ExpressionType as p}from"../types/ExpressionType.esm.js";import{defaultSchedule as P}from"../types/Schedule.esm.js";import"../types/Path.esm.js";import{CHECK_NAME_MAX_LENGTH as M}from"./validation.esm.js";const g=e=>{if(S(e)&&"frequency"in e){const r=b.safeParse(e.frequency);if(r.success){const t=r.data;if("cron"in t)return{enabled:!0,frequency:{type:"cron",unit:y.Hours,value:1,cron:t.cron}};const s=Object.keys(t);if(s.length){const o=s[0];if(O(o))return{enabled:!0,frequency:{type:"HumanDuration",unit:o,value:t[o]??1,cron:""}}}}}return{enabled:!1,frequency:{type:"HumanDuration",unit:y.Hours,value:1,cron:""}}},x=(e,r)=>{const{enabled:t,frequency:s}=e;if(t){const{cron:o,type:n,unit:a,value:l}=s;return n==="HumanDuration"?{frequency:{[a]:l},filter:A(r)}:{frequency:{cron:o}}}},h=e=>{if(Array.isArray(e))return e.map(r=>h(r));if(typeof e=="string"){if(e==="true")return!0;if(e==="false")return!1;const r=Number(e);if(!isNaN(r))return r}return e},f=e=>{if(!e)return{};if(e.expressionType){const r={[e.expressionType]:e.conditions?.map(t=>({factRef:t.factRef,path:t.path,operator:t.operatorPrefix?`${t.operatorPrefix}:${t.operator}`:t.operator,value:h(t.value)}))};return e.expressions&&e.expressions.forEach(t=>{r[e.expressionType]?.push(f(t))}),r}if(e.expressions)return e.expressions.map(f);if(e.conditions&&e.conditions.length===1){const r=e.conditions[0];return{factRef:r.factRef,path:r.path,operator:r.operatorPrefix?`${r.operatorPrefix}:${r.operator}`:r.operator,value:h(r.value)}}return{}},v=e=>{if(e?.match(/.:./)){const r=e.split(":");if(["all","any","none"].includes(r[0]))return{operator:r[1],operatorPrefix:r[0]}}return{}},m=(e,r=!0)=>{if(!e)return{conditions:[]};const t=Object.keys(e);let s=t.includes("all")||r&&!t.includes("any")?p.AllOf:p.AnyOf;if(t.includes("not")&&(s=p.Not),t.includes(s)||r){const a=e[s]||[e],l=[],u=[];return a.forEach(i=>{const d=Object.keys(i);if(d.includes("all")||d.includes("any")||d.includes("not"))u.push(m(i,!1));else{const{operator:w,operatorPrefix:E}=v(i.operator);l.push({factRef:i.factRef,path:i.path,operator:w??i.operator,value:i.value,operatorPrefix:E})}}),{expressions:u.length>0?u:void 0,conditions:l,expressionType:s}}const{operator:o,operatorPrefix:n}=v(e.operator);return{expressionType:p.AllOf,conditions:[{factRef:e.factRef,path:e.path,operator:o??e.operator,value:e.value,operatorPrefix:n}]}},F=e=>({detailsStep:{name:e.name??"",description:e.description??"",ownerEntityRef:e.ownerEntityRef??""},rulesStep:{pathResolver:e.pathResolver??"jsonpath",expressions:m(e.rule),passedMessage:e.passedMessage??void 0,failedMessage:e.failedMessage??void 0,warning:e.warning??!1},filtersStep:{filter:k(e.filter)},scheduleStep:{schedule:g(e.schedule)}}),q=(e,r)=>{const{detailsStep:t,rulesStep:s,filtersStep:o,scheduleStep:n}=e;return{id:r?r.id:T(),ownerEntityRef:t.ownerEntityRef??void 0,name:t.name,description:t.description,pathResolver:s.pathResolver,passedMessage:s.passedMessage??void 0,failedMessage:s.failedMessage??void 0,rule:f(s.expressions),warning:s.warning??!1,filter:o.filter?R(o.filter):void 0,schedule:x(n.schedule,o.filter)}},c=(e,r="$")=>{const t=[];if(e.type==="object"&&e.properties){const s=e.properties;for(const o in s)if(s.hasOwnProperty(o)){const n=`${r}.${o}`;t.push(n);const a=s[o];t.push(...c(a,n))}}if(e.type==="array"&&e.items){const s=`${r}[*]`;t.push(s);const o=Array.isArray(e.items)?e.items:[e.items];for(const n of o)t.push(...c(n,s))}if(e.oneOf){const s=Array.isArray(e.oneOf)?e.oneOf:[e.oneOf];for(const o of s)t.push(...c(o,r))}if(e.allOf){const s=Array.isArray(e.allOf)?e.allOf:[e.allOf];for(const o of s)t.push(...c(o,r))}return[...new Set(t)]},N={detailsStep:{name:"",description:"",ownerEntityRef:""},rulesStep:{pathResolver:"jsonpath",expressions:{expressionType:p.AllOf,expressions:void 0,conditions:[{factRef:"",path:"",operator:"",operatorPrefix:"",value:"",conditions:[]}]},warning:!1},filtersStep:{filter:C()},scheduleStep:{schedule:P()}},$={details:{name:{name:"Check name",helperText:`Max ${M} characters`,placeholder:"Name your check (e.g., 'Code Coverage\u2019)"},description:{name:"Check description",placeholder:"Describe your check clearly so others understand its purpose. e.g., 'Ensure code coverage meets the minimum threshold.'"},owner:{name:"Check owner",selectLabel:"Assign an owner"}},rulesStep:{rules:{name:"Check rules",description:"Define the rules the check will verify."},messages:{name:"Pass/Fail messages (Optional)",description:"Add the messages for check success and failure.",passMessagePlaceholder:"Enter pass message...",failMessagePlaceholder:"Enter fail message...",passedTabName:"Passed Message",failedTabName:"Failed Message"},warnings:{name:"Enable warnings",description:"Enable to classify failures as warnings, so they don\u2019t impact certification.",label:"Warning"}},filter:{description:'Setting the filters below will limit the scope of the Check so that only those Entities that match the filter will be monitored by the Check. As an example, choosing a "Kind" of "Component" will make this Check only apply to Entities whose Kind is indeed set to "Component". This would exclude Entities like Groups, Users, APIs, etc. from being impacted by the Check.'},schedule:{description:"Checks are automatically triggered whenever a dependent fact is updated. When collectors are scheduled, there is generally no need to schedule checks.",checkboxLabel:"Schedule check"}};export{$ as CHECK_FIELDS,N as DEFAULT_FORM_VALUES,c as generateJsonPaths,F as mapCheckerToFormValues,f as mapExpressionToRule,g as mapInputScheduleToSchedule,m as mapRuleToExpression,x as mapScheduleToInputSchedule,q as mapToCheckerInput};
2
2
  //# sourceMappingURL=checkFormUtils.esm.js.map
@@ -1,2 +1,2 @@
1
- import i,{useEffect as m}from"react";import"../../contexts/TrackFormContext.esm.js";import{useCheckFormContext as c}from"../../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"../../hooks/useSoundcheckAlert.esm.js";import"../../hooks/useConfirmationModal.esm.js";import{useNavigateBack as p}from"../../hooks/useNavigateBack.esm.js";import{checksPageRouteRef as s}from"../../routes.esm.js";import{CheckForm as a}from"../CheckForm/CheckForm.esm.js";import"../CheckForm/Steps/CheckDetailsStep.esm.js";import"../CheckForm/Steps/CheckRulesStep.esm.js";import"../SoundcheckHeader/SoundcheckHeader.esm.js";import"../SoundcheckHeader/SoundcheckHeaderContext.esm.js";import{useHeader as n}from"../SoundcheckHeader/useHeader.esm.js";const f=({check:t})=>{const{selectedItem:e,showReadOnly:o}=c();m(()=>{o(t)},[t,o]);const[r]=p(s);return n({title:"Check Details",description:"Identify if your software meets organizational standards by setting up a check.",docLink:"https://backstage.spotify.com/docs/plugins/soundcheck/core-concepts/checks"}),e&&i.createElement(a,{onClose:r,onSave:()=>{}})};export{f as CheckDetailsView};
1
+ import i,{useEffect as m}from"react";import"../../contexts/TrackFormContext.esm.js";import{useCheckFormContext as c}from"../../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 p}from"../../hooks/useNavigateBack.esm.js";import{checksPageRouteRef as s}from"../../routes.esm.js";import{CheckForm as a}from"../CheckForm/CheckForm.esm.js";import"../CheckForm/Steps/CheckDetailsStep.esm.js";import"../CheckForm/Steps/CheckRulesStep.esm.js";import"../SoundcheckHeader/SoundcheckHeader.esm.js";import"../SoundcheckHeader/SoundcheckHeaderContext.esm.js";import{useHeader as n}from"../SoundcheckHeader/useHeader.esm.js";const f=({check:t})=>{const{selectedItem:e,showReadOnly:o}=c();m(()=>{o(t)},[t,o]);const[r]=p(s);return n({title:"Check Details",description:"Identify if your software meets organizational standards by setting up a check.",docLink:"https://backstage.spotify.com/docs/plugins/soundcheck/core-concepts/checks"}),e&&i.createElement(a,{onClose:r,onSave:()=>{}})};export{f as CheckDetailsView};
2
2
  //# sourceMappingURL=CheckDetailsView.esm.js.map
@@ -1,2 +1,2 @@
1
- import d,{useEffect as c}from"react";import"../../contexts/TrackFormContext.esm.js";import{useCheckFormContext as i}from"../../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"../../hooks/useSoundcheckAlert.esm.js";import"../../hooks/useConfirmationModal.esm.js";import{useNavigateBack as u}from"../../hooks/useNavigateBack.esm.js";import{useUpdateCheck as h}from"../../hooks/checks/useUpdateCheck.esm.js";import{checksPageRouteRef as f}from"../../routes.esm.js";import{CheckForm as l}from"../CheckForm/CheckForm.esm.js";import"../CheckForm/Steps/CheckDetailsStep.esm.js";import"../CheckForm/Steps/CheckRulesStep.esm.js";import"../SoundcheckHeader/SoundcheckHeader.esm.js";import"../SoundcheckHeader/SoundcheckHeaderContext.esm.js";import{useHeader as g}from"../SoundcheckHeader/useHeader.esm.js";const C=({check:t})=>{const{selectedItem:m,setSelectedItem:e}=i(),{setIsLoading:o}=i(),{mutateAsync:s,isLoading:r}=h();c(()=>{o(r)},[o,r]),c(()=>{e(t)},[t,e]);const[p,a]=u(f),n=async k=>{await s(k,{onSuccess:a})};return g({title:"Edit a Check",description:"Make changes to your check\u2019s facts, rules and other details.",docLink:"https://backstage.spotify.com/docs/plugins/soundcheck/core-concepts/checks"}),m&&d.createElement(l,{onClose:p,onSave:n})};export{C as CheckEditView};
1
+ import d,{useEffect as i}from"react";import"../../contexts/TrackFormContext.esm.js";import{useCheckFormContext as c}from"../../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 u}from"../../hooks/useNavigateBack.esm.js";import{useUpdateCheck as h}from"../../hooks/checks/useUpdateCheck.esm.js";import{checksPageRouteRef as f}from"../../routes.esm.js";import{CheckForm as l}from"../CheckForm/CheckForm.esm.js";import"../CheckForm/Steps/CheckDetailsStep.esm.js";import"../CheckForm/Steps/CheckRulesStep.esm.js";import"../SoundcheckHeader/SoundcheckHeader.esm.js";import"../SoundcheckHeader/SoundcheckHeaderContext.esm.js";import{useHeader as g}from"../SoundcheckHeader/useHeader.esm.js";const C=({check:t})=>{const{selectedItem:m,setSelectedItem:o}=c(),{setIsLoading:e}=c(),{mutateAsync:s,isLoading:r}=h();i(()=>{e(r)},[e,r]),i(()=>{o(t)},[t,o]);const[p,a]=u(f),n=async k=>{await s(k,{onSuccess:a})};return g({title:"Edit a Check",description:"Make changes to your check\u2019s facts, rules and other details.",docLink:"https://backstage.spotify.com/docs/plugins/soundcheck/core-concepts/checks"}),m&&d.createElement(l,{onClose:p,onSave:n})};export{C as CheckEditView};
2
2
  //# sourceMappingURL=CheckEditView.esm.js.map
@@ -1,2 +1,2 @@
1
- import{stringifyEntityRef as v}from"@backstage/catalog-model";import{Table as R}from"@backstage/core-components";import{makeStyles as x}from"@material-ui/core";import L from"lodash";import d,{useState as z,useEffect as B,useCallback as p}from"react";import{CheckEntityField as n,Direction as f}from"../../../graphql/generated/index.esm.js";import{useEntitiesByRefs as T}from"../../../hooks/catalog/useEntitiesByRefs.esm.js";import{useCheckEntities as D}from"../../../hooks/entities/useCheckEntities.esm.js";import{toResultState as m}from"../utils.esm.js";import{columnFactories as r}from"./columns.esm.js";import{toCheckEntityRow as N}from"./utils.esm.js";const O=["kind","metadata.name","metadata.namespace","relations","spec.lifecycle","spec.type"],P=[r.createStateColumn(),r.createNameColumn(),r.createSystemColumn(),r.createOwnerColumn(),r.createSpecTypeColumn(),r.createSpecLifecycleColumn()],F=[n.State,n.Name,n.System,n.Owner,n.Type,n.Lifecycle],$=x({tableContainer:{display:"flex",flexDirection:"column",width:"100%",overflowX:"auto","& table":{boxSizing:"border-box","& th:first-child, & td:first-child":{paddingLeft:"6px"},"& th:last-child, & td:last-child":{paddingRight:"6px !important"}}}}),A=({checkId:g,trackId:u,filter:s,states:c})=>{const h=$(),[e,l]=z({orderBy:void 0,filter:s,states:c?.map(m).filter(t=>t!==void 0),pageInfo:{page:0,pageSize:10,direction:"forward",cursor:null}});B(()=>{l(t=>({...t,pageInfo:{...t.pageInfo,page:0,cursor:null},filter:s,states:c?.map(m).filter(i=>i!==void 0)}))},[s,c]);const{data:a,isLoading:y}=D({checkId:g,trackId:u,orderBy:e.orderBy,filter:e.filter,states:e.states?.length?e.states:void 0,[e.pageInfo.direction==="forward"?"first":"last"]:e.pageInfo.pageSize,[e.pageInfo.direction==="forward"?"after":"before"]:e.pageInfo.cursor}),C=p((t,i)=>{let o;t===-1?o=void 0:o={field:F[t],direction:i==="asc"?f.Asc:f.Desc},l({...e,orderBy:o,pageInfo:{...e.pageInfo,page:0,cursor:null}})},[e]),k=p((t,i)=>{const o=t>e.pageInfo.page?"forward":"backward",b=o==="forward"?a?.checkEntities.pageInfo.endCursor??null:a?.checkEntities.pageInfo.startCursor??null;l({...e,pageInfo:{page:t,pageSize:i,direction:o,cursor:b}})},[a,e]),I=a?.checkEntities.edges.map(t=>t.node.entityRef)??[],{data:w,isLoading:E}=T({entityRefs:I,fields:O}),S=L.compact(a?.checkEntities.edges.map(t=>{const i=w?.items.find(o=>!!o&&v(o)===t.node.entityRef);return i?N({checkDetails:t.node,entity:i}):void 0}))??[];return d.createElement("div",{className:h.tableContainer},d.createElement(R,{title:"Entities",style:{width:"100%",border:"none",margin:0},columns:P,data:S,options:{paging:!0,showFirstLastPageButtons:!1,paginationPosition:"bottom",emptyRowsWhenPaging:!0,pageSizeOptions:[10,25,50],pageSize:10,search:!1,showTitle:!0,padding:"dense"},onOrderChange:C,onPageChange:k,page:e.pageInfo.page,totalCount:a?.checkEntities.totalCount??0,isLoading:y||E,components:{Toolbar:()=>null}}))};export{A as CheckEntitiesTable};
1
+ import{stringifyEntityRef as R}from"@backstage/catalog-model";import{Table as v}from"@backstage/core-components";import{makeStyles as x}from"@material-ui/core";import z from"lodash";import p,{useState as L,useEffect as B,useCallback as d}from"react";import{CheckEntityField as n,Direction as f}from"../../../graphql/generated/index.esm.js";import{useEntitiesByRefs as T}from"../../../hooks/catalog/useEntitiesByRefs.esm.js";import{useCheckEntities as D}from"../../../hooks/entities/useCheckEntities.esm.js";import{toResultState as m}from"../utils.esm.js";import{columnFactories as r}from"./columns.esm.js";import{toCheckEntityRow as N}from"./utils.esm.js";const O=10,P=["kind","metadata.name","metadata.namespace","relations","spec.lifecycle","spec.type"],F=[r.createStateColumn(),r.createNameColumn(),r.createSystemColumn(),r.createOwnerColumn(),r.createSpecTypeColumn(),r.createSpecLifecycleColumn()],A=[n.State,n.Name,n.System,n.Owner,n.Type,n.Lifecycle],$=x({tableContainer:{display:"flex",flexDirection:"column",width:"100%",overflowX:"auto","& table":{boxSizing:"border-box","& th:first-child, & td:first-child":{paddingLeft:"6px"},"& th:last-child, & td:last-child":{paddingRight:"6px !important"}}}}),Q=({checkId:g,trackId:u,filter:s,states:c})=>{const h=$(),[e,l]=L({orderBy:void 0,filter:s,states:c?.map(m).filter(t=>t!==void 0),pageInfo:{page:0,pageSize:O,direction:"forward",cursor:null}});B(()=>{l(t=>({...t,pageInfo:{...t.pageInfo,page:0,cursor:null},filter:s,states:c?.map(m).filter(i=>i!==void 0)}))},[s,c]);const{data:a,isLoading:y}=D({checkId:g,trackId:u,orderBy:e.orderBy,filter:e.filter,states:e.states?.length?e.states:void 0,[e.pageInfo.direction==="forward"?"first":"last"]:e.pageInfo.pageSize,[e.pageInfo.direction==="forward"?"after":"before"]:e.pageInfo.cursor}),C=d((t,i)=>{let o;t===-1?o=void 0:o={field:A[t],direction:i==="asc"?f.Asc:f.Desc},l({...e,orderBy:o,pageInfo:{...e.pageInfo,page:0,cursor:null}})},[e]),I=d((t,i)=>{const o=t>e.pageInfo.page?"forward":"backward",b=o==="forward"?a?.checkEntities.pageInfo.endCursor??null:a?.checkEntities.pageInfo.startCursor??null;l({...e,pageInfo:{page:t,pageSize:i,direction:o,cursor:b}})},[a,e]),k=a?.checkEntities.edges.map(t=>t.node.entityRef)??[],{data:S,isLoading:w}=T({entityRefs:k,fields:P}),E=z.compact(a?.checkEntities.edges.map(t=>{const i=S?.items.find(o=>!!o&&R(o)===t.node.entityRef);return i?N({checkDetails:t.node,entity:i}):void 0}))??[];return p.createElement("div",{className:h.tableContainer},p.createElement(v,{title:"Entities",style:{width:"100%",border:"none",margin:0},columns:F,data:E,options:{paging:!0,showFirstLastPageButtons:!1,paginationPosition:"bottom",emptyRowsWhenPaging:!0,pageSizeOptions:[10,25,50],pageSize:e.pageInfo.pageSize,search:!1,showTitle:!0,padding:"dense"},onOrderChange:C,onPageChange:I,page:e.pageInfo.page,totalCount:a?.checkEntities.totalCount??0,isLoading:y||w,components:{Toolbar:()=>null}}))};export{Q as CheckEntitiesTable};
2
2
  //# sourceMappingURL=CheckEntitiesTable.esm.js.map
@@ -1,2 +1,2 @@
1
- import{MarkdownContent as j,Content as x}from"@backstage/core-components";import{useRouteRef as q}from"@backstage/core-plugin-api";import{EntityRefLink as J}from"@backstage/plugin-catalog-react";import{usePermission as L}from"@backstage/plugin-permission-react";import{makeStyles as K,useTheme as X,Button as Y,Paper as Z,Grid as y,Card as E,CardHeader as k,CardContent as C}from"@material-ui/core";import{soundcheckCheckReadPermission as _,soundcheckCheckUpdatePermission as $,toEntityFilterQuery as w,combineEntityFilterQueries as ee}from"@spotify/backstage-plugin-soundcheck-common";import e,{useMemo as S}from"react";import{useParams as te,useNavigate as re}from"react-router-dom";import"@backstage/catalog-model";import"@tanstack/react-query";import"../../api.esm.js";import"../../hooks/graphqlKeys.esm.js";import{useGetChecks as ie}from"../../hooks/checks/useGetChecks.esm.js";import"../../hooks/useSoundcheckAlert.esm.js";import{useGetAllTracks as ne}from"../../hooks/tracks/useGetAllTracks.esm.js";import"../../hooks/useConfirmationModal.esm.js";import{useCheckStatus as oe}from"../../hooks/aggregations/useCheckStatus.esm.js";import{useSearchParam as l}from"../../hooks/useSearchParam.esm.js";import{checkEditRouteRef as ae}from"../../routes.esm.js";import{LoadingIndicator as se}from"../LoadingIndicator/LoadingIndicator.esm.js";import{PageWarningMessage as P}from"../PageWarningMessage/PageWarningMessage.esm.js";import"../SoundcheckHeader/SoundcheckHeader.esm.js";import"../SoundcheckHeader/SoundcheckHeaderContext.esm.js";import{useHeader as ce}from"../SoundcheckHeader/useHeader.esm.js";import{CheckEntitiesTable as le}from"./CheckEntitiesTable/CheckEntitiesTable.esm.js";import{CheckStatusBar as me}from"./CheckStatusBar.esm.js";import{CheckStatusHistoryChart as de}from"./CheckStatusHistoryChart.esm.js";import{CheckStatusTable as pe}from"./CheckStatusTable.esm.js";import{FilterBar as fe}from"./FilterBar/FilterBar.esm.js";const ue=t=>{const{lifecycles:n,owners:r,types:o,systems:m}=t,a=n?.length?{"spec.lifecycle":n}:void 0,d=r?.length?{"relations.ownedBy":r}:void 0,s=o?.length?{"spec.type":o}:void 0,p=m?.length?{"relations.partOf":m}:void 0;if(a||d||s||p)return{...a,...d,...s,...p}};function he(t,n){for(const r of t.levels)for(const o of r.checks)if(o.id===n)return o;return null}const ge=K(t=>({root:{height:"100%",background:t.palette.background.default},header:{backgroundColor:t.palette.background.paper,borderRadius:0,marginBottom:t.spacing(2)},content:{display:"flex",flexDirection:"column",gap:t.spacing(2),paddingTop:t.spacing(0)},editButton:{marginLeft:"auto"},filterBar:{paddingTop:t.spacing(1),paddingBottom:t.spacing(1)},headerDescription:{fontSize:t.typography.body2.fontSize,margin:t.spacing(.5,0,0),"& p":{margin:0},"& a":{color:"inherit",textDecoration:"underline"}},ownerLink:{"& span":{color:"inherit","&:hover":{textDecoration:"underline"}}}})),ye=()=>{const t=ge(),{trackId:n,checkId:r}=te(),[o,m]=l("states"),[a,d]=l("owners"),[s,p]=l("lifecycles"),[v,T]=l("types"),[I,D]=l("systems"),f=ue({lifecycles:s,owners:a,types:v,systems:I}),{data:F,isLoading:H}=ne({ids:[n??""],first:1},{enabled:!!n}),c=F?.edges?.[0]?.node,{data:G,isLoading:u}=ie({ids:[r??""],first:1}),i=G?.edges?.[0]?.node,{loading:M,allowed:z}=L({permission:_,resourceRef:r}),{loading:b,allowed:R}=L({permission:$,resourceRef:r}),B=re(),N=q(ae),O=X();let h;if(r)if(c){const V=w(c.filter),W=w(he(c,r)?.filter);h=ee(V,W,!0)}else i&&(h=w(i.filter));const{data:g}=oe({checkId:r,trackId:n,filter:f,states:o?.length?o:void 0},!!r),Q=S(()=>i?.ownerEntityRef?e.createElement(J,{color:"inherit",entityRef:i.ownerEntityRef,className:t.ownerLink}):null,[i?.ownerEntityRef,t.ownerLink]),A=S(()=>!b&&R&&i?.isEditable?e.createElement(Y,{className:t.editButton,variant:"contained",color:"primary",onClick:()=>{B(N({checkId:i.id}))}},"Edit Check"):null,[R,i?.id,i?.isEditable,t.editButton,N,b,B]),U=S(()=>i?.description?e.createElement(j,{className:t.headerDescription,content:i.description}):null,[t.headerDescription,i?.description]);return ce({title:i?.name??r??"Soundcheck",description:U,customSubtitle:Q,sectionRight:A}),e.createElement("div",null,e.createElement(P,{entityName:"track",entityId:n,showNotFound:!!n&&!H&&!c}),e.createElement(P,{entityName:"check",entityId:r,showNotFound:!u&&!i,showCannotView:i&&!M&&!z}),u&&e.createElement(se,null),!u&&!!i&&e.createElement("div",{className:t.root},e.createElement(Z,{elevation:3,className:t.header},e.createElement(x,{className:t.filterBar},e.createElement(fe,{filter:h,states:o,setStates:m,owners:a,setOwners:d,lifecycles:s,setLifecycles:p,types:v,setTypes:T,systems:I,setSystems:D}))),e.createElement(x,{className:t.content},e.createElement(y,{container:!0,spacing:2},e.createElement(y,{item:!0,xs:4},e.createElement(E,{style:{height:"100%"}},e.createElement(k,{title:"Current Status"}),e.createElement(C,null,e.createElement("div",{style:{width:"100%",height:30,display:"flex",alignItems:"flex-start"}},e.createElement(me,{checkStatus:g})),e.createElement("div",{style:{paddingTop:O.spacing(1)}},e.createElement(pe,{checkStatus:g}))))),e.createElement(y,{item:!0,xs:8},e.createElement(E,{style:{height:"100%"}},e.createElement(k,{title:"Historical Status"}),e.createElement(C,{style:{height:"90%",paddingBottom:0}},e.createElement(de,{checkId:r,trackId:n,checkStatus:g,filter:f,states:o}))))),e.createElement(E,null,e.createElement(k,{title:"Entities"}),e.createElement(C,null,e.createElement(le,{checkId:r,trackId:c?.id,filter:f,states:o}))))))};export{ye as CheckInsightsPage};
1
+ import{MarkdownContent as j,Content as x}from"@backstage/core-components";import{useRouteRef as q}from"@backstage/core-plugin-api";import{EntityRefLink as J}from"@backstage/plugin-catalog-react";import{usePermission as L}from"@backstage/plugin-permission-react";import{makeStyles as K,useTheme as X,Button as Y,Paper as Z,Grid as y,Card as E,CardHeader as k,CardContent as C}from"@material-ui/core";import{soundcheckCheckReadPermission as _,soundcheckCheckUpdatePermission as $,toEntityFilterQuery as w,combineEntityFilterQueries as ee}from"@spotify/backstage-plugin-soundcheck-common";import e,{useMemo as S}from"react";import{useParams as te,useNavigate as re}from"react-router-dom";import"@backstage/catalog-model";import"@tanstack/react-query";import"../../api.esm.js";import"../../hooks/graphqlKeys.esm.js";import{useGetChecks as ie}from"../../hooks/checks/useGetChecks.esm.js";import"../../hooks/useSoundcheckAlert.esm.js";import{useGetAllTracks as ne}from"../../hooks/tracks/useGetAllTracks.esm.js";import"../../hooks/useConfirmationModal.esm.js";import{useCheckStatus as oe}from"../../hooks/aggregations/useCheckStatus.esm.js";import{useSearchParam as l}from"../../hooks/useSearchParam.esm.js";import{checkEditRouteRef as ae}from"../../routes.esm.js";import{LoadingIndicator as se}from"../LoadingIndicator/LoadingIndicator.esm.js";import{PageWarningMessage as P}from"../PageWarningMessage/PageWarningMessage.esm.js";import"../SoundcheckHeader/SoundcheckHeader.esm.js";import"../SoundcheckHeader/SoundcheckHeaderContext.esm.js";import{useHeader as ce}from"../SoundcheckHeader/useHeader.esm.js";import{CheckEntitiesTable as le}from"./CheckEntitiesTable/CheckEntitiesTable.esm.js";import{CheckStatusBar as me}from"./CheckStatusBar.esm.js";import{CheckStatusHistoryChart as de}from"./CheckStatusHistoryChart.esm.js";import{CheckStatusTable as pe}from"./CheckStatusTable.esm.js";import{FilterBar as fe}from"./FilterBar/FilterBar.esm.js";const ue=t=>{const{lifecycles:n,owners:r,types:o,systems:m}=t,a=n?.length?{"spec.lifecycle":n}:void 0,d=r?.length?{"relations.ownedBy":r}:void 0,s=o?.length?{"spec.type":o}:void 0,p=m?.length?{"relations.partOf":m}:void 0;if(a||d||s||p)return{...a,...d,...s,...p}};function he(t,n){for(const r of t.levels)for(const o of r.checks)if(o.id===n)return o;return null}const ge=K(t=>({root:{height:"100%",background:t.palette.background.default},header:{backgroundColor:t.palette.background.paper,borderRadius:0,marginBottom:t.spacing(2)},content:{display:"flex",flexDirection:"column",gap:t.spacing(2),paddingTop:t.spacing(0)},editButton:{marginLeft:"auto"},filterBar:{paddingTop:t.spacing(1),paddingBottom:t.spacing(1)},headerDescription:{fontSize:t.typography.body2.fontSize,margin:t.spacing(.5,0,0),"& p":{margin:0},"& a":{color:"inherit",textDecoration:"underline"}},ownerLink:{"& span":{color:"inherit","&:hover":{textDecoration:"underline"}}}})),ye=()=>{const t=ge(),{trackId:n,checkId:r}=te(),[o,m]=l("states"),[a,d]=l("owners"),[s,p]=l("lifecycles"),[v,T]=l("types"),[I,D]=l("systems"),f=ue({lifecycles:s,owners:a,types:v,systems:I}),{data:F,isLoading:H}=ne({ids:[n??""],first:1},{enabled:!!n}),c=F?.edges?.[0]?.node,{data:G,isLoading:u}=ie({ids:[r??""],first:1}),i=G?.edges?.[0]?.node,{loading:M,allowed:z}=L({permission:_,resourceRef:r}),{loading:b,allowed:R}=L({permission:$,resourceRef:r}),B=re(),N=q(ae),O=X();let h;if(r)if(c){const V=w(c.filter),W=w(he(c,r)?.filter);h=ee(V,W)}else i&&(h=w(i.filter));const{data:g}=oe({checkId:r,trackId:n,filter:f,states:o?.length?o:void 0},!!r),Q=S(()=>i?.ownerEntityRef?e.createElement(J,{color:"inherit",entityRef:i.ownerEntityRef,className:t.ownerLink}):null,[i?.ownerEntityRef,t.ownerLink]),A=S(()=>!b&&R&&i?.isEditable?e.createElement(Y,{className:t.editButton,variant:"contained",color:"primary",onClick:()=>{B(N({checkId:i.id}))}},"Edit Check"):null,[R,i?.id,i?.isEditable,t.editButton,N,b,B]),U=S(()=>i?.description?e.createElement(j,{className:t.headerDescription,content:i.description}):null,[t.headerDescription,i?.description]);return ce({title:i?.name??r??"Soundcheck",description:U,customSubtitle:Q,sectionRight:A}),e.createElement("div",null,e.createElement(P,{entityName:"track",entityId:n,showNotFound:!!n&&!H&&!c}),e.createElement(P,{entityName:"check",entityId:r,showNotFound:!u&&!i,showCannotView:i&&!M&&!z}),u&&e.createElement(se,null),!u&&!!i&&e.createElement("div",{className:t.root},e.createElement(Z,{elevation:3,className:t.header},e.createElement(x,{className:t.filterBar},e.createElement(fe,{filter:h,states:o,setStates:m,owners:a,setOwners:d,lifecycles:s,setLifecycles:p,types:v,setTypes:T,systems:I,setSystems:D}))),e.createElement(x,{className:t.content},e.createElement(y,{container:!0,spacing:2},e.createElement(y,{item:!0,xs:4},e.createElement(E,{style:{height:"100%"}},e.createElement(k,{title:"Current Status"}),e.createElement(C,null,e.createElement("div",{style:{width:"100%",height:30,display:"flex",alignItems:"flex-start"}},e.createElement(me,{checkStatus:g})),e.createElement("div",{style:{paddingTop:O.spacing(1)}},e.createElement(pe,{checkStatus:g}))))),e.createElement(y,{item:!0,xs:8},e.createElement(E,{style:{height:"100%"}},e.createElement(k,{title:"Historical Status"}),e.createElement(C,{style:{height:"90%",paddingBottom:0}},e.createElement(de,{checkId:r,trackId:n,checkStatus:g,filter:f,states:o}))))),e.createElement(E,null,e.createElement(k,{title:"Entities"}),e.createElement(C,null,e.createElement(le,{checkId:r,trackId:c?.id,filter:f,states:o}))))))};export{ye as CheckInsightsPage};
2
2
  //# sourceMappingURL=CheckInsightsPage.esm.js.map
@@ -1,2 +1,2 @@
1
- import{z as e}from"zod";import{FrequencySchema as r,FiltersSchema as c,CacheConfigSchema as i}from"../../../../utils/validation.esm.js";import{defaultCacheConfig as l}from"../../../CacheConfig/utils.esm.js";import"../../../CacheConfig/CacheConfigComponent.esm.js";import{emptyFilters as m}from"../../../Filter/types.esm.js";import"../../../Frequency/types.esm.js";import{defaultFrequency as n}from"../../../Frequency/util.esm.js";import"../../../Frequency/FrequencyComponent.esm.js";const o=()=>({filters:{...m(),selectedKinds:["Component"]},frequency:n(),cacheConfig:l()}),a=()=>({enabled:!1,...o()}),t=e.object({frequency:r,filters:c,cacheConfig:i}),f=t.extend({enabled:e.boolean()}).strict();export{t as BaseCollectorSchema,f as CollectorOptionSchema,o as defaultBaseCollectorOption,a as defaultCollectorOption};
1
+ import{z as e}from"zod";import{FrequencySchema as r,FiltersSchema as l,CacheConfigSchema as c}from"../../../../utils/validation.esm.js";import{defaultCacheConfig as i}from"../../../CacheConfig/utils.esm.js";import"../../../CacheConfig/CacheConfigComponent.esm.js";import{emptyFilters as a}from"../../../Filter/types.esm.js";import"../../../Frequency/types.esm.js";import{defaultFrequency as n}from"../../../Frequency/util.esm.js";import"../../../Frequency/FrequencyComponent.esm.js";const o=()=>({filters:{...a(),selectedKinds:["Component"]},frequency:n(),cacheConfig:i()}),m=()=>({enabled:!1,...o()}),t=e.object({frequency:r,filters:l,cacheConfig:c,batchSize:e.number().min(1,"Batch size should be at least 1").optional().nullable()}),f=t.extend({enabled:e.boolean()}).strict();export{t as BaseCollectorSchema,f as CollectorOptionSchema,o as defaultBaseCollectorOption,m as defaultCollectorOption};
2
2
  //# sourceMappingURL=CollectorOption.esm.js.map
@@ -0,0 +1,2 @@
1
+ import{makeStyles as s,Box as l,Typography as d,TextField as p}from"@material-ui/core";import t from"react";import{useFormContext as g,Controller as h}from"react-hook-form";import{FormFieldLabel as u}from"../../../FormFieldLabel/FormFieldLabel.esm.js";const f=s(a=>({root:{borderTop:`1px solid ${a.palette.divider}`}})),v=({name:a,disabled:n})=>{const i=f(),{control:m}=g();return t.createElement(l,{padding:2,marginTop:3,className:i.root},t.createElement(u,{title:"Batch Size (Optional)"}),t.createElement(d,{variant:"caption"},"Modifies the batch size that the collector uses. In general this option should not be changed and can affect rate limits."),t.createElement(l,{marginTop:1},t.createElement(h,{name:`${a}.batchSize`,control:m,render:({field:r,fieldState:o})=>t.createElement(p,{...r,onChange:e=>{if(e.target.value){const c=parseInt(e.target.value,10)??null;r.onChange({...e,target:{...e.target,value:c}})}else r.onChange({...e,target:{...e.target,value:null}})},placeholder:"Default: 1",value:r.value??void 0,type:"number",variant:"outlined",margin:"dense",disabled:n,error:!!o.error,helperText:o.error?.message})})))};export{v as CollectorSchedulingOptions};
2
+ //# sourceMappingURL=CollectorSchedulingOptions.esm.js.map
@@ -1,2 +1,2 @@
1
- import{makeStyles as I,FormControlLabel as G,Switch as R,Box as L,Typography as y,Divider as W,Tabs as j,Tab as p,Grid as g,Button as $}from"@material-ui/core";import H from"@material-ui/icons/Add";import J from"@material-ui/icons/Remove";import e,{useState as K}from"react";import{useFormContext as M,useFieldArray as O,useWatch as P,Controller as b}from"react-hook-form";import{validateCacheConfig as Q}from"../../../../utils/collectors.esm.js";import{validateFrequency as U}from"../../../../utils/frequency.esm.js";import"lodash";import"../../../Frequency/types.esm.js";import"../../../Frequency/util.esm.js";import{FrequencyComponent as V}from"../../../Frequency/FrequencyComponent.esm.js";import{CacheConfigComponent as X}from"../../../CacheConfig/CacheConfigComponent.esm.js";import"@spotify/backstage-plugin-soundcheck-common";import{FilterComponent as Y}from"../../../Filter/FilterComponent.esm.js";const Z=I(t=>({root:{padding:t.spacing(1.5,6)},tabsContainer:{marginRight:16},tab:{height:"64px",textAlign:"left"},contentContainer:{width:"100%",padding:t.spacing(1)},divider:{marginTop:t.spacing(1),marginBottom:t.spacing(1)},switchTrack:{backgroundColor:`${t.palette.primary.main} !important`},buttonsContainer:{marginTop:t.spacing(1),marginBottom:t.spacing(2)}})),C="FactDetails",v="Frequency",F="Filters",k="Caching",_=({name:t,label:E,description:x,disabled:i,FactDetailsComponent:s,multipleCollectors:o})=>{const{control:m,formState:q}=M(),d=q.errors?.[t],{fields:N,insert:D,remove:T}=O({control:m,name:o?.enable?`${t}.collectors`:t}),u=o?.enable?N:[{id:t}],h=s?C:v,[r,f]=K(Array(u.length).fill(h)),w=(l,a,n)=>{f([...r.slice(0,n),a,...r.slice(n+1)])},S=l=>{D(l+1,o?.defaultConfig),f([...r.slice(0,l+1),h,...r.slice(l+1)])},A=l=>{T(l),f([...r.slice(0,l),...r.slice(l+1)])},B=P({control:m,name:`${t}.enabled`}),c=Z();return e.createElement("div",{className:c.root},e.createElement(b,{name:`${t}.enabled`,control:m,render:({field:l})=>e.createElement(G,{control:e.createElement(R,{...l,checked:l.value,"data-testid":`${t}-switch`,classes:{track:l.value?c.switchTrack:void 0},disabled:i}),label:e.createElement(L,{display:"flex",flexDirection:"column"},e.createElement(y,{variant:"body1",component:"span"},e.createElement("b",null,`${E}`)),e.createElement(y,{variant:"caption",color:"textSecondary",component:"p"},`${x}`))})}),B&&e.createElement("div",null,u.map((l,a)=>e.createElement("div",{key:l.id},a!==0&&e.createElement(W,{className:c.divider}),e.createElement(j,{orientation:"horizontal",variant:"scrollable",value:r[a],onChange:(n,z)=>w(n,z,a),className:c.tabsContainer},s&&e.createElement(p,{label:"Fact Details",value:C,className:c.tab}),e.createElement(p,{label:"Frequency",value:v,className:c.tab}),e.createElement(p,{label:"Filters",value:F,className:c.tab}),e.createElement(p,{label:"Caching",value:k,className:c.tab})),e.createElement("div",{className:c.contentContainer},r[a]===C&&s&&e.createElement(s,{name:o?.enable?`${t}.collectors.${a}.factDetails`:`${t}.factDetails`,disabled:i}),r[a]===v&&e.createElement(b,{name:o?.enable?`${t}.collectors.${a}.frequency`:`${t}.frequency`,control:m,rules:{validate:U},render:({field:n})=>e.createElement(V,{disabled:i,value:n.value,onChange:n.onChange,errors:o?.enable?d?.collectors?.[a]?.frequency:d?.frequency})}),r[a]===F&&e.createElement(b,{name:o?.enable?`${t}.collectors.${a}.filters`:`${t}.filters`,control:m,render:({field:n})=>e.createElement(Y,{disabled:i,value:n.value,onChange:n.onChange})}),r[a]===k&&e.createElement(b,{name:o?.enable?`${t}.collectors.${a}.cacheConfig`:`${t}.cacheConfig`,control:m,rules:{validate:Q},render:({field:n})=>e.createElement(X,{disabled:i,value:n.value,onChange:n.onChange,errors:o?.enable?d?.collectors?.[a]?.cacheConfig:d?.cacheConfig})})),o?.enable&&e.createElement(g,{container:!0,spacing:1,className:c.buttonsContainer},u.length>1&&e.createElement(g,{item:!0},e.createElement($,{startIcon:e.createElement(J,null),onClick:()=>A(a),disabled:i,variant:"outlined",size:"small",color:"secondary"},"Remove")),e.createElement(g,{item:!0},e.createElement($,{startIcon:e.createElement(H,null),onClick:()=>S(a),disabled:i,variant:"outlined",size:"small",color:"primary"},"Add ",E)))))))};export{_ as FactCollectionConfig};
1
+ import{makeStyles as I,FormControlLabel as R,Switch as G,Box as L,Typography as y,Divider as O,Tabs as P,Tab as d,Grid as C,Button as F}from"@material-ui/core";import W from"@material-ui/icons/Add";import j from"@material-ui/icons/Remove";import e,{useState as H}from"react";import{useFormContext as J,useFieldArray as K,useWatch as M,Controller as p}from"react-hook-form";import{validateCacheConfig as Q}from"../../../../utils/collectors.esm.js";import{validateFrequency as U}from"../../../../utils/frequency.esm.js";import"lodash";import"../../../Frequency/types.esm.js";import"../../../Frequency/util.esm.js";import{FrequencyComponent as V}from"../../../Frequency/FrequencyComponent.esm.js";import{CacheConfigComponent as X}from"../../../CacheConfig/CacheConfigComponent.esm.js";import"@spotify/backstage-plugin-soundcheck-common";import{FilterComponent as Y}from"../../../Filter/FilterComponent.esm.js";import{CollectorSchedulingOptions as Z}from"./CollectorSchedulingOptions.esm.js";const _=I(t=>({root:{padding:t.spacing(1.5,6)},tabsContainer:{marginRight:16},tab:{height:"64px",textAlign:"left"},contentContainer:{width:"100%",padding:t.spacing(1)},divider:{marginTop:t.spacing(1),marginBottom:t.spacing(1)},switchTrack:{backgroundColor:`${t.palette.primary.main} !important`},buttonsContainer:{marginTop:t.spacing(1),marginBottom:t.spacing(2)}})),f="FactDetails",E="Schedule",k="Filters",S="Caching",ee=({name:t,label:v,description:x,disabled:i,FactDetailsComponent:s,multipleCollectors:o})=>{const{control:m,formState:N}=J(),h=N.errors?.[t],{fields:D,insert:T,remove:w}=K({control:m,name:o?.enable?`${t}.collectors`:t}),u=o?.enable?D:[{id:t}],$=s?f:E,[r,b]=H(Array(u.length).fill($)),q=(l,a,n)=>{b([...r.slice(0,n),a,...r.slice(n+1)])},A=l=>{T(l+1,o?.defaultConfig),b([...r.slice(0,l+1),$,...r.slice(l+1)])},B=l=>{w(l),b([...r.slice(0,l),...r.slice(l+1)])},z=M({control:m,name:`${t}.enabled`}),c=_();return e.createElement("div",{className:c.root},e.createElement(p,{name:`${t}.enabled`,control:m,render:({field:l})=>e.createElement(R,{control:e.createElement(G,{...l,checked:l.value,"data-testid":`${t}-switch`,classes:{track:l.value?c.switchTrack:void 0},disabled:i}),label:e.createElement(L,{display:"flex",flexDirection:"column"},e.createElement(y,{variant:"body1",component:"span"},e.createElement("b",null,`${v}`)),e.createElement(y,{variant:"caption",color:"textSecondary",component:"p"},`${x}`))})}),z&&e.createElement("div",null,u.map((l,a)=>e.createElement("div",{key:l.id},a!==0&&e.createElement(O,{className:c.divider}),e.createElement(P,{orientation:"horizontal",variant:"scrollable",value:r[a],onChange:(n,g)=>q(n,g,a),className:c.tabsContainer},s&&e.createElement(d,{label:"Fact Details",value:f,className:c.tab}),e.createElement(d,{label:"Schedule",value:E,className:c.tab}),e.createElement(d,{label:"Filters",value:k,className:c.tab}),e.createElement(d,{label:"Caching",value:S,className:c.tab})),e.createElement("div",{className:c.contentContainer},r[a]===f&&s&&e.createElement(s,{name:o?.enable?`${t}.collectors.${a}.factDetails`:`${t}.factDetails`,disabled:i}),r[a]===E&&e.createElement(e.Fragment,null,e.createElement(p,{name:o?.enable?`${t}.collectors.${a}.frequency`:`${t}.frequency`,control:m,rules:{validate:U},render:({field:n,fieldState:{error:g}})=>e.createElement(V,{disabled:i,value:n.value,onChange:n.onChange,errors:g})}),e.createElement(Z,{name:o?.enable?`${t}.collectors.${a}`:t})),r[a]===k&&e.createElement(p,{name:o?.enable?`${t}.collectors.${a}.filters`:`${t}.filters`,control:m,render:({field:n})=>e.createElement(Y,{disabled:i,value:n.value,onChange:n.onChange})}),r[a]===S&&e.createElement(p,{name:o?.enable?`${t}.collectors.${a}.cacheConfig`:`${t}.cacheConfig`,control:m,rules:{validate:Q},render:({field:n})=>e.createElement(X,{disabled:i,value:n.value,onChange:n.onChange,errors:o?.enable?h?.collectors?.[a]?.cacheConfig:h?.cacheConfig})})),o?.enable&&e.createElement(C,{container:!0,spacing:1,className:c.buttonsContainer},u.length>1&&e.createElement(C,{item:!0},e.createElement(F,{startIcon:e.createElement(j,null),onClick:()=>B(a),disabled:i,variant:"outlined",size:"small",color:"secondary"},"Remove")),e.createElement(C,{item:!0},e.createElement(F,{startIcon:e.createElement(W,null),onClick:()=>A(a),disabled:i,variant:"outlined",size:"small",color:"primary"},"Add ",v)))))))};export{ee as FactCollectionConfig};
2
2
  //# sourceMappingURL=FactCollectionConfig.esm.js.map
@@ -1,2 +1,2 @@
1
- const o=t=>({title:t.name??t.id,description:t.description,docLink:`https://backstage.spotify.com/docs/plugins/soundcheck/core-concepts/fact-collectors/3p-integrations/${t.id}`}),e=t=>({title:"Update Integration",message:`Are you sure you want to update the ${t.name} integration?`,error:!1});export{o as collectorHeaderContent,e as confirmationModalContent};
1
+ import{mapToCacheConfig as i,mapCacheConfigToHumanDurationOrBoolean as n}from"../../../CacheConfig/utils.esm.js";import"../../../CacheConfig/CacheConfigComponent.esm.js";import{mapCatalogFilterToFilters as a,mapFiltersToCatalogFilter as r}from"../../../Filter/utils.esm.js";import"../../../Filter/FilterComponent.esm.js";import"../../../Frequency/types.esm.js";import{mapHumanDurationOrCronToFrequency as c,mapFrequencyToHumanDurationOrCron as p}from"../../../Frequency/util.esm.js";import"../../../Frequency/FrequencyComponent.esm.js";const f=o=>({title:o.name??o.id,description:o.description,docLink:`https://backstage.spotify.com/docs/plugins/soundcheck/core-concepts/fact-collectors/3p-integrations/${o.id}`}),m=o=>({title:"Update Integration",message:`Are you sure you want to update the ${o.name} integration?`,error:!1}),g=({configOption:o,factType:t,additionalParams:e={}})=>({type:t,frequency:p(o.frequency),filter:r(o.filters),cache:n(o.cacheConfig),batchSize:o.batchSize??void 0,...e}),l=({parentConfig:o,factTypeConfig:t})=>({frequency:c(t.frequency??o.frequency),filters:a(t.filter??o.filter),cacheConfig:i(t.cache??o.cache),batchSize:t.batchSize??o.batchSize});export{f as collectorHeaderContent,m as confirmationModalContent,l as mapBackendConfigToFormIntegrationConfig,g as mapFormIntegrationConfigToBackendConfig};
2
2
  //# sourceMappingURL=utils.esm.js.map
@@ -1,2 +1,2 @@
1
- import{makeStyles as v,Paper as C,Divider as D}from"@material-ui/core";import e from"react";import{useForm as b,FormProvider as S}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"../../../../hooks/useSoundcheckAlert.esm.js";import{useConfirmationModal as E}from"../../../../hooks/useConfirmationModal.esm.js";import{useNavigateBack as h}from"../../../../hooks/useNavigateBack.esm.js";import{useUpdateCollectorConfig as y}from"../../../../hooks/collectors/useUpdateCollectorConfig.esm.js";import{integrationsPageRouteRef as F}from"../../../../routes.esm.js";import{FooterButtons as L}from"../../../FooterButtons/FooterButtons.esm.js";import"../../../SoundcheckHeader/SoundcheckHeader.esm.js";import"../../../SoundcheckHeader/SoundcheckHeaderContext.esm.js";import{useHeader as k}from"../../../SoundcheckHeader/useHeader.esm.js";import{FactCollectionConfig as l}from"../Common/FactCollectionConfig.esm.js";import{collectorHeaderContent as w,confirmationModalContent as B}from"../Common/utils.esm.js";import{mapConfigToDataDogCollectorConfig as O,defaultDataDogConfig as j,mapDataDogCollectorConfigToConfig as x}from"./utils.esm.js";const M=v(o=>({spacer:{height:o.spacing(8),width:"100%"},section:{marginBottom:o.spacing(2)}})),N=({disabled:o,selectedCollector:t})=>{const i=b({defaultValues:t?O(t.config):j(),mode:"onChange"}),{formState:{errors:r},handleSubmit:a}=i,n=M(),c=!!r.serviceDefinition||!!r.serviceLevelObjective,{mutateAsync:s}=y(),[f,d]=h(F),{showModal:p}=E(),m=async g=>{if(!await p(B(t)))return;const u=x(g);await s({collectorId:t.id,config:u})&&d()};return k(w(t)),e.createElement(e.Fragment,null,e.createElement(C,{className:n.section},e.createElement(S,{...i},e.createElement("form",{onSubmit:a(m)},e.createElement(l,{name:"serviceDefinition",label:"Service Definition",description:"Collects details about Datadog service linked to an entity.",disabled:o}),e.createElement(D,null),e.createElement(l,{name:"serviceLevelObjective",label:"Service Level Objective",description:"Collects details about SLOs configured for a Datadog service linked to an entity.",disabled:o})))),e.createElement("div",{className:n.section},e.createElement(L,{onCancel:f,saveButtonText:"Save",isLoading:!1,onSave:a(m),disableSave:c})))};export{N as DataDogConfigurator};
1
+ import{makeStyles as v,Paper as C,Divider as D}from"@material-ui/core";import e from"react";import{useForm as b,FormProvider as S}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 E}from"../../../../hooks/useConfirmationModal.esm.js";import{useNavigateBack as h}from"../../../../hooks/useNavigateBack.esm.js";import{useUpdateCollectorConfig as y}from"../../../../hooks/collectors/useUpdateCollectorConfig.esm.js";import{integrationsPageRouteRef as F}from"../../../../routes.esm.js";import{FooterButtons as L}from"../../../FooterButtons/FooterButtons.esm.js";import"../../../SoundcheckHeader/SoundcheckHeader.esm.js";import"../../../SoundcheckHeader/SoundcheckHeaderContext.esm.js";import{useHeader as k}from"../../../SoundcheckHeader/useHeader.esm.js";import{FactCollectionConfig as l}from"../Common/FactCollectionConfig.esm.js";import{collectorHeaderContent as w,confirmationModalContent as B}from"../Common/utils.esm.js";import{mapConfigToDataDogCollectorConfig as O,defaultDataDogConfig as j,mapDataDogCollectorConfigToConfig as x}from"./utils.esm.js";const M=v(o=>({spacer:{height:o.spacing(8),width:"100%"},section:{marginBottom:o.spacing(2)}})),N=({disabled:o,selectedCollector:t})=>{const i=b({defaultValues:t?O(t.config):j(),mode:"onChange"}),{formState:{errors:r},handleSubmit:a}=i,n=M(),c=!!r.serviceDefinition||!!r.serviceLevelObjective,{mutateAsync:s}=y(),[f,d]=h(F),{showModal:p}=E(),m=async g=>{if(!await p(B(t)))return;const u=x(g);await s({collectorId:t.id,config:u})&&d()};return k(w(t)),e.createElement(e.Fragment,null,e.createElement(C,{className:n.section},e.createElement(S,{...i},e.createElement("form",{onSubmit:a(m)},e.createElement(l,{name:"serviceDefinition",label:"Service Definition",description:"Collects details about Datadog service linked to an entity.",disabled:o}),e.createElement(D,null),e.createElement(l,{name:"serviceLevelObjective",label:"Service Level Objective",description:"Collects details about SLOs configured for a Datadog service linked to an entity.",disabled:o})))),e.createElement("div",{className:n.section},e.createElement(L,{onCancel:f,saveButtonText:"Save",isLoading:!1,onSave:a(m),disableSave:c})))};export{N as DataDogConfigurator};
2
2
  //# sourceMappingURL=DataDogConfigurator.esm.js.map