@spotify/backstage-plugin-soundcheck 0.12.11 → 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (160) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/alpha/package.json +1 -1
  3. package/dist/components/CampaignDetailsPage/CampaignChecks.esm.js +2 -0
  4. package/dist/components/CampaignDetailsPage/CampaignDetailsPage.esm.js +2 -0
  5. package/dist/components/CampaignDetailsPage/CampaignProgress.esm.js +2 -0
  6. package/dist/components/CampaignDetailsPage/CampaignResultsTable.esm.js +2 -0
  7. package/dist/components/CampaignForm/CampaignForm.esm.js +2 -0
  8. package/dist/components/CampaignForm/CampaignFormDescription.esm.js +2 -0
  9. package/dist/components/CampaignForm/Steps/CampaignDetailsStep/CampaignDetailsStep.esm.js +2 -0
  10. package/dist/components/CampaignForm/Steps/CampaignDetailsStep/CampaignOwnerField.esm.js +2 -0
  11. package/dist/components/CampaignForm/Steps/CampaignDetailsStep/CampaignScheduleField.esm.js +2 -0
  12. package/dist/components/CampaignForm/Steps/CampaignDetailsStep/CampaignSupportChannelField.esm.js +2 -0
  13. package/dist/components/CampaignForm/Steps/CampaignMilestonesStep.esm.js +2 -0
  14. package/dist/components/CampaignForm/Steps/CampaignTrackStep.esm.js +2 -0
  15. package/dist/components/CampaignForm/hooks/useCampaignForm.esm.js +2 -0
  16. package/dist/components/CampaignForm/hooks/utils.esm.js +2 -0
  17. package/dist/components/CampaignForm/types/CampaignFormTypes.esm.js +2 -0
  18. package/dist/components/CampaignForm/utils/validation.esm.js +2 -0
  19. package/dist/components/CampaignsPage/AddCampaignView.esm.js +2 -0
  20. package/dist/components/CampaignsPage/CampaignEmptyState.esm.js +2 -0
  21. package/dist/components/CampaignsPage/CampaignListPage/CampaignListPage.esm.js +2 -0
  22. package/dist/components/CampaignsPage/CampaignsPage.esm.js +1 -1
  23. package/dist/components/CampaignsPage/EditCampaignView.esm.js +2 -0
  24. package/dist/components/CertificationSidebar/Check.esm.js +1 -1
  25. package/dist/components/CheckForm/CheckForm.esm.js +2 -0
  26. package/dist/components/CheckForm/CheckFormDescription.esm.js +2 -0
  27. package/dist/components/CheckForm/FormFields/CheckDescriptionInput/CheckDescriptionInput.esm.js +2 -0
  28. package/dist/components/CheckForm/FormFields/CheckScheduleSection/ScheduleSection.esm.js +2 -0
  29. package/dist/components/CheckForm/FormFields/PassFailMessageInput/PassFailMessageInput.esm.js +2 -0
  30. package/dist/components/CheckForm/FormFields/RuleInput/Conditions/RuleConditionInput.esm.js +2 -0
  31. package/dist/components/CheckForm/FormFields/RuleInput/Conditions/useRuleOptions.esm.js +2 -0
  32. package/dist/components/CheckForm/FormFields/RuleInput/Expressions/ExpressionTypeToggle.esm.js +2 -0
  33. package/dist/components/CheckForm/FormFields/RuleInput/RuleInputBox.esm.js +2 -0
  34. package/dist/components/CheckForm/FormFields/RuleInput/useRuleInputHandlers.esm.js +2 -0
  35. package/dist/components/CheckForm/FormFields/TeamDetailsInput/TeamDetailsInput.esm.js +2 -0
  36. package/dist/components/CheckForm/Steps/CheckDetailsStep.esm.js +2 -0
  37. package/dist/components/CheckForm/Steps/CheckRulesStep.esm.js +2 -0
  38. package/dist/components/CheckForm/types/CheckFormTypes.esm.js +2 -0
  39. package/dist/components/CheckForm/types/Schedule.esm.js +2 -0
  40. package/dist/components/CheckForm/useCheckForm.esm.js +2 -0
  41. package/dist/components/CheckForm/utils/checkFormUtils.esm.js +2 -0
  42. package/dist/components/CheckForm/utils/validation.esm.js +2 -0
  43. package/dist/components/CheckPage/CheckDetailsView.esm.js +1 -1
  44. package/dist/components/CheckPage/CheckEditView.esm.js +1 -1
  45. package/dist/components/CheckPage/FilterBar/FilterBar.esm.js +1 -1
  46. package/dist/components/ChecksPage/AddCheckView.esm.js +2 -0
  47. package/dist/components/ChecksPage/CheckListPage/CheckListPage.esm.js +1 -1
  48. package/dist/components/ChecksPage/ChecksPage.esm.js +1 -1
  49. package/dist/components/DroppableInput/DroppableInput.esm.js +1 -1
  50. package/dist/components/OverviewPage/CampaignBanner/CampaignBanner.esm.js +2 -0
  51. package/dist/components/OverviewPage/{CampaignRow/useCampaignRowStyles.esm.js → CampaignBanner/useCampaignBannerStyles.esm.js} +2 -2
  52. package/dist/components/OverviewPage/OverviewPageContent.esm.js +1 -1
  53. package/dist/components/OverviewPage/OverviewTabs.esm.js +1 -1
  54. package/dist/components/OverviewTable/Cell/CheckCell.esm.js +2 -0
  55. package/dist/components/OverviewTable/Cell/CheckNameCell.esm.js +2 -0
  56. package/dist/components/OverviewTable/Cell/EntityRefCell.esm.js +2 -0
  57. package/dist/components/OverviewTable/Cell/HighestLevelBadge.esm.js +2 -0
  58. package/dist/components/OverviewTable/Cell/TrackCheckIndicator.esm.js +2 -0
  59. package/dist/components/OverviewTable/Cell/TrackLevelHeaderCell.esm.js +2 -0
  60. package/dist/components/OverviewTable/Cell/TrackTitleCell.esm.js +2 -0
  61. package/dist/components/OverviewTable/Cell/cellRenderer.esm.js +2 -0
  62. package/dist/components/OverviewTable/OverviewTable.esm.js +2 -0
  63. package/dist/components/OverviewTable/OverviewTableContent.esm.js +2 -0
  64. package/dist/components/OverviewTable/OverviewTableSkeleton.esm.js +2 -0
  65. package/dist/components/OverviewTable/ResultsTable.esm.js +2 -0
  66. package/dist/components/OverviewTable/ResultsTableHeader.esm.js +2 -0
  67. package/dist/components/OverviewTable/ResultsTableRow.esm.js +2 -0
  68. package/dist/components/OverviewTable/resultsTableUtils.esm.js +2 -0
  69. package/dist/components/OverviewTable/useWindowDimensions.esm.js +2 -0
  70. package/dist/components/Router.esm.js +1 -1
  71. package/dist/components/RoutingPage/RoutingPage.esm.js +1 -1
  72. package/dist/components/SearchFilters/SearchFilters.esm.js +1 -1
  73. package/dist/components/TechHealth/Filters/FilterProvider.esm.js +1 -1
  74. package/dist/components/TrackPage/FilterBar/FilterBar.esm.js +1 -1
  75. package/dist/components/TrackPage/TrackEntitiesTable/TrackStatusChip.esm.js +1 -1
  76. package/dist/components/TrackPage/TrackEntitiesTable/columns.esm.js +1 -1
  77. package/dist/components/TrackPage/TrackEntitiesTable/utils.esm.js +1 -1
  78. package/dist/components/TrackPage/utils.esm.js +1 -1
  79. package/dist/components/TracksPage/TrackListPage/TrackListPage.esm.js +1 -1
  80. package/dist/hooks/catalog/useGetEntityFacets.esm.js +1 -1
  81. package/dist/hooks/facets/useFacetFilters.esm.js +1 -1
  82. package/dist/utils/export.esm.js +3 -3
  83. package/package.json +15 -15
  84. package/dist/components/CampaignsTab/CampaignDetailsPage/CampaignChecks.esm.js +0 -2
  85. package/dist/components/CampaignsTab/CampaignDetailsPage/CampaignDetailsPage.esm.js +0 -2
  86. package/dist/components/CampaignsTab/CampaignDetailsPage/CampaignProgress.esm.js +0 -2
  87. package/dist/components/CampaignsTab/CampaignDetailsPage/CampaignResultsTable.esm.js +0 -2
  88. package/dist/components/CampaignsTab/CampaignListPage/CampaignListPage.esm.js +0 -2
  89. package/dist/components/CampaignsTab/MutateCampaignsViews/AddCampaignView.esm.js +0 -2
  90. package/dist/components/CampaignsTab/MutateCampaignsViews/CampaignForm.esm.js +0 -2
  91. package/dist/components/CampaignsTab/MutateCampaignsViews/CampaignFormDescription.esm.js +0 -2
  92. package/dist/components/CampaignsTab/MutateCampaignsViews/EditCampaignView.esm.js +0 -2
  93. package/dist/components/CampaignsTab/MutateCampaignsViews/Steps/CampaignDetailsStep/CampaignDetailsStep.esm.js +0 -2
  94. package/dist/components/CampaignsTab/MutateCampaignsViews/Steps/CampaignDetailsStep/CampaignOwnerField.esm.js +0 -2
  95. package/dist/components/CampaignsTab/MutateCampaignsViews/Steps/CampaignDetailsStep/CampaignScheduleField/CampaignScheduleField.esm.js +0 -2
  96. package/dist/components/CampaignsTab/MutateCampaignsViews/Steps/CampaignDetailsStep/CampaignSupportChannelField.esm.js +0 -2
  97. package/dist/components/CampaignsTab/MutateCampaignsViews/Steps/CampaignMilestonesStep.esm.js +0 -2
  98. package/dist/components/CampaignsTab/MutateCampaignsViews/Steps/CampaignTrackStep.esm.js +0 -2
  99. package/dist/components/CampaignsTab/MutateCampaignsViews/hooks/useCampaignForm.esm.js +0 -2
  100. package/dist/components/CampaignsTab/MutateCampaignsViews/hooks/utils.esm.js +0 -2
  101. package/dist/components/CampaignsTab/MutateCampaignsViews/types/CampaignFormTypes.esm.js +0 -2
  102. package/dist/components/CampaignsTab/MutateCampaignsViews/utils/validation.esm.js +0 -2
  103. package/dist/components/ChecksPage/MutateCheckViews/AddCheckView.esm.js +0 -2
  104. package/dist/components/ChecksPage/MutateCheckViews/CheckForm/CheckForm.esm.js +0 -2
  105. package/dist/components/ChecksPage/MutateCheckViews/CheckForm/CheckFormDescription.esm.js +0 -2
  106. package/dist/components/ChecksPage/MutateCheckViews/CheckForm/Steps/CheckDetailsStep.esm.js +0 -2
  107. package/dist/components/ChecksPage/MutateCheckViews/CheckForm/Steps/CheckRulesStep.esm.js +0 -2
  108. package/dist/components/ChecksPage/MutateCheckViews/FormFields/CheckDescriptionInput/CheckDescriptionInput.esm.js +0 -2
  109. package/dist/components/ChecksPage/MutateCheckViews/FormFields/CheckScheduleSection/ScheduleSection.esm.js +0 -2
  110. package/dist/components/ChecksPage/MutateCheckViews/FormFields/PassFailMessageInput/PassFailMessageInput.esm.js +0 -2
  111. package/dist/components/ChecksPage/MutateCheckViews/FormFields/RuleInput/Conditions/RuleConditionInput.esm.js +0 -2
  112. package/dist/components/ChecksPage/MutateCheckViews/FormFields/RuleInput/Conditions/useRuleOptions.esm.js +0 -2
  113. package/dist/components/ChecksPage/MutateCheckViews/FormFields/RuleInput/Expressions/ExpressionTypeToggle.esm.js +0 -2
  114. package/dist/components/ChecksPage/MutateCheckViews/FormFields/RuleInput/RuleInputBox.esm.js +0 -2
  115. package/dist/components/ChecksPage/MutateCheckViews/FormFields/RuleInput/useRuleInputHandlers.esm.js +0 -2
  116. package/dist/components/ChecksPage/MutateCheckViews/FormFields/TeamDetailsInput/TeamDetailsInput.esm.js +0 -2
  117. package/dist/components/ChecksPage/MutateCheckViews/hooks/useCheckForm.esm.js +0 -2
  118. package/dist/components/ChecksPage/MutateCheckViews/types/CheckFormTypes.esm.js +0 -2
  119. package/dist/components/ChecksPage/MutateCheckViews/types/Schedule.esm.js +0 -2
  120. package/dist/components/ChecksPage/MutateCheckViews/utils/checkFormUtils.esm.js +0 -2
  121. package/dist/components/ChecksPage/MutateCheckViews/utils/validation.esm.js +0 -2
  122. package/dist/components/EmptyState/CampaignEmptyState.esm.js +0 -2
  123. package/dist/components/OverviewPage/CampaignRow/CampaignRow.esm.js +0 -2
  124. package/dist/components/OverviewPage/TableContent/TableContent.esm.js +0 -2
  125. package/dist/components/OverviewPage/TableContent/VirtualTableContent.esm.js +0 -2
  126. package/dist/components/ResultsTable/CheckCell/CheckCell.esm.js +0 -2
  127. package/dist/components/ResultsTable/HighestLevelBadge.esm.js +0 -2
  128. package/dist/components/ResultsTable/ProgramCheckIndicator.esm.js +0 -2
  129. package/dist/components/ResultsTable/ProgramCheckRow.esm.js +0 -2
  130. package/dist/components/ResultsTable/ProgramLevelRow.esm.js +0 -2
  131. package/dist/components/ResultsTable/ProgramTitleRow.esm.js +0 -2
  132. package/dist/components/ResultsTable/ResultsTableFooter.esm.js +0 -2
  133. package/dist/components/ResultsTable/skeletons/ResultsTableSkeleton.esm.js +0 -2
  134. package/dist/components/ResultsTable/virtualized/Cell.esm.js +0 -2
  135. package/dist/components/ResultsTable/virtualized/Row.esm.js +0 -2
  136. package/dist/components/ResultsTable/virtualized/VirtualizedResultsTable.esm.js +0 -2
  137. package/dist/components/ResultsTable/virtualized/virtualizedTableUtils.esm.js +0 -2
  138. /package/dist/components/{CampaignsTab/CampaignDetailsPage → CampaignDetailsPage}/CampaignDetailRow.esm.js +0 -0
  139. /package/dist/components/{CampaignsTab/CampaignDetailsPage → CampaignDetailsPage}/CampaignDetails.esm.js +0 -0
  140. /package/dist/components/{CampaignsTab/CampaignDetailsPage → CampaignDetailsPage}/CampaignMilestones.esm.js +0 -0
  141. /package/dist/components/{CampaignsTab/MutateCampaignsViews → CampaignForm}/Steps/CampaignDetailsStep/CampaignDescriptionField.esm.js +0 -0
  142. /package/dist/components/{CampaignsTab/MutateCampaignsViews → CampaignForm}/Steps/CampaignDetailsStep/CampaignNameField.esm.js +0 -0
  143. /package/dist/components/{CampaignsTab/MutateCampaignsViews/Steps/CampaignDetailsStep/CampaignScheduleField → CampaignForm/Steps/CampaignDetailsStep}/EndDateChips.esm.js +0 -0
  144. /package/dist/components/{CampaignsTab/MutateCampaignsViews → CampaignForm}/utils/campaignFormUtils.esm.js +0 -0
  145. /package/dist/components/{CampaignsTab → CampaignsPage}/CampaignListPage/CampaignMetadata.esm.js +0 -0
  146. /package/dist/components/{CampaignsTab → CampaignsPage}/CampaignListPage/CampaignSummaryCard.esm.js +0 -0
  147. /package/dist/components/{CampaignsTab → CampaignsPage/CampaignListPage}/CampaignTypes.esm.js +0 -0
  148. /package/dist/components/{CampaignsTab/skeletons → CampaignsPage/CampaignListPage}/CampaignsOverviewSkeleton.esm.js +0 -0
  149. /package/dist/components/{CampaignsTab → CampaignsPage}/CampaignListPage/useArchiveConfirmationModal.esm.js +0 -0
  150. /package/dist/components/{ChecksPage/MutateCheckViews → CheckForm}/FormFields/CheckNameInput/CheckNameInput.esm.js +0 -0
  151. /package/dist/components/{ChecksPage/MutateCheckViews → CheckForm}/FormFields/RuleInput/AddMenuButton.esm.js +0 -0
  152. /package/dist/components/{ChecksPage/MutateCheckViews → CheckForm}/FormFields/RuleInput/Conditions/ConditionList.esm.js +0 -0
  153. /package/dist/components/{ChecksPage/MutateCheckViews → CheckForm}/FormFields/RuleInput/Conditions/ControlledAutocomplete.esm.js +0 -0
  154. /package/dist/components/{ChecksPage/MutateCheckViews → CheckForm}/FormFields/RuleInput/Conditions/styles.esm.js +0 -0
  155. /package/dist/components/{ChecksPage/MutateCheckViews → CheckForm}/FormFields/RuleInput/Expressions/ExpressionBox.esm.js +0 -0
  156. /package/dist/components/{ChecksPage/MutateCheckViews → CheckForm}/types/ExpressionType.esm.js +0 -0
  157. /package/dist/components/{ChecksPage/MutateCheckViews → CheckForm}/types/Path.esm.js +0 -0
  158. /package/dist/components/OverviewPage/{CampaignRow → CampaignBanner}/utils.esm.js +0 -0
  159. /package/dist/components/OverviewPage/{skeletons/OverviewTabsSkeleton.esm.js → OverviewTabsSkeleton.esm.js} +0 -0
  160. /package/dist/components/{ResultsTable/CheckCell → OverviewTable/Cell}/CheckCellTooltip.esm.js +0 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,26 @@
1
1
  # @spotify/backstage-plugin-soundcheck
2
2
 
3
+ ## 0.13.0
4
+
5
+ ### Minor Changes
6
+
7
+ - Introduced a new Check Insights page allowing users to view compliance to a check across their Software Catalog.
8
+
9
+ ### Patch Changes
10
+
11
+ - Upgraded Backstage to v1.29.1
12
+ - Fixed the issue when filters that are cached in local storage are incorrectly merged with URL
13
+ filters on the Tech Health page.
14
+ - Add clearer labels for the overview page tabs when there are categories with the same type.
15
+ - Resolved an issue where check details would appear not to load if the first check was not applicable to the entity.
16
+ - Move entity names to the top of the overview page as a sticky header.
17
+ - Fixes check export to include the check's schedule.
18
+ - Adds support for collecting facts from glob paths for the SCM fact collector.
19
+ - Rule operator input in the check form now allows a free form string to be inputted to use custom or advanced operators.
20
+ - Updated dependencies
21
+ - @spotify/backstage-plugin-soundcheck-common@0.13.4
22
+ - @spotify/backstage-plugin-core@0.7.3
23
+
3
24
  ## 0.12.11
4
25
 
5
26
  ### Patch Changes
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@spotify/backstage-plugin-soundcheck__alpha",
3
- "version": "0.12.11",
3
+ "version": "0.13.0",
4
4
  "main": "../dist/alpha.esm.js",
5
5
  "module": "../dist/alpha.esm.js",
6
6
  "types": "../dist/alpha.d.ts"
@@ -0,0 +1,2 @@
1
+ import{Typography as n}from"@material-ui/core";import{makeStyles as c}from"@material-ui/core/styles";import e from"react";import{DraggableChip as o}from"../DraggableChip/DraggableChip.esm.js";const l=c(a=>({sectionLabel:{margin:a.spacing(2,0)},chipContainer:{display:"flex",flexDirection:"column",fontWeight:"bold",fontSize:a.typography.pxToRem(16),color:a.palette.grey[600],"& .Mui-disabled":{opacity:1}}})),m=({campaign:a})=>{const t=l(),r=a.track?.levels?.[0].checks??[];return e.createElement(e.Fragment,null,e.createElement(n,{color:"textPrimary",variant:"h5",className:t.sectionLabel},"Campaign Checks"),e.createElement("div",{className:t.chipContainer},r.length?r.map(i=>e.createElement(o,{key:i.id,chip:i,disabled:!0})):e.createElement(n,{variant:"body1",color:"textSecondary",style:{alignSelf:"center"}},"There are no checks for this campaign.")))};export{m as CampaignChecks};
2
+ //# sourceMappingURL=CampaignChecks.esm.js.map
@@ -0,0 +1,2 @@
1
+ import{Grid as a}from"@material-ui/core";import{makeStyles as p}from"@material-ui/core/styles";import e from"react";import{DndProvider as c}from"react-dnd";import{HTML5Backend as s}from"react-dnd-html5-backend";import{useParams as l}from"react-router-dom";import"@backstage/catalog-model";import"@backstage/core-plugin-api";import"@tanstack/react-query";import"../../api.esm.js";import"../../hooks/graphqlKeys.esm.js";import"@backstage/plugin-catalog-react";import"../../hooks/useSoundcheckAlert.esm.js";import"../../hooks/useConfirmationModal.esm.js";import{useNavigateBack as g}from"../../hooks/useNavigateBack.esm.js";import{useGetCampaign as d}from"../../hooks/campaigns/useGetCampaign.esm.js";import{campaignsPageRouteRef as f}from"../../routes.esm.js";import{EmptyCampaignState as E}from"../CampaignsPage/CampaignEmptyState.esm.js";import{FullScreenDialog as C}from"../FullScreenDialog/FullScreenDialog.esm.js";import{Loading as u}from"../TechHealth/Loading/Loading.esm.js";import{CampaignChecks as x}from"./CampaignChecks.esm.js";import{CampaignDetails as S}from"./CampaignDetails.esm.js";import{CampaignMilestones as k}from"./CampaignMilestones.esm.js";import{CampaignProgress as y}from"./CampaignProgress.esm.js";const D=p(t=>({root:{flexGrow:1,padding:t.spacing(2)},progressSection:{minHeight:350,fontSize:t.typography.body1.fontSize}})),P=()=>{const t=D(),{campaignId:r}=l(),{data:o,isLoading:i}=d(r??""),m=o?.edges?.[0]?.node,[n]=g(f);return i?e.createElement("div",{"data-testid":"loading-indicator"},e.createElement(u,null)):m?e.createElement(C,{title:"Campaign Details",open:!0,handleClose:n},e.createElement(c,{backend:s},e.createElement(a,{container:!0,className:t.root,spacing:3,direction:"column"},e.createElement(a,{item:!0,xs:12},e.createElement(S,{campaign:m})),e.createElement(a,{item:!0,xs:6},e.createElement(x,{campaign:m})),e.createElement(a,{item:!0,xs:12,className:t.progressSection},e.createElement(y,{campaign:m})),e.createElement(a,{item:!0,xs:12},e.createElement(k,{campaign:m}))))):e.createElement(E,null)};export{P as CampaignDetailsPage};
2
+ //# sourceMappingURL=CampaignDetailsPage.esm.js.map
@@ -0,0 +1,2 @@
1
+ import{Typography as n}from"@material-ui/core";import{makeStyles as C}from"@material-ui/core/styles";import e from"react";import{useGetCampaignProgress as P}from"../../hooks/campaigns/useGetCampaignProgress.esm.js";import{OverviewTableSkeleton as f}from"../OverviewTable/OverviewTableSkeleton.esm.js";import"../Pagination/Pagination.esm.js";import{useCursorPagination as v,CursorPagination as b}from"../Pagination/CursorPagination.esm.js";import{CampaignResultsTable as S}from"./CampaignResultsTable.esm.js";const i=C(r=>({sectionLabel:{margin:r.spacing(2,0)},paginationContainer:{margin:r.spacing(0,0,0,-4)}})),o=25,t=()=>{const r=i();return e.createElement(n,{variant:"h5",className:r.sectionLabel,color:"textPrimary"},"Campaign Progress")},k=({campaign:r})=>{const m=i(),{cursor:s,pageSize:l,...c}=v({defaultPageSize:o,label:"entitiesPerPage"}),{data:a,isLoading:g,isError:p}=P(r.id,l,s);if(g)return e.createElement(e.Fragment,null,e.createElement(t,null),e.createElement("div",{"data-testid":"progress-indicator"},e.createElement(f,{checkCount:1,levelCount:1})));if(p)return e.createElement(e.Fragment,null,e.createElement(t,null),e.createElement(n,{color:"error"},"Failed to load campaign progress."));if(!a)return e.createElement(e.Fragment,null,e.createElement(t,null),e.createElement(n,null,"No campaign progress available."));const{totalCount:u,endCursor:E,prevCursor:d}=a;return e.createElement(e.Fragment,null,e.createElement(t,null),e.createElement(S,{results:a,campaignTrackId:r.track.id}),e.createElement("div",{className:m.paginationContainer},e.createElement(b,{...c,totalCount:u,defaultPageSize:o,endCursor:E,prevCursor:d,pageSize:l,rowsPerPageOptions:[o],labelRowsPerPage:"Entities per page:"})))};export{k as CampaignProgress};
2
+ //# sourceMappingURL=CampaignProgress.esm.js.map
@@ -0,0 +1,2 @@
1
+ import{useRouteRef as R}from"@backstage/core-plugin-api";import{entityRouteRef as k}from"@backstage/plugin-catalog-react";import{makeStyles as b,Grid as C}from"@material-ui/core";import m from"react";import{VariableSizeGrid as T}from"react-window";import{ResultState as w}from"../../graphql/generated/index.esm.js";import{cellRenderer as y,entityHeaderCell as u,checkTitleCell as S,checkResultCell as A}from"../OverviewTable/Cell/cellRenderer.esm.js";import{CellWidths as p,calculateTableHeight as H,calculateTableWidth as x,findLongestRefTitle as E,calculateHeightForRefTitle as N,RowHeights as W}from"../OverviewTable/resultsTableUtils.esm.js";const f=25,v=(o,r,n,c)=>{const a=[],t=E(r??[]);a.push({height:Math.min(N(t.length??1),125),cells:[u(""),...r.map(e=>u(e||""))]});for(const{check:e,results:l,totalCount:i,totalPassing:h}of o)a.push({height:W.check,cells:[S(e.name,{PASSED:h,FAILED:i-h}),...r.flatMap(s=>{if(s===void 0)return[];const g=l.find(({entityRef:d})=>d===s)?.result??w.NotApplicable;return[A(c,e,s,g,n)]})]});return a},D=b(o=>({table:{backgroundColor:o.palette.background.paper,borderCollapse:"collapse",whiteSpace:"nowrap",textAlign:"left"}})),F=({results:o,campaignTrackId:r})=>{const n=D(),c=R(k),{checks:a,entityRefs:t}=o,e=t.length>=f?t:[...t,...Array.from({length:f-t.length},()=>{})],l=v(a,e,c,r);return m.createElement(C,{item:!0,xs:12},m.createElement(T,{style:{overflow:"auto hidden"},className:n.table,columnCount:e.length+1,columnWidth:i=>i===0?p.trackTitle:p.checkResult,rowCount:l.length,rowHeight:i=>l[i].height,height:H(l)+25,width:x(e.length+25)},y(l)))};export{F as CampaignResultsTable};
2
+ //# sourceMappingURL=CampaignResultsTable.esm.js.map
@@ -0,0 +1,2 @@
1
+ import{Typography as k}from"@material-ui/core";import e from"react";import{Controller as y}from"react-hook-form";import"../../contexts/TrackFormContext.esm.js";import"../../contexts/CheckFormContext.esm.js";import{useCampaignFormContext as v}from"../../contexts/CampaignFormContext.esm.js";import"../../contexts/UserProvider.esm.js";import F from"../../hooks/useFeatureFlag.esm.js";import{formStyles as L}from"../../utils/formStyles.esm.js";import"@spotify/backstage-plugin-soundcheck-common";import{emptyFilters as D}from"../Filter/types.esm.js";import{FilterComponent as M}from"../Filter/FilterComponent.esm.js";import{FormStepper as A}from"../FormStepper/FormStepper.esm.js";import{CampaignFormDescription as N}from"./CampaignFormDescription.esm.js";import{useCampaignForm as O}from"./hooks/useCampaignForm.esm.js";import{CampaignDetailsStep as x}from"./Steps/CampaignDetailsStep/CampaignDetailsStep.esm.js";import{CampaignTrackStep as T}from"./Steps/CampaignTrackStep.esm.js";import{CampaignMilestonesStep as I}from"./Steps/CampaignMilestonesStep.esm.js";import{StepNameMapping as R}from"./types/CampaignFormTypes.esm.js";import{CAMPAIGN_FIELDS as V}from"./utils/campaignFormUtils.esm.js";var c=(t=>(t.Details="Enter campaign details",t.Checks="Add checks",t.Entities="Choose the affected entities (Optional)",t.Milestones="Set campaign milestones",t))(c||{});const B=({onSave:t,onCancel:d,selectedCampaign:a})=>{const g=L(),{isLoading:o,isReadOnly:f}=v(),{control:i,handleSubmit:n,errors:r,trigger:C,getValues:S,onSubmit:m,checkChips:h,checksLoading:b}=O(t,a),s=S(),u=s.detailsStep.startDate;F("debugMode")&&console.log(s);const l=[{label:"Enter campaign details",content:()=>e.createElement(x,{control:i,isLoading:o,disabled:!1,errors:r.detailsStep,startDate:u})},{label:"Add checks",content:()=>e.createElement(T,{control:i,isLoading:o||b,disabled:!1,errors:r.tracksStep,checkChips:h})},{label:"Choose the affected entities (Optional)",content:()=>e.createElement("div",{className:g.filters},e.createElement(k,{variant:"body2"},V.filter.description),e.createElement(y,{name:"filtersStep",control:i,render:({field:p})=>e.createElement(M,{value:p.value??D(),onChange:p.onChange})}))},{label:"Set campaign milestones",content:()=>e.createElement(I,{control:i,isLoading:o,disabled:!1,errors:r.milestonesStep})}],E=a?[...Array(l.length).keys()]:[0];return e.createElement("form",{onSubmit:n(m)},e.createElement(A,{onClose:d,handleSubmit:n,trigger:C,onSubmit:m,initialVisited:E,stepNameMap:R,steps:l,isLoading:o,isReadOnly:f,saveButtonText:"Save Campaign",detailsComponent:e.createElement(N,null)}))};export{B as CampaignForm,c as CampaignStepLabel};
2
+ //# sourceMappingURL=CampaignForm.esm.js.map
@@ -0,0 +1,2 @@
1
+ import{useRouteRef as i}from"@backstage/core-plugin-api";import{makeStyles as r,Typography as a,Button as m}from"@material-ui/core";import e from"react";import{useNavigate as s}from"react-router-dom";import{techHealthRouteRef as l}from"../../routes.esm.js";const c=r(t=>({container:{display:"flex",gap:t.spacing(1),flexDirection:"column"},link:{fontWeight:"bold",padding:0,color:t.palette.text.primary,"&:hover":{textDecoration:"underline",transform:"none"}},list:{marginTop:0},listItem:{marginBottom:t.spacing(1)}})),p=()=>{const t=c(),n=i(l),o=s();return e.createElement("div",{className:t.container},e.createElement(a,{variant:"h6"},"Creating campaigns"),e.createElement(a,{variant:"body1"},"A Campaign is a focused short term initiative."),e.createElement(a,{variant:"body1"},"You can create campaigns, assign them to teams that own software components, and track them towards a completion milestone via the"," ",e.createElement(m,{variant:"text",color:"primary",onClick:()=>o(n()),className:t.link},"Tech Health")," ","page."),e.createElement(a,{variant:"body1"},"Some use cases for campaigns include:"),e.createElement("div",null,e.createElement("ul",{className:t.list},e.createElement("li",{className:t.listItem},e.createElement(a,{variant:"body1"},"When your organization wants to upgrade Spring libraries to use a specific version of Spring Boot.")),e.createElement("li",null,e.createElement(a,{variant:"body1"},"When your organization wants to remove unneeded data endpoints to save costs.")))))};export{p as CampaignFormDescription};
2
+ //# sourceMappingURL=CampaignFormDescription.esm.js.map
@@ -0,0 +1,2 @@
1
+ import e from"react";import{CampaignDescriptionField as n}from"./CampaignDescriptionField.esm.js";import{CampaignNameField as l}from"./CampaignNameField.esm.js";import{CampaignOwnerField as m}from"./CampaignOwnerField.esm.js";import{CampaignScheduleField as d}from"./CampaignScheduleField.esm.js";import{CampaignSupportChannelField as s}from"./CampaignSupportChannelField.esm.js";const p=({control:r,errors:o,isLoading:i,disabled:a,startDate:t})=>e.createElement(e.Fragment,null,e.createElement(l,{control:r,errors:o,isLoading:i,disabled:a}),e.createElement(n,{control:r,errors:o,isLoading:i,disabled:a}),e.createElement(m,{control:r,errors:o,isLoading:i,disabled:a}),e.createElement(s,{control:r,errors:o,isLoading:i,disabled:a}),e.createElement(d,{control:r,errors:o,isLoading:i,disabled:a,startDate:t}));export{p as CampaignDetailsStep};
2
+ //# sourceMappingURL=CampaignDetailsStep.esm.js.map
@@ -0,0 +1,2 @@
1
+ import{makeStyles as f,Typography as l}from"@material-ui/core";import{uniqBy as u}from"lodash";import e from"react";import"../../../../contexts/TrackFormContext.esm.js";import"../../../../contexts/CheckFormContext.esm.js";import"../../../../contexts/CampaignFormContext.esm.js";import{useLoggedInUser as g}from"../../../../contexts/UserProvider.esm.js";import{FormControlledSelect as E}from"../../../FormControlledSelect/FormControlledSelect.esm.js";import{useOptions as y}from"../../../GroupSelector/useOptions.esm.js";import{CAMPAIGN_FIELDS as v}from"../../utils/campaignFormUtils.esm.js";const h=f(t=>({helperText:{marginLeft:0},selectField:{display:"flex",flexDirection:"column",gap:t.spacing(1),marginBottom:t.spacing(2)},fieldContainer:{width:"250px"}})),w=({control:t,errors:m,isLoading:s,disabled:p})=>{const o=h(),{owner:i}=v.details,{options:d}=y(),{user:c,userEntityRef:a}=g();let r=u(d?.map(n=>({value:n.ref,label:n.name})),"value");return a&&(r=[{value:a,label:c?.metadata.name},...r]),e.createElement("div",{className:o.selectField},e.createElement("header",null,e.createElement(l,{variant:"subtitle2"},i.name),e.createElement(l,{variant:"caption"},i.description)),e.createElement("div",{className:o.fieldContainer},e.createElement(E,{name:"detailsStep.ownerEntityRef",control:t,options:r,placeholder:"Owner",disabled:p||s,style:{width:"100%"},helperText:m?.ownerEntityRef?.message??void 0})))};export{w as CampaignOwnerField};
2
+ //# sourceMappingURL=CampaignOwnerField.esm.js.map
@@ -0,0 +1,2 @@
1
+ import h from"@date-io/luxon";import{makeStyles as N,Typography as m}from"@material-ui/core";import{KeyboardDatePicker as C}from"@material-ui/pickers/DatePicker";import{MuiPickersUtilsProvider as b}from"@material-ui/pickers/MuiPickersUtilsProvider";import e,{useState as i}from"react";import{Controller as D}from"react-hook-form";import{CAMPAIGN_FIELDS as k}from"../../utils/campaignFormUtils.esm.js";import{EndDateChips as F}from"./EndDateChips.esm.js";const S=N(t=>({helperText:{margin:t.spacing(.5,0)},selectFieldGroup:{display:"flex",flexDirection:"column",gap:t.spacing(2),marginBottom:t.spacing(2)},selectField:{display:"flex",flexDirection:"column",gap:t.spacing(1),padding:0},scheduleTitle:{fontWeight:"bold"},fieldContainer:{width:"250px"},select:{width:"100%",height:"100%",paddingRight:t.spacing(.5),"& button":{paddingTop:0,paddingBottom:0,"&:hover":{backgroundColor:"transparent"}}},dialog:{padding:0,"& [class*=MuiToolbar-root]":{backgroundColor:t.palette.background.paper,borderBottom:`1px solid ${t.palette.divider}`,"& [class*=MuiPickersToolbarText]":{color:t.palette.text.primary}},"& [class*=MuiDialogActions-root]":{borderTop:`1px solid ${t.palette.divider}`,padding:t.spacing(1),"& [class*=MuiButton-label]":{color:t.palette.text.primary}}}})),O=({control:t,errors:o,isLoading:n,disabled:s,startDate:x})=>{const a=S(),[v,d]=i(!1),[y,p]=i(!1),[E,T]=i(x),[P,g]=i(void 0),{startingDate:u,endingDate:f}=k.details;return e.createElement("div",{className:a.selectFieldGroup},e.createElement(m,{variant:"subtitle2",className:a.scheduleTitle},"Campaign schedule"),e.createElement("div",{className:a.selectField},e.createElement(m,{variant:"subtitle2"},u.name),e.createElement("div",{className:a.fieldContainer},e.createElement(D,{control:t,name:"detailsStep.startDate",render:({field:r})=>{const{ref:M,...c}=r;return e.createElement(b,{utils:h},e.createElement(C,{inputRef:r.ref,...c,format:"MMMM dd, yyyy",autoOk:!0,FormHelperTextProps:{className:a.helperText},inputVariant:"outlined",className:a.select,error:!!o?.startDate,helperText:o?.startDate?.message??void 0,onChange:l=>{T(l),r.onChange(l)},open:v,disabled:n||s,DialogProps:{PaperProps:{className:a.dialog}},margin:"dense",size:"small",InputProps:{readOnly:!0,placeholder:u.placeholder,onClick:()=>d(!0),className:a.select},onOpen:()=>d(!0),onClose:()=>d(!1)}))}}))),e.createElement("div",{className:a.selectField},e.createElement(m,{variant:"subtitle2"},f.name),e.createElement("div",{className:a.fieldContainer},e.createElement(D,{name:"detailsStep.targetCompletionDate",control:t,render:({field:r})=>{const{ref:M,...c}=r;return e.createElement(b,{utils:h},e.createElement(C,{inputRef:r.ref,...c,disablePast:!0,format:"MMMM dd, yyyy",autoOk:!0,FormHelperTextProps:{className:a.helperText},inputVariant:"outlined",className:a.select,error:!!o?.targetCompletionDate,helperText:o?.targetCompletionDate?.message??void 0,onChange:l=>{r.onChange(l)},open:y,disabled:n||s,DialogProps:{PaperProps:{className:a.dialog}},InputProps:{readOnly:!0,placeholder:f.placeholder,onClick:()=>p(!0),className:a.select,margin:"dense"},margin:"dense",onOpen:()=>{g(void 0),p(!0)},onClose:()=>p(!1),ToolbarComponent:l=>e.createElement(F,{props:l,isLoading:n,disabled:!!s,startDate:E,selectedDuration:P,setSelectedDuration:g})}))}}))))};export{O as CampaignScheduleField};
2
+ //# sourceMappingURL=CampaignScheduleField.esm.js.map
@@ -0,0 +1,2 @@
1
+ import{makeStyles as p,Typography as o}from"@material-ui/core";import e from"react";import{FormTextInput as m}from"../../../FormTextInput/FormTextInput.esm.js";import{CAMPAIGN_FIELDS as s}from"../../utils/campaignFormUtils.esm.js";const d=p(t=>({fieldContainer:{width:"250px"},container:{marginBottom:t.spacing(2)}})),c=({control:t,errors:a,isLoading:i,disabled:l})=>{const n=d(),{support:r}=s.details;return e.createElement("div",{className:n.container},e.createElement(o,{variant:"subtitle2"},r.name),e.createElement(o,{variant:"caption"},r.description),e.createElement("div",{className:n.fieldContainer},e.createElement(m,{name:"detailsStep.supportChannel",control:t,placeholder:r.placeholder,disabled:l||i,variant:"outlined",margin:"dense",error:a?.supportChannel,helperText:a?.supportChannel?.message??void 0})))};export{c as CampaignSupportChannelField};
2
+ //# sourceMappingURL=CampaignSupportChannelField.esm.js.map
@@ -0,0 +1,2 @@
1
+ import{makeStyles as b,Divider as y,Grid as p,Typography as i,TextField as E}from"@material-ui/core";import N from"@material-ui/icons/Remove";import e from"react";import{useFieldArray as C,Controller as u}from"react-hook-form";import{NoBorderButton as x}from"../../NoBorderButton/NoBorderButton.esm.js";import{CAMPAIGN_FIELDS as F}from"../utils/campaignFormUtils.esm.js";const S=b(r=>({milestoneHeader:{display:"flex",alignItems:"center",marginBottom:r.spacing(1)},divider:{margin:"20px 0"},helperText:{marginLeft:0},selectContainer:{width:"250px"},section:{marginBottom:r.spacing(2)}})),R=({control:r,errors:n,isLoading:o,disabled:l})=>{const a=S(),{name:s,description:c,passrate:d}=F.milestones,{fields:f,append:g,remove:h}=C({control:r,name:"milestonesStep.milestones"}),v=()=>g({name:"",description:"",passRate:"0"});return e.createElement(e.Fragment,null,f.map((T,t)=>e.createElement("div",{key:T.id},t!==0&&e.createElement(y,{className:a.divider}),e.createElement(p,{container:!0,spacing:1,className:a.milestoneHeader},e.createElement(p,{item:!0,xs:!0},e.createElement(i,{variant:"subtitle2"},s.name),e.createElement(i,{variant:"caption"},s.description),e.createElement(u,{name:`milestonesStep.milestones.${t}.name`,control:r,defaultValue:"",render:({field:m})=>e.createElement(E,{...m,FormHelperTextProps:{className:a.helperText},variant:"outlined",fullWidth:!0,placeholder:s.placeholder,disabled:o||l,type:"text",margin:"dense",error:!!n?.milestones?.[t]?.name,helperText:n?.milestones?.[t]?.name?.message??s.helperText})})),t!==0&&!l&&e.createElement(p,{item:!0},e.createElement(x,{label:"Remove Milestone",startIcon:e.createElement(N,null),onClick:()=>h(t),disabled:l}))),e.createElement("div",{className:a.section},e.createElement(i,{variant:"subtitle2"},c.name),e.createElement(i,{variant:"caption"},c.description),e.createElement(u,{name:`milestonesStep.milestones.${t}.description`,control:r,defaultValue:"",render:({field:m})=>e.createElement(E,{...m,FormHelperTextProps:{className:a.helperText},variant:"outlined",multiline:!0,minRows:4,fullWidth:!0,placeholder:c.placeholder,disabled:o||l,type:"text",margin:"dense",error:!!n?.milestones?.[t]?.description,helperText:n?.milestones?.[t]?.description?.message})})),e.createElement("div",{className:a.section},e.createElement(i,{variant:"subtitle2"},d.name),e.createElement(i,{variant:"caption"},d.description),e.createElement("div",{className:a.selectContainer},e.createElement(u,{name:`milestonesStep.milestones.${t}.passRate`,control:r,defaultValue:"",render:({field:m})=>e.createElement(E,{...m,FormHelperTextProps:{className:a.helperText},variant:"outlined",fullWidth:!0,placeholder:d.placeholder,disabled:o||l,type:"number",margin:"dense",error:!!n?.milestones?.[t]?.passRate,helperText:n?.milestones?.[t]?.passRate?.message??void 0})}))))),e.createElement(x,{label:"Add Milestone",onClick:()=>v(),disabled:l}))};export{R as CampaignMilestonesStep};
2
+ //# sourceMappingURL=CampaignMilestonesStep.esm.js.map
@@ -0,0 +1,2 @@
1
+ import{makeStyles as E,FormControl as x,Typography as d,Grid as a}from"@material-ui/core";import{findIndex as b}from"lodash";import e,{useCallback as y}from"react";import{DndProvider as S}from"react-dnd";import{HTML5Backend as T}from"react-dnd-html5-backend";import{useFieldArray as v,Controller as D}from"react-hook-form";import N from"../../../hooks/useFeatureFlag.esm.js";import{ChecksErrors as L}from"../../ChecksErrors/ChecksErrors.esm.js";import{DroppableInput as M}from"../../DroppableInput/DroppableInput.esm.js";import{ChecksSection as I}from"../../TrackForm/Steps/LevelsStep/ChecksSection/ChecksSection.esm.js";const w=E(t=>({columnHeader:{display:"flex",justifyContent:"space-between",alignItems:"center"},subtitle:{color:t.palette.text.primary,marginLeft:"-16px"},helperText:{fontSize:t.typography.subtitle2.fontSize,color:t.palette.textSubtle,marginBottom:t.spacing(1)},levelsContainer:{marginTop:"0",flexDirection:"column"},errorText:{marginTop:t.spacing(3),marginLeft:t.spacing(-4)},formContainer:{width:"100%"}})),H=({control:t,disabled:i,isLoading:l,errors:c,checkChips:m})=>{const o=w(),{fields:n,remove:s,replace:h}=v({control:t,name:"tracksStep.checks",keyName:"key"});N("debugMode")&&(console.log(m),console.log(n));const g=new Set(n.flatMap(({id:r})=>r)),f=m.filter(r=>!g.has(r.id)),p=r=>{h([...n,r])},k=y(r=>{const u=b(n,C=>C.id===r.id);s(u)},[s,n]);return e.createElement(D,{control:t,name:"tracksStep.checks",render:()=>e.createElement(x,{error:!!c?.checks,disabled:i||l,variant:"outlined",className:o.formContainer},e.createElement(d,{className:o.helperText},"Drag or right-click on a check to add it to the Campaign."),e.createElement(a,{item:!0,xs:12},e.createElement(a,{container:!0,spacing:4},e.createElement(S,{backend:T},e.createElement(a,{item:!0,xs:5},e.createElement(I,{chips:f,isLoading:l,disabled:i,label:"Campaign Checks",onContextMenuAdd:p})),e.createElement(a,{item:!0,xs:7},e.createElement(a,{container:!0},e.createElement(a,{item:!0,xs:12,className:o.columnHeader},e.createElement(d,{variant:"subtitle1",className:o.subtitle},"Included Checks")),e.createElement(a,{container:!0,item:!0,spacing:5,className:o.levelsContainer},e.createElement(M,{chips:n,onDelete:k,onDrop:p,error:!!c?.checks,placeholder:"Drag and drop checks here to include them in this level",disabled:i}))),c?.checks&&e.createElement("div",{className:o.errorText},e.createElement(L,{checksErrors:c.checks})))))))})};export{H as CampaignTrackStep};
2
+ //# sourceMappingURL=CampaignTrackStep.esm.js.map
@@ -0,0 +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};
2
+ //# sourceMappingURL=useCampaignForm.esm.js.map
@@ -0,0 +1,2 @@
1
+ import{v4 as S}from"uuid";import{mapInputFilterToFormFilters as h}from"../../Filter/utils.esm.js";import"../../Filter/FilterComponent.esm.js";import{mapTrackFormToInput as u}from"../../TrackForm/utils/useTrackForm.esm.js";const D=({name:r,ownerEntityRef:a,description:p,targetCompletionDate:o,supportChannel:e,milestones:s,startDate:i,track:n})=>({detailsStep:{name:r,description:p,ownerEntityRef:a,supportChannel:e,startDate:i,targetCompletionDate:o},tracksStep:{checks:n?.levels?.[0].checks.map(t=>({id:t.id,name:t.name??t.id,description:t.description}))},filtersStep:h(n.filter),milestonesStep:{milestones:s.map(t=>({id:Number(t.id),name:t.name,description:t.description,passRate:t.targetPercent.toString()}))}}),R=(r,a,p)=>{const{tracksStep:{checks:o},detailsStep:{name:e,description:s,ownerEntityRef:i,supportChannel:n,startDate:t,targetCompletionDate:m},filtersStep:l,milestonesStep:{milestones:d}}=r,c=u({detailsStep:{name:`${e}`,description:`The checks for the ${e} campaign.`,ownerEntityRef:i},levelsStep:{levels:[{name:"Level 1",checks:o,description:""}]},filtersStep:{filter:l}},p??{},a?.track);return{id:a?.id??S(),track:{...c,type:"campaign"},name:e,description:s,ownerEntityRef:i,supportChannel:n,startDate:t,targetCompletionDate:m,milestones:d.map(({id:f,name:g,description:k,passRate:C})=>({id:f,trackId:c.id,name:g,description:k,targetPercent:parseInt(C,10),targetCompletionDate:m}))}};export{R as mapCampaignFormDataToCampaignInput,D as mapCampaignToFormValues};
2
+ //# sourceMappingURL=utils.esm.js.map
@@ -0,0 +1,2 @@
1
+ const e={0:"detailsStep",1:"tracksStep",2:"filtersStep",3:"milestonesStep"};export{e as StepNameMapping};
2
+ //# sourceMappingURL=CampaignFormTypes.esm.js.map
@@ -0,0 +1,2 @@
1
+ import{TrackCheckSchema as o,CampaignDetailsSchema as l}from"@spotify/backstage-plugin-soundcheck-common";import{z as e}from"zod";import{CHECK_IS_REQUIRED_MSG as p,FIELD_IS_REQUIRED_MSG as a}from"../../../utils/validation.esm.js";const r=0,s=100,S=100,i=100,m="Ending date must come after the Starting Date",g=e.strictObject({selectedKinds:e.string().array(),selectedTypes:e.string().array(),selectedLifecycles:e.string().array(),selectedOwners:e.string().array(),selectedSystems:e.string().array(),selectedTags:e.string().array()}),E=e.strictObject({checks:e.array(o.extend({key:e.string().optional()})).min(1,p)}),_=e.strictObject({id:e.number().optional(),name:e.string().min(1,a).max(i,`Input must be less than ${i} characters`),description:e.string().min(1,a),passRate:e.coerce.number().min(r,`Minimum pass rate is ${r}%`).max(s,`Maximum pass rate is ${s}%`)}),D=e.strictObject({milestones:e.array(_).min(1,a)}),n=e.coerce.string().nullable().refine(t=>t!==null,{message:a}),M=e.strictObject({startDate:n,targetCompletionDate:n}),T=({startDate:t,targetCompletionDate:c})=>t&&c?new Date(t)<new Date(c):!0,A=l.merge(M),d=t=>t.refine(T,{message:m,path:["targetCompletionDate"]}),y=e.strictObject({detailsStep:d(A),tracksStep:E,filtersStep:g,milestonesStep:D});export{S as CAMPAIGN_NAME_MAX_LENGTH,m as END_AFTER_START_DATE_MSG,s as MILESTONE_MAX_PASS_RATE,r as MILESTONE_MIN_PASS_RATE,i as MILESTONE_NAME_MAX_LENGTH,n as campaignDateTimeSchema,y as campaignFormSchema};
2
+ //# sourceMappingURL=validation.esm.js.map
@@ -0,0 +1,2 @@
1
+ import m,{useEffect as p}from"react";import"../../contexts/TrackFormContext.esm.js";import"../../contexts/CheckFormContext.esm.js";import{useCampaignFormContext as n}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 s}from"../../hooks/campaigns/useCreateCampaign.esm.js";import"../../hooks/useSoundcheckAlert.esm.js";import"../../hooks/useConfirmationModal.esm.js";import"react-router-dom";import{CampaignForm as c}from"../CampaignForm/CampaignForm.esm.js";import{FullScreenDialog as l}from"../FullScreenDialog/FullScreenDialog.esm.js";const d=()=>{const{hideModal:o,showAddModal:r,setIsLoading:t}=n(),{mutateAsync:i,isLoading:e}=s();return p(()=>{t(e)},[t,e]),m.createElement(l,{title:"Create a Campaign",open:r,handleClose:o},m.createElement(c,{onSave:async a=>{await i(a,{onSuccess:()=>o()})},onCancel:o}))};export{d as AddCampaignView};
2
+ //# sourceMappingURL=AddCampaignView.esm.js.map
@@ -0,0 +1,2 @@
1
+ import{usePermission as r}from"@backstage/plugin-permission-react";import{Button as m}from"@material-ui/core";import{soundcheckCampaignCreatePermission as n}from"@spotify/backstage-plugin-soundcheck-common";import a from"react";import"../../contexts/TrackFormContext.esm.js";import"../../contexts/CheckFormContext.esm.js";import{useCampaignFormContext as p}from"../../contexts/CampaignFormContext.esm.js";import"../../contexts/UserProvider.esm.js";import s from"../../images/no-results.svg";import{EmptyState as c}from"../EmptyState/EmptyState.esm.js";var o=(t=>(t.title="Create a campaign",t.description="A soundcheck campaign allows you to define a tech health goal, assign it to a team and monitor progress.",t.callToAction="Get started",t))(o||{});const l=()=>{const{setShowAddModal:t}=p(),{loading:e,allowed:i}=r({permission:n});return a.createElement(c,{title:"Create a campaign",description:"A soundcheck campaign allows you to define a tech health goal, assign it to a team and monitor progress.",imgSrc:s,action:!e&&a.createElement(m,{disabled:!i,variant:"contained",color:"primary",onClick:()=>t(!0)},"Get started")})};export{o as CampaignEmptyState,l as EmptyCampaignState};
2
+ //# sourceMappingURL=CampaignEmptyState.esm.js.map
@@ -0,0 +1,2 @@
1
+ import{useApi as W,featureFlagsApiRef as j}from"@backstage/core-plugin-api";import{usePermission as U}from"@backstage/plugin-permission-react";import{makeStyles as q,Grid as i,Button as z}from"@material-ui/core";import{soundcheckCampaignCreatePermission as J}from"@spotify/backstage-plugin-soundcheck-common";import e,{useState as n,useEffect as K}from"react";import Q from"react-use/lib/useDebounce";import"../../../contexts/TrackFormContext.esm.js";import"../../../contexts/CheckFormContext.esm.js";import{useCampaignFormContext as V}from"../../../contexts/CampaignFormContext.esm.js";import"../../../contexts/UserProvider.esm.js";import{useGetCampaignOwners as X}from"../../../hooks/campaigns/useGetCampaignOwners.esm.js";import{useGetCampaigns as Y}from"../../../hooks/campaigns/useGetCampaigns.esm.js";import{FilterDefault as g}from"../../../utils/filters.esm.js";import{EmptyCampaignState as Z}from"../CampaignEmptyState.esm.js";import{EmptyState as _}from"../../EmptyState/EmptyState.esm.js";import{Pagination as $}from"../../Pagination/Pagination.esm.js";import{SearchFilters as ee}from"../../SearchFilters/SearchFilters.esm.js";import{CampaignsOverviewSkeleton as ae}from"./CampaignsOverviewSkeleton.esm.js";import{CampaignSummaryCard as te}from"./CampaignSummaryCard.esm.js";import re from"./useArchiveConfirmationModal.esm.js";var E=(a=>(a.title="No campaigns found",a.description="No campaigns matched your search. Consider changing search term and filters.",a))(E||{});const ne=q(a=>({headerButtons:{display:"flex",gap:a.spacing(1),flexWrap:"nowrap",justifyContent:"end",alignItems:"end"},header:{padding:a.spacing(0,0,1)},container:{padding:a.spacing(3),gap:a.spacing(3)},createButton:{lineHeight:"1.25rem",paddingTop:a.spacing(1.5),paddingBottom:a.spacing(1.5)}})),ie=({campaignsPerPage:a,currentCursor:v})=>{const s=ne(),[d,y]=n(v),[m,N]=n(""),[S,w]=n(""),[u,x]=n(g.Alpha),[h,b]=n(g.Owner),[f,A]=n(g.Status),{data:B,isLoading:F}=X();Q(()=>{w(m)},500,[m]);const{setShowAddModal:k}=V(),{loading:I,allowed:O}=U({permission:J}),{data:r,isLoading:l}=Y({ids:void 0,first:a,after:d,orderAlphabetical:u,searchByOwner:h,searchByName:S,searchByStatus:f}),[p,L]=n(r),c=p?.edges.map(t=>t.node),[C,G]=n([]),P=W(j),R=!P.getRegisteredFlags().find(t=>t.name==="soundcheck-enable-campaigns")||P.isActive("soundcheck-enable-campaigns"),T=!O||!R,D=t=>{x(t.target.value)},H=t=>{b(t.target.value)},M=t=>{A(t.target.value)};if(K(()=>{r&&L(()=>({totalCount:r.totalCount,edges:r.edges,pageInfo:{startCursor:r.pageInfo.startCursor,endCursor:r.pageInfo.endCursor,hasNextPage:r?.pageInfo.hasNextPage??!1,hasPreviousPage:r?.pageInfo.hasPreviousPage??!1}}))},[r]),!l&&!c)return e.createElement(Z,null);let o;return l?o=e.createElement(ae,null):c?.length?o=c.map(t=>e.createElement(i,{key:t.id,xs:12,sm:12,md:6,lg:4,xl:3,item:!0,role:"listitem","aria-label":"result"},e.createElement(re,null,e.createElement(te,{campaign:t})))):o=e.createElement(i,{xs:12,item:!0,role:"listitem","aria-label":"result"},e.createElement(_,{title:"No campaigns found",description:"No campaigns matched your search. Consider changing search term and filters."})),e.createElement(i,{container:!0,direction:"row",className:s.container},e.createElement(i,{container:!0,className:s.header},e.createElement(ee,{searchPlaceholder:"Search Available Campaigns",isLoading:l||F,searchTerm:m,setSearchTerm:N,filterAlpha:u,handleAlphabeticalFilterChange:D,filterOwner:h,handleOwnerFilterChange:H,filterStatus:f,handleStatusFilterChange:M,owners:B}),e.createElement(i,{item:!0,xs:2,className:s.headerButtons},!I&&e.createElement(z,{disabled:T,variant:"contained",color:"primary",onClick:()=>k(!0),className:s.createButton},"Create Campaign"))),e.createElement(i,{container:!0,spacing:4,role:"list","aria-label":"campaigns"},o),(p?.pageInfo.hasNextPage||C?.length>0)&&e.createElement(i,{item:!0,xs:12},e.createElement($,{response:p,listingsPerPage:a,cursor:d,setCursor:y,prevCursors:C,setPrevCursors:G,labelPerPageDropdown:"Campaigns Per Page:",urlRoute:"campaigns?campaignsPerPage="})))};export{ie as CampaignListPage,E as CampaignNoResults};
2
+ //# sourceMappingURL=CampaignListPage.esm.js.map
@@ -1,2 +1,2 @@
1
- import e from"react";import{useSearchParams as t}from"react-router-dom";import"../../contexts/TrackFormContext.esm.js";import"../../contexts/CheckFormContext.esm.js";import{CampaignFormProvider as i}from"../../contexts/CampaignFormContext.esm.js";import"../../contexts/UserProvider.esm.js";import{RESULTS_PER_PAGE as o}from"../../utils/filters.esm.js";import{CampaignListPage as p}from"../CampaignsTab/CampaignListPage/CampaignListPage.esm.js";import"../CampaignsTab/MutateCampaignsViews/CampaignForm.esm.js";import{AddCampaignView as n}from"../CampaignsTab/MutateCampaignsViews/AddCampaignView.esm.js";const g=()=>{const[m]=t(),r=m.get("campaignsPerPage"),a=r?parseInt(r,10):o;return e.createElement(i,null,e.createElement("div",null,e.createElement(p,{campaignsPerPage:a}),e.createElement(n,null)))};export{g as CampaignsPage};
1
+ import e from"react";import{useSearchParams as t}from"react-router-dom";import"../../contexts/TrackFormContext.esm.js";import"../../contexts/CheckFormContext.esm.js";import{CampaignFormProvider as i}from"../../contexts/CampaignFormContext.esm.js";import"../../contexts/UserProvider.esm.js";import{RESULTS_PER_PAGE as o}from"../../utils/filters.esm.js";import{AddCampaignView as p}from"./AddCampaignView.esm.js";import{CampaignListPage as n}from"./CampaignListPage/CampaignListPage.esm.js";import"./CampaignListPage/CampaignTypes.esm.js";const g=()=>{const[m]=t(),r=m.get("campaignsPerPage"),a=r?parseInt(r,10):o;return e.createElement(i,null,e.createElement("div",null,e.createElement(n,{campaignsPerPage:a}),e.createElement(p,null)))};export{g as CampaignsPage};
2
2
  //# sourceMappingURL=CampaignsPage.esm.js.map
@@ -0,0 +1,2 @@
1
+ import{useRouteRef as l}from"@backstage/core-plugin-api";import e,{useEffect as u}from"react";import{useNavigate as d,useParams as C}from"react-router-dom";import"../../contexts/TrackFormContext.esm.js";import"../../contexts/CheckFormContext.esm.js";import{useCampaignFormContext as E}from"../../contexts/CampaignFormContext.esm.js";import"../../contexts/UserProvider.esm.js";import"@backstage/catalog-model";import"@tanstack/react-query";import"../../api.esm.js";import"../../hooks/graphqlKeys.esm.js";import"@backstage/plugin-catalog-react";import"../../hooks/useSoundcheckAlert.esm.js";import{useUpdateCampaign as L}from"../../hooks/campaigns/useUpdateCampaign.esm.js";import"../../hooks/useConfirmationModal.esm.js";import{useGetCampaign as R}from"../../hooks/campaigns/useGetCampaign.esm.js";import{campaignsPageRouteRef as S}from"../../routes.esm.js";import{CampaignForm as y}from"../CampaignForm/CampaignForm.esm.js";import{FullScreenDialog as F}from"../FullScreenDialog/FullScreenDialog.esm.js";import{Loading as v}from"../TechHealth/Loading/Loading.esm.js";import{EmptyCampaignState as w}from"./CampaignEmptyState.esm.js";const x=()=>{const t=d(),o=l(S),{campaignId:p}=C(),{setIsLoading:m}=E(),{mutateAsync:s,isLoading:a}=L(),{data:g,isLoading:r}=R(p??""),i=g?.edges?.[0]?.node;if(u(()=>m(a),[m,a]),!r&&!i)return e.createElement(w,null);const c=async f=>{await s(f,{onSuccess:()=>t(o())})},n=()=>t(o());return e.createElement(F,{title:"Update Campaign",open:!0,handleClose:n},r?e.createElement(v,null):e.createElement(y,{onSave:c,onCancel:n,selectedCampaign:i}))};export{x as EditCampaignView};
2
+ //# sourceMappingURL=EditCampaignView.esm.js.map
@@ -1,2 +1,2 @@
1
- import{stringifyEntityRef as d}from"@backstage/catalog-model";import{useEntity as f}from"@backstage/plugin-catalog-react";import{makeStyles as E,Typography as g,Tooltip as y,IconButton as k,CircularProgress as C}from"@material-ui/core";import v from"@material-ui/icons/Refresh";import b from"classnames";import e from"react";import{Link as I}from"react-router-dom";import{useExecuteCheck as N}from"../../hooks/checks/useExecuteCheck.esm.js";import{CheckIcon as R}from"../CheckIcon/CheckIcon.esm.js";import{RelativeTime as T}from"../RelativeTime/RelativeTime.esm.js";const m=E(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}}})),x=({className:t,href:r,name:o,children:a})=>r?e.createElement(I,{"aria-label":`select check ${o}`,to:r,className:t},a):e.createElement("div",{className:t},a),z=({result:t,name:r,id:o,timestamp:a,hasChecker:l=!1,selected:n=!1,href:s})=>{const p=m(),u=b(p.root,{selected:n}),{entity:c}=f(),{mutateAsync:h,isLoading:i}=N();return e.createElement(x,{href:s,className:u,name:r},e.createElement(R,{result:t}),e.createElement(g,{variant:"body2"},r),a&&!i?e.createElement(T,{timestamp:a}):null,!i&&e.createElement(y,{title:"Execute Check"},e.createElement(k,{size:"small",color:"inherit",onClick:async()=>{!c||!o||await h({checkerId:o,entityRef:d(c),shouldRefreshFacts:!0}).catch(S=>{})},disabled:!c||!o||!l},e.createElement(v,{fontSize:"small"}))),i&&e.createElement(C,{color:"inherit",size:"1em"}))};export{z as Check,m as useStyles};
1
+ import{stringifyEntityRef as E}from"@backstage/catalog-model";import{useEntity as g}from"@backstage/plugin-catalog-react";import{makeStyles as y,Typography as k,Tooltip as C,IconButton as v,CircularProgress as b}from"@material-ui/core";import N from"@material-ui/icons/Refresh";import x from"classnames";import e from"react";import{Link as I}from"react-router-dom";import{useExecuteCheck as R}from"../../hooks/checks/useExecuteCheck.esm.js";import{CheckIcon as T}from"../CheckIcon/CheckIcon.esm.js";import{RelativeTime as z}from"../RelativeTime/RelativeTime.esm.js";const n=y(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}}})),L=({className:t,href:r,name:a,children:o})=>r?e.createElement(I,{"aria-label":`select check ${a}`,to:r,className:t},o):e.createElement("div",{className:t},o),S=({result:t,name:r,id:a,timestamp:o,hasChecker:m=!1,selected:s=!1,href:p})=>{const u=n(),h=x(u.root,{selected:s}),{entity:i}=g(),{mutateAsync:d,isLoading:c}=R(),f=async()=>{!i||!a||await d({checkerId:a,entityRef:E(i),shouldRefreshFacts:!0}).catch(w=>{})},l=!i||!a||!m;return e.createElement(L,{href:p,className:h,name:r},e.createElement(T,{result:t}),e.createElement(k,{variant:"body2"},r),o&&!c?e.createElement(z,{timestamp:o}):null,!c&&e.createElement(C,{title:"Execute Check",disableHoverListener:l},e.createElement("span",null,e.createElement(v,{size:"small",color:"inherit",onClick:f,disabled:l},e.createElement(N,{fontSize:"small"})))),c&&e.createElement(b,{color:"inherit",size:"1em"}))};export{S as Check,n as useStyles};
2
2
  //# sourceMappingURL=Check.esm.js.map
@@ -0,0 +1,2 @@
1
+ import e from"react";import{FormProvider as h}from"react-hook-form";import"../../contexts/TrackFormContext.esm.js";import{useCheckFormContext as f}from"../../contexts/CheckFormContext.esm.js";import"../../contexts/CampaignFormContext.esm.js";import"../../contexts/UserProvider.esm.js";import{FormFilterSection as S}from"../FormFilterSection/FormFilterSection.esm.js";import{FormStepper as u}from"../FormStepper/FormStepper.esm.js";import{FullScreenDialog as C}from"../FullScreenDialog/FullScreenDialog.esm.js";import{CheckFormDescription as b}from"./CheckFormDescription.esm.js";import"./FormFields/CheckNameInput/CheckNameInput.esm.js";import"./FormFields/PassFailMessageInput/PassFailMessageInput.esm.js";import"../FormMarkdownInput/FormMarkdownInput.esm.js";import{CHECK_FIELDS as E}from"./utils/checkFormUtils.esm.js";import"./FormFields/TeamDetailsInput/TeamDetailsInput.esm.js";import"./FormFields/RuleInput/AddMenuButton.esm.js";import"./FormFields/RuleInput/RuleInputBox.esm.js";import"./FormFields/RuleInput/Expressions/ExpressionBox.esm.js";import"./FormFields/RuleInput/Expressions/ExpressionTypeToggle.esm.js";import"@material-ui/core";import"@material-ui/icons/Delete";import"@backstage/core-plugin-api";import"@tanstack/react-query";import"../../api.esm.js";import"./FormFields/RuleInput/Conditions/ControlledAutocomplete.esm.js";import"./FormFields/RuleInput/Conditions/styles.esm.js";import"@spotify/backstage-plugin-soundcheck-common";import"../../hooks/graphqlKeys.esm.js";import"./FormFields/RuleInput/Conditions/ConditionList.esm.js";import{ScheduleSection as k}from"./FormFields/CheckScheduleSection/ScheduleSection.esm.js";import{CheckDetailsStep as F}from"./Steps/CheckDetailsStep.esm.js";import{CheckRulesStep as g}from"./Steps/CheckRulesStep.esm.js";import"./types/ExpressionType.esm.js";import{CheckStepNameMapping as v}from"./types/CheckFormTypes.esm.js";import"../Frequency/types.esm.js";import"../Frequency/util.esm.js";import"../Frequency/FrequencyComponent.esm.js";import"./types/Path.esm.js";import{useCheckForm as y}from"./useCheckForm.esm.js";const D=({title:l,open:p,onSave:a,onClose:o})=>{const{hideModal:i,isLoading:c,isReadOnly:r,selectedItem:s}=f(),{formMethods:t,onSubmit:m}=y(a),n=[{label:"Enter check details",content:()=>e.createElement(F,null)},{label:"Add rules",content:()=>e.createElement(g,null)},{label:"Choose the affected entities (Optional)",content:()=>e.createElement(S,{name:"filtersStep.filter",control:t.control,disabled:r,description:E.filter.description})},{label:"Set the check schedule (Optional)",content:()=>e.createElement(k,{control:t.control,disabled:r})}],d=s?[...Array(n.length).keys()]:[0];return e.createElement(C,{handleClose:o?()=>o():i,title:l,open:p},e.createElement(h,{...t},e.createElement("form",{onSubmit:t.handleSubmit(m)},e.createElement(u,{onClose:o?()=>o():i,handleSubmit:t.handleSubmit,trigger:t.trigger,onSubmit:m,initialVisited:d,stepNameMap:v,steps:n,isLoading:c,isReadOnly:r,saveButtonText:"Save Check",detailsComponent:e.createElement(b,null)}))))};export{D as CheckForm};
2
+ //# sourceMappingURL=CheckForm.esm.js.map
@@ -0,0 +1,2 @@
1
+ import{Typography as t,Link as a}from"@material-ui/core";import e from"react";const n=()=>e.createElement("div",{style:{display:"flex",gap:"10px",flexDirection:"column"}},e.createElement(t,{variant:"h6"},"Creating and managing checks"),e.createElement(t,{variant:"body1"},"Checks are entities created from four components: facts, paths, operators and values. These components are then organized via a boolean calculator in the UI."),e.createElement(t,{variant:"body1"},"To create a check, select the components that you want to use, organize them into rules and give your check a meaningful name and a description."),e.createElement(t,{variant:"body1"},"Once created, you will be able to manage and edit your track on its detail page. See our"," ",e.createElement(a,{target:"_blank",href:"https://backstage.spotify.com/docs/plugins/soundcheck/core-concepts/checks#check-fields"},"check documentation")," ","for more details."));export{n as CheckFormDescription};
2
+ //# sourceMappingURL=CheckFormDescription.esm.js.map
@@ -0,0 +1,2 @@
1
+ import n from"react";import{FormMarkdownInput as d}from"../../../FormMarkdownInput/FormMarkdownInput.esm.js";import{CHECK_FIELDS as p}from"../../utils/checkFormUtils.esm.js";const c=({control:r,isLoading:t,disabled:o,error:i})=>{const{description:e}=p.details;return n.createElement(d,{name:"detailsStep.description",control:r,error:i,label:e.name,description:e.description,placeholder:o?void 0:e.placeholder,disabled:o||t})};export{c as CheckDescriptionInput};
2
+ //# sourceMappingURL=CheckDescriptionInput.esm.js.map
@@ -0,0 +1,2 @@
1
+ import{makeStyles as s,Typography as p,Grid as n,FormControlLabel as h,Checkbox as u}from"@material-ui/core";import e from"react";import{useWatch as E,Controller as l}from"react-hook-form";import"../../../Frequency/types.esm.js";import"../../../Frequency/util.esm.js";import{FrequencyComponent as b}from"../../../Frequency/FrequencyComponent.esm.js";import{CHECK_FIELDS as f}from"../../utils/checkFormUtils.esm.js";const C=s(t=>({container:{display:"flex",flexDirection:"column",gap:t.spacing(1)}})),y=({control:t,disabled:o})=>{const c=C(),a=E({control:t,name:"scheduleStep.schedule"}),{description:m,checkboxLabel:i}=f.schedule;return e.createElement("div",{className:c.container},e.createElement(p,{variant:"body2"},m),e.createElement(n,{item:!0,xs:12},e.createElement(n,{item:!0},e.createElement(l,{name:"scheduleStep.schedule.enabled",control:t,render:({field:r})=>e.createElement(h,{disabled:o,control:e.createElement(u,{checked:r.value,onChange:r.onChange}),label:i})})),e.createElement(n,{item:!0},e.createElement(l,{name:"scheduleStep.schedule.frequency",control:t,render:({field:r,fieldState:d})=>e.createElement(b,{disabled:o||!a.enabled,value:r.value,onChange:r.onChange,errors:d.error})}))))};export{y as ScheduleSection};
2
+ //# sourceMappingURL=ScheduleSection.esm.js.map
@@ -0,0 +1,2 @@
1
+ import{Typography as s,Tabs as v,Tab as o}from"@material-ui/core";import{makeStyles as h}from"@material-ui/core/styles";import e,{useState as M}from"react";import{FormMarkdownInput as i}from"../../../FormMarkdownInput/FormMarkdownInput.esm.js";import{CHECK_FIELDS as S}from"../../utils/checkFormUtils.esm.js";const C=h(a=>({container:{display:"flex",flexDirection:"column",gap:a.spacing(1)},tabContent:{padding:a.spacing(1)}})),T=({control:a,isLoading:l,disabled:n})=>{const r=C(),[t,c]=M(0),{name:m,description:p,passMessagePlaceholder:d,failMessagePlaceholder:b,passedTabName:g,failedTabName:u}=S.rulesStep.messages,E=(y,f)=>{c(f)};return e.createElement("div",{className:r.container},e.createElement("div",null,e.createElement(s,{variant:"subtitle2"},m),e.createElement(s,{variant:"caption"},p)),e.createElement(v,{orientation:"horizontal",variant:"scrollable",value:t,onChange:E},e.createElement(o,{label:g}),e.createElement(o,{label:u})),e.createElement("div",{className:r.tabContent},t===0&&e.createElement(i,{name:"rulesStep.passedMessage",control:a,placeholder:d,disabled:l||n}),t===1&&e.createElement(i,{name:"rulesStep.failedMessage",control:a,placeholder:b,disabled:l||n})))};export{T as PassFailMessageInput};
2
+ //# sourceMappingURL=PassFailMessageInput.esm.js.map
@@ -0,0 +1,2 @@
1
+ import{Box as r,TextField as F,IconButton as V}from"@material-ui/core";import B from"@material-ui/icons/Delete";import t,{useMemo as d}from"react";import{useFormContext as L,Controller as T}from"react-hook-form";import{useOperators as I}from"../../../../../hooks/operators/useOperators.esm.js";import{ControlledAutocomplete as f}from"./ControlledAutocomplete.esm.js";import{useRuleConditionStyles as S}from"./styles.esm.js";import{useRuleOptions as D}from"./useRuleOptions.esm.js";const M=({name:n,handleDelete:h,disabled:m,disableDelete:v})=>{const o=S(),{control:i,getValues:$,setValue:u}=L(),{data:E,isLoading:g}=I(),c=d(()=>E?.map(e=>({value:e.name,label:e.title}))??[],[E]),O=d(()=>c.map(e=>e.value),[c]),{pathOptions:C,factRefOptions:p,isLoading:b}=D(n,i),N=d(()=>p?.map(e=>e.value)??[],[p]),x=$("rulesStep.expressions.conditions")?.map(({factRef:e})=>e),R=e=>{e&&!x?.includes(e)&&(u(`${n}.path`,""),u(`${n}.operator`,""),u(`${n}.value`,""))};return t.createElement(r,{className:o.container},t.createElement(r,{className:o.connector}),t.createElement(r,{className:o.innerContainer},t.createElement(r,{className:o.inputsContainer},p&&t.createElement(r,null,t.createElement(f,{name:`${n}.factRef`,control:i,placeholder:"Fact",options:N,getOptionLabel:e=>p?.find(l=>e===l.value)?.label??e,getOptionValue:e=>p?.find(l=>e===l.label)?.value??e??"",disabled:m||b,onChange:R})),t.createElement(r,null,t.createElement(f,{name:`${n}.path`,placeholder:"Path",control:i,disabled:m||b,options:C})),c&&t.createElement(r,null,t.createElement(f,{name:`${n}.operator`,control:i,placeholder:"Operator",options:O,disabled:g||m,getOptionLabel:e=>{const l=a=>c?.find(s=>a===s.value)?.label??a??"";if(e?.match(/.:./)){const a=e.split(":"),s=l(a[1]);return`${a[0]}:${s}`}return l(e)},getOptionValue:e=>{const l=a=>c?.find(s=>a===s.label)?.value??a??"";if(e?.match(/.:./)){const a=e.split(":"),s=l(a[1]);return`${a[0]}:${s}`}return l(e)}})),t.createElement(r,null,t.createElement(T,{name:`${n}.value`,control:i,defaultValue:"",render:({field:e,fieldState:l})=>t.createElement(F,{...e,variant:"outlined",placeholder:"Enter a value",FormHelperTextProps:{className:o.helperText},error:l.invalid,helperText:l.error?l.error.message:null,margin:"dense",disabled:m,className:o.noMargin})})))),!m&&!v&&t.createElement(V,{onClick:h,className:o.deleteButton,"data-test-id":`${n}-delete-button`},t.createElement(B,{className:o.deleteIcon})))};export{M as RuleConditionInput};
2
+ //# sourceMappingURL=RuleConditionInput.esm.js.map
@@ -0,0 +1,2 @@
1
+ import{parseFactRef as f,stringifyFactRef as S}from"@spotify/backstage-plugin-soundcheck-common";import{useState as R,useEffect as g,useMemo as c}from"react";import{useWatch as F}from"react-hook-form";import{useGetCollectors as O}from"../../../../../hooks/collectors/useGetCollectors.esm.js";import{useGetFactSchema as $}from"../../../../../hooks/collectors/useGetFactSchema.esm.js";import{generateJsonPaths as y}from"../../../utils/checkFormUtils.esm.js";const G=(e,m)=>{const{data:r,isLoading:i}=O(),t=F({control:m,name:`${e}.factRef`}),[n,l]=R(()=>s(t));g(()=>{l(s(t))},[t]);const{data:a}=$(n?.source,n?.name),p=c(()=>a?y(a.schema):[],[a]),d=c(()=>r?.flatMap(u=>u.factNames.map(h=>{const o=f(h,{defaultSource:u.id,defaultScope:"default"});return{label:`${o.source} - ${o.name}`,value:S(o)}})),[r]);return{isLoading:i,pathOptions:p,factRefOptions:d}};function s(e){if(e)try{return f(e,{defaultSource:"unknown",defaultScope:"default"})}catch{return null}return null}export{G as useRuleOptions};
2
+ //# sourceMappingURL=useRuleOptions.esm.js.map
@@ -0,0 +1,2 @@
1
+ import{makeStyles as b,ButtonGroup as f,Button as g}from"@material-ui/core";import n,{useState as E}from"react";import{useFormContext as k,Controller as y}from"react-hook-form";import{ExpressionType as l,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.default},selectedButton:{backgroundColor:e.palette.action.hover}})),B=({name:e,disabled:a})=>{const o=x(),{control:m,getValues:p}=k(),s=`${e}`,c=p(s),[i,u]=E(c||l.AllOf),d=r=>{u(r)};return n.createElement(y,{control:m,name:e,render:({field:{onChange:r}})=>n.createElement(f,{color:"primary"},Object.values(l).map(t=>n.createElement(g,{key:t,className:i===t?`${o.selectedButton} ${o.button}`:`${o.button}`,onClick:()=>{d(t),r(t)},disabled:a},C[t])))})};export{B as ExpressionTypeToggle};
2
+ //# sourceMappingURL=ExpressionTypeToggle.esm.js.map
@@ -0,0 +1,2 @@
1
+ import{Box as p,Grid as r}from"@material-ui/core";import{makeStyles as b}from"@material-ui/core/styles";import t from"react";import{useFormContext as B}from"react-hook-form";import{AddMenuButton as N}from"./AddMenuButton.esm.js";import"@material-ui/icons/Delete";import"@backstage/core-plugin-api";import"@tanstack/react-query";import"../../../../api.esm.js";import"./Conditions/ControlledAutocomplete.esm.js";import"./Conditions/styles.esm.js";import"@spotify/backstage-plugin-soundcheck-common";import"../../../../hooks/graphqlKeys.esm.js";import"../../utils/checkFormUtils.esm.js";import{ConditionList as y}from"./Conditions/ConditionList.esm.js";import{ExpressionBox as A}from"./Expressions/ExpressionBox.esm.js";import{ExpressionTypeToggle as C}from"./Expressions/ExpressionTypeToggle.esm.js";import{useRuleInputHandlers as P}from"./useRuleInputHandlers.esm.js";const $=b(e=>({root:{padding:0},inner:{marginLeft:e.spacing(2),paddingBottom:e.spacing(2),borderLeft:`1px solid ${e.palette.border}`,display:"flex",flexDirection:"row",gap:0},connector:{borderBottom:`1px solid ${e.palette.border}`,padding:e.spacing(0),width:"15px",height:"20px"},noPadding:{padding:0}})),k=({name:e,depth:o,disabled:i})=>{const n=$(),{getValues:a,setValue:l,trigger:c}=B(),{handleAddCondition:g,handleAddExpression:x,handleDeleteCondition:f}=P(e,a,l,c),u=`${e}`,m=a(u),E=m?.conditions||[],h=m?.expressions;return t.createElement(p,{className:o>0?n.inner:n.root},o>0&&t.createElement(p,{className:n.connector}),t.createElement(r,{container:!0,spacing:0,direction:"column",className:n.noPadding},t.createElement(r,{item:!0,className:n.noPadding},t.createElement(C,{disabled:i,name:`${e}.expressionType`})),t.createElement(r,{item:!0,container:!0,spacing:0,direction:"column",className:n.noPadding},t.createElement(y,{depth:o,handleDelete:d=>f(d,e),disabled:i,conditions:E,name:e}),h?.map((d,s)=>t.createElement(A,{key:s,expression:d,name:`${e}.expressions[${s}]`,depth:o,disabled:i}))),!i&&t.createElement(r,{item:!0,className:n.noPadding},t.createElement(N,{onAddCondition:g,onAddExpression:x}))))};export{k as RuleInputBox};
2
+ //# sourceMappingURL=RuleInputBox.esm.js.map
@@ -0,0 +1,2 @@
1
+ import{ExpressionType as l}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=(a,e,i,t)=>({handleAddCondition:async()=>{const n=`${a}`,o=[...e(n)?.conditions||[],{factRef:"",path:"",operator:"",value:""}],s=`${a}.conditions`;i(s,o),await t(s)},handleAddExpression:async()=>{const n=`${a}.expressions`,o=e(n)||[];o.push({expressionType:l.AllOf,expressions:void 0,conditions:[{factRef:"",path:"",operator:"",value:""}]}),i(n,o),await t(n)},handleDeleteCondition:async(n,o)=>{const s=o.match(/(.*\.expressions)(?=\[\d+])/)?.[0]||o,p=`${o}.conditions`,r=e(p);if(r.splice(n,1),r.length===0){i(p,void 0);const c=parseInt(o.slice(o.lastIndexOf("[")+1,o.lastIndexOf("]")),10),d=e(s);d[c]?.expressions?.splice(c,1),i(s,d[c]?.expressions?d:void 0),await t(s)}else i(p,r),await t(p)}});export{x as useRuleInputHandlers};
2
+ //# sourceMappingURL=useRuleInputHandlers.esm.js.map
@@ -0,0 +1,2 @@
1
+ import{Typography as r}from"@material-ui/core";import{makeStyles as f}from"@material-ui/core/styles";import{uniqBy as u}from"lodash";import e from"react";import{FormControlledSelect as E}from"../../../FormControlledSelect/FormControlledSelect.esm.js";import{useOptions as v}from"../../../GroupSelector/useOptions.esm.js";import{CHECK_FIELDS as y}from"../../utils/checkFormUtils.esm.js";const b=f(t=>({container:{display:"flex",flexDirection:"column",gap:t.spacing(1)}})),g=({control:t,disabled:a,error:n})=>{const l=b(),{options:i,isLoading:m}=v(),p=u(i.map(o=>({value:o.ref,label:o.name})),"value"),{owner:{name:s,description:c,selectLabel:d}}=y.details;return e.createElement("div",{className:l.container},e.createElement("div",null,e.createElement(r,{variant:"subtitle2"},s),e.createElement(r,{variant:"caption"},c)),e.createElement("div",null,e.createElement(E,{name:"detailsStep.ownerEntityRef",control:t,options:p,placeholder:d,disabled:a||m,helperText:n?.message??void 0})))};export{g as TeamDetailsInput};
2
+ //# sourceMappingURL=TeamDetailsInput.esm.js.map
@@ -0,0 +1,2 @@
1
+ import{makeStyles as p}from"@material-ui/core/styles";import t from"react";import{useFormContext as n}from"react-hook-form";import"../../../contexts/TrackFormContext.esm.js";import{useCheckFormContext as a}from"../../../contexts/CheckFormContext.esm.js";import"../../../contexts/CampaignFormContext.esm.js";import"../../../contexts/UserProvider.esm.js";import{CheckNameInput as s}from"../FormFields/CheckNameInput/CheckNameInput.esm.js";import"../FormFields/PassFailMessageInput/PassFailMessageInput.esm.js";import{CheckDescriptionInput as c}from"../FormFields/CheckDescriptionInput/CheckDescriptionInput.esm.js";import{TeamDetailsInput as l}from"../FormFields/TeamDetailsInput/TeamDetailsInput.esm.js";import"../FormFields/RuleInput/AddMenuButton.esm.js";import"../FormFields/RuleInput/RuleInputBox.esm.js";import"../FormFields/RuleInput/Expressions/ExpressionBox.esm.js";import"../FormFields/RuleInput/Expressions/ExpressionTypeToggle.esm.js";import"@material-ui/core";import"@material-ui/icons/Delete";import"@backstage/core-plugin-api";import"@tanstack/react-query";import"../../../api.esm.js";import"../FormFields/RuleInput/Conditions/ControlledAutocomplete.esm.js";import"../FormFields/RuleInput/Conditions/styles.esm.js";import"@spotify/backstage-plugin-soundcheck-common";import"../../../hooks/graphqlKeys.esm.js";import"../utils/checkFormUtils.esm.js";import"../FormFields/RuleInput/Conditions/ConditionList.esm.js";import"../FormFields/CheckScheduleSection/ScheduleSection.esm.js";const d=p(r=>({container:{display:"flex",flexDirection:"column",gap:r.spacing(1)}})),f=()=>{const r=d(),{isLoading:m,isReadOnly:o}=a(),{control:e,formState:{errors:i}}=n();return t.createElement("div",{className:r.container},t.createElement(s,{control:e,error:i?.detailsStep?.name,isLoading:m,disabled:o}),t.createElement(c,{control:e,error:i?.detailsStep?.description,isLoading:m,disabled:o}),t.createElement(l,{control:e,disabled:o,error:i?.detailsStep?.ownerEntityRef}))};export{f as CheckDetailsStep};
2
+ //# sourceMappingURL=CheckDetailsStep.esm.js.map
@@ -0,0 +1,2 @@
1
+ import{Typography as r,FormControlLabel as p,Checkbox as c}from"@material-ui/core";import{makeStyles as s}from"@material-ui/core/styles";import e from"react";import{useFormContext as d,Controller as u}from"react-hook-form";import"../../../contexts/TrackFormContext.esm.js";import{useCheckFormContext as E}from"../../../contexts/CheckFormContext.esm.js";import"../../../contexts/CampaignFormContext.esm.js";import"../../../contexts/UserProvider.esm.js";import"../FormFields/CheckNameInput/CheckNameInput.esm.js";import{PassFailMessageInput as C}from"../FormFields/PassFailMessageInput/PassFailMessageInput.esm.js";import"../../FormMarkdownInput/FormMarkdownInput.esm.js";import{CHECK_FIELDS as f}from"../utils/checkFormUtils.esm.js";import"../FormFields/TeamDetailsInput/TeamDetailsInput.esm.js";import"../FormFields/RuleInput/AddMenuButton.esm.js";import{RuleInputBox as v}from"../FormFields/RuleInput/RuleInputBox.esm.js";import"../FormFields/RuleInput/Expressions/ExpressionBox.esm.js";import"../FormFields/RuleInput/Expressions/ExpressionTypeToggle.esm.js";import"@material-ui/icons/Delete";import"@backstage/core-plugin-api";import"@tanstack/react-query";import"../../../api.esm.js";import"../FormFields/RuleInput/Conditions/ControlledAutocomplete.esm.js";import"../FormFields/RuleInput/Conditions/styles.esm.js";import"@spotify/backstage-plugin-soundcheck-common";import"../../../hooks/graphqlKeys.esm.js";import"../FormFields/RuleInput/Conditions/ConditionList.esm.js";import"../FormFields/CheckScheduleSection/ScheduleSection.esm.js";const g=s(t=>({container:{display:"flex",flexDirection:"column",gap:t.spacing(2)},innerContainer:{display:"flex",flexDirection:"column"}})),x=()=>{const t=g(),{isLoading:l,isReadOnly:n}=E(),{control:i}=d(),{rules:a,warnings:o}=f.rulesStep;return e.createElement("div",{className:t.container},e.createElement("div",{className:t.innerContainer},e.createElement("div",null,e.createElement(r,{variant:"subtitle2"},a.name),e.createElement(r,{variant:"caption"},a.description)),e.createElement(v,{disabled:n,name:"rulesStep.expressions",depth:0})),e.createElement(C,{control:i,isLoading:l,disabled:n}),e.createElement("div",{className:t.container},e.createElement("div",{className:t.innerContainer},e.createElement("div",null,e.createElement(r,{variant:"subtitle2"},o.name),e.createElement(r,{variant:"caption"},o.description)),e.createElement(u,{name:"rulesStep.warning",control:i,render:({field:m})=>e.createElement(p,{disabled:n,control:e.createElement(c,{checked:m.value,onChange:m.onChange}),label:o.label})}))))};export{x as CheckRulesStep};
2
+ //# sourceMappingURL=CheckRulesStep.esm.js.map
@@ -0,0 +1,2 @@
1
+ const e={0:"detailsStep",1:"rulesStep",2:"filtersStep",3:"scheduleStep"};export{e as CheckStepNameMapping};
2
+ //# sourceMappingURL=CheckFormTypes.esm.js.map
@@ -0,0 +1,2 @@
1
+ import"../../Frequency/types.esm.js";import{defaultFrequency as e}from"../../Frequency/util.esm.js";import"../../Frequency/FrequencyComponent.esm.js";const r=()=>({enabled:!1,frequency:e()});export{r as defaultSchedule};
2
+ //# sourceMappingURL=Schedule.esm.js.map
@@ -0,0 +1,2 @@
1
+ import{zodResolver as s}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"../../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 n}from"../../hooks/useConfirmationModal.esm.js";import"react-router-dom";import{mapCheckerToFormValues as u,mapToCheckerInput as h,DEFAULT_FORM_VALUES as l}from"./utils/checkFormUtils.esm.js";import{checkFormSchema as f}from"./utils/validation.esm.js";const d=t=>{const{selectedItem:o}=c();let e=l;o&&(e=u(o));const m=a({defaultValues:e,mode:"onChange",resolver:s(f)}),{showModal:i}=n();return{formMethods:m,onSubmit:async r=>{if(!await i({title:"Save Check",message:`Are you sure you want to save check: ${r.detailsStep.name}?`,error:!1}))return;const p=h(r,o);t(p)}}};export{d as useCheckForm};
2
+ //# sourceMappingURL=useCheckForm.esm.js.map
@@ -0,0 +1,2 @@
1
+ import{FrequencySchema as g}from"@spotify/backstage-plugin-soundcheck-common";import{isObject as w}from"lodash";import{v4 as k}from"uuid";import{mapInputFilterToFormFilters as v,mapFiltersToInputFilter as x,mapFiltersToCatalogFilter as E}from"../../Filter/utils.esm.js";import"../../Filter/FilterComponent.esm.js";import{emptyFilters as b}from"../../Filter/types.esm.js";import{TimeUnit as d}from"../../Frequency/types.esm.js";import{isTimeUnit as T}from"../../Frequency/util.esm.js";import"../../Frequency/FrequencyComponent.esm.js";import{ExpressionType as c}from"../types/ExpressionType.esm.js";import{defaultSchedule as S}from"../types/Schedule.esm.js";import"../types/Path.esm.js";import{CHECK_NAME_MAX_LENGTH as C}from"./validation.esm.js";const h=e=>{if(w(e)&&"frequency"in e){const s=g.safeParse(e.frequency);if(s.success){const t=s.data;if("cron"in t)return{enabled:!0,frequency:{type:"cron",unit:d.Hours,value:1,cron:t.cron}};const r=Object.keys(t);if(r.length){const n=r[0];if(T(n))return{enabled:!0,frequency:{type:"HumanDuration",unit:n,value:t[n]??1,cron:""}}}}}return{enabled:!1,frequency:{type:"HumanDuration",unit:d.Hours,value:1,cron:""}}},m=(e,s)=>{const{enabled:t,frequency:r}=e;if(t){const{cron:n,type:i,unit:a,value:o}=r;return i==="HumanDuration"?{frequency:{[a]:o},filter:E(s)}:{frequency:{cron:n}}}},y=e=>{if(typeof e=="string"){if(e==="true")return!0;if(e==="false")return!1;const s=Number(e);if(!isNaN(s))return s}return e},p=e=>{if(!e)return{};if(e.expressionType){const s={[e.expressionType]:e.conditions?.map(t=>({factRef:t.factRef,path:t.path,operator:t.operator,value:y(t.value)}))};return e.expressions&&e.expressions.forEach(t=>{s[e.expressionType]?.push(p(t))}),s}if(e.expressions)return e.expressions.map(p);if(e.conditions&&e.conditions.length===1){const s=e.conditions[0];return{factRef:s.factRef,path:s.path,operator:s.operator,value:y(s.value)}}return{}},l=(e,s=!0)=>{if(!e)return{conditions:[]};const t=Object.keys(e),r=t.includes("all")||s&&!t.includes("any")?c.AllOf:c.AnyOf;if(t.includes(r)||s){const n=e[r]||[e],i=[],a=[];return n.forEach(o=>{const f=Object.keys(o);f.includes("all")||f.includes("any")?a.push(l(o,!1)):i.push({factRef:o.factRef,path:o.path,operator:o.operator,value:o.value})}),{expressions:a.length>0?a:void 0,conditions:i,expressionType:r}}return{expressionType:c.AllOf,conditions:[{factRef:e.factRef,path:e.path,operator:e.operator,value:e.value}]}},R=e=>({detailsStep:{name:e.name??"",description:e.description??"",ownerEntityRef:e.ownerEntityRef??""},rulesStep:{expressions:l(e.rule),passedMessage:e.passedMessage??void 0,failedMessage:e.failedMessage??void 0,warning:e.warning??!1},filtersStep:{filter:v(e.filter)},scheduleStep:{schedule:h(e.schedule)}}),M=(e,s)=>{const{detailsStep:t,rulesStep:r,filtersStep:n,scheduleStep:i}=e;return{id:s?s.id:k(),ownerEntityRef:t.ownerEntityRef??void 0,name:t.name,description:t.description,passedMessage:r.passedMessage??void 0,failedMessage:r.failedMessage??void 0,rule:p(r.expressions),warning:r.warning??!1,filter:n.filter?x(n.filter):void 0,schedule:m(i.schedule,n.filter)}},u=(e,s="$")=>{const t=[];if(e.type==="object"&&e.properties){const r=e.properties;for(const n in r)if(r.hasOwnProperty(n)){const i=`${s}.${n}`;t.push(i);const a=r[n];t.push(...u(a,i))}}if(e.type==="array"&&e.items){const r=`${s}[*]`;t.push(r);const n=Array.isArray(e.items)?e.items:[e.items];for(const i of n)t.push(...u(i,r))}return t},A={detailsStep:{name:"",description:"",ownerEntityRef:""},rulesStep:{expressions:{expressionType:c.AllOf,expressions:void 0,conditions:[{factRef:"",path:"",operator:"",value:"",conditions:[]}]},warning:!1},filtersStep:{filter:b()},scheduleStep:{schedule:S()}},F={details:{name:{name:"Check name",description:"Give your check a meaningful name so it's easy to remember",helperText:`Max ${C} characters`,placeholder:"Example: Code Coverage Check"},description:{name:"Check description",description:"Give your check a meaningful description so others know what it's for",placeholder:"Example: Ensure code coverage meets the minimum threshold"},owner:{name:"Check owner",description:"Add yourself, or a team, as the owner of this check",selectLabel:"Owner"}},rulesStep:{rules:{name:"Check rules",description:"Add the rules you want your check to enforce"},messages:{name:"Pass/Fail messages (Optional)",description:"Add the messages that will appear to you when checks either pass or fail",passMessagePlaceholder:"Enter pass message...",failMessagePlaceholder:"Enter fail message...",passedTabName:"Passed Message",failedTabName:"Failed Message"},warnings:{name:"Enable warnings",description:"Enable if the check should emit warning check results if it fails",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:"By default, checks are executed when any fact they depend on is updated. However, you may also schedule a check to run on a schedule.",checkboxLabel:"Schedule check"}};export{F as CHECK_FIELDS,A as DEFAULT_FORM_VALUES,u as generateJsonPaths,R as mapCheckerToFormValues,p as mapExpressionToRule,h as mapInputScheduleToSchedule,l as mapRuleToExpression,m as mapScheduleToInputSchedule,M as mapToCheckerInput};
2
+ //# sourceMappingURL=checkFormUtils.esm.js.map
@@ -0,0 +1,2 @@
1
+ import{CheckMessagingSchema as c,CheckDetailsSchema as l,parseFactRef as m}from"@spotify/backstage-plugin-soundcheck-common";import{z as e}from"zod";import{isValidCron as p}from"../../../utils/cron.esm.js";import{validateTimeUnitValue as u}from"../../../utils/time.esm.js";import{TimeUnit as f}from"../../Frequency/types.esm.js";import"../../Frequency/util.esm.js";import"../../Frequency/FrequencyComponent.esm.js";import{ExpressionType as r}from"../types/ExpressionType.esm.js";import"../types/Path.esm.js";const i=t=>{try{return m(t),!0}catch{return"Invalid fact reference. [source]:[scope]/[name]."}},d=100,y=async t=>{if(!await i(t))throw new Error("Fact reference validation failed");return t},a=e.lazy(()=>e.strictObject({factRef:e.string().refine(y,{message:"Valid format: [source]:[scope]/[name]"}),path:e.string().min(1,"Required"),operator:e.string().min(1,"Required"),value:e.union([e.string().min(1,"Required"),e.number(),e.boolean()]),conditions:e.array(a).optional()})),n=e.lazy(()=>e.strictObject({expressionType:e.enum([r.AllOf,r.AnyOf]).optional(),expressions:e.array(n).optional(),conditions:e.array(a).optional()})),g=e.strictObject({expressions:n}).merge(c),b=e.strictObject({filter:e.strictObject({selectedKinds:e.string().array(),selectedTypes:e.string().array(),selectedLifecycles:e.string().array(),selectedOwners:e.string().array(),selectedSystems:e.string().array(),selectedTags:e.string().array()}).optional()}),h=e.nativeEnum(f),O=({type:t,cron:o,value:s})=>t==="cron"?p(o):t==="HumanDuration"?u(s)===!0:!0,j=e.strictObject({type:e.enum(["HumanDuration","cron"]),unit:h.optional(),value:e.number().min(1,"Value must be greater than 0.").optional(),cron:e.string().optional()}).refine(O,{message:"Invalid frequency configuration"}),v=e.strictObject({enabled:e.boolean(),frequency:j}),S=e.strictObject({schedule:v.optional()}),T=e.strictObject({detailsStep:l,rulesStep:g,filtersStep:b,scheduleStep:S});export{d as CHECK_NAME_MAX_LENGTH,T as checkFormSchema,i as validateFactRef};
2
+ //# sourceMappingURL=validation.esm.js.map
@@ -1,2 +1,2 @@
1
- import e,{useEffect as i}from"react";import"../../contexts/TrackFormContext.esm.js";import{useCheckFormContext as p}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 c}from"../../hooks/useNavigateBack.esm.js";import{checksPageRouteRef as s}from"../../routes.esm.js";import{CheckForm as a}from"../ChecksPage/MutateCheckViews/CheckForm/CheckForm.esm.js";import"@material-ui/core";import"../ChecksPage/MutateCheckViews/CheckForm/Steps/CheckDetailsStep.esm.js";import"../ChecksPage/MutateCheckViews/CheckForm/Steps/CheckRulesStep.esm.js";import"../ChecksPage/MutateCheckViews/types/ExpressionType.esm.js";import"../ChecksPage/MutateCheckViews/types/CheckFormTypes.esm.js";import"../Frequency/types.esm.js";import"../Frequency/util.esm.js";import"../Frequency/FrequencyComponent.esm.js";import"../ChecksPage/MutateCheckViews/types/Path.esm.js";const n=({check:o})=>{const{selectedItem:r,showReadOnlyModal:t}=p();i(()=>{t(o)},[o,t]);const[m]=c(s);return r&&e.createElement(a,{title:"Check Details",open:!0,onClose:m,onSave:()=>{}})};export{n as CheckDetailsView};
1
+ import m,{useEffect as i}from"react";import"../../contexts/TrackFormContext.esm.js";import{useCheckFormContext as p}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 c}from"../../hooks/useNavigateBack.esm.js";import{checksPageRouteRef as s}from"../../routes.esm.js";import{CheckForm as a}from"../CheckForm/CheckForm.esm.js";import"@material-ui/core";import"../CheckForm/Steps/CheckDetailsStep.esm.js";import"../CheckForm/Steps/CheckRulesStep.esm.js";const n=({check:o})=>{const{selectedItem:e,showReadOnlyModal:t}=p();i(()=>{t(o)},[o,t]);const[r]=c(s);return e&&m.createElement(a,{title:"Check Details",open:!0,onClose:r,onSave:()=>{}})};export{n as CheckDetailsView};
2
2
  //# sourceMappingURL=CheckDetailsView.esm.js.map
@@ -1,2 +1,2 @@
1
- import f,{useEffect as r}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 k}from"../../hooks/useNavigateBack.esm.js";import{useUpdateCheck as u}from"../../hooks/checks/useUpdateCheck.esm.js";import{checksPageRouteRef as d}from"../../routes.esm.js";import{CheckForm as h}from"../ChecksPage/MutateCheckViews/CheckForm/CheckForm.esm.js";import"@material-ui/core";import"../ChecksPage/MutateCheckViews/CheckForm/Steps/CheckDetailsStep.esm.js";import"../ChecksPage/MutateCheckViews/CheckForm/Steps/CheckRulesStep.esm.js";import"../ChecksPage/MutateCheckViews/types/ExpressionType.esm.js";import"../ChecksPage/MutateCheckViews/types/CheckFormTypes.esm.js";import"../Frequency/types.esm.js";import"../Frequency/util.esm.js";import"../Frequency/FrequencyComponent.esm.js";import"../ChecksPage/MutateCheckViews/types/Path.esm.js";const C=({check:t})=>{const{selectedItem:p,setSelectedItem:o}=i(),{setIsLoading:e}=i(),{mutateAsync:c,isLoading:m}=u();r(()=>{e(m)},[e,m]),r(()=>{o(t)},[t,o]);const[s,a]=k(d);return p&&f.createElement(h,{title:"Edit a Check",open:!0,onClose:s,onSave:async n=>{await c(n,{onSuccess:a})}})};export{C as CheckEditView};
1
+ import f,{useEffect as r}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 k}from"../../hooks/useNavigateBack.esm.js";import{useUpdateCheck as u}from"../../hooks/checks/useUpdateCheck.esm.js";import{checksPageRouteRef as d}from"../../routes.esm.js";import{CheckForm as h}from"../CheckForm/CheckForm.esm.js";import"@material-ui/core";import"../CheckForm/Steps/CheckDetailsStep.esm.js";import"../CheckForm/Steps/CheckRulesStep.esm.js";const C=({check:t})=>{const{selectedItem:p,setSelectedItem:o}=i(),{setIsLoading:e}=i(),{mutateAsync:c,isLoading:m}=u();r(()=>{e(m)},[e,m]),r(()=>{o(t)},[t,o]);const[s,a]=k(d);return p&&f.createElement(h,{title:"Edit a Check",open:!0,onClose:s,onSave:async n=>{await c(n,{onSuccess:a})}})};export{C as CheckEditView};
2
2
  //# sourceMappingURL=CheckEditView.esm.js.map
@@ -1,2 +1,2 @@
1
- import{parseEntityRef as x}from"@backstage/catalog-model";import{EntityDisplayName as N}from"@backstage/plugin-catalog-react";import{makeStyles as T,Checkbox as m,Box as v,Typography as B}from"@material-ui/core";import D from"@material-ui/icons/Category";import P from"@material-ui/icons/Class";import G from"@material-ui/icons/Group";import M from"@material-ui/icons/Loop";import U from"@material-ui/icons/PlaylistAddCheckRounded";import e,{useMemo as _}from"react";import{useGetEntityFacets as n}from"../../../hooks/catalog/useGetEntityFacets.esm.js";import{CheckIcon as j}from"../../CheckIcon/CheckIcon.esm.js";import l from"../../MultiSelectFilter/MultiSelectFilter.esm.js";function q(t){return t.toLowerCase().split("_").map(r=>r.charAt(0).toUpperCase()+r.slice(1)).join(" ")}const c=(t,{selected:r})=>e.createElement(e.Fragment,null,e.createElement(m,{value:t,checked:r,color:"primary"}),e.createElement(N,{entityRef:t,hideIcon:!0})),z=(t,{selected:r})=>e.createElement(e.Fragment,null,e.createElement(m,{value:t,checked:r,color:"primary"}),e.createElement(j,{result:t}),e.createElement(v,{mr:1}),e.createElement(B,null,q(t))),Q=T(t=>({root:{display:"flex",flexDirection:"row",alignItems:"center",gap:t.spacing(2)}})),W=({filter:t,states:r,setStates:p,owners:f,setOwners:d,lifecycles:y,setLifecycles:E,types:u,setTypes:g,systems:h,setSystems:b})=>{const L=Q(),{data:F,isLoading:w}=n("relations.ownedBy",t),{data:o,isLoading:O}=n("spec.lifecycle",t),{data:s,isLoading:S}=n("spec.type",t),{data:a,isLoading:C}=n("relations.partOf",t),i=_(()=>a?.filter(R=>{try{return x(R).kind.toLowerCase()==="system"}catch{return!1}}),[a]),I=(o||[]).length<=1,k=(s||[]).length<=1,A=(i||[]).length<=1;return e.createElement("div",{className:L.root},e.createElement(l,{name:"state",label:"State",icon:e.createElement(U,null),options:["PASSED","FAILED","WARNING","NOT_APPLICABLE"],filters:r,setFilters:p,customRenderOption:z}),e.createElement(l,{name:"system",label:"System",icon:e.createElement(D,null),filters:h,setFilters:b,options:i??[],disabled:C||A,customRenderOption:c}),e.createElement(l,{name:"owner",label:"Owner",icon:e.createElement(G,null),filters:f,setFilters:d,options:F??[],disabled:w,customRenderOption:c}),e.createElement(l,{name:"type",label:"Type",icon:e.createElement(P,null),filters:u,setFilters:g,options:s??[],disabled:S||k}),e.createElement(l,{name:"lifecycle",label:"Lifecycle",icon:e.createElement(M,null),filters:y,setFilters:E,options:o??[],disabled:O||I}))};export{W as FilterBar};
1
+ import{parseEntityRef as x}from"@backstage/catalog-model";import{useApi as N,configApiRef as B}from"@backstage/core-plugin-api";import{EntityDisplayName as D}from"@backstage/plugin-catalog-react";import{makeStyles as T,Checkbox as m,Box as P,Typography as j}from"@material-ui/core";import G from"@material-ui/icons/Category";import M from"@material-ui/icons/Class";import U from"@material-ui/icons/Group";import _ from"@material-ui/icons/Loop";import H from"@material-ui/icons/PlaylistAddCheckRounded";import e,{useMemo as J}from"react";import{useGetEntityFacets as o}from"../../../hooks/catalog/useGetEntityFacets.esm.js";import{CheckIcon as K}from"../../CheckIcon/CheckIcon.esm.js";import l from"../../MultiSelectFilter/MultiSelectFilter.esm.js";function Q(t){return t.toLowerCase().split("_").map(r=>r.charAt(0).toUpperCase()+r.slice(1)).join(" ")}const p=(t,{selected:r})=>e.createElement(e.Fragment,null,e.createElement(m,{value:t,checked:r,color:"primary"}),e.createElement(D,{entityRef:t,hideIcon:!0})),W=(t,{selected:r})=>e.createElement(e.Fragment,null,e.createElement(m,{value:t,checked:r,color:"primary"}),e.createElement(K,{result:t}),e.createElement(P,{mr:1}),e.createElement(j,null,Q(t))),q=T(t=>({root:{display:"flex",flexDirection:"row",alignItems:"center",gap:t.spacing(2)}})),z=({filter:t,states:r,setStates:f,owners:d,setOwners:y,lifecycles:E,setLifecycles:u,types:g,setTypes:h,systems:b,setSystems:F})=>{const L=q(),n=N(B).getOptionalStringArray("soundcheck.flags")?.includes("enable-check-insights"),{data:A,isLoading:k}=o("relations.ownedBy",t),{data:s,isLoading:w}=o("spec.lifecycle",t,n),{data:i,isLoading:O}=o("spec.type",t,n),{data:a,isLoading:S}=o("relations.partOf",t,n),c=J(()=>a?.filter(v=>{try{return x(v).kind.toLowerCase()==="system"}catch{return!1}}),[a]),C=(s||[]).length<=1,I=(i||[]).length<=1,R=(c||[]).length<=1;return e.createElement("div",{className:L.root},e.createElement(l,{name:"state",label:"State",icon:e.createElement(H,null),options:["PASSED","FAILED","WARNING","NOT_APPLICABLE"],filters:r,setFilters:f,customRenderOption:W}),n&&e.createElement("div",null,e.createElement(l,{name:"system",label:"System",icon:e.createElement(G,null),filters:b,setFilters:F,options:c??[],disabled:S||R,customRenderOption:p}),e.createElement(l,{name:"owner",label:"Owner",icon:e.createElement(U,null),filters:d,setFilters:y,options:A??[],disabled:k,customRenderOption:p}),e.createElement(l,{name:"type",label:"Type",icon:e.createElement(M,null),filters:g,setFilters:h,options:i??[],disabled:O||I}),e.createElement(l,{name:"lifecycle",label:"Lifecycle",icon:e.createElement(_,null),filters:E,setFilters:u,options:s??[],disabled:w||C})))};export{z as FilterBar};
2
2
  //# sourceMappingURL=FilterBar.esm.js.map
@@ -0,0 +1,2 @@
1
+ import c,{useEffect as s}from"react";import"../../contexts/TrackFormContext.esm.js";import{useCheckFormContext as a}from"../../contexts/CheckFormContext.esm.js";import"../../contexts/CampaignFormContext.esm.js";import"../../contexts/UserProvider.esm.js";import{useCreateCheck as n}from"../../hooks/checks/useCreateCheck.esm.js";import{CheckForm as p}from"../CheckForm/CheckForm.esm.js";import"@material-ui/core";import"../CheckForm/Steps/CheckDetailsStep.esm.js";import"../CheckForm/Steps/CheckRulesStep.esm.js";const d=()=>{const{hideModal:e,showAddModal:r,setIsLoading:o}=a(),{mutateAsync:m,isLoading:t}=n();return s(()=>{o(t)},[o,t]),c.createElement(p,{title:"Create a Check",open:r,onSave:async i=>{await m(i,{onSuccess:()=>e()})},onClose:()=>e()})};export{d as AddCheckView};
2
+ //# sourceMappingURL=AddCheckView.esm.js.map
@@ -1,2 +1,2 @@
1
- import{useApi as Q,featureFlagsApiRef as U}from"@backstage/core-plugin-api";import{usePermission as W}from"@backstage/plugin-permission-react";import{makeStyles as Z,Button as v,Grid as i}from"@material-ui/core";import{soundcheckCheckCreatePermission as $}from"@spotify/backstage-plugin-soundcheck-common";import e,{useState as a,useEffect as q}from"react";import z from"react-use/lib/useDebounce";import"../../../contexts/TrackFormContext.esm.js";import{useCheckFormContext as J}from"../../../contexts/CheckFormContext.esm.js";import"../../../contexts/CampaignFormContext.esm.js";import"../../../contexts/UserProvider.esm.js";import"@backstage/catalog-model";import"@tanstack/react-query";import"../../../api.esm.js";import"../../../hooks/graphqlKeys.esm.js";import"@backstage/plugin-catalog-react";import{useGetChecks as K}from"../../../hooks/checks/useGetChecks.esm.js";import"../../../hooks/useSoundcheckAlert.esm.js";import"../../../hooks/useConfirmationModal.esm.js";import"react-router-dom";import{useGetCheckOwners as V}from"../../../hooks/checks/useGetCheckOwners.esm.js";import X from"../../../images/no-results.svg";import{FilterDefault as b}from"../../../utils/filters.esm.js";import{EmptyState as w}from"../../EmptyState/EmptyState.esm.js";import{Pagination as Y}from"../../Pagination/Pagination.esm.js";import{SearchFilters as _}from"../../SearchFilters/SearchFilters.esm.js";import"react-hook-form";import"../../../utils/formStyles.esm.js";import"../../Filter/FilterComponent.esm.js";import"../../FormStepper/FormStepper.esm.js";import"../../FullScreenDialog/FullScreenDialog.esm.js";import"../MutateCheckViews/FormFields/CheckNameInput/CheckNameInput.esm.js";import"../MutateCheckViews/FormFields/PassFailMessageInput/PassFailMessageInput.esm.js";import"../../FormMarkdownInput/FormMarkdownInput.esm.js";import"../MutateCheckViews/utils/checkFormUtils.esm.js";import"../MutateCheckViews/FormFields/TeamDetailsInput/TeamDetailsInput.esm.js";import"../MutateCheckViews/FormFields/RuleInput/AddMenuButton.esm.js";import"../MutateCheckViews/FormFields/RuleInput/RuleInputBox.esm.js";import"../MutateCheckViews/FormFields/RuleInput/Expressions/ExpressionBox.esm.js";import"../MutateCheckViews/FormFields/RuleInput/Expressions/ExpressionTypeToggle.esm.js";import"@material-ui/icons/Delete";import"../../FormControlledSelect/FormControlledSelect.esm.js";import"../MutateCheckViews/FormFields/RuleInput/Conditions/ControlledAutocomplete.esm.js";import"../MutateCheckViews/FormFields/RuleInput/Conditions/styles.esm.js";import"../MutateCheckViews/FormFields/RuleInput/Conditions/ConditionList.esm.js";import"../MutateCheckViews/FormFields/CheckScheduleSection/ScheduleSection.esm.js";import"@hookform/resolvers/zod";import"../MutateCheckViews/utils/validation.esm.js";import"../MutateCheckViews/types/ExpressionType.esm.js";import{CheckEmptyState as d,CheckNoResults as x}from"../MutateCheckViews/types/CheckFormTypes.esm.js";import"../../Frequency/types.esm.js";import"../../Frequency/util.esm.js";import"../../Frequency/FrequencyComponent.esm.js";import"../MutateCheckViews/types/Path.esm.js";import"../MutateCheckViews/CheckForm/Steps/CheckDetailsStep.esm.js";import"../MutateCheckViews/CheckForm/Steps/CheckRulesStep.esm.js";import{ChecksOverviewSkeleton as ee}from"../skeletons/ChecksOverviewSkeleton.esm.js";import{CheckSummaryCard as te}from"./CheckSummaryCard.esm.js";const re=Z(r=>({headerButtons:{display:"flex",gap:r.spacing(1),flexWrap:"nowrap",justifyContent:"end",alignItems:"end"},header:{padding:r.spacing(0,0,1)},container:{padding:r.spacing(3),gap:r.spacing(3)},createButton:{lineHeight:"1.25rem",paddingTop:r.spacing(1.5),paddingBottom:r.spacing(1.5)}})),oe=({checksPerPage:r,currentCursor:y})=>{const m=re(),[g,S]=a(y),[s,A]=a(""),[h,N]=a(b.Alpha),[u,B]=a(b.Owner),[F,I]=a(""),{data:O,isLoading:L}=V();z(()=>{I(s)},500,[s]);const{loading:f,allowed:T}=W({permission:$}),{data:o,isLoading:c}=K({ids:void 0,first:r,after:g,orderAlphabetical:h,searchByOwner:u,searchByName:F}),[p,G]=a(o),l=p?.edges?.map(t=>t.node),[C,R]=a([]),k=Q(U),D=!k.getRegisteredFlags().find(t=>t.name==="soundcheck-enable-check-creation")||k.isActive("soundcheck-enable-check-creation"),P=!T||!D,j=t=>{N(t.target.value)},H=t=>{B(t.target.value)};q(()=>{o&&G(()=>({totalCount:o.totalCount,edges:o.edges,pageInfo:{startCursor:o.pageInfo.startCursor,endCursor:o.pageInfo.endCursor,hasNextPage:o?.pageInfo.hasNextPage??!1,hasPreviousPage:o?.pageInfo.hasPreviousPage??!1}}))},[o]);const{setShowAddModal:E}=J();if(!c&&!l)return e.createElement(w,{title:d.title,description:d.description,imgSrc:X,action:!f&&e.createElement(v,{disabled:P,variant:"contained",color:"primary",onClick:()=>E(!0)},d.callToAction)});let n;c?n=e.createElement(ee,null):l?.length?n=l?.map(t=>e.createElement(i,{key:t.id,xs:12,sm:12,md:6,lg:4,xl:3,item:!0,role:"listitem","aria-label":`check card ${t.id}`},e.createElement(te,{check:t}))):n=e.createElement(i,{xs:12,item:!0,role:"listitem","aria-label":"result"},e.createElement(w,{title:x.title,description:x.description}));const M=p?.pageInfo.hasNextPage||C?.length>0;return e.createElement(i,{container:!0,direction:"row",className:m.container},e.createElement(i,{container:!0,className:m.header},e.createElement(_,{searchPlaceholder:"Search Available Checks",isLoading:c||L,searchTerm:s,setSearchTerm:A,filterAlpha:h,handleAlphabeticalFilterChange:j,filterOwner:u,handleOwnerFilterChange:H,owners:O}),e.createElement(i,{item:!0,xs:2,className:m.headerButtons},!f&&e.createElement(v,{disabled:P,variant:"contained",color:"primary",onClick:()=>E(!0),className:m.createButton},"Create Check"))),e.createElement(i,{container:!0,spacing:4,role:"list","aria-label":"checks"},n),M&&e.createElement(i,{item:!0,xs:12},e.createElement(Y,{response:p,listingsPerPage:r,cursor:g,setCursor:S,prevCursors:C,setPrevCursors:R,labelPerPageDropdown:"Checks Per Page:",urlRoute:"checks?checksPerPage="})))};export{oe as CheckListPage};
1
+ import{useApi as j,featureFlagsApiRef as U}from"@backstage/core-plugin-api";import{usePermission as W}from"@backstage/plugin-permission-react";import{makeStyles as q,Button as E,Grid as o}from"@material-ui/core";import{soundcheckCheckCreatePermission as z}from"@spotify/backstage-plugin-soundcheck-common";import t,{useState as c,useEffect as J}from"react";import K from"react-use/lib/useDebounce";import"../../../contexts/TrackFormContext.esm.js";import{useCheckFormContext as Q}from"../../../contexts/CheckFormContext.esm.js";import"../../../contexts/CampaignFormContext.esm.js";import"../../../contexts/UserProvider.esm.js";import"@backstage/catalog-model";import"@tanstack/react-query";import"../../../api.esm.js";import"../../../hooks/graphqlKeys.esm.js";import"@backstage/plugin-catalog-react";import{useGetChecks as V}from"../../../hooks/checks/useGetChecks.esm.js";import"../../../hooks/useSoundcheckAlert.esm.js";import"../../../hooks/useConfirmationModal.esm.js";import"react-router-dom";import{useGetCheckOwners as X}from"../../../hooks/checks/useGetCheckOwners.esm.js";import Y from"../../../images/no-results.svg";import{FilterDefault as v}from"../../../utils/filters.esm.js";import{EmptyState as b}from"../../EmptyState/EmptyState.esm.js";import{Pagination as Z}from"../../Pagination/Pagination.esm.js";import{SearchFilters as _}from"../../SearchFilters/SearchFilters.esm.js";import{ChecksOverviewSkeleton as ee}from"../skeletons/ChecksOverviewSkeleton.esm.js";import{CheckSummaryCard as te}from"./CheckSummaryCard.esm.js";var w=(e=>(e.title="Create a check",e.description="A check is a comparison between a defined acceptable outcome and the actual outcome of a given process.",e.callToAction="Get started",e))(w||{}),y=(e=>(e.title="No checks found",e.description="No checks matched your search. Consider changing search term and filters.",e))(y||{});const re=q(e=>({headerButtons:{display:"flex",gap:e.spacing(1),flexWrap:"nowrap",justifyContent:"end",alignItems:"end"},header:{padding:e.spacing(0,0,1)},container:{padding:e.spacing(3),gap:e.spacing(3)},createButton:{lineHeight:"1.25rem",paddingTop:e.spacing(1.5),paddingBottom:e.spacing(1.5)}})),ae=({checksPerPage:e,currentCursor:N})=>{const i=re(),[d,x]=c(N),[n,A]=c(""),[h,S]=c(v.Alpha),[g,B]=c(v.Owner),[F,I]=c(""),{data:O,isLoading:G}=X();K(()=>{I(n)},500,[n]);const{loading:u,allowed:L}=W({permission:z}),{data:a,isLoading:m}=V({ids:void 0,first:e,after:d,orderAlphabetical:h,searchByOwner:g,searchByName:F}),[l,T]=c(a),p=l?.edges?.map(r=>r.node),[f,R]=c([]),k=j(U),D=!k.getRegisteredFlags().find(r=>r.name==="soundcheck-enable-check-creation")||k.isActive("soundcheck-enable-check-creation"),C=!L||!D,H=r=>{S(r.target.value)},M=r=>{B(r.target.value)};J(()=>{a&&T(()=>({totalCount:a.totalCount,edges:a.edges,pageInfo:{startCursor:a.pageInfo.startCursor,endCursor:a.pageInfo.endCursor,hasNextPage:a?.pageInfo.hasNextPage??!1,hasPreviousPage:a?.pageInfo.hasPreviousPage??!1}}))},[a]);const{setShowAddModal:P}=Q();if(!m&&!p)return t.createElement(b,{title:"Create a check",description:"A check is a comparison between a defined acceptable outcome and the actual outcome of a given process.",imgSrc:Y,action:!u&&t.createElement(E,{disabled:C,variant:"contained",color:"primary",onClick:()=>P(!0)},"Get started")});let s;m?s=t.createElement(ee,null):p?.length?s=p?.map(r=>t.createElement(o,{key:r.id,xs:12,sm:12,md:6,lg:4,xl:3,item:!0,role:"listitem","aria-label":`check card ${r.id}`},t.createElement(te,{check:r}))):s=t.createElement(o,{xs:12,item:!0,role:"listitem","aria-label":"result"},t.createElement(b,{title:"No checks found",description:"No checks matched your search. Consider changing search term and filters."}));const $=l?.pageInfo.hasNextPage||f?.length>0;return t.createElement(o,{container:!0,direction:"row",className:i.container},t.createElement(o,{container:!0,className:i.header},t.createElement(_,{searchPlaceholder:"Search Available Checks",isLoading:m||G,searchTerm:n,setSearchTerm:A,filterAlpha:h,handleAlphabeticalFilterChange:H,filterOwner:g,handleOwnerFilterChange:M,owners:O}),t.createElement(o,{item:!0,xs:2,className:i.headerButtons},!u&&t.createElement(E,{disabled:C,variant:"contained",color:"primary",onClick:()=>P(!0),className:i.createButton},"Create Check"))),t.createElement(o,{container:!0,spacing:4,role:"list","aria-label":"checks"},s),$&&t.createElement(o,{item:!0,xs:12},t.createElement(Z,{response:l,listingsPerPage:e,cursor:d,setCursor:x,prevCursors:f,setPrevCursors:R,labelPerPageDropdown:"Checks Per Page:",urlRoute:"checks?checksPerPage="})))};export{w as CheckEmptyState,ae as CheckListPage,y as CheckNoResults};
2
2
  //# sourceMappingURL=CheckListPage.esm.js.map
@@ -1,2 +1,2 @@
1
- import r from"react";import{useSearchParams as p}from"react-router-dom";import"../../contexts/TrackFormContext.esm.js";import{useCheckFormContext as e}from"../../contexts/CheckFormContext.esm.js";import"../../contexts/CampaignFormContext.esm.js";import"../../contexts/UserProvider.esm.js";import{RESULTS_PER_PAGE as c}from"../../utils/filters.esm.js";import{CheckListPage as a}from"./CheckListPage/CheckListPage.esm.js";import"react-hook-form";import"@material-ui/core";import"../../utils/formStyles.esm.js";import"@spotify/backstage-plugin-soundcheck-common";import"../Filter/FilterComponent.esm.js";import"../FormStepper/FormStepper.esm.js";import"../FullScreenDialog/FullScreenDialog.esm.js";import"./MutateCheckViews/FormFields/CheckNameInput/CheckNameInput.esm.js";import"./MutateCheckViews/FormFields/PassFailMessageInput/PassFailMessageInput.esm.js";import"../FormMarkdownInput/FormMarkdownInput.esm.js";import"./MutateCheckViews/utils/checkFormUtils.esm.js";import"./MutateCheckViews/FormFields/TeamDetailsInput/TeamDetailsInput.esm.js";import"./MutateCheckViews/FormFields/RuleInput/AddMenuButton.esm.js";import"./MutateCheckViews/FormFields/RuleInput/RuleInputBox.esm.js";import"./MutateCheckViews/FormFields/RuleInput/Expressions/ExpressionBox.esm.js";import"./MutateCheckViews/FormFields/RuleInput/Expressions/ExpressionTypeToggle.esm.js";import"@material-ui/icons/Delete";import"@backstage/core-plugin-api";import"@tanstack/react-query";import"../../api.esm.js";import"../FormControlledSelect/FormControlledSelect.esm.js";import"./MutateCheckViews/FormFields/RuleInput/Conditions/ControlledAutocomplete.esm.js";import"./MutateCheckViews/FormFields/RuleInput/Conditions/styles.esm.js";import"../../hooks/graphqlKeys.esm.js";import"./MutateCheckViews/FormFields/RuleInput/Conditions/ConditionList.esm.js";import"./MutateCheckViews/FormFields/CheckScheduleSection/ScheduleSection.esm.js";import"@hookform/resolvers/zod";import"@backstage/catalog-model";import"@backstage/plugin-catalog-react";import"../../hooks/useSoundcheckAlert.esm.js";import"../../hooks/useConfirmationModal.esm.js";import"./MutateCheckViews/utils/validation.esm.js";import"./MutateCheckViews/types/ExpressionType.esm.js";import"./MutateCheckViews/types/CheckFormTypes.esm.js";import"../Frequency/types.esm.js";import"../Frequency/util.esm.js";import"../Frequency/FrequencyComponent.esm.js";import"./MutateCheckViews/types/Path.esm.js";import"./MutateCheckViews/CheckForm/Steps/CheckDetailsStep.esm.js";import"./MutateCheckViews/CheckForm/Steps/CheckRulesStep.esm.js";import{AddCheckView as s}from"./MutateCheckViews/AddCheckView.esm.js";const n=()=>{const[o]=p(),t=o.get("checksPerPage"),m=t?parseInt(t,10):c,{showAddModal:i}=e();return r.createElement("div",null,r.createElement(a,{checksPerPage:m}),i&&r.createElement(s,null))};export{n as ChecksPage};
1
+ import e from"react";import{useSearchParams as c}from"react-router-dom";import"../../contexts/TrackFormContext.esm.js";import{useCheckFormContext as a}from"../../contexts/CheckFormContext.esm.js";import"../../contexts/CampaignFormContext.esm.js";import"../../contexts/UserProvider.esm.js";import{RESULTS_PER_PAGE as i}from"../../utils/filters.esm.js";import{AddCheckView as s}from"./AddCheckView.esm.js";import{CheckListPage as p}from"./CheckListPage/CheckListPage.esm.js";const n=()=>{const[t]=c(),r=t.get("checksPerPage"),o=r?parseInt(r,10):i,{showAddModal:m}=a();return e.createElement("div",null,e.createElement(p,{checksPerPage:o}),m&&e.createElement(s,null))};export{n as ChecksPage};
2
2
  //# sourceMappingURL=ChecksPage.esm.js.map
@@ -1,2 +1,2 @@
1
- import{makeStyles as y,Chip as M}from"@material-ui/core";import D from"@material-ui/icons/DragIndicator";import r,{useState as E}from"react";import{useDrop as S}from"react-dnd";import{useContextMenu as B}from"../../hooks/useContextMenu.esm.js";import{ContextMenu as N}from"../ContextMenu/ContextMenu.esm.js";import{useChipStyles as O}from"../DraggableChip/chipStyles.esm.js";const z=y(e=>({input:{border:`1px solid ${e.palette.divider}`,borderRadius:4,padding:e.spacing(1),minHeight:80},hoverBackground:{background:e.palette.action.hover},normalBackground:{background:e.palette.background.default},error:{border:"1px solid red"},chipContainer:{display:"flex",flexDirection:"column",fontSize:e.typography.body1.fontSize,color:e.palette.text.primary,gap:e.spacing(.75)}})),I=({chips:e,onDelete:a,onDrop:i,error:c=!1,placeholder:m="",disabled:s})=>{const o=z(),d=O(),[{isOver:u},h]=S(()=>({accept:"chip",drop:t=>{i(t)},collect:t=>({isOver:t.isOver()})}),[i]),g=["Remove check"],{contextMenu:l,onContextMenu:x,onContextMenuClose:C,onContextMenuClick:f}=B(),[p,b]=E(null),k=(t,n)=>{x(t),b(n)},v=()=>{f(),p&&a(p)};return r.createElement("div",{ref:h,className:`${o.input} ${c?o.error:""} ${u?o.hoverBackground:o.normalBackground}`,"data-testid":"droppable-input"},r.createElement("div",{className:o.chipContainer},e?.length?e.map(t=>r.createElement(M,{key:t.id,label:t.name,className:d.chip,icon:r.createElement(D,null),style:{cursor:"pointer"},onDelete:()=>a(t),disabled:s,onContextMenu:n=>k(n,t)})):m),r.createElement(N,{x:l.mouseX,y:l.mouseY,menuItems:g,onClose:C,onClick:v}))};export{I as DroppableInput};
1
+ import{makeStyles as y,Chip as M}from"@material-ui/core";import D from"@material-ui/icons/DragIndicator";import r,{useState as E}from"react";import{useDrop as S}from"react-dnd";import{useContextMenu as B}from"../../hooks/useContextMenu.esm.js";import{ContextMenu as N}from"../ContextMenu/ContextMenu.esm.js";import{useChipStyles as O}from"../DraggableChip/chipStyles.esm.js";const z=y(e=>({input:{border:`1px solid ${e.palette.divider}`,borderRadius:4,padding:e.spacing(1),minHeight:80},hoverBackground:{background:e.palette.action.hover},normalBackground:{background:e.palette.background.default},error:{border:"1px solid red"},chipContainer:{display:"flex",flexDirection:"column",fontSize:e.typography.body1.fontSize,color:e.palette.text.primary,gap:e.spacing(.75)}})),I=({chips:e,onDelete:a,onDrop:i,error:c=!1,placeholder:m="",disabled:s})=>{const o=z(),d=O(),[{isOver:u},g]=S(()=>({accept:"chip",drop:t=>{i(t)},collect:t=>({isOver:t.isOver()})}),[i]),h=["Remove check"],{contextMenu:l,onContextMenu:x,onContextMenuClose:C,onContextMenuClick:f}=B(),[p,b]=E(null),k=(t,n)=>{x(t),b(n)},v=()=>{f(),p&&a(p)};return r.createElement("div",{ref:g,className:`${o.input} ${c?o.error:""} ${u?o.hoverBackground:o.normalBackground}`,"data-testid":"droppable-input"},r.createElement("div",{className:o.chipContainer},e?.length?e.map(t=>r.createElement(M,{key:t.id,label:t.name,className:d.chip,icon:r.createElement(D,null),style:{cursor:"pointer"},onDelete:()=>a(t),disabled:s,onContextMenu:n=>k(n,t)})):m),r.createElement(N,{x:l.mouseX,y:l.mouseY,menuItems:h,onClose:C,onClick:v}))};export{I as DroppableInput};
2
2
  //# sourceMappingURL=DroppableInput.esm.js.map
@@ -0,0 +1,2 @@
1
+ import{useRouteRef as u}from"@backstage/core-plugin-api";import{EntityRefLink as L}from"@backstage/plugin-catalog-react";import{Typography as t,Button as M,Menu as B,MenuItem as E}from"@material-ui/core";import O from"@material-ui/icons/ArrowDropDown";import z from"@material-ui/icons/ArrowDropUp";import e,{useState as j}from"react";import{useNavigate as q}from"react-router-dom";import{useEntityPassRateTrend as A}from"../../../hooks/aggregations/useEntityPassRateTrend.esm.js";import{campaignDetailsRouteRef as F,campaignEditRouteRef as Q}from"../../../routes.esm.js";import{convertToReadableDate as p}from"../../CampaignDetailsPage/CampaignDetails.esm.js";import{Loading as V}from"../../TechHealth/Loading/Loading.esm.js";import{useCampaignBannerStyles as W}from"./useCampaignBannerStyles.esm.js";import{calculateOverallPassPercent as $,calculatePassingEntities as G}from"./utils.esm.js";const H=l=>{if(l?.edges.length){const a=G(l);return e.createElement(t,{variant:"body2"},a,"/",l.edges.length)}return e.createElement(t,{variant:"body2"},"No progress found.")},J=({campaign:l})=>{const a=W(),v=u(F),f=u(Q),m=q(),[n,c]=j(null),o=150,g=l.track.levels.flatMap(({checks:s})=>s.map(({id:T})=>T)),{data:N,isLoading:b,isError:y}=A({filter:{tracks:[{trackId:l.track.id}],checkIds:{included:g},numberOfDays:void 0}}),i=N?.individualEntityPassRates??{totalCount:0,edges:[],pageInfo:{hasNextPage:!1,hasPreviousPage:!1}},C=s=>{c(s.currentTarget)},R=()=>{c(null)},x=()=>{m(f({campaignId:l.id}))},h=()=>{m(v({campaignId:l.id}))};if(b)return e.createElement("div",{"data-testid":"loading-indicator"},e.createElement(V,null));if(y)return e.createElement(t,{color:"error"},"Failed to load campaigns progress.");const k=i.edges.length?$(i):0,w=H(i),{name:P,description:r,ownerEntityRef:D,targetCompletionDate:I,startDate:S,supportChannel:d}=l;return e.createElement("div",{className:a.campaignCards},e.createElement("div",{className:a.campaignCard},e.createElement("div",{className:a.flexRow,style:{justifyContent:"space-between"}},e.createElement("div",{className:a.flexColumn},e.createElement(t,{variant:"h5"},P),e.createElement(t,{variant:"body1",className:a.description},r.length>o?`${r.substring(0,o)}...`:r)),e.createElement("div",null,e.createElement(M,{variant:"text","aria-controls":"menu","aria-haspopup":"true",onClick:C},e.createElement("div",{className:a.actions},e.createElement("div",{className:a.actionsText},"Actions"),e.createElement("div",{className:a.flexRow},n?e.createElement(z,{fontSize:"small"}):e.createElement(O,{fontSize:"small"})))),e.createElement(B,{id:"campaign-menu",anchorEl:n,keepMounted:!0,open:!!n,onClose:R,classes:{list:a.menuList}},e.createElement(E,{onClick:h},"View"),e.createElement(E,{onClick:x},"Edit")))),e.createElement("div",{className:a.detailSection},e.createElement("div",{className:a.flexColumn},e.createElement("div",{className:a.flexRow},e.createElement(t,{variant:"subtitle1",className:a.label},"Owner:"),e.createElement(t,{variant:"body1",display:"inline",className:a.value},e.createElement(L,{className:a.ownerLink,entityRef:D}))),d&&e.createElement("div",{className:a.flexRow},e.createElement(t,{variant:"subtitle1",className:a.label},"Support Channel:"),e.createElement(t,{variant:"body1",display:"inline",className:a.value},d))),e.createElement("div",{className:a.flexColumn},e.createElement("div",{className:a.flexRow},e.createElement(t,{variant:"subtitle1",className:a.label},"Start Date:"),e.createElement(t,{variant:"body1",display:"inline",className:a.value},p(S))),e.createElement("div",{className:a.flexRow},e.createElement(t,{variant:"subtitle1",className:a.label},"Target Completion Date:"),e.createElement(t,{variant:"body1",display:"inline",className:a.value},p(I)))),e.createElement("div",{className:a.flexRow,style:{minWidth:"300px"}},e.createElement("div",{className:a.flexColumn},e.createElement(t,{variant:"subtitle1",className:a.label},"Checks Passing"),e.createElement(t,{variant:"body2"},k,"%")),e.createElement("div",{className:a.flexColumn},e.createElement(t,{variant:"subtitle1",className:a.label},"Entities Complete"),w)))))};export{J as CampaignBanner};
2
+ //# sourceMappingURL=CampaignBanner.esm.js.map
@@ -1,2 +1,2 @@
1
- import{makeStyles as i}from"@material-ui/core";const t=i(e=>({campaignCards:{display:"flex",flexDirection:"column"},campaignCard:{display:"flex",flexDirection:"column",border:`1px solid ${e.palette.divider}`,padding:e.spacing(2),gap:e.spacing(5),borderRadius:e.shape.borderRadius},actions:{display:"flex",alignItems:"center",gap:e.spacing(1)},actionsText:{textTransform:"lowercase","&:first-letter":{textTransform:"uppercase"}},flexRow:{display:"flex",gap:e.spacing(1)},campaignDescription:{textOverflow:"ellipsis",whiteSpace:"nowrap",overflow:"hidden"},progress:{display:"flex",alignItems:"center",gap:e.spacing(1),width:"90%"},flexColumn:{width:"100%",display:"flex",flexDirection:"column",gap:e.spacing(1)},detailSection:{display:"flex",flexDirection:"row",justifyContent:"space-between",gap:e.spacing(.5)},label:{fontWeight:"bold",color:e.palette.text.primary},value:{marginTop:"2px"},description:{maxWidth:"90%"},menuList:{backgroundColor:e.palette.background.paper},ownerLink:{"& span":{"&:hover":{textDecoration:"underline"}}}}));export{t as useCampaignRowStyles};
2
- //# sourceMappingURL=useCampaignRowStyles.esm.js.map
1
+ import{makeStyles as i}from"@material-ui/core";const a=i(e=>({campaignCards:{display:"flex",flexDirection:"column"},campaignCard:{display:"flex",flexDirection:"column",border:`1px solid ${e.palette.divider}`,padding:e.spacing(2),gap:e.spacing(5),borderRadius:e.shape.borderRadius},actions:{display:"flex",alignItems:"center",gap:e.spacing(1)},actionsText:{textTransform:"lowercase","&:first-letter":{textTransform:"uppercase"}},flexRow:{display:"flex",gap:e.spacing(1)},campaignDescription:{textOverflow:"ellipsis",whiteSpace:"nowrap",overflow:"hidden"},progress:{display:"flex",alignItems:"center",gap:e.spacing(1),width:"90%"},flexColumn:{width:"100%",display:"flex",flexDirection:"column",gap:e.spacing(1)},detailSection:{display:"flex",flexDirection:"row",justifyContent:"space-between",gap:e.spacing(.5)},label:{fontWeight:"bold",color:e.palette.text.primary},value:{marginTop:"2px"},description:{maxWidth:"90%"},menuList:{backgroundColor:e.palette.background.paper},ownerLink:{"& span":{"&:hover":{textDecoration:"underline"}}}}));export{a as useCampaignBannerStyles};
2
+ //# sourceMappingURL=useCampaignBannerStyles.esm.js.map
@@ -1,2 +1,2 @@
1
- import{Link as O}from"@backstage/core-components";import{useRouteRef as A}from"@backstage/core-plugin-api";import{makeStyles as G,Grid as c,Accordion as L,AccordionSummary as R,Typography as P,AccordionDetails as F}from"@material-ui/core";import T from"@material-ui/icons/ExpandMore";import e,{useState as k,useEffect as $,useCallback as I}from"react";import{useSearchParams as B}from"react-router-dom";import{useGetCampaigns as D}from"../../hooks/campaigns/useGetCampaigns.esm.js";import{useFacetsForOwner as M}from"../../hooks/facets/useFacetsForOwner.esm.js";import{campaignsPageRouteRef as V}from"../../routes.esm.js";import{LoadingIndicator as _}from"../LoadingIndicator/LoadingIndicator.esm.js";import{CampaignRow as j}from"./CampaignRow/CampaignRow.esm.js";import{OverviewTabs as q}from"./OverviewTabs.esm.js";import{OverviewTabsSkeleton as z}from"./skeletons/OverviewTabsSkeleton.esm.js";import{TableContent as U}from"./TableContent/TableContent.esm.js";const W=G(a=>({tableContainer:{padding:0,backgroundColor:"transparent"},campaignsGrid:{margin:`0 0 ${a.spacing(3)}px`,border:`1px solid ${a.palette.divider}`},campaignsCard:{display:"flex",width:"100%",flexDirection:"column",padding:a.spacing(2),gap:a.spacing(2)},campaignsLink:{textAlign:"center",margin:`${a.spacing(1)}rem 0 ${a.spacing(1)}`},tableLoading:{backgroundColor:a.palette.background.paper,padding:a.spacing(6)},noPadding:{padding:0},accordion:{boxShadow:"none"}})),l=3,H=({groupSelectorError:a,isFixedGroup:y=!1})=>{const[n,g]=B(),{group:o,kind:s,type:p}=Object.fromEntries(n.entries()),C=A(V),[r,E]=k(void 0),[b,x]=k(void 0);$(()=>{(r?.kind!==s||r?.type!==p)&&E({kind:s,type:p})},[s,p,r]);const{data:f,isLoading:u}=M(o),{data:v}=D({orderAlphabetical:"default",searchByOwner:o,searchByStatus:"active"},!!o),m=v?.edges.map(t=>t.node),h=m?.slice(0,l),w=b||a,S=I((t,d,N)=>{t&&(E({kind:t,type:d}),d?(n.set("kind",t),n.set("type",d)):(n.delete("type"),n.set("kind",t)),g(n,{replace:N}))},[n,g]),i=W();return e.createElement(c,{container:!0,spacing:0},m&&m.length>0&&e.createElement(c,{item:!0,xs:12,className:i.campaignsGrid},e.createElement(L,{style:{boxShadow:"none"}},e.createElement(R,{expandIcon:e.createElement(T,null)},e.createElement(P,{variant:"h6"},"Campaigns")),e.createElement(F,null,e.createElement("div",{className:i.campaignsCard},h?.map(t=>e.createElement("div",{key:t.id},e.createElement(j,{campaign:t})))),m.length>l&&e.createElement(O,{to:C(),className:i.campaignsLink},"More Campaigns")))),e.createElement(c,{item:!0,xs:12,className:i.noPadding},u?e.createElement(z,null):e.createElement(q,{unfilteredFacets:f,kind:r?.kind,type:r?.type,onChange:S})),e.createElement(c,{item:!0,xs:12,className:i.tableContainer},u?e.createElement("div",{className:i.tableLoading},e.createElement(_,{size:80})):e.createElement(U,{facets:f,kind:r?.kind,type:r?.type,setError:x,hasError:w,ownerEntityRef:o,isFixedGroup:y})))};export{l as OVERVIEW_CAMPAIGNS_COUNT,H as OverviewPageContent};
1
+ import{Link as N}from"@backstage/core-components";import{useRouteRef as A}from"@backstage/core-plugin-api";import{makeStyles as G,Grid as s,Accordion as L,AccordionSummary as R,Typography as P,AccordionDetails as F}from"@material-ui/core";import T from"@material-ui/icons/ExpandMore";import e,{useState as k,useEffect as B,useCallback as I}from"react";import{useSearchParams as $}from"react-router-dom";import{useGetCampaigns as D}from"../../hooks/campaigns/useGetCampaigns.esm.js";import{useFacetsForOwner as M}from"../../hooks/facets/useFacetsForOwner.esm.js";import{campaignsPageRouteRef as V}from"../../routes.esm.js";import{LoadingIndicator as _}from"../LoadingIndicator/LoadingIndicator.esm.js";import{OverviewTable as j}from"../OverviewTable/OverviewTable.esm.js";import{RowHeights as q}from"../OverviewTable/resultsTableUtils.esm.js";import{CampaignBanner as z}from"./CampaignBanner/CampaignBanner.esm.js";import{OverviewTabs as H}from"./OverviewTabs.esm.js";import{OverviewTabsSkeleton as U}from"./OverviewTabsSkeleton.esm.js";const W=G(a=>({tableContainer:{padding:0,backgroundColor:"transparent",paddingBottom:q.paginationControl},campaignsGrid:{margin:`0 0 ${a.spacing(3)}px`,border:`1px solid ${a.palette.divider}`},campaignsCard:{display:"flex",width:"100%",flexDirection:"column",padding:a.spacing(2),gap:a.spacing(2)},campaignsLink:{textAlign:"center",margin:`${a.spacing(1)}rem 0 ${a.spacing(1)}`},tableLoading:{backgroundColor:a.palette.background.paper,padding:a.spacing(6)},noPadding:{padding:0},accordion:{boxShadow:"none"}})),l=3,J=({groupSelectorError:a,isFixedGroup:y=!1})=>{const[n,g]=$(),{group:o,kind:c,type:p}=Object.fromEntries(n.entries()),C=A(V),[r,f]=k(void 0),[b,v]=k(void 0);B(()=>{(r?.kind!==c||r?.type!==p)&&f({kind:c,type:p})},[c,p,r]);const{data:E,isLoading:u}=M(o),{data:x}=D({orderAlphabetical:"default",searchByOwner:o,searchByStatus:"active"},!!o),m=x?.edges.map(t=>t.node),h=m?.slice(0,l),w=b||a,S=I((t,d,O)=>{t&&(f({kind:t,type:d}),d?(n.set("kind",t),n.set("type",d)):(n.delete("type"),n.set("kind",t)),g(n,{replace:O}))},[n,g]),i=W();return e.createElement(s,{container:!0,spacing:0},m&&m.length>0&&e.createElement(s,{item:!0,xs:12,className:i.campaignsGrid},e.createElement(L,{style:{boxShadow:"none"}},e.createElement(R,{expandIcon:e.createElement(T,null)},e.createElement(P,{variant:"h6"},"Campaigns")),e.createElement(F,null,e.createElement("div",{className:i.campaignsCard},h?.map(t=>e.createElement("div",{key:t.id},e.createElement(z,{campaign:t})))),m.length>l&&e.createElement(N,{to:C(),className:i.campaignsLink},"More Campaigns")))),e.createElement(s,{item:!0,xs:12,className:i.noPadding},u?e.createElement(U,null):e.createElement(H,{unfilteredFacets:E,kind:r?.kind,type:r?.type,onChange:S})),e.createElement(s,{item:!0,xs:12,className:i.tableContainer},u?e.createElement("div",{className:i.tableLoading},e.createElement(_,{size:80})):e.createElement(j,{facets:E,kind:r?.kind,type:r?.type,setError:v,hasError:w,ownerEntityRef:o,isFixedGroup:y})))};export{l as OVERVIEW_CAMPAIGNS_COUNT,J as OverviewPageContent};
2
2
  //# sourceMappingURL=OverviewPageContent.esm.js.map