@spotify/backstage-plugin-soundcheck 0.18.1 → 0.19.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.
- package/CHANGELOG.md +40 -0
- package/config.d.ts +21 -0
- package/dist/alpha/apis.esm.js +1 -1
- package/dist/alpha/entity-content.esm.js +1 -1
- package/dist/alpha/pages.esm.js +1 -1
- package/dist/alpha/plugin.esm.js +1 -1
- package/dist/alpha.d.ts +83 -77
- package/dist/api.esm.js +1 -1
- package/dist/components/Badges/CampaignBadge.esm.js +1 -1
- package/dist/components/Badges/StatusBadge.esm.js +1 -1
- package/dist/components/CacheConfig/CacheConfigComponent.esm.js +1 -1
- package/dist/components/CampaignForm/CampaignForm.esm.js +1 -1
- package/dist/components/CampaignForm/Steps/CampaignTrackStepNew.esm.js +1 -1
- package/dist/components/CampaignForm/hooks/utils.esm.js +1 -1
- package/dist/components/CampaignForm/utils/campaignFormUtils.esm.js +2 -2
- package/dist/components/CampaignForm/utils/validation.esm.js +1 -1
- package/dist/components/CampaignInsightsPage/CampaignInsightsPage.esm.js +1 -1
- package/dist/components/CampaignInsightsPage/CampaignStatusHistoryTile.esm.js +1 -1
- package/dist/components/CampaignInsightsPage/CampaignStatusTile.esm.js +1 -1
- package/dist/components/CampaignInsightsPage/DaysRemainingTile.esm.js +1 -1
- package/dist/components/CampaignsPage/CampaignListPage/CampaignListPage.esm.js +1 -1
- package/dist/components/CampaignsPage/CampaignsPage.esm.js +1 -1
- package/dist/components/CategoryBar/CategoryBar.esm.js +1 -1
- package/dist/components/CertificationSidebar/Check.esm.js +1 -1
- package/dist/components/CertificationsPage/CertificationTabs.esm.js +1 -1
- package/dist/components/CheckDetails/FixMeDialog.esm.js +1 -1
- package/dist/components/CheckForm/FormFields/RuleInput/AddMenuButton.esm.js +1 -1
- package/dist/components/CheckForm/FormFields/RuleInput/Conditions/RuleConditionInput.esm.js +1 -1
- package/dist/components/CheckForm/utils/checkFormUtils.esm.js +2 -2
- package/dist/components/CheckIcon/CheckIcon.esm.js +1 -1
- package/dist/components/CheckPage/CheckEntitiesTable/CheckEntitiesTable.esm.js +1 -1
- package/dist/components/CheckPage/CheckEntitiesTable/columns.esm.js +1 -1
- package/dist/components/CheckPage/CheckInsightsPage.esm.js +1 -1
- package/dist/components/CheckPage/CheckStatusTable.esm.js +1 -1
- package/dist/components/CheckTemplatesPage/CheckTemplatesPage.esm.js +1 -1
- package/dist/components/ChecksPage/CheckListPage/CheckListPage.esm.js +1 -1
- package/dist/components/ChecksPage/ChecksPage.esm.js +1 -1
- package/dist/components/CollapsablePanel/CollapsablePanel.esm.js +1 -1
- package/dist/components/CollectorPage/CollectorDetailsPage.esm.js +1 -1
- package/dist/components/CollectorPage/CollectorPage.esm.js +1 -1
- package/dist/components/CollectorPage/Configurators/AzureDevOps/AzureDevOpsConfigurator.esm.js +1 -1
- package/dist/components/CollectorPage/Configurators/AzureDevOps/NumberOfWorkItemsComponent.esm.js +1 -1
- package/dist/components/CollectorPage/Configurators/BigQuery/BigQueryConfigurator.esm.js +1 -1
- package/dist/components/CollectorPage/Configurators/BigQuery/QueryFactDetailsComponent.esm.js +1 -1
- package/dist/components/CollectorPage/Configurators/Catalog/CatalogConfigurator.esm.js +1 -1
- package/dist/components/CollectorPage/Configurators/Common/CollectorConfigAlert.esm.js +2 -0
- package/dist/components/CollectorPage/Configurators/Common/PortalConfigAlert.esm.js +2 -0
- package/dist/components/CollectorPage/Configurators/Common/utils.esm.js +1 -1
- package/dist/components/CollectorPage/Configurators/DataDog/DataDogConfigurator.esm.js +1 -1
- package/dist/components/CollectorPage/Configurators/DataRegistry/DataRegistryConfigurator.esm.js +1 -1
- package/dist/components/CollectorPage/Configurators/Github/GithubConfigurator.esm.js +1 -1
- package/dist/components/CollectorPage/Configurators/Gitlab/GitlabConfigurator.esm.js +1 -1
- package/dist/components/CollectorPage/Configurators/HTTP/HttpConfigurator.esm.js +1 -1
- package/dist/components/CollectorPage/Configurators/HTTP/HttpRequestComponent.esm.js +1 -1
- package/dist/components/CollectorPage/Configurators/HTTP/HttpStatusesInput.esm.js +1 -1
- package/dist/components/CollectorPage/Configurators/Jira/JiraConfigurator.esm.js +1 -1
- package/dist/components/CollectorPage/Configurators/Kubernetes/KubernetesConfigurator.esm.js +1 -1
- package/dist/components/CollectorPage/Configurators/NewRelic/NewRelicConfigurator.esm.js +1 -1
- package/dist/components/CollectorPage/Configurators/PagerDuty/PagerDutyConfigurator.esm.js +1 -1
- package/dist/components/CollectorPage/Configurators/SCM/ScmConfigurator.esm.js +1 -1
- package/dist/components/CollectorPage/Configurators/SonarQube/SonarQubeConfigurator.esm.js +1 -1
- package/dist/components/CollectorsPage/CollectorsPage.esm.js +1 -1
- package/dist/components/ColorChip/ColorChip.esm.js +1 -1
- package/dist/components/EmptyState/EmptyState.esm.js +1 -1
- package/dist/components/EntitiesAutocompletePicker/EntitiesAutocompletePicker.esm.js +1 -1
- package/dist/components/ExpandableSection/ExpandableSection.esm.js +1 -1
- package/dist/components/FactExplorer/FactExplorer.esm.js +1 -1
- package/dist/components/Filter/EntityAutocompletePicker.esm.js +1 -1
- package/dist/components/FilterSidebar/StateFilter.esm.js +1 -1
- package/dist/components/FilterSidebar/useTrackFilterSidebar.esm.js +2 -0
- package/dist/components/Frequency/FrequencyComponent.esm.js +1 -1
- package/dist/components/Frequency/util.esm.js +1 -1
- package/dist/components/GroupHierarchySelector/GroupHierarchyChip.esm.js +1 -1
- package/dist/components/GroupHierarchySelector/GroupHierarchyGroupInfo.esm.js +1 -1
- package/dist/components/GroupHierarchySelector/GroupHierarchySelector.esm.js +1 -1
- package/dist/components/GroupHierarchySelector/GroupHierarchySelectorDialog.esm.js +1 -1
- package/dist/components/GroupHierarchySelector/getAllOwnedEntityCount.esm.js +2 -0
- package/dist/components/{TechInsights → HierarchicalTechInsightsPage}/ColorLegend.esm.js +1 -1
- package/dist/components/HierarchicalTechInsightsPage/HierarchicalTechInsightsPage.esm.js +2 -0
- package/dist/components/HierarchicalTechInsightsPage/HierarchyTable.esm.js +2 -0
- package/dist/components/HierarchicalTechInsightsPage/LowestPerformingTeams.esm.js +2 -0
- package/dist/components/HierarchicalTechInsightsPage/SelectedNodeSidebar.esm.js +2 -0
- package/dist/components/HierarchicalTechInsightsPage/TeamPerformanceCard.esm.js +2 -0
- package/dist/components/HierarchicalTechInsightsPage/TopPerformingTeams.esm.js +2 -0
- package/dist/components/HierarchicalTechInsightsPage/getLeafNodes.esm.js +2 -0
- package/dist/components/HierarchicalTechInsightsPage/visualizations/LoadingOverlay.esm.js +2 -0
- package/dist/components/HierarchicalTechInsightsPage/visualizations/NivoCirclePacking.esm.js +2 -0
- package/dist/components/HierarchicalTechInsightsPage/visualizations/NivoHeatmap.esm.js +2 -0
- package/dist/components/HierarchicalTechInsightsPage/visualizations/NivoIcicle.esm.js +2 -0
- package/dist/components/HierarchicalTechInsightsPage/visualizations/NivoSunburst.esm.js +2 -0
- package/dist/components/HierarchicalTechInsightsPage/visualizations/NivoTreemap.esm.js +2 -0
- package/dist/components/HierarchicalTechInsightsPage/visualizations/VisualizationBreadcrumb.esm.js +2 -0
- package/dist/components/HierarchicalTechInsightsPage/visualizations/findNodePath.esm.js +2 -0
- package/dist/components/HierarchicalTechInsightsPage/visualizations/hierarchyToNivo.esm.js +2 -0
- package/dist/components/ImportExportPanel/ImportExportPanel.esm.js +1 -1
- package/dist/components/LevelsTable/LevelsTable.esm.js +1 -1
- package/dist/components/OverviewPage/OverviewPage.esm.js +1 -1
- package/dist/components/OverviewPage/OverviewPageContent.esm.js +1 -1
- package/dist/components/PassRateGrid/PassRateMetadata.esm.js +1 -1
- package/dist/components/QuickstartPage/QuickstartPage.esm.js +2 -2
- package/dist/components/QuickstartPage/styles.esm.js +1 -1
- package/dist/components/RoutingPage/NewFeatureTab.esm.js +2 -0
- package/dist/components/RoutingPage/RoutingPage.esm.js +1 -1
- package/dist/components/SearchBar/SearchBar.esm.js +1 -1
- package/dist/components/SoundcheckEntityLink/SoundcheckEntityLink.esm.js +2 -0
- package/dist/components/SoundcheckHeader/headerUtil.esm.js +1 -1
- package/dist/components/TechHealth/Filters/FacetFilter.esm.js +1 -1
- package/dist/components/TechHealth/TechHealth.esm.js +1 -1
- package/dist/components/TechHealthTabs/PassRateTabHeader.esm.js +1 -1
- package/dist/components/TechInsights/FilterControls.esm.js +1 -1
- package/dist/components/TechInsights/SummaryTiles.esm.js +1 -1
- package/dist/components/TechInsights/TechInsightsCardsView.esm.js +1 -1
- package/dist/components/TechInsights/TechInsightsPage.esm.js +2 -0
- package/dist/components/TechInsights/TechInsightsTableView.esm.js +1 -1
- package/dist/components/TechInsights/TrackStatusCard.esm.js +2 -0
- package/dist/components/TechInsights/ViewModeControls.esm.js +1 -1
- package/dist/components/TechInsights/convertToCommonTrackStatus.esm.js +2 -0
- package/dist/components/TopFailingChecksTable/TopFailingChecksTable.esm.js +1 -1
- package/dist/components/TrackPage/TrackEntitiesTable/TrackEntitiesTable.esm.js +1 -1
- package/dist/components/TrackPage/TrackEntitiesTable/columns.esm.js +1 -1
- package/dist/components/TrackPage/TrackHistoryChart.esm.js +1 -1
- package/dist/components/TrackPage/TrackPage.esm.js +1 -1
- package/dist/components/TrackPage/TrackStatusBar.esm.js +1 -1
- package/dist/components/TrackPage/TrackStatusTable.esm.js +1 -1
- package/dist/components/TrackSelection/TrackSelection.esm.js +1 -1
- package/dist/components/TracksPage/TrackListPage/TrackListPage.esm.js +1 -1
- package/dist/components/TracksPage/TracksPage.esm.js +1 -1
- package/dist/graphql/generated/index.esm.js +113 -115
- package/dist/hooks/campaigns/useCreateCampaign.esm.js +1 -1
- package/dist/hooks/campaigns/useGetCampaigns.esm.js +1 -1
- package/dist/hooks/catalog/useGetLimitedEntityRefs.esm.js +2 -0
- package/dist/hooks/collectors/useDeleteCollectorConfig.esm.js +2 -0
- package/dist/hooks/graphqlKeys.esm.js +1 -1
- package/dist/hooks/heirarchy/useBatchedHierarchicalTrackStatuses.esm.js +1 -1
- package/dist/hooks/heirarchy/useGroupHierarchy.esm.js +1 -1
- package/dist/hooks/heirarchy/useGroupTypeHierarchy.esm.js +1 -1
- package/dist/hooks/heirarchy/useHierarchicalTrackStatus.esm.js +1 -1
- package/dist/hooks/tracks/useCreateTrack.esm.js +1 -1
- package/dist/hooks/tracks/useGetAllTracks.esm.js +1 -1
- package/dist/hooks/useFeatureFlag.esm.js +1 -1
- package/dist/hooks/useLCPReporting.esm.js +2 -0
- package/dist/index.d.ts +2 -3
- package/dist/index.esm.js +1 -1
- package/dist/utils/colors.esm.js +1 -1
- package/dist/utils/lcpReporting.esm.js +2 -0
- package/package.json +17 -15
- package/dist/components/CheckCard/CheckCard.esm.js +0 -2
- package/dist/components/CheckCard/CheckHistoryChart.esm.js +0 -2
- package/dist/components/CheckCard/utils.esm.js +0 -2
- package/dist/components/MultiSelectFilter/MultiSelectFilter.esm.js +0 -2
- package/dist/components/QuickstartPage/WelcomeModal.esm.js +0 -2
- package/dist/components/TechInsights/ColorSchemeSelector.esm.js +0 -2
- package/dist/components/TechInsights/HierarchicalTechInsightsPage.esm.js +0 -2
- package/dist/components/TechInsights/HierarchyTable.esm.js +0 -2
- package/dist/components/TechInsights/LoadingOverlay.esm.js +0 -2
- package/dist/components/TechInsights/LowestPerformingTeams.esm.js +0 -2
- package/dist/components/TechInsights/NivoCirclePacking.esm.js +0 -2
- package/dist/components/TechInsights/NivoIcicle.esm.js +0 -2
- package/dist/components/TechInsights/NivoSunburst.esm.js +0 -2
- package/dist/components/TechInsights/NivoTreemap.esm.js +0 -2
- package/dist/components/TechInsights/SelectedNodeSidebar.esm.js +0 -2
- package/dist/components/TechInsights/TeamComparison/FailingComponentsTable.esm.js +0 -2
- package/dist/components/TechInsights/TeamComparison/MultiCheckStatusHistoryChart.esm.js +0 -2
- package/dist/components/TechInsights/TeamPerformanceCard.esm.js +0 -2
- package/dist/components/TechInsights/TechInsightsChartView.esm.js +0 -2
- package/dist/components/TechInsights/TechInsightsPage2.esm.js +0 -2
- package/dist/components/TechInsights/TechInsightsViewSelector.esm.js +0 -2
- package/dist/components/TechInsights/Tiles/TileUtils.esm.js +0 -2
- package/dist/components/TechInsights/Tiles/TrackStatusCard.esm.js +0 -2
- package/dist/components/TechInsights/TopPerformingTeams.esm.js +0 -2
- package/dist/components/TechInsights/VisualizationBreadcrumb.esm.js +0 -2
- package/dist/components/TechInsights/colorContrast.esm.js +0 -2
- package/dist/components/TechInsights/findNodePath.esm.js +0 -2
- package/dist/components/TechInsights/hierarchy/GroupNode.esm.js +0 -2
- package/dist/components/TechInsights/hierarchy/Hierarchy.esm.js +0 -2
- package/dist/components/TechInsights/hierarchyToNivo.esm.js +0 -2
- package/dist/components/TechInsights/persistence/FavoriteViews.esm.js +0 -2
- package/dist/components/TechInsights/styles.esm.js +0 -2
- package/dist/components/TrackPage/FilterBar/FilterBar.esm.js +0 -2
- package/dist/hooks/aggregations/useCheckStatusHistories.esm.js +0 -2
- package/dist/hooks/heirarchy/useGetDescendentsOfGroups.esm.js +0 -2
- /package/dist/components/{TrackPage/FilterBar → FilterSidebar}/util.esm.js +0 -0
- /package/dist/components/{TechInsights → HierarchicalTechInsightsPage}/TeamPerformanceListCard.esm.js +0 -0
- /package/dist/components/{TechInsights → TeamStatusBar}/TeamStatusBar.esm.js +0 -0
- /package/dist/components/{TechInsights → TechInsightsGroupSelector}/TechInsightsGroupSelector.esm.js +0 -0
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{jsx as s}from"react/jsx-runtime";import{makeStyles as t}from"@material-ui/core";import
|
|
1
|
+
import{jsx as s}from"react/jsx-runtime";import{makeStyles as t}from"@material-ui/core";import a from"classnames";import{BaseBadge as l}from"./BaseBadge.esm.js";const m=t(r=>({root:{color:r.palette.warning.dark,borderColor:"currentColor",borderStyle:"solid",fontSize:({size:o})=>o==="small"?"14px":"28px"}})),i=({className:r,size:o="small"})=>{const e=m({size:o});return s(l,{className:a(r,e.root),size:o,label:"C"})};export{i as CampaignBadge};
|
|
2
2
|
//# sourceMappingURL=CampaignBadge.esm.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{jsx as e,Fragment as
|
|
1
|
+
import{jsx as e,Fragment as C,jsxs as d}from"react/jsx-runtime";import{makeStyles as b,useTheme as y,Box as v,Tooltip as z}from"@material-ui/core";import N from"@material-ui/icons/Check";import $ from"@material-ui/icons/Close";import x from"@material-ui/icons/HelpOutline";import W from"@material-ui/icons/PriorityHigh";import w from"classnames";import{CircularProgressbarWithChildren as p,buildStyles as c}from"react-circular-progressbar";import"react-circular-progressbar/dist/styles.css";const f=24,L=15,h=s=>s==="small"?1:2,S=b(s=>({root:{position:"relative",display:"inline-block",alignItems:"center",justifyContent:"center",cursor:"default",lineHeight:0,width:({size:t})=>`${f*h(t)}px`,height:({size:t})=>`${f*h(t)}px`},icon:{color:s.palette.background.default,fontSize:({size:t})=>L*h(t)}})),j=({className:s,status:t,size:g="small",hideTooltip:k})=>{const l=S({size:g}),n=y();if(!t)return e(C,{});const o=t.passed+t.failed+t.warning+t.error+t.notReported,r=o?t.passed/o*100:0,a=o?t.warning/o*100:0,i=o?(t.failed+t.error)/o*100:0,m=100-r-a-i,u=e(v,{className:w(s,l.root),role:"img","aria-label":`${r} badge`,children:d(p,{value:r,strokeWidth:r<100?15:50,styles:c({pathColor:n.palette.success.main,trailColor:"transparent",strokeLinecap:"butt",rotation:0}),children:[r===100&&e(N,{className:l.icon}),r<100&&d(p,{value:a,strokeWidth:a<100?15:50,styles:c({pathColor:n.palette.warning.main,trailColor:"transparent",strokeLinecap:"butt",rotation:r/100}),children:[a===100&&e(W,{className:l.icon}),a<100&&d(p,{value:i,strokeWidth:i<100?15:50,styles:c({pathColor:n.palette.error.main,trailColor:"transparent",strokeLinecap:"butt",rotation:(r+a)/100}),children:[i===100&&e($,{className:l.icon}),i<100&&e(p,{value:m,strokeWidth:m<100?15:50,styles:c({pathColor:n.palette.divider,trailColor:"transparent",strokeLinecap:"butt",rotation:(r+a+i)/100}),children:m===100&&e(x,{className:l.icon})})]})]})]})});return k?u:e(z,{title:`${t.passed}/${o} checks passed (${Math.round(r)}%)`,children:u})};export{j as StatusBadge};
|
|
2
2
|
//# sourceMappingURL=StatusBadge.esm.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{jsxs as o,jsx as a}from"react/jsx-runtime";import{makeStyles as N,Grid as n,Checkbox as h,Typography as m,TextField as x,FormControl as T,InputLabel as v,Select as
|
|
1
|
+
import{jsxs as o,jsx as a}from"react/jsx-runtime";import{makeStyles as N,Grid as n,Checkbox as h,Typography as m,TextField as x,FormControl as T,InputLabel as v,Select as y,MenuItem as L}from"@material-ui/core";import{useState as p,useEffect as k}from"react";import{MIN_TIME_UNIT_VALUE as M,MAX_TIME_UNIT_VALUE as U}from"../../utils/time.esm.js";import{TimeUnit as S}from"../Frequency/types.esm.js";import{VALID_TIME_UNITS as _,toTimeUnit as E}from"../Frequency/util.esm.js";import"../Frequency/FrequencyComponent.esm.js";const F=N(l=>({duration:{display:"flex",gap:l.spacing(2),alignItems:"flex-start",marginTop:l.spacing(1)},durationInput:{paddingLeft:0},label:{cursor:"pointer"},font:{fontSize:l.typography.body1.fontSize},inputLabel:{color:`${l.palette.text.primary} !important`},inputLabelDisabled:{color:l.palette.action.disabled},unitInput:{minWidth:100},unitMenu:{backgroundColor:l.palette.background.paper}})),A=({value:l,onChange:s,disabled:r,errors:c})=>{const i=F(),[e,d]=p(l),[b,g]=p(`${l.value}`);k(()=>{s&&s(e)},[e,s]);const f=t=>{d({...e,enabled:t.target.checked,hasDuration:t.target.checked&&e.hasDuration})},I=t=>{d({...e,hasDuration:t.target.checked})},D=t=>{g(t.target.value);const u=parseInt(t.target.value,10);d({...e,value:isNaN(u)?0:u})},C=t=>{d({...e,unit:E(t.target.value)??S.Days})};return o(n,{container:!0,direction:"column",className:i.font,children:[a(n,{item:!0,children:o(n,{container:!0,alignItems:"center",children:[a(n,{item:!0,children:a(h,{id:"enableCaching",disabled:r,checked:e.enabled,onChange:f,"data-testid":"enableCaching"})}),a(n,{item:!0,children:a("label",{htmlFor:"enableCaching",className:i.label,children:"Enable caching"})})]})}),a(n,{item:!0,children:o(n,{container:!0,alignItems:"flex-start",children:[a(n,{item:!0,children:a(h,{id:"hasDuration",disabled:r||!e.enabled,checked:e.enabled&&e.hasDuration,onChange:I,"data-testid":"hasDuration"})}),o(n,{item:!0,className:i.durationInput,children:[a(m,{variant:"body1",children:a("label",{htmlFor:"hasDuration",className:e.enabled?i.label:"",children:"Duration"})}),a(m,{variant:"caption",children:"Set the maximum length that fact data is cached for"}),o(n,{className:i.duration,children:[a(n,{item:!0,children:a(x,{id:"every",type:"number",label:"For",name:"for",disabled:r||!e.hasDuration,value:b,onChange:D,error:!!c?.message,helperText:c?.message,inputProps:{min:M,max:U},"data-testid":"forTextField",InputLabelProps:{className:r||!e.hasDuration?i.inputLabelDisabled:i.inputLabel}})}),a(n,{item:!0,children:o(T,{children:[a(v,{className:r||!e.hasDuration?i.inputLabelDisabled:i.inputLabel,id:"duration-unit",children:"Unit"}),a(y,{labelId:"duration-unit",disabled:r||!e.hasDuration,value:e.unit,onChange:C,"data-testid":"unitSelect",inputProps:{className:i.unitInput},MenuProps:{classes:{list:i.unitMenu}},children:_.map(t=>a(L,{value:t,children:t},t))})]})})]})]})]})})]})};export{A as CacheConfigComponent};
|
|
2
2
|
//# sourceMappingURL=CacheConfigComponent.esm.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{jsx as e,Fragment as d}from"react/jsx-runtime";import{Content as b}from"@backstage/core-components";import{FormProvider as y}from"react-hook-form";import"../../contexts/TrackFormContext.esm.js";import"../../contexts/CheckFormContext.esm.js";import{useCampaignFormContext as x}from"../../contexts/CampaignFormContext.esm.js";import"react";import"../../contexts/UserProvider.esm.js";import N
|
|
1
|
+
import{jsx as e,Fragment as d}from"react/jsx-runtime";import{Content as b}from"@backstage/core-components";import{FormProvider as y}from"react-hook-form";import"../../contexts/TrackFormContext.esm.js";import"../../contexts/CheckFormContext.esm.js";import{useCampaignFormContext as x}from"../../contexts/CampaignFormContext.esm.js";import"react";import"../../contexts/UserProvider.esm.js";import{useFeatureFlag as N}from"../../hooks/useFeatureFlag.esm.js";import{formStyles as k}from"../../utils/formStyles.esm.js";import{FormFilterSection as M}from"../FormFilterSection/FormFilterSection.esm.js";import{FormStepper as L}from"../FormStepper/FormStepper.esm.js";import{useCampaignForm as V}from"./hooks/useCampaignForm.esm.js";import{CampaignDetailsStep as v}from"./Steps/CampaignDetailsStep/CampaignDetailsStep.esm.js";import{CampaignTrackStepNew as A}from"./Steps/CampaignTrackStepNew.esm.js";import{CampaignMilestonesStep as D}from"./Steps/CampaignMilestonesStep.esm.js";import{StepNameMapping as E}from"./types/CampaignFormTypes.esm.js";import{CAMPAIGN_FIELDS as O}from"./utils/campaignFormUtils.esm.js";var c=(t=>(t.Details="Enter campaign details",t.Checks="Add checks",t.Entities="Choose the affected entities (Optional)",t.Milestones="Set campaign milestones",t))(c||{});const I=({onSave:t,onCancel:f,selectedCampaign:r})=>{const g=k(),{isLoading:i,isReadOnly:S}=x(),{formMethods:o,onSubmit:a}=V(t,r),{getValues:u,control:n,formState:{errors:m},handleSubmit:l,trigger:C}=o,s=u(),F=s.detailsStep.startDate;N("debugMode")&&console.log(s);const p=[{label:"Enter campaign details",content:()=>e(v,{control:n,isLoading:i,disabled:!1,errors:m.detailsStep,startDate:F})},{label:"Add checks",content:()=>e(d,{children:e(A,{})})},{label:"Set campaign milestones",content:()=>e(D,{control:n,isLoading:i,disabled:!1,errors:m.milestonesStep})},{label:"Choose the affected entities (Optional)",content:()=>e(M,{name:"filtersStep.filter",keyValueFilterName:"filtersStep.keyValueFilter",description:O.filter.description,excludeFilterName:"filtersStep.excludeFilter",excludeKeyValueFilterName:"filtersStep.excludeKeyValueFilter"})}],h=r?[...Array(p.length).keys()]:[0];return e(d,{children:e(b,{className:g.formWrapper,children:e(y,{...o,children:e("form",{onSubmit:l(a),children:e(L,{onClose:f,handleSubmit:l,trigger:C,onSubmit:a,initialVisited:h,stepNameMap:E,steps:p,isLoading:i,isReadOnly:S,saveButtonText:"Save Campaign"})})})})})};export{I as CampaignForm,c as CampaignStepLabel};
|
|
2
2
|
//# sourceMappingURL=CampaignForm.esm.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{jsxs as t,jsx as r}from"react/jsx-runtime";import{Box as i,Typography as C}from"@material-ui/core";import{get as x}from"lodash";import{useCallback as l}from"react";import{useFormContext as g,useFieldArray as v}from"react-hook-form";import{CheckSelection as S}from"../../CheckSelection/CheckSelection.esm.js";import{CheckPreview as u}from"../../CheckSelection/CheckPreview.esm.js";import{CheckPreviewProvider as w}from"../../CheckSelection/CheckPreviewContext.esm.js";import{FormFieldLabel as p}from"../../FormFieldLabel/FormFieldLabel.esm.js";const y=()=>{const{control:s,formState:{errors:d},watch:h}=g(),{append:c,remove:m}=v({control:s,name:"tracksStep.checks"}),
|
|
1
|
+
import{jsxs as t,jsx as r}from"react/jsx-runtime";import{Box as i,Typography as C}from"@material-ui/core";import{get as x}from"lodash";import{useCallback as l}from"react";import{useFormContext as g,useFieldArray as v}from"react-hook-form";import{CheckSelection as S}from"../../CheckSelection/CheckSelection.esm.js";import{CheckPreview as u}from"../../CheckSelection/CheckPreview.esm.js";import{CheckPreviewProvider as w}from"../../CheckSelection/CheckPreviewContext.esm.js";import{FormFieldLabel as p}from"../../FormFieldLabel/FormFieldLabel.esm.js";const y=()=>{const{control:s,formState:{errors:d},watch:h}=g(),{append:c,remove:m}=v({control:s,name:"tracksStep.checks"}),a=x(d,"tracksStep.checks"),o=h("tracksStep.checks").map(e=>e.id),k=l(e=>{e&&!o.includes(e.id)&&c({id:e.id,name:e.name??"",description:e.description??""})},[c,o]),f=l(e=>{const n=o.indexOf(e);n>-1&&m(n)},[m,o]);return t(i,{children:[r(C,{variant:"body2",children:"Select relevant checks for your campaign below."}),r(w,{children:t(i,{display:"flex",alignItems:"top",gridGap:16,marginTop:1,maxHeight:"75vh",minHeight:300,children:[t(i,{flex:1,overflow:"auto",children:[r(p,{title:"Checks"}),r(S,{currentSectionCheckIds:o,addCheckToSelection:k,removeCheck:f,error:!!a,helperText:a?.message})]}),t(i,{flex:1,children:[r(p,{title:"Check Preview"}),r(u,{})]})]})})]})};export{y as CampaignTrackStepNew};
|
|
2
2
|
//# sourceMappingURL=CampaignTrackStepNew.esm.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{v4 as S}from"uuid";import{mapInputFilterToFormFilters as
|
|
1
|
+
import{v4 as S}from"uuid";import{mapInputFilterToFormFilters as c,mapCatalogFilterToFormKeyValueFilters as u}from"../../Filter/utils.esm.js";import"../../Filter/FilterComponent.esm.js";import{mapTrackFormToInput as D}from"../../TrackForm/utils/useTrackForm.esm.js";const x=({name:o,ownerEntityRef:i,description:p,targetCompletionDate:s,supportChannel:a,milestones:r,startDate:n,track:t})=>({detailsStep:{name:o,description:p,ownerEntityRef:i,supportChannel:a,startDate:n,targetCompletionDate:s,draft:t.draft??!1},tracksStep:{checks:t?.levels?.[0].checks.map(e=>({id:e.id,name:e.name??e.id,description:e.description}))},filtersStep:{filter:c(t.filter),keyValueFilter:u(t.filter),excludeFilter:c(t.exclude),excludeKeyValueFilter:u(t.exclude)},milestonesStep:{milestones:r.map(e=>({id:Number(e.id),name:e.name,description:e.description??void 0,passRate:e.targetPercent.toString()}))}}),h=(o,i,p)=>{const{tracksStep:{checks:s},detailsStep:{name:a,description:r,ownerEntityRef:n,supportChannel:t,startDate:e,targetCompletionDate:m,draft:f},filtersStep:l,milestonesStep:{milestones:F}}=o,d=D({detailsStep:{name:a,description:r,ownerEntityRef:n,draft:f},levelsStep:{levels:[{name:"Level 1",checks:s,description:""}]},filtersStep:{filter:l.filter,keyValueFilter:l.keyValueFilter,excludeFilter:l.excludeFilter,excludeKeyValueFilter:l.excludeKeyValueFilter}},p??{},i?.track);return{id:i?.id??S(),track:{...d,type:"campaign"},name:a,description:r,ownerEntityRef:n,supportChannel:t,startDate:e,targetCompletionDate:m,milestones:F.map(({id:g,name:k,description:y,passRate:C})=>({id:g,trackId:d.id,name:k,description:y||void 0,targetPercent:parseInt(C,10),targetCompletionDate:m}))}};export{h as mapCampaignFormDataToCampaignInput,x as mapCampaignToFormValues};
|
|
2
2
|
//# sourceMappingURL=utils.esm.js.map
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{emptyFilters as e,emptyKeyValueFilters as t}from"../../Filter/types.esm.js";import{CAMPAIGN_NAME_MAX_LENGTH as
|
|
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.`}};export{l as CAMPAIGN_FIELDS,
|
|
1
|
+
import{DateTime as a}from"luxon";import{emptyFilters as e,emptyKeyValueFilters as t}from"../../Filter/types.esm.js";import{CAMPAIGN_NAME_MAX_LENGTH as i,MILESTONE_NAME_MAX_LENGTH as n}from"./validation.esm.js";const r={detailsStep:{name:"",description:"",ownerEntityRef:"",supportChannel:"",startDate:a.now(),targetCompletionDate:null,draft:!1},tracksStep:{checks:[]},filtersStep:{filter:e(),keyValueFilter:t(),excludeFilter:e(),excludeKeyValueFilter:t()},milestonesStep:{milestones:[{name:"Target",description:"",passRate:"0"}]}},l={details:{name:{name:"Campaign name",helperText:`Max ${i} characters`,placeholder:"Example: Check for latest version of javascript and Readme files"},description:{name:"Campaign description",placeholder:"Example: Check for the latest versions of JavaScript and README files to meet this quarter's quality standards."},owner:{name:"Campaign owner",description:"Add a team as the owner of this Campaign."},support:{name:"Support channel (Optional)",description:"Set up a Slack channel for notifications.",placeholder:"Channel name"},startingDate:{name:"Starting date",placeholder:"Starting date"},endingDate:{name:"Ending date",placeholder:"Ending date"}},milestones:{name:{name:"Milestone name",helperText:`Max ${n} characters`,placeholder:"Example: 80% pass rate"},description:{name:"Milestone description",description:"Provide a detailed description of this milestone, outlining its objectives.",placeholder:"Example: The track in my campaign expects a pass rate of 80% or above"},passrate:{name:"Milestone pass rate",description:"Enter the pass rate that your tracks have to meet.",placeholder:"Example: 80%"}},filter:{description:`Use the filters below to narrow the scope of the Campaign. Only Entities that match the selected include and exclude filters will be monitored. 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.`}};export{l as CAMPAIGN_FIELDS,r as DEFAULT_FORM_VALUES};
|
|
3
3
|
//# sourceMappingURL=campaignFormUtils.esm.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{TrackCheckSchema as o,CampaignDetailsSchema as p}from"@spotify/backstage-plugin-soundcheck-common";import{z as t}from"zod";import{CHECK_IS_REQUIRED_MSG as S,FIELD_IS_REQUIRED_MSG as a,formFiltersSchema as E}from"../../../utils/validation.esm.js";const r=0,i=100,_=100,s=100,c="Ending date must come after the Starting Date",l=t.strictObject({checks:t.array(o.extend({key:t.string().optional()})).min(1,S)}),g=t.strictObject({id:t.number().optional(),name:t.string().min(1,a).max(s,`Input must be less than ${s} characters`),description:t.string().
|
|
1
|
+
import{TrackCheckSchema as o,CampaignDetailsSchema as p}from"@spotify/backstage-plugin-soundcheck-common";import{z as t}from"zod";import{CHECK_IS_REQUIRED_MSG as S,FIELD_IS_REQUIRED_MSG as a,formFiltersSchema as E}from"../../../utils/validation.esm.js";const r=0,i=100,_=100,s=100,c="Ending date must come after the Starting Date",l=t.strictObject({checks:t.array(o.extend({key:t.string().optional()})).min(1,S)}),g=t.strictObject({id:t.number().optional(),name:t.string().min(1,a).max(s,`Input must be less than ${s} characters`),description:t.string().optional(),passRate:t.coerce.number().min(r,`Minimum pass rate is ${r}%`).max(i,`Maximum pass rate is ${i}%`)}),D=t.strictObject({milestones:t.array(g).min(1,a)}),m=t.coerce.string().nullable().refine(e=>e!==null,{message:a}),M=t.strictObject({startDate:m,targetCompletionDate:m}),A=t.strictObject({draft:t.boolean().optional()}),T=({startDate:e,targetCompletionDate:n})=>e&&n?new Date(e)<new Date(n):!0,b=p.merge(M).merge(A),h=e=>e.refine(T,{message:c,path:["targetCompletionDate"]}),I=t.strictObject({detailsStep:h(b),tracksStep:l,filtersStep:E,milestonesStep:D});export{_ as CAMPAIGN_NAME_MAX_LENGTH,c as END_AFTER_START_DATE_MSG,i as MILESTONE_MAX_PASS_RATE,r as MILESTONE_MIN_PASS_RATE,s as MILESTONE_NAME_MAX_LENGTH,m as campaignDateTimeSchema,I as campaignFormSchema};
|
|
2
2
|
//# sourceMappingURL=validation.esm.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{jsx as i,jsxs as
|
|
1
|
+
import{jsx as i,jsxs as o,Fragment as X}from"react/jsx-runtime";import{useRouteRef as Y,useApi as Z,configApiRef as ee}from"@backstage/core-plugin-api";import{EntityRefLink as ie}from"@backstage/plugin-catalog-react";import{usePermission as u}from"@backstage/plugin-permission-react";import{makeStyles as te,Button as ae,Box as n,Typography as N,Divider as oe,Tabs as ne,Tab as y}from"@material-ui/core";import{soundcheckCampaignReadPermission as re,soundcheckCampaignUpdatePermission as se,soundcheckCampaignNotificationsCreatePermission as ce,toEntityFilterQuery as le}from"@spotify/backstage-plugin-soundcheck-common";import{useMemo as s,useState as me,useCallback as pe}from"react";import{useParams as de,useNavigate as ge}from"react-router-dom";import"@backstage/catalog-model";import"@tanstack/react-query";import"../../api.esm.js";import"../../hooks/graphqlKeys.esm.js";import"../../hooks/useSoundcheckAlert.esm.js";import{useGetCampaigns as fe}from"../../hooks/campaigns/useGetCampaigns.esm.js";import"../../hooks/useConfirmationModal.esm.js";import{useCertificationStatus as he}from"../../hooks/aggregations/useCertificationStatus.esm.js";import{useCheckStatuses as ue}from"../../hooks/aggregations/useCheckStatuses.esm.js";import{useLCPReporting as ye}from"../../hooks/useLCPReporting.esm.js";import{campaignEditRouteRef as ke}from"../../routes.esm.js";import{FilterSidebar as Ce}from"../FilterSidebar/FilterSidebar.esm.js";import"../FilterSidebar/StateFilter.esm.js";import{useTrackFilterSidebar as Se}from"../FilterSidebar/useTrackFilterSidebar.esm.js";import{toFilter as be}from"../FilterSidebar/util.esm.js";import{LevelsTable as Te}from"../LevelsTable/LevelsTable.esm.js";import{LoadingIndicator as we}from"../LoadingIndicator/LoadingIndicator.esm.js";import{PageWarningMessage as ve}from"../PageWarningMessage/PageWarningMessage.esm.js";import{SendCampaignNotificationDialog as xe}from"../SendCampaignNotificationDialog/SendCampaignNotificationDialog.esm.js";import"../SoundcheckHeader/SoundcheckHeader.esm.js";import"../SoundcheckHeader/SoundcheckHeaderContext.esm.js";import{useHeader as Ne}from"../SoundcheckHeader/useHeader.esm.js";import{SoundcheckMarkdownContent as Re}from"../SoundcheckMarkdownContent/SoundcheckMarkdownContent.esm.js";import"@backstage/core-components";import"react-markdown";import"rehype-raw";import"remark-gfm";import{TopFailingChecksTable as Fe}from"../TopFailingChecksTable/TopFailingChecksTable.esm.js";import{TrackEntitiesTable as Le}from"../TrackPage/TrackEntitiesTable/TrackEntitiesTable.esm.js";import{CampaignStatusHistoryTile as Be}from"./CampaignStatusHistoryTile.esm.js";import{CampaignStatusTile as Ae}from"./CampaignStatusTile.esm.js";import{DaysRemainingTile as Ee}from"./DaysRemainingTile.esm.js";const De=te(e=>({root:{height:"100%",background:e.palette.background.default,display:"flex",width:"100%",borderTop:`1px solid ${e.palette.divider}`},progressContainer:{flex:1,borderBottom:`1px solid ${e.palette.divider}`,padding:e.spacing(2)},campaignContainerContent:{paddingTop:e.spacing(1),paddingBottom:e.spacing(1),backgroundColor:e.palette.background.paper},editButton:{marginLeft:"auto"},notificationButton:{marginRight:e.spacing(1)},checksContainer:{},entitiesContainer:{marginTop:e.spacing(3)},headerDescription:{fontSize:e.typography.body2.fontSize,margin:e.spacing(.5,0,0),"& p":{margin:0},"& a":{color:"inherit",textDecoration:"underline"}},content:{paddingTop:0,flex:1},ownerLink:{"& span":{color:"inherit","&:hover":{textDecoration:"underline"}}},sectionTitle:{paddingBottom:e.spacing(1)},chartSection:{flex:1,flexBasis:"auto",minWidth:320,display:"flex",flexDirection:"column",height:"100%"},title:{fontWeight:"bold",fontSize:"1.1rem",lineHeight:`${e.typography.h5.fontSize}px`,cursor:"default",marginBottom:e.spacing(2)},divider:{marginTop:e.spacing(1),marginBottom:e.spacing(1)},tabs:{padding:e.spacing(2,2,0,2)},contentArea:{flex:1,padding:e.spacing(0,2)},tableArea:{margin:e.spacing(1,0,2)}})),Ie=()=>{const e=De(),{owners:c,lifecycles:l,types:m,systems:p,stagedLifecycles:R,setStagedLifecycles:F,stagedOwners:L,setStagedOwners:B,stagedTypes:A,setStagedTypes:E,stagedSystems:D,setStagedSystems:I,hasFilterChanges:P,handleApplyFilters:j,handleClearFilters:O}=Se(),d=s(()=>be({lifecycles:l,owners:c,types:m,systems:p}),[l,c,m,p]),[g,z]=me("checks"),H=pe((f,K)=>{z(K)},[]),{campaignId:r}=de();ye({routeName:"soundcheck-campaign-details",additionalAttributes:{campaignId:r??"",owners:c?.join(",")??"",lifecycles:l?.join(",")??"",types:m?.join(",")??"",systems:p?.join(",")??""}});const{data:M,isLoading:h}=fe({ids:[r],first:1}),a=M?.edges?.[0]?.node,t=a?.track,{loading:W,allowed:$}=u({permission:re,resourceRef:r}),{loading:k,allowed:C}=u({permission:se,resourceRef:r}),G=Array.from(new Set(t?.levels.flatMap(f=>f.checks).map(f=>f.id)??[])),{data:S,isLoading:Q}=ue({trackId:t?.id,checkIds:G,filter:d},!!t),b=ge(),T=Y(ke),U=s(()=>t?.ownerEntityRef?i(ie,{color:"inherit",entityRef:t.ownerEntityRef,className:e.ownerLink}):null,[t?.ownerEntityRef,e.ownerLink]),w=Z(ee).getOptionalBoolean("soundcheck.notifications.enabled"),{loading:v,allowed:x}=u({permission:ce}),{data:V}=he({trackId:t?.id??"",filter:d},!!a),q=s(()=>o(X,{children:[w&&!v&&x&&a&&i(xe,{campaign:a,buttonClass:e.notificationButton}),!k&&C&&t?.isEditable?i(ae,{className:e.editButton,variant:"contained",color:"primary",onClick:()=>{b(T({campaignId:r}))},children:"Edit Campaign"}):null]}),[w,v,x,a,e.notificationButton,e.editButton,k,C,t?.isEditable,b,T,r]),J=s(()=>t?.description?i(Re,{className:e.headerDescription,content:t.description}):null,[e.headerDescription,t?.description]);Ne({title:t?.name,description:J,customSubtitle:U,sectionRight:q});const _=s(()=>le(t?.filter),[t]);return o("div",{children:[i(ve,{entityName:"track",entityId:r,showNotFound:!h&&!a,showCannotView:!W&&!$}),h&&i(we,{}),t&&o("div",{className:e.root,children:[i(n,{children:i(Ce,{trackFilter:_,stagedTypes:A,stagedLifecycles:R,stagedOwners:L,stagedSystems:D,onTypesChange:E,onLifecyclesChange:F,onOwnersChange:B,onSystemsChange:I,onApplyFilters:j,onClearFilters:O,hasFilterChanges:P})}),o(n,{className:e.content,children:[i("div",{className:e.progressContainer,children:o(n,{display:"flex",marginTop:2,children:[o(n,{display:"flex",flexDirection:"column",marginRight:3,minWidth:320,children:[i(N,{className:e.title,children:"Current Status"}),i(Ae,{campaign:a,filter:d}),i(oe,{className:e.divider}),i(Ee,{campaign:a})]}),o(n,{className:e.chartSection,children:[i(N,{className:e.title,children:"Historical Status"}),i(Be,{campaign:a,filter:d})]})]})}),i(n,{className:e.tabs,children:o(ne,{value:g,onChange:H,indicatorColor:"primary",textColor:"primary",children:[i(y,{label:"Checks",value:"checks"}),i(y,{label:"Top Failing Checks",value:"topFailingChecks"}),i(y,{label:"Entities",value:"entities"})]})}),o(n,{className:e.contentArea,children:[g==="checks"&&i("div",{className:e.tableArea,children:i(Te,{track:t,checkStatuses:S,isLoading:h||Q,hideLevel:!0})}),g==="entities"&&i(n,{marginTop:1,children:i(Le,{track:t,lifecycles:l,owners:c,types:m,systems:p})}),g==="topFailingChecks"&&i("div",{className:e.tableArea,children:i(Fe,{track:t,checkStatuses:S,certificationStatus:V?.certificationStatus,hideLevel:!0})})]})]})]})]})};export{Ie as CampaignInsightsPage};
|
|
2
2
|
//# sourceMappingURL=CampaignInsightsPage.esm.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{jsx as
|
|
1
|
+
import{jsx as e}from"react/jsx-runtime";import{useTheme as h,Box as m}from"@material-ui/core";import{makeStyles as f}from"@material-ui/core/styles";import{DateTime as n}from"luxon";import{useMemo as u}from"react";import{ResponsiveContainer as g}from"recharts";import"@backstage/catalog-model";import"@backstage/core-plugin-api";import"@tanstack/react-query";import"../../api.esm.js";import"../../hooks/graphqlKeys.esm.js";import"@backstage/plugin-catalog-react";import"@spotify/backstage-plugin-soundcheck-common";import"../../hooks/useSoundcheckAlert.esm.js";import"../../hooks/useConfirmationModal.esm.js";import{useCertificationStatusHistory as y}from"../../hooks/aggregations/useCertificationStatusHistory.esm.js";import"react-router-dom";import{AreaChart as x}from"../AreaChart/AreaChart.esm.js";import{LineChartPlaceholder as S}from"../Charts/LineChart/LineChartPlaceholder.esm.js";const C=f(t=>({card:{display:"flex",flexDirection:"column",width:"100%",height:290},title:{fontWeight:"bold",fontSize:"1.1rem",lineHeight:`${t.typography.h5.fontSize}px`,cursor:"default"},content:{padding:t.spacing(1,2,1,0),width:"100%",height:"100%"}}));function H({campaign:t,filter:p}){const c=h(),r=C(),d=n.fromISO(t.startDate),l=Math.max(Math.ceil(n.now().diff(d,"days").days),1),{data:o}=y({trackId:t.track.id,filter:p,numberOfDays:l},!!t),i=o?.certificationStatusHistory.numberOfEntities??0,a=u(()=>i>0?o?.certificationStatusHistory.history.map(s=>({date:s.date,Passed:Math.round(s.statusByLevel[0].passed/i*100)})):[],[i,o]);return e(g,{height:290,debounce:1,children:e(m,{className:r.card,children:e(m,{className:r.content,children:a?.length?e(x,{data:a,categories:["Passed"],categoryColors:{Passed:c.palette.success.main},index:"date",minValue:0,maxValue:100,showLegend:!1}):e(S,{height:290,text:i>0?"No Historical Data":"No Applicable Entities"})})})})}export{H as CampaignStatusHistoryTile};
|
|
2
2
|
//# sourceMappingURL=CampaignStatusHistoryTile.esm.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{jsx as t,jsxs as s}from"react/jsx-runtime";import{useTheme as
|
|
1
|
+
import{jsx as t,jsxs as s}from"react/jsx-runtime";import{useTheme as S,Box as i,Grid as b,Typography as f}from"@material-ui/core";import{makeStyles as B}from"@material-ui/core/styles";import I from"@material-ui/icons/TrendingDown";import k from"@material-ui/icons/TrendingFlat";import R from"@material-ui/icons/TrendingUp";import{DateTime as N}from"luxon";import{useMemo as T}from"react";import"@backstage/catalog-model";import"@backstage/core-plugin-api";import"@tanstack/react-query";import"../../api.esm.js";import"../../hooks/graphqlKeys.esm.js";import"@backstage/plugin-catalog-react";import"@spotify/backstage-plugin-soundcheck-common";import"../../hooks/useSoundcheckAlert.esm.js";import"../../hooks/useConfirmationModal.esm.js";import{useCertificationStatus as w}from"../../hooks/aggregations/useCertificationStatus.esm.js";import{useCertificationStatusHistory as L}from"../../hooks/aggregations/useCertificationStatusHistory.esm.js";import"react-router-dom";import{compactNumberFormatter as g}from"../../utils/formatters.esm.js";import{CategoryBar as j}from"../CategoryBar/CategoryBar.esm.js";import{LoadingIndicator as M}from"../LoadingIndicator/LoadingIndicator.esm.js";const C=B(e=>({card:{display:"flex",flexDirection:"column"},content:{padding:0,display:"flex",margin:0,gap:e.spacing(1)},item:{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:e.spacing(.5)},legendDash:{width:e.spacing(2),height:e.spacing(1),borderRadius:e.spacing(.375),marginRight:e.spacing(1)},category:{display:"flex",alignItems:"center",flex:1,marginRight:e.spacing(2)}}));function v({label:e,value:l,total:a,color:m,valueFormatter:c}){const p=C();return s(b,{item:!0,xs:12,className:p.item,children:[s(i,{className:p.category,children:[t("span",{className:p.legendDash,style:{backgroundColor:m}}),t(f,{children:e})]}),a&&s(f,{children:[c(l)," of ",c(a)," (",Math.round(l/a*100),"%)"]})]})}function H({campaign:e,filter:l}){const a=S(),m=C(),{data:c,isLoading:p}=w({trackId:e.track.id,filter:l},!0),r=c?.certificationStatus.statusByLevel[0],D=Math.max(Math.ceil(N.now().diff(N.fromISO(e.startDate),"days").days),1),{data:u}=L({trackId:e.track.id,filter:l,numberOfDays:D},!!e),o=c?.certificationStatus.numberOfEntities??0,d=T(()=>{if(o===void 0||u===void 0||r===void 0)return;const x=(u.certificationStatusHistory.history[0]?.statusByLevel[0].passed??0)/o*100;return r.passed/o*100-x},[u,r,o]);let h=k,y="inherit",n;return d&&(n=`${d.toFixed(0)}% since campaign start`,d<=-1?(h=I,n=`-${n}`,y="error"):d>=1&&(h=R,n=`+${n}`,y="primary")),p?t(i,{className:m.card,children:t(M,{})}):t(i,{className:m.card,children:r?t(i,{className:m.content,children:s(i,{width:"100%",children:[t(j,{data:r,valueFormatter:g,categories:["passed","failed","notReported"],categoryFormatter:x=>x.replace(/\b\w/g,F=>F.toUpperCase()),colors:[a.palette.success.main,a.palette.error.main,a.palette.text.disabled]}),t(i,{paddingTop:"12px",children:s(b,{spacing:2,children:[t(v,{label:"Passing",value:r.passed,total:o,color:a.palette.success.main,valueFormatter:g}),t(v,{label:"Failing",value:r.failed,total:o,color:a.palette.error.main,valueFormatter:g}),t(v,{label:"Not Reported",value:r.notReported,total:o,color:a.palette.text.disabled,valueFormatter:g}),!!d&&s(i,{display:"flex",alignItems:"center",paddingTop:"12px",children:[t(h,{color:y}),t(f,{style:{marginLeft:a.spacing(1)},children:n})]})]})})]})}):t(i,{margin:"auto",minHeight:125,display:"flex",flexDirection:"column",justifyContent:"center",children:t(f,{style:{marginBottom:8},variant:"subtitle1",children:"No Data"})})})}export{H as CampaignStatusTile};
|
|
2
2
|
//# sourceMappingURL=CampaignStatusTile.esm.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{jsxs as n,jsx as
|
|
1
|
+
import{jsxs as n,jsx as t}from"react/jsx-runtime";import{Box as d,Typography as i}from"@material-ui/core";import{makeStyles as m}from"@material-ui/core/styles";import{DateTime as r}from"luxon";const p=m(a=>({root:{display:"flex",flexDirection:"column",overflow:"hidden",width:"100%",padding:0,marginTop:a.spacing(.5)},textWrapper:{display:"flex",alignItems:"flex-end",padding:0,marginBottom:a.spacing(.5)},daysRemaining:{margin:0,marginRight:a.spacing(1),lineHeight:"1em"},daysRemainingText:{lineHeight:"1.2em"},divider:{width:"100%"},dateContainer:{display:"flex",flexDirection:"row",justifyContent:"flex-start",width:"100%",flexGrow:0},dateSection:{width:"100%"},dateLabel:{fontSize:a.typography.caption.fontSize,color:a.palette.text.secondary},dateValue:{fontSize:a.typography.subtitle2.fontSize,color:a.palette.text.primary}}));function h({campaign:a}){const e=p(),s=r.fromISO(a.startDate),o=r.fromISO(a.targetCompletionDate),c=r.now(),l=Math.max(Math.ceil(o.diff(c,"days").days),0);return n(d,{className:e.root,children:[n(d,{className:e.textWrapper,children:[t(i,{variant:"h2",className:e.daysRemaining,children:l}),t(i,{variant:"subtitle2",className:e.daysRemainingText,children:l===1?"DAY REMAINING":"DAYS REMAINING"})]}),n("div",{className:e.dateContainer,children:[n("div",{className:e.dateSection,children:[t(i,{variant:"caption",className:e.dateLabel,children:"Start Date"}),t(i,{className:e.dateValue,children:s.toLocaleString({month:"short",day:"numeric"}).toLocaleUpperCase()})]}),n("div",{className:`${e.dateSection}`,children:[t(i,{variant:"caption",className:e.dateLabel,children:"End Date"}),t(i,{className:e.dateValue,children:o.toLocaleString({month:"short",day:"numeric"}).toLocaleUpperCase()})]})]})]})}export{h as DaysRemainingTile};
|
|
2
2
|
//# sourceMappingURL=DaysRemainingTile.esm.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{jsx as a,jsxs as
|
|
1
|
+
import{jsx as a,jsxs as y}from"react/jsx-runtime";import{useRouteRef as M,useApi as X,featureFlagsApiRef as q}from"@backstage/core-plugin-api";import{usePermission as z}from"@backstage/plugin-permission-react";import{makeStyles as J,Grid as i,Button as K}from"@material-ui/core";import{soundcheckCampaignCreatePermission as Q}from"@spotify/backstage-plugin-soundcheck-common";import{useState as t,useEffect as U}from"react";import{useNavigate as V}from"react-router-dom";import Y from"react-use/lib/useDebounce";import{useGetCampaignOwners as Z}from"../../../hooks/campaigns/useGetCampaignOwners.esm.js";import{useGetCampaigns as _}from"../../../hooks/campaigns/useGetCampaigns.esm.js";import{campaignCreateRouteRef as $}from"../../../routes.esm.js";import{FilterDefault as p}from"../../../utils/filters.esm.js";import{EmptyCampaignState as ee}from"../CampaignEmptyState.esm.js";import{EmptyState as ae}from"../../EmptyState/EmptyState.esm.js";import{Pagination as re}from"../../Pagination/Pagination.esm.js";import{SearchFilters as ie}from"../../SearchFilters/SearchFilters.esm.js";import{CampaignsOverviewSkeleton as te}from"./CampaignsOverviewSkeleton.esm.js";import{CampaignSummaryCard as ne}from"./CampaignSummaryCard.esm.js";import se from"./useArchiveConfirmationModal.esm.js";var N=(e=>(e.title="No campaigns found",e.description="No campaigns matched your search. Consider changing search term and filters.",e))(N||{});const oe=J(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)}})),me=({campaignsPerPage:e,currentCursor:x})=>{const n=oe(),[g,d]=t(x),[o,w]=t(""),[h,b]=t(""),[u,B]=t(p.Alpha),[f,A]=t(p.Owner),[C,R]=t(p.Status),{data:F,isLoading:k}=Z();Y(()=>{b(o)},500,[o]);const{loading:O,allowed:L}=z({permission:Q}),{data:m,isLoading:l}=_({ids:void 0,first:e,after:g,orderAlphabetical:u,searchByOwner:f,searchByName:h,searchByStatus:C}),E=V(),G=M($),T=()=>E(G()),c=m?.edges.map(r=>r.node),[P,v]=t([]);U(()=>{d(void 0),v([])},[h]);const S=X(q),j=!S.getRegisteredFlags().find(r=>r.name==="soundcheck-enable-campaigns")||S.isActive("soundcheck-enable-campaigns"),D=!L||!j,I=r=>{B(r.target.value)},H=r=>{A(r.target.value)},W=r=>{R(r.target.value)};if(!l&&!c)return a(ee,{});let s;return l?s=a(te,{}):c?.length?s=c.map(r=>a(i,{xs:12,sm:12,md:6,lg:4,xl:3,item:!0,role:"listitem","aria-label":"result",children:a(se,{children:a(ne,{campaign:r})})},r.id)):s=a(i,{xs:12,item:!0,role:"listitem","aria-label":"result",children:a(ae,{title:"No campaigns found",description:"No campaigns matched your search. Consider changing search term and filters."})}),y(i,{container:!0,direction:"row",className:n.container,children:[y(i,{container:!0,className:n.header,children:[a(ie,{searchPlaceholder:"Search Available Campaigns",isLoading:l||k,searchTerm:o,setSearchTerm:w,filterAlpha:u,handleAlphabeticalFilterChange:I,filterOwner:f,handleOwnerFilterChange:H,filterStatus:C,handleStatusFilterChange:W,owners:F}),a(i,{item:!0,xs:4,className:n.headerButtons,children:!O&&a(K,{disabled:D,variant:"contained",color:"primary",onClick:T,className:n.createButton,children:"Create Campaign"})})]}),a(i,{container:!0,spacing:4,role:"list","aria-label":"campaigns",children:s}),(m?.pageInfo.hasNextPage||P?.length>0)&&a(i,{item:!0,xs:12,children:a(re,{response:m,listingsPerPage:e,cursor:g,setCursor:d,prevCursors:P,setPrevCursors:v,labelPerPageDropdown:"Campaigns Per Page:",urlRoute:"campaigns?campaignsPerPage="})})]})};export{me as CampaignListPage,N as CampaignNoResults};
|
|
2
2
|
//# sourceMappingURL=CampaignListPage.esm.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{jsx as r}from"react/jsx-runtime";import{useSearchParams as t}from"react-router-dom";import"../../contexts/TrackFormContext.esm.js";import"../../contexts/CheckFormContext.esm.js";import{CampaignFormProvider as e}from"../../contexts/CampaignFormContext.esm.js";import"react";import"../../contexts/UserProvider.esm.js";import{
|
|
1
|
+
import{jsx as r}from"react/jsx-runtime";import{useSearchParams as t}from"react-router-dom";import"../../contexts/TrackFormContext.esm.js";import"../../contexts/CheckFormContext.esm.js";import{CampaignFormProvider as e}from"../../contexts/CampaignFormContext.esm.js";import"react";import"../../contexts/UserProvider.esm.js";import{useLCPReporting as a}from"../../hooks/useLCPReporting.esm.js";import{RESULTS_PER_PAGE as p}from"../../utils/filters.esm.js";import"../SoundcheckHeader/SoundcheckHeader.esm.js";import"../SoundcheckHeader/SoundcheckHeaderContext.esm.js";import{useSetHeaderDefault as n}from"../SoundcheckHeader/useHeader.esm.js";import{CampaignListPage as s}from"./CampaignListPage/CampaignListPage.esm.js";import"./CampaignListPage/CampaignTypes.esm.js";const g=()=>{const[o]=t(),i=o.get("campaignsPerPage"),m=i?parseInt(i,10):p;return n(),a({routeName:"soundcheck-campaigns",additionalAttributes:{campaignsPerPage:m.toString()}}),r(e,{children:r("div",{children:r(s,{campaignsPerPage:m})})})};export{g as CampaignsPage};
|
|
2
2
|
//# sourceMappingURL=CampaignsPage.esm.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{jsxs as
|
|
1
|
+
import{jsxs as w,jsx as s}from"react/jsx-runtime";import{Typography as N,useTheme as U,Tooltip as M}from"@material-ui/core";import{makeStyles as q,createStyles as G}from"@material-ui/core/styles";import{schemeCategory10 as H}from"d3-scale-chromatic";import $ from"lodash";import{memo as L,useRef as J,useState as X,useEffect as K,useMemo as C}from"react";const P=e=>{let r=e;for(;r;){const t=window.getComputedStyle(r).backgroundColor;if(t&&t!=="rgba(0, 0, 0, 0)"&&t!=="transparent")return t;r=r.parentElement}return"transparent"},O=(e,r,t,c,l)=>{if($.isUndefined(e))return"";if(e===0){for(let a=0;a<r.length;a++)if(r[a]>0)return l?.[t[a]]??c[a]}let p=0;for(let a=0;a<r.length;a++)if(p+=r[a],p>=e)return l?.[t[a]]??c[a];return l?.[t[r.length-1]]??c[r.length-1]},j=(e,r)=>e?e/r*100:0,Q=(e,r=2)=>{if(e.length===0)return[];const t=e.filter(i=>i>0),c=$.sum(t);if(c===0)return e.map(()=>0);const l=e.map(i=>i>0?i/c*100:0),p=l.filter(i=>i>0&&i<r).length,a=p*r;if(p===0||a>=100)return l;const o=100-a,m=l.filter(i=>i>=r).reduce((i,d)=>i+d,0);return l.map(i=>i===0?0:i<r?r:m>0?i/m*o:i)},z=q(e=>G({container:{display:"flex",flexDirection:"column",width:"100%"},barWrapper:{position:"relative",width:"100%"},barContainer:{display:"flex",height:e.spacing(1),overflow:"hidden",borderRadius:4,width:"100%",gap:1},barSegment:{height:"100%",minWidth:8},barLabel:{position:"absolute",fontSize:"0.875rem",whiteSpace:"nowrap",transform:"translateX(-50%)"},marker:{position:"absolute",width:6,height:16,top:0,bottom:0,borderRadius:4,transform:"translate(-50%, -25%)"},tooltip:{color:e.palette.text.primary,fontSize:12,borderRadius:e.shape.borderRadius,padding:e.spacing(1)},item:{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:e.spacing(.5)},legendDash:{width:e.spacing(2),height:e.spacing(.75),borderRadius:e.spacing(.375),marginRight:e.spacing(1)},category:{display:"flex",alignItems:"center",flex:1,fontSize:"0.875rem",marginRight:e.spacing(2)},value:{fontWeight:e.typography.fontWeightMedium,fontSize:"0.875rem",color:e.palette.text.primary}})),D=L(({data:e,categories:r,valueFormatter:t,type:c,labelPosition:l})=>{const p=z(),a=r.map(d=>e[d]),o=$.sum(a);let m=0,i=0;return w("div",{className:p.barWrapper,children:[a.map((d,x)=>{m+=d;const y=(d>=.1*o||i>=.09*o)&&o-m>=.1*o&&m>=.1*o&&m<.9*o;i=y?0:i+=d;const g=j(m,o),k=c==="percent"?`${Math.round(m/o*100)}%`:t(m);return s("div",{className:p.barLabel,style:{left:`${g}%`,top:l==="top"?"-1.5rem":"1.5rem"},children:y&&s(N,{variant:"caption",children:k})},`item-${x}`)}),s(N,{variant:"caption",style:{position:"absolute",bottom:0,left:0},children:c==="percent"?"0%":t(0)}),s(N,{variant:"caption",style:{position:"absolute",bottom:0,right:0},children:c==="percent"?"100%":t(o)})]})}),V=L(e=>{const r=U(),t=z(),{data:c={},categories:l=[],colors:p=H,categoryColors:a,marker:o,showLabels:m=!1,showTooltip:i=!0,valueFormatter:d=n=>n.toString(),categoryFormatter:x=n=>n,type:y="value",labelPosition:g="top",className:k,...E}=e,f=l.map(n=>c[n]).filter(n=>typeof n=="number"),S=J(null),[T,B]=X("transparent");K(()=>{if(S.current){const n=P(S.current);B(n)}},[S]);const A=C(()=>O(o?.value,f,l,p,a),[o,f,l,p,a]),h=C(()=>$.sum(f),[f]),W=C(()=>Q(f),[f]),F=C(()=>{if(!$.isUndefined(o))return o.value<0?0:o.value>h?h:o.value},[o,h]),I=C(()=>j(F,h),[F,h]);return h<=0?null:s("div",{ref:S,className:`${k} ${t.container}`,...E,children:w("div",{className:t.barWrapper,children:[m&&g==="top"&&s(D,{data:c,categories:l,valueFormatter:d,type:y,labelPosition:g}),s("div",{className:t.barContainer,children:i?s(M,{title:s("div",{className:t.tooltip,children:l.filter(n=>c[n]>0).map((n,u)=>{const b=c[n],v=a?.[n]??p[u]??"gray";return w("div",{className:t.item,children:[w("div",{className:t.category,children:[s("span",{className:t.legendDash,style:{backgroundColor:v}}),s(N,{variant:"caption",children:x(n)})]}),s("div",{className:t.value,children:w(N,{variant:"caption",children:[d(b)," of ",d(h)," ","(",Math.round(b/h*100),"%)"]})})]},`tooltip-item-${u}`)})}),placement:"top",arrow:!0,classes:{tooltip:t.tooltip},children:s("div",{className:t.barContainer,children:l.map((n,u)=>{const b=c[n],v=a?.[n]??p[u]??"gray",R=W[u]||0;return b<=0?null:s("div",{className:t.barSegment,style:{backgroundColor:v,width:`${R}%`}},`item-${u}`)})})}):s("div",{className:t.barContainer,children:l.map((n,u)=>{const b=c[n],v=a?.[n]??p[u]??r.palette.text.disabled,R=W[u]||0;return b<=0?null:s("div",{className:t.barSegment,style:{backgroundColor:v,width:`${R}%`}},`item-${u}`)})})}),o!==void 0&&s(M,{title:o.tooltip||"",arrow:!0,children:s("div",{className:t.marker,style:{left:`${I}%`,backgroundColor:A,border:`1px solid ${T}`,transition:o.showAnimation?"all 0.3s ease-in-out":"none"}})}),m&&g==="bottom"&&s(D,{data:c,categories:l,valueFormatter:d,type:y,labelPosition:g})]})})});export{V as CategoryBar,P as getEffectiveBackgroundColor};
|
|
2
2
|
//# sourceMappingURL=CategoryBar.esm.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{jsxs as C,jsx as e,Fragment as
|
|
1
|
+
import{jsxs as C,jsx as e,Fragment as N}from"react/jsx-runtime";import{stringifyEntityRef as p}from"@backstage/catalog-model";import{useEntity as v}from"@backstage/plugin-catalog-react";import{makeStyles as E,Box as $,Typography as I,Tooltip as R,IconButton as S,CircularProgress as T}from"@material-ui/core";import z from"@material-ui/icons/Refresh";import A from"classnames";import{Link as L}from"react-router-dom";import{ResultState as h}from"../../graphql/generated/index.esm.js";import"@backstage/core-plugin-api";import"@tanstack/react-query";import"../../api.esm.js";import"../../hooks/graphqlKeys.esm.js";import"@spotify/backstage-plugin-soundcheck-common";import"react";import"../../hooks/useSoundcheckAlert.esm.js";import{useGetExemption as j}from"../../hooks/exemptions/useGetExemption.esm.js";import"../../hooks/useConfirmationModal.esm.js";import{useExecuteCheck as w}from"../../hooks/checks/useExecuteCheck.esm.js";import{CheckIcon as B}from"../CheckIcon/CheckIcon.esm.js";import{RelativeTime as F}from"../RelativeTime/RelativeTime.esm.js";const d=E(t=>({root:{display:"flex",width:"100%",gridTemplateColumns:"auto 1fr auto auto auto auto",gridColumnGap:t.spacing(.5),padding:t.spacing(1),alignItems:"center","&.selected":{backgroundColor:t.palette.action.hover},"&:hover, &:active, &:focus":{backgroundColor:t.palette.action.hover}},checkIcon:{height:20}})),G=({className:t,href:r,name:o,children:c})=>r?e(L,{"aria-label":`select check ${o}`,to:r,className:t,children:c}):e("div",{className:t,children:c}),P=({result:t,name:r,id:o,timestamp:c,isExecutable:l=!1,selected:u=!1,href:f})=>{const s=d(),k=A(s.root,{selected:u}),{entity:a}=v(),{mutateAsync:y,isLoading:n}=w(),{data:m}=j(p(a),o),x=async()=>{if(!(!a||!o))try{await y({checkerId:o,entityRef:p(a),shouldRefreshFacts:!0})}catch{}},g=!a||!o||!l||n||!!m?.exemption||t===h.NotApplicable,b=()=>{const i="Cannot execute check";return a?o?l?n?`${i} - check is already executing.`:m?.exemption?`${i} - entity has been exempted from this check.`:t===h.NotApplicable?`${i} - check is not applicable to entity.`:"Execute Check":`${i} - check is not executable by Soundcheck`:`${i} - no check id.`:`${i} - no entity.`};return C(G,{href:f,className:k,name:r,children:[e(B,{className:s.checkIcon,result:t}),e($,{flex:1,children:e(I,{variant:"body2",children:r})}),c&&!n?e(F,{timestamp:c}):null,!n&&e(N,{children:e(R,{title:b(),children:e("span",{children:e(S,{size:"small",color:"inherit",onClick:x,disabled:g,"aria-label":"Execute Check",children:e(z,{fontSize:"small"})})})})}),n&&e(T,{color:"inherit",size:"1em"})]})};export{P as Check,d as useStyles};
|
|
2
2
|
//# sourceMappingURL=Check.esm.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{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
|
|
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 C 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 q}from"../../routes.esm.js";import{CertificationTab as F}from"./CertificationTab.esm.js";import{PlaylistCertificationTab as G}from"./PlaylistCertificationTab.esm.js";import{CertificationTabsSkeleton as H}from"./skeletons/CertificationTabsSkeleton.esm.js";function J(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 K=v(r=>({tabsContainer:{display:"flex",alignItems:"center"},tabs:{flex:1},settingsButton:{display:"flex",alignItems:"center",marginRight:r.spacing(1)}})),V=({playlistId:r,trackId:a,onSettingsChange:c})=>{const l=K(),[e,o]=O(null),[s,y]=C("soundcheck.certifications.showNotApplicable",!1),[m,x]=C("soundcheck.certifications.showExempt",!0),[f,I]=C("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:g}=P(),{isLoading:T,data:p}=U(g,!1,f),{isLoading:R,data:d}=X(g),z=b(Y),A=b(q);if(R||T||!a)return i(H,{});const E=J(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(G,{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(F,{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{V as CertificationTabs};
|
|
2
2
|
//# sourceMappingURL=CertificationTabs.esm.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{jsxs as l,jsx as o}from"react/jsx-runtime";import{Progress as
|
|
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};
|
|
2
2
|
//# sourceMappingURL=FixMeDialog.esm.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{jsxs as i,jsx as e}from"react/jsx-runtime";import{makeStyles as m,Box as a,ButtonGroup as g,Button as b,Menu as h,MenuItem as l}from"@material-ui/core";import x from"@material-ui/icons/ArrowDropDown";import{useState as
|
|
1
|
+
import{jsxs as i,jsx as e}from"react/jsx-runtime";import{makeStyles as m,Box as a,ButtonGroup as g,Button as b,Menu as h,MenuItem as l}from"@material-ui/core";import x from"@material-ui/icons/ArrowDropDown";import{useState as C}from"react";const A=m(d=>({label:{padding:d.spacing(0,1.5,0,0)},icon:{borderLeft:`1px solid ${d.palette.divider}`,display:"flex",alignItems:"center",padding:0},menu:{margin:0,backgroundColor:d.palette.background.paper},button:{padding:d.spacing(.5,1.5),paddingRight:d.spacing(.5)}})),f=({onAddCondition:d,onAddExpression:p})=>{const n=A(),[r,s]=C(null),o=!!r,c=u=>{s(u.currentTarget)},t=()=>{s(null)};return i(a,{children:[e(g,{color:"primary",children:i(b,{className:n.button,"data-testid":"add-button",id:"add-button","aria-controls":o?"add-menu":void 0,"aria-haspopup":"true","aria-expanded":o?"true":void 0,onClick:c,size:"medium",children:[e(a,{className:n.label,children:"Add"}),e(a,{className:n.icon,children:e(x,{})})]})}),i(h,{id:"add-menu",anchorEl:r,open:o,onClose:t,classes:{paper:n.menu},MenuListProps:{"aria-labelledby":"add-button"},children:[e(l,{"data-testid":"add-condition",onClick:()=>{d(),t()},children:"Add Condition"}),e(l,{"data-testid":"add-expression",onClick:()=>{p(),t()},children:"Add Expression"})]})]})};export{f as AddMenuButton};
|
|
2
2
|
//# sourceMappingURL=AddMenuButton.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:
|
|
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:y})=>{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]),C=b(e=>{s(`${l}.value`,e.length>0?e:""),h()},[h,l,s]),i=m(`${l}.value`),$=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(x=>o===x.value)?.label??o??"")(e),getOptionValue:e=>(o=>f?.find(x=>o===x.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:$}):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:$,size:"small",children:a(k,{})}),startAdornment:Array.isArray(i)?a(O,{values:i,onSave:C,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:C})]})]})]})]}),a(A,{onClick:w,className:t.deleteButton,"data-testid":`${l}-delete-button`,disabled:d||y,hidden:d||y,style:{visibility:d||y?"hidden":void 0},children:a(E,{className:t.deleteIcon})})]})};export{Q as RuleConditionInput};
|
|
2
2
|
//# sourceMappingURL=RuleConditionInput.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 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.
|
|
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{
|
|
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.Days,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.Days,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()}},D={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{D 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{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),
|
|
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),y=l(o=>({root:{color:o.palette.text.primary}}))(T),D=l(o=>({root:{color:o.palette.text.disabled}}))(m),E=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(y,{...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(D,{...i}),tooltip:e}):o===n.Exempt?t(r,{icon:t(E,{...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
|
|
1
|
+
import{jsx as f}from"react/jsx-runtime";import{stringifyEntityRef as v}from"@backstage/catalog-model";import{Table as x}from"@backstage/core-components";import{makeStyles as z}from"@material-ui/core";import L from"lodash";import{useState as B,useEffect as T,useCallback as m}from"react";import{CheckEntityField as r,Direction as g}from"../../../graphql/generated/index.esm.js";import{useEntitiesByRefs as N}from"../../../hooks/catalog/useEntitiesByRefs.esm.js";import{useCheckEntities as D}from"../../../hooks/entities/useCheckEntities.esm.js";import{toResultState as u}from"../utils.esm.js";import{columnFactories as n}from"./columns.esm.js";import{toCheckEntityRow as O}from"./utils.esm.js";const P=10,F=["kind","metadata.name","metadata.namespace","spec.profile.displayName","metadata.title","relations","spec.lifecycle","spec.type"],A=(s,c)=>[n.createStateColumn(),n.createNameColumn({trackId:s,checkId:c}),n.createSystemColumn(),n.createOwnerColumn(),n.createSpecTypeColumn(),n.createSpecLifecycleColumn()],j=[r.State,r.Name,r.System,r.Owner,r.Type,r.Lifecycle],Q=z({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"}}}}),W=({checkId:s,trackId:c,filter:p,states:l})=>{const h=Q(),y=A(c,s),[e,d]=B({orderBy:void 0,filter:p,states:l?.map(u).filter(t=>t!==void 0),pageInfo:{page:0,pageSize:P,direction:"forward",cursor:null}});T(()=>{d(t=>({...t,pageInfo:{...t.pageInfo,page:0,cursor:null},filter:p,states:l?.map(u).filter(i=>i!==void 0)}))},[p,l]);const{data:a,isLoading:I}=D({checkId:s,trackId:c,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}),k=m((t,i)=>{let o;t===-1?o=void 0:o={field:j[t],direction:i==="asc"?g.Asc:g.Desc},d({...e,orderBy:o,pageInfo:{...e.pageInfo,page:0,cursor:null}})},[e]),C=m((t,i)=>{const o=t>e.pageInfo.page?"forward":"backward",R=o==="forward"?a?.checkEntities.pageInfo.endCursor??null:a?.checkEntities.pageInfo.startCursor??null;d({...e,pageInfo:{page:t,pageSize:i,direction:o,cursor:R}})},[a,e]),S=a?.checkEntities.edges.map(t=>t.node.entityRef)??[],{data:w,isLoading:b}=N({entityRefs:S,fields:F}),E=L.compact(a?.checkEntities.edges.map(t=>{const i=w?.items.find(o=>!!o&&v(o)===t.node.entityRef);return i?O({checkDetails:t.node,entity:i}):void 0}))??[];return f("div",{className:h.tableContainer,children:f(x,{title:"Entities",style:{width:"100%",border:"none",margin:0},columns:y,data:E,options:{paging:!0,showFirstLastPageButtons:!1,paginationPosition:"bottom",emptyRowsWhenPaging:!0,pageSizeOptions:[10,25,50],pageSize:e.pageInfo.pageSize,search:!1,showTitle:!0,padding:"dense"},onOrderChange:k,onPageChange:C,page:e.pageInfo.page,totalCount:a?.checkEntities.totalCount??0,isLoading:I||b,components:{Toolbar:()=>null}})})};export{W as CheckEntitiesTable};
|
|
2
2
|
//# sourceMappingURL=CheckEntitiesTable.esm.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{jsx as r,Fragment as o}from"react/jsx-runtime";import{OverflowTooltip as
|
|
1
|
+
import{jsx as r,Fragment as o}from"react/jsx-runtime";import{OverflowTooltip as c}from"@backstage/core-components";import{EntityRefLink as m,EntityRefLinks as s}from"@backstage/plugin-catalog-react";import{makeStyles as u,Chip as d}from"@material-ui/core";import{CheckIcon as p}from"../../CheckIcon/CheckIcon.esm.js";import{SoundcheckEntityLink as y}from"../../SoundcheckEntityLink/SoundcheckEntityLink.esm.js";const l=u(()=>({linkHover:{"& span":{"&:hover":{textDecoration:"underline"}}}})),f=Object.freeze({createStateColumn(){return{title:"",field:"state",render:({state:t})=>r(p,{result:t}),width:"auto",align:"center",sorting:!1}},createNameColumn(t){return{title:"Name",field:"resolved.entityRef",highlight:!0,customSort(e,n){return 0},render:({entity:e})=>{const n=l();return t?.checkId||t?.trackId?r(y,{entity:e,trackId:t.trackId,checkId:t.checkId,className:n.linkHover}):r(m,{entityRef:e,defaultKind:t?.defaultKind||"Component",className:n.linkHover})}}},createSystemColumn(){return{title:"System",field:"resolved.partOfSystemRelationTitle",customSort(t,e){return 0},render:({resolved:t})=>{const e=l();return r(s,{entityRefs:t.partOfSystemRelations,defaultKind:"system",className:e.linkHover})}}},createOwnerColumn(){return{title:"Owner",field:"resolved.ownedByRelationsTitle",customSort(t,e){return 0},render:({resolved:t})=>{const e=l();return r(s,{entityRefs:t.ownedByRelations,defaultKind:"group",className:e.linkHover})}}},createSpecTypeColumn(){return{title:"Type",field:"entity.spec.type",customSort(t,e){return 0}}},createSpecLifecycleColumn(){return{title:"Lifecycle",field:"entity.spec.lifecycle",customSort(t,e){return 0},width:"auto"}},createMetadataDescriptionColumn(){return{title:"Description",field:"entity.metadata.description",customSort(t,e){return 0},render:({entity:t})=>r(c,{text:t.metadata.description,placement:"bottom-start"}),width:"auto"}},createTagsColumn(){return{title:"Tags",field:"entity.metadata.tags",cellStyle:{padding:"0px 16px 0px 20px"},render:({entity:t})=>r(o,{children:t.metadata.tags&&t.metadata.tags.map(e=>r(d,{label:e,size:"small",variant:"outlined",style:{marginBottom:"0px"}},e))}),width:"auto",sorting:!1}},createTitleColumn(t){return{title:"Title",field:"entity.metadata.title",customSort(e,n){return 0},hidden:t?.hidden,searchable:!0}},createLabelColumn(t,e){return{title:e?.title||"Label",field:"entity.metadata.labels",customSort(n,a){return 0},cellStyle:{padding:"0px 16px 0px 20px"},render:({entity:n})=>{const a=n.metadata?.labels,i=a&&a[t]||e?.defaultValue;return r(o,{children:i&&r(d,{label:i,size:"small",variant:"outlined"},i)})},width:"auto",sorting:!1}},createNamespaceColumn(){return{title:"Namespace",field:"entity.metadata.namespace",customSort(t,e){return 0},width:"auto"}}});export{f as columnFactories};
|
|
2
2
|
//# sourceMappingURL=columns.esm.js.map
|