@spotify/backstage-plugin-soundcheck 0.16.3 → 0.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (171) hide show
  1. package/CHANGELOG.md +63 -0
  2. package/config.d.ts +14 -0
  3. package/dist/alpha/integrations.esm.js +2 -0
  4. package/dist/alpha/pages.esm.js +1 -1
  5. package/dist/alpha/plugin.esm.js +1 -1
  6. package/dist/alpha.d.ts +252 -17
  7. package/dist/api.esm.js +1 -1
  8. package/dist/blueprints/IntegrationPageBlueprint.esm.js +2 -0
  9. package/dist/components/Badges/LevelBadge.esm.js +1 -1
  10. package/dist/components/CampaignForm/hooks/utils.esm.js +1 -1
  11. package/dist/components/CampaignInsightsPage/CampaignInsightsPage.esm.js +1 -1
  12. package/dist/components/CampaignInsightsPage/CampaignStatusHistoryTile.esm.js +1 -1
  13. package/dist/components/CampaignsPage/CampaignListPage/CampaignListPage.esm.js +1 -1
  14. package/dist/components/CertificationSidebar/ExemptionJustificationDialog.esm.js +1 -1
  15. package/dist/components/CertificationsPage/CertificationTab.esm.js +1 -1
  16. package/dist/components/CertificationsPage/CertificationTabs.esm.js +1 -1
  17. package/dist/components/CheckDetails/CheckResultDetails.esm.js +1 -1
  18. package/dist/components/CheckDetails/FixMeDialog.esm.js +1 -1
  19. package/dist/components/CheckDetails/ResultStateBox.esm.js +1 -1
  20. package/dist/components/CheckDryRun/CheckDryRunDetails.esm.js +1 -1
  21. package/dist/components/CheckForm/FormFields/RuleInput/Conditions/ConditionList.esm.js +1 -1
  22. package/dist/components/CheckForm/FormFields/RuleInput/Conditions/FactValueDisplay.esm.js +1 -1
  23. package/dist/components/CheckForm/FormFields/RuleInput/Conditions/RuleConditionInput.esm.js +1 -1
  24. package/dist/components/CheckForm/FormFields/RuleInput/Expressions/ExpressionBox.esm.js +1 -1
  25. package/dist/components/CheckForm/FormFields/RuleInput/RuleInputBox.esm.js +1 -1
  26. package/dist/components/CheckForm/Steps/CheckApplicabilityStep.esm.js +1 -1
  27. package/dist/components/CheckForm/utils/checkFormUtils.esm.js +2 -2
  28. package/dist/components/CheckForm/utils/validation.esm.js +1 -1
  29. package/dist/components/CheckIcon/CheckIcon.esm.js +1 -1
  30. package/dist/components/CheckPage/CheckEntitiesTable/CheckEntitiesTable.esm.js +1 -1
  31. package/dist/components/CheckPage/CheckInsightsPage.esm.js +1 -1
  32. package/dist/components/CheckPage/CheckStatusHistoryChart.esm.js +1 -1
  33. package/dist/components/CheckPage/ExemptionsTable.esm.js +2 -0
  34. package/dist/components/ChecksPage/CheckListPage/CheckListPage.esm.js +1 -1
  35. package/dist/components/CollapsablePanel/CollapsablePanel.esm.js +2 -0
  36. package/dist/components/CollectorPage/CollectorPage.esm.js +1 -1
  37. package/dist/components/CollectorPage/Configurators/Common/FactCollectionConfig.esm.js +1 -1
  38. package/dist/components/CollectorPage/Configurators/HTTP/HttpStatusesInput.esm.js +1 -1
  39. package/dist/components/CollectorPage/Configurators/PagerDuty/PagerDutyConfigurator.esm.js +1 -1
  40. package/dist/components/CollectorPage/Configurators/PagerDuty/utils.esm.js +1 -1
  41. package/dist/components/CollectorsPage/CollectorListPage/CollectorListPage.esm.js +1 -1
  42. package/dist/components/CollectorsPage/CollectorListPage/CollectorSummaryCard.esm.js +1 -1
  43. package/dist/components/CollectorsPage/CollectorsPage.esm.js +1 -1
  44. package/dist/components/EntitiesAutocompletePicker/EntitiesAutocompletePicker.esm.js +1 -1
  45. package/dist/components/FactExplorer/FactExplorer.esm.js +1 -1
  46. package/dist/components/FactExplorer/FactExplorerDialog.esm.js +1 -1
  47. package/dist/components/FactExplorer/useFactOptions.esm.js +1 -1
  48. package/dist/components/Filter/EntityAutocompletePicker.esm.js +1 -1
  49. package/dist/components/Filter/FilterComponent.esm.js +1 -1
  50. package/dist/components/FilterSidebar/FilterSidebar.esm.js +1 -1
  51. package/dist/components/FilterSidebar/StateFilter.esm.js +1 -1
  52. package/dist/components/FormControlledAutocomplete/FormControlledMultipleAutocomplete.esm.js +1 -1
  53. package/dist/components/GroupSelector/GroupSelector.esm.js +1 -1
  54. package/dist/components/ImportExportPanel/ImportExportPanel.esm.js +2 -0
  55. package/dist/components/LevelsTable/CheckRowContent.esm.js +1 -1
  56. package/dist/components/LevelsTable/LevelsTable.esm.js +1 -1
  57. package/dist/components/MultiSelectFilter/MultiSelectFilter.esm.js +1 -1
  58. package/dist/components/OverviewPage/OverviewPageHeader.esm.js +1 -1
  59. package/dist/components/OverviewTable/Cell/CheckCell.esm.js +1 -1
  60. package/dist/components/OverviewTable/Cell/CheckNameCell.esm.js +1 -1
  61. package/dist/components/OverviewTable/Cell/TrackCheckStatusCount.esm.js +2 -0
  62. package/dist/components/OverviewTable/Cell/cellRenderer.esm.js +1 -1
  63. package/dist/components/OverviewTable/OverviewTableContent.esm.js +1 -1
  64. package/dist/components/OverviewTable/ResultsTable.esm.js +1 -1
  65. package/dist/components/OverviewTable/ResultsTableRow.esm.js +1 -1
  66. package/dist/components/PassingPercentProgressbar/PassPercentageProgressbar.esm.js +2 -0
  67. package/dist/components/Router.esm.js +1 -1
  68. package/dist/components/RoutingPage/RoutingPage.esm.js +1 -1
  69. package/dist/components/RoutingPage/index.esm.js +1 -1
  70. package/dist/components/SearchFilters/SearchFilters.esm.js +1 -1
  71. package/dist/components/SendCampaignNotificationDialog/SendCampaignNotificationDialog.esm.js +2 -0
  72. package/dist/components/SoundcheckDialog/SoundcheckDialog.esm.js +1 -1
  73. package/dist/components/SoundcheckHeader/headerUtil.esm.js +1 -1
  74. package/dist/components/SummaryCard/SummaryCard.esm.js +1 -1
  75. package/dist/components/TechHealth/Filters/FacetFilter.esm.js +1 -1
  76. package/dist/components/TechHealth/Filters/FilterProvider.esm.js +1 -1
  77. package/dist/components/TechHealth/Filters/utils.esm.js +1 -1
  78. package/dist/components/TechInsights/ColorLegend.esm.js +2 -0
  79. package/dist/components/TechInsights/LoadingOverlay.esm.js +2 -0
  80. package/dist/components/TechInsights/LowestPerformingTeams.esm.js +2 -0
  81. package/dist/components/TechInsights/NivoCirclePacking.esm.js +2 -0
  82. package/dist/components/TechInsights/NivoIcicle.esm.js +2 -0
  83. package/dist/components/TechInsights/NivoSunburst.esm.js +2 -0
  84. package/dist/components/TechInsights/NivoTreemap.esm.js +2 -0
  85. package/dist/components/TechInsights/TeamComparison/CheckComparison.esm.js +2 -0
  86. package/dist/components/TechInsights/TeamComparison/FailingComponentsTable.esm.js +2 -0
  87. package/dist/components/TechInsights/TeamComparison/LineChartContainer.esm.js +2 -0
  88. package/dist/components/TechInsights/TeamComparison/MultiCheckStatusHistoryChart.esm.js +2 -0
  89. package/dist/components/TechInsights/TeamComparison/MultiTrackHistoryChart.esm.js +2 -0
  90. package/dist/components/TechInsights/TeamComparison/TeamComparison.esm.js +2 -0
  91. package/dist/components/TechInsights/TeamComparison/TrackComparison.esm.js +2 -0
  92. package/dist/components/TechInsights/TeamPerformanceCard.esm.js +2 -0
  93. package/dist/components/TechInsights/TeamPerformanceListCard.esm.js +2 -0
  94. package/dist/components/TechInsights/TechInsightsGroupSelector.esm.js +2 -0
  95. package/dist/components/TechInsights/TechInsightsPage.esm.js +2 -0
  96. package/dist/components/TechInsights/TechInsightsPage2.esm.js +2 -0
  97. package/dist/components/TechInsights/TechInsightsSidebar.esm.js +2 -0
  98. package/dist/components/TechInsights/TechInsightsViewSelector.esm.js +2 -0
  99. package/dist/components/TechInsights/Tiles/CheckStatusTile.esm.js +2 -0
  100. package/dist/components/TechInsights/Tiles/TileUtils.esm.js +2 -0
  101. package/dist/components/TechInsights/Tiles/TrackStatusTile.esm.js +2 -0
  102. package/dist/components/TechInsights/TopPerformingTeams.esm.js +2 -0
  103. package/dist/components/TechInsights/TrackCardGrid.esm.js +2 -0
  104. package/dist/components/TechInsights/TrackCardGridBox.esm.js +2 -0
  105. package/dist/components/TechInsights/colorContrast.esm.js +2 -0
  106. package/dist/components/TechInsights/hierarchy/GroupNode.esm.js +2 -0
  107. package/dist/components/TechInsights/hierarchy/Hierarchy.esm.js +2 -0
  108. package/dist/components/TechInsights/hierarchy/VirtualRow.esm.js +2 -0
  109. package/dist/components/TechInsights/hierarchyToNivo.esm.js +2 -0
  110. package/dist/components/TechInsights/persistence/FavoriteViews.esm.js +2 -0
  111. package/dist/components/TechInsights/styles.esm.js +2 -0
  112. package/dist/components/TimePeriodBar/TimePeriodBar.esm.js +2 -0
  113. package/dist/components/TopFailingChecksTable/TopFailingChecksTable.esm.js +1 -1
  114. package/dist/components/TrackForm/Steps/TrackDetailsStep/TrackBadgeTypeSelect/TrackBadgeTypeSelect.esm.js +1 -1
  115. package/dist/components/TrackForm/utils/useTrackForm.esm.js +1 -1
  116. package/dist/components/TrackPage/TrackEntitiesTable/TrackEntitiesTable.esm.js +1 -1
  117. package/dist/components/TrackPage/TrackEntitiesTable/TrackStatusChip.esm.js +1 -1
  118. package/dist/components/TrackPage/TrackEntitiesTable/columns.esm.js +1 -1
  119. package/dist/components/TrackPage/TrackEntitiesTable/utils.esm.js +1 -1
  120. package/dist/components/TrackPage/TrackHistoryChart.esm.js +1 -1
  121. package/dist/components/TrackPage/TrackPage.esm.js +1 -1
  122. package/dist/components/TrackPage/TrackStatusBar.esm.js +1 -1
  123. package/dist/components/TrackPage/TrackStatusTable.esm.js +1 -1
  124. package/dist/components/TracksPage/TrackListPage/TrackListPage.esm.js +1 -1
  125. package/dist/contexts/UserProvider.esm.js +1 -1
  126. package/dist/graphql/generated/index.esm.js +283 -79
  127. package/dist/hooks/aggregations/useCertificationStatusHistories.esm.js +2 -0
  128. package/dist/hooks/aggregations/useCertificationStatuses.esm.js +2 -0
  129. package/dist/hooks/aggregations/useCheckStatus.esm.js +1 -1
  130. package/dist/hooks/aggregations/useCheckStatusByGroups.esm.js +2 -0
  131. package/dist/hooks/aggregations/useCheckStatusHistoriesMultiFilter.esm.js +2 -0
  132. package/dist/hooks/campaigns/useCreateCampaign.esm.js +1 -1
  133. package/dist/hooks/campaigns/useGetCampaigns.esm.js +1 -1
  134. package/dist/hooks/campaigns/useSendCampaignNotification.esm.js +2 -0
  135. package/dist/hooks/campaigns/useUpdateCampaign.esm.js +1 -1
  136. package/dist/hooks/certifications/useTrackOverviewForOwner.esm.js +1 -1
  137. package/dist/hooks/checks/useCreateCheck.esm.js +1 -1
  138. package/dist/hooks/checks/useImportChecks.esm.js +2 -0
  139. package/dist/hooks/checks/useSetManualResult.esm.js +1 -1
  140. package/dist/hooks/checks/useUpdateCheck.esm.js +1 -1
  141. package/dist/hooks/collectors/useUpdateCollectorConfig.esm.js +1 -1
  142. package/dist/hooks/exemptions/useDeleteExemption.esm.js +1 -1
  143. package/dist/hooks/exemptions/useExemptCheckIds.esm.js +1 -1
  144. package/dist/hooks/exemptions/useExemptions.esm.js +2 -0
  145. package/dist/hooks/exemptions/useGetExemption.esm.js +1 -1
  146. package/dist/hooks/exemptions/useSetEntityExempt.esm.js +1 -1
  147. package/dist/hooks/facets/useFacetFilters.esm.js +1 -1
  148. package/dist/hooks/graphqlKeys.esm.js +1 -1
  149. package/dist/hooks/groups/useAllGroups.esm.js +1 -1
  150. package/dist/hooks/groups/useUsersGroupClaims.esm.js +1 -1
  151. package/dist/hooks/heirarchy/useGetDescendentsOfGroups.esm.js +2 -0
  152. package/dist/hooks/heirarchy/useGroupHierarchy.esm.js +2 -0
  153. package/dist/hooks/heirarchy/useHierarchicalTrackStatus.esm.js +2 -0
  154. package/dist/hooks/heirarchy/useRootGroups.esm.js +2 -0
  155. package/dist/hooks/savedViews/useDeleteView.esm.js +2 -0
  156. package/dist/hooks/savedViews/useSaveView.esm.js +2 -0
  157. package/dist/hooks/savedViews/useSavedViews.esm.js +2 -0
  158. package/dist/hooks/tracks/useCreateTrack.esm.js +1 -1
  159. package/dist/hooks/tracks/useImportTracks.esm.js +2 -0
  160. package/dist/hooks/tracks/useUpdateTrack.esm.js +1 -1
  161. package/dist/index.d.ts +85 -1
  162. package/dist/index.esm.js +1 -1
  163. package/dist/utils/colors.esm.js +1 -1
  164. package/dist/utils/export.esm.js +7 -3
  165. package/dist/utils/helpers.esm.js +2 -0
  166. package/dist/utils/validation.esm.js +1 -1
  167. package/package.json +34 -18
  168. package/dist/components/CheckForm/FormFields/RuleInput/useRuleInputHandlers.esm.js +0 -2
  169. package/dist/components/OrgHealth/OrgHealthPage.esm.js +0 -2
  170. package/dist/components/OverviewTable/Cell/TrackCheckIndicator.esm.js +0 -2
  171. package/dist/utils/getGroupFilterFromConfig.esm.js +0 -2
@@ -1,2 +1,2 @@
1
- import{jsx as a,jsxs as S}from"react/jsx-runtime";import{useRouteRef as $,useApi as z,featureFlagsApiRef as J}from"@backstage/core-plugin-api";import{usePermission as K}from"@backstage/plugin-permission-react";import{makeStyles as Q,Grid as n,Button as U}from"@material-ui/core";import{soundcheckCampaignCreatePermission as V}from"@spotify/backstage-plugin-soundcheck-common";import{useState as t,useEffect as y}from"react";import{useNavigate as X}from"react-router-dom";import Y from"react-use/lib/useDebounce";import{useGetCampaignOwners as _}from"../../../hooks/campaigns/useGetCampaignOwners.esm.js";import{useGetCampaigns as ee}from"../../../hooks/campaigns/useGetCampaigns.esm.js";import{campaignCreateRouteRef as ae}from"../../../routes.esm.js";import{FilterDefault as c}from"../../../utils/filters.esm.js";import{EmptyCampaignState as re}from"../CampaignEmptyState.esm.js";import{EmptyState as ie}from"../../EmptyState/EmptyState.esm.js";import{Pagination as te}from"../../Pagination/Pagination.esm.js";import{SearchFilters as ne}from"../../SearchFilters/SearchFilters.esm.js";import{CampaignsOverviewSkeleton as se}from"./CampaignsOverviewSkeleton.esm.js";import{CampaignSummaryCard as oe}from"./CampaignSummaryCard.esm.js";import me from"./useArchiveConfirmationModal.esm.js";var b=(e=>(e.title="No campaigns found",e.description="No campaigns matched your search. Consider changing search term and filters.",e))(b||{});const le=Q(e=>({headerButtons:{display:"flex",gap:e.spacing(1),flexWrap:"nowrap",justifyContent:"end",alignItems:"end"},header:{padding:e.spacing(0,0,1)},container:{padding:e.spacing(3),gap:e.spacing(3)},createButton:{lineHeight:"1.25rem",paddingTop:e.spacing(1.5),paddingBottom:e.spacing(1.5)}})),ge=({campaignsPerPage:e,currentCursor:w})=>{const s=le(),[d,u]=t(w),[m,B]=t(""),[h,R]=t(""),[f,A]=t(c.Alpha),[C,I]=t(c.Owner),[P,k]=t(c.Status),{data:F,isLoading:O}=_();Y(()=>{R(m)},500,[m]);const{loading:L,allowed:j}=K({permission:V}),{data:i,isLoading:l}=ee({ids:void 0,first:e,after:d,orderAlphabetical:f,searchByOwner:C,searchByName:h,searchByStatus:P}),E=X(),G=$(ae),T=()=>E(G()),[g,D]=t(i),p=g?.edges.map(r=>r.node),[v,N]=t([]);y(()=>{u(void 0),N([])},[h]);const x=z(J),W=!x.getRegisteredFlags().find(r=>r.name==="soundcheck-enable-campaigns")||x.isActive("soundcheck-enable-campaigns"),H=!j||!W,q=r=>{A(r.target.value)},M=r=>{I(r.target.value)},Z=r=>{k(r.target.value)};if(y(()=>{i&&D(()=>({totalCount:i.totalCount,edges:i.edges,pageInfo:{startCursor:i.pageInfo.startCursor,endCursor:i.pageInfo.endCursor,hasNextPage:i?.pageInfo.hasNextPage??!1,hasPreviousPage:i?.pageInfo.hasPreviousPage??!1}}))},[i]),!l&&!p)return a(re,{});let o;return l?o=a(se,{}):p?.length?o=p.map(r=>a(n,{xs:12,sm:12,md:6,lg:4,xl:3,item:!0,role:"listitem","aria-label":"result",children:a(me,{children:a(oe,{campaign:r})})},r.id)):o=a(n,{xs:12,item:!0,role:"listitem","aria-label":"result",children:a(ie,{title:"No campaigns found",description:"No campaigns matched your search. Consider changing search term and filters."})}),S(n,{container:!0,direction:"row",className:s.container,children:[S(n,{container:!0,className:s.header,children:[a(ne,{searchPlaceholder:"Search Available Campaigns",isLoading:l||O,searchTerm:m,setSearchTerm:B,filterAlpha:f,handleAlphabeticalFilterChange:q,filterOwner:C,handleOwnerFilterChange:M,filterStatus:P,handleStatusFilterChange:Z,owners:F}),a(n,{item:!0,xs:2,className:s.headerButtons,children:!L&&a(U,{disabled:H,variant:"contained",color:"primary",onClick:T,className:s.createButton,children:"Create Campaign"})})]}),a(n,{container:!0,spacing:4,role:"list","aria-label":"campaigns",children:o}),(g?.pageInfo.hasNextPage||v?.length>0)&&a(n,{item:!0,xs:12,children:a(te,{response:g,listingsPerPage:e,cursor:d,setCursor:u,prevCursors:v,setPrevCursors:N,labelPerPageDropdown:"Campaigns Per Page:",urlRoute:"campaigns?campaignsPerPage="})})]})};export{ge as CampaignListPage,b as CampaignNoResults};
1
+ import{jsx as a,jsxs as S}from"react/jsx-runtime";import{useRouteRef as $,useApi as z,featureFlagsApiRef as J}from"@backstage/core-plugin-api";import{usePermission as K}from"@backstage/plugin-permission-react";import{makeStyles as Q,Grid as n,Button as U}from"@material-ui/core";import{soundcheckCampaignCreatePermission as V}from"@spotify/backstage-plugin-soundcheck-common";import{useState as t,useEffect as y}from"react";import{useNavigate as X}from"react-router-dom";import Y from"react-use/lib/useDebounce";import{useGetCampaignOwners as _}from"../../../hooks/campaigns/useGetCampaignOwners.esm.js";import{useGetCampaigns as ee}from"../../../hooks/campaigns/useGetCampaigns.esm.js";import{campaignCreateRouteRef as ae}from"../../../routes.esm.js";import{FilterDefault as c}from"../../../utils/filters.esm.js";import{EmptyCampaignState as re}from"../CampaignEmptyState.esm.js";import{EmptyState as ie}from"../../EmptyState/EmptyState.esm.js";import{Pagination as te}from"../../Pagination/Pagination.esm.js";import{SearchFilters as ne}from"../../SearchFilters/SearchFilters.esm.js";import{CampaignsOverviewSkeleton as se}from"./CampaignsOverviewSkeleton.esm.js";import{CampaignSummaryCard as oe}from"./CampaignSummaryCard.esm.js";import me from"./useArchiveConfirmationModal.esm.js";var b=(e=>(e.title="No campaigns found",e.description="No campaigns matched your search. Consider changing search term and filters.",e))(b||{});const le=Q(e=>({headerButtons:{display:"flex",gap:e.spacing(1),flexWrap:"nowrap",justifyContent:"end",alignItems:"end"},header:{padding:e.spacing(0,0,1)},container:{padding:e.spacing(3),gap:e.spacing(3)},createButton:{lineHeight:"1.25rem",paddingTop:e.spacing(1.5),paddingBottom:e.spacing(1.5)}})),ge=({campaignsPerPage:e,currentCursor:w})=>{const s=le(),[d,u]=t(w),[m,B]=t(""),[h,R]=t(""),[f,A]=t(c.Alpha),[C,I]=t(c.Owner),[P,k]=t(c.Status),{data:F,isLoading:O}=_();Y(()=>{R(m)},500,[m]);const{loading:L,allowed:j}=K({permission:V}),{data:i,isLoading:l}=ee({ids:void 0,first:e,after:d,orderAlphabetical:f,searchByOwner:C,searchByName:h,searchByStatus:P}),E=X(),G=$(ae),T=()=>E(G()),[g,D]=t(i),p=g?.edges.map(r=>r.node),[v,N]=t([]);y(()=>{u(void 0),N([])},[h]);const x=z(J),W=!x.getRegisteredFlags().find(r=>r.name==="soundcheck-enable-campaigns")||x.isActive("soundcheck-enable-campaigns"),H=!j||!W,q=r=>{A(r.target.value)},M=r=>{I(r.target.value)},Z=r=>{k(r.target.value)};if(y(()=>{i&&D(()=>({totalCount:i.totalCount,edges:i.edges,pageInfo:{startCursor:i.pageInfo.startCursor,endCursor:i.pageInfo.endCursor,hasNextPage:i?.pageInfo.hasNextPage??!1,hasPreviousPage:i?.pageInfo.hasPreviousPage??!1}}))},[i]),!l&&!p)return a(re,{});let o;return l?o=a(se,{}):p?.length?o=p.map(r=>a(n,{xs:12,sm:12,md:6,lg:4,xl:3,item:!0,role:"listitem","aria-label":"result",children:a(me,{children:a(oe,{campaign:r})})},r.id)):o=a(n,{xs:12,item:!0,role:"listitem","aria-label":"result",children:a(ie,{title:"No campaigns found",description:"No campaigns matched your search. Consider changing search term and filters."})}),S(n,{container:!0,direction:"row",className:s.container,children:[S(n,{container:!0,className:s.header,children:[a(ne,{searchPlaceholder:"Search Available Campaigns",isLoading:l||O,searchTerm:m,setSearchTerm:B,filterAlpha:f,handleAlphabeticalFilterChange:q,filterOwner:C,handleOwnerFilterChange:M,filterStatus:P,handleStatusFilterChange:Z,owners:F}),a(n,{item:!0,xs:4,className:s.headerButtons,children:!L&&a(U,{disabled:H,variant:"contained",color:"primary",onClick:T,className:s.createButton,children:"Create Campaign"})})]}),a(n,{container:!0,spacing:4,role:"list","aria-label":"campaigns",children:o}),(g?.pageInfo.hasNextPage||v?.length>0)&&a(n,{item:!0,xs:12,children:a(te,{response:g,listingsPerPage:e,cursor:d,setCursor:u,prevCursors:v,setPrevCursors:N,labelPerPageDropdown:"Campaigns Per Page:",urlRoute:"campaigns?campaignsPerPage="})})]})};export{ge as CampaignListPage,b as CampaignNoResults};
2
2
  //# sourceMappingURL=CampaignListPage.esm.js.map
@@ -1,2 +1,2 @@
1
- import{jsxs as a,Fragment as k,jsx as n}from"react/jsx-runtime";import{makeStyles as R,DialogContent as S,Box as b,Typography as C,TextField as A,FormHelperText as F,DialogActions as T,Button as x}from"@material-ui/core";import{useState as f,useEffect as j,useCallback as h}from"react";import{ResultState as D}from"../../graphql/generated/index.esm.js";import"@backstage/catalog-model";import"@backstage/core-plugin-api";import"@tanstack/react-query";import"../../api.esm.js";import"../../hooks/graphqlKeys.esm.js";import"@backstage/plugin-catalog-react";import"@spotify/backstage-plugin-soundcheck-common";import{useSoundcheckAlert as L}from"../../hooks/useSoundcheckAlert.esm.js";import{useGetExemption as I}from"../../hooks/exemptions/useGetExemption.esm.js";import{useSetEntityExempt as J}from"../../hooks/exemptions/useSetEntityExempt.esm.js";import"../../hooks/useConfirmationModal.esm.js";import"react-router-dom";import{useDeleteExemption as B}from"../../hooks/exemptions/useDeleteExemption.esm.js";import{FormFieldLabel as N}from"../FormFieldLabel/FormFieldLabel.esm.js";import{SoundcheckDialog as H}from"../SoundcheckDialog/SoundcheckDialog.esm.js";const g=R(e=>({buttonArea:{paddingLeft:e.spacing(1),paddingBottom:0,justifyContent:"flex-start"},content:{minWidth:480,width:"61.8%",marginTop:e.spacing(0),paddingLeft:e.spacing(1),paddingTop:e.spacing(0)}})),O=({entityRef:e,checkId:i,isOpen:y,setIsOpen:r})=>{const[P,m]=f(),{showAlert:s}=L(),p=g(),[o,l]=f(""),{mutateAsync:d}=J(),{mutateAsync:c}=B(),{data:t,isLoading:u}=I(e,i);j(()=>{t?.exemption&&l(t.exemption.justification)},[t?.exemption]);const v=h(async()=>{!e||!i||await d({checkId:i,entityRef:e,justification:o})&&m({id:i,entityRef:e,result:D.Exempt,details:{notes:{type:"notes",data:o,version:1}},facts:[],ruleResults:[]})},[e,i,o,d,m]),E=h(async()=>{if(!(!e||!i))try{await c({checkId:i,entityRef:e})}catch{s({severity:"error",title:"Failure",message:"Failed to delete exemption."})}},[e,i,c,s]);return a(k,{children:[u&&n("div",{children:"Loading..."}),!u&&a(H,{open:y,handleClose:()=>r(!1),title:t?.exemption?"Remove Exemption?":"Justify Exemption",fullScreen:!1,children:[n(S,{className:p.content,children:a(b,{children:[n(N,{title:t?.exemption?"Existing Justification":"Exemption Justification"}),!t?.exemption&&n(C,{variant:"caption",children:"Please explain why this exemption is necessary. Supports limited markdown."}),n(A,{disabled:!!t?.exemption,variant:"outlined",margin:"dense",fullWidth:!0,value:o,inputProps:{"aria-label":"Exemption Reason"},multiline:!0,rows:3,maxRows:6,onChange:w=>l(w.target.value)}),n(F,{children:"Note: The act of adding or removing an exemption is tied to your user id and is monitored and recorded. Exemptions should only be added or removed with proper cause."})]})}),a(T,{className:p.buttonArea,children:[n(x,{variant:"contained",onClick:async()=>{r(!1),t?.exemption?await E():await v()},color:"primary",disabled:!t?.exemption&&(!o||o?.length===0),children:t?.exemption?"Remove":"Submit"}),n(x,{onClick:()=>r(!1),color:"primary",children:"Cancel"})]})]})]})};export{O as ExemptionJustificationDialog,g as useStyles};
1
+ import{jsxs as a,Fragment as w,jsx as n}from"react/jsx-runtime";import{makeStyles as R,DialogContent as S,Box as b,Typography as C,TextField as A,FormHelperText as F,DialogActions as j,Button as x}from"@material-ui/core";import{useState as f,useEffect as T,useCallback as h}from"react";import{ResultState as D}from"../../graphql/generated/index.esm.js";import"@backstage/catalog-model";import"@backstage/core-plugin-api";import"@tanstack/react-query";import"../../api.esm.js";import"../../hooks/graphqlKeys.esm.js";import"@backstage/plugin-catalog-react";import"@spotify/backstage-plugin-soundcheck-common";import{useSoundcheckAlert as L}from"../../hooks/useSoundcheckAlert.esm.js";import{useGetExemption as I}from"../../hooks/exemptions/useGetExemption.esm.js";import{useSetEntityExempt as J}from"../../hooks/exemptions/useSetEntityExempt.esm.js";import"../../hooks/useConfirmationModal.esm.js";import"react-router-dom";import{useDeleteExemption as B}from"../../hooks/exemptions/useDeleteExemption.esm.js";import{FormFieldLabel as N}from"../FormFieldLabel/FormFieldLabel.esm.js";import{SoundcheckDialog as W}from"../SoundcheckDialog/SoundcheckDialog.esm.js";const g=R(e=>({buttonArea:{paddingLeft:e.spacing(1),paddingBottom:0,justifyContent:"flex-start"},content:{minWidth:480,maxWidth:640,marginTop:e.spacing(0),paddingLeft:e.spacing(1),paddingTop:e.spacing(0)}})),O=({entityRef:e,checkId:i,isOpen:y,setIsOpen:r})=>{const[P,m]=f(),{showAlert:s}=L(),p=g(),[o,l]=f(""),{mutateAsync:d}=J(),{mutateAsync:c}=B(),{data:t,isLoading:u}=I(e,i);T(()=>{t?.exemption&&l(t.exemption.justification)},[t?.exemption]);const v=h(async()=>{!e||!i||await d({checkId:i,entityRef:e,justification:o})&&m({id:i,entityRef:e,result:D.Exempt,details:{notes:{type:"notes",data:o,version:1}},facts:[],ruleResults:[]})},[e,i,o,d,m]),E=h(async()=>{if(!(!e||!i))try{await c({checkId:i,entityRef:e})}catch{s({severity:"error",title:"Failure",message:"Failed to delete exemption."})}},[e,i,c,s]);return a(w,{children:[u&&n("div",{children:"Loading..."}),!u&&a(W,{open:y,handleClose:()=>r(!1),title:t?.exemption?"Remove Exemption?":"Justify Exemption",fullScreen:!1,children:[n(S,{className:p.content,children:a(b,{children:[n(N,{title:t?.exemption?"Existing Justification":"Exemption Justification"}),!t?.exemption&&n(C,{variant:"caption",children:"Please explain why this exemption is necessary. Supports limited markdown."}),n(A,{disabled:!!t?.exemption,variant:"outlined",margin:"dense",fullWidth:!0,value:o,inputProps:{"aria-label":"Exemption Reason"},multiline:!0,rows:3,maxRows:6,onChange:k=>l(k.target.value)}),n(F,{children:"Note: The act of adding or removing an exemption is tied to your user id and is monitored and recorded. Exemptions should only be added or removed with proper cause."})]})}),a(j,{className:p.buttonArea,children:[n(x,{variant:"contained",onClick:async()=>{r(!1),t?.exemption?await E():await v()},color:"primary",disabled:!t?.exemption&&(!o||o?.length===0),children:t?.exemption?"Remove":"Submit"}),n(x,{onClick:()=>r(!1),color:"primary",children:"Cancel"})]})]})]})};export{O as ExemptionJustificationDialog,g as useStyles};
2
2
  //# sourceMappingURL=ExemptionJustificationDialog.esm.js.map
@@ -1,2 +1,2 @@
1
- import{jsx as e,jsxs as c,Fragment as l}from"react/jsx-runtime";import{useEntity as d}from"@backstage/plugin-catalog-react";import{makeStyles as f,Tab as g}from"@material-ui/core";import{Link as b}from"react-router-dom";import"@backstage/catalog-model";import"@backstage/core-plugin-api";import"@tanstack/react-query";import"../../api.esm.js";import"../../hooks/graphqlKeys.esm.js";import{useCertificationDetailsForTrack as h}from"../../hooks/certifications/useCertificationDetailsForTrack.esm.js";import"@spotify/backstage-plugin-soundcheck-common";import"react";import"../../hooks/useSoundcheckAlert.esm.js";import"../../hooks/useConfirmationModal.esm.js";import{CertificationBadge as w}from"../Badges/CertificationBadge.esm.js";const i=f(t=>({root:{maxWidth:"80ch",textTransform:"uppercase",paddingTop:t.spacing(2),paddingBottom:t.spacing(2)},wrapper:{display:"inline-block",textOverflow:"ellipsis",whiteSpace:"nowrap",overflow:"hidden"},badge:{marginRight:t.spacing(1)}})),y=({id:t,name:o,badge:a,href:p,selected:m=!1})=>{const r=i(),{entity:s}=d(),{data:n}=h(s,t);return e(g,{className:r.root,classes:{wrapper:r.wrapper},value:t,label:c(l,{children:[e(w,{badge:a,trackType:n?.track.type,className:r.badge}),o]}),component:b,to:p,selected:m})};export{y as CertificationTab,i as useStyles};
1
+ import{jsx as e,jsxs as c,Fragment as d}from"react/jsx-runtime";import{useEntity as l}from"@backstage/plugin-catalog-react";import{makeStyles as f,Tab as g}from"@material-ui/core";import{Link as w}from"react-router-dom";import"@backstage/catalog-model";import"@backstage/core-plugin-api";import"@tanstack/react-query";import"../../api.esm.js";import"../../hooks/graphqlKeys.esm.js";import{useCertificationDetailsForTrack as b}from"../../hooks/certifications/useCertificationDetailsForTrack.esm.js";import"@spotify/backstage-plugin-soundcheck-common";import"react";import"../../hooks/useSoundcheckAlert.esm.js";import"../../hooks/useConfirmationModal.esm.js";import{CertificationBadge as h}from"../Badges/CertificationBadge.esm.js";const o=f(t=>({root:{maxWidth:"80ch",textTransform:"uppercase",paddingTop:t.spacing(2),paddingBottom:t.spacing(2)},wrapper:{textOverflow:"ellipsis",whiteSpace:"nowrap",overflow:"hidden",flexDirection:"row"},badge:{marginRight:t.spacing(1)}})),x=({id:t,name:i,badge:a,href:p,selected:m=!1})=>{const r=o(),{entity:s}=l(),{data:n}=b(s,t);return e(g,{className:r.root,classes:{wrapper:r.wrapper},value:t,label:c(d,{children:[e(h,{badge:a,trackType:n?.track.type,className:r.badge}),i]}),component:w,to:p,selected:m})};export{x as CertificationTab,o as useStyles};
2
2
  //# sourceMappingURL=CertificationTab.esm.js.map
@@ -1,2 +1,2 @@
1
- import{jsx as i,jsxs as o}from"react/jsx-runtime";import{useRouteRef as b}from"@backstage/core-plugin-api";import{useEntity as N}from"@backstage/plugin-catalog-react";import{makeStyles as B,Tabs as M,IconButton as P,Menu as j,MenuItem as u,Switch as k}from"@material-ui/core";import D from"@material-ui/icons/ArrowDropDown";import L from"@material-ui/icons/Settings.js";import{useState as O,useEffect as V}from"react";import g from"react-use/lib/useLocalStorage";import{useAllCertifications as W}from"../../hooks/certifications/useAllCertifications.esm.js";import"@tanstack/react-query";import"../../api.esm.js";import"../../hooks/graphqlKeys.esm.js";import"@backstage/catalog-model";import"@spotify/backstage-plugin-soundcheck-common";import"../../hooks/useSoundcheckAlert.esm.js";import"../../hooks/useConfirmationModal.esm.js";import"react-router-dom";import{usePlaylists as X}from"../../hooks/playlists/usePlaylists.esm.js";import{certificationPlaylistRouteRef as q,certificationTrackRouteRef as F}from"../../routes.esm.js";import{CertificationTab as G}from"./CertificationTab.esm.js";import{PlaylistCertificationTab as H}from"./PlaylistCertificationTab.esm.js";import{CertificationTabsSkeleton as J}from"./skeletons/CertificationTabsSkeleton.esm.js";function K(r=[],n=[],s,c){if(s){const e=r.findIndex(a=>a.id===s);return e<0?!1:e}const l=n.findIndex(e=>e.track.id===c);return l<0?!1:l+r.length}const Q=B(r=>({tabsContainer:{display:"flex",alignItems:"center"},tabs:{flex:1},settingsButton:{display:"flex",alignItems:"center",marginRight:r.spacing(1)}})),U=({playlistId:r,trackId:n,onSettingsChange:s})=>{const c=Q(),[l,e]=O(null),[a,y]=g("soundcheck.certifications.showNotApplicable",!1),[m,x]=g("soundcheck.certifications.showExempt",!0),[f,I]=g("soundcheck.certifications.showDraftTracksAndCampaigns",!1);V(()=>{s?.({showNotApplicable:!!a,showExempt:!!m})},[a,m,s]);const S=t=>{e(t.currentTarget)},w=()=>{e(null)},{entity:C}=N(),{isLoading:T,data:p}=W(C,!1,f),{isLoading:z,data:d}=X(C),E=b(q),R=b(F);if(z||T||!n)return i(J,{});const v=K(d,p,r,n);return o("div",{className:c.tabsContainer,children:[o(M,{className:c.tabs,value:v,indicatorColor:"primary","aria-label":"Certifications",variant:"scrollable",children:[d?.length&&d.map(({id:t,name:h})=>i(H,{id:t,name:h,selected:t===n,href:E({playlistId:t})},t)),p&&p.filter(({track:{type:t}})=>t!=="playlist").map(({track:{id:t,name:h,badge:A}})=>i(G,{id:t,name:h,badge:A,selected:t===n,href:R({trackId:t})},t))]}),o(P,{className:c.settingsButton,onClick:S,size:"small",children:[i(L,{fontSize:"small"}),i(D,{fontSize:"small"})]}),o(j,{anchorEl:l,open:!!l,onClose:w,anchorOrigin:{vertical:"bottom",horizontal:"right"},transformOrigin:{vertical:"top",horizontal:"right"},children:[o(u,{onClick:()=>{y(!a)},dense:!0,children:[i(k,{size:"small",checked:a}),"Show Not Applicable Checks"]}),o(u,{onClick:()=>{x(!m)},dense:!0,children:[i(k,{size:"small",checked:m}),"Show Exempt Checks"]}),o(u,{onClick:()=>{I(!f)},dense:!0,children:[i(k,{size:"small",checked:f}),"Show Draft Tracks and Campaigns"]})]})]})};export{U as CertificationTabs};
1
+ import{jsx as i,jsxs as n}from"react/jsx-runtime";import{useRouteRef as b}from"@backstage/core-plugin-api";import{useEntity as P}from"@backstage/plugin-catalog-react";import{makeStyles as v,Tabs as B,IconButton as M,Menu as j,MenuItem as u,Switch as k}from"@material-ui/core";import D from"@material-ui/icons/ArrowDropDown";import L from"@material-ui/icons/Settings.js";import{useState as O,useEffect as Q}from"react";import g from"react-use/lib/useLocalStorage";import{useAllCertifications as U}from"../../hooks/certifications/useAllCertifications.esm.js";import"@tanstack/react-query";import"../../api.esm.js";import"../../hooks/graphqlKeys.esm.js";import"@backstage/catalog-model";import"@spotify/backstage-plugin-soundcheck-common";import"../../hooks/useSoundcheckAlert.esm.js";import"../../hooks/useConfirmationModal.esm.js";import"react-router-dom";import{usePlaylists as X}from"../../hooks/playlists/usePlaylists.esm.js";import{certificationPlaylistRouteRef as Y,certificationTrackRouteRef as $}from"../../routes.esm.js";import{CertificationTab as q}from"./CertificationTab.esm.js";import{PlaylistCertificationTab as F}from"./PlaylistCertificationTab.esm.js";import{CertificationTabsSkeleton as G}from"./skeletons/CertificationTabsSkeleton.esm.js";function H(r=[],a=[],c,l){if(c){const o=r.findIndex(s=>s.id===c);return o<0?!1:o}const e=a.findIndex(o=>o.track.id===l);return e<0?!1:e+r.length}const J=v(r=>({tabsContainer:{display:"flex",alignItems:"center"},tabs:{flex:1},settingsButton:{display:"flex",alignItems:"center",marginRight:r.spacing(1)}})),K=({playlistId:r,trackId:a,onSettingsChange:c})=>{const l=J(),[e,o]=O(null),[s,y]=g("soundcheck.certifications.showNotApplicable",!1),[m,x]=g("soundcheck.certifications.showExempt",!0),[f,I]=g("soundcheck.certifications.showDraftTracksAndCampaigns",!1);Q(()=>{c?.({showNotApplicable:!!s,showExempt:!!m})},[s,m,c]);const S=t=>{o({top:t.clientY,left:t.clientX})},w=()=>{o(null)},{entity:C}=P(),{isLoading:T,data:p}=U(C,!1,f),{isLoading:R,data:d}=X(C),z=b(Y),A=b($);if(R||T||!a)return i(G,{});const E=H(d,p,r,a);return n("div",{className:l.tabsContainer,children:[n(B,{className:l.tabs,value:E,indicatorColor:"primary","aria-label":"Certifications",variant:"scrollable",children:[d?.length&&d.map(({id:t,name:h})=>i(F,{id:t,name:h,selected:t===a,href:z({playlistId:t})},t)),p&&p.filter(({track:{type:t}})=>t!=="playlist").map(({track:{id:t,name:h,badge:N}})=>i(q,{id:t,name:h,badge:N,selected:t===a,href:A({trackId:t})},t))]}),n(M,{className:l.settingsButton,onClick:S,size:"small",children:[i(L,{fontSize:"small"}),i(D,{fontSize:"small"})]}),n(j,{open:!!e,onClose:w,anchorReference:"anchorPosition",anchorPosition:e?{top:e.top,left:e.left}:void 0,transformOrigin:{vertical:"top",horizontal:"right"},children:[n(u,{onClick:()=>{y(!s)},dense:!0,children:[i(k,{size:"small",checked:s}),"Show Not Applicable Checks"]}),n(u,{onClick:()=>{x(!m)},dense:!0,children:[i(k,{size:"small",checked:m}),"Show Exempt Checks"]}),n(u,{onClick:()=>{I(!f)},dense:!0,children:[i(k,{size:"small",checked:f}),"Show Draft Tracks and Campaigns"]})]})]})};export{K as CertificationTabs};
2
2
  //# sourceMappingURL=CertificationTabs.esm.js.map
@@ -1,2 +1,2 @@
1
- import{jsxs as r,Fragment as a,jsx as e}from"react/jsx-runtime";import{Box as l,Typography as i}from"@material-ui/core";import{RuleResultComponent as h}from"../RuleResult/RuleResultComponent.esm.js";import{FactTable as u}from"./FactTable.esm.js";const c=({ruleResult:t,applicabilityResult:n})=>r(a,{children:[n&&r(a,{children:[r(l,{mt:2,children:[e(i,{variant:"h3",children:"Applicability Rule Evaluation"}),e(l,{p:2,children:e(h,{ruleResult:n})})]}),e(i,{variant:"h3",children:"Resolved Values"}),e(l,{p:2,children:e(u,{ruleResult:n})})]}),t&&r(a,{children:[r(l,{mt:2,children:[e(i,{variant:"h3",children:"Check Rule Evaluation"}),e(l,{p:2,children:e(h,{ruleResult:t})})]}),e(i,{variant:"h3",children:"Resolved Values"}),e(l,{p:2,children:e(u,{ruleResult:t})})]})]});export{c as CheckResultDetails};
1
+ import{jsxs as l,Fragment as m,jsx as r}from"react/jsx-runtime";import{Box as e,Typography as o}from"@material-ui/core";import{RuleResultComponent as n}from"../RuleResult/RuleResultComponent.esm.js";import{FactTable as a}from"./FactTable.esm.js";const s=({ruleResult:t,title:i})=>l(m,{children:[l(e,{mt:2,children:[r(o,{variant:"h4",children:i}),r(e,{marginTop:1.5,marginBottom:1,children:r(n,{ruleResult:t})})]}),r(o,{variant:"h4",children:"Resolved Values"}),r(e,{marginTop:0,marginBottom:2,children:r(a,{ruleResult:t})})]});export{s as CheckResultDetails};
2
2
  //# sourceMappingURL=CheckResultDetails.esm.js.map
@@ -1,2 +1,2 @@
1
- import{jsxs as l,jsx as o}from"react/jsx-runtime";import{Progress as R}from"@backstage/core-components";import{useApi as u,errorApiRef as T}from"@backstage/core-plugin-api";import{useEntity as b}from"@backstage/plugin-catalog-react";import{scaffolderApiRef as D,useTemplateSecrets as I,useCustomFieldExtensions as B}from"@backstage/plugin-scaffolder-react";import{useTemplateParameterSchema as F,useFilteredSchemaProperties as O,Stepper as U}from"@backstage/plugin-scaffolder-react/alpha";import{makeStyles as j,Dialog as A,DialogTitle as P,Typography as J,IconButton as N,DialogContent as W}from"@material-ui/core";import M from"@material-ui/icons/Close";import Q from"git-url-parse";import{useState as V,useEffect as q}from"react";import{useOutlet as z}from"react-router-dom";import{OngoingTaskComponent as G}from"./OngoingTaskComponent.esm.js";import{ReviewStateComponent as H}from"./ReviewStateComponent.esm.js";class h{type;name;owner;lifecycle;title;description;sourceLocation;managedByLocation;slackChannel;entity;constructor(e){this.lifecycle=e.spec?.lifecycle||"unknown",this.name=e.metadata.name,this.owner=e.spec?.owner||"unknown",this.type=e.spec?.type||"unknown",this.title=e.metadata.title,this.description=e.metadata.description||"",this.sourceLocation=e.metadata.annotations?.["backstage.io/source-location"]?.replace("url:",""),this.managedByLocation=e.metadata.annotations?.["backstage.io/managed-by-location"],this.slackChannel=e.metadata.annotations?.["spotify.net/slack-channel"],this.entity=e}}const K=t=>{const e={};if(e.componentId=t.name,t.sourceLocation){const{name:n,owner:a,protocol:r,source:i}=Q(t.sourceLocation);e.repoUrl=`${r}://${i}/${a}/${n}`,e.repo={host:i,org:a,repo:n,url:e.repoUrl,gitUrl:`git@${i}:${a}/${n}.git`,paramUrl:`${r}://${i}?owner=${a}&repo=${n}`}}e.facts=JSON.parse(t.entity.metadata.annotations?.["sysmodel.spotify.net/raw-component-facts"]||"{}");const s=t;return delete s.entity,{...e,...s}},X=j({titleContent:{display:"flex",justifyContent:"space-between",alignItems:"center"}}),Y=t=>{const{title:e,open:s,setOpen:n,onClose:a,templateRef:r}=t,i=X(),m=u(T),y=u(D),{loading:g,manifest:w,error:c}=F(r),{secrets:k}=I(),C=z(),$=B(C),p=O(w),{entity:S}=b(),[d,f]=V(void 0),x=async E=>{const{taskId:L}=await y.scaffold({templateRef:r,values:E,secrets:k});f(L)},v=()=>{n(!1),f(void 0)};return q(()=>{c&&m.post(new Error(`Failed to load template, ${c}`))},[c,m]),l(A,{open:s,onClose:a,fullWidth:!0,maxWidth:"md",children:[o(P,{children:l("div",{className:i.titleContent,children:[o(J,{variant:"h5",children:e}),o(N,{onClick:v,children:o(M,{})})]})}),l(W,{children:[g&&o(R,{}),d?o(G,{taskId:d}):p&&o(U,{manifest:p,onCreate:x,extensions:$,components:{createButtonText:"Execute",ReviewStateComponent:H},initialState:{backstage:K(new h(S))},...t})]})]})};export{Y as FixMeDialog,h as SimplifiedEntity};
1
+ import{jsxs as l,jsx as o}from"react/jsx-runtime";import{Progress as L}from"@backstage/core-components";import{useApi as u,errorApiRef as R}from"@backstage/core-plugin-api";import{useEntity as T}from"@backstage/plugin-catalog-react";import{scaffolderApiRef as b,useTemplateSecrets as D,useCustomFieldExtensions as B}from"@backstage/plugin-scaffolder-react";import{useTemplateParameterSchema as F,useFilteredSchemaProperties as O,Stepper as U}from"@backstage/plugin-scaffolder-react/alpha";import{makeStyles as j,Dialog as A,DialogTitle as P,Typography as J,IconButton as N,DialogContent as W}from"@material-ui/core";import M from"@material-ui/icons/Close";import Q from"git-url-parse";import{useState as V,useEffect as q}from"react";import{useOutlet as z}from"react-router-dom";import{OngoingTaskComponent as G}from"./OngoingTaskComponent.esm.js";import{ReviewStateComponent as H}from"./ReviewStateComponent.esm.js";class h{type;name;owner;lifecycle;title;description;sourceLocation;managedByLocation;slackChannel;entity;constructor(e){this.lifecycle=e.spec?.lifecycle||"unknown",this.name=e.metadata.name,this.owner=e.spec?.owner||"unknown",this.type=e.spec?.type||"unknown",this.title=e.metadata.title,this.description=e.metadata.description||"",this.sourceLocation=e.metadata.annotations?.["backstage.io/source-location"]?.replace("url:",""),this.managedByLocation=e.metadata.annotations?.["backstage.io/managed-by-location"],this.slackChannel=e.metadata.annotations?.["spotify.net/slack-channel"],this.entity=e}}const K=t=>{const e={};if(e.componentId=t.name,t.sourceLocation){const{name:n,owner:a,protocol:r,source:i}=Q(t.sourceLocation);e.repoUrl=`${r}://${i}/${a}/${n}`,e.repo={host:i,org:a,repo:n,url:e.repoUrl,gitUrl:`git@${i}:${a}/${n}.git`,paramUrl:`${r}://${i}?owner=${a}&repo=${n}`}}e.facts=JSON.parse(t.entity.metadata.annotations?.["sysmodel.spotify.net/raw-component-facts"]||"{}");const s=t;return delete s.entity,{...e,...s}},X=j({titleContent:{display:"flex",justifyContent:"space-between",alignItems:"center"}}),Y=t=>{const{title:e,open:s,setOpen:n,onClose:a,templateRef:r}=t,i=X(),m=u(R),y=u(b),{loading:g,manifest:w,error:c}=F(r),{secrets:k}=D(),C=z(),$=B(C),p=O(w),{entity:S}=T(),[d,f]=V(void 0),x=async E=>{const{taskId:I}=await y.scaffold({templateRef:r,values:E,secrets:k});f(I)},v=()=>{n(!1),f(void 0)};return q(()=>{c&&m.post(new Error(`Failed to load template, ${c}`))},[c,m]),l(A,{open:s,onClose:a,fullWidth:!0,maxWidth:"md",children:[o(P,{children:l("div",{className:i.titleContent,children:[o(J,{variant:"h5",children:e}),o(N,{onClick:v,children:o(M,{})})]})}),l(W,{children:[g&&o(L,{}),d?o(G,{taskId:d}):p&&o(U,{manifest:p,onCreate:x,extensions:$,components:{createButtonText:"Execute",ReviewStateComponent:H},initialState:{backstage:K(new h(S))},...t})]})]})};export{Y as FixMeDialog,h as SimplifiedEntity};
2
2
  //# sourceMappingURL=FixMeDialog.esm.js.map
@@ -1,2 +1,2 @@
1
- import{jsxs as n,jsx as e,Fragment as r}from"react/jsx-runtime";import{useApi as S,configApiRef as w}from"@backstage/core-plugin-api";import{makeStyles as A,Paper as D,Typography as F,Divider as s,Box as f,Button as j}from"@material-ui/core";import{ToggleButtonGroup as E,ToggleButton as x}from"@material-ui/lab";import{NotesSchema as P}from"@spotify/backstage-plugin-soundcheck-common";import{useState as v}from"react";import{ResultState as t}from"../../graphql/generated/index.esm.js";import{CheckIcon as T}from"../CheckIcon/CheckIcon.esm.js";import{SoundcheckMarkdownContent as $}from"../SoundcheckMarkdownContent/SoundcheckMarkdownContent.esm.js";import"@backstage/core-components";import"react-markdown";import"rehype-raw";import"remark-gfm";import{CheckResultDetails as I}from"./CheckResultDetails.esm.js";import{FixMeDialog as G}from"./FixMeDialog.esm.js";import{JustificationDetails as R}from"./JustificationDetails.esm.js";import{SelectedValueProvider as J}from"./SelectedValueContext.esm.js";const L=A(o=>({markdownContent:{"& :last-child":{marginBottom:0},"& pre":{background:`${o.palette.background.paper} !important`},"& :first-child":{marginTop:0}},root:{padding:o.spacing(2),display:"flex",flexDirection:"column",gap:o.spacing(1.5)},header:{display:"flex",alignItems:"center",justifyContent:"space-between"},iconContainer:{display:"flex",alignItems:"center"},toggleButtonGroup:{marginLeft:"auto"},toggleButton:{padding:o.spacing(.5),fontSize:o.typography.pxToRem(12)},passed:{},failed:{},warning:{},notReported:{},notApplicable:{},exempt:{},error:{},icon:{marginRight:o.spacing(.5)},divider:{margin:o.spacing(.5,0)}}),{name:"CheckResultStateBox"}),M={[t.Passed]:"Check passed",[t.Failed]:"Check did not pass",[t.Warning]:"Check produced warning(s)",[t.NotReported]:"Check not reported",[t.NotApplicable]:"Check not applicable",[t.Exempt]:"Exempt from check",[t.Error]:"Check encountered an error."},O={[t.Passed]:"passed",[t.Failed]:"failed",[t.Warning]:"warning",[t.NotReported]:"notReported",[t.NotApplicable]:"notApplicable",[t.Exempt]:"exempt",[t.Error]:"error"},W=({name:o,state:l,details:i,templateRef:d})=>{const a=L(),[k,c]=v(!1),[p,C]=v("notes"),N=S(w).getOptionalStringArray("soundcheck.flags")?.includes("enable-fix-me"),m=i&&(i.ruleResult||i.applicabilityResult),y=()=>{c(!0)},b=()=>{c(!1)},B=(z,h)=>{h!==null&&C(h)},u=i?.notes?P.safeParse(i.notes):void 0,g=u?.success?u.data.data:void 0;return n(D,{variant:"outlined",className:`${a.root} ${a[O[l]]}`,children:[n("div",{className:a.header,children:[n("div",{className:a.iconContainer,children:[e(T,{className:a.icon,result:l}),e(F,{variant:"subtitle1",children:M[l]})]}),m&&n(E,{value:p,exclusive:!0,onChange:B,className:a.toggleButtonGroup,children:[e(x,{value:"notes",className:a.toggleButton,children:"Notes"}),e(x,{value:"details",className:a.toggleButton,children:"Details"})]})]}),p==="notes"&&n(r,{children:[i&&i.exemption&&n(r,{children:[e(s,{className:a.divider}),e(R,{justification:i.exemption,type:"exemption"})]}),i&&i.manualResult&&n(r,{children:[e(s,{className:a.divider}),e(R,{justification:i.manualResult,type:"manual"})]}),g&&n(f,{style:{maxHeight:"35vh",overflowY:"auto"},children:[e(s,{className:a.divider}),e($,{className:a.markdownContent,content:g})]}),N&&l===t.Failed&&d&&n(f,{display:"flex",flexDirection:"column",alignItems:"flex-end",mt:2,width:"100%",children:[e(j,{color:"primary",variant:"contained",onClick:y,children:"Fix"}),e(G,{title:`Fix ${o}`,open:k,setOpen:c,onClose:b,templateRef:d})]})]}),p==="details"&&e(r,{children:m&&n(r,{children:[e(s,{className:a.divider}),e(J,{children:e(I,{ruleResult:i.ruleResult,applicabilityResult:i.applicabilityResult})})]})})]})};export{W as ResultStateBox};
1
+ import{jsxs as o,jsx as e,Fragment as l}from"react/jsx-runtime";import{useApi as w,configApiRef as A}from"@backstage/core-plugin-api";import{makeStyles as D,Paper as E,Typography as F,Divider as s,Box as d,Button as T}from"@material-ui/core";import{ToggleButtonGroup as j,ToggleButton as x}from"@material-ui/lab";import{NotesSchema as P}from"@spotify/backstage-plugin-soundcheck-common";import{useState as R}from"react";import{ResultState as i}from"../../graphql/generated/index.esm.js";import{CheckIcon as $}from"../CheckIcon/CheckIcon.esm.js";import{SoundcheckMarkdownContent as I}from"../SoundcheckMarkdownContent/SoundcheckMarkdownContent.esm.js";import"@backstage/core-components";import"react-markdown";import"rehype-raw";import"remark-gfm";import{CheckResultDetails as v}from"./CheckResultDetails.esm.js";import{FixMeDialog as G}from"./FixMeDialog.esm.js";import{JustificationDetails as k}from"./JustificationDetails.esm.js";import{SelectedValueProvider as J}from"./SelectedValueContext.esm.js";const L=D(n=>({markdownContent:{"& :last-child":{marginBottom:0},"& pre":{background:`${n.palette.background.paper} !important`},"& :first-child":{marginTop:0}},root:{padding:n.spacing(2),display:"flex",flexDirection:"column",gap:n.spacing(1.5)},header:{display:"flex",alignItems:"center",justifyContent:"space-between"},iconContainer:{display:"flex",alignItems:"center"},toggleButtonGroup:{marginLeft:"auto"},toggleButton:{padding:n.spacing(.5),fontSize:n.typography.pxToRem(12)},passed:{},failed:{},warning:{},notReported:{},notApplicable:{},exempt:{},error:{},icon:{marginRight:n.spacing(.5)},divider:{margin:n.spacing(.5,0)}}),{name:"CheckResultStateBox"}),M={[i.Passed]:"Check passed",[i.Failed]:"Check did not pass",[i.Warning]:"Check produced warning(s)",[i.NotReported]:"Check not reported",[i.NotApplicable]:"Check not applicable",[i.Exempt]:"Exempt from check",[i.Error]:"Check encountered an error."},O={[i.Passed]:"passed",[i.Failed]:"failed",[i.Warning]:"warning",[i.NotReported]:"notReported",[i.NotApplicable]:"notApplicable",[i.Exempt]:"exempt",[i.Error]:"error"},W=({name:n,state:r,details:t,templateRef:m})=>{const a=L(),[C,c]=R(!1),[p,y]=R("notes"),N=w(A).getOptionalStringArray("soundcheck.flags")?.includes("enable-fix-me"),u=t&&(t.ruleResult||t.applicabilityResult),b=()=>{c(!0)},B=()=>{c(!1)},S=(z,f)=>{f!==null&&y(f)},g=t?.notes?P.safeParse(t.notes):void 0,h=g?.success?g.data.data:void 0;return o(E,{variant:"outlined",className:`${a.root} ${a[O[r]]}`,children:[o("div",{className:a.header,children:[o("div",{className:a.iconContainer,children:[e($,{className:a.icon,result:r}),e(F,{variant:"subtitle1",children:M[r]})]}),u&&o(j,{value:p,exclusive:!0,onChange:S,className:a.toggleButtonGroup,children:[e(x,{value:"notes",className:a.toggleButton,children:"Notes"}),e(x,{value:"details",className:a.toggleButton,children:"Details"})]})]}),p==="notes"&&o(l,{children:[t&&t.exemption&&o(l,{children:[e(s,{className:a.divider}),e(k,{justification:t.exemption,type:"exemption"})]}),t&&t.manualResult&&o(l,{children:[e(s,{className:a.divider}),e(k,{justification:t.manualResult,type:"manual"})]}),h&&o(d,{style:{maxHeight:"35vh",overflowY:"auto"},children:[e(s,{className:a.divider}),e(d,{marginTop:1.5,children:e(I,{className:a.markdownContent,content:h})})]}),N&&r===i.Failed&&m&&o(d,{display:"flex",flexDirection:"column",alignItems:"flex-end",mt:2,width:"100%",children:[e(T,{color:"primary",variant:"contained",onClick:b,children:"Fix"}),e(G,{title:`Fix ${n}`,open:C,setOpen:c,onClose:B,templateRef:m})]})]}),p==="details"&&e(l,{children:u&&o(l,{children:[e(s,{className:a.divider}),o(J,{children:[t.applicabilityResult&&e(v,{ruleResult:t.applicabilityResult,title:"Applicability Rule Evaluation"}),t.ruleResult&&e(v,{ruleResult:t.ruleResult,title:"Check Rule Evaluation"})]})]})})]})};export{W as ResultStateBox};
2
2
  //# sourceMappingURL=ResultStateBox.esm.js.map
@@ -1,2 +1,2 @@
1
- import{jsxs as i,jsx as e,Fragment as v}from"react/jsx-runtime";import{EntityRefLink as B}from"@backstage/plugin-catalog-react";import{makeStyles as E,Box as h,Typography as r,Divider as b,Grid as l}from"@material-ui/core";import{parseFactRef as F,getRuleHash as P}from"@spotify/backstage-plugin-soundcheck-common";import{ResultState as S}from"../../graphql/generated/index.esm.js";import{ResultStateBox as T}from"../CheckDetails/ResultStateBox.esm.js";import{ExpressionTypeReadableMap as w,ExpressionType as z}from"../CheckForm/types/ExpressionType.esm.js";import"../Frequency/types.esm.js";import"../Frequency/util.esm.js";import"../Frequency/FrequencyComponent.esm.js";import"../CheckForm/types/Path.esm.js";import{mapRuleToExpression as k}from"../CheckForm/utils/checkFormUtils.esm.js";import{CheckIcon as D}from"../CheckIcon/CheckIcon.esm.js";import{ExpandableSection as $}from"../ExpandableSection/ExpandableSection.esm.js";import{FormattedPreview as f}from"../FormattedPreview/FormattedPreview.esm.js";const R=E(t=>({dryRunRoot:{padding:t.spacing(2)},dryRunSection:{marginBottom:t.spacing(2)},rulesSection:{padding:t.spacing(2),margin:0,width:"100%"},resultBox:{fontSize:t.typography.body1.fontSize},factBox:{padding:0,border:`1px solid ${t.palette.divider}`,overflow:"auto",fontSize:t.typography.body2.fontSize,maxHeight:500},nested:{margin:t.spacing(3)},expressionType:{padding:t.spacing(1,2)},expressionWrapper:{border:`1px solid ${t.palette.divider}`,marginBottom:t.spacing(2)},resultDisplay:{display:"flex",alignItems:"center"},resultIcon:{marginRight:t.spacing(.25)},ownerLink:{"& span":{"&:hover":{textDecoration:"underline"}},fontSize:t.typography.body1.fontSize},valueBox:{maxHeight:500,overflow:"auto"}})),I=({passed:t})=>{const n=R();return i(r,{variant:"body1",className:n.resultDisplay,children:[e(D,{className:n.resultIcon,result:t?S.Passed:S.Failed})," ",t?"Passed":"Failed"]})},g=({check:t,expression:n,facts:d,ruleResults:m})=>{const o=R();return e(v,{children:i(h,{className:o.expressionWrapper,children:[e(r,{className:o.expressionType,variant:"subtitle1",children:w[n.expressionType??z.AllOf]}),n.conditions?.map((a,c)=>{const s=a.operatorPrefix?`${a.operatorPrefix}:${a.operator}`:a.operator,p=F(a.factRef),u=d?.find(y=>y.factRef===a.factRef),N=P({factRef:p,value:a.value,operator:s,path:a.path}),x=m?.find(y=>y.name===N);return i("div",{children:[e(b,{variant:"middle"}),i(l,{container:!0,className:o.rulesSection,spacing:2,children:[i(l,{item:!0,xs:6,children:[e(r,{variant:"subtitle2",color:"textSecondary",children:"Integration"}),e(r,{variant:"body1",children:p.source})]}),i(l,{item:!0,xs:6,children:[e(r,{variant:"subtitle2",color:"textSecondary",children:"Fact"}),e(r,{variant:"body1",children:p.name})]}),t?.pathResolver&&i(l,{item:!0,xs:6,children:[e(r,{variant:"subtitle2",color:"textSecondary",children:"Path Resolver"}),e(r,{variant:"body1",children:t.pathResolver})]}),i(l,{item:!0,xs:6,children:[e(r,{variant:"subtitle2",color:"textSecondary",children:"Path"}),e(r,{variant:"body1",children:a.path})]}),i(l,{item:!0,xs:6,children:[e(r,{variant:"subtitle2",color:"textSecondary",children:"Operator"}),e(r,{variant:"body1",children:s})]}),x?.result!==void 0&&i(l,{item:!0,xs:6,children:[e(r,{variant:"subtitle2",color:"textSecondary",children:"Result"}),e(I,{passed:x.result})]}),i(l,{item:!0,xs:12,children:[e(r,{variant:"subtitle2",color:"textSecondary",children:"Expected"}),e(r,{component:"div",variant:"body2",className:o.valueBox,children:e(f,{data:a?.value})})]}),i(l,{item:!0,xs:12,children:[e(r,{variant:"subtitle2",color:"textSecondary",children:"Resolved Value"}),e(r,{component:"div",variant:"body2",className:o.valueBox,children:e(f,{data:x?.factResult})})]}),!!u&&e(l,{item:!0,xs:12,children:e($,{elevation:0,title:"Related Fact",children:e("div",{className:o.factBox,children:e(f,{data:u.data})})})})]})]},`expression-${c}`)}),!!n?.expressions&&i(v,{children:[e(b,{variant:"middle"}),e(h,{className:o.nested,children:n?.expressions?.map((a,c)=>e(g,{check:t,facts:d,ruleResults:m,expression:a},`nested-expression-${c}`))})]})]})})},C=({entityRef:t,check:n,checkResult:d,details:m,facts:o,ruleResults:a,applicabilityResults:c})=>{const s=R(),p=k(n?.rule),u=k(n?.applicable);return i(h,{className:s.dryRunRoot,children:[e(h,{className:s.dryRunSection,children:t&&i(v,{children:[e(r,{variant:"h5",children:"Entity"}),e(r,{variant:"body1",children:e(B,{className:s.ownerLink,entityRef:t})})]})}),i(h,{className:s.dryRunSection,children:[e(r,{variant:"h5",children:"Check Result"}),e("div",{className:s.resultBox,children:d?e(T,{name:n?.name??"",state:d,details:m}):"No Results"})]}),!!c?.length&&i("div",{children:[e(r,{variant:"h5",children:"Applicability Rule"}),e(g,{check:n,facts:o,ruleResults:c,expression:u})]}),!!a?.length&&i("div",{children:[e(r,{variant:"h5",children:"Check Rule"}),e(g,{check:n,facts:o,ruleResults:a,expression:p})]})]})};export{C as CheckDryRunDetails};
1
+ import{jsxs as t,jsx as e,Fragment as y}from"react/jsx-runtime";import{EntityRefLink as B}from"@backstage/plugin-catalog-react";import{makeStyles as E,Box as p,Typography as r,Divider as b,Grid as s}from"@material-ui/core";import{Alert as T}from"@material-ui/lab";import{parseFactRef as z,getRuleHash as F}from"@spotify/backstage-plugin-soundcheck-common";import{isEmpty as P}from"lodash";import{ResultState as S}from"../../graphql/generated/index.esm.js";import{ResultStateBox as w}from"../CheckDetails/ResultStateBox.esm.js";import{ExpressionTypeReadableMap as D,ExpressionType as $}from"../CheckForm/types/ExpressionType.esm.js";import"../Frequency/types.esm.js";import"../Frequency/util.esm.js";import"../Frequency/FrequencyComponent.esm.js";import"../CheckForm/types/Path.esm.js";import{mapRuleToExpression as k}from"../CheckForm/utils/checkFormUtils.esm.js";import{CheckIcon as I}from"../CheckIcon/CheckIcon.esm.js";import{ExpandableSection as C}from"../ExpandableSection/ExpandableSection.esm.js";import{FormattedPreview as f}from"../FormattedPreview/FormattedPreview.esm.js";const R=E(i=>({dryRunRoot:{padding:i.spacing(2)},dryRunSection:{marginBottom:i.spacing(2)},rulesSection:{padding:i.spacing(2),margin:0,width:"100%"},resultBox:{fontSize:i.typography.body1.fontSize},factBox:{padding:0,border:`1px solid ${i.palette.divider}`,overflow:"auto",fontSize:i.typography.body2.fontSize,maxHeight:500},nested:{margin:i.spacing(3)},expressionType:{padding:i.spacing(1,2)},expressionWrapper:{border:`1px solid ${i.palette.divider}`,marginBottom:i.spacing(2)},resultDisplay:{display:"flex",alignItems:"center"},resultIcon:{marginRight:i.spacing(.25)},ownerLink:{"& span":{"&:hover":{textDecoration:"underline"}},fontSize:i.typography.body1.fontSize},valueBox:{maxHeight:500,overflow:"auto"}})),A=({passed:i})=>{const n=R();return t(r,{variant:"body1",className:n.resultDisplay,children:[e(I,{className:n.resultIcon,result:i?S.Passed:S.Failed})," ",i?"Passed":"Failed"]})},g=({check:i,expression:n,facts:h,ruleResults:u})=>{const o=R();return e(y,{children:t(p,{className:o.expressionWrapper,children:[e(r,{className:o.expressionType,variant:"subtitle1",children:D[n.expressionType??$.AllOf]}),n.conditions?.map((a,c)=>{const l=a.operatorPrefix?`${a.operatorPrefix}:${a.operator}`:a.operator,m=z(a.factRef),d=h?.find(v=>v.factRef===a.factRef),N=F({factRef:m,value:a.value,operator:l,path:a.path}),x=u?.find(v=>v.name===N);return t("div",{children:[e(b,{variant:"middle"}),t(s,{container:!0,className:o.rulesSection,spacing:2,children:[t(s,{item:!0,xs:6,children:[e(r,{variant:"subtitle2",color:"textSecondary",children:"Integration"}),e(r,{variant:"body1",children:m.source})]}),t(s,{item:!0,xs:6,children:[e(r,{variant:"subtitle2",color:"textSecondary",children:"Fact"}),e(r,{variant:"body1",children:m.name})]}),i?.pathResolver&&t(s,{item:!0,xs:6,children:[e(r,{variant:"subtitle2",color:"textSecondary",children:"Path Resolver"}),e(r,{variant:"body1",children:i.pathResolver})]}),t(s,{item:!0,xs:6,children:[e(r,{variant:"subtitle2",color:"textSecondary",children:"Path"}),e(r,{variant:"body1",children:a.path})]}),t(s,{item:!0,xs:6,children:[e(r,{variant:"subtitle2",color:"textSecondary",children:"Operator"}),e(r,{variant:"body1",children:l})]}),x?.result!==void 0&&t(s,{item:!0,xs:6,children:[e(r,{variant:"subtitle2",color:"textSecondary",children:"Result"}),e(A,{passed:x.result})]}),t(s,{item:!0,xs:12,children:[e(r,{variant:"subtitle2",color:"textSecondary",children:"Expected"}),e(r,{component:"div",variant:"body2",className:o.valueBox,children:e(f,{data:a?.value})})]}),t(s,{item:!0,xs:12,children:[e(r,{variant:"subtitle2",color:"textSecondary",children:"Resolved Value"}),e(r,{component:"div",variant:"body2",className:o.valueBox,children:e(f,{data:x?.factResult})})]}),!!d&&e(s,{item:!0,xs:12,children:e(C,{elevation:0,title:"Related Fact",children:e("div",{className:o.factBox,children:d.sensitive&&P(d.data)?e(p,{children:e(T,{severity:"info",children:"The associated fact contains potentially sensitive information and has been redacted."})}):e(f,{data:d.data})})})})]})]},`expression-${c}`)}),!!n?.expressions&&t(y,{children:[e(b,{variant:"middle"}),e(p,{className:o.nested,children:n?.expressions?.map((a,c)=>e(g,{check:i,facts:h,ruleResults:u,expression:a},`nested-expression-${c}`))})]})]})})},H=({entityRef:i,check:n,checkResult:h,details:u,facts:o,ruleResults:a,applicabilityResults:c})=>{const l=R(),m=k(n?.rule),d=k(n?.applicable);return t(p,{className:l.dryRunRoot,children:[e(p,{className:l.dryRunSection,children:i&&t(y,{children:[e(r,{variant:"h5",children:"Entity"}),e(r,{variant:"body1",children:e(B,{className:l.ownerLink,entityRef:i})})]})}),t(p,{className:l.dryRunSection,children:[e(r,{variant:"h5",children:"Check Result"}),e("div",{className:l.resultBox,children:h?e(w,{name:n?.name??"",state:h,details:u}):"No Results"})]}),!!c?.length&&t("div",{children:[e(r,{variant:"h5",children:"Applicability Rule"}),e(g,{check:n,facts:o,ruleResults:c,expression:d})]}),!!a?.length&&t("div",{children:[e(r,{variant:"h5",children:"Check Rule"}),e(g,{check:n,facts:o,ruleResults:a,expression:m})]})]})};export{H as CheckDryRunDetails};
2
2
  //# sourceMappingURL=CheckDryRunDetails.esm.js.map
@@ -1,2 +1,2 @@
1
- import{jsx as t}from"react/jsx-runtime";import{Grid as m}from"@material-ui/core";import{makeStyles as s}from"@material-ui/core/styles";import{RuleConditionInput as p}from"./RuleConditionInput.esm.js";import{ValueListContextProvider as c}from"./ValueListContext.esm.js";const b=s(()=>({noPadding:{padding:0}})),f=({conditions:n,name:i,handleDelete:d,disabled:o,disableDelete:r,depth:a})=>{const l=b();return t(c,{children:n.map((h,e)=>t(m,{item:!0,className:l.noPadding,children:t(p,{name:`${i}.conditions[${e}]`,"data-testid":`${i}-condition-input`,handleDelete:()=>d(e),disabled:o,disableDelete:a===0&&e===0?!0:r})},e))})};export{f as ConditionList};
1
+ import{jsx as i}from"react/jsx-runtime";import{Grid as s}from"@material-ui/core";import{makeStyles as l}from"@material-ui/core/styles";import{RuleConditionInput as c}from"./RuleConditionInput.esm.js";import{ValueListContextProvider as p}from"./ValueListContext.esm.js";const f=l(()=>({noPadding:{padding:0}})),u=({name:e,disabled:o,disableDelete:n,conditions:d,remove:r})=>{const a=f();return i(p,{children:d.map((m,t)=>i(s,{item:!0,className:a.noPadding,children:i(c,{name:`${e}.conditions[${t}]`,"data-testid":`${e}-condition-input`,handleDelete:()=>r(t),disabled:o,disableDelete:n})},m.id))})};export{u as ConditionList};
2
2
  //# sourceMappingURL=ConditionList.esm.js.map
@@ -1,2 +1,2 @@
1
- import{jsxs as l,Fragment as i,jsx as r}from"react/jsx-runtime";import{Box as n,IconButton as c,FormHelperText as m}from"@material-ui/core";import h from"@material-ui/icons/Close";import{useRuleConditionStyles as d}from"./styles.esm.js";const f=({value:e,handleClear:t,error:o})=>{const a=d(),s=e?.factRef&&e?.path?l(i,{children:[r("strong",{children:"Fact:"})," ",e.factRef," ",r("strong",{children:"Path:"})," ",e.path]}):JSON.stringify(e);return l(i,{children:[l(n,{className:a.valueDisplay,children:[r(n,{overflow:"hidden",flexGrow:1,children:s}),r(c,{onClick:t,size:"small",children:r(h,{})})]}),o&&r(m,{error:!0,children:o.message})]})};export{f as FactValueDisplay};
1
+ import{jsxs as l,Fragment as i,jsx as r}from"react/jsx-runtime";import{Box as n,IconButton as c,FormHelperText as h}from"@material-ui/core";import m from"@material-ui/icons/Close";import{useRuleConditionStyles as d}from"./styles.esm.js";const f=({value:e,handleClear:t,error:o})=>{const a=d(),s=e?.factRef&&e?.path?l(i,{children:[r("strong",{children:"Fact:"})," ",e.factRef," ",r("strong",{children:"Path:"})," ",e.path]}):JSON.stringify(e);return l(i,{children:[l(n,{className:a.valueDisplay,children:[r(n,{overflow:"hidden",flexGrow:1,children:s}),r(c,{onClick:t,size:"small",children:r(m,{})})]}),o&&r(h,{error:!0,children:o.message})]})};export{f as FactValueDisplay};
2
2
  //# sourceMappingURL=FactValueDisplay.esm.js.map
@@ -1,2 +1,2 @@
1
- import{jsxs as n,jsx as a,Fragment as D}from"react/jsx-runtime";import{Box as r,FormLabel as c,TextField as T,IconButton as A}from"@material-ui/core";import k from"@material-ui/icons/Close";import E from"@material-ui/icons/Delete";import G from"@material-ui/icons/List";import{asArray as M}from"@spotify/backstage-plugin-soundcheck-common";import{useMemo as R,useCallback as b}from"react";import{useFormContext as W,Controller as z}from"react-hook-form";import{useOperators as H}from"../../../../../hooks/operators/useOperators.esm.js";import{FactExplorerDialogButton as F}from"../../../../FactExplorer/FactExplorerDialog.esm.js";import"../../../../FactExplorer/FactExplorerContext.esm.js";import{FormControlledAutocomplete as v}from"../../../../FormControlledAutocomplete/FormControlledAutocomplete.esm.js";import{FactValueDisplay as q}from"./FactValueDisplay.esm.js";import{useRuleConditionStyles as J}from"./styles.esm.js";import{useRuleOptions as K}from"./useRuleOptions.esm.js";import{ValueListInputDialogButton as O}from"./ValueListInput.esm.js";const Q=({name:l,handleDelete:w,disabled:d,disableDelete:x})=>{const t=J(),{control:p,setValue:s,watch:m,clearErrors:h}=W(),{data:N,isLoading:g}=H(),S=m("rulesStep.pathResolver")==="jsonpath",f=R(()=>N?.map(e=>({value:e.name,label:e.title})).sort((e,o)=>e.label.localeCompare(o.label))??[],[N]),j=R(()=>f.map(e=>e.value),[f]),{pathOptions:B,factRefOptions:u,isLoading:$}=K(l,p),I=R(()=>u?.map(e=>e.value)??[],[u]),P=b(({factRef:e,path:o})=>{s(`${l}.factRef`,e),s(`${l}.path`,o),h()},[h,l,s]),V=b(({factRef:e,path:o})=>{s(`${l}.value`,{factRef:e,path:o}),h()},[h,l,s]),L=b(e=>{s(`${l}.value`,e.length>0?e:""),h()},[h,l,s]),i=m(`${l}.value`),C=b(()=>{s(`${l}.value`,"")},[l,s]);return n(r,{className:t.container,children:[a(r,{className:t.connector}),n(r,{paddingTop:2,paddingLeft:2,paddingRight:2,paddingBottom:2,width:"100%",className:t.innerContainer,children:[n(r,{className:t.inputsContainer,children:[u&&n(r,{children:[a(c,{className:t.formLabel,children:"Fact"}),a(v,{name:`${l}.factRef`,control:p,placeholder:"Fact",options:I,getOptionLabel:e=>u?.find(o=>e===o.value)?.label??e,getOptionValue:e=>u?.find(o=>e===o.label)?.value??e??"",disabled:d||$,width:428})]}),n(r,{flexGrow:1,children:[a(c,{className:t.formLabel,children:"Path"}),a(v,{name:`${l}.path`,placeholder:"Path",control:p,disabled:d||$,options:S?B:[],fullWidth:!0})]}),n(r,{children:[a(c,{className:t.formLabel,style:{visibility:"hidden"},children:"Explore"}),a(r,{width:150,children:a(F,{factRef:m(`${l}.factRef`),path:m(`${l}.path`),onSave:P,pathResolver:m("rulesStep.pathResolver"),className:t.exploreButton,hideIcon:!0})})]})]}),n(r,{className:t.inputsContainer,children:[f&&n(D,{children:[n(r,{children:[a(c,{className:t.formLabel,children:"Prefix (Optional)"}),a(v,{name:`${l}.operatorPrefix`,control:p,placeholder:"Prefix",options:["all","any","none"],disabled:g||d,width:120})]}),n(r,{children:[a(c,{className:t.formLabel,children:"Operator"}),a(v,{name:`${l}.operator`,control:p,placeholder:"Operator",options:j,disabled:g||d,getOptionLabel:e=>(o=>f?.find(y=>o===y.value)?.label??o??"")(e),getOptionValue:e=>(o=>f?.find(y=>o===y.label)?.value??o??"")(e),width:300})]})]}),n(r,{flexGrow:1,children:[a(c,{className:t.formLabel,children:"Value"}),typeof i=="object"&&!Array.isArray(i)?a(q,{value:i,handleClear:C}):a(z,{name:`${l}.value`,control:p,defaultValue:"",render:({field:e,fieldState:o})=>a(T,{...e,variant:"outlined",placeholder:"Enter a value",FormHelperTextProps:{className:t.helperText},error:o.invalid,helperText:o.error?o.error.message:null,margin:"dense",disabled:d||typeof i=="object",className:t.noMargin,fullWidth:!0,InputProps:{endAdornment:a(A,{onClick:C,size:"small",children:a(k,{})}),startAdornment:Array.isArray(i)?a(O,{values:i,onSave:L,iconButton:a(G,{})}):null}})})]}),n(r,{children:[a(c,{className:t.formLabel,style:{visibility:"hidden"},children:"Alternative Input"}),n(r,{display:"flex",width:150,children:[a(F,{factRef:typeof i=="object"?i?.factRef:void 0,path:typeof i=="object"?i?.path:void 0,onSave:V,pathResolver:m("rulesStep.pathResolver"),className:t.exploreButton,text:"Fact",hideIcon:!0}),a(O,{values:typeof i=="object"&&!Array.isArray(i)?void 0:M(i),onSave:L})]})]})]})]}),a(A,{onClick:w,className:t.deleteButton,"data-test-id":`${l}-delete-button`,disabled:d||x,hidden:d||x,style:{visibility:d||x?"hidden":void 0},children:a(E,{className:t.deleteIcon})})]})};export{Q as RuleConditionInput};
1
+ import{jsxs as n,jsx as a,Fragment as D}from"react/jsx-runtime";import{Box as r,FormLabel as c,TextField as T,IconButton as A}from"@material-ui/core";import k from"@material-ui/icons/Close";import E from"@material-ui/icons/Delete";import G from"@material-ui/icons/List";import{asArray as M}from"@spotify/backstage-plugin-soundcheck-common";import{useMemo as R,useCallback as b}from"react";import{useFormContext as W,Controller as z}from"react-hook-form";import{useOperators as H}from"../../../../../hooks/operators/useOperators.esm.js";import{FactExplorerDialogButton as F}from"../../../../FactExplorer/FactExplorerDialog.esm.js";import"../../../../FactExplorer/FactExplorerContext.esm.js";import{FormControlledAutocomplete as v}from"../../../../FormControlledAutocomplete/FormControlledAutocomplete.esm.js";import{FactValueDisplay as q}from"./FactValueDisplay.esm.js";import{useRuleConditionStyles as J}from"./styles.esm.js";import{useRuleOptions as K}from"./useRuleOptions.esm.js";import{ValueListInputDialogButton as O}from"./ValueListInput.esm.js";const Q=({name:l,handleDelete:w,disabled:d,disableDelete:x})=>{const t=J(),{control:p,setValue:s,watch:m,clearErrors:h}=W(),{data:N,isLoading:g}=H(),S=m("rulesStep.pathResolver")==="jsonpath",f=R(()=>N?.map(e=>({value:e.name,label:e.title})).sort((e,o)=>e.label.localeCompare(o.label))??[],[N]),j=R(()=>f.map(e=>e.value),[f]),{pathOptions:B,factRefOptions:u,isLoading:L}=K(l,p),I=R(()=>u?.map(e=>e.value)??[],[u]),P=b(({factRef:e,path:o})=>{s(`${l}.factRef`,e),s(`${l}.path`,o),h()},[h,l,s]),V=b(({factRef:e,path:o})=>{s(`${l}.value`,{factRef:e,path:o}),h()},[h,l,s]),$=b(e=>{s(`${l}.value`,e.length>0?e:""),h()},[h,l,s]),i=m(`${l}.value`),C=b(()=>{s(`${l}.value`,"")},[l,s]);return n(r,{className:t.container,children:[a(r,{className:t.connector}),n(r,{paddingTop:2,paddingLeft:2,paddingRight:2,paddingBottom:2,width:"100%",className:t.innerContainer,children:[n(r,{className:t.inputsContainer,children:[u&&n(r,{children:[a(c,{className:t.formLabel,children:"Fact"}),a(v,{name:`${l}.factRef`,control:p,placeholder:"Fact",options:I,getOptionLabel:e=>u?.find(o=>e===o.value)?.label??e,getOptionValue:e=>u?.find(o=>e===o.label)?.value??e??"",disabled:d||L,width:428})]}),n(r,{flexGrow:1,children:[a(c,{className:t.formLabel,children:"Path"}),a(v,{name:`${l}.path`,placeholder:"Path",control:p,disabled:d||L,options:S?B:[],fullWidth:!0})]}),n(r,{children:[a(c,{className:t.formLabel,style:{visibility:"hidden"},children:"Explore"}),a(r,{width:150,children:a(F,{factRef:m(`${l}.factRef`),path:m(`${l}.path`),onSave:P,pathResolver:m("rulesStep.pathResolver"),className:t.exploreButton,hideIcon:!0})})]})]}),n(r,{className:t.inputsContainer,children:[f&&n(D,{children:[n(r,{children:[a(c,{className:t.formLabel,children:"Prefix (Optional)"}),a(v,{name:`${l}.operatorPrefix`,control:p,placeholder:"Prefix",options:["all","any","none"],disabled:g||d,width:120})]}),n(r,{children:[a(c,{className:t.formLabel,children:"Operator"}),a(v,{name:`${l}.operator`,control:p,placeholder:"Operator",options:j,disabled:g||d,getOptionLabel:e=>(o=>f?.find(y=>o===y.value)?.label??o??"")(e),getOptionValue:e=>(o=>f?.find(y=>o===y.label)?.value??o??"")(e),width:300})]})]}),n(r,{flexGrow:1,children:[a(c,{className:t.formLabel,children:"Value"}),typeof i=="object"&&!Array.isArray(i)?a(q,{value:i,handleClear:C}):a(z,{name:`${l}.value`,control:p,defaultValue:"",render:({field:e,fieldState:o})=>a(T,{...e,variant:"outlined",placeholder:"Enter a value",FormHelperTextProps:{className:t.helperText},error:o.invalid,helperText:o.error?o.error.message:null,margin:"dense",disabled:d||typeof i=="object",className:t.noMargin,fullWidth:!0,InputProps:{endAdornment:a(A,{onClick:C,size:"small",children:a(k,{})}),startAdornment:Array.isArray(i)?a(O,{values:i,onSave:$,iconButton:a(G,{})}):null}})})]}),n(r,{children:[a(c,{className:t.formLabel,style:{visibility:"hidden"},children:"Alternative Input"}),n(r,{display:"flex",width:150,children:[a(F,{factRef:typeof i=="object"?i?.factRef:void 0,path:typeof i=="object"?i?.path:void 0,onSave:V,pathResolver:m("rulesStep.pathResolver"),className:t.exploreButton,text:"Fact",hideIcon:!0}),a(O,{values:typeof i=="object"&&!Array.isArray(i)?void 0:M(i),onSave:$})]})]})]})]}),a(A,{onClick:w,className:t.deleteButton,"data-testid":`${l}-delete-button`,disabled:d||x,hidden:d||x,style:{visibility:d||x?"hidden":void 0},children:a(E,{className:t.deleteIcon})})]})};export{Q as RuleConditionInput};
2
2
  //# sourceMappingURL=RuleConditionInput.esm.js.map
@@ -1,2 +1,2 @@
1
- import{jsx as o}from"react/jsx-runtime";import{Grid as m}from"@material-ui/core";import{makeStyles as t}from"@material-ui/core/styles";import{RuleInputBox as s}from"../RuleInputBox.esm.js";const p=t(()=>({noPadding:{padding:0}})),a=({expression:e,name:n,depth:i,disabled:r})=>{const d=p();return e?o(m,{item:!0,className:d.noPadding,children:o(s,{name:`${n}`,depth:i+1,disabled:r})}):null};export{a as ExpressionBox};
1
+ import{jsx as e}from"react/jsx-runtime";import{Grid as d}from"@material-ui/core";import{makeStyles as t}from"@material-ui/core/styles";import{RuleInputBox as p}from"../RuleInputBox.esm.js";const a=t(()=>({noPadding:{padding:0}})),l=({exists:o,name:r,depth:n,disabled:s,removeExpression:i})=>{const m=a();return o?e(d,{item:!0,className:m.noPadding,children:e(p,{removeExpression:i,name:`${r}`,depth:n+1,disabled:s})}):null};export{l as ExpressionBox};
2
2
  //# sourceMappingURL=ExpressionBox.esm.js.map
@@ -1,2 +1,2 @@
1
- import{jsxs as p,jsx as e}from"react/jsx-runtime";import{Box as l,Grid as t}from"@material-ui/core";import{makeStyles as N}from"@material-ui/core/styles";import{useFormContext as $}from"react-hook-form";import{AddMenuButton as y}from"./AddMenuButton.esm.js";import"@material-ui/icons/Close";import"@material-ui/icons/Delete";import"@material-ui/icons/List";import"@spotify/backstage-plugin-soundcheck-common";import"react";import"@backstage/core-plugin-api";import"@tanstack/react-query";import"../../../../api.esm.js";import"@material-ui/icons/Search";import"../../../SoundcheckDialog/SoundcheckDialog.esm.js";import"../../../FactExplorer/FactExplorer.esm.js";import"../../../FactExplorer/FactExplorerContext.esm.js";import"../../../FormControlledAutocomplete/FormControlledAutocomplete.esm.js";import"./Conditions/styles.esm.js";import"@backstage/catalog-model";import"../../../../hooks/graphqlKeys.esm.js";import"@backstage/plugin-catalog-react";import"../../../../hooks/useSoundcheckAlert.esm.js";import"../../../../hooks/useConfirmationModal.esm.js";import"react-router-dom";import"../../utils/checkFormUtils.esm.js";import"./Conditions/ValueListInput.esm.js";import{ConditionList as A}from"./Conditions/ConditionList.esm.js";import{ExpressionBox as C}from"./Expressions/ExpressionBox.esm.js";import{ExpressionTypeToggle as P}from"./Expressions/ExpressionTypeToggle.esm.js";import{useRuleInputHandlers as w}from"./useRuleInputHandlers.esm.js";const E=N(o=>({root:{padding:0},inner:{marginLeft:o.spacing(2),paddingBottom:o.spacing(2),borderLeft:`1px solid ${o.palette.border}`,display:"flex",flexDirection:"row",gap:0},connector:{borderBottom:`1px solid ${o.palette.border}`,padding:o.spacing(0),width:"15px",height:"20px"},noPadding:{padding:0}})),D=({name:o,depth:n,disabled:r})=>{const i=E(),{setValue:c,trigger:g,watch:m}=$(),{handleAddCondition:x,handleAddExpression:h,handleDeleteCondition:f}=w(o,m,c,g),u=`${o}`,s=m(u),b=s?.conditions||[],B=s?.expressions;return p(l,{className:n>0?i.inner:i.root,children:[n>0&&e(l,{className:i.connector}),p(t,{container:!0,spacing:0,direction:"column",className:i.noPadding,children:[e(t,{item:!0,className:i.noPadding,children:e(P,{disabled:r,name:`${o}.expressionType`})}),p(t,{item:!0,container:!0,spacing:0,direction:"column",className:i.noPadding,children:[e(A,{depth:n,handleDelete:d=>f(d,o),disabled:r,conditions:b,name:o}),B?.map((d,a)=>e(C,{expression:d,name:`${o}.expressions[${a}]`,depth:n,disabled:r},a))]}),!r&&e(t,{item:!0,className:i.noPadding,children:e(y,{onAddCondition:x,onAddExpression:h})})]})]})};export{D as RuleInputBox};
1
+ import{jsxs as n,jsx as o}from"react/jsx-runtime";import{Box as r,Grid as p,Button as y}from"@material-ui/core";import{makeStyles as B}from"@material-ui/core/styles";import{useFormContext as b,useFieldArray as x}from"react-hook-form";import{ExpressionType as N}from"../../types/ExpressionType.esm.js";import"../../../Frequency/types.esm.js";import"../../../Frequency/util.esm.js";import"../../../Frequency/FrequencyComponent.esm.js";import"../../types/Path.esm.js";import{AddMenuButton as $}from"./AddMenuButton.esm.js";import"@material-ui/icons/Close";import"@material-ui/icons/Delete";import"@material-ui/icons/List";import"@spotify/backstage-plugin-soundcheck-common";import"react";import"@backstage/core-plugin-api";import"@tanstack/react-query";import"../../../../api.esm.js";import"@material-ui/icons/Search";import"../../../SoundcheckDialog/SoundcheckDialog.esm.js";import"../../../FactExplorer/FactExplorer.esm.js";import"../../../FactExplorer/FactExplorerContext.esm.js";import"../../../FormControlledAutocomplete/FormControlledAutocomplete.esm.js";import"./Conditions/styles.esm.js";import"@backstage/catalog-model";import"../../../../hooks/graphqlKeys.esm.js";import"@backstage/plugin-catalog-react";import"../../../../hooks/useSoundcheckAlert.esm.js";import"../../../../hooks/useConfirmationModal.esm.js";import"react-router-dom";import"../../utils/checkFormUtils.esm.js";import"./Conditions/ValueListInput.esm.js";import{ConditionList as A}from"./Conditions/ConditionList.esm.js";import{ExpressionBox as E}from"./Expressions/ExpressionBox.esm.js";import{ExpressionTypeToggle as P}from"./Expressions/ExpressionTypeToggle.esm.js";const L=B(e=>({root:{padding:0},inner:{marginLeft:e.spacing(2),paddingBottom:e.spacing(2),borderLeft:`1px solid ${e.palette.border}`,display:"flex",flexDirection:"row",gap:0},connector:{borderBottom:`1px solid ${e.palette.border}`,padding:e.spacing(0),width:"15px",height:"20px"},noPadding:{padding:0},marginBottom:{marginBottom:e.spacing(1)},empty:{border:`1px solid ${e.palette.error.main}`,padding:e.spacing(2),margin:e.spacing(2,0)},gap:{borderLeft:`1px solid ${e.palette.border}`,marginLeft:e.spacing(2)},removeButton:{padding:e.spacing(.5,1.5),color:e.palette.text.primary}})),T=({name:e,depth:m,disabled:t,removeExpression:s})=>{const i=L(),{control:l}=b(),{fields:a,append:f,remove:h}=x({control:l,name:`${e}.expressions`}),{fields:d,append:u,remove:v}=x({control:l,name:`${e}.conditions`});return n(r,{className:m>0?i.inner:i.root,children:[m>0&&o(r,{className:i.connector}),n(p,{container:!0,spacing:0,direction:"column",className:i.noPadding,children:[o(p,{item:!0,className:i.noPadding,children:o(P,{disabled:t,name:`${e}.expressionType`})}),n(p,{item:!0,container:!0,spacing:0,direction:"column",className:i.noPadding,children:[d.length===0&&!a.length&&o(r,{className:i.empty,children:"Add an expression or condition."}),d.length===0&&a.length>0&&o(r,{padding:1,className:i.gap}),o(A,{remove:v,conditions:d,disabled:t,name:e}),a.map((c,g)=>o(E,{exists:!!c,name:`${e}.expressions[${g}]`,depth:m,disabled:t,removeExpression:()=>h(g)},c.id))]}),!t&&o(p,{item:!0,className:i.noPadding,children:n(r,{display:"flex",gridGap:8,children:[o($,{onAddCondition:()=>u({factRef:"",path:"",operator:"",value:""}),onAddExpression:()=>f({expressionType:N.AllOf,expressions:void 0,conditions:[{factRef:"",path:"",operator:"",value:""}]})}),s&&o(y,{className:i.removeButton,variant:"text",onClick:s,children:"Remove"})]})})]})]})};export{T as RuleInputBox};
2
2
  //# sourceMappingURL=RuleInputBox.esm.js.map
@@ -1,2 +1,2 @@
1
- import{jsxs as i,jsx as e}from"react/jsx-runtime";import{FormControlLabel as y,Switch as b,Typography as m}from"@material-ui/core";import{makeStyles as x}from"@material-ui/core/styles";import{useFormContext as g}from"react-hook-form";import"../../../contexts/TrackFormContext.esm.js";import{useCheckFormContext as k}from"../../../contexts/CheckFormContext.esm.js";import"../../../contexts/CampaignFormContext.esm.js";import"react";import"../../../contexts/UserProvider.esm.js";import{FormFieldLabel as s}from"../../FormFieldLabel/FormFieldLabel.esm.js";import{FormFilterSection as F}from"../../FormFilterSection/FormFilterSection.esm.js";import{FormMarkdownInput as v}from"../../FormMarkdownInput/FormMarkdownInput.esm.js";import"../FormFields/CheckNameInput/CheckNameInput.esm.js";import"../FormFields/PassFailMessageInput/PassFailMessageInput.esm.js";import{CHECK_FIELDS as C}from"../utils/checkFormUtils.esm.js";import"../FormFields/TeamDetailsInput/TeamDetailsInput.esm.js";import"../FormFields/RuleInput/AddMenuButton.esm.js";import{RuleInputBox as S}from"../FormFields/RuleInput/RuleInputBox.esm.js";import"../FormFields/RuleInput/Expressions/ExpressionBox.esm.js";import"../FormFields/RuleInput/Expressions/ExpressionTypeToggle.esm.js";import"@material-ui/icons/Close";import"@material-ui/icons/Delete";import"@material-ui/icons/List";import"@spotify/backstage-plugin-soundcheck-common";import"@backstage/core-plugin-api";import"@tanstack/react-query";import"../../../api.esm.js";import"@material-ui/icons/Search";import"../../SoundcheckDialog/SoundcheckDialog.esm.js";import"../../FactExplorer/FactExplorer.esm.js";import"../../FactExplorer/FactExplorerContext.esm.js";import"../../FormControlledAutocomplete/FormControlledAutocomplete.esm.js";import"../FormFields/RuleInput/Conditions/styles.esm.js";import"@backstage/catalog-model";import"../../../hooks/graphqlKeys.esm.js";import"@backstage/plugin-catalog-react";import"../../../hooks/useSoundcheckAlert.esm.js";import"../../../hooks/useConfirmationModal.esm.js";import"react-router-dom";import"../FormFields/RuleInput/Conditions/ValueListInput.esm.js";import"../FormFields/RuleInput/Conditions/ConditionList.esm.js";import"../FormFields/CheckScheduleSection/ScheduleSection.esm.js";import"../FormFields/CheckPathResolverInput.esm.js";import{ExpressionType as N}from"../types/ExpressionType.esm.js";import"../../Frequency/types.esm.js";import"../../Frequency/util.esm.js";import"../../Frequency/FrequencyComponent.esm.js";import"../types/Path.esm.js";const w=x(t=>({container:{display:"flex",flexDirection:"column",gap:t.spacing(2)},innerContainer:{display:"flex",flexDirection:"column"}})),E=()=>{const t=w(),{isLoading:r,isReadOnly:o}=k(),{control:d,watch:n,setValue:a}=g(),l="filtersStep.applicabilityExpressions",p="filtersStep.notApplicableMessage",h=n("detailsStep.type"),c=n(l),f=u=>{u.target.checked?(a(l,{expressionType:N.AllOf,conditions:[{factRef:"",path:"",operator:"",operatorPrefix:"",value:""}]}),a(p,"")):(a(l,void 0),a(p,void 0))};return i("div",{className:t.container,children:[e(F,{name:"filtersStep.filter",keyValueFilterName:"filtersStep.keyValueFilter",disabled:r||o,description:C.filter.description,excludeFilterName:"filtersStep.excludeFilter",excludeKeyValueFilterName:"filtersStep.excludeKeyValueFilter"}),h!=="manual"&&i("div",{className:t.container,children:[i("div",{className:t.innerContainer,children:[e(y,{label:e(s,{title:"Applicability rule (Optional)",docLink:"https://backstage.spotify.com/docs/plugins/soundcheck/core-concepts/checks/#applicability-rule"}),disabled:r||o,control:e(b,{checked:!!c?.conditions?.length,onChange:f})}),e(m,{variant:"caption",children:"The check applies to all entities that match the catalog filters above. If you want to add an extra fact-based applicability rule, turn on the toggle and define the fact-based rule. With this rule enabled, the check will only apply to entities that match both the catalog filters and the fact-based rule. The fact-based rule is re-checked every time the check runs."})]}),!!c?.conditions?.length&&i("div",{className:t.container,children:[e("div",{className:t.innerContainer,children:e(S,{disabled:r||o,name:l,depth:0})}),i("div",{className:t.innerContainer,children:[e(s,{title:"Not applicable message (Optional)"}),e(m,{variant:"caption",children:"Add a message explaining why the check doesn't apply if an entity fails the fact-based rule."}),e(v,{name:p,control:d,placeholder:"Enter not applicable message...",disabled:r||o})]})]})]})]})};export{E as CheckApplicabilityStep};
1
+ import{jsxs as i,jsx as e}from"react/jsx-runtime";import{FormControlLabel as y,Switch as b,Typography as m}from"@material-ui/core";import{makeStyles as x}from"@material-ui/core/styles";import{useFormContext as g}from"react-hook-form";import"../../../contexts/TrackFormContext.esm.js";import{useCheckFormContext as k}from"../../../contexts/CheckFormContext.esm.js";import"../../../contexts/CampaignFormContext.esm.js";import"react";import"../../../contexts/UserProvider.esm.js";import{FormFieldLabel as s}from"../../FormFieldLabel/FormFieldLabel.esm.js";import{FormFilterSection as F}from"../../FormFilterSection/FormFilterSection.esm.js";import{FormMarkdownInput as v}from"../../FormMarkdownInput/FormMarkdownInput.esm.js";import"../FormFields/CheckNameInput/CheckNameInput.esm.js";import"../FormFields/PassFailMessageInput/PassFailMessageInput.esm.js";import{CHECK_FIELDS as C}from"../utils/checkFormUtils.esm.js";import"../FormFields/TeamDetailsInput/TeamDetailsInput.esm.js";import"../FormFields/RuleInput/AddMenuButton.esm.js";import{RuleInputBox as S}from"../FormFields/RuleInput/RuleInputBox.esm.js";import"../FormFields/RuleInput/Expressions/ExpressionBox.esm.js";import"../FormFields/RuleInput/Expressions/ExpressionTypeToggle.esm.js";import"@material-ui/icons/Close";import"@material-ui/icons/Delete";import"@material-ui/icons/List";import"@spotify/backstage-plugin-soundcheck-common";import"@backstage/core-plugin-api";import"@tanstack/react-query";import"../../../api.esm.js";import"@material-ui/icons/Search";import"../../SoundcheckDialog/SoundcheckDialog.esm.js";import"../../FactExplorer/FactExplorer.esm.js";import"../../FactExplorer/FactExplorerContext.esm.js";import"../../FormControlledAutocomplete/FormControlledAutocomplete.esm.js";import"../FormFields/RuleInput/Conditions/styles.esm.js";import"@backstage/catalog-model";import"../../../hooks/graphqlKeys.esm.js";import"@backstage/plugin-catalog-react";import"../../../hooks/useSoundcheckAlert.esm.js";import"../../../hooks/useConfirmationModal.esm.js";import"react-router-dom";import"../FormFields/RuleInput/Conditions/ValueListInput.esm.js";import"../FormFields/RuleInput/Conditions/ConditionList.esm.js";import"../FormFields/CheckScheduleSection/ScheduleSection.esm.js";import"../FormFields/CheckPathResolverInput.esm.js";import{ExpressionType as N}from"../types/ExpressionType.esm.js";import"../../Frequency/types.esm.js";import"../../Frequency/util.esm.js";import"../../Frequency/FrequencyComponent.esm.js";import"../types/Path.esm.js";const w=x(t=>({container:{display:"flex",flexDirection:"column",gap:t.spacing(2)},innerContainer:{display:"flex",flexDirection:"column"}})),E=()=>{const t=w(),{isLoading:r,isReadOnly:o}=k(),{control:d,watch:c,setValue:a}=g(),l="filtersStep.applicabilityExpressions",n="filtersStep.notApplicableMessage",h=c("detailsStep.type"),p=c(l),f=u=>{u.target.checked?(a(l,{expressionType:N.AllOf,conditions:[{factRef:"",path:"",operator:"",operatorPrefix:"",value:""}]}),a(n,"")):(a(l,void 0),a(n,void 0))};return i("div",{className:t.container,children:[e(F,{name:"filtersStep.filter",keyValueFilterName:"filtersStep.keyValueFilter",disabled:r||o,description:C.filter.description,excludeFilterName:"filtersStep.excludeFilter",excludeKeyValueFilterName:"filtersStep.excludeKeyValueFilter"}),h!=="manual"&&i("div",{className:t.container,children:[i("div",{className:t.innerContainer,children:[e(y,{label:e(s,{title:"Applicability rule (Optional)",docLink:"https://backstage.spotify.com/docs/plugins/soundcheck/core-concepts/checks/#applicability-rule"}),disabled:r||o,control:e(b,{checked:!!p?.conditions||!!p?.expressions,onChange:f})}),e(m,{variant:"caption",children:"The check applies to all entities that match the catalog filters above. If you want to add an extra fact-based applicability rule, turn on the toggle and define the fact-based rule. With this rule enabled, the check will only apply to entities that match both the catalog filters and the fact-based rule. The fact-based rule is re-checked every time the check runs."})]}),(!!p?.conditions||!!p?.expressions)&&i("div",{className:t.container,children:[e("div",{className:t.innerContainer,children:e(S,{disabled:r||o,name:l,depth:0})}),i("div",{className:t.innerContainer,children:[e(s,{title:"Not applicable message (Optional)"}),e(m,{variant:"caption",children:"Add a message explaining why the check doesn't apply if an entity fails the fact-based rule."}),e(v,{name:n,control:d,placeholder:"Enter not applicable message...",disabled:r||o})]})]})]})]})};export{E as CheckApplicabilityStep};
2
2
  //# sourceMappingURL=CheckApplicabilityStep.esm.js.map
@@ -1,3 +1,3 @@
1
- import{FrequencySchema as A}from"@spotify/backstage-plugin-soundcheck-common";import{isObject as C}from"lodash";import{v4 as R}from"uuid";import{mapInputFilterToFormFilters as x,mapCatalogFilterToFormKeyValueFilters as g,mapFiltersToCatalogFilter as m}from"../../Filter/utils.esm.js";import"../../Filter/FilterComponent.esm.js";import{emptyFilters as v,emptyKeyValueFilters as b}from"../../Filter/types.esm.js";import{TimeUnit as F}from"../../Frequency/types.esm.js";import{isTimeUnit as M}from"../../Frequency/util.esm.js";import"../../Frequency/FrequencyComponent.esm.js";import{ExpressionType as l}from"../types/ExpressionType.esm.js";import{defaultSchedule as O}from"../types/Schedule.esm.js";import"../types/Path.esm.js";import{CHECK_NAME_MAX_LENGTH as P}from"./validation.esm.js";const w=e=>{if(C(e)&&"frequency"in e){const r=A.safeParse(e.frequency);if(r.success){const t=r.data;if("cron"in t)return{enabled:!0,frequency:{type:"cron",unit:F.Hours,value:1,cron:t.cron}};const i=Object.keys(t);if(i.length){const s=i[0];if(M(s))return{enabled:!0,frequency:{type:"HumanDuration",unit:s,value:t[s]??1,cron:""}}}}}return{enabled:!1,frequency:{type:"HumanDuration",unit:F.Hours,value:1,cron:""}}},E=(e,r)=>{const{enabled:t,frequency:i}=e;if(t){const{cron:s,type:o,unit:a,value:u}=i;return o==="HumanDuration"?{frequency:{[a]:u},filter:m(r)}:{frequency:{cron:s}}}},y=e=>{if(Array.isArray(e))return e.map(r=>y(r));if(typeof e=="string"){if(e==="true")return!0;if(e==="false")return!1;const r=Number(e);if(!isNaN(r))return r}return e},p=e=>{if(!e)return{};if(e.expressionType){const r={[e.expressionType]:e.conditions?.map(t=>({factRef:t.factRef,path:t.path,operator:t.operatorPrefix?`${t.operatorPrefix}:${t.operator}`:t.operator,value:y(t.value)}))};return e.expressions&&e.expressions.forEach(t=>{r[e.expressionType]?.push(p(t))}),r}if(e.expressions)return e.expressions.map(p);if(e.conditions&&e.conditions.length===1){const r=e.conditions[0];return{factRef:r.factRef,path:r.path,operator:r.operatorPrefix?`${r.operatorPrefix}:${r.operator}`:r.operator,value:y(r.value)}}return{}},k=e=>{if(e?.match(/.:./)){const r=e.split(":");if(["all","any","none"].includes(r[0]))return{operator:r[1],operatorPrefix:r[0]}}return{}},f=(e,r=!0)=>{if(!e)return{conditions:[]};const t=Object.keys(e);let i=t.includes("all")||r&&!t.includes("any")?l.AllOf:l.AnyOf;if(t.includes("not")&&(i=l.Not),t.includes(i)||r){const a=e[i]||[e],u=[],d=[];return a.forEach(n=>{const h=Object.keys(n);if(h.includes("all")||h.includes("any")||h.includes("not"))d.push(f(n,!1));else{const{operator:T,operatorPrefix:S}=k(n.operator);u.push({factRef:n.factRef,path:n.path,operator:T??n.operator,value:n.value,operatorPrefix:S})}}),{expressions:d.length>0?d:void 0,conditions:u,expressionType:i}}const{operator:s,operatorPrefix:o}=k(e.operator);return{expressionType:l.AllOf,conditions:[{factRef:e.factRef,path:e.path,operator:s??e.operator,value:e.value,operatorPrefix:o}]}},V=e=>({detailsStep:{name:e.name??"",description:e.description??"",ownerEntityRef:e.ownerEntityRef??"",type:e.type??"default"},rulesStep:{pathResolver:e.pathResolver??"jsonpath",expressions:f(e.rule),passedMessage:e.passedMessage??void 0,failedMessage:e.failedMessage??void 0,warning:e.warning??!1},filtersStep:{filter:x(e.filter),keyValueFilter:g(e.filter),excludeFilter:x(e.exclude),excludeKeyValueFilter:g(e.exclude),applicabilityExpressions:f(e.applicable),notApplicableMessage:e.notApplicableMessage??void 0},scheduleStep:{schedule:w(e.schedule)}}),N=(e,r)=>{const{detailsStep:t,rulesStep:i,filtersStep:s,scheduleStep:o}=e;return{id:r?r.id:R(),ownerEntityRef:t.ownerEntityRef??void 0,name:t.name,description:t.description,pathResolver:i.pathResolver,passedMessage:i.passedMessage??void 0,failedMessage:i.failedMessage??void 0,rule:t.type==="manual"?void 0:p(i.expressions),warning:i.warning??!1,filter:s.filter||s.keyValueFilter?m(s.filter,s.keyValueFilter):void 0,exclude:s.excludeFilter||s.excludeKeyValueFilter?m(s.excludeFilter,s.excludeKeyValueFilter):void 0,applicable:t.type!=="manual"&&s.applicabilityExpressions?.conditions?.length?p(s.applicabilityExpressions):void 0,notApplicableMessage:s.notApplicableMessage&&t.type!=="manual"&&s.applicabilityExpressions?.conditions?.length?s.notApplicableMessage:void 0,schedule:E(o.schedule,s.filter),type:t.type}},c=(e,r="$")=>{const t=[];if(e.type==="object"&&e.properties){const i=e.properties;for(const s in i)if(i.hasOwnProperty(s)){const o=`${r}.${s}`;t.push(o);const a=i[s];t.push(...c(a,o))}}if(e.type==="array"&&e.items){const i=`${r}[*]`;t.push(i);const s=Array.isArray(e.items)?e.items:[e.items];for(const o of s)t.push(...c(o,i))}if(e.oneOf){const i=Array.isArray(e.oneOf)?e.oneOf:[e.oneOf];for(const s of i)t.push(...c(s,r))}if(e.allOf){const i=Array.isArray(e.allOf)?e.allOf:[e.allOf];for(const s of i)t.push(...c(s,r))}return[...new Set(t)]},q={detailsStep:{name:"",description:"",ownerEntityRef:"",type:"default"},rulesStep:{pathResolver:"jsonpath",expressions:{expressionType:l.AllOf,expressions:void 0,conditions:[{factRef:"",path:"",operator:"",operatorPrefix:"",value:"",conditions:[]}]},warning:!1},filtersStep:{filter:v(),keyValueFilter:b(),excludeFilter:v(),excludeKeyValueFilter:b()},scheduleStep:{schedule:O()}},K={details:{name:{name:"Check name",helperText:`Max ${P} characters`,placeholder:"Name your check (e.g., 'Code Coverage\u2019)"},description:{name:"Check description",placeholder:"Describe your check clearly so others understand its purpose. e.g., 'Ensure code coverage meets the minimum threshold.'"},owner:{name:"Check owner",selectLabel:"Assign an owner"},type:{name:"Check Type",selectLabel:"Choose the type of check."}},rulesStep:{rules:{name:"Check rules",description:"Define the rules the check will verify."},messages:{name:"Pass/Fail messages (Optional)",description:"Add the messages for check success and failure.",passMessagePlaceholder:"Enter pass message...",failMessagePlaceholder:"Enter fail message...",passedTabName:"Passed Message",failedTabName:"Failed Message"},warnings:{name:"Enable warnings",description:"Enable to classify failures as warnings, so they don\u2019t impact certification.",label:"Warning"}},filter:{description:`Use the filters below to narrow the scope of the Check. Only Entities that match the selected include and exclude filters will be applicable to the Check. Exclude filters must be used with with an include filter.
2
- For example, selecting an include filter of 'Kind' as 'Component' and an exclude filter of 'Type' as 'Service' will select all entities with kind Component where type is NOT Service.`},schedule:{description:"Checks are automatically triggered whenever a dependent fact is updated. When collectors are scheduled, there is generally no need to schedule checks.",checkboxLabel:"Schedule check"}};export{K as CHECK_FIELDS,q as DEFAULT_FORM_VALUES,c as generateJsonPaths,V as mapCheckerToFormValues,p as mapExpressionToRule,w as mapInputScheduleToSchedule,f as mapRuleToExpression,E as mapScheduleToInputSchedule,N as mapToCheckerInput};
1
+ import{FrequencySchema as A}from"@spotify/backstage-plugin-soundcheck-common";import{isObject as C}from"lodash";import{v4 as R}from"uuid";import{mapInputFilterToFormFilters as x,mapCatalogFilterToFormKeyValueFilters as g,mapFiltersToCatalogFilter as m}from"../../Filter/utils.esm.js";import"../../Filter/FilterComponent.esm.js";import{emptyFilters as v,emptyKeyValueFilters as b}from"../../Filter/types.esm.js";import{TimeUnit as F}from"../../Frequency/types.esm.js";import{isTimeUnit as M}from"../../Frequency/util.esm.js";import"../../Frequency/FrequencyComponent.esm.js";import{ExpressionType as l}from"../types/ExpressionType.esm.js";import{defaultSchedule as O}from"../types/Schedule.esm.js";import"../types/Path.esm.js";import{CHECK_NAME_MAX_LENGTH as P}from"./validation.esm.js";const E=e=>{if(C(e)&&"frequency"in e){const r=A.safeParse(e.frequency);if(r.success){const t=r.data;if("cron"in t)return{enabled:!0,frequency:{type:"cron",unit:F.Hours,value:1,cron:t.cron}};const i=Object.keys(t);if(i.length){const s=i[0];if(M(s))return{enabled:!0,frequency:{type:"HumanDuration",unit:s,value:t[s]??1,cron:""}}}}}return{enabled:!1,frequency:{type:"HumanDuration",unit:F.Hours,value:1,cron:""}}},w=(e,r)=>{const{enabled:t,frequency:i}=e;if(t){const{cron:s,type:o,unit:a,value:u}=i;return o==="HumanDuration"?{frequency:{[a]:u},filter:m(r)}:{frequency:{cron:s}}}},y=e=>{if(Array.isArray(e))return e.map(r=>y(r));if(typeof e=="string"){if(e==="true")return!0;if(e==="false")return!1;const r=Number(e);if(!isNaN(r))return r}return e},p=e=>{if(!e)return{};if(e.expressionType){const r={[e.expressionType]:e.conditions?.map(t=>({factRef:t.factRef,path:t.path,operator:t.operatorPrefix?`${t.operatorPrefix}:${t.operator}`:t.operator,value:y(t.value)}))};return e.expressions&&e.expressions.forEach(t=>{r[e.expressionType]?.push(p(t))}),r}if(e.expressions)return e.expressions.map(p);if(e.conditions&&e.conditions.length===1){const r=e.conditions[0];return{factRef:r.factRef,path:r.path,operator:r.operatorPrefix?`${r.operatorPrefix}:${r.operator}`:r.operator,value:y(r.value)}}return{}},k=e=>{if(e?.match(/.:./)){const r=e.split(":");if(["all","any","none"].includes(r[0]))return{operator:r[1],operatorPrefix:r[0]}}return{}},f=(e,r=!0)=>{if(!e)return{conditions:[]};const t=Object.keys(e);let i=t.includes("all")||r&&!t.includes("any")?l.AllOf:l.AnyOf;if(t.includes("not")&&(i=l.Not),t.includes(i)||r){const a=e[i]||[e],u=[],d=[];return a.forEach(n=>{const h=Object.keys(n);if(h.includes("all")||h.includes("any")||h.includes("not"))d.push(f(n,!1));else{const{operator:T,operatorPrefix:S}=k(n.operator);u.push({factRef:n.factRef,path:n.path,operator:T??n.operator,value:n.value,operatorPrefix:S})}}),{expressions:d.length>0?d:void 0,conditions:u,expressionType:i}}const{operator:s,operatorPrefix:o}=k(e.operator);return{expressionType:l.AllOf,conditions:[{factRef:e.factRef,path:e.path,operator:s??e.operator,value:e.value,operatorPrefix:o}]}},V=e=>({detailsStep:{name:e.name??"",description:e.description??"",ownerEntityRef:e.ownerEntityRef??"",type:e.type??"default"},rulesStep:{pathResolver:e.pathResolver??"jsonpath",expressions:f(e.rule),passedMessage:e.passedMessage??void 0,failedMessage:e.failedMessage??void 0,warning:e.warning??!1},filtersStep:{filter:x(e.filter),keyValueFilter:g(e.filter),excludeFilter:x(e.exclude),excludeKeyValueFilter:g(e.exclude),applicabilityExpressions:e.applicable?f(e.applicable):void 0,notApplicableMessage:e.notApplicableMessage??void 0},scheduleStep:{schedule:E(e.schedule)}}),N=(e,r)=>{const{detailsStep:t,rulesStep:i,filtersStep:s,scheduleStep:o}=e;return{id:r?r.id:R(),ownerEntityRef:t.ownerEntityRef??void 0,name:t.name,description:t.description,pathResolver:i.pathResolver,passedMessage:i.passedMessage??void 0,failedMessage:i.failedMessage??void 0,rule:t.type==="manual"?void 0:p(i.expressions),warning:i.warning??!1,filter:s.filter||s.keyValueFilter?m(s.filter,s.keyValueFilter):void 0,exclude:s.excludeFilter||s.excludeKeyValueFilter?m(s.excludeFilter,s.excludeKeyValueFilter):void 0,applicable:t.type!=="manual"&&(s.applicabilityExpressions?.conditions?.length||s.applicabilityExpressions?.expressions?.length)?p(s.applicabilityExpressions):void 0,notApplicableMessage:s.notApplicableMessage&&t.type!=="manual"&&s.applicabilityExpressions?.conditions?.length?s.notApplicableMessage:void 0,schedule:w(o.schedule,s.filter),type:t.type}},c=(e,r="$")=>{const t=[];if(e.type==="object"&&e.properties){const i=e.properties;for(const s in i)if(i.hasOwnProperty(s)){const o=`${r}.${s}`;t.push(o);const a=i[s];t.push(...c(a,o))}}if(e.type==="array"&&e.items){const i=`${r}[*]`;t.push(i);const s=Array.isArray(e.items)?e.items:[e.items];for(const o of s)t.push(...c(o,i))}if(e.oneOf){const i=Array.isArray(e.oneOf)?e.oneOf:[e.oneOf];for(const s of i)t.push(...c(s,r))}if(e.allOf){const i=Array.isArray(e.allOf)?e.allOf:[e.allOf];for(const s of i)t.push(...c(s,r))}return[...new Set(t)]},q={detailsStep:{name:"",description:"",ownerEntityRef:"",type:"default"},rulesStep:{pathResolver:"jsonpath",expressions:{expressionType:l.AllOf,expressions:void 0,conditions:[{factRef:"",path:"",operator:"",operatorPrefix:"",value:"",conditions:[]}]},warning:!1},filtersStep:{filter:v(),keyValueFilter:b(),excludeFilter:v(),excludeKeyValueFilter:b()},scheduleStep:{schedule:O()}},K={details:{name:{name:"Check name",helperText:`Max ${P} characters`,placeholder:"Name your check (e.g., 'Code Coverage\u2019)"},description:{name:"Check description",placeholder:"Describe your check clearly so others understand its purpose. e.g., 'Ensure code coverage meets the minimum threshold.'"},owner:{name:"Check owner",selectLabel:"Assign an owner"},type:{name:"Check Type",selectLabel:"Choose the type of check."}},rulesStep:{rules:{name:"Check rules",description:"Define the rules the check will verify."},messages:{name:"Pass/Fail messages (Optional)",description:"Add the messages for check success and failure.",passMessagePlaceholder:"Enter pass message...",failMessagePlaceholder:"Enter fail message...",passedTabName:"Passed Message",failedTabName:"Failed Message"},warnings:{name:"Enable warnings",description:"Enable to classify failures as warnings, so they don\u2019t impact certification.",label:"Warning"}},filter:{description:`Use the filters below to narrow the scope of the Check. Only Entities that match the selected include and exclude filters will be applicable to the Check. Exclude filters must be used with with an include filter.
2
+ For example, selecting an include filter of 'Kind' as 'Component' and an exclude filter of 'Type' as 'Service' will select all entities with kind Component where type is NOT Service.`},schedule:{description:"Checks are automatically triggered whenever a dependent fact is updated. When collectors are scheduled, there is generally no need to schedule checks.",checkboxLabel:"Schedule check"}};export{K as CHECK_FIELDS,q as DEFAULT_FORM_VALUES,c as generateJsonPaths,V as mapCheckerToFormValues,p as mapExpressionToRule,E as mapInputScheduleToSchedule,f as mapRuleToExpression,w as mapScheduleToInputSchedule,N as mapToCheckerInput};
3
3
  //# sourceMappingURL=checkFormUtils.esm.js.map
@@ -1,2 +1,2 @@
1
- import{CheckMessagingSchema as p,DefaultCheckDetailsSchema as m,ManualCheckDetailsSchema as f,parseFactRef as u}from"@spotify/backstage-plugin-soundcheck-common";import{z as e}from"zod";import{baseFiltersSchema as d,refineFilters as h,FrequencySchema as b}from"../../../utils/validation.esm.js";import{ExpressionType as r}from"../types/ExpressionType.esm.js";import"../../Frequency/types.esm.js";import"../../Frequency/util.esm.js";import"../../Frequency/FrequencyComponent.esm.js";import"../types/Path.esm.js";const a=t=>{try{return u(t),!0}catch{return"Invalid fact reference. [source]:[scope]/[name]."}},y=100,n=async t=>{if(!await a(t))throw new Error("Fact reference validation failed");return t},o=e.union([e.string().min(1,"Required"),e.number(),e.boolean()]),s=e.lazy(()=>e.strictObject({factRef:e.string().refine(n,{message:"Valid format: [source]:[scope]/[name]"}),path:e.string().min(1,"Required"),operator:e.string().min(1,"Required"),operatorPrefix:e.string().optional().nullable(),value:o.or(e.array(o).min(1,"Required")).or(e.strictObject({factRef:e.string().refine(n,{message:"Valid format: [source]:[scope]/[name]"}),path:e.string().min(1,"Required")})),conditions:e.array(s).optional()})),i=e.lazy(()=>e.strictObject({expressionType:e.enum([r.AllOf,r.AnyOf,r.Not]).optional(),expressions:e.array(i).optional(),conditions:e.array(s).optional()})),g=e.strictObject({expressions:i,pathResolver:e.string().optional()}).merge(p),c=e.lazy(()=>e.strictObject({applicabilityExpressions:i.optional(),notApplicableMessage:e.string().optional()}).merge(d).refine(h,"Cannot have an exclude filter without an include filter.")),S=e.strictObject({enabled:e.boolean(),frequency:b}),l=e.strictObject({schedule:S.optional()}),O=e.strictObject({detailsStep:m,rulesStep:g,filtersStep:c,scheduleStep:l}),R=e.strictObject({detailsStep:f,rulesStep:e.any(),filtersStep:c,scheduleStep:l});export{y as CHECK_NAME_MAX_LENGTH,O as defaultCheckFormSchema,R as manualCheckFormSchema,a as validateFactRef};
1
+ import{CheckMessagingSchema as f,DefaultCheckDetailsSchema as u,ManualCheckDetailsSchema as d,parseFactRef as h}from"@spotify/backstage-plugin-soundcheck-common";import{isEmpty as a}from"lodash";import{z as e}from"zod";import{baseFiltersSchema as b,refineFilters as g,ensureNoConflictingFilters as y,CONFLICTING_FILTER_ERROR_MESSAGE as S,FrequencySchema as R}from"../../../utils/validation.esm.js";import{ExpressionType as r}from"../types/ExpressionType.esm.js";import"../../Frequency/types.esm.js";import"../../Frequency/util.esm.js";import"../../Frequency/FrequencyComponent.esm.js";import"../types/Path.esm.js";const n=t=>{try{return h(t),!0}catch{return"Invalid fact reference. [source]:[scope]/[name]."}},O=100,o=async t=>{if(!await n(t))throw new Error("Fact reference validation failed");return t},s=e.union([e.string().min(1,"Required"),e.number(),e.boolean()]),c=e.lazy(()=>e.strictObject({factRef:e.string().refine(o,{message:"Valid format: [source]:[scope]/[name]"}),path:e.string().min(1,"Required"),operator:e.string().min(1,"Required"),operatorPrefix:e.string().optional().nullable(),value:s.or(e.array(s).min(1,"Required")).or(e.strictObject({factRef:e.string().refine(o,{message:"Valid format: [source]:[scope]/[name]"}),path:e.string().min(1,"Required")})),conditions:e.array(c).optional()})),i=e.lazy(()=>e.strictObject({expressionType:e.enum([r.AllOf,r.AnyOf,r.Not]).optional(),expressions:e.array(i).optional(),conditions:e.array(c).optional()}).refine(({expressions:t,conditions:m})=>!a(t)||!a(m),"Must contain either a condition or an expression.")),F=e.strictObject({expressions:i,pathResolver:e.string().optional()}).merge(f),l=e.lazy(()=>e.strictObject({applicabilityExpressions:i.optional(),notApplicableMessage:e.string().optional()}).merge(b).refine(g,"Cannot have an exclude filter without an include filter.").refine(y,S)),C=e.strictObject({enabled:e.boolean(),frequency:R}),p=e.strictObject({schedule:C.optional()}),E=e.strictObject({detailsStep:u,rulesStep:F,filtersStep:l,scheduleStep:p}),x=e.strictObject({detailsStep:d,rulesStep:e.any(),filtersStep:l,scheduleStep:p});export{O as CHECK_NAME_MAX_LENGTH,E as defaultCheckFormSchema,x as manualCheckFormSchema,n as validateFactRef};
2
2
  //# sourceMappingURL=validation.esm.js.map
@@ -1,2 +1,2 @@
1
- import{jsx as t}from"react/jsx-runtime";import{withStyles as l,Tooltip as c}from"@material-ui/core";import n from"@material-ui/icons/Check";import s from"@material-ui/icons/Close";import d from"@material-ui/icons/HelpOutline";import f from"@material-ui/icons/NotInterested";import m from"@material-ui/icons/RemoveCircleOutline";import x from"@material-ui/icons/ReportProblemOutlined";import{ResultState as p}from"../../graphql/generated/index.esm.js";import{resultToText as r}from"../../text.esm.js";const h=l(o=>({root:{color:o.palette.success.main}}))(n),u=l(o=>({root:{color:o.palette.error.main}}))(s),b=l(o=>({root:{color:o.palette.warning.main}}))(x),N=l(o=>({root:{color:o.palette.text.primary}}))(d),T=l(o=>({root:{color:o.palette.text.disabled}}))(m),g=l(o=>({root:{color:o.palette.text.disabled}}))(f),I=l(o=>({root:{color:o.palette.error.main}}))(m),i=({icon:o,tooltip:a})=>t(c,{title:a,children:o}),R=({result:o,className:a})=>{const e={className:a,"aria-label":r(o),"aria-hidden":!1};return o===p.Passed?t(i,{icon:t(h,{...e}),tooltip:r(o)}):o===p.NotReported?t(i,{icon:t(N,{...e}),tooltip:r(o)}):o===p.Failed?t(i,{icon:t(u,{...e}),tooltip:r(o)}):o===p.Warning?t(i,{icon:t(b,{...e}),tooltip:r(o)}):o===p.NotApplicable?t(i,{icon:t(T,{...e}),tooltip:r(o)}):o===p.Exempt?t(i,{icon:t(g,{...e}),tooltip:r(o)}):o===p.Error?t(i,{icon:t(I,{...e}),tooltip:r(o)}):null};export{R as CheckIcon,i as IconWithTooltip};
1
+ import{jsxs as c,Fragment as h,jsx as t}from"react/jsx-runtime";import{withStyles as l,lighten as f,Tooltip as g}from"@material-ui/core";import x from"@material-ui/icons/Check";import u from"@material-ui/icons/Close";import T from"@material-ui/icons/HelpOutline";import N from"@material-ui/icons/NotInterested";import m from"@material-ui/icons/RemoveCircleOutline";import b from"@material-ui/icons/ReportProblemOutlined";import{ResultState as n}from"../../graphql/generated/index.esm.js";import{resultToText as s}from"../../text.esm.js";const w=l(o=>({root:{color:o.palette.success.main}}))(x),S=l(o=>({root:{color:o.palette.error.main}}))(u),v=l(o=>({root:{color:o.palette.warning.main}}))(b),D=l(o=>({root:{color:o.palette.text.primary}}))(T),E=l(o=>({root:{color:o.palette.text.disabled}}))(m),I=l(o=>({root:{color:o.palette.info.main}}))(N),R=l(o=>({root:{color:f(o.palette.error.main,.2)}}))(m),r=({icon:o,tooltip:a})=>t(g,{title:a,children:o}),j=({result:o,className:a,tooltip:d=!0,timestamp:p})=>{const i={className:a,"aria-label":s(o),"aria-hidden":!1},e=d?c(h,{children:[t("div",{children:t("strong",{children:s(o)})}),p&&c("div",{children:[t("strong",{children:"Updated:"})," ",new Date(p).toLocaleDateString()," ",new Date(p).toLocaleTimeString()]})]}):"";return o===n.Passed?t(r,{icon:t(w,{...i}),tooltip:e}):o===n.NotReported?t(r,{icon:t(D,{...i}),tooltip:e}):o===n.Failed?t(r,{icon:t(S,{...i}),tooltip:e}):o===n.Warning?t(r,{icon:t(v,{...i}),tooltip:e}):o===n.NotApplicable?t(r,{icon:t(E,{...i}),tooltip:e}):o===n.Exempt?t(r,{icon:t(I,{...i}),tooltip:e}):o===n.Error?t(r,{icon:t(R,{...i}),tooltip:e}):null};export{j as CheckIcon,r as IconWithTooltip};
2
2
  //# sourceMappingURL=CheckIcon.esm.js.map
@@ -1,2 +1,2 @@
1
- import{jsx as p}from"react/jsx-runtime";import{stringifyEntityRef as x}from"@backstage/catalog-model";import{Table as R}from"@backstage/core-components";import{makeStyles as v}from"@material-ui/core";import z from"lodash";import{useState as L,useEffect as B,useCallback as d}from"react";import{CheckEntityField as r,Direction as f}from"../../../graphql/generated/index.esm.js";import{useEntitiesByRefs as T}from"../../../hooks/catalog/useEntitiesByRefs.esm.js";import{useCheckEntities as D}from"../../../hooks/entities/useCheckEntities.esm.js";import{toResultState as m}from"../utils.esm.js";import{columnFactories as n}from"./columns.esm.js";import{toCheckEntityRow as N}from"./utils.esm.js";const O=10,P=["kind","metadata.name","metadata.namespace","relations","spec.lifecycle","spec.type"],F=[n.createStateColumn(),n.createNameColumn(),n.createSystemColumn(),n.createOwnerColumn(),n.createSpecTypeColumn(),n.createSpecLifecycleColumn()],A=[r.State,r.Name,r.System,r.Owner,r.Type,r.Lifecycle],j=v({tableContainer:{display:"flex",flexDirection:"column",width:"100%",overflowX:"auto","& table":{boxSizing:"border-box","& th:first-child, & td:first-child":{paddingLeft:"6px"},"& th:last-child, & td:last-child":{paddingRight:"6px !important"}}}}),Q=({checkId:g,trackId:u,filter:s,states:c})=>{const h=j(),[e,l]=L({orderBy:void 0,filter:s,states:c?.map(m).filter(t=>t!==void 0),pageInfo:{page:0,pageSize:O,direction:"forward",cursor:null}});B(()=>{l(t=>({...t,pageInfo:{...t.pageInfo,page:0,cursor:null},filter:s,states:c?.map(m).filter(i=>i!==void 0)}))},[s,c]);const{data:a,isLoading:y}=D({checkId:g,trackId:u,orderBy:e.orderBy,filter:e.filter,states:e.states?.length?e.states:void 0,[e.pageInfo.direction==="forward"?"first":"last"]:e.pageInfo.pageSize,[e.pageInfo.direction==="forward"?"after":"before"]:e.pageInfo.cursor}),C=d((t,i)=>{let o;t===-1?o=void 0:o={field:A[t],direction:i==="asc"?f.Asc:f.Desc},l({...e,orderBy:o,pageInfo:{...e.pageInfo,page:0,cursor:null}})},[e]),I=d((t,i)=>{const o=t>e.pageInfo.page?"forward":"backward",E=o==="forward"?a?.checkEntities.pageInfo.endCursor??null:a?.checkEntities.pageInfo.startCursor??null;l({...e,pageInfo:{page:t,pageSize:i,direction:o,cursor:E}})},[a,e]),k=a?.checkEntities.edges.map(t=>t.node.entityRef)??[],{data:S,isLoading:w}=T({entityRefs:k,fields:P}),b=z.compact(a?.checkEntities.edges.map(t=>{const i=S?.items.find(o=>!!o&&x(o)===t.node.entityRef);return i?N({checkDetails:t.node,entity:i}):void 0}))??[];return p("div",{className:h.tableContainer,children:p(R,{title:"Entities",style:{width:"100%",border:"none",margin:0},columns:F,data:b,options:{paging:!0,showFirstLastPageButtons:!1,paginationPosition:"bottom",emptyRowsWhenPaging:!0,pageSizeOptions:[10,25,50],pageSize:e.pageInfo.pageSize,search:!1,showTitle:!0,padding:"dense"},onOrderChange:C,onPageChange:I,page:e.pageInfo.page,totalCount:a?.checkEntities.totalCount??0,isLoading:y||w,components:{Toolbar:()=>null}})})};export{Q as CheckEntitiesTable};
1
+ import{jsx as p}from"react/jsx-runtime";import{stringifyEntityRef as x}from"@backstage/catalog-model";import{Table as R}from"@backstage/core-components";import{makeStyles as v}from"@material-ui/core";import z from"lodash";import{useState as L,useEffect as B,useCallback as d}from"react";import{CheckEntityField as r,Direction as f}from"../../../graphql/generated/index.esm.js";import{useEntitiesByRefs as T}from"../../../hooks/catalog/useEntitiesByRefs.esm.js";import{useCheckEntities as N}from"../../../hooks/entities/useCheckEntities.esm.js";import{toResultState as m}from"../utils.esm.js";import{columnFactories as n}from"./columns.esm.js";import{toCheckEntityRow as D}from"./utils.esm.js";const O=10,P=["kind","metadata.name","metadata.namespace","spec.profile.displayName","metadata.title","relations","spec.lifecycle","spec.type"],F=[n.createStateColumn(),n.createNameColumn(),n.createSystemColumn(),n.createOwnerColumn(),n.createSpecTypeColumn(),n.createSpecLifecycleColumn()],A=[r.State,r.Name,r.System,r.Owner,r.Type,r.Lifecycle],j=v({tableContainer:{display:"flex",flexDirection:"column",width:"100%",overflowX:"auto","& table":{boxSizing:"border-box","& th:first-child, & td:first-child":{paddingLeft:"6px"},"& th:last-child, & td:last-child":{paddingRight:"6px !important"}}}}),Q=({checkId:g,trackId:u,filter:s,states:c})=>{const h=j(),[e,l]=L({orderBy:void 0,filter:s,states:c?.map(m).filter(t=>t!==void 0),pageInfo:{page:0,pageSize:O,direction:"forward",cursor:null}});B(()=>{l(t=>({...t,pageInfo:{...t.pageInfo,page:0,cursor:null},filter:s,states:c?.map(m).filter(i=>i!==void 0)}))},[s,c]);const{data:a,isLoading:y}=N({checkId:g,trackId:u,orderBy:e.orderBy,filter:e.filter,states:e.states?.length?e.states:void 0,[e.pageInfo.direction==="forward"?"first":"last"]:e.pageInfo.pageSize,[e.pageInfo.direction==="forward"?"after":"before"]:e.pageInfo.cursor}),C=d((t,i)=>{let o;t===-1?o=void 0:o={field:A[t],direction:i==="asc"?f.Asc:f.Desc},l({...e,orderBy:o,pageInfo:{...e.pageInfo,page:0,cursor:null}})},[e]),I=d((t,i)=>{const o=t>e.pageInfo.page?"forward":"backward",E=o==="forward"?a?.checkEntities.pageInfo.endCursor??null:a?.checkEntities.pageInfo.startCursor??null;l({...e,pageInfo:{page:t,pageSize:i,direction:o,cursor:E}})},[a,e]),k=a?.checkEntities.edges.map(t=>t.node.entityRef)??[],{data:S,isLoading:w}=T({entityRefs:k,fields:P}),b=z.compact(a?.checkEntities.edges.map(t=>{const i=S?.items.find(o=>!!o&&x(o)===t.node.entityRef);return i?D({checkDetails:t.node,entity:i}):void 0}))??[];return p("div",{className:h.tableContainer,children:p(R,{title:"Entities",style:{width:"100%",border:"none",margin:0},columns:F,data:b,options:{paging:!0,showFirstLastPageButtons:!1,paginationPosition:"bottom",emptyRowsWhenPaging:!0,pageSizeOptions:[10,25,50],pageSize:e.pageInfo.pageSize,search:!1,showTitle:!0,padding:"dense"},onOrderChange:C,onPageChange:I,page:e.pageInfo.page,totalCount:a?.checkEntities.totalCount??0,isLoading:y||w,components:{Toolbar:()=>null}})})};export{Q as CheckEntitiesTable};
2
2
  //# sourceMappingURL=CheckEntitiesTable.esm.js.map
@@ -1,2 +1,2 @@
1
- import{jsx as i,jsxs as f}from"react/jsx-runtime";import{useRouteRef as Z}from"@backstage/core-plugin-api";import{EntityRefLink as _}from"@backstage/plugin-catalog-react";import{usePermission as $}from"@backstage/plugin-permission-react";import{makeStyles as ee,useTheme as te,Button as ie,Typography as B}from"@material-ui/core";import{soundcheckCheckReadPermission as se,soundcheckCheckUpdatePermission as oe,toEntityFilterQuery as A,combineEntityFilterQueries as re}from"@spotify/backstage-plugin-soundcheck-common";import x from"lodash/isEqual";import{useMemo as h,useState as v,useEffect as ne,useCallback as j}from"react";import{useSearchParams as ae,useParams as le,useNavigate as ce}from"react-router-dom";import"@backstage/catalog-model";import"@tanstack/react-query";import"../../api.esm.js";import"../../hooks/graphqlKeys.esm.js";import{useCheck as de}from"../../hooks/checks/useCheck.esm.js";import"../../hooks/useSoundcheckAlert.esm.js";import{useTrack as me}from"../../hooks/tracks/useTrack.esm.js";import"../../hooks/useConfirmationModal.esm.js";import{useCheckStatus as pe}from"../../hooks/aggregations/useCheckStatus.esm.js";import{checkEditRouteRef as he}from"../../routes.esm.js";import{CheckStatusBar as fe}from"../CheckStatusBar/CheckStatusBar.esm.js";import{FilterSidebar as ue}from"../FilterSidebar/FilterSidebar.esm.js";import{StateFilter as ge}from"../FilterSidebar/StateFilter.esm.js";import{LoadingIndicator as ye}from"../LoadingIndicator/LoadingIndicator.esm.js";import{PageWarningMessage as z}from"../PageWarningMessage/PageWarningMessage.esm.js";import"../SoundcheckHeader/SoundcheckHeader.esm.js";import"../SoundcheckHeader/SoundcheckHeaderContext.esm.js";import{useHeader as ke}from"../SoundcheckHeader/useHeader.esm.js";import{SoundcheckMarkdownContent as Se}from"../SoundcheckMarkdownContent/SoundcheckMarkdownContent.esm.js";import"@backstage/core-components";import"react-markdown";import"rehype-raw";import"remark-gfm";import{CheckEntitiesTable as Ce}from"./CheckEntitiesTable/CheckEntitiesTable.esm.js";import{CheckStatusHistoryChart as we}from"./CheckStatusHistoryChart.esm.js";import{CheckStatusTable as xe}from"./CheckStatusTable.esm.js";const ve=e=>{const{lifecycles:s,owners:c,types:a,systems:r}=e,n=s?.length?{"spec.lifecycle":s}:void 0,d=c?.length?{"relations.ownedBy":c}:void 0,m=a?.length?{"spec.type":a}:void 0,p=r?.length?{"relations.partOf":r}:void 0;if(n||d||m||p)return{...n,...d,...m,...p}};function Ee(e,s){for(const c of e.levels)for(const a of c.checks)if(a.id===s)return a;return null}const Ne=ee(e=>({root:{height:"100%"},pageContent:{display:"flex",minHeight:`calc(100vh - ${e.spacing(15)}px)`,borderTop:`1px solid ${e.palette.divider}`,height:"100%"},mainContentArea:{flex:1,display:"flex",flexDirection:"column",minWidth:0},editButton:{marginLeft:"auto"},statusContainer:{borderBottom:`1px solid ${e.palette.divider}`,padding:e.spacing(3,0,2,3)},statusCards:{display:"flex",gap:e.spacing(2)},currentStatusSection:{width:"325px",minWidth:"325px",flex:0,display:"flex",flexDirection:"column"},historicalStatusSection:{flex:1,flexShrink:1,flexGrow:1,flexBasis:"auto",minWidth:"150px",display:"flex",flexDirection:"column"},statusTitle:{fontWeight:"bold",fontSize:"1.1rem",lineHeight:`${e.typography.h5.fontSize}px`,cursor:"default",marginBottom:e.spacing(2)},headerDescription:{fontSize:e.typography.body2.fontSize,margin:e.spacing(.5,0,0),"& p":{margin:0},"& a":{color:"inherit",textDecoration:"underline"}},entitiesContainer:{padding:e.spacing(2,3,3,3)},ownerLink:{"& span":{color:"inherit","&:hover":{textDecoration:"underline"}}}})),Re=()=>{const e=Ne(),[s,c]=ae(),{trackId:a,checkId:r}=le(),n=h(()=>s.getAll("states"),[s]),d=h(()=>s.getAll("owners"),[s]),m=h(()=>s.getAll("lifecycles"),[s]),p=h(()=>s.getAll("types"),[s]),u=h(()=>s.getAll("systems"),[s]),[g,E]=v(m),[y,N]=v(d),[k,R]=v(p),[S,I]=v(u),[C,b]=v(n);ne(()=>{N(d),E(m),R(p),I(u),b(n)},[d,m,p,u,n]);const M=h(()=>{const t={owners:!x(y,d),lifecycles:!x(g,m),types:!x(k,p),systems:!x(S,u),states:!x(C,n)};return Object.values(t).some(Boolean)},[y,d,g,m,k,p,S,u,C,n]),Q=j(()=>{const t=new URLSearchParams(s);t.delete("lifecycles"),t.delete("owners"),t.delete("types"),t.delete("systems"),t.delete("states"),g.length>0&&g.forEach(l=>t.append("lifecycles",l)),y.length>0&&y.forEach(l=>t.append("owners",l)),k.length>0&&k.forEach(l=>t.append("types",l)),S.length>0&&S.forEach(l=>t.append("systems",l)),C.length>0&&C.forEach(l=>t.append("states",l)),c(t)},[s,g,y,k,S,C,c]),U=j(()=>{E([]),N([]),R([]),I([]),b([]);const t=new URLSearchParams(s);t.delete("lifecycles"),t.delete("owners"),t.delete("types"),t.delete("systems"),t.delete("states"),c(t)},[s,c]),L=ve({lifecycles:m,owners:d,types:p,systems:u}),{data:w,isLoading:G}=me(a),{data:o,isLoading:T}=de(r),{loading:V,allowed:q}=$({permission:se,resourceRef:r}),{loading:D,allowed:P}=$({permission:oe,resourceRef:r}),H=ce(),O=Z(he),J=te();let F;if(r)if(w){const t=A(w.filter),l=A(Ee(w,r)?.filter);F=re(t,l)}else o&&(F=A(o.filter));const{data:W}=pe({checkId:r,trackId:a,filter:L,states:n?.length?n:void 0},!!r),K=h(()=>o?.ownerEntityRef?i(_,{color:"inherit",entityRef:o.ownerEntityRef,className:e.ownerLink}):null,[o?.ownerEntityRef,e.ownerLink]),X=h(()=>!D&&P&&o?.isEditable?i(ie,{className:e.editButton,variant:"contained",color:"primary",onClick:()=>{H(O({checkId:o.id}))},children:"Edit Check"}):null,[P,o?.id,o?.isEditable,e.editButton,O,D,H]),Y=h(()=>o?.description?i(Se,{className:e.headerDescription,content:o.description}):null,[e.headerDescription,o?.description]);return ke({title:o?.name??r??"Soundcheck",description:Y,customSubtitle:K,sectionRight:X}),f("div",{children:[i(z,{entityName:"track",entityId:a,showNotFound:!!a&&!G&&!w}),i(z,{entityName:"check",entityId:r,showNotFound:!T&&!o,showCannotView:!!o&&!V&&!q}),T&&i(ye,{}),!T&&!!o&&i("div",{className:e.root,children:f("div",{className:e.pageContent,children:[i(ue,{trackFilter:F,stagedTypes:k,stagedLifecycles:g,stagedOwners:y,stagedSystems:S,onTypesChange:R,onLifecyclesChange:E,onOwnersChange:N,onSystemsChange:I,onApplyFilters:Q,onClearFilters:U,hasFilterChanges:M,children:i(ge,{states:n,stagedStates:C,onStagedStatesChange:b})}),f("div",{className:e.mainContentArea,children:[i("div",{className:e.statusContainer,children:f("div",{className:e.statusCards,children:[f("div",{className:e.currentStatusSection,children:[i(B,{className:e.statusTitle,children:"Current Status"}),i("div",{style:{width:"100%",height:30,display:"flex",alignItems:"flex-start",marginBottom:J.spacing(2)},children:i(fe,{status:W})}),i("div",{children:i(xe,{checkStatus:W})})]}),f("div",{className:e.historicalStatusSection,children:[i(B,{className:e.statusTitle,children:"Historical Status"}),i("div",{style:{height:"100%"},children:i(we,{checkId:r,trackId:a,filter:L,states:n})})]})]})}),f("div",{className:e.entitiesContainer,children:[i(B,{className:e.statusTitle,children:"Entities"}),i(Ce,{checkId:r,trackId:w?.id,filter:L,states:n})]})]})]})})]})};export{Re as CheckInsightsPage};
1
+ import{jsx as t,jsxs as m}from"react/jsx-runtime";import{useRouteRef as re}from"@backstage/core-plugin-api";import{EntityRefLink as se}from"@backstage/plugin-catalog-react";import{usePermission as j}from"@backstage/plugin-permission-react";import{makeStyles as oe,useTheme as ne,Button as ae,Typography as z,Tabs as le,Tab as U,Box as $}from"@material-ui/core";import{soundcheckCheckReadPermission as ce,soundcheckCheckUpdatePermission as me,toEntityFilterQuery as F,combineEntityFilterQueries as de}from"@spotify/backstage-plugin-soundcheck-common";import b from"lodash/isEqual";import{useMemo as l,useState as x,useEffect as pe,useCallback as M}from"react";import{useSearchParams as he,useParams as fe,useNavigate as ue}from"react-router-dom";import"@backstage/catalog-model";import"@tanstack/react-query";import"../../api.esm.js";import"../../hooks/graphqlKeys.esm.js";import{useCheck as ge}from"../../hooks/checks/useCheck.esm.js";import"../../hooks/useSoundcheckAlert.esm.js";import{useTrack as ye}from"../../hooks/tracks/useTrack.esm.js";import"../../hooks/useConfirmationModal.esm.js";import{useCheckStatus as ke}from"../../hooks/aggregations/useCheckStatus.esm.js";import{checkEditRouteRef as Ce}from"../../routes.esm.js";import{toFilter as Se}from"../../utils/helpers.esm.js";import{CheckStatusBar as xe}from"../CheckStatusBar/CheckStatusBar.esm.js";import{FilterSidebar as we}from"../FilterSidebar/FilterSidebar.esm.js";import{StateFilter as be}from"../FilterSidebar/StateFilter.esm.js";import{LoadingIndicator as Ee}from"../LoadingIndicator/LoadingIndicator.esm.js";import{PageWarningMessage as G}from"../PageWarningMessage/PageWarningMessage.esm.js";import"../SoundcheckHeader/SoundcheckHeader.esm.js";import"../SoundcheckHeader/SoundcheckHeaderContext.esm.js";import{useHeader as ve}from"../SoundcheckHeader/useHeader.esm.js";import{SoundcheckMarkdownContent as Ne}from"../SoundcheckMarkdownContent/SoundcheckMarkdownContent.esm.js";import"@backstage/core-components";import"react-markdown";import"rehype-raw";import"remark-gfm";import"../TechHealth/Filters/types.esm.js";import"../TechHealth/Filters/FacetFilter.esm.js";import"../TechHealth/Filters/FilterProvider.esm.js";import"../TechHealth/Filters/Filters.esm.js";import"../TechHealth/Filters/FiltersHeader.esm.js";import"../TechHealth/Filters/FiltersSection.esm.js";import"lodash";import"../../contexts/TrackFormContext.esm.js";import"../../contexts/CheckFormContext.esm.js";import"../../contexts/CampaignFormContext.esm.js";import"../../contexts/UserProvider.esm.js";import{parseNumberOfDays as Ie}from"../TechHealth/Filters/utils.esm.js";import{CheckEntitiesTable as Re}from"./CheckEntitiesTable/CheckEntitiesTable.esm.js";import{CheckStatusHistoryChart as Te}from"./CheckStatusHistoryChart.esm.js";import{CheckStatusTable as Be}from"./CheckStatusTable.esm.js";import{ExemptionsTable as Le}from"./ExemptionsTable.esm.js";function De(e,r){for(const d of e.levels)for(const c of d.checks)if(c.id===r)return c;return null}const Fe=oe(e=>({root:{height:"100%"},pageContent:{display:"flex",minHeight:`calc(100vh - ${e.spacing(15)}px)`,borderTop:`1px solid ${e.palette.divider}`,height:"100%"},mainContentArea:{flex:1,display:"flex",flexDirection:"column",minWidth:0},editButton:{marginLeft:"auto"},statusContainer:{borderBottom:`1px solid ${e.palette.divider}`,padding:e.spacing(3,0,2,3)},statusCards:{display:"flex",gap:e.spacing(2)},currentStatusSection:{width:"325px",minWidth:"325px",flex:0,display:"flex",flexDirection:"column"},historicalStatusSection:{flex:1,flexShrink:1,flexGrow:1,flexBasis:"auto",minWidth:"150px",display:"flex",flexDirection:"column"},statusTitle:{fontWeight:"bold",fontSize:"1.1rem",lineHeight:`${e.typography.h5.fontSize}px`,cursor:"default",marginBottom:e.spacing(2)},headerDescription:{fontSize:e.typography.body2.fontSize,margin:e.spacing(.5,0,0),"& p":{margin:0},"& a":{color:"inherit",textDecoration:"underline"}},entitiesContainer:{padding:e.spacing(2,3,3,3)},ownerLink:{"& span":{color:"inherit","&:hover":{textDecoration:"underline"}}}})),Pe=()=>{const e=Fe(),[r,d]=he(),{trackId:c,checkId:n}=fe(),a=l(()=>r.getAll("states"),[r]),p=l(()=>r.getAll("owners"),[r]),h=l(()=>r.getAll("lifecycles"),[r]),f=l(()=>r.getAll("types"),[r]),u=l(()=>r.getAll("systems"),[r]),Q=l(()=>Ie(r.get("numberOfDays")),[r]),[g,E]=x(h),[y,v]=x(p),[k,N]=x(f),[C,I]=x(u),[S,R]=x(a);pe(()=>{v(p),E(h),N(f),I(u),R(a)},[p,h,f,u,a]);const V=l(()=>{const i={owners:!b(y,p),lifecycles:!b(g,h),types:!b(k,f),systems:!b(C,u),states:!b(S,a)};return Object.values(i).some(Boolean)},[y,p,g,h,k,f,C,u,S,a]),J=M(()=>{const i=new URLSearchParams(r);i.delete("lifecycles"),i.delete("owners"),i.delete("types"),i.delete("systems"),i.delete("states"),g.length>0&&g.forEach(o=>i.append("lifecycles",o)),y.length>0&&y.forEach(o=>i.append("owners",o)),k.length>0&&k.forEach(o=>i.append("types",o)),C.length>0&&C.forEach(o=>i.append("systems",o)),S.length>0&&S.forEach(o=>i.append("states",o)),d(i)},[r,g,y,k,C,S,d]),K=M(()=>{E([]),v([]),N([]),I([]),R([]);const i=new URLSearchParams(r);i.delete("lifecycles"),i.delete("owners"),i.delete("types"),i.delete("systems"),i.delete("states"),d(i)},[r,d]),T=Se({lifecycles:h,owners:p,types:f,systems:u}),{data:w,isLoading:X}=ye(c),{data:s,isLoading:B}=ge(n),{loading:Y,allowed:Z}=j({permission:ce,resourceRef:n}),{loading:P,allowed:A}=j({permission:me,resourceRef:n}),O=ue(),H=re(Ce),_=ne();let L;if(n)if(w){const i=F(w.filter),o=F(De(w,n)?.filter);L=de(i,o)}else s&&(L=F(s.filter));const{data:W}=ke({checkId:n,trackId:c,filter:T,states:a?.length?a:void 0},!!n),q=l(()=>s?.ownerEntityRef?t(se,{color:"inherit",entityRef:s.ownerEntityRef,className:e.ownerLink}):null,[s?.ownerEntityRef,e.ownerLink]),ee=l(()=>!P&&A&&s?.isEditable?t(ae,{className:e.editButton,variant:"contained",color:"primary",onClick:()=>{O(H({checkId:s.id}))},children:"Edit Check"}):null,[A,s?.id,s?.isEditable,e.editButton,H,P,O]),te=l(()=>s?.description?t(Ne,{className:e.headerDescription,content:s.description}):null,[e.headerDescription,s?.description]);ve({title:s?.name??n??"Soundcheck",description:te,customSubtitle:q,sectionRight:ee});const[D,ie]=x(0);return m("div",{children:[t(G,{entityName:"track",entityId:c,showNotFound:!!c&&!X&&!w}),t(G,{entityName:"check",entityId:n,showNotFound:!B&&!s,showCannotView:!!s&&!Y&&!Z}),B&&t(Ee,{}),!B&&!!s&&t("div",{className:e.root,children:m("div",{className:e.pageContent,children:[t(we,{trackFilter:L,stagedTypes:k,stagedLifecycles:g,stagedOwners:y,stagedSystems:C,onTypesChange:N,onLifecyclesChange:E,onOwnersChange:v,onSystemsChange:I,onApplyFilters:J,onClearFilters:K,hasFilterChanges:V,children:t(be,{states:a,stagedStates:S,onStagedStatesChange:R})}),m("div",{className:e.mainContentArea,children:[t("div",{className:e.statusContainer,children:m("div",{className:e.statusCards,children:[m("div",{className:e.currentStatusSection,children:[t(z,{className:e.statusTitle,children:"Current Status"}),t("div",{style:{width:"100%",height:30,display:"flex",alignItems:"flex-start",marginBottom:_.spacing(2)},children:t(xe,{status:W})}),t("div",{children:t(Be,{checkStatus:W})})]}),m("div",{className:e.historicalStatusSection,children:[t(z,{className:e.statusTitle,children:"Historical Status"}),t("div",{style:{height:"100%"},children:t(Te,{checkId:n,trackId:c,filter:T,states:a,numberOfDays:Q})})]})]})}),m("div",{className:e.entitiesContainer,children:[m(le,{value:D,onChange:(i,o)=>ie(o),indicatorColor:"primary",textColor:"primary","aria-label":"Entities and Exemptions Tabs",children:[t(U,{label:"Entities"}),t(U,{label:"Exemptions"})]}),t($,{hidden:D!==0,children:t(Re,{checkId:n,trackId:w?.id,filter:T,states:a})}),t($,{hidden:D!==1,children:t(Le,{checkId:n})})]})]})]})})]})};export{Pe as CheckInsightsPage};
2
2
  //# sourceMappingURL=CheckInsightsPage.esm.js.map
@@ -1,2 +1,2 @@
1
- import{jsx as e,jsxs as f}from"react/jsx-runtime";import{makeStyles as u,useTheme as x}from"@material-ui/core";import{DateTime as A}from"luxon";import{ResponsiveContainer as v,LineChart as g,CartesianGrid as I,XAxis as L,YAxis as c,Tooltip as b,Line as n}from"recharts";import{useCheckStatusHistory as C}from"../../hooks/aggregations/useCheckStatusHistory.esm.js";import{getCheckStatusColor as o}from"../../utils/colors.esm.js";import{compactNumberFormatter as D}from"../../utils/formatters.esm.js";import{LoadingChart as W}from"../Charts/LoadingChart.esm.js";const K=u({root:{height:250,width:"100%",position:"relative",borderRadius:"4px"}}),S=({checkId:d,trackId:m,filter:p,states:l})=>{const t=x(),k=K(),{data:s,isLoading:h}=C({checkId:d,trackId:m,filter:p,states:l,numberOfDays:30},!!d);if(h)return e(W,{type:"line",numLines:3});const r=i=>s?.history.some(y=>y[i]>0)??!1,a={stroke:t.palette.background.paper,strokeWidth:1,r:5};return e("div",{className:k.root,children:e(v,{height:250,debounce:1,children:f(g,{data:s?.history??[],margin:{top:0,right:0,bottom:0,left:0},children:[e(I,{stroke:t.palette.divider,strokeWidth:1,horizontal:!0,vertical:!1}),e(L,{dataKey:"date",tickFormatter:i=>A.fromISO(i).toFormat("MMM d"),tickLine:!1,axisLine:!1}),e(c,{yAxisId:"percentage",domain:[0,100],axisLine:!1,tickLine:!1,tickFormatter:i=>`${i}%`,ticks:[0,25,50,75,100]}),e(c,{yAxisId:"count",orientation:"right",domain:[0,s?.numberOfEntities??0],axisLine:!1,tickLine:!1,tickFormatter:i=>D(i)}),e(b,{contentStyle:{backgroundColor:t.palette.background.paper,color:t.palette.text.primary,border:`1px solid ${t.palette.divider}`},cursor:{stroke:t.palette.divider,strokeWidth:1}}),r("passed")&&e(n,{type:"monotone",dataKey:"passed",stroke:o(t,"passed"),yAxisId:"count",strokeWidth:2,dot:!1,isAnimationActive:!1,activeDot:{fill:o(t,"passed"),...a}}),r("failed")&&e(n,{type:"monotone",dataKey:"failed",stroke:o(t,"failed"),yAxisId:"count",strokeWidth:2,dot:!1,isAnimationActive:!1,activeDot:{fill:o(t,"failed"),...a}}),r("warning")&&e(n,{type:"monotone",dataKey:"warning",stroke:o(t,"warning"),yAxisId:"count",strokeWidth:2,dot:!1,isAnimationActive:!1,activeDot:{fill:o(t,"warning"),...a}}),r("error")&&e(n,{type:"monotone",dataKey:"error",stroke:o(t,"error"),yAxisId:"count",strokeWidth:2,dot:!1,isAnimationActive:!1,activeDot:{fill:o(t,"error"),...a}}),r("exempt")&&e(n,{type:"monotone",dataKey:"exempt",stroke:o(t,"exempt"),yAxisId:"count",strokeWidth:2,dot:!1,isAnimationActive:!1,activeDot:{fill:o(t,"exempt"),...a}}),r("notReported")&&e(n,{type:"monotone",dataKey:"notReported",stroke:o(t,"not-reported"),yAxisId:"count",strokeWidth:2,dot:!1,isAnimationActive:!1,activeDot:{fill:o(t,"not-reported"),...a}})]})})})};export{S as CheckStatusHistoryChart};
1
+ import{jsx as e,jsxs as m}from"react/jsx-runtime";import{makeStyles as x,useTheme as A}from"@material-ui/core";import{DateTime as v}from"luxon";import{ResponsiveContainer as g,LineChart as I,CartesianGrid as b,XAxis as L,YAxis as c,Tooltip as C,Line as n}from"recharts";import{useCheckStatusHistory as D}from"../../hooks/aggregations/useCheckStatusHistory.esm.js";import{getCheckStatusColor as o}from"../../utils/colors.esm.js";import{compactNumberFormatter as W}from"../../utils/formatters.esm.js";import{LoadingChart as K}from"../Charts/LoadingChart.esm.js";import{TimePeriodBar as F}from"../TimePeriodBar/TimePeriodBar.esm.js";const S=x({root:{height:290,width:"100%",position:"relative",borderRadius:"4px"}}),w=({checkId:d,trackId:p,filter:l,states:k,numberOfDays:h})=>{const t=A(),y=S(),{data:s,isLoading:f}=D({checkId:d,trackId:p,filter:l,states:k,numberOfDays:h},!!d);if(f)return e(K,{type:"line",numLines:3});const r=i=>s?.history.some(u=>u[i]>0)??!1,a={stroke:t.palette.background.paper,strokeWidth:1,r:5};return m("div",{className:y.root,children:[e(F,{}),e(g,{height:250,debounce:1,children:m(I,{data:s?.history??[],margin:{top:0,right:0,bottom:0,left:0},children:[e(b,{stroke:t.palette.divider,strokeWidth:1,horizontal:!0,vertical:!1}),e(L,{dataKey:"date",tickFormatter:i=>v.fromISO(i).toFormat("MMM d"),tickLine:!1,axisLine:!1}),e(c,{yAxisId:"percentage",domain:[0,100],axisLine:!1,tickLine:!1,tickFormatter:i=>`${i}%`,ticks:[0,25,50,75,100]}),e(c,{yAxisId:"count",orientation:"right",domain:[0,s?.numberOfEntities??0],axisLine:!1,tickLine:!1,tickFormatter:i=>W(i)}),e(C,{contentStyle:{backgroundColor:t.palette.background.paper,color:t.palette.text.primary,border:`1px solid ${t.palette.divider}`},cursor:{stroke:t.palette.divider,strokeWidth:1}}),r("passed")&&e(n,{type:"monotone",dataKey:"passed",stroke:o(t,"passed"),yAxisId:"count",strokeWidth:2,dot:!1,isAnimationActive:!1,activeDot:{fill:o(t,"passed"),...a}}),r("failed")&&e(n,{type:"monotone",dataKey:"failed",stroke:o(t,"failed"),yAxisId:"count",strokeWidth:2,dot:!1,isAnimationActive:!1,activeDot:{fill:o(t,"failed"),...a}}),r("warning")&&e(n,{type:"monotone",dataKey:"warning",stroke:o(t,"warning"),yAxisId:"count",strokeWidth:2,dot:!1,isAnimationActive:!1,activeDot:{fill:o(t,"warning"),...a}}),r("error")&&e(n,{type:"monotone",dataKey:"error",stroke:o(t,"error"),yAxisId:"count",strokeWidth:2,dot:!1,isAnimationActive:!1,activeDot:{fill:o(t,"error"),...a}}),r("exempt")&&e(n,{type:"monotone",dataKey:"exempt",stroke:o(t,"exempt"),yAxisId:"count",strokeWidth:2,dot:!1,isAnimationActive:!1,activeDot:{fill:o(t,"exempt"),...a}}),r("notReported")&&e(n,{type:"monotone",dataKey:"notReported",stroke:o(t,"not-reported"),yAxisId:"count",strokeWidth:2,dot:!1,isAnimationActive:!1,activeDot:{fill:o(t,"not-reported"),...a}})]})})]})};export{w as CheckStatusHistoryChart};
2
2
  //# sourceMappingURL=CheckStatusHistoryChart.esm.js.map
@@ -0,0 +1,2 @@
1
+ import{jsx as e,jsxs as l}from"react/jsx-runtime";import{EmptyState as S}from"@backstage/core-components";import{EntityRefLink as w}from"@backstage/plugin-catalog-react";import{makeStyles as j,CircularProgress as W,Typography as B,Table as E,TableHead as I,TableRow as b,TableCell as o,TableBody as R,Tooltip as D,TablePagination as L}from"@material-ui/core";import{useState as d}from"react";import{useExemptions as O}from"../../hooks/exemptions/useExemptions.esm.js";const _=10,F=j(i=>({justificationCell:{maxWidth:600,minWidth:200,flex:2,overflow:"hidden",textOverflow:"ellipsis",display:"-webkit-box",WebkitLineClamp:2,WebkitBoxOrient:"vertical",whiteSpace:"pre-line",wordBreak:"break-word"},emptyStateWrapper:{padding:i.spacing(2)}}));function H(i){if(!i)return"";const a=!isNaN(i)&&!isNaN(parseFloat(i));let r;return a&&String(i).length>=10?r=new Date(Number(i)):r=new Date(i),isNaN(r.getTime())?String(i):r.toLocaleDateString()}const $=({checkId:i})=>{const a=F(),[r,h]=d(0),[f,x]=d(_),[g,c]=d("forward"),[y,p]=d(void 0),{data:m,isLoading:P,error:v}=O(i,{first:g==="forward"?f:void 0,after:g==="forward"?y:void 0}),k=m?.totalCount??0,u=m?.edges??[],n=m?.pageInfo,N=(s,t)=>{t>r?(c("forward"),p(n?.endCursor??void 0)):t<r&&(c("backward"),p(n?.startCursor??void 0)),h(t)},C=s=>{x(parseInt(s.target.value,10)),h(0),p(void 0),c("forward")};return P?e(W,{}):v?e(B,{color:"error",children:"Failed to load exemptions."}):u.length?l("div",{children:[l(E,{children:[e(I,{children:l(b,{children:[e(o,{children:"Entity"}),e(o,{className:a.justificationCell,children:"Justification"}),e(o,{children:"User"}),e(o,{children:"Date"})]})}),e(R,{children:u.map(s=>{const t=s.node,T=H(t.timestamp);return l(b,{children:[e(o,{children:e(w,{entityRef:t.entity_ref})}),e(o,{className:a.justificationCell,children:e(D,{title:t.justification,placement:"top-start",arrow:!0,children:e("span",{children:t.justification})})}),e(o,{children:e(w,{entityRef:t.user_ref})}),e(o,{children:T})]},`${t.entity_ref}-${t.check_id}`)})})]}),e(L,{component:"div",count:k,page:r,onPageChange:N,rowsPerPage:f,onRowsPerPageChange:C,rowsPerPageOptions:[10,25,50],nextIconButtonProps:{disabled:!n?.hasNextPage},backIconButtonProps:{disabled:!n?.hasPreviousPage||r===0}})]}):e("div",{className:a.emptyStateWrapper,children:e(S,{title:"No exemptions found",description:"There are no exemptions for this check.",missing:"data"})})};export{$ as ExemptionsTable};
2
+ //# sourceMappingURL=ExemptionsTable.esm.js.map
@@ -1,2 +1,2 @@
1
- import{jsx as r,jsxs as w}from"react/jsx-runtime";import{useApi as _,featureFlagsApiRef as q,useRouteRef as z}from"@backstage/core-plugin-api";import{usePermission as J}from"@backstage/plugin-permission-react";import{makeStyles as K,Button as x,Grid as o}from"@material-ui/core";import{soundcheckCheckCreatePermission as U}from"@spotify/backstage-plugin-soundcheck-common";import{useState as i,useEffect as y}from"react";import{useNavigate as V}from"react-router-dom";import X from"react-use/lib/useDebounce";import"@backstage/catalog-model";import"@tanstack/react-query";import"../../../api.esm.js";import"../../../hooks/graphqlKeys.esm.js";import"@backstage/plugin-catalog-react";import{useGetChecks as Y}from"../../../hooks/checks/useGetChecks.esm.js";import"../../../hooks/useSoundcheckAlert.esm.js";import"../../../hooks/useConfirmationModal.esm.js";import{useGetCheckOwners as ee}from"../../../hooks/checks/useGetCheckOwners.esm.js";import re from"../../../images/no-results.svg";import{checkTemplatesRouteRef as te}from"../../../routes.esm.js";import{FilterDefault as A}from"../../../utils/filters.esm.js";import{EmptyState as S}from"../../EmptyState/EmptyState.esm.js";import{Pagination as ae}from"../../Pagination/Pagination.esm.js";import{SearchFilters as oe}from"../../SearchFilters/SearchFilters.esm.js";import{ChecksOverviewSkeleton as ie}from"../skeletons/ChecksOverviewSkeleton.esm.js";import{CheckSummaryCard as se}from"./CheckSummaryCard.esm.js";var B=(e=>(e.title="Create a check",e.description="A check is a comparison between a defined acceptable outcome and the actual outcome of a given process.",e.callToAction="Get started",e))(B||{}),I=(e=>(e.title="No checks found",e.description="No checks matched your search. Consider changing search term and filters.",e))(I||{});const ce=K(e=>({headerButtons:{display:"flex",gap:e.spacing(1),flexWrap:"nowrap",justifyContent:"end",alignItems:"end"},header:{padding:e.spacing(0,0,1)},container:{padding:e.spacing(3),gap:e.spacing(3)},createButton:{lineHeight:"1.25rem",paddingTop:e.spacing(1.5),paddingBottom:e.spacing(1.5)}})),ne=({checksPerPage:e,currentCursor:R})=>{const s=ce(),[h,p]=i(R),[n,F]=i(""),[g,O]=i(A.Alpha),[u,T]=i(A.Owner),[f,G]=i(""),{data:L,isLoading:E}=ee();X(()=>{G(n)},500,[n]);const{loading:k,allowed:j}=J({permission:U}),{data:a,isLoading:l}=Y({ids:void 0,first:e,after:h,orderAlphabetical:g,searchByOwner:u,searchByName:f}),[m,D]=i(a),d=m?.edges?.map(t=>t.node),[C,P]=i([]);y(()=>{p(void 0),P([])},[f]);const v=_(q),H=!v.getRegisteredFlags().find(t=>t.name==="soundcheck-enable-check-creation")||v.isActive("soundcheck-enable-check-creation"),b=!j||!H,W=t=>{O(t.target.value)},$=t=>{T(t.target.value)};y(()=>{a&&D(()=>({totalCount:a.totalCount,edges:a.edges,pageInfo:{startCursor:a.pageInfo.startCursor,endCursor:a.pageInfo.endCursor,hasNextPage:a?.pageInfo.hasNextPage??!1,hasPreviousPage:a?.pageInfo.hasPreviousPage??!1}}))},[a]);const M=V(),Q=z(te),N=()=>M(Q());if(!l&&!d)return r(S,{title:"Create a check",description:"A check is a comparison between a defined acceptable outcome and the actual outcome of a given process.",imgSrc:re,action:!k&&r(x,{disabled:b,variant:"contained",color:"primary",onClick:N,children:"Get started"})});let c;l?c=r(ie,{}):d?.length?c=d?.map(t=>r(o,{xs:12,sm:12,md:6,lg:4,xl:3,item:!0,role:"listitem","aria-label":`check card ${t.id}`,children:r(se,{check:t})},t.id)):c=r(o,{xs:12,item:!0,role:"listitem","aria-label":"result",children:r(S,{title:"No checks found",description:"No checks matched your search. Consider changing search term and filters."})});const Z=m?.pageInfo.hasNextPage||C?.length>0;return w(o,{container:!0,direction:"row",className:s.container,children:[w(o,{container:!0,className:s.header,children:[r(oe,{searchPlaceholder:"Search Available Checks",isLoading:l||E,searchTerm:n,setSearchTerm:F,filterAlpha:g,handleAlphabeticalFilterChange:W,filterOwner:u,handleOwnerFilterChange:$,owners:L}),r(o,{item:!0,xs:2,className:s.headerButtons,children:!k&&r(x,{disabled:b,variant:"contained",color:"primary",onClick:N,className:s.createButton,children:"Create Check"})})]}),r(o,{container:!0,spacing:4,role:"list","aria-label":"checks",children:c}),Z&&r(o,{item:!0,xs:12,children:r(ae,{response:m,listingsPerPage:e,cursor:h,setCursor:p,prevCursors:C,setPrevCursors:P,labelPerPageDropdown:"Checks Per Page:",urlRoute:"checks?checksPerPage="})})]})};export{B as CheckEmptyState,ne as CheckListPage,I as CheckNoResults};
1
+ import{jsx as t,jsxs as h}from"react/jsx-runtime";import{useApi as w,featureFlagsApiRef as X,useRouteRef as Y}from"@backstage/core-plugin-api";import{usePermission as _}from"@backstage/plugin-permission-react";import{makeStyles as ee,Button as A,Grid as o}from"@material-ui/core";import{soundcheckCheckCreatePermission as re}from"@spotify/backstage-plugin-soundcheck-common";import{useState as i,useEffect as N}from"react";import{useNavigate as te}from"react-router-dom";import ae from"react-use/lib/useDebounce";import{soundcheckApiRef as oe}from"../../../api.esm.js";import"@backstage/catalog-model";import"@tanstack/react-query";import"../../../hooks/graphqlKeys.esm.js";import"@backstage/plugin-catalog-react";import{useGetChecks as ie}from"../../../hooks/checks/useGetChecks.esm.js";import"../../../hooks/useSoundcheckAlert.esm.js";import"../../../hooks/useConfirmationModal.esm.js";import{useGetCheckOwners as se}from"../../../hooks/checks/useGetCheckOwners.esm.js";import{useImportChecks as ce}from"../../../hooks/checks/useImportChecks.esm.js";import ne from"../../../images/no-results.svg";import{checkTemplatesRouteRef as me}from"../../../routes.esm.js";import{exportChecks as le}from"../../../utils/export.esm.js";import{FilterDefault as I}from"../../../utils/filters.esm.js";import{EmptyState as S}from"../../EmptyState/EmptyState.esm.js";import{ImportExportPanel as pe}from"../../ImportExportPanel/ImportExportPanel.esm.js";import{Pagination as de}from"../../Pagination/Pagination.esm.js";import{SearchFilters as he}from"../../SearchFilters/SearchFilters.esm.js";import{ChecksOverviewSkeleton as ge}from"../skeletons/ChecksOverviewSkeleton.esm.js";import{CheckSummaryCard as ue}from"./CheckSummaryCard.esm.js";var B=(e=>(e.title="Create a check",e.description="A check is a comparison between a defined acceptable outcome and the actual outcome of a given process.",e.callToAction="Get started",e))(B||{}),R=(e=>(e.title="No checks found",e.description="No checks matched your search. Consider changing search term and filters.",e))(R||{});const fe=ee(e=>({headerButtons:{display:"flex",gap:e.spacing(1),flexWrap:"nowrap",justifyContent:"end",alignItems:"end"},header:{padding:e.spacing(0,0,1)},container:{padding:e.spacing(3),gap:e.spacing(3)},createButton:{lineHeight:"1.25rem",paddingTop:e.spacing(1.5),paddingBottom:e.spacing(1.5)}})),ke=({checksPerPage:e,currentCursor:E})=>{const s=fe(),[g,u]=i(E),[l,F]=i(""),[f,O]=i(I.Alpha),[k,T]=i(I.Owner),[C,G]=i(""),{data:L,isLoading:j}=se();ae(()=>{G(l)},500,[l]);const{loading:P,allowed:D}=_({permission:re}),{data:a,isLoading:c}=ie({ids:void 0,first:e,after:g,orderAlphabetical:f,searchByOwner:k,searchByName:C}),[p,H]=i(a),n=p?.edges?.map(r=>r.node),[b,v]=i([]);N(()=>{u(void 0),v([])},[C]);const x=w(X),W=!x.getRegisteredFlags().find(r=>r.name==="soundcheck-enable-check-creation")||x.isActive("soundcheck-enable-check-creation"),d=!D||!W,$=r=>{O(r.target.value)},q=r=>{T(r.target.value)};N(()=>{a&&H(()=>({totalCount:a.totalCount,edges:a.edges,pageInfo:{startCursor:a.pageInfo.startCursor,endCursor:a.pageInfo.endCursor,hasNextPage:a?.pageInfo.hasNextPage??!1,hasPreviousPage:a?.pageInfo.hasPreviousPage??!1}}))},[a]);const z=te(),J=Y(me),y=()=>z(J()),M=w(oe),{mutateAsync:Q}=ce(),V=async r=>Q(r),Z=async()=>{const r=await M.getChecks({orderAlphabetical:"asc"});return le(r.edges.map(U=>U.node))};if(!c&&!n)return t(S,{title:"Create a check",description:"A check is a comparison between a defined acceptable outcome and the actual outcome of a given process.",imgSrc:ne,action:!P&&t(A,{disabled:d,variant:"contained",color:"primary",onClick:y,children:"Get started"})});let m;c?m=t(ge,{}):n?.length?m=n?.map(r=>t(o,{xs:12,sm:12,md:6,lg:4,xl:3,item:!0,role:"listitem","aria-label":`check card ${r.id}`,children:t(ue,{check:r})},r.id)):m=t(o,{xs:12,item:!0,role:"listitem","aria-label":"result",children:t(S,{title:"No checks found",description:"No checks matched your search. Consider changing search term and filters."})});const K=p?.pageInfo.hasNextPage||b?.length>0;return h(o,{container:!0,direction:"row",className:s.container,children:[h(o,{container:!0,className:s.header,children:[t(he,{searchPlaceholder:"Search Available Checks",isLoading:c||j,searchTerm:l,setSearchTerm:F,filterAlpha:f,handleAlphabeticalFilterChange:$,filterOwner:k,handleOwnerFilterChange:q,owners:L}),h(o,{item:!0,xs:4,className:s.headerButtons,children:[t(pe,{resourceType:"check",disableImport:d,disableExport:c||!n?.length,onImport:V,onExport:Z}),!P&&t(A,{disabled:d,variant:"contained",color:"primary",onClick:y,className:s.createButton,children:"Create Check"})]})]}),t(o,{container:!0,spacing:4,role:"list","aria-label":"checks",children:m}),K&&t(o,{item:!0,xs:12,children:t(de,{response:p,listingsPerPage:e,cursor:g,setCursor:u,prevCursors:b,setPrevCursors:v,labelPerPageDropdown:"Checks Per Page:",urlRoute:"checks?checksPerPage="})})]})};export{B as CheckEmptyState,ke as CheckListPage,R as CheckNoResults};
2
2
  //# sourceMappingURL=CheckListPage.esm.js.map
@@ -0,0 +1,2 @@
1
+ import{jsxs as o,jsx as e}from"react/jsx-runtime";import{makeStyles as m,Box as i,Typography as f,Tooltip as h,Icon as y,IconButton as x}from"@material-ui/core";import I from"@material-ui/icons/ArrowDropDown";import b from"@material-ui/icons/ArrowDropUp";import u from"@material-ui/icons/HelpOutline";import v from"../Expand/Expand.esm.js";const g=m(({palette:l})=>({header:{display:"flex",alignItems:"left",flexDirection:"row",cursor:"pointer",justifyContent:"space-between"},label:{display:"flex",alignItems:"center"},tooltipIcon:{display:"flex",alignItems:"center",justifyContent:"center",color:l.text.primary}})),j=({label:l,tooltip:r,isExpanded:s,setIsExpanded:p,children:d})=>{const n=g(),a=()=>{p(t=>!t)},c=t=>{(t.key==="Enter"||t.key===" ")&&a()};return o(i,{children:[o("div",{className:n.header,onClick:a,onKeyDown:c,role:"button",tabIndex:0,children:[o("div",{className:n.label,children:[e(i,{children:e(f,{variant:"subtitle2",children:l})}),r&&e(h,{title:r,className:n.tooltipIcon,children:e(y,{children:e(u,{style:{fontSize:16,verticalAlign:"text-top"}})})})]}),e(i,{children:e(x,{size:"small",onKeyDown:c,children:s?e(b,{fontSize:"small"}):e(I,{fontSize:"small"})})})]}),e(v,{visible:s,children:d})]})};export{j as CollapsablePanel};
2
+ //# sourceMappingURL=CollapsablePanel.esm.js.map
@@ -1,2 +1,2 @@
1
- import{jsxs as d,jsx as r}from"react/jsx-runtime";import{Content as l}from"@backstage/core-components";import{usePermission as p}from"@backstage/plugin-permission-react";import{soundcheckCollectorUpdatePermission as c}from"@spotify/backstage-plugin-soundcheck-common";import{useParams as f}from"react-router-dom";import{useGetCollectors as g}from"../../hooks/collectors/useGetCollectors.esm.js";import{LoadingIndicator as u}from"../LoadingIndicator/LoadingIndicator.esm.js";import{PageWarningMessage as C}from"../PageWarningMessage/PageWarningMessage.esm.js";import{Configurator as P}from"./Configurators/Configurator.esm.js";const h=()=>{const{integrationId:i}=f(),{data:n,isLoading:s}=g([i??""]),{loading:m,allowed:a}=p({permission:c}),o=n?.[0],t=s||m,e=a&&o?.isEditable;return d(l,{children:[t&&r(u,{}),r(C,{entityName:"Integration",entityId:i,showNotFound:!t&&!o,showCannotEdit:!t&&!e}),o&&e&&r(P,{selectedCollector:o})]})};export{h as CollectorPage};
1
+ import{jsxs as c,jsx as r}from"react/jsx-runtime";import{Content as p}from"@backstage/core-components";import{usePermission as f}from"@backstage/plugin-permission-react";import{soundcheckCollectorUpdatePermission as g}from"@spotify/backstage-plugin-soundcheck-common";import{useParams as u}from"react-router-dom";import{useGetCollectors as C}from"../../hooks/collectors/useGetCollectors.esm.js";import{LoadingIndicator as I}from"../LoadingIndicator/LoadingIndicator.esm.js";import{PageWarningMessage as P}from"../PageWarningMessage/PageWarningMessage.esm.js";import{Configurator as h}from"./Configurators/Configurator.esm.js";const w=({collectorId:n})=>{const s=u(),e=n??s.integrationId,{data:m,isLoading:a}=C([e??""]),{loading:d,allowed:l}=f({permission:g}),o=m?.[0],t=a||d,i=l&&o?.isEditable;return c(p,{children:[t&&r(I,{}),r(P,{entityName:"Integration",entityId:e,showNotFound:!t&&!o,showCannotEdit:!t&&!i}),o&&i&&r(h,{selectedCollector:o})]})};export{w as CollectorPage};
2
2
  //# sourceMappingURL=CollectorPage.esm.js.map