@spotify/backstage-plugin-soundcheck 0.21.0 → 0.22.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 (68) hide show
  1. package/CHANGELOG.md +31 -0
  2. package/dist/alpha/integrations.esm.js +1 -1
  3. package/dist/alpha/pages.esm.js +1 -1
  4. package/dist/alpha.d.ts +68 -23
  5. package/dist/api.esm.js +1 -1
  6. package/dist/blueprints/CampaignActionBlueprint.esm.js +2 -0
  7. package/dist/blueprints/IntegrationPageBlueprint.esm.js +1 -1
  8. package/dist/components/AccordionSection/AccordionSection.esm.js +2 -0
  9. package/dist/components/Alert/Alert.esm.js +1 -1
  10. package/dist/components/CampaignPage/CampaignActionsContext.esm.js +2 -0
  11. package/dist/components/CertificationSidebar/Check.esm.js +1 -1
  12. package/dist/components/CheckPage/CheckEntitiesTable/CheckEntitiesTableBUI.esm.js +1 -1
  13. package/dist/components/CheckTemplatesPage/CheckTemplatesPageBUI.esm.js +1 -1
  14. package/dist/components/CheckTemplatesPage/TemplateCategoryBUI.esm.js +1 -1
  15. package/dist/components/ChecksPage/ChecksListPageBUI.esm.js +1 -1
  16. package/dist/components/CollectorPage/Configurators/Configurator.esm.js +1 -1
  17. package/dist/components/CollectorPage/Configurators/SonarQube/utils.esm.js +1 -1
  18. package/dist/components/CollectorsPage/IntegrationLogoBUI.esm.js +1 -1
  19. package/dist/components/CollectorsPage/IntegrationsListPageBUI.esm.js +1 -1
  20. package/dist/components/CreateNewTrackPage/CreateNewTrackPage.esm.js +2 -0
  21. package/dist/components/EmptyState/EmptyStateNoTracks.esm.js +1 -1
  22. package/dist/components/FactExplorer/FactExplorer.esm.js +1 -1
  23. package/dist/components/FilterSidebar/useTrackFilterSidebar.esm.js +1 -1
  24. package/dist/components/FilterSidebar/util.esm.js +1 -1
  25. package/dist/components/FormControlledAutocomplete/FormControlledAutocomplete.esm.js +1 -1
  26. package/dist/components/GroupSelectorBUI/GroupSelectorBUI.esm.js +1 -1
  27. package/dist/components/HierarchicalTechInsightsPage/visualizations/hierarchyToNivo.esm.js +1 -1
  28. package/dist/components/Menus/useCampaignActions.esm.js +1 -1
  29. package/dist/components/RoutingPage/RoutingPageBUI.esm.js +1 -1
  30. package/dist/components/SoundcheckHeader/SoundcheckHeaderBUI.esm.js +1 -1
  31. package/dist/components/SoundcheckMarkdownContent/SoundcheckMarkdownContentBUI.esm.js +1 -1
  32. package/dist/components/Stepper/Stepper.esm.js +1 -1
  33. package/dist/components/TableRowWithOwner/TableRowWithOwner.esm.js +1 -1
  34. package/dist/components/TechInsights/TechInsightsPageBUI.esm.js +1 -1
  35. package/dist/components/TechInsightsExplorerTable/TechInsightsExplorerTable.esm.js +1 -1
  36. package/dist/components/TimePeriodBar/TimePeriodBarBUI.esm.js +1 -1
  37. package/dist/components/TopAndBottomPerformingTeams/TopAndBottomPerformingTeams.esm.js +1 -1
  38. package/dist/components/TrackBuilderPage/TrackBuilderPage.esm.js +1 -1
  39. package/dist/components/TrackBuilderPage/components/CheckItem/CheckItem.esm.js +2 -0
  40. package/dist/components/TrackBuilderPage/components/IntegrationTags/IntegrationTags.esm.js +2 -0
  41. package/dist/components/TrackBuilderPage/components/RunChecksStep/RunChecksStep.esm.js +2 -0
  42. package/dist/components/TrackBuilderPage/components/SelectProviderStep/SelectProviderStep.esm.js +2 -0
  43. package/dist/components/TrackBuilderPage/components/SelectTracksStep/SelectTracksStep.esm.js +2 -0
  44. package/dist/components/TrackBuilderPage/components/TrackAccordion/TrackAccordion.esm.js +2 -0
  45. package/dist/components/TrackBuilderPage/components/TrackBuilderStatus/TrackBuilderStatus.esm.js +2 -0
  46. package/dist/components/TrackBuilderPage/hooks/useTrackBuilderStatus.esm.js +2 -0
  47. package/dist/components/TrackBuilderPage/hooks/useTrackCheckExecutions.esm.js +2 -0
  48. package/dist/components/TrackBuilderPage/utils.esm.js +4 -0
  49. package/dist/components/TrackPage/TrackEntitiesTable/TrackEntitiesTableBUI.esm.js +1 -1
  50. package/dist/components/TrackPage/TrackHistoryChartBUI.esm.js +1 -1
  51. package/dist/components/TrackPage/TrackPageBUI.esm.js +1 -1
  52. package/dist/components/TrackPage/TrackTechInsightsExplorerPage.esm.js +1 -1
  53. package/dist/components/TracksPage/TracksListPageBUI.esm.js +1 -1
  54. package/dist/graphql/generated/index.esm.js +168 -85
  55. package/dist/hooks/catalog/useGetEntityRefs.esm.js +1 -1
  56. package/dist/hooks/graphqlKeys.esm.js +1 -1
  57. package/dist/hooks/tracks/useDeleteTrack.esm.js +1 -1
  58. package/dist/hooks/tracks/useOutOfBoxTracks.esm.js +2 -0
  59. package/dist/hooks/tracks/useSaveOutOfBoxTracks.esm.js +2 -0
  60. package/dist/hooks/tracks/useTracksApplicableToGroup.esm.js +1 -1
  61. package/dist/index.d.ts +30 -2
  62. package/dist/index.esm.js +1 -1
  63. package/dist/routes.esm.js +1 -1
  64. package/package.json +24 -24
  65. package/dist/components/Badge/Badge.esm.js +0 -2
  66. package/dist/components/TrackBuilderPage/RunFirstCheckStep.esm.js +0 -2
  67. package/dist/components/TrackBuilderPage/SelectTracksStep.esm.js +0 -2
  68. package/dist/components/TrackBuilderPage/mockData.esm.js +0 -2
@@ -1,2 +1,2 @@
1
- import{useApi as t,alertApiRef as s}from"@backstage/core-plugin-api";import{catalogApiRef as n}from"@backstage/plugin-catalog-react";import{useQuery as m}from"@tanstack/react-query";import{QueryKeys as f}from"../graphqlKeys.esm.js";const p=(e,i,r=!0)=>{const a=t(s),o=t(n);return m([f.GetEntityRefs,e],async()=>o.getEntities({filter:e,limit:i,fields:["kind","metadata.name","metadata.description","metadata.namespace"]}),{enabled:r,refetchOnWindowFocus:!1,onError:()=>{a.post({message:"Failed to load entities",severity:"error"})}})};export{p as useGetEntityRefs};
1
+ import{useApi as t,alertApiRef as s}from"@backstage/core-plugin-api";import{catalogApiRef as n}from"@backstage/plugin-catalog-react";import{useQuery as m}from"@tanstack/react-query";import{QueryKeys as f}from"../graphqlKeys.esm.js";const p=(e,i,r=!0)=>{const o=t(s),a=t(n);return m([f.GetEntityRefs,e],async()=>a.getEntities({filter:e,limit:i,fields:["kind","metadata.name","metadata.description","metadata.namespace"]}),{enabled:r,refetchOnWindowFocus:!1,onError:()=>{o.post({message:"Failed to load entities",severity:"error"})}})};export{p as useGetEntityRefs};
2
2
  //# sourceMappingURL=useGetEntityRefs.esm.js.map
@@ -1,2 +1,2 @@
1
- var t=(e=>(e.GetTrack="soundcheck/track",e.GetAllTracks="soundcheck/tracks",e.GetTracksApplicableEntityCount="soundcheck/tracks/applicableEntities",e.GetChecks="soundcheck/checks",e.GetCollectors="soundcheck/collectors",e.GetFactSchema="soundcheck/collectors/schema",e.GetEntityFacets="soundcheck/catalog/facets",e.GetSoftwareEntityRefsForUser="soundcheck/entities/softwareEntityRefsForUser",e.GetEntityRefs="soundcheck/catalog/entityRefs",e.ExecutableChecks="soundcheck/executableChecks",e.GetCampaigns="soundcheck/campaigns",e.GetOverallCheckPassRateTrends="soundcheck/charts/overallCheckPassRateTrends",e.GetIndividualCheckPassRateTrends="soundcheck/charts/getIndividualCheckPassRateTrends",e.GetOverallTrackPassRateTrends="soundcheck/charts/overallTrackPassRateTrends",e.GetIndividualTrackPassRateTrends="soundcheck/charts/individualTrackPassRateTrends",e.GetOverallEntityPassRateTrends="soundcheck/charts/overallEntityPassRateTrends",e.GetIndividualEntityPassRateTrends="soundcheck/charts/individualEntityPassRateTrends",e.GetOverallGroupPassRateTrends="soundcheck/charts/overallGroupPassRateTrends",e.GetIndividualGroupPassRateTrends="soundcheck/charts/individualGroupPassRateTrends",e.EntityByRef="soundcheck/catalog/entityByRef",e.EntitiesByRefs="soundcheck/catalog/entitiesByRef",e.TrackEntities="soundcheck/track/entities",e.CheckEntities="soundcheck/check/entities",e.CertificationStatus="soundcheck/certificationStatus",e.CertificationStatuses="soundcheck/certificationStatuses",e.MultipleTrackStatuses="soundcheck/multipleTrackStatuses",e.CertificationStatusHistory="soundcheck/certificationStatusHistory",e.CertificationStatusHistories="soundcheck/certificationStatusHistories",e.CheckStatus="soundcheck/checkStatus",e.CheckStatuses="soundcheck/checkStatuses",e.SavedViews="soundcheck/savedViews",e.CheckStatusHistory="soundcheck/checkStatusHistory",e.CheckStatusHistories="soundcheck/checkStatusHistories",e.CheckStatusHistoriesMultiFilter="soundcheck/checkStatusHistoriesMultiFilter",e.TrackStatusHistory="soundcheck/trackStatusHistory",e.TrackStatusHistories="soundcheck/trackStatusHistories",e.Check="soundcheck/check",e.CheckDetails="soundcheck/checkDetails",e.Certifications="soundcheck/certifications",e.CertificationDetails="soundcheck/certificationDetails",e.GetCheckOwners="soundcheck/checks/getOwners",e.GetTrackOwners="soundcheck/tracks/getOwners",e.GetCampaignOwners="soundcheck/campaigns/getOwners",e.GetTrackRelatedGroups="soundcheck/track/getTrackRelatedGroups",e.CheckTemplates="soundcheck/checkTemplates",e.GetFacetsForOwner="soundcheck/facets-for-owner",e.GetTrackOverviewForOwner="soundcheck/track-overview-for-owner",e.GetExemption="soundcheck/getExemption",e.GetExemptions="soundcheck/getExemptions",e.GetExemptCheckIds="soundcheck/getExemptCheckIds",e))(t||{}),s=(e=>(e.DeleteCheck="soundcheck/deleteCheck",e.CreateCheck="soundcheck/createCheck",e.UpdateCheck="soundcheck/updateCheck",e.ExecuteCheck="soundcheck/executeCheck",e.ImportChecks="soundcheck/importChecks",e.SetResult="soundcheck/setResult",e.CreateExemption="soundcheck/createExemption",e.UpdateExemption="soundcheck/updateExemption",e.DeleteExemption="soundcheck/deleteExemption",e.SaveView="soundcheck/saveView",e.DeleteTrack="soundcheck/deleteTrack",e.CreateTrack="soundcheck/createTrack",e.UpdateTrack="soundcheck/updateTrack",e.ImportTracks="soundcheck/importTracks",e.RecertifyTrack="soundcheck/recertifyTrack",e.UpdateCollectorConfig="soundcheck/updateCollectorConfig",e.DeleteCollectorConfig="soundcheck/deleteCollectorConfig",e.CreateCampaign="soundcheck/createCampaign",e.UpdateCampaign="soundcheck/updateCampaign",e.DeleteCampaign="soundcheck/deleteCampaign",e.ArchiveCampaign="soundcheck/archiveCampaign",e.SendCampaignNotification="soundcheck/sendCampaignNotification",e))(s||{});export{s as MutationKeys,t as QueryKeys};
1
+ var t=(e=>(e.GetTrack="soundcheck/track",e.GetAllTracks="soundcheck/tracks",e.GetTracksApplicableEntityCount="soundcheck/tracks/applicableEntities",e.GetChecks="soundcheck/checks",e.GetCollectors="soundcheck/collectors",e.GetFactSchema="soundcheck/collectors/schema",e.GetEntityFacets="soundcheck/catalog/facets",e.GetSoftwareEntityRefsForUser="soundcheck/entities/softwareEntityRefsForUser",e.GetEntityRefs="soundcheck/catalog/entityRefs",e.ExecutableChecks="soundcheck/executableChecks",e.GetCampaigns="soundcheck/campaigns",e.GetOverallCheckPassRateTrends="soundcheck/charts/overallCheckPassRateTrends",e.GetIndividualCheckPassRateTrends="soundcheck/charts/getIndividualCheckPassRateTrends",e.GetOverallTrackPassRateTrends="soundcheck/charts/overallTrackPassRateTrends",e.GetIndividualTrackPassRateTrends="soundcheck/charts/individualTrackPassRateTrends",e.GetOverallEntityPassRateTrends="soundcheck/charts/overallEntityPassRateTrends",e.GetIndividualEntityPassRateTrends="soundcheck/charts/individualEntityPassRateTrends",e.GetOverallGroupPassRateTrends="soundcheck/charts/overallGroupPassRateTrends",e.GetIndividualGroupPassRateTrends="soundcheck/charts/individualGroupPassRateTrends",e.EntityByRef="soundcheck/catalog/entityByRef",e.EntitiesByRefs="soundcheck/catalog/entitiesByRef",e.TrackEntities="soundcheck/track/entities",e.CheckEntities="soundcheck/check/entities",e.CertificationStatus="soundcheck/certificationStatus",e.CertificationStatuses="soundcheck/certificationStatuses",e.MultipleTrackStatuses="soundcheck/multipleTrackStatuses",e.CertificationStatusHistory="soundcheck/certificationStatusHistory",e.CertificationStatusHistories="soundcheck/certificationStatusHistories",e.CheckStatus="soundcheck/checkStatus",e.CheckStatuses="soundcheck/checkStatuses",e.SavedViews="soundcheck/savedViews",e.CheckStatusHistory="soundcheck/checkStatusHistory",e.CheckStatusHistories="soundcheck/checkStatusHistories",e.CheckStatusHistoriesMultiFilter="soundcheck/checkStatusHistoriesMultiFilter",e.TrackStatusHistory="soundcheck/trackStatusHistory",e.TrackStatusHistories="soundcheck/trackStatusHistories",e.Check="soundcheck/check",e.CheckDetails="soundcheck/checkDetails",e.Certifications="soundcheck/certifications",e.CertificationDetails="soundcheck/certificationDetails",e.GetCheckOwners="soundcheck/checks/getOwners",e.GetTrackOwners="soundcheck/tracks/getOwners",e.GetCampaignOwners="soundcheck/campaigns/getOwners",e.GetTrackRelatedGroups="soundcheck/track/getTrackRelatedGroups",e.CheckTemplates="soundcheck/checkTemplates",e.OutOfBoxTracks="soundcheck/outOfBoxTracks",e.GetFacetsForOwner="soundcheck/facets-for-owner",e.GetTrackOverviewForOwner="soundcheck/track-overview-for-owner",e.GetExemption="soundcheck/getExemption",e.GetExemptions="soundcheck/getExemptions",e.GetExemptCheckIds="soundcheck/getExemptCheckIds",e))(t||{}),s=(e=>(e.DeleteCheck="soundcheck/deleteCheck",e.CreateCheck="soundcheck/createCheck",e.UpdateCheck="soundcheck/updateCheck",e.ExecuteCheck="soundcheck/executeCheck",e.ImportChecks="soundcheck/importChecks",e.SetResult="soundcheck/setResult",e.CreateExemption="soundcheck/createExemption",e.UpdateExemption="soundcheck/updateExemption",e.DeleteExemption="soundcheck/deleteExemption",e.SaveView="soundcheck/saveView",e.DeleteTrack="soundcheck/deleteTrack",e.CreateTrack="soundcheck/createTrack",e.UpdateTrack="soundcheck/updateTrack",e.ImportTracks="soundcheck/importTracks",e.RecertifyTrack="soundcheck/recertifyTrack",e.SaveOutOfBoxTracks="soundcheck/saveOutOfBoxTracks",e.UpdateCollectorConfig="soundcheck/updateCollectorConfig",e.DeleteCollectorConfig="soundcheck/deleteCollectorConfig",e.CreateCampaign="soundcheck/createCampaign",e.UpdateCampaign="soundcheck/updateCampaign",e.DeleteCampaign="soundcheck/deleteCampaign",e.ArchiveCampaign="soundcheck/archiveCampaign",e.SendCampaignNotification="soundcheck/sendCampaignNotification",e))(s||{});export{s as MutationKeys,t as QueryKeys};
2
2
  //# sourceMappingURL=graphqlKeys.esm.js.map
@@ -1,2 +1,2 @@
1
- import{useApi as c}from"@backstage/core-plugin-api";import{useQueryClient as l,useMutation as u}from"@tanstack/react-query";import{soundcheckApiRef as m}from"../../api.esm.js";import{MutationKeys as d,QueryKeys as t}from"../graphqlKeys.esm.js";import{useSoundcheckAlert as k}from"../useSoundcheckAlert.esm.js";const T="Error Deleting Track";function f(){const s=c(m),a=l(),{showAlert:n}=k(),i=async e=>{const r=await s.deleteTrack(e);if(!r)throw new Error(`Failed to delete track ${e}`);return r};return u([d.DeleteTrack],i,{onSuccess:()=>{const e=[t.GetAllTracks,t.GetOverallTrackPassRateTrends,t.GetIndividualTrackPassRateTrends,t.GetTrackOwners,t.GetFacetsForOwner,t.GetTrackOverviewForOwner];return Promise.all(e.map(r=>a.invalidateQueries({queryKey:[r]})))},onError:(e,r)=>{let o=`Failed to delete track ${r}`;e instanceof Error&&(o=e.message),n({severity:"error",title:T,message:o})}})}export{f as useDeleteTrack};
1
+ import{useApi as i}from"@backstage/core-plugin-api";import{useQueryClient as l,useMutation as u}from"@tanstack/react-query";import{soundcheckApiRef as k}from"../../api.esm.js";import{MutationKeys as m,QueryKeys as r}from"../graphqlKeys.esm.js";import{useSoundcheckAlert as d}from"../useSoundcheckAlert.esm.js";const T="Error Deleting Track";function f(){const s=i(k),a=l(),{showAlert:n}=d(),c=async e=>{const t=await s.deleteTrack(e);if(!t)throw new Error(`Failed to delete track ${e}`);return t};return u([m.DeleteTrack],c,{onSuccess:()=>{const e=[r.GetAllTracks,r.GetOverallTrackPassRateTrends,r.GetIndividualTrackPassRateTrends,r.GetTrackOwners,r.GetFacetsForOwner,r.GetTrackOverviewForOwner,r.OutOfBoxTracks];return Promise.all(e.map(t=>a.invalidateQueries({queryKey:[t]})))},onError:(e,t)=>{let o=`Failed to delete track ${t}`;e instanceof Error&&(o=e.message),n({severity:"error",title:T,message:o})}})}export{f as useDeleteTrack};
2
2
  //# sourceMappingURL=useDeleteTrack.esm.js.map
@@ -0,0 +1,2 @@
1
+ import{useApi as r}from"@backstage/core-plugin-api";import{useQuery as t}from"@tanstack/react-query";import{soundcheckApiRef as e}from"../../api.esm.js";import{QueryKeys as u}from"../graphqlKeys.esm.js";function s(){const o=r(e);return t([u.OutOfBoxTracks],async()=>o.getOutOfBoxTracks())}export{s as useOutOfBoxTracks};
2
+ //# sourceMappingURL=useOutOfBoxTracks.esm.js.map
@@ -0,0 +1,2 @@
1
+ import{useApi as l,useAnalytics as d}from"@backstage/core-plugin-api";import{useQueryClient as f,useMutation as p}from"@tanstack/react-query";import{soundcheckApiRef as k}from"../../api.esm.js";import{MutationKeys as T,QueryKeys as r}from"../graphqlKeys.esm.js";import{useSoundcheckAlert as m}from"../useSoundcheckAlert.esm.js";const C="Error Importing Tracks";function v(){const o=l(k),a=f(),{showAlert:u}=m(),t=d(),i=async c=>await o.saveOutOfBoxTracks(c);return p([T.SaveOutOfBoxTracks],i,{onSuccess:c=>{for(const e of c.tracksStatus.created)t.captureEvent("resource_action","Create Track",{attributes:{resourceType:"track",resourceAction:"create",resourceId:e.id,success:"true"}});for(const e of c.tracksStatus.failed)t.captureEvent("resource_action","Create Track",{attributes:{resourceType:"track",resourceAction:"create",resourceId:e.id,success:"false"}}),t.captureEvent("error","Create Track",{attributes:{errorMessage:e.message??`Failed to create a track with ID ${e.id}`}});for(const e of c.checksStatus.created)t.captureEvent("resource_action","Create Check",{attributes:{resourceType:"check",resourceAction:"create",resourceId:e.id,success:"true"}});for(const e of c.checksStatus.failed)t.captureEvent("resource_action","Create Check",{attributes:{resourceType:"check",resourceAction:"create",resourceId:e.id,success:"false"}}),t.captureEvent("error","Create Check",{attributes:{errorMessage:e.message??`Failed to create a check with ID ${e.id}`}});for(const e of c.collectorsStatus.created)t.captureEvent("resource_action","Update Collector Config",{attributes:{resourceType:"collector",resourceAction:"update",resourceId:e.id,success:"true"}});for(const e of c.collectorsStatus.failed)t.captureEvent("resource_action","Update Collector Config",{attributes:{resourceType:"collector",resourceAction:"update",resourceId:e.id,success:"false"}}),t.captureEvent("error","Update Collector Config",{attributes:{errorMessage:e.message??`Failed to update config for a collector with ID ${e.id}`}});const s=[r.GetAllTracks,r.GetOverallTrackPassRateTrends,r.GetIndividualTrackPassRateTrends,r.GetTrackOwners,r.GetFacetsForOwner,r.GetTrackOverviewForOwner,r.OutOfBoxTracks,r.GetChecks,r.GetCheckOwners,r.ExecutableChecks,r.GetCollectors,r.GetFactSchema];return Promise.all(s.map(e=>a.invalidateQueries({queryKey:[e]})))},onError:(c,s)=>{let e="Failed to use Spotify templates.";c instanceof Error&&(e=c.message),u({severity:"error",title:C,message:e});for(const n of s?.trackIds??[])t.captureEvent("resource_action","Create Track",{attributes:{resourceType:"track",resourceAction:"create",resourceId:n,success:"false"}});t.captureEvent("error","Use Spotify Templates",{attributes:{errorMessage:e}})}})}export{v as useSaveOutOfBoxTracks};
2
+ //# sourceMappingURL=useSaveOutOfBoxTracks.esm.js.map
@@ -1,2 +1,2 @@
1
- import{parseEntityRef as G}from"@backstage/catalog-model";import{useMemo as i}from"react";import{useGetCampaigns as T}from"../campaigns/useGetCampaigns.esm.js";import{useGetAllTracks as y}from"./useGetAllTracks.esm.js";import{useGetTracksApplicableEntityCount as E}from"./useGetTracksApplicableEntityCount.esm.js";function v(r){if(!r||r.trim()==="")return!1;try{return G(r).kind.toLowerCase()==="group"}catch{return!1}}function A(r,b={},h){const d=v(r)&&(h?.enabled??!0),{data:s,isLoading:p,error:c}=y(b,{enabled:d}),{data:o,isLoading:l,error:m}=T({},d),u=i(()=>o?.edges?new Set(o.edges.filter(({node:e})=>e.archived).map(({node:e})=>e.track.id)):new Set,[o]),a=i(()=>s?.edges?s.edges.map(({node:e})=>e).filter(e=>!u.has(e.id)).filter(e=>!e.draft).sort((e,n)=>e.id.localeCompare(n.id)):[],[s,u]),{data:t,isLoading:g,error:f}=E(r,{ids:a.map(e=>e.id)},{enabled:d&&a.length>0&&!p&&!l}),k=i(()=>t?new Map(t.map(e=>[e.id,e.applicableEntityCount])):new Map,[t]),C=i(()=>t?a.filter(e=>{const n=k.get(e.id);return n!==void 0&&n>0}):[],[a,k,t]),L=i(()=>p||l||g||!!r&&!t&&a.length>0,[p,l,g,r,t,a.length]),w=i(()=>c||m||f,[c,m,f]);return{tracks:C??[],campaigns:o,counts:t,isLoading:L,error:w,activeTrackCount:a?.length}}export{A as useTracksApplicableToGroup};
1
+ import{parseEntityRef as v}from"@backstage/catalog-model";import{useMemo as i}from"react";import{useGetCampaigns as y}from"../campaigns/useGetCampaigns.esm.js";import{useGetAllTracks as E}from"./useGetAllTracks.esm.js";import{useGetTracksApplicableEntityCount as G}from"./useGetTracksApplicableEntityCount.esm.js";function A(r){if(!r||r.trim()==="")return!1;try{return v(r).kind.toLowerCase()==="group"}catch{return!1}}function M(r,b={},C){const n=A(r)&&(C?.enabled??!0),{data:l,isLoading:o,error:m}=E(b,{enabled:n}),{data:d,isLoading:s,error:u}=y({},n),g=i(()=>d?.edges?new Set(d.edges.filter(({node:e})=>e.archived).map(({node:e})=>e.track.id)):new Set,[d]),t=i(()=>l?.edges?l.edges.map(({node:e})=>e).filter(e=>!g.has(e.id)).filter(e=>!e.draft).sort((e,p)=>e.id.localeCompare(p.id)):[],[l,g]),c=i(()=>n&&t.length>0&&!o&&!s,[n,t.length,o,s]),{data:a,isLoading:f,error:h}=G(r,{ids:t.map(e=>e.id)},{enabled:c}),k=i(()=>a?new Map(a.map(e=>[e.id,e.applicableEntityCount])):new Map,[a]),L=i(()=>a?t.filter(e=>{const p=k.get(e.id);return p!==void 0&&p>0}):[],[t,k,a]),T=i(()=>o||s||c&&f||!!r&&!a&&t.length>0,[o,s,c,f,r,a,t.length]),w=i(()=>m||u||h,[m,u,h]);return{tracks:L??[],campaigns:d,counts:a,isLoading:T,error:w,activeTrackCount:t?.length}}export{M as useTracksApplicableToGroup};
2
2
  //# sourceMappingURL=useTracksApplicableToGroup.esm.js.map
package/dist/index.d.ts CHANGED
@@ -85,7 +85,7 @@ declare const IntegrationPageBlueprint: _backstage_frontend_plugin_api.Extension
85
85
  path?: string;
86
86
  routeRef?: RouteRef;
87
87
  };
88
- output: _backstage_frontend_plugin_api.ExtensionDataRef<string, "core.routing.path", {}> | _backstage_frontend_plugin_api.ExtensionDataRef<react.JSX.Element, "core.reactElement", {}> | _backstage_frontend_plugin_api.ExtensionDataRef<RouteRef<_backstage_frontend_plugin_api.AnyRouteRefParams>, "core.routing.ref", {
88
+ output: _backstage_frontend_plugin_api.ExtensionDataRef<react.JSX.Element, "core.reactElement", {}> | _backstage_frontend_plugin_api.ExtensionDataRef<string, "core.routing.path", {}> | _backstage_frontend_plugin_api.ExtensionDataRef<RouteRef<_backstage_frontend_plugin_api.AnyRouteRefParams>, "core.routing.ref", {
89
89
  optional: true;
90
90
  }> | _backstage_frontend_plugin_api.ExtensionDataRef<string, "soundcheck.integrationId", {}>;
91
91
  inputs: {};
@@ -96,6 +96,34 @@ declare const IntegrationPageBlueprint: _backstage_frontend_plugin_api.Extension
96
96
  };
97
97
  }>;
98
98
 
99
+ /**
100
+ * Creates Soundcheck campaign action extensions that appear in the campaign
101
+ * detail page header menu.
102
+ *
103
+ * @remarks
104
+ * External plugins use this blueprint to register actions in the campaign
105
+ * page without Soundcheck having any knowledge of the registering plugin.
106
+ *
107
+ * @alpha
108
+ */
109
+ declare const CampaignActionBlueprint: _backstage_frontend_plugin_api.ExtensionBlueprint<{
110
+ kind: "campaign-action";
111
+ params: {
112
+ label: string;
113
+ id: string;
114
+ href: (campaignId: string) => string;
115
+ };
116
+ output: _backstage_frontend_plugin_api.ExtensionDataRef<string, "soundcheck.campaignAction.label", {}> | _backstage_frontend_plugin_api.ExtensionDataRef<string, "soundcheck.campaignAction.id", {}> | _backstage_frontend_plugin_api.ExtensionDataRef<(campaignId: string) => string, "soundcheck.campaignAction.href", {}>;
117
+ inputs: {};
118
+ config: {};
119
+ configInput: {};
120
+ dataRefs: {
121
+ label: _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<string, "soundcheck.campaignAction.label", {}>;
122
+ id: _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<string, "soundcheck.campaignAction.id", {}>;
123
+ href: _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<(campaignId: string) => string, "soundcheck.campaignAction.href", {}>;
124
+ };
125
+ }>;
126
+
99
127
  /**
100
128
  * React hook that fetches collector configurations by their IDs.
101
129
  *
@@ -153,4 +181,4 @@ declare function useUpdateCollectorConfig(): _tanstack_react_query.UseMutationRe
153
181
  config?: JsonObject;
154
182
  }, unknown>;
155
183
 
156
- export { EntitySoundcheckCard, type EntitySoundcheckCardProps, EntitySoundcheckContent, GroupSoundcheckContent, IntegrationPageBlueprint, type OverviewPageProps, SoundcheckOverviewPage, SoundcheckRoutingPage, soundcheckPlugin, useGetCollectors, useUpdateCollectorConfig };
184
+ export { CampaignActionBlueprint, EntitySoundcheckCard, type EntitySoundcheckCardProps, EntitySoundcheckContent, GroupSoundcheckContent, IntegrationPageBlueprint, type OverviewPageProps, SoundcheckOverviewPage, SoundcheckRoutingPage, soundcheckPlugin, useGetCollectors, useUpdateCollectorConfig };
package/dist/index.esm.js CHANGED
@@ -1,2 +1,2 @@
1
- import{EntitySoundcheckCard as d,EntitySoundcheckContent as g,GroupSoundcheckContent as a,SoundcheckOverviewPage as h,SoundcheckRoutingPage as k,soundcheckPlugin as l}from"./plugin.esm.js";import"react/jsx-runtime";import"./components/SoundcheckQueryClientProvider/SoundcheckQueryClientProvider.esm.js";import"./components/EntitySoundcheckCard/Card.esm.js";import{IntegrationPageBlueprint as f}from"./blueprints/IntegrationPageBlueprint.esm.js";import{useGetCollectors as s}from"./hooks/collectors/useGetCollectors.esm.js";import{useUpdateCollectorConfig as P}from"./hooks/collectors/useUpdateCollectorConfig.esm.js";import"@backstage/core-plugin-api";import"@tanstack/react-query";import"./api.esm.js";import"./hooks/graphqlKeys.esm.js";import"./hooks/useSoundcheckAlert.esm.js";export{d as EntitySoundcheckCard,g as EntitySoundcheckContent,a as GroupSoundcheckContent,f as IntegrationPageBlueprint,h as SoundcheckOverviewPage,k as SoundcheckRoutingPage,l as soundcheckPlugin,s as useGetCollectors,P as useUpdateCollectorConfig};
1
+ import{EntitySoundcheckCard as a,EntitySoundcheckContent as d,GroupSoundcheckContent as g,SoundcheckOverviewPage as l,SoundcheckRoutingPage as C,soundcheckPlugin as f}from"./plugin.esm.js";import"react/jsx-runtime";import"./components/SoundcheckQueryClientProvider/SoundcheckQueryClientProvider.esm.js";import"./components/EntitySoundcheckCard/Card.esm.js";import{IntegrationPageBlueprint as k}from"./blueprints/IntegrationPageBlueprint.esm.js";import{CampaignActionBlueprint as S}from"./blueprints/CampaignActionBlueprint.esm.js";import{useGetCollectors as P}from"./hooks/collectors/useGetCollectors.esm.js";import{useUpdateCollectorConfig as y}from"./hooks/collectors/useUpdateCollectorConfig.esm.js";import"@backstage/core-plugin-api";import"@tanstack/react-query";import"./api.esm.js";import"./hooks/graphqlKeys.esm.js";import"./hooks/useSoundcheckAlert.esm.js";export{S as CampaignActionBlueprint,a as EntitySoundcheckCard,d as EntitySoundcheckContent,g as GroupSoundcheckContent,k as IntegrationPageBlueprint,l as SoundcheckOverviewPage,C as SoundcheckRoutingPage,f as soundcheckPlugin,P as useGetCollectors,y as useUpdateCollectorConfig};
2
2
  //# sourceMappingURL=index.esm.js.map
@@ -1,2 +1,2 @@
1
- import{createRouteRef as a,createSubRouteRef as e}from"@backstage/core-plugin-api";const c=a({id:"soundcheck-entity"}),i=a({id:"soundcheck-group"}),r=e({id:"soundcheck-entity-certification-track-redirect",parent:c,path:"/tracks/:trackId"}),n=e({id:"soundcheck-entity-certification",parent:c,path:"/tracks/:trackId/checks/:checkId"}),s=e({id:"soundcheck-entity-playlist-redirect",parent:c,path:"/playlists/:playlistId"}),o=e({id:"soundcheck-entity-playlist-track-redirect",parent:c,path:"/playlists/:playlistId/tracks/:trackId"}),d=e({id:"soundcheck-entity-playlist-track-redirect",parent:c,path:"/playlists/:playlistId/tracks/:trackId/checks/:checkId"}),t=a({id:"soundcheck"});e({id:"soundcheck-quickstart",parent:t,path:"/quickstart"});const p=e({id:"soundcheck-checks",parent:t,path:"/checks"}),k=e({id:"soundcheck-check-details",parent:t,path:"/checks/:checkId"}),h=e({id:"soundcheck-check-edit",parent:t,path:"/checks/:checkId/edit"}),u=e({id:"soundcheck-check-create",parent:t,path:"/checks/create"}),R=e({id:"soundcheck-check-templates",parent:t,path:"/checks/templates"}),g=e({id:"soundcheck-tracks",parent:t,path:"/tracks"}),l=e({id:"soundcheck-track-details",parent:t,path:"/tracks/:trackId"}),f=e({id:"soundcheck-track-edit",parent:t,path:"/tracks/:trackId/edit"}),m=e({id:"soundcheck-track-create",parent:t,path:"/tracks/create"}),I=e({id:"soundcheck-track-check-details",parent:t,path:"/tracks/:trackId/checks/:checkId"}),y=e({id:"soundcheck-campaigns",parent:t,path:"/campaigns"}),v=e({id:"soundcheck-campaign-details",parent:t,path:"/campaigns/:campaignId"}),w=e({id:"soundcheck-campaign-edit",parent:t,path:"/campaigns/:campaignId/edit"}),P=e({id:"soundcheck-campaign-create",parent:t,path:"/campaigns/create"}),x=e({id:"soundcheck-tech-insights",parent:t,path:"/tech-insights"}),E=e({id:"soundcheck-integrations-page",parent:t,path:"/integrations"}),C=e({id:"soundcheck-integration-details",parent:t,path:"/integrations/:integrationId"}),D=e({id:"soundcheck-integration-edit",parent:t,path:"/integrations/:integrationId/edit"});e({id:"soundcheck-tech-insights-track",parent:t,path:"/tech-insights/track"});const T=e({id:"soundcheck-track-overview",parent:t,path:"/tracks/:trackId/overview"}),q=e({id:"soundcheck-track-explorer",parent:t,path:"/tracks/:trackId/explorer"}),O=e({id:"soundcheck-campaign-overview",parent:t,path:"/campaigns/:campaignId/overview"}),b=e({id:"soundcheck-campaign-explorer",parent:t,path:"/campaigns/:campaignId/explorer"}),S=e({id:"soundcheck-overview",parent:t,path:"/overview"});export{P as campaignCreateRouteRef,v as campaignDetailsRouteRef,w as campaignEditRouteRef,b as campaignExplorerRouteRef,O as campaignOverviewRouteRef,y as campaignsPageRouteRef,s as certificationPlaylistRouteRef,d as certificationPlaylistTrackCheckRouteRef,o as certificationPlaylistTrackRouteRef,n as certificationRouteRef,r as certificationTrackRouteRef,u as checkCreateRouteRef,k as checkDetailsRouteRef,h as checkEditRouteRef,R as checkTemplatesRouteRef,p as checksPageRouteRef,c as entityRootRouteRef,i as groupRootRouteRef,C as integrationDetailsRouteRef,D as integrationEditRouteRef,E as integrationsPageRouteRef,S as overviewRouteRef,t as rootRouteRef,x as techInsightsPageRouteRef,I as trackCheckDetailsRouteRef,m as trackCreateRouteRef,l as trackDetailsRouteRef,f as trackEditRouteRef,q as trackExplorerRouteRef,T as trackOverviewRouteRef,g as tracksPageRouteRef};
1
+ import{createRouteRef as a,createSubRouteRef as e}from"@backstage/core-plugin-api";const c=a({id:"soundcheck-entity"}),i=a({id:"soundcheck-group"}),r=e({id:"soundcheck-entity-certification-track-redirect",parent:c,path:"/tracks/:trackId"}),n=e({id:"soundcheck-entity-certification",parent:c,path:"/tracks/:trackId/checks/:checkId"}),d=e({id:"soundcheck-entity-playlist-redirect",parent:c,path:"/playlists/:playlistId"}),s=e({id:"soundcheck-entity-playlist-track-redirect",parent:c,path:"/playlists/:playlistId/tracks/:trackId"}),o=e({id:"soundcheck-entity-playlist-track-redirect",parent:c,path:"/playlists/:playlistId/tracks/:trackId/checks/:checkId"}),t=a({id:"soundcheck"});e({id:"soundcheck-quickstart",parent:t,path:"/quickstart"});const k=e({id:"soundcheck-checks",parent:t,path:"/checks"}),p=e({id:"soundcheck-check-details",parent:t,path:"/checks/:checkId"}),h=e({id:"soundcheck-check-edit",parent:t,path:"/checks/:checkId/edit"}),u=e({id:"soundcheck-check-create",parent:t,path:"/checks/create"}),R=e({id:"soundcheck-check-templates",parent:t,path:"/checks/templates"}),g=e({id:"soundcheck-tracks",parent:t,path:"/tracks"}),l=e({id:"soundcheck-track-details",parent:t,path:"/tracks/:trackId"}),f=e({id:"soundcheck-track-edit",parent:t,path:"/tracks/:trackId/edit"}),m=e({id:"soundcheck-track-create",parent:t,path:"/tracks/create"}),I=e({id:"soundcheck-new-track",parent:t,path:"/tracks/new"}),y=e({id:"soundcheck-track-builder",parent:t,path:"/tracks/builder"}),v=e({id:"soundcheck-track-check-details",parent:t,path:"/tracks/:trackId/checks/:checkId"}),w=e({id:"soundcheck-campaigns",parent:t,path:"/campaigns"}),P=e({id:"soundcheck-campaign-details",parent:t,path:"/campaigns/:campaignId"}),x=e({id:"soundcheck-campaign-edit",parent:t,path:"/campaigns/:campaignId/edit"}),E=e({id:"soundcheck-campaign-create",parent:t,path:"/campaigns/create"}),C=e({id:"soundcheck-tech-insights",parent:t,path:"/tech-insights"}),D=e({id:"soundcheck-integrations-page",parent:t,path:"/integrations"}),T=e({id:"soundcheck-integration-details",parent:t,path:"/integrations/:integrationId"}),b=e({id:"soundcheck-integration-edit",parent:t,path:"/integrations/:integrationId/edit"});e({id:"soundcheck-tech-insights-track",parent:t,path:"/tech-insights/track"});const q=e({id:"soundcheck-track-overview",parent:t,path:"/tracks/:trackId/overview"}),O=e({id:"soundcheck-track-explorer",parent:t,path:"/tracks/:trackId/explorer"}),B=e({id:"soundcheck-campaign-overview",parent:t,path:"/campaigns/:campaignId/overview"}),S=e({id:"soundcheck-campaign-explorer",parent:t,path:"/campaigns/:campaignId/explorer"}),j=e({id:"soundcheck-overview",parent:t,path:"/overview"});export{E as campaignCreateRouteRef,P as campaignDetailsRouteRef,x as campaignEditRouteRef,S as campaignExplorerRouteRef,B as campaignOverviewRouteRef,w as campaignsPageRouteRef,d as certificationPlaylistRouteRef,o as certificationPlaylistTrackCheckRouteRef,s as certificationPlaylistTrackRouteRef,n as certificationRouteRef,r as certificationTrackRouteRef,u as checkCreateRouteRef,p as checkDetailsRouteRef,h as checkEditRouteRef,R as checkTemplatesRouteRef,k as checksPageRouteRef,c as entityRootRouteRef,i as groupRootRouteRef,T as integrationDetailsRouteRef,b as integrationEditRouteRef,D as integrationsPageRouteRef,I as newTrackRouteRef,j as overviewRouteRef,t as rootRouteRef,C as techInsightsPageRouteRef,y as trackBuilderRouteRef,v as trackCheckDetailsRouteRef,m as trackCreateRouteRef,l as trackDetailsRouteRef,f as trackEditRouteRef,O as trackExplorerRouteRef,q as trackOverviewRouteRef,g as tracksPageRouteRef};
2
2
  //# sourceMappingURL=routes.esm.js.map
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@spotify/backstage-plugin-soundcheck",
3
3
  "description": "Ensure quality, reliability and alignment of software development with codified checks and guidance.",
4
- "version": "0.21.0",
4
+ "version": "0.22.0",
5
5
  "license": "SEE LICENSE IN LICENSE.md",
6
6
  "homepage": "https://backstage.spotify.com",
7
7
  "main": "./dist/index.esm.js",
@@ -58,18 +58,18 @@
58
58
  "prepare": "yarn generate"
59
59
  },
60
60
  "dependencies": {
61
- "@backstage/catalog-client": "^1.12.1",
61
+ "@backstage/catalog-client": "^1.13.0",
62
62
  "@backstage/catalog-model": "^1.7.6",
63
63
  "@backstage/config": "^1.3.6",
64
- "@backstage/core-compat-api": "^0.5.6",
65
- "@backstage/core-components": "^0.18.5",
66
- "@backstage/core-plugin-api": "^1.12.1",
67
- "@backstage/frontend-plugin-api": "^0.13.3",
68
- "@backstage/plugin-catalog-react": "^1.21.5",
69
- "@backstage/plugin-permission-react": "^0.4.39",
70
- "@backstage/plugin-scaffolder-react": "^1.19.5",
64
+ "@backstage/core-compat-api": "^0.5.8",
65
+ "@backstage/core-components": "^0.18.7",
66
+ "@backstage/core-plugin-api": "^1.12.3",
67
+ "@backstage/frontend-plugin-api": "^0.14.0",
68
+ "@backstage/plugin-catalog-react": "^2.0.0",
69
+ "@backstage/plugin-permission-react": "^0.4.40",
70
+ "@backstage/plugin-scaffolder-react": "^1.19.7",
71
71
  "@backstage/types": "^1.2.2",
72
- "@backstage/ui": "^0.11.0",
72
+ "@backstage/ui": "^0.12.0",
73
73
  "@date-io/luxon": "^1.0.0",
74
74
  "@hookform/resolvers": "^4.0.0",
75
75
  "@material-ui/core": "^4.12.2",
@@ -84,8 +84,8 @@
84
84
  "@nivo/sunburst": "^0.99.0",
85
85
  "@nivo/treemap": "^0.99.0",
86
86
  "@remixicon/react": "^4.6.0",
87
- "@spotify/backstage-plugin-core": "^0.8.14",
88
- "@spotify/backstage-plugin-soundcheck-common": "^0.20.0",
87
+ "@spotify/backstage-plugin-core": "^0.8.15",
88
+ "@spotify/backstage-plugin-soundcheck-common": "^0.21.0",
89
89
  "@tanstack/react-query": "^4.6.1",
90
90
  "@uiw/react-md-editor": "3.20.10",
91
91
  "classnames": "^2.3.2",
@@ -127,21 +127,21 @@
127
127
  "react-router-dom": "6.0.0-beta.0 || ^6.3.0"
128
128
  },
129
129
  "devDependencies": {
130
- "@backstage/cli": "^0.35.2",
131
- "@backstage/core-app-api": "^1.19.3",
132
- "@backstage/dev-utils": "^1.1.19",
133
- "@backstage/e2e-test-utils": "^0.1.1",
134
- "@backstage/frontend-test-utils": "^0.4.3",
135
- "@backstage/plugin-permission-common": "^0.9.4",
136
- "@backstage/test-utils": "^1.7.14",
137
- "@graphql-codegen/cli": "^5.0.0",
138
- "@graphql-codegen/typescript": "^4.0.0",
130
+ "@backstage/cli": "^0.35.4",
131
+ "@backstage/core-app-api": "^1.19.5",
132
+ "@backstage/dev-utils": "^1.1.20",
133
+ "@backstage/e2e-test-utils": "^0.1.2",
134
+ "@backstage/frontend-test-utils": "^0.5.0",
135
+ "@backstage/plugin-permission-common": "^0.9.6",
136
+ "@backstage/test-utils": "^1.7.15",
137
+ "@graphql-codegen/cli": "^6.0.0",
138
+ "@graphql-codegen/typescript": "^5.0.0",
139
139
  "@graphql-codegen/typescript-graphql-request": "^6.0.0",
140
- "@graphql-codegen/typescript-operations": "^4.0.0",
140
+ "@graphql-codegen/typescript-operations": "^5.0.0",
141
141
  "@playwright/test": "^1.32.3",
142
142
  "@sp4b-dev/test-utils": "^0.0.13",
143
- "@spotify/backstage-plugin-core-common": "^0.6.13",
144
- "@spotify/backstage-plugin-soundcheck-node": "^0.10.5",
143
+ "@spotify/backstage-plugin-core-common": "^0.6.14",
144
+ "@spotify/backstage-plugin-soundcheck-node": "^0.11.0",
145
145
  "@testing-library/jest-dom": "^6.0.0",
146
146
  "@testing-library/react": "^14.0.0",
147
147
  "@testing-library/user-event": "^14.0.0",
@@ -1,2 +0,0 @@
1
- import{jsxs as b,jsx as d}from"react/jsx-runtime";const l={default:{bg:"var(--bui-bg-solid-disabled)",color:"var(--bui-fg-disabled)",border:"1px solid var(--bui-border-disabled)"},success:{bg:"var(--bui-bg-success)",color:"var(--bui-fg-success)",border:"1px solid var(--bui-border-success)"},warning:{bg:"var(--bui-bg-warning)",color:"var(--bui-fg-warning)",border:"1px solid var(--bui-border-warning)"}},n=({children:i,icon:r,variant:a="default"})=>{const{bg:s,color:e,border:o}=l[a];return b("span",{style:{display:"inline-flex",alignItems:"center",padding:"var(--bui-space-1) var(--bui-space-3)",borderRadius:"var(--bui-radius-full)",backgroundColor:s,color:e,border:o},children:[r&&d("span",{style:{marginRight:"var(--bui-space-1)"},children:r}),i]})};export{n as Badge};
2
- //# sourceMappingURL=Badge.esm.js.map
@@ -1,2 +0,0 @@
1
- import{jsxs as t,jsx as e}from"react/jsx-runtime";import{Box as r,Flex as R,Text as o,Card as b,CardBody as m}from"@backstage/ui";import{makeStyles as w}from"@material-ui/core";import{RiSparklingFill as P,RiCheckboxCircleLine as p,RiStackFill as L,RiTimeLine as h,RiCloseCircleLine as T,RiCircleLine as f,RiPlayCircleLine as z,RiPlayLine as B,RiArrowUpSLine as W,RiArrowDownSLine as F}from"@remixicon/react";import{useState as A}from"react";import{trackBuilderTracks as j}from"./mockData.esm.js";const D=w(()=>({container:{margin:"var(--bui-space-8) 0"},header:{textAlign:"center",marginBottom:"var(--bui-space-8)"},title:{fontSize:"2rem",fontWeight:700,margin:"0 0 var(--bui-space-2)"},savedBadge:{display:"inline-flex",alignItems:"center",gap:"var(--bui-space-2)",padding:"var(--bui-space-2) var(--bui-space-4)",borderRadius:"var(--bui-radius-full)",backgroundColor:"var(--bui-bg-success)",color:"var(--bui-fg-success)",fontSize:"0.875rem",fontWeight:500,marginBottom:"var(--bui-space-4)"},progressCard:{marginBottom:"var(--bui-space-6)"},progressContainer:{display:"flex",alignItems:"center",justifyContent:"center",gap:"var(--bui-space-4)",padding:"var(--bui-space-4)"},progressStep:{display:"flex",alignItems:"center",gap:"var(--bui-space-2)"},progressStepCompleted:{color:"var(--bui-fg-success)"},progressStepActive:{display:"flex",alignItems:"center",gap:"var(--bui-space-2)"},progressStepNumber:{width:24,height:24,borderRadius:"var(--bui-radius-full)",backgroundColor:"var(--bui-bg-solid-primary)",color:"var(--bui-fg-on-solid-primary)",display:"flex",alignItems:"center",justifyContent:"center",fontSize:"0.75rem",fontWeight:600},progressArrow:{color:"var(--bui-fg-disabled)",fontSize:"1.25rem"},statsGrid:{display:"grid",gridTemplateColumns:"1fr 1fr",gap:"var(--bui-space-4)",marginBottom:"var(--bui-space-4)"},statsGridSmall:{display:"grid",gridTemplateColumns:"1fr 1fr 1fr",gap:"var(--bui-space-4)",marginBottom:"var(--bui-space-6)"},statCard:{padding:"var(--bui-space-6)",borderRadius:"var(--bui-radius-3)",display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",gap:"var(--bui-space-2)",minHeight:120},statCardSmall:{padding:"var(--bui-space-4)",borderRadius:"var(--bui-radius-3)",display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",gap:"var(--bui-space-2)",minHeight:100},statCardTracks:{backgroundColor:"rgba(29, 185, 84, 0.1)",border:"1px solid var(--bui-border-success)"},statCardPending:{backgroundColor:"rgba(255, 180, 0, 0.1)",border:"1px solid var(--bui-border-warning)"},statCardPassing:{backgroundColor:"rgba(29, 185, 84, 0.1)",border:"1px solid var(--bui-border-success)"},statCardFailing:{backgroundColor:"rgba(230, 70, 70, 0.1)",border:"1px solid var(--bui-border-danger)"},statCardNotRun:{backgroundColor:"var(--bui-bg-solid-disabled)",border:"1px solid var(--bui-border-disabled)"},statIcon:{width:24,height:24},statIconTracks:{color:"var(--bui-fg-success)"},statIconPending:{color:"var(--bui-fg-warning)"},statIconPassing:{color:"var(--bui-fg-success)"},statIconFailing:{color:"var(--bui-fg-danger)"},statIconNotRun:{color:"var(--bui-fg-disabled)"},statNumber:{fontSize:"2rem",fontWeight:700,lineHeight:1},statNumberSmall:{fontSize:"1.5rem",fontWeight:700,lineHeight:1},statNumberTracks:{color:"var(--bui-fg-success)"},statNumberPending:{color:"var(--bui-fg-warning)"},statNumberPassing:{color:"var(--bui-fg-success)"},statNumberFailing:{color:"var(--bui-fg-danger)"},statNumberNotRun:{color:"var(--bui-fg-disabled)"},statLabel:{fontSize:"0.875rem",fontWeight:500},statLabelTracks:{color:"var(--bui-fg-success)"},statLabelPending:{color:"var(--bui-fg-warning)"},statLabelPassing:{color:"var(--bui-fg-success)"},statLabelFailing:{color:"var(--bui-fg-danger)"},statLabelNotRun:{color:"var(--bui-fg-disabled)"},ctaCard:{backgroundColor:"var(--bui-bg-success)",border:"1px solid var(--bui-border-success)",padding:"var(--bui-space-5)",borderRadius:"var(--bui-radius-3)"},ctaContent:{display:"flex",alignItems:"center",gap:"var(--bui-space-4)"},ctaIcon:{width:40,height:40,borderRadius:"var(--bui-radius-full)",backgroundColor:"rgba(29, 185, 84, 0.3)",display:"flex",alignItems:"center",justifyContent:"center",color:"var(--bui-fg-success)"},ctaText:{flex:1},ctaTitle:{fontSize:"1rem",fontWeight:600,margin:0,marginBottom:"var(--bui-space-1)"},ctaDescription:{fontSize:"0.875rem",color:"var(--bui-fg-secondary)",margin:0},ctaHighlight:{color:"var(--bui-fg-success)",fontWeight:600},breakdownSection:{marginTop:"var(--bui-space-8)"},breakdownTitle:{fontSize:"0.75rem",fontWeight:600,letterSpacing:"0.1em",color:"var(--bui-fg-secondary)",marginBottom:"var(--bui-space-4)",textTransform:"uppercase"},trackCard:{marginBottom:"var(--bui-space-4)"},trackCardContent:{display:"flex",alignItems:"center",justifyContent:"space-between",width:"100%"},trackInfo:{display:"flex",alignItems:"center",gap:"var(--bui-space-4)"},trackIconWrapper:{width:48,height:48,borderRadius:"var(--bui-radius-3)",backgroundColor:"var(--bui-bg-solid-disabled)",display:"flex",alignItems:"center",justifyContent:"center",color:"var(--bui-fg-success)"},trackDetails:{display:"flex",flexDirection:"column",gap:"var(--bui-space-1)"},trackName:{fontSize:"1rem",fontWeight:600,margin:0},trackStats:{display:"flex",alignItems:"center",gap:"var(--bui-space-3)",fontSize:"0.875rem"},trackStatNotRun:{color:"var(--bui-fg-secondary)"},trackStatPending:{color:"var(--bui-fg-warning)"},trackActions:{display:"flex",alignItems:"center",gap:"var(--bui-space-2)"},runCheckButton:{backgroundColor:"var(--bui-bg-solid-success)",color:"var(--bui-fg-on-solid-success)",border:"none",borderRadius:"var(--bui-radius-full)",padding:"var(--bui-space-2) var(--bui-space-4)",fontSize:"0.875rem",fontWeight:600,display:"flex",alignItems:"center",gap:"var(--bui-space-2)",cursor:"pointer","&:hover":{opacity:.9}},expandButton:{width:32,height:32,borderRadius:"var(--bui-radius-2)",border:"1px solid var(--bui-border)",backgroundColor:"transparent",display:"flex",alignItems:"center",justifyContent:"center",cursor:"pointer",color:"var(--bui-fg-secondary)","&:hover":{backgroundColor:"var(--bui-bg-hover)"}},checksList:{borderTop:"1px solid var(--bui-border)"},checkItem:{display:"flex",alignItems:"center",gap:"var(--bui-space-4)",padding:"var(--bui-space-4) var(--bui-space-5)",borderBottom:"1px solid var(--bui-border)",cursor:"pointer","&:last-child":{borderBottom:"none"},"&:hover":{backgroundColor:"var(--bui-bg-hover)"}},checkItemPending:{backgroundColor:"rgba(255, 180, 0, 0.1)","&:hover":{backgroundColor:"rgba(255, 180, 0, 0.15)"}},checkIconWrapper:{width:24,height:24,display:"flex",alignItems:"center",justifyContent:"center"},checkIconNotRun:{color:"var(--bui-fg-disabled)"},checkIconPending:{color:"var(--bui-fg-warning)"},checkDetails:{flex:1},checkName:{fontSize:"0.9375rem",fontWeight:500,margin:0,marginBottom:"var(--bui-space-1)"},checkNamePending:{color:"var(--bui-fg-warning)"},checkSubtitle:{fontSize:"0.8125rem",color:"var(--bui-fg-secondary)",margin:0},checkSubtitlePending:{color:"var(--bui-fg-warning)"}})),H=({selectedTrackIds:v})=>{const a=D(),[k,N]=A(()=>new Set),C=s=>{N(n=>{const i=new Set(n);return i.has(s)?i.delete(s):i.add(s),i})},u=j.filter(s=>v.includes(s.id)),S=u.length,d=u.flatMap(s=>s.checks),y=d.filter(s=>!s.isAvailable).length,I=d.filter(s=>s.status==="pass").length,$=d.filter(s=>s.status==="fail").length,x=d.filter(s=>s.isAvailable&&s.status!=="pass"&&s.status!=="fail").length;return t(r,{className:a.container,children:[t(R,{direction:"column",align:"center",justify:"center",className:a.header,children:[t(r,{className:a.savedBadge,children:[e(P,{size:16}),"Configuration Saved"]}),e("h1",{className:a.title,children:"Run Your First Check"}),e(o,{color:"secondary",children:"Select a track to run a check and see instant results."})]}),e(b,{className:a.progressCard,children:e(m,{children:t(r,{className:a.progressContainer,children:[t(r,{className:`${a.progressStep} ${a.progressStepCompleted}`,children:[e(p,{size:20}),e(o,{children:"Config saved"})]}),e(r,{className:a.progressArrow,children:"\u203A"}),t(r,{className:a.progressStepActive,children:[e(r,{className:a.progressStepNumber,children:"2"}),e(o,{style:{fontWeight:600},children:"Run first check"})]})]})})}),t(r,{className:a.statsGrid,children:[t(r,{className:`${a.statCard} ${a.statCardTracks}`,children:[e(L,{className:`${a.statIcon} ${a.statIconTracks}`}),e(r,{className:`${a.statNumber} ${a.statNumberTracks}`,children:S}),e(r,{className:`${a.statLabel} ${a.statLabelTracks}`,children:"Tracks"})]}),t(r,{className:`${a.statCard} ${a.statCardPending}`,children:[e(h,{className:`${a.statIcon} ${a.statIconPending}`}),e(r,{className:`${a.statNumber} ${a.statNumberPending}`,children:y}),e(r,{className:`${a.statLabel} ${a.statLabelPending}`,children:"Pending"})]})]}),t(r,{className:a.statsGridSmall,children:[t(r,{className:`${a.statCardSmall} ${a.statCardPassing}`,children:[e(p,{className:`${a.statIcon} ${a.statIconPassing}`}),e(r,{className:`${a.statNumberSmall} ${a.statNumberPassing}`,children:I}),e(r,{className:`${a.statLabel} ${a.statLabelPassing}`,children:"Passing"})]}),t(r,{className:`${a.statCardSmall} ${a.statCardFailing}`,children:[e(T,{className:`${a.statIcon} ${a.statIconFailing}`}),e(r,{className:`${a.statNumberSmall} ${a.statNumberFailing}`,children:$}),e(r,{className:`${a.statLabel} ${a.statLabelFailing}`,children:"Failing"})]}),t(r,{className:`${a.statCardSmall} ${a.statCardNotRun}`,children:[e(f,{className:`${a.statIcon} ${a.statIconNotRun}`}),e(r,{className:`${a.statNumberSmall} ${a.statNumberNotRun}`,children:x}),e(r,{className:`${a.statLabel} ${a.statLabelNotRun}`,children:"Not Run"})]})]}),e(r,{className:a.ctaCard,children:t(r,{className:a.ctaContent,children:[e(r,{className:a.ctaIcon,children:e(z,{size:24})}),t(r,{className:a.ctaText,children:[e("h4",{className:a.ctaTitle,children:"Ready to run your first check?"}),t("p",{className:a.ctaDescription,children:["Click"," ",e("span",{className:a.ctaHighlight,children:'"Run First Check"'})," on any track below to select an entity and get instant results."]})]})]})}),t(r,{className:a.breakdownSection,children:[e(r,{className:a.breakdownTitle,children:"Track Breakdown"}),u.map(s=>{const n=s.checks.filter(c=>c.isAvailable).length,i=s.checks.length-n,g=k.has(s.id);return e(b,{className:a.trackCard,children:t(m,{style:{padding:0},children:[t(r,{className:a.trackCardContent,style:{padding:"var(--bui-space-4) var(--bui-space-5)"},children:[t(r,{className:a.trackInfo,children:[e(r,{className:a.trackIconWrapper,children:s.icon}),t(r,{className:a.trackDetails,children:[e("h4",{className:a.trackName,children:s.name}),t(r,{className:a.trackStats,children:[n>0&&t(o,{className:a.trackStatNotRun,children:[n," not run"]}),i>0&&t(o,{className:a.trackStatPending,children:[i," pending"]})]})]})]}),t(r,{className:a.trackActions,children:[t("button",{type:"button",className:a.runCheckButton,children:[e(B,{size:16}),"Run First Check"]}),e("button",{type:"button",className:a.expandButton,onClick:()=>C(s.id),children:g?e(W,{size:20}):e(F,{size:20})})]})]}),g&&e(r,{className:a.checksList,children:s.checks.map(c=>{const l=!c.isAvailable;return t(r,{className:`${a.checkItem} ${l?a.checkItemPending:""}`,children:[e(r,{className:a.checkIconWrapper,children:l?e(h,{size:20,className:a.checkIconPending}):e(f,{size:20,className:a.checkIconNotRun})}),t(r,{className:a.checkDetails,children:[e("h5",{className:`${a.checkName} ${l?a.checkNamePending:""}`,children:c.name}),e("p",{className:`${a.checkSubtitle} ${l?a.checkSubtitlePending:""}`,children:l?`Awaiting ${c.connect} setup`:"Click to run this check"})]})]},c.id)})})]})},s.id)})]})]})};export{H as RunFirstCheckStep};
2
- //# sourceMappingURL=RunFirstCheckStep.esm.js.map
@@ -1,2 +0,0 @@
1
- import{jsxs as n,Fragment as v,jsx as e}from"react/jsx-runtime";import{Flex as r,Box as l,Text as d,Card as h,CardBody as u,Accordion as f,AccordionTrigger as C,Switch as y,AccordionPanel as N,Button as w}from"@backstage/ui";import{makeStyles as x}from"@material-ui/core";import{RiCircleLine as j}from"@remixicon/react";import{Alert as T}from"../Alert/Alert.esm.js";import{Badge as m}from"../Badge/Badge.esm.js";import{trackBuilderTracks as o}from"./mockData.esm.js";const S=x(()=>({container:{margin:"var(--bui-space-8) 0 var(--bui-space-8)"},header:{textAlign:"center"},pendingCircle:{width:"24px",height:"24px",background:"var(--bui-bg-warning)",borderRadius:"var(--bui-radius-full)",display:"flex",alignItems:"center",justifyContent:"center",color:"var(--bui-fg-warning)"},availableCircle:{width:"24px",height:"24px",background:"var(--bui-bg-solid-disabled)",borderRadius:"var(--bui-radius-full)",display:"flex",alignItems:"center",justifyContent:"center",color:"var(--bui-fg-disabled)"},stats:{background:"var(--bui-bg-solid-disabled)",borderRadius:"var(--bui-radius-3)",border:"1px solid var(--bui-border-disabled)",padding:"var(--bui-space-4)"},stat:{"&:not(:last-child)":{borderRight:"1px solid var(--bui-border-disabled)",padding:"0 var(--bui-space-6) 0 0"}},tracksNumber:{fontSize:"1.5rem",fontWeight:"bold",color:"var(--bui-fg-primary)"},pendingNumber:{fontSize:"1.5rem",fontWeight:"bold",color:"var(--bui-fg-warning)"},track:{width:"100%",marginRight:"var(--bui-space-3)"},trackName:{padding:0,margin:"0 0 var(--bui-space-2)"},checksPanel:{borderTop:"1px solid var(--bui-border)",margin:"var(--bui-space-4) 0 0",padding:"var(--bui-space-4) 0 0"},checkIcon:{width:24,height:24},trackIconColumn:{width:38,height:38,padding:"var(--bui-space-2)",backgroundColor:"var(--bui-border-disabled)",borderRadius:"var(--bui-radius-3)"},trackColumn:{width:"85%",marginLeft:"var(--bui-space-4)"},trackSwitchColumn:{width:"10%"},checkColumn:{width:"70%"},checkConnectColumn:{width:"25%"},trackCard:{marginBottom:"var(--bui-space-4)"}})),A=({selectedTrackIds:g,onToggleTrack:b})=>{const a=S(),p=o.length,k=o.flatMap(({checks:i})=>i).filter(({isAvailable:i})=>!i).length;return n(v,{children:[e(r,{direction:"column",align:"center",justify:"center",className:a.container,children:n(l,{className:a.header,children:[e("h2",{children:"Configure Your Tracks"}),e(d,{color:"secondary",children:"Enable the tracks you want and expand to see their checks. Connect integrations to unlock all features."})]})}),n(r,{align:"center",className:a.stats,children:[n(r,{gap:"0",align:"center",direction:"column",className:a.stat,children:[e(l,{className:a.tracksNumber,children:p}),e(l,{children:e(d,{variant:"body-small",children:"Tracks"})})]}),n(r,{gap:"0",align:"center",direction:"column",className:a.stat,children:[e(l,{className:a.pendingNumber,children:k}),e(l,{children:e(d,{variant:"body-small",children:"Pending"})})]})]}),e(T,{title:"Some checks need integrations",variant:"warning",children:"Expand tracks and connect the required integrations to enable all checks. You can save now and connect later."}),o.map(i=>{const t=i.checks.filter(({isAvailable:c})=>c).length,s=i.checks.length-t;return e(h,{className:a.trackCard,children:e(u,{children:n(f,{children:[e(C,{children:n(r,{align:"center",justify:"between",className:a.track,children:[e(r,{align:"center",justify:"center",className:a.trackIconColumn,children:i.icon}),n(r,{direction:"column",gap:"2",className:a.trackColumn,children:[n(l,{children:[e("h4",{className:a.trackName,children:i.name}),e(d,{variant:"body-small",color:"secondary",children:i.description})]}),n(r,{gap:"1",children:[t>0&&e(m,{variant:"default",children:n(d,{variant:"body-x-small",children:[t," not run"]})}),s>0&&e(m,{variant:"warning",children:n(d,{variant:"body-x-small",children:[s," pending"]})})]})]}),e(r,{align:"center",justify:"end",className:a.trackSwitchColumn,children:e(y,{isSelected:g.includes(i.id),onChange:c=>b(i.id,c)},i.id)})]})}),e(N,{children:n(r,{direction:"column",gap:"4",className:a.checksPanel,children:[e(l,{children:n(d,{variant:"body-small",children:[i.checks?.length," checks included."]})}),i.checks?.map(c=>e(h,{children:e(u,{children:n(r,{align:"center",justify:"between",children:[e(l,{className:[a.checkIcon,c.connect?a.pendingCircle:a.availableCircle].join(" "),children:e(j,{size:16})}),n(l,{className:a.checkColumn,children:[e("h4",{className:a.trackName,children:c.name}),e(d,{variant:"body-small",color:"secondary",children:c.description})]}),e(r,{justify:"end",className:a.checkConnectColumn,children:c.connect&&n(w,{size:"small",variant:"secondary",children:["Connect ",c.connect]})})]})})},c.id))]})})]})})},i.id)})]})};export{A as SelectTracksStep};
2
- //# sourceMappingURL=SelectTracksStep.esm.js.map
@@ -1,2 +0,0 @@
1
- import{jsx as e}from"react/jsx-runtime";import{RiStackFill as i,RiBuildingFill as a,RiShieldCheckFill as n,RiBardFill as s}from"@remixicon/react";const o=[{id:"1",name:"Foundational Quality",description:"Focuses on strengthening core engineering practices and infrastructure health.",icon:e(i,{}),checks:[{id:"1-1",name:"Code Review Coverage",description:"All PRs require at least one approval",isAvailable:!0},{id:"1-2",name:"Test Coverage Threshold",description:"Minimum 80% code coverage",connect:"SonarQube",isAvailable:!1},{id:"1-3",name:"Build Success Rate",description:"CI builds pass >95% of the time",isAvailable:!0},{id:"1-4",name:"Technical Debt Ratio",description:"Keep technical debt below 5%",connect:"SonarQube",isAvailable:!1}]},{id:"2",name:"Organizational Maturity",description:"Covers team processes, documentation, ownership, and long-term operational maturity.",icon:e(a,{}),checks:[{id:"2-1",name:"Service Ownership",description:"Every service has a designated owner",isAvailable:!0},{id:"2-2",name:"Documentation Coverage",description:"All services have up-to-date docs",isAvailable:!0},{id:"2-3",name:"Runbook Availability",description:"Operational runbooks exist for all services",connect:"Jira",isAvailable:!1},{id:"2-4",name:"Incident Response Plan",description:"Teams have documented incident procedures",isAvailable:!0}]},{id:"3",name:"Security Readiness",description:"Focuses on protection from vulnerabilities and following security best practices.",icon:e(n,{}),checks:[{id:"3-1",name:"Dependency Scanning",description:"Automated vulnerability scanning enabled",connect:"Snyk",isAvailable:!1},{id:"3-2",name:"Secret Detection",description:"No hardcoded secrets in codebase",isAvailable:!0},{id:"3-3",name:"SAST Analysis",description:"Static analysis runs on all PRs",connect:"SonarQube",isAvailable:!1},{id:"3-4",name:"Security Training",description:"Team completed security training",isAvailable:!0}]},{id:"4",name:"AI Readiness",description:"Preparation for using AI effectively across your development workflow.",icon:e(s,{}),checks:[{id:"4-1",name:"AI Code Assistant",description:"AI coding assistant configured",isAvailable:!0},{id:"4-2",name:"Data Quality Standards",description:"Training data meets quality standards",isAvailable:!0},{id:"4-3",name:"AI Usage Guidelines",description:"Team has AI usage policies",isAvailable:!0},{id:"4-4",name:"Model Governance",description:"AI model lifecycle management in place",isAvailable:!0}]}];export{o as trackBuilderTracks};
2
- //# sourceMappingURL=mockData.esm.js.map