@spotify/backstage-plugin-soundcheck 0.13.0 → 0.14.1

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 (240) hide show
  1. package/CHANGELOG.md +65 -0
  2. package/alpha/package.json +1 -1
  3. package/dist/alpha/apis.esm.js +1 -1
  4. package/dist/alpha/entity-content.esm.js +1 -1
  5. package/dist/alpha/pages.esm.js +1 -1
  6. package/dist/alpha/plugin.esm.js +1 -1
  7. package/dist/alpha/sidebar-item.esm.js +1 -1
  8. package/dist/alpha.d.ts +121 -1
  9. package/dist/api.esm.js +1 -1
  10. package/dist/components/Badges/BaseBadge.esm.js +1 -1
  11. package/dist/components/Badges/CampaignBadge.esm.js +1 -1
  12. package/dist/components/Badges/CertificationBadge.esm.js +1 -1
  13. package/dist/components/Badges/NoLevelBadge.esm.js +5 -1
  14. package/dist/components/Badges/PlaylistBadge.esm.js +1 -1
  15. package/dist/components/CampaignCreatePage/CampaignCreatePage.esm.js +2 -0
  16. package/dist/components/CampaignDetailsPage/CampaignChecks.esm.js +1 -1
  17. package/dist/components/CampaignDetailsPage/CampaignDetailRow.esm.js +1 -1
  18. package/dist/components/CampaignDetailsPage/CampaignDetails.esm.js +1 -1
  19. package/dist/components/CampaignDetailsPage/CampaignDetailsPage.esm.js +1 -1
  20. package/dist/components/CampaignDetailsPage/CampaignMilestones.esm.js +1 -1
  21. package/dist/components/CampaignDetailsPage/CampaignProgress.esm.js +1 -1
  22. package/dist/components/CampaignForm/CampaignForm.esm.js +1 -1
  23. package/dist/components/CampaignForm/Steps/CampaignDetailsStep/CampaignDescriptionField.esm.js +1 -1
  24. package/dist/components/CampaignForm/Steps/CampaignDetailsStep/CampaignNameField.esm.js +1 -1
  25. package/dist/components/CampaignForm/Steps/CampaignDetailsStep/CampaignOwnerField.esm.js +1 -1
  26. package/dist/components/CampaignForm/Steps/CampaignDetailsStep/CampaignScheduleField.esm.js +1 -1
  27. package/dist/components/CampaignForm/Steps/CampaignMilestonesStep.esm.js +1 -1
  28. package/dist/components/CampaignForm/utils/campaignFormUtils.esm.js +1 -1
  29. package/dist/components/CampaignForm/utils/validation.esm.js +1 -1
  30. package/dist/components/CampaignsPage/CampaignEmptyState.esm.js +1 -1
  31. package/dist/components/CampaignsPage/CampaignListPage/CampaignListPage.esm.js +1 -1
  32. package/dist/components/CampaignsPage/CampaignsPage.esm.js +1 -1
  33. package/dist/components/CampaignsPage/EditCampaignView.esm.js +1 -1
  34. package/dist/components/CertificationAccordion/CertificationAccordion.esm.js +1 -1
  35. package/dist/components/CertificationSidebar/CertificationSummary.esm.js +1 -1
  36. package/dist/components/CertificationSidebar/Check.esm.js +1 -1
  37. package/dist/components/CertificationsPage/CertificationsPage.esm.js +1 -1
  38. package/dist/components/CheckCard/CheckCard.esm.js +1 -1
  39. package/dist/components/CheckCreatePage/CheckCreatePage.esm.js +2 -0
  40. package/dist/components/CheckDetails/ResultStateBox.esm.js +1 -1
  41. package/dist/components/CheckDryRun/CheckDryRun.esm.js +2 -0
  42. package/dist/components/CheckDryRun/CheckDryRunContext.esm.js +2 -0
  43. package/dist/components/CheckDryRun/CheckDryRunDetails.esm.js +2 -0
  44. package/dist/components/CheckDryRun/CheckDryRunDialog.esm.js +2 -0
  45. package/dist/components/CheckDryRun/CheckDryRunDialogButton.esm.js +2 -0
  46. package/dist/components/CheckDryRun/checkDryRunUtils.esm.js +2 -0
  47. package/dist/components/CheckForm/CheckForm.esm.js +1 -1
  48. package/dist/components/CheckForm/FormFields/CheckDescriptionInput/CheckDescriptionInput.esm.js +1 -1
  49. package/dist/components/CheckForm/FormFields/CheckNameInput/CheckNameInput.esm.js +1 -1
  50. package/dist/components/CheckForm/FormFields/CheckPathResolverInput.esm.js +2 -0
  51. package/dist/components/CheckForm/FormFields/RuleInput/AddMenuButton.esm.js +1 -1
  52. package/dist/components/CheckForm/FormFields/RuleInput/Conditions/ConditionList.esm.js +1 -1
  53. package/dist/components/CheckForm/FormFields/RuleInput/Conditions/FactValueDisplay.esm.js +2 -0
  54. package/dist/components/CheckForm/FormFields/RuleInput/Conditions/RuleConditionInput.esm.js +1 -1
  55. package/dist/components/CheckForm/FormFields/RuleInput/Conditions/ValueListContext.esm.js +2 -0
  56. package/dist/components/CheckForm/FormFields/RuleInput/Conditions/ValueListInput.esm.js +2 -0
  57. package/dist/components/CheckForm/FormFields/RuleInput/Conditions/styles.esm.js +1 -1
  58. package/dist/components/CheckForm/FormFields/RuleInput/Conditions/useRuleOptions.esm.js +1 -1
  59. package/dist/components/CheckForm/FormFields/RuleInput/Expressions/ExpressionTypeToggle.esm.js +1 -1
  60. package/dist/components/CheckForm/FormFields/RuleInput/RuleInputBox.esm.js +1 -1
  61. package/dist/components/CheckForm/FormFields/RuleInput/useRuleInputHandlers.esm.js +1 -1
  62. package/dist/components/CheckForm/FormFields/TeamDetailsInput/TeamDetailsInput.esm.js +1 -1
  63. package/dist/components/CheckForm/Steps/CheckDetailsStep.esm.js +1 -1
  64. package/dist/components/CheckForm/Steps/CheckReviewStep.esm.js +2 -0
  65. package/dist/components/CheckForm/Steps/CheckRulesStep.esm.js +1 -1
  66. package/dist/components/CheckForm/types/ExpressionType.esm.js +1 -1
  67. package/dist/components/CheckForm/useCheckForm.esm.js +1 -1
  68. package/dist/components/CheckForm/utils/checkFormUtils.esm.js +1 -1
  69. package/dist/components/CheckForm/utils/validation.esm.js +1 -1
  70. package/dist/components/CheckIcon/CheckIcon.esm.js +1 -1
  71. package/dist/components/CheckPage/CheckDetailsView.esm.js +1 -1
  72. package/dist/components/CheckPage/CheckEditView.esm.js +1 -1
  73. package/dist/components/CheckPage/CheckEntitiesTable/CheckEntitiesTable.esm.js +1 -1
  74. package/dist/components/CheckPage/CheckInsightsPage.esm.js +1 -1
  75. package/dist/components/CheckPage/CheckStatusBar.esm.js +1 -1
  76. package/dist/components/CheckPage/CheckStatusHistoryChart.esm.js +1 -1
  77. package/dist/components/CheckPage/FilterBar/FilterBar.esm.js +1 -1
  78. package/dist/components/CheckTemplatesPage/CheckTemplatesPage.esm.js +2 -0
  79. package/dist/components/CheckTemplatesPage/TemplateCategory.esm.js +2 -0
  80. package/dist/components/ChecksPage/CheckListPage/CheckListPage.esm.js +1 -1
  81. package/dist/components/ChecksPage/ChecksPage.esm.js +1 -1
  82. package/dist/components/ChecksTab/ChecksTab.esm.js +1 -1
  83. package/dist/components/CollectorPage/CollectorPage.esm.js +1 -1
  84. package/dist/components/CollectorPage/Configurators/Common/CollectorOption.esm.js +2 -0
  85. package/dist/components/CollectorPage/Configurators/Common/FactCollectionConfig.esm.js +2 -0
  86. package/dist/components/CollectorPage/Configurators/Common/utils.esm.js +2 -0
  87. package/dist/components/CollectorPage/Configurators/Configurator.esm.js +1 -1
  88. package/dist/components/CollectorPage/Configurators/DataDog/DataDogConfigurator.esm.js +2 -0
  89. package/dist/components/CollectorPage/Configurators/DataDog/utils.esm.js +2 -0
  90. package/dist/components/CollectorPage/Configurators/Github/GithubConfigurator.esm.js +1 -1
  91. package/dist/components/CollectorPage/Configurators/Github/utils.esm.js +1 -1
  92. package/dist/components/CollectorPage/Configurators/Jira/IssuesSearchFactDetailsComponent.esm.js +2 -0
  93. package/dist/components/CollectorPage/Configurators/Jira/JiraConfigurator.esm.js +2 -0
  94. package/dist/components/CollectorPage/Configurators/Jira/utils.esm.js +2 -0
  95. package/dist/components/CollectorPage/Configurators/Jira/validation.esm.js +2 -0
  96. package/dist/components/CollectorPage/Configurators/Kubernetes/KubernetesConfigurator.esm.js +2 -0
  97. package/dist/components/CollectorPage/Configurators/Kubernetes/utils.esm.js +2 -0
  98. package/dist/components/CollectorPage/Configurators/PagerDuty/IncidentsFactDetailsComponent.esm.js +2 -0
  99. package/dist/components/CollectorPage/Configurators/PagerDuty/PagerDutyConfigurator.esm.js +2 -0
  100. package/dist/components/CollectorPage/Configurators/PagerDuty/StatusesComponent.esm.js +2 -0
  101. package/dist/components/CollectorPage/Configurators/PagerDuty/utils.esm.js +2 -0
  102. package/dist/components/CollectorPage/Configurators/PagerDuty/validation.esm.js +2 -0
  103. package/dist/components/CollectorPage/Configurators/SCM/ExistsFactDetailsComponent.esm.js +2 -0
  104. package/dist/components/CollectorPage/Configurators/SCM/FactCollectionConfig.esm.js +2 -0
  105. package/dist/components/CollectorPage/Configurators/SCM/FactDetailsComponent.esm.js +2 -0
  106. package/dist/components/CollectorPage/Configurators/SCM/JsonFactDetailsComponent.esm.js +2 -0
  107. package/dist/components/CollectorPage/Configurators/SCM/RegexFactDetailsComponent.esm.js +2 -0
  108. package/dist/components/CollectorPage/Configurators/SCM/ScmConfigurator.esm.js +2 -0
  109. package/dist/components/CollectorPage/Configurators/SCM/utils.esm.js +2 -0
  110. package/dist/components/CollectorPage/Configurators/SCM/validation.esm.js +2 -0
  111. package/dist/components/CollectorPage/Configurators/SonarQube/MeasuresFactDetailsInput.esm.js +2 -0
  112. package/dist/components/CollectorPage/Configurators/SonarQube/MetricsInput.esm.js +2 -0
  113. package/dist/components/CollectorPage/Configurators/SonarQube/SonarQubeConfigurator.esm.js +2 -0
  114. package/dist/components/CollectorPage/Configurators/SonarQube/utils.esm.js +2 -0
  115. package/dist/components/CollectorPage/Configurators/SonarQube/validation.esm.js +2 -0
  116. package/dist/components/CollectorsPage/CollectorListPage/CollectorListPage.esm.js +1 -1
  117. package/dist/components/CollectorsPage/CollectorListPage/CollectorLogo.esm.js +1 -1
  118. package/dist/components/CollectorsPage/CollectorListPage/CollectorSummaryCard.esm.js +1 -1
  119. package/dist/components/CollectorsPage/CollectorsPage.esm.js +1 -1
  120. package/dist/components/EntitySoundcheckCard/Card.esm.js +1 -1
  121. package/dist/components/ExpandableSection/ExpandableSection.esm.js +2 -0
  122. package/dist/components/FactExplorer/FactExplorer.esm.js +2 -0
  123. package/dist/components/FactExplorer/FactExplorerContext.esm.js +2 -0
  124. package/dist/components/FactExplorer/FactExplorerDialog.esm.js +2 -0
  125. package/dist/components/FactExplorer/useFactOptions.esm.js +2 -0
  126. package/dist/components/Filter/EntityAutocompletePicker.esm.js +1 -1
  127. package/dist/components/Filter/FilterPreviewTable/EntityTableToolbar.esm.js +1 -1
  128. package/dist/components/Filter/FilterPreviewTable/FilterPreviewTable.esm.js +1 -1
  129. package/dist/components/Filter/utils.esm.js +1 -1
  130. package/dist/components/FooterButtons/FooterButtons.esm.js +1 -1
  131. package/dist/components/FormControlledAutocomplete/ControlledAutocomplete.esm.js +2 -0
  132. package/dist/components/FormControlledAutocomplete/FormControlledAutocomplete.esm.js +2 -0
  133. package/dist/components/FormControlledAutocomplete/useLabelOptions.esm.js +2 -0
  134. package/dist/components/FormFieldLabel/FormFieldLabel.esm.js +2 -0
  135. package/dist/components/FormStepper/FormStepper.esm.js +1 -1
  136. package/dist/components/FormattedPreview/FormattedPreview.esm.js +4 -0
  137. package/dist/components/Frequency/FrequencyComponent.esm.js +1 -1
  138. package/dist/components/GroupSelector/GroupSelector.esm.js +1 -1
  139. package/dist/components/LevelCard/LevelCard.esm.js +1 -1
  140. package/dist/components/ListboxVirtualized/ListboxVirtualized.esm.js +2 -0
  141. package/dist/components/MultiSelectFilter/MultiSelectFilter.esm.js +1 -1
  142. package/dist/components/OverviewPage/CampaignBanner/CampaignArea.esm.js +2 -0
  143. package/dist/components/OverviewPage/CampaignBanner/CampaignBanner.esm.js +1 -1
  144. package/dist/components/OverviewPage/OverviewPage.esm.js +1 -1
  145. package/dist/components/OverviewPage/OverviewPageContent.esm.js +1 -1
  146. package/dist/components/OverviewPage/OverviewPageHeader.esm.js +2 -0
  147. package/dist/components/OverviewPage/index.esm.js +1 -1
  148. package/dist/components/OverviewTable/Cell/CheckCellTooltip.esm.js +1 -1
  149. package/dist/components/OverviewTable/Cell/CheckLabelCell.esm.js +2 -0
  150. package/dist/components/OverviewTable/Cell/EntityRefCell.esm.js +1 -1
  151. package/dist/components/OverviewTable/Cell/HighestLevelBadge.esm.js +1 -1
  152. package/dist/components/OverviewTable/Cell/TrackLevelHeaderCell.esm.js +1 -1
  153. package/dist/components/OverviewTable/Cell/cellRenderer.esm.js +1 -1
  154. package/dist/components/OverviewTable/OverviewTable.esm.js +1 -1
  155. package/dist/components/OverviewTable/ResultsTable.esm.js +1 -1
  156. package/dist/components/OverviewTable/ResultsTableHeader.esm.js +1 -1
  157. package/dist/components/OverviewTable/ResultsTableRow.esm.js +1 -1
  158. package/dist/components/PassRateTable/PassRateTable.esm.js +3 -1
  159. package/dist/components/QuickstartPage/HowDoIListItem.esm.js +2 -0
  160. package/dist/components/QuickstartPage/QuickStartChecksCard.esm.js +2 -0
  161. package/dist/components/QuickstartPage/QuickstartCardBase.esm.js +2 -0
  162. package/dist/components/QuickstartPage/QuickstartCollectorConfigurationsCard.esm.js +2 -0
  163. package/dist/components/QuickstartPage/QuickstartPage.esm.js +2 -0
  164. package/dist/components/QuickstartPage/QuickstartTracksCard.esm.js +2 -0
  165. package/dist/components/QuickstartPage/WelcomeHelpSection.esm.js +7 -0
  166. package/dist/components/QuickstartPage/WelcomeModal.esm.js +2 -0
  167. package/dist/components/QuickstartPage/styles.esm.js +2 -0
  168. package/dist/components/RoutingPage/RoutingPage.esm.js +1 -1
  169. package/dist/components/SearchBar/SearchBar.esm.js +1 -1
  170. package/dist/components/SearchFilters/SearchFilters.esm.js +1 -1
  171. package/dist/components/SoundcheckDialog/SoundcheckDialog.esm.js +2 -0
  172. package/dist/components/SoundcheckHeader/Breadcrumbs.esm.js +2 -0
  173. package/dist/components/SoundcheckHeader/SoundcheckHeader.esm.js +2 -0
  174. package/dist/components/SoundcheckHeader/SoundcheckHeaderContext.esm.js +2 -0
  175. package/dist/components/SoundcheckHeader/headerUtil.esm.js +2 -0
  176. package/dist/components/SoundcheckHeader/useHeader.esm.js +2 -0
  177. package/dist/components/SummaryCard/SummaryCard.esm.js +1 -1
  178. package/dist/components/TechHealth/Filters/FacetFilter.esm.js +1 -1
  179. package/dist/components/TechHealth/TechHealth.esm.js +1 -1
  180. package/dist/components/TechHealthTabs/ActionColumn.esm.js +1 -1
  181. package/dist/components/TechHealthTabs/CheckResultsTab/CheckResultsTab.esm.js +1 -1
  182. package/dist/components/TrackCreatePage/TrackCreatePage.esm.js +2 -0
  183. package/dist/components/{EditTrackPage/EditTrackPage.esm.js → TrackEditPage/TrackEditPage.esm.js} +2 -2
  184. package/dist/components/TrackEditPage/TrackEditView.esm.js +2 -0
  185. package/dist/components/TrackForm/Steps/LevelsStep/ChecksSection/ChecksSection.esm.js +1 -1
  186. package/dist/components/TrackForm/Steps/TrackDetailsStep/TrackDescriptionInput/TrackDescriptionInput.esm.js +1 -1
  187. package/dist/components/TrackForm/Steps/TrackDetailsStep/TrackDocumentationUrlInput/TrackDocumentationUrlInput.esm.js +1 -1
  188. package/dist/components/TrackForm/Steps/TrackDetailsStep/TrackNameInput/TrackNameInput.esm.js +1 -1
  189. package/dist/components/TrackForm/Steps/TrackDetailsStep/TrackOwnerSelect/TrackOwnerSelect.esm.js +1 -1
  190. package/dist/components/TrackForm/TrackForm.esm.js +1 -1
  191. package/dist/components/TrackForm/utils/trackFormUtils.esm.js +1 -1
  192. package/dist/components/TrackForm/utils/validation.esm.js +1 -1
  193. package/dist/components/TrackPage/FilterBar/FilterBar.esm.js +1 -1
  194. package/dist/components/TrackPage/TrackEntitiesTable/TrackEntitiesTable.esm.js +1 -1
  195. package/dist/components/TrackPage/TrackEntitiesTable/utils.esm.js +1 -1
  196. package/dist/components/TrackPage/TrackPage.esm.js +1 -1
  197. package/dist/components/TrackPage/TrackProgressCard.esm.js +1 -1
  198. package/dist/components/TracksPage/TrackListPage/TrackListPage.esm.js +1 -1
  199. package/dist/components/TracksPage/TracksPage.esm.js +1 -1
  200. package/dist/components/TracksTab/TracksTab.esm.js +1 -1
  201. package/dist/contexts/GenericFormContext.esm.js +1 -1
  202. package/dist/graphql/generated/index.esm.js +104 -36
  203. package/dist/hooks/catalog/useGetEntityRefs.esm.js +2 -0
  204. package/dist/hooks/certifications/useProgramOverviewForOwner.esm.js +1 -1
  205. package/dist/hooks/checks/useCheckTemplates.esm.js +2 -0
  206. package/dist/hooks/checks/useExecuteCheck.esm.js +1 -1
  207. package/dist/hooks/checks/useGetChecks.esm.js +1 -1
  208. package/dist/hooks/collectors/useGetFactSchema.esm.js +1 -1
  209. package/dist/hooks/collectors/useUpdateCollectorConfig.esm.js +1 -1
  210. package/dist/hooks/graphqlKeys.esm.js +1 -1
  211. package/dist/hooks/useGetFact.esm.js +2 -0
  212. package/dist/hooks/useGetPathResolvers.esm.js +2 -0
  213. package/dist/images/gitlab-rgb.svg +1 -0
  214. package/dist/images/gitlab-white.svg +1 -0
  215. package/dist/images/jira-rgb.svg +25 -0
  216. package/dist/images/jira-white.svg +25 -0
  217. package/dist/images/sonarqube-rgb.svg +14 -0
  218. package/dist/images/sonarqube-white.svg +14 -0
  219. package/dist/index.d.ts +5 -5
  220. package/dist/plugin.esm.js +1 -1
  221. package/dist/routes.esm.js +1 -1
  222. package/dist/utils/export.esm.js +3 -3
  223. package/dist/utils/filters.esm.js +1 -1
  224. package/dist/utils/formStyles.esm.js +1 -1
  225. package/dist/utils/validation.esm.js +1 -1
  226. package/package.json +20 -18
  227. package/dist/components/CampaignForm/CampaignFormDescription.esm.js +0 -2
  228. package/dist/components/CampaignsPage/AddCampaignView.esm.js +0 -2
  229. package/dist/components/CheckForm/CheckFormDescription.esm.js +0 -2
  230. package/dist/components/CheckForm/FormFields/RuleInput/Conditions/ControlledAutocomplete.esm.js +0 -2
  231. package/dist/components/ChecksPage/AddCheckView.esm.js +0 -2
  232. package/dist/components/CollectorPage/Configurators/Github/FactCollectionConfig.esm.js +0 -2
  233. package/dist/components/EditTrackPage/EditTrackView.esm.js +0 -2
  234. package/dist/components/FormControlledSelect/FormControlledSelect.esm.js +0 -2
  235. package/dist/components/FullScreenDialog/FullScreenDialog.esm.js +0 -2
  236. package/dist/components/OverviewPage/OverviewTabs.esm.js +0 -2
  237. package/dist/components/OverviewPage/OverviewTabsSkeleton.esm.js +0 -2
  238. package/dist/components/RoutingPage/Breadcrumbs.esm.js +0 -2
  239. package/dist/components/RoutingPage/utils.esm.js +0 -2
  240. package/dist/components/TracksPage/AddTrackView.esm.js +0 -2
package/CHANGELOG.md CHANGED
@@ -1,5 +1,70 @@
1
1
  # @spotify/backstage-plugin-soundcheck
2
2
 
3
+ ## 0.14.1
4
+
5
+ ### Patch Changes
6
+
7
+ - Update to Backstage v1.31.1
8
+ - Minor fixes and improvements
9
+ - Replaces tabs on the Soundcheck overview page with selection based navigation including a basic entity name search function.
10
+ - Adjust Soundcheck header styling to show up better on certain backgrounds.
11
+ - Check Insights page's History chart now includes date labels on the X-axis.
12
+ - Making Fact Explorer Dialog aware of selected check filters and limiting the max number of entities it loads by default.
13
+ - Fixed standalone Soundcheck overview page by removing campaign headers for non SoundcheckRoutingPage usages.
14
+ - Campaign page will filter by status active by default.
15
+ - Resolved an issue with searching for campaigns, checks, and tracks by name.
16
+ - Fix issue with sorting entities on the check insights page.
17
+ - Add pivot function to overview table to flip x and y axis.
18
+ - Updated dependencies
19
+ - Updated dependencies
20
+ - Updated dependencies
21
+ - Updated dependencies
22
+ - Updated dependencies
23
+ - @spotify/backstage-plugin-core@0.8.1
24
+ - @spotify/backstage-plugin-soundcheck-common@0.14.1
25
+
26
+ ## 0.14.0
27
+
28
+ ### Minor Changes
29
+
30
+ - Upgraded Backstage to `v1.30.3`.
31
+ - Add check dry run feature to check form. This let's users test their checks. Requires latest version of soundcheck-backend and soundcheck-common.
32
+
33
+ ### Patch Changes
34
+
35
+ - Add peerDependency on react-dom
36
+ - Fixes the 'View Detail' button to display a disabled view of the the link if the check is not defined in Soundcheck. This can happen if the check result is submitted directly through the API or directly added into the database.
37
+ - Fact Collectors can now return Collection Errors that will be visible on UI.
38
+ - Adds a 'Welcome Page' to Soundcheck to get users started.
39
+ - Added a tooltip to "NL" badges to clarify that they indicate the entity has not been certified at any level (i.e., Not Certified).
40
+ - Added No Code UI configuration option for SCM Fact Collector.
41
+ - Change: Move Campaign view page off of full screen dialog into its own page.
42
+ - Check Insights can now be used to view information about check results submitted to Soundcheck via it's REST API.
43
+ - Soundcheck forms for Check Tracks and Campaigns are now a regular page. Create pages now have a route, i.e. `/soundcheck/tracks/create`.
44
+ - Add NOT expression to rules input in check form.
45
+ - Added No Code UI configuration option for PagerDuty Fact Collector.
46
+ - Renamed Collectors tab to Integrations tab.
47
+ - New Feature: Add operator prefixes `all:, any:, none:` input to Check form.
48
+ - Misc minor tweaks.
49
+ - New Feature: Add Fact Explorer to Rule Input on Check Form.
50
+ - Added No Code UI configuration option for SonarQube Fact Collector.
51
+ - Update description texts on Form pages.
52
+ - Add support for check templates.
53
+ - Add Fact and List rule value inputs to Soundcheck Check form.
54
+ - Check Form owner select now autoselects the logged in user by default.
55
+ - Added No Code UI configuration option for Jira Fact Collector.
56
+ - Added No Code UI configuration option for Datadog Fact Collector.
57
+ - Soundcheck Page Headers are now dynamic based on the current page.
58
+ - Feat: Add json path selection to check form.
59
+ - Added No Code UI configuration option for Kubernetes Fact Collector.
60
+ - Minor naming updates for GitHub Fact Collector's No Code UI.
61
+ - Optimize and replace owner select on Track, Check, and Campaign forms with autocompletes.
62
+ - Portal: Fix check insight chart resizing.
63
+ - Add Check Result Details to Certifications page
64
+ - Updated dependencies
65
+ - @spotify/backstage-plugin-core@0.8.0
66
+ - @spotify/backstage-plugin-soundcheck-common@0.14.0
67
+
3
68
  ## 0.13.0
4
69
 
5
70
  ### Minor Changes
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@spotify/backstage-plugin-soundcheck__alpha",
3
- "version": "0.13.0",
3
+ "version": "0.14.1",
4
4
  "main": "../dist/alpha.esm.js",
5
5
  "module": "../dist/alpha.esm.js",
6
6
  "types": "../dist/alpha.d.ts"
@@ -1,2 +1,2 @@
1
- import{createApiExtension as c,createApiFactory as i,discoveryApiRef as o,fetchApiRef as p}from"@backstage/frontend-plugin-api";import{soundcheckApiRef as r,SoundcheckApi as t}from"../api.esm.js";const f=c({factory:i({api:r,deps:{discoveryApi:o,fetchApi:p},factory:e=>new t(e)})});export{f as soundcheckApi};
1
+ import{ApiBlueprint as p,createApiFactory as c,discoveryApiRef as i,fetchApiRef as o}from"@backstage/frontend-plugin-api";import{soundcheckApiRef as r,SoundcheckApi as t}from"../api.esm.js";const f=p.make({params:{factory:c({api:r,deps:{discoveryApi:i,fetchApi:o},factory:e=>new t(e)})}});export{f as soundcheckApi};
2
2
  //# sourceMappingURL=apis.esm.js.map
@@ -1,2 +1,2 @@
1
- import{convertLegacyRouteRef as n,compatWrapper as t}from"@backstage/core-compat-api";import{createEntityContentExtension as r,createEntityCardExtension as a}from"@backstage/plugin-catalog-react/alpha";import o from"react";import{entityRootRouteRef as c,groupRootRouteRef as u}from"../routes.esm.js";const i=r({defaultPath:"soundcheck",defaultTitle:"Soundcheck",name:"entity",routeRef:n(c),loader:()=>import("../components/EntitySoundcheckContent.esm.js").then(e=>t(o.createElement(e.EntitySoundcheckContent,null)))}),d=a({name:"card",loader:()=>import("../components/EntitySoundcheckCard/index.esm.js").then(e=>t(o.createElement(e.EntitySoundcheckCard,null)))}),l=r({defaultPath:"soundcheck",defaultTitle:"Soundcheck",name:"group",routeRef:n(u),attachTo:{id:"page:catalog/group-details",input:"contents"},loader:()=>import("../components/OverviewPage/index.esm.js").then(e=>t(o.createElement(e.FixedGroupOverviewPage,null)))});export{d as entitySoundcheckCard,i as entitySoundcheckContent,l as groupSoundcheckContent};
1
+ import{convertLegacyRouteRef as n,compatWrapper as t}from"@backstage/core-compat-api";import{EntityContentBlueprint as a,EntityCardBlueprint as r}from"@backstage/plugin-catalog-react/alpha";import o from"react";import{entityRootRouteRef as c,groupRootRouteRef as u}from"../routes.esm.js";const i=a.make({name:"entity",params:{defaultPath:"soundcheck",defaultTitle:"Soundcheck",routeRef:n(c),loader:()=>import("../components/EntitySoundcheckContent.esm.js").then(e=>t(o.createElement(e.EntitySoundcheckContent,null)))}}),m=r.make({name:"card",params:{loader:()=>import("../components/EntitySoundcheckCard/index.esm.js").then(e=>t(o.createElement(e.EntitySoundcheckCard,null)))}}),d=a.make({name:"group",attachTo:{id:"page:catalog/group-details",input:"contents"},params:{defaultPath:"soundcheck",defaultTitle:"Soundcheck",routeRef:n(u),loader:()=>import("../components/OverviewPage/index.esm.js").then(e=>t(o.createElement(e.FixedGroupOverviewPage,null)))}});export{m as entitySoundcheckCard,i as entitySoundcheckContent,d as groupSoundcheckContent};
2
2
  //# sourceMappingURL=entity-content.esm.js.map
@@ -1,2 +1,2 @@
1
- import{convertLegacyRouteRef as o,compatWrapper as t}from"@backstage/core-compat-api";import{createPageExtension as r}from"@backstage/frontend-plugin-api";import a from"react";import{rootRouteRef as n,overviewRouteRef as c}from"../routes.esm.js";const u=r({name:"SoundcheckRoutingPage",namespace:"soundcheck",routeRef:o(n),defaultPath:"/soundcheck",loader:()=>import("../components/RoutingPage/index.esm.js").then(e=>t(a.createElement(e.RoutingPage,null)))}),m=r({name:"overview",namespace:"soundcheck",routeRef:o(c),defaultPath:"/soundcheck",loader:()=>import("../components/OverviewPage/index.esm.js").then(e=>t(a.createElement(e.OverviewPage,null)))});export{m as soundcheckOverviewPage,u as soundcheckRoutingPage};
1
+ import{convertLegacyRouteRef as o,compatWrapper as t}from"@backstage/core-compat-api";import{PageBlueprint as r}from"@backstage/frontend-plugin-api";import a from"react";import{rootRouteRef as m}from"../routes.esm.js";const n=r.make({name:"SoundcheckRoutingPage",params:{routeRef:o(m),defaultPath:"/soundcheck",loader:()=>import("../components/RoutingPage/index.esm.js").then(e=>t(a.createElement(e.RoutingPage,null)))}}),u=r.make({name:"overview",params:{routeRef:o(m),defaultPath:"/soundcheck",loader:()=>import("../components/OverviewPage/index.esm.js").then(e=>t(a.createElement(e.OverviewPage,null)))}});export{u as soundcheckOverviewPage,n as soundcheckRoutingPage};
2
2
  //# sourceMappingURL=pages.esm.js.map
@@ -1,2 +1,2 @@
1
- import{createPlugin as e}from"@backstage/frontend-plugin-api";import{soundcheckApi as o}from"./apis.esm.js";import{entitySoundcheckContent as n,entitySoundcheckCard as t,groupSoundcheckContent as c}from"./entity-content.esm.js";import{soundcheckRoutingPage as r,soundcheckOverviewPage as i}from"./pages.esm.js";import{soundcheckSidebarItem as u}from"./sidebar-item.esm.js";var d=e({id:"soundcheck",extensions:[r,i,o,n,t,c,u]});export{d as default};
1
+ import{createFrontendPlugin as e}from"@backstage/frontend-plugin-api";import{soundcheckApi as o}from"./apis.esm.js";import{entitySoundcheckContent as n,entitySoundcheckCard as t,groupSoundcheckContent as r}from"./entity-content.esm.js";import{soundcheckRoutingPage as c,soundcheckOverviewPage as i}from"./pages.esm.js";import{soundcheckSidebarItem as d}from"./sidebar-item.esm.js";var u=e({id:"soundcheck",extensions:[c,i,o,n,t,r,d]});export{u as default};
2
2
  //# sourceMappingURL=plugin.esm.js.map
@@ -1,2 +1,2 @@
1
- import{convertLegacyRouteRef as o}from"@backstage/core-compat-api";import{createNavItemExtension as e}from"@backstage/frontend-plugin-api";import t from"@material-ui/icons/DoneAll";import{rootRouteRef as r}from"../routes.esm.js";const m=e({title:"Soundcheck",icon:t,routeRef:o(r)});export{m as soundcheckSidebarItem};
1
+ import{convertLegacyRouteRef as o}from"@backstage/core-compat-api";import{NavItemBlueprint as e}from"@backstage/frontend-plugin-api";import t from"@material-ui/icons/DoneAll";import{rootRouteRef as r}from"../routes.esm.js";const m=e.make({params:{title:"Soundcheck",icon:t,routeRef:o(r)}});export{m as soundcheckSidebarItem};
2
2
  //# sourceMappingURL=sidebar-item.esm.js.map
package/dist/alpha.d.ts CHANGED
@@ -1,10 +1,130 @@
1
+ /// <reference types="react" />
2
+ import * as _backstage_catalog_model from '@backstage/catalog-model';
3
+ import * as react from 'react';
1
4
  import * as _backstage_frontend_plugin_api from '@backstage/frontend-plugin-api';
5
+ import * as _backstage_core_plugin_api from '@backstage/core-plugin-api';
2
6
 
3
7
  /**
4
8
  * @public
5
9
  **
6
10
  * The Soundcheck plugin for use within Backstage´s new frontend system
7
11
  */
8
- declare const _default: _backstage_frontend_plugin_api.BackstagePlugin<{}, {}>;
12
+ declare const _default: _backstage_frontend_plugin_api.FrontendPlugin<{}, {}, {
13
+ "api:soundcheck": _backstage_frontend_plugin_api.ExtensionDefinition<{
14
+ kind: "api";
15
+ namespace: undefined;
16
+ name: undefined;
17
+ config: {};
18
+ configInput: {};
19
+ output: _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<_backstage_core_plugin_api.AnyApiFactory, "core.api.factory", {}>;
20
+ inputs: {};
21
+ }>;
22
+ "entity-content:soundcheck/entity": _backstage_frontend_plugin_api.ExtensionDefinition<{
23
+ kind: "entity-content";
24
+ namespace: undefined;
25
+ name: "entity";
26
+ config: {
27
+ path: string | undefined;
28
+ title: string | undefined;
29
+ filter: string | undefined;
30
+ };
31
+ configInput: {
32
+ filter?: string | undefined;
33
+ title?: string | undefined;
34
+ path?: string | undefined;
35
+ };
36
+ output: _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<react.JSX.Element, "core.reactElement", {}> | _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<string, "core.routing.path", {}> | _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<_backstage_frontend_plugin_api.RouteRef<_backstage_frontend_plugin_api.AnyRouteRefParams>, "core.routing.ref", {
37
+ optional: true;
38
+ }> | _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<string, "catalog.entity-content-title", {}> | _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<(entity: _backstage_catalog_model.Entity) => boolean, "catalog.entity-filter-function", {
39
+ optional: true;
40
+ }> | _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<string, "catalog.entity-filter-expression", {
41
+ optional: true;
42
+ }>;
43
+ inputs: {};
44
+ }>;
45
+ "nav-item:soundcheck": _backstage_frontend_plugin_api.ExtensionDefinition<{
46
+ kind: "nav-item";
47
+ namespace: undefined;
48
+ name: undefined;
49
+ config: {};
50
+ configInput: {};
51
+ output: _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<{
52
+ title: string;
53
+ icon: _backstage_core_plugin_api.IconComponent;
54
+ routeRef: _backstage_frontend_plugin_api.RouteRef<undefined>;
55
+ }, "core.nav-item.target", {}>;
56
+ inputs: {};
57
+ }>;
58
+ "entity-card:soundcheck/card": _backstage_frontend_plugin_api.ExtensionDefinition<{
59
+ kind: "entity-card";
60
+ namespace: undefined;
61
+ name: "card";
62
+ config: {
63
+ filter: string | undefined;
64
+ };
65
+ configInput: {
66
+ filter?: string | undefined;
67
+ };
68
+ output: _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<react.JSX.Element, "core.reactElement", {}> | _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<(entity: _backstage_catalog_model.Entity) => boolean, "catalog.entity-filter-function", {
69
+ optional: true;
70
+ }> | _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<string, "catalog.entity-filter-expression", {
71
+ optional: true;
72
+ }>;
73
+ inputs: {};
74
+ }>;
75
+ "entity-content:soundcheck/group": _backstage_frontend_plugin_api.ExtensionDefinition<{
76
+ kind: "entity-content";
77
+ namespace: undefined;
78
+ name: "group";
79
+ config: {
80
+ path: string | undefined;
81
+ title: string | undefined;
82
+ filter: string | undefined;
83
+ };
84
+ configInput: {
85
+ filter?: string | undefined;
86
+ title?: string | undefined;
87
+ path?: string | undefined;
88
+ };
89
+ output: _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<react.JSX.Element, "core.reactElement", {}> | _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<string, "core.routing.path", {}> | _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<_backstage_frontend_plugin_api.RouteRef<_backstage_frontend_plugin_api.AnyRouteRefParams>, "core.routing.ref", {
90
+ optional: true;
91
+ }> | _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<string, "catalog.entity-content-title", {}> | _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<(entity: _backstage_catalog_model.Entity) => boolean, "catalog.entity-filter-function", {
92
+ optional: true;
93
+ }> | _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<string, "catalog.entity-filter-expression", {
94
+ optional: true;
95
+ }>;
96
+ inputs: {};
97
+ }>;
98
+ "page:soundcheck/SoundcheckRoutingPage": _backstage_frontend_plugin_api.ExtensionDefinition<{
99
+ kind: "page";
100
+ namespace: undefined;
101
+ name: "SoundcheckRoutingPage";
102
+ config: {
103
+ path: string | undefined;
104
+ };
105
+ configInput: {
106
+ path?: string | undefined;
107
+ };
108
+ output: _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<react.JSX.Element, "core.reactElement", {}> | _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<string, "core.routing.path", {}> | _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<_backstage_frontend_plugin_api.RouteRef<_backstage_frontend_plugin_api.AnyRouteRefParams>, "core.routing.ref", {
109
+ optional: true;
110
+ }>;
111
+ inputs: {};
112
+ }>;
113
+ "page:soundcheck/overview": _backstage_frontend_plugin_api.ExtensionDefinition<{
114
+ kind: "page";
115
+ namespace: undefined;
116
+ name: "overview";
117
+ config: {
118
+ path: string | undefined;
119
+ };
120
+ configInput: {
121
+ path?: string | undefined;
122
+ };
123
+ output: _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<react.JSX.Element, "core.reactElement", {}> | _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<string, "core.routing.path", {}> | _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<_backstage_frontend_plugin_api.RouteRef<_backstage_frontend_plugin_api.AnyRouteRefParams>, "core.routing.ref", {
124
+ optional: true;
125
+ }>;
126
+ inputs: {};
127
+ }>;
128
+ }>;
9
129
 
10
130
  export { _default as default };
package/dist/api.esm.js CHANGED
@@ -1,2 +1,2 @@
1
- import{createApiRef as i}from"@backstage/core-plugin-api";import{GraphQLClient as c}from"graphql-request";import{getSdk as h}from"./graphql/generated/index.esm.js";const o=i({id:"plugin.soundcheck"}),u=r=>"response"in r&&"errors"in r.response,g=r=>"response"in r&&"message"in r.response;class y{#a;#s;#t;constructor(t){this.#a=t.fetchApi,this.#s=t.discoveryApi;const e=new c("/graphql",{fetch:async(a,s)=>{const n=`${await this.#s.getBaseUrl("soundcheck")}${a}`;return this.#a.fetch(n,s)}});this.#t=h(e)}#r=t=>u(t)?t.response?.errors?.[0].message??`${t}`:g(t)?t.response.message:`${t}`;#e=async t=>{try{return await t()}catch(e){throw new Error(`Error from Soundcheck backend: ${this.#r(e)}`)}};async getAllCertifications(t){return this.#e(async()=>{const{certifications:e}=await this.#t.getAllCertifications({entityRef:t});return e})}async getCertificationDetails(t){return this.#e(async()=>{const{certifications:e}=await this.#t.getCertificationDetails({entityRef:t});return e})}async getCertificationDetailsForTrack(t,e){return this.#e(async()=>{const{programCertification:a}=await this.#t.getCertificationDetailsForTrack({entityRef:t,programId:e});return a})}async getCheckResultDetails(t,e,a){return this.#e(async()=>{const{checkResult:s}=await this.#t.getCheckResultDetails({entityRef:t,programId:e,checkId:a});return s})}async getFacetsForOwner(t){return this.#e(async()=>{const{facetsForOwner:e}=await this.#t.getFacetsForOwner({ownerEntityRef:t});return e})}async getProgramOverviewForOwner(t,e,a,s){return this.#e(async()=>{const{programOverviewForOwner:n}=await this.#t.getProgramOverviewForOwner({ownerEntityRef:t,facet:e,first:a,after:s});return n})}async getTracks(t){return this.#e(async()=>{const{programs:e}=await this.#t.getTracks({filter:t});return e})}async createProgram(t){return this.#e(async()=>{const{program:e}=await this.#t.createProgram({input:t});return e})}async updateProgram(t){return this.#e(async()=>{const{program:e}=await this.#t.updateProgram({input:t});return e})}async deleteProgram(t){return this.#e(async()=>{const{programDeleted:e}=await this.#t.deleteProgram({programId:t});return e})}async getPlaylists(t){return this.#e(async()=>{const{playlists:e}=await this.#t.getPlaylists({entityRef:t});return e})}async getOperators(){return this.#e(async()=>{const{operators:t}=await this.#t.getOperators();return t})}async getChecks(t){return this.#e(async()=>{const{checkers:e}=await this.#t.getCheckers({filter:t});return e})}async createCheck(t){return this.#e(async()=>{const{check:e}=await this.#t.createCheck({input:t});return e})}async updateCheck(t){return this.#e(async()=>{const{check:e}=await this.#t.updateCheck({input:t});return e})}async deleteCheck(t){return this.#e(async()=>await this.#t.deleteChecker({checkerId:t}))}async executeCheck(t){return this.#e(async()=>{const{result:e}=await this.#t.executeCheck({input:t});return e})}async getCollectors(t){return this.#e(async()=>{const{collectors:e}=await this.#t.getCollectors({ids:t});return e})}async getFactSchema(t,e){if(!(!t||!e))return this.#e(async()=>{const{factSchema:a}=await this.#t.getFactSchemas({collectorId:t,factName:e});return a})}async updateCollectorConfig(t){return this.#e(async()=>{const{collector:e}=await this.#t.updateCollectorConfig({input:t});return e})}async getOverallCheckPassRates(t){return this.#e(async()=>await this.#t.getOverallCheckPassRates({filter:t}))}async getIndividualCheckPassRates(t){return this.#e(async()=>await this.#t.getIndividualCheckPassRates({filter:t}))}async getOverallTrackPassRate(t){return this.#e(async()=>await this.#t.getOverallTrackPassRate({filter:t}))}async getIndividualTrackPassRate(t){return this.#e(async()=>await this.#t.getIndividualTrackPassRate({filter:t}))}async getOverallEntityPassRates(t){return this.#e(async()=>await this.#t.getOverallEntityPassRates({filter:t}))}async getIndividualEntityPassRates(t){return this.#e(async()=>await this.#t.getIndividualEntityPassRates({input:t}))}async getOverallGroupPassRates(t){return this.#e(async()=>await this.#t.getOverallGroupPassRates({input:t}))}async getIndividualGroupPassRates(t){return this.#e(async()=>await this.#t.getIndividualGroupPassRates({input:t}))}async getEntityRefsForTechHealthFilter(t){return this.#e(async()=>await this.#t.getEntityRefsForTechHealthFilter({ownerEntityRef:t}))}async getTrackEntities(t){return this.#e(async()=>await this.#t.getTrackEntities({input:t}))}async getCampaigns(t){return this.#e(async()=>{const{campaigns:e}=await this.#t.getCampaigns({filter:t});return e})}async createCampaign(t){return this.#e(async()=>{const{campaign:e}=await this.#t.createCampaign({input:t});return e})}async updateCampaign(t){return this.#e(async()=>{const{campaign:e}=await this.#t.updateCampaign({input:t});return e})}async deleteCampaign(t){return this.#e(async()=>{const{campaignDeleted:e}=await this.#t.deleteCampaign({campaignId:t});return e})}async archiveCampaign(t){return this.#e(async()=>{const{campaignArchived:e}=await this.#t.archiveCampaign({campaignId:t});return e})}async getCampaignProgress(t,e,a){return this.#e(async()=>{const{campaignProgress:s}=await this.#t.getCampaignProgress({id:t,first:e,after:a});return s})}async getCampaignOwners(){return this.#e(async()=>{const{campaignOwners:t}=await this.#t.getCampaignOwners();return t})}async getCheckOwners(){return this.#e(async()=>{const{checkOwners:t}=await this.#t.getCheckOwners();return t})}async getTrackOwners(){return this.#e(async()=>{const{trackOwners:t}=await this.#t.getTrackOwners();return t})}async getCertificationStatus(t){return this.#e(async()=>this.#t.getCertificationStatus({input:t}))}async getCertificationStatusHistory(t){return this.#e(async()=>this.#t.getCertificationStatusHistory({input:t}))}async getCheckStatus(t){return this.#e(async()=>(await this.#t.getCheckStatus({input:t})).checkStatus)}async getCheckStatusHistory(t){return this.#e(async()=>(await this.#t.getCheckStatusHistory({input:t})).checkStatusHistory)}async getCheckEntities(t){return this.#e(async()=>await this.#t.getCheckEntities({input:t}))}}export{y as SoundcheckApi,o as soundcheckApiRef};
1
+ import{createApiRef as c}from"@backstage/core-plugin-api";import{GraphQLClient as h}from"graphql-request";import{getSdk as o}from"./graphql/generated/index.esm.js";const u=c({id:"plugin.soundcheck"}),g=r=>"response"in r&&"errors"in r.response,y=r=>"response"in r&&"message"in r.response;class l{#a;#s;#t;constructor(t){this.#a=t.fetchApi,this.#s=t.discoveryApi;const e=new h("/graphql",{fetch:async(a,s)=>{const n=`${await this.#s.getBaseUrl("soundcheck")}${a}`;return this.#a.fetch(n,s)}});this.#t=o(e)}#r=t=>g(t)?t.response?.errors?.[0].message??`${t}`:y(t)?t.response.message:`${t}`;#e=async t=>{try{return await t()}catch(e){throw new Error(`Error from Soundcheck backend: ${this.#r(e)}`)}};async getAllCertifications(t){return this.#e(async()=>{const{certifications:e}=await this.#t.getAllCertifications({entityRef:t});return e})}async getCertificationDetails(t){return this.#e(async()=>{const{certifications:e}=await this.#t.getCertificationDetails({entityRef:t});return e})}async getCertificationDetailsForTrack(t,e){return this.#e(async()=>{const{programCertification:a}=await this.#t.getCertificationDetailsForTrack({entityRef:t,programId:e});return a})}async getCheckResultDetails(t,e,a){return this.#e(async()=>{const{checkResult:s}=await this.#t.getCheckResultDetails({entityRef:t,programId:e,checkId:a});return s})}async getFacetsForOwner(t){return this.#e(async()=>{const{facetsForOwner:e}=await this.#t.getFacetsForOwner({ownerEntityRef:t});return e})}async getProgramOverviewForOwner(t,e,a,s,n){return this.#e(async()=>{const{programOverviewForOwner:i}=await this.#t.getProgramOverviewForOwner({ownerEntityRef:t,facet:e,first:a,after:s,entitySearch:n});return i})}async getTracks(t){return this.#e(async()=>{const{programs:e}=await this.#t.getTracks({filter:t});return e})}async createProgram(t){return this.#e(async()=>{const{program:e}=await this.#t.createProgram({input:t});return e})}async updateProgram(t){return this.#e(async()=>{const{program:e}=await this.#t.updateProgram({input:t});return e})}async deleteProgram(t){return this.#e(async()=>{const{programDeleted:e}=await this.#t.deleteProgram({programId:t});return e})}async getPlaylists(t){return this.#e(async()=>{const{playlists:e}=await this.#t.getPlaylists({entityRef:t});return e})}async getOperators(){return this.#e(async()=>{const{operators:t}=await this.#t.getOperators();return t})}async getChecks(t){return this.#e(async()=>{const{checkers:e}=await this.#t.getCheckers({filter:t});return e})}async createCheck(t){return this.#e(async()=>{const{check:e}=await this.#t.createCheck({input:t});return e})}async updateCheck(t){return this.#e(async()=>{const{check:e}=await this.#t.updateCheck({input:t});return e})}async deleteCheck(t){return this.#e(async()=>await this.#t.deleteChecker({checkerId:t}))}async executeCheck(t){return this.#e(async()=>{const{result:e}=await this.#t.executeCheck({input:t});return e})}async getCollectors(t){return this.#e(async()=>{const{collectors:e}=await this.#t.getCollectors({ids:t});return e})}async getFactSchema(t,e){if(!(!t||!e))return this.#e(async()=>{const{factSchema:a}=await this.#t.getFactSchemas({collectorId:t,factName:e});return a})}async updateCollectorConfig(t){return this.#e(async()=>{const{collector:e}=await this.#t.updateCollectorConfig({input:t});return e})}async getOverallCheckPassRates(t){return this.#e(async()=>await this.#t.getOverallCheckPassRates({filter:t}))}async getIndividualCheckPassRates(t){return this.#e(async()=>await this.#t.getIndividualCheckPassRates({filter:t}))}async getOverallTrackPassRate(t){return this.#e(async()=>await this.#t.getOverallTrackPassRate({filter:t}))}async getIndividualTrackPassRate(t){return this.#e(async()=>await this.#t.getIndividualTrackPassRate({filter:t}))}async getOverallEntityPassRates(t){return this.#e(async()=>await this.#t.getOverallEntityPassRates({filter:t}))}async getIndividualEntityPassRates(t){return this.#e(async()=>await this.#t.getIndividualEntityPassRates({input:t}))}async getOverallGroupPassRates(t){return this.#e(async()=>await this.#t.getOverallGroupPassRates({input:t}))}async getIndividualGroupPassRates(t){return this.#e(async()=>await this.#t.getIndividualGroupPassRates({input:t}))}async getEntityRefsForTechHealthFilter(t){return this.#e(async()=>await this.#t.getEntityRefsForTechHealthFilter({ownerEntityRef:t}))}async getTrackEntities(t){return this.#e(async()=>await this.#t.getTrackEntities({input:t}))}async getCampaigns(t){return this.#e(async()=>{const{campaigns:e}=await this.#t.getCampaigns({filter:t});return e})}async createCampaign(t){return this.#e(async()=>{const{campaign:e}=await this.#t.createCampaign({input:t});return e})}async updateCampaign(t){return this.#e(async()=>{const{campaign:e}=await this.#t.updateCampaign({input:t});return e})}async deleteCampaign(t){return this.#e(async()=>{const{campaignDeleted:e}=await this.#t.deleteCampaign({campaignId:t});return e})}async archiveCampaign(t){return this.#e(async()=>{const{campaignArchived:e}=await this.#t.archiveCampaign({campaignId:t});return e})}async getCampaignProgress(t,e,a){return this.#e(async()=>{const{campaignProgress:s}=await this.#t.getCampaignProgress({id:t,first:e,after:a});return s})}async getCampaignOwners(){return this.#e(async()=>{const{campaignOwners:t}=await this.#t.getCampaignOwners();return t})}async getCheckOwners(){return this.#e(async()=>{const{checkOwners:t}=await this.#t.getCheckOwners();return t})}async getTrackOwners(){return this.#e(async()=>{const{trackOwners:t}=await this.#t.getTrackOwners();return t})}async getCertificationStatus(t){return this.#e(async()=>this.#t.getCertificationStatus({input:t}))}async getCertificationStatusHistory(t){return this.#e(async()=>this.#t.getCertificationStatusHistory({input:t}))}async getCheckStatus(t){return this.#e(async()=>(await this.#t.getCheckStatus({input:t})).checkStatus)}async getCheckStatusHistory(t){return this.#e(async()=>(await this.#t.getCheckStatusHistory({input:t})).checkStatusHistory)}async getCheckEntities(t){return this.#e(async()=>await this.#t.getCheckEntities({input:t}))}async getPathResolvers(){return this.#e(async()=>{const{pathResolvers:t}=await this.#t.getPathResolvers();return t})}async getCheckTemplates(){return this.#e(async()=>{const{checkerTemplates:t}=await this.#t.getCheckTemplates();return t})}async getFact(t){return this.#e(async()=>{const{fact:e}=await this.#t.getFact(t);return e})}}export{l as SoundcheckApi,u as soundcheckApiRef};
2
2
  //# sourceMappingURL=api.esm.js.map
@@ -1,2 +1,2 @@
1
- import{makeStyles as a}from"@material-ui/core";import l from"classnames";import n from"react";const o=24,m=11,t=e=>e==="small"?1:2,p=a({root:{position:"relative",display:"inline-flex",alignItems:"center",justifyContent:"center",borderRadius:"50%",borderWidth:"2px",fontWeight:700,width:({size:e})=>`${o*t(e)}px`,height:({size:e})=>`${o*t(e)}px`,fontSize:({size:e})=>`${m*t(e)}px`}}),c=({className:e,label:i,size:s="small"})=>{const r=p({size:s});return n.createElement("span",{className:l(e,r.root),role:"img","aria-label":`${i} badge`},i)};export{c as BaseBadge};
1
+ import{makeStyles as m,Box as p,Tooltip as c}from"@material-ui/core";import d from"classnames";import l from"react";const a=24,f=11,t=e=>e==="small"?1:2,g=m({root:{position:"relative",display:"inline-flex",alignItems:"center",justifyContent:"center",borderRadius:"50%",borderWidth:"2px",fontWeight:700,cursor:"default",width:({size:e})=>`${a*t(e)}px`,height:({size:e})=>`${a*t(e)}px`,fontSize:({size:e})=>`${f*t(e)}px`}}),x=({className:e,label:i,tooltip:o,size:s="small"})=>{const n=g({size:s}),r=l.createElement(p,{className:d(e,n.root),role:"img","aria-label":`${i} badge`},i);return o?l.createElement(c,{title:o},r):r};export{x as BaseBadge};
2
2
  //# sourceMappingURL=BaseBadge.esm.js.map
@@ -1,2 +1,2 @@
1
- import{makeStyles as t}from"@material-ui/core";import m from"classnames";import a from"react";import{BaseBadge as l}from"./BaseBadge.esm.js";const s=t({root:{borderColor:"currentColor",borderStyle:"solid"}}),i=({className:o,size:r="small"})=>{const e=s();return a.createElement(l,{className:m(o,e.root),size:r,label:"C"})};export{i as CampaignBadge};
1
+ import{makeStyles as t}from"@material-ui/core";import m from"classnames";import a from"react";import{BaseBadge as s}from"./BaseBadge.esm.js";const l=t({root:{borderColor:"currentColor",borderStyle:"solid"}}),i=({className:o,size:r="small"})=>{const e=l();return a.createElement(s,{className:m(o,e.root),size:r,label:"C"})};export{i as CampaignBadge};
2
2
  //# sourceMappingURL=CampaignBadge.esm.js.map
@@ -1,2 +1,2 @@
1
- import t from"react";import{CampaignBadge as c}from"./CampaignBadge.esm.js";import{LevelBadge as l}from"./LevelBadge.esm.js";import{NoLevelBadge as o}from"./NoLevelBadge.esm.js";const n=({badge:r,className:s,size:e="small",trackType:i})=>{const a=s||"";let m=t.createElement(o,{className:a,size:e});return i==="campaign"?m=t.createElement(c,{className:a,size:e}):r&&(m=t.createElement(l,{className:a,size:e,badge:r})),m};export{n as CertificationBadge};
1
+ import t from"react";import{CampaignBadge as l}from"./CampaignBadge.esm.js";import{LevelBadge as c}from"./LevelBadge.esm.js";import{NoLevelBadge as p}from"./NoLevelBadge.esm.js";const n=({badge:m,className:s,size:e="small",trackType:i,showTooltip:r})=>{const a=s||"";let o=t.createElement(p,{className:a,size:e,showTooltip:r});return i==="campaign"?o=t.createElement(l,{className:a,size:e}):m&&(o=t.createElement(c,{className:a,size:e,badge:m})),o};export{n as CertificationBadge};
2
2
  //# sourceMappingURL=CertificationBadge.esm.js.map
@@ -1,2 +1,6 @@
1
- import{makeStyles as t}from"@material-ui/core";import m from"classnames";import l from"react";import{BaseBadge as s}from"./BaseBadge.esm.js";const a=t({root:{borderColor:"currentColor",borderStyle:"dashed"}}),c=({className:e,size:o="small"})=>{const r=a();return l.createElement(s,{className:m(e,r.root),size:o,label:"NL"})};export{c as NoLevelBadge};
1
+ import{MarkdownContent as a}from"@backstage/core-components";import{makeStyles as s}from"@material-ui/core";import i from"classnames";import t from"react";import{BaseBadge as m}from"./BaseBadge.esm.js";const n=`
2
+ **No Level / Not Certified**
3
+
4
+ Pass all checks within a level to earn a certification badge.
5
+ `,d=s(e=>({root:{borderColor:e.palette.text.disabled,borderStyle:"dashed",color:e.palette.text.disabled}})),c=({className:e,showTooltip:o,size:l="small"})=>{const r=d();return t.createElement(m,{className:i(e,r.root),size:l,label:"NL",tooltip:o?t.createElement(a,{content:n}):null})};export{c as NoLevelBadge};
2
6
  //# sourceMappingURL=NoLevelBadge.esm.js.map
@@ -1,2 +1,2 @@
1
- import{makeStyles as t}from"@material-ui/core";import l from"classnames";import s from"react";import{BaseBadge as m}from"./BaseBadge.esm.js";const a=t({root:{borderColor:"currentColor",borderStyle:"solid"}}),i=({className:o,size:r="small"})=>{const e=a();return s.createElement(m,{className:l(o,e.root),size:r,label:"\u25BA"})};export{i as PlaylistBadge};
1
+ import{makeStyles as t}from"@material-ui/core";import s from"classnames";import l from"react";import{BaseBadge as m}from"./BaseBadge.esm.js";const a=t({root:{borderColor:"currentColor",borderStyle:"solid"}}),i=({className:o,size:r="small"})=>{const e=a();return l.createElement(m,{className:s(o,e.root),size:r,label:"\u25BA"})};export{i as PlaylistBadge};
2
2
  //# sourceMappingURL=PlaylistBadge.esm.js.map
@@ -0,0 +1,2 @@
1
+ import t,{useEffect as s}from"react";import"../../contexts/TrackFormContext.esm.js";import"../../contexts/CheckFormContext.esm.js";import{CampaignFormProvider as r,useCampaignFormContext as c}from"../../contexts/CampaignFormContext.esm.js";import"../../contexts/UserProvider.esm.js";import"@backstage/catalog-model";import"@backstage/core-plugin-api";import"@tanstack/react-query";import"../../api.esm.js";import"../../hooks/graphqlKeys.esm.js";import"@backstage/plugin-catalog-react";import{useCreateCampaign as g}from"../../hooks/campaigns/useCreateCampaign.esm.js";import"../../hooks/useSoundcheckAlert.esm.js";import"../../hooks/useConfirmationModal.esm.js";import{useNavigateBack as u}from"../../hooks/useNavigateBack.esm.js";import{campaignsPageRouteRef as l}from"../../routes.esm.js";import{CampaignForm as f}from"../CampaignForm/CampaignForm.esm.js";import"../SoundcheckHeader/SoundcheckHeader.esm.js";import"../SoundcheckHeader/SoundcheckHeaderContext.esm.js";import{useHeader as C}from"../SoundcheckHeader/useHeader.esm.js";const d=()=>{const{setIsLoading:e}=c(),{mutateAsync:m,isLoading:o}=g();s(()=>{e(o)},[e,o]);const[a,i]=u(l),n=async p=>{await m(p,{onSuccess:i})};return C({title:"Create a Campaign",description:"Create, monitor, and manage software updates or system transitions.",docLink:"https://backstage.spotify.com/docs/plugins/soundcheck/core-concepts/campaigns"}),t.createElement(r,null,t.createElement(f,{onSave:n,onCancel:a}))},E=()=>t.createElement(r,null,t.createElement(d,null));export{E as CampaignCreatePage};
2
+ //# sourceMappingURL=CampaignCreatePage.esm.js.map
@@ -1,2 +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};
1
+ import{Typography as i}from"@material-ui/core";import{makeStyles as n}from"@material-ui/core/styles";import e from"react";import{DraggableChip as c}from"../DraggableChip/DraggableChip.esm.js";const l=n(t=>({sectionLabel:{marginBottom:t.spacing(2)},chipContainer:{display:"flex",flexDirection:"column",fontWeight:"bold",fontSize:t.typography.pxToRem(16),color:t.palette.grey[600],"& .Mui-disabled":{opacity:1}}})),m=({campaign:t})=>{const a=l(),o=t.track?.levels?.[0].checks??[];return e.createElement(e.Fragment,null,e.createElement(i,{color:"textPrimary",variant:"h5",className:a.sectionLabel},"Campaign Checks"),e.createElement("div",{className:a.chipContainer},o.length?o.map(r=>e.createElement(c,{key:r.id,chip:r,disabled:!0})):e.createElement(i,{variant:"body1",color:"textSecondary",style:{alignSelf:"center"}},"There are no checks for this campaign.")))};export{m as CampaignChecks};
2
2
  //# sourceMappingURL=CampaignChecks.esm.js.map
@@ -1,2 +1,2 @@
1
- import{Grid as r,Typography as l}from"@material-ui/core";import{makeStyles as o}from"@material-ui/core/styles";import a from"react";const n=o(e=>({detailRow:{marginBottom:e.spacing(1)},label:{fontWeight:"bold",color:e.palette.text.primary},value:{marginLeft:e.spacing(1)}})),m=({label:e,value:i})=>{const t=n();return a.createElement(r,{item:!0,xs:12,container:!0,className:t.detailRow,alignItems:"center"},a.createElement(l,{variant:"subtitle1",className:t.label},e,":"),a.createElement(l,{variant:"body1",display:"inline",className:t.value},i))};export{m as CampaignDetailRow};
1
+ import{Grid as o,Typography as l}from"@material-ui/core";import{makeStyles as r}from"@material-ui/core/styles";import a from"react";const m=r(e=>({detailRow:{marginBottom:e.spacing(1),"&:last-child":{marginBottom:0}},label:{fontWeight:"bold",color:e.palette.text.primary},value:{marginLeft:e.spacing(1)}})),n=({label:e,value:i})=>{const t=m();return a.createElement(o,{item:!0,xs:12,container:!0,className:t.detailRow,alignItems:"center"},a.createElement(l,{variant:"subtitle2",className:t.label},e,":"),a.createElement(l,{variant:"body2",display:"inline",className:t.value},i))};export{n as CampaignDetailRow};
2
2
  //# sourceMappingURL=CampaignDetailRow.esm.js.map
@@ -1,2 +1,2 @@
1
- import{EntityRefLink as g}from"@backstage/plugin-catalog-react";import{Typography as u,Grid as i}from"@material-ui/core";import{makeStyles as E}from"@material-ui/core/styles";import e from"react";import{CampaignDetailRow as a}from"./CampaignDetailRow.esm.js";const d=E(t=>({innerContainer:{padding:t.spacing(0,1)},sectionLabel:{margin:t.spacing(2,0)},ownerLink:{"& span":{"&:hover":{textDecoration:"underline"}}}})),r=t=>new Date(t).toLocaleDateString("en-US",{month:"long",day:"numeric",year:"numeric"}),D=({campaign:t})=>{const n=d(),{name:o,description:m,ownerEntityRef:c,startDate:p,targetCompletionDate:s,supportChannel:l}=t;return e.createElement(e.Fragment,null,e.createElement(u,{color:"textPrimary",variant:"h5",className:n.sectionLabel},"Campaign Details"),e.createElement(i,{container:!0,className:n.innerContainer,spacing:2},e.createElement(i,{item:!0,container:!0,xs:12,spacing:0},e.createElement(a,{label:"Name",value:o}),e.createElement(a,{label:"Description",value:m}),e.createElement(a,{label:"Owner",value:e.createElement(g,{className:n.ownerLink,entityRef:c})}),l&&e.createElement(a,{label:"Support channel",value:l}),e.createElement(a,{label:"Start date",value:r(p)}),e.createElement(a,{label:"Target completion date",value:r(s)}))))};export{D as CampaignDetails,r as convertToReadableDate};
1
+ import{EntityRefLink as g}from"@backstage/plugin-catalog-react";import{Grid as l}from"@material-ui/core";import{makeStyles as u}from"@material-ui/core/styles";import e from"react";import{CampaignDetailRow as n}from"./CampaignDetailRow.esm.js";const E=u(t=>({innerContainer:{padding:t.spacing(0,1),fontSize:t.typography.body2.fontSize},sectionLabel:{marginBottom:t.spacing(1)},ownerLink:{"& span":{"&:hover":{textDecoration:"underline"}}}})),a=t=>new Date(t).toLocaleDateString("en-US",{month:"long",day:"numeric",year:"numeric"}),d=({campaign:t})=>{const r=E(),{name:i,description:m,ownerEntityRef:c,startDate:p,targetCompletionDate:s,supportChannel:o}=t;return e.createElement(e.Fragment,null,e.createElement(l,{container:!0,className:r.innerContainer,spacing:2},e.createElement(l,{item:!0,container:!0,xs:12,spacing:0},e.createElement(n,{label:"Name",value:i}),e.createElement(n,{label:"Description",value:m}),e.createElement(n,{label:"Owner",value:e.createElement(g,{className:r.ownerLink,entityRef:c})}),o&&e.createElement(n,{label:"Support channel",value:o}),e.createElement(n,{label:"Start date",value:a(p)}),e.createElement(n,{label:"Target completion date",value:a(s)}))))};export{d as CampaignDetails,a as convertToReadableDate};
2
2
  //# sourceMappingURL=CampaignDetails.esm.js.map
@@ -1,2 +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};
1
+ import{Grid as n,Paper as m}from"@material-ui/core";import{makeStyles as c}from"@material-ui/core/styles";import e from"react";import{DndProvider as p}from"react-dnd";import{HTML5Backend as s}from"react-dnd-html5-backend";import{useParams as l}from"react-router-dom";import{useGetCampaign as g}from"../../hooks/campaigns/useGetCampaign.esm.js";import{EmptyCampaignState as d}from"../CampaignsPage/CampaignEmptyState.esm.js";import"../SoundcheckHeader/SoundcheckHeader.esm.js";import"../SoundcheckHeader/SoundcheckHeaderContext.esm.js";import{useHeader as E}from"../SoundcheckHeader/useHeader.esm.js";import{Loading as f}from"../TechHealth/Loading/Loading.esm.js";import{CampaignChecks as S}from"./CampaignChecks.esm.js";import{CampaignDetails as u}from"./CampaignDetails.esm.js";import{CampaignMilestones as C}from"./CampaignMilestones.esm.js";import{CampaignProgress as x}from"./CampaignProgress.esm.js";const N=c(t=>({root:{flexGrow:1,padding:t.spacing(2)},progressSection:{minHeight:350,fontSize:t.typography.body1.fontSize},contentSection:{overflow:"auto",padding:t.spacing(2)}})),v=()=>{const t=N(),{campaignId:r}=l(),{data:i,isLoading:o}=g(r??""),a=i?.edges?.[0]?.node;return E({title:a?.name??"View Campaign",description:a?.description}),o?e.createElement("div",{"data-testid":"loading-indicator"},e.createElement(f,null)):a?e.createElement("div",null,e.createElement(p,{backend:s},e.createElement(n,{container:!0,className:t.root,spacing:2,direction:"column"},e.createElement(n,{item:!0,xs:12},e.createElement(m,{className:t.contentSection},e.createElement(u,{campaign:a}))),e.createElement(n,{item:!0,xs:6},e.createElement(m,{className:t.contentSection},e.createElement(S,{campaign:a}))),e.createElement(n,{item:!0,xs:12,className:t.progressSection},e.createElement(m,{className:t.contentSection},e.createElement(x,{campaign:a}))),e.createElement(n,{item:!0,xs:12},e.createElement(m,{className:t.contentSection},e.createElement(C,{campaign:a})))))):e.createElement(d,null)};export{v as CampaignDetailsPage};
2
2
  //# sourceMappingURL=CampaignDetailsPage.esm.js.map
@@ -1,2 +1,2 @@
1
- import{Typography as s,Grid as i,Divider as o}from"@material-ui/core";import{makeStyles as c}from"@material-ui/core/styles";import e from"react";import{CampaignDetailRow as l}from"./CampaignDetailRow.esm.js";const p=c(a=>({milestones:{flexGrow:1,padding:a.spacing(0,1)},sectionLabel:{margin:a.spacing(2,0)},divider:{margin:`${a.spacing(2)}px 0`}})),g=({campaign:a})=>{const t=p(),n=a.milestones;return e.createElement(e.Fragment,null,e.createElement(s,{variant:"h5",className:t.sectionLabel,color:"textPrimary"},"Campaign Milestones"),e.createElement(i,{container:!0,className:t.milestones,spacing:2},n.length?n.map((r,m)=>e.createElement(i,{item:!0,container:!0,xs:12,key:m,spacing:2},e.createElement(i,{item:!0,xs:12},e.createElement(l,{label:"Name",value:r.name}),e.createElement(l,{label:"Description",value:r.description}),e.createElement(l,{label:"Goal pass rate",value:`${r.targetPercent}%`}),m<n.length-1&&e.createElement(o,{className:t.divider})))):e.createElement(s,{variant:"body1",color:"textSecondary"},"There are no milestones for this campaign.")))};export{g as CampaignMilestones};
1
+ import{Typography as o,Grid as i,Divider as s}from"@material-ui/core";import{makeStyles as c}from"@material-ui/core/styles";import e from"react";import{CampaignDetailRow as l}from"./CampaignDetailRow.esm.js";const p=c(t=>({milestones:{flexGrow:1,padding:t.spacing(0,1)},sectionLabel:{marginBottom:t.spacing(2)},divider:{margin:`${t.spacing(2)}px 0`}})),g=({campaign:t})=>{const a=p(),n=t.milestones;return e.createElement(e.Fragment,null,e.createElement(o,{variant:"h5",className:a.sectionLabel,color:"textPrimary"},"Campaign Milestones"),e.createElement(i,{container:!0,className:a.milestones,spacing:2},n.length?n.map((r,m)=>e.createElement(i,{item:!0,container:!0,xs:12,key:m,spacing:2},e.createElement(i,{item:!0,xs:12},e.createElement(l,{label:"Name",value:r.name}),e.createElement(l,{label:"Description",value:r.description}),e.createElement(l,{label:"Goal pass rate",value:`${r.targetPercent}%`}),m<n.length-1&&e.createElement(s,{className:a.divider})))):e.createElement(o,{variant:"body1",color:"textSecondary"},"There are no milestones for this campaign.")))};export{g as CampaignMilestones};
2
2
  //# sourceMappingURL=CampaignMilestones.esm.js.map
@@ -1,2 +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};
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:{marginBottom:r.spacing(2)},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
2
  //# sourceMappingURL=CampaignProgress.esm.js.map
@@ -1,2 +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};
1
+ import{Content as k}from"@backstage/core-components";import{Typography as y}from"@material-ui/core";import e from"react";import{Controller as v}from"react-hook-form";import"../../contexts/TrackFormContext.esm.js";import"../../contexts/CheckFormContext.esm.js";import{useCampaignFormContext as F}from"../../contexts/CampaignFormContext.esm.js";import"../../contexts/UserProvider.esm.js";import L from"../../hooks/useFeatureFlag.esm.js";import{formStyles as M}from"../../utils/formStyles.esm.js";import"@spotify/backstage-plugin-soundcheck-common";import{emptyFilters as A}from"../Filter/types.esm.js";import{FilterComponent as D}from"../Filter/FilterComponent.esm.js";import{FormStepper as N}from"../FormStepper/FormStepper.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 d=(t=>(t.Details="Enter campaign details",t.Checks="Add checks",t.Entities="Choose the affected entities (Optional)",t.Milestones="Set campaign milestones",t))(d||{});const B=({onSave:t,onCancel:g,selectedCampaign:i})=>{const n=M(),{isLoading:o,isReadOnly:f}=F(),{control:r,handleSubmit:m,errors:a,trigger:C,getValues:S,onSubmit:s,checkChips:h,checksLoading:b}=O(t,i),l=S(),u=l.detailsStep.startDate;L("debugMode")&&console.log(l);const p=[{label:"Enter campaign details",content:()=>e.createElement(x,{control:r,isLoading:o,disabled:!1,errors:a.detailsStep,startDate:u})},{label:"Add checks",content:()=>e.createElement(T,{control:r,isLoading:o||b,disabled:!1,errors:a.tracksStep,checkChips:h})},{label:"Choose the affected entities (Optional)",content:()=>e.createElement("div",{className:n.filters},e.createElement(y,{variant:"body2"},V.filter.description),e.createElement(v,{name:"filtersStep",control:r,render:({field:c})=>e.createElement(D,{value:c.value??A(),onChange:c.onChange})}))},{label:"Set campaign milestones",content:()=>e.createElement(I,{control:r,isLoading:o,disabled:!1,errors:a.milestonesStep})}],E=i?[...Array(p.length).keys()]:[0];return e.createElement(e.Fragment,null,e.createElement(k,{className:n.formWrapper},e.createElement("form",{onSubmit:m(s)},e.createElement(N,{onClose:g,handleSubmit:m,trigger:C,onSubmit:s,initialVisited:E,stepNameMap:R,steps:p,isLoading:o,isReadOnly:f,saveButtonText:"Save Campaign"}))))};export{B as CampaignForm,d as CampaignStepLabel};
2
2
  //# sourceMappingURL=CampaignForm.esm.js.map
@@ -1,2 +1,2 @@
1
- import{makeStyles as s,Typography as n,TextField as p}from"@material-ui/core";import e from"react";import{Controller as c}from"react-hook-form";import{CAMPAIGN_FIELDS as d}from"../../utils/campaignFormUtils.esm.js";const g=s(t=>({helperText:{marginLeft:0},container:{marginBottom:t.spacing(2)}})),f=({control:t,errors:i,isLoading:a,disabled:l})=>{const o=g(),{description:r}=d.details;return e.createElement("div",{className:o.container},e.createElement(n,{variant:"subtitle2"},r.name),e.createElement(n,{variant:"caption"},r.description),e.createElement(c,{name:"detailsStep.description",control:t,defaultValue:"",render:({field:m})=>e.createElement(p,{...m,FormHelperTextProps:{className:o.helperText},variant:"outlined",multiline:!0,minRows:4,fullWidth:!0,placeholder:r.placeholder,disabled:a||l,type:"text",margin:"dense",error:!!i?.description,helperText:i?.description?.message})}))};export{f as CampaignDescriptionField};
1
+ import{makeStyles as m,Typography as s,TextField as p}from"@material-ui/core";import e from"react";import{Controller as d}from"react-hook-form";import{CAMPAIGN_FIELDS as c}from"../../utils/campaignFormUtils.esm.js";const g=m(t=>({helperText:{marginLeft:0},container:{marginBottom:t.spacing(2)}})),f=({control:t,errors:r,isLoading:n,disabled:a})=>{const i=g(),{description:o}=c.details;return e.createElement("div",{className:i.container},e.createElement(s,{variant:"subtitle2"},o.name),e.createElement(d,{name:"detailsStep.description",control:t,defaultValue:"",render:({field:l})=>e.createElement(p,{...l,FormHelperTextProps:{className:i.helperText},variant:"outlined",multiline:!0,minRows:4,fullWidth:!0,placeholder:o.placeholder,disabled:n||a,type:"text",margin:"dense",error:!!r?.description,helperText:r?.description?.message})}))};export{f as CampaignDescriptionField};
2
2
  //# sourceMappingURL=CampaignDescriptionField.esm.js.map
@@ -1,2 +1,2 @@
1
- import{makeStyles as p,Typography as l,TextField as s}from"@material-ui/core";import e from"react";import{Controller as c}from"react-hook-form";import{CAMPAIGN_FIELDS as d}from"../../utils/campaignFormUtils.esm.js";const g=p(r=>({helperText:{marginLeft:0},container:{marginBottom:r.spacing(2)}})),f=({control:r,errors:a,isLoading:o,disabled:i})=>{const n=g(),{name:t}=d.details;return e.createElement("div",{className:n.container},e.createElement(l,{variant:"subtitle2"},t.name),e.createElement(l,{variant:"caption"},t.description),e.createElement(c,{name:"detailsStep.name",control:r,defaultValue:"",render:({field:m})=>e.createElement(s,{...m,FormHelperTextProps:{className:n.helperText},variant:"outlined",fullWidth:!0,placeholder:t.placeholder,disabled:o||i,type:"text",margin:"dense",error:!!a?.name,helperText:a?.name?.message??t.helperText})}))};export{f as CampaignNameField};
1
+ import{makeStyles as i,Typography as s,TextField as p}from"@material-ui/core";import e from"react";import{Controller as d}from"react-hook-form";import{CAMPAIGN_FIELDS as c}from"../../utils/campaignFormUtils.esm.js";const g=i(t=>({helperText:{marginLeft:0},container:{marginBottom:t.spacing(2)}})),f=({control:t,errors:a,isLoading:n,disabled:o})=>{const l=g(),{name:r}=c.details;return e.createElement("div",{className:l.container},e.createElement(s,{variant:"subtitle2"},r.name),e.createElement(d,{name:"detailsStep.name",control:t,defaultValue:"",render:({field:m})=>e.createElement(p,{...m,FormHelperTextProps:{className:l.helperText},variant:"outlined",fullWidth:!0,placeholder:r.placeholder,disabled:n||o,type:"text",margin:"dense",error:!!a?.name,helperText:a?.name?.message??r.helperText})}))};export{f as CampaignNameField};
2
2
  //# sourceMappingURL=CampaignNameField.esm.js.map
@@ -1,2 +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};
1
+ import{makeStyles as u,Typography as l}from"@material-ui/core";import{uniqBy as g}from"lodash";import e from"react";import"../../../../contexts/TrackFormContext.esm.js";import"../../../../contexts/CheckFormContext.esm.js";import"../../../../contexts/CampaignFormContext.esm.js";import{useLoggedInUser as E}from"../../../../contexts/UserProvider.esm.js";import{FormControlledAutocomplete as v}from"../../../FormControlledAutocomplete/FormControlledAutocomplete.esm.js";import{useLabelOptions as y}from"../../../FormControlledAutocomplete/useLabelOptions.esm.js";import"@material-ui/lab";import"../../../ListboxVirtualized/ListboxVirtualized.esm.js";import{useOptions as b}from"../../../GroupSelector/useOptions.esm.js";import{CAMPAIGN_FIELDS as h}from"../../utils/campaignFormUtils.esm.js";const w=u(t=>({helperText:{marginLeft:0},selectField:{display:"flex",flexDirection:"column",gap:t.spacing(1),marginBottom:t.spacing(2)},fieldContainer:{width:"250px"}})),x=({control:t,errors:m,isLoading:p,disabled:s})=>{const o=w(),{owner:i}=h.details,{options:c}=b(),{user:d,userEntityRef:a}=E();let r=g(c?.map(n=>({value:n.ref,label:n.name})),"value");const f=y(r);return a&&(r=[{value:a,label:d?.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(v,{name:"detailsStep.ownerEntityRef",control:t,placeholder:"Owner",freeSolo:!1,disabled:s||p,helperText:m?.ownerEntityRef?.message??void 0,...f})))};export{x as CampaignOwnerField};
2
2
  //# sourceMappingURL=CampaignOwnerField.esm.js.map
@@ -1,2 +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};
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:"subtitle1",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
2
  //# sourceMappingURL=CampaignScheduleField.esm.js.map
@@ -1,2 +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};
1
+ import{makeStyles as b,Divider as y,Grid as p,Typography as m,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(a=>({milestoneHeader:{display:"flex",alignItems:"center",marginBottom:a.spacing(1)},divider:{margin:"20px 0"},helperText:{marginLeft:0},selectContainer:{width:"250px"},section:{marginBottom:a.spacing(2)}})),R=({control:a,errors:n,isLoading:s,disabled:l})=>{const r=S(),{name:o,description:d,passrate:c}=F.milestones,{fields:f,append:g,remove:h}=C({control:a,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:r.divider}),e.createElement(p,{container:!0,spacing:1,className:r.milestoneHeader},e.createElement(p,{item:!0,xs:!0},e.createElement(m,{variant:"subtitle2"},o.name),e.createElement(u,{name:`milestonesStep.milestones.${t}.name`,control:a,defaultValue:"",render:({field:i})=>e.createElement(E,{...i,FormHelperTextProps:{className:r.helperText},variant:"outlined",fullWidth:!0,placeholder:o.placeholder,disabled:s||l,type:"text",margin:"dense",error:!!n?.milestones?.[t]?.name,helperText:n?.milestones?.[t]?.name?.message??o.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:r.section},e.createElement(m,{variant:"subtitle2"},d.name),e.createElement(m,{variant:"caption"},d.description),e.createElement(u,{name:`milestonesStep.milestones.${t}.description`,control:a,defaultValue:"",render:({field:i})=>e.createElement(E,{...i,FormHelperTextProps:{className:r.helperText},variant:"outlined",multiline:!0,minRows:4,fullWidth:!0,placeholder:d.placeholder,disabled:s||l,type:"text",margin:"dense",error:!!n?.milestones?.[t]?.description,helperText:n?.milestones?.[t]?.description?.message})})),e.createElement("div",{className:r.section},e.createElement(m,{variant:"subtitle2"},c.name),e.createElement(m,{variant:"caption"},c.description),e.createElement("div",{className:r.selectContainer},e.createElement(u,{name:`milestonesStep.milestones.${t}.passRate`,control:a,defaultValue:"",render:({field:i})=>e.createElement(E,{...i,FormHelperTextProps:{className:r.helperText},variant:"outlined",fullWidth:!0,placeholder:c.placeholder,disabled:s||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
2
  //# sourceMappingURL=CampaignMilestonesStep.esm.js.map
@@ -1,2 +1,2 @@
1
- import{CAMPAIGN_NAME_MAX_LENGTH as e,MILESTONE_NAME_MAX_LENGTH as t}from"./validation.esm.js";const a={detailsStep:{name:"",description:"",ownerEntityRef:"",supportChannel:"",startDate:null,targetCompletionDate:null},tracksStep:{checks:[]},filtersStep:{selectedKinds:[],selectedTypes:[],selectedLifecycles:[],selectedOwners:[],selectedSystems:[],selectedTags:[]},milestonesStep:{milestones:[{name:"",description:"",passRate:"0"}]}},n={details:{name:{name:"Campaign name",description:"Give your campaign a meaningful name so it's easy to remember it",helperText:`Max ${e} characters`,placeholder:"Example: Check for latest version of javascript and Readme files"},description:{name:"Campaign description",description:"Give your campaign a meaningful description so others can understand how to use it",placeholder:"Example: Ask my teams to check for the latest version of javascript and Readme files so that we can meet our quality standards this quarter"},owner:{name:"Campaign owner",description:"Add yourself or a team as the owner of this campaign"},support:{name:"Support channel (Optional)",description:"Add a Slack channel to receive updates about the campaign",placeholder:"Channel name"},startingDate:{name:"Starting date",placeholder:"Starting date"},endingDate:{name:"Ending date",placeholder:"Ending date"}},milestones:{name:{name:"Milestone name",description:"Give your milestone a meaningful name so it's easy to remember it",helperText:`Max ${t} characters`,placeholder:"Example: 80% passrate"},description:{name:"Milestone description",description:"Give your milestone a meaningful description so others can understand how to use it",placeholder:"Example: The track in my my campaign has a passrate of 80% or above"},passrate:{name:"Milestone passrate",description:"Enter the pass rate that your tracks have to meet",placeholder:"Example: 80%"}},filter:{description:'Setting the filters below will limit the scope of the Campaign so that only those Entities that match the filter will be monitored by the Campaign. As an example, choosing a "Kind" of "Component" will make this Campaign 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 Campaign.'}};export{n as CAMPAIGN_FIELDS,a as DEFAULT_FORM_VALUES};
1
+ import{CAMPAIGN_NAME_MAX_LENGTH as e,MILESTONE_NAME_MAX_LENGTH as t}from"./validation.esm.js";const a={detailsStep:{name:"",description:"",ownerEntityRef:"",supportChannel:"",startDate:null,targetCompletionDate:null},tracksStep:{checks:[]},filtersStep:{selectedKinds:[],selectedTypes:[],selectedLifecycles:[],selectedOwners:[],selectedSystems:[],selectedTags:[]},milestonesStep:{milestones:[{name:"",description:"",passRate:"0"}]}},s={details:{name:{name:"Campaign name",helperText:`Max ${e} characters`,placeholder:"Example: Check for latest version of javascript and Readme files"},description:{name:"Campaign description",placeholder:"Example: Check for the latest versions of JavaScript and README files to meet this quarter's quality standards."},owner:{name:"Campaign owner",description:"Add a team as the owner of this Campaign."},support:{name:"Support channel (Optional)",description:"Set up a Slack channel for notifications.",placeholder:"Channel name"},startingDate:{name:"Starting date",placeholder:"Starting date"},endingDate:{name:"Ending date",placeholder:"Ending date"}},milestones:{name:{name:"Milestone name",helperText:`Max ${t} characters`,placeholder:"Example: 80% pass rate"},description:{name:"Milestone description",description:"Provide a detailed description of this milestone, outlining its objectives.",placeholder:"Example: The track in my campaign expects a pass rate of 80% or above"},passrate:{name:"Milestone pass rate",description:"Enter the pass rate that your tracks have to meet.",placeholder:"Example: 80%"}},filter:{description:"Use the filters below to narrow the scope of the Campaign. Only Entities that match the selected filters will be monitored. For example, selecting 'Kind' as 'Component' will ensure that this Check only applies to Entities categorized as 'Component,' excluding others like Groups, Users, and APIs."}};export{s as CAMPAIGN_FIELDS,a as DEFAULT_FORM_VALUES};
2
2
  //# sourceMappingURL=campaignFormUtils.esm.js.map
@@ -1,2 +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};
1
+ import{TrackCheckSchema as o,CampaignDetailsSchema as S}from"@spotify/backstage-plugin-soundcheck-common";import{z as t}from"zod";import{CHECK_IS_REQUIRED_MSG as p,FIELD_IS_REQUIRED_MSG as a,FiltersSchema as E}from"../../../utils/validation.esm.js";const i=0,r=100,_=100,s=100,c="Ending date must come after the Starting Date",l=t.strictObject({checks:t.array(o.extend({key:t.string().optional()})).min(1,p)}),g=t.strictObject({id:t.number().optional(),name:t.string().min(1,a).max(s,`Input must be less than ${s} characters`),description:t.string().min(1,a),passRate:t.coerce.number().min(i,`Minimum pass rate is ${i}%`).max(r,`Maximum pass rate is ${r}%`)}),D=t.strictObject({milestones:t.array(g).min(1,a)}),m=t.coerce.string().nullable().refine(e=>e!==null,{message:a}),M=t.strictObject({startDate:m,targetCompletionDate:m}),A=({startDate:e,targetCompletionDate:n})=>e&&n?new Date(e)<new Date(n):!0,T=S.merge(M),h=e=>e.refine(A,{message:c,path:["targetCompletionDate"]}),I=t.strictObject({detailsStep:h(T),tracksStep:l,filtersStep:E,milestonesStep:D});export{_ as CAMPAIGN_NAME_MAX_LENGTH,c as END_AFTER_START_DATE_MSG,r as MILESTONE_MAX_PASS_RATE,i as MILESTONE_MIN_PASS_RATE,s as MILESTONE_NAME_MAX_LENGTH,m as campaignDateTimeSchema,I as campaignFormSchema};
2
2
  //# sourceMappingURL=validation.esm.js.map
@@ -1,2 +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};
1
+ import{useRouteRef as m}from"@backstage/core-plugin-api";import{usePermission as n}from"@backstage/plugin-permission-react";import{Button as s}from"@material-ui/core";import{soundcheckCampaignCreatePermission as p}from"@spotify/backstage-plugin-soundcheck-common";import e from"react";import{useNavigate as c}from"react-router-dom";import l from"../../images/no-results.svg";import{campaignCreateRouteRef as g}from"../../routes.esm.js";import{EmptyState as d}from"../EmptyState/EmptyState.esm.js";var a=(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))(a||{});const f=()=>{const{loading:t,allowed:o}=n({permission:p}),i=c(),r=m(g);return e.createElement(d,{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:l,action:!t&&e.createElement(s,{disabled:!o,variant:"contained",color:"primary",onClick:()=>i(r())},"Get started")})};export{a as CampaignEmptyState,f as EmptyCampaignState};
2
2
  //# sourceMappingURL=CampaignEmptyState.esm.js.map
@@ -1,2 +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};
1
+ import{useRouteRef as Y,useApi as $,featureFlagsApiRef as z}from"@backstage/core-plugin-api";import{usePermission as J}from"@backstage/plugin-permission-react";import{makeStyles as K,Grid as i,Button as Q}from"@material-ui/core";import{soundcheckCampaignCreatePermission as U}from"@spotify/backstage-plugin-soundcheck-common";import e,{useState as n,useEffect as y}from"react";import{useNavigate as V}from"react-router-dom";import X from"react-use/lib/useDebounce";import{useGetCampaignOwners as Z}from"../../../hooks/campaigns/useGetCampaignOwners.esm.js";import{useGetCampaigns as _}from"../../../hooks/campaigns/useGetCampaigns.esm.js";import{campaignCreateRouteRef as ee}from"../../../routes.esm.js";import{FilterDefault as p}from"../../../utils/filters.esm.js";import{EmptyCampaignState as ae}from"../CampaignEmptyState.esm.js";import{EmptyState as te}from"../../EmptyState/EmptyState.esm.js";import{Pagination as re}from"../../Pagination/Pagination.esm.js";import{SearchFilters as ne}from"../../SearchFilters/SearchFilters.esm.js";import{CampaignsOverviewSkeleton as ie}from"./CampaignsOverviewSkeleton.esm.js";import{CampaignSummaryCard as se}from"./CampaignSummaryCard.esm.js";import oe from"./useArchiveConfirmationModal.esm.js";var S=(a=>(a.title="No campaigns found",a.description="No campaigns matched your search. Consider changing search term and filters.",a))(S||{});const me=K(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)}})),le=({campaignsPerPage:a,currentCursor:x})=>{const s=me(),[d,u]=n(x),[m,b]=n(""),[f,w]=n(""),[h,B]=n(p.Alpha),[C,k]=n(p.Owner),[P,A]=n(p.Status),{data:F,isLoading:I}=Z();X(()=>{w(m)},500,[m]);const{loading:R,allowed:O}=J({permission:U}),{data:r,isLoading:l}=_({ids:void 0,first:a,after:d,orderAlphabetical:h,searchByOwner:C,searchByName:f,searchByStatus:P}),L=V(),G=Y(ee),T=()=>L(G()),[c,D]=n(r),g=c?.edges.map(t=>t.node),[E,v]=n([]);y(()=>{u(void 0),v([])},[f]);const N=$(z),W=!N.getRegisteredFlags().find(t=>t.name==="soundcheck-enable-campaigns")||N.isActive("soundcheck-enable-campaigns"),j=!O||!W,H=t=>{B(t.target.value)},q=t=>{k(t.target.value)},M=t=>{A(t.target.value)};if(y(()=>{r&&D(()=>({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&&!g)return e.createElement(ae,null);let o;return l?o=e.createElement(ie,null):g?.length?o=g.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(oe,null,e.createElement(se,{campaign:t})))):o=e.createElement(i,{xs:12,item:!0,role:"listitem","aria-label":"result"},e.createElement(te,{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(ne,{searchPlaceholder:"Search Available Campaigns",isLoading:l||I,searchTerm:m,setSearchTerm:b,filterAlpha:h,handleAlphabeticalFilterChange:H,filterOwner:C,handleOwnerFilterChange:q,filterStatus:P,handleStatusFilterChange:M,owners:F}),e.createElement(i,{item:!0,xs:2,className:s.headerButtons},!R&&e.createElement(Q,{disabled:j,variant:"contained",color:"primary",onClick:T,className:s.createButton},"Create Campaign"))),e.createElement(i,{container:!0,spacing:4,role:"list","aria-label":"campaigns"},o),(c?.pageInfo.hasNextPage||E?.length>0)&&e.createElement(i,{item:!0,xs:12},e.createElement(re,{response:c,listingsPerPage:a,cursor:d,setCursor:u,prevCursors:E,setPrevCursors:v,labelPerPageDropdown:"Campaigns Per Page:",urlRoute:"campaigns?campaignsPerPage="})))};export{le as CampaignListPage,S as CampaignNoResults};
2
2
  //# sourceMappingURL=CampaignListPage.esm.js.map