@spotify/backstage-plugin-soundcheck 0.12.10 → 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (160) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/alpha/package.json +1 -1
  3. package/dist/components/CampaignDetailsPage/CampaignChecks.esm.js +2 -0
  4. package/dist/components/CampaignDetailsPage/CampaignDetailsPage.esm.js +2 -0
  5. package/dist/components/CampaignDetailsPage/CampaignProgress.esm.js +2 -0
  6. package/dist/components/CampaignDetailsPage/CampaignResultsTable.esm.js +2 -0
  7. package/dist/components/CampaignForm/CampaignForm.esm.js +2 -0
  8. package/dist/components/CampaignForm/CampaignFormDescription.esm.js +2 -0
  9. package/dist/components/CampaignForm/Steps/CampaignDetailsStep/CampaignDetailsStep.esm.js +2 -0
  10. package/dist/components/CampaignForm/Steps/CampaignDetailsStep/CampaignOwnerField.esm.js +2 -0
  11. package/dist/components/CampaignForm/Steps/CampaignDetailsStep/CampaignScheduleField.esm.js +2 -0
  12. package/dist/components/CampaignForm/Steps/CampaignDetailsStep/CampaignSupportChannelField.esm.js +2 -0
  13. package/dist/components/CampaignForm/Steps/CampaignMilestonesStep.esm.js +2 -0
  14. package/dist/components/CampaignForm/Steps/CampaignTrackStep.esm.js +2 -0
  15. package/dist/components/CampaignForm/hooks/useCampaignForm.esm.js +2 -0
  16. package/dist/components/CampaignForm/hooks/utils.esm.js +2 -0
  17. package/dist/components/CampaignForm/types/CampaignFormTypes.esm.js +2 -0
  18. package/dist/components/CampaignForm/utils/validation.esm.js +2 -0
  19. package/dist/components/CampaignsPage/AddCampaignView.esm.js +2 -0
  20. package/dist/components/CampaignsPage/CampaignEmptyState.esm.js +2 -0
  21. package/dist/components/CampaignsPage/CampaignListPage/CampaignListPage.esm.js +2 -0
  22. package/dist/components/CampaignsPage/CampaignsPage.esm.js +1 -1
  23. package/dist/components/CampaignsPage/EditCampaignView.esm.js +2 -0
  24. package/dist/components/CertificationSidebar/Check.esm.js +1 -1
  25. package/dist/components/CheckForm/CheckForm.esm.js +2 -0
  26. package/dist/components/CheckForm/CheckFormDescription.esm.js +2 -0
  27. package/dist/components/CheckForm/FormFields/CheckDescriptionInput/CheckDescriptionInput.esm.js +2 -0
  28. package/dist/components/CheckForm/FormFields/CheckScheduleSection/ScheduleSection.esm.js +2 -0
  29. package/dist/components/CheckForm/FormFields/PassFailMessageInput/PassFailMessageInput.esm.js +2 -0
  30. package/dist/components/CheckForm/FormFields/RuleInput/Conditions/RuleConditionInput.esm.js +2 -0
  31. package/dist/components/CheckForm/FormFields/RuleInput/Conditions/useRuleOptions.esm.js +2 -0
  32. package/dist/components/CheckForm/FormFields/RuleInput/Expressions/ExpressionTypeToggle.esm.js +2 -0
  33. package/dist/components/CheckForm/FormFields/RuleInput/RuleInputBox.esm.js +2 -0
  34. package/dist/components/CheckForm/FormFields/RuleInput/useRuleInputHandlers.esm.js +2 -0
  35. package/dist/components/CheckForm/FormFields/TeamDetailsInput/TeamDetailsInput.esm.js +2 -0
  36. package/dist/components/CheckForm/Steps/CheckDetailsStep.esm.js +2 -0
  37. package/dist/components/CheckForm/Steps/CheckRulesStep.esm.js +2 -0
  38. package/dist/components/CheckForm/types/CheckFormTypes.esm.js +2 -0
  39. package/dist/components/CheckForm/types/Schedule.esm.js +2 -0
  40. package/dist/components/CheckForm/useCheckForm.esm.js +2 -0
  41. package/dist/components/CheckForm/utils/checkFormUtils.esm.js +2 -0
  42. package/dist/components/CheckForm/utils/validation.esm.js +2 -0
  43. package/dist/components/CheckPage/CheckDetailsView.esm.js +1 -1
  44. package/dist/components/CheckPage/CheckEditView.esm.js +1 -1
  45. package/dist/components/CheckPage/FilterBar/FilterBar.esm.js +1 -1
  46. package/dist/components/ChecksPage/AddCheckView.esm.js +2 -0
  47. package/dist/components/ChecksPage/CheckListPage/CheckListPage.esm.js +1 -1
  48. package/dist/components/ChecksPage/ChecksPage.esm.js +1 -1
  49. package/dist/components/DroppableInput/DroppableInput.esm.js +1 -1
  50. package/dist/components/OverviewPage/CampaignBanner/CampaignBanner.esm.js +2 -0
  51. package/dist/components/OverviewPage/{CampaignRow/useCampaignRowStyles.esm.js → CampaignBanner/useCampaignBannerStyles.esm.js} +2 -2
  52. package/dist/components/OverviewPage/OverviewPageContent.esm.js +1 -1
  53. package/dist/components/OverviewPage/OverviewTabs.esm.js +1 -1
  54. package/dist/components/OverviewTable/Cell/CheckCell.esm.js +2 -0
  55. package/dist/components/OverviewTable/Cell/CheckNameCell.esm.js +2 -0
  56. package/dist/components/OverviewTable/Cell/EntityRefCell.esm.js +2 -0
  57. package/dist/components/OverviewTable/Cell/HighestLevelBadge.esm.js +2 -0
  58. package/dist/components/OverviewTable/Cell/TrackCheckIndicator.esm.js +2 -0
  59. package/dist/components/OverviewTable/Cell/TrackLevelHeaderCell.esm.js +2 -0
  60. package/dist/components/OverviewTable/Cell/TrackTitleCell.esm.js +2 -0
  61. package/dist/components/OverviewTable/Cell/cellRenderer.esm.js +2 -0
  62. package/dist/components/OverviewTable/OverviewTable.esm.js +2 -0
  63. package/dist/components/OverviewTable/OverviewTableContent.esm.js +2 -0
  64. package/dist/components/OverviewTable/OverviewTableSkeleton.esm.js +2 -0
  65. package/dist/components/OverviewTable/ResultsTable.esm.js +2 -0
  66. package/dist/components/OverviewTable/ResultsTableHeader.esm.js +2 -0
  67. package/dist/components/OverviewTable/ResultsTableRow.esm.js +2 -0
  68. package/dist/components/OverviewTable/resultsTableUtils.esm.js +2 -0
  69. package/dist/components/OverviewTable/useWindowDimensions.esm.js +2 -0
  70. package/dist/components/Router.esm.js +1 -1
  71. package/dist/components/RoutingPage/RoutingPage.esm.js +1 -1
  72. package/dist/components/SearchFilters/SearchFilters.esm.js +1 -1
  73. package/dist/components/TechHealth/Filters/FilterProvider.esm.js +1 -1
  74. package/dist/components/TrackPage/FilterBar/FilterBar.esm.js +1 -1
  75. package/dist/components/TrackPage/TrackEntitiesTable/TrackStatusChip.esm.js +1 -1
  76. package/dist/components/TrackPage/TrackEntitiesTable/columns.esm.js +1 -1
  77. package/dist/components/TrackPage/TrackEntitiesTable/utils.esm.js +1 -1
  78. package/dist/components/TrackPage/utils.esm.js +1 -1
  79. package/dist/components/TracksPage/TrackListPage/TrackListPage.esm.js +1 -1
  80. package/dist/hooks/catalog/useGetEntityFacets.esm.js +1 -1
  81. package/dist/hooks/facets/useFacetFilters.esm.js +1 -1
  82. package/dist/utils/export.esm.js +3 -3
  83. package/package.json +15 -15
  84. package/dist/components/CampaignsTab/CampaignDetailsPage/CampaignChecks.esm.js +0 -2
  85. package/dist/components/CampaignsTab/CampaignDetailsPage/CampaignDetailsPage.esm.js +0 -2
  86. package/dist/components/CampaignsTab/CampaignDetailsPage/CampaignProgress.esm.js +0 -2
  87. package/dist/components/CampaignsTab/CampaignDetailsPage/CampaignResultsTable.esm.js +0 -2
  88. package/dist/components/CampaignsTab/CampaignListPage/CampaignListPage.esm.js +0 -2
  89. package/dist/components/CampaignsTab/MutateCampaignsViews/AddCampaignView.esm.js +0 -2
  90. package/dist/components/CampaignsTab/MutateCampaignsViews/CampaignForm.esm.js +0 -2
  91. package/dist/components/CampaignsTab/MutateCampaignsViews/CampaignFormDescription.esm.js +0 -2
  92. package/dist/components/CampaignsTab/MutateCampaignsViews/EditCampaignView.esm.js +0 -2
  93. package/dist/components/CampaignsTab/MutateCampaignsViews/Steps/CampaignDetailsStep/CampaignDetailsStep.esm.js +0 -2
  94. package/dist/components/CampaignsTab/MutateCampaignsViews/Steps/CampaignDetailsStep/CampaignOwnerField.esm.js +0 -2
  95. package/dist/components/CampaignsTab/MutateCampaignsViews/Steps/CampaignDetailsStep/CampaignScheduleField/CampaignScheduleField.esm.js +0 -2
  96. package/dist/components/CampaignsTab/MutateCampaignsViews/Steps/CampaignDetailsStep/CampaignSupportChannelField.esm.js +0 -2
  97. package/dist/components/CampaignsTab/MutateCampaignsViews/Steps/CampaignMilestonesStep.esm.js +0 -2
  98. package/dist/components/CampaignsTab/MutateCampaignsViews/Steps/CampaignTrackStep.esm.js +0 -2
  99. package/dist/components/CampaignsTab/MutateCampaignsViews/hooks/useCampaignForm.esm.js +0 -2
  100. package/dist/components/CampaignsTab/MutateCampaignsViews/hooks/utils.esm.js +0 -2
  101. package/dist/components/CampaignsTab/MutateCampaignsViews/types/CampaignFormTypes.esm.js +0 -2
  102. package/dist/components/CampaignsTab/MutateCampaignsViews/utils/validation.esm.js +0 -2
  103. package/dist/components/ChecksPage/MutateCheckViews/AddCheckView.esm.js +0 -2
  104. package/dist/components/ChecksPage/MutateCheckViews/CheckForm/CheckForm.esm.js +0 -2
  105. package/dist/components/ChecksPage/MutateCheckViews/CheckForm/CheckFormDescription.esm.js +0 -2
  106. package/dist/components/ChecksPage/MutateCheckViews/CheckForm/Steps/CheckDetailsStep.esm.js +0 -2
  107. package/dist/components/ChecksPage/MutateCheckViews/CheckForm/Steps/CheckRulesStep.esm.js +0 -2
  108. package/dist/components/ChecksPage/MutateCheckViews/FormFields/CheckDescriptionInput/CheckDescriptionInput.esm.js +0 -2
  109. package/dist/components/ChecksPage/MutateCheckViews/FormFields/CheckScheduleSection/ScheduleSection.esm.js +0 -2
  110. package/dist/components/ChecksPage/MutateCheckViews/FormFields/PassFailMessageInput/PassFailMessageInput.esm.js +0 -2
  111. package/dist/components/ChecksPage/MutateCheckViews/FormFields/RuleInput/Conditions/RuleConditionInput.esm.js +0 -2
  112. package/dist/components/ChecksPage/MutateCheckViews/FormFields/RuleInput/Conditions/useRuleOptions.esm.js +0 -2
  113. package/dist/components/ChecksPage/MutateCheckViews/FormFields/RuleInput/Expressions/ExpressionTypeToggle.esm.js +0 -2
  114. package/dist/components/ChecksPage/MutateCheckViews/FormFields/RuleInput/RuleInputBox.esm.js +0 -2
  115. package/dist/components/ChecksPage/MutateCheckViews/FormFields/RuleInput/useRuleInputHandlers.esm.js +0 -2
  116. package/dist/components/ChecksPage/MutateCheckViews/FormFields/TeamDetailsInput/TeamDetailsInput.esm.js +0 -2
  117. package/dist/components/ChecksPage/MutateCheckViews/hooks/useCheckForm.esm.js +0 -2
  118. package/dist/components/ChecksPage/MutateCheckViews/types/CheckFormTypes.esm.js +0 -2
  119. package/dist/components/ChecksPage/MutateCheckViews/types/Schedule.esm.js +0 -2
  120. package/dist/components/ChecksPage/MutateCheckViews/utils/checkFormUtils.esm.js +0 -2
  121. package/dist/components/ChecksPage/MutateCheckViews/utils/validation.esm.js +0 -2
  122. package/dist/components/EmptyState/CampaignEmptyState.esm.js +0 -2
  123. package/dist/components/OverviewPage/CampaignRow/CampaignRow.esm.js +0 -2
  124. package/dist/components/OverviewPage/TableContent/TableContent.esm.js +0 -2
  125. package/dist/components/OverviewPage/TableContent/VirtualTableContent.esm.js +0 -2
  126. package/dist/components/ResultsTable/CheckCell/CheckCell.esm.js +0 -2
  127. package/dist/components/ResultsTable/HighestLevelBadge.esm.js +0 -2
  128. package/dist/components/ResultsTable/ProgramCheckIndicator.esm.js +0 -2
  129. package/dist/components/ResultsTable/ProgramCheckRow.esm.js +0 -2
  130. package/dist/components/ResultsTable/ProgramLevelRow.esm.js +0 -2
  131. package/dist/components/ResultsTable/ProgramTitleRow.esm.js +0 -2
  132. package/dist/components/ResultsTable/ResultsTableFooter.esm.js +0 -2
  133. package/dist/components/ResultsTable/skeletons/ResultsTableSkeleton.esm.js +0 -2
  134. package/dist/components/ResultsTable/virtualized/Cell.esm.js +0 -2
  135. package/dist/components/ResultsTable/virtualized/Row.esm.js +0 -2
  136. package/dist/components/ResultsTable/virtualized/VirtualizedResultsTable.esm.js +0 -2
  137. package/dist/components/ResultsTable/virtualized/virtualizedTableUtils.esm.js +0 -2
  138. /package/dist/components/{CampaignsTab/CampaignDetailsPage → CampaignDetailsPage}/CampaignDetailRow.esm.js +0 -0
  139. /package/dist/components/{CampaignsTab/CampaignDetailsPage → CampaignDetailsPage}/CampaignDetails.esm.js +0 -0
  140. /package/dist/components/{CampaignsTab/CampaignDetailsPage → CampaignDetailsPage}/CampaignMilestones.esm.js +0 -0
  141. /package/dist/components/{CampaignsTab/MutateCampaignsViews → CampaignForm}/Steps/CampaignDetailsStep/CampaignDescriptionField.esm.js +0 -0
  142. /package/dist/components/{CampaignsTab/MutateCampaignsViews → CampaignForm}/Steps/CampaignDetailsStep/CampaignNameField.esm.js +0 -0
  143. /package/dist/components/{CampaignsTab/MutateCampaignsViews/Steps/CampaignDetailsStep/CampaignScheduleField → CampaignForm/Steps/CampaignDetailsStep}/EndDateChips.esm.js +0 -0
  144. /package/dist/components/{CampaignsTab/MutateCampaignsViews → CampaignForm}/utils/campaignFormUtils.esm.js +0 -0
  145. /package/dist/components/{CampaignsTab → CampaignsPage}/CampaignListPage/CampaignMetadata.esm.js +0 -0
  146. /package/dist/components/{CampaignsTab → CampaignsPage}/CampaignListPage/CampaignSummaryCard.esm.js +0 -0
  147. /package/dist/components/{CampaignsTab → CampaignsPage/CampaignListPage}/CampaignTypes.esm.js +0 -0
  148. /package/dist/components/{CampaignsTab/skeletons → CampaignsPage/CampaignListPage}/CampaignsOverviewSkeleton.esm.js +0 -0
  149. /package/dist/components/{CampaignsTab → CampaignsPage}/CampaignListPage/useArchiveConfirmationModal.esm.js +0 -0
  150. /package/dist/components/{ChecksPage/MutateCheckViews → CheckForm}/FormFields/CheckNameInput/CheckNameInput.esm.js +0 -0
  151. /package/dist/components/{ChecksPage/MutateCheckViews → CheckForm}/FormFields/RuleInput/AddMenuButton.esm.js +0 -0
  152. /package/dist/components/{ChecksPage/MutateCheckViews → CheckForm}/FormFields/RuleInput/Conditions/ConditionList.esm.js +0 -0
  153. /package/dist/components/{ChecksPage/MutateCheckViews → CheckForm}/FormFields/RuleInput/Conditions/ControlledAutocomplete.esm.js +0 -0
  154. /package/dist/components/{ChecksPage/MutateCheckViews → CheckForm}/FormFields/RuleInput/Conditions/styles.esm.js +0 -0
  155. /package/dist/components/{ChecksPage/MutateCheckViews → CheckForm}/FormFields/RuleInput/Expressions/ExpressionBox.esm.js +0 -0
  156. /package/dist/components/{ChecksPage/MutateCheckViews → CheckForm}/types/ExpressionType.esm.js +0 -0
  157. /package/dist/components/{ChecksPage/MutateCheckViews → CheckForm}/types/Path.esm.js +0 -0
  158. /package/dist/components/OverviewPage/{CampaignRow → CampaignBanner}/utils.esm.js +0 -0
  159. /package/dist/components/OverviewPage/{skeletons/OverviewTabsSkeleton.esm.js → OverviewTabsSkeleton.esm.js} +0 -0
  160. /package/dist/components/{ResultsTable/CheckCell → OverviewTable/Cell}/CheckCellTooltip.esm.js +0 -0
@@ -1,2 +0,0 @@
1
- import{zodResolver as h}from"@hookform/resolvers/zod";import{useMemo as d}from"react";import{useForm as C}from"react-hook-form";import"@backstage/catalog-model";import"@backstage/core-plugin-api";import"@tanstack/react-query";import"../../../../api.esm.js";import"../../../../hooks/graphqlKeys.esm.js";import"@backstage/plugin-catalog-react";import"../../../../hooks/useSoundcheckAlert.esm.js";import{useConfirmationModal as S}from"../../../../hooks/useConfirmationModal.esm.js";import"react-router-dom";import{useGetChecksMap as F}from"../../../../hooks/tracks/useGetChecksMap.esm.js";import{DEFAULT_FORM_VALUES as V}from"../utils/campaignFormUtils.esm.js";import{campaignFormSchema as k}from"../utils/validation.esm.js";import{mapCampaignToFormValues as M,mapCampaignFormDataToCampaignInput as v}from"./utils.esm.js";const L=(e,o)=>{const a=d(()=>o?M(o):V,[o]),{control:m,handleSubmit:t,getValues:i,setValue:p,trigger:s,formState:{errors:n}}=C({defaultValues:a,mode:"onChange",resolver:h(k)}),{showModal:u}=S(),{checksMap:c,checkChips:g,checksLoading:l}=F();return{control:m,handleSubmit:t,getValues:i,setValue:p,trigger:s,errors:n,onSubmit:async r=>{if(!await u({title:"Save Campaign",message:`Are you sure you want to save campaign: ${r.detailsStep.name}?`,error:!1}))return;const f=v(r,o,c);e(f)},checkChips:g,checksLoading:l}};export{L as useCampaignForm};
2
- //# sourceMappingURL=useCampaignForm.esm.js.map
@@ -1,2 +0,0 @@
1
- import{v4 as S}from"uuid";import{mapInputFilterToFormFilters as h}from"../../../Filter/utils.esm.js";import"../../../Filter/FilterComponent.esm.js";import{mapTrackFormToInput as u}from"../../../TrackForm/utils/useTrackForm.esm.js";const D=({name:r,ownerEntityRef:a,description:p,targetCompletionDate:o,supportChannel:e,milestones:s,startDate:i,track:n})=>({detailsStep:{name:r,description:p,ownerEntityRef:a,supportChannel:e,startDate:i,targetCompletionDate:o},tracksStep:{checks:n?.levels?.[0].checks.map(t=>({id:t.id,name:t.name??t.id,description:t.description}))},filtersStep:h(n.filter),milestonesStep:{milestones:s.map(t=>({id:Number(t.id),name:t.name,description:t.description,passRate:t.targetPercent.toString()}))}}),R=(r,a,p)=>{const{tracksStep:{checks:o},detailsStep:{name:e,description:s,ownerEntityRef:i,supportChannel:n,startDate:t,targetCompletionDate:m},filtersStep:l,milestonesStep:{milestones:d}}=r,c=u({detailsStep:{name:`${e}`,description:`The checks for the ${e} campaign.`,ownerEntityRef:i},levelsStep:{levels:[{name:"Level 1",checks:o,description:""}]},filtersStep:{filter:l}},p??{},a?.track);return{id:a?.id??S(),track:{...c,type:"campaign"},name:e,description:s,ownerEntityRef:i,supportChannel:n,startDate:t,targetCompletionDate:m,milestones:d.map(({id:f,name:g,description:k,passRate:C})=>({id:f,trackId:c.id,name:g,description:k,targetPercent:parseInt(C,10),targetCompletionDate:m}))}};export{R as mapCampaignFormDataToCampaignInput,D as mapCampaignToFormValues};
2
- //# sourceMappingURL=utils.esm.js.map
@@ -1,2 +0,0 @@
1
- const i={0:"detailsStep",1:"tracksStep",2:"filtersStep",3:"milestonesStep"};var t=(a=>(a.title="Create a campaign",a.description="A soundcheck campaign allows you to define a tech health goal, assign it to a team and monitor progress.",a.callToAction="Get started",a))(t||{}),e=(a=>(a.title="No campaigns found",a.description="No campaigns matched your search. Consider changing search term and filters.",a))(e||{});export{t as CampaignEmptyState,e as CampaignNoResults,i as StepNameMapping};
2
- //# sourceMappingURL=CampaignFormTypes.esm.js.map
@@ -1,2 +0,0 @@
1
- import{TrackCheckSchema as o,CampaignDetailsSchema as l}from"@spotify/backstage-plugin-soundcheck-common";import{z as e}from"zod";import{CHECK_IS_REQUIRED_MSG as p,FIELD_IS_REQUIRED_MSG as a}from"../../../../utils/validation.esm.js";const r=0,s=100,S=100,i=100,m="Ending date must come after the Starting Date",g=e.strictObject({selectedKinds:e.string().array(),selectedTypes:e.string().array(),selectedLifecycles:e.string().array(),selectedOwners:e.string().array(),selectedSystems:e.string().array(),selectedTags:e.string().array()}),E=e.strictObject({checks:e.array(o.extend({key:e.string().optional()})).min(1,p)}),_=e.strictObject({id:e.number().optional(),name:e.string().min(1,a).max(i,`Input must be less than ${i} characters`),description:e.string().min(1,a),passRate:e.coerce.number().min(r,`Minimum pass rate is ${r}%`).max(s,`Maximum pass rate is ${s}%`)}),D=e.strictObject({milestones:e.array(_).min(1,a)}),n=e.coerce.string().nullable().refine(t=>t!==null,{message:a}),M=e.strictObject({startDate:n,targetCompletionDate:n}),T=({startDate:t,targetCompletionDate:c})=>t&&c?new Date(t)<new Date(c):!0,A=l.merge(M),d=t=>t.refine(T,{message:m,path:["targetCompletionDate"]}),y=e.strictObject({detailsStep:d(A),tracksStep:E,filtersStep:g,milestonesStep:D});export{S as CAMPAIGN_NAME_MAX_LENGTH,m as END_AFTER_START_DATE_MSG,s as MILESTONE_MAX_PASS_RATE,r as MILESTONE_MIN_PASS_RATE,i as MILESTONE_NAME_MAX_LENGTH,n as campaignDateTimeSchema,y as campaignFormSchema};
2
- //# sourceMappingURL=validation.esm.js.map
@@ -1,2 +0,0 @@
1
- import c,{useEffect as s}from"react";import"../../../contexts/TrackFormContext.esm.js";import{useCheckFormContext as a}from"../../../contexts/CheckFormContext.esm.js";import"../../../contexts/CampaignFormContext.esm.js";import"../../../contexts/UserProvider.esm.js";import{useCreateCheck as n}from"../../../hooks/checks/useCreateCheck.esm.js";import{CheckForm as p}from"./CheckForm/CheckForm.esm.js";import"@material-ui/core";import"./CheckForm/Steps/CheckDetailsStep.esm.js";import"./CheckForm/Steps/CheckRulesStep.esm.js";const d=()=>{const{hideModal:e,showAddModal:r,setIsLoading:o}=a(),{mutateAsync:m,isLoading:t}=n();return s(()=>{o(t)},[o,t]),c.createElement(p,{title:"Create a Check",open:r,onSave:async i=>{await m(i,{onSuccess:()=>e()})},onClose:()=>e()})};export{d as AddCheckView};
2
- //# sourceMappingURL=AddCheckView.esm.js.map
@@ -1,2 +0,0 @@
1
- import e from"react";import{FormProvider as h}from"react-hook-form";import"../../../../contexts/TrackFormContext.esm.js";import{useCheckFormContext as f}from"../../../../contexts/CheckFormContext.esm.js";import"../../../../contexts/CampaignFormContext.esm.js";import"../../../../contexts/UserProvider.esm.js";import{FormFilterSection as S}from"../../../FormFilterSection/FormFilterSection.esm.js";import{FormStepper as u}from"../../../FormStepper/FormStepper.esm.js";import{FullScreenDialog as C}from"../../../FullScreenDialog/FullScreenDialog.esm.js";import"../FormFields/CheckNameInput/CheckNameInput.esm.js";import"../FormFields/PassFailMessageInput/PassFailMessageInput.esm.js";import"../../../FormMarkdownInput/FormMarkdownInput.esm.js";import{CHECK_FIELDS as b}from"../utils/checkFormUtils.esm.js";import"../FormFields/TeamDetailsInput/TeamDetailsInput.esm.js";import"../FormFields/RuleInput/AddMenuButton.esm.js";import"../FormFields/RuleInput/RuleInputBox.esm.js";import"../FormFields/RuleInput/Expressions/ExpressionBox.esm.js";import"../FormFields/RuleInput/Expressions/ExpressionTypeToggle.esm.js";import"@material-ui/core";import"@material-ui/icons/Delete";import"@backstage/core-plugin-api";import"@tanstack/react-query";import"../../../../api.esm.js";import"../../../FormControlledSelect/FormControlledSelect.esm.js";import"../FormFields/RuleInput/Conditions/ControlledAutocomplete.esm.js";import"../FormFields/RuleInput/Conditions/styles.esm.js";import"@spotify/backstage-plugin-soundcheck-common";import"../../../../hooks/graphqlKeys.esm.js";import"../FormFields/RuleInput/Conditions/ConditionList.esm.js";import{ScheduleSection as E}from"../FormFields/CheckScheduleSection/ScheduleSection.esm.js";import{useCheckForm as k}from"../hooks/useCheckForm.esm.js";import"../types/ExpressionType.esm.js";import{CheckStepNameMapping as F}from"../types/CheckFormTypes.esm.js";import"../../../Frequency/types.esm.js";import"../../../Frequency/util.esm.js";import"../../../Frequency/FrequencyComponent.esm.js";import"../types/Path.esm.js";import{CheckFormDescription as g}from"./CheckFormDescription.esm.js";import{CheckDetailsStep as v}from"./Steps/CheckDetailsStep.esm.js";import{CheckRulesStep as y}from"./Steps/CheckRulesStep.esm.js";const D=({title:l,open:p,onSave:a,onClose:o})=>{const{hideModal:i,isLoading:c,isReadOnly:r,selectedItem:s}=f(),{formMethods:t,onSubmit:m}=k(a),n=[{label:"Enter check details",content:()=>e.createElement(v,null)},{label:"Add rules",content:()=>e.createElement(y,null)},{label:"Choose the affected entities (Optional)",content:()=>e.createElement(S,{name:"filtersStep.filter",control:t.control,disabled:r,description:b.filter.description})},{label:"Set the check schedule (Optional)",content:()=>e.createElement(E,{control:t.control,disabled:r})}],d=s?[...Array(n.length).keys()]:[0];return e.createElement(C,{handleClose:o?()=>o():i,title:l,open:p},e.createElement(h,{...t},e.createElement("form",{onSubmit:t.handleSubmit(m)},e.createElement(u,{onClose:o?()=>o():i,handleSubmit:t.handleSubmit,trigger:t.trigger,onSubmit:m,initialVisited:d,stepNameMap:F,steps:n,isLoading:c,isReadOnly:r,saveButtonText:"Save Check",detailsComponent:e.createElement(g,null)}))))};export{D as CheckForm};
2
- //# sourceMappingURL=CheckForm.esm.js.map
@@ -1,2 +0,0 @@
1
- import{Typography as a}from"@material-ui/core";import e from"react";const t=()=>e.createElement("div",{style:{display:"flex",gap:"10px",flexDirection:"column"}},e.createElement(a,{variant:"h6"},"Creating and managing checks"),e.createElement(a,{variant:"body1"},"Checks are entities created from four components: facts, paths, operators and values. These components are then organized via a boolean calculator in the UI."),e.createElement(a,{variant:"body1"},"To create a check, select the components that you want to use, organize them into rules and give your check a meaningful name and a description."),e.createElement(a,{variant:"body1"},"Once created, you will be able to manage and edit your track on its detail page."));export{t as CheckFormDescription};
2
- //# sourceMappingURL=CheckFormDescription.esm.js.map
@@ -1,2 +0,0 @@
1
- import{makeStyles as p}from"@material-ui/core/styles";import t from"react";import{useFormContext as n}from"react-hook-form";import"../../../../../contexts/TrackFormContext.esm.js";import{useCheckFormContext as a}from"../../../../../contexts/CheckFormContext.esm.js";import"../../../../../contexts/CampaignFormContext.esm.js";import"../../../../../contexts/UserProvider.esm.js";import{CheckNameInput as s}from"../../FormFields/CheckNameInput/CheckNameInput.esm.js";import"../../FormFields/PassFailMessageInput/PassFailMessageInput.esm.js";import{CheckDescriptionInput as c}from"../../FormFields/CheckDescriptionInput/CheckDescriptionInput.esm.js";import{TeamDetailsInput as l}from"../../FormFields/TeamDetailsInput/TeamDetailsInput.esm.js";import"../../FormFields/RuleInput/AddMenuButton.esm.js";import"../../FormFields/RuleInput/RuleInputBox.esm.js";import"../../FormFields/RuleInput/Expressions/ExpressionBox.esm.js";import"../../FormFields/RuleInput/Expressions/ExpressionTypeToggle.esm.js";import"@material-ui/core";import"@material-ui/icons/Delete";import"@backstage/core-plugin-api";import"@tanstack/react-query";import"../../../../../api.esm.js";import"../../../../FormControlledSelect/FormControlledSelect.esm.js";import"../../FormFields/RuleInput/Conditions/ControlledAutocomplete.esm.js";import"../../FormFields/RuleInput/Conditions/styles.esm.js";import"@spotify/backstage-plugin-soundcheck-common";import"../../../../../hooks/graphqlKeys.esm.js";import"../../utils/checkFormUtils.esm.js";import"../../FormFields/RuleInput/Conditions/ConditionList.esm.js";import"../../FormFields/CheckScheduleSection/ScheduleSection.esm.js";const d=p(r=>({container:{display:"flex",flexDirection:"column",gap:r.spacing(1)}})),f=()=>{const r=d(),{isLoading:m,isReadOnly:o}=a(),{control:e,formState:{errors:i}}=n();return t.createElement("div",{className:r.container},t.createElement(s,{control:e,error:i?.detailsStep?.name,isLoading:m,disabled:o}),t.createElement(c,{control:e,error:i?.detailsStep?.description,isLoading:m,disabled:o}),t.createElement(l,{control:e,disabled:o,error:i?.detailsStep?.ownerEntityRef}))};export{f as CheckDetailsStep};
2
- //# sourceMappingURL=CheckDetailsStep.esm.js.map
@@ -1,2 +0,0 @@
1
- import{Typography as r,FormControlLabel as p,Checkbox as c}from"@material-ui/core";import{makeStyles as s}from"@material-ui/core/styles";import e from"react";import{useFormContext as d,Controller as u}from"react-hook-form";import"../../../../../contexts/TrackFormContext.esm.js";import{useCheckFormContext as E}from"../../../../../contexts/CheckFormContext.esm.js";import"../../../../../contexts/CampaignFormContext.esm.js";import"../../../../../contexts/UserProvider.esm.js";import"../../FormFields/CheckNameInput/CheckNameInput.esm.js";import{PassFailMessageInput as C}from"../../FormFields/PassFailMessageInput/PassFailMessageInput.esm.js";import"../../../../FormMarkdownInput/FormMarkdownInput.esm.js";import{CHECK_FIELDS as f}from"../../utils/checkFormUtils.esm.js";import"../../FormFields/TeamDetailsInput/TeamDetailsInput.esm.js";import"../../FormFields/RuleInput/AddMenuButton.esm.js";import{RuleInputBox as v}from"../../FormFields/RuleInput/RuleInputBox.esm.js";import"../../FormFields/RuleInput/Expressions/ExpressionBox.esm.js";import"../../FormFields/RuleInput/Expressions/ExpressionTypeToggle.esm.js";import"@material-ui/icons/Delete";import"@backstage/core-plugin-api";import"@tanstack/react-query";import"../../../../../api.esm.js";import"../../../../FormControlledSelect/FormControlledSelect.esm.js";import"../../FormFields/RuleInput/Conditions/ControlledAutocomplete.esm.js";import"../../FormFields/RuleInput/Conditions/styles.esm.js";import"@spotify/backstage-plugin-soundcheck-common";import"../../../../../hooks/graphqlKeys.esm.js";import"../../FormFields/RuleInput/Conditions/ConditionList.esm.js";import"../../FormFields/CheckScheduleSection/ScheduleSection.esm.js";const g=s(t=>({container:{display:"flex",flexDirection:"column",gap:t.spacing(2)},innerContainer:{display:"flex",flexDirection:"column"}})),x=()=>{const t=g(),{isLoading:l,isReadOnly:n}=E(),{control:i}=d(),{rules:a,warnings:o}=f.rulesStep;return e.createElement("div",{className:t.container},e.createElement("div",{className:t.innerContainer},e.createElement("div",null,e.createElement(r,{variant:"subtitle2"},a.name),e.createElement(r,{variant:"caption"},a.description)),e.createElement(v,{disabled:n,name:"rulesStep.expressions",depth:0})),e.createElement(C,{control:i,isLoading:l,disabled:n}),e.createElement("div",{className:t.container},e.createElement("div",{className:t.innerContainer},e.createElement("div",null,e.createElement(r,{variant:"subtitle2"},o.name),e.createElement(r,{variant:"caption"},o.description)),e.createElement(u,{name:"rulesStep.warning",control:i,render:({field:m})=>e.createElement(p,{disabled:n,control:e.createElement(c,{checked:m.value,onChange:m.onChange}),label:o.label})}))))};export{x as CheckRulesStep};
2
- //# sourceMappingURL=CheckRulesStep.esm.js.map
@@ -1,2 +0,0 @@
1
- import n from"react";import{FormMarkdownInput as d}from"../../../../FormMarkdownInput/FormMarkdownInput.esm.js";import{CHECK_FIELDS as p}from"../../utils/checkFormUtils.esm.js";const c=({control:r,isLoading:t,disabled:o,error:i})=>{const{description:e}=p.details;return n.createElement(d,{name:"detailsStep.description",control:r,error:i,label:e.name,description:e.description,placeholder:o?void 0:e.placeholder,disabled:o||t})};export{c as CheckDescriptionInput};
2
- //# sourceMappingURL=CheckDescriptionInput.esm.js.map
@@ -1,2 +0,0 @@
1
- import{makeStyles as s,Typography as p,Grid as n,FormControlLabel as h,Checkbox as u}from"@material-ui/core";import e from"react";import{useWatch as E,Controller as l}from"react-hook-form";import"../../../../Frequency/types.esm.js";import"../../../../Frequency/util.esm.js";import{FrequencyComponent as b}from"../../../../Frequency/FrequencyComponent.esm.js";import{CHECK_FIELDS as f}from"../../utils/checkFormUtils.esm.js";const C=s(t=>({container:{display:"flex",flexDirection:"column",gap:t.spacing(1)}})),y=({control:t,disabled:o})=>{const c=C(),a=E({control:t,name:"scheduleStep.schedule"}),{description:m,checkboxLabel:i}=f.schedule;return e.createElement("div",{className:c.container},e.createElement(p,{variant:"body2"},m),e.createElement(n,{item:!0,xs:12},e.createElement(n,{item:!0},e.createElement(l,{name:"scheduleStep.schedule.enabled",control:t,render:({field:r})=>e.createElement(h,{disabled:o,control:e.createElement(u,{checked:r.value,onChange:r.onChange}),label:i})})),e.createElement(n,{item:!0},e.createElement(l,{name:"scheduleStep.schedule.frequency",control:t,render:({field:r,fieldState:d})=>e.createElement(b,{disabled:o||!a.enabled,value:r.value,onChange:r.onChange,errors:d.error})}))))};export{y as ScheduleSection};
2
- //# sourceMappingURL=ScheduleSection.esm.js.map
@@ -1,2 +0,0 @@
1
- import{Typography as s,Tabs as v,Tab as o}from"@material-ui/core";import{makeStyles as h}from"@material-ui/core/styles";import e,{useState as M}from"react";import{FormMarkdownInput as i}from"../../../../FormMarkdownInput/FormMarkdownInput.esm.js";import{CHECK_FIELDS as S}from"../../utils/checkFormUtils.esm.js";const C=h(a=>({container:{display:"flex",flexDirection:"column",gap:a.spacing(1)},tabContent:{padding:a.spacing(1)}})),T=({control:a,isLoading:l,disabled:n})=>{const r=C(),[t,c]=M(0),{name:m,description:p,passMessagePlaceholder:d,failMessagePlaceholder:b,passedTabName:g,failedTabName:u}=S.rulesStep.messages,E=(y,f)=>{c(f)};return e.createElement("div",{className:r.container},e.createElement("div",null,e.createElement(s,{variant:"subtitle2"},m),e.createElement(s,{variant:"caption"},p)),e.createElement(v,{orientation:"horizontal",variant:"scrollable",value:t,onChange:E},e.createElement(o,{label:g}),e.createElement(o,{label:u})),e.createElement("div",{className:r.tabContent},t===0&&e.createElement(i,{name:"rulesStep.passedMessage",control:a,placeholder:d,disabled:l||n}),t===1&&e.createElement(i,{name:"rulesStep.failedMessage",control:a,placeholder:b,disabled:l||n})))};export{T as PassFailMessageInput};
2
- //# sourceMappingURL=PassFailMessageInput.esm.js.map
@@ -1,2 +0,0 @@
1
- import{Box as n,TextField as $,IconButton as O}from"@material-ui/core";import F from"@material-ui/icons/Delete";import t,{useMemo as u}from"react";import{useFormContext as R,Controller as B}from"react-hook-form";import{useOperators as S}from"../../../../../../hooks/operators/useOperators.esm.js";import{FormControlledSelect as T}from"../../../../../FormControlledSelect/FormControlledSelect.esm.js";import{ControlledAutocomplete as f}from"./ControlledAutocomplete.esm.js";import{useRuleConditionStyles as V}from"./styles.esm.js";import{useRuleOptions as I}from"./useRuleOptions.esm.js";const L=({name:l,handleDelete:E,disabled:r,disableDelete:b})=>{const a=V(),{control:m,getValues:h,setValue:c}=R(),{data:s,isLoading:C}=S(),p=u(()=>s?.map(e=>({value:e.name,label:e.title}))??[],[s]),{pathOptions:g,factRefOptions:i,isLoading:d}=I(l,m),v=u(()=>i?.map(e=>e.value)??[],[i]),x=h("rulesStep.expressions.conditions")?.map(({factRef:e})=>e),N=e=>{e&&!x?.includes(e)&&(c(`${l}.path`,""),c(`${l}.operator`,""),c(`${l}.value`,""))};return t.createElement(n,{className:a.container},t.createElement(n,{className:a.connector}),t.createElement(n,{className:a.innerContainer},t.createElement(n,{className:a.inputsContainer},i&&t.createElement(n,null,t.createElement(f,{name:`${l}.factRef`,control:m,placeholder:"Fact",options:v,getOptionLabel:e=>i?.find(o=>e===o.value)?.label??e,getOptionValue:e=>i?.find(o=>e===o.label)?.value??e??"",disabled:r||d,onChange:N})),t.createElement(n,null,t.createElement(f,{name:`${l}.path`,placeholder:"Path",control:m,disabled:r||d,options:g})),p&&t.createElement(n,null,t.createElement(T,{name:`${l}.operator`,control:m,placeholder:"Operator",options:p,disabled:C||r})),t.createElement(n,null,t.createElement(B,{name:`${l}.value`,control:m,defaultValue:"",render:({field:e,fieldState:o})=>t.createElement($,{...e,variant:"outlined",placeholder:"Enter a value",FormHelperTextProps:{className:a.helperText},error:o.invalid,helperText:o.error?o.error.message:null,margin:"dense",disabled:r,className:a.noMargin})})))),!r&&!b&&t.createElement(O,{onClick:E,className:a.deleteButton,"data-test-id":`${l}-delete-button`},t.createElement(F,{className:a.deleteIcon})))};export{L as RuleConditionInput};
2
- //# sourceMappingURL=RuleConditionInput.esm.js.map
@@ -1,2 +0,0 @@
1
- import{parseFactRef as f,stringifyFactRef as S}from"@spotify/backstage-plugin-soundcheck-common";import{useState as R,useEffect as g,useMemo as s}from"react";import{useWatch as F}from"react-hook-form";import{useGetCollectors as O}from"../../../../../../hooks/collectors/useGetCollectors.esm.js";import{useGetFactSchema as y}from"../../../../../../hooks/collectors/useGetFactSchema.esm.js";import{generateJsonPaths as G}from"../../../utils/checkFormUtils.esm.js";const L=(e,m)=>{const{data:o,isLoading:i}=O(),t=F({control:m,name:`${e}.factRef`}),[r,l]=R(()=>c(t));g(()=>{l(c(t))},[t]);const{data:a}=y(r?.source,r?.name),p=s(()=>a?G(a.schema):[],[a]),d=s(()=>o?.flatMap(n=>n.factNames.map(h=>{const u=f(h,{defaultSource:n.id,defaultScope:"default"});return{label:u.name,value:S(u)}})),[o]);return{isLoading:i,pathOptions:p,factRefOptions:d}};function c(e){if(e)try{return f(e,{defaultSource:"unknown",defaultScope:"default"})}catch{return null}return null}export{L as useRuleOptions};
2
- //# sourceMappingURL=useRuleOptions.esm.js.map
@@ -1,2 +0,0 @@
1
- import{makeStyles as b,ButtonGroup as f,Button as g}from"@material-ui/core";import n,{useState as E}from"react";import{useFormContext as k,Controller as y}from"react-hook-form";import{ExpressionType as l,ExpressionTypeReadableMap as C}from"../../../types/ExpressionType.esm.js";import"../../../types/CheckFormTypes.esm.js";import"../../../../../Frequency/types.esm.js";import"../../../../../Frequency/util.esm.js";import"../../../../../Frequency/FrequencyComponent.esm.js";import"../../../types/Path.esm.js";const x=b(e=>({button:{backgroundColor:e.palette.background.default},selectedButton:{backgroundColor:e.palette.action.hover}})),B=({name:e,disabled:a})=>{const o=x(),{control:m,getValues:p}=k(),s=`${e}`,c=p(s),[i,u]=E(c||l.AllOf),d=r=>{u(r)};return n.createElement(y,{control:m,name:e,render:({field:{onChange:r}})=>n.createElement(f,{color:"primary"},Object.values(l).map(t=>n.createElement(g,{key:t,className:i===t?`${o.selectedButton} ${o.button}`:`${o.button}`,onClick:()=>{d(t),r(t)},disabled:a},C[t])))})};export{B as ExpressionTypeToggle};
2
- //# sourceMappingURL=ExpressionTypeToggle.esm.js.map
@@ -1,2 +0,0 @@
1
- import{Box as p,Grid as r}from"@material-ui/core";import{makeStyles as b}from"@material-ui/core/styles";import t from"react";import{useFormContext as B}from"react-hook-form";import{AddMenuButton as N}from"./AddMenuButton.esm.js";import"@material-ui/icons/Delete";import"@backstage/core-plugin-api";import"@tanstack/react-query";import"../../../../../api.esm.js";import"../../../../FormControlledSelect/FormControlledSelect.esm.js";import"./Conditions/ControlledAutocomplete.esm.js";import"./Conditions/styles.esm.js";import"@spotify/backstage-plugin-soundcheck-common";import"../../../../../hooks/graphqlKeys.esm.js";import"../../utils/checkFormUtils.esm.js";import{ConditionList as y}from"./Conditions/ConditionList.esm.js";import{ExpressionBox as A}from"./Expressions/ExpressionBox.esm.js";import{ExpressionTypeToggle as C}from"./Expressions/ExpressionTypeToggle.esm.js";import{useRuleInputHandlers as P}from"./useRuleInputHandlers.esm.js";const $=b(e=>({root:{padding:0},inner:{marginLeft:e.spacing(2),paddingBottom:e.spacing(2),borderLeft:`1px solid ${e.palette.border}`,display:"flex",flexDirection:"row",gap:0},connector:{borderBottom:`1px solid ${e.palette.border}`,padding:e.spacing(0),width:"15px",height:"20px"},noPadding:{padding:0}})),k=({name:e,depth:o,disabled:i})=>{const n=$(),{getValues:m,setValue:l,trigger:c}=B(),{handleAddCondition:g,handleAddExpression:x,handleDeleteCondition:f}=P(e,m,l,c),u=`${e}`,a=m(u),E=a?.conditions||[],h=a?.expressions;return t.createElement(p,{className:o>0?n.inner:n.root},o>0&&t.createElement(p,{className:n.connector}),t.createElement(r,{container:!0,spacing:0,direction:"column",className:n.noPadding},t.createElement(r,{item:!0,className:n.noPadding},t.createElement(C,{disabled:i,name:`${e}.expressionType`})),t.createElement(r,{item:!0,container:!0,spacing:0,direction:"column",className:n.noPadding},t.createElement(y,{depth:o,handleDelete:d=>f(d,e),disabled:i,conditions:E,name:e}),h?.map((d,s)=>t.createElement(A,{key:s,expression:d,name:`${e}.expressions[${s}]`,depth:o,disabled:i}))),!i&&t.createElement(r,{item:!0,className:n.noPadding},t.createElement(N,{onAddCondition:g,onAddExpression:x}))))};export{k as RuleInputBox};
2
- //# sourceMappingURL=RuleInputBox.esm.js.map
@@ -1,2 +0,0 @@
1
- import{ExpressionType as l}from"../../types/ExpressionType.esm.js";import"../../types/CheckFormTypes.esm.js";import"../../../../Frequency/types.esm.js";import"../../../../Frequency/util.esm.js";import"../../../../Frequency/FrequencyComponent.esm.js";import"../../types/Path.esm.js";const x=(a,e,s,t)=>({handleAddCondition:async()=>{const i=`${a}`,o=[...e(i)?.conditions||[],{factRef:"",path:"",operator:"",value:""}],n=`${a}.conditions`;s(n,o),await t(n)},handleAddExpression:async()=>{const i=`${a}.expressions`,o=e(i)||[];o.push({expressionType:l.AllOf,expressions:void 0,conditions:[{factRef:"",path:"",operator:"",value:""}]}),s(i,o),await t(i)},handleDeleteCondition:async(i,o)=>{const n=o.match(/(.*\.expressions)(?=\[\d+])/)?.[0]||o,p=`${o}.conditions`,r=e(p);if(r.splice(i,1),r.length===0){s(p,void 0);const c=parseInt(o.slice(o.lastIndexOf("[")+1,o.lastIndexOf("]")),10),d=e(n);d[c]?.expressions?.splice(c,1),s(n,d[c]?.expressions?d:void 0),await t(n)}else s(p,r),await t(p)}});export{x as useRuleInputHandlers};
2
- //# sourceMappingURL=useRuleInputHandlers.esm.js.map
@@ -1,2 +0,0 @@
1
- import{Typography as r}from"@material-ui/core";import{makeStyles as f}from"@material-ui/core/styles";import{uniqBy as u}from"lodash";import e from"react";import{FormControlledSelect as E}from"../../../../FormControlledSelect/FormControlledSelect.esm.js";import{useOptions as v}from"../../../../GroupSelector/useOptions.esm.js";import{CHECK_FIELDS as y}from"../../utils/checkFormUtils.esm.js";const b=f(t=>({container:{display:"flex",flexDirection:"column",gap:t.spacing(1)}})),g=({control:t,disabled:a,error:n})=>{const l=b(),{options:i,isLoading:m}=v(),p=u(i.map(o=>({value:o.ref,label:o.name})),"value"),{owner:{name:s,description:c,selectLabel:d}}=y.details;return e.createElement("div",{className:l.container},e.createElement("div",null,e.createElement(r,{variant:"subtitle2"},s),e.createElement(r,{variant:"caption"},c)),e.createElement("div",null,e.createElement(E,{name:"detailsStep.ownerEntityRef",control:t,options:p,placeholder:d,disabled:a||m,helperText:n?.message??void 0})))};export{g as TeamDetailsInput};
2
- //# sourceMappingURL=TeamDetailsInput.esm.js.map
@@ -1,2 +0,0 @@
1
- import{zodResolver as s}from"@hookform/resolvers/zod";import{useForm as a}from"react-hook-form";import"../../../../contexts/TrackFormContext.esm.js";import{useCheckFormContext as c}from"../../../../contexts/CheckFormContext.esm.js";import"../../../../contexts/CampaignFormContext.esm.js";import"react";import"../../../../contexts/UserProvider.esm.js";import"@backstage/catalog-model";import"@backstage/core-plugin-api";import"@tanstack/react-query";import"../../../../api.esm.js";import"../../../../hooks/graphqlKeys.esm.js";import"@backstage/plugin-catalog-react";import"../../../../hooks/useSoundcheckAlert.esm.js";import{useConfirmationModal as n}from"../../../../hooks/useConfirmationModal.esm.js";import"react-router-dom";import{mapCheckerToFormValues as u,mapToCheckerInput as h,DEFAULT_FORM_VALUES as l}from"../utils/checkFormUtils.esm.js";import{checkFormSchema as f}from"../utils/validation.esm.js";const d=t=>{const{selectedItem:o}=c();let e=l;o&&(e=u(o));const m=a({defaultValues:e,mode:"onChange",resolver:s(f)}),{showModal:i}=n();return{formMethods:m,onSubmit:async r=>{if(!await i({title:"Save Check",message:`Are you sure you want to save check: ${r.detailsStep.name}?`,error:!1}))return;const p=h(r,o);t(p)}}};export{d as useCheckForm};
2
- //# sourceMappingURL=useCheckForm.esm.js.map
@@ -1,2 +0,0 @@
1
- const a={0:"detailsStep",1:"rulesStep",2:"filtersStep",3:"scheduleStep"};var t=(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))(t||{}),c=(e=>(e.title="No checks found",e.description="No checks matched your search. Consider changing search term and filters.",e))(c||{});export{t as CheckEmptyState,c as CheckNoResults,a as CheckStepNameMapping};
2
- //# sourceMappingURL=CheckFormTypes.esm.js.map
@@ -1,2 +0,0 @@
1
- import"../../../Frequency/types.esm.js";import{defaultFrequency as e}from"../../../Frequency/util.esm.js";import"../../../Frequency/FrequencyComponent.esm.js";const r=()=>({enabled:!1,frequency:e()});export{r as defaultSchedule};
2
- //# sourceMappingURL=Schedule.esm.js.map
@@ -1,2 +0,0 @@
1
- import{FrequencySchema as g}from"@spotify/backstage-plugin-soundcheck-common";import{isObject as w}from"lodash";import{v4 as k}from"uuid";import{mapInputFilterToFormFilters as v,mapFiltersToInputFilter as x,mapFiltersToCatalogFilter as E}from"../../../Filter/utils.esm.js";import"../../../Filter/FilterComponent.esm.js";import{emptyFilters as b}from"../../../Filter/types.esm.js";import{TimeUnit as d}from"../../../Frequency/types.esm.js";import{isTimeUnit as T}from"../../../Frequency/util.esm.js";import"../../../Frequency/FrequencyComponent.esm.js";import{ExpressionType as c}from"../types/ExpressionType.esm.js";import"../types/CheckFormTypes.esm.js";import{defaultSchedule as S}from"../types/Schedule.esm.js";import"../types/Path.esm.js";import{CHECK_NAME_MAX_LENGTH as C}from"./validation.esm.js";const h=e=>{if(w(e)&&"frequency"in e){const s=g.safeParse(e.frequency);if(s.success){const t=s.data;if("cron"in t)return{enabled:!0,frequency:{type:"cron",unit:d.Hours,value:1,cron:t.cron}};const r=Object.keys(t);if(r.length){const n=r[0];if(T(n))return{enabled:!0,frequency:{type:"HumanDuration",unit:n,value:t[n]??1,cron:""}}}}}return{enabled:!1,frequency:{type:"HumanDuration",unit:d.Hours,value:1,cron:""}}},m=(e,s)=>{const{enabled:t,frequency:r}=e;if(t){const{cron:n,type:i,unit:a,value:o}=r;return i==="HumanDuration"?{frequency:{[a]:o},filter:E(s)}:{frequency:{cron:n}}}},y=e=>{if(typeof e=="string"){if(e==="true")return!0;if(e==="false")return!1;const s=Number(e);if(!isNaN(s))return s}return e},p=e=>{if(!e)return{};if(e.expressionType){const s={[e.expressionType]:e.conditions?.map(t=>({factRef:t.factRef,path:t.path,operator:t.operator,value:y(t.value)}))};return e.expressions&&e.expressions.forEach(t=>{s[e.expressionType]?.push(p(t))}),s}if(e.expressions)return e.expressions.map(p);if(e.conditions&&e.conditions.length===1){const s=e.conditions[0];return{factRef:s.factRef,path:s.path,operator:s.operator,value:y(s.value)}}return{}},l=(e,s=!0)=>{if(!e)return{conditions:[]};const t=Object.keys(e),r=t.includes("all")||s&&!t.includes("any")?c.AllOf:c.AnyOf;if(t.includes(r)||s){const n=e[r]||[e],i=[],a=[];return n.forEach(o=>{const f=Object.keys(o);f.includes("all")||f.includes("any")?a.push(l(o,!1)):i.push({factRef:o.factRef,path:o.path,operator:o.operator,value:o.value})}),{expressions:a.length>0?a:void 0,conditions:i,expressionType:r}}return{expressionType:c.AllOf,conditions:[{factRef:e.factRef,path:e.path,operator:e.operator,value:e.value}]}},R=e=>({detailsStep:{name:e.name??"",description:e.description??"",ownerEntityRef:e.ownerEntityRef??""},rulesStep:{expressions:l(e.rule),passedMessage:e.passedMessage??void 0,failedMessage:e.failedMessage??void 0,warning:e.warning??!1},filtersStep:{filter:v(e.filter)},scheduleStep:{schedule:h(e.schedule)}}),M=(e,s)=>{const{detailsStep:t,rulesStep:r,filtersStep:n,scheduleStep:i}=e;return{id:s?s.id:k(),ownerEntityRef:t.ownerEntityRef??void 0,name:t.name,description:t.description,passedMessage:r.passedMessage??void 0,failedMessage:r.failedMessage??void 0,rule:p(r.expressions),warning:r.warning??!1,filter:n.filter?x(n.filter):void 0,schedule:m(i.schedule,n.filter)}},u=(e,s="$")=>{const t=[];if(e.type==="object"&&e.properties){const r=e.properties;for(const n in r)if(r.hasOwnProperty(n)){const i=`${s}.${n}`;t.push(i);const a=r[n];t.push(...u(a,i))}}if(e.type==="array"&&e.items){const r=`${s}[*]`;t.push(r);const n=Array.isArray(e.items)?e.items:[e.items];for(const i of n)t.push(...u(i,r))}return t},A={detailsStep:{name:"",description:"",ownerEntityRef:""},rulesStep:{expressions:{expressionType:c.AllOf,expressions:void 0,conditions:[{factRef:"",path:"",operator:"",value:"",conditions:[]}]},warning:!1},filtersStep:{filter:b()},scheduleStep:{schedule:S()}},F={details:{name:{name:"Check name",description:"Give your check a meaningful name so it's easy to remember",helperText:`Max ${C} characters`,placeholder:"Example: Code Coverage Check"},description:{name:"Check description",description:"Give your check a meaningful description so others know what it's for",placeholder:"Example: Ensure code coverage meets the minimum threshold"},owner:{name:"Check owner",description:"Add yourself, or a team, as the owner of this check",selectLabel:"Owner"}},rulesStep:{rules:{name:"Check rules",description:"Add the rules you want your check to enforce"},messages:{name:"Pass/Fail messages (Optional)",description:"Add the messages that will appear to you when checks either pass or fail",passMessagePlaceholder:"Enter pass message...",failMessagePlaceholder:"Enter fail message...",passedTabName:"Passed Message",failedTabName:"Failed Message"},warnings:{name:"Enable warnings",description:"Enable if the check should emit warning check results if it fails",label:"Warning"}},filter:{description:'Setting the filters below will limit the scope of the Check so that only those Entities that match the filter will be monitored by the Check. As an example, choosing a "Kind" of "Component" will make this Check only apply to Entities whose Kind is indeed set to "Component". This would exclude Entities like Groups, Users, APIs, etc. from being impacted by the Check.'},schedule:{description:"By default, checks are executed when any fact they depend on is updated. However, you may also schedule a check to run on a schedule.",checkboxLabel:"Schedule check"}};export{F as CHECK_FIELDS,A as DEFAULT_FORM_VALUES,u as generateJsonPaths,R as mapCheckerToFormValues,p as mapExpressionToRule,h as mapInputScheduleToSchedule,l as mapRuleToExpression,m as mapScheduleToInputSchedule,M as mapToCheckerInput};
2
- //# sourceMappingURL=checkFormUtils.esm.js.map
@@ -1,2 +0,0 @@
1
- import{CheckMessagingSchema as c,CheckDetailsSchema as l,parseFactRef as m}from"@spotify/backstage-plugin-soundcheck-common";import{z as e}from"zod";import{isValidCron as p}from"../../../../utils/cron.esm.js";import{validateTimeUnitValue as u}from"../../../../utils/time.esm.js";import{TimeUnit as f}from"../../../Frequency/types.esm.js";import"../../../Frequency/util.esm.js";import"../../../Frequency/FrequencyComponent.esm.js";import{ExpressionType as r}from"../types/ExpressionType.esm.js";import"../types/CheckFormTypes.esm.js";import"../types/Path.esm.js";const i=t=>{try{return m(t),!0}catch{return"Invalid fact reference. [source]:[scope]/[name]."}},d=100,y=async t=>{if(!await i(t))throw new Error("Fact reference validation failed");return t},a=e.lazy(()=>e.strictObject({factRef:e.string().refine(y,{message:"Valid format: [source]:[scope]/[name]"}),path:e.string().min(1,"Required"),operator:e.string().min(1,"Required"),value:e.union([e.string().min(1,"Required"),e.number(),e.boolean()]),conditions:e.array(a).optional()})),n=e.lazy(()=>e.strictObject({expressionType:e.enum([r.AllOf,r.AnyOf]).optional(),expressions:e.array(n).optional(),conditions:e.array(a).optional()})),g=e.strictObject({expressions:n}).merge(c),b=e.strictObject({filter:e.strictObject({selectedKinds:e.string().array(),selectedTypes:e.string().array(),selectedLifecycles:e.string().array(),selectedOwners:e.string().array(),selectedSystems:e.string().array(),selectedTags:e.string().array()}).optional()}),h=e.nativeEnum(f),O=({type:t,cron:o,value:s})=>t==="cron"?p(o):t==="HumanDuration"?u(s)===!0:!0,j=e.strictObject({type:e.enum(["HumanDuration","cron"]),unit:h.optional(),value:e.number().min(1,"Value must be greater than 0.").optional(),cron:e.string().optional()}).refine(O,{message:"Invalid frequency configuration"}),v=e.strictObject({enabled:e.boolean(),frequency:j}),S=e.strictObject({schedule:v.optional()}),T=e.strictObject({detailsStep:l,rulesStep:g,filtersStep:b,scheduleStep:S});export{d as CHECK_NAME_MAX_LENGTH,T as checkFormSchema,i as validateFactRef};
2
- //# sourceMappingURL=validation.esm.js.map
@@ -1,2 +0,0 @@
1
- import{usePermission as e}from"@backstage/plugin-permission-react";import{Button as a}from"@material-ui/core";import{soundcheckCampaignCreatePermission as n}from"@spotify/backstage-plugin-soundcheck-common";import o from"react";import"../../contexts/TrackFormContext.esm.js";import"../../contexts/CheckFormContext.esm.js";import{useCampaignFormContext as p}from"../../contexts/CampaignFormContext.esm.js";import"../../contexts/UserProvider.esm.js";import c from"../../images/no-results.svg";import{CampaignEmptyState as t}from"../CampaignsTab/MutateCampaignsViews/types/CampaignFormTypes.esm.js";import{EmptyState as s}from"./EmptyState.esm.js";const l=()=>{const{setShowAddModal:i}=p(),{loading:r,allowed:m}=e({permission:n});return o.createElement(s,{title:t.title,description:t.description,imgSrc:c,action:!r&&o.createElement(a,{disabled:!m,variant:"contained",color:"primary",onClick:()=>i(!0)},t.callToAction)})};export{l as EmptyCampaignState};
2
- //# sourceMappingURL=CampaignEmptyState.esm.js.map
@@ -1,2 +0,0 @@
1
- import{useRouteRef as u}from"@backstage/core-plugin-api";import{EntityRefLink as L}from"@backstage/plugin-catalog-react";import{Typography as t,Button as M,Menu as O,MenuItem as E}from"@material-ui/core";import z from"@material-ui/icons/ArrowDropDown";import j from"@material-ui/icons/ArrowDropUp";import e,{useState as q}from"react";import{useNavigate as A}from"react-router-dom";import{useEntityPassRateTrend as B}from"../../../hooks/aggregations/useEntityPassRateTrend.esm.js";import{campaignDetailsRouteRef as F,campaignEditRouteRef as Q}from"../../../routes.esm.js";import{convertToReadableDate as p}from"../../CampaignsTab/CampaignDetailsPage/CampaignDetails.esm.js";import{Loading as V}from"../../TechHealth/Loading/Loading.esm.js";import{useCampaignRowStyles as W}from"./useCampaignRowStyles.esm.js";import{calculateOverallPassPercent as G,calculatePassingEntities as H}from"./utils.esm.js";const J=l=>{if(l?.edges.length){const a=H(l);return e.createElement(t,{variant:"body2"},a,"/",l.edges.length)}return e.createElement(t,{variant:"body2"},"No progress found.")},K=({campaign:l})=>{const a=W(),v=u(F),f=u(Q),m=A(),[n,c]=q(null),o=150,g=l.track.levels.flatMap(({checks:s})=>s.map(({id:T})=>T)),{data:N,isLoading:b,isError:y}=B({filter:{tracks:[{trackId:l.track.id}],checkIds:{included:g},numberOfDays:void 0}}),i=N?.individualEntityPassRates??{totalCount:0,edges:[],pageInfo:{hasNextPage:!1,hasPreviousPage:!1}},C=s=>{c(s.currentTarget)},R=()=>{c(null)},x=()=>{m(f({campaignId:l.id}))},h=()=>{m(v({campaignId:l.id}))};if(b)return e.createElement("div",{"data-testid":"loading-indicator"},e.createElement(V,null));if(y)return e.createElement(t,{color:"error"},"Failed to load campaigns progress.");const w=i.edges.length?G(i):0,k=J(i),{name:P,description:r,ownerEntityRef:D,targetCompletionDate:I,startDate:S,supportChannel:d}=l;return e.createElement("div",{className:a.campaignCards},e.createElement("div",{className:a.campaignCard},e.createElement("div",{className:a.flexRow,style:{justifyContent:"space-between"}},e.createElement("div",{className:a.flexColumn},e.createElement(t,{variant:"h5"},P),e.createElement(t,{variant:"body1",className:a.description},r.length>o?`${r.substring(0,o)}...`:r)),e.createElement("div",null,e.createElement(M,{variant:"text","aria-controls":"menu","aria-haspopup":"true",onClick:C},e.createElement("div",{className:a.actions},e.createElement("div",{className:a.actionsText},"Actions"),e.createElement("div",{className:a.flexRow},n?e.createElement(j,{fontSize:"small"}):e.createElement(z,{fontSize:"small"})))),e.createElement(O,{id:"campaign-menu",anchorEl:n,keepMounted:!0,open:!!n,onClose:R,classes:{list:a.menuList}},e.createElement(E,{onClick:h},"View"),e.createElement(E,{onClick:x},"Edit")))),e.createElement("div",{className:a.detailSection},e.createElement("div",{className:a.flexColumn},e.createElement("div",{className:a.flexRow},e.createElement(t,{variant:"subtitle1",className:a.label},"Owner:"),e.createElement(t,{variant:"body1",display:"inline",className:a.value},e.createElement(L,{className:a.ownerLink,entityRef:D}))),d&&e.createElement("div",{className:a.flexRow},e.createElement(t,{variant:"subtitle1",className:a.label},"Support Channel:"),e.createElement(t,{variant:"body1",display:"inline",className:a.value},d))),e.createElement("div",{className:a.flexColumn},e.createElement("div",{className:a.flexRow},e.createElement(t,{variant:"subtitle1",className:a.label},"Start Date:"),e.createElement(t,{variant:"body1",display:"inline",className:a.value},p(S))),e.createElement("div",{className:a.flexRow},e.createElement(t,{variant:"subtitle1",className:a.label},"Target Completion Date:"),e.createElement(t,{variant:"body1",display:"inline",className:a.value},p(I)))),e.createElement("div",{className:a.flexRow,style:{minWidth:"300px"}},e.createElement("div",{className:a.flexColumn},e.createElement(t,{variant:"subtitle1",className:a.label},"Checks Passing"),e.createElement(t,{variant:"body2"},w,"%")),e.createElement("div",{className:a.flexColumn},e.createElement(t,{variant:"subtitle1",className:a.label},"Entities Complete"),k)))))};export{K as CampaignRow};
2
- //# sourceMappingURL=CampaignRow.esm.js.map
@@ -1,2 +0,0 @@
1
- import{makeStyles as m}from"@material-ui/core";import e from"react";import{AlertPanel as f}from"../../AlertPanel/AlertPanel.esm.js";import{NoCertifications as E,NoEntities as u}from"../../EmptyState/EmptyState.esm.js";import{VirtualTableContent as y}from"./VirtualTableContent.esm.js";const d=m(()=>({scrollContainer:{overflow:"auto"}})),h=({facets:t,ownerEntityRef:r,hasError:o,kind:i,type:s,setError:a,isFixedGroup:l})=>{const c=d();if(o)return e.createElement(f,{severity:"error",title:o.message});const n="Use the groups drop-down list at the top-right of the page to select another group.";return t&&(t.types?.length??0)>0?t.types?.find(p=>p.count>0)?e.createElement("div",{className:c.scrollContainer},e.createElement(y,{facets:t,kind:i,type:s,setError:a,ownerEntityRef:r,hasError:o})):e.createElement(E,{ownerEntityRef:r,selectGroupHint:n}):e.createElement(u,{ownerEntityRef:r,selectGroupHint:l?void 0:n})};export{h as TableContent};
2
- //# sourceMappingURL=TableContent.esm.js.map
@@ -1,2 +0,0 @@
1
- import a,{useMemo as u}from"react";import{VirtualizedResultsTable as m}from"../../ResultsTable/virtualized/VirtualizedResultsTable.esm.js";const y=({facets:e,ownerEntityRef:t,kind:l,type:c,setError:r})=>{const p=u(()=>{const n=new Map;return e.types.forEach(({kind:o,type:s})=>{const i=`${o}|${s??""}`;n.set(i,a.createElement(m,{key:i,ownerEntityRef:t,kind:o,type:s,setError:r}))}),n},[e,t,r]);return a.createElement("div",null,p.get(`${l}|${c??""}`))};export{y as VirtualTableContent};
2
- //# sourceMappingURL=VirtualTableContent.esm.js.map
@@ -1,2 +0,0 @@
1
- import{parseEntityRef as f}from"@backstage/catalog-model";import{Link as h}from"@backstage/core-components";import{makeStyles as u}from"@material-ui/core";import t,{memo as k}from"react";import{ResultState as s}from"../../../graphql/generated/index.esm.js";import{CheckIcon as v}from"../../CheckIcon/CheckIcon.esm.js";import{CheckCellTooltip as $}from"./CheckCellTooltip.esm.js";const E=u(r=>({root:{padding:0},iconWrapper:{padding:r.spacing(1.5),display:"flex",alignItems:"center",justifyContent:"center"},link:{"&:hover $iconWrapper, &:active $iconWrapper, &:focus $iconWrapper":{backgroundColor:r.palette.action.hover}},icon:{width:"17px",height:"17px"},virtualized:{borderBottom:`1px solid ${r.palette.divider}`,borderRight:`1px solid ${r.palette.divider}`}})),N=k(({programId:r,check:a,entityRef:o,result:i,entityRoute:d,isVirtualized:c})=>{const e=E();if(typeof o!="string"){const p=t.createElement("div",{className:e.iconWrapper},t.createElement("div",{className:e.icon}));return c?t.createElement("div",{className:`${e.root} ${e.virtualized}`,"aria-hidden":!0},p):t.createElement("td",{className:e.root,"aria-hidden":!0},p)}const n=t.createElement(v,{className:e.icon,result:i??s.NotReported}),l=t.createElement("div",{className:e.iconWrapper},n),m=i&&i===s.NotApplicable?l:t.createElement(h,{className:e.link,to:`${d(f(o))}/soundcheck/tracks/${r}/checks/${a.id}`},l);return c?t.createElement("div",{className:`${e.root} ${e.virtualized}`},t.createElement($,{check:a,icon:n,entityRef:o},m)):t.createElement("td",{className:`${e.root}`},m)});export{N as CheckCell};
2
- //# sourceMappingURL=CheckCell.esm.js.map
@@ -1,2 +0,0 @@
1
- import{makeStyles as d}from"@material-ui/core";import e,{memo as c}from"react";import{LevelBadge as m}from"../Badges/LevelBadge.esm.js";import{NoLevelBadge as n}from"../Badges/NoLevelBadge.esm.js";import{CampaignBadge as g}from"../Badges/CampaignBadge.esm.js";import{RowHeights as s,NO_LEVEL_BADGE_NAME as p}from"./virtualized/virtualizedTableUtils.esm.js";const f=d(t=>({virtualized:{borderRight:`1px solid ${t.palette.divider}`,height:`${s.programTitle}px`,display:"flex",justifyContent:"center",alignItems:"center"}})),v=c(({entityRef:t,highestLevels:l,trackType:r})=>{const a=l.find(o=>o.entityRef===t);let i=a?.badge?e.createElement(m,{badge:a.badge}):e.createElement(n,null);return r==="campaign"&&(i=e.createElement(g,null)),i}),E=({highestLevel:t,trackType:l})=>{const r=f();if(!t?.badge)return e.createElement("div",{className:r.virtualized},"\xA0");let a=t.name!==p?e.createElement(m,{badge:t.badge}):e.createElement(n,null);return l==="campaign"&&(a=e.createElement(g,null)),e.createElement("div",{className:r.virtualized},a)};export{v as HighestLevelBadge,E as HighestLevelBadgeCell};
2
- //# sourceMappingURL=HighestLevelBadge.esm.js.map
@@ -1,2 +0,0 @@
1
- import{makeStyles as p,Tooltip as l,LinearProgress as m}from"@material-ui/core";import s,{useMemo as g}from"react";import{ResultState as a}from"../../graphql/generated/index.esm.js";const d=p(e=>({root:{height:"8px",minWidth:"64px",marginLeft:e.spacing(2),borderRadius:"100vh",backgroundColor:e.palette.action.hover},bar:{backgroundColor:e.palette.success.main,transition:"none"}})),u=e=>{const r=d(e),t=g(()=>Object.entries(e.progress).reduce((i,[,c])=>i+c,0),[e.progress]);if(t===0)return null;const o=e.progress[a.Passed]??0,n=Math.round(o/t*100);return s.createElement(l,{arrow:!0,title:`Check passing at ${n}%, ${o} of ${t} ${t===1?"entity":"entities"} passing.`,enterDelay:0,placement:"top"},s.createElement(m,{variant:"determinate",value:(e.progress[a.Passed]??0)/t*100,classes:{root:r.root,bar:r.bar}}))};export{u as ProgramCheckIndicator};
2
- //# sourceMappingURL=ProgramCheckIndicator.esm.js.map
@@ -1,2 +0,0 @@
1
- import{makeStyles as f,Typography as s}from"@material-ui/core";import t,{memo as u,useMemo as C}from"react";import{CheckCell as E}from"./CheckCell/CheckCell.esm.js";import{ProgramCheckIndicator as i}from"./ProgramCheckIndicator.esm.js";import{RowHeights as p}from"./virtualized/virtualizedTableUtils.esm.js";const h=f(e=>({checkNameCell:{padding:0,backgroundColor:e.palette.background.paper},checkNameContent:{padding:`0 ${e.spacing(2)}px`,display:"flex",justifyContent:"space-between",alignItems:"center"},checkNameTypography:{overflow:"hidden",textOverflow:"ellipsis",fontWeight:e.typography.body1.fontWeight},checkIndicator:{flexBasis:e.spacing(8)},checkNameCellVirtualized:{height:`${p.check}px`,lineHeight:`${p.check}px`,borderBottom:`1px solid ${e.palette.divider}`,borderRight:`1px solid ${e.palette.divider}`}}));u(({programId:e,programName:l,check:a,entityRefs:d,results:k,entityRoute:g,level:m})=>{const r=h(),y=C(()=>{let c=0,o=0;return m.checks.forEach(n=>{o+=n.totalCount-n.totalPassing,c+=n.totalPassing}),{PASSED:c,FAILED:o}},[m]),N=new Map(k.map(c=>[c.entityRef,c.result]));return t.createElement("tr",{"data-testid":"track-check-row"},t.createElement("th",{scope:"row",className:r.checkNameCell,"aria-label":`${a.name} check for ${l} track`},t.createElement("div",{className:r.checkNameContent},t.createElement(s,{className:r.checkNameTypography,variant:"subtitle2",component:"p"},a.name),t.createElement(i,{className:r.checkIndicator,progress:y}))),d.map((c,o)=>t.createElement(E,{key:o,programId:e,check:a,entityRef:c,result:typeof c=="string"?N.get(c):void 0,entityRoute:g})))});const v=({name:e,progress:l})=>{const a=h();return t.createElement("div",{className:a.checkNameCell,"aria-label":`${e} check`},t.createElement("div",{className:`${a.checkNameContent} ${a.checkNameCellVirtualized}`},t.createElement(s,{variant:"subtitle2",component:"p",className:a.checkNameTypography},e),t.createElement(i,{className:a.checkIndicator,progress:l})))};export{v as CheckNameCell};
2
- //# sourceMappingURL=ProgramCheckRow.esm.js.map
@@ -1,2 +0,0 @@
1
- import{makeStyles as p,Typography as o}from"@material-ui/core";import a,{memo as s}from"react";import{RowHeights as c}from"./virtualized/virtualizedTableUtils.esm.js";const l=p(e=>{const t=e.palette.action.hover;return{root:{color:e.palette.text.primary,backgroundColor:t},levelContent:{padding:`${e.spacing(.5)}px ${e.spacing(2)}px`,backgroundColor:t},levelTypography:{overflow:"hidden",textOverflow:"ellipsis"},levelHeaderCell:{padding:`${e.spacing(.5)}px ${e.spacing(2)}px`,borderRight:`1px solid ${e.palette.divider}`,height:`${c.levelTitle}px`}}});s(({level:e,entityRefs:t,programName:n})=>{const r=l();return a.createElement("tr",{className:r.root,"data-testid":"track-level-row"},a.createElement("th",{scope:"row",className:r.root},a.createElement("div",{className:r.levelContent},a.createElement(o,{className:r.levelTypography,variant:"subtitle2",component:"p","aria-label":`${e.name} for ${n} track`},e.name))),t.map((v,m)=>a.createElement("td",{key:m,className:r.root,"aria-hidden":!0})))});const i=({name:e})=>{const t=l();return a.createElement("div",{className:`${t.levelHeaderCell} ${t.root}`,"aria-label":`${e}`},a.createElement(o,{variant:"subtitle2",component:"p",className:t.levelTypography},e))},d=()=>{const e=l();return a.createElement("div",{className:`${e.levelHeaderCell} ${e.root}`},"\xA0")};export{i as ProgramLevelHeaderCell,d as ProgramLevelHeaderFill};
2
- //# sourceMappingURL=ProgramLevelRow.esm.js.map
@@ -1,2 +0,0 @@
1
- import{makeStyles as s,Typography as o}from"@material-ui/core";import e,{memo as n}from"react";import{HighestLevelBadge as c}from"./HighestLevelBadge.esm.js";const i=s(t=>({programNameCell:{padding:0,position:"sticky",backgroundColor:t.palette.background.paper},programNameContent:{padding:t.spacing(2)},programNameTypography:{overflow:"hidden",textOverflow:"ellipsis"},badgeCellContent:{display:"flex",justifyContent:"center",alignItems:"center"},programNameCellVirtualized:{borderRight:`1px solid ${t.palette.divider}`}}));n(({program:t,entityRefs:a,highestLevels:p})=>{const r=i();return e.createElement("tr",{"data-testid":"track-title-row"},e.createElement("th",{scope:"row",className:r.programNameCell},e.createElement("div",{className:r.programNameContent},e.createElement(o,{className:r.programNameTypography,variant:"h5",component:"p"},t.name))),a.map((m,l)=>typeof m!="string"?e.createElement("td",{key:l,"aria-hidden":!0}):e.createElement("td",{key:l,"data-testid":"track-certification-cell"},e.createElement("div",{className:r.badgeCellContent},e.createElement(c,{entityRef:m,highestLevels:p,trackType:t.type??void 0})))))});const d=n(({name:t})=>{const a=i();return e.createElement("div",{className:`${a.programNameCell} ${a.programNameCellVirtualized}`},e.createElement("div",{className:a.programNameContent},e.createElement(o,{className:a.programNameTypography,variant:"h5",component:"p"},t)))});export{d as ProgramTitleCell};
2
- //# sourceMappingURL=ProgramTitleRow.esm.js.map
@@ -1,2 +0,0 @@
1
- import{parseEntityRef as n}from"@backstage/catalog-model";import{Link as d}from"@backstage/core-components";import{useRouteRef as m}from"@backstage/core-plugin-api";import{entityRouteRef as p,humanizeEntityRef as c}from"@backstage/plugin-catalog-react";import{makeStyles as f}from"@material-ui/core";import"lodash";import o from"react";import"@tanstack/react-query";import"../../hooks/graphqlKeys.esm.js";import{useEntityByRef as s}from"../../hooks/catalog/useEntityByRef.esm.js";const u=f(e=>({root:{position:"sticky",bottom:"-1px",backgroundColor:e.palette.background.default,boxShadow:`0 -1px ${e.palette.divider}`,"& td$cell, & th$cell":{border:0,padding:e.spacing(1)},"& td$cell":{backgroundColor:e.palette.background.default}},row:{boxShadow:`1px 0 ${e.palette.background.default}, -1px 0 ${e.palette.background.default}`},cell:{verticalAlign:"top"},cellInner:{textOrientation:"mixed",writingMode:"vertical-lr",transform:"rotate(-20deg)",transformOrigin:`100% ${e.spacing(1)}px`,wordBreak:"keep-all",fontWeight:"bold",overflow:"hidden",textOverflow:"ellipsis",maxHeight:"max(15vh, 175px)"}})),g=({entityRef:e})=>{const{data:r}=s(e),l=m(p),a=u(),t=e?n(e):void 0,i=t?o.createElement(d,{"aria-label":`entity link to ${t.name}`,to:l(t)},r?.metadata.title?r.metadata.title:c(t,{defaultKind:t.kind})):o.createElement(o.Fragment,null);return o.createElement("div",{className:a.cell},o.createElement("div",{className:a.cellInner},i))};export{g as EntityRefCell};
2
- //# sourceMappingURL=ResultsTableFooter.esm.js.map
@@ -1,2 +0,0 @@
1
- import{makeStyles as h}from"@material-ui/core";import{Skeleton as l}from"@material-ui/lab";import e from"react";const E=h(t=>({table:{backgroundColor:t.palette.background.paper,borderCollapse:"collapse",whiteSpace:"nowrap","& th, & td":{border:`1px solid ${t.palette.divider}`,borderCollapse:"collapse"},paddingBottom:t.spacing(2)},programTitle:{padding:t.spacing(2)},checkResult:{padding:t.spacing(1.5)},title:{padding:`${t.spacing(1)}px ${t.spacing(2)}px`},header:{backgroundColor:t.palette.action.hover}})),b=({entityCount:t=25,levelCount:o=3,checkCount:i=5})=>{const a=E(),r=new Array(t).fill(void 0),m=new Array(i).fill(void 0),d=new Array(o).fill(void 0);return e.createElement("table",{"aria-label":"table loading",className:a.table},e.createElement("tbody",null,e.createElement("tr",null,e.createElement("td",{className:a.programTitle},e.createElement(l,{width:180,height:40})),r.map((p,n)=>e.createElement("td",{key:n}))),d.map((p,n)=>e.createElement(e.Fragment,{key:n},e.createElement("tr",{className:a.header},e.createElement("td",{className:a.title},e.createElement(l,{width:180})),r.map((s,c)=>e.createElement("td",{key:c}))),m.map((s,c)=>e.createElement("tr",{key:c},e.createElement("td",{className:a.title},e.createElement(l,{width:240})),r.map((k,g)=>e.createElement("td",{key:g,className:a.checkResult},e.createElement(l,{width:18,height:18,variant:"rect"})))))))))};export{b as ResultsTableSkeleton};
2
- //# sourceMappingURL=ResultsTableSkeleton.esm.js.map
@@ -1,2 +0,0 @@
1
- import r from"react";import{CheckCell as c}from"../CheckCell/CheckCell.esm.js";import{HighestLevelBadgeCell as m}from"../HighestLevelBadge.esm.js";import{CheckNameCell as a}from"../ProgramCheckRow.esm.js";import{ProgramLevelHeaderCell as s,ProgramLevelHeaderFill as d}from"../ProgramLevelRow.esm.js";import{ProgramTitleCell as i}from"../ProgramTitleRow.esm.js";import{EntityRefCell as p}from"../ResultsTableFooter.esm.js";const y=e=>r.createElement(i,{name:e}),C=e=>({type:"ProgramHeader",render:()=>y(e)}),g=e=>e?r.createElement(s,{name:e}):r.createElement(d,null),h=e=>({type:"LevelHeader",render:()=>g(e)}),E=(e,t)=>r.createElement(a,{name:e,progress:t}),f=(e,t)=>({type:"CheckTitle",render:()=>E(e,t)}),v=(e,t,l,n,o)=>r.createElement(c,{check:t,entityRef:l,entityRoute:o,programId:e,result:n,isVirtualized:!0}),H=(e,t,l,n,o)=>({type:"CheckResult",render:()=>v(e,t,l,n,o)}),k=e=>r.createElement(p,{entityRef:e}),u=e=>({type:"EntityHeader",render:()=>k(e)}),R=(e,t)=>r.createElement(m,{highestLevel:e,trackType:t}),L=(e,t)=>({type:"LevelBadge",render:()=>R(e,t)}),P=e=>t=>{const l=e[t.rowIndex].cells[t.columnIndex];return l?r.createElement("div",{style:t.style},l.render()):r.createElement("div",{style:t.style})};export{H as checkResultCell,f as checkTitleCell,u as entityHeaderCell,P as getCellRenderer,L as levelBadgeCell,h as levelHeaderCell,C as programHeaderCell};
2
- //# sourceMappingURL=Cell.esm.js.map
@@ -1,2 +0,0 @@
1
- import{ResultState as C}from"../../../graphql/generated/index.esm.js";import{programHeaderCell as k,levelBadgeCell as H,levelHeaderCell as c,checkTitleCell as T,checkResultCell as y,entityHeaderCell as h}from"./Cell.esm.js";import{RowHeights as i,generateNoLevelBadge as L,findLongestRefTitle as A,calculateHeightForRefTitle as S}from"./virtualizedTableUtils.esm.js";const w=(p,t,f)=>{const l=[];for(const{program:o,levels:m,highestLevels:u}of p){l.push({height:i.programTitle,cells:[k(o.name),...t.map(e=>{const r=e?u.find(s=>s.entityRef===e)||L(e):void 0;return H(r,o.type??void 0)})]});for(const e of m){l.push({height:i.levelTitle,cells:[c(e.name),...t.map(r=>c(""))]});for(const{check:r,results:s,totalCount:d,totalPassing:n}of e.checks){const R={PASSED:n,FAILED:d-n};l.push({height:i.check,cells:[T(r.name,R),...t.map(a=>y(o.id,r,a,s.find(v=>v.entityRef===a)?.result??C.NotApplicable,f))]})}}}const g=A(t??[]);return l.push({height:S(g.length??1),cells:[h(""),...t.map(o=>h(o||""))]}),l};export{w as generateRows};
2
- //# sourceMappingURL=Row.esm.js.map
@@ -1,2 +0,0 @@
1
- import{useRouteRef as z}from"@backstage/core-plugin-api";import{entityRouteRef as T}from"@backstage/plugin-catalog-react";import{makeStyles as x,Grid as H}from"@material-ui/core";import e,{useEffect as W,useState as $,useRef as A,useLayoutEffect as G}from"react";import{VariableSizeGrid as L}from"react-window";import"@backstage/catalog-model";import"@tanstack/react-query";import"../../../api.esm.js";import"../../../hooks/graphqlKeys.esm.js";import{useProgramOverviewForOwner as N}from"../../../hooks/certifications/useProgramOverviewForOwner.esm.js";import"../../../hooks/useSoundcheckAlert.esm.js";import"../../../hooks/useConfirmationModal.esm.js";import"react-router-dom";import"../../Pagination/Pagination.esm.js";import{useCursorPagination as O,CursorPagination as V}from"../../Pagination/CursorPagination.esm.js";import{ResultsTableSkeleton as B}from"../skeletons/ResultsTableSkeleton.esm.js";import{getCellRenderer as F}from"./Cell.esm.js";import{generateRows as j}from"./Row.esm.js";import{CellWidths as c,calculateTableHeight as q,RowHeights as D}from"./virtualizedTableUtils.esm.js";const d=25,I=x(r=>({table:{backgroundColor:r.palette.background.paper,borderCollapse:"collapse",whiteSpace:"nowrap",textAlign:"left",overflow:"auto"}})),J=({setError:r,kind:n,type:m,ownerEntityRef:t})=>{const{cursor:h,pageSize:u,...C}=O({defaultPageSize:d,label:"entitiesPerPage"}),{data:o,isLoading:w,isError:p}=N(t,{kind:n,type:m},u,h),R=I(),E=z(T);W(()=>{r?.(p?new Error("Error loading program overview"):void 0)},[p,r]);const[g,b]=$(0),i=A(null);if(G(()=>{o&&t&&i?.current&&b(i.current.clientWidth)},[i,o,t]),w)return e.createElement(B,null);if(!o||!t)return null;const{programs:v,entityRefs:l,totalCount:y,endCursor:P,prevCursor:S}=o,f=l.length>=25?l:[...l,...Array.from({length:25-l.length},()=>{})],a=j(v,f,E),k=F(a);return e.createElement("div",{ref:i},e.createElement(H,{"aria-label":`Check results for ${m??n}`,key:`${n}|${m??""}`,item:!0,xs:12,style:{marginBottom:"1.5em"}},g>0&&e.createElement(L,{className:R.table,columnCount:f.length+1,columnWidth:s=>s===0?c.programTitle:c.checkResult,rowCount:a.length,rowHeight:s=>a[s].height,height:q(a)+D.paginationControl,width:g},k)),e.createElement(V,{...C,totalCount:y,defaultPageSize:d,endCursor:P,prevCursor:S,pageSize:u,labelRowsPerPage:"Entities per page:"}))};export{J as VirtualizedResultsTable};
2
- //# sourceMappingURL=VirtualizedResultsTable.esm.js.map
@@ -1,2 +0,0 @@
1
- import{parseEntityRef as r}from"@backstage/catalog-model";import{humanizeEntityRef as n}from"@backstage/plugin-catalog-react";import{BadgeVariant as c}from"../../../graphql/generated/index.esm.js";const a=8,g=16,d={programTitle:70,levelTitle:30,check:42,entityRefFooter:100,paginationControl:50},i={programTitle:350+g*2,checkResult:42},h=e=>e.reduce((t,l)=>t+l.height,0),f=e=>e*i.checkResult+i.programTitle,m=e=>e.filter(t=>t!==void 0).map(t=>{const l=r(t);return n(l,{defaultKind:l.kind})}).reduce((t,l)=>t.length>l.length?t:l,""),p=e=>a*e+a,o="NoLevel",s=e=>({name:o,badge:{options:{level:0,color:""},variant:c.Medal},entityRef:e,ordinal:0});export{i as CellWidths,o as NO_LEVEL_BADGE_NAME,d as RowHeights,p as calculateHeightForRefTitle,h as calculateTableHeight,f as calculateTableWidth,m as findLongestRefTitle,s as generateNoLevelBadge};
2
- //# sourceMappingURL=virtualizedTableUtils.esm.js.map